master 6acaded3c44f cached
201 files
2.8 MB
750.0k tokens
3285 symbols
1 requests
Download .txt
Showing preview only (2,999K chars total). Download the full file or copy to clipboard to get everything.
Repository: scale-tone/DurableFunctionsMonitor
Branch: master
Commit: 6acaded3c44f
Files: 201
Total size: 2.8 MB

Directory structure:
gitextract_sz7kn825/

├── .gitignore
├── LICENSE
├── README.md
├── azure-pipelines.yml
├── custom-backends/
│   ├── README.md
│   ├── mssql/
│   │   ├── .gitignore
│   │   ├── Dfm.MsSql.csproj
│   │   ├── README.md
│   │   ├── Startup.cs
│   │   ├── arm-template.json
│   │   └── host.json
│   ├── netcore21/
│   │   ├── .gitignore
│   │   ├── Dfm.NetCore21.csproj
│   │   ├── README.md
│   │   ├── Startup.cs
│   │   ├── arm-template.json
│   │   └── host.json
│   └── netcore31/
│       ├── .gitignore
│       ├── Dfm.NetCore31.csproj
│       ├── README.md
│       ├── Startup.cs
│       ├── arm-template.json
│       └── host.json
├── durablefunctionsmonitor-vscodeext/
│   ├── .gitignore
│   ├── .vscode/
│   │   ├── extensions.json
│   │   ├── launch.json
│   │   ├── settings.json
│   │   └── tasks.json
│   ├── .vscodeignore
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   ├── BackendProcess.ts
│   │   ├── ConnStringUtils.ts
│   │   ├── FunctionGraphList.ts
│   │   ├── FunctionGraphView.ts
│   │   ├── MonitorTreeDataProvider.ts
│   │   ├── MonitorView.ts
│   │   ├── MonitorViewList.ts
│   │   ├── Settings.ts
│   │   ├── SharedConstants.ts
│   │   ├── StorageAccountTreeItem.ts
│   │   ├── StorageAccountTreeItems.ts
│   │   ├── SubscriptionTreeItem.ts
│   │   ├── SubscriptionTreeItems.ts
│   │   ├── TaskHubTreeItem.ts
│   │   ├── az-func-as-a-graph/
│   │   │   ├── FunctionsMap.d.ts
│   │   │   ├── traverseFunctionProject.ts
│   │   │   └── traverseFunctionProjectUtils.ts
│   │   ├── extension.ts
│   │   └── test/
│   │       ├── runTest.ts
│   │       └── suite/
│   │           ├── extension.test.ts
│   │           └── index.ts
│   ├── tsconfig.json
│   └── tslint.json
├── durablefunctionsmonitor.dotnetbackend/
│   ├── .gitignore
│   ├── .vscode/
│   │   ├── extensions.json
│   │   ├── launch.json
│   │   ├── settings.json
│   │   └── tasks.json
│   ├── Common/
│   │   ├── Auth.cs
│   │   ├── CustomTemplates.cs
│   │   ├── DetailedOrchestrationStatus.cs
│   │   ├── ExpandedOrchestrationStatus.cs
│   │   ├── FilterClause.cs
│   │   ├── Globals.cs
│   │   ├── HttpHandlerBase.cs
│   │   ├── OrchestrationHistory.cs
│   │   ├── Setup.cs
│   │   └── TableClient.cs
│   ├── DfmStatics/
│   │   ├── index.html
│   │   ├── manifest.json
│   │   └── static/
│   │       ├── css/
│   │       │   ├── 2.62e7949a.chunk.css
│   │       │   └── main.12374d2f.chunk.css
│   │       └── js/
│   │           ├── 2.7e622828.chunk.js
│   │           ├── 2.7e622828.chunk.js.LICENSE.txt
│   │           ├── main.7371b08e.chunk.js
│   │           └── runtime-main.edc3f937.js
│   ├── Dockerfile
│   ├── Functions/
│   │   ├── About.cs
│   │   ├── CleanEntityStorage.cs
│   │   ├── DeleteTaskHub.cs
│   │   ├── EasyAuthConfig.cs
│   │   ├── FunctionMap.cs
│   │   ├── IdSuggestions.cs
│   │   ├── ManageConnection.cs
│   │   ├── Orchestration.cs
│   │   ├── Orchestrations.cs
│   │   ├── PurgeHistory.cs
│   │   ├── ServeStatics.cs
│   │   └── TaskHubNames.cs
│   ├── LICENSE
│   ├── NUGET_README.md
│   ├── README.md
│   ├── arm-template.json
│   ├── dfm-aks-deployment.yaml
│   ├── durablefunctionsmonitor.dotnetbackend.csproj
│   ├── durablefunctionsmonitor.dotnetbackend.targets
│   ├── host.json
│   ├── nuspec.nuspec
│   ├── proxies.json
│   └── setup-and-run.js
├── durablefunctionsmonitor.functions/
│   └── README.md
├── durablefunctionsmonitor.react/
│   ├── .gitignore
│   ├── README.md
│   ├── copy-build-artifacts.js
│   ├── package.json
│   ├── public/
│   │   ├── index.html
│   │   └── manifest.json
│   ├── src/
│   │   ├── CancelToken.ts
│   │   ├── DateTimeHelpers.ts
│   │   ├── DfmContext.ts
│   │   ├── components/
│   │   │   ├── ErrorMessage.css
│   │   │   ├── ErrorMessage.tsx
│   │   │   ├── FunctionGraph.css
│   │   │   ├── FunctionGraph.tsx
│   │   │   ├── FunctionGraphBase.tsx
│   │   │   ├── FunctionGraphTabBase.tsx
│   │   │   ├── LoginIcon.css
│   │   │   ├── LoginIcon.tsx
│   │   │   ├── Main.css
│   │   │   ├── Main.tsx
│   │   │   ├── MainMenu.css
│   │   │   ├── MainMenu.tsx
│   │   │   ├── OrchestrationLink.tsx
│   │   │   ├── SaveAsSvgButton.tsx
│   │   │   ├── details-view/
│   │   │   │   ├── DurableEntityButtons.tsx
│   │   │   │   ├── DurableEntityFields.tsx
│   │   │   │   ├── OrchestrationButtons.tsx
│   │   │   │   ├── OrchestrationDetails.css
│   │   │   │   ├── OrchestrationDetails.tsx
│   │   │   │   ├── OrchestrationDetailsFunctionGraph.tsx
│   │   │   │   └── OrchestrationFields.tsx
│   │   │   ├── dialogs/
│   │   │   │   ├── CleanEntityStorageDialog.css
│   │   │   │   ├── CleanEntityStorageDialog.tsx
│   │   │   │   ├── ConnectionParamsDialog.tsx
│   │   │   │   ├── LongJsonDialog.tsx
│   │   │   │   ├── PurgeHistoryDialog.css
│   │   │   │   ├── PurgeHistoryDialog.tsx
│   │   │   │   ├── StartNewInstanceDialog.css
│   │   │   │   └── StartNewInstanceDialog.tsx
│   │   │   └── results-view/
│   │   │       ├── Orchestrations.css
│   │   │       ├── Orchestrations.tsx
│   │   │       ├── OrchestrationsFunctionGraph.css
│   │   │       ├── OrchestrationsFunctionGraph.tsx
│   │   │       ├── OrchestrationsGanttChart.tsx
│   │   │       ├── OrchestrationsHistogram.tsx
│   │   │       └── OrchestrationsList.tsx
│   │   ├── index.css
│   │   ├── index.tsx
│   │   ├── react-app-env.d.ts
│   │   ├── services/
│   │   │   ├── BackendClient.ts
│   │   │   ├── IBackendClient.ts
│   │   │   └── VsCodeBackendClient.ts
│   │   ├── states/
│   │   │   ├── DurableOrchestrationStatus.ts
│   │   │   ├── ErrorMessageState.ts
│   │   │   ├── FilterOperatorEnum.ts
│   │   │   ├── FunctionGraphState.ts
│   │   │   ├── FunctionGraphStateBase.ts
│   │   │   ├── ITypedLocalStorage.ts
│   │   │   ├── LoginState.ts
│   │   │   ├── MainMenuState.ts
│   │   │   ├── MainState.ts
│   │   │   ├── MermaidDiagramStateBase.ts
│   │   │   ├── QueryString.ts
│   │   │   ├── TypedLocalStorage.ts
│   │   │   ├── VsCodeTypedLocalStorage.ts
│   │   │   ├── az-func-as-a-graph/
│   │   │   │   ├── FunctionsMap.d.ts
│   │   │   │   └── buildFunctionDiagramCode.ts
│   │   │   ├── details-view/
│   │   │   │   ├── FunctionGraphTabState.ts
│   │   │   │   ├── GanttDiagramTabState.ts
│   │   │   │   ├── ICustomTabState.ts
│   │   │   │   ├── LiquidMarkupTabState.ts
│   │   │   │   ├── MermaidDiagramTabState.ts
│   │   │   │   ├── OrchestrationDetailsState.ts
│   │   │   │   └── SequenceDiagramTabState.ts
│   │   │   ├── dialogs/
│   │   │   │   ├── CleanEntityStorageDialogState.ts
│   │   │   │   ├── ConnectionParamsDialogState.ts
│   │   │   │   ├── PurgeHistoryDialogState.ts
│   │   │   │   └── StartNewInstanceDialogState.ts
│   │   │   └── results-view/
│   │   │       ├── OrchestrationsState.ts
│   │   │       ├── ResultsFunctionGraphTabState.ts
│   │   │       ├── ResultsGanttDiagramTabState.ts
│   │   │       ├── ResultsHistogramTabState.ts
│   │   │       └── ResultsListTabState.ts
│   │   └── theme.ts
│   ├── tsconfig.json
│   └── tslint.json
└── tests/
    └── durablefunctionsmonitor.dotnetbackend.tests/
        ├── .gitignore
        ├── .vscode/
        │   ├── launch.json
        │   └── tasks.json
        ├── AboutTests.cs
        ├── AuthTests.cs
        ├── EasyAuthConfigTests.cs
        ├── FilterClauseTests.cs
        ├── GlobalsTests.cs
        ├── IdSuggestionsTests.cs
        ├── ServeStaticsTests.cs
        ├── Shared.cs
        └── durablefunctionsmonitor.dotnetbackend.tests.csproj

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
.vs

================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2019 scale-tone

Permission 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:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE 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.


================================================
FILE: README.md
================================================
***
   # THIS PROJECT HAS MOVED TO https://github.com/microsoft/DurableFunctionsMonitor 
***


![logo](https://raw.githubusercontent.com/scale-tone/DurableFunctionsMonitor/master/readme/screenshots/main-page.png) 
# Durable Functions Monitor

A monitoring/debugging UI tool for Azure Durable Functions

[Azure Durable Functions](https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-overview) provide an easy and elegant way of building cloud-native Reliable Stateful Services in the Serverless world. The only thing that's missing so far is a UI for monitoring, managing and debugging your orchestration instances. This project tries to bridge the gap.

[<img alt="Nuget" src="https://img.shields.io/nuget/v/DurableFunctionsMonitor.DotNetBackend?label=current%20version">](https://www.nuget.org/profiles/durablefunctionsmonitor)  <img src="https://dev.azure.com/kolepes/DurableFunctionsMonitor/_apis/build/status/DurableFunctionsMonitor-CI-from-yml?branchName=master"/> <img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/scale-tone/DurableFunctionsMonitor?style=flat">

[<img alt="Visual Studio Marketplace Installs" src="https://img.shields.io/visual-studio-marketplace/i/DurableFunctionsMonitor.DurableFunctionsMonitor?label=VsCode%20Extension%20Installs">](https://marketplace.visualstudio.com/items?itemName=DurableFunctionsMonitor.durablefunctionsmonitor) [<img src="https://img.shields.io/docker/pulls/scaletone/durablefunctionsmonitor"/>](https://hub.docker.com/r/scaletone/durablefunctionsmonitor) [<img alt="Nuget" src="https://img.shields.io/nuget/dt/DurableFunctionsMonitor.DotNetBackend?label=nuget%20downloads">](https://www.nuget.org/profiles/durablefunctionsmonitor)

# Prerequisites
To run this on your devbox you need to have [Azure Functions Core Tools](https://www.npmjs.com/package/azure-functions-core-tools) **globally** installed (which is normally already the case, if you're working with Azure Functions - just ensure that you have the latest version of it).

**OR**

[Docker Desktop](https://www.docker.com/products/docker-desktop), if you prefer to run it locally [as a container](https://hub.docker.com/r/scaletone/durablefunctionsmonitor).

# How to run

As a [VsCode Extension](https://github.com/scale-tone/DurableFunctionsMonitor/blob/master/durablefunctionsmonitor-vscodeext/README.md#durable-functions-monitor-as-a-vscode-extension).
* Install it [from the Marketplace](https://marketplace.visualstudio.com/items?itemName=DurableFunctionsMonitor.durablefunctionsmonitor) or from [a VSIX-file](https://github.com/scale-tone/DurableFunctionsMonitor/releases).
* (if you have [Azure Functions](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurefunctions) extension also installed) Goto **Azure Functions** <img src="https://raw.githubusercontent.com/scale-tone/DurableFunctionsMonitor/master/readme/screenshots/vscodeext-functions-view-container-icon.png" width="32"> View Container, observe all your TaskHubs under **DURABLE FUNCTIONS** tab and click on them to connect.
* (if not) Type `Durable Functions Monitor` in your Command Palette and then confirm or provide Storage Connection String and Hub Name.

**OR**

[As a standalone service](https://github.com/scale-tone/DurableFunctionsMonitor/blob/master/durablefunctionsmonitor.dotnetbackend/README.md#durablefunctionsmonitordotnetbackend), either running locally on your devbox or deployed into Azure: [![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2Fscale-tone%2FDurableFunctionsMonitor%2Fmaster%2Fdurablefunctionsmonitor.dotnetbackend%2Farm-template.json) 

**OR**

[Install it as a NuGet package](https://www.nuget.org/packages/DurableFunctionsMonitor.DotNetBackend) into your own Functions project (.Net Core only).

# Features
## 1. View the list of your Orchestrations and/or Durable Entities, with sorting, infinite scrolling and auto-refresh:
<img src="https://raw.githubusercontent.com/scale-tone/DurableFunctionsMonitor/master/readme/screenshots/orchestrations.png" width="882">

## 2. Filter by time range and column values:
<img src="https://raw.githubusercontent.com/scale-tone/DurableFunctionsMonitor/master/readme/screenshots/orchestrations-filtered.png" width="882">

## 3. Visualize the filtered list of instances as a Time Histogram or as a Gantt chart:
<img src="https://github.com/scale-tone/DurableFunctionsMonitor/blob/master/readme/screenshots/time-histogram.png" width="700">

## 4. Start new orchestration instances:
<img width="300px" src="https://user-images.githubusercontent.com/5447190/131139060-eb06ef4d-2cc2-48ff-932c-c227f28f1f36.png"/>
<img width="300px" src="https://user-images.githubusercontent.com/5447190/130657962-c1c32575-c82c-4e29-ad88-3951eb821fe8.png"/>
<img width="500px" src="https://user-images.githubusercontent.com/5447190/130658737-e51e259d-e7ec-43a2-902b-79907936fb82.png"/>

## 5. Monitor the status of a certain instance:
<img src="https://raw.githubusercontent.com/scale-tone/DurableFunctionsMonitor/master/readme/screenshots/orchestration-details.png" width="882">

## 6. Quickly navigate to a certain instance by its ID:
<img src="https://raw.githubusercontent.com/scale-tone/DurableFunctionsMonitor/master/readme/screenshots/goto-instance.png" width="400">

## 7. Observe Sequence Diagrams and Gantt Charts for orchestrations:
<img src="https://raw.githubusercontent.com/scale-tone/DurableFunctionsMonitor/master/readme/screenshots/vscodeext-orchestration-diagram.png" width="400">
<img src="https://raw.githubusercontent.com/scale-tone/DurableFunctionsMonitor/master/readme/screenshots/gantt-chart.png" width="650">

## 8. Restart, Purge, Rewind, Terminate, Raise Events, Set Custom Status:
<img src="https://raw.githubusercontent.com/scale-tone/DurableFunctionsMonitor/master/readme/screenshots/orchestration-raise-event.png" width="440">

## 9. Purge Orchestration/Entity instances history:
<img src="https://raw.githubusercontent.com/scale-tone/DurableFunctionsMonitor/master/readme/screenshots/purge-history-menu.png" width="390">
<img src="https://raw.githubusercontent.com/scale-tone/DurableFunctionsMonitor/master/readme/screenshots/purge-history-dialog.png" width="683">

## 10. Clean deleted Durable Entities:
<img src="https://raw.githubusercontent.com/scale-tone/DurableFunctionsMonitor/master/readme/screenshots/clean-entity-storage-menu.png" width="390">
<img src="https://raw.githubusercontent.com/scale-tone/DurableFunctionsMonitor/master/readme/screenshots/clean-entity-storage-dialog.png" width="580">

## 11. Create custom Orchestration/Entity status tabs with [Liquid Templates](https://shopify.github.io/liquid/):
  1. Create a [Liquid](https://shopify.github.io/liquid/) template file and name it like `[My Custom Tab Name].[orchestration-or-entity-name].liquid` or just `[My Custom Tab Name].liquid` (this one will be applied to any kind of entity).
  2. In the same Storage Account (the account where your Durable Functions run in) create a Blob container called `durable-functions-monitor`.
  3. Put your template file into a `tab-templates` virtual folder in that container (the full path should look like `/durable-functions-monitor/tab-templates/[My Custom Tab Name].[orchestration-or-entity-name].liquid`).
  4. Restart Durable Functions Monitor.
  5. Observe the newly appeared `My Custom Tab Name` tab on the Orchestration/Entity Details page:
  
  <img src="https://raw.githubusercontent.com/scale-tone/DurableFunctionsMonitor/master/readme/screenshots/custom-liquid-tab.png" width="390">
  
   Sample Liquid Template:
   ```
    <h2>These people were invited:</h2>
    <ul>
    {% for participant in Input.Participants %}
      <li><h3>{{participant}}<h3></li>
    {% endfor %}
    </ul>  
   ```
  
   You can have multiple templates for each Orchestration/Entity type, and also multiple 'common' (applied to any Orchestration/Entity) templates.
   Here is [a couple](https://gist.github.com/scale-tone/13956ec804a70f5f66200c6ec97db673) [of more](https://github.com/scale-tone/repka-durable-func/blob/master/Repka%20Status.the-saga-of-repka.liquid) sample templates.
   
   NOTE1: [this .Net object](https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.webjobs.extensions.durabletask.durableorchestrationstatus?view=azure-dotnet) is passed to your templates as a parameter. Mind the property names and their casing.
   
   NOTE2: code inside your templates is still subject to these [Content Security Policies](https://github.com/scale-tone/DurableFunctionsMonitor/blob/master/durablefunctionsmonitor.react/public/index.html#L8), so no external scripts, sorry.

## 12. Connect to different Durable Function Hubs and Azure Storage Accounts:
<img src="https://raw.githubusercontent.com/scale-tone/DurableFunctionsMonitor/master/readme/screenshots/manage-connection.png" width="609">

## 13. Monitor non-default Storage Providers (Netherite, Microsoft SQL, etc.):
  
  For that you can use Durable Functions Monitor in 'injected' mode, aka added as a [NuGet package](https://www.nuget.org/profiles/durablefunctionsmonitor) to *your* project.
  
  1. Create a .Net Core Function App project, that is [configured to use an alternative Storage Provider](https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-storage-providers#azure-storage) and make sure it compiles and starts.
  2. Add [DurableFunctionsMonitor.DotNetBackend](https://www.nuget.org/profiles/durablefunctionsmonitor) package to it:
   ```
    dotnet add package DurableFunctionsMonitor.DotNetBackend
   ```
  
  4. Add mandatory initialization code, that needs to run at your Function's startup:
   ```
[assembly: WebJobsStartup(typeof(StartupNs.Startup))]
namespace StartupNs 
{
     public class Startup : IWebJobsStartup
     {
        public void Configure(IWebJobsBuilder builder)
        {
           DfmEndpoint.Setup();
        }
     }
}
   ```
  
   Find more details on programmatic configuration options in the [package readme](https://www.nuget.org/packages/DurableFunctionsMonitor.DotNetBackend/).
    
  6. Run the project:
   ```
    func start
   ```
    
  8. Navigate to `http://localhost:7071/api`. 
    You can customize the endpoint address as needed, as described [here](https://www.nuget.org/packages/DurableFunctionsMonitor.DotNetBackend/).

## 14. Visualize your Azure Function projects in form of an interactive graph: 
  
  This functionality is powered by [az-func-as-a-graph](https://github.com/scale-tone/az-func-as-a-graph/blob/main/README.md) tool, but now it is also fully integrated into Durable Functions Monitor:
  ![image](https://user-images.githubusercontent.com/5447190/127571400-f83c7f96-55bc-4714-8323-04d26f3be74f.png)

When running Durable Functions Monitor as [VsCode Extension](https://marketplace.visualstudio.com/items?itemName=DurableFunctionsMonitor.durablefunctionsmonitor), the **Functions Graph** tab should appear automatically, once you have the relevant Functions project opened.

When running in [standalone/injected mode](https://github.com/scale-tone/DurableFunctionsMonitor/tree/master/durablefunctionsmonitor.dotnetbackend#how-to-run) you'll need to generate and upload an intermediate Functions Map JSON file. 
1. Generate it with [az-func-as-a-graph CLI](https://github.com/scale-tone/az-func-as-a-graph/blob/main/README.md#how-to-run-as-part-of-azure-devops-build-pipeline). Specify `dfm-func-map.<my-task-hub-name>.json` (will be applied to that particular Task Hub only) or just `dfm-func-map.json` (will be applied to all Task Hubs) as the output name.
2. Upload this generated JSON file to `function-maps` virtual folder inside `durable-functions-monitor` BLOB container in the underlying Storage Account (the full path should look like `/durable-functions-monitor/function-maps/dfm-func-map.<my-task-hub-name>.json`).
3. Restart Durable Functions Monitor.
4. Observe the newly appeared **Functions Graph** tab.


================================================
FILE: azure-pipelines.yml
================================================
pool:
  name: Azure Pipelines
  vmImage: 'ubuntu-18.04'
  demands: npm

steps:
- task: Npm@1
  displayName: 'npm install durablefunctionsmonitor.react'
  inputs:
    workingDir: durablefunctionsmonitor.react
    verbose: false

- task: Npm@1
  displayName: 'npm build durablefunctionsmonitor.react'
  inputs:
    command: custom
    workingDir: durablefunctionsmonitor.react
    verbose: false
    customCommand: 'run build'

- task: CopyFiles@2
  displayName: 'copy statics to durablefunctionsmonitor.dotnetbackend/DfmStatics'
  inputs:
    SourceFolder: durablefunctionsmonitor.react/build
    Contents: |
     static/**
     index.html
     favicon.png
     logo.svg
     service-worker.js
     manifest.json
    TargetFolder: durablefunctionsmonitor.dotnetbackend/DfmStatics
    CleanTargetFolder: true

- task: CopyFiles@2
  displayName: 'copy durablefunctionsmonitor.dotnetbackend to ArtifactStagingDirectory'
  inputs:
    SourceFolder: durablefunctionsmonitor.dotnetbackend
    TargetFolder: '$(Build.ArtifactStagingDirectory)/durablefunctionsmonitor.dotnetbackend'
    OverWrite: true

- task: DotNetCoreCLI@2
  displayName: 'dotnet test tests/durablefunctionsmonitor.dotnetbackend.tests'
  inputs:
    command: 'test'
    projects: 'tests/durablefunctionsmonitor.dotnetbackend.tests/*.csproj'

- task: DotNetCoreCLI@2
  displayName: 'dotnet publish durablefunctionsmonitor.dotnetbackend'
  inputs:
    command: publish
    publishWebProjects: false
    projects: durablefunctionsmonitor.dotnetbackend
    arguments: '--output $(Build.ArtifactStagingDirectory)/output'
    zipAfterPublish: false
    modifyOutputPath: false

- task: CopyFiles@2
  displayName: 'copy dotnetbackend to durablefunctionsmonitor-vscodeext/backend'
  inputs:
    SourceFolder: '$(Build.ArtifactStagingDirectory)/output'
    Contents: |
     **
     !logo.svg
    TargetFolder: 'durablefunctionsmonitor-vscodeext/backend'
    CleanTargetFolder: true

- task: CopyFiles@2
  displayName: 'copy custom-backends to durablefunctionsmonitor-vscodeext/custom-backends'
  inputs:
    SourceFolder: 'custom-backends'
    Contents: |
     **
     !*.md
    TargetFolder: 'durablefunctionsmonitor-vscodeext/custom-backends'
    CleanTargetFolder: true

- task: Npm@1
  displayName: 'npm install durablefunctionsmonitor-vscodeext'
  inputs:
    workingDir: 'durablefunctionsmonitor-vscodeext'
    verbose: false

- task: Npm@1
  displayName: 'package durablefunctionsmonitor-vscodeext to VSIX-file'
  inputs:
    command: custom
    workingDir: 'durablefunctionsmonitor-vscodeext'
    verbose: false
    customCommand: 'run package'

- task: CopyFiles@2
  displayName: 'copy VSIX-file to ArtifactStagingDirectory'
  inputs:
    SourceFolder: 'durablefunctionsmonitor-vscodeext'
    Contents: 'durablefunctionsmonitor*.vsix'
    TargetFolder: '$(Build.ArtifactStagingDirectory)'
    OverWrite: true

- task: CopyFiles@2
  displayName: 'copy LICENSE to output'
  inputs:
    Contents: |
     LICENSE
    TargetFolder: '$(Build.ArtifactStagingDirectory)/output'
    OverWrite: true

- task: NuGetCommand@2
  displayName: 'package dotnetbackend into a Nuget package'
  inputs:
    command: 'pack'
    packagesToPack: '$(Build.ArtifactStagingDirectory)/output/nuspec.nuspec'
    packDestination: '$(Build.ArtifactStagingDirectory)'
    versioningScheme: 'off'
  
- task: PublishBuildArtifacts@1
  displayName: 'Publish Artifact: drop'


================================================
FILE: custom-backends/README.md
================================================
# Custom backends for Durable Functions Monitor

These are Azure Function projects with Durable Functions Monitor 'injected' as a [NuGet package](https://www.nuget.org/profiles/durablefunctionsmonitor). To be used for e.g. monitoring [custom storage providers](https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-storage-providers).

* [netcore21](https://github.com/scale-tone/DurableFunctionsMonitor/tree/master/custom-backends/netcore21) - (legacy) Durable Functions Monitor backend, that runs on .Net Core 2.1.
* [netcore31](https://github.com/scale-tone/DurableFunctionsMonitor/tree/master/custom-backends/netcore31) - Durable Functions Monitor backend, that runs on .Net Core 3.1.
* [mssql](https://github.com/scale-tone/DurableFunctionsMonitor/tree/master/custom-backends/mssql) - Durable Functions Monitor backend to be used with [Durable Task SQL Provider](https://microsoft.github.io/durabletask-mssql/#/).


================================================
FILE: custom-backends/mssql/.gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.

# nuget.exe
nuget.exe

# Azure Functions localsettings file
local.settings.json

# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/

# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUNIT
*.VisualState.xml
TestResult.xml

# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c

# DNX
project.lock.json
project.fragment.lock.json
artifacts/

*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Chutzpah Test files
_Chutzpah*

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# TFS 2012 Local Workspace
$tf/

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user

# JustCode is a .NET coding add-in
.JustCode

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*

# MightyMoose
*.mm.*
AutoTest.Net/

# Web workbench (sass)
.sass-cache/

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Comment the next line if you want to checkin your web deploy settings
# but database connection strings (with potential passwords) will be unencrypted
#*.pubxml
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/

# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignoreable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/

# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
node_modules/
orleans.codegen.cs

# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm

# SQL Server files
*.mdf
*.ldf

# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings

# Microsoft Fakes
FakesAssemblies/

# GhostDoc plugin setting file
*.GhostDoc.xml

# Node.js Tools for Visual Studio
.ntvs_analysis.dat

# Visual Studio 6 build log
*.plg

# Visual Studio 6 workspace options file
*.opt

# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions

# Paket dependency manager
.paket/paket.exe
paket-files/

# FAKE - F# Make
.fake/

# JetBrains Rider
.idea/
*.sln.iml

# CodeRush
.cr/

# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc

================================================
FILE: custom-backends/mssql/Dfm.MsSql.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <AzureFunctionsVersion>v3</AzureFunctionsVersion>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Data.SqlClient" Version="3.0.1" />
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.12" />
    <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.DurableTask" Version="2.6.0" />
    <PackageReference Include="Microsoft.DurableTask.SqlServer.AzureFunctions" Version="0.10.1-beta" />
    <PackageReference Include="durablefunctionsmonitor.dotnetbackend" Version="5.1.1" />
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
</Project>


================================================
FILE: custom-backends/mssql/README.md
================================================
# Durable Functions Monitor for MSSQL storage provider

Custom Durable Functions Monitor backend project to be used with [Durable Task SQL Provider](https://microsoft.github.io/durabletask-mssql/#/).

## How to run locally

* Clone this repo.
* In the project's folder create a `local.settings.json` file, which should look like this:

```
{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsSecretStorageType": "files",
    "DFM_SQL_CONNECTION_STRING": "your-mssql-connection-string",
    "DFM_HUB_NAME": "mssql",
    "DFM_NONCE": "i_sure_know_what_i_am_doing",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet"
  },
  "Host": {
    "LocalHttpPort": 7072
  }
}
```

* Go to the project's folder with your command prompt and type the following:

```
func start
```

* Navigate to http://localhost:7072


# How to deploy to Azure

[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2Fscale-tone%2FDurableFunctionsMonitor%2Fmaster%2Fcustom-backends%2Fmssql%2Farm-template.json)

The above button will deploy *these sources* into *your newly created* Function App instance.


================================================
FILE: custom-backends/mssql/Startup.cs
================================================
using System;
using System.Collections.Generic;
using DurableFunctionsMonitor.DotNetBackend;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.DurableTask;
using Microsoft.Azure.WebJobs.Hosting;
using Microsoft.Data.SqlClient;

[assembly: WebJobsStartup(typeof(Dfm.MsSql.Startup))]
namespace Dfm.MsSql
{
    public class Startup : IWebJobsStartup
    {
        public void Configure(IWebJobsBuilder builder)
        {
            DfmEndpoint.Setup(null, new DfmExtensionPoints { GetInstanceHistoryRoutine = GetInstanceHistory });
        }

        /// <summary>
        /// Custom routine for fetching orchestration history
        /// </summary>
        public static IEnumerable<HistoryEvent> GetInstanceHistory(IDurableClient durableClient, string connName, string hubName, string instanceId)
        {
            string sql =
                @"SELECT 
					IIF(h2.TaskID IS NULL, h.Timestamp, h2.Timestamp) as Timestamp, 
					IIF(h2.TaskID IS NULL, h.EventType, h2.EventType) as EventType,
					h.TaskID as EventId,
					h.Name as Name,
					IIF(h2.TaskID IS NULL, NULL, h.Timestamp) as ScheduledTime,
					p.Text as Result,
					p.Reason as Details,
					cih.InstanceID as SubOrchestrationId
				FROM
					dt.Instances i
					INNER JOIN
					dt.History h
					ON
					(i.InstanceID = h.InstanceID AND i.ExecutionID = h.ExecutionID)
					LEFT JOIN
					dt.History h2
					ON
					(
						h.EventType IN ('TaskScheduled', 'SubOrchestrationInstanceCreated')
						AND
						h2.EventType IN ('SubOrchestrationInstanceCompleted', 'SubOrchestrationInstanceFailed', 'TaskCompleted', 'TaskFailed')
						AND
						h.InstanceID = h2.InstanceID AND h.ExecutionID = h2.ExecutionID AND h.TaskID = h2.TaskID AND h.SequenceNumber != h2.SequenceNumber
					)
					LEFT JOIN
					dt.Payloads p
					ON
					p.PayloadID = h2.DataPayloadID
					LEFT JOIN
					(
						select 
							cii.ParentInstanceID,
							cii.InstanceID,
							chh.TaskID
						from 
							dt.Instances cii
							INNER JOIN
							dt.History chh
							ON
							(chh.InstanceID = cii.InstanceID AND chh.EventType = 'ExecutionStarted')
					) cih
					ON
					(cih.ParentInstanceID = h.InstanceID AND cih.TaskID = h.TaskID)
				WHERE
					h.EventType IN 
					(
						'ExecutionStarted', 'ExecutionCompleted', 'ExecutionFailed', 'ExecutionTerminated', 'TaskScheduled', 'SubOrchestrationInstanceCreated',
						'ContinueAsNew', 'TimerCreated', 'TimerFired', 'EventRaised', 'EventSent'
					)
					AND
					i.InstanceID = @OrchestrationInstanceId

				ORDER BY
					h.SequenceNumber";


            string sqlConnectionString = Environment.GetEnvironmentVariable("DFM_SQL_CONNECTION_STRING");

            using (var conn = new SqlConnection(sqlConnectionString))
            {
                conn.Open();

                using (var cmd = new SqlCommand(sql, conn))
                {
                    cmd.Parameters.AddWithValue("@OrchestrationInstanceId", instanceId);

                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        // Memorizing 'ExecutionStarted' event, to further correlate with 'ExecutionCompleted'
                        DateTimeOffset? executionStartedTimestamp = null;

                        while (reader.Read())
                        {
                            var evt = ToHistoryEvent(reader, executionStartedTimestamp);

                            if (evt.EventType == "ExecutionStarted")
							{
                                executionStartedTimestamp = evt.Timestamp;
                            }

                            yield return evt;
                        }
                    }
                }
            }
        }

		private static HistoryEvent ToHistoryEvent(SqlDataReader reader, DateTimeOffset? executionStartTime)
		{
			var evt = new HistoryEvent
			{
				Timestamp = ((DateTime)reader["Timestamp"]).ToUniversalTime(),
				EventType = reader["EventType"].ToString(),
				EventId = reader["EventId"] is DBNull ? null : (int?)reader["EventId"],
				Name = reader["Name"].ToString(),
				Result = reader["Result"].ToString(),
				Details = reader["Details"].ToString(),
				SubOrchestrationId = reader["SubOrchestrationId"].ToString(),
			};

			var rawScheduledTime = reader["ScheduledTime"];
			if (!(rawScheduledTime is DBNull))
			{
				evt.ScheduledTime = ((DateTime)rawScheduledTime).ToUniversalTime();
			}
			else if(evt.EventType == "ExecutionCompleted")
			{
                evt.ScheduledTime = executionStartTime?.ToUniversalTime();
            }

			if (evt.ScheduledTime.HasValue)
			{
				evt.DurationInMs = (evt.Timestamp - evt.ScheduledTime.Value).TotalMilliseconds;
			}

            return evt;
        }
    }
}


================================================
FILE: custom-backends/mssql/arm-template.json
================================================
{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "functionAppName": {
            "type": "string",
            "defaultValue": "[concat('dfm-',uniqueString(resourceGroup().id))]",
            "metadata": {
                "description": "Name for the Function App, that will host your DFM instance. NOTE: there will be a NEW app created, and it will be different from the one that hosts your Durable Functions."
            }
        },
        "storageConnectionString": {
            "type": "securestring",
            "metadata": {
                "description": "Storage Connection String to the Storage your Durable Functions reside in. Copy it from your Durable Functions App Settings."
            }
        },
        "sqlConnectionString": {
            "type": "securestring",
            "metadata": {
                "description": "Connection String for the database your MSSQL storage provider is using. Copy it from your Durable Functions App Settings."
            }
        },
        "taskHubName": {
            "type": "string",
            "metadata": {
                "description": "Task Hub name to be monitored"
            }
        },
        "aadAppClientId": {
            "type": "string",
            "metadata": {
                "description": "In Azure Portal->Azure Active Directory->App Registrations create a new AAD App. Set its 'Redirect URI' setting to 'https://[your-function-app].azurewebsites.net/.auth/login/aad/callback'. Then on 'Authentication' page enable ID Tokens. Then copy that AAD App's ClientId into here."
            }
        },
        "aadAppTenantId": {
            "type": "string",
            "defaultValue": "[subscription().tenantId]",
            "metadata": {
                "description": "Put your AAD TenantId here (you can find it on Azure Portal->Azure Active Directory page), or leave as default to use the current subscription's TenantId."
            }
        },
        "allowedUserNames": {
            "type": "string",
            "metadata": {
                "description": "Comma-separated list of users (emails), that will be allowed to access this DFM instance. Specify at least yourself here."
            }
        }
    },
    "resources": [
        {
            "type": "Microsoft.Web/serverfarms",
            "apiVersion": "2016-09-01",
            "name": "[parameters('functionAppName')]",
            "location": "[resourceGroup().location]",
            "sku": {
                "name": "Y1",
                "tier": "Dynamic"
            },
            "properties": {
                "name": "[parameters('functionAppName')]",
                "computeMode": "Dynamic"
            }
        },

        {
            "apiVersion": "2018-11-01",
            "type": "Microsoft.Web/sites",
            "name": "[parameters('functionAppName')]",
            "location": "[resourceGroup().location]",
            "kind": "functionapp",
            "dependsOn": [
                "[resourceId('Microsoft.Web/serverfarms', parameters('functionAppName'))]"
            ],

            "resources": [
                {
                    "apiVersion": "2015-08-01",
                    "name": "web",
                    "type": "sourcecontrols",
                    "dependsOn": [
                        "[resourceId('Microsoft.Web/sites', parameters('functionAppName'))]"
                    ],
                    "properties": {
                        "RepoUrl": "https://github.com/scale-tone/DurableFunctionsMonitor",
                        "branch": "master",
                        "IsManualIntegration": true
                    }
                },

                {
                    "name": "[concat(parameters('functionAppName'), '/authsettings')]",
                    "apiVersion": "2018-11-01",
                    "type": "Microsoft.Web/sites/config",
                    "location": "[resourceGroup().location]",
                    "dependsOn": [
                        "[resourceId('Microsoft.Web/sites', parameters('functionAppName'))]"
                    ],
                    "properties": {
                        "enabled": true,
                        "unauthenticatedClientAction": "RedirectToLoginPage",
                        "tokenStoreEnabled": true,
                        "defaultProvider": "AzureActiveDirectory",
                        "clientId": "[parameters('aadAppClientId')]",
                        "issuer": "[concat('https://login.microsoftonline.com/', parameters('aadAppTenantId'), '/v2.0')]"
                    }
                }
            ],
    
            "properties": {
                "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('functionAppName'))]",
                "siteConfig": {
                    "appSettings": [
                        {
                            "name": "DFM_SQL_CONNECTION_STRING",
                            "value": "[parameters('sqlConnectionString')]"
                        },
                        {
                            "name": "DFM_HUB_NAME",
                            "value": "[parameters('taskHubName')]"
                        },
                        {
                            "name": "DFM_ALLOWED_USER_NAMES",
                            "value": "[parameters('allowedUserNames')]"
                        },
                        {
                            "name": "AzureWebJobsStorage",
                            "value": "[parameters('storageConnectionString')]"
                        },
                        {
                            "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING",
                            "value": "[parameters('storageConnectionString')]"
                        },
                        {
                            "name": "WEBSITE_CONTENTSHARE",
                            "value": "[toLower(parameters('functionAppName'))]"
                        },
                        {
                            "name": "FUNCTIONS_EXTENSION_VERSION",
                            "value": "~3"
                        },
                        {
                            "name": "FUNCTIONS_WORKER_RUNTIME",
                            "value": "dotnet"
                        },
                        {
                            "name": "Project",
                            "value": "custom-backends/mssql"
                        }
                    ]
                }
            }
        }
    ]
}


================================================
FILE: custom-backends/mssql/host.json
================================================
{
    "version": "2.0",
    "extensions": {
        "http": {
            "routePrefix": ""
        },

        "durableTask": {
            "hubName": "%DFM_HUB_NAME%",
            "extendedSessionsEnabled": "true",
            "UseGracefulShutdown": "true",
            "storageProvider": {
                "type": "mssql",
                "connectionStringName": "DFM_SQL_CONNECTION_STRING",
                "taskEventLockTimeout": "00:02:00"
            }
        }
    }
}

================================================
FILE: custom-backends/netcore21/.gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.

# nuget.exe
nuget.exe

# Azure Functions localsettings file
local.settings.json

# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/

# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUNIT
*.VisualState.xml
TestResult.xml

# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c

# DNX
project.lock.json
project.fragment.lock.json
artifacts/

*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Chutzpah Test files
_Chutzpah*

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# TFS 2012 Local Workspace
$tf/

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user

# JustCode is a .NET coding add-in
.JustCode

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*

# MightyMoose
*.mm.*
AutoTest.Net/

# Web workbench (sass)
.sass-cache/

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Comment the next line if you want to checkin your web deploy settings
# but database connection strings (with potential passwords) will be unencrypted
#*.pubxml
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/

# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignoreable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/

# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
node_modules/
orleans.codegen.cs

# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm

# SQL Server files
*.mdf
*.ldf

# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings

# Microsoft Fakes
FakesAssemblies/

# GhostDoc plugin setting file
*.GhostDoc.xml

# Node.js Tools for Visual Studio
.ntvs_analysis.dat

# Visual Studio 6 build log
*.plg

# Visual Studio 6 workspace options file
*.opt

# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions

# Paket dependency manager
.paket/paket.exe
paket-files/

# FAKE - F# Make
.fake/

# JetBrains Rider
.idea/
*.sln.iml

# CodeRush
.cr/

# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc

================================================
FILE: custom-backends/netcore21/Dfm.NetCore21.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <AzureFunctionsVersion>v2</AzureFunctionsVersion>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="1.0.38" />
    <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.DurableTask" Version="2.5.1" />
    <PackageReference Include="durablefunctionsmonitor.dotnetbackend" Version="5.0.0" />
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
</Project>


================================================
FILE: custom-backends/netcore21/README.md
================================================
# Durable Functions Monitor on .Net Core 2.1

Custom Durable Functions Monitor backend project, configured to run on .Net Core 2.1.

# How to deploy to Azure

[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2Fscale-tone%2FDurableFunctionsMonitor%2Fmaster%2Fcustom-backends%2Fnetcore21%2Farm-template.json)

The above button will deploy *these sources* into *your newly created* Function App instance.


================================================
FILE: custom-backends/netcore21/Startup.cs
================================================
using DurableFunctionsMonitor.DotNetBackend;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Hosting;

[assembly: WebJobsStartup(typeof(Dfm.NetCore21.Startup))]
namespace Dfm.NetCore21
{
    public class Startup : IWebJobsStartup
    {
        public void Configure(IWebJobsBuilder builder)
        {
            DfmEndpoint.Setup();
        }
    }
}


================================================
FILE: custom-backends/netcore21/arm-template.json
================================================
{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "functionAppName": {
            "type": "string",
            "defaultValue": "[concat('dfm-',uniqueString(resourceGroup().id))]",
            "metadata": {
                "description": "Name for the Function App, that will host your DFM instance. NOTE: there will be a NEW app created, and it will be different from the one that hosts your Durable Functions."
            }
        },
        "storageConnectionString": {
            "type": "securestring",
            "metadata": {
                "description": "Storage Connection String to the Storage your Durable Functions reside in. Copy it from your Durable Functions App Settings."
            }
        },
        "taskHubName": {
            "type": "string",
            "defaultValue": "",
            "metadata": {
                "description": "(optional) Comma-separated list of Task Hub names to be monitored. WARNING: if not set, this instance will expose ALL Task Hubs in your Storage account!"
            }
        },
        "aadAppClientId": {
            "type": "string",
            "metadata": {
                "description": "In Azure Portal->Azure Active Directory->App Registrations create a new AAD App. Set its 'Redirect URI' setting to 'https://[your-function-app].azurewebsites.net/.auth/login/aad/callback'. Then on 'Authentication' page enable ID Tokens. Then copy that AAD App's ClientId into here."
            }
        },
        "aadAppTenantId": {
            "type": "string",
            "defaultValue": "[subscription().tenantId]",
            "metadata": {
                "description": "Put your AAD TenantId here (you can find it on Azure Portal->Azure Active Directory page), or leave as default to use the current subscription's TenantId."
            }
        },
        "allowedUserNames": {
            "type": "string",
            "metadata": {
                "description": "Comma-separated list of users (emails), that will be allowed to access this DFM instance. Specify at least yourself here."
            }
        }
    },
    "resources": [
        {
            "type": "Microsoft.Web/serverfarms",
            "apiVersion": "2016-09-01",
            "name": "[parameters('functionAppName')]",
            "location": "[resourceGroup().location]",
            "sku": {
                "name": "Y1",
                "tier": "Dynamic"
            },
            "properties": {
                "name": "[parameters('functionAppName')]",
                "computeMode": "Dynamic"
            }
        },

        {
            "apiVersion": "2018-11-01",
            "type": "Microsoft.Web/sites",
            "name": "[parameters('functionAppName')]",
            "location": "[resourceGroup().location]",
            "kind": "functionapp",
            "dependsOn": [
                "[resourceId('Microsoft.Web/serverfarms', parameters('functionAppName'))]"
            ],

            "resources": [
                {
                    "apiVersion": "2015-08-01",
                    "name": "web",
                    "type": "sourcecontrols",
                    "dependsOn": [
                        "[resourceId('Microsoft.Web/sites', parameters('functionAppName'))]"
                    ],
                    "properties": {
                        "RepoUrl": "https://github.com/scale-tone/DurableFunctionsMonitor",
                        "branch": "master",
                        "IsManualIntegration": true
                    }
                },

                {
                    "name": "[concat(parameters('functionAppName'), '/authsettings')]",
                    "apiVersion": "2018-11-01",
                    "type": "Microsoft.Web/sites/config",
                    "location": "[resourceGroup().location]",
                    "dependsOn": [
                        "[resourceId('Microsoft.Web/sites', parameters('functionAppName'))]"
                    ],
                    "properties": {
                        "enabled": true,
                        "unauthenticatedClientAction": "RedirectToLoginPage",
                        "tokenStoreEnabled": true,
                        "defaultProvider": "AzureActiveDirectory",
                        "clientId": "[parameters('aadAppClientId')]",
                        "issuer": "[concat('https://login.microsoftonline.com/', parameters('aadAppTenantId'), '/v2.0')]"
                    }
                }
            ],
    
            "properties": {
                "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('functionAppName'))]",
                "siteConfig": {
                    "appSettings": [
                        {
                            "name": "DFM_HUB_NAME",
                            "value": "[parameters('taskHubName')]"
                        },
                        {
                            "name": "DFM_ALLOWED_USER_NAMES",
                            "value": "[parameters('allowedUserNames')]"
                        },
                        {
                            "name": "AzureWebJobsStorage",
                            "value": "[parameters('storageConnectionString')]"
                        },
                        {
                            "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING",
                            "value": "[parameters('storageConnectionString')]"
                        },
                        {
                            "name": "WEBSITE_CONTENTSHARE",
                            "value": "[toLower(parameters('functionAppName'))]"
                        },
                        {
                            "name": "FUNCTIONS_EXTENSION_VERSION",
                            "value": "~2"
                        },
                        {
                            "name": "FUNCTIONS_WORKER_RUNTIME",
                            "value": "dotnet"
                        },
                        {
                            "name": "Project",
                            "value": "custom-backends/netcore21"
                        }
                    ]
                }
            }
        }
    ]
}


================================================
FILE: custom-backends/netcore21/host.json
================================================
{
    "version": "2.0",
    "extensions": {
        "http": {
            "routePrefix": ""
        }
    }
}

================================================
FILE: custom-backends/netcore31/.gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.

# nuget.exe
nuget.exe

# Azure Functions localsettings file
local.settings.json

# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/

# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUNIT
*.VisualState.xml
TestResult.xml

# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c

# DNX
project.lock.json
project.fragment.lock.json
artifacts/

*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Chutzpah Test files
_Chutzpah*

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# TFS 2012 Local Workspace
$tf/

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user

# JustCode is a .NET coding add-in
.JustCode

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*

# MightyMoose
*.mm.*
AutoTest.Net/

# Web workbench (sass)
.sass-cache/

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Comment the next line if you want to checkin your web deploy settings
# but database connection strings (with potential passwords) will be unencrypted
#*.pubxml
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/

# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignoreable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/

# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
node_modules/
orleans.codegen.cs

# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm

# SQL Server files
*.mdf
*.ldf

# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings

# Microsoft Fakes
FakesAssemblies/

# GhostDoc plugin setting file
*.GhostDoc.xml

# Node.js Tools for Visual Studio
.ntvs_analysis.dat

# Visual Studio 6 build log
*.plg

# Visual Studio 6 workspace options file
*.opt

# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions

# Paket dependency manager
.paket/paket.exe
paket-files/

# FAKE - F# Make
.fake/

# JetBrains Rider
.idea/
*.sln.iml

# CodeRush
.cr/

# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc

================================================
FILE: custom-backends/netcore31/Dfm.NetCore31.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <AzureFunctionsVersion>v3</AzureFunctionsVersion>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.12" />
    <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.DurableTask" Version="2.5.0" />
    <PackageReference Include="durablefunctionsmonitor.dotnetbackend" Version="5.0.0" />
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
</Project>


================================================
FILE: custom-backends/netcore31/README.md
================================================
# Durable Functions Monitor on .Net Core 3.1

Custom Durable Functions Monitor backend project, configured to run on .Net Core 3.1.

# How to deploy to Azure

[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2Fscale-tone%2FDurableFunctionsMonitor%2Fmaster%2Fcustom-backends%2Fnetcore31%2Farm-template.json)

The above button will deploy *these sources* into *your newly created* Function App instance.


================================================
FILE: custom-backends/netcore31/Startup.cs
================================================
using DurableFunctionsMonitor.DotNetBackend;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Hosting;

[assembly: WebJobsStartup(typeof(Dfm.NetCore31.Startup))]
namespace Dfm.NetCore31
{
    public class Startup : IWebJobsStartup
    {
        public void Configure(IWebJobsBuilder builder)
        {
            DfmEndpoint.Setup();
        }
    }
}


================================================
FILE: custom-backends/netcore31/arm-template.json
================================================
{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "functionAppName": {
            "type": "string",
            "defaultValue": "[concat('dfm-',uniqueString(resourceGroup().id))]",
            "metadata": {
                "description": "Name for the Function App, that will host your DFM instance. NOTE: there will be a NEW app created, and it will be different from the one that hosts your Durable Functions."
            }
        },
        "storageConnectionString": {
            "type": "securestring",
            "metadata": {
                "description": "Storage Connection String to the Storage your Durable Functions reside in. Copy it from your Durable Functions App Settings."
            }
        },
        "taskHubName": {
            "type": "string",
            "defaultValue": "",
            "metadata": {
                "description": "(optional) Comma-separated list of Task Hub names to be monitored. WARNING: if not set, this instance will expose ALL Task Hubs in your Storage account!"
            }
        },
        "aadAppClientId": {
            "type": "string",
            "metadata": {
                "description": "In Azure Portal->Azure Active Directory->App Registrations create a new AAD App. Set its 'Redirect URI' setting to 'https://[your-function-app].azurewebsites.net/.auth/login/aad/callback'. Then on 'Authentication' page enable ID Tokens. Then copy that AAD App's ClientId into here."
            }
        },
        "aadAppTenantId": {
            "type": "string",
            "defaultValue": "[subscription().tenantId]",
            "metadata": {
                "description": "Put your AAD TenantId here (you can find it on Azure Portal->Azure Active Directory page), or leave as default to use the current subscription's TenantId."
            }
        },
        "allowedUserNames": {
            "type": "string",
            "metadata": {
                "description": "Comma-separated list of users (emails), that will be allowed to access this DFM instance. Specify at least yourself here."
            }
        }
    },
    "resources": [
        {
            "type": "Microsoft.Web/serverfarms",
            "apiVersion": "2016-09-01",
            "name": "[parameters('functionAppName')]",
            "location": "[resourceGroup().location]",
            "sku": {
                "name": "Y1",
                "tier": "Dynamic"
            },
            "properties": {
                "name": "[parameters('functionAppName')]",
                "computeMode": "Dynamic"
            }
        },

        {
            "apiVersion": "2018-11-01",
            "type": "Microsoft.Web/sites",
            "name": "[parameters('functionAppName')]",
            "location": "[resourceGroup().location]",
            "kind": "functionapp",
            "dependsOn": [
                "[resourceId('Microsoft.Web/serverfarms', parameters('functionAppName'))]"
            ],

            "resources": [
                {
                    "apiVersion": "2015-08-01",
                    "name": "web",
                    "type": "sourcecontrols",
                    "dependsOn": [
                        "[resourceId('Microsoft.Web/sites', parameters('functionAppName'))]"
                    ],
                    "properties": {
                        "RepoUrl": "https://github.com/scale-tone/DurableFunctionsMonitor",
                        "branch": "master",
                        "IsManualIntegration": true
                    }
                },

                {
                    "name": "[concat(parameters('functionAppName'), '/authsettings')]",
                    "apiVersion": "2018-11-01",
                    "type": "Microsoft.Web/sites/config",
                    "location": "[resourceGroup().location]",
                    "dependsOn": [
                        "[resourceId('Microsoft.Web/sites', parameters('functionAppName'))]"
                    ],
                    "properties": {
                        "enabled": true,
                        "unauthenticatedClientAction": "RedirectToLoginPage",
                        "tokenStoreEnabled": true,
                        "defaultProvider": "AzureActiveDirectory",
                        "clientId": "[parameters('aadAppClientId')]",
                        "issuer": "[concat('https://login.microsoftonline.com/', parameters('aadAppTenantId'), '/v2.0')]"
                    }
                }
            ],
    
            "properties": {
                "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('functionAppName'))]",
                "siteConfig": {
                    "appSettings": [
                        {
                            "name": "DFM_HUB_NAME",
                            "value": "[parameters('taskHubName')]"
                        },
                        {
                            "name": "DFM_ALLOWED_USER_NAMES",
                            "value": "[parameters('allowedUserNames')]"
                        },
                        {
                            "name": "AzureWebJobsStorage",
                            "value": "[parameters('storageConnectionString')]"
                        },
                        {
                            "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING",
                            "value": "[parameters('storageConnectionString')]"
                        },
                        {
                            "name": "WEBSITE_CONTENTSHARE",
                            "value": "[toLower(parameters('functionAppName'))]"
                        },
                        {
                            "name": "FUNCTIONS_EXTENSION_VERSION",
                            "value": "~3"
                        },
                        {
                            "name": "FUNCTIONS_WORKER_RUNTIME",
                            "value": "dotnet"
                        },
                        {
                            "name": "Project",
                            "value": "custom-backends/netcore31"
                        }
                    ]
                }
            }
        }
    ]
}


================================================
FILE: custom-backends/netcore31/host.json
================================================
{
    "version": "2.0",
    "extensions": {
        "http": {
            "routePrefix": ""
        }
    }
}

================================================
FILE: durablefunctionsmonitor-vscodeext/.gitignore
================================================
# build output
*.vsix

# DurableFunctionsMonitor.Functions build output
backend

# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*

# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json

# Runtime data
pids
*.pid
*.seed
*.pid.lock

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage

# nyc test coverage
.nyc_output

# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# Bower dependency directory (https://bower.io/)
bower_components

# node-waf configuration
.lock-wscript

# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release

# Dependency directories
node_modules/
jspm_packages/

# TypeScript v1 declaration files
typings/

# Optional npm cache directory
.npm

# Optional eslint cache
.eslintcache

# Optional REPL history
.node_repl_history

# Output of 'npm pack'
*.tgz

# Yarn Integrity file
.yarn-integrity

# dotenv environment variables file
.env
.env.test

# parcel-bundler cache (https://parceljs.org/)
.cache

# next.js build output
.next

# nuxt.js build output
.nuxt

# vuepress build output
.vuepress/dist

# Serverless directories
.serverless/

# FuseBox cache
.fusebox/

# DynamoDB Local files
.dynamodb/

# TypeScript output
dist
out

# Azure Functions artifacts
bin
obj
appsettings.json
local.settings.json

================================================
FILE: durablefunctionsmonitor-vscodeext/.vscode/extensions.json
================================================
{
	// See http://go.microsoft.com/fwlink/?LinkId=827846
	// for the documentation about the extensions.json format
	"recommendations": [
		"ms-vscode.vscode-typescript-tslint-plugin"
	]
}

================================================
FILE: durablefunctionsmonitor-vscodeext/.vscode/launch.json
================================================
// A launch configuration that compiles the extension and then opens it inside a new window
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
{
	"version": "0.2.0",
	"configurations": [
        {
            "name": "Run Extension",
            "type": "extensionHost",
            "request": "launch",
            "runtimeExecutable": "${execPath}",
            "args": [
                "--extensionDevelopmentPath=${workspaceFolder}"
            ],
            "outFiles": [
                "${workspaceFolder}/out/**/*.js"
            ],
            "preLaunchTask": "npm: watch"
        },
        {
            "name": "Extension Tests",
            "type": "extensionHost",
            "request": "launch",
            "runtimeExecutable": "${execPath}",
            "args": [
                "--extensionDevelopmentPath=${workspaceFolder}",
                "--extensionTestsPath=${workspaceFolder}/out/test/suite/index"
            ],
            "outFiles": [
                "${workspaceFolder}/out/test/**/*.js"
            ],
            "preLaunchTask": "npm: watch"
        },
        {
            "name": "Local Process with Kubernetes (Preview)",
            "type": "dev-spaces-connect-configuration",
            "request": "launch"
        }
    ]
}


================================================
FILE: durablefunctionsmonitor-vscodeext/.vscode/settings.json
================================================
// Place your settings in this file to overwrite default and user settings.
{
    "files.exclude": {
        "out": false // set this to true to hide the "out" folder with the compiled JS files
    },
    "search.exclude": {
        "out": true // set this to false to include "out" folder in search results
    },
    // Turn off tsc task auto detection since we have the necessary tasks as npm scripts
    "typescript.tsc.autoDetect": "off"
}

================================================
FILE: durablefunctionsmonitor-vscodeext/.vscode/tasks.json
================================================
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
{
	"version": "2.0.0",
	"tasks": [
		{
			"type": "npm",
			"script": "watch",
			"problemMatcher": "$tsc-watch",
			"isBackground": true,
			"presentation": {
				"reveal": "never"
			},
			"group": {
				"kind": "build",
				"isDefault": true
			}
		}
	]
}


================================================
FILE: durablefunctionsmonitor-vscodeext/.vscodeignore
================================================
.vscode/**
.vscode-test/**
out/test/**
src/**
.gitignore
vsc-extension-quickstart.md
**/tsconfig.json
**/tslint.json
**/*.map
**/*.ts

================================================
FILE: durablefunctionsmonitor-vscodeext/CHANGELOG.md
================================================
# Change Log

## Version 5.1.0

- Instance execution history can now be filtered by time and other field values:
![image](https://user-images.githubusercontent.com/5447190/140803804-84ef440b-bce7-432d-aaf9-4b663f2ef5cd.png)

- 'In' and 'Not In' filter operators. Filter values should be comma-separated or in form of a JSON array.
- Backend migrated to .Net Core 3.1.
- Direct requests that DfMon makes against Azure Table Storage now contain custom **User-Agent** header: `DurableFunctionsMonitor-Standalone`, `DurableFunctionsMonitor-VsCodeExt` or `DurableFunctionsMonitor-Injected`. Note that the majority of calls is still done via DurableClient, and those cannot be instrumented like this yet.
- Minor bugfixes.

## Version 5.0.0

- UI improvements for instance filter and in some other places.
- Minor bugfixes.

## Version 4.8.2

- Minor hotfix (DfMon's View Container might become unresponsive after a debug session).

## Version 4.8.1

- Workaround for https://github.com/Azure/azure-functions-durable-extension/issues/1926 (being unable to execute .Reset() and .StartNew() against a Task Hub named 'TestHubName').

## Version 4.8

- 'Start New Orchestration Instance' feature:
<img width="200px" src="https://user-images.githubusercontent.com/5447190/130657962-c1c32575-c82c-4e29-ad88-3951eb821fe8.png"/>
<img width="400px" src="https://user-images.githubusercontent.com/5447190/130658737-e51e259d-e7ec-43a2-902b-79907936fb82.png"/>

- Should now work seamlessly in [GitHub Codespaces](https://github.com/features/codespaces).
- Full support for [Microsoft SQL storage provider](https://github.com/microsoft/durabletask-mssql).
- Latest [az-func-as-a-graph](https://github.com/scale-tone/az-func-as-a-graph) integrated.
- Minor bugfixes.

## Version 4.7.1

- Hotfix for incompatibility with Storage Emulator ([#112](https://github.com/scale-tone/DurableFunctionsMonitor/issues/112)).

## Version 4.7

- Latest [az-func-as-a-graph](https://github.com/scale-tone/az-func-as-a-graph) integrated, and it is now used as yet another visualization tab for both search results and instance details, with instance counts and statuses rendered on top of it. So it now acts as an *animated* code map of your project:
![image](https://user-images.githubusercontent.com/5447190/127571400-f83c7f96-55bc-4714-8323-04d26f3be74f.png)

- 'Open XXXInstances/XXXHistory in Storage Explorer' menu items for Task Hubs:
<img src="https://user-images.githubusercontent.com/5447190/127571803-4502d249-9963-4f70-9c4e-8aa1397bf06e.png" width="300">

- Long JSON (or just long error messages) can now be viewed in a popup window ([#109](https://github.com/scale-tone/DurableFunctionsMonitor/issues/109)).
- Minor bugfixes.

## Version 4.6

- Added a sortable **Duration** column to the list of results. Now you can quickly find quickest and longest instances.
- Gantt charts are now interactive (lines are clickable).
- Custom backends: you can now switch to a .Net Core 3.1 backend, or even to your own customized one:

    ![image](https://user-images.githubusercontent.com/5447190/123545702-c3aeb500-d759-11eb-9d6d-7c69db167ca2.png)

- (Limited) support for [Microsoft SQL storage provider](https://github.com/microsoft/durabletask-mssql). When you open a project that uses it, the relevant Task Hub should appear in the **DURABLE FUNCTIONS** view container:

    ![image](https://user-images.githubusercontent.com/5447190/123545989-281e4400-d75b-11eb-865e-b8aa3cee690a.png)

- Minor bugfixes.

## Version 4.5

- Time can now be shown in local time zone. **File->Preferences->Settings->Durable Functions Monitor->Show Time As**.
- F# support for Functions Graphs.
- Instance Details tab is now integrated with Functions Graph. If relevant Functions project is currently open, the Details tab will allow navigating to Functions Graph and to Orchestration/Entity/Activity source code.
- Minor bugfixes.

## Version 4.4

- Now you can get a quick overview of _any_ Azure Functions project in form of a graph. **Command Palette -> Visualize Functions as a Graph...**. For Durable Functions/Durable Entities the tool also tries to infer and show their relationships. Function nodes are clickable and lead to function's code.
- Minor bugfixes.

## Version 4.3

- Fixed time ranges ('Last Minute', 'Last Hour' etc.).
- Multiple choice for filtering by instance status ('Running', 'Completed' etc.).
- 'Not Equals', 'Not Starts With' and 'Not Contains' filter operators.
- Performance improvements.
- Minor bugfixes.

## Version 4.2

- Orchestrations/Entities are now also visualized as a time histogram and as a Gantt chart. Time histogram is interactive, you can zoom it in/out with your mouse.
<img src="https://raw.githubusercontent.com/scale-tone/DurableFunctionsMonitor/master/readme/screenshots/time-histogram.png" width="400">

- 'Send Signal' button for Durable Entities.
- Minor bugfixes.

## Version 4.1

- Dark color mode.
- Minor bugfixes.

## Version 4.0

- It is now one backend per Storage Account, not per each Task Hub. Works faster and consumes less resources.
- Minor bugfixes.

## Version 3.9

- Gantt Charts for orchestrations (in addition to Sequence Diagrams).
- 'Go to instanceId...' feature to quickly navigate to an orchestration/entity instance by its id (with autocomplete supported). **Right-click on a Task Hub->Go to instanceId...**.
- DotLiquid replaced with [Fluid](https://github.com/sebastienros/fluid) for rendering custom status tabs. [Fluid](https://github.com/sebastienros/fluid) looks much more mature (most of [Liquid](https://shopify.github.io/liquid/) seems to be supported) and more alive library.
- 'Save as .SVG' button for diagrams.
- Status tabs now refresh much smoother.
- Minor bugfixes.

## Version 3.8

- WebViews are now persistent (do not reload every time you switch between them) and even persist their state (filters, sorting etc.) across restarts.
- 'Restart' button for orchestrations (triggers the new [.RestartAsync()](https://github.com/Azure/azure-functions-durable-extension/pull/1545) method).
- Sequence diagrams now show some timing (start times and durations).
- 'Detach from all Task Hubs...' button for quickly killing all backends.
- All logs (when enabled) now go to 'Durable Functions Monitor' output channel.
- Minor bugfixes.

## Version 3.7

- Now settings are stored in VsCode's settings.json. **File->Preferences->Settings->Durable Functions Monitor**: 
<img src="https://raw.githubusercontent.com/scale-tone/DurableFunctionsMonitor/master/readme/screenshots/vscodeext-settings.png" width="400">

- Local Storage Emulator, Azure Government and other exotic Storage Account types are now supported. If your Local Storage Emulator is running and there're some TaskHubs in it - they will appear automatically on your Azure Functions View Container (if not, try to modify the 'Storage Emulator Connection String' parameter on the Settings page).

- Long-awaited 'Cancel' button on the Orchestrations page.

- Now you can hide the columns you're not interested in:
<img src="https://raw.githubusercontent.com/scale-tone/DurableFunctionsMonitor/master/readme/screenshots/hide-columns.png" width="350">

- Minor other UI improvements.

## Version 3.6

- 'Clear Entity Storage...' menu item for doing garbage collection of deleted Durable Entities. Executes the recently added [IDurableEntityClient.CleanEntityStorageAsync()](https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.webjobs.extensions.durabletask.idurableentityclient.cleanentitystorageasync?view=azure-dotnet) method.

- Custom status visualisation for orchestrations/entities in form of [Liquid templates](https://shopify.github.io/liquid/). 
  1. Create a [DotLiquid](https://github.com/dotliquid/dotliquid) template file. 
  2. Name it like `[My Custom Tab Name].[orchestration-or-entity-name].liquid` or just `[My Custom Tab Name].liquid` (this one will be applied to any kind of entity).
  3. In the same Storage Account create a container called `durable-functions-monitor`.
  4. Put your template file into a `tab-templates` virtual folder in that container (the full path should look like `/durable-functions-monitor/tab-templates/[My Custom Tab Name].[orchestration-or-entity-name].liquid`).
  5. Restart Durable Functions Monitor.
  6. Observe the newly appeared `My Custom Tab Name` tab on the Orchestration/Entity Details page.

- Performance improvements for loading the list of Orchestrations/Entities.

## Version 3.5

- Now the **Orchestration Details** page features a nice [mermaid](https://www.npmjs.com/package/mermaid)-based sequence diagram:
<img src="https://raw.githubusercontent.com/scale-tone/DurableFunctionsMonitor/master/readme/screenshots/vscodeext-orchestration-diagram-small.png">
- Also it's now possible to navigate to suborchestrations from the history list on the **Orchestration Details** page.

## Version 3.4

- Now integrated with [Azure Account](https://marketplace.visualstudio.com/items?itemName=ms-vscode.azure-account) extension, so once logged in to Azure, you can now see and connect to all your TaskHubs. It is also still possible to connect with connection strings, as before. NOTE1: only filtered Azure Subscriptions are shown, so make sure your filter is set correctly with [Azure: Select Subscriptions](https://docs.microsoft.com/en-us/azure/governance/policy/how-to/extension-for-vscode#select-subscriptions) command. NOTE2: many things can go wrong when fetching the list of TaskHubs, so to investigate those problems you can [enable logging](https://github.com/scale-tone/DurableFunctionsMonitor/blob/master/durablefunctionsmonitor-vscodeext/CHANGELOG.md#version-21) and then check the 'Durable Functions Monitor' output channel.

## Version 3.3

- customStatus value of your orchestration instances can now be changed with 'Set Custom Status' button.
- Minor bugfixes.

## Version 3.2

- You can now delete unused Task Hubs with 'Delete Task Hub...' context menu item.
- Better (non-native) DateTime pickers.

## Version 3.1

- Minor security improvements.
- List of existing Task Hubs is now loaded from your Storage Account and shown to you, when connecting to a Task Hub.

## Version 3.0

- A 'DURABLE FUNCTIONS' TreeView added to Azure Functions View Container. It displays all currently attached Task Hubs, allows to connect to multiple Task Hubs and switch between them. You need to have [Azure Functions](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurefunctions) extension installed to see it (which is typically the case if you work with Azure Functions in VSCode).

## Version 2.2

- Bulk purge for Durable Entities as well.
- Prettified JSON on instance details page.

## Version 2.1

- Instances list sort order is now persisted as well.
- Whenever backend initialization fails, its error message is now being shown immediately (instead of a generic 'timeout' message as before).
- A complete backend output can now be logged into a file for debugging purposes. Open the **settings.json** file in extension's folder and set the **logging** setting to **true**. That will produce a **backend/backend-37072.log** file with full console output from func.exe.

## Version 2.0

- More native support for Durable Entities.
- Backend migrated to Microsoft.Azure.WebJobs.Extensions.DurableTask 2.0.0. Please, ensure you have the latest Azure Functions Core Tools installed globally, otherwise the backend might fail to start.
- Now displaying connection info (storage account name/hub name) in the tab title.

## Version 1.3

- Implemented purging orchestration instance history. Type 'Purge Durable Functions History...' in your Command Palette.
- Added a context menu over a **host.json** file.


================================================
FILE: durablefunctionsmonitor-vscodeext/LICENSE
================================================
MIT License

Copyright (c) 2019 scale-tone

Permission 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:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE 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.


================================================
FILE: durablefunctionsmonitor-vscodeext/README.md
================================================
# Durable Functions Monitor as a VsCode Extension

List/monitor/debug your Azure Durable Functions inside VsCode.

**Command Palette -> Durable Functions Monitor**, or (if you have [Azure Functions](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurefunctions) extension also installed) **Azure Functions View Container -> DURABLE FUNCTIONS**, or right-click on your **host.json** file and use the context menu.

## Features

* Get a bird's eye view of any Azure Functions project in form of a graph - **Command Palette -> Visualize Functions as a Graph...**. 
* List your Orchestrations and/or Durable Entities, with sorting, infinite scrolling and auto-refresh.
* Monitor the status of a certain Orchestration/Durable Entity. Restart, Purge, Rewind, Terminate, Raise Events.
* Start new orchestration instances - **Azure Functions View Container -> DURABLE FUNCTIONS -> [right-click on your TaskHub] -> Start New Orchestration Instance...**
* Quickly navigate to an Orchestration/Entity instance by its ID - **Command Palette -> Durable Functions Monitor: Go to instanceId...** or **Azure Functions View Container -> DURABLE FUNCTIONS -> [right-click on your TaskHub] -> Go to instanceId...**
* Purge Orchestrations/Durable Entities history - **Command Palette -> Durable Functions Monitor: Purge History...**
* Cleanup deleted Durable Entities - **Command Palette -> Durable Functions Monitor: Clean Entity Storage...**
* Observe all Task Hubs in your Azure Subscription and connect to them - **Azure Functions View Container -> DURABLE FUNCTIONS**
* Delete Task Hubs - **Command Palette -> Delete Task Hub...**

## Pictures

<img src="https://raw.githubusercontent.com/scale-tone/DurableFunctionsMonitor/master/readme/screenshots/vscodeext-command-palette.png" width="624">

<img src="https://raw.githubusercontent.com/scale-tone/DurableFunctionsMonitor/master/readme/screenshots/vscodeext-orchestrations.png" width="768">

<img src="https://raw.githubusercontent.com/scale-tone/DurableFunctionsMonitor/master/readme/screenshots/vscodeext-orchestration.png" width="843">

<img src="https://raw.githubusercontent.com/scale-tone/DurableFunctionsMonitor/master/readme/screenshots/gantt-chart.png" width="843">

<img src="https://raw.githubusercontent.com/scale-tone/DurableFunctionsMonitor/master/readme/screenshots/vscodeext-orchestration-diagram.png" width="600">

<img src="https://raw.githubusercontent.com/scale-tone/DurableFunctionsMonitor/master/readme/screenshots/function-graph.png" width="800">

## Prerequisites

Make sure you have the latest [Azure Functions Core Tools](https://www.npmjs.com/package/azure-functions-core-tools) globally installed on your devbox.

More info and sources on [the github repo](https://github.com/scale-tone/DurableFunctionsMonitor#features).


================================================
FILE: durablefunctionsmonitor-vscodeext/package.json
================================================
{
    "name": "durablefunctionsmonitor",
    "displayName": "Durable Functions Monitor",
    "description": "Monitoring/debugging UI tool for Azure Durable Functions. View->Command Palette...->Durable Functions Monitor",
    "version": "5.1.0",
    "engines": {
        "vscode": "^1.39.0"
    },
    "categories": [
        "Other",
        "Debuggers"
    ],
    "homepage": "https://github.com/scale-tone/DurableFunctionsMonitor",
    "repository": {
        "type": "git",
        "url": "https://github.com/scale-tone/DurableFunctionsMonitor"
    },
    "bugs": {
        "url": "https://github.com/scale-tone/DurableFunctionsMonitor/issues"
    },
    "icon": "logo.png",
    "keywords": [
        "Azure Durable Functions",
        "Azure Durable Entities",
        "Azure Functions",
        "Serverless",
        "Azure"
    ],
    "publisher": "DurableFunctionsMonitor",
    "license": "MIT",
    "activationEvents": [
        "onView:durableFunctionsMonitorTreeView",
        "onCommand:extension.durableFunctionsMonitor",
        "onCommand:extension.durableFunctionsMonitorPurgeHistory",
        "onCommand:extension.durableFunctionsMonitorCleanEntityStorage",
        "onCommand:durableFunctionsMonitorTreeView.attachToAnotherTaskHub",
        "onCommand:extension.durableFunctionsMonitorGotoInstanceId",
        "onCommand:extension.durableFunctionsMonitorVisualizeAsGraph",
        "onCommand:durableFunctionsMonitorTreeView.startNewInstance",
        "onDebug"
    ],
    "main": "./out/extension.js",
    "contributes": {
        "views": {
            "azure": [
                {
                    "id": "durableFunctionsMonitorTreeView",
                    "name": "Durable Functions"
                }
            ]
        },
        "commands": [
            {
                "command": "extension.durableFunctionsMonitor",
                "title": "Durable Functions Monitor"
            },
            {
                "command": "extension.durableFunctionsMonitorPurgeHistory",
                "title": "Durable Functions Monitor: Purge History..."
            },
            {
                "command": "extension.durableFunctionsMonitorCleanEntityStorage",
                "title": "Durable Functions Monitor: Clean Entity Storage..."
            },
            {
                "command": "extension.durableFunctionsMonitorGotoInstanceId",
                "title": "Durable Functions Monitor: Go to instanceId..."
            },
            {
                "command": "extension.durableFunctionsMonitorVisualizeAsGraph",
                "title": "Visualize Functions as a Graph..."
            },
            {
                "command": "durableFunctionsMonitorTreeView.attachToTaskHub",
                "title": "Attach"
            },
            {
                "command": "durableFunctionsMonitorTreeView.detachFromTaskHub",
                "title": "Detach"
            },
            {
                "command": "durableFunctionsMonitorTreeView.openInstancesInStorageExplorer",
                "title": "Open *Instances table in Storage Explorer"
            },
            {
                "command": "durableFunctionsMonitorTreeView.openHistoryInStorageExplorer",
                "title": "Open *History table in Storage Explorer"
            },
            {
                "command": "durableFunctionsMonitorTreeView.deleteTaskHub",
                "title": "Delete Task Hub..."
            },
            {
                "command": "durableFunctionsMonitorTreeView.refresh",
                "title": "Refresh",
                "icon": {
                    "light": "resources/light/refresh.svg",
                    "dark": "resources/dark/refresh.svg"
                }
            },
            {
                "command": "durableFunctionsMonitorTreeView.attachToAnotherTaskHub",
                "title": "Attach to Task Hub...",
                "icon": {
                    "light": "resources/light/plug.svg",
                    "dark": "resources/dark/plug.svg"
                }
            },
            {
                "command": "durableFunctionsMonitorTreeView.detachFromAllTaskHubs",
                "title": "Detach from all Task Hubs...",
                "icon": {
                    "light": "resources/light/unplug.svg",
                    "dark": "resources/dark/unplug.svg"
                }
            },
            {
                "command": "durableFunctionsMonitorTreeView.purgeHistory",
                "title": "Purge History..."
            },
            {
                "command": "durableFunctionsMonitorTreeView.cleanEntityStorage",
                "title": "Clean Entity Storage..."
            },
            {
                "command": "durableFunctionsMonitorTreeView.gotoInstanceId",
                "title": "Go to instanceId..."
            },
            {
                "command": "durableFunctionsMonitorTreeView.startNewInstance",
                "title": "Start New Orchestration Instance..."
            }
        ],
        "menus": {
            "explorer/context": [
                {
                    "command": "extension.durableFunctionsMonitor",
                    "when": "resourceFilename == host.json",
                    "group": "DurableFunctionMonitorGroup@1"
                },
                {
                    "command": "extension.durableFunctionsMonitorPurgeHistory",
                    "when": "resourceFilename == host.json",
                    "group": "DurableFunctionMonitorGroup@2"
                },
                {
                    "command": "extension.durableFunctionsMonitorCleanEntityStorage",
                    "when": "resourceFilename == host.json",
                    "group": "DurableFunctionMonitorGroup@3"
                },
                {
                    "command": "extension.durableFunctionsMonitorGotoInstanceId",
                    "when": "resourceFilename == host.json",
                    "group": "DurableFunctionMonitorGroup@4"
                },
                {
                    "command": "extension.durableFunctionsMonitorVisualizeAsGraph",
                    "when": "resourceFilename == host.json",
                    "group": "DurableFunctionMonitorGroup@5"
                }
            ],
            "view/title": [
                {
                    "command": "durableFunctionsMonitorTreeView.refresh",
                    "when": "view == durableFunctionsMonitorTreeView",
                    "group": "navigation@1"
                },
                {
                    "command": "durableFunctionsMonitorTreeView.detachFromAllTaskHubs",
                    "when": "view == durableFunctionsMonitorTreeView",
                    "group": "navigation@2"
                },
                {
                    "command": "durableFunctionsMonitorTreeView.attachToAnotherTaskHub",
                    "when": "view == durableFunctionsMonitorTreeView",
                    "group": "navigation@3"
                }
            ],
            "view/item/context": [
                {
                    "command": "durableFunctionsMonitorTreeView.gotoInstanceId",
                    "when": "view == durableFunctionsMonitorTreeView && viewItem == taskHub-attached",
                    "group": "2_purge_history@3"
                },
                {
                    "command": "durableFunctionsMonitorTreeView.cleanEntityStorage",
                    "when": "view == durableFunctionsMonitorTreeView && viewItem == taskHub-attached",
                    "group": "2_purge_history@2"
                },
                {
                    "command": "durableFunctionsMonitorTreeView.purgeHistory",
                    "when": "view == durableFunctionsMonitorTreeView && viewItem == taskHub-attached",
                    "group": "2_purge_history@1"
                },
                {
                    "command": "durableFunctionsMonitorTreeView.startNewInstance",
                    "when": "view == durableFunctionsMonitorTreeView && viewItem == taskHub-attached",
                    "group": "2_purge_history@0"
                },
                {
                    "command": "durableFunctionsMonitorTreeView.deleteTaskHub",
                    "when": "view == durableFunctionsMonitorTreeView && viewItem == taskHub-attached",
                    "group": "3_delete_task_hub@1"
                },
                {
                    "command": "durableFunctionsMonitorTreeView.attachToTaskHub",
                    "when": "view == durableFunctionsMonitorTreeView && viewItem == taskHub-detached",
                    "group": "1_attach_detach@1"
                },
                {
                    "command": "durableFunctionsMonitorTreeView.detachFromTaskHub",
                    "when": "view == durableFunctionsMonitorTreeView && viewItem == storageAccount-attached"
                },
                {
                    "command": "durableFunctionsMonitorTreeView.openInstancesInStorageExplorer",
                    "when": "view == durableFunctionsMonitorTreeView && viewItem == taskHub-attached || viewItem == taskHub-detached",
                    "group": "4_storage_explorer@1"
                },
                {
                    "command": "durableFunctionsMonitorTreeView.openHistoryInStorageExplorer",
                    "when": "view == durableFunctionsMonitorTreeView && viewItem == taskHub-attached || viewItem == taskHub-detached",
                    "group": "4_storage_explorer@2"
                }
            ],

            "commandPalette": [
                {
                    "command": "durableFunctionsMonitorTreeView.openInstancesInStorageExplorer",
                    "when": "never"
                },
                {
                    "command": "durableFunctionsMonitorTreeView.openHistoryInStorageExplorer",
                    "when": "never"
                }
            ]
        },
        "configuration": {
            "title": "Durable Functions Monitor",
            "properties": {
                "durableFunctionsMonitor.backendBaseUrl": {
                    "type": "string",
                    "default": "http://localhost:{portNr}/a/p/i",
                    "description": "URL the backend(s) to be started on. You might want e.g. to change 'localhost' to '127.0.0.1', if you're observing firewall issues. Also it is possible to lock the port number here, if needed (by default it is automatically chosen from the range 37072-38000)."
                },
                "durableFunctionsMonitor.backendVersionToUse": {
                    "type": "string",
                    "enum": [
                        "Default",
                        ".Net Core 3.1",
                        ".Net Core 2.1"
                    ],
                    "default": "Default",
                    "description": "Choose which backend binaries to use when starting a backend. Currently 'Default' backend targets .Net Core 2.1, but you can try other ones, if 'Default' doesn't work for you."
                },
                "durableFunctionsMonitor.customPathToBackendBinaries": {
                    "type": "string",
                    "description": "Put local path to a custom backend implementation to use. Overrides 'Backend Version to Use' when set."
                },
                "durableFunctionsMonitor.backendTimeoutInSeconds": {
                    "type": "number",
                    "default": "60",
                    "description": "Number of seconds to wait for the backend to start."
                },
                "durableFunctionsMonitor.storageEmulatorConnectionString": {
                    "type": "string",
                    "default": "AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;DefaultEndpointsProtocol=http;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;TableEndpoint=http://127.0.0.1:10002/devstoreaccount1;",
                    "description": "Connection String to talk to local Storage Emulator. The AccountKey here is a well-known AccountKey. Customize endpoint URLs when needed."
                },
                "durableFunctionsMonitor.enableLogging": {
                    "type": "boolean",
                    "default": false,
                    "description": "Enable extensive logging and output logs into 'Durable Functions Monitor' output channel"
                },
                "durableFunctionsMonitor.showTimeAs": {
                    "type": "string",
                    "default": "UTC",
                    "enum": [
                        "UTC",
                        "Local"
                    ],
                    "description": "In which time zone time values should be displayed"
                },
                "durableFunctionsMonitor.showWhenDebugSessionStarts": {
                    "type": "boolean",
                    "default": false,
                    "description": "Show Durable Functions Monitor when you start debugging a Durable Functions project"
                }
            }
        }
    },
    "scripts": {
        "vscode:prepublish": "npm run compile",
        "compile": "tsc -p ./",
        "watch": "tsc -watch -p ./",
        "pretest": "npm run compile",
        "test": "node ./out/test/runTest.js",
        "package": "node ./node_modules/vsce/out/vsce package"
    },
    "devDependencies": {
        "@types/glob": "^7.1.1",
        "@types/mocha": "^5.2.6",
        "@types/node": "^10.12.21",
        "@types/vscode": "^1.39.0",
        "glob": "^7.1.4",
        "mocha": "^8.2.0",
        "tslint": "^5.12.1",
        "typescript": "^3.3.1",
        "vsce": "^1.88.0",
        "vscode-test": "^1.2.0"
    },
    "dependencies": {
        "@azure/arm-storage": "^15.1.0",
        "@types/crypto-js": "^3.1.47",
        "@types/rimraf": "^3.0.0",
        "rimraf": "^3.0.2",
        "axios": "^0.21.2",
        "crypto-js": "^4.0.0",
        "portscanner": "^2.2.0",
        "tree-kill": "^1.2.2"
    },
    "extensionDependencies": [
        "ms-vscode.azure-account"
    ]
}


================================================
FILE: durablefunctionsmonitor-vscodeext/src/BackendProcess.ts
================================================
const portscanner = require('portscanner');

import * as fs from 'fs';
import * as path from 'path';
import * as vscode from 'vscode';
import * as crypto from 'crypto';
import * as killProcessTree from 'tree-kill';
import axios from 'axios';
import { spawn, spawnSync, ChildProcess } from 'child_process';
import * as CryptoJS from 'crypto-js';

import { ConnStringUtils } from "./ConnStringUtils";

import * as SharedConstants from './SharedConstants';
import { Settings } from './Settings';

// Responsible for running the backend process
export class BackendProcess {

    constructor(private _binariesFolder: string,
        private _storageConnectionSettings: StorageConnectionSettings,
        private _removeMyselfFromList: () => void,
        private _log: (l: string) => void)
    { }
    
    // Underlying Storage Connection Strings
    get storageConnectionStrings(): string[] {
        return this._storageConnectionSettings.storageConnStrings;
    }

    // Information about the started backend (if it was successfully started)
    get backendUrl(): string {
        return this._backendUrl;
    }

    // Folder where backend is run from (might be different, if the backend needs to be published first)
    get binariesFolder(): string {
        return this._eventualBinariesFolder;
    }

    // Kills the pending backend process
    cleanup(): Promise<any> {

        this._backendPromise = null;
        this._backendUrl = '';

        if (!this._funcProcess) {
            return Promise.resolve();
        }

        console.log('Killing func process...');

        return new Promise((resolve) => {

            // The process is a shell. So to stop func.exe, we need to kill the entire process tree.
            killProcessTree(this._funcProcess!.pid, resolve);
            this._funcProcess = null;
        });
    }

    get backendCommunicationNonce(): string { return this._backendCommunicationNonce; }

    // Ensures that the backend is running (starts it, if needed) and returns its properties
    getBackend(): Promise<void> {

        if (!!this._backendPromise) {
            return this._backendPromise;
        }

        this._backendPromise = new Promise<void>((resolve, reject) => {

            vscode.window.withProgress({
                location: vscode.ProgressLocation.Notification,
                title: `Starting the backend `,
                cancellable: true
            }, (progress, token) => new Promise(stopProgress => {

                // Starting the backend on a first available port
                portscanner.findAPortNotInUse(37072, 38000).then((portNr: number) => {

                    const backendUrl = Settings().backendBaseUrl.replace('{portNr}', portNr.toString());
                    progress.report({ message: backendUrl });

                    // Now running func.exe in backend folder
                    this.startBackendOnPort(portNr, backendUrl, token)
                        .then(resolve, reject)
                        .finally(() => stopProgress(undefined));

                }, (err: any) => { stopProgress(undefined); reject(`Failed to choose port for backend: ${err.message}`); });
            }));
        });

        // Allowing the user to try again
        this._backendPromise.catch(() => {

            // This call is important, without it a typo in connString would persist until vsCode restart
            this._removeMyselfFromList();
        });

        return this._backendPromise;
    }
    
    // Reference to the shell instance running func.exe
    private _funcProcess: ChildProcess | null = null;

    // Promise that resolves when the backend is started successfully
    private _backendPromise: Promise<void> | null = null;

    // Information about the started backend (if it was successfully started)
    private _backendUrl: string = '';

    // Folder where backend is run from (might be different, if the backend needs to be published first)
    private _eventualBinariesFolder: string = this._binariesFolder;

    // A nonce for communicating with the backend
    private _backendCommunicationNonce = crypto.randomBytes(64).toString('base64');

    // Runs the backend Function instance on some port
    private startBackendOnPort(portNr: number, backendUrl: string, cancelToken: vscode.CancellationToken): Promise<void> {

        return new Promise<void>((resolve, reject) => {

            this._log(`Attempting to start the backend from ${this._binariesFolder} on ${backendUrl}...`);

            if (!fs.existsSync(this._binariesFolder)) {
                reject(`Couldn't find backend binaries in ${this._binariesFolder}`);
                return;
            }
    
            // If this is a source code project
            if (fs.readdirSync(this._binariesFolder).some(fn => fn.toLowerCase().endsWith('.csproj'))) {
    
                const publishFolder = path.join(this._binariesFolder, 'publish');
                
                // if it wasn't published yet
                if (!fs.existsSync(publishFolder)) {
    
                    // publishing it
                    const publishProcess = spawnSync('dotnet', ['publish', '-o', publishFolder],
                        { cwd: this._binariesFolder, encoding: 'utf8' }
                    );
    
                    if (!!publishProcess.stdout) {
                        this._log(publishProcess.stdout.toString());
                    }
    
                    if (publishProcess.status !== 0) {
    
                        const err = 'dotnet publish failed. ' +
                            (!!publishProcess.stderr ? publishProcess.stderr.toString() : `status: ${publishProcess.status}`);
    
                        this._log(`ERROR: ${err}`);
                        reject(err);
                        return;
                    }
                }
    
                this._eventualBinariesFolder = publishFolder;
            }

            // Important to inherit the context from VsCode, so that globally installed tools can be found
            const env = process.env;
    
            env[SharedConstants.NonceEnvironmentVariableName] = this._backendCommunicationNonce;

            // Also setting AzureWebJobsSecretStorageType to 'files', so that the backend doesn't need Azure Storage
            env['AzureWebJobsSecretStorageType'] = 'files';

            if (this._storageConnectionSettings.isMsSql) {

                env[SharedConstants.MsSqlConnStringEnvironmentVariableName] = this._storageConnectionSettings.storageConnStrings[0];

                // For MSSQL just need to set DFM_HUB_NAME to something, doesn't matter what it is so far
                env[SharedConstants.HubNameEnvironmentVariableName] = this._storageConnectionSettings.hubName;

            } else {

                // Need to unset this, in case it was set previously
                delete env[SharedConstants.HubNameEnvironmentVariableName];
                
                env['AzureWebJobsStorage'] = this._storageConnectionSettings.storageConnStrings[0];
            }
            
            this._funcProcess = spawn('func', ['start', '--port', portNr.toString(), '--csharp'], {
                cwd: this._eventualBinariesFolder,
                shell: true,
                env
            });
    
            this._funcProcess.stdout.on('data', (data) => {
                const msg = data.toString();
                this._log(msg);
    
                if (msg.toLowerCase().includes('no valid combination of account information found')) {
                    reject('The provided Storage Connection String and/or Hub Name seem to be invalid.');
                }
            });

            this._funcProcess!.stderr.on('data', (data) => {
                const msg = data.toString();
                this._log(`ERROR: ${msg}`);
                reject(`Func: ${msg}`);
            });

            console.log(`Waiting for ${backendUrl} to respond...`);

            // Waiting for the backend to be ready
            const timeoutInSeconds = Settings().backendTimeoutInSeconds;
            const intervalInMs = 500, numOfTries = timeoutInSeconds * 1000 / intervalInMs;
            var i = numOfTries;
            const intervalToken = setInterval(() => {

                const headers: any = {};
                headers[SharedConstants.NonceHeaderName] = this._backendCommunicationNonce;

                // Pinging the backend and returning its URL when ready
                axios.get(`${backendUrl}/--${this._storageConnectionSettings.hubName}/about`, { headers }).then(response => {
                    console.log(`The backend is now running on ${backendUrl}`);
                    clearInterval(intervalToken);

                    this._backendUrl = backendUrl;

                    resolve();
                }, err => {
                        
                    if (!!err.response && err.response.status === 401) {
                        // This typically happens when mistyping Task Hub name

                        clearInterval(intervalToken);
                        reject(err.message);
                    }
                });

                if (cancelToken.isCancellationRequested) {

                    clearInterval(intervalToken);
                    reject(`Cancelled by the user`);

                } else if (--i <= 0) {
                    console.log(`Timed out waiting for the backend!`);
                    clearInterval(intervalToken);
                    reject(`No response within ${timeoutInSeconds} seconds. Ensure you have the latest Azure Functions Core Tools installed globally.`);
                }

            }, intervalInMs);
        });
    }
}

export class StorageConnectionSettings {

    get storageConnStrings(): string[] { return this._connStrings; };
    get hubName(): string { return this._hubName; };
    get connStringHashKey(): string { return this._connStringHashKey; }
    get hashKey(): string { return this._hashKey; }
    get isFromLocalSettingsJson(): boolean { return this._fromLocalSettingsJson; }
    get isMsSql(): boolean { return !!ConnStringUtils.GetSqlServerName(this._connStrings[0]); }

    constructor(private _connStrings: string[],
        private _hubName: string,
        private _fromLocalSettingsJson: boolean = false) {

        this._connStringHashKey = StorageConnectionSettings.GetConnStringHashKey(this._connStrings);
        this._hashKey = this._connStringHashKey + this._hubName.toLowerCase();
    }

    static GetConnStringHashKey(connStrings: string[]): string {

        const sqlServerName = ConnStringUtils.GetSqlServerName(connStrings[0]);

        if (!!sqlServerName) {
            return sqlServerName + ConnStringUtils.GetSqlDatabaseName(connStrings[0]);
        }

        return ConnStringUtils.GetTableEndpoint(connStrings[0]).toLowerCase();
    }

    static MaskStorageConnString(connString: string): string {
        return connString.replace(/AccountKey=[^;]+/gi, 'AccountKey=*****');
    }

    private readonly _connStringHashKey: string;
    private readonly _hashKey: string;
}

// Creates the SharedKeyLite signature to query Table Storage REST API, also adds other needed headers
export function CreateAuthHeadersForTableStorage(accountName: string, accountKey: string, queryUrl: string): {} {

    const dateInUtc = new Date().toUTCString();
    const signature = CryptoJS.HmacSHA256(`${dateInUtc}\n/${accountName}/${queryUrl}`, CryptoJS.enc.Base64.parse(accountKey));

    return {
        'Authorization': `SharedKeyLite ${accountName}:${signature.toString(CryptoJS.enc.Base64)}`,
        'x-ms-date': dateInUtc,
        'x-ms-version': '2015-12-11',
        'Accept': 'application/json;odata=nometadata'
    };
}


================================================
FILE: durablefunctionsmonitor-vscodeext/src/ConnStringUtils.ts
================================================

import { Settings } from './Settings';

export class ConnStringUtils {
    
    // Extracts AccountName from Storage Connection String
    static GetAccountName(connString: string): string {
        const match = /AccountName=([^;]+)/i.exec(connString);
        return (!!match && match.length > 0) ? match[1] : '';
    }

    // Extracts AccountKey from Storage Connection String
    static GetAccountKey(connString: string): string {
        const match = /AccountKey=([^;]+)/i.exec(connString);
        return (!!match && match.length > 0) ? match[1] : '';
    }

    // Extracts DefaultEndpointsProtocol from Storage Connection String
    static GetDefaultEndpointsProtocol(connString: string): string {
        const match = /DefaultEndpointsProtocol=([^;]+)/i.exec(connString);
        return (!!match && match.length > 0) ? match[1] : 'https';
    }

    // Extracts TableEndpoint from Storage Connection String
    static GetTableEndpoint(connString: string): string {

        const accountName = ConnStringUtils.GetAccountName(connString);
        if (!accountName) {
            return '';
        }

        const endpointsProtocol = ConnStringUtils.GetDefaultEndpointsProtocol(connString);

        const suffixMatch = /EndpointSuffix=([^;]+)/i.exec(connString);
        if (!!suffixMatch && suffixMatch.length > 0) {

            return `${endpointsProtocol}://${accountName}.table.${suffixMatch[1]}/`;
        }

        const endpointMatch = /TableEndpoint=([^;]+)/i.exec(connString);
        return (!!endpointMatch && endpointMatch.length > 0) ? endpointMatch[1] : `${endpointsProtocol}://${accountName}.table.core.windows.net/`;
    }

    // Replaces 'UseDevelopmentStorage=true' with full Storage Emulator connection string
    static ExpandEmulatorShortcutIfNeeded(connString: string): string {

        if (connString.includes('UseDevelopmentStorage=true')) {
            return Settings().storageEmulatorConnectionString;
        }

        return connString;
    }

    // Extracts server name from MSSQL Connection String
    static GetSqlServerName(connString: string): string {
        const match = /(Data Source|Server)=([^;]+)/i.exec(connString);
        return (!!match && match.length > 1) ? match[2] : '';
    }
    
    // Extracts database name from MSSQL Connection String
    static GetSqlDatabaseName(connString: string): string {
        const match = /Initial Catalog=([^;]+)/i.exec(connString);
        return (!!match && match.length > 0) ? match[1] : '';
    }

    // Extracts human-readable storage name from a bunch of connection strings
    static GetStorageName(connStrings: string[]): string {

        const serverName = this.GetSqlServerName(connStrings[0]);

        if (!serverName) {
            return this.GetAccountName(connStrings[0]);
        }

        const dbName = this.GetSqlDatabaseName(connStrings[0]);

        return serverName + (!dbName ? '' : '/' + dbName);
    }
}

================================================
FILE: durablefunctionsmonitor-vscodeext/src/FunctionGraphList.ts
================================================
import * as vscode from 'vscode';
import * as fs from 'fs';
import * as path from 'path';
import * as rimraf from 'rimraf';

import { FunctionGraphView } from "./FunctionGraphView";
import { traverseFunctionProject } from './az-func-as-a-graph/traverseFunctionProject';
import { FunctionsMap, ProxiesMap } from './az-func-as-a-graph/FunctionsMap';

export type TraversalResult = {
    functions: FunctionsMap;
    proxies: ProxiesMap;
};

// Aggregates Function Graph views
export class FunctionGraphList {

    constructor(private _context: vscode.ExtensionContext, logChannel?: vscode.OutputChannel) {
        this._log = !logChannel ? (s: any) => { } : (s: any) => logChannel!.append(s);
    }

    traverseFunctions(projectPath: string): Promise<TraversalResult> {

        const isCurrentProject = projectPath === vscode.workspace.rootPath;

        if (isCurrentProject && !!this._traversalResult) {
            return Promise.resolve(this._traversalResult);
        }

        return traverseFunctionProject(projectPath, this._log).then(result => {

            this._tempFolders.push(...result.tempFolders);

            // Caching current project's functions
            if (isCurrentProject) {

                this._traversalResult = { functions: result.functions, proxies: result.proxies };

                // And cleanup the cache on any change to the file system
                if (!!this._watcher) {
                    this._watcher.dispose();
                }
                this._watcher = vscode.workspace.createFileSystemWatcher(new vscode.RelativePattern(projectPath, '**/*'));

                const cacheCleanupRoutine = () => {
                    
                    this._traversalResult = undefined;

                    if (!!this._watcher) {
                        this._watcher.dispose();
                        this._watcher = undefined;
                    }
                }

                this._watcher.onDidCreate(cacheCleanupRoutine);
                this._watcher.onDidDelete(cacheCleanupRoutine);
                this._watcher.onDidChange(cacheCleanupRoutine);
            }

            return { functions: result.functions, proxies: result.proxies };
        });
    }

    visualize(item?: vscode.Uri): void {

        // If host.json was clicked
        if (!!item && item.scheme === 'file' && item.fsPath.toLowerCase().endsWith('host.json')) {

            this.visualizeProjectPath(path.dirname(item.fsPath));
            return;
        }

        var defaultProjectPath = '';
        const ws = vscode.workspace;
        if (!!ws.rootPath && fs.existsSync(path.join(ws.rootPath, 'host.json'))) {
            defaultProjectPath = ws.rootPath;
        }

        vscode.window.showInputBox({ value: defaultProjectPath, prompt: 'Local path or link to GitHub repo' }).then(projectPath => {

            if (!!projectPath) {
                this.visualizeProjectPath(projectPath);
            }
        });
    }

    visualizeProjectPath(projectPath: string): void {

        this._views.push(new FunctionGraphView(this._context, projectPath, this));
    }

    // Closes all views
    cleanup(): void {

        if (!!this._watcher) {
            this._watcher.dispose();
            this._watcher = undefined;
        }

        for (const view of this._views) {
            view.cleanup();
        }

        for (var tempFolder of this._tempFolders) {

            this._log(`Removing ${tempFolder}`);
            try {
                rimraf.sync(tempFolder)
            } catch (err) {
                this._log(`Failed to remove ${tempFolder}: ${err.message}`);
            }
        }
    }

    private _views: FunctionGraphView[] = [];
    private _traversalResult?: TraversalResult;
    private _watcher?: vscode.FileSystemWatcher;
    private _tempFolders: string[] = [];
    private _log: (line: string) => void;
}

================================================
FILE: durablefunctionsmonitor-vscodeext/src/FunctionGraphView.ts
================================================
import * as vscode from 'vscode';
import * as fs from 'fs';
import * as path from 'path';

import { MonitorView } from './MonitorView';
import { FunctionGraphList, TraversalResult } from './FunctionGraphList';

// Represents the function graph view
export class FunctionGraphView
{
    constructor(private _context: vscode.ExtensionContext,
        private _functionProjectPath: string,
        private _functionGraphList: FunctionGraphList) {
        
        this._staticsFolder = path.join(this._context.extensionPath, 'backend', 'DfmStatics');

        this._webViewPanel = this.showWebView();
    }

    // Closes this web view
    cleanup(): void {

        if (!!this._webViewPanel) {
            this._webViewPanel.dispose();
        }
    }

    // Path to html statics
    private _staticsFolder: string;

    // Reference to the already opened WebView with the main page
    private _webViewPanel: vscode.WebviewPanel | null = null;    

    // Functions and proxies currently shown
    private _traversalResult?: TraversalResult;

    private static readonly ViewType = 'durableFunctionsMonitorFunctionGraph';

    // Opens a WebView with function graph page in it
    private showWebView(): vscode.WebviewPanel {

        const title = `Functions Graph (${this._functionProjectPath})`;

        const panel = vscode.window.createWebviewPanel(
            FunctionGraphView.ViewType,
            title,
            vscode.ViewColumn.One,
            {
                retainContextWhenHidden: true,
                enableScripts: true,
                localResourceRoots: [vscode.Uri.file(this._staticsFolder)]
            }
        );

        var html = fs.readFileSync(path.join(this._staticsFolder, 'index.html'), 'utf8');
        html = MonitorView.fixLinksToStatics(html, this._staticsFolder, panel.webview);

        html = this.embedTheme(html);
        html = this.embedParams(html, !!this._functionProjectPath);

        panel.webview.html = html;

        // handle events from WebView
        panel.webview.onDidReceiveMessage(request => {

            switch (request.method) {
                case 'SaveAs':

                    // Just to be extra sure...
                    if (!MonitorView.looksLikeSvg(request.data)) {
                        vscode.window.showErrorMessage(`Invalid data format. Save failed.`);
                        return;
                    }
                    
                    // Saving some file to local hard drive
                    vscode.window.showSaveDialog({ filters: { 'SVG Images': ['svg'] } }).then(filePath => {

                        if (!filePath || !filePath.fsPath) { 
                            return;
                        }

                        fs.writeFile(filePath!.fsPath, request.data, err => {
                            if (!err) {
                                vscode.window.showInformationMessage(`Saved to ${filePath!.fsPath}`);
                            } else {
                                vscode.window.showErrorMessage(`Failed to save. ${err}`);
                            }
                        });
                    });
                    return;
                
                case 'SaveFunctionGraphAsJson':

                    if (!this._traversalResult) {
                        return;
                    }
                    
                    // Saving some file to local hard drive
                    vscode.window.showSaveDialog({ defaultUri: vscode.Uri.file('dfm-func-map.json'), filters: { 'JSON': ['json'] } }).then(filePath => {

                        if (!filePath || !filePath.fsPath) { 
                            return;
                        }

                        fs.writeFile(filePath!.fsPath, JSON.stringify(this._traversalResult, null, 3), err => {
                            if (!err) {
                                vscode.window.showInformationMessage(`Saved to ${filePath!.fsPath}`);
                            } else {
                                vscode.window.showErrorMessage(`Failed to save. ${err}`);
                            }
                        });
                    });
                    return;
                
                case 'GotoFunctionCode':

                    if (!this._traversalResult) {
                        return;
                    }

                    const functionName = request.url;
                    var functionOrProxy: any = null;

                    if (functionName.startsWith('proxy.')) {
                
                        functionOrProxy = this._traversalResult.proxies[functionName.substr(6)];
        
                    } else {
        
                        functionOrProxy = this._traversalResult.functions[functionName];
                    }
        
                    vscode.window.showTextDocument(vscode.Uri.file(functionOrProxy.filePath)).then(ed => {

                        const pos = ed.document.positionAt(!!functionOrProxy.pos ? functionOrProxy.pos : 0);

                        ed.selection = new vscode.Selection(pos, pos);
                        ed.revealRange(new vscode.Range(pos, pos));
                    });

                    return;
            }

            // Intercepting request for Function Map
            if (request.method === "GET" && request.url === '/function-map') {

                if (!this._functionProjectPath) {
                    return;
                }

                const requestId = request.id;
                this._functionGraphList.traverseFunctions(this._functionProjectPath).then(result => {

                    this._traversalResult = result;

                    panel.webview.postMessage({
                        id: requestId, data: {
                            functions: result.functions,
                            proxies: result.proxies
                        }
                    });

                }, err => {
                    // err might fail to serialize here, so passing err.message only
                    panel.webview.postMessage({ id: requestId, err: { message: err.message } });
                });
            }

        }, undefined, this._context.subscriptions);

        return panel;
    }

    // Embeds the current color theme
    private embedTheme(html: string): string {

        if ([2, 3].includes((vscode.window as any).activeColorTheme.kind)) {
            return html.replace('<script>var DfmClientConfig={}</script>', '<script>var DfmClientConfig={\'theme\':\'dark\'}</script>');
        }
        return html;
    }

    // Embeds some other parameters in the HTML served
    private embedParams(html: string, isFunctionGraphAvailable: boolean): string {
        return html
            .replace(
                `<script>var IsFunctionGraphAvailable=0</script>`,
                `<script>var IsFunctionGraphAvailable=${!!isFunctionGraphAvailable ? 1 : 0}</script>`
            )
            .replace(
                `<script>var DfmViewMode=0</script>`,
                `<script>var DfmViewMode=1</script>`
            );
    }
}

================================================
FILE: durablefunctionsmonitor-vscodeext/src/MonitorTreeDataProvider.ts
================================================
import * as vscode from 'vscode';

import { MonitorView } from "./MonitorView";
import { MonitorViewList } from "./MonitorViewList";
import { StorageAccountTreeItem } from './StorageAccountTreeItem';
import { StorageAccountTreeItems } from './StorageAccountTreeItems';
import { TaskHubTreeItem } from './TaskHubTreeItem';
import { SubscriptionTreeItems } from './SubscriptionTreeItems';
import { SubscriptionTreeItem } from './SubscriptionTreeItem';
import { FunctionGraphList } from './FunctionGraphList';
import { Settings, UpdateSetting } from './Settings';
import { StorageConnectionSettings } from './BackendProcess';

// Root object in the hierarchy. Also serves data for the TreeView.
export class MonitorTreeDataProvider implements vscode.TreeDataProvider<vscode.TreeItem> { 

    constructor(private _context: vscode.ExtensionContext, functionGraphList: FunctionGraphList, logChannel?: vscode.OutputChannel) {

        this._monitorViews = new MonitorViewList(this._context,
            functionGraphList,
            () => this._onDidChangeTreeData.fire(),
            !logChannel ? () => { } : (l) => logChannel.append(l));

        const resourcesFolderPath = this._context.asAbsolutePath('resources');
        this._storageAccounts = new StorageAccountTreeItems(resourcesFolderPath, this._monitorViews);

        // Using Azure Account extension to connect to Azure, get subscriptions etc.
        const azureAccountExtension = vscode.extensions.getExtension('ms-vscode.azure-account');

        // Typings for azureAccount are here: https://github.com/microsoft/vscode-azure-account/blob/master/src/azure-account.api.d.ts
        const azureAccount = !!azureAccountExtension ? azureAccountExtension.exports : undefined;
        
        if (!!azureAccount && !!azureAccount.onFiltersChanged) {

            // When user changes their list of filtered subscriptions (or just relogins to Azure)...
            this._context.subscriptions.push(azureAccount.onFiltersChanged(() => this.refresh()));
        }

        this._subscriptions = new SubscriptionTreeItems(
            this._context,
            azureAccount,
            this._storageAccounts,
            () => this._onDidChangeTreeData.fire(),
            resourcesFolderPath,
            !logChannel ? () => { } : (l) => logChannel.appendLine(l)
        );

        // Also trying to parse current project's files and create a Task Hub node for them
        const connSettingsFromCurrentProject = this._monitorViews.getStorageConnectionSettingsFromCurrentProject();
        if (!!connSettingsFromCurrentProject) {
            this._storageAccounts.addNodeForConnectionSettings(connSettingsFromCurrentProject);
        }
    }

    // Does nothing, actually
    getTreeItem(element: vscode.TreeItem): vscode.TreeItem { return element; }

    // Returns the children of `element` or root if no element is passed.
    getChildren(element?: vscode.TreeItem): Promise<vscode.TreeItem[]> {

        if (!element) {
            return this._subscriptions.getNonEmptyNodes();
        }

        const subscriptionNode = element as SubscriptionTreeItem;
        if (subscriptionNode.isSubscriptionTreeItem) {

            const storageAccountNodes = subscriptionNode.storageAccountNodes;

            // Initially collapsing those storage nodes, that don't have attached TaskHubs at the moment
            for (const n of storageAccountNodes) {
                if (!n.isAttached) {
                    n.collapsibleState = vscode.TreeItemCollapsibleState.Collapsed;
                }
            }

            return Promise.resolve(storageAccountNodes);
        }

        // If this is a storage account tree item
        const item = element as StorageAccountTreeItem;
        if (this._storageAccounts.nodes.includes(item)) {
            return Promise.resolve(item.childItems);
        }

        return Promise.resolve([]);
    }

    // Handles 'Attach' context menu item or a click on a tree node
    attachToTaskHub(taskHubItem: TaskHubTreeItem | null, messageToWebView: any = undefined): void {

        if (!!this._inProgress) {
            console.log(`Another operation already in progress...`);
            return;
        }

        // This could happen, if the command is executed via Command Palette (and not via menu)
        if (!taskHubItem) {
            this.createOrActivateMonitorView(false, messageToWebView);
            return;
        }

        this._inProgress = true;
        const monitorView = this._monitorViews.getOrCreateFromStorageConnectionSettings(taskHubItem.storageConnectionSettings);

        monitorView.show(messageToWebView).then(() => {

            this._onDidChangeTreeData.fire();
            this._inProgress = false;

        }, (err: any) => {
            // .finally() doesn't work here - vscode.window.showErrorMessage() blocks it until user 
            // closes the error message. As a result, _inProgress remains true until then, which blocks all commands

            this._inProgress = false;
            vscode.window.showErrorMessage(!err.message ? err : err.message);
        });
    }

    // Triggers when F5 is being hit
    handleOnDebugSessionStarted() {

        if (!!this._monitorViews.isAnyMonitorViewVisible()) {
            return;
        }

        const DfmDoNotAskUponDebugSession = 'DfmDoNotAskUponDebugSession';
        const doNotAsk = this._context.globalState.get(DfmDoNotAskUponDebugSession, false);

        if (!Settings().showWhenDebugSessionStarts && !!doNotAsk) {
            return;
        }

        const defaultTaskHubName = 'TestHubName';
        const curConnSettings = this._monitorViews.getStorageConnectionSettingsFromCurrentProject(defaultTaskHubName);
        if (!curConnSettings) {
            return;
        }

        if (!Settings().showWhenDebugSessionStarts) {

            const prompt = `Do you want Durable Functions Monitor to be automatically shown when you start debugging a Durable Functions project? You can always change this preference via Settings.`;
            vscode.window.showWarningMessage(prompt, `Yes`, `No, and don't ask again`).then(answer => {
    
                if (answer === `No, and don't ask again`) {

                    UpdateSetting('showWhenDebugSessionStarts', false);
                    this._context.globalState.update(DfmDoNotAskUponDebugSession, true);

                } else if (answer === `Yes`) {
                    
                    UpdateSetting('showWhenDebugSessionStarts', true);

                    this.showUponDebugSession(
                        curConnSettings.hubName !== defaultTaskHubName ? curConnSettings : undefined
                    );
                }
            });

        } else {

            this.showUponDebugSession(
                curConnSettings.hubName !== defaultTaskHubName ? curConnSettings : undefined
            );
        }
    }

    // Handles 'Detach' context menu item
    detachFromTaskHub(storageAccountItem: StorageAccountTreeItem) {

        if (!storageAccountItem) {
            vscode.window.showInformationMessage('This command is only available via context menu');
            return;
        }

        if (!!this._inProgress) {
            console.log(`Another operation already in progress...`);
            return;
        }
        this._inProgress = true;

        this._monitorViews.detachBackend(storageAccountItem.storageConnStrings).then(() => {

            this._onDidChangeTreeData.fire();
            this._inProgress = false;

        }, err => {
            this._inProgress = false;
            vscode.window.showErrorMessage(`Failed to detach from Task Hub. ${err}`);
        });
    }

    // Handles 'Delete Task Hub' context menu item
    deleteTaskHub(taskHubItem: TaskHubTreeItem) {

        if (!taskHubItem) {
            vscode.window.showInformationMessage('This command is only available via context menu');
            return;
        }

        if (!!this._inProgress) {
            console.log(`Another operation already in progress...`);
            return;
        }

        const monitorView = this._monitorViews.getOrCreateFromStorageConnectionSettings(taskHubItem.storageConnectionSettings);
        if (!monitorView) {
            console.log(`Tried to delete a detached Task Hub`);
            return;
        }
        
        const prompt = `This will permanently delete all Azure Storage resources used by '${taskHubItem.label}' orchestration service. There should be no running Function instances for this Task Hub present. Are you sure you want to proceed?`;
        vscode.window.showWarningMessage(prompt, 'Yes', 'No').then(answer => {

            if (answer === 'Yes') {

                this._inProgress = true;
                monitorView.deleteTaskHub().then(() => { 

                    taskHubItem.removeFromTree();

                    this._onDidChangeTreeData.fire();
                    this._inProgress = false;

                }, (err) => { 
                    this._inProgress = false;
                    vscode.window.showErrorMessage(`Failed to delete Task Hub. ${err}`);
                });
            }
        });
    }

    // Handles 'Open in Storage Explorer' context menu item
    async openTableInStorageExplorer(taskHubItem: TaskHubTreeItem, table: 'Instances' | 'History') {

        // Using Azure Storage extension for this
        var storageExt = vscode.extensions.getExtension('ms-azuretools.vscode-azurestorage');
        if (!storageExt) {
            vscode.window.showErrorMessage(`For this to work, please, install [Azure Storage](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurestorage) extension.`);
            return;
        }

        try {

            if (!storageExt.isActive) {
                await storageExt.activate();
            }
            
            await vscode.commands.executeCommand('azureStorage.openTable', {

                root: {
                    storageAccountId: taskHubItem.storageAccountId,
                    subscriptionId: taskHubItem.subscriptionId
                },

                tableName: taskHubItem.hubName + table
            });

        } catch (err) {
            vscode.window.showErrorMessage(`Failed to execute command. ${err}`);
        }
    }

    // Handles 'Attach' button
    attachToAnotherTaskHub() {

        this.createOrActivateMonitorView(true);
    }

    // Handles 'Refresh' button
    refresh() {
        this._subscriptions.cleanup();
        this._onDidChangeTreeData.fire();
    }

    // Handles 'Detach from all Task Hubs' button
    detachFromAllTaskHubs() {

        if (!!this._inProgress) {
            console.log(`Another operation already in progress...`);
            return;
        }
        this._inProgress = true;

        this.cleanup().catch(err => {
            vscode.window.showErrorMessage(`Failed to detach from Task Hub. ${err}`);
        }).finally(() => {
            this._onDidChangeTreeData.fire();
            this._inProgress = false;
        });
    }
    
    // Handles 'Go to instanceId...' context menu item
    gotoInstanceId(taskHubItem: TaskHubTreeItem | null) {

        // Trying to get a running backend instance.
        // If the relevant MonitorView is currently not visible, don't want to show it - that's why all the custom logic here.
        var monitorView = !taskHubItem ?
            this._monitorViews.firstOrDefault() :
            this._monitorViews.getOrCreateFromStorageConnectionSettings(taskHubItem.storageConnectionSettings);

        if (!!monitorView) {

            monitorView.gotoInstanceId();

        } else {

            this.createOrActivateMonitorView(false).then(view => {
                if (!!view) {

                    // Not sure why this timeout here is needed, but without it the quickPick isn't shown
                    setTimeout(() => {
                        view.gotoInstanceId();
                    }, 1000);
                }
            });
        }
    }

    // Stops all backend processes and closes all views
    cleanup(): Promise<any> {
        return this._monitorViews.cleanup();
    }

    private _inProgress: boolean = false;

    private _monitorViews: MonitorViewList;
    private _storageAccounts: StorageAccountTreeItems;
    private _subscriptions: SubscriptionTreeItems;

    private _onDidChangeTreeData: vscode.EventEmitter<vscode.TreeItem | undefined> = new vscode.EventEmitter<StorageAccountTreeItem | undefined>();
    readonly onDidChangeTreeData: vscode.Event<vscode.TreeItem | undefined> = this._onDidChangeTreeData.event;

    // Shows or makes active the main view
    private createOrActivateMonitorView(alwaysCreateNew: boolean, messageToWebView: any = undefined): Promise<MonitorView | null> {

        if (!!this._inProgress) {
            console.log(`Another operation already in progress...`);
            return Promise.resolve(null);
        }

        return new Promise<MonitorView>((resolve, reject) => {

            this._monitorViews.getOrAdd(alwaysCreateNew).then(monitorView => {

                this._inProgress = true;

                monitorView.show(messageToWebView).then(() => {

                    this._storageAccounts.addNodeForMonitorView(monitorView);
                    this._onDidChangeTreeData.fire();
                    this._inProgress = false;

                    resolve(monitorView);

                }, (err) => {
                    // .finally() doesn't work here - vscode.window.showErrorMessage() blocks it until user 
                    // closes the error message. As a result, _inProgress remains true until then, which blocks all commands
                    this._inProgress = false;
                    vscode.window.showErrorMessage(!err.message ? err : err.message);
                });

            }, vscode.window.showErrorMessage);
        });
    }

    // Shows the main view upon a debug session
    private showUponDebugSession(connSettingsFromCurrentProject?: StorageConnectionSettings) {
        
        if (!!this._inProgress) {
            console.log(`Another operation already in progress...`);
            return;
        }

        this._monitorViews.showUponDebugSession(connSettingsFromCurrentProject).then(monitorView => {

            this._inProgress = true;

            monitorView.show().then(() => {

                this._storageAccounts.addNodeForMonitorView(monitorView);
                this._onDidChangeTreeData.fire();
                this._inProgress = false;
        
            }, (err) => {
                // .finally() doesn't work here - vscode.window.showErrorMessage() blocks it until user 
                // closes the error message. As a result, _inProgress remains true until then, which blocks all commands
                this._inProgress = false;
                vscode.window.showErrorMessage(!err.message ? err : err.message);
            });
        }, vscode.window.showErrorMessage);
    }
}

================================================
FILE: durablefunctionsmonitor-vscodeext/src/MonitorView.ts
================================================
import * as vscode from 'vscode';
import * as fs from 'fs';
import * as path from 'path';
import axios from 'axios';

import * as SharedConstants from './SharedConstants';

import { BackendProcess, StorageConnectionSettings } from './BackendProcess';
import { ConnStringUtils } from './ConnStringUtils';
import { Settings } from './Settings';
import { FunctionGraphList } from './FunctionGraphList';

// Represents the main view, along with all detailed views
export class MonitorView
{
    // Storage Connection settings (connString and hubName) of this Monitor View
    get storageConnectionSettings(): StorageConnectionSettings {
        return new StorageConnectionSettings(this._backend.storageConnectionStrings, this._hubName);
    }

    get isVisible(): boolean {
        return !!this._webViewPanel;
    }

    // Path to html statics
    get staticsFolder(): string {
        return path.join(this._backend.binariesFolder, 'DfmStatics');
    }

    constructor(private _context: vscode.ExtensionContext,
        private _backend: BackendProcess,
        private _hubName: string,
        private _functionGraphList: FunctionGraphList,
        private _onViewStatusChanged: () => void) {
        
        const ws = vscode.workspace;
        if (!!ws.rootPath && fs.existsSync(path.join(ws.rootPath, 'host.json'))) {
            this._functionProjectPath = ws.rootPath;
        }
    }

    // Closes all WebViews
    cleanup(): void {

        for (var childPanel of this._childWebViewPanels) {
            childPanel.dispose();
        }
        this._childWebViewPanels = [];

        if (!!this._webViewPanel) {
            this._webViewPanel.dispose();
        }
    }

    // Shows or makes active the main view
    show(messageToWebView: any = undefined): Promise<void> {

        if (!!this._webViewPanel) {
            // Didn't find a way to check whether the panel still exists. 
            // So just have to catch a "panel disposed" exception here.
            try {

                this._webViewPanel.reveal();
                if (!!messageToWebView) {
                    // BUG: WebView might actually appear in 3 states: disposed, visible and inactive.
                    // Didn't find the way to distinguish the last two. 
                    // But when it is inactive, it will be activated with above reveal() method,
                    // and then miss this message we're sending here. No good solution for this problem so far...
                    this._webViewPanel.webview.postMessage(messageToWebView);
                }

                return Promise.resolve();
            } catch (err) {
                this._webViewPanel = null;
            }
        }

        return new Promise<void>((resolve, reject) => {

            this._backend.getBackend().then(() => {

                try {
                    this._webViewPanel = this.showWebView('', messageToWebView);

                    this._webViewPanel.onDidDispose(() => {
                        this._webViewPanel = null;
                        this._onViewStatusChanged();
                    });

                    resolve();
                } catch (err) {
                    reject(`WebView failed: ${err}`);
                }
                
            }, reject);
        });
    }

    // Permanently deletes all underlying Storage resources for this Task Hub
    deleteTaskHub(): Promise<void> {

        if (!this._backend.backendUrl) {
            return Promise.reject('Backend is not started');
        }

        const headers: any = {};
        headers[SharedConstants.NonceHeaderName] = this._backend.backendCommunicationNonce;

        return new Promise<void>((resolve, reject) => {

            const url = `${this._backend.backendUrl}/--${this._hubName}/delete-task-hub`;
            axios.post(url, {}, { headers }).then(() => {
                this.cleanup();
                resolve();
            }, err => reject(err.message));
        });
    }

    // Handles 'Goto instanceId...' context menu item
    gotoInstanceId() {

        this.askForInstanceId().then(instanceId => {

            // Opening another WebView
            this._childWebViewPanels.push(this.showWebView(instanceId));
        });
    }

    // Converts script and CSS links
    static fixLinksToStatics(originalHtml: string, pathToBackend: string, webView: vscode.Webview): string {

        var resultHtml: string = originalHtml;

        const regex = / (href|src)="\/([0-9a-z.\/]+)"/ig;
        var match: RegExpExecArray | null;
        while (match = regex.exec(originalHtml)) {

            const relativePath = match[2];
            const localPath = path.join(pathToBackend, relativePath);
            const newPath = webView.asWebviewUri(vscode.Uri.file(localPath)).toString();

            resultHtml = resultHtml.replace(`/${relativePath}`, newPath);
        }

        return resultHtml;
    }

    // Validates incoming SVG, just to be extra sure...
    static looksLikeSvg(data: string): boolean {
        return data.startsWith('<svg') && data.endsWith('</svg>') && !data.includes('<script');
    }

    // Reference to the already opened WebView with the main page
    private _webViewPanel: vscode.WebviewPanel | null = null;    

    // Reference to all child WebViews
    private _childWebViewPanels: vscode.WebviewPanel[] = [];

    // Functions and proxies currently shown
    private _functionsAndProxies: { [name: string]: { filePath?: string, pos?: number } } = {};

    private _functionProjectPath: string = '';

    private static readonly ViewType = 'durableFunctionsMonitor';
    private static readonly GlobalStateName = MonitorView.ViewType + 'WebViewState';

    // Opens a WebView with main page or orchestration page in it
    private showWebView(orchestrationId: string = '', messageToWebView: any = undefined): vscode.WebviewPanel {

        const title = (!!orchestrationId) ?
            `Instance '${orchestrationId}'`
            :
            `Durable Functions Monitor (${this.taskHubFullTitle})`;

        const panel = vscode.window.createWebviewPanel(
            MonitorView.ViewType,
            title,
            vscode.ViewColumn.One,
            {
                retainContextWhenHidden: true,
                enableScripts: true,
                localResourceRoots: [vscode.Uri.file(this.staticsFolder)]
            }
        );

        var html = fs.readFileSync(path.join(this.staticsFolder, 'index.html'), 'utf8');
        html = MonitorView.fixLinksToStatics(html, this.staticsFolder, panel.webview);

        // Also passing persisted settings via HTML
        const webViewState = this._context.globalState.get(MonitorView.GlobalStateName, {});

        html = this.embedOrchestrationIdAndState(html, orchestrationId, webViewState);
        html = this.embedIsFunctionGraphAvailable(html, !!this._functionProjectPath);
        html = this.embedThemeAndSettings(html);

        panel.webview.html = html;

        // handle events from WebView
        panel.webview.onDidReceiveMessage(request => {

            switch (request.method) {
                case 'IAmReady':
                    // Sending an initial message (if any), when the webView is ready
                    if (!!messageToWebView) {
                        panel.webview.postMessage(messageToWebView);
                        messageToWebView = undefined;
                    }
                    return;
                case 'PersistState':
                    // Persisting state values
                    const webViewState = this._context.globalState.get(MonitorView.GlobalStateName, {}) as any;
                    webViewState[request.key] = request.data;
                    this._context.globalState.update(MonitorView.GlobalStateName, webViewState);
                    return;
                case 'OpenInNewWindow':
                    // Opening another WebView
                    this._childWebViewPanels.push(this.showWebView(request.url));
                    return;
                case 'SaveAs':

                    // Just to be extra sure...
                    if (!MonitorView.looksLikeSvg(request.data)) {
                        vscode.window.showErrorMessage(`Invalid data format. Save failed.`);
                        return;
                    }
                    
                    // Saving some file to local hard drive
                    vscode.window.showSaveDialog({ filters: { 'SVG Images': ['svg'] } }).then(filePath => {

                        if (!filePath || !filePath.fsPath) { 
                            return;
                        }

                        fs.writeFile(filePath!.fsPath, request.data, err => {
                            if (!err) {
                                vscode.window.showInformationMessage(`Saved to ${filePath!.fsPath}`);
                            } else {
                                vscode.window.showErrorMessage(`Failed to save. ${err}`);
                            }
                        });
                    });
                    return;
                case 'GotoFunctionCode':

                    const func = this._functionsAndProxies[request.url];
                    if (!!func && !!func.filePath) {

                        vscode.window.showTextDocument(vscode.Uri.file(func.filePath)).then(ed => {

                            const pos = ed.document.positionAt(!!func.pos ? func.pos : 0);

                            ed.selection = new vscode.Selection(pos, pos);
                            ed.revealRange(new vscode.Range(pos, pos));
                        });
                    }

                    return;
                case 'VisualizeFunctionsAsAGraph':

                    const ws = vscode.workspace;
                    if (!!ws.rootPath && fs.existsSync(path.join(ws.rootPath, 'host.json'))) {
                        this._functionGraphList.visualizeProjectPath(ws.rootPath);
                    }

                    return;
            }

            // Intercepting request for Function Map
            if (request.method === "GET" && request.url === '/function-map') {
                
                if (!this._functionProjectPath) {
                    return;
                }

                const requestId = request.id;
                this._functionGraphList.traverseFunctions(this._functionProjectPath).then(result => {

                    this._functionsAndProxies = {};
                    for (const name in result.functions) {
                        this._functionsAndProxies[name] = result.functions[name];
                    }
                    for (const name in result.proxies) {
                        this._functionsAndProxies['proxy.' + name] = result.proxies[name];
                    }

                    panel.webview.postMessage({
                        id: requestId, data: { 
                            functions: result.functions,
                            proxies: result.proxies
                        }
                    });

                }, err => {
                    // err might fail to serialize here, so passing err.message only
                    panel.webview.postMessage({ id: requestId, err: { message: err.message } });
                });

                return;
            }

            // Then it's just a propagated HTTP request
            const requestId = request.id;

            const headers: any = {};
            headers[SharedConstants.NonceHeaderName] = this._backend.backendCommunicationNonce;

            // Workaround for https://github.com/Azure/azure-functions-durable-extension/issues/1926
            var hubName = this._hubName;
            if (hubName === 'TestHubName' && request.method === 'POST' && request.url.match(/\/(orchestrations|restart)$/i)) {
                // Turning task hub name into lower case, this allows to bypass function name validation
                hubName = 'testhubname';
            }

            axios.request({
                url: `${this._backend.backendUrl}/--${hubName}${request.url}`,
                method: request.method,
                data: request.data,
                headers
            }).then(response => {

                panel.webview.postMessage({ id: requestId, data: response.data });
            }, err => {

                panel.webview.postMessage({ id: requestId, err: { message: err.message, response: { data: !err.response ? undefined : err.response.data } } });
            });

        }, undefined, this._context.subscriptions);

        return panel;
    }

    // Embeds the current color theme
    private embedThemeAndSettings(html: string): string {

        const theme = [2, 3].includes((vscode.window as any).activeColorTheme.kind) ? 'dark' : 'light';

        return html.replace('<script>var DfmClientConfig={}</script>',
            `<script>var DfmClientConfig={'theme':'${theme}','showTimeAs':'${Settings().showTimeAs}'}</script>`);
    }

    // Embeds the orchestrationId in the HTML served
    private embedOrchestrationIdAndState(html: string, orchestrationId: string, state: any): string {
        return html.replace(
            `<script>var OrchestrationIdFromVsCode="",StateFromVsCode={}</script>`,
            `<script>var OrchestrationIdFromVsCode="${orchestrationId}",StateFromVsCode=${JSON.stringify(state)}</script>`
        );
    }

    // Embeds the isFunctionGraphAvailable flag in the HTML served
    private embedIsFunctionGraphAvailable(html: string, isFunctionGraphAvailable: boolean): string {

        if (!isFunctionGraphAvailable) {
            return html;
        }

        return html.replace(
            `<script>var IsFunctionGraphAvailable=0</script>`,
            `<script>var IsFunctionGraphAvailable=1</script>`
        );
    }

    private askForInstanceId(): Promise<string> {
        return new Promise<string>((resolve, reject) => {

            var instanceId = '';
            const instanceIdPick = vscode.window.createQuickPick();

            instanceIdPick.onDidHide(() => instanceIdPick.dispose());

            instanceIdPick.onDidChangeSelection(items => {
                if (!!items && !!items.length) {
                    instanceId = items[0].label;
                }
            });

            // Still allowing to type free text
            instanceIdPick.onDidChangeValue(value => {
                instanceId = value;

                // Loading suggestions from backend
                if (instanceId.length > 1) {
                    this.getInstanceIdSuggestions(instanceId).then(suggestions => {

                        instanceIdPick.items = suggestions.map(id => {
                            return { label: id };
                        });
                    });
                } else {
                    instanceIdPick.items = [];
                }
            });

            instanceIdPick.onDidAccept(() => {
                if (!!instanceId) {
                    resolve(instanceId);
                }
                instanceIdPick.hide();
            });

            instanceIdPick.title = `(${this.taskHubFullTitle}) instanceId to go to:`;

            instanceIdPick.show();
            // If nothing is selected, leaving the promise unresolved, so nothing more happens
        });
    }

    // Human-readable TaskHub title in form '[storage-account]/[task-hub]'
    private get taskHubFullTitle(): string {

        return `${ConnStringUtils.GetStorageName(this._backend.storageConnectionStrings)}/${this._hubName}`;
    }

    // Returns orchestration/entity instanceIds that start with prefix
    private getInstanceIdSuggestions(prefix: string): Promise<string[]> {

        const headers: any = {};
        headers[SharedConstants.NonceHeaderName] = this._backend.backendCommunicationNonce;

        return axios.get(`${this._backend.backendUrl}/--${this._hubName}/id-suggestions(prefix='${prefix}')`, { headers })
            .then(response => {
                return response.data as string[];
            });
    }
}

================================================
FILE: durablefunctionsmonitor-vscodeext/src/MonitorViewList.ts
================================================
import * as vscode from 'vscode';
import * as fs from 'fs';
import * as path from 'path';
import axios from 'axios';

import { ConnStringUtils } from "./ConnStringUtils";

import { MonitorView } from "./MonitorView";
import { BackendProcess, StorageConnectionSettings, CreateAuthHeadersForTableStorage } from './BackendProcess';
import { Settings } from './Settings';
import { FunctionGraphList } from './FunctionGraphList';

// Represents all MonitorViews created so far
export class MonitorViewList {

    constructor(private _context: vscode.ExtensionContext,
        private _functionGraphList: FunctionGraphList,
        private _onViewStatusChanged: () => void,
        private _log: (line: string) => void) {
    }

    isAnyMonitorViewVisible(): boolean {
        return Object.keys(this._monitorViews).some(k => !!this._monitorViews[k] && this._monitorViews[k].isVisible);
    }

    isMonitorViewVisible(connSettings: StorageConnectionSettings): boolean {
        const monitorView = this._monitorViews[connSettings.hashKey];
        return !!monitorView && monitorView.isVisible;
    }

    // Creates a new MonitorView with provided connection settings
    getOrCreateFromStorageConnectionSettings(connSettings: StorageConnectionSettings): MonitorView {

        var monitorView = this._monitorViews[connSettings.hashKey];
        if (!!monitorView) {
            return monitorView;
        }

        monitorView = new MonitorView(this._context,
            this.getOrAddBackend(connSettings),
            connSettings.hubName,
            this._functionGraphList,
            this._onViewStatusChanged);
        
        this._monitorViews[connSettings.hashKey] = monitorView;
        return monitorView;
    }

    // Gets an existing (first in the list) MonitorView,
    // or initializes a new one by asking user for connection settings
    getOrAdd(alwaysCreateNew: boolean): Promise<MonitorView> {

        const keys = Object.keys(this._monitorViews);
        if (!alwaysCreateNew && keys.length > 0) {
            return Promise.resolve(this._monitorViews[keys[0]]);
        }

        return new Promise<MonitorView>((resolve, reject) => {
            this.askForStorageConnectionSettings().then(connSettings => {

                const monitorView = this.getOrCreateFromStorageConnectionSettings(connSettings);
                resolve(monitorView);
            }, reject);
        });
    }

    firstOrDefault(): MonitorView | null {

        const keys = Object.keys(this._monitorViews);
        if (keys.length <= 0) {
            return null;
        }

        return this._monitorViews[keys[0]];
    }

    // Parses local project files and tries to infer connction settings from them
    getStorageConnectionSettingsFromCurrentProject(defaultTaskHubName?: string): StorageConnectionSettings | null {

        const hostJson = this.readHostJson();

        if (hostJson.storageProviderType === 'mssql') {
            
            const sqlConnectionString = this.getValueFromLocalSettings(hostJson.connectionStringName);
            if (!sqlConnectionString) {
                return null;
            }

            return new StorageConnectionSettings(
                [sqlConnectionString],
                'DurableFunctionsHub',
                true);
        }

        var hubName: string | undefined = hostJson.hubName;
        if (!hubName) {

            hubName = defaultTaskHubName;
            if (!hubName) {
                return null;
            }
        }

        const storageConnString = this.getValueFromLocalSettings('AzureWebJobsStorage');
        if (!storageConnString) {
            return null;
        }

        return new StorageConnectionSettings([ConnStringUtils.ExpandEmulatorShortcutIfNeeded(storageConnString)], hubName, true);
    }

    // Stops all backend processes and closes all views
    cleanup(): Promise<any> {

        Object.keys(this._monitorViews).map(k => this._monitorViews[k].cleanup());
        this._monitorViews = {};

        const backends = this._backends;
        this._backends = {};
        return Promise.all(Object.keys(backends).map(k => backends[k].cleanup()));
    }

    detachBackend(storageConnStrings: string[]): Promise<any> {

        const connStringHashKey = StorageConnectionSettings.GetConnStringHashKey(storageConnStrings);

        // Closing all views related to this connection
        for (const key of Object.keys(this._monitorViews)) {
            const monitorView = this._monitorViews[key];

            if (monitorView.storageConnectionSettings.connStringHashKey === connStringHashKey) {

                monitorView.cleanup();
                delete this._monitorViews[key];
            }
        }

        // Stopping background process
        const backendProcess = this._backends[connStringHashKey];
        if (!backendProcess) {
            return Promise.resolve();
        }

        return backendProcess.cleanup().then(() => {
            delete this._backends[connStringHashKey];
        });
    }

    getBackendUrl(storageConnStrings: string[]): string {

        const backendProcess = this._backends[StorageConnectionSettings.GetConnStringHashKey(storageConnStrings)];
        return !backendProcess ? '' : backendProcess.backendUrl; 
    }

    showUponDebugSession(connSettingsFromCurrentProject?: StorageConnectionSettings): Promise<MonitorView> {

        if (!connSettingsFromCurrentProject) {
            return this.getOrAdd(true);
        }

        return Promise.resolve(this.getOrCreateFromStorageConnectionSettings(connSettingsFromCurrentProject));
    }

    private _monitorViews: { [key: string]: MonitorView } = {};
    private _backends: { [key: string]: BackendProcess } = {};

    private getOrAddBackend(connSettings: StorageConnectionSettings): BackendProcess {

        // If a backend for this connection already exists, then just returning the existing one.
        var backendProcess = this._backends[connSettings.connStringHashKey];

        if (!backendProcess) {

            var binariesFolder = Settings().customPathToBackendBinaries;
            if (!binariesFolder) {
                
                if (connSettings.isMsSql) {
                    binariesFolder = path.join(this._context.extensionPath, 'custom-backends', 'mssql');
                } else if (Settings().backendVersionToUse === '.Net Core 2.1') {
                    binariesFolder = path.join(this._context.extensionPath, 'custom-backends', 'netcore21');
                } else if (Settings().backendVersionToUse === '.Net Core 3.1') {
                    binariesFolder = path.join(this._context.extensionPath, 'custom-backends', 'netcore31');
                } else {
                    binariesFolder = path.join(this._context.extensionPath, 'backend');
                }
            }

            backendProcess = new BackendProcess(
                binariesFolder,
                connSettings,
                () => this.detachBackend(connSettings.storageConnStrings),
                this._log
            );

            this._backends[connSettings.connStringHashKey] = backendProcess;
        }

        return backendProcess;
    }

    // Obtains Storage Connection String and Hub Name from user
    private askForStorageConnectionSettings(): Promise<StorageConnectionSettings> {

        return new Promise<StorageConnectionSettings>((resolve, reject) => {

            // Asking the user for Connection String
            var connStringToShow = '';
            const connStringFromLocalSettings = this.getValueFromLocalSettings('AzureWebJobsStorage');

            if (!!connStringFromLocalSettings) {
                connStringToShow = StorageConnectionSettings.MaskStorageConnString(connStringFromLocalSettings);
            }

            vscode.window.showInputBox({ value: connStringToShow, prompt: 'Storage or MSSQL Connection String' }).then(connString => {

                if (!connString) {
                    // Leaving the promise unresolved, so nothing more happens
                    return;
                }

                // If the user didn't change it
                if (connString === connStringToShow) {
                    // Then setting it back to non-masked one
                    connString = connStringFromLocalSettings;
                }

                // If it is MSSQL storage provider
                if (!!ConnStringUtils.GetSqlServerName(connString)) {
                    
                    resolve(new StorageConnectionSettings([connString!], 'DurableFunctionsHub'));
                    return;
                }

                // Dealing with 'UseDevelopmentStorage=true' early
                connString = ConnStringUtils.ExpandEmulatorShortcutIfNeeded(connString);

                // Asking the user for Hub Name
                var hubName = '';
                const hubPick = vscode.window.createQuickPick();

                hubPick.onDidHide(() => hubPick.dispose());

                hubPick.onDidChangeSelection(items => {
                    if (!!items && !!items.length) {
                        hubName = items[0].label;
                    }
                });

                // Still allowing to type free text
                hubPick.onDidChangeValue(value => {
                    hubName = value;
                });

                hubPick.onDidAccept(() => {
                    if (!!hubName) {
                        resolve(new StorageConnectionSettings([connString!], hubName));
                    }
                    hubPick.hide();
                });
                
                hubPick.title = 'Hub Name';

                var hubNameFromHostJson = this.readHostJson().hubName;
                if (!!hubNameFromHostJson) {

                    hubPick.items = [{
                        label: hubNameFromHostJson,
                        description: '(from host.json)'
                    }];
                    hubPick.placeholder = hubNameFromHostJson;

                } else {

                    hubPick.items = [{
                        label: 'DurableFunctionsHub',
                        description: '(default hub name)'
                    }];

                    hubPick.placeholder = 'DurableFunctionsHub';
                }

                // Loading other hub names directly from Table Storage
                this.loadHubNamesFromTableStorage(connString).then(hubNames => {

                    if (hubNames.length >= 0) {

                        // Adding loaded names to the list
                        hubPick.items = hubNames.map(label => {
                            return { label: label, description: '(from Table Storage)' };
                        });

                        hubPick.placeholder = hubNames[0];
                    }
                });

                hubPick.show();
                // If nothing is selected, leaving the promise unresolved, so nothing more happens

            }, reject);
        });
    }

    private loadHubNamesFromTableStorage(storageConnString: string): Promise<string[]> {
        return new Promise<string[]>((resolve) => {

            const accountName = ConnStringUtils.GetAccountName(storageConnString);
            const accountKey = ConnStringUtils.GetAccountKey(storageConnString);
            const tableEndpoint = ConnStringUtils.GetTableEndpoint(storageConnString);

            if (!accountName || !accountKey) {
                // Leaving the promise unresolved
                return;
            }

            getTaskHubNamesFromTableStorage(accountName, accountKey, tableEndpoint).then(hubNames => {

                if (!hubNames || hubNames.length <= 0) {
                    // Leaving the promise unresolved
                    return;
                }
                resolve(hubNames);

            }, err => {
                console.log(`Failed to load the list of tables. ${err.message}`);
                // Leaving the promise unresolved
            });
        });
    }

    private getValueFromLocalSettings(valueName: string): string {

        const ws = vscode.workspace;
        if (!!ws.rootPath && fs.existsSync(path.join(ws.rootPath, 'local.settings.json'))) {

            const localSettings = JSON.parse(fs.readFileSync(path.join(ws.rootPath, 'local.settings.json'), 'utf8'));

            if (!!localSettings.Values && !!localSettings.Values[valueName]) {
                return localSettings.Values[valueName];
            }
        }
        return '';
    }

    private readHostJson(): { hubName: string, storageProviderType: 'default' | 'mssql', connectionStringName: string } {

        const result = { hubName: '', storageProviderType: 'default' as any, connectionStringName: '' };

        const ws = vscode.workspace;
        if (!!ws.rootPath && fs.existsSync(path.join(ws.rootPath, 'host.json'))) {

            var hostJson;
            try {
                hostJson = JSON.parse(fs.readFileSync(path.join(ws.rootPath, 'host.json'), 'utf8'));
            } catch (err) {

                console.log(`Failed to parse host.json. ${(err as any).message}`);
                return result;
            }

            if (!!hostJson && !!hostJson.extensions && hostJson.extensions.durableTask) {

                const durableTask = hostJson.extensions.durableTask;
                if (!!durableTask.HubName || !!durableTask.hubName) {
                    result.hubName = !!durableTask.HubName ? durableTask.HubName : durableTask.hubName
                }

                if (!!durableTask.storageProvider && durableTask.storageProvider.type === 'mssql') {
                    result.storageProviderType = 'mssql';
                    result.connectionStringName = durableTask.storageProvider.connectionStringName;
                }
            }
        }
        return result;
    }
}

// Tries to load the list of TaskHub names from a storage account.
// Had to handcraft this code, since @azure/data-tables package is still in beta :(
export async function getTaskHubNamesFromTableStorage(accountName: string, accountKey: string, tableEndpointUrl: string): Promise<string[] | null> {

    if (!tableEndpointUrl) {
        tableEndpointUrl = `https://${accountName}.table.core.windows.net/`;
    } else if (!tableEndpointUrl.endsWith('/')) {
        tableEndpointUrl += '/';
    }

    // Local emulator URLs contain account name _after_ host (like http://127.0.0.1:10002/devstoreaccount1/ ),
    // and this part should be included when obtaining SAS
    const tableEndpointUrlParts = tableEndpointUrl.split('/');
    const tableQueryUrl = (tableEndpointUrlParts.length > 3 && !!tableEndpointUrlParts[3]) ?
        `${tableEndpointUrlParts[3]}/Tables` :
        'Tables';

    // Creating the SharedKeyLite signature to query Table Storage REST API for the list of tables
    const authHeaders = CreateAuthHeadersForTableStorage(accountName, accountKey, tableQueryUrl);

    var response: any;
    try {
        response = await axios.get(`${tableEndpointUrl}Tables`, { headers: authHeaders });
    } catch (err) {
        console.log(`Failed to load hub names from table storage. ${(err as any).message}`);
    }

    if (!response || !response.data || !response.data.value || response.data.value.length <= 0) {
        return null;
    }

    const instancesTables: string[] = response.data.value.map((table: any) => table.TableName)
        .filter((tableName: string) => tableName.endsWith('Instances'))
        .map((tableName: string) => tableName.substr(0, tableName.length - 'Instances'.length));

    const historyTables: string[] = response.data.value.map((table: any) => table.TableName)
        .filter((tableName: string) => tableName.endsWith('History'))
        .map((tableName: string) => tableName.substr(0, tableName.length - 'History'.length));

    // Considering it to be a hub, if it has both *Instances and *History tables
    return instancesTables.filter(name => historyTables.indexOf(name) >= 0);
}

================================================
FILE: durablefunctionsmonitor-vscodeext/src/Settings.ts
================================================
import * as vscode from 'vscode';

// Returns config values stored in VsCode's settings.json
export function Settings(): ISettings {

    const config = vscode.workspace.getConfiguration('durableFunctionsMonitor');

    // Better to have default values hardcoded here (not only in package.json) as well
    return {
        backendBaseUrl: config.get<string>('backendBaseUrl', 'http://localhost:{portNr}/a/p/i'),
        backendVersionToUse: config.get<'Default' | '.Net Core 3.1'>('backendVersionToUse', 'Default'),
        customPathToBackendBinaries: config.get<string>('customPathToBackendBinaries', ''),
        backendTimeoutInSeconds: config.get<number>('backendTimeoutInSeconds', 60),
        storageEmulatorConnectionString: config.get<string>('storageEmulatorConnectionString', 'AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;DefaultEndpointsProtocol=http;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;TableEndpoint=http://127.0.0.1:10002/devstoreaccount1;'),
        enableLogging: config.get<boolean>('enableLogging', false),
        showTimeAs: config.get<'UTC' | 'Local'>('showTimeAs', 'UTC'),
        showWhenDebugSessionStarts: config.get<boolean>('showWhenDebugSessionStarts', false),
    };
}

// Updates a config value stored in VsCode's settings.json
export function UpdateSetting(name: string, val: any) {

    const config = vscode.workspace.getConfiguration('durableFunctionsMonitor');
    config.update(name, val, true);
}

interface ISettings
{
    backendBaseUrl: string;
    backendVersionToUse: 'Default' | '.Net Core 3.1' | '.Net Core 2.1';
    customPathToBackendBinaries: string;
    backendTimeoutInSeconds: number;
    storageEmulatorConnectionString: string;
    enableLogging: boolean;
    showTimeAs: 'UTC' | 'Local';
    showWhenDebugSessionStarts: boolean;
}

================================================
FILE: durablefunctionsmonitor-vscodeext/src/SharedConstants.ts
================================================
export const NonceEnvironmentVariableName = 'DFM_NONCE';
export const NonceHeaderName = 'x-dfm-nonce';
export const MsSqlConnStringEnvironmentVariableName = 'DFM_SQL_CONNECTION_STRING';
export const HubNameEnvironmentVariableName = 'DFM_HUB_NAME';

================================================
FILE: durablefunctionsmonitor-vscodeext/src/StorageAccountTreeItem.ts
================================================
import * as vscode from 'vscode';
import * as path from 'path';

import { StorageConnectionSettings } from './BackendProcess';
import { ConnStringUtils } from "./ConnStringUtils";
import { TaskHubTreeItem } from "./TaskHubTreeItem";
import { MonitorViewList } from "./MonitorViewList";

// Represents the Storage Account item in the TreeView
export class StorageAccountTreeItem extends vscode.TreeItem {

    constructor(private _connStrings: string[],
        private _resourcesFolderPath: string,
        private _monitorViewList: MonitorViewList,
        private _fromLocalSettingsJson: boolean = false) {
      
        super(ConnStringUtils.GetStorageName(_connStrings), vscode.TreeItemCollapsibleState.Expanded);

        this.isMsSqlStorage = !!ConnStringUtils.GetSqlServerName(this._connStrings[0]);
    }

    readonly isMsSqlStorage: boolean;
    isV2StorageAccount: boolean = false;
    storageAccountId: string = '';

    get isAttached(): boolean {
        return !!this.backendUrl;
    }

    get backendUrl(): string {
        return this._monitorViewList.getBackendUrl(this._connStrings);
    }

    get storageName(): string {
        return this.label!;
    }

    get storageConnStrings(): string[] {
        return this._connStrings;
    }

    get childItems(): TaskHubTreeItem[] {
        return this._taskHubItems;
    }

    get tooltip(): string {

        if (this._fromLocalSettingsJson) {
            return `from local.settings.json`;
        }

        if (!!this.isMsSqlStorage) {
            return 'MSSQL Storage Provider';
        }

        return StorageConnectionSettings.MaskStorageConnString(this._connStrings[0]);
    }

    // Something to show to the right of this item
    get description(): string {
        return `${this._taskHubItems.length} Task Hubs`;
    }

    // Item's icon
    get iconPath(): string {
        if (!!this.isMsSqlStorage) {
            return path.join(this._resourcesFolderPath, this.isAttached ? 'mssqlAttached.svg' : 'mssql.svg');
        }
        if (this.isV2StorageAccount) {
            return path.join(this._resourcesFolderPath, this.isAttached ? 'storageAccountV2Attached.svg' : 'storageAccountV2.svg');
        }
        return path.join(this._resourcesFolderPath, this.isAttached ? 'storageAccountAttached.svg' : 'storageAccount.svg');
    }

    // For binding context menu to this tree node
    get contextValue(): string {
        return this.isAttached ? 'storageAccount-attached' : 'storageAccount-detached';
    }

    // For sorting
    static compare(first: StorageAccountTreeItem, second: StorageAccountTreeItem): number {
        const a = first.storageName.toLowerCase();
        const b = second.storageName.toLowerCase();
        return a === b ? 0 : (a < b ? -1 : 1);
    }

    // Creates or returns existing TaskHubTreeItem by hub name
    getOrAdd(hubName: string): TaskHubTreeItem {

        var hubItem = this._taskHubItems.find(taskHub => taskHub.hubName.toLowerCase() === hubName.toLowerCase());
        if (!hubItem) {
            hubItem = new TaskHubTreeItem(this, hubName, this._resourcesFolderPath);
            this._taskHubItems.push(hubItem);
            this._taskHubItems.sort(TaskHubTreeItem.compare);
        }

        return hubItem;
    }

    isTaskHubVisible(hubName: string): boolean {
        return this._monitorViewList.isMonitorViewVisible(new StorageConnectionSettings(this._connStrings, hubName));
    }
    
    private _taskHubItems: TaskHubTreeItem[] = [];
}

================================================
FILE: durablefunctionsmonitor-vscodeext/src/StorageAccountTreeItems.ts
================================================
import { MonitorView } from "./MonitorView";
import { MonitorViewList } from "./MonitorViewList";
import { StorageAccountTreeItem } from "./StorageAccountTreeItem";
import { StorageConnectionSettings } from "./BackendProcess";
import { ConnStringUtils } from "./ConnStringUtils";
import { TaskHubTreeItem } from "./TaskHubTreeItem";

// Represents the list of Storage Account items in the TreeView
export class StorageAccountTreeItems {

    constructor(private _resourcesFolderPath: string, private _monitorViewList: MonitorViewList) {}

    get nodes(): StorageAccountTreeItem[] {
        return this._storageAccountItems;
    }

    get taskHubNodes(): TaskHubTreeItem[] {
        return ([] as TaskHubTreeItem[]).concat(...this._storageAccountItems.map(n => n.childItems));
    }

    // Adds a node to the tree for MonitorView, that's already running
    addNodeForMonitorView(monitorView: MonitorView): void {

        const storageConnStrings = monitorView.storageConnectionSettings.storageConnStrings;
        const storageName = ConnStringUtils.GetStorageName(storageConnStrings);
        const hubName = monitorView.storageConnectionSettings.hubName;

        // Only creating a new tree node, if no node for this account exists so far
        var node = this._storageAccountItems.find(item => item.storageName.toLowerCase() === storageName.toLowerCase());
        if (!node) {

            node = new StorageAccountTreeItem(storageConnStrings, this._resourcesFolderPath, this._monitorViewList);

            this._storageAccountItems.push(node);
            this._storageAccountItems.sort(StorageAccountTreeItem.compare);
        }

        node.getOrAdd(hubName);
    }

    // Adds a detached node to the tree for the specified storage connection settings
    addNodeForConnectionSettings(connSettings: StorageConnectionSettings, isV2StorageAccount: boolean = false, storageAccountId: string = ''): void {

        const storageConnStrings = connSettings.storageConnStrings;
        const hubName = connSettings.hubName;

        // Trying to infer account name from connection string
        const storageName = ConnStringUtils.GetStorageName(storageConnStrings);
        if (!storageName) {
            return;
        }

        // Only creating a new tree node, if no node for this account exists so far
        var node = this._storageAccountItems.find(item => item.storageName === storageName);
        if (!node) {

            node = new StorageAccountTreeItem(storageConnStrings,
                this._resourcesFolderPath,
                this._monitorViewList,
                connSettings.isFromLocalSettingsJson
            );
 
            this._storageAccountItems.push(node);
            this._storageAccountItems.sort(StorageAccountTreeItem.compare);
        }

        node.isV2StorageAccount = isV2StorageAccount;
        node.storageAccountId = storageAccountId;

        node.getOrAdd(hubName);
    }
    
    private _storageAccountItems: StorageAccountTreeItem[] = [];
}

================================================
FILE: durablefunctionsmonitor-vscodeext/src/SubscriptionTreeItem.ts
================================================
import * as vscode from 'vscode';
import * as path from 'path';

import { StorageAccountTreeItem } from "./StorageAccountTreeItem";
import { StorageAccountTreeItems } from "./StorageAccountTreeItems";

// Represents an Azure Subscription in the TreeView
export class SubscriptionTreeItem extends vscode.TreeItem {

    get isSubscriptionTreeItem(): boolean { return true; }

    // Returns storage account nodes, that belong to this subscription
    get storageAccountNodes(): StorageAccountTreeItem[] {
        return this._storageAccounts.nodes.filter(a => this.isMyStorageAccount(a));
    }

    constructor(subscriptionName: string,
        private _storageAccounts: StorageAccountTreeItems,
        private _storageAccountNames: string[],
        protected _resourcesFolderPath: string
    ) {
        super(subscriptionName, vscode.TreeItemCollapsibleState.Expanded);
        this.iconPath = path.join(this._resourcesFolderPath, 'azureSubscription.svg');
    }

    // Checks whether this storage account belongs to this subscription.
    isMyStorageAccount(accNode: StorageAccountTreeItem): boolean {

        // The only way to do this is by matching the account name against all account names in this subscription.
        // We need to fetch these acccount names for other purposes anyway, so why not using them here as well 
        // (as opposite to making separate roundtrips to get subscriptionId for a given account).
        return this._storageAccountNames.includes(accNode.storageName);
    }
}

// Represents a special node in the TreeView where all 'orphaned' (those with unidentified subscription) storage accounts go
export class DefaultSubscriptionTreeItem extends SubscriptionTreeItem {

    constructor(storageAccounts: StorageAccountTreeItems,
        private _otherSubscriptionNodes: SubscriptionTreeItem[],
        resourcesFolderPath: string
    ) {
        super('Storages', storageAccounts, [], resourcesFolderPath);
        this.iconPath = path.join(this._resourcesFolderPath, 'storageAccounts.svg');
    }

    // Checks whether this storage account belongs to this tree item.
    isMyStorageAccount(accNode: StorageAccountTreeItem): boolean {

        // Let's see if this account belongs to any other subscription node. If not - it's ours. 
        return this._otherSubscriptionNodes.every(n => !n.isMyStorageAccount(accNode));
    }
}

================================================
FILE: durablefunctionsmonitor-vscodeext/src/SubscriptionTreeItems.ts
================================================
import * as vscode from 'vscode';

import { StorageManagementClient } from "@azure/arm-storage";
import { StorageAccount } from "@azure/arm-storage/src/models";

import { SubscriptionTreeItem, DefaultSubscriptionTreeItem } from "./SubscriptionTreeItem";
import { StorageAccountTreeItems } from "./StorageAccountTreeItems";
import { getTaskHubNamesFromTableStorage } from './MonitorViewList';
import { ConnStringUtils } from "./ConnStringUtils";
import { Settings } from './Settings';
import { StorageConnectionSettings } from "./BackendProcess";

// Full typings for this can be found here: https://github.com/microsoft/vscode-azure-account/blob/master/src/azure-account.api.d.ts
type AzureSubscription = { session: { credentials2: any }, subscription: { subscriptionId: string, displayName: string } };

// Represents the list of Azure Subscriptions in the TreeView
export class SubscriptionTreeItems {

    constructor(private _context: vscode.ExtensionContext,
        private _azureAccount: any,
        private _storageAccounts: StorageAccountTreeItems,
        private _onStorageAccountsChanged: () => void,
        private _resourcesFolderPath: string,
        private _log: (l: string) => void)
    { }

    // Returns subscription nodes, but only those that have some TaskHubs in them
    async getNonEmptyNodes(): Promise<SubscriptionTreeItem[]> {

        if (!this._nodes) {

            // Need to wait until Azure Account ext loads the filtered list of subscriptions
            if (!this._azureAccount || !await this._azureAccount.waitForFilters()) {

                this._nodes = [];

            } else {

                // Showing only filtered subscriptions and ignoring those, which are hidden
                const subscriptions = this._azureAccount.filters;

                this._nodes = await this.loadSubscriptionNodes(subscriptions);
            }

            // Adding the 'default subscription' node, where all orphaned (unrecognized) storage accounts will go to.
            this._nodes.push(new DefaultSubscriptionTreeItem(this._storageAccounts, this._nodes.slice(), this._resourcesFolderPath));

            // Also pinging local Storage Emulator and deliberately not awaiting
            this.tryLoadingTaskHubsForLocalStorageEmulator();
        }

        // Only showing non-empty subscriptions
        return this._nodes.filter(n => n.storageAccountNodes.length > 0);
    }

    cleanup(): void {
        this._nodes = undefined;
    }
    
    private _nodes?: SubscriptionTreeItem[];

    private async tryLoadingStorageAccountsForSubscription(storageManagementClient: StorageManagementClient): Promise<StorageAccount[]> {
 
        const result: StorageAccount[] = [];

        var storageAccountsPartialResponse = await storageManagementClient.storageAccounts.list();
        result.push(...storageAccountsPartialResponse);

        while (!!storageAccountsPartialResponse.nextLink) {

            storageAccountsPartialResponse = await storageManagementClient.storageAccounts.listNext(storageAccountsPartialResponse.nextLink);
            result.push(...storageAccountsPartialResponse);
        }

        return result;
    }

    private static HasAlreadyShownStorageV2Warning = false;

    private showWarning4V2StorageAccounts(v2AccountNames: string[]): void {

        const DfmDoNotShowStorageV2Warning = 'DfmDoNotShowStorageV2Warning';

        if (!!SubscriptionTreeItems.HasAlreadyShownStorageV2Warning || !!this._context.globalState.get(DfmDoNotShowStorageV2Warning, false) || !v2AccountNames.length) {
            return;
        }
        SubscriptionTreeItems.HasAlreadyShownStorageV2Warning = true;

        const prompt = `Looks like your Durable Functions are using the following General-purpose V2 Storage accounts: ${v2AccountNames.join(', ')}. Combined with Durable Functions, V2 Storage accounts can be more expensive under high loads. Consider using General-purpose V1 Storage instead.`;
        vscode.window.showWarningMessage(prompt, 'OK', `Don't Show Again`).then(answer => {

            if (answer === `Don't Show Again`) {
                this._context.globalState.update(DfmDoNotShowStorageV2Warning, true);
            }
        });
    }

    private async tryLoadingTaskHubsForSubscription(storageManagementClient: StorageManagementClient, storageAccounts: StorageAccount[]): Promise<boolean> {

        const v2AccountNames: string[] = [];
        var taskHubsAdded = false;
        await Promise.all(storageAccounts.map(async storageAccount => {

            // Extracting resource group name
            const match = /\/resourceGroups\/([^\/]+)\/providers/gi.exec(storageAccount.id!);
            if (!match || match.length <= 0) {
                return;
            }
            const resourceGroupName = match[1];

            const storageKeys = await storageManagementClient.storageAccounts.listKeys(resourceGroupName, storageAccount.name!);
            if (!storageKeys.keys || storageKeys.keys.length <= 0) {
                return;
            }

            // Choosing the key that looks best
            var storageKey = storageKeys.keys.find(k => !k.permissions || k.permissions.toLowerCase() === "full");
            if (!storageKey) {
                storageKey = storageKeys.keys.find(k => !k.permissions || k.permissions.toLowerCase() === "read");
            }
            if (!storageKey) {
                return;
            }

            var tableEndpoint = '';
            if (!!storageAccount.primaryEndpoints) {
                tableEndpoint = storageAccount.primaryEndpoints.table!;
            }

            const hubNames = await getTaskHubNamesFromTableStorage(storageAccount.name!, storageKey.value!, tableEndpoint);
            if (!hubNames || !hubNames.length) {
                return;
            }

            const isV2StorageAccount = storageAccount.kind === 'StorageV2';

            if (isV2StorageAccount) {
                v2AccountNames.push(storageAccount.name!);
            }

            for (const hubName of hubNames) {

                this._storageAccounts.addNodeForConnectionSettings(
                    new StorageConnectionSettings([this.getConnectionStringForStorageAccount(storageAccount, storageKey.value!)], hubName, false),
                    isV2StorageAccount,
                    storageAccount.id
                );
                
                taskHubsAdded = true;
            }
        }));

        // Notifying about potentially higher costs of V2 accounts
        this.showWarning4V2StorageAccounts(v2AccountNames);

        return taskHubsAdded;
    }

    private async tryLoadingTaskHubsForLocalStorageEmulator(): Promise<void> {

        const emulatorConnString = Settings().storageEmulatorConnectionString;

        const accountName = ConnStringUtils.GetAccountName(emulatorConnString);
        const accountKey = ConnStringUtils.GetAccountKey(emulatorConnString);
        const tableEndpoint = ConnStringUtils.GetTableEndpoint(emulatorConnString);

        const hubNames = await getTaskHubNamesFromTableStorage(accountName, accountKey, tableEndpoint);
        if (!hubNames) {
            return;
        }

        for (const hubName of hubNames) {
            this._storageAccounts.addNodeForConnectionSettings(new StorageConnectionSettings([emulatorConnString], hubName));
        }

        if (hubNames.length > 0) {
            this._onStorageAccountsChanged();
        }
    }

    private getConnectionStringForStorageAccount(account: StorageAccount, storageKey: string): string {

        var endpoints = ''; 
        if (!!account.primaryEndpoints) {
            endpoints = `BlobEndpoint=${account.primaryEndpoints!.blob};QueueEndpoint=${account.primaryEndpoints!.queue};TableEndpoint=${account.primaryEndpoints!.table};FileEndpoint=${account.primaryEndpoints!.file};`;
        } else {
            endpoints = `BlobEndpoint=https://${account.name}.blob.core.windows.net/;QueueEndpoint=https://${account.name}.queue.core.windows.net/;TableEndpoint=https://${account.name}.table.core.windows.net/;FileEndpoint=https://${account.name}.file.core.windows.net/;`;
        }

        return `DefaultEndpointsProtocol=https;AccountName=${account.name};AccountKey=${storageKey};${endpoints}`;
    }

    private async loadSubscriptionNodes(subscriptions: AzureSubscription[]): Promise<SubscriptionTreeItem[]> {
        
        const results = await Promise.all(subscriptions.map(async s => {

            try {
                const storageManagementClient = new StorageManagementClient(s.session.credentials2, s.subscription.subscriptionId);

                // Trying to load all storage account names in this subscription.
                // We need that list of names to subsequently match storage account nodes with their subscription nodes.
                const storageAccounts = await this.tryLoadingStorageAccountsForSubscription(storageManagementClient);

                // Now let's try to detect and load TaskHubs in this subscription.
                // Many things can go wrong there, that is why we're doing it so asynchronously
                this.tryLoadingTaskHubsForSubscription(storageManagementClient, storageAccounts)
                    .then(anyMoreTaskHubsAdded => {
                        if (anyMoreTaskHubsAdded) {
                            this._onStorageAccountsChanged();
                        }
                    }, err => { 
                        this._onStorageAccountsChanged();
                        this._log(`Failed to load TaskHubs from subscription ${s.subscription.displayName}. ${err.message}`);
                    });

                return {
                    subscriptionId: s.subscription.subscriptionId,
                    subscriptionName: s.subscription.displayName,
                    storageAccountNames: storageAccounts.map(a => a.name!)
                };

            } catch (err) {

                this._log(`Failed to load storage accounts from subscription ${s.subscription.displayName}. ${err.message}`);

                return null;
            }
        }));

        return results
            .filter(r => r !== null)
            .map(r => new SubscriptionTreeItem(
                r!.subscriptionName,
                this._storageAccounts,
                r!.storageAccountNames,
                this._resourcesFolderPath
            ));
    }
}

================================================
FILE: durablefunctionsmonitor-vscodeext/src/TaskHubTreeItem.ts
================================================
import * as vscode from 'vscode';
import * as path from 'path';

import { StorageConnectionSettings } from './BackendProcess';
import { StorageAccountTreeItem } from "./StorageAccountTreeItem";

// Represents the Task Hub item in the TreeView
export class TaskHubTreeItem extends vscode.TreeItem {

    constructor(private _parentItem: StorageAccountTreeItem, private _hubName: string, private _resourcesFolderPath: string) {
        super(_hubName);
    }

    get storageAccountId(): string {
        return this._parentItem.storageAccountId;
    }

    get subscriptionId(): string {

        const match = /\/subscriptions\/([^\/]+)\/resourceGroups/gi.exec(this._parentItem.storageAccountId);
        if (!match || match.length <= 0) {
            return '';
        }
        return match[1];
    }

    get hubName(): string {
        return this._hubName;
    }

    // Gets associated storage connection settings
    get storageConnectionSettings(): StorageConnectionSettings {
        return new StorageConnectionSettings(this._parentItem.storageConnStrings, this._hubName);
    }

    // Item's icon
    get iconPath(): string {
        return path.join(this._resourcesFolderPath, this._parentItem.isTaskHubVisible(this._hubName) ? 'taskHubAttached.svg' : 'taskHub.svg');
    }

    // As a tooltip, showing the backend's URL
    get tooltip(): string {

        const backendUrl = this._parentItem.backendUrl;
        return !backendUrl ? '' : `${backendUrl}/${this._hubName}`;
    }

    // This is what happens when the item is being clicked
    get command(): vscode.Command {
        return {
            title: 'Attach',
            command: 'durableFunctionsMonitorTreeView.attachToTaskHub',
            arguments: [this]
        };
    }

    // For binding context menu to this tree node
    get contextValue(): string {
        return this._parentItem.isAttached ? 'taskHub-attached' : 'taskHub-detached';
    }

    // For sorting
    static compare(first: TaskHubTreeItem, second: TaskHubTreeItem): number {
        const a = first.label!.toLowerCase();
        const b = second.label!.toLowerCase();
        return a === b ? 0 : (a < b ? -1 : 1);
    }

    // Drops itself from parent's list
    removeFromTree(): void {

        this._parentItem.childItems.splice(this._parentItem.childItems.indexOf(this), 1);
    }
}

================================================
FILE: durablefunctionsmonitor-vscodeext/src/az-func-as-a-graph/FunctionsMap.d.ts
================================================

export type FunctionsMap = {
    [name: string]: {
        bindings: any[],
        isCalledBy: string[],
        isSignalledBy: { name: string, signalName: string }[],
        isCalledByItself?: boolean,
        filePath?: string,
        pos?: number,
        lineNr?: number
    }
};

export type ProxiesMap = {
    [name: string]: {
        matchCondition?: {
            methods?: string[];
            route?: string;
        };
        backendUri?: string;
        requestOverrides?: {};
        responseOverrides?: {};
        filePath?: string,
        pos?: number,
        lineNr?: number,
        warningNotAddedToCsProjFile?: boolean
    }
};

export type TraverseFunctionResult = {
    functions: FunctionsMap;
    proxies: ProxiesMap;
    tempFolders: string[];
    projectFolder: string;
};


================================================
FILE: durablefunctionsmonitor-vscodeext/src/az-func-as-a-graph/traverseFunctionProject.ts
================================================
import * as os from 'os';
import * as fs from 'fs';
import * as path from 'path';
import { execSync } from 'child_process';

import { FunctionsMap, ProxiesMap, TraverseFunctionResult } from './FunctionsMap';
import {
    getCodeInBrackets, TraversalRegexes, DotNetBindingsParser,
    isDotNetProjectAsync, posToLineNr, cloneFromGitHub
} from './traverseFunctionProjectUtils';

const ExcludedFolders = ['node_modules', 'obj', '.vs', '.vscode', '.env', '.python_packages', '.git', '.github'];

// Collects all function.json files in a Functions project. Also tries to supplement them wit
Download .txt
gitextract_sz7kn825/

├── .gitignore
├── LICENSE
├── README.md
├── azure-pipelines.yml
├── custom-backends/
│   ├── README.md
│   ├── mssql/
│   │   ├── .gitignore
│   │   ├── Dfm.MsSql.csproj
│   │   ├── README.md
│   │   ├── Startup.cs
│   │   ├── arm-template.json
│   │   └── host.json
│   ├── netcore21/
│   │   ├── .gitignore
│   │   ├── Dfm.NetCore21.csproj
│   │   ├── README.md
│   │   ├── Startup.cs
│   │   ├── arm-template.json
│   │   └── host.json
│   └── netcore31/
│       ├── .gitignore
│       ├── Dfm.NetCore31.csproj
│       ├── README.md
│       ├── Startup.cs
│       ├── arm-template.json
│       └── host.json
├── durablefunctionsmonitor-vscodeext/
│   ├── .gitignore
│   ├── .vscode/
│   │   ├── extensions.json
│   │   ├── launch.json
│   │   ├── settings.json
│   │   └── tasks.json
│   ├── .vscodeignore
│   ├── CHANGELOG.md
│   ├── LICENSE
│   ├── README.md
│   ├── package.json
│   ├── src/
│   │   ├── BackendProcess.ts
│   │   ├── ConnStringUtils.ts
│   │   ├── FunctionGraphList.ts
│   │   ├── FunctionGraphView.ts
│   │   ├── MonitorTreeDataProvider.ts
│   │   ├── MonitorView.ts
│   │   ├── MonitorViewList.ts
│   │   ├── Settings.ts
│   │   ├── SharedConstants.ts
│   │   ├── StorageAccountTreeItem.ts
│   │   ├── StorageAccountTreeItems.ts
│   │   ├── SubscriptionTreeItem.ts
│   │   ├── SubscriptionTreeItems.ts
│   │   ├── TaskHubTreeItem.ts
│   │   ├── az-func-as-a-graph/
│   │   │   ├── FunctionsMap.d.ts
│   │   │   ├── traverseFunctionProject.ts
│   │   │   └── traverseFunctionProjectUtils.ts
│   │   ├── extension.ts
│   │   └── test/
│   │       ├── runTest.ts
│   │       └── suite/
│   │           ├── extension.test.ts
│   │           └── index.ts
│   ├── tsconfig.json
│   └── tslint.json
├── durablefunctionsmonitor.dotnetbackend/
│   ├── .gitignore
│   ├── .vscode/
│   │   ├── extensions.json
│   │   ├── launch.json
│   │   ├── settings.json
│   │   └── tasks.json
│   ├── Common/
│   │   ├── Auth.cs
│   │   ├── CustomTemplates.cs
│   │   ├── DetailedOrchestrationStatus.cs
│   │   ├── ExpandedOrchestrationStatus.cs
│   │   ├── FilterClause.cs
│   │   ├── Globals.cs
│   │   ├── HttpHandlerBase.cs
│   │   ├── OrchestrationHistory.cs
│   │   ├── Setup.cs
│   │   └── TableClient.cs
│   ├── DfmStatics/
│   │   ├── index.html
│   │   ├── manifest.json
│   │   └── static/
│   │       ├── css/
│   │       │   ├── 2.62e7949a.chunk.css
│   │       │   └── main.12374d2f.chunk.css
│   │       └── js/
│   │           ├── 2.7e622828.chunk.js
│   │           ├── 2.7e622828.chunk.js.LICENSE.txt
│   │           ├── main.7371b08e.chunk.js
│   │           └── runtime-main.edc3f937.js
│   ├── Dockerfile
│   ├── Functions/
│   │   ├── About.cs
│   │   ├── CleanEntityStorage.cs
│   │   ├── DeleteTaskHub.cs
│   │   ├── EasyAuthConfig.cs
│   │   ├── FunctionMap.cs
│   │   ├── IdSuggestions.cs
│   │   ├── ManageConnection.cs
│   │   ├── Orchestration.cs
│   │   ├── Orchestrations.cs
│   │   ├── PurgeHistory.cs
│   │   ├── ServeStatics.cs
│   │   └── TaskHubNames.cs
│   ├── LICENSE
│   ├── NUGET_README.md
│   ├── README.md
│   ├── arm-template.json
│   ├── dfm-aks-deployment.yaml
│   ├── durablefunctionsmonitor.dotnetbackend.csproj
│   ├── durablefunctionsmonitor.dotnetbackend.targets
│   ├── host.json
│   ├── nuspec.nuspec
│   ├── proxies.json
│   └── setup-and-run.js
├── durablefunctionsmonitor.functions/
│   └── README.md
├── durablefunctionsmonitor.react/
│   ├── .gitignore
│   ├── README.md
│   ├── copy-build-artifacts.js
│   ├── package.json
│   ├── public/
│   │   ├── index.html
│   │   └── manifest.json
│   ├── src/
│   │   ├── CancelToken.ts
│   │   ├── DateTimeHelpers.ts
│   │   ├── DfmContext.ts
│   │   ├── components/
│   │   │   ├── ErrorMessage.css
│   │   │   ├── ErrorMessage.tsx
│   │   │   ├── FunctionGraph.css
│   │   │   ├── FunctionGraph.tsx
│   │   │   ├── FunctionGraphBase.tsx
│   │   │   ├── FunctionGraphTabBase.tsx
│   │   │   ├── LoginIcon.css
│   │   │   ├── LoginIcon.tsx
│   │   │   ├── Main.css
│   │   │   ├── Main.tsx
│   │   │   ├── MainMenu.css
│   │   │   ├── MainMenu.tsx
│   │   │   ├── OrchestrationLink.tsx
│   │   │   ├── SaveAsSvgButton.tsx
│   │   │   ├── details-view/
│   │   │   │   ├── DurableEntityButtons.tsx
│   │   │   │   ├── DurableEntityFields.tsx
│   │   │   │   ├── OrchestrationButtons.tsx
│   │   │   │   ├── OrchestrationDetails.css
│   │   │   │   ├── OrchestrationDetails.tsx
│   │   │   │   ├── OrchestrationDetailsFunctionGraph.tsx
│   │   │   │   └── OrchestrationFields.tsx
│   │   │   ├── dialogs/
│   │   │   │   ├── CleanEntityStorageDialog.css
│   │   │   │   ├── CleanEntityStorageDialog.tsx
│   │   │   │   ├── ConnectionParamsDialog.tsx
│   │   │   │   ├── LongJsonDialog.tsx
│   │   │   │   ├── PurgeHistoryDialog.css
│   │   │   │   ├── PurgeHistoryDialog.tsx
│   │   │   │   ├── StartNewInstanceDialog.css
│   │   │   │   └── StartNewInstanceDialog.tsx
│   │   │   └── results-view/
│   │   │       ├── Orchestrations.css
│   │   │       ├── Orchestrations.tsx
│   │   │       ├── OrchestrationsFunctionGraph.css
│   │   │       ├── OrchestrationsFunctionGraph.tsx
│   │   │       ├── OrchestrationsGanttChart.tsx
│   │   │       ├── OrchestrationsHistogram.tsx
│   │   │       └── OrchestrationsList.tsx
│   │   ├── index.css
│   │   ├── index.tsx
│   │   ├── react-app-env.d.ts
│   │   ├── services/
│   │   │   ├── BackendClient.ts
│   │   │   ├── IBackendClient.ts
│   │   │   └── VsCodeBackendClient.ts
│   │   ├── states/
│   │   │   ├── DurableOrchestrationStatus.ts
│   │   │   ├── ErrorMessageState.ts
│   │   │   ├── FilterOperatorEnum.ts
│   │   │   ├── FunctionGraphState.ts
│   │   │   ├── FunctionGraphStateBase.ts
│   │   │   ├── ITypedLocalStorage.ts
│   │   │   ├── LoginState.ts
│   │   │   ├── MainMenuState.ts
│   │   │   ├── MainState.ts
│   │   │   ├── MermaidDiagramStateBase.ts
│   │   │   ├── QueryString.ts
│   │   │   ├── TypedLocalStorage.ts
│   │   │   ├── VsCodeTypedLocalStorage.ts
│   │   │   ├── az-func-as-a-graph/
│   │   │   │   ├── FunctionsMap.d.ts
│   │   │   │   └── buildFunctionDiagramCode.ts
│   │   │   ├── details-view/
│   │   │   │   ├── FunctionGraphTabState.ts
│   │   │   │   ├── GanttDiagramTabState.ts
│   │   │   │   ├── ICustomTabState.ts
│   │   │   │   ├── LiquidMarkupTabState.ts
│   │   │   │   ├── MermaidDiagramTabState.ts
│   │   │   │   ├── OrchestrationDetailsState.ts
│   │   │   │   └── SequenceDiagramTabState.ts
│   │   │   ├── dialogs/
│   │   │   │   ├── CleanEntityStorageDialogState.ts
│   │   │   │   ├── ConnectionParamsDialogState.ts
│   │   │   │   ├── PurgeHistoryDialogState.ts
│   │   │   │   └── StartNewInstanceDialogState.ts
│   │   │   └── results-view/
│   │   │       ├── OrchestrationsState.ts
│   │   │       ├── ResultsFunctionGraphTabState.ts
│   │   │       ├── ResultsGanttDiagramTabState.ts
│   │   │       ├── ResultsHistogramTabState.ts
│   │   │       └── ResultsListTabState.ts
│   │   └── theme.ts
│   ├── tsconfig.json
│   └── tslint.json
└── tests/
    └── durablefunctionsmonitor.dotnetbackend.tests/
        ├── .gitignore
        ├── .vscode/
        │   ├── launch.json
        │   └── tasks.json
        ├── AboutTests.cs
        ├── AuthTests.cs
        ├── EasyAuthConfigTests.cs
        ├── FilterClauseTests.cs
        ├── GlobalsTests.cs
        ├── IdSuggestionsTests.cs
        ├── ServeStaticsTests.cs
        ├── Shared.cs
        └── durablefunctionsmonitor.dotnetbackend.tests.csproj
Download .txt
Showing preview only (304K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3285 symbols across 119 files)

FILE: custom-backends/mssql/Startup.cs
  class Startup (line 12) | public class Startup : IWebJobsStartup
    method Configure (line 14) | public void Configure(IWebJobsBuilder builder)
    method GetInstanceHistory (line 22) | public static IEnumerable<HistoryEvent> GetInstanceHistory(IDurableCli...
    method ToHistoryEvent (line 113) | private static HistoryEvent ToHistoryEvent(SqlDataReader reader, DateT...

FILE: custom-backends/netcore21/Startup.cs
  class Startup (line 8) | public class Startup : IWebJobsStartup
    method Configure (line 10) | public void Configure(IWebJobsBuilder builder)

FILE: custom-backends/netcore31/Startup.cs
  class Startup (line 8) | public class Startup : IWebJobsStartup
    method Configure (line 10) | public void Configure(IWebJobsBuilder builder)

FILE: durablefunctionsmonitor-vscodeext/src/BackendProcess.ts
  class BackendProcess (line 18) | class BackendProcess {
    method constructor (line 20) | constructor(private _binariesFolder: string,
    method storageConnectionStrings (line 27) | get storageConnectionStrings(): string[] {
    method backendUrl (line 32) | get backendUrl(): string {
    method binariesFolder (line 37) | get binariesFolder(): string {
    method cleanup (line 42) | cleanup(): Promise<any> {
    method backendCommunicationNonce (line 61) | get backendCommunicationNonce(): string { return this._backendCommunic...
    method getBackend (line 64) | getBackend(): Promise<void> {
    method startBackendOnPort (line 119) | private startBackendOnPort(portNr: number, backendUrl: string, cancelT...
  class StorageConnectionSettings (line 250) | class StorageConnectionSettings {
    method storageConnStrings (line 252) | get storageConnStrings(): string[] { return this._connStrings; }
    method hubName (line 253) | get hubName(): string { return this._hubName; }
    method connStringHashKey (line 254) | get connStringHashKey(): string { return this._connStringHashKey; }
    method hashKey (line 255) | get hashKey(): string { return this._hashKey; }
    method isFromLocalSettingsJson (line 256) | get isFromLocalSettingsJson(): boolean { return this._fromLocalSetting...
    method isMsSql (line 257) | get isMsSql(): boolean { return !!ConnStringUtils.GetSqlServerName(thi...
    method constructor (line 259) | constructor(private _connStrings: string[],
    method GetConnStringHashKey (line 267) | static GetConnStringHashKey(connStrings: string[]): string {
    method MaskStorageConnString (line 278) | static MaskStorageConnString(connString: string): string {
  function CreateAuthHeadersForTableStorage (line 287) | function CreateAuthHeadersForTableStorage(accountName: string, accountKe...

FILE: durablefunctionsmonitor-vscodeext/src/ConnStringUtils.ts
  class ConnStringUtils (line 4) | class ConnStringUtils {
    method GetAccountName (line 7) | static GetAccountName(connString: string): string {
    method GetAccountKey (line 13) | static GetAccountKey(connString: string): string {
    method GetDefaultEndpointsProtocol (line 19) | static GetDefaultEndpointsProtocol(connString: string): string {
    method GetTableEndpoint (line 25) | static GetTableEndpoint(connString: string): string {
    method ExpandEmulatorShortcutIfNeeded (line 45) | static ExpandEmulatorShortcutIfNeeded(connString: string): string {
    method GetSqlServerName (line 55) | static GetSqlServerName(connString: string): string {
    method GetSqlDatabaseName (line 61) | static GetSqlDatabaseName(connString: string): string {
    method GetStorageName (line 67) | static GetStorageName(connStrings: string[]): string {

FILE: durablefunctionsmonitor-vscodeext/src/FunctionGraphList.ts
  type TraversalResult (line 10) | type TraversalResult = {
  class FunctionGraphList (line 16) | class FunctionGraphList {
    method constructor (line 18) | constructor(private _context: vscode.ExtensionContext, logChannel?: vs...
    method traverseFunctions (line 22) | traverseFunctions(projectPath: string): Promise<TraversalResult> {
    method visualize (line 64) | visualize(item?: vscode.Uri): void {
    method visualizeProjectPath (line 87) | visualizeProjectPath(projectPath: string): void {
    method cleanup (line 93) | cleanup(): void {

FILE: durablefunctionsmonitor-vscodeext/src/FunctionGraphView.ts
  class FunctionGraphView (line 9) | class FunctionGraphView
    method constructor (line 11) | constructor(private _context: vscode.ExtensionContext,
    method cleanup (line 21) | cleanup(): void {
    method showWebView (line 40) | private showWebView(): vscode.WebviewPanel {
    method embedTheme (line 175) | private embedTheme(html: string): string {
    method embedParams (line 184) | private embedParams(html: string, isFunctionGraphAvailable: boolean): ...

FILE: durablefunctionsmonitor-vscodeext/src/MonitorTreeDataProvider.ts
  class MonitorTreeDataProvider (line 15) | class MonitorTreeDataProvider implements vscode.TreeDataProvider<vscode....
    method constructor (line 17) | constructor(private _context: vscode.ExtensionContext, functionGraphLi...
    method getTreeItem (line 56) | getTreeItem(element: vscode.TreeItem): vscode.TreeItem { return elemen...
    method getChildren (line 59) | getChildren(element?: vscode.TreeItem): Promise<vscode.TreeItem[]> {
    method attachToTaskHub (line 90) | attachToTaskHub(taskHubItem: TaskHubTreeItem | null, messageToWebView:...
    method handleOnDebugSessionStarted (line 121) | handleOnDebugSessionStarted() {
    method detachFromTaskHub (line 169) | detachFromTaskHub(storageAccountItem: StorageAccountTreeItem) {
    method deleteTaskHub (line 194) | deleteTaskHub(taskHubItem: TaskHubTreeItem) {
    method openTableInStorageExplorer (line 234) | async openTableInStorageExplorer(taskHubItem: TaskHubTreeItem, table: ...
    method attachToAnotherTaskHub (line 265) | attachToAnotherTaskHub() {
    method refresh (line 271) | refresh() {
    method detachFromAllTaskHubs (line 277) | detachFromAllTaskHubs() {
    method gotoInstanceId (line 294) | gotoInstanceId(taskHubItem: TaskHubTreeItem | null) {
    method cleanup (line 321) | cleanup(): Promise<any> {
    method createOrActivateMonitorView (line 335) | private createOrActivateMonitorView(alwaysCreateNew: boolean, messageT...
    method showUponDebugSession (line 368) | private showUponDebugSession(connSettingsFromCurrentProject?: StorageC...

FILE: durablefunctionsmonitor-vscodeext/src/MonitorView.ts
  class MonitorView (line 14) | class MonitorView
    method storageConnectionSettings (line 17) | get storageConnectionSettings(): StorageConnectionSettings {
    method isVisible (line 21) | get isVisible(): boolean {
    method staticsFolder (line 26) | get staticsFolder(): string {
    method constructor (line 30) | constructor(private _context: vscode.ExtensionContext,
    method cleanup (line 43) | cleanup(): void {
    method show (line 56) | show(messageToWebView: any = undefined): Promise<void> {
    method deleteTaskHub (line 100) | deleteTaskHub(): Promise<void> {
    method gotoInstanceId (line 120) | gotoInstanceId() {
    method fixLinksToStatics (line 130) | static fixLinksToStatics(originalHtml: string, pathToBackend: string, ...
    method looksLikeSvg (line 149) | static looksLikeSvg(data: string): boolean {
    method showWebView (line 168) | private showWebView(orchestrationId: string = '', messageToWebView: an...
    method embedThemeAndSettings (line 333) | private embedThemeAndSettings(html: string): string {
    method embedOrchestrationIdAndState (line 342) | private embedOrchestrationIdAndState(html: string, orchestrationId: st...
    method embedIsFunctionGraphAvailable (line 350) | private embedIsFunctionGraphAvailable(html: string, isFunctionGraphAva...
    method askForInstanceId (line 362) | private askForInstanceId(): Promise<string> {
    method taskHubFullTitle (line 408) | private get taskHubFullTitle(): string {
    method getInstanceIdSuggestions (line 414) | private getInstanceIdSuggestions(prefix: string): Promise<string[]> {

FILE: durablefunctionsmonitor-vscodeext/src/MonitorViewList.ts
  class MonitorViewList (line 14) | class MonitorViewList {
    method constructor (line 16) | constructor(private _context: vscode.ExtensionContext,
    method isAnyMonitorViewVisible (line 22) | isAnyMonitorViewVisible(): boolean {
    method isMonitorViewVisible (line 26) | isMonitorViewVisible(connSettings: StorageConnectionSettings): boolean {
    method getOrCreateFromStorageConnectionSettings (line 32) | getOrCreateFromStorageConnectionSettings(connSettings: StorageConnecti...
    method getOrAdd (line 51) | getOrAdd(alwaysCreateNew: boolean): Promise<MonitorView> {
    method firstOrDefault (line 67) | firstOrDefault(): MonitorView | null {
    method getStorageConnectionSettingsFromCurrentProject (line 78) | getStorageConnectionSettingsFromCurrentProject(defaultTaskHubName?: st...
    method cleanup (line 113) | cleanup(): Promise<any> {
    method detachBackend (line 123) | detachBackend(storageConnStrings: string[]): Promise<any> {
    method getBackendUrl (line 149) | getBackendUrl(storageConnStrings: string[]): string {
    method showUponDebugSession (line 155) | showUponDebugSession(connSettingsFromCurrentProject?: StorageConnectio...
    method getOrAddBackend (line 167) | private getOrAddBackend(connSettings: StorageConnectionSettings): Back...
    method askForStorageConnectionSettings (line 202) | private askForStorageConnectionSettings(): Promise<StorageConnectionSe...
    method loadHubNamesFromTableStorage (line 303) | private loadHubNamesFromTableStorage(storageConnString: string): Promi...
    method getValueFromLocalSettings (line 330) | private getValueFromLocalSettings(valueName: string): string {
    method readHostJson (line 344) | private readHostJson(): { hubName: string, storageProviderType: 'defau...
  function getTaskHubNamesFromTableStorage (line 379) | async function getTaskHubNamesFromTableStorage(accountName: string, acco...

FILE: durablefunctionsmonitor-vscodeext/src/Settings.ts
  function Settings (line 4) | function Settings(): ISettings {
  function UpdateSetting (line 22) | function UpdateSetting(name: string, val: any) {
  type ISettings (line 28) | interface ISettings

FILE: durablefunctionsmonitor-vscodeext/src/StorageAccountTreeItem.ts
  class StorageAccountTreeItem (line 10) | class StorageAccountTreeItem extends vscode.TreeItem {
    method constructor (line 12) | constructor(private _connStrings: string[],
    method isAttached (line 26) | get isAttached(): boolean {
    method backendUrl (line 30) | get backendUrl(): string {
    method storageName (line 34) | get storageName(): string {
    method storageConnStrings (line 38) | get storageConnStrings(): string[] {
    method childItems (line 42) | get childItems(): TaskHubTreeItem[] {
    method tooltip (line 46) | get tooltip(): string {
    method description (line 60) | get description(): string {
    method iconPath (line 65) | get iconPath(): string {
    method contextValue (line 76) | get contextValue(): string {
    method compare (line 81) | static compare(first: StorageAccountTreeItem, second: StorageAccountTr...
    method getOrAdd (line 88) | getOrAdd(hubName: string): TaskHubTreeItem {
    method isTaskHubVisible (line 100) | isTaskHubVisible(hubName: string): boolean {

FILE: durablefunctionsmonitor-vscodeext/src/StorageAccountTreeItems.ts
  class StorageAccountTreeItems (line 9) | class StorageAccountTreeItems {
    method constructor (line 11) | constructor(private _resourcesFolderPath: string, private _monitorView...
    method nodes (line 13) | get nodes(): StorageAccountTreeItem[] {
    method taskHubNodes (line 17) | get taskHubNodes(): TaskHubTreeItem[] {
    method addNodeForMonitorView (line 22) | addNodeForMonitorView(monitorView: MonitorView): void {
    method addNodeForConnectionSettings (line 42) | addNodeForConnectionSettings(connSettings: StorageConnectionSettings, ...

FILE: durablefunctionsmonitor-vscodeext/src/SubscriptionTreeItem.ts
  class SubscriptionTreeItem (line 8) | class SubscriptionTreeItem extends vscode.TreeItem {
    method isSubscriptionTreeItem (line 10) | get isSubscriptionTreeItem(): boolean { return true; }
    method storageAccountNodes (line 13) | get storageAccountNodes(): StorageAccountTreeItem[] {
    method constructor (line 17) | constructor(subscriptionName: string,
    method isMyStorageAccount (line 27) | isMyStorageAccount(accNode: StorageAccountTreeItem): boolean {
  class DefaultSubscriptionTreeItem (line 37) | class DefaultSubscriptionTreeItem extends SubscriptionTreeItem {
    method constructor (line 39) | constructor(storageAccounts: StorageAccountTreeItems,
    method isMyStorageAccount (line 48) | isMyStorageAccount(accNode: StorageAccountTreeItem): boolean {

FILE: durablefunctionsmonitor-vscodeext/src/SubscriptionTreeItems.ts
  type AzureSubscription (line 14) | type AzureSubscription = { session: { credentials2: any }, subscription:...
  class SubscriptionTreeItems (line 17) | class SubscriptionTreeItems {
    method constructor (line 19) | constructor(private _context: vscode.ExtensionContext,
    method getNonEmptyNodes (line 28) | async getNonEmptyNodes(): Promise<SubscriptionTreeItem[]> {
    method cleanup (line 56) | cleanup(): void {
    method tryLoadingStorageAccountsForSubscription (line 62) | private async tryLoadingStorageAccountsForSubscription(storageManageme...
    method showWarning4V2StorageAccounts (line 80) | private showWarning4V2StorageAccounts(v2AccountNames: string[]): void {
    method tryLoadingTaskHubsForSubscription (line 98) | private async tryLoadingTaskHubsForSubscription(storageManagementClien...
    method tryLoadingTaskHubsForLocalStorageEmulator (line 159) | private async tryLoadingTaskHubsForLocalStorageEmulator(): Promise<voi...
    method getConnectionStringForStorageAccount (line 181) | private getConnectionStringForStorageAccount(account: StorageAccount, ...
    method loadSubscriptionNodes (line 193) | private async loadSubscriptionNodes(subscriptions: AzureSubscription[]...

FILE: durablefunctionsmonitor-vscodeext/src/TaskHubTreeItem.ts
  class TaskHubTreeItem (line 8) | class TaskHubTreeItem extends vscode.TreeItem {
    method constructor (line 10) | constructor(private _parentItem: StorageAccountTreeItem, private _hubN...
    method storageAccountId (line 14) | get storageAccountId(): string {
    method subscriptionId (line 18) | get subscriptionId(): string {
    method hubName (line 27) | get hubName(): string {
    method storageConnectionSettings (line 32) | get storageConnectionSettings(): StorageConnectionSettings {
    method iconPath (line 37) | get iconPath(): string {
    method tooltip (line 42) | get tooltip(): string {
    method command (line 49) | get command(): vscode.Command {
    method contextValue (line 58) | get contextValue(): string {
    method compare (line 63) | static compare(first: TaskHubTreeItem, second: TaskHubTreeItem): number {
    method removeFromTree (line 70) | removeFromTree(): void {

FILE: durablefunctionsmonitor-vscodeext/src/az-func-as-a-graph/FunctionsMap.d.ts
  type FunctionsMap (line 2) | type FunctionsMap = {
  type ProxiesMap (line 14) | type ProxiesMap = {
  type TraverseFunctionResult (line 30) | type TraverseFunctionResult = {

FILE: durablefunctionsmonitor-vscodeext/src/az-func-as-a-graph/traverseFunctionProject.ts
  function traverseFunctionProject (line 17) | async function traverseFunctionProject(projectFolder: string, log: (s: a...
  function readProxiesJson (line 89) | async function readProxiesJson(projectFolder: string, log: (s: any) => v...
  function findFileRecursivelyAsync (line 147) | async function findFileRecursivelyAsync(folder: string, fileName: string...
  function mapOrchestratorsAndActivitiesAsync (line 193) | async function mapOrchestratorsAndActivitiesAsync(functions: FunctionsMa...
  function getEventNames (line 294) | function getEventNames(orchestratorCode: string): string[] {
  function getFunctionsAndTheirCodesAsync (line 308) | async function getFunctionsAndTheirCodesAsync(functionNames: string[], i...
  function mapActivitiesToOrchestrator (line 332) | function mapActivitiesToOrchestrator(functions: FunctionsMap, orch: {nam...

FILE: durablefunctionsmonitor-vscodeext/src/az-func-as-a-graph/traverseFunctionProjectUtils.ts
  function cloneFromGitHub (line 7) | async function cloneFromGitHub(url: string): Promise<{gitTempFolder: str...
  function posToLineNr (line 65) | function posToLineNr(code: string | undefined, pos: number): number {
  function isDotNetProjectAsync (line 74) | async function isDotNetProjectAsync(projectFolder: string): Promise<bool...
  function getCodeInBrackets (line 84) | function getCodeInBrackets(str: string, startFrom: number, openingBracke...
  class TraversalRegexes (line 111) | class TraversalRegexes {
    method getStartNewOrchestrationRegex (line 113) | static getStartNewOrchestrationRegex(orchName: string): RegExp {
    method getCallSubOrchestratorRegex (line 117) | static getCallSubOrchestratorRegex(subOrchName: string): RegExp {
    method getRaiseEventRegex (line 123) | static getRaiseEventRegex(eventName: string): RegExp {
    method getSignalEntityRegex (line 127) | static getSignalEntityRegex(entityName: string): RegExp {
    method getDotNetFunctionNameRegex (line 133) | static getDotNetFunctionNameRegex(funcName: string): RegExp {
    method getCallActivityRegex (line 137) | static getCallActivityRegex(activityName: string): RegExp {
  class DotNetBindingsParser (line 143) | class DotNetBindingsParser {
    method tryExtractBindings (line 146) | static tryExtractBindings(funcCode: string): {type: string, direction:...

FILE: durablefunctionsmonitor-vscodeext/src/extension.ts
  function activate (line 13) | function activate(context: vscode.ExtensionContext) {
  function deactivate (line 83) | function deactivate() {

FILE: durablefunctionsmonitor-vscodeext/src/test/runTest.ts
  function main (line 5) | async function main() {

FILE: durablefunctionsmonitor-vscodeext/src/test/suite/index.ts
  function run (line 5) | function run(): Promise<void> {

FILE: durablefunctionsmonitor.dotnetbackend/Common/Auth.cs
  class Auth (line 19) | internal static class Auth
    method IsNonceSetAndValid (line 34) | public static bool IsNonceSetAndValid(IHeaderDictionary headers)
    method ValidateIdentityAsync (line 59) | public static async Task ValidateIdentityAsync(ClaimsPrincipal princip...
    method GetTaskHubNamesFromStorage (line 109) | private static async Task<HashSet<string>> GetTaskHubNamesFromStorage(...
    method GetAllowedTaskHubNamesAsync (line 126) | public static async Task<HashSet<string>> GetAllowedTaskHubNamesAsync()
    method ThrowIfTaskHubNameHasInvalidSymbols (line 171) | public static void ThrowIfTaskHubNameHasInvalidSymbols(string hubName)
    method ThrowIfTaskHubNameIsInvalid (line 180) | public static async Task ThrowIfTaskHubNameIsInvalid(string hubName)
    method ThrowIfXsrfTokenIsInvalid (line 208) | public static void ThrowIfXsrfTokenIsInvalid(IHeaderDictionary headers...
    method GetAlternativeConnectionStringNames (line 227) | internal static IEnumerable<string> GetAlternativeConnectionStringNames()
    method TryGetHubNameFromHostJson (line 240) | private static string TryGetHubNameFromHostJson()
    method ValidateToken (line 266) | private static async Task<ClaimsPrincipal> ValidateToken(string author...
    method InitGetSigningKeysTask (line 306) | internal static Task<ICollection<SecurityKey>> InitGetSigningKeysTask(...
    method GetSigningKeysAsync (line 334) | private static async Task<ICollection<SecurityKey>> GetSigningKeysAsync()

FILE: durablefunctionsmonitor.dotnetbackend/Common/CustomTemplates.cs
  class CustomTemplates (line 15) | class CustomTemplates
    method GetTabTemplatesAsync (line 17) | internal static Task<LiquidTemplatesMap> GetTabTemplatesAsync()
    method GetCustomMetaTagCodeAsync (line 28) | internal static Task<string> GetCustomMetaTagCodeAsync()
    method GetFunctionMapsAsync (line 39) | internal static Task<FunctionMapsMap> GetFunctionMapsAsync()
    method GetTabTemplatesFromStorageAsync (line 60) | private static async Task<LiquidTemplatesMap> GetTabTemplatesFromStora...
    method GetTabTemplatesFromFolderAsync (line 106) | private static async Task<LiquidTemplatesMap> GetTabTemplatesFromFolde...
    method GetCustomMetaTagCodeFromStorageAsync (line 137) | private static async Task<string> GetCustomMetaTagCodeFromStorageAsync()
    method GetCustomMetaTagCodeFromFolderAsync (line 164) | private static async Task<string> GetCustomMetaTagCodeFromFolderAsync(...
    method GetFunctionMapsFromStorageAsync (line 178) | private static async Task<FunctionMapsMap> GetFunctionMapsFromStorageA...
    method GetFunctionMapsFromFolderAsync (line 223) | private static async Task<FunctionMapsMap> GetFunctionMapsFromFolderAs...
  class LiquidTemplatesMap (line 254) | class LiquidTemplatesMap: ConcurrentDictionary<string, IDictionary<strin...
    method GetTemplateNames (line 256) | public List<string> GetTemplateNames(string entityTypeName)
    method GetTemplate (line 278) | public string GetTemplate(string entityTypeName, string templateName)
  class FunctionMapsMap (line 305) | class FunctionMapsMap : ConcurrentDictionary<string, string>
    method GetFunctionMap (line 307) | public string GetFunctionMap(string taskHubName)

FILE: durablefunctionsmonitor.dotnetbackend/Common/DetailedOrchestrationStatus.cs
  class DetailedOrchestrationStatus (line 13) | class DetailedOrchestrationStatus : DurableOrchestrationStatus
    method DetailedOrchestrationStatus (line 28) | public DetailedOrchestrationStatus(DurableOrchestrationStatus that, st...
    method GetEntityTypeName (line 50) | internal string GetEntityTypeName()
    method ConvertInput (line 55) | private JToken ConvertInput(JToken input, string connName)

FILE: durablefunctionsmonitor.dotnetbackend/Common/ExpandedOrchestrationStatus.cs
  type EntityTypeEnum (line 10) | enum EntityTypeEnum
  class ExpandedOrchestrationStatus (line 17) | class ExpandedOrchestrationStatus : DurableOrchestrationStatus
    method ExpandedOrchestrationStatus (line 69) | public ExpandedOrchestrationStatus(DurableOrchestrationStatus that,
    method GetEntityTypeName (line 95) | internal string GetEntityTypeName()

FILE: durablefunctionsmonitor.dotnetbackend/Common/FilterClause.cs
  class FilterClause (line 10) | class FilterClause
    method FilterClause (line 12) | public FilterClause(string filterString)
    method ExtractTimeRange (line 31) | private string ExtractTimeRange(string filterClause)
    method ExtractRuntimeStatuses (line 58) | private string ExtractRuntimeStatuses(string filterClause)
    method ExtractPredicate (line 80) | private void ExtractPredicate(string filterString)
  class FilterClauseExtensions (line 167) | static class FilterClauseExtensions
    method ApplyFilter (line 170) | internal static IEnumerable<T> ApplyFilter<T>(this IEnumerable<T> item...
    method GetPropertyValueAsString (line 208) | internal static string GetPropertyValueAsString<T>(this T orchestratio...

FILE: durablefunctionsmonitor.dotnetbackend/Common/Globals.cs
  class EnvVariableNames (line 19) | static class EnvVariableNames
  class Globals (line 36) | static class Globals
    method SplitConnNameAndHubName (line 52) | public static void SplitConnNameAndHubName(string connAndHubName, out ...
    method CombineConnNameAndHubName (line 67) | public static string CombineConnNameAndHubName(string connName, string...
    method IsDefaultConnectionStringName (line 77) | public static bool IsDefaultConnectionStringName(string connName)
    method GetFullConnectionStringEnvVariableName (line 82) | public static string GetFullConnectionStringEnvVariableName(string con...
    method HandleAuthAndErrors (line 95) | public static async Task<IActionResult> HandleAuthAndErrors(this HttpR...
    method HandleErrors (line 106) | public static async Task<IActionResult> HandleErrors(this HttpRequest ...
    method ListBlobsAsync (line 125) | public static async Task<IEnumerable<IListBlobItem>> ListBlobsAsync(th...
    method FixUndefinedsInJson (line 141) | public static string FixUndefinedsInJson(this string json)
    method ToJsonContentResult (line 150) | public static ContentResult ToJsonContentResult(this object result, Fu...
    method ApplyTop (line 160) | public static IEnumerable<T> ApplyTop<T>(this IEnumerable<T> collectio...
    method ApplySkip (line 165) | public static IEnumerable<T> ApplySkip<T>(this IEnumerable<T> collecti...
    method GetSerializerSettings (line 171) | private static JsonSerializerSettings GetSerializerSettings()

FILE: durablefunctionsmonitor.dotnetbackend/Common/HttpHandlerBase.cs
  class HttpHandlerBase (line 14) | public abstract class HttpHandlerBase
    method HttpHandlerBase (line 19) | public HttpHandlerBase(IDurableClientFactory durableClientFactory)
    method HandleAuthAndErrors (line 25) | protected async Task<IActionResult> HandleAuthAndErrors(IDurableClient...

FILE: durablefunctionsmonitor.dotnetbackend/Common/OrchestrationHistory.cs
  class OrchestrationHistory (line 10) | static class OrchestrationHistory
    method GetHistoryDirectlyFromTable (line 17) | public static IEnumerable<HistoryEvent> GetHistoryDirectlyFromTable(ID...
    method ToHistoryEvent (line 109) | private static HistoryEvent ToHistoryEvent(this HistoryEntity evt,
    method ToHistoryEvent (line 129) | internal static HistoryEvent ToHistoryEvent(JToken token)
    method ApplyTimeFrom (line 147) | internal static IEnumerable<HistoryEvent> ApplyTimeFrom(this IEnumerab...
  class HistoryEvent (line 161) | public class HistoryEvent
  class HistoryEntity (line 175) | class HistoryEntity : TableEntity

FILE: durablefunctionsmonitor.dotnetbackend/Common/Setup.cs
  type DfmMode (line 12) | public enum DfmMode
  class DfmSettings (line 21) | public class DfmSettings
    method DfmSettings (line 61) | public DfmSettings()
  class DfmExtensionPoints (line 70) | public class DfmExtensionPoints
    method DfmExtensionPoints (line 80) | public DfmExtensionPoints()
  class DfmEndpoint (line 89) | public static class DfmEndpoint
    method Setup (line 96) | public static void Setup(DfmSettings settings = null, DfmExtensionPoin...
    method AreWeInStandaloneMode (line 178) | private static bool AreWeInStandaloneMode()
    method GetVersion (line 194) | private static string GetVersion()

FILE: durablefunctionsmonitor.dotnetbackend/Common/TableClient.cs
  type ITableClient (line 11) | public interface ITableClient
    method ListTableNamesAsync (line 14) | Task<IEnumerable<string>> ListTableNamesAsync();
    method GetAll (line 17) | IEnumerable<TEntity> GetAll<TEntity>(string tableName, TableQuery<TEnt...
    method GetAllAsync (line 20) | Task<IEnumerable<TEntity>> GetAllAsync<TEntity>(string tableName, Tabl...
    method ExecuteAsync (line 23) | Task<TableResult> ExecuteAsync(string tableName, TableOperation operat...
  class TableClient (line 27) | class TableClient: ITableClient
    method GetTableClient (line 33) | public static ITableClient GetTableClient(string connStringName)
    method TableClient (line 43) | private TableClient(string connStringName)
    method ListTableNamesAsync (line 50) | public async Task<IEnumerable<string>> ListTableNamesAsync()
    method GetAll (line 71) | public IEnumerable<TEntity> GetAll<TEntity>(string tableName, TableQue...
    method GetAllAsync (line 98) | public async Task<IEnumerable<TEntity>> GetAllAsync<TEntity>(string ta...
    method ExecuteAsync (line 124) | public Task<TableResult> ExecuteAsync(string tableName, TableOperation...

FILE: durablefunctionsmonitor.dotnetbackend/DfmStatics/static/js/2.7e622828.chunk.js
  function k (line 2) | function k(e){return e>1?0:e<-1?o:Math.acos(e)}
  function O (line 2) | function O(e){return e>1?a:e<-1?-a:Math.asin(e)}
  function E (line 2) | function E(e){return(e=v(e/2))*e}
  function r (line 2) | function r(){return r=Object.assign||function(e){for(var t=1;t<arguments...
  function a (line 2) | function a(e){var t="function"===typeof Symbol&&e[Symbol.iterator],n=0;r...
  function s (line 2) | function s(e,t){var n="function"===typeof Symbol&&e[Symbol.iterator];if(...
  function c (line 2) | function c(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(s(argume...
  function f (line 2) | function f(){return++je.mobxGuid}
  function d (line 2) | function d(e){throw h(!1,e),"X"}
  function h (line 2) | function h(e,t){if(!e)throw new Error("[mobx] "+(t||"An invariant failed...
  function p (line 2) | function p(e){var t=!1;return function(){if(!t)return t=!0,e.apply(this,...
  function y (line 2) | function y(e){return null!==e&&"object"===typeof e}
  function m (line 2) | function m(e){if(null===e||"object"!==typeof e)return!1;var t=Object.get...
  function b (line 2) | function b(e,t,n){Object.defineProperty(e,t,{enumerable:!1,writable:!0,c...
  function v (line 2) | function v(e,t){var n="isMobX"+e;return t.prototype[n]=!0,function(e){re...
  function x (line 2) | function x(e){return e instanceof Map}
  function w (line 2) | function w(e){return e instanceof Set}
  function _ (line 2) | function _(e){var t=new Set;for(var n in e)t.add(n);return Object.getOwn...
  function k (line 2) | function k(e){return e&&e.toString?e.toString():new String(e).toString()}
  function O (line 2) | function O(e){return null===e?null:"object"===typeof e?""+e:e}
  function e (line 2) | function e(e){void 0===e&&(e="Atom@"+f()),this.name=e,this.isPendingUnob...
  function T (line 2) | function T(e,t,n){void 0===t&&(t=g),void 0===n&&(n=g);var r,i=new S(e);r...
  function D (line 2) | function D(e,t){var n=t?P:N;return n[e]||(n[e]={configurable:!0,enumerab...
  function R (line 2) | function R(e){var t,n;if(!0!==e[A]){var r=e[M];if(r){b(e,A,!0);var i=c(O...
  function I (line 2) | function I(e,t){return function(){var n,r=function(r,i,a,s){if(!0===s)re...
  function L (line 2) | function L(e){return(2===e.length||3===e.length)&&("string"===typeof e[1...
  function B (line 2) | function B(e,t,n){return lt(e)?e:Array.isArray(e)?X.array(e,{name:n}):m(...
  function F (line 2) | function F(e){return e}
  function z (line 2) | function z(t){h(t);var n=I(!0,(function(e,n,r,i,o){var a=r?r.initializer...
  function H (line 2) | function H(e){return null===e||void 0===e?U:"string"===typeof e?{name:e,...
  function $ (line 2) | function $(e){return e.defaultDecorator?e.defaultDecorator.enhancer:!1==...
  function K (line 2) | function K(e){d("Expected one or two arguments to observable."+e+". Did ...
  function re (line 2) | function re(e){return e instanceof ne}
  function ie (line 2) | function ie(e){switch(e.dependenciesState){case Z.UP_TO_DATE:return!1;ca...
  function oe (line 2) | function oe(e){var t=e.observers.size>0;je.computationDepth>0&&t&&d(!1),...
  function ae (line 2) | function ae(e,t,n){var r=fe(!0);he(e),e.newObserving=new Array(e.observi...
  function se (line 2) | function se(e){var t=e.observing;e.observing=[];for(var n=t.length;n--;)...
  function ce (line 2) | function ce(e){var t=ue();try{return e()}finally{le(t)}}
  function ue (line 2) | function ue(){var e=je.trackingDerivation;return je.trackingDerivation=n...
  function le (line 2) | function le(e){je.trackingDerivation=e}
  function fe (line 2) | function fe(e){var t=je.allowStateReads;return je.allowStateReads=e,t}
  function de (line 2) | function de(e){je.allowStateReads=e}
  function he (line 2) | function he(e){if(e.dependenciesState!==Z.UP_TO_DATE){e.dependenciesStat...
  function ye (line 2) | function ye(e,t,n){var r=function(){return me(e,t,n||this,arguments)};re...
  function me (line 2) | function me(e,t,n,r){var i=function(e,t,n){var r=!1,i=0;var o=ue();Ne();...
  function be (line 2) | function be(e,t){var n,r=ve(e);try{n=t()}finally{xe(r)}return n}
  function ve (line 2) | function ve(e){var t=je.allowStateChanges;return je.allowStateChanges=e,t}
  function xe (line 2) | function xe(e){je.allowStateChanges=e}
  function t (line 2) | function t(t,n,r,i,o){void 0===r&&(r="ObservableValue@"+f()),void 0===i&...
  function n (line 2) | function n(){this.constructor=e}
  function e (line 2) | function e(e){this.dependenciesState=Z.NOT_TRACKING,this.observing=[],th...
  function Se (line 2) | function Se(){return"undefined"!==typeof window?window:"undefined"!==typ...
  function Ae (line 2) | function Ae(e,t){e.observers.add(t),e.lowestObserverState>t.dependencies...
  function Me (line 2) | function Me(e,t){e.observers.delete(t),0===e.observers.size&&Pe(e)}
  function Pe (line 2) | function Pe(e){!1===e.isPendingUnobservation&&(e.isPendingUnobservation=...
  function Ne (line 2) | function Ne(){je.inBatch++}
  function De (line 2) | function De(){if(0===--je.inBatch){ze();for(var e=je.pendingUnobservatio...
  function Re (line 2) | function Re(e){var t=je.trackingDerivation;return null!==t?(t.runId!==e....
  function Ie (line 2) | function Ie(e,t){if(console.log("[mobx.trace] '"+e.name+"' is invalidate...
  function Le (line 2) | function Le(e,t,n){t.length>=1e3?t.push("(and many more)"):(t.push(""+ne...
  function e (line 2) | function e(e,t,n,r){void 0===e&&(e="Reaction@"+f()),void 0===r&&(r=!1),t...
  function ze (line 2) | function ze(){je.inBatch>0||je.isRunningReactions||Fe(Ue)}
  function Ue (line 2) | function Ue(){je.isRunningReactions=!0;for(var e=je.pendingReactions,t=0...
  function We (line 2) | function We(e){var t=Fe;Fe=function(n){return e((function(){return t(n)}...
  function Ye (line 2) | function Ye(e){return console.warn("[mobx.spy] Is a no-op in production ...
  function Ve (line 2) | function Ve(){d(!1)}
  function qe (line 2) | function qe(e){return function(t,n,r){if(r){if(r.value)return{value:ye(e...
  function $e (line 2) | function $e(e){return function(t,n,r){Object.defineProperty(t,n,{configu...
  function Xe (line 2) | function Xe(e,t){"string"===typeof e||e.name;return me(0,"function"===ty...
  function Ke (line 2) | function Ke(e,t,n){b(e,t,ye(t,n.bind(e)))}
  function Ze (line 2) | function Ze(e,t){void 0===t&&(t=l);var n,r=t&&t.name||e.name||"Autorun@"...
  function Qe (line 2) | function Qe(e){return e.scheduler?e.scheduler:e.delay?function(t){return...
  function et (line 2) | function et(e,t,n){return tt("onBecomeUnobserved",e,t,n)}
  function tt (line 2) | function tt(e,t,n,r){var i="function"===typeof r?Vt(t,n):Vt(t),o="functi...
  function nt (line 2) | function nt(e){var t=e.enforceActions,n=e.computedRequiresReaction,r=e.c...
  function rt (line 2) | function rt(e,t,n,r){var i=it(r=H(r));return R(e),Ft(e,r.name,i.enhancer...
  function it (line 2) | function it(e){return e.defaultDecorator||(!1===e.deep?V:W)}
  function ot (line 2) | function ot(e,t,n,r){var i,o;Ne();try{var s=_(t);try{for(var c=a(s),u=c....
  function at (line 2) | function at(e,t){return st(Vt(e,t))}
  function st (line 2) | function st(e){var t={name:e.name};return e.observing&&e.observing.lengt...
  function ct (line 2) | function ct(){this.message="FLOW_CANCELLED"}
  function ut (line 2) | function ut(e,t){return null!==e&&void 0!==e&&(void 0!==t?!!Yt(e)&&e[E]....
  function lt (line 2) | function lt(e){return 1!==arguments.length&&d(!1),ut(e)}
  function ft (line 2) | function ft(e,t,n){if(2!==arguments.length||Lt(e))if(Yt(e)){var r=e[E],i...
  function dt (line 2) | function dt(e){switch(e.length){case 0:return je.trackingDerivation;case...
  function ht (line 2) | function ht(e,t){void 0===t&&(t=void 0),Ne();try{return e.apply(t)}final...
  function pt (line 2) | function pt(e){return e[E]}
  function gt (line 2) | function gt(e){return"string"===typeof e||"number"===typeof e||"symbol"=...
  function mt (line 2) | function mt(e){var t=new Proxy(e,yt);return e[E].proxy=t,t}
  function bt (line 2) | function bt(e){return void 0!==e.interceptors&&e.interceptors.length>0}
  function vt (line 2) | function vt(e,t){var n=e.interceptors||(e.interceptors=[]);return n.push...
  function xt (line 2) | function xt(e,t){var n=ue();try{for(var r=c(e.interceptors||[]),i=0,o=r....
  function wt (line 2) | function wt(e){return void 0!==e.changeListeners&&e.changeListeners.leng...
  function _t (line 2) | function _t(e,t){var n=e.changeListeners||(e.changeListeners=[]);return ...
  function kt (line 2) | function kt(e,t){var n=ue(),r=e.changeListeners;if(r){for(var i=0,o=(r=r...
  function Et (line 2) | function Et(e,t,n,r){void 0===n&&(n="ObservableArray@"+f()),void 0===r&&...
  function e (line 2) | function e(e,t,n){this.owned=n,this.values=[],this.proxy=void 0,this.las...
  function At (line 2) | function At(e){return y(e)&&jt(e[E])}
  function e (line 2) | function e(e,t,n){if(void 0===t&&(t=B),void 0===n&&(n="ObservableMap@"+f...
  function e (line 2) | function e(e,t,n){if(void 0===t&&(t=B),void 0===n&&(n="ObservableSet@"+f...
  function e (line 2) | function e(e,t,n,r){void 0===t&&(t=new Map),this.target=e,this.values=t,...
  function Ft (line 2) | function Ft(e,t,n){if(void 0===t&&(t=""),void 0===n&&(n=B),Object.protot...
  function Ht (line 2) | function Ht(e){var t=e[E];return t||(R(e),e[E])}
  function Yt (line 2) | function Yt(e){return!!y(e)&&(R(e),Wt(e[E]))}
  function Vt (line 2) | function Vt(e,t){if("object"===typeof e&&null!==e){if(At(e))return void ...
  function qt (line 2) | function qt(e,t){return e||d("Expecting some object"),void 0!==t?qt(Vt(e...
  function Gt (line 2) | function Gt(e,t,n){return void 0===n&&(n=-1),Xt(e,t,n)}
  function Xt (line 2) | function Xt(e,t,n,r,i){if(e===t)return 0!==e||1/e===1/t;if(null==e||null...
  function Kt (line 2) | function Kt(e){return At(e)?e.slice():x(e)||Dt(e)||w(e)||Lt(e)?Array.fro...
  function Zt (line 2) | function Zt(e,t){return Object.prototype.hasOwnProperty.call(e,t)}
  function Jt (line 2) | function Jt(e){return e[Symbol.iterator]=Qt,e}
  function Qt (line 2) | function Qt(){return this}
  function r (line 2) | function r(e,t,n,r,i){var o={};return Object.keys(r).forEach((function(e...
  function r (line 2) | function r(e){var t,n,i="";if(e)if("object"===typeof e)if(e.push)for(t=0...
  function i (line 2) | function i(e,t){if(null==e)return{};var n,i,o=Object(r.a)(e,t);if(Object...
  function r (line 2) | function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a ...
  function r (line 2) | function r(e,t,n,r){n&&Object.defineProperty(e,t,{enumerable:n.enumerabl...
  function r (line 2) | function r(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function i (line 2) | function i(e,t,n){return t&&r(e.prototype,t),n&&r(e,n),e}
  function l (line 2) | function l(e,t){return[e,t]}
  function C (line 2) | function C(e,t,n){var r=(t-e)/Math.max(0,n),i=Math.floor(Math.log(r)/Mat...
  function T (line 2) | function T(e,t,n){var r=Math.abs(t-e)/Math.max(0,n),i=Math.pow(10,Math.f...
  function r (line 2) | function r(r){var i,o,a=r.length,s=new Array(a);for(i=0;i<a;++i)s[i]=e(r...
  function Y (line 2) | function Y(e){return e.length}
  function r (line 2) | function r(e){if(void 0===e)throw new ReferenceError("this hasn't been i...
  function p (line 2) | function p(e){return e>1?0:e<-1?f:Math.acos(e)}
  function g (line 2) | function g(e){return e>=1?d:e<=-1?-d:Math.asin(e)}
  function r (line 2) | function r(e){return r=Object.setPrototypeOf?Object.getPrototypeOf:funct...
  function i (line 2) | function i(e){return i="function"===typeof Symbol&&"symbol"===typeof Sym...
  function a (line 2) | function a(e,t){return!t||"object"!==i(t)&&"function"!==typeof t?Object(...
  function s (line 2) | function s(e){var t=function(){if("undefined"===typeof Reflect||!Reflect...
  function r (line 2) | function r(e,t){return r=Object.setPrototypeOf||function(e,t){return e._...
  function i (line 2) | function i(e,t){if("function"!==typeof t&&null!==t)throw new TypeError("...
  function i (line 2) | function i(e){if("string"!==typeof e)throw new Error(Object(r.a)(7));ret...
  function r (line 2) | function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enume...
  function i (line 2) | function i(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[...
  function o (line 2) | function o(e){if(e.type)return e;if("#"===e.charAt(0))return o(function(...
  function a (line 2) | function a(e){var t=e.type,n=e.values;return-1!==t.indexOf("rgb")?n=n.ma...
  function s (line 2) | function s(e,t){var n=c(e),r=c(t);return(Math.max(n,r)+.05)/(Math.min(n,...
  function c (line 2) | function c(e){var t="hsl"===(e=o(e)).type?o(function(e){var t=(e=o(e)).v...
  function u (line 2) | function u(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[...
  function l (line 2) | function l(e,t){return e=o(e),t=i(t),"rgb"!==e.type&&"hsl"!==e.type||(e....
  function f (line 2) | function f(e,t){if(e=o(e),t=i(t),-1!==e.type.indexOf("hsl"))e.values[2]*...
  function d (line 2) | function d(e,t){if(e=o(e),t=i(t),-1!==e.type.indexOf("hsl"))e.values[2]+...
  function l (line 2) | function l(e){return u[e]||(u[e]=function(e){if("function"===typeof Symb...
  function f (line 2) | function f(e,t){if(d(e,t))return!0;if("object"!==typeof e||null===e||"ob...
  function d (line 2) | function d(e,t){return e===t?0!==e||1/e===1/t:e!==e&&t!==t}
  function h (line 2) | function h(e,t,n){Object.hasOwnProperty.call(e,t)?e[t]=n:Object.definePr...
  function y (line 2) | function y(e,t){for(var n=this,r=[],i=arguments.length-2;i-- >0;)r[i]=ar...
  function m (line 2) | function m(e,t){return function(){for(var n=[],r=arguments.length;r--;)n...
  function b (line 2) | function b(e,t,n){var r=function(e,t){var n=e[p]=e[p]||{},r=n[t]=n[t]||{...
  function v (line 2) | function v(e,t,n,r,i){var o,a=m(i,r);return(o={})[g]=!0,o.get=function()...
  function O (line 2) | function O(e){var t=e.prototype;if(t.componentWillReact)throw new Error(...
  function E (line 2) | function E(e){var t=this;if(!0===Object(i.b)())return e.call(this);h(thi...
  function S (line 2) | function S(e,t){return Object(i.b)()&&console.warn("[mobx-react] It seem...
  function C (line 2) | function C(e,t){var n=l("reactProp_"+t+"_valueHolder"),r=l("reactProp_"+...
  function M (line 2) | function M(e){if(!0===e.isMobxInjector&&console.warn("Mobx observer: You...
  function P (line 2) | function P(e){function t(t,n,r,i,o,a){for(var c=[],u=arguments.length-6;...
  function N (line 2) | function N(e){var t=typeof e;return Array.isArray(e)?"array":e instanceo...
  function D (line 2) | function D(e,t){return P((function(n,r,i,o,a){return Object(s.p)((functi...
  function R (line 2) | function R(e,t){return P((function(n,r,i,o,a){for(var c=[],u=arguments.l...
  function o (line 2) | function o(e,t){return r.useMemo((function(){return null==e&&null==t?nul...
  function r (line 2) | function r(){return t.apply(null,arguments)}
  function i (line 2) | function i(e){t=e}
  function o (line 2) | function o(e){return e instanceof Array||"[object Array]"===Object.proto...
  function a (line 2) | function a(e){return null!=e&&"[object Object]"===Object.prototype.toStr...
  function s (line 2) | function s(e,t){return Object.prototype.hasOwnProperty.call(e,t)}
  function c (line 2) | function c(e){if(Object.getOwnPropertyNames)return 0===Object.getOwnProp...
  function u (line 2) | function u(e){return void 0===e}
  function l (line 2) | function l(e){return"number"===typeof e||"[object Number]"===Object.prot...
  function f (line 2) | function f(e){return e instanceof Date||"[object Date]"===Object.prototy...
  function d (line 2) | function d(e,t){var n,r=[];for(n=0;n<e.length;++n)r.push(t(e[n],n));retu...
  function h (line 2) | function h(e,t){for(var n in t)s(t,n)&&(e[n]=t[n]);return s(t,"toString"...
  function p (line 2) | function p(e,t,n,r){return $n(e,t,n,r,!0).utc()}
  function g (line 2) | function g(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,...
  function y (line 2) | function y(e){return null==e._pf&&(e._pf=g()),e._pf}
  function m (line 2) | function m(e){if(null==e._isValid){var t=y(e),r=n.call(t.parsedDateParts...
  function b (line 2) | function b(e){var t=p(NaN);return null!=e?h(y(t),e):y(t).userInvalidated...
  function w (line 2) | function w(e,t){var n,r,i;if(u(t._isAMomentObject)||(e._isAMomentObject=...
  function _ (line 2) | function _(e){w(this,e),this._d=new Date(null!=e._d?e._d.getTime():NaN),...
  function k (line 2) | function k(e){return e instanceof _||null!=e&&null!=e._isAMomentObject}
  function O (line 2) | function O(e){!1===r.suppressDeprecationWarnings&&"undefined"!==typeof c...
  function E (line 2) | function E(e,t){var n=!0;return h((function(){if(null!=r.deprecationHand...
  function T (line 2) | function T(e,t){null!=r.deprecationHandler&&r.deprecationHandler(e,t),C[...
  function j (line 2) | function j(e){return"undefined"!==typeof Function&&e instanceof Function...
  function A (line 2) | function A(e){var t,n;for(n in e)s(e,n)&&(j(t=e[n])?this[n]=t:this["_"+n...
  function M (line 2) | function M(e,t){var n,r=h({},e);for(n in t)s(t,n)&&(a(e[n])&&a(t[n])?(r[...
  function P (line 2) | function P(e){null!=e&&this.set(e)}
  function D (line 2) | function D(e,t,n){var r=this._calendar[e]||this._calendar.sameElse;retur...
  function R (line 2) | function R(e,t,n){var r=""+Math.abs(e),i=t-r.length;return(e>=0?n?"+":""...
  function z (line 2) | function z(e,t,n,r){var i=r;"string"===typeof r&&(i=function(){return th...
  function U (line 2) | function U(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.repl...
  function H (line 2) | function H(e){var t,n,r=e.match(I);for(t=0,n=r.length;t<n;t++)F[r[t]]?r[...
  function W (line 2) | function W(e,t){return e.isValid()?(t=Y(t,e.localeData()),B[t]=B[t]||H(t...
  function Y (line 2) | function Y(e,t){var n=5;function r(e){return t.longDateFormat(e)||e}for(...
  function q (line 2) | function q(e){var t=this._longDateFormat[e],n=this._longDateFormat[e.toU...
  function G (line 2) | function G(){return this._invalidDate}
  function Z (line 2) | function Z(e){return this._ordinal.replace("%d",e)}
  function Q (line 2) | function Q(e,t,n,r){var i=this._relativeTime[n];return j(i)?i(e,t,n,r):i...
  function ee (line 2) | function ee(e,t){var n=this._relativeTime[e>0?"future":"past"];return j(...
  function ne (line 2) | function ne(e,t){var n=e.toLowerCase();te[n]=te[n+"s"]=te[t]=e}
  function re (line 2) | function re(e){return"string"===typeof e?te[e]||te[e.toLowerCase()]:void 0}
  function ie (line 2) | function ie(e){var t,n,r={};for(n in e)s(e,n)&&(t=re(n))&&(r[t]=e[n]);re...
  function ae (line 2) | function ae(e,t){oe[e]=t}
  function se (line 2) | function se(e){var t,n=[];for(t in e)s(e,t)&&n.push({unit:t,priority:oe[...
  function ce (line 2) | function ce(e){return e%4===0&&e%100!==0||e%400===0}
  function ue (line 2) | function ue(e){return e<0?Math.ceil(e)||0:Math.floor(e)}
  function le (line 2) | function le(e){var t=+e,n=0;return 0!==t&&isFinite(t)&&(n=ue(t)),n}
  function fe (line 2) | function fe(e,t){return function(n){return null!=n?(he(this,e,n),r.updat...
  function de (line 2) | function de(e,t){return e.isValid()?e._d["get"+(e._isUTC?"UTC":"")+t]():...
  function he (line 2) | function he(e,t,n){e.isValid()&&!isNaN(n)&&("FullYear"===t&&ce(e.year())...
  function pe (line 2) | function pe(e){return j(this[e=re(e)])?this[e]():this}
  function ge (line 2) | function ge(e,t){if("object"===typeof e){var n,r=se(e=ie(e));for(n=0;n<r...
  function De (line 2) | function De(e,t,n){ye[e]=j(t)?t:function(e,r){return e&&n?n:t}}
  function Re (line 2) | function Re(e,t){return s(ye,e)?ye[e](t._strict,t._locale):new RegExp(Ie...
  function Ie (line 2) | function Ie(e){return Le(e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^...
  function Le (line 2) | function Le(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}
  function Fe (line 2) | function Fe(e,t){var n,r=t;for("string"===typeof e&&(e=[e]),l(t)&&(r=fun...
  function ze (line 2) | function ze(e,t){Fe(e,(function(e,n,r,i){r._w=r._w||{},t(e,r._w,r,i)}))}
  function Ue (line 2) | function Ue(e,t,n){null!=t&&s(Be,e)&&Be[e](t,n._a,n,e)}
  function Je (line 2) | function Je(e,t){return(e%t+t)%t}
  function Qe (line 2) | function Qe(e,t){if(isNaN(e)||isNaN(t))return NaN;var n=Je(t,12);return ...
  function ot (line 2) | function ot(e,t){return e?o(this._months)?this._months[e.month()]:this._...
  function at (line 2) | function at(e,t){return e?o(this._monthsShort)?this._monthsShort[e.month...
  function st (line 2) | function st(e,t,n){var r,i,o,a=e.toLocaleLowerCase();if(!this._monthsPar...
  function ct (line 2) | function ct(e,t,n){var r,i,o;if(this._monthsParseExact)return st.call(th...
  function ut (line 2) | function ut(e,t){var n;if(!e.isValid())return e;if("string"===typeof t)i...
  function lt (line 2) | function lt(e){return null!=e?(ut(this,e),r.updateOffset(this,!0),this):...
  function ft (line 2) | function ft(){return Qe(this.year(),this.month())}
  function dt (line 2) | function dt(e){return this._monthsParseExact?(s(this,"_monthsRegex")||pt...
  function ht (line 2) | function ht(e){return this._monthsParseExact?(s(this,"_monthsRegex")||pt...
  function pt (line 2) | function pt(){function e(e,t){return t.length-e.length}var t,n,r=[],i=[]...
  function gt (line 2) | function gt(e){return ce(e)?366:365}
  function mt (line 2) | function mt(){return ce(this.year())}
  function bt (line 2) | function bt(e,t,n,r,i,o,a){var s;return e<100&&e>=0?(s=new Date(e+400,t,...
  function vt (line 2) | function vt(e){var t,n;return e<100&&e>=0?((n=Array.prototype.slice.call...
  function xt (line 2) | function xt(e,t,n){var r=7+t-n;return-(7+vt(e,0,r).getUTCDay()-t)%7+r-1}
  function wt (line 2) | function wt(e,t,n,r,i){var o,a,s=1+7*(t-1)+(7+n-r)%7+xt(e,r,i);return s<...
  function _t (line 2) | function _t(e,t,n){var r,i,o=xt(e.year(),t,n),a=Math.floor((e.dayOfYear(...
  function kt (line 2) | function kt(e,t,n){var r=xt(e,t,n),i=xt(e+1,t,n);return(gt(e)-r+i)/7}
  function Ot (line 2) | function Ot(e){return _t(e,this._week.dow,this._week.doy).week}
  function St (line 2) | function St(){return this._week.dow}
  function Ct (line 2) | function Ct(){return this._week.doy}
  function Tt (line 2) | function Tt(e){var t=this.localeData().week(this);return null==e?t:this....
  function jt (line 2) | function jt(e){var t=_t(this,1,4).week;return null==e?t:this.add(7*(e-t)...
  function At (line 2) | function At(e,t){return"string"!==typeof e?e:isNaN(e)?"number"===typeof(...
  function Mt (line 2) | function Mt(e,t){return"string"===typeof e?t.weekdaysParse(e)%7||7:isNaN...
  function Pt (line 2) | function Pt(e,t){return e.slice(t,7).concat(e.slice(0,t))}
  function Ft (line 2) | function Ft(e,t){var n=o(this._weekdays)?this._weekdays:this._weekdays[e...
  function zt (line 2) | function zt(e){return!0===e?Pt(this._weekdaysShort,this._week.dow):e?thi...
  function Ut (line 2) | function Ut(e){return!0===e?Pt(this._weekdaysMin,this._week.dow):e?this....
  function Ht (line 2) | function Ht(e,t,n){var r,i,o,a=e.toLocaleLowerCase();if(!this._weekdaysP...
  function Wt (line 2) | function Wt(e,t,n){var r,i,o;if(this._weekdaysParseExact)return Ht.call(...
  function Yt (line 2) | function Yt(e){if(!this.isValid())return null!=e?this:NaN;var t=this._is...
  function Vt (line 2) | function Vt(e){if(!this.isValid())return null!=e?this:NaN;var t=(this.da...
  function qt (line 2) | function qt(e){if(!this.isValid())return null!=e?this:NaN;if(null!=e){va...
  function $t (line 2) | function $t(e){return this._weekdaysParseExact?(s(this,"_weekdaysRegex")...
  function Gt (line 2) | function Gt(e){return this._weekdaysParseExact?(s(this,"_weekdaysRegex")...
  function Xt (line 2) | function Xt(e){return this._weekdaysParseExact?(s(this,"_weekdaysRegex")...
  function Kt (line 2) | function Kt(){function e(e,t){return t.length-e.length}var t,n,r,i,o,a=[...
  function Zt (line 2) | function Zt(){return this.hours()%12||12}
  function Jt (line 2) | function Jt(){return this.hours()||24}
  function Qt (line 2) | function Qt(e,t){z(e,0,0,(function(){return this.localeData().meridiem(t...
  function en (line 2) | function en(e,t){return t._meridiemParse}
  function tn (line 2) | function tn(e){return"p"===(e+"").toLowerCase().charAt(0)}
  function on (line 2) | function on(e,t,n){return e>11?n?"pm":"PM":n?"am":"AM"}
  function ln (line 2) | function ln(e,t){var n,r=Math.min(e.length,t.length);for(n=0;n<r;n+=1)if...
  function fn (line 2) | function fn(e){return e?e.toLowerCase().replace("_","-"):e}
  function dn (line 2) | function dn(e){for(var t,n,r,i,o=0;o<e.length;){for(t=(i=fn(e[o]).split(...
  function hn (line 2) | function hn(t){var n=null;if(void 0===cn[t]&&"undefined"!==typeof e&&e&&...
  function pn (line 2) | function pn(e,t){var n;return e&&((n=u(t)?mn(e):gn(e,t))?an=n:"undefined...
  function gn (line 2) | function gn(e,t){if(null!==t){var n,r=sn;if(t.abbr=e,null!=cn[e])T("defi...
  function yn (line 2) | function yn(e,t){if(null!=t){var n,r,i=sn;null!=cn[e]&&null!=cn[e].paren...
  function mn (line 2) | function mn(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abb...
  function bn (line 2) | function bn(){return S(cn)}
  function vn (line 2) | function vn(e){var t,n=e._a;return n&&-2===y(e).overflow&&(t=n[Ye]<0||n[...
  function Tn (line 2) | function Tn(e){var t,n,r,i,o,a,s=e._i,c=xn.exec(s)||wn.exec(s);if(c){for...
  function jn (line 2) | function jn(e,t,n,r,i,o){var a=[An(e),tt.indexOf(t),parseInt(n,10),parse...
  function An (line 2) | function An(e){var t=parseInt(e,10);return t<=49?2e3+t:t<=999?1900+t:t}
  function Mn (line 2) | function Mn(e){return e.replace(/\([^)]*\)|[\n\t]/g," ").replace(/(\s\s+...
  function Pn (line 2) | function Pn(e,t,n){return!e||Dt.indexOf(e)===new Date(t[0],t[1],t[2]).ge...
  function Nn (line 2) | function Nn(e,t,n){if(e)return Cn[e];if(t)return 0;var r=parseInt(n,10),...
  function Dn (line 2) | function Dn(e){var t,n=Sn.exec(Mn(e._i));if(n){if(t=jn(n[4],n[3],n[2],n[...
  function Rn (line 2) | function Rn(e){var t=En.exec(e._i);null===t?(Tn(e),!1===e._isValid&&(del...
  function In (line 2) | function In(e,t,n){return null!=e?e:null!=t?t:n}
  function Ln (line 2) | function Ln(e){var t=new Date(r.now());return e._useUTC?[t.getUTCFullYea...
  function Bn (line 2) | function Bn(e){var t,n,r,i,o,a=[];if(!e._d){for(r=Ln(e),e._w&&null==e._a...
  function Fn (line 2) | function Fn(e){var t,n,r,i,o,a,s,c,u;null!=(t=e._w).GG||null!=t.W||null!...
  function zn (line 2) | function zn(e){if(e._f!==r.ISO_8601)if(e._f!==r.RFC_2822){e._a=[],y(e).e...
  function Un (line 2) | function Un(e,t,n){var r;return null==n?t:null!=e.meridiemHour?e.meridie...
  function Hn (line 2) | function Hn(e){var t,n,r,i,o,a,s=!1;if(0===e._f.length)return y(e).inval...
  function Wn (line 2) | function Wn(e){if(!e._d){var t=ie(e._i),n=void 0===t.day?t.date:t.day;e....
  function Yn (line 2) | function Yn(e){var t=new _(vn(Vn(e)));return t._nextDay&&(t.add(1,"d"),t...
  function Vn (line 2) | function Vn(e){var t=e._i,n=e._f;return e._locale=e._locale||mn(e._l),nu...
  function qn (line 2) | function qn(e){var t=e._i;u(t)?e._d=new Date(r.now()):f(t)?e._d=new Date...
  function $n (line 2) | function $n(e,t,n,r,i){var s={};return!0!==t&&!1!==t||(r=t,t=void 0),!0!...
  function Gn (line 2) | function Gn(e,t,n,r){return $n(e,t,n,r,!1)}
  function Zn (line 2) | function Zn(e,t){var n,r;if(1===t.length&&o(t[0])&&(t=t[0]),!t.length)re...
  function Jn (line 2) | function Jn(){return Zn("isBefore",[].slice.call(arguments,0))}
  function Qn (line 2) | function Qn(){return Zn("isAfter",[].slice.call(arguments,0))}
  function nr (line 2) | function nr(e){var t,n,r=!1;for(t in e)if(s(e,t)&&(-1===He.call(tr,t)||n...
  function rr (line 2) | function rr(){return this._isValid}
  function ir (line 2) | function ir(){return Cr(NaN)}
  function or (line 2) | function or(e){var t=ie(e),n=t.year||0,r=t.quarter||0,i=t.month||0,o=t.w...
  function ar (line 2) | function ar(e){return e instanceof or}
  function sr (line 2) | function sr(e){return e<0?-1*Math.round(-1*e):Math.round(e)}
  function cr (line 2) | function cr(e,t,n){var r,i=Math.min(e.length,t.length),o=Math.abs(e.leng...
  function ur (line 2) | function ur(e,t){z(e,0,0,(function(){var e=this.utcOffset(),n="+";return...
  function fr (line 2) | function fr(e,t){var n,r,i=(t||"").match(e);return null===i?null:0===(r=...
  function dr (line 2) | function dr(e,t){var n,i;return t._isUTC?(n=t.clone(),i=(k(e)||f(e)?e.va...
  function hr (line 2) | function hr(e){return-Math.round(e._d.getTimezoneOffset())}
  function pr (line 2) | function pr(e,t,n){var i,o=this._offset||0;if(!this.isValid())return nul...
  function gr (line 2) | function gr(e,t){return null!=e?("string"!==typeof e&&(e=-e),this.utcOff...
  function yr (line 2) | function yr(e){return this.utcOffset(0,e)}
  function mr (line 2) | function mr(e){return this._isUTC&&(this.utcOffset(0,e),this._isUTC=!1,e...
  function br (line 2) | function br(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if...
  function vr (line 2) | function vr(e){return!!this.isValid()&&(e=e?Gn(e).utcOffset():0,(this.ut...
  function xr (line 2) | function xr(){return this.utcOffset()>this.clone().month(0).utcOffset()|...
  function wr (line 2) | function wr(){if(!u(this._isDSTShifted))return this._isDSTShifted;var e,...
  function _r (line 2) | function _r(){return!!this.isValid()&&!this._isUTC}
  function kr (line 2) | function kr(){return!!this.isValid()&&this._isUTC}
  function Or (line 2) | function Or(){return!!this.isValid()&&this._isUTC&&0===this._offset}
  function Cr (line 2) | function Cr(e,t){var n,r,i,o=e,a=null;return ar(e)?o={ms:e._milliseconds...
  function Tr (line 2) | function Tr(e,t){var n=e&&parseFloat(e.replace(",","."));return(isNaN(n)...
  function jr (line 2) | function jr(e,t){var n={};return n.months=t.month()-e.month()+12*(t.year...
  function Ar (line 2) | function Ar(e,t){var n;return e.isValid()&&t.isValid()?(t=dr(t,e),e.isBe...
  function Mr (line 2) | function Mr(e,t){return function(n,r){var i;return null===r||isNaN(+r)||...
  function Pr (line 2) | function Pr(e,t,n,i){var o=t._milliseconds,a=sr(t._days),s=sr(t._months)...
  function Rr (line 2) | function Rr(e){return"string"===typeof e||e instanceof String}
  function Ir (line 2) | function Ir(e){return k(e)||f(e)||Rr(e)||l(e)||Br(e)||Lr(e)||null===e||v...
  function Lr (line 2) | function Lr(e){var t,n,r=a(e)&&!c(e),i=!1,o=["years","year","y","months"...
  function Br (line 2) | function Br(e){var t=o(e),n=!1;return t&&(n=0===e.filter((function(t){re...
  function Fr (line 2) | function Fr(e){var t,n,r=a(e)&&!c(e),i=!1,o=["sameDay","nextDay","lastDa...
  function zr (line 2) | function zr(e,t){var n=e.diff(t,"days",!0);return n<-6?"sameElse":n<-1?"...
  function Ur (line 2) | function Ur(e,t){1===arguments.length&&(Ir(arguments[0])?(e=arguments[0]...
  function Hr (line 2) | function Hr(){return new _(this)}
  function Wr (line 2) | function Wr(e,t){var n=k(e)?e:Gn(e);return!(!this.isValid()||!n.isValid(...
  function Yr (line 2) | function Yr(e,t){var n=k(e)?e:Gn(e);return!(!this.isValid()||!n.isValid(...
  function Vr (line 2) | function Vr(e,t,n,r){var i=k(e)?e:Gn(e),o=k(t)?t:Gn(t);return!!(this.isV...
  function qr (line 2) | function qr(e,t){var n,r=k(e)?e:Gn(e);return!(!this.isValid()||!r.isVali...
  function $r (line 2) | function $r(e,t){return this.isSame(e,t)||this.isAfter(e,t)}
  function Gr (line 2) | function Gr(e,t){return this.isSame(e,t)||this.isBefore(e,t)}
  function Xr (line 2) | function Xr(e,t,n){var r,i,o;if(!this.isValid())return NaN;if(!(r=dr(e,t...
  function Kr (line 2) | function Kr(e,t){if(e.date()<t.date())return-Kr(t,e);var n=12*(t.year()-...
  function Zr (line 2) | function Zr(){return this.clone().locale("en").format("ddd MMM DD YYYY H...
  function Jr (line 2) | function Jr(e){if(!this.isValid())return null;var t=!0!==e,n=t?this.clon...
  function Qr (line 2) | function Qr(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */...
  function ei (line 2) | function ei(e){e||(e=this.isUtc()?r.defaultFormatUtc:r.defaultFormat);va...
  function ti (line 2) | function ti(e,t){return this.isValid()&&(k(e)&&e.isValid()||Gn(e).isVali...
  function ni (line 2) | function ni(e){return this.from(Gn(),e)}
  function ri (line 2) | function ri(e,t){return this.isValid()&&(k(e)&&e.isValid()||Gn(e).isVali...
  function ii (line 2) | function ii(e){return this.to(Gn(),e)}
  function oi (line 2) | function oi(e){var t;return void 0===e?this._locale._abbr:(null!=(t=mn(e...
  function si (line 2) | function si(){return this._locale}
  function di (line 2) | function di(e,t){return(e%t+t)%t}
  function hi (line 2) | function hi(e,t,n){return e<100&&e>=0?new Date(e+400,t,n)-fi:new Date(e,...
  function pi (line 2) | function pi(e,t,n){return e<100&&e>=0?Date.UTC(e+400,t,n)-fi:Date.UTC(e,...
  function gi (line 2) | function gi(e){var t,n;if(void 0===(e=re(e))||"millisecond"===e||!this.i...
  function yi (line 2) | function yi(e){var t,n;if(void 0===(e=re(e))||"millisecond"===e||!this.i...
  function mi (line 2) | function mi(){return this._d.valueOf()-6e4*(this._offset||0)}
  function bi (line 2) | function bi(){return Math.floor(this.valueOf()/1e3)}
  function vi (line 2) | function vi(){return new Date(this.valueOf())}
  function xi (line 2) | function xi(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.m...
  function wi (line 2) | function wi(){var e=this;return{years:e.year(),months:e.month(),date:e.d...
  function _i (line 2) | function _i(){return this.isValid()?this.toISOString():null}
  function ki (line 2) | function ki(){return m(this)}
  function Oi (line 2) | function Oi(){return h({},y(this))}
  function Ei (line 2) | function Ei(){return y(this).overflow}
  function Si (line 2) | function Si(){return{input:this._i,format:this._f,locale:this._locale,is...
  function Ci (line 2) | function Ci(e,t){var n,i,o,a=this._eras||mn("en")._eras;for(n=0,i=a.leng...
  function Ti (line 2) | function Ti(e,t,n){var r,i,o,a,s,c=this.eras();for(e=e.toUpperCase(),r=0...
  function ji (line 2) | function ji(e,t){var n=e.since<=e.until?1:-1;return void 0===t?r(e.since...
  function Ai (line 2) | function Ai(){var e,t,n,r=this.localeData().eras();for(e=0,t=r.length;e<...
  function Mi (line 2) | function Mi(){var e,t,n,r=this.localeData().eras();for(e=0,t=r.length;e<...
  function Pi (line 2) | function Pi(){var e,t,n,r=this.localeData().eras();for(e=0,t=r.length;e<...
  function Ni (line 2) | function Ni(){var e,t,n,i,o=this.localeData().eras();for(e=0,t=o.length;...
  function Di (line 2) | function Di(e){return s(this,"_erasNameRegex")||Ui.call(this),e?this._er...
  function Ri (line 2) | function Ri(e){return s(this,"_erasAbbrRegex")||Ui.call(this),e?this._er...
  function Ii (line 2) | function Ii(e){return s(this,"_erasNarrowRegex")||Ui.call(this),e?this._...
  function Li (line 2) | function Li(e,t){return t.erasAbbrRegex(e)}
  function Bi (line 2) | function Bi(e,t){return t.erasNameRegex(e)}
  function Fi (line 2) | function Fi(e,t){return t.erasNarrowRegex(e)}
  function zi (line 2) | function zi(e,t){return t._eraYearOrdinalRegex||Te}
  function Ui (line 2) | function Ui(){var e,t,n=[],r=[],i=[],o=[],a=this.eras();for(e=0,t=a.leng...
  function Hi (line 2) | function Hi(e,t){z(0,[e,e.length],0,t)}
  function Wi (line 2) | function Wi(e){return Xi.call(this,e,this.week(),this.weekday(),this.loc...
  function Yi (line 2) | function Yi(e){return Xi.call(this,e,this.isoWeek(),this.isoWeekday(),1,4)}
  function Vi (line 2) | function Vi(){return kt(this.year(),1,4)}
  function qi (line 2) | function qi(){return kt(this.isoWeekYear(),1,4)}
  function $i (line 2) | function $i(){var e=this.localeData()._week;return kt(this.year(),e.dow,...
  function Gi (line 2) | function Gi(){var e=this.localeData()._week;return kt(this.weekYear(),e....
  function Xi (line 2) | function Xi(e,t,n,r,i){var o;return null==e?_t(this,r,i).year:(t>(o=kt(e...
  function Ki (line 2) | function Ki(e,t,n,r,i){var o=wt(e,t,n,r,i),a=vt(o.year,0,o.dayOfYear);re...
  function Zi (line 2) | function Zi(e){return null==e?Math.ceil((this.month()+1)/3):this.month(3...
  function Qi (line 2) | function Qi(e){var t=Math.round((this.clone().startOf("day")-this.clone(...
  function io (line 2) | function io(e,t){t[Xe]=le(1e3*("0."+e))}
  function oo (line 2) | function oo(){return this._isUTC?"UTC":""}
  function ao (line 2) | function ao(){return this._isUTC?"Coordinated Universal Time":""}
  function co (line 2) | function co(e){return Gn(1e3*e)}
  function uo (line 2) | function uo(){return Gn.apply(null,arguments).parseZone()}
  function lo (line 2) | function lo(e){return e}
  function ho (line 2) | function ho(e,t,n,r){var i=mn(),o=p().set(r,t);return i[n](o,e)}
  function po (line 2) | function po(e,t,n){if(l(e)&&(t=e,e=void 0),e=e||"",null!=t)return ho(e,t...
  function go (line 2) | function go(e,t,n,r){"boolean"===typeof e?(l(t)&&(n=t,t=void 0),t=t||"")...
  function yo (line 2) | function yo(e,t){return po(e,t,"months")}
  function mo (line 2) | function mo(e,t){return po(e,t,"monthsShort")}
  function bo (line 2) | function bo(e,t,n){return go(e,t,n,"weekdays")}
  function vo (line 2) | function vo(e,t,n){return go(e,t,n,"weekdaysShort")}
  function xo (line 2) | function xo(e,t,n){return go(e,t,n,"weekdaysMin")}
  function _o (line 2) | function _o(){var e=this._data;return this._milliseconds=wo(this._millis...
  function ko (line 2) | function ko(e,t,n,r){var i=Cr(t,n);return e._milliseconds+=r*i._millisec...
  function Oo (line 2) | function Oo(e,t){return ko(this,e,t,1)}
  function Eo (line 2) | function Eo(e,t){return ko(this,e,t,-1)}
  function So (line 2) | function So(e){return e<0?Math.floor(e):Math.ceil(e)}
  function Co (line 2) | function Co(){var e,t,n,r,i,o=this._milliseconds,a=this._days,s=this._mo...
  function To (line 2) | function To(e){return 4800*e/146097}
  function jo (line 2) | function jo(e){return 146097*e/4800}
  function Ao (line 2) | function Ao(e){if(!this.isValid())return NaN;var t,n,r=this._millisecond...
  function Mo (line 2) | function Mo(){return this.isValid()?this._milliseconds+864e5*this._days+...
  function Po (line 2) | function Po(e){return function(){return this.as(e)}}
  function Ho (line 2) | function Ho(){return Cr(this)}
  function Wo (line 2) | function Wo(e){return e=re(e),this.isValid()?this[e+"s"]():NaN}
  function Yo (line 2) | function Yo(e){return function(){return this.isValid()?this._data[e]:NaN}}
  function Jo (line 2) | function Jo(){return ue(this.days()/7)}
  function ta (line 2) | function ta(e,t,n,r,i){return i.relativeTime(t||1,!!n,e,r)}
  function na (line 2) | function na(e,t,n,r){var i=Cr(e).abs(),o=Qo(i.as("s")),a=Qo(i.as("m")),s...
  function ra (line 2) | function ra(e){return void 0===e?Qo:"function"===typeof e&&(Qo=e,!0)}
  function ia (line 2) | function ia(e,t){return void 0!==ea[e]&&(void 0===t?ea[e]:(ea[e]=t,"s"==...
  function oa (line 2) | function oa(e,t){if(!this.isValid())return this.localeData().invalidDate...
  function sa (line 2) | function sa(e){return(e>0)-(e<0)||+e}
  function ca (line 2) | function ca(){if(!this.isValid())return this.localeData().invalidDate();...
  function o (line 2) | function o(e,t,n,a){function s(t){return e(t=0===arguments.length?new Da...
  function r (line 2) | function r(){}
  function i (line 2) | function i(e,t){return function(n){return e+n*t}}
  function o (line 2) | function o(e,t){var n=t-e;return n?i(e,n>180||n<-180?n-360*Math.round(n/...
  function a (line 2) | function a(e){return 1===(e=+e)?s:function(t,n){return n-t?function(e,t,...
  function s (line 2) | function s(e,t){var n=t-e;return n?i(e,n):Object(r.a)(isNaN(e)?t:e)}
  function o (line 2) | function o(e){return Object(r.a)((function(t){t.setDate(t.getDate()-(t.g...
  function o (line 2) | function o(e){return Object(r.a)((function(t){t.setUTCDate(t.getUTCDate(...
  function o (line 2) | function o(e,t){return Object(r.a)(e)||function(e,t){if(Symbol.iterator ...
  function i (line 2) | function i(e,t){var n;if("undefined"===typeof Symbol||null==e[Symbol.ite...
  function i (line 2) | function i(){}
  function b (line 2) | function b(){return this.rgb().formatHex()}
  function v (line 2) | function v(){return this.rgb().formatRgb()}
  function x (line 2) | function x(e){var t,n;return e=(e+"").trim().toLowerCase(),(t=l.exec(e))...
  function w (line 2) | function w(e){return new E(e>>16&255,e>>8&255,255&e,1)}
  function _ (line 2) | function _(e,t,n,r){return r<=0&&(e=t=n=NaN),new E(e,t,n,r)}
  function k (line 2) | function k(e){return e instanceof i||(e=x(e)),e?new E((e=e.rgb()).r,e.g,...
  function O (line 2) | function O(e,t,n,r){return 1===arguments.length?k(e):new E(e,t,n,null==r...
  function E (line 2) | function E(e,t,n,r){this.r=+e,this.g=+t,this.b=+n,this.opacity=+r}
  function S (line 2) | function S(){return"#"+T(this.r)+T(this.g)+T(this.b)}
  function C (line 2) | function C(){var e=this.opacity;return(1===(e=isNaN(e)?1:Math.max(0,Math...
  function T (line 2) | function T(e){return((e=Math.max(0,Math.min(255,Math.round(e)||0)))<16?"...
  function j (line 2) | function j(e,t,n,r){return r<=0?e=t=n=NaN:n<=0||n>=1?e=t=NaN:t<=0&&(e=Na...
  function A (line 2) | function A(e){if(e instanceof P)return new P(e.h,e.s,e.l,e.opacity);if(e...
  function M (line 2) | function M(e,t,n,r){return 1===arguments.length?A(e):new P(e,t,n,null==r...
  function P (line 2) | function P(e,t,n,r){this.h=+e,this.s=+t,this.l=+n,this.opacity=+r}
  function N (line 2) | function N(e,t,n){return 255*(e<60?t+(n-t)*e/60:e<180?n:e<240?t+(n-t)*(2...
  function s (line 2) | function s(e,t){var n=function(t,n){return o.a.createElement(a.a,Object(...
  function r (line 2) | function r(e){return e&&e.ownerDocument||document}
  function o (line 2) | function o(e){var t=r.useRef(e);return i((function(){t.current=e})),r.us...
  function a (line 2) | function a(){var e=Object(r.useContext)(i);return function(e){if(!e)thro...
  function x (line 2) | function x(e){return function(t,n){var r=e((t=Object(v.f)(t)).h,(n=Objec...
  function O (line 2) | function O(e,t){var n=Object(u.a)((e=Object(k.a)(e)).l,(t=Object(k.a)(t)...
  function E (line 2) | function E(e){return function(t,n){var r=e((t=Object(k.c)(t)).h,(n=Objec...
  function j (line 2) | function j(e,t){for(var n=0,r=t.length-1,i=t[0],o=new Array(r<0?0:r);n<r...
  function r (line 2) | function r(e,t){e&&o.hasOwnProperty(e.type)&&o[e.type](e,t)}
  function a (line 2) | function a(e,t,n){var r,i=-1,o=e.length-n;for(t.lineStart();++i<o;)r=e[i...
  function s (line 2) | function s(e,t){var n=-1,r=e.length;for(t.polygonStart();++n<r;)a(e[n],t...
  function i (line 2) | function i(){}
  function o (line 2) | function o(e,t){var n=new i;if(e instanceof i)e.each((function(e,t){n.se...
  function o (line 2) | function o(n,i,s,c){if(i>=r.length)return null!=e&&n.sort(e),null!=t?t(n...
  function s (line 2) | function s(e,n){if(++n>r.length)return e;var o,a=i[n-1];return null!=t&&...
  function c (line 2) | function c(){return{}}
  function u (line 2) | function u(e,t,n){e[t]=n}
  function l (line 2) | function l(){return a()}
  function f (line 2) | function f(e,t,n){e.set(t,n)}
  function d (line 2) | function d(){}
  function p (line 2) | function p(e,t){var n=new d;if(e instanceof d)e.each((function(e){n.add(...
  function r (line 2) | function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.const...
  function r (line 2) | function r(){return 0}
  function o (line 2) | function o(e,t,n,i){var o;do{o=r.uniqueId(i)}while(e.hasNode(o));return ...
  function a (line 2) | function a(e){return r.max(r.map(e.nodes(),(function(t){var n=e.node(t)....
  function u (line 2) | function u(e){this._curve=e}
  function l (line 2) | function l(e){function t(t){return new u(e(t))}return t._curve=e,t}
  function f (line 2) | function f(e){var t=e.curve;return e.angle=e.x,delete e.x,e.radius=e.y,d...
  function r (line 2) | function r(){var r;if(n||(n=r=Object(y.a)()),e.apply(this,arguments).dra...
  function F (line 2) | function F(e,t,n){e._context.bezierCurveTo((2*e._x0+e._x1)/3,(2*e._y0+e....
  function z (line 2) | function z(e){this._context=e}
  function H (line 2) | function H(e){this._context=e}
  function Y (line 2) | function Y(e){this._context=e}
  function q (line 2) | function q(e,t){this._basis=new z(e),this._beta=t}
  function n (line 2) | function n(e){return 1===t?new z(e):new q(e,t)}
  function G (line 2) | function G(e,t,n){e._context.bezierCurveTo(e._x1+e._k*(e._x2-e._x0),e._y...
  function X (line 2) | function X(e,t){this._context=e,this._k=(1-t)/6}
  function n (line 2) | function n(e){return new X(e,t)}
  function Z (line 2) | function Z(e,t){this._context=e,this._k=(1-t)/6}
  function n (line 2) | function n(e){return new Z(e,t)}
  function Q (line 2) | function Q(e,t){this._context=e,this._k=(1-t)/6}
  function n (line 2) | function n(e){return new Q(e,t)}
  function te (line 2) | function te(e,t,n){var r=e._x1,i=e._y1,o=e._x2,a=e._y2;if(e._l01_a>m.f){...
  function ne (line 2) | function ne(e,t){this._context=e,this._alpha=t}
  function n (line 2) | function n(e){return t?new ne(e,t):new X(e,0)}
  function ie (line 2) | function ie(e,t){this._context=e,this._alpha=t}
  function n (line 2) | function n(e){return t?new ie(e,t):new Z(e,0)}
  function ae (line 2) | function ae(e,t){this._context=e,this._alpha=t}
  function n (line 2) | function n(e){return t?new ae(e,t):new Q(e,0)}
  function ce (line 2) | function ce(e){this._context=e}
  function le (line 2) | function le(e){return e<0?-1:1}
  function fe (line 2) | function fe(e,t,n){var r=e._x1-e._x0,i=t-e._x1,o=(e._y1-e._y0)/(r||i<0&&...
  function de (line 2) | function de(e,t){var n=e._x1-e._x0;return n?(3*(e._y1-e._y0)/n-t)/2:t}
  function he (line 2) | function he(e,t,n){var r=e._x0,i=e._y0,o=e._x1,a=e._y1,s=(o-r)/3;e._cont...
  function pe (line 2) | function pe(e){this._context=e}
  function ge (line 2) | function ge(e){this._context=new ye(e)}
  function ye (line 2) | function ye(e){this._context=e}
  function me (line 2) | function me(e){return new pe(e)}
  function be (line 2) | function be(e){return new ge(e)}
  function ve (line 2) | function ve(e){this._context=e}
  function xe (line 2) | function xe(e){var t,n,r=e.length-1,i=new Array(r),o=new Array(r),a=new ...
  function _e (line 2) | function _e(e,t){this._context=e,this._t=t}
  function Oe (line 2) | function Oe(e){return new _e(e,0)}
  function Ee (line 2) | function Ee(e){return new _e(e,1)}
  function je (line 2) | function je(e,t){return e[t]}
  function i (line 2) | function i(i){var o,a,s=e.apply(this,arguments),c=i.length,u=s.length,l=...
  function Ie (line 2) | function Ie(e){for(var t,n=-1,r=0,i=e.length,o=-1/0;++n<i;)(t=+e[n][1])>...
  function Be (line 2) | function Be(e){for(var t,n=0,r=-1,i=e.length;++r<i;)(t=+e[r][1])&&(n+=t)...
  function r (line 2) | function r(e,t){if(null==e)return{};var n,r,i={},o=Object.keys(e);for(r=...
  function o (line 2) | function o(){return Object(r.a)()||i.a}
  function n (line 2) | function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{...
  function n (line 2) | function n(e,t){for(var n=0,r=e.length-1;r>=0;r--){var i=e[r];"."===i?e....
  function r (line 2) | function r(e,t){if(e.filter)return e.filter(t);for(var n=[],r=0;r<e.leng...
  function r (line 2) | function r(e){for(var t=0;t<e.length&&""===e[t];t++);for(var n=e.length-...
  function o (line 2) | function o(){throw new Error("setTimeout has not been defined")}
  function a (line 2) | function a(){throw new Error("clearTimeout has not been defined")}
  function s (line 2) | function s(e){if(n===setTimeout)return setTimeout(e,0);if((n===o||!n)&&s...
  function d (line 2) | function d(){l&&c&&(l=!1,c.length?u=c.concat(u):f=-1,u.length&&h())}
  function h (line 2) | function h(){if(!l){var e=s(d);l=!0;for(var t=u.length;t;){for(c=u,u=[];...
  function p (line 2) | function p(e,t){this.fun=e,this.array=t}
  function g (line 2) | function g(){}
  function r (line 2) | function r(e,t){return e*t>0}
  function c (line 2) | function c(e,t,n,r){return e.insert("polygon",":first-child").attr("poin...
  function O (line 2) | function O(e){var t;switch(e){case 0:t="aggregation";break;case 1:t="ext...
  function v (line 2) | function v(){var e;return"number"!==typeof(e=r.pop()||p.lex()||d)&&(e in...
  function M (line 2) | function M(){this.yy={}}
  function v (line 2) | function v(){var e;return"number"!==typeof(e=r.pop()||p.lex()||d)&&(e in...
  function g (line 2) | function g(){this.yy={}}
  function o (line 2) | function o(e,t,n){var r=.9*(t.width+t.height),o=[{x:r/2,y:0},{x:r,y:-r/2...
  function a (line 2) | function a(e,t,n){var r=t.height,o=r/4,a=t.width+2*o,s=[{x:o,y:0},{x:a-o...
  function s (line 2) | function s(e,t,n){var r=t.width,o=t.height,a=[{x:-o/2,y:0},{x:r,y:0},{x:...
  function c (line 2) | function c(e,t,n){var r=t.width,o=t.height,a=[{x:-2*o/6,y:0},{x:r-o/6,y:...
  function u (line 2) | function u(e,t,n){var r=t.width,o=t.height,a=[{x:2*o/6,y:0},{x:r+o/6,y:0...
  function l (line 2) | function l(e,t,n){var r=t.width,o=t.height,a=[{x:-2*o/6,y:0},{x:r+2*o/6,...
  function f (line 2) | function f(e,t,n){var r=t.width,o=t.height,a=[{x:o/6,y:0},{x:r-o/6,y:0},...
  function d (line 2) | function d(e,t,n){var r=t.width,o=t.height,a=[{x:0,y:0},{x:r+o/2,y:0},{x...
  function h (line 2) | function h(e,t,n){var r=t.height,o=t.width+r/4,a=e.insert("rect",":first...
  function p (line 2) | function p(e,t,n){var r=t.width,o=t.height,a=[{x:0,y:0},{x:r,y:0},{x:r,y...
  function g (line 2) | function g(e,t,n){var r=t.width,o=r/2,a=o/(2.5+r/50),s=t.height+a,c="M 0...
  function y (line 2) | function y(e){e.shapes().question=o,e.shapes().hexagon=a,e.shapes().stad...
  function m (line 2) | function m(e){e({question:o}),e({hexagon:a}),e({stadium:h}),e({subroutin...
  function b (line 2) | function b(e,t,n,r){return e.insert("polygon",":first-child").attr("poin...
  function u (line 2) | function u(e){return u="function"===typeof Symbol&&"symbol"===typeof Sym...
  function v (line 2) | function v(){var e;return"number"!==typeof(e=r.pop()||p.lex()||d)&&(e in...
  function Xe (line 2) | function Xe(){this.yy={}}
  function l (line 2) | function l(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new ...
  function se (line 2) | function se(e,t,n){for(var r=!0;r;)r=!1,n.forEach((function(n){var i=new...
  function m (line 2) | function m(e,t){return function(e){for(var t=e.length,n={};t;)n[e[--t]]=...
  function v (line 2) | function v(){var e;return"number"!==typeof(e=r.pop()||p.lex()||d)&&(e in...
  function m (line 2) | function m(){this.yy={}}
  function f (line 2) | function f(){return Object(i.random)({length:7})}
  function d (line 2) | function d(e,t){for(r.logger.debug("Entering isfastforwardable:",e.id,t....
  function _ (line 2) | function _(e,t,n){var r=e.indexOf(t);-1===r?e.push(n):e.splice(r,1,n)}
  function k (line 2) | function k(e){var t=e.reduce((function(e,t){return e.seq>t.seq?e:t}),e[0...
  function p (line 2) | function p(e,t,n,r){var o=Object(u.interpolateToCurve)(r,i.curveBasis),a...
  function g (line 2) | function g(e,t){t=t||e.node().getBBox();var n=e.node().getCTM();return{l...
  function y (line 2) | function y(e,t,n,r,i){c.logger.debug("svgDrawLineForCommits: ",t,n);var ...
  function m (line 2) | function m(e,t){return e.select(t).node().cloneNode(!0)}
  function b (line 2) | function b(e,t,n,i){var o,a=Object.keys(l).length;if("string"===typeof t...
  function v (line 2) | function v(e,t,n,r){for(r=r||0;t.seq>0&&!t.lineDrawn;)"string"===typeof ...
  function v (line 2) | function v(){var e;return"number"!==typeof(e=r.pop()||p.lex()||d)&&(e in...
  function u (line 2) | function u(){this.yy={}}
  function v (line 2) | function v(){var e;return"number"!==typeof(e=r.pop()||p.lex()||d)&&(e in...
  function i (line 2) | function i(){this.yy={}}
  function v (line 2) | function v(){var e;return"number"!==typeof(e=r.pop()||p.lex()||d)&&(e in...
  function h (line 2) | function h(){this.yy={}}
  function v (line 2) | function v(){var e;return"number"!==typeof(e=r.pop()||p.lex()||d)&&(e in...
  function A (line 2) | function A(){this.yy={}}
  function a (line 2) | function a(a){return function(s){o++;var c=i.sequenceItems.length-o+1;i....
  function x (line 2) | function x(e,t,n,r,i){d.bumpVerticalPos(n);var a=r;if(t.id&&t.message&&e...
  function e (line 2) | function e(e,t,n,r,o,a,s){i(t.append("text").attr("x",n+o/2).attr("y",r+...
  function t (line 2) | function t(e,t,n,o,a,s,c,u){for(var l=u.actorFontSize,f=u.actorFontFamil...
  function n (line 2) | function n(e,n,r,o,a,s,c,u){var l=n.append("switch"),f=l.append("foreign...
  function i (line 2) | function i(e,t){for(var n in t)t.hasOwnProperty(n)&&e.attr(n,t[n])}
  function v (line 2) | function v(){var e;return"number"!==typeof(e=r.pop()||p.lex()||d)&&(e in...
  function E (line 2) | function E(){this.yy={}}
  function s (line 2) | function s(e){return s="function"===typeof Symbol&&"symbol"===typeof Sym...
  function o (line 2) | function o(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new ...
  function v (line 2) | function v(){var e;return"number"!==typeof(e=r.pop()||p.lex()||d)&&(e in...
  function f (line 2) | function f(){this.yy={}}
  function e (line 2) | function e(e,t,n,i,o,a,s,c){r(t.append("text").attr("x",n+o/2).attr("y",...
  function t (line 2) | function t(e,t,n,i,o,a,s,c,u){for(var l=c.taskFontSize,f=c.taskFontFamil...
  function n (line 2) | function n(e,n,i,o,a,s,c,u){var l=n.append("switch"),f=l.append("foreign...
  function r (line 2) | function r(e,t){for(var n in t)n in t&&e.attr(n,t[n])}
  function ne (line 2) | function ne(e){return ne="function"===typeof Symbol&&"symbol"===typeof S...
  function se (line 2) | function se(e){P.default.setConf(e.git),u.default.setConf(e.flowchart),l...
  function ce (line 2) | function ce(){}
  function o (line 2) | function o(e){return o="function"===typeof Symbol&&"symbol"===typeof Sym...
  function a (line 2) | function a(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function e (line 2) | function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Ca...
  function o (line 2) | function o(e){return o="function"===typeof Symbol&&"symbol"===typeof Sym...
  function a (line 2) | function a(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function e (line 2) | function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Ca...
  function o (line 2) | function o(e){return o="function"===typeof Symbol&&"symbol"===typeof Sym...
  function a (line 2) | function a(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function e (line 2) | function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Ca...
  function o (line 2) | function o(e){return o="function"===typeof Symbol&&"symbol"===typeof Sym...
  function a (line 2) | function a(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function e (line 2) | function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Ca...
  function o (line 2) | function o(e){return o="function"===typeof Symbol&&"symbol"===typeof Sym...
  function a (line 2) | function a(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function e (line 2) | function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Ca...
  function c (line 2) | function c(e){return c="function"===typeof Symbol&&"symbol"===typeof Sym...
  function u (line 2) | function u(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new ...
  function r (line 2) | function r(){this.reset()}
  function o (line 2) | function o(e,t,n){var r=e.s=t+n,i=r-t,o=r-i;e.t=t-o+(n-i)}
  function r (line 2) | function r(e,t){var n=Object.create(e.prototype);for(var r in t)n[r]=t[r...
  function o (line 2) | function o(e){return"[object Array]"===i.call(e)}
  function a (line 2) | function a(e){return"undefined"===typeof e}
  function s (line 2) | function s(e){return null!==e&&"object"===typeof e}
  function c (line 2) | function c(e){if("[object Object]"!==i.call(e))return!1;var t=Object.get...
  function u (line 2) | function u(e){return"[object Function]"===i.call(e)}
  function l (line 2) | function l(e,t){if(null!==e&&"undefined"!==typeof e)if("object"!==typeof...
  function n (line 2) | function n(n,r){c(t[r])&&c(n)?t[r]=e(t[r],n):c(n)?t[r]=e({},n):o(n)?t[r]...
  function a (line 2) | function a(){return o}
  function c (line 2) | function c(e,t){var n="function"===typeof Symbol&&e[Symbol.iterator];if(...
  function u (line 2) | function u(e){return e.current?Object(r.h)(e.current):"<unknown>"}
  function f (line 2) | function f(){var e=c(Object(i.useState)(0),2)[1];return Object(i.useCall...
  function h (line 2) | function h(e,t,n){if(void 0===t&&(t="observed"),void 0===n&&(n=d),a())re...
  function p (line 2) | function p(e,t){if(a())return e;var n,r,o,c=s({forwardRef:!1},t),u=e.dis...
  function y (line 2) | function y(e){var t=e.children,n=e.render,r=t||n;return"function"!==type...
  function m (line 2) | function m(e,t,n,r,i){var o="children"===t?"render":"children",a="functi...
  function r (line 2) | function r(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function i (line 2) | function i(e,t,n){return t&&r(e.prototype,t),n&&r(e,n),e}
  function o (line 2) | function o(){return r.useContext(i.a)}
  function i (line 2) | function i(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new ...
  function r (line 2) | function r(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=...
  function o (line 2) | function o(e){return e?String(e).replace(i,"\\:"):""}
  function r (line 2) | function r(e){var t=e.props,n=e.states,r=e.muiFormControl;return n.reduc...
  function r (line 2) | function r(e,t){"function"===typeof e?e(t):e&&(e.current=t)}
  function a (line 2) | function a(e){return"".concat(Math.round(e),"ms")}
  function u (line 2) | function u(e){return r=Object(c.a)(e),i=r.format,o=r.parse,a=r.utcFormat...
  function r (line 2) | function r(e){return r="function"===typeof Symbol&&"symbol"===typeof Sym...
  function f (line 2) | function f(t){var n=arguments.length>1&&void 0!==arguments[1]&&arguments...
  function r (line 2) | function r(e){if(void 0===e)throw new ReferenceError("this hasn't been i...
  function o (line 2) | function o(){return r.useContext(i)}
  function r (line 2) | function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a ...
  function r (line 2) | function r(e){var t,n=arguments.length>1&&void 0!==arguments[1]?argument...
  function r (line 2) | function r(e,t){if((n=(e=t?e.toExponential(t-1):e.toExponential()).index...
  function r (line 2) | function r(e){return e[0]}
  function i (line 2) | function i(e){return e[1]}
  function r (line 2) | function r(e){this._context=e}
  function i (line 2) | function i(e){var t=e.controlled,n=e.default,i=(e.name,e.state,r.useRef(...
  function r (line 2) | function r(e){return ArrayBuffer.isView(e)&&!(e instanceof DataView)}
  function i (line 2) | function i(e,t){var n=e.timeout,r=e.style,i=void 0===r?{}:r;return{durat...
  function r (line 2) | function r(e){return e&&e.__esModule?e.default:e}
  function s (line 2) | function s(e){return function(t){var n,i,o=t.length,a=new Array(o),s=new...
  function i (line 2) | function i(e,t){var i=n((e=Object(r.g)(e)).r,(t=Object(r.g)(t)).r),o=n(e...
  function a (line 2) | function a(e,t,n,o,a,s){for(var c,u,l,f,d,h,p,g,y,m,b,v=[],x=t.children,...
  function n (line 2) | function n(e,n,r,i,o){a(t,e,n,r,i,o)}
  function r (line 2) | function r(e){var t=0,n=e.children,r=n&&n.length;if(r)for(;--r>=0;)t+=n[...
  function i (line 2) | function i(e,t){var n,r,i,a,u,l=new c(e),f=+e.value&&(l.value=e.value),d...
  function o (line 2) | function o(e){return e.children}
  function a (line 2) | function a(e){e.data=e.data.data}
  function s (line 2) | function s(e){var t=0;do{e.height=t}while((e=e.parent)&&e.height<++t)}
  function c (line 2) | function c(e){this.data=e,this.depth=this.height=0,this.parent=null}
  function r (line 2) | function r(e){return null==e?null:i(e)}
  function i (line 2) | function i(e){if("function"!==typeof e)throw new Error;return e}
  function r (line 2) | function r(e){return null!=e&&!(Array.isArray(e)&&0===e.length)}
  function i (line 2) | function i(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments...
  function o (line 2) | function o(e){return e.startAdornment}
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function p (line 2) | function p(e){var t=e.animatedProps,n=function(e,t){var n={};for(var r i...
  function t (line 2) | function t(e){!function(e,t){if(!(e instanceof t))throw new TypeError("C...
  function O (line 2) | function O(e){var t=Object(v.c)(),n=[],r=k;function i(i){var o=i+"",a=t....
  function E (line 2) | function E(){var e,t,n=O().unknown(void 0),r=n.domain,i=n.range,o=[0,1],...
  function S (line 2) | function S(e){var t=e.copy;return e.padding=e.paddingOuter,delete e.padd...
  function P (line 2) | function P(e,t){return(t-=e=+e)?function(n){return(n-e)/t}:j(t)}
  function N (line 2) | function N(e,t,n,r){var i=e[0],o=e[1],a=t[0],s=t[1];return o<i?(i=n(o,i)...
  function D (line 2) | function D(e,t,n,r){var i=Math.min(e.length,t.length)-1,o=new Array(i),a...
  function R (line 2) | function R(e,t){return t.domain(e.domain()).range(e.range()).interpolate...
  function I (line 2) | function I(e,t){var n,r,i,o=M,a=M,s=c.a,u=!1;function l(){return n=Math....
  function H (line 2) | function H(e){var t=e.domain;return e.ticks=function(e){var n=t();return...
  function W (line 2) | function W(){var e=I(P,C.a);return e.copy=function(){return R(e,W())},H(e)}
  function V (line 2) | function V(e,t){return(t=Math.log(t/e))?function(n){return Math.log(n/e)...
  function q (line 2) | function q(e,t){return e<0?function(n){return-Math.pow(-t,n)*Math.pow(-e...
  function $ (line 2) | function $(e){return isFinite(e)?+("1e"+e):e<0?0:e}
  function G (line 2) | function G(e){return 10===e?$:e===Math.E?Math.exp:function(t){return Mat...
  function X (line 2) | function X(e){return e===Math.E?Math.log:10===e&&Math.log10||2===e&&Math...
  function K (line 2) | function K(e){return function(t){return-e(-t)}}
  function Z (line 2) | function Z(e,t){return e<0?-Math.pow(-e,t):Math.pow(e,t)}
  function J (line 2) | function J(){var e=1,t=I((function(t,n){return(n=Z(n,e)-(t=Z(t,e)))?func...
  function Q (line 2) | function Q(){return J().exponent(.5)}
  function ge (line 2) | function ge(e){return new Date(e)}
  function ye (line 2) | function ye(e){return e instanceof Date?+e:+new Date(+e)}
  function me (line 2) | function me(e,t,n,r,i,o,a,s,c){var u=I(P,C.a),l=u.invert,f=u.domain,d=c(...
  function Ce (line 2) | function Ce(e){var t=e.length;return function(n){return e[Math.max(0,Mat...
  function Ae (line 2) | function Ae(e){return"[object Date]"===Object.prototype.toString.call(e)...
  function De (line 2) | function De(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.le...
  function Re (line 2) | function Re(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enum...
  function a (line 2) | function a(){return i=X(r),o=G(r),n()[0]<0&&(i=K(i),o=K(o)),t}
  function We (line 2) | function We(e){return""+e[0].toUpperCase()+e.slice(1)}
  function Ye (line 2) | function Ye(e){if(!e)return null;var t=e.type,n=e.domain,r=e.range,i=n[0...
  function Ve (line 2) | function Ve(e,t,n,r){var i=e.reduce((function(e,r){var i=t(r),o=n(r);ret...
  function qe (line 2) | function qe(e,t,n,r,i){return n===Fe?{type:Fe,domain:[],range:[t],distan...
  function $e (line 2) | function $e(e,t){var n=t.domain,r=t.type,i=t.accessor,o=t.accessor0,a=fu...
  function Ge (line 2) | function Ge(e,t){var n=function(e,t){var n,r=e[t],i=e["_"+t+"Value"],o=e...
  function Xe (line 2) | function Xe(e,t){return Ye(Ge(e,t))}
  function Ke (line 2) | function Ke(e,t){return t(e.data?e.data:e)}
  function Ze (line 2) | function Ze(e){return"undefined"!==typeof e}
  function Je (line 2) | function Je(e,t){var n=Ge(e,t);if(n){var r=Ye(n);return function(e){retu...
  function Qe (line 2) | function Qe(e,t){var n=Ge(e,t);if(n){var r=n.domain,i=n.baseValue,o=void...
  function et (line 2) | function et(e,t){var n=Ge(e,t);return n?(n.isValue||void 0!==e["_"+t+"Va...
  function tt (line 2) | function tt(e){var t;return Re(t={},"_"+e+"Value",i.a.any),Re(t,e+"Domai...
  function nt (line 2) | function nt(e,t){var n={};return Object.keys(e).forEach((function(r){t.f...
  function rt (line 2) | function rt(e,t,n){var r={};return n.forEach((function(n){e["get"+We(n)]...
  function it (line 2) | function it(e){function t(t){return void 0===t?e:t}function n(){return t...
  function ot (line 2) | function ot(e){return e?Object(Te.f)(e).l>.57?"#222":"#fff":null}
  function at (line 2) | function at(e,t){var n=He.reduce((function(t,n){var r=e[n+"Domain"],i=e[...
  function ct (line 2) | function ct(e){return Object.keys(e).reduce((function(t,n){return st.eve...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function ft (line 2) | function ft(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function dt (line 2) | function dt(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){var e,n,r;ft(this,t);for(var i=arguments.length,o=Array(i),...
  function kt (line 2) | function kt(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enum...
  function Ot (line 2) | function Ot(e){return e.type.prototype instanceof gt}
  function Et (line 2) | function Et(e){return s.a.Children.toArray(e).filter((function(e){return...
  function St (line 2) | function St(e,t){var n=e.some((function(e){return e&&e.props.stack})),r=...
  function Ct (line 2) | function Ct(e){var t=[],n=function(e){var t={};return e.filter(Ot).forEa...
  function Tt (line 2) | function Tt(e){return e.reduce((function(e,t){return Math.max(t.radius,e...
  function At (line 2) | function At(e){var t=e._stackBy,n=e.valuePosAttr,r=e.cluster,i=e.sameTyp...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function Lt (line 2) | function Lt(e){var t=e.radius,n=e.angle,r=e.angle0,i=-1*n+Math.PI/2,o=-1...
  function t (line 2) | function t(e){!function(e,t){if(!(e instanceof t))throw new TypeError("C...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function Yt (line 2) | function Yt(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function Vt (line 2) | function Vt(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return Yt(this,t),Vt(this,(t.__proto__||Object.getPrototype...
  function en (line 2) | function en(e){var t=e.marginTop,n=e.marginBottom,r=e.marginLeft,i=e.mar...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function nn (line 2) | function nn(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function rn (line 2) | function rn(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return nn(this,t),rn(this,(t.__proto__||Object.getPrototype...
  function cn (line 2) | function cn(e){return e<700?e>300?10:5:20}
  function un (line 2) | function un(e,t,n){return n||(e.ticks?e.ticks(t):e.domain())}
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function dn (line 2) | function dn(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function hn (line 2) | function hn(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return dn(this,t),hn(this,(t.__proto__||Object.getPrototype...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function xn (line 2) | function xn(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function wn (line 2) | function wn(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return xn(this,t),wn(this,(t.__proto__||Object.getPrototype...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function En (line 2) | function En(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function Sn (line 2) | function Sn(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function Cn (line 2) | function Cn(e){var t=jn(e);if(t)return{title:"x",value:Ae(t.x)}}
  function Tn (line 2) | function Tn(e){return e.map((function(e,t){if(e)return{value:e.y,title:t...
  function jn (line 2) | function jn(e){return(e||[]).find((function(e){return Boolean(e)}))}
  function t (line 2) | function t(){return En(this,t),Sn(this,(t.__proto__||Object.getPrototype...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function Nn (line 2) | function Nn(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function Dn (line 2) | function Dn(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function Rn (line 2) | function Rn(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.le...
  function Ln (line 2) | function Ln(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments...
  function t (line 2) | function t(){return Nn(this,t),Dn(this,(t.__proto__||Object.getPrototype...
  function zn (line 2) | function zn(e){var t=e.axisDomain,n=e.numberOfTicks,r=e.axisStart,i=e.ax...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function Wn (line 2) | function Wn(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function Yn (line 2) | function Yn(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return Wn(this,t),Yn(this,(t.__proto__||Object.getPrototype...
  function Xn (line 2) | function Xn(e){var t=e.className;return s.a.createElement("defs",{classN...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function Jn (line 2) | function Jn(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enum...
  function Qn (line 2) | function Qn(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function er (line 2) | function er(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return Qn(this,t),er(this,(t.__proto__||Object.getPrototype...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function lr (line 2) | function lr(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function fr (line 2) | function fr(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return lr(this,t),fr(this,(t.__proto__||Object.getPrototype...
  function gr (line 2) | function gr(e){return e[0]}
  function yr (line 2) | function yr(e){return e[1]}
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function vr (line 2) | function vr(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function xr (line 2) | function xr(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function wr (line 2) | function wr(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.le...
  function t (line 2) | function t(){return vr(this,t),xr(this,(t.__proto__||Object.getPrototype...
  function u (line 2) | function u(e){var r,i={},o=[],a=e.length;for(r=0;r<a;++r)if(!isNaN(l=+s....
  function l (line 2) | function l(e){var t=0,n=0;return pr.map((function(r){var i=Math.sin(r)*e...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function Er (line 2) | function Er(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function Sr (line 2) | function Sr(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function Cr (line 2) | function Cr(e){return{xLoc:"touchstart"===e.type?e.pageX:e.offsetX,yLoc:...
  function t (line 2) | function t(){var e,n,r;Er(this,t);for(var i=arguments.length,o=Array(i),...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function Pr (line 2) | function Pr(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function Nr (line 2) | function Nr(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function Ir (line 2) | function Ir(e){return Object.keys(e).map((function(t){return{title:t,val...
  function t (line 2) | function t(){return Pr(this,t),Nr(this,(t.__proto__||Object.getPrototype...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function zr (line 2) | function zr(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enum...
  function Ur (line 2) | function Ur(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function Hr (line 2) | function Hr(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return Ur(this,t),Hr(this,(t.__proto__||Object.getPrototype...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function $r (line 2) | function $r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function Gr (line 2) | function Gr(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return $r(this,t),Gr(this,(t.__proto__||Object.getPrototype...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function Jr (line 2) | function Jr(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function Qr (line 2) | function Qr(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return Jr(this,t),Qr(this,(t.__proto__||Object.getPrototype...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function ii (line 2) | function ii(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function oi (line 2) | function oi(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return ii(this,t),oi(this,(t.__proto__||Object.getPrototype...
  function fi (line 2) | function fi(e){return s.a.createElement(sr,e)}
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function pi (line 2) | function pi(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enum...
  function gi (line 2) | function gi(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function yi (line 2) | function yi(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return gi(this,t),yi(this,(t.__proto__||Object.getPrototype...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function wi (line 2) | function wi(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function _i (line 2) | function _i(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return wi(this,t),_i(this,(t.__proto__||Object.getPrototype...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function Si (line 2) | function Si(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function Ci (line 2) | function Ci(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return Si(this,t),Ci(this,(t.__proto__||Object.getPrototype...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function Pi (line 2) | function Pi(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function Ni (line 2) | function Ni(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return Pi(this,t),Ni(this,(t.__proto__||Object.getPrototype...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function Li (line 2) | function Li(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function Bi (line 2) | function Bi(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return Li(this,t),Bi(this,(t.__proto__||Object.getPrototype...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function qi (line 2) | function qi(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function $i (line 2) | function $i(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return qi(this,t),$i(this,(t.__proto__||Object.getPrototype...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function Qi (line 2) | function Qi(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function eo (line 2) | function eo(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return Qi(this,t),eo(this,(t.__proto__||Object.getPrototype...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function oo (line 2) | function oo(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function ao (line 2) | function ao(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return oo(this,t),ao(this,(t.__proto__||Object.getPrototype...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function ho (line 2) | function ho(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function po (line 2) | function po(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return ho(this,t),po(this,(t.__proto__||Object.getPrototype...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function vo (line 2) | function vo(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function xo (line 2) | function xo(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return vo(this,t),xo(this,(t.__proto__||Object.getPrototype...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function Eo (line 2) | function Eo(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function So (line 2) | function So(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return Eo(this,t),So(this,(t.__proto__||Object.getPrototype...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function Ao (line 2) | function Ao(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function Mo (line 2) | function Mo(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return Ao(this,t),Mo(this,(t.__proto__||Object.getPrototype...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function Lo (line 2) | function Lo(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function Bo (line 2) | function Bo(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return Lo(this,t),Bo(this,(t.__proto__||Object.getPrototype...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function Ho (line 2) | function Ho(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function Wo (line 2) | function Wo(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return Ho(this,t),Wo(this,(t.__proto__||Object.getPrototype...
  function Xo (line 2) | function Xo(e){return s.a.createElement(sr,e)}
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function Jo (line 2) | function Jo(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function Qo (line 2) | function Qo(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return Jo(this,t),Qo(this,(t.__proto__||Object.getPrototype...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function ia (line 2) | function ia(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function oa (line 2) | function oa(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return ia(this,t),oa(this,(t.__proto__||Object.getPrototype...
  function ua (line 2) | function ua(e){var t=e.className,n=e.extent,r=e.nodes,i=e.onBlur,a=e.onC...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function ha (line 2) | function ha(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function pa (line 2) | function pa(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return ha(this,t),pa(this,(t.__proto__||Object.getPrototype...
  function va (line 2) | function va(e,t){var n=e.margin,r=e.width,i=e.height,o=ba({},t,"number"=...
  function xa (line 2) | function xa(e,t,n){var r=e/2-n,i=t/2-n;return{bottom:i,left:r,right:r,to...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function Ea (line 2) | function Ea(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function Sa (line 2) | function Sa(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function Ca (line 2) | function Ca(e,t,n,r,i){e.clearRect(0,0,n,t),r.forEach((function(t){var n...
  function t (line 2) | function t(){return Ea(this,t),Sa(this,(t.__proto__||Object.getPrototype...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function Na (line 2) | function Na(e){return e.map((function(e){return Array.isArray(e)?e.map((...
  function t (line 2) | function t(e){!function(e,t){if(!(e instanceof t))throw new TypeError("C...
  function Wa (line 2) | function Wa(e){var t=e.orientation,n=e.width,r=e.height,i=e.style,o=void...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function $a (line 2) | function $a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enum...
  function Ga (line 2) | function Ga(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function Xa (line 2) | function Xa(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return Ga(this,t),Xa(this,(t.__proto__||Object.getPrototype...
  function is (line 2) | function is(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enum...
  function fs (line 2) | function fs(e){var t=e.orientation,n=e.position,r=e.width,i=e.height,o=e...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function gs (line 2) | function gs(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function ys (line 2) | function ys(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return gs(this,t),ys(this,(t.__proto__||Object.getPrototype...
  function Ms (line 2) | function Ms(e){return s.a.createElement(Es,e)}
  function Bs (line 2) | function Bs(e){return s.a.createElement(Es,e)}
  function Hs (line 2) | function Hs(e){var t=e.startColor,n=e.midColor,r=e.endColor,i=e.startTit...
  function Ys (line 2) | function Ys(e){for(var t=e.startTitle,n=e.endTitle,r=e.startSize,i=e.end...
  function $s (line 2) | function $s(e){var t=e.color,n=e.strokeDasharray,r=e.strokeStyle,i=e.str...
  function Ks (line 2) | function Ks(e){var t=e.className,n=e.colors,r=e.height,i=e.items,o=e.onI...
  function tc (line 2) | function tc(e){var t=e.className,n=e.colors,r=e.height,i=e.items,o=e.onI...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function ic (line 2) | function ic(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function oc (line 2) | function oc(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function cc (line 2) | function cc(e){var t=e.domains,n=e.style;return t.map((function(e,t){ret...
  function t (line 2) | function t(){var e,n,r;ic(this,t);for(var i=arguments.length,o=Array(i),...
  function hc (line 2) | function hc(e){var t=1e-12;return Math.abs(e)<=t?e=0:e>0?Math.abs(e-.5)<...
  function pc (line 2) | function pc(e){var t=e.domains,n=e.startingAngle,r=e.style;return t.map(...
  function gc (line 2) | function gc(e){var t=e.animation,n=e.className,r=e.children,i=e.colorRan...
  function bc (line 2) | function bc(e){var t=e.animation,n=e.className,r=e.children,i=e.colorTyp...
  function vc (line 2) | function vc(e){return e.target.depth}
  function xc (line 2) | function xc(e,t){return e.sourceLinks.length?e.depth:t-1}
  function wc (line 2) | function wc(e){return function(){return e}}
  function _c (line 2) | function _c(e,t){return Oc(e.source,t.source)||e.index-t.index}
  function kc (line 2) | function kc(e,t){return Oc(e.target,t.target)||e.index-t.index}
  function Oc (line 2) | function Oc(e,t){return e.y0-t.y0}
  function Ec (line 2) | function Ec(e){return e.value}
  function Sc (line 2) | function Sc(e){return(e.y0+e.y1)/2}
  function Cc (line 2) | function Cc(e){return Sc(e.source)*e.value}
  function Tc (line 2) | function Tc(e){return Sc(e.target)*e.value}
  function jc (line 2) | function jc(e){return e.index}
  function Ac (line 2) | function Ac(e){return e.nodes}
  function Mc (line 2) | function Mc(e){return e.links}
  function Pc (line 2) | function Pc(e,t){var n=e.get(t);if(!n)throw new Error("missing: "+t);ret...
  function Dc (line 2) | function Dc(e){return[e.source.x1,e.y0]}
  function Rc (line 2) | function Rc(e){return[e.target.x0,e.y1]}
  function Bc (line 2) | function Bc(e){var t=e.animation,n=e.data,r=e.node,i=e.opacity,o=e.color...
  function Uc (line 2) | function Uc(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.le...
  function Vc (line 2) | function Vc(e){var t=e.align,n=e.animation,r=e.children,i=e.className,o=...
  function Zc (line 2) | function Zc(e){var t=e.getAngle,n=e.getAngle0,r=e.animation,i=e.classNam...
  function cu (line 2) | function cu(e){var t=e.animation,n=e.getLabel,r=e.mode,i=e.node,o=e.onLe...
  function fu (line 2) | function fu(e){var t=e.animation,n=e.className,r=e.height,i=e.hideRootNo...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function gu (line 2) | function gu(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a...
  function yu (line 2) | function yu(e,t){if(!e)throw new ReferenceError("this hasn't been initia...
  function t (line 2) | function t(){return gu(this,t),yu(this,(t.__proto__||Object.getPrototype...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function Ou (line 2) | function Ou(e){var t=e.data.children||[],n=xu({},e,rt(e,t,ku),{_allData:...
  function t (line 2) | function t(e){!function(e,t){if(!(e instanceof t))throw new TypeError("C...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function Pu (line 2) | function Pu(){Cu.a.clearTimeout(Mu),Mu=Cu.a.setTimeout(Nu,100)}
  function Nu (line 2) | function Nu(){Au.forEach((function(e){return e()}))}
  function Du (line 2) | function Du(e){return Au.push(e),1===Au.length&&Cu.a.addEventListener("r...
  function Ru (line 2) | function Ru(e,t,n){var r=function(r){function i(e){!function(e,t){if(!(e...
  function r (line 2) | function r(e,t,n,r,i){var o=e*e,a=o*e;return((1-3*e+3*o-a)*t+(4-6*o+3*a)...
  function i (line 2) | function i(e){if(!(t=r.exec(e)))throw new Error("invalid format: "+e);va...
  function o (line 2) | function o(e){this.fill=void 0===e.fill?" ":e.fill+"",this.align=void 0=...
  function l (line 2) | function l(i){var o,a,l,f=i.length,d=!1;for(null==s&&(u=c(l=Object(r.a)(...
  function i (line 2) | function i(e){return e[0]}
  function o (line 2) | function o(e){return e[1]}
  function a (line 2) | function a(){this._=null}
  function s (line 2) | function s(e){e.U=e.C=e.L=e.R=e.P=e.N=null}
  function c (line 2) | function c(e,t){var n=t,r=t.R,i=n.U;i?i.L===n?i.L=r:i.R=r:e._=r,r.U=i,n....
  function u (line 2) | function u(e,t){var n=t,r=t.L,i=n.U;i?i.L===n?i.L=r:i.R=r:e._=r,r.U=i,n....
  function l (line 2) | function l(e){for(;e.L;)e=e.L;return e}
  function d (line 2) | function d(e,t,n,r){var i=[null,null],o=I.push(i)-1;return i.left=e,i.ri...
  function h (line 2) | function h(e,t,n){var r=[t,n];return r.left=e,r}
  function p (line 2) | function p(e,t,n,r){e[0]||e[1]?e.left===n?e[1]=r:e[0]=r:(e[0]=r,e.left=t...
  function g (line 2) | function g(e,t,n,r,i){var o,a=e[0],s=e[1],c=a[0],u=a[1],l=0,f=1,d=s[0]-c...
  function y (line 2) | function y(e,t,n,r,i){var o=e[1];if(o)return!0;var a,s,c=e[0],u=e.left,l...
  function m (line 2) | function m(e,t){var n=e.site,r=t.left,i=t.right;return n===i&&(i=r,r=n),...
  function b (line 2) | function b(e,t){return t[+(t.left!==e.site)]}
  function v (line 2) | function v(e,t){return t[+(t.left===e.site)]}
  function _ (line 2) | function _(){s(this),this.x=this.y=this.arc=this.site=this.cy=null}
  function k (line 2) | function k(e){var t=e.P,n=e.N;if(t&&n){var r=t.site,i=e.site,o=n.site;if...
  function O (line 2) | function O(e){var t=e.circle;t&&(t.P||(x=t.N),R.remove(t),w.push(t),s(t)...
  function S (line 2) | function S(){s(this),this.edge=this.site=this.circle=null}
  function C (line 2) | function C(e){var t=E.pop()||new S;return t.site=e,t}
  function T (line 2) | function T(e){O(e),N.remove(e),E.push(e),s(e)}
  function j (line 2) | function j(e){var t=e.circle,n=t.x,r=t.cy,i=[n,r],o=e.P,a=e.N,s=[e];T(e)...
  function A (line 2) | function A(e){for(var t,n,r,i,o=e[0],a=e[1],s=N._;s;)if((r=M(s,a)-o)>L)s...
  function M (line 2) | function M(e,t){var n=e.site,r=n[0],i=n[1],o=i-t;if(!o)return r;var a=e....
  function P (line 2) | function P(e,t){var n=e.N;if(n)return M(n,t);var r=e.site;return r[1]===...
  function F (line 2) | function F(e,t){return t[1]-e[1]||t[0]-e[0]}
  function z (line 2) | function z(e,t){var n,r,i,o=e.sort(F).pop();for(I=[],D=new Array(e.lengt...
  function a (line 2) | function a(r){return new z(r.map((function(n,i){var o=[Math.round(e(n,i,...
  function u (line 2) | function u(e){e.metaKey||e.altKey||e.ctrlKey||(o=!0)}
  function l (line 2) | function l(){o=!1}
  function f (line 2) | function f(){"hidden"===this.visibilityState&&a&&(o=!0)}
  function d (line 2) | function d(e){var t=e.target;try{return t.matches(":focus-visible")}catc...
  function h (line 2) | function h(){a=!0,window.clearTimeout(s),s=window.setTimeout((function()...
  function p (line 2) | function p(){return{isFocusVisible:d,onBlurVisible:h,ref:r.useCallback((...
  function i (line 2) | function i(e){return Object(r.a)(e).defaultView||window}
  function i (line 2) | function i(e,t){return r.isValidElement(e)&&-1!==t.indexOf(e.type.muiName)}
  function s (line 2) | function s(){this._x0=this._y0=this._x1=this._y1=null,this._=""}
  function c (line 2) | function c(){return new s}
  function o (line 2) | function o(){throw new Error("setTimeout has not been defined")}
  function a (line 2) | function a(){throw new Error("clearTimeout has not been defined")}
  function s (line 2) | function s(e){if(n===setTimeout)return setTimeout(e,0);if((n===o||!n)&&s...
  function d (line 2) | function d(){l&&c&&(l=!1,c.length?u=c.concat(u):f=-1,u.length&&h())}
  function h (line 2) | function h(){if(!l){var e=s(d);l=!0;for(var t=u.length;t;){for(c=u,u=[];...
  function p (line 2) | function p(e,t){this.fun=e,this.array=t}
  function g (line 2) | function g(){}
  function f (line 2) | function f(e){if(e instanceof p)return new p(e.l,e.a,e.b,e.opacity);if(e...
  function d (line 2) | function d(e,t){return new p(e,0,0,null==t?1:t)}
  function h (line 2) | function h(e,t,n,r){return 1===arguments.length?f(e):new p(e,t,n,null==r...
  function p (line 2) | function p(e,t,n,r){this.l=+e,this.a=+t,this.b=+n,this.opacity=+r}
  function g (line 2) | function g(e){return e>.008856451679035631?Math.pow(e,1/3):e/l+c}
  function y (line 2) | function y(e){return e>u?e*e*e:l*(e-c)}
  function m (line 2) | function m(e){return 255*(e<=.0031308?12.92*e:1.055*Math.pow(e,1/2.4)-.0...
  function b (line 2) | function b(e){return(e/=255)<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)}
  function v (line 2) | function v(e){if(e instanceof _)return new _(e.h,e.c,e.l,e.opacity);if(e...
  function x (line 2) | function x(e,t,n,r){return 1===arguments.length?v(e):new _(n,t,e,null==r...
  function w (line 2) | function w(e,t,n,r){return 1===arguments.length?v(e):new _(e,t,n,null==r...
  function _ (line 2) | function _(e,t,n,r){this.h=+e,this.c=+t,this.l=+n,this.opacity=+r}
  function k (line 2) | function k(e){if(isNaN(e.h))return new p(e.l,0,0,e.opacity);var t=e.h*o....
  function r (line 2) | function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Ar...
  function s (line 2) | function s(e){return r=Object(a.a)(e),i=r.format,o=r.formatPrefix,r}
  function c (line 2) | function c(e){return e.source}
  function u (line 2) | function u(e){return e.target}
  function l (line 2) | function l(e){var t=c,n=u,s=a.a,l=a.b,f=null;function d(){var o,a=i.a.ca...
  function f (line 2) | function f(e,t,n,r,i){e.moveTo(t,n),e.bezierCurveTo(t=(t+r)/2,n,t,i,r,i)}
  function d (line 2) | function d(e,t,n,r,i){e.moveTo(t,n),e.bezierCurveTo(t,n=(n+i)/2,r,n,r,i)}
  function h (line 2) | function h(e,t,n,r,i){var o=Object(s.a)(t,n),a=Object(s.a)(t,n=(n+i)/2),...
  function p (line 2) | function p(){return l(f)}
  function g (line 2) | function g(){return l(d)}
  function y (line 2) | function y(){var e=l(h);return e.angle=e.x,delete e.x,e.radius=e.y,delet...
  function u (line 2) | function u(e){var t=this.__data__=new r(e);this.size=t.size}
  function c (line 2) | function c(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var...
  function r (line 2) | function r(e,t){return e.parent===t.parent?1:2}
  function i (line 2) | function i(e,t){return e+t.x}
  function o (line 2) | function o(e,t){return Math.max(e,t.y)}
  function s (line 2) | function s(r){var s,c=0;r.eachAfter((function(t){var n=t.children;n?(t.x...
  function g (line 2) | function g(e){return e.id}
  function y (line 2) | function y(e){return e.parentId}
  function n (line 2) | function n(n){var r,i,o,a,c,u,l,f=n.length,d=new Array(f),g={};for(i=0;i...
  function b (line 2) | function b(e,t){return e.parent===t.parent?1:2}
  function v (line 2) | function v(e){var t=e.children;return t?t[0]:e.t}
  function x (line 2) | function x(e){var t=e.children;return t?t[t.length-1]:e.t}
  function w (line 2) | function w(e,t,n){var r=n/(t.i-e.i);t.c-=r,t.s+=n,e.c+=r,t.z+=n,t.m+=n}
  function _ (line 2) | function _(e,t,n){return e.a.parent===t.parent?e.a:n}
  function k (line 2) | function k(e,t){this._=e,this.parent=null,this.children=null,this.A=null...
  function i (line 2) | function i(i){var c=function(e){for(var t,n,r,i,o,a=new k(e,0),s=[a];t=s...
  function o (line 2) | function o(t){var n=t.children,r=t.parent.children,i=t.i?r[t.i-1]:null;i...
  function a (line 2) | function a(e){e._.x=e.z+e.parent.m,e.m+=e.parent.m}
  function s (line 2) | function s(e){e.x*=t,e.y=e.depth*n}
  function o (line 2) | function o(e,t){var n,i=t?t.length:0,o=e?Math.min(i,e.length):0,a=new Ar...
  function i (line 2) | function i(e,t,n){var r,i,o,a,s=e.x-t.x,c=e.y-t.y,u=s*s+c*c;u?(i=t.r+n.r...
  function o (line 2) | function o(e,t){var n=e.r+t.r-1e-6,r=t.x-e.x,i=t.y-e.y;return n>0&&n*n>r...
  function a (line 2) | function a(e){var t=e._,n=e.next._,r=t.r+n.r,i=(t.x*n.r+n.x*t.r)/r,o=(t....
  function s (line 2) | function s(e){this._=e,this.next=null,this.previous=null}
  function c (line 2) | function c(e){if(!(u=e.length))return 0;var t,n,c,u,l,f,d,h,p,g,y;if((t=...
  function u (line 2) | function u(e){if(0<=e.y&&e.y<100){var t=new Date(-1,e.m,e.d,e.H,e.M,e.S,...
  function l (line 2) | function l(e){if(0<=e.y&&e.y<100){var t=new Date(Date.UTC(-1,e.m,e.d,e.H...
  function f (line 2) | function f(e,t,n){return{y:e,m:t,d:n,H:0,M:0,S:0,L:0}}
  function d (line 2) | function d(e){var t=e.dateTime,n=e.date,s=e.time,c=e.periods,d=e.days,p=...
  function m (line 2) | function m(e,t,n){var r=e<0?"-":"",i=(r?-e:e)+"",o=i.length;return r+(o<...
  function b (line 2) | function b(e){return e.replace(y,"\\$&")}
  function v (line 2) | function v(e){return new RegExp("^(?:"+e.map(b).join("|")+")","i")}
  function x (line 2) | function x(e){for(var t={},n=-1,r=e.length;++n<r;)t[e[n].toLowerCase()]=...
  function w (line 2) | function w(e,t,n){var r=p.exec(t.slice(n,n+1));return r?(e.w=+r[0],n+r[0...
  function _ (line 2) | function _(e,t,n){var r=p.exec(t.slice(n,n+1));return r?(e.u=+r[0],n+r[0...
  function k (line 2) | function k(e,t,n){var r=p.exec(t.slice(n,n+2));return r?(e.U=+r[0],n+r[0...
  function O (line 2) | function O(e,t,n){var r=p.exec(t.slice(n,n+2));return r?(e.V=+r[0],n+r[0...
  function E (line 2) | function E(e,t,n){var r=p.exec(t.slice(n,n+2));return r?(e.W=+r[0],n+r[0...
  function S (line 2) | function S(e,t,n){var r=p.exec(t.slice(n,n+4));return r?(e.y=+r[0],n+r[0...
  function C (line 2) | function C(e,t,n){var r=p.exec(t.slice(n,n+2));return r?(e.y=+r[0]+(+r[0...
  function T (line 2) | function T(e,t,n){var r=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(t.slice(n,n+...
  function j (line 2) | function j(e,t,n){var r=p.exec(t.slice(n,n+1));return r?(e.q=3*r[0]-3,n+...
  function A (line 2) | function A(e,t,n){var r=p.exec(t.slice(n,n+2));return r?(e.m=r[0]-1,n+r[...
  function M (line 2) | function M(e,t,n){var r=p.exec(t.slice(n,n+2));return r?(e.d=+r[0],n+r[0...
  function P (line 2) | function P(e,t,n){var r=p.exec(t.slice(n,n+3));return r?(e.m=0,e.d=+r[0]...
  function N (line 2) | function N(e,t,n){var r=p.exec(t.slice(n,n+2));return r?(e.H=+r[0],n+r[0...
  function D (line 2) | function D(e,t,n){var r=p.exec(t.slice(n,n+2));return r?(e.M=+r[0],n+r[0...
  function R (line 2) | function R(e,t,n){var r=p.exec(t.slice(n,n+2));return r?(e.S=+r[0],n+r[0...
  function I (line 2) | function I(e,t,n){var r=p.exec(t.slice(n,n+3));return r?(e.L=+r[0],n+r[0...
  function L (line 2) | function L(e,t,n){var r=p.exec(t.slice(n,n+6));return r?(e.L=Math.floor(...
  function B (line 2) | function B(e,t,n){var r=g.exec(t.slice(n,n+1));return r?n+r[0].length:-1}
  function F (line 2) | function F(e,t,n){var r=p.exec(t.slice(n));return r?(e.Q=+r[0],n+r[0].le...
  function z (line 2) | function z(e,t,n){var r=p.exec(t.slice(n));return r?(e.s=+r[0],n+r[0].le...
  function U (line 2) | function U(e,t){return m(e.getDate(),t,2)}
  function H (line 2) | function H(e,t){return m(e.getHours(),t,2)}
  function W (line 2) | function W(e,t){return m(e.getHours()%12||12,t,2)}
  function Y (line 2) | function Y(e,t){return m(1+a.b.count(Object(s.a)(e),e),t,3)}
  function V (line 2) | function V(e,t){return m(e.getMilliseconds(),t,3)}
  function q (line 2) | function q(e,t){return V(e,t)+"000"}
  function $ (line 2) | function $(e,t){return m(e.getMonth()+1,t,2)}
  function G (line 2) | function G(e,t){return m(e.getMinutes(),t,2)}
  function X (line 2) | function X(e,t){return m(e.getSeconds(),t,2)}
  function K (line 2) | function K(e){var t=e.getDay();return 0===t?7:t}
  function Z (line 2) | function Z(e,t){return m(o.g.count(Object(s.a)(e)-1,e),t,2)}
  function J (line 2) | function J(e){var t=e.getDay();return t>=4||0===t?Object(o.i)(e):o.i.cei...
  function Q (line 2) | function Q(e,t){return e=J(e),m(o.i.count(Object(s.a)(e),e)+(4===Object(...
  function ee (line 2) | function ee(e){return e.getDay()}
  function te (line 2) | function te(e,t){return m(o.c.count(Object(s.a)(e)-1,e),t,2)}
  function ne (line 2) | function ne(e,t){return m(e.getFullYear()%100,t,2)}
  function re (line 2) | function re(e,t){return m((e=J(e)).getFullYear()%100,t,2)}
  function ie (line 2) | function ie(e,t){return m(e.getFullYear()%1e4,t,4)}
  function oe (line 2) | function oe(e,t){var n=e.getDay();return m((e=n>=4||0===n?Object(o.i)(e)...
  function ae (line 2) | function ae(e){var t=e.getTimezoneOffset();return(t>0?"-":(t*=-1,"+"))+m...
  function se (line 2) | function se(e,t){return m(e.getUTCDate(),t,2)}
  function ce (line 2) | function ce(e,t){return m(e.getUTCHours(),t,2)}
  function ue (line 2) | function ue(e,t){return m(e.getUTCHours()%12||12,t,2)}
  function le (line 2) | function le(e,t){return m(1+i.a.count(Object(c.a)(e),e),t,3)}
  function fe (line 2) | function fe(e,t){return m(e.getUTCMilliseconds(),t,3)}
  function de (line 2) | function de(e,t){return fe(e,t)+"000"}
  function he (line 2) | function he(e,t){return m(e.getUTCMonth()+1,t,2)}
  function pe (line 2) | function pe(e,t){return m(e.getUTCMinutes(),t,2)}
  function ge (line 2) | function ge(e,t){return m(e.getUTCSeconds(),t,2)}
  function ye (line 2) | function ye(e){var t=e.getUTCDay();return 0===t?7:t}
  function me (line 2) | function me(e,t){return m(r.g.count(Object(c.a)(e)-1,e),t,2)}
  function be (line 2) | function be(e){var t=e.getUTCDay();return t>=4||0===t?Object(r.i)(e):r.i...
  function ve (line 2) | function ve(e,t){return e=be(e),m(r.i.count(Object(c.a)(e),e)+(4===Objec...
  function xe (line 2) | function xe(e){return e.getUTCDay()}
  function we (line 2) | function we(e,t){return m(r.c.count(Object(c.a)(e)-1,e),t,2)}
  function _e (line 2) | function _e(e,t){return m(e.getUTCFullYear()%100,t,2)}
  function ke (line 2) | function ke(e,t){return m((e=be(e)).getUTCFullYear()%100,t,2)}
  function Oe (line 2) | function Oe(e,t){return m(e.getUTCFullYear()%1e4,t,4)}
  function Ee (line 2) | function Ee(e,t){var n=e.getUTCDay();return m((e=n>=4||0===n?Object(r.i)...
  function Se (line 2) | function Se(){return"+0000"}
  function Ce (line 2) | function Ce(){return"%"}
  function Te (line 2) | function Te(e){return+e}
  function je (line 2) | function je(e){return Math.floor(+e/1e3)}
  function h (line 2) | function h(i){var o,a,s,h,p,g=i.length,y=!1,m=new Array(g),b=new Array(g...
  function p (line 2) | function p(){return Object(a.a)().defined(u).curve(f).context(l)}
  function c (line 2) | function c(e,t){for(var n=t[0],r=t[1],i=-1,o=0,a=e.length,s=a-1;o<a;s=o+...
  function u (line 2) | function u(e,t,n){var r,i,o,a;return function(e,t,n){return(t[0]-e[0])*(...
  function u (line 2) | function u(e){var t=n(e);if(Array.isArray(t))t=t.slice().sort(o);else{va...
  function d (line 2) | function d(n,r){var i=[],o=[];return function(n,r,i){var o,a,s,c,u,l,d=n...
  function h (line 2) | function h(t){return 2*t[0]+t[1]*(e+1)*4}
  function p (line 2) | function p(n,r,i){n.forEach((function(n){var o,a=n[0],s=n[1],c=0|a,u=0|s...
  function h (line 2) | function h(e,t,n){for(var r=e.width,i=e.height,o=1+(n<<1),a=0;a<i;++a)fo...
  function p (line 2) | function p(e,t,n){for(var r=e.width,i=e.height,o=1+(n<<1),a=0;a<r;++a)fo...
  function g (line 2) | function g(e){return e[0]}
  function y (line 2) | function y(e){return e[1]}
  function m (line 2) | function m(){return 1}
  function x (line 2) | function x(i){var o=new Float32Array(f*b),a=new Float32Array(f*b);i.forE...
  function w (line 2) | function w(e){return e.value*=Math.pow(2,-2*u),e.coordinates.forEach(_),e}
  function _ (line 2) | function _(e){e.forEach(k)}
  function k (line 2) | function k(e){e.forEach(O)}
  function O (line 2) | function O(e){e[0]=e[0]*Math.pow(2,u)-l,e[1]=e[1]*Math.pow(2,u)-l}
  function E (line 2) | function E(){return f=o+2*(l=3*c)>>u,b=s+2*l>>u,x}
  function b (line 2) | function b(e){var t=(e=Object(o.b)(e)).fill,n=e.align,i=e.sign,u=e.symbo...
  function i (line 2) | function i(e,t){var n,r;if(s(t,e))return[t];for(n=0;n<e.length;++n)if(o(...
  function o (line 2) | function o(e,t){var n=e.r-t.r,r=t.x-e.x,i=t.y-e.y;return n<0||n*n<r*r+i*i}
  function a (line 2) | function a(e,t){var n=e.r-t.r+1e-6,r=t.x-e.x,i=t.y-e.y;return n>0&&n*n>r...
  function s (line 2) | function s(e,t){for(var n=0;n<t.length;++n)if(!a(e,t[n]))return!1;return!0}
  function c (line 2) | function c(e){switch(e.length){case 1:return{x:(t=e[0]).x,y:t.y,r:t.r};c...
  function u (line 2) | function u(e,t){var n=e.x,r=e.y,i=e.r,o=t.x,a=t.y,s=t.r,c=o-n,u=a-r,l=s-...
  function l (line 2) | function l(e,t,n){var r=e.x,i=e.y,o=e.r,a=t.x,s=t.y,c=t.r,u=n.x,l=n.y,f=...
  function a (line 2) | function a(e,t,n){if(Array.isArray(t)){var i=e.theme.breakpoints||o;retu...
  function c (line 2) | function c(e){return r.isMemo(e)?a:s[e.$$typeof]||i}
  function s (line 2) | function s(e,t){var n=o.a.memo(o.a.forwardRef((function(t,n){return o.a....
  function i (line 2) | function i(e){var t=r.useState(e),n=t[0],i=t[1],o=e||n;return r.useEffec...
  function r (line 2) | function r(){var e=document.createElement("div");e.style.width="99px",e....
  function i (line 2) | function i(e,t){if(e){if("string"===typeof e)return Object(r.a)(e,t);var...
  function p (line 2) | function p(e){if(e instanceof y)return new y(e.h,e.s,e.l,e.opacity);e in...
  function g (line 2) | function g(e,t,n,r){return 1===arguments.length?p(e):new y(e,t,n,null==r...
  function y (line 2) | function y(e,t,n,r){this.h=+e,this.s=+t,this.l=+n,this.opacity=+r}
  function o (line 2) | function o(e){return function(e){if(Array.isArray(e))return Object(r.a)(...
  function b (line 2) | function b(e,t){var n=Object.create(null);return e&&o.Children.map(e,(fu...
  function v (line 2) | function v(e,t,n){return null!=n[t]?n[t]:e.props[t]}
  function x (line 2) | function x(e,t,n){var r=b(e.children),i=function(e,t){function n(n){retu...
  function t (line 2) | function t(t,n){var r,i=(r=e.call(this,t,n)||this).handleExited.bind(Obj...
  function re (line 2) | function re(e,t){var n=arguments.length>2&&void 0!==arguments[2]?argumen...
  function o (line 2) | function o(e){return function t(n){function o(t,o){var a=e((t=Object(r.a...
  function o (line 2) | function o(e){this._isDirected=!r.has(e,"directed")||e.directed,this._is...
  function a (line 2) | function a(e,t){e[t]?e[t]++:e[t]=1}
  function s (line 2) | function s(e,t){--e[t]||delete e[t]}
  function c (line 2) | function c(e,t,n,i){var o=""+t,a=""+n;if(!e&&o>a){var s=o;o=a,a=s}return...
  function u (line 2) | function u(e,t,n,r){var i=""+t,o=""+n;if(!e&&i>o){var a=i;i=o,o=a}var s=...
  function l (line 2) | function l(e,t){return c(e,t.v,t.w,t.name)}
  function o (line 2) | function o(e){var r=n.parent(e);return void 0===r||t.hasNode(r)?(i[e]=r,...
  function c (line 2) | function c(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var...
  function s (line 2) | function s(e,t){!r.isUndefined(e)&&r.isUndefined(e["Content-Type"])&&(e[...
  function g (line 2) | function g(){p.point=m}
  function y (line 2) | function y(){b(r,i)}
  function m (line 2) | function m(e,t){p.point=b,r=e,i=t,e*=u.r,t*=u.r,o=e,a=Object(u.g)(t=t/2+...
  function b (line 2) | function b(e,t){e*=u.r,t=(t*=u.r)/2+u.q;var n=e-o,r=n>=0?1:-1,i=r*n,c=Ob...
  function x (line 2) | function x(e){return[Object(u.e)(e[1],e[0]),Object(u.c)(e[2])]}
  function w (line 2) | function w(e){var t=e[0],n=e[1],r=Object(u.g)(n);return[r*Object(u.g)(t)...
  function _ (line 2) | function _(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]}
  function k (line 2) | function k(e,t){return[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]...
  function O (line 2) | function O(e,t){e[0]+=t[0],e[1]+=t[1],e[2]+=t[2]}
  function E (line 2) | function E(e,t){return[e[0]*t,e[1]*t,e[2]*t]}
  function S (line 2) | function S(e){var t=Object(u.u)(e[0]*e[0]+e[1]*e[1]+e[2]*e[2]);e[0]/=t,e...
  function F (line 2) | function F(e,t){R.push(I=[C=e,j=e]),t<T&&(T=t),t>A&&(A=t)}
  function z (line 2) | function z(e,t){var n=w([e*u.r,t*u.r]);if(D){var r=k(D,n),i=k([r[1],-r[0...
  function U (line 2) | function U(){B.point=z}
  function H (line 2) | function H(){I[0]=C,I[1]=j,B.point=F,D=null}
  function W (line 2) | function W(e,t){if(D){var n=e-M;L.add(Object(u.a)(n)>180?n+(n>0?360:-360...
  function Y (line 2) | function Y(){p.lineStart()}
  function V (line 2) | function V(){W(P,N),p.lineEnd(),Object(u.a)(L)>u.i&&(C=-(j=180)),I[0]=C,...
  function q (line 2) | function q(e,t){return(t-=e)<0?t+360:t}
  function $ (line 2) | function $(e,t){return e[0]-t[0]}
  function G (line 2) | function G(e,t){return e[0]<=e[1]?e[0]<=t&&t<=e[1]:t<e[0]||e[1]<t}
  function he (line 2) | function he(e,t){e*=u.r,t*=u.r;var n=Object(u.g)(t);pe(n*Object(u.g)(e),...
  function pe (line 2) | function pe(e,t,n){++X,Z+=(e-Z)/X,J+=(t-J)/X,Q+=(n-Q)/X}
  function ge (line 2) | function ge(){de.point=ye}
  function ye (line 2) | function ye(e,t){e*=u.r,t*=u.r;var n=Object(u.g)(t);ce=n*Object(u.g)(e),...
  function me (line 2) | function me(e,t){e*=u.r,t*=u.r;var n=Object(u.g)(t),r=n*Object(u.g)(e),i...
  function be (line 2) | function be(){de.point=he}
  function ve (line 2) | function ve(){de.point=we}
  function xe (line 2) | function xe(){_e(ae,se),de.point=he}
  function we (line 2) | function we(e,t){ae=e,se=t,e*=u.r,t*=u.r,de.point=_e;var n=Object(u.g)(t...
  function _e (line 2) | function _e(e,t){e*=u.r,t*=u.r;var n=Object(u.g)(t),r=n*Object(u.g)(e),i...
  function n (line 2) | function n(n,r){return n=e(n,r),t(n[0],n[1])}
  function Se (line 2) | function Se(e,t){return[Object(u.a)(e)>u.o?e+Math.round(-e/u.w)*u.w:e,t]}
  function Ce (line 2) | function Ce(e,t,n){return(e%=u.w)?t||n?Ee(je(e),Ae(t,n)):je(e):t||n?Ae(t...
  function Te (line 2) | function Te(e){return function(t,n){return[(t+=e)>u.o?t-u.w:t<-u.o?t+u.w...
  function je (line 2) | function je(e){var t=Te(e);return t.invert=Te(-e),t}
  function Ae (line 2) | function Ae(e,t){var n=Object(u.g)(e),r=Object(u.t)(e),i=Object(u.g)(t),...
  function t (line 2) | function t(t){return(t=e(t[0]*u.r,t[1]*u.r))[0]*=u.h,t[1]*=u.h,t}
  function Pe (line 2) | function Pe(e,t,n,r,i,o){if(n){var a=Object(u.g)(t),s=Object(u.t)(t),c=r...
  function Ne (line 2) | function Ne(e,t){(t=w(t))[0]-=e,S(t);var n=Object(u.b)(-t[1]);return((-t...
  function a (line 2) | function a(){var a=n.apply(this,arguments),s=r.apply(this,arguments)*u.r...
  function Le (line 2) | function Le(e,t,n,r){this.x=e,this.z=t,this.o=n,this.e=r,this.v=!1,this....
  function Fe (line 2) | function Fe(e){if(t=e.length){for(var t,n,r=0,i=e[0];++r<t;)i.n=n=e[r],n...
  function Ue (line 2) | function Ue(e){return Object(u.a)(e[0])<=u.o?e[0]:Object(u.s)(e[0])*((Ob...
  function h (line 2) | function h(t,n){e(t,n)&&i.point(t,n)}
  function p (line 2) | function p(e,t){c.point(e,t)}
  function g (line 2) | function g(){d.point=p,c.lineStart()}
  function y (line 2) | function y(){d.point=h,c.lineEnd()}
  function m (line 2) | function m(e,t){s.push([e,t]),l.point(e,t)}
  function b (line 2) | function b(){l.lineStart(),s=[]}
  function v (line 2) | function v(){m(s[0][0],s[0][1]),l.lineEnd();var e,t,n,r,c=l.clean(),d=u....
  function Ve (line 2) | function Ve(e){return e.length>1}
  function qe (line 2) | function qe(e,t){return((e=e.x)[0]<0?e[1]-u.l-u.i:u.l-e[1])-((t=t.x)[0]<...
  function o (line 2) | function o(e,n){return Object(u.g)(e)*Object(u.g)(n)>t}
  function a (line 2) | function a(e,n,r){var i=[1,0,0],o=k(w(e),w(n)),a=_(o,o),s=o[0],c=a-s*s;i...
  function s (line 2) | function s(t,n){var i=r?e:u.o-e,o=0;return t<-i?o|=1:t>i&&(o|=2),n<-i?o|...
  function Ze (line 2) | function Ze(e,t,n,r){function i(i,o){return e<=i&&i<=n&&t<=o&&o<=r}funct...
  function it (line 2) | function it(){rt.point=rt.lineEnd=l.a}
  function ot (line 2) | function ot(e,t){e*=u.r,t*=u.r,Je=e,Qe=Object(u.t)(t),et=Object(u.g)(t),...
  function at (line 2) | function at(e,t){e*=u.r,t*=u.r;var n=Object(u.t)(t),r=Object(u.g)(t),i=O...
  function ht (line 2) | function ht(e,t){return!(!e||!dt.hasOwnProperty(e.type))&&dt[e.type](e,t)}
  function pt (line 2) | function pt(e,t){return 0===lt(e,t)}
  function gt (line 2) | function gt(e,t){for(var n,r,i,o=0,a=e.length;o<a;o++){if(0===(r=lt(e[o]...
  function yt (line 2) | function yt(e,t){return!!He(e.map(mt),bt(t))}
  function mt (line 2) | function mt(e){return(e=e.map(bt)).pop(),e}
  function bt (line 2) | function bt(e){return[e[0]*u.r,e[1]*u.r]}
  function xt (line 2) | function xt(e,t,n){var r=Object(We.s)(e,t-u.i,n).concat(t);return functi...
  function wt (line 2) | function wt(e,t,n){var r=Object(We.s)(e,t-u.i,n).concat(t);return functi...
  function _t (line 2) | function _t(){var e,t,n,r,i,o,a,s,c,l,f,d,h=10,p=h,g=90,y=360,m=2.5;func...
  function kt (line 2) | function kt(){return _t()()}
  function Tt (line 2) | function Tt(e){return function(t){var n=new jt;for(var r in e)n[r]=e[r];...
  function jt (line 2) | function jt(){}
  function Mt (line 2) | function Mt(e,t,n){var r=e.clipExtent&&e.clipExtent();return e.scale(150...
  function Pt (line 2) | function Pt(e,t,n){return Mt(e,(function(n){var r=t[1][0]-t[0][0],i=t[1]...
  function Nt (line 2) | function Nt(e,t,n){return Pt(e,[[0,0],t],n)}
  function Dt (line 2) | function Dt(e,t,n){return Mt(e,(function(n){var r=+t,i=r/(n[1][0]-n[0][0...
  function Rt (line 2) | function Rt(e,t,n){return Mt(e,(function(n){var r=+t,i=r/(n[1][1]-n[0][1...
  function n (line 2) | function n(r,i,o,a,s,c,l,f,d,h,p,g,y,m){var b=l-r,v=f-i,x=b*b+v*v;if(x>4...
  function y (line 2) | function y(n,r){n=e(n,r),t.point(n[0],n[1])}
  function m (line 2) | function m(){l=NaN,g.point=b,t.lineStart()}
  function b (line 2) | function b(r,i){var o=w([r,i]),a=e(r,i);n(l,f,u,d,h,p,l=a[0],f=a[1],u=r,...
  function v (line 2) | function v(){g.point=y,t.lineEnd()}
  function x (line 2) | function x(){m(),g.point=_,g.lineEnd=k}
  function _ (line 2) | function _(e,t){b(r=e,t),i=l,o=f,a=d,s=h,c=p,g.point=b}
  function k (line 2) | function k(){n(l,f,u,d,h,p,i,o,r,a,s,c,16,t),g.lineEnd=v,v()}
  function Ft (line 2) | function Ft(e,t,n,r,i){function o(o,a){return[t+e*(o*=r),n-e*(a*=i)]}ret...
  function zt (line 2) | function zt(e,t,n,r,i,o){var a=Object(u.g)(o),s=Object(u.t)(o),c=a*e,l=s...
  function Ut (line 2) | function Ut(e){return Ht((function(){return e}))()}
  function Ht (line 2) | function Ht(e){var t,n,r,i,o,a,s,c,l,f,d=150,h=480,p=250,g=0,y=0,m=0,b=0...
  function Wt (line 2) | function Wt(e){var t=0,n=u.o/3,r=Ht(e),i=r(t,n);return i.parallels=funct...
  function Yt (line 2) | function Yt(e,t){var n=Object(u.t)(e),r=(n+Object(u.t)(t))/2;if(Object(u...
  function f (line 2) | function f(e){var t=e[0],a=e[1];return o=null,n.point(t,a),o||(r.point(t...
  function d (line 2) | function d(){return e=t=null,f}
  function Gt (line 2) | function Gt(e){return function(t,n){var r=Object(u.g)(t),i=Object(u.g)(n...
  function Xt (line 2) | function Xt(e){return function(t,n){var r=Object(u.u)(t*t+n*n),i=e(r),o=...
  function en (line 2) | function en(e,t){return[e,Object(u.n)(Object(u.v)((u.l+t)/2))]}
  function nn (line 2) | function nn(e){var t,n,r,i=Ut(e),o=i.center,a=i.scale,s=i.translate,c=i....
  function rn (line 2) | function rn(e){return Object(u.v)((u.l+e)/2)}
  function on (line 2) | function on(e,t){var n=Object(u.g)(e),r=e===t?Object(u.t)(e):Object(u.n)...
  function sn (line 2) | function sn(e,t){return[e,t]}
  function un (line 2) | function un(e,t){var n=Object(u.g)(e),r=e===t?Object(u.t)(e):(n-Object(u...
  function yn (line 2) | function yn(e,t){var n=Object(u.c)(gn*Object(u.t)(t)),r=n*n,i=r*r*r;retu...
  function bn (line 2) | function bn(e,t){var n=Object(u.g)(t),r=Object(u.g)(e)*n;return[n*Object...
  function v (line 2) | function v(){return g=s*f,y=s*d,o=a=null,x}
  function x (line 2) | function x(n){var r=n[0]*g,i=n[1]*y;if(h){var o=i*e-r*t;r=r*e+i*t,i=o}re...
  function wn (line 2) | function wn(e,t){var n=t*t,r=n*n;return[e*(.8707-.131979*n+r*(r*(.003971...
  function kn (line 2) | function kn(e,t){return[Object(u.g)(t)*Object(u.t)(e),Object(u.t)(t)]}
  function En (line 2) | function En(e,t){var n=Object(u.g)(t),r=1+Object(u.g)(e)*n;return[n*Obje...
  function Cn (line 2) | function Cn(e,t){return[Object(u.n)(Object(u.v)((u.l+t)/2)),-e]}
  function f (line 2) | function f(e,t,n,r){function i(e){return e.length?e.pop()+" ":""}return ...
  function a (line 2) | function a(){return i.a.useContext(o.a)}
  function a (line 2) | function a(e){if(null===e||void 0===e)throw new TypeError("Object.assign...
  function a (line 2) | function a(e){return Math.sqrt(e.value)}
  function s (line 2) | function s(e){return function(t){t.children||(t.r=Math.max(0,+e(t)||0))}}
  function c (line 2) | function c(e,t){return function(n){if(i=n.children){var i,o,a,s=i.length...
  function u (line 2) | function u(e){return function(t){var n=t.parent;t.r*=e,n&&(t.x=n.x+e*t.x...
  function l (line 2) | function l(i){return i.x=t/2,i.y=n/2,e?i.eachBefore(s(e)).eachAfter(c(r,...
  function a (line 2) | function a(a){var s=a.height+1;return a.x0=a.y0=n,a.x1=e,a.y1=t/s,a.each...
  function p (line 2) | function p(e){return e.x0=e.y0=0,e.x1=n,e.y1=s,e.eachBefore(g),c=[0],t&&...
  function g (line 2) | function g(t){var n=c[t.depth],r=t.x0+n,i=t.y0+n,o=t.x1-n,a=t.y1-n;o<r&&...
  function n (line 2) | function n(e,n,a,s,c){if((u=e._squarify)&&u.ratio===t)for(var u,l,f,d,h,...
  function i (line 2) | function i(e){return((e=Math.exp(e))+1/e)/2}
  function a (line 2) | function a(e){return e.innerRadius}
  function s (line 2) | function s(e){return e.outerRadius}
  function c (line 2) | function c(e){return e.startAngle}
  function u (line 2) | function u(e){return e.endAngle}
  function l (line 2) | function l(e){return e&&e.padAngle}
  function f (line 2) | function f(e,t,n,r,i,a,s,c){var u=n-e,l=r-t,f=s-i,d=c-a,h=d*u-f*l;if(!(h...
  function d (line 2) | function d(e,t,n,r,i,a,s){var c=e-n,u=t-r,l=(s?a:-a)/Object(o.l)(c*c+u*u...
  function b (line 2) | function b(){var i,a,s=+e.apply(this,arguments),c=+t.apply(this,argument...
  function e (line 2) | function e(){}
  function a (line 2) | function a(e){var t=-1,n=null==e?0:e.length;for(this.__data__=new r;++t<...
  function i (line 2) | function i(){this._arr=[],this._keyIndices={}}
  function a (line 2) | function a(s){var c=i[s]={onStack:!0,lowlink:t,index:t++};if(n.push(s),e...
  function i (line 2) | function i(e){var t={},n={},i=[];if(r.each(e.sinks(),(function a(s){if(r...
  function o (line 2) | function o(){}
  function i (line 2) | function i(e,t,n,o,a,s){r.has(o,t)||(o[t]=!0,n||s.push(t),r.each(a(t),(f...
  function a (line 2) | function a(e,t){return r.forEach(e.nodes(),(function n(i){r.forEach(t.no...
  function s (line 2) | function s(e,t){return r.minBy(t.edges(),(function(n){if(e.hasNode(n.v)!...
  function c (line 2) | function c(e,t,n){r.forEach(e.nodes(),(function(e){t.node(e).rank+=n}))}
  function i (line 2) | function i(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(...
  function b (line 2) | function b(){if(p){var r="getAllResponseHeaders"in p?c(p.getAllResponseH...
  function c (line 2) | function c(e,t){return r.isPlainObject(e)&&r.isPlainObject(t)?r.merge(e,...
  function u (line 2) | function u(i){r.isUndefined(t[i])?r.isUndefined(e[i])||(n[i]=c(void 0,e[...
  function r (line 2) | function r(e){this.message=e}
  function c (line 2) | function c(e){return"translate("+(e+.5)+",0)"}
  function u (line 2) | function u(e){return"translate(0,"+(e+.5)+")"}
  function l (line 2) | function l(e){return function(t){return+e(t)}}
  function f (line 2) | function f(e){var t=Math.max(0,e.bandwidth()-1)/2;return e.round()&&(t=M...
  function d (line 2) | function d(){return!this.__axis}
  function h (line 2) | function h(e,t){var n=[],r=null,i=null,h=6,p=6,g=3,y=1===e||4===e?-1:1,m...
  function p (line 2) | function p(e){return h(1,e)}
  function g (line 2) | function g(e){return h(2,e)}
  function y (line 2) | function y(e){return h(3,e)}
  function m (line 2) | function m(e){return h(4,e)}
  function v (line 2) | function v(){for(var e,t=0,n=arguments.length,r={};t<n;++t){if(!(e=argum...
  function x (line 2) | function x(e){this._=e}
  function w (line 2) | function w(e,t){return e.trim().split(/^|\s+/).map((function(e){var n=""...
  function _ (line 2) | function _(e,t){for(var n,r=0,i=e.length;r<i;++r)if((n=e[r]).name===t)re...
  function k (line 2) | function k(e,t,n){for(var r=0,i=e.length;r<i;++r)if(e[r].name===t){e[r]=...
  function E (line 2) | function E(){}
  function C (line 2) | function C(){return[]}
  function M (line 2) | function M(e,t){this.ownerDocument=e.ownerDocument,this.namespaceURI=e.n...
  function P (line 2) | function P(e,t,n,r,i,o){for(var a,s=0,c=t.length,u=o.length;s<u;++s)(a=t...
  function N (line 2) | function N(e,t,n,r,i,o,a){var s,c,u,l={},f=t.length,d=o.length,h=new Arr...
  function D (line 2) | function D(e,t){return e<t?-1:e>t?1:e>=t?0:NaN}
  function B (line 2) | function B(e){return function(){this.removeAttribute(e)}}
  function F (line 2) | function F(e){return function(){this.removeAttributeNS(e.space,e.local)}}
  function z (line 2) | function z(e,t){return function(){this.setAttribute(e,t)}}
  function U (line 2) | function U(e,t){return function(){this.setAttributeNS(e.space,e.local,t)}}
  function H (line 2) | function H(e,t){return function(){var n=t.apply(this,arguments);null==n?...
  function W (line 2) | function W(e,t){return function(){var n=t.apply(this,arguments);null==n?...
  function V (line 2) | function V(e){return function(){this.style.removeProperty(e)}}
  function q (line 2) | function q(e,t,n){return function(){this.style.setProperty(e,t,n)}}
  function $ (line 2) | function $(e,t,n){return function(){var r=t.apply(this,arguments);null==...
  function G (line 2) | function G(e,t){return e.style.getPropertyValue(t)||Y(e).getComputedStyl...
  function X (line 2) | function X(e){return function(){delete this[e]}}
  function K (line 2) | function K(e,t){return function(){this[e]=t}}
  function Z (line 2) | function Z(e,t){return function(){var n=t.apply(this,arguments);null==n?...
  function J (line 2) | function J(e){return e.trim().split(/^|\s+/)}
  function Q (line 2) | function Q(e){return e.classList||new ee(e)}
  function ee (line 2) | function ee(e){this._node=e,this._names=J(e.getAttribute("class")||"")}
  function te (line 2) | function te(e,t){for(var n=Q(e),r=-1,i=t.length;++r<i;)n.add(t[r])}
  function ne (line 2) | function ne(e,t){for(var n=Q(e),r=-1,i=t.length;++r<i;)n.remove(t[r])}
  function re (line 2) | function re(e){return function(){te(this,e)}}
  function ie (line 2) | function ie(e){return function(){ne(this,e)}}
  function oe (line 2) | function oe(e,t){return function(){(t.apply(this,arguments)?te:ne)(this,...
  function ae (line 2) | function ae(){this.textContent=""}
  function se (line 2) | function se(e){return function(){this.textContent=e}}
  function ce (line 2) | function ce(e){return function(){var t=e.apply(this,arguments);this.text...
  function ue (line 2) | function ue(){this.innerHTML=""}
  function le (line 2) | function le(e){return function(){this.innerHTML=e}}
  function fe (line 2) | function fe(e){return function(){var t=e.apply(this,arguments);this.inne...
  function de (line 2) | function de(){this.nextSibling&&this.parentNode.appendChild(this)}
  function he (line 2) | function he(){this.previousSibling&&this.parentNode.insertBefore(this,th...
  function pe (line 2) | function pe(e){return function(){var t=this.ownerDocument,n=this.namespa...
  function ge (line 2) | function ge(e){return function(){return this.ownerDocument.createElement...
  function me (line 2) | function me(){return null}
  function be (line 2) | function be(){var e=this.parentNode;e&&e.removeChild(this)}
  function ve (line 2) | function ve(){var e=this.cloneNode(!1),t=this.parentNode;return t?t.inse...
  function xe (line 2) | function xe(){var e=this.cloneNode(!0),t=this.parentNode;return t?t.inse...
  function ke (line 2) | function ke(e,t,n){return e=Oe(e,t,n),function(t){var n=t.relatedTarget;...
  function Oe (line 2) | function Oe(e,t,n){return function(r){var i=_e;_e=r;try{e.call(this,this...
  function Ee (line 2) | function Ee(e){return e.trim().split(/^|\s+/).map((function(e){var t="",...
  function Se (line 2) | function Se(e){return function(){var t=this.__on;if(t){for(var n,r=0,i=-...
  function Ce (line 2) | function Ce(e,t,n){var r=we.hasOwnProperty(e.type)?ke:Oe;return function...
  function Te (line 2) | function Te(e,t,n,r){var i=_e;e.sourceEvent=_e,_e=e;try{return t.apply(n...
  function je (line 2) | function je(e,t,n){var r=Y(e),i=r.CustomEvent;"function"===typeof i?i=ne...
  function Ae (line 2) | function Ae(e,t){return function(){return je(this,e,t)}}
  function Me (line 2) | function Me(e,t){return function(){return je(this,e,t.apply(this,argumen...
  function Ne (line 2) | function Ne(e,t){this._groups=e,this._parents=t}
  function De (line 2) | function De(){return new Ne([[document.documentElement]],Pe)}
  function t (line 2) | function t(t,n){return t&&n?e(t.__data__,n.__data__):!t-!n}
  function Le (line 2) | function Le(){_e.stopImmediatePropagation()}
  function ze (line 2) | function ze(e,t){var n=e.document.documentElement,r=Ie(e).on("dragstart....
  function nt (line 2) | function nt(){return Je||(tt(rt),Je=et.now()+Qe)}
  function rt (line 2) | function rt(){Je=0}
  function it (line 2) | function it(){this._call=this._time=this._next=null}
  function ot (line 2) | function ot(e,t,n){var r=new it;return r.restart(e,t,n),r}
  function at (line 2) | function at(){nt(),++Ge;for(var e,t=Ue;t;)(e=Je-t._time)>=0&&t._call.cal...
  function st (line 2) | function st(){Je=(Ze=et.now())+Qe,Ge=Xe=0;try{at()}finally{Ge=0,function...
  function ct (line 2) | function ct(){var e=et.now(),t=e-Ze;t>1e3&&(Qe-=t,Ze=e)}
  function ut (line 2) | function ut(e){Ge||(Xe&&(Xe=clearTimeout(Xe)),e-Je>24?(e<1/0&&(Xe=setTim...
  function o (line 2) | function o(e){n.state=1,n.timer.restart(a,n.delay,n.time),n.delay<=e&&a(...
  function a (line 2) | function a(o){var u,l,f,d;if(1!==n.state)return c();for(u in i)if((d=i[u...
  function s (line 2) | function s(t){for(var i=t<n.duration?n.ease.call(null,t/n.duration):(n.t...
  function c (line 2) | function c(){for(var r in n.state=6,n.timer.stop(),delete i[t],i)return;...
  function pt (line 2) | function pt(e,t){var n=yt(e,t);if(n.state>0)throw new Error("too late; a...
  function gt (line 2) | function gt(e,t){var n=yt(e,t);if(n.state>3)throw new Error("too late; a...
  function yt (line 2) | function yt(e,t){var n=e.__transition;if(!n||!(n=n[t]))throw new Error("...
  function vt (line 2) | function vt(e,t){var n,r;return function(){var i=gt(this,e),o=i.tween;if...
  function xt (line 2) | function xt(e,t,n){var r,i;if("function"!==typeof n)throw new Error;retu...
  function wt (line 2) | function wt(e,t,n){var r=e._id;return e.each((function(){var e=gt(this,r...
  function Ct (line 2) | function Ct(e){return function(){this.removeAttribute(e)}}
  function Tt (line 2) | function Tt(e){return function(){this.removeAttributeNS(e.space,e.local)}}
  function jt (line 2) | function jt(e,t,n){var r,i,o=n+"";return function(){var a=this.getAttrib...
  function At (line 2) | function At(e,t,n){var r,i,o=n+"";return function(){var a=this.getAttrib...
  function Mt (line 2) | function Mt(e,t,n){var r,i,o;return function(){var a,s,c=n(this);if(null...
  function Pt (line 2) | function Pt(e,t,n){var r,i,o;return function(){var a,s,c=n(this);if(null...
  function Nt (line 2) | function Nt(e,t){return function(n){this.setAttribute(e,t.call(this,n))}}
  function Dt (line 2) | function Dt(e,t){return function(n){this.setAttributeNS(e.space,e.local,...
  function Rt (line 2) | function Rt(e,t){var n,r;function i(){var i=t.apply(this,arguments);retu...
  function It (line 2) | function It(e,t){var n,r;function i(){var i=t.apply(this,arguments);retu...
  function Lt (line 2) | function Lt(e,t){return function(){pt(this,e).delay=+t.apply(this,argume...
  function Bt (line 2) | function Bt(e,t){return t=+t,function(){pt(this,e).delay=t}}
  function Ft (line 2) | function Ft(e,t){return function(){gt(this,e).duration=+t.apply(this,arg...
  function zt (line 2) | function zt(e,t){return t=+t,function(){gt(this,e).duration=t}}
  function Ut (line 2) | function Ut(e,t){if("function"!==typeof t)throw new Error;return functio...
  function Ht (line 2) | function Ht(e,t,n){var r,i,o=function(e){return(e+"").trim().split(/^|\s...
  function Yt (line 2) | function Yt(e){return function(){this.style.removeProperty(e)}}
  function Vt (line 2) | function Vt(e,t,n){return function(r){this.style.setProperty(e,t.call(th...
  function qt (line 2) | function qt(e,t,n){var r,i;function o(){var o=t.apply(this,arguments);re...
  function $t (line 2) | function $t(e){return function(t){this.textContent=e.call(this,t)}}
  function Gt (line 2) | function Gt(e){var t,n;function r(){var r=e.apply(this,arguments);return...
  function Kt (line 2) | function Kt(e,t,n,r){this._groups=e,this._parents=t,this._name=n,this._i...
  function Zt (line 2) | function Zt(e){return Re().transition(e)}
  function Jt (line 2) | function Jt(){return++Xt}
  function en (line 2) | function en(e){return e*e*e}
  function tn (line 2) | function tn(e){return--e*e*e+1}
  function nn (line 2) | function nn(e){return((e*=2)<=1?e*e*e:(e-=2)*e*e+2)/2}
  function on (line 2) | function on(e,t){for(var n;!(n=e.__transition)||!(n=n[t]);)if(!(e=e.pare...
  function ln (line 2) | function ln(){_e.stopImmediatePropagation()}
  function yn (line 2) | function yn(e){return[+e[0],+e[1]]}
  function mn (line 2) | function mn(e){return[yn(e[0]),yn(e[1])]}
  function bn (line 2) | function bn(e){return function(t){return qe(t,_e.touches,e)}}
  function Cn (line 2) | function Cn(e){return{type:e}}
  function Tn (line 2) | function Tn(){return!_e.ctrlKey&&!_e.button}
  function jn (line 2) | function jn(){var e=this.ownerSVGElement||this;return e.hasAttribute("vi...
  function An (line 2) | function An(){return navigator.maxTouchPoints||"ontouchstart"in this}
  function Mn (line 2) | function Mn(e){for(;!e.__brush;)if(!(e=e.parentNode))return;return e.__b...
  function Pn (line 2) | function Pn(e){return e[0][0]===e[1][0]||e[0][1]===e[1][1]}
  function Nn (line 2) | function Nn(e){var t=e.__brush;return t?t.dim.output(t.selection):null}
  function Dn (line 2) | function Dn(){return Ln(vn)}
  function Rn (line 2) | function Rn(){return Ln(xn)}
  function Ln (line 2) | function Ln(e){var t,n=jn,r=Tn,i=An,o=!0,a=O("start","brush","end"),s=6;...
  function Yn (line 2) | function Yn(e){return function(t,n){return e(t.source.value+t.target.val...
  function o (line 2) | function o(o){var a,s,c,u,l,f,d=o.length,h=[],p=Object(i.s)(d),g=[],y=[]...
  function Xn (line 2) | function Xn(e){return e.source}
  function Kn (line 2) | function Kn(e){return e.target}
  function Zn (line 2) | function Zn(e){return e.radius}
  function Jn (line 2) | function Jn(e){return e.startAngle}
  function Qn (line 2) | function Qn(e){return e.endAngle}
  function a (line 2) | function a(){var a,s=qn.call(arguments),c=e.apply(this,s),u=t.apply(this...
  function or (line 2) | function or(e,t,n,r,i,o,a,s,c,u){this.target=e,this.type=t,this.subject=...
  function ar (line 2) | function ar(){return!_e.ctrlKey&&!_e.button}
  function sr (line 2) | function sr(){return this.parentNode}
  function cr (line 2) | function cr(e){return null==e?{x:_e.x,y:_e.y}:e}
  function ur (line 2) | function ur(){return navigator.maxTouchPoints||"ontouchstart"in this}
  function d (line 2) | function d(e){e.on("mousedown.drag",h).filter(s).on("touchstart.drag",y)...
  function h (line 2) | function h(){if(!r&&i.apply(this,arguments)){var a=v("mouse",o.apply(thi...
  function p (line 2) | function p(){if(Be(),!n){var r=_e.clientX-e,i=_e.clientY-t;n=r*r+i*i>f}c...
  function g (line 2) | function g(){Ie(_e.view).on("mousemove.drag mouseup.drag",null),ze(_e.vi...
  function y (line 2) | function y(){if(i.apply(this,arguments)){var e,t,n=_e.changedTouches,r=o...
  function m (line 2) | function m(){var e,t,n=_e.changedTouches,r=n.length;for(e=0;e<r;++e)(t=c...
  function b (line 2) | function b(){var e,t,n=_e.changedTouches,i=n.length;for(r&&clearTimeout(...
  function v (line 2) | function v(e,t,n,r,i){var o,s,f,h=n(t,e),p=u.copy();if(Te(new or(d,"befo...
  function hr (line 2) | function hr(e){return new Function("d","return {"+e.map((function(e,t){r...
  function pr (line 2) | function pr(e){var t=Object.create(null),n=[];return e.forEach((function...
  function gr (line 2) | function gr(e,t){var n=e+"",r=n.length;return r<t?new Array(t-r+1).join(...
  function yr (line 2) | function yr(e){var t,n=e.getUTCHours(),r=e.getUTCMinutes(),i=e.getUTCSec...
  function r (line 2) | function r(e,t){var r,i=[],o=e.length,a=0,s=0,c=o<=0,u=!1;function l(){i...
  function i (line 2) | function i(t,n){return t.map((function(t){return n.map((function(e){retu...
  function o (line 2) | function o(t){return t.map(a).join(e)}
  function a (line 2) | function a(e){return null==e?"":e instanceof Date?yr(e):t.test(e+="")?'"...
  function Dr (line 2) | function Dr(e){for(var t in e){var n,r,i=e[t].trim();if(i)if("true"===i)...
  function Ir (line 2) | function Ir(e){return+e}
  function Lr (line 2) | function Lr(e){return e*e}
  function Br (line 2) | function Br(e){return e*(2-e)}
  function Fr (line 2) | function Fr(e){return((e*=2)<=1?e*e:--e*(2-e)+1)/2}
  function n (line 2) | function n(e){return Math.pow(e,t)}
  function n (line 2) | function n(e){return 1-Math.pow(1-e,t)}
  function n (line 2) | function n(e){return((e*=2)<=1?Math.pow(e,t):2-Math.pow(2-e,t))/2}
  function Vr (line 2) | function Vr(e){return 1===+e?1:1-Math.cos(e*Yr)}
  function qr (line 2) | function qr(e){return Math.sin(e*Yr)}
  function $r (line 2) | function $r(e){return(1-Math.cos(Wr*e))/2}
  function Gr (line 2) | function Gr(e){return 1.0009775171065494*(Math.pow(2,-10*e)-.0009765625)}
  function Xr (line 2) | function Xr(e){return Gr(1-+e)}
  function Kr (line 2) | function Kr(e){return 1-Gr(e)}
  function Zr (line 2) | function Zr(e){return((e*=2)<=1?Gr(1-e):2-Gr(e-1))/2}
  function Jr (line 2) | function Jr(e){return 1-Math.sqrt(1-e*e)}
  function Qr (line 2) | function Qr(e){return Math.sqrt(1- --e*e)}
  function ei (line 2) | function ei(e){return((e*=2)<=1?1-Math.sqrt(1-e*e):Math.sqrt(1-(e-=2)*e)...
  function ri (line 2) | function ri(e){return 1-ii(1-e)}
  function ii (line 2) | function ii(e){return(e=+e)<ti?ni*e*e:e<.7272727272727273?ni*(e-=.545454...
  function oi (line 2) | function oi(e){return((e*=2)<=1?1-ii(1-e):ii(e-1)+1)/2}
  function n (line 2) | function n(e){return(e=+e)*e*(t*(e-1)+e)}
  function n (line 2) | function n(e){return--e*e*((e+1)*t+e)+1}
  function n (line 2) | function n(e){return((e*=2)<1?e*e*((t+1)*e-t):(e-=2)*e*((t+1)*e+t)+2)/2}
  function i (line 2) | function i(e){return t*Gr(- --e)*Math.sin((r-e)/n)}
  function i (line 2) | function i(e){return 1-t*Gr(e=+e)*Math.sin((e+r)/n)}
  function i (line 2) | function i(e){return((e=2*e-1)<0?t*Gr(-e)*Math.sin((r-e)/n):2-t*Gr(e)*Ma...
  function pi (line 2) | function pi(e){if(!e.ok)throw new Error(e.status+" "+e.statusText);retur...
  function yi (line 2) | function yi(e){if(!e.ok)throw new Error(e.status+" "+e.statusText);retur...
  function bi (line 2) | function bi(e){if(!e.ok)throw new Error(e.status+" "+e.statusText);retur...
  function xi (line 2) | function xi(e){return function(t,n,r){return 2===arguments.length&&"func...
  function wi (line 2) | function wi(e,t,n,r){3===arguments.length&&"function"===typeof n&&(r=n,n...
  function Ei (line 2) | function Ei(e){if(!e.ok)throw new Error(e.status+" "+e.statusText);if(20...
  function Ci (line 2) | function Ci(e){return function(t,n){return vi(t,n).then((function(t){ret...
  function r (line 2) | function r(){var r,i,o=n.length,a=0,s=0;for(r=0;r<o;++r)a+=(i=n[r]).x,s+...
  function Di (line 2) | function Di(e,t,n,r){if(isNaN(t)||isNaN(n))return e;var i,o,a,s,c,u,l,f,...
  function Ii (line 2) | function Ii(e){return e[0]}
  function Li (line 2) | function Li(e){return e[1]}
  function Bi (line 2) | function Bi(e,t,n){var r=new Fi(null==t?Ii:t,null==n?Li:n,NaN,NaN,NaN,Na...
  function Fi (line 2) | function Fi(e,t,n,r,i,o){this._x=e,this._y=t,this._x0=n,this._y0=r,this....
  function zi (line 2) | function zi(e){for(var t={data:e.data},n=t;e=e.next;)n=n.next={data:e.da...
  function Hi (line 2) | function Hi(e){return e.x+e.vx}
  function Wi (line 2) | function Wi(e){return e.y+e.vy}
  function o (line 2) | function o(){for(var e,o,s,c,u,l,f,d=t.length,h=0;h<i;++h)for(o=Bi(t,Hi,...
  function a (line 2) | function a(e){if(e.data)return e.r=n[e.data.index];for(var t=e.r=0;t<4;+...
  function s (line 2) | function s(){if(t){var r,i,o=t.length;for(n=new Array(o),r=0;r<o;++r)i=t...
  function Vi (line 2) | function Vi(e){return e.index}
  function qi (line 2) | function qi(e,t){var n=e.get(t);if(!n)throw new Error("missing: "+t);ret...
  function l (line 2) | function l(r){for(var i=0,a=e.length;i<u;++i)for(var s,c,l,f,d,h,p,g=0;g...
  function f (line 2) | function f(){if(r){var s,c,u=r.length,l=e.length,f=Object(tr.c)(r,a);for...
  function d (line 2) | function d(){if(r)for(var n=0,i=e.length;n<i;++n)t[n]=+s(e[n],n,e)}
  function h (line 2) | function h(){if(r)for(var t=0,i=e.length;t<i;++t)n[t]=+c(e[t],t,e)}
  function Gi (line 2) | function Gi(e){return e.x}
  function Xi (line 2) | function Xi(e){return e.y}
  function l (line 2) | function l(){f(),u.call("tick",t),n<r&&(c.stop(),u.call("end",t))}
  function f (line 2) | function f(r){var c,u,l=e.length;void 0===r&&(r=1);for(var f=0;f<r;++f)f...
  function d (line 2) | function d(){for(var t,n=0,r=e.length;n<r;++n){if((t=e[n]).index=n,null!...
  function h (line 2) | function h(t){return t.initialize&&t.initialize(e),t}
  function c (line 2) | function c(r){var i,o=e.length,a=Bi(e,Gi,Xi).visitAfter(l);for(n=r,i=0;i...
  function u (line 2) | function u(){if(e){var t,n,o=e.length;for(r=new Array(o),t=0;t<o;++t)n=e...
  function l (line 2) | function l(e){var t,n,i,o,a,s=0,c=0;if(e.length){for(i=o=a=0;a<4;++a)(t=...
  function f (line 2) | function f(e,i,c,u){if(!e.value)return!0;var l=e.x-t.x,f=e.y-t.y,d=u-i,h...
  function s (line 2) | function s(e){for(var a=0,s=r.length;a<s;++a){var c=r[a],u=c.x-t||1e-6,l...
  function c (line 2) | function c(){if(r){var t,n=r.length;for(i=new Array(n),o=new Array(n),t=...
  function o (line 2) | function o(e){for(var i,o=0,a=t.length;o<a;++o)(i=t[o]).vx+=(r[o]-i.x)*n...
  function a (line 2) | function a(){if(t){var o,a=t.length;for(n=new Array(a),r=new Array(a),o=...
  function o (line 2) | function o(e){for(var i,o=0,a=t.length;o<a;++o)(i=t[o]).vy+=(r[o]-i.y)*n...
  function a (line 2) | function a(){if(t){var o,a=t.length;for(n=new Array(a),r=new Array(a),o=...
  function uo (line 2) | function uo(e,t){return e[0]-t[0]||e[1]-t[1]}
  function lo (line 2) | function lo(e){for(var t,n,r,i=e.length,o=[0,1],a=2,s=2;s<i;++s){for(;a>...
  function n (line 2) | function n(e,n){return e=null==e?0:+e,n=null==n?1:+n,1===arguments.lengt...
  function n (line 2) | function n(e,n){var r,i;return e=null==e?0:+e,n=null==n?1:+n,function(){...
  function n (line 2) | function n(){var e=mo.source(t).apply(this,arguments);return function(){...
  function n (line 2) | function n(e){return function(){for(var n=0,r=0;r<e;++r)n+=t();return n}}
  function n (line 2) | function n(e){var n=vo.source(t)(e);return function(){return n()/e}}
  function n (line 2) | function n(e){return function(){return-Math.log(1-t())/e}}
  function _o (line 2) | function _o(e,t){switch(arguments.length){case 0:break;case 1:this.range...
  function ko (line 2) | function ko(e,t){switch(arguments.length){case 0:break;case 1:this.inter...
  function To (line 2) | function To(){var e=Object(tr.c)(),t=[],n=[],r=Co;function i(i){var o=i+...
  function jo (line 2) | function jo(){var e,t,n=To().unknown(void 0),r=n.domain,o=n.range,a=[0,1...
  function Ao (line 2) | function Ao(e){var t=e.copy;return e.padding=e.paddingOuter,delete e.pad...
  function Mo (line 2) | function Mo(){return Ao(jo.apply(null,arguments).paddingInner(1))}
  function Ro (line 2) | function Ro(e){return e}
  function Io (line 2) | function Io(e,t){return(t-=e=+e)?function(n){return(n-e)/t}:(n=isNaN(t)?...
  function Lo (line 2) | function Lo(e){var t,n=e[0],r=e[e.length-1];return n>r&&(t=n,n=r,r=t),fu...
  function Bo (line 2) | function Bo(e,t,n){var r=e[0],i=e[1],o=t[0],a=t[1];return i<r?(r=Io(i,r)...
  function Fo (line 2) | function Fo(e,t,n){var r=Math.min(e.length,t.length)-1,o=new Array(r),a=...
  function zo (line 2) | function zo(e,t){return t.domain(e.domain()).range(e.range()).interpolat...
  function Uo (line 2) | function Uo(){var e,t,n,r,i,o,a=Do,s=Do,c=We.a,u=Ro;function l(){return ...
  function Ho (line 2) | function Ho(e,t){return Uo()(e,t)}
  function Xo (line 2) | function Xo(e){var t=e.domain;return e.ticks=function(e){var n=t();retur...
  function Ko (line 2) | function Ko(){var e=Ho(Ro,Ro);return e.copy=function(){return zo(e,Ko())...
  function Zo (line 2) | function Zo(e){var t;function n(e){return isNaN(e=+e)?t:e}return n.inver...
  function Qo (line 2) | function Qo(e){return Math.log(e)}
  function ea (line 2) | function ea(e){return Math.exp(e)}
  function ta (line 2) | function ta(e){return-Math.log(-e)}
  function na (line 2) | function na(e){return-Math.exp(-e)}
  function ra (line 2) | function ra(e){return isFinite(e)?+("1e"+e):e<0?0:e}
  function ia (line 2) | function ia(e){return function(t){return-e(-t)}}
  function oa (line 2) | function oa(e){var t,n,r=e(Qo,ea),o=r.domain,a=10;function s(){return t=...
  function aa (line 2) | function aa(){var e=oa(Uo()).domain([1,10]);return e.copy=function(){ret...
  function sa (line 2) | function sa(e){return function(t){return Math.sign(t)*Math.log1p(Math.ab...
  function ca (line 2) | function ca(e){return function(t){return Math.sign(t)*Math.expm1(Math.ab...
  function ua (line 2) | function ua(e){var t=1,n=e(sa(t),ca(t));return n.constant=function(n){re...
  function la (line 2) | function la(){var e=ua(Uo());return e.copy=function(){return zo(e,la())....
  function fa (line 2) | function fa(e){return function(t){return t<0?-Math.pow(-t,e):Math.pow(t,...
  function da (line 2) | function da(e){return e<0?-Math.sqrt(-e):Math.sqrt(e)}
  function ha (line 2) | function ha(e){return e<0?-e*e:e*e}
  function pa (line 2) | function pa(e){var t=e(Ro,Ro),n=1;function r(){return 1===n?e(Ro,Ro):.5=...
  function ga (line 2) | function ga(){var e=pa(Uo());return e.copy=function(){return zo(e,ga())....
  function ya (line 2) | function ya(){return ga.apply(null,arguments).exponent(.5)}
  function ma (line 2) | function ma(){var e,t=[],n=[],r=[];function o(){var e=0,o=Math.max(1,n.l...
  function ba (line 2) | function ba(){var e,t=0,n=1,r=1,o=[.5],a=[0,1];function s(t){return t<=t...
  function va (line 2) | function va(){var e,t=[.5],n=[0,1],r=1;function o(o){return o<=o?n[Objec...
  function Ra (line 2) | function Ra(e){return new Date(e)}
  function Ia (line 2) | function Ia(e){return e instanceof Date?+e:+new Date(+e)}
  function La (line 2) | function La(e,t,n,r,o,a,s,c,u){var l=Ho(Ro,Ro),f=l.invert,d=l.domain,h=u...
  function qa (line 2) | function qa(){var e,t,n,r,i,o=0,a=1,s=Ro,c=!1;function u(t){return isNaN...
  function $a (line 2) | function $a(e,t){return t.domain(e.domain()).interpolator(e.interpolator...
  function Ga (line 2) | function Ga(){var e=Xo(qa()(Ro));return e.copy=function(){return $a(e,Ga...
  function Xa (line 2) | function Xa(){var e=oa(qa()).domain([1,10]);return e.copy=function(){ret...
  function Ka (line 2) | function Ka(){var e=ua(qa());return e.copy=function(){return $a(e,Ka())....
  function Za (line 2) | function Za(){var e=pa(qa());return e.copy=function(){return $a(e,Za())....
  function Ja (line 2) | function Ja(){return Za.apply(null,arguments).exponent(.5)}
  function Qa (line 2) | function Qa(){var e=[],t=Ro;function n(n){if(!isNaN(n=+n))return t((Obje...
  function es (line 2) | function es(){var e,t,n,r,i,o,a,s=0,c=.5,u=1,l=Ro,f=!1;function d(e){ret...
  function ts (line 2) | function ts(){var e=Xo(es()(Ro));return e.copy=function(){return $a(e,ts...
  function ns (line 2) | function ns(){var e=oa(es()).domain([.1,1,10]);return e.copy=function(){...
  function rs (line 2) | function rs(){var e=ua(es());return e.copy=function(){return $a(e,rs())....
  function is (line 2) | function is(){var e=pa(es());return e.copy=function(){return $a(e,is())....
  function os (line 2) | function os(){return is.apply(null,arguments).exponent(.5)}
  function Mc (line 2) | function Mc(e){var t=e.length;return function(n){return e[Math.max(0,Mat...
  function Bc (line 2) | function Bc(){return new Fc}
  function Fc (line 2) | function Fc(){this._="@"+(++Lc).toString(36)}
  function Xc (line 2) | function Xc(e,t,n){this.target=e,this.type=t,this.transform=n}
  function Kc (line 2) | function Kc(e,t,n){this.k=e,this.x=t,this.y=n}
  function Jc (line 2) | function Jc(e){for(;!e.__zoom;)if(!(e=e.parentNode))return Zc;return e._...
  function Qc (line 2) | function Qc(){_e.stopImmediatePropagation()}
  function tu (line 2) | function tu(){return!_e.ctrlKey&&!_e.button}
  function nu (line 2) | function nu(){var e=this;return e instanceof SVGElement?(e=e.ownerSVGEle...
  function ru (line 2) | function ru(){return this.__zoom||Zc}
  function iu (line 2) | function iu(){return-_e.deltaY*(1===_e.deltaMode?.05:_e.deltaMode?1:.002)}
  function ou (line 2) | function ou(){return navigator.maxTouchPoints||"ontouchstart"in this}
  function au (line 2) | function au(e,t,n){var r=e.invertX(t[0][0])-n[0][0],i=e.invertX(t[1][0])...
  function p (line 2) | function p(e){e.property("__zoom",ru).on("wheel.zoom",w).on("mousedown.z...
  function g (line 2) | function g(e,t){return(t=Math.max(s[0],Math.min(s[1],t)))===e.k?e:new Kc...
  function y (line 2) | function y(e,t,n){var r=t[0]-n[0]*e.k,i=t[1]-n[1]*e.k;return r===e.x&&i=...
  function m (line 2) | function m(e){return[(+e[0][0]+ +e[1][0])/2,(+e[0][1]+ +e[1][1])/2]}
  function b (line 2) | function b(e,t,n){e.on("start.zoom",(function(){v(this,arguments).start(...
  function v (line 2) | function v(e,t,n){return!n&&e.__zooming||new x(e,t)}
  function x (line 2) | function x(e,t){this.that=e,this.args=t,this.active=0,this.extent=r.appl...
  function w (line 2) | function w(){if(n.apply(this,arguments)){var e=v(this,arguments),t=this....
  function _ (line 2) | function _(){if(!t&&n.apply(this,arguments)){var e=v(this,arguments,!0),...
  function k (line 2) | function k(){if(n.apply(this,arguments)){var e=this.__zoom,t=$e(this),o=...
  function E (line 2) | function E(){if(n.apply(this,arguments)){var t,r,i,o,a=_e.touches,s=a.le...
  function S (line 2) | function S(){if(this.__zooming){var t,n,r,o,a=v(this,arguments),s=_e.cha...
  function C (line 2) | function C(){if(this.__zooming){var e,n,r=v(this,arguments),i=_e.changed...
  function g (line 2) | function g(){p.point=y}
  function y (line 2) | function y(e,t){p.point=m,r=o=e,i=a=t}
  function m (line 2) | function m(e,t){h.add(a*e-o*t),o=e,a=t}
  function b (line 2) | function b(){m(r,i)}
  function R (line 2) | function R(e,t){E+=e,S+=t,++C}
  function I (line 2) | function I(){D.point=L}
  function L (line 2) | function L(e,t){D.point=B,R(w=e,_=t)}
  function B (line 2) | function B(e,t){var n=e-w,r=t-_,i=Object(l.u)(n*n+r*r);T+=i*(w+e)/2,j+=i...
  function F (line 2) | function F(){D.point=R}
  function z (line 2) | function z(){D.point=H}
  function U (line 2) | function U(){W(v,x)}
  function H (line 2) | function H(e,t){D.point=W,R(v=w=e,x=_=t)}
  function W (line 2) | function W(e,t){var n=e-w,r=t-_,i=Object(l.u)(n*n+r*r);T+=i*(w+e)/2,j+=i...
  function V (line 2) | function V(e){this._context=e}
  function Q (line 2) | function Q(e,t){J.point=ee,$=X=e,G=K=t}
  function ee (line 2) | function ee(e,t){X-=e,K-=t,Z.add(Object(l.u)(X*X+K*K)),X=e,K=t}
  function ne (line 2) | function ne(){this._string=[]}
  function re (line 2) | function re(e){return"m0,"+e+"a"+e+","+e+" 0 1,1 0,"+-2*e+"a"+e+","+e+" ...
  function o (line 2) | function o(e){return e&&("function"===typeof i&&r.pointRadius(+i.apply(t...
  function l (line 2) | function l(r){var i,o,l,f,d,h=r.length,p=0,g=new Array(h),y=new Array(h)...
  function e (line 2) | function e(e){var t=void 0===e?{}:e,n=t.locale,r=t.instance,o=t.moment;t...
  function r (line 2) | function r(e){if(Array.isArray(e))return e}
  function r (line 2) | function r(){throw new TypeError("Invalid attempt to destructure non-ite...
  function r (line 2) | function r(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Ob...
  function o (line 2) | function o(e){return e&&"[object Function]"==={}.toString.call(e)}
  function a (line 2) | function a(e,t){if(1!==e.nodeType)return[];var n=e.ownerDocument.default...
  function s (line 2) | function s(e){return"HTML"===e.nodeName?e:e.parentNode||e.host}
  function c (line 2) | function c(e){if(!e)return document.body;switch(e.nodeName){case"HTML":c...
  function u (line 2) | function u(e){return e&&e.referenceNode?e.referenceNode:e}
  function d (line 2) | function d(e){return 11===e?l:10===e?f:l||f}
  function h (line 2) | function h(e){if(!e)return document.documentElement;for(var t=d(10)?docu...
  function p (line 2) | function p(e){return null!==e.parentNode?p(e.parentNode):e}
  function g (line 2) | function g(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.docu...
  function y (line 2) | function y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[...
  function m (line 2) | function m(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&argumen...
  function b (line 2) | function b(e,t){var n="x"===t?"Left":"Top",r="Left"===n?"Right":"Bottom"...
  function v (line 2) | function v(e,t,n,r){return Math.max(t["offset"+e],t["scroll"+e],n["clien...
  function x (line 2) | function x(e){var t=e.body,n=e.documentElement,r=d(10)&&getComputedStyle...
  function e (line 2) | function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.en...
  function E (line 2) | function E(e){return O({},e,{right:e.left+e.width,bottom:e.top+e.height})}
  function S (line 2) | function S(e){var t={};try{if(d(10)){t=e.getBoundingClientRect();var n=y...
  function C (line 2) | function C(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&argumen...
  function T (line 2) | function T(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments...
  function j (line 2) | function j(e){var t=e.nodeName;if("BODY"===t||"HTML"===t)return!1;if("fi...
  function A (line 2) | function A(e){if(!e||!e.parentElement||d())return document.documentEleme...
  function M (line 2) | function M(e,t,n,r){var i=arguments.length>4&&void 0!==arguments[4]&&arg...
  function P (line 2) | function P(e){return e.width*e.height}
  function N (line 2) | function N(e,t,n,r,i){var o=arguments.length>5&&void 0!==arguments[5]?ar...
  function D (line 2) | function D(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?argume...
  function R (line 2) | function R(e){var t=e.ownerDocument.defaultView.getComputedStyle(e),n=pa...
  function I (line 2) | function I(e){var t={left:"right",right:"left",bottom:"top",top:"bottom"...
  function L (line 2) | function L(e,t,n){n=n.split("-")[0];var r=R(e),i={width:r.width,height:r...
  function B (line 2) | function B(e,t){return Array.prototype.find?e.find(t):e.filter(t)[0]}
  function F (line 2) | function F(e,t,n){return(void 0===n?e:e.slice(0,function(e,t,n){if(Array...
  function z (line 2) | function z(){if(!this.state.isDestroyed){var e={instance:this,styles:{},...
  function U (line 2) | function U(e,t){return e.some((function(e){var n=e.name;return e.enabled...
  function H (line 2) | function H(e){for(var t=[!1,"ms","Webkit","Moz","O"],n=e.charAt(0).toUpp...
  function W (line 2) | function W(){return this.state.isDestroyed=!0,U(this.modifiers,"applySty...
  function Y (line 2) | function Y(e){var t=e.ownerDocument;return t?t.defaultView:window}
  function V (line 2) | function V(e,t,n,r){var i="BODY"===e.nodeName,o=i?e.ownerDocument.defaul...
  function q (line 2) | function q(e,t,n,r){n.updateBound=r,Y(e).addEventListener("resize",n.upd...
  function $ (line 2) | function $(){this.state.eventsEnabled||(this.state=q(this.reference,this...
  function G (line 2) | function G(){var e,t;this.state.eventsEnabled&&(cancelAnimationFrame(thi...
  function X (line 2) | function X(e){return""!==e&&!isNaN(parseFloat(e))&&isFinite(e)}
  function K (line 2) | function K(e,t){Object.keys(t).forEach((function(n){var r="";-1!==["widt...
  function J (line 2) | function J(e,t,n){var r=B(e,(function(e){return e.name===t})),i=!!r&&e.s...
  function te (line 2) | function te(e){var t=arguments.length>1&&void 0!==arguments[1]&&argument...
  function oe (line 2) | function oe(e,t,n,r){var i=[0,0],o=-1!==["right","left"].indexOf(r),a=e....
  function e (line 2) | function e(t,n){var r=this,a=arguments.length>2&&void 0!==arguments[2]?a...
  function l (line 2) | function l(e,t,n){var h=n||{};return!!(h.strict?o(e,t):e===t)||(!e||!t||...
  function f (line 2) | function f(e){return null===e||void 0===e}
  function d (line 2) | function d(e){return!(!e||"object"!==typeof e||"number"!==typeof e.lengt...
  function c (line 2) | function c(e){var t=e.values,n=void 0===t?{xs:0,sm:600,md:960,lg:1280,xl...
  function u (line 2) | function u(e,t,n){var i;return Object(a.a)({gutters:function(){var n=arg...
  function _ (line 2) | function _(e,t,n,r){var i=r.light||r,o=r.dark||1.5*r;e[t]||(e.hasOwnProp...
  function k (line 2) | function k(e){var t=e.primary,n=void 0===t?{light:h[300],main:h[500],dar...
  function O (line 2) | function O(e){return Math.round(1e5*e)/1e5}
  function C (line 2) | function C(e,t){var n="function"===typeof t?t(e):t,r=n.fontFamily,s=void...
  function T (line 2) | function T(){return["".concat(arguments.length<=0?void 0:arguments[0],"p...
  function P (line 2) | function P(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0...
  function p (line 2) | function p(e,t,n){return e===t?e.firstChild:t&&t.nextElementSibling?t.ne...
  function g (line 2) | function g(e,t,n){return e===t?n?e.firstChild:e.lastChild:t&&t.previousE...
  function y (line 2) | function y(e,t){if(void 0===t)return!0;var n=e.innerText;return void 0==...
  function m (line 2) | function m(e,t,n,r,i,o){for(var a=!1,s=i(e,t,!!t&&n);s;){if(s===e.firstC...
  function r (line 2) | function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enume...
  function i (line 2) | function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){va...
  function o (line 2) | function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[...
  function r (line 2) | function r(e){for(var t="https://material-ui.com/production-error/?code=...
  function o (line 2) | function o(e){return e&&"object"===Object(i.a)(e)&&e.constructor===Object}
  function a (line 2) | function a(e,t){var n=arguments.length>2&&void 0!==arguments[2]?argument...
  function f (line 2) | function f(e){return"scale(".concat(e,", ").concat(Math.pow(e,2),")")}
  function p (line 2) | function p(e,t){return parseInt(e[t],10)||0}
  function m (line 2) | function m(e){for(var t="https://reactjs.org/docs/error-decoder.html?inv...
  function x (line 2) | function x(e,t,n){this.props=e,this.context=t,this.refs=v,this.updater=n...
  function w (line 2) | function w(){}
  function _ (line 2) | function _(e,t,n){this.props=e,this.context=t,this.refs=v,this.updater=n...
  function T (line 2) | function T(e,t,n){var r,i={},a=null,s=null;if(null!=t)for(r in void 0!==...
  function j (line 2) | function j(e){return"object"===typeof e&&null!==e&&e.$$typeof===o}
  function P (line 2) | function P(e,t,n,r){if(M.length){var i=M.pop();return i.result=e,i.keyPr...
  function N (line 2) | function N(e){e.result=null,e.keyPrefix=null,e.func=null,e.context=null,...
  function D (line 2) | function D(e,t,n,r){var i=typeof e;"undefined"!==i&&"boolean"!==i||(e=nu...
  function R (line 2) | function R(e,t,n){return null==e?0:D(e,"",t,n)}
  function I (line 2) | function I(e,t){return"object"===typeof e&&null!==e&&null!=e.key?functio...
  function L (line 2) | function L(e,t){e.func.call(e.context,t,e.count++)}
  function B (line 2) | function B(e,t,n){var r=e.result,i=e.keyPrefix;e=e.func.call(e.context,t...
  function F (line 2) | function F(e,t,n,r,i){var o="";null!=n&&(o=(""+n).replace(A,"$&/")+"/"),...
  function z (line 2) | function z(){var e=O.current;if(null===e)throw Error(m(321));return e}
  function a (line 2) | function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?inv...
  function u (line 2) | function u(){if(s)for(var e in c){var t=c[e],n=s.indexOf(e);if(!(-1<n))t...
  function l (line 2) | function l(e,t,n){if(h[e])throw Error(a(100,e));h[e]=t,p[e]=t.eventTypes...
  function g (line 2) | function g(e,t,n,r,i,o,a,s,c){var u=Array.prototype.slice.call(arguments...
  function w (line 2) | function w(e,t,n,r,i,o,a,s,c){y=!1,m=null,g.apply(x,arguments)}
  function E (line 2) | function E(e,t,n){var r=e.type||"unknown-event";e.currentTarget=O(n),fun...
  function S (line 2) | function S(e,t){if(null==t)throw Error(a(30));return null==e?t:Array.isA...
  function C (line 2) | function C(e,t,n){Array.isArray(e)?e.forEach(t,n):e&&t.call(n,e)}
  function j (line 2) | function j(e){if(e){var t=e._dispatchListeners,n=e._dispatchInstances;if...
  function A (line 2) | function A(e){if(null!==e&&(T=S(T,e)),e=T,T=null,e){if(C(e,j),T)throw Er...
  function P (line 2) | function P(e,t){var n=e.stateNode;if(!n)return null;var r=_(n);if(!r)ret...
  function K (line 2) | function K(e){return null===e||"object"!==typeof e?null:"function"===typ...
  function Z (line 2) | function Z(e){if(null==e)return null;if("function"===typeof e)return e.d...
  function J (line 2) | function J(e){var t="";do{e:switch(e.tag){case 3:case 4:case 6:case 7:ca...
  function re (line 2) | function re(e){if(e=k(e)){if("function"!==typeof ee)throw Error(a(280));...
  function ie (line 2) | function ie(e){te?ne?ne.push(e):ne=[e]:te=e}
  function oe (line 2) | function oe(){if(te){var e=te,t=ne;if(ne=te=null,re(e),t)for(e=0;e<t.len...
  function ae (line 2) | function ae(e,t){return e(t)}
  function se (line 2) | function se(e,t,n,r){return e(t,n,r)}
  function ce (line 2) | function ce(){}
  function de (line 2) | function de(){null===te&&null===ne||(ce(),oe())}
  function me (line 2) | function me(e,t,n,r,i,o){this.acceptsBooleans=2===t||3===t||4===t,this.a...
  function xe (line 2) | function xe(e){return e[1].toUpperCase()}
  function we (line 2) | function we(e){switch(typeof e){case"boolean":case"number":case"object":...
  function _e (line 2) | function _e(e,t,n,r){var i=be.hasOwnProperty(t)?be[t]:null;(null!==i?0==...
  function ke (line 2) | function ke(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCas...
  function Oe (line 2) | function Oe(e){e._valueTracker||(e._valueTracker=function(e){var t=ke(e)...
  function Ee (line 2) | function Ee(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n...
  function Se (line 2) | function Se(e,t){var n=t.checked;return i({},t,{defaultChecked:void 0,de...
  function Ce (line 2) | function Ce(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t....
  function Te (line 2) | function Te(e,t){null!=(t=t.checked)&&_e(e,"checked",t,!1)}
  function je (line 2) | function je(e,t){Te(e,t);var n=we(t.value),r=t.type;if(null!=n)"number"=...
  function Ae (line 2) | function Ae(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defau...
  function Me (line 2) | function Me(e,t,n){"number"===t&&e.ownerDocument.activeElement===e||(nul...
  function Pe (line 2) | function Pe(e,t){return e=i({children:void 0},t),(t=function(e){var t=""...
  function Ne (line 2) | function Ne(e,t,n,r){if(e=e.options,t){t={};for(var i=0;i<n.length;i++)t...
  function De (line 2) | function De(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(a(91));r...
  function Re (line 2) | function Re(e,t){var n=t.value;if(null==n){if(n=t.defaultValue,null!=(t=...
  function Ie (line 2) | function Ie(e,t){var n=we(t.value),r=we(t.defaultValue);null!=n&&((n=""+...
  function Le (line 2) | function Le(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!...
  function ze (line 2) | function ze(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";ca...
  function Ue (line 2) | function Ue(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?ze(t...
  function Ve (line 2) | function Ve(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.n...
  function qe (line 2) | function qe(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["W...
  function Ke (line 2) | function Ke(e){if(Ge[e])return Ge[e];if(!$e[e])return e;var t,n=$e[e];fo...
  function nt (line 2) | function nt(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else...
  function rt (line 2) | function rt(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&(null!=...
  function it (line 2) | function it(e){if(nt(e)!==e)throw Error(a(188))}
  function ot (line 2) | function ot(e){if(e=function(e){var t=e.alternate;if(!t){if(null===(t=nt...
  function vt (line 2) | function vt(e,t,n,r){return{blockedOn:e,topLevelType:t,eventSystemFlags:...
  function xt (line 2) | function xt(e,t){switch(e){case"focus":case"blur":ft=null;break;case"dra...
  function wt (line 2) | function wt(e,t,n,r,i){return null===e||e.nativeEvent!==i?(e=vt(t,n,r,i)...
  function _t (line 2) | function _t(e){var t=dr(e.target);if(null!==t){var n=nt(t);if(null!==n)i...
  function kt (line 2) | function kt(e){if(null!==e.blockedOn)return!1;var t=Pn(e.topLevelType,e....
  function Ot (line 2) | function Ot(e,t,n){kt(e)&&n.delete(t)}
  function Et (line 2) | function Et(){for(ut=!1;0<lt.length;){var e=lt[0];if(null!==e.blockedOn)...
  function St (line 2) | function St(e,t){e.blockedOn===t&&(e.blockedOn=null,ut||(ut=!0,o.unstabl...
  function Ct (line 2) | function Ct(e){function t(t){return St(t,e)}if(0<lt.length){St(lt[0],e);...
  function Tt (line 2) | function Tt(e){return(e=e.target||e.srcElement||window).correspondingUse...
  function jt (line 2) | function jt(e){do{e=e.return}while(e&&5!==e.tag);return e||null}
  function At (line 2) | function At(e,t,n){(t=P(e,n.dispatchConfig.phasedRegistrationNames[t]))&...
  function Mt (line 2) | function Mt(e){if(e&&e.dispatchConfig.phasedRegistrationNames){for(var t...
  function Pt (line 2) | function Pt(e,t,n){e&&n&&n.dispatchConfig.registrationName&&(t=P(e,n.dis...
  function Nt (line 2) | function Nt(e){e&&e.dispatchConfig.registrationName&&Pt(e._targetInst,nu...
  function Dt (line 2) | function Dt(e){C(e,Mt)}
  function Rt (line 2) | function Rt(){return!0}
  function It (line 2) | function It(){return!1}
  function Lt (line 2) | function Lt(e,t,n,r){for(var i in this.dispatchConfig=e,this._targetInst...
  function Bt (line 2) | function Bt(e,t,n,r){if(this.eventPool.length){var i=this.eventPool.pop(...
  function Ft (line 2) | function Ft(e){if(!(e instanceof this))throw Error(a(279));e.destructor(...
  function zt (line 2) | function zt(e){e.eventPool=[],e.getPooled=Bt,e.release=Ft}
  function t (line 2) | function t(){}
  function n (line 2) | function n(){return r.apply(this,arguments)}
  function Vt (line 2) | function Vt(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&...
  function Xt (line 2) | function Xt(e){var t=this.nativeEvent;return t.getModifierState?t.getMod...
  function Kt (line 2) | function Kt(){return Xt}
  function On (line 2) | function On(e){var t=e.targetInst,n=t;do{if(!n){e.ancestors.push(n);brea...
  function Sn (line 2) | function Sn(e,t){Cn(t,e,!1)}
  function Cn (line 2) | function Cn(e,t,n){switch(_n(t)){case 0:var r=Tn.bind(null,t,1);break;ca...
  function Tn (line 2) | function Tn(e,t,n){le||ce();var r=Mn,i=le;le=!0;try{se(r,e,t,n)}finally{...
  function jn (line 2) | function jn(e,t,n){wn(xn,Mn.bind(null,e,t,n))}
  function An (line 2) | function An(e,t,n,r){if(kn.length){var i=kn.pop();i.topLevelType=e,i.eve...
  function Mn (line 2) | function Mn(e,t,n){if(En)if(0<lt.length&&-1<mt.indexOf(e))e=vt(null,e,t,...
  function Pn (line 2) | function Pn(e,t,n){var r=Tt(n);if(null!==(r=dr(r))){var i=nt(r);if(null=...
  function Nn (line 2) | function Nn(e){if(!Q)return!1;var t=(e="on"+e)in document;return t||((t=...
  function Rn (line 2) | function Rn(e){var t=Dn.get(e);return void 0===t&&(t=new Set,Dn.set(e,t)...
  function In (line 2) | function In(e,t,n){if(!n.has(e)){switch(e){case"scroll":Cn(t,"scroll",!0...
  function Fn (line 2) | function Fn(e,t,n){return null==t||"boolean"===typeof t||""===t?"":n||"n...
  function zn (line 2) | function zn(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=...
  function Hn (line 2) | function Hn(e,t){if(t){if(Un[e]&&(null!=t.children||null!=t.dangerouslyS...
  function Wn (line 2) | function Wn(e,t){if(-1===e.indexOf("-"))return"string"===typeof t.is;swi...
  function Yn (line 2) | function Yn(e,t){var n=Rn(e=9===e.nodeType||11===e.nodeType?e:e.ownerDoc...
  function Vn (line 2) | function Vn(){}
  function qn (line 2) | function qn(e){if("undefined"===typeof(e=e||("undefined"!==typeof docume...
  function $n (line 2) | function $n(e){for(;e&&e.firstChild;)e=e.firstChild;return e}
  function Gn (line 2) | function Gn(e,t){var n,r=$n(e);for(e=0;r;){if(3===r.nodeType){if(n=e+r.t...
  function Xn (line 2) | function Xn(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===...
  function Kn (line 2) | function Kn(){for(var e=window,t=qn();t instanceof e.HTMLIFrameElement;)...
  function Zn (line 2) | function Zn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(...
  function nr (line 2) | function nr(e,t){switch(e){case"button":case"input":case"select":case"te...
  function rr (line 2) | function rr(e,t){return"textarea"===e||"option"===e||"noscript"===e||"st...
  function ar (line 2) | function ar(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||...
  function sr (line 2) | function sr(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){va...
  function dr (line 2) | function dr(e){var t=e[ur];if(t)return t;for(var n=e.parentNode;n;){if(t...
  function hr (line 2) | function hr(e){return!(e=e[ur]||e[fr])||5!==e.tag&&6!==e.tag&&13!==e.tag...
  function pr (line 2) | function pr(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(a(...
  function gr (line 2) | function gr(e){return e[lr]||null}
  function vr (line 2) | function vr(){if(br)return br;var e,t,n=mr,r=n.length,i="value"in yr?yr....
  function Ar (line 2) | function Ar(e,t){switch(e){case"keyup":return-1!==_r.indexOf(t.keyCode);...
  function Mr (line 2) | function Mr(e){return"object"===typeof(e=e.detail)&&"data"in e?e.data:null}
  function Rr (line 2) | function Rr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"inpu...
  function Lr (line 2) | function Lr(e,t,n){return(e=Lt.getPooled(Ir.change,e,t,n)).type="change"...
  function zr (line 2) | function zr(e){A(e)}
  function Ur (line 2) | function Ur(e){if(Ee(pr(e)))return e}
  function Hr (line 2) | function Hr(e,t){if("change"===e)return t}
  function Yr (line 2) | function Yr(){Br&&(Br.detachEvent("onpropertychange",Vr),Fr=Br=null)}
  function Vr (line 2) | function Vr(e){if("value"===e.propertyName&&Ur(Fr))if(e=Lr(Fr,e,Tt(e)),l...
  function qr (line 2) | function qr(e,t,n){"focus"===e?(Yr(),Fr=n,(Br=t).attachEvent("onproperty...
  function $r (line 2) | function $r(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)retu...
  function Gr (line 2) | function Gr(e,t){if("click"===e)return Ur(t)}
  function Xr (line 2) | function Xr(e,t){if("input"===e||"change"===e)return Ur(t)}
  function ni (line 2) | function ni(e,t){if(ei(e,t))return!0;if("object"!==typeof e||null===e||"...
  function ui (line 2) | function ui(e,t){var n=t.window===t?t.document:9===t.nodeType?t:t.ownerD...
  function hi (line 2) | function hi(e){0>di||(e.current=fi[di],fi[di]=null,di--)}
  function pi (line 2) | function pi(e,t){di++,fi[di]=e.current,e.current=t}
  function vi (line 2) | function vi(e,t){var n=e.type.contextTypes;if(!n)return gi;var r=e.state...
  function xi (line 2) | function xi(e){return null!==(e=e.childContextTypes)&&void 0!==e}
  function wi (line 2) | function wi(e){hi(mi),hi(yi)}
  function _i (line 2) | function _i(e){hi(mi),hi(yi)}
  function ki (line 2) | function ki(e,t,n){if(yi.current!==gi)throw Error(a(168));pi(yi,t),pi(mi...
  function Oi (line 2) | function Oi(e,t,n){var r=e.stateNode;if(e=t.childContextTypes,"function"...
  function Ei (line 2) | function Ei(e){var t=e.stateNode;return t=t&&t.__reactInternalMemoizedMe...
  function Si (line 2) | function Si(e,t,n){var r=e.stateNode;if(!r)throw Error(a(169));n?(t=Oi(e...
  function qi (line 2) | function qi(){switch(Ni()){case Di:return 99;case Ri:return 98;case Ii:r...
  function $i (line 2) | function $i(e){switch(e){case 99:return Di;case 98:return Ri;case 97:ret...
  function Gi (line 2) | function Gi(e,t){return e=$i(e),Ci(e,t)}
  function Xi (line 2) | function Xi(e,t,n){return e=$i(e),Ti(e,t,n)}
  function Ki (line 2) | function Ki(e){return null===Ui?(Ui=[e],Hi=Ti(Di,Ji)):Ui.push(e),Fi}
  function Zi (line 2) | function Zi(){if(null!==Hi){var e=Hi;Hi=null,ji(e)}Ji()}
  function Ji (line 2) | function Ji(){if(!Wi&&null!==Ui){Wi=!0;var e=0;try{var t=Ui;Gi(99,(funct...
  function eo (line 2) | function eo(e,t,n){return 1073741821-(1+((1073741821-e+t/10)/(n/=10)|0))*n}
  function to (line 2) | function to(e,t){if(e&&e.defaultProps)for(var n in t=i({},t),e=e.default...
  function ao (line 2) | function ao(){oo=io=ro=null}
  function so (line 2) | function so(e,t){var n=e.type._context;pi(no,n._currentValue),n._current...
  function co (line 2) | function co(e){var t=no.current;hi(no),e.type._context._currentValue=t}
  function uo (line 2) | function uo(e,t){for(;null!==e;){var n=e.alternate;if(e.childExpirationT...
  function lo (line 2) | function lo(e,t){ro=e,oo=io=null,null!==(e=e.dependencies)&&null!==e.fir...
  function fo (line 2) | function fo(e,t){if(oo!==e&&!1!==t&&0!==t)if("number"===typeof t&&107374...
  function po (line 2) | function po(e){return{baseState:e,firstUpdate:null,lastUpdate:null,first...
  function go (line 2) | function go(e){return{baseState:e.baseState,firstUpdate:e.firstUpdate,la...
  function yo (line 2) | function yo(e,t){return{expirationTime:e,suspenseConfig:t,tag:0,payload:...
  function mo (line 2) | function mo(e,t){null===e.lastUpdate?e.firstUpdate=e.lastUpdate=t:(e.las...
  function bo (line 2) | function bo(e,t){var n=e.alternate;if(null===n){var r=e.updateQueue,i=nu...
  function vo (line 2) | function vo(e,t){var n=e.updateQueue;null===(n=null===n?e.updateQueue=po...
  function xo (line 2) | function xo(e,t){var n=e.alternate;return null!==n&&t===n
Condensed preview — 201 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,060K chars).
[
  {
    "path": ".gitignore",
    "chars": 3,
    "preview": ".vs"
  },
  {
    "path": "LICENSE",
    "chars": 1067,
    "preview": "MIT License\n\nCopyright (c) 2019 scale-tone\n\nPermission is hereby granted, free of charge, to any person obtaining a copy"
  },
  {
    "path": "README.md",
    "chars": 12035,
    "preview": "***\n   # THIS PROJECT HAS MOVED TO https://github.com/microsoft/DurableFunctionsMonitor \n***\n\n\n![logo](https://raw.githu"
  },
  {
    "path": "azure-pipelines.yml",
    "chars": 3403,
    "preview": "pool:\n  name: Azure Pipelines\n  vmImage: 'ubuntu-18.04'\n  demands: npm\n\nsteps:\n- task: Npm@1\n  displayName: 'npm install"
  },
  {
    "path": "custom-backends/README.md",
    "chars": 946,
    "preview": "# Custom backends for Durable Functions Monitor\n\nThese are Azure Function projects with Durable Functions Monitor 'injec"
  },
  {
    "path": "custom-backends/mssql/.gitignore",
    "chars": 4386,
    "preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# nuge"
  },
  {
    "path": "custom-backends/mssql/Dfm.MsSql.csproj",
    "chars": 985,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <TargetFramework>netcoreapp3.1</TargetFramework>\n    <AzureFunct"
  },
  {
    "path": "custom-backends/mssql/README.md",
    "chars": 1169,
    "preview": "# Durable Functions Monitor for MSSQL storage provider\n\nCustom Durable Functions Monitor backend project to be used with"
  },
  {
    "path": "custom-backends/mssql/Startup.cs",
    "chars": 4742,
    "preview": "using System;\nusing System.Collections.Generic;\nusing DurableFunctionsMonitor.DotNetBackend;\nusing Microsoft.Azure.WebJo"
  },
  {
    "path": "custom-backends/mssql/arm-template.json",
    "chars": 6630,
    "preview": "{\n    \"$schema\": \"https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#\",\n    \"contentVersion\""
  },
  {
    "path": "custom-backends/mssql/host.json",
    "chars": 477,
    "preview": "{\n    \"version\": \"2.0\",\n    \"extensions\": {\n        \"http\": {\n            \"routePrefix\": \"\"\n        },\n\n        \"durable"
  },
  {
    "path": "custom-backends/netcore21/.gitignore",
    "chars": 4386,
    "preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# nuge"
  },
  {
    "path": "custom-backends/netcore21/Dfm.NetCore21.csproj",
    "chars": 805,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n    <AzureFunct"
  },
  {
    "path": "custom-backends/netcore21/README.md",
    "chars": 506,
    "preview": "# Durable Functions Monitor on .Net Core 2.1\n\nCustom Durable Functions Monitor backend project, configured to run on .Ne"
  },
  {
    "path": "custom-backends/netcore21/Startup.cs",
    "chars": 365,
    "preview": "using DurableFunctionsMonitor.DotNetBackend;\nusing Microsoft.Azure.WebJobs;\nusing Microsoft.Azure.WebJobs.Hosting;\n\n[ass"
  },
  {
    "path": "custom-backends/netcore21/arm-template.json",
    "chars": 6320,
    "preview": "{\n    \"$schema\": \"https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#\",\n    \"contentVersion\""
  },
  {
    "path": "custom-backends/netcore21/host.json",
    "chars": 109,
    "preview": "{\n    \"version\": \"2.0\",\n    \"extensions\": {\n        \"http\": {\n            \"routePrefix\": \"\"\n        }\n    }\n}"
  },
  {
    "path": "custom-backends/netcore31/.gitignore",
    "chars": 4386,
    "preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# nuge"
  },
  {
    "path": "custom-backends/netcore31/Dfm.NetCore31.csproj",
    "chars": 805,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <TargetFramework>netcoreapp3.1</TargetFramework>\n    <AzureFunct"
  },
  {
    "path": "custom-backends/netcore31/README.md",
    "chars": 506,
    "preview": "# Durable Functions Monitor on .Net Core 3.1\n\nCustom Durable Functions Monitor backend project, configured to run on .Ne"
  },
  {
    "path": "custom-backends/netcore31/Startup.cs",
    "chars": 365,
    "preview": "using DurableFunctionsMonitor.DotNetBackend;\nusing Microsoft.Azure.WebJobs;\nusing Microsoft.Azure.WebJobs.Hosting;\n\n[ass"
  },
  {
    "path": "custom-backends/netcore31/arm-template.json",
    "chars": 6320,
    "preview": "{\n    \"$schema\": \"https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#\",\n    \"contentVersion\""
  },
  {
    "path": "custom-backends/netcore31/host.json",
    "chars": 109,
    "preview": "{\n    \"version\": \"2.0\",\n    \"extensions\": {\n        \"http\": {\n            \"routePrefix\": \"\"\n        }\n    }\n}"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/.gitignore",
    "chars": 1451,
    "preview": "# build output\n*.vsix\n\n# DurableFunctionsMonitor.Functions build output\nbackend\n\n# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-d"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/.vscode/extensions.json",
    "chars": 187,
    "preview": "{\n\t// See http://go.microsoft.com/fwlink/?LinkId=827846\n\t// for the documentation about the extensions.json format\n\t\"rec"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/.vscode/launch.json",
    "chars": 1409,
    "preview": "// A launch configuration that compiles the extension and then opens it inside a new window\n// Use IntelliSense to learn"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/.vscode/settings.json",
    "chars": 444,
    "preview": "// Place your settings in this file to overwrite default and user settings.\n{\n    \"files.exclude\": {\n        \"out\": fals"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/.vscode/tasks.json",
    "chars": 366,
    "preview": "// See https://go.microsoft.com/fwlink/?LinkId=733558\n// for the documentation about the tasks.json format\n{\n\t\"version\":"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/.vscodeignore",
    "chars": 133,
    "preview": ".vscode/**\n.vscode-test/**\nout/test/**\nsrc/**\n.gitignore\nvsc-extension-quickstart.md\n**/tsconfig.json\n**/tslint.json\n**/"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/CHANGELOG.md",
    "chars": 11707,
    "preview": "# Change Log\n\n## Version 5.1.0\n\n- Instance execution history can now be filtered by time and other field values:\n![image"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/LICENSE",
    "chars": 1067,
    "preview": "MIT License\n\nCopyright (c) 2019 scale-tone\n\nPermission is hereby granted, free of charge, to any person obtaining a copy"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/README.md",
    "chars": 2813,
    "preview": "# Durable Functions Monitor as a VsCode Extension\n\nList/monitor/debug your Azure Durable Functions inside VsCode.\n\n**Com"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/package.json",
    "chars": 14258,
    "preview": "{\n    \"name\": \"durablefunctionsmonitor\",\n    \"displayName\": \"Durable Functions Monitor\",\n    \"description\": \"Monitoring/"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/src/BackendProcess.ts",
    "chars": 11741,
    "preview": "const portscanner = require('portscanner');\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as vscode "
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/src/ConnStringUtils.ts",
    "chars": 2938,
    "preview": "\nimport { Settings } from './Settings';\n\nexport class ConnStringUtils {\n    \n    // Extracts AccountName from Storage Co"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/src/FunctionGraphList.ts",
    "chars": 3879,
    "preview": "import * as vscode from 'vscode';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as rimraf from 'rimra"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/src/FunctionGraphView.ts",
    "chars": 7095,
    "preview": "import * as vscode from 'vscode';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nimport { MonitorView } from '"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/src/MonitorTreeDataProvider.ts",
    "chars": 14996,
    "preview": "import * as vscode from 'vscode';\n\nimport { MonitorView } from \"./MonitorView\";\nimport { MonitorViewList } from \"./Monit"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/src/MonitorView.ts",
    "chars": 16067,
    "preview": "import * as vscode from 'vscode';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport axios from 'axios';\n\nim"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/src/MonitorViewList.ts",
    "chars": 16008,
    "preview": "import * as vscode from 'vscode';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport axios from 'axios';\n\nim"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/src/Settings.ts",
    "chars": 1939,
    "preview": "import * as vscode from 'vscode';\n\n// Returns config values stored in VsCode's settings.json\nexport function Settings():"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/src/SharedConstants.ts",
    "chars": 247,
    "preview": "export const NonceEnvironmentVariableName = 'DFM_NONCE';\nexport const NonceHeaderName = 'x-dfm-nonce';\nexport const MsSq"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/src/StorageAccountTreeItem.ts",
    "chars": 3488,
    "preview": "import * as vscode from 'vscode';\nimport * as path from 'path';\n\nimport { StorageConnectionSettings } from './BackendPro"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/src/StorageAccountTreeItems.ts",
    "chars": 3005,
    "preview": "import { MonitorView } from \"./MonitorView\";\nimport { MonitorViewList } from \"./MonitorViewList\";\nimport { StorageAccoun"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/src/SubscriptionTreeItem.ts",
    "chars": 2372,
    "preview": "import * as vscode from 'vscode';\nimport * as path from 'path';\n\nimport { StorageAccountTreeItem } from \"./StorageAccoun"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/src/SubscriptionTreeItems.ts",
    "chars": 10402,
    "preview": "import * as vscode from 'vscode';\n\nimport { StorageManagementClient } from \"@azure/arm-storage\";\nimport { StorageAccount"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/src/TaskHubTreeItem.ts",
    "chars": 2343,
    "preview": "import * as vscode from 'vscode';\nimport * as path from 'path';\n\nimport { StorageConnectionSettings } from './BackendPro"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/src/az-func-as-a-graph/FunctionsMap.d.ts",
    "chars": 808,
    "preview": "\nexport type FunctionsMap = {\n    [name: string]: {\n        bindings: any[],\n        isCalledBy: string[],\n        isSig"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/src/az-func-as-a-graph/traverseFunctionProject.ts",
    "chars": 13433,
    "preview": "import * as os from 'os';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { execSync } from 'child_proces"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/src/az-func-as-a-graph/traverseFunctionProjectUtils.ts",
    "chars": 11954,
    "preview": "import * as os from 'os';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { execSync } from 'child_proces"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/src/extension.ts",
    "chars": 4175,
    "preview": "import * as vscode from 'vscode';\n\nimport { MonitorTreeDataProvider } from './MonitorTreeDataProvider';\nimport { Functio"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/src/test/runTest.ts",
    "chars": 637,
    "preview": "import * as path from 'path';\n\nimport { runTests } from 'vscode-test';\n\nasync function main() {\n\ttry {\n\t\t// The folder c"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/src/test/suite/extension.test.ts",
    "chars": 444,
    "preview": "import * as assert from 'assert';\n\n// You can import and use all API from the 'vscode' module\n// as well as import your "
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/src/test/suite/index.ts",
    "chars": 739,
    "preview": "import * as path from 'path';\nimport * as Mocha from 'mocha';\nimport * as glob from 'glob';\n\nexport function run(): Prom"
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/tsconfig.json",
    "chars": 684,
    "preview": "{\n\t\"compilerOptions\": {\n\t\t\"module\": \"commonjs\",\n\t\t\"target\": \"es6\",\n\t\t\"outDir\": \"out\",\n\t\t\"lib\": [\n            \"dom\",\n\t\t\t\""
  },
  {
    "path": "durablefunctionsmonitor-vscodeext/tslint.json",
    "chars": 248,
    "preview": "{\n\t\"rules\": {\n\t\t\"no-string-throw\": true,\n\t\t\"no-unused-expression\": true,\n\t\t\"no-duplicate-variable\": true,\n\t\t\"curly\": tru"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/.gitignore",
    "chars": 4386,
    "preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# nuge"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/.vscode/extensions.json",
    "chars": 97,
    "preview": "{\n  \"recommendations\": [\n    \"ms-azuretools.vscode-azurefunctions\",\n    \"ms-vscode.csharp\"\n  ]\n}\n"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/.vscode/launch.json",
    "chars": 239,
    "preview": "{\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"name\": \"Attach to .NET Functions\",\n            "
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/.vscode/settings.json",
    "chars": 258,
    "preview": "{\n    \"azureFunctions.deploySubpath\": \"bin/Release/netcoreapp3.1/publish\",\n    \"azureFunctions.projectLanguage\": \"C#\",\n "
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/.vscode/tasks.json",
    "chars": 1970,
    "preview": "{\n    \"version\": \"2.0.0\",\n    \"tasks\": [\n        {\n            \"label\": \"clean\",\n            \"command\": \"dotnet\",\n      "
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/Common/Auth.cs",
    "chars": 15162,
    "preview": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.IdentityModel.Tokens.Jwt;\nusing S"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/Common/CustomTemplates.cs",
    "chars": 12530,
    "preview": "using System;\nusing System.Threading.Tasks;\nusing System.Linq;\nusing System.Collections.Generic;\nusing Microsoft.Windows"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/Common/DetailedOrchestrationStatus.cs",
    "chars": 3902,
    "preview": "using Microsoft.Azure.WebJobs.Extensions.DurableTask;\nusing System.Collections.Generic;\nusing Newtonsoft.Json.Linq;\nusin"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/Common/ExpandedOrchestrationStatus.cs",
    "chars": 3666,
    "preview": "using System;\nusing System.Threading.Tasks;\nusing System.Linq;\nusing Microsoft.Azure.WebJobs.Extensions.DurableTask;\nusi"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/Common/FilterClause.cs",
    "chars": 8597,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing System.Text.RegularExp"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/Common/Globals.cs",
    "chars": 7555,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\nusing Microsoft.AspNetCore.Http;\nusing Mic"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/Common/HttpHandlerBase.cs",
    "chars": 2138,
    "preview": "using System;\nusing System.Threading.Tasks;\nusing Microsoft.AspNetCore.Http;\nusing Microsoft.AspNetCore.Mvc;\nusing Micro"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/Common/OrchestrationHistory.cs",
    "chars": 7534,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Microsoft.Azure.WebJobs.Extensions.DurableTask;"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/Common/Setup.cs",
    "chars": 8336,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Reflection;\nusing Microsoft.Azure.WebJobs."
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/Common/TableClient.cs",
    "chars": 4862,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing Microsoft.Windows"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/DfmStatics/index.html",
    "chars": 55696,
    "preview": "<!doctype html><html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-sca"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/DfmStatics/manifest.json",
    "chars": 355,
    "preview": "{\n    \"short_name\": \"Durable Functions Monitor\",\n    \"name\": \"Durable Functions Monitor\",\n    \"icons\": [\n        {\n     "
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/DfmStatics/static/css/2.62e7949a.chunk.css",
    "chars": 3628,
    "preview": ".react-vis-magic-css-import-rule{display:inherit}.rv-treemap{font-size:12px;position:relative}.rv-treemap__leaf{overflow"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/DfmStatics/static/css/main.12374d2f.chunk.css",
    "chars": 4613,
    "preview": "html{overflow-y:scroll!important}body{margin:0;padding:0;font-family:sans-serif;display:table;width:100%}.top-appbar{box"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/DfmStatics/static/js/2.7e622828.chunk.js",
    "chars": 1852562,
    "preview": "/*! For license information please see 2.7e622828.chunk.js.LICENSE.txt */\n(this[\"webpackJsonpdurablefunctionsmonitor.rea"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/DfmStatics/static/js/2.7e622828.chunk.js.LICENSE.txt",
    "chars": 27868,
    "preview": "/*\n *          __        ___\n *    _____/ /___  __/ (_)____\n *   / ___/ __/ / / / / / ___/\n *  (__  ) /_/ /_/ / / (__  )"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/DfmStatics/static/js/main.7371b08e.chunk.js",
    "chars": 175837,
    "preview": "(this[\"webpackJsonpdurablefunctionsmonitor.react\"]=this[\"webpackJsonpdurablefunctionsmonitor.react\"]||[]).push([[0],{377"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/DfmStatics/static/js/runtime-main.edc3f937.js",
    "chars": 1605,
    "preview": "!function(e){function r(r){for(var n,i,l=r[0],a=r[1],f=r[2],p=0,s=[];p<l.length;p++)i=l[p],Object.prototype.hasOwnProper"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/Dockerfile",
    "chars": 386,
    "preview": "FROM mcr.microsoft.com/dotnet/sdk:3.1 AS installer-env\n\nCOPY . /src/dotnet-function-app\nRUN cd /src/dotnet-function-app "
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/Functions/About.cs",
    "chars": 1745,
    "preview": "using System;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.Azure.WebJobs;\nusing Microsoft.Azure.WebJobs.Extensions.Ht"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/Functions/CleanEntityStorage.cs",
    "chars": 2165,
    "preview": "using System.Threading.Tasks;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.Azure.WebJobs;\nusing Microsoft.Azure.WebJo"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/Functions/DeleteTaskHub.cs",
    "chars": 2558,
    "preview": "using System;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.Azure.WebJobs;\nusing Microsoft.Azure.WebJobs.Extensions.Ht"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/Functions/EasyAuthConfig.cs",
    "chars": 3278,
    "preview": "using System;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.Azure.WebJobs;\nusing Microsoft.Azure.WebJobs.Extensions.Ht"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/Functions/FunctionMap.cs",
    "chars": 1648,
    "preview": "using Microsoft.AspNetCore.Mvc;\nusing Microsoft.Azure.WebJobs;\nusing Microsoft.Azure.WebJobs.Extensions.Http;\nusing Micr"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/Functions/IdSuggestions.cs",
    "chars": 1938,
    "preview": "using System.Threading.Tasks;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.Azure.WebJobs;\nusing Microsoft.Azure.WebJo"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/Functions/ManageConnection.cs",
    "chars": 3414,
    "preview": "using System;\nusing System.IO;\nusing System.Threading.Tasks;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.Azure.WebJo"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/Functions/Orchestration.cs",
    "chars": 16355,
    "preview": "using System.Threading.Tasks;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.Azure.WebJobs;\nusing Microsoft.Azure.WebJo"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/Functions/Orchestrations.cs",
    "chars": 10167,
    "preview": "using System;\nusing System.Threading.Tasks;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.Azure.WebJobs;\nusing Microso"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/Functions/PurgeHistory.cs",
    "chars": 4025,
    "preview": "using System;\nusing System.Threading.Tasks;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.Azure.WebJobs;\nusing Microso"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/Functions/ServeStatics.cs",
    "chars": 9149,
    "preview": "using System.IO;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.Azure.WebJobs;\nusing Microsoft.Azure.WebJobs.Extensions"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/Functions/TaskHubNames.cs",
    "chars": 1104,
    "preview": "using Microsoft.AspNetCore.Mvc;\nusing Microsoft.Azure.WebJobs;\nusing Microsoft.Azure.WebJobs.Extensions.Http;\nusing Micr"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/LICENSE",
    "chars": 1067,
    "preview": "MIT License\n\nCopyright (c) 2019 scale-tone\n\nPermission is hereby granted, free of charge, to any person obtaining a copy"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/NUGET_README.md",
    "chars": 4413,
    "preview": "A monitoring/debugging UI tool for [Azure Durable Functions](https://docs.microsoft.com/en-us/azure/azure-functions/dura"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/README.md",
    "chars": 12901,
    "preview": "# DurableFunctionsMonitor.DotNetBackend\n\nBackend for DurableFunctionsMonitor, reimplemented in C#. Also serves the UI st"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/arm-template.json",
    "chars": 6156,
    "preview": "{\n    \"$schema\": \"https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#\",\n    \"contentVersion\""
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/dfm-aks-deployment.yaml",
    "chars": 883,
    "preview": "# Deploys DFM from Docker image.\n# Expects a secret named 'dfm-secret' to be previously created.\n# Here is how to create"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/durablefunctionsmonitor.dotnetbackend.csproj",
    "chars": 1568,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <TargetFramework>netcoreapp3.1</TargetFramework>\n    <AzureFunct"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/durablefunctionsmonitor.dotnetbackend.targets",
    "chars": 4414,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/host.json",
    "chars": 109,
    "preview": "{\n    \"version\": \"2.0\",\n    \"extensions\": {\n        \"http\": {\n            \"routePrefix\": \"\"\n        }\n    }\n}"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/nuspec.nuspec",
    "chars": 1164,
    "preview": "<?xml version=\"1.0\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd\">\n    <metadata minClien"
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/proxies.json",
    "chars": 376,
    "preview": "{\n    \"$schema\": \"http://json.schemastore.org/proxies\",\n    \"proxies\": {\n        \"DisableRuntimeWebhooks\": {\n           "
  },
  {
    "path": "durablefunctionsmonitor.dotnetbackend/setup-and-run.js",
    "chars": 2441,
    "preview": "// Checks that a local.settings.json file exists in local folder.\n// If not, asks the user to specify the Azure Storage "
  },
  {
    "path": "durablefunctionsmonitor.functions/README.md",
    "chars": 176,
    "preview": "# !DEPRECATED, REPLACED WITH [durablefunctionsmonitor.dotnetbackend](https://github.com/scale-tone/DurableFunctionsMonit"
  },
  {
    "path": "durablefunctionsmonitor.react/.gitignore",
    "chars": 285,
    "preview": "# See https://help.github.com/ignore-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n\n# testing\n/cov"
  },
  {
    "path": "durablefunctionsmonitor.react/README.md",
    "chars": 219,
    "preview": "# DurableFunctionsMonitor.React\n\nWeb UI for DurableFunctionsMonitor.\nReact+MobX+TypeScript+Material UI.   \n\n## How to co"
  },
  {
    "path": "durablefunctionsmonitor.react/copy-build-artifacts.js",
    "chars": 610,
    "preview": "const ncp = require('ncp').ncp;\nconst rimraf = require(\"rimraf\");\n\nconst buildFolder = './build';\nconst outputFolder = '"
  },
  {
    "path": "durablefunctionsmonitor.react/package.json",
    "chars": 1246,
    "preview": "{\n  \"name\": \"durablefunctionsmonitor.react\",\n  \"version\": \"5.1.0\",\n  \"private\": true,\n  \"homepage\": \"http://localhost:70"
  },
  {
    "path": "durablefunctionsmonitor.react/public/index.html",
    "chars": 66635,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-wid"
  },
  {
    "path": "durablefunctionsmonitor.react/public/manifest.json",
    "chars": 355,
    "preview": "{\n    \"short_name\": \"Durable Functions Monitor\",\n    \"name\": \"Durable Functions Monitor\",\n    \"icons\": [\n        {\n     "
  },
  {
    "path": "durablefunctionsmonitor.react/src/CancelToken.ts",
    "chars": 163,
    "preview": "import { observable } from 'mobx'\n\nexport class CancelToken {\n    @observable\n    inProgress: boolean = false;\n    @obse"
  },
  {
    "path": "durablefunctionsmonitor.react/src/DateTimeHelpers.ts",
    "chars": 1805,
    "preview": "import moment from 'moment';\n\nexport class DateTimeHelpers\n{\n    // This is the default range for @material-ui/pickers\n "
  },
  {
    "path": "durablefunctionsmonitor.react/src/DfmContext.ts",
    "chars": 3144,
    "preview": "import * as React from 'react';\nimport { observable, computed } from 'mobx'\nimport moment from 'moment';\n\n// Config obje"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/ErrorMessage.css",
    "chars": 182,
    "preview": "\n.message-snackbar {\n    top: 80px !important;\n}\n\n.error-icon {\n    margin-right: 10px;\n    margin-bottom: -7px;\n}\n\n.err"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/ErrorMessage.tsx",
    "chars": 1659,
    "preview": "import * as React from 'react';\nimport { action } from 'mobx'\nimport { observer } from 'mobx-react';\n\nimport { IconButto"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/FunctionGraph.css",
    "chars": 262,
    "preview": "\n.diagram-div {\n    padding-top: 30px;\n    padding-bottom: 30px;\n}\n\n.diagram-div > svg {\n    display: block;\n    margin:"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/FunctionGraph.tsx",
    "chars": 5736,
    "preview": "import * as React from 'react';\nimport { observer } from 'mobx-react';\n\nimport { AppBar, Box, Button, Checkbox, FormCont"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/FunctionGraphBase.tsx",
    "chars": 1421,
    "preview": "import * as React from 'react';\n\nimport './FunctionGraph.css';\n\nimport { FunctionGraphStateBase } from '../states/Functi"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/FunctionGraphTabBase.tsx",
    "chars": 2913,
    "preview": "\nimport { FunctionGraphStateBase } from '../states/FunctionGraphStateBase';\nimport { FunctionGraphBase } from './Functio"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/LoginIcon.css",
    "chars": 148,
    "preview": "\n.login-progress {\n    text-align: center;\n    margin-top: 20px;\n    margin-bottom: 20px;\n}\n\n.task-hub-list {\n    paddin"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/LoginIcon.tsx",
    "chars": 3444,
    "preview": "import * as React from 'react';\nimport { observer } from 'mobx-react';\n\nimport {\n    Box, Button, Container, CircularPro"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/Main.css",
    "chars": 281,
    "preview": ".title-typography {\n    padding-right: 10px;\n}\n\n.app-bar {\n    margin-bottom: 10px;\n}\n\n.instance-id-input {\n    width: 3"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/Main.tsx",
    "chars": 6639,
    "preview": "import * as React from 'react';\nimport { observer } from 'mobx-react';\n\nimport { AppBar, Breadcrumbs, Box, Link, TextFie"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/MainMenu.css",
    "chars": 101,
    "preview": "\n.show-time-as-typography {\n    padding-top: 10px;\n    padding-left: 16px;\n    padding-right: 10px;\n}"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/MainMenu.tsx",
    "chars": 2434,
    "preview": "import * as React from 'react';\nimport { observer } from 'mobx-react';\n\nimport {\n    FormControlLabel, IconButton, Menu,"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/OrchestrationLink.tsx",
    "chars": 1608,
    "preview": "import * as React from 'react';\nimport { action } from 'mobx'\nimport { observer } from 'mobx-react';\n\nimport { Link } fr"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/SaveAsSvgButton.tsx",
    "chars": 1925,
    "preview": "import * as React from 'react';\n\nimport { Box, Button, Typography } from '@material-ui/core';\n\nimport SaveIcon from '@ma"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/details-view/DurableEntityButtons.tsx",
    "chars": 3912,
    "preview": "import * as React from 'react';\nimport { observer } from 'mobx-react';\n\nimport {\n    Box, Button, Dialog, DialogActions,"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/details-view/DurableEntityFields.tsx",
    "chars": 4721,
    "preview": "import * as React from 'react';\nimport { observer } from 'mobx-react';\n\nimport { Grid, TextField } from '@material-ui/co"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/details-view/OrchestrationButtons.tsx",
    "chars": 9414,
    "preview": "import * as React from 'react';\nimport { observer } from 'mobx-react';\n\nimport {\n    Box, Button, Checkbox, Dialog, Dial"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/details-view/OrchestrationDetails.css",
    "chars": 1112,
    "preview": ".details-top-toolbar {\n    padding-top: 5px;\n    padding-bottom: 20px;\n    max-width: 100vw;\n    min-width: 900px;\n}\n\n.g"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/details-view/OrchestrationDetails.tsx",
    "chars": 9236,
    "preview": "import * as React from 'react';\nimport { observer } from 'mobx-react';\n\nimport {\n    AppBar, Box, Button, FormControl, I"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/details-view/OrchestrationDetailsFunctionGraph.tsx",
    "chars": 7747,
    "preview": "import * as React from 'react';\nimport { observer } from 'mobx-react';\n\nimport {\n    Box, Button, Checkbox, Chip, FormGr"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/details-view/OrchestrationFields.tsx",
    "chars": 16841,
    "preview": "import * as React from 'react';\nimport { observer } from 'mobx-react';\nimport moment from 'moment';\n\nimport {\n    AppBar"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/dialogs/CleanEntityStorageDialog.css",
    "chars": 50,
    "preview": "\n.success-message {\n    color: green !important;\n}"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/dialogs/CleanEntityStorageDialog.tsx",
    "chars": 3925,
    "preview": "import * as React from 'react';\nimport { observer } from 'mobx-react';\n\nimport {\n    Box, Checkbox, Button, Dialog, Dial"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/dialogs/ConnectionParamsDialog.tsx",
    "chars": 3097,
    "preview": "import * as React from 'react';\nimport { observer } from 'mobx-react';\n\nimport {\n    Box, Button, Dialog, DialogActions,"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/dialogs/LongJsonDialog.tsx",
    "chars": 2690,
    "preview": "import * as React from 'react';\nimport { observer } from 'mobx-react';\n\nimport {\n    Button, Dialog, DialogActions, Dial"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/dialogs/PurgeHistoryDialog.css",
    "chars": 320,
    "preview": "\n.purge-history-from-input {\n    padding-bottom: 20px !important;\n}\n\n.purge-history-till-input {\n    margin-left: 20px !"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/dialogs/PurgeHistoryDialog.tsx",
    "chars": 7956,
    "preview": "import * as React from 'react';\nimport { observer } from 'mobx-react';\n\nimport {\n    Box, Checkbox, Button, Dialog, Dial"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/dialogs/StartNewInstanceDialog.css",
    "chars": 49,
    "preview": "\n.dialog-text-field {\n    padding-bottom: 10px;\n}"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/dialogs/StartNewInstanceDialog.tsx",
    "chars": 2881,
    "preview": "import * as React from 'react';\nimport { observer } from 'mobx-react';\n\nimport {\n    Box, Button, Dialog, DialogActions,"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/results-view/Orchestrations.css",
    "chars": 2316,
    "preview": "\n.datetime-cell {\n    min-width: 145px;\n}\n\n.till-checkbox {\n    padding-top: 20px !important;\n    padding-bottom: 4px !i"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/results-view/Orchestrations.tsx",
    "chars": 22828,
    "preview": "import * as React from 'react';\nimport { action } from 'mobx'\nimport { observer } from 'mobx-react';\n\nimport {\n    AppBa"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/results-view/OrchestrationsFunctionGraph.css",
    "chars": 453,
    "preview": "\n.settings-group {\n    padding-top: 5px;\n    padding-left: 20px;\n    padding-bottom: 5px;\n}\n\n.link-to-az-func-as-a-graph"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/results-view/OrchestrationsFunctionGraph.tsx",
    "chars": 8851,
    "preview": "import * as React from 'react';\nimport { observer } from 'mobx-react';\n\nimport {\n    Box, Button, Checkbox, Chip, FormGr"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/results-view/OrchestrationsGanttChart.tsx",
    "chars": 3199,
    "preview": "import * as React from 'react';\nimport { observer } from 'mobx-react';\n\nimport {\n    Box, Button, Toolbar, Typography\n} "
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/results-view/OrchestrationsHistogram.tsx",
    "chars": 4313,
    "preview": "import * as React from 'react';\nimport { observer } from 'mobx-react';\nimport moment from 'moment';\n\nimport { FormHelper"
  },
  {
    "path": "durablefunctionsmonitor.react/src/components/results-view/OrchestrationsList.tsx",
    "chars": 9689,
    "preview": "import * as React from 'react';\nimport { observer } from 'mobx-react';\n\nimport {\n    FormHelperText, IconButton, Link, P"
  },
  {
    "path": "durablefunctionsmonitor.react/src/index.css",
    "chars": 847,
    "preview": "html {\n    overflow-y: scroll !important;\n}\n\nbody {\n    margin: 0;\n    padding: 0;\n    font-family: sans-serif;\n    disp"
  },
  {
    "path": "durablefunctionsmonitor.react/src/index.tsx",
    "chars": 696,
    "preview": "import * as React from 'react';\nimport * as ReactDOM from 'react-dom';\n\nimport { ThemeProvider } from \"@material-ui/styl"
  },
  {
    "path": "durablefunctionsmonitor.react/src/react-app-env.d.ts",
    "chars": 40,
    "preview": "/// <reference types=\"react-scripts\" />\n"
  },
  {
    "path": "durablefunctionsmonitor.react/src/services/BackendClient.ts",
    "chars": 2362,
    "preview": "import axios, { Method } from 'axios';\nimport { IBackendClient } from './IBackendClient';\nimport { OrchestrationsPathPre"
  },
  {
    "path": "durablefunctionsmonitor.react/src/services/IBackendClient.ts",
    "chars": 506,
    "preview": "import { Method } from 'axios';\n\n// Interface for communicating with the backend (sending HTTP requests)\nexport interfac"
  },
  {
    "path": "durablefunctionsmonitor.react/src/services/VsCodeBackendClient.ts",
    "chars": 2584,
    "preview": "import { Method } from 'axios';\nimport { IBackendClient } from './IBackendClient';\n\n// Defines handlers for messages bei"
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/DurableOrchestrationStatus.ts",
    "chars": 1835,
    "preview": "\n// A DTO used by DurableOrchestrationStatus.historyEvents\nexport class HistoryEvent {\n    Timestamp: string;\n    EventT"
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/ErrorMessageState.ts",
    "chars": 443,
    "preview": "import { observable } from 'mobx'\n\n// State of Error Message snackbar\nexport class ErrorMessageState {\n\n    @observable\n"
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/FilterOperatorEnum.ts",
    "chars": 2042,
    "preview": "\nexport enum FilterOperatorEnum {\n    Equals = 0,\n    StartsWith,\n    Contains,\n    NotEquals,\n    NotStartsWith,\n    No"
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/FunctionGraphState.ts",
    "chars": 2684,
    "preview": "import { observable, computed } from 'mobx';\nimport mermaid from 'mermaid';\n\nimport { buildFunctionDiagramCode } from '."
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/FunctionGraphStateBase.ts",
    "chars": 2877,
    "preview": "import { observable, computed } from 'mobx';\n\nimport { IBackendClient } from '../services/IBackendClient';\nimport { Merm"
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/ITypedLocalStorage.ts",
    "chars": 399,
    "preview": "\n// Interface for pesristing class field values in some storage\nexport interface ITypedLocalStorage<T>\n{\n    setItem(fie"
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/LoginState.ts",
    "chars": 8978,
    "preview": "import { observable, computed } from 'mobx'\nimport axios from 'axios';\nimport * as Msal from 'msal';\n\nimport { ErrorMess"
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/MainMenuState.ts",
    "chars": 1751,
    "preview": "import { observable } from 'mobx'\n\nimport { IBackendClient } from '../services/IBackendClient';\nimport { PurgeHistoryDia"
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/MainState.ts",
    "chars": 7586,
    "preview": "import { observable, computed } from 'mobx';\n\nimport { IBackendClient } from '../services/IBackendClient';\nimport { Back"
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/MermaidDiagramStateBase.ts",
    "chars": 1349,
    "preview": "import { observable } from 'mobx';\nimport mermaid from 'mermaid';\nimport { DateTimeHelpers } from '../DateTimeHelpers';\n"
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/QueryString.ts",
    "chars": 1226,
    "preview": "\n// Helper class for dealing with browser's query string\nexport class QueryString {\n\n    constructor() {\n\n        const "
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/TypedLocalStorage.ts",
    "chars": 1843,
    "preview": "import { ITypedLocalStorage } from './ITypedLocalStorage';\nimport { QueryString } from './QueryString';\n\n// Stores field"
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/VsCodeTypedLocalStorage.ts",
    "chars": 1368,
    "preview": "import { ITypedLocalStorage } from './ITypedLocalStorage';\n\n// A global variable declared in index.html and replaced by "
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/az-func-as-a-graph/FunctionsMap.d.ts",
    "chars": 781,
    "preview": "\nexport type FunctionsMap = {\n    [name: string]: {\n        bindings: any[],\n        isCalledBy: string[],\n        isSig"
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/az-func-as-a-graph/buildFunctionDiagramCode.ts",
    "chars": 9675,
    "preview": "import { FunctionsMap, ProxiesMap } from './FunctionsMap';\n\nconst space = '#32;';\n\nfunction getTriggerBindingText(bindin"
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/details-view/FunctionGraphTabState.ts",
    "chars": 7875,
    "preview": "import { observable, computed } from 'mobx';\nimport mermaid from 'mermaid';\n\nimport { IBackendClient } from '../../servi"
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/details-view/GanttDiagramTabState.ts",
    "chars": 10522,
    "preview": "import mermaid from 'mermaid';\nimport moment from 'moment';\n\nimport { DurableOrchestrationStatus, HistoryEvent } from '."
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/details-view/ICustomTabState.ts",
    "chars": 475,
    "preview": "import { DurableOrchestrationStatus } from '../DurableOrchestrationStatus';\nimport { CancelToken } from '../../CancelTok"
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/details-view/LiquidMarkupTabState.ts",
    "chars": 1158,
    "preview": "import { observable, computed } from 'mobx';\n\nimport { IBackendClient } from '../../services/IBackendClient';\nimport { D"
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/details-view/MermaidDiagramTabState.ts",
    "chars": 1426,
    "preview": "import { computed } from 'mobx';\n\nimport { ICustomTabState, CustomTabTypeEnum } from './ICustomTabState';\nimport { Durab"
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/details-view/OrchestrationDetailsState.ts",
    "chars": 21333,
    "preview": "import { observable, computed } from 'mobx';\nimport moment from 'moment';\n\nimport { DurableOrchestrationStatus, HistoryE"
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/details-view/SequenceDiagramTabState.ts",
    "chars": 8634,
    "preview": "import mermaid from 'mermaid';\nimport moment from 'moment';\n\nimport { DurableOrchestrationStatus, HistoryEvent } from '."
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/dialogs/CleanEntityStorageDialogState.ts",
    "chars": 1815,
    "preview": "import { observable, computed } from 'mobx'\n\nimport { IBackendClient } from '../../services/IBackendClient';\nimport { Er"
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/dialogs/ConnectionParamsDialogState.ts",
    "chars": 2350,
    "preview": "import { observable, computed } from 'mobx'\n\nimport { IBackendClient } from '../../services/IBackendClient';\nimport { Er"
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/dialogs/PurgeHistoryDialogState.ts",
    "chars": 2629,
    "preview": "import { observable, computed } from 'mobx'\nimport moment from 'moment';\n\nimport { DateTimeHelpers } from '../../DateTim"
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/dialogs/StartNewInstanceDialogState.ts",
    "chars": 1929,
    "preview": "import { observable, computed } from 'mobx'\n\nimport { IBackendClient } from '../../services/IBackendClient';\nimport { Er"
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/results-view/OrchestrationsState.ts",
    "chars": 14001,
    "preview": "import { observable, computed } from 'mobx';\nimport moment from 'moment';\n\nimport { DateTimeHelpers } from '../../DateTi"
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/results-view/ResultsFunctionGraphTabState.ts",
    "chars": 6753,
    "preview": "import { computed, observable } from 'mobx'\nimport mermaid from 'mermaid';\n\nimport { IBackendClient } from '../../servic"
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/results-view/ResultsGanttDiagramTabState.ts",
    "chars": 4028,
    "preview": "import { computed } from 'mobx'\nimport mermaid from 'mermaid';\nimport moment from 'moment';\n\nimport { DurableOrchestrati"
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/results-view/ResultsHistogramTabState.ts",
    "chars": 5624,
    "preview": "import { observable, computed } from 'mobx'\nimport moment from 'moment';\n\nimport { DurableOrchestrationStatus } from '.."
  },
  {
    "path": "durablefunctionsmonitor.react/src/states/results-view/ResultsListTabState.ts",
    "chars": 4727,
    "preview": "import { observable, computed } from 'mobx'\n\nimport { DurableOrchestrationStatus } from '../DurableOrchestrationStatus';"
  },
  {
    "path": "durablefunctionsmonitor.react/src/theme.ts",
    "chars": 3045,
    "preview": "import { createMuiTheme } from '@material-ui/core';\n\nimport { RuntimeStatus } from './states/DurableOrchestrationStatus'"
  },
  {
    "path": "durablefunctionsmonitor.react/tsconfig.json",
    "chars": 617,
    "preview": "{\n  \"compilerOptions\": {\n    \"baseUrl\": \".\",\n    \"target\": \"es5\",\n    \"lib\": [\n      \"dom\",\n      \"dom.iterable\",\n      "
  },
  {
    "path": "durablefunctionsmonitor.react/tslint.json",
    "chars": 189,
    "preview": "{\n  \"extends\": [],\n  \"defaultSeverity\": \"warning\",\n  \"linterOptions\": {\n    \"exclude\": [\n      \"config/**/*.js\",\n      \""
  },
  {
    "path": "tests/durablefunctionsmonitor.dotnetbackend.tests/.gitignore",
    "chars": 4386,
    "preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# nuge"
  },
  {
    "path": "tests/durablefunctionsmonitor.dotnetbackend.tests/.vscode/launch.json",
    "chars": 1146,
    "preview": "{\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            // Use IntelliSense to find out which attributes"
  },
  {
    "path": "tests/durablefunctionsmonitor.dotnetbackend.tests/.vscode/tasks.json",
    "chars": 1316,
    "preview": "{\n    \"version\": \"2.0.0\",\n    \"tasks\": [\n        {\n            \"label\": \"build\",\n            \"command\": \"dotnet\",\n      "
  },
  {
    "path": "tests/durablefunctionsmonitor.dotnetbackend.tests/AboutTests.cs",
    "chars": 1361,
    "preview": "using Microsoft.VisualStudio.TestTools.UnitTesting;\nusing Microsoft.Extensions.Logging;\nusing DurableFunctionsMonitor.Do"
  },
  {
    "path": "tests/durablefunctionsmonitor.dotnetbackend.tests/AuthTests.cs",
    "chars": 25956,
    "preview": "using Microsoft.VisualStudio.TestTools.UnitTesting;\nusing Microsoft.Extensions.Logging;\nusing DurableFunctionsMonitor.Do"
  },
  {
    "path": "tests/durablefunctionsmonitor.dotnetbackend.tests/EasyAuthConfigTests.cs",
    "chars": 939,
    "preview": "using Microsoft.VisualStudio.TestTools.UnitTesting;\nusing Microsoft.Extensions.Logging;\nusing DurableFunctionsMonitor.Do"
  },
  {
    "path": "tests/durablefunctionsmonitor.dotnetbackend.tests/FilterClauseTests.cs",
    "chars": 6044,
    "preview": "using Microsoft.VisualStudio.TestTools.UnitTesting;\nusing DurableFunctionsMonitor.DotNetBackend;\nusing System;\nusing Sys"
  },
  {
    "path": "tests/durablefunctionsmonitor.dotnetbackend.tests/GlobalsTests.cs",
    "chars": 4585,
    "preview": "using Microsoft.VisualStudio.TestTools.UnitTesting;\nusing Microsoft.Extensions.Logging;\nusing DurableFunctionsMonitor.Do"
  },
  {
    "path": "tests/durablefunctionsmonitor.dotnetbackend.tests/IdSuggestionsTests.cs",
    "chars": 3421,
    "preview": "using Microsoft.VisualStudio.TestTools.UnitTesting;\nusing Microsoft.Extensions.Logging;\nusing DurableFunctionsMonitor.Do"
  },
  {
    "path": "tests/durablefunctionsmonitor.dotnetbackend.tests/ServeStaticsTests.cs",
    "chars": 3781,
    "preview": "using Microsoft.VisualStudio.TestTools.UnitTesting;\nusing Microsoft.Extensions.Logging;\nusing DurableFunctionsMonitor.Do"
  },
  {
    "path": "tests/durablefunctionsmonitor.dotnetbackend.tests/Shared.cs",
    "chars": 194,
    "preview": "using System;\n\nnamespace durablefunctionsmonitor.dotnetbackend.tests\n{\n    public static class Shared\n    {\n        publ"
  }
]

// ... and 1 more files (download for full content)

About this extraction

This page contains the full source code of the scale-tone/DurableFunctionsMonitor GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 201 files (2.8 MB), approximately 750.0k tokens, and a symbol index with 3285 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!