diff --git a/.editorconfig b/.editorconfig
old mode 100755
new mode 100644
index 57f4995..7e9afe4
--- a/.editorconfig
+++ b/.editorconfig
@@ -1,21 +1,55 @@
-# editorconfig.org
-
-# top-most EditorConfig file
root = true
-# Default settings:
-# A newline ending every file
-# Use 4 spaces as indentation
[*]
insert_final_newline = true
end_of_line = lf
indent_style = space
indent_size = 4
-
-# Trim trailing whitespace, limited support.
-# https://github.com/editorconfig/editorconfig/wiki/Property-research:-Trim-trailing-spaces
trim_trailing_whitespace = true
+csharp_indent_braces = false
+csharp_indent_case_contents = true
+csharp_indent_labels = one_less_than_current
+csharp_prefer_braces = true:warning
+csharp_prefer_simple_default_expression = true:suggestion
+csharp_prefer_simple_using_statement = true:suggestion
+csharp_prefer_static_local_function = true:suggestion
+csharp_space_around_binary_operators = before_and_after
+csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true:silent
+csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true:silent
+csharp_style_allow_embedded_statements_on_same_line_experimental = true:silent
+csharp_style_conditional_delegate_call = true:suggestion
+csharp_style_deconstructed_variable_declaration = true:suggestion
+csharp_style_expression_bodied_accessors = true:silent
+csharp_style_expression_bodied_constructors = true:silent
+csharp_style_expression_bodied_indexers = true:silent
+csharp_style_expression_bodied_lambdas = true:silent
+csharp_style_expression_bodied_local_functions = false:silent
+csharp_style_expression_bodied_methods = true:silent
+csharp_style_expression_bodied_operators = true:silent
+csharp_style_expression_bodied_properties = true:silent
+csharp_style_implicit_object_creation_when_type_is_apparent = true:suggestion
+csharp_style_inlined_variable_declaration = true:suggestion
+csharp_style_namespace_declarations = block_scoped:silent
+csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
+csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
+csharp_style_prefer_extended_property_pattern = true:suggestion
+csharp_style_prefer_index_operator = true:suggestion
+csharp_style_prefer_local_over_anonymous_function = true:suggestion
+csharp_style_prefer_not_pattern = true:suggestion
+csharp_style_prefer_null_check_over_type_check = true:suggestion
+csharp_style_prefer_pattern_matching = true:silent
+csharp_style_prefer_range_operator = true:suggestion
+csharp_style_prefer_switch_expression = true:suggestion
+csharp_style_prefer_tuple_swap = true:suggestion
+csharp_style_throw_expression = true:suggestion
+csharp_style_unused_value_assignment_preference = discard_variable:suggestion
+csharp_style_unused_value_expression_statement_preference = discard_variable:silent
+csharp_style_var_elsewhere = false:silent
+csharp_style_var_for_built_in_types = false:silent
+csharp_style_var_when_type_is_apparent = false:silent
+csharp_using_directive_placement = outside_namespace:silent
+
[*.md]
insert_final_newline = false
trim_trailing_whitespace = false
@@ -24,14 +58,70 @@ trim_trailing_whitespace = false
indent_size = 2
[*.{cs,vb}]
-dotnet_style_predefined_type_for_locals_parameters_members = true:error
+tab_width = 4
-dotnet_naming_rule.private_members_with_underscore.symbols = private_fields
-dotnet_naming_rule.private_members_with_underscore.style = prefix_underscore
+dotnet_code_quality_unused_parameters = all:suggestion
dotnet_naming_rule.private_members_with_underscore.severity = suggestion
-
-dotnet_naming_symbols.private_fields.applicable_kinds = field
-dotnet_naming_symbols.private_fields.applicable_accessibilities = private
-
+dotnet_naming_rule.private_members_with_underscore.style = prefix_underscore
+dotnet_naming_rule.private_members_with_underscore.symbols = private_fields
dotnet_naming_style.prefix_underscore.capitalization = camel_case
dotnet_naming_style.prefix_underscore.required_prefix = _
+dotnet_naming_symbols.private_fields.applicable_accessibilities = private
+dotnet_naming_symbols.private_fields.applicable_kinds = field
+dotnet_style_allow_multiple_blank_lines_experimental = true:silent
+dotnet_style_allow_statement_immediately_after_block_experimental = true:silent
+dotnet_style_coalesce_expression = true:suggestion
+dotnet_style_collection_initializer = true:suggestion
+dotnet_style_explicit_tuple_names = true:suggestion
+dotnet_style_namespace_match_folder = true:suggestion
+dotnet_style_null_propagation = true:suggestion
+dotnet_style_object_initializer = true:suggestion
+dotnet_style_operator_placement_when_wrapping = beginning_of_line
+dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent
+dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent
+dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent
+dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent
+dotnet_style_predefined_type_for_locals_parameters_members = true:error
+dotnet_style_predefined_type_for_member_access = true:silent
+dotnet_style_prefer_auto_properties = true:silent
+dotnet_style_prefer_compound_assignment = true:suggestion
+dotnet_style_prefer_conditional_expression_over_assignment = true:silent
+dotnet_style_prefer_conditional_expression_over_return = true:silent
+dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
+dotnet_style_prefer_inferred_tuple_names = true:suggestion
+dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
+dotnet_style_prefer_simplified_boolean_expressions = true:suggestion
+dotnet_style_prefer_simplified_interpolation = true:suggestion
+dotnet_style_qualification_for_event = false:silent
+dotnet_style_qualification_for_field = false:silent
+dotnet_style_qualification_for_method = false:silent
+dotnet_style_qualification_for_property = false:silent
+dotnet_style_readonly_field = true:suggestion
+dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent
+
+# CA1054: URI parameters should not be strings
+dotnet_diagnostic.CA1054.severity = suggestion
+
+# CA1055: URI-like return values should not be strings
+dotnet_diagnostic.CA1055.severity = none
+
+# RS0048: Missing shipped or unshipped public API file
+dotnet_public_api_analyzer.require_api_files = true
+
+# SA1101: Prefix local calls with this
+dotnet_diagnostic.SA1101.severity = none
+
+# SA1309: Field names should not begin with underscore
+dotnet_diagnostic.SA1309.severity = none
+
+# SA1413: Use trailing comma in multi-line initializers
+dotnet_diagnostic.SA1413.severity = none
+
+# SA1502: Element should not be on a single line
+dotnet_diagnostic.SA1502.severity = none
+
+# SA1625: Element documentation should not be copied and pasted
+dotnet_diagnostic.SA1625.severity = none
+
+# SA1633: File should have header
+dotnet_diagnostic.SA1633.severity = none
diff --git a/.gitignore b/.gitignore
index da45d7f..da0c597 100755
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,3 @@
-*.dll
-*.exe
-*.log
-*.nupkg
*.suo
*.user
@@ -10,7 +6,3 @@
.vscode/
[Bb]in/
[Oo]bj/
-
-Build/temp
-build.out/
-build.tmp/
\ No newline at end of file
diff --git a/NuGet.config b/NuGet.config
deleted file mode 100644
index 995ea4b..0000000
--- a/NuGet.config
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/README.md b/README.md
index 5bd013d..d253956 100644
--- a/README.md
+++ b/README.md
@@ -1,20 +1,13 @@
-# Umbraco.StorageProviders
+# Umbraco storage providers
This repository contains Umbraco storage providers that can replace the default physical file storage.
-## Umbraco.StorageProviders.AzureBlob
-
-The Azure Blob Storage provider has an implementation of the Umbraco `IFileSystem` that connects to an Azure Blob Storage container.
+## Umbraco.StorageProviders
-It also has the following features:
-- middleware for serving media files from the `/media` path
-- ImageSharp image provider/cache
-- a CDN media URL provider
+Contains shared storage providers infrastructure, like a CDN media URL provider.
### Usage
-This provider can be added in the `Startup.cs` file:
-
```csharp
public void ConfigureServices(IServiceCollection services)
{
@@ -22,52 +15,70 @@ public void ConfigureServices(IServiceCollection services)
.AddBackOffice()
.AddWebsite()
.AddComposers()
- // Add the Azure Blob Storage file system, ImageSharp image provider/cache and middleware for Media:
- .AddAzureBlobMediaFileSystem()
- // Optionally add the CDN media URL provider:
+ // Add the CDN media URL provider:
.AddCdnMediaUrlProvider()
.Build();
}
+```
+
+There are multiple ways to configure the CDN provider. It can be done in code:
+
+```csharp
+.AddCdnMediaUrlProvider(options => {
+ options.Url = new Uri("https://cdn.example.com/");
+});
+```
+
+In `appsettings.json`:
-public void Configure(IApplicationBuilder app)
+```json
{
- if (env.IsDevelopment())
- {
- app.UseDeveloperExceptionPage();
+ "Umbraco": {
+ "Storage": {
+ "Cdn": {
+ "Url": "https://cdn.example.com/"
+ }
}
-
- app.UseUmbraco()
- .WithMiddleware(u =>
- {
- u.UseBackOffice();
- u.UseWebsite();
- // Enables the Azure Blob Storage middleware for Media:
- u.UseAzureBlobMediaFileSystem();
-
- })
- .WithEndpoints(u =>
- {
- u.UseInstallerEndpoints();
- u.UseBackOfficeEndpoints();
- u.UseWebsiteEndpoints();
- });
+ }
}
```
-There're multiple ways to configure the provider, it can be done in code:
+Or by environment variables:
-```csharp
-services.AddUmbraco(_env, _config)
+```sh
+UMBRACO__STORAGE__CDN__URL=
+```
- .AddAzureBlobMediaFileSystem(options => {
- options.ConnectionString = "";
- options.ContainerName = "";
- })
+_Note: you still have to add the provider in the `Startup.cs` file when not configuring the options in code._
- .AddCdnMediaUrlProvider(options => {
- options.Url = new Uri("https://my-cdn.example.com/");
- });
+## Umbraco.StorageProviders.AzureBlob
+The Azure Blob Storage provider has an implementation of the Umbraco `IFileSystem` that connects to an Azure Blob Storage container.
+
+### Usage
+
+This provider can be added in the `Startup.cs` file:
+
+```csharp
+public void ConfigureServices(IServiceCollection services)
+{
+ services.AddUmbraco(_env, _config)
+ .AddBackOffice()
+ .AddWebsite()
+ .AddComposers()
+ // Add the Azure Blob Storage file system
+ .AddAzureBlobMediaFileSystem()
+ .Build();
+}
+```
+
+There are multiple ways to configure the provider. It can be done in code:
+
+```csharp
+.AddAzureBlobMediaFileSystem(options => {
+ options.ConnectionString = "";
+ options.ContainerName = "";
+})
```
In `appsettings.json`:
@@ -79,10 +90,7 @@ In `appsettings.json`:
"AzureBlob": {
"Media": {
"ConnectionString": "",
- "ContainerName": "",
- "Cdn": {
- "Url": ""
- }
+ "ContainerName": ""
}
}
}
@@ -95,22 +103,21 @@ Or by environment variables:
```sh
UMBRACO__STORAGE__AZUREBLOB__MEDIA__CONNECTIONSTRING=
UMBRACO__STORAGE__AZUREBLOB__MEDIA__CONTAINERNAME=
-UMBRACO__STORAGE__AZUREBLOB__MEDIA__CDN__URL=
```
_Note: you still have to add the provider in the `Startup.cs` file when not configuring the options in code._
-## Using the file system provider
-
-Please refer to our documentation on [using custom file systems](https://our.umbraco.com/documentation/Extending/FileSystemProviders/).
-
-## Folder structure in the Azure Blob Storage container
+### Folder structure in the Azure Blob Storage container
The container name is expected to exist and uses the following folder structure:
- `/media` - contains the Umbraco media, stored in the structure defined by the `IMediaPathScheme` registered in Umbraco (the default `UniqueMediaPathScheme` stores files with their original filename in 8 character directories, based on the content and property GUID identifier)
- `/cache` - contains the ImageSharp image cache, stored as files with a filename defined by the `ICacheHash` registered in ImageSharp (the default `CacheHash` generates SHA256 hashes of the file contents and uses the first characters configured by the `Umbraco:CMS:Imaging:CachedNameLength` setting)
Note that this is different than the behavior of other file system providers - i.e. https://github.com/umbraco-community/UmbracoFileSystemProviders.Azure that expect the media contents to be at the root level.
+## Using the file system providers
+
+Please refer to our documentation on [using custom file systems](https://our.umbraco.com/documentation/Extending/FileSystemProviders/).
+
## Bugs, issues and Pull Requests
If you encounter a bug when using this client library you are welcome to open an issue in the issue tracker of this repository. We always welcome Pull Request and please feel free to open an issue before submitting a Pull Request to discuss what you want to submit.
diff --git a/Umbraco.StorageProviders.sln b/Umbraco.StorageProviders.sln
index 4ecab82..924a805 100644
--- a/Umbraco.StorageProviders.sln
+++ b/Umbraco.StorageProviders.sln
@@ -13,10 +13,11 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
azure-pipelines.yml = azure-pipelines.yml
src\Directory.Build.props = src\Directory.Build.props
LICENSE = LICENSE
- NuGet.config = NuGet.config
README.md = README.md
EndProjectSection
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Umbraco.StorageProviders", "src\Umbraco.StorageProviders\Umbraco.StorageProviders.csproj", "{5EC38982-2C9A-4D8D-AAE2-743A690FCD71}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -39,6 +40,18 @@ Global
{99A3FCBE-FDC6-4580-BDB8-7D219C6D98C3}.Release|x64.Build.0 = Release|Any CPU
{99A3FCBE-FDC6-4580-BDB8-7D219C6D98C3}.Release|x86.ActiveCfg = Release|Any CPU
{99A3FCBE-FDC6-4580-BDB8-7D219C6D98C3}.Release|x86.Build.0 = Release|Any CPU
+ {5EC38982-2C9A-4D8D-AAE2-743A690FCD71}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5EC38982-2C9A-4D8D-AAE2-743A690FCD71}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5EC38982-2C9A-4D8D-AAE2-743A690FCD71}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5EC38982-2C9A-4D8D-AAE2-743A690FCD71}.Debug|x64.Build.0 = Debug|Any CPU
+ {5EC38982-2C9A-4D8D-AAE2-743A690FCD71}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5EC38982-2C9A-4D8D-AAE2-743A690FCD71}.Debug|x86.Build.0 = Debug|Any CPU
+ {5EC38982-2C9A-4D8D-AAE2-743A690FCD71}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5EC38982-2C9A-4D8D-AAE2-743A690FCD71}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5EC38982-2C9A-4D8D-AAE2-743A690FCD71}.Release|x64.ActiveCfg = Release|Any CPU
+ {5EC38982-2C9A-4D8D-AAE2-743A690FCD71}.Release|x64.Build.0 = Release|Any CPU
+ {5EC38982-2C9A-4D8D-AAE2-743A690FCD71}.Release|x86.ActiveCfg = Release|Any CPU
+ {5EC38982-2C9A-4D8D-AAE2-743A690FCD71}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index b87886a..90ee9c1 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -1,108 +1,37 @@
variables:
- buildConfiguration: Release
- slnFilename: Umbraco.StorageProviders.sln
-stages:
- - stage: Artifacts
- dependsOn: []
- jobs:
- - job: Build_Artifacts
- displayName: Build Artifacts
- pool:
- vmImage: windows-latest
- steps:
- - task: UseDotNet@2
- displayName: Use .Net Core sdk 5.x
- inputs:
- version: 5.x
- - task: NuGetToolInstaller@1
- displayName: Use NuGet Latest
- - task: NuGetCommand@2
- displayName: Restore NuGet Packages
- inputs:
- restoreSolution: $(slnFilename)
- feedsToUse: config
- - task: PowerShell@1
- displayName: Update Version and Artifact Name
- inputs:
- scriptType: inlineScript
- inlineScript: >
- Write-Host "Working folder: $pwd"
-
- $ubuild = build/build.ps1 -get -continue
-
-
- $version = $ubuild.GetUmbracoVersion()
-
- $isRelease = [regex]::matches($env:BUILD_SOURCEBRANCH,"v\d+\/\d+.\d+.*")
-
-
- if ($isRelease.Count -gt 0){
- $continuous = $version.Semver
- Write-Host "##vso[build.addbuildtag]Release build"
- }
- else
- {
- $date = (Get-Date).ToString("yyyyMMdd")
- $continuous = "$($version.release)-preview$date.$(Build.BuildId)"
- $ubuild.SetUmbracoVersion($continuous)
+ solution: Umbraco.StorageProviders.sln
+ buildConfiguration: Release
+ NUGET_PACKAGES: $(Pipeline.Workspace)/.nuget/packages
+ DOTNET_NOLOGO: true
+ DOTNET_GENERATE_ASPNET_CERTIFICATE: false
+ DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
- Write-Host "##vso[build.addbuildtag]Continuous build"
- }
-
- Write-Host "##vso[build.updatebuildnumber]$continuous.$(Build.BuildId)"
-
- Write-Host "Building: $continuous"
- - task: PowerShell@1
- displayName: Prepare Build
- inputs:
- scriptType: inlineScript
- inlineScript: |
- Write-Host "Working folder: $pwd"
- $ubuild = build\build.ps1 -get
-
- $ubuild.PrepareBuild("vso")
- - task: PowerShell@1
- displayName: Prepare Packages & Zip
- inputs:
- scriptType: inlineScript
- inlineScript: |
- Write-Host "Working folder: $pwd"
- $ubuild = build\build.ps1 -get -continue
-
- $ubuild.CompileUmbracoStorageProviders()
- $ubuild.PreparePackages()
- - task: PowerShell@1
- displayName: Verify & Package NuGet
- inputs:
- scriptType: inlineScript
- inlineScript: |
- Write-Host "Working folder: $pwd"
- $ubuild = build\build.ps1 -get -continue
-
- $ubuild.PackageNuGet()
- - task: CopyFiles@2
- displayName: Copy NuPkg Files to Staging
- inputs:
- SourceFolder: build.out
- Contents: '*.nupkg'
- TargetFolder: $(build.artifactstagingdirectory)
- CleanTargetFolder: true
- - task: PublishBuildArtifacts@1
- displayName: Publish NuPkg Files
- inputs:
- PathtoPublish: $(build.artifactstagingdirectory)
- ArtifactName: nupkg
- - task: CopyFiles@2
- displayName: Copy Log Files to Staging
- inputs:
- SourceFolder: build.tmp
- Contents: '*.log'
- TargetFolder: $(build.artifactstagingdirectory)
- CleanTargetFolder: true
- condition: succeededOrFailed()
- - task: PublishBuildArtifacts@1
- displayName: Publish Log Files
- inputs:
- PathtoPublish: $(build.artifactstagingdirectory)
- ArtifactName: logs
- condition: succeededOrFailed()
\ No newline at end of file
+stages:
+ - stage: Artifacts
+ jobs:
+ - job: Build
+ pool:
+ vmImage: windows-latest
+ steps:
+ - task: Cache@2
+ inputs:
+ key: 'nuget | "$(Agent.OS)" | **/packages.lock.json'
+ restoreKeys: |
+ nuget | "$(Agent.OS)"
+ nuget
+ path: $(NUGET_PACKAGES)
+ displayName: Cache NuGet packages
+
+ - script: dotnet restore $(solution) --locked-mode
+ displayName: Restore NuGet packages
+
+ - script: dotnet build $(solution) -c $(buildConfiguration) -p:ContinuousIntegrationBuild=true --no-restore
+ displayName: Build
+
+ - script: dotnet pack $(solution) -c $(buildConfiguration) -o $(Build.ArtifactStagingDirectory) --no-restore --no-build
+ displayName: Pack
+
+ - task: PublishBuildArtifacts@1
+ inputs:
+ ArtifactName: nupkg
+ displayName: Publish NuGet packages
diff --git a/build/build-bootstrap.ps1 b/build/build-bootstrap.ps1
deleted file mode 100644
index f6776ba..0000000
--- a/build/build-bootstrap.ps1
+++ /dev/null
@@ -1,97 +0,0 @@
-
- # this script should be dot-sourced into the build.ps1 scripts
- # right after the parameters declaration
- # ie
- # . "$PSScriptRoot\build-bootstrap.ps1"
-
- # THIS FILE IS DISTRIBUTED AS PART OF UMBRACO.BUILD
- # DO NOT MODIFY IT - ALWAYS USED THE COMMON VERSION
-
- # ################################################################
- # BOOTSTRAP
- # ################################################################
-
- # reset errors
- $error.Clear()
-
- # ensure we have temp folder for downloads
- $scriptRoot = "$PSScriptRoot"
- $scriptTemp = "$scriptRoot\temp"
- if (-not (test-path $scriptTemp)) { mkdir $scriptTemp > $null }
-
- # get NuGet
- $cache = 4
- $nuget = "$scriptTemp\nuget.exe"
- # ensure the correct NuGet-source is used. This one is used by Umbraco
- $nugetsourceUmbraco = "https://www.myget.org/F/umbracoprereleases/api/v3/index.json"
- if (-not $local)
- {
- $source = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe"
- if ((test-path $nuget) -and ((ls $nuget).CreationTime -lt [DateTime]::Now.AddDays(-$cache)))
- {
- Remove-Item $nuget -force -errorAction SilentlyContinue > $null
- }
- if (-not (test-path $nuget))
- {
- Write-Host "Download NuGet..."
- [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
- Invoke-WebRequest $source -OutFile $nuget
- if (-not $?) { throw "Failed to download NuGet." }
- }
- }
- elseif (-not (test-path $nuget))
- {
- throw "Failed to locate NuGet.exe."
- }
-
- # NuGet notes
- # As soon as we use -ConfigFile, NuGet uses that file, and only that file, and does not
- # merge configuration from system level. See comments in NuGet.Client solution, class
- # NuGet.Configuration.Settings, method LoadDefaultSettings.
- # For NuGet to merge configurations, it needs to "find" the file in the current directory,
- # or above. Which means we cannot really use -ConfigFile but instead have to have Umbraco's
- # NuGet.config file at root, and always run NuGet.exe while at root or in a directory below
- # root.
-
- $solutionRoot = "$scriptRoot\.."
- $testPwd = [System.IO.Path]::GetFullPath($pwd.Path) + "\"
- $testRoot = [System.IO.Path]::GetFullPath($solutionRoot) + "\"
- if (-not $testPwd.ToLower().StartsWith($testRoot.ToLower()))
- {
- throw "Cannot run outside of the solution's root."
- }
-
- # get the build system
- if (-not $local)
- {
- $params = "-OutputDirectory", $scriptTemp, "-Verbosity", "quiet", "-PreRelease", "-Source", $nugetsourceUmbraco
-
- Write-Host "Executing: $params"
- &$nuget install Umbraco.Build @params
- if (-not $?) { throw "Failed to download Umbraco.Build." }
- }
-
- # ensure we have the build system
- $ubuildPath = ls "$scriptTemp\Umbraco.Build.*" | sort -property CreationTime -descending | select -first 1
- if (-not $ubuildPath)
- {
- throw "Failed to locate the build system."
- }
-
- # boot the build system
- # this creates $global:ubuild
- return &"$ubuildPath\ps\Boot.ps1"
-
- # at that point the build.ps1 script must boot the build system
- # eg
- # $ubuild.Boot($ubuildPath.FullName, [System.IO.Path]::GetFullPath("$scriptRoot\.."),
- # @{ Local = $local; With7Zip = $false; WithNode = $false },
- # @{ continue = $continue })
- # if (-not $?) { throw "Failed to boot the build system." }
- #
- # and it's good practice to report
- # eg
- # Write-Host "Umbraco.Whatever Build"
- # Write-Host "Umbraco.Build v$($ubuild.BuildVersion)"
-
- # eof
diff --git a/build/build.ps1 b/build/build.ps1
deleted file mode 100644
index 11034da..0000000
--- a/build/build.ps1
+++ /dev/null
@@ -1,185 +0,0 @@
-
- param (
- # get, don't execute
- [Parameter(Mandatory=$false)]
- [Alias("g")]
- [switch] $get = $false,
-
- # run local, don't download, assume everything is ready
- [Parameter(Mandatory=$false)]
- [Alias("l")]
- [Alias("loc")]
- [switch] $local = $false,
-
- # keep the build directories, don't clear them
- [Parameter(Mandatory=$false)]
- [Alias("c")]
- [Alias("cont")]
- [switch] $continue = $false
- )
-
- # ################################################################
- # BOOTSTRAP
- # ################################################################
-
- # create and boot the buildsystem
- $ubuild = &"$PSScriptRoot\build-bootstrap.ps1"
- if (-not $?) { return }
- $ubuild.Boot($PSScriptRoot,
- @{ Local = $local; },
- @{ Continue = $continue })
- if ($ubuild.OnError()) { return }
-
- Write-Host "Umbraco StorageProviders Build"
- Write-Host "Umbraco.Build v$($ubuild.BuildVersion)"
-
- # ################################################################
- # TASKS
- # ################################################################
-
- $ubuild.DefineMethod("CompileUmbracoStorageProviders",
- {
- $buildConfiguration = "Release"
-
- $src = "$($this.SolutionRoot)\src"
- $log = "$($this.BuildTemp)\dotnet.build.umbraco.log"
-
- Write-Host "Compile Umbraco.StorageProviders.AzureBlob"
- Write-Host "Logging to $log"
-
- &dotnet build "$src\Umbraco.StorageProviders.AzureBlob\Umbraco.StorageProviders.AzureBlob.csproj" `
- --configuration $buildConfiguration `
- --output "$($this.BuildTemp)\bin\\" `
- > $log
-
- # get files into WebApp\bin
- &dotnet publish "$src\Umbraco.StorageProviders.AzureBlob\Umbraco.StorageProviders.AzureBlob.csproj" `
- --configuration Release --output "$($this.BuildTemp)\WebApp\bin\\" `
- > $log
-
- # remove extra files
- $webAppBin = "$($this.BuildTemp)\WebApp\bin"
- $excludeDirs = @("$($webAppBin)\refs","$($webAppBin)\runtimes","$($webAppBin)\Umbraco","$($webAppBin)\wwwroot")
- $excludeFiles = @("$($webAppBin)\appsettings.*","$($webAppBin)\*.deps.json","$($webAppBin)\*.exe","$($webAppBin)\*.config","$($webAppBin)\*.runtimeconfig.json")
- $this.RemoveDirectory($excludeDirs)
- $this.RemoveFile($excludeFiles)
-
- if (-not $?) { throw "Failed to compile Umbraco.StorageProviders." }
-
- # /p:UmbracoBuild tells the csproj that we are building from PS, not VS
- })
-
-
- $ubuild.DefineMethod("PreparePackages",
- {
- Write-Host "Prepare Packages"
-
- $src = "$($this.SolutionRoot)\src"
- $tmp = "$($this.BuildTemp)"
- $out = "$($this.BuildOutput)"
-
- $buildConfiguration = "Release"
-
- # cleanup build
- Write-Host "Clean build"
- $this.RemoveFile("$tmp\bin\*.dll.config")
-
- # cleanup WebApp
- Write-Host "Cleanup WebApp"
- $this.RemoveDirectory("$tmp\WebApp")
-
- # offset the modified timestamps on all umbraco dlls, as WebResources
- # break if date is in the future, which, due to timezone offsets can happen.
- Write-Host "Offset dlls timestamps"
- Get-ChildItem -r "$tmp\*.dll" | ForEach-Object {
- $_.CreationTime = $_.CreationTime.AddHours(-11)
- $_.LastWriteTime = $_.LastWriteTime.AddHours(-11)
- }
- })
-
- $ubuild.DefineMethod("PrepareBuild",
- {
- Write-Host "============ PrepareBuild ============"
-
- Write-host "Set environment"
- $env:UMBRACO_VERSION=$this.Version.Semver.ToString()
- $env:UMBRACO_RELEASE=$this.Version.Release
- $env:UMBRACO_COMMENT=$this.Version.Comment
- $env:UMBRACO_BUILD=$this.Version.Build
-
- if ($args -and $args[0] -eq "vso")
- {
- Write-host "Set VSO environment"
- # set environment variable for VSO
- # https://github.com/Microsoft/vsts-tasks/issues/375
- # https://github.com/Microsoft/vsts-tasks/blob/master/docs/authoring/commands.md
- Write-Host ("##vso[task.setvariable variable=UMBRACO_VERSION;]$($this.Version.Semver.ToString())")
- Write-Host ("##vso[task.setvariable variable=UMBRACO_RELEASE;]$($this.Version.Release)")
- Write-Host ("##vso[task.setvariable variable=UMBRACO_COMMENT;]$($this.Version.Comment)")
- Write-Host ("##vso[task.setvariable variable=UMBRACO_BUILD;]$($this.Version.Build)")
-
- Write-Host ("##vso[task.setvariable variable=UMBRACO_TMP;]$($this.SolutionRoot)\build.tmp")
- }
- })
-
- $ubuild.DefineMethod("RestoreNuGet",
- {
- Write-Host "Restore NuGet"
- Write-Host "Logging to $($this.BuildTemp)\nuget.restore.log"
- &$this.BuildEnv.NuGet restore "$($this.SolutionRoot)\Umbraco.StorageProviders.sln" > "$($this.BuildTemp)\nuget.restore.log"
- if (-not $?) { throw "Failed to restore NuGet packages." }
- })
-
- $ubuild.DefineMethod("PackageNuGet",
- {
- Write-Host "Create NuGet packages"
-
- $log = "$($this.BuildTemp)\dotnet.pack.umbraco.log"
- Write-Host "Logging to $log"
-
- &dotnet pack "Umbraco.StorageProviders.sln" `
- --output "$($this.BuildOutput)" `
- --verbosity detailed `
- -c Release `
- -p:PackageVersion="$($this.Version.Semver.ToString())" > $log
-
- # run hook
- if ($this.HasMethod("PostPackageNuGet"))
- {
- Write-Host "Run PostPackageNuGet hook"
- $this.PostPackageNuGet();
- if (-not $?) { throw "Failed to run hook." }
- }
- })
-
- $ubuild.DefineMethod("Build",
- {
- $error.Clear()
-
- # $this.PrepareBuild()
- # if ($this.OnError()) { return }
- $this.RestoreNuGet()
- if ($this.OnError()) { return }
- $this.CompileUmbracoStorageProviders()
- if ($this.OnError()) { return }
- $this.PreparePackages()
- if ($this.OnError()) { return }
- $this.PackageNuGet()
- if ($this.OnError()) { return }
- Write-Host "Done"
- })
-
- # ################################################################
- # RUN
- # ################################################################
-
- # configure
- $ubuild.ReleaseBranches = @( "master" )
-
- # run
- if (-not $get)
- {
- $ubuild.Build()
- if ($ubuild.OnError()) { return }
- }
- if ($get) { return $ubuild }
diff --git a/icon.png b/icon.png
new file mode 100644
index 0000000..d0a701e
Binary files /dev/null and b/icon.png differ
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index 9e8c58d..d926658 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -1,33 +1,40 @@
-
+
- 1.1.0
- 1.1.0
- 1.1.0
- 1.1.0.0
- 9.0
+ 2.0.0-alpha
en-US
Umbraco
Copyright © Umbraco 2022
Umbraco HQ
https://github.com/umbraco/Umbraco.StorageProviders
https://umbraco.com/dist/nuget/logo-small.png
- https://opensource.org/licenses/MIT
- false
+ icon.png
+ MIT
umbraco storage
- git
- https://github.com/umbraco/Umbraco.StorageProviders
-
- true
+ true
+ true
+ $(DefaultItemExcludes);packages.lock.json
+
-
- true
+
+
+
+
+
+
+
-
+
+
+ true
+ true
true
snupkg
+
+
+
diff --git a/src/Umbraco.StorageProviders.AzureBlob/AzureBlobDirectoryContents.cs b/src/Umbraco.StorageProviders.AzureBlob/AzureBlobDirectoryContents.cs
new file mode 100644
index 0000000..e20c7c9
--- /dev/null
+++ b/src/Umbraco.StorageProviders.AzureBlob/AzureBlobDirectoryContents.cs
@@ -0,0 +1,47 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using Azure.Storage.Blobs;
+using Azure.Storage.Blobs.Models;
+using Microsoft.Extensions.FileProviders;
+
+namespace Umbraco.StorageProviders.AzureBlob
+{
+ ///
+ /// Represents a virtual hierarchy of Azure Blob Storage blobs.
+ ///
+ ///
+ public sealed class AzureBlobDirectoryContents : IDirectoryContents
+ {
+ private readonly BlobContainerClient _containerClient;
+ private readonly IReadOnlyCollection _items;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The container client.
+ /// The items.
+ /// is null.
+ /// is null.
+ public AzureBlobDirectoryContents(BlobContainerClient containerClient, IReadOnlyCollection items)
+ {
+ _containerClient = containerClient ?? throw new ArgumentNullException(nameof(containerClient));
+ _items = items ?? throw new ArgumentNullException(nameof(items));
+
+ Exists = items.Count > 0;
+ }
+
+ ///
+ public bool Exists { get; }
+
+ ///
+ public IEnumerator GetEnumerator()
+ => _items.Select(x => x.IsPrefix
+ ? new AzureBlobPrefixInfo(x.Prefix)
+ : new AzureBlobItemInfo(_containerClient.GetBlobClient(x.Blob.Name), x.Blob.Properties)).GetEnumerator();
+
+ ///
+ IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
+ }
+}
diff --git a/src/Umbraco.StorageProviders.AzureBlob/AzureBlobFileProvider.cs b/src/Umbraco.StorageProviders.AzureBlob/AzureBlobFileProvider.cs
new file mode 100644
index 0000000..87722ea
--- /dev/null
+++ b/src/Umbraco.StorageProviders.AzureBlob/AzureBlobFileProvider.cs
@@ -0,0 +1,86 @@
+using System;
+using System.Linq;
+using System.Net;
+using Azure;
+using Azure.Storage.Blobs;
+using Azure.Storage.Blobs.Models;
+using Microsoft.Extensions.FileProviders;
+using Microsoft.Extensions.Primitives;
+using Umbraco.Cms.Core;
+using Umbraco.Extensions;
+using Umbraco.StorageProviders.AzureBlob.IO;
+
+namespace Umbraco.StorageProviders.AzureBlob
+{
+ ///
+ /// Represents a read-only Azure Blob Storage file provider.
+ ///
+ ///
+ public sealed class AzureBlobFileProvider : IFileProvider
+ {
+ private readonly BlobContainerClient _containerClient;
+ private readonly string? _containerRootPath;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The container client.
+ /// The container root path.
+ /// is null.
+ public AzureBlobFileProvider(BlobContainerClient containerClient, string? containerRootPath = null)
+ {
+ _containerClient = containerClient ?? throw new ArgumentNullException(nameof(containerClient));
+ _containerRootPath = containerRootPath?.Trim(Constants.CharArrays.ForwardSlash);
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The options.
+ /// is null.
+ public AzureBlobFileProvider(AzureBlobFileSystemOptions options)
+ {
+ ArgumentNullException.ThrowIfNull(options);
+
+ _containerClient = new BlobContainerClient(options.ConnectionString, options.ContainerName);
+ _containerRootPath = options.ContainerRootPath?.Trim(Constants.CharArrays.ForwardSlash);
+ }
+
+ ///
+ public IDirectoryContents GetDirectoryContents(string subpath)
+ {
+ var path = GetFullPath(subpath);
+
+ // Get all blobs and iterate to fetch all pages
+ var blobs = _containerClient.GetBlobsByHierarchy(delimiter: "/", prefix: path).ToList();
+
+ return blobs.Count == 0
+ ? NotFoundDirectoryContents.Singleton
+ : new AzureBlobDirectoryContents(_containerClient, blobs);
+ }
+
+ ///
+ public IFileInfo GetFileInfo(string subpath)
+ {
+ var path = GetFullPath(subpath);
+ var blobClient = _containerClient.GetBlobClient(path);
+
+ BlobProperties properties;
+ try
+ {
+ properties = blobClient.GetProperties().Value;
+ }
+ catch (RequestFailedException ex) when (ex.Status == (int)HttpStatusCode.NotFound)
+ {
+ return new NotFoundFileInfo(AzureBlobItemInfo.ParseName(path));
+ }
+
+ return new AzureBlobItemInfo(blobClient, properties);
+ }
+
+ ///
+ public IChangeToken Watch(string filter) => NullChangeToken.Singleton;
+
+ private string GetFullPath(string subpath) => _containerRootPath + subpath.EnsureStartsWith('/');
+ }
+}
diff --git a/src/Umbraco.StorageProviders.AzureBlob/AzureBlobFileSystemMiddleware.cs b/src/Umbraco.StorageProviders.AzureBlob/AzureBlobFileSystemMiddleware.cs
deleted file mode 100644
index 01f85bb..0000000
--- a/src/Umbraco.StorageProviders.AzureBlob/AzureBlobFileSystemMiddleware.cs
+++ /dev/null
@@ -1,385 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Globalization;
-using System.IO;
-using System.Linq;
-using System.Net;
-using System.Threading;
-using System.Threading.Tasks;
-using Azure;
-using Azure.Storage.Blobs;
-using Azure.Storage.Blobs.Models;
-using Microsoft.AspNetCore.Http;
-using Microsoft.Extensions.Options;
-using Microsoft.Net.Http.Headers;
-using Umbraco.Cms.Core.Hosting;
-using Umbraco.StorageProviders.AzureBlob.IO;
-
-namespace Umbraco.StorageProviders.AzureBlob
-{
- ///
- /// The Azure Blob file system middleware.
- ///
- ///
- public class AzureBlobFileSystemMiddleware : IMiddleware
- {
- private readonly string _name;
- private readonly IAzureBlobFileSystemProvider _fileSystemProvider;
- private string _rootPath;
- private string _containerRootPath;
- private readonly TimeSpan? _maxAge = TimeSpan.FromDays(7);
-
- ///
- /// Creates a new instance of .
- ///
- /// The options.
- /// The file system provider.
- /// The hosting environment.
-
- public AzureBlobFileSystemMiddleware(IOptionsMonitor options, IAzureBlobFileSystemProvider fileSystemProvider, IHostingEnvironment hostingEnvironment)
- : this(AzureBlobFileSystemOptions.MediaFileSystemName, options, fileSystemProvider, hostingEnvironment)
- { }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The name.
- /// The options.
- /// The file system provider.
- /// The hosting environment.
- /// options
- /// or
- /// hostingEnvironment
- /// or
- /// name
- /// or
- /// fileSystemProvider
- protected AzureBlobFileSystemMiddleware(string name, IOptionsMonitor options, IAzureBlobFileSystemProvider fileSystemProvider, IHostingEnvironment hostingEnvironment)
- {
- if (options == null) throw new ArgumentNullException(nameof(options));
- if (hostingEnvironment == null) throw new ArgumentNullException(nameof(hostingEnvironment));
-
- _name = name ?? throw new ArgumentNullException(nameof(name));
- _fileSystemProvider = fileSystemProvider ?? throw new ArgumentNullException(nameof(fileSystemProvider));
-
- var fileSystemOptions = options.Get(name);
- _rootPath = hostingEnvironment.ToAbsolute(fileSystemOptions.VirtualPath);
- _containerRootPath = fileSystemOptions.ContainerRootPath ?? _rootPath;
-
- options.OnChange((o, n) => OptionsOnChange(o, n, hostingEnvironment));
- }
-
- ///
- public Task InvokeAsync(HttpContext context, RequestDelegate next)
- {
- if (context == null) throw new ArgumentNullException(nameof(context));
- if (next == null) throw new ArgumentNullException(nameof(next));
-
- return HandleRequestAsync(context, next);
- }
-
- private async Task HandleRequestAsync(HttpContext context, RequestDelegate next)
- {
- var request = context.Request;
- var response = context.Response;
-
- if (!context.Request.Path.StartsWithSegments(_rootPath, StringComparison.InvariantCultureIgnoreCase))
- {
- await next(context).ConfigureAwait(false);
- return;
- }
-
- string containerPath = $"{_containerRootPath.TrimEnd('/')}/{(request.Path.Value.Remove(0, _rootPath.Length)).TrimStart('/')}";
- var blob = _fileSystemProvider.GetFileSystem(_name).GetBlobClient(containerPath);
-
- var blobRequestConditions = GetAccessCondition(context.Request);
-
- Response properties;
- var ignoreRange = false;
-
- try
- {
- properties = await blob.GetPropertiesAsync(blobRequestConditions, context.RequestAborted).ConfigureAwait(false);
- }
- catch (RequestFailedException ex) when (ex.Status == (int)HttpStatusCode.NotFound)
- {
- // the blob or file does not exist, let other middleware handle it
- await next(context).ConfigureAwait(false);
- return;
- }
- catch (RequestFailedException ex) when (ex.Status == (int)HttpStatusCode.PreconditionFailed)
- {
- // If-Range or If-Unmodified-Since is not met
- // if the resource has been modified, we need to send the whole file back with a 200 OK
- // a Content-Range header is needed with the new length
- ignoreRange = true;
- properties = await blob.GetPropertiesAsync().ConfigureAwait(false);
- response.Headers.Append("Content-Range", $"bytes */{properties.Value.ContentLength}");
- }
- catch (RequestFailedException ex) when (ex.Status == (int)HttpStatusCode.NotModified)
- {
- // If-None-Match or If-Modified-Since is not met
- // we need to pass the status code back to the client
- // so it knows it can reuse the cached data
- response.StatusCode = (int)HttpStatusCode.NotModified;
- return;
- }
- // for some reason we get an internal exception type with the message
- // and not a request failed with status NotModified :(
- catch (Exception ex) when (ex.Message == "The condition specified using HTTP conditional header(s) is not met.")
- {
- if (blobRequestConditions != null
- && (blobRequestConditions.IfMatch.HasValue || blobRequestConditions.IfUnmodifiedSince.HasValue))
- {
- // If-Range or If-Unmodified-Since is not met
- // if the resource has been modified, we need to send the whole file back with a 200 OK
- // a Content-Range header is needed with the new length
- ignoreRange = true;
- properties = await blob.GetPropertiesAsync().ConfigureAwait(false);
- response.Headers.Append("Content-Range", $"bytes */{properties.Value.ContentLength}");
- }
- else
- {
- // If-None-Match or If-Modified-Since is not met
- // we need to pass the status code back to the client
- // so it knows it can reuse the cached data
- response.StatusCode = (int)HttpStatusCode.NotModified;
- return;
- }
- }
- catch (TaskCanceledException)
- {
- // client cancelled the request before it could finish, just ignore
- return;
- }
-
- var responseHeaders = response.GetTypedHeaders();
-
- responseHeaders.CacheControl =
- new CacheControlHeaderValue
- {
- Public = true,
- MustRevalidate = true,
- MaxAge = _maxAge,
- };
-
- responseHeaders.LastModified = properties.Value.LastModified;
- responseHeaders.ETag = new EntityTagHeaderValue(properties.Value.ETag.ToString("H"));
- responseHeaders.Append(HeaderNames.Vary, "Accept-Encoding");
-
- var requestHeaders = request.GetTypedHeaders();
-
- var rangeHeader = requestHeaders.Range;
-
- if (!ignoreRange && rangeHeader != null)
- {
- if (!ValidateRanges(rangeHeader.Ranges, properties.Value.ContentLength))
- {
- // no ranges could be parsed
- response.Clear();
- response.StatusCode = (int)HttpStatusCode.RequestedRangeNotSatisfiable;
- responseHeaders.ContentRange = new ContentRangeHeaderValue(properties.Value.ContentLength);
- return;
- }
-
- if (rangeHeader.Ranges.Count == 1)
- {
- var range = rangeHeader.Ranges.First();
- var contentRange = GetRangeHeader(properties, range);
-
- response.StatusCode = (int)HttpStatusCode.PartialContent;
- response.ContentType = properties.Value.ContentType;
- responseHeaders.ContentRange = contentRange;
-
- await DownloadRangeToStreamAsync(blob, properties, response.Body, contentRange, context.RequestAborted).ConfigureAwait(false);
- return;
- }
-
- if (rangeHeader.Ranges.Count > 1)
- {
- // handle multipart ranges
- var boundary = Guid.NewGuid().ToString();
- response.StatusCode = (int)HttpStatusCode.PartialContent;
- response.ContentType = $"multipart/byteranges; boundary={boundary}";
-
- foreach (var range in rangeHeader.Ranges)
- {
- var contentRange = GetRangeHeader(properties, range);
-
- await response.WriteAsync($"--{boundary}").ConfigureAwait(false);
- await response.WriteAsync("\n").ConfigureAwait(false);
- await response.WriteAsync($"{HeaderNames.ContentType}: {properties.Value.ContentType}").ConfigureAwait(false);
- await response.WriteAsync("\n").ConfigureAwait(false);
- await response.WriteAsync($"{HeaderNames.ContentRange}: {contentRange}").ConfigureAwait(false);
- await response.WriteAsync("\n").ConfigureAwait(false);
- await response.WriteAsync("\n").ConfigureAwait(false);
-
- await DownloadRangeToStreamAsync(blob, properties, response.Body, contentRange, context.RequestAborted).ConfigureAwait(false);
- await response.WriteAsync("\n").ConfigureAwait(false);
- }
-
- await response.WriteAsync($"--{boundary}--").ConfigureAwait(false);
- await response.WriteAsync("\n").ConfigureAwait(false);
- return;
- }
- }
- response.StatusCode = (int)HttpStatusCode.OK;
- response.ContentType = properties.Value.ContentType;
- responseHeaders.ContentLength = properties.Value.ContentLength;
- responseHeaders.Append(HeaderNames.AcceptRanges, "bytes");
-
- await response.StartAsync().ConfigureAwait(false);
- await DownloadRangeToStreamAsync(blob, response.Body, 0L, properties.Value.ContentLength, context.RequestAborted).ConfigureAwait(false);
- }
-
- private static BlobRequestConditions? GetAccessCondition(HttpRequest request)
- {
- var range = request.Headers["Range"];
- if (string.IsNullOrEmpty(range))
- {
- // etag
- var ifNoneMatch = request.Headers["If-None-Match"];
- if (!string.IsNullOrEmpty(ifNoneMatch))
- {
- return new BlobRequestConditions
- {
- IfNoneMatch = new ETag(ifNoneMatch)
- };
- }
-
- var ifModifiedSince = request.Headers["If-Modified-Since"];
- if (!string.IsNullOrEmpty(ifModifiedSince))
- {
- return new BlobRequestConditions
- {
- IfModifiedSince = DateTimeOffset.Parse(ifModifiedSince, CultureInfo.InvariantCulture)
- };
- }
- }
- else
- {
- // handle If-Range header, it can be either an etag or a date
- // see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-Range and https://tools.ietf.org/html/rfc7233#section-3.2
- var ifRange = request.Headers["If-Range"];
- if (!string.IsNullOrEmpty(ifRange))
- {
- var conditions = new BlobRequestConditions();
-
- if (DateTimeOffset.TryParse(ifRange, out var date))
- {
- conditions.IfUnmodifiedSince = date;
- }
- else
- {
- conditions.IfMatch = new ETag(ifRange);
- }
- }
-
- var ifUnmodifiedSince = request.Headers["If-Unmodified-Since"];
- if (!string.IsNullOrEmpty(ifUnmodifiedSince))
- {
- return new BlobRequestConditions
- {
- IfUnmodifiedSince = DateTimeOffset.Parse(ifUnmodifiedSince, CultureInfo.InvariantCulture)
- };
- }
- }
-
- return null;
- }
-
- private static bool ValidateRanges(ICollection ranges, long length)
- {
- if (ranges.Count == 0)
- return false;
-
- foreach (var range in ranges)
- {
- if (range.From > range.To)
- return false;
- if (range.To >= length)
- return false;
- }
-
- return true;
- }
-
- private static ContentRangeHeaderValue GetRangeHeader(BlobProperties properties, RangeItemHeaderValue range)
- {
- var length = properties.ContentLength - 1;
-
- long from;
- long to;
- if (range.To.HasValue)
- {
- if (range.From.HasValue)
- {
- to = Math.Min(range.To.Value, length);
- from = range.From.Value;
- }
- else
- {
- to = length;
- from = Math.Max(properties.ContentLength - range.To.Value, 0L);
- }
- }
- else if (range.From.HasValue)
- {
- to = length;
- from = range.From.Value;
- }
- else
- {
- to = length;
- from = 0L;
- }
-
- return new ContentRangeHeaderValue(from, to, properties.ContentLength);
- }
-
- private static async Task DownloadRangeToStreamAsync(BlobClient blob, BlobProperties properties,
- Stream outputStream, ContentRangeHeaderValue contentRange, CancellationToken cancellationToken)
- {
- var offset = contentRange.From.GetValueOrDefault(0L);
- var length = properties.ContentLength;
-
- if (contentRange.To.HasValue && contentRange.From.HasValue)
- {
- length = contentRange.To.Value - contentRange.From.Value + 1;
- }
- else if (contentRange.To.HasValue)
- {
- length = contentRange.To.Value + 1;
- }
- else if (contentRange.From.HasValue)
- {
- length = properties.ContentLength - contentRange.From.Value + 1;
- }
-
- await DownloadRangeToStreamAsync(blob, outputStream, offset, length, cancellationToken).ConfigureAwait(false);
- }
-
- private static async Task DownloadRangeToStreamAsync(BlobClient blob, Stream outputStream,
- long offset, long length, CancellationToken cancellationToken)
- {
- try
- {
- if (length == 0) return;
- var response = await blob.DownloadAsync(new HttpRange(offset, length), cancellationToken: cancellationToken).ConfigureAwait(false);
- await response.Value.Content.CopyToAsync(outputStream, cancellationToken).ConfigureAwait(false);
- }
- catch (TaskCanceledException)
- {
- // client cancelled the request before it could finish, just ignore
- }
- }
-
- private void OptionsOnChange(AzureBlobFileSystemOptions options, string name, IHostingEnvironment hostingEnvironment)
- {
- if (name != _name) return;
-
- _rootPath = hostingEnvironment.ToAbsolute(options.VirtualPath);
- _containerRootPath = options.ContainerRootPath ?? _rootPath;
- }
- }
-}
diff --git a/src/Umbraco.StorageProviders.AzureBlob/AzureBlobItemInfo.cs b/src/Umbraco.StorageProviders.AzureBlob/AzureBlobItemInfo.cs
new file mode 100644
index 0000000..4c1abcd
--- /dev/null
+++ b/src/Umbraco.StorageProviders.AzureBlob/AzureBlobItemInfo.cs
@@ -0,0 +1,91 @@
+using System;
+using System.IO;
+using Azure.Storage.Blobs;
+using Azure.Storage.Blobs.Models;
+using Microsoft.Extensions.FileProviders;
+
+namespace Umbraco.StorageProviders.AzureBlob
+{
+ ///
+ /// Represents an Azure Blob Storage blob item.
+ ///
+ ///
+ public sealed class AzureBlobItemInfo : IFileInfo
+ {
+ private readonly BlobClient _blobClient;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The blob client.
+ /// The properties.
+ /// is null.
+ /// is null.
+ public AzureBlobItemInfo(BlobClient blobClient, BlobProperties properties)
+ : this(blobClient)
+ {
+ ArgumentNullException.ThrowIfNull(properties);
+
+ LastModified = properties.LastModified;
+ Length = properties.ContentLength;
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The blob client.
+ /// The properties.
+ /// is null.
+ /// is null.
+ public AzureBlobItemInfo(BlobClient blobClient, BlobItemProperties properties)
+ : this(blobClient)
+ {
+ ArgumentNullException.ThrowIfNull(properties);
+
+ LastModified = properties.LastModified.GetValueOrDefault();
+ Length = properties.ContentLength.GetValueOrDefault(-1);
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The blob client.
+ /// is null.
+ private AzureBlobItemInfo(BlobClient blobClient)
+ {
+ _blobClient = blobClient ?? throw new ArgumentNullException(nameof(blobClient));
+
+ Name = ParseName(blobClient.Name);
+ }
+
+ ///
+ public bool Exists => true;
+
+ ///
+ public bool IsDirectory => false;
+
+ ///
+ public DateTimeOffset LastModified { get; }
+
+ ///
+ public long Length { get; }
+
+ ///
+ public string Name { get; }
+
+ ///
+ public string PhysicalPath => null!;
+
+ ///
+ public Stream CreateReadStream() => _blobClient.OpenRead();
+
+ ///
+ /// Parses the name from the file path.
+ ///
+ /// The file path.
+ ///
+ /// The name.
+ ///
+ internal static string ParseName(string path) => path[(path.LastIndexOf('/') + 1)..];
+ }
+}
diff --git a/src/Umbraco.StorageProviders.AzureBlob/AzureBlobPrefixInfo.cs b/src/Umbraco.StorageProviders.AzureBlob/AzureBlobPrefixInfo.cs
new file mode 100644
index 0000000..a19388b
--- /dev/null
+++ b/src/Umbraco.StorageProviders.AzureBlob/AzureBlobPrefixInfo.cs
@@ -0,0 +1,53 @@
+using System;
+using System.IO;
+using Microsoft.Extensions.FileProviders;
+
+namespace Umbraco.StorageProviders.AzureBlob
+{
+ ///
+ /// Represents an Azure Blob Storage prefix.
+ ///
+ ///
+ public sealed class AzureBlobPrefixInfo : IFileInfo
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The prefix.
+ /// is null.
+ public AzureBlobPrefixInfo(string prefix)
+ {
+ ArgumentNullException.ThrowIfNull(prefix);
+
+ Name = ParseName(prefix);
+ }
+
+ ///
+ public bool Exists => true;
+
+ ///
+ public bool IsDirectory => true;
+
+ ///
+ public DateTimeOffset LastModified => default;
+
+ ///
+ public long Length => -1;
+
+ ///
+ public string Name { get; }
+
+ ///
+ public string PhysicalPath => null!;
+
+ ///
+ public Stream CreateReadStream() => throw new InvalidOperationException();
+
+ private static string ParseName(string prefix)
+ {
+ var name = prefix.TrimEnd('/');
+
+ return name[(name.LastIndexOf('/') + 1)..];
+ }
+ }
+}
diff --git a/src/Umbraco.StorageProviders.AzureBlob/CdnMediaUrlProvider.cs b/src/Umbraco.StorageProviders.AzureBlob/CdnMediaUrlProvider.cs
deleted file mode 100644
index 5c7c55d..0000000
--- a/src/Umbraco.StorageProviders.AzureBlob/CdnMediaUrlProvider.cs
+++ /dev/null
@@ -1,58 +0,0 @@
-using System;
-using Microsoft.Extensions.Options;
-using Umbraco.Cms.Core.Models.PublishedContent;
-using Umbraco.Cms.Core.PropertyEditors;
-using Umbraco.Cms.Core.Routing;
-
-namespace Umbraco.StorageProviders.AzureBlob
-{
- ///
- /// A that returns a CDN URL for a media item.
- ///
- ///
- public class CdnMediaUrlProvider : DefaultMediaUrlProvider
- {
- private bool _removeMediaFromPath;
- private Uri _cdnUrl;
-
- ///
- /// Creates a new instance of .
- ///
- /// The options.
- /// The media path generators.
- /// The URI utility.
- /// options
- public CdnMediaUrlProvider(IOptionsMonitor options,
- MediaUrlGeneratorCollection mediaPathGenerators, UriUtility uriUtility)
- : base(mediaPathGenerators, uriUtility)
- {
- if (options == null) throw new ArgumentNullException(nameof(options));
-
- _cdnUrl = options.CurrentValue.Url;
- _removeMediaFromPath = options.CurrentValue.RemoveMediaFromPath;
-
- options.OnChange(OptionsOnChange);
- }
-
- ///
- public override UrlInfo? GetMediaUrl(IPublishedContent content, string propertyAlias, UrlMode mode, string culture, Uri current)
- {
- var mediaUrl = base.GetMediaUrl(content, propertyAlias, UrlMode.Relative, culture, current);
- if (mediaUrl == null) return null;
-
- return mediaUrl.IsUrl switch
- {
- false => mediaUrl,
- _ => UrlInfo.Url($"{_cdnUrl}/{mediaUrl.Text[(_removeMediaFromPath ? "/media/" : "/").Length..]}", culture)
- };
- }
-
- private void OptionsOnChange(CdnMediaUrlProviderOptions options, string name)
- {
- if (name != Options.DefaultName) return;
-
- _removeMediaFromPath = options.RemoveMediaFromPath;
- _cdnUrl = options.Url;
- }
- }
-}
diff --git a/src/Umbraco.StorageProviders.AzureBlob/DependencyInjection/AzureBlobFileSystemExtensions.cs b/src/Umbraco.StorageProviders.AzureBlob/DependencyInjection/AzureBlobFileSystemExtensions.cs
index 96f72c9..a25c4cd 100644
--- a/src/Umbraco.StorageProviders.AzureBlob/DependencyInjection/AzureBlobFileSystemExtensions.cs
+++ b/src/Umbraco.StorageProviders.AzureBlob/DependencyInjection/AzureBlobFileSystemExtensions.cs
@@ -1,10 +1,9 @@
using System;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
+using Microsoft.Extensions.Options;
using Umbraco.StorageProviders.AzureBlob.IO;
-// ReSharper disable once CheckNamespace
-// uses same namespace as Umbraco Core for easier discoverability
namespace Umbraco.Cms.Core.DependencyInjection
{
///
@@ -18,30 +17,12 @@ public static class AzureBlobFileSystemExtensions
///
/// The .
/// The name of the file system.
- /// The path to map the filesystem to.
///
/// The .
///
- /// builder
- /// or
- /// name
- /// Value cannot be null or whitespace. - path
- public static IUmbracoBuilder AddAzureBlobFileSystem(this IUmbracoBuilder builder, string name, string path)
- {
- if (builder == null) throw new ArgumentNullException(nameof(builder));
- if (name == null) throw new ArgumentNullException(nameof(name));
- if (string.IsNullOrWhiteSpace(path)) throw new ArgumentException("Value cannot be null or whitespace.", nameof(path));
-
- builder.Services.TryAddSingleton();
-
- builder.Services
- .AddOptions(name)
- .BindConfiguration($"Umbraco:Storage:AzureBlob:{name}")
- .Configure(options => options.VirtualPath = path)
- .ValidateDataAnnotations();
-
- return builder;
- }
+ /// is null.
+ public static IUmbracoBuilder AddAzureBlobFileSystem(this IUmbracoBuilder builder, string name)
+ => builder.AddInternal(name);
///
/// Registers a in the , with it's configuration
@@ -49,32 +30,46 @@ public static IUmbracoBuilder AddAzureBlobFileSystem(this IUmbracoBuilder builde
///
/// The .
/// The name of the file system.
- /// The path to map the filesystem to.
/// An action used to configure the .
///
/// The .
///
- /// builder
- /// or
- /// name
- /// or
- /// configure
- /// Value cannot be null or whitespace. - path
- public static IUmbracoBuilder AddAzureBlobFileSystem(this IUmbracoBuilder builder, string name, string path, Action configure)
- {
- if (builder == null) throw new ArgumentNullException(nameof(builder));
- if (name == null) throw new ArgumentNullException(nameof(name));
- if (string.IsNullOrWhiteSpace(path)) throw new ArgumentException("Value cannot be null or whitespace.", nameof(path));
- if (configure == null) throw new ArgumentNullException(nameof(configure));
+ /// is null.
+ /// is null.
+ public static IUmbracoBuilder AddAzureBlobFileSystem(this IUmbracoBuilder builder, string name, Action configure)
+ => builder.AddInternal(name, optionsBuilder => optionsBuilder.Configure(configure));
- AddAzureBlobFileSystem(builder, name, path);
-
- builder.Services
- .AddOptions(name)
- .Configure(configure);
+ ///
+ /// Registers a in the , with it's configuration
+ /// loaded from Umbraco:Storage:AzureBlob:{name} where {name} is the value of the parameter.
+ ///
+ /// The .
+ /// The name of the file system.
+ /// An action used to configure the .
+ ///
+ /// The .
+ ///
+ /// is null.
+ /// is null.
+ public static IUmbracoBuilder AddAzureBlobFileSystem(this IUmbracoBuilder builder, string name, Action configure)
+ => builder.AddInternal(name, optionsBuilder => optionsBuilder.Configure(configure));
- return builder;
- }
+ ///
+ /// Registers a in the , with it's configuration
+ /// loaded from Umbraco:Storage:AzureBlob:{name} where {name} is the value of the parameter.
+ ///
+ /// A dependency used by the configure action.
+ /// The .
+ /// The name of the file system.
+ /// An action used to configure the .
+ ///
+ /// The .
+ ///
+ /// is null.
+ /// is null.
+ public static IUmbracoBuilder AddAzureBlobFileSystem(this IUmbracoBuilder builder, string name, Action configure)
+ where TDep : class
+ => builder.AddInternal(name, optionsBuilder => optionsBuilder.Configure(configure));
///
/// Registers a in the , with it's configuration
@@ -82,29 +77,24 @@ public static IUmbracoBuilder AddAzureBlobFileSystem(this IUmbracoBuilder builde
///
/// The .
/// The name of the file system.
- /// The path to map the filesystem to.
/// An action used to configure the .
///
/// The .
///
- /// builder
- /// or
- /// name
- /// or
- /// configure
- /// Value cannot be null or whitespace. - path
- public static IUmbracoBuilder AddAzureBlobFileSystem(this IUmbracoBuilder builder, string name, string path, Action configure)
+ /// is null.
+ /// is null.
+ internal static IUmbracoBuilder AddInternal(this IUmbracoBuilder builder, string name, Action>? configure = null)
{
- if (builder == null) throw new ArgumentNullException(nameof(builder));
- if (name == null) throw new ArgumentNullException(nameof(name));
- if (string.IsNullOrWhiteSpace(path)) throw new ArgumentException("Value cannot be null or whitespace.", nameof(path));
- if (configure == null) throw new ArgumentNullException(nameof(configure));
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(name);
- AddAzureBlobFileSystem(builder, name, path);
+ builder.Services.TryAddSingleton();
+
+ var optionsBuilder = builder.Services.AddOptions(name)
+ .BindConfiguration($"Umbraco:Storage:AzureBlob:{name}")
+ .ValidateDataAnnotations();
- builder.Services
- .AddOptions(name)
- .Configure(configure);
+ configure?.Invoke(optionsBuilder);
return builder;
}
diff --git a/src/Umbraco.StorageProviders.AzureBlob/DependencyInjection/AzureBlobMediaFileSystemExtensions.cs b/src/Umbraco.StorageProviders.AzureBlob/DependencyInjection/AzureBlobMediaFileSystemExtensions.cs
index ad3cd93..7640131 100644
--- a/src/Umbraco.StorageProviders.AzureBlob/DependencyInjection/AzureBlobMediaFileSystemExtensions.cs
+++ b/src/Umbraco.StorageProviders.AzureBlob/DependencyInjection/AzureBlobMediaFileSystemExtensions.cs
@@ -1,20 +1,13 @@
using System;
-using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Options;
using SixLabors.ImageSharp.Web.Caching;
-using SixLabors.ImageSharp.Web.Providers;
using Umbraco.Cms.Core.Configuration.Models;
using Umbraco.Cms.Infrastructure.DependencyInjection;
-using Umbraco.Cms.Web.Common.ApplicationBuilder;
using Umbraco.Extensions;
-using Umbraco.StorageProviders.AzureBlob;
using Umbraco.StorageProviders.AzureBlob.Imaging;
using Umbraco.StorageProviders.AzureBlob.IO;
-// ReSharper disable once CheckNamespace
-// uses same namespace as Umbraco Core for easier discoverability
namespace Umbraco.Cms.Core.DependencyInjection
{
///
@@ -22,20 +15,6 @@ namespace Umbraco.Cms.Core.DependencyInjection
///
public static class AzureBlobMediaFileSystemExtensions
{
- ///
- /// Registers an and it's dependencies configured for media.
- ///
- /// The .
- ///
- /// The .
- ///
- ///
- /// This will also configure the ImageSharp.Web middleware to use Azure Blob Storage to retrieve the original and cache the processed images.
- ///
- /// builder
- public static IUmbracoBuilder AddAzureBlobMediaFileSystem(this IUmbracoBuilder builder)
- => builder.AddAzureBlobMediaFileSystem(true);
-
///
/// Registers an and it's dependencies configured for media.
///
@@ -44,92 +23,50 @@ public static IUmbracoBuilder AddAzureBlobMediaFileSystem(this IUmbracoBuilder b
///
/// The .
///
- /// builder
- public static IUmbracoBuilder AddAzureBlobMediaFileSystem(this IUmbracoBuilder builder, bool useAzureBlobImageCache)
- {
- if (builder == null) throw new ArgumentNullException(nameof(builder));
-
- builder.AddAzureBlobFileSystem(AzureBlobFileSystemOptions.MediaFileSystemName, "~/media",
- (options, provider) =>
- {
- var globalSettingsOptions = provider.GetRequiredService>();
- options.VirtualPath = globalSettingsOptions.Value.UmbracoMediaPath;
- });
-
- builder.Services.TryAddSingleton();
-
- // ImageSharp image provider/cache
- builder.Services.Insert(0, ServiceDescriptor.Singleton());
- if (useAzureBlobImageCache)
- {
- builder.Services.AddUnique();
- }
-
- builder.SetMediaFileSystem(provider => provider.GetRequiredService()
- .GetFileSystem(AzureBlobFileSystemOptions.MediaFileSystemName));
-
- return builder;
- }
+ /// is null.
+ public static IUmbracoBuilder AddAzureBlobMediaFileSystem(this IUmbracoBuilder builder, bool useAzureBlobImageCache = true)
+ => builder.AddInternal(useAzureBlobImageCache);
///
/// Registers a and it's dependencies configured for media.
///
/// The .
/// An action used to configure the .
+ /// If set to true also configures Azure Blob Storage for the image cache.
///
/// The .
///
- ///
- /// This will also configure the ImageSharp.Web middleware to use Azure Blob Storage to retrieve the original and cache the processed images.
- ///
- /// builder
- /// or
- /// configure
- public static IUmbracoBuilder AddAzureBlobMediaFileSystem(this IUmbracoBuilder builder, Action configure)
- => builder.AddAzureBlobMediaFileSystem(true, configure);
+ /// is null.
+ public static IUmbracoBuilder AddAzureBlobMediaFileSystem(this IUmbracoBuilder builder, Action configure, bool useAzureBlobImageCache = true)
+ => builder.AddInternal(useAzureBlobImageCache, x => x.Configure(configure));
///
/// Registers a and it's dependencies configured for media.
///
/// The .
- /// If set to true also configures Azure Blob Storage for the image cache.
/// An action used to configure the .
+ /// If set to true also configures Azure Blob Storage for the image cache.
///
/// The .
///
- /// builder
- /// or
- /// configure
- public static IUmbracoBuilder AddAzureBlobMediaFileSystem(this IUmbracoBuilder builder, bool useAzureBlobImageCache, Action configure)
- {
- if (builder == null) throw new ArgumentNullException(nameof(builder));
- if (configure == null) throw new ArgumentNullException(nameof(configure));
-
- AddAzureBlobMediaFileSystem(builder, useAzureBlobImageCache);
-
- builder.Services
- .AddOptions(AzureBlobFileSystemOptions.MediaFileSystemName)
- .Configure(configure);
-
- return builder;
- }
+ /// is null.
+ public static IUmbracoBuilder AddAzureBlobFileSystem(this IUmbracoBuilder builder, Action configure, bool useAzureBlobImageCache = true)
+ => builder.AddInternal(useAzureBlobImageCache, x => x.Configure(configure));
///
/// Registers a and it's dependencies configured for media.
///
+ /// A dependency used by the configure action.
/// The .
/// An action used to configure the .
+ /// If set to true also configures Azure Blob Storage for the image cache.
///
/// The .
///
- ///
- /// This will also configure the ImageSharp.Web middleware to use Azure Blob Storage to retrieve the original and cache the processed images.
- ///
- /// builder
- /// or
- /// configure
- public static IUmbracoBuilder AddAzureBlobMediaFileSystem(this IUmbracoBuilder builder, Action configure)
- => builder.AddAzureBlobMediaFileSystem(true, configure);
+ /// is null.
+ public static IUmbracoBuilder AddAzureBlobFileSystem(this IUmbracoBuilder builder, Action configure, bool useAzureBlobImageCache = true)
+ where TDep : class
+ => builder.AddInternal(useAzureBlobImageCache, x => x.Configure(configure));
///
/// Registers a and it's dependencies configured for media.
@@ -140,55 +77,26 @@ public static IUmbracoBuilder AddAzureBlobMediaFileSystem(this IUmbracoBuilder b
///
/// The .
///
- /// builder
- /// or
- /// configure
- public static IUmbracoBuilder AddAzureBlobMediaFileSystem(this IUmbracoBuilder builder, bool useAzureBlobImageCache, Action configure)
+ /// is null.
+ internal static IUmbracoBuilder AddInternal(this IUmbracoBuilder builder, bool useAzureBlobImageCache, Action>? configure = null)
{
- if (builder == null) throw new ArgumentNullException(nameof(builder));
- if (configure == null) throw new ArgumentNullException(nameof(configure));
-
- AddAzureBlobMediaFileSystem(builder, useAzureBlobImageCache);
+ ArgumentNullException.ThrowIfNull(builder);
- builder.Services
- .AddOptions(AzureBlobFileSystemOptions.MediaFileSystemName)
- .Configure(configure);
-
- return builder;
- }
+ builder.AddInternal(AzureBlobFileSystemOptions.MediaFileSystemName, optionsBuilder =>
+ {
+ optionsBuilder.Configure>((options, globalSettings) => options.VirtualPath = globalSettings.Value.UmbracoMediaPath);
+ configure?.Invoke(optionsBuilder);
+ });
- ///
- /// Adds the .
- ///
- /// The .
- ///
- /// The .
- ///
- /// builder
- public static IUmbracoApplicationBuilderContext UseAzureBlobMediaFileSystem(this IUmbracoApplicationBuilderContext builder)
- {
- if (builder == null) throw new ArgumentNullException(nameof(builder));
+ // ImageSharp image cache
+ if (useAzureBlobImageCache)
+ {
+ builder.Services.AddUnique();
+ }
- UseAzureBlobMediaFileSystem(builder.AppBuilder);
+ builder.SetMediaFileSystem(provider => provider.GetRequiredService().GetFileSystem(AzureBlobFileSystemOptions.MediaFileSystemName));
return builder;
}
-
- ///
- /// Adds the .
- ///
- /// The .
- ///
- /// The .
- ///
- /// app
- public static IApplicationBuilder UseAzureBlobMediaFileSystem(this IApplicationBuilder app)
- {
- if (app == null) throw new ArgumentNullException(nameof(app));
-
- app.UseMiddleware();
-
- return app;
- }
}
}
diff --git a/src/Umbraco.StorageProviders.AzureBlob/DependencyInjection/CdnMediaUrlProviderExtensions.cs b/src/Umbraco.StorageProviders.AzureBlob/DependencyInjection/CdnMediaUrlProviderExtensions.cs
deleted file mode 100644
index 007d97f..0000000
--- a/src/Umbraco.StorageProviders.AzureBlob/DependencyInjection/CdnMediaUrlProviderExtensions.cs
+++ /dev/null
@@ -1,85 +0,0 @@
-using System;
-using Microsoft.Extensions.DependencyInjection;
-using Umbraco.StorageProviders.AzureBlob;
-
-// ReSharper disable once CheckNamespace
-// uses same namespace as Umbraco Core for easier discoverability
-namespace Umbraco.Cms.Core.DependencyInjection
-{
- ///
- /// Extension methods to help registering a CDN media URL provider.
- ///
- public static class CdnMediaUrlProviderExtensions
- {
- ///
- /// Registers and configures the .
- ///
- /// The .
- ///
- /// The .
- ///
- /// builder
- public static IUmbracoBuilder AddCdnMediaUrlProvider(this IUmbracoBuilder builder)
- {
- if (builder == null) throw new ArgumentNullException(nameof(builder));
-
- builder.Services.AddOptions()
- .BindConfiguration("Umbraco:Storage:AzureBlob:Media:Cdn")
- .ValidateDataAnnotations();
-
- builder.MediaUrlProviders().Insert();
-
- return builder;
- }
-
- ///
- /// Registers and configures the .
- ///
- /// The .
- /// An action used to configure the .
- ///
- /// The .
- ///
- /// builder
- /// or
- /// configure
- public static IUmbracoBuilder AddCdnMediaUrlProvider(this IUmbracoBuilder builder, Action configure)
- {
- if (builder == null) throw new ArgumentNullException(nameof(builder));
- if (configure == null) throw new ArgumentNullException(nameof(configure));
-
- AddCdnMediaUrlProvider(builder);
-
- builder.Services
- .AddOptions()
- .Configure(configure);
-
- return builder;
- }
-
- ///
- /// Registers and configures the .
- ///
- /// The .
- /// An action used to configure the .
- ///
- /// The .
- ///
- /// builder
- /// or
- /// configure
- public static IUmbracoBuilder AddCdnMediaUrlProvider(this IUmbracoBuilder builder, Action configure)
- {
- if (builder == null) throw new ArgumentNullException(nameof(builder));
- if (configure == null) throw new ArgumentNullException(nameof(configure));
-
- AddCdnMediaUrlProvider(builder);
-
- builder.Services
- .AddOptions()
- .Configure(configure);
-
- return builder;
- }
- }
-}
diff --git a/src/Umbraco.StorageProviders.AzureBlob/IO/AzureBlobFileSystem.cs b/src/Umbraco.StorageProviders.AzureBlob/IO/AzureBlobFileSystem.cs
index f69cc4e..e3bb84f 100644
--- a/src/Umbraco.StorageProviders.AzureBlob/IO/AzureBlobFileSystem.cs
+++ b/src/Umbraco.StorageProviders.AzureBlob/IO/AzureBlobFileSystem.cs
@@ -8,6 +8,7 @@
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Microsoft.AspNetCore.StaticFiles;
+using Microsoft.Extensions.FileProviders;
using Umbraco.Cms.Core.Hosting;
using Umbraco.Cms.Core.IO;
using Umbraco.Extensions;
@@ -15,42 +16,87 @@
namespace Umbraco.StorageProviders.AzureBlob.IO
{
///
- public class AzureBlobFileSystem : IAzureBlobFileSystem
+ public sealed class AzureBlobFileSystem : IAzureBlobFileSystem, IFileProviderFactory
{
- private readonly BlobContainerClient _container;
- private readonly IContentTypeProvider _contentTypeProvider;
- private readonly IIOHelper _ioHelper;
private readonly string _rootUrl;
private readonly string _containerRootPath;
+ private readonly BlobContainerClient _container;
+ private readonly IIOHelper _ioHelper;
+ private readonly IContentTypeProvider _contentTypeProvider;
///
- /// Creates a new instance of .
+ /// Initializes a new instance of the class.
///
- ///
- ///
- ///
- ///
- ///
- public AzureBlobFileSystem(AzureBlobFileSystemOptions options, IHostingEnvironment hostingEnvironment,
- IIOHelper ioHelper, IContentTypeProvider contentTypeProvider)
+ /// The options.
+ /// The hosting environment.
+ /// The I/O helper.
+ /// The content type provider.
+ /// is null.
+ /// is null.
+ /// is null.
+ /// is null.
+ public AzureBlobFileSystem(AzureBlobFileSystemOptions options, IHostingEnvironment hostingEnvironment, IIOHelper ioHelper, IContentTypeProvider contentTypeProvider)
{
- if (options == null) throw new ArgumentNullException(nameof(options));
- if (hostingEnvironment == null) throw new ArgumentNullException(nameof(hostingEnvironment));
+ ArgumentNullException.ThrowIfNull(options);
+ ArgumentNullException.ThrowIfNull(hostingEnvironment);
+ _rootUrl = EnsureUrlSeparatorChar(hostingEnvironment.ToAbsolute(options.VirtualPath)).TrimEnd('/');
+ _containerRootPath = options.ContainerRootPath ?? _rootUrl;
+ _container = new BlobContainerClient(options.ConnectionString, options.ContainerName);
_ioHelper = ioHelper ?? throw new ArgumentNullException(nameof(ioHelper));
_contentTypeProvider = contentTypeProvider ?? throw new ArgumentNullException(nameof(contentTypeProvider));
+ }
- _rootUrl = EnsureUrlSeparatorChar(hostingEnvironment.ToAbsolute(options.VirtualPath)).TrimEnd('/');
- _containerRootPath = options.ContainerRootPath ?? _rootUrl;
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The root URL.
+ /// The blob container client.
+ /// The I/O helper.
+ /// The content type provider.
+ /// The container root path (uses the root URL if not set).
+ /// is null.
+ /// is null.
+ /// is null.
+ /// is null.
+ public AzureBlobFileSystem(string rootUrl, BlobContainerClient blobContainerClient, IIOHelper ioHelper, IContentTypeProvider contentTypeProvider, string? containerRootPath = null)
+ {
+ ArgumentNullException.ThrowIfNull(rootUrl);
- var client = new BlobServiceClient(options.ConnectionString);
- _container = client.GetBlobContainerClient(options.ContainerName);
+ _rootUrl = EnsureUrlSeparatorChar(rootUrl).TrimEnd('/');
+ _containerRootPath = containerRootPath ?? _rootUrl;
+ _container = blobContainerClient ?? throw new ArgumentNullException(nameof(blobContainerClient));
+ _ioHelper = ioHelper ?? throw new ArgumentNullException(nameof(ioHelper));
+ _contentTypeProvider = contentTypeProvider ?? throw new ArgumentNullException(nameof(contentTypeProvider));
}
///
+ public bool CanAddPhysical => false;
+
+ ///
+ /// Creates a new container under the specified account if a container with the same name does not already exist.
+ ///
+ /// The Azure Blob Storage file system options.
+ /// Optionally specifies whether data in the container may be accessed publicly and the level of access.
+ /// specifies full public read access for container and blob data. Clients can enumerate blobs within the container via anonymous request, but cannot enumerate containers within the storage account.
+ /// specifies public read access for blobs. Blob data within this container can be read via anonymous request, but container data is not available. Clients cannot enumerate blobs within the container via anonymous request.
+ /// specifies that the container data is private to the account owner.
+ ///
+ /// If the container does not already exist, a describing the newly created container. If the container already exists, .
+ ///
+ /// is null.
+ public static Response CreateIfNotExists(AzureBlobFileSystemOptions options, PublicAccessType accessType = PublicAccessType.None)
+ {
+ ArgumentNullException.ThrowIfNull(options);
+
+ return new BlobContainerClient(options.ConnectionString, options.ContainerName).CreateIfNotExists(accessType);
+ }
+
+ ///
+ /// is null.
public IEnumerable GetDirectories(string path)
{
- if (path == null) throw new ArgumentNullException(nameof(path));
+ ArgumentNullException.ThrowIfNull(path);
return ListBlobs(GetDirectoryPath(path))
.Where(x => x.IsPrefix)
@@ -58,102 +104,130 @@ public IEnumerable GetDirectories(string path)
}
///
+ /// is null.
public void DeleteDirectory(string path)
{
- if (path == null) throw new ArgumentNullException(nameof(path));
+ ArgumentNullException.ThrowIfNull(path);
DeleteDirectory(path, true);
}
///
+ /// is null.
public void DeleteDirectory(string path, bool recursive)
{
- if (path == null) throw new ArgumentNullException(nameof(path));
+ ArgumentNullException.ThrowIfNull(path);
foreach (var blob in ListBlobs(GetDirectoryPath(path)))
+ {
if (blob.IsPrefix)
+ {
DeleteDirectory(blob.Prefix, true);
- else if (blob.IsBlob) _container.GetBlobClient(blob.Blob.Name).DeleteIfExists();
+ }
+ else if (blob.IsBlob)
+ {
+ _container.GetBlobClient(blob.Blob.Name).DeleteIfExists();
+ }
+ }
}
///
+ /// is null.
public bool DirectoryExists(string path)
{
- if (path == null) throw new ArgumentNullException(nameof(path));
+ ArgumentNullException.ThrowIfNull(path);
return GetBlobClient(GetDirectoryPath(path)).Exists();
}
///
+ /// is null.
+ /// is null.
public void AddFile(string path, Stream stream)
{
- if (path == null) throw new ArgumentNullException(nameof(path));
- if (stream == null) throw new ArgumentNullException(nameof(stream));
+ ArgumentNullException.ThrowIfNull(path);
+ ArgumentNullException.ThrowIfNull(stream);
AddFile(path, stream, true);
}
///
+ /// is null.
+ /// is null.
public void AddFile(string path, Stream stream, bool overrideIfExists)
{
- if (path == null) throw new ArgumentNullException(nameof(path));
- if (stream == null) throw new ArgumentNullException(nameof(stream));
+ ArgumentNullException.ThrowIfNull(path);
+ ArgumentNullException.ThrowIfNull(stream);
var blob = GetBlobClient(path);
if (!overrideIfExists && blob.Exists())
+ {
throw new InvalidOperationException($"A file at path '{path}' already exists");
+ }
var headers = new BlobHttpHeaders();
+ if (_contentTypeProvider.TryGetContentType(path, out var contentType))
+ {
+ headers.ContentType = contentType;
+ }
- if (_contentTypeProvider.TryGetContentType(path, out var contentType)) headers.ContentType = contentType;
+ var conditions = overrideIfExists ? null : new BlobRequestConditions
+ {
+ IfNoneMatch = ETag.All
+ };
- blob.Upload(stream, headers,
- conditions: overrideIfExists ? null : new BlobRequestConditions { IfNoneMatch = ETag.All });
+ blob.Upload(stream, headers, conditions: conditions);
}
///
+ /// is null.
+ /// is null.
public void AddFile(string path, string physicalPath, bool overrideIfExists = true, bool copy = false)
{
- if (path == null) throw new ArgumentNullException(nameof(path));
- if (physicalPath == null) throw new ArgumentNullException(nameof(physicalPath));
+ ArgumentNullException.ThrowIfNull(path);
+ ArgumentNullException.ThrowIfNull(physicalPath);
var destinationBlob = GetBlobClient(path);
if (!overrideIfExists && destinationBlob.Exists())
+ {
throw new InvalidOperationException($"A file at path '{path}' already exists");
+ }
var sourceBlob = GetBlobClient(physicalPath);
-
- var copyFromUriOperation = destinationBlob.StartCopyFromUri(sourceBlob.Uri,
- destinationConditions: overrideIfExists
- ? null
- : new BlobRequestConditions { IfNoneMatch = ETag.All });
-
+ var destinationConditions = overrideIfExists ? null : new BlobRequestConditions
+ {
+ IfNoneMatch = ETag.All
+ };
+ var copyFromUriOperation = destinationBlob.StartCopyFromUri(sourceBlob.Uri, destinationConditions: destinationConditions);
if (copyFromUriOperation?.HasCompleted == false)
+ {
Task.Run(async () => await copyFromUriOperation.WaitForCompletionAsync().ConfigureAwait(false))
.GetAwaiter()
.GetResult();
+ }
- if (!copy) sourceBlob.DeleteIfExists();
+ if (!copy)
+ {
+ sourceBlob.DeleteIfExists();
+ }
}
///
+ /// is null.
public IEnumerable GetFiles(string path)
{
- if (path == null) throw new ArgumentNullException(nameof(path));
+ ArgumentNullException.ThrowIfNull(path);
return GetFiles(path, null);
}
///
+ /// is null.
public IEnumerable GetFiles(string path, string? filter)
{
- if (path == null) throw new ArgumentNullException(nameof(path));
- if (filter == null) throw new ArgumentNullException(nameof(filter));
-
- var files = ListBlobs(GetDirectoryPath(path))
- .Where(x => x.IsBlob)
- .Select(x => x.Blob.Name);
+ ArgumentNullException.ThrowIfNull(path);
+ var files = ListBlobs(GetDirectoryPath(path)).Where(x => x.IsBlob).Select(x => x.Blob.Name);
if (!string.IsNullOrEmpty(filter) && filter != "*.*")
{
// TODO: Might be better to use a globbing library
@@ -165,36 +239,37 @@ public IEnumerable GetFiles(string path, string? filter)
}
///
+ /// is null.
public Stream OpenFile(string path)
{
- if (path == null) throw new ArgumentNullException(nameof(path));
+ ArgumentNullException.ThrowIfNull(path);
return GetBlobClient(path).OpenRead();
}
///
+ /// is null.
public void DeleteFile(string path)
{
- if (path == null) throw new ArgumentNullException(nameof(path));
+ ArgumentNullException.ThrowIfNull(path);
GetBlobClient(path).DeleteIfExists();
}
///
+ /// is null.
public bool FileExists(string path)
{
- if (path == null) throw new ArgumentNullException(nameof(path));
+ ArgumentNullException.ThrowIfNull(path);
return GetBlobClient(path).Exists();
}
///
- [SuppressMessage("Design",
- "CA1054: Change the type of parameter 'fullPathOrUrl' of method 'AzureBlobFileSystem.GetRelativePath(string)' from 'string' to 'System.Uri', or provide an overload to 'AzureBlobFileSystem.GetRelativePath(string)' that allows 'fullPathOrUrl' to be passed as a 'System.Uri' object",
- Justification = "Interface implementation")]
+ /// is null.
public string GetRelativePath(string fullPathOrUrl)
{
- if (fullPathOrUrl == null) throw new ArgumentNullException(nameof(fullPathOrUrl));
+ ArgumentNullException.ThrowIfNull(fullPathOrUrl);
// test url
var path = EnsureUrlSeparatorChar(fullPathOrUrl); // ensure url separator char
@@ -202,93 +277,89 @@ public string GetRelativePath(string fullPathOrUrl)
// if it starts with the root url, strip it and trim the starting slash to make it relative
// eg "/Media/1234/img.jpg" => "1234/img.jpg"
if (_ioHelper.PathStartsWith(path, _rootUrl, '/'))
+ {
path = path[_rootUrl.Length..].TrimStart('/');
+ }
// unchanged - what else?
return path;
}
///
+ /// is null.
public string GetFullPath(string path)
{
- if (path == null) throw new ArgumentNullException(nameof(path));
+ ArgumentNullException.ThrowIfNull(path);
path = EnsureUrlSeparatorChar(path);
return (_ioHelper.PathStartsWith(path, _rootUrl, '/') ? path : $"{_rootUrl}/{path}").Trim('/');
}
///
- [SuppressMessage("Design",
- "CA1055: Change the return type of method 'AzureBlobFileSystem.GetUrl(string)' from 'string' to 'System.Uri'",
- Justification = "Interface implementation")]
- public string GetUrl(string path)
+ /// is null.
+ public string GetUrl(string? path)
{
- if (path == null) throw new ArgumentNullException(nameof(path));
+ ArgumentNullException.ThrowIfNull(path);
return $"{_rootUrl}/{EnsureUrlSeparatorChar(path).Trim('/')}";
}
///
+ /// is null.
public DateTimeOffset GetLastModified(string path)
{
- if (path == null) throw new ArgumentNullException(nameof(path));
+ ArgumentNullException.ThrowIfNull(path);
return GetBlobClient(path).GetProperties().Value.LastModified;
}
///
+ /// is null.
public DateTimeOffset GetCreated(string path)
{
- if (path == null) throw new ArgumentNullException(nameof(path));
+ ArgumentNullException.ThrowIfNull(path);
return GetBlobClient(path).GetProperties().Value.CreatedOn;
}
///
+ /// is null.
public long GetSize(string path)
{
- if (path == null) throw new ArgumentNullException(nameof(path));
+ ArgumentNullException.ThrowIfNull(path);
return GetBlobClient(path).GetProperties().Value.ContentLength;
}
///
+ /// is null.
public BlobClient GetBlobClient(string path)
{
- if (path == null) throw new ArgumentNullException(nameof(path));
+ ArgumentNullException.ThrowIfNull(path);
return _container.GetBlobClient(GetBlobPath(path));
}
///
- public bool CanAddPhysical => false;
+ public IFileProvider Create() => new AzureBlobFileProvider(_container, _containerRootPath);
private static string EnsureUrlSeparatorChar(string path)
- {
- if (path == null) throw new ArgumentNullException(nameof(path));
-
- return path.Replace("\\", "/", StringComparison.InvariantCultureIgnoreCase);
- }
+ => path.Replace("\\", "/", StringComparison.InvariantCultureIgnoreCase);
private string GetDirectoryPath(string fullPathOrUrl)
{
- if (fullPathOrUrl == null) throw new ArgumentNullException(nameof(fullPathOrUrl));
-
var path = GetFullPath(fullPathOrUrl);
+
return path.Length == 0 ? path : path.EnsureEndsWith('/');
}
private IEnumerable ListBlobs(string path)
{
- if (path == null) throw new ArgumentNullException(nameof(path));
-
return _container.GetBlobsByHierarchy(prefix: path);
}
private string GetBlobPath(string path)
{
- if (path == null) throw new ArgumentNullException(nameof(path));
-
path = EnsureUrlSeparatorChar(path);
if (_ioHelper.PathStartsWith(path, _containerRootPath, '/'))
@@ -302,26 +373,8 @@ private string GetBlobPath(string path)
}
path = $"{_containerRootPath}/{path.TrimStart('/')}";
- return path.Trim('/');
- }
-
- ///
- /// Creates a new container under the specified account if a container with the same name does not already exist.
- ///
- /// The Azure Blob Storage file system options.
- /// Optionally specifies whether data in the container may be accessed publicly and the level of access.
- /// specifies full public read access for container and blob data. Clients can enumerate blobs within the container via anonymous request, but cannot enumerate containers within the storage account.
- /// specifies public read access for blobs. Blob data within this container can be read via anonymous request, but container data is not available. Clients cannot enumerate blobs within the container via anonymous request.
- /// specifies that the container data is private to the account owner.
- ///
- /// If the container does not already exist, a describing the newly created container. If the container already exists, .
- ///
- /// options
- public static Response CreateIfNotExists(AzureBlobFileSystemOptions options, PublicAccessType accessType = PublicAccessType.None)
- {
- if (options == null) throw new ArgumentNullException(nameof(options));
- return new BlobContainerClient(options.ConnectionString, options.ContainerName).CreateIfNotExists(accessType);
+ return path.Trim('/');
}
}
}
diff --git a/src/Umbraco.StorageProviders.AzureBlob/IO/AzureBlobFileSystemOptions.cs b/src/Umbraco.StorageProviders.AzureBlob/IO/AzureBlobFileSystemOptions.cs
index 7ca49b6..db6f851 100644
--- a/src/Umbraco.StorageProviders.AzureBlob/IO/AzureBlobFileSystemOptions.cs
+++ b/src/Umbraco.StorageProviders.AzureBlob/IO/AzureBlobFileSystemOptions.cs
@@ -3,9 +3,9 @@
namespace Umbraco.StorageProviders.AzureBlob.IO
{
///
- /// The Azure Blob File System Options.
+ /// The Azure Blob File System options.
///
- public class AzureBlobFileSystemOptions
+ public sealed class AzureBlobFileSystemOptions
{
///
/// The media filesystem name.
@@ -13,24 +13,24 @@ public class AzureBlobFileSystemOptions
public const string MediaFileSystemName = "Media";
///
- /// The storage account connection string.
+ /// Gets or sets the storage account connection string.
///
[Required]
public string ConnectionString { get; set; } = null!;
///
- /// The container name.
+ /// Gets or sets the container name.
///
[Required]
public string ContainerName { get; set; } = null!;
///
- /// The root path of the container.
+ /// Gets or sets the root path of the container.
///
- public string ContainerRootPath { get; set; } = null!;
+ public string? ContainerRootPath { get; set; }
///
- /// The virtual path.
+ /// Gets or sets the virtual path.
///
[Required]
public string VirtualPath { get; set; } = null!;
diff --git a/src/Umbraco.StorageProviders.AzureBlob/IO/AzureBlobFileSystemProvider.cs b/src/Umbraco.StorageProviders.AzureBlob/IO/AzureBlobFileSystemProvider.cs
index 2b6fd2d..670c503 100644
--- a/src/Umbraco.StorageProviders.AzureBlob/IO/AzureBlobFileSystemProvider.cs
+++ b/src/Umbraco.StorageProviders.AzureBlob/IO/AzureBlobFileSystemProvider.cs
@@ -4,12 +4,11 @@
using Microsoft.Extensions.Options;
using Umbraco.Cms.Core.Hosting;
using Umbraco.Cms.Core.IO;
-using Umbraco.Extensions;
namespace Umbraco.StorageProviders.AzureBlob.IO
{
///
- public class AzureBlobFileSystemProvider : IAzureBlobFileSystemProvider
+ public sealed class AzureBlobFileSystemProvider : IAzureBlobFileSystemProvider
{
private readonly ConcurrentDictionary _fileSystems = new();
private readonly IOptionsMonitor _optionsMonitor;
@@ -18,49 +17,36 @@ public class AzureBlobFileSystemProvider : IAzureBlobFileSystemProvider
private readonly FileExtensionContentTypeProvider _fileExtensionContentTypeProvider;
///
- /// Creates a new instance of .
+ /// Initializes a new instance of the class.
///
/// The options monitor.
/// The hosting environment.
/// The IO helper.
- /// optionsMonitor
- /// or
- /// hostingEnvironment
- /// or
- /// ioHelper
+ /// is null.
+ /// is null.
+ /// is null.
public AzureBlobFileSystemProvider(IOptionsMonitor optionsMonitor, IHostingEnvironment hostingEnvironment, IIOHelper ioHelper)
{
_optionsMonitor = optionsMonitor ?? throw new ArgumentNullException(nameof(optionsMonitor));
_hostingEnvironment = hostingEnvironment ?? throw new ArgumentNullException(nameof(hostingEnvironment));
_ioHelper = ioHelper ?? throw new ArgumentNullException(nameof(ioHelper));
-
_fileExtensionContentTypeProvider = new FileExtensionContentTypeProvider();
- _optionsMonitor.OnChange(OptionsOnChange);
+
+ _optionsMonitor.OnChange((options, name) => _fileSystems.TryRemove(name, out _));
}
///
+ /// is null.
public IAzureBlobFileSystem GetFileSystem(string name)
{
- if (name == null) throw new ArgumentNullException(nameof(name));
-
- return _fileSystems.GetOrAdd(name, CreateInstance);
- }
+ ArgumentNullException.ThrowIfNull(name);
- private IAzureBlobFileSystem CreateInstance(string name)
- {
- var options = _optionsMonitor.Get(name);
+ return _fileSystems.GetOrAdd(name, name =>
+ {
+ var options = _optionsMonitor.Get(name);
- return CreateInstance(options);
- }
-
- private IAzureBlobFileSystem CreateInstance(AzureBlobFileSystemOptions options)
- {
- return new AzureBlobFileSystem(options, _hostingEnvironment, _ioHelper, _fileExtensionContentTypeProvider);
- }
-
- private void OptionsOnChange(AzureBlobFileSystemOptions options, string name)
- {
- _fileSystems.TryUpdate(name, _ => CreateInstance(options));
+ return new AzureBlobFileSystem(options, _hostingEnvironment, _ioHelper, _fileExtensionContentTypeProvider);
+ });
}
}
}
diff --git a/src/Umbraco.StorageProviders.AzureBlob/IO/IAzureBlobFileSystem.cs b/src/Umbraco.StorageProviders.AzureBlob/IO/IAzureBlobFileSystem.cs
index 27325d8..e988899 100644
--- a/src/Umbraco.StorageProviders.AzureBlob/IO/IAzureBlobFileSystem.cs
+++ b/src/Umbraco.StorageProviders.AzureBlob/IO/IAzureBlobFileSystem.cs
@@ -4,15 +4,17 @@
namespace Umbraco.StorageProviders.AzureBlob.IO
{
///
- /// The Azure Blob File System.
+ /// Represents an Azure Blob Storage file system.
///
public interface IAzureBlobFileSystem : IFileSystem
{
///
- /// Get the .
+ /// Get the .
///
/// The relative path to the blob.
- /// A
+ ///
+ /// A .
+ ///
BlobClient GetBlobClient(string path);
}
}
diff --git a/src/Umbraco.StorageProviders.AzureBlob/Imaging/AzureBlobFileSystemImageCache.cs b/src/Umbraco.StorageProviders.AzureBlob/Imaging/AzureBlobFileSystemImageCache.cs
index ee51ce4..7b495c2 100644
--- a/src/Umbraco.StorageProviders.AzureBlob/Imaging/AzureBlobFileSystemImageCache.cs
+++ b/src/Umbraco.StorageProviders.AzureBlob/Imaging/AzureBlobFileSystemImageCache.cs
@@ -14,49 +14,60 @@ namespace Umbraco.StorageProviders.AzureBlob.Imaging
///
/// Implements an Azure Blob Storage based cache storing files in a cache subfolder.
///
- public class AzureBlobFileSystemImageCache : IImageCache
+ public sealed class AzureBlobFileSystemImageCache : IImageCache
{
private const string _cachePath = "cache/";
- private readonly string _name;
private BlobContainerClient _container;
///
/// Initializes a new instance of the class.
///
/// The options.
+ /// is null.
public AzureBlobFileSystemImageCache(IOptionsMonitor options)
: this(AzureBlobFileSystemOptions.MediaFileSystemName, options)
{ }
///
- /// Creates a new instance of .
+ /// Initializes a new instance of the class.
///
/// The name.
/// The options.
- /// options
- /// or
- /// name
- protected AzureBlobFileSystemImageCache(string name, IOptionsMonitor options)
+ /// is null.
+ /// is null.
+ public AzureBlobFileSystemImageCache(string name, IOptionsMonitor options)
{
- if (options == null) throw new ArgumentNullException(nameof(options));
-
- _name = name ?? throw new ArgumentNullException(nameof(name));
+ ArgumentNullException.ThrowIfNull(name);
+ ArgumentNullException.ThrowIfNull(options);
var fileSystemOptions = options.Get(name);
_container = new BlobContainerClient(fileSystemOptions.ConnectionString, fileSystemOptions.ContainerName);
- options.OnChange(OptionsOnChange);
+ options.OnChange((options, changedName) =>
+ {
+ if (changedName == name)
+ {
+ _container = new BlobContainerClient(options.ConnectionString, options.ContainerName);
+ }
+ });
}
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The blob container client.
+ /// is null.
+ public AzureBlobFileSystemImageCache(BlobContainerClient blobContainerClient)
+ => _container = blobContainerClient ?? throw new ArgumentNullException(nameof(blobContainerClient));
+
///
public async Task GetAsync(string key)
{
var blob = _container.GetBlobClient(_cachePath + key);
- if (await blob.ExistsAsync().ConfigureAwait(false))
- return new AzureBlobStorageCacheResolver(blob);
-
- return null;
+ return !await blob.ExistsAsync().ConfigureAwait(false)
+ ? null
+ : new AzureBlobStorageCacheResolver(blob);
}
///
@@ -66,12 +77,5 @@ public async Task SetAsync(string key, Stream stream, ImageCacheMetadata metadat
await blob.UploadAsync(stream, metadata: metadata.ToDictionary()).ConfigureAwait(false);
}
-
- private void OptionsOnChange(AzureBlobFileSystemOptions options, string name)
- {
- if (name != _name) return;
-
- _container = new BlobContainerClient(options.ConnectionString, options.ContainerName);
- }
}
}
diff --git a/src/Umbraco.StorageProviders.AzureBlob/Imaging/AzureBlobFileSystemImageProvider.cs b/src/Umbraco.StorageProviders.AzureBlob/Imaging/AzureBlobFileSystemImageProvider.cs
deleted file mode 100644
index 4071cf9..0000000
--- a/src/Umbraco.StorageProviders.AzureBlob/Imaging/AzureBlobFileSystemImageProvider.cs
+++ /dev/null
@@ -1,123 +0,0 @@
-using System;
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Http.Extensions;
-using Microsoft.Extensions.Options;
-using SixLabors.ImageSharp.Web;
-using SixLabors.ImageSharp.Web.Providers;
-using SixLabors.ImageSharp.Web.Resolvers;
-using SixLabors.ImageSharp.Web.Resolvers.Azure;
-using Umbraco.Cms.Core.Hosting;
-using Umbraco.StorageProviders.AzureBlob.IO;
-
-namespace Umbraco.StorageProviders.AzureBlob.Imaging
-{
- ///
- public class AzureBlobFileSystemImageProvider : IImageProvider
- {
- private readonly string _name;
- private readonly IAzureBlobFileSystemProvider _fileSystemProvider;
- private string _rootPath;
- private readonly FormatUtilities _formatUtilities;
-
- ///
- /// A match function used by the resolver to identify itself as the correct resolver to use.
- ///
- private Func? _match;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The options.
- /// The file system provider.
- /// The hosting environment.
- /// The format utilities.
- public AzureBlobFileSystemImageProvider(IOptionsMonitor options, IAzureBlobFileSystemProvider fileSystemProvider, IHostingEnvironment hostingEnvironment, FormatUtilities formatUtilities)
- : this(AzureBlobFileSystemOptions.MediaFileSystemName, options, fileSystemProvider, hostingEnvironment, formatUtilities)
- { }
-
- ///
- /// Creates a new instance of .
- ///
- /// The name.
- /// The options.
- /// The file system provider.
- /// The hosting environment.
- /// The format utilities.
- /// optionsFactory
- /// or
- /// hostingEnvironment
- /// or
- /// name
- /// or
- /// fileSystemProvider
- /// or
- /// formatUtilities
- protected AzureBlobFileSystemImageProvider(string name, IOptionsMonitor options, IAzureBlobFileSystemProvider fileSystemProvider, IHostingEnvironment hostingEnvironment, FormatUtilities formatUtilities)
- {
- if (options == null) throw new ArgumentNullException(nameof(options));
- if (hostingEnvironment == null) throw new ArgumentNullException(nameof(hostingEnvironment));
-
- _name = name ?? throw new ArgumentNullException(nameof(name));
- _fileSystemProvider = fileSystemProvider ?? throw new ArgumentNullException(nameof(fileSystemProvider));
- _formatUtilities = formatUtilities ?? throw new ArgumentNullException(nameof(formatUtilities));
-
- var fileSystemOptions = options.Get(name);
- _rootPath = hostingEnvironment.ToAbsolute(fileSystemOptions.VirtualPath);
-
- options.OnChange((o, n) => OptionsOnChange(o, n, hostingEnvironment));
- }
-
- ///
- public bool IsValidRequest(HttpContext context)
- {
- if (context == null) throw new ArgumentNullException(nameof(context));
-
- return _formatUtilities.GetExtensionFromUri(context.Request.GetDisplayUrl()) != null;
- }
-
- ///
- public Task GetAsync(HttpContext context)
- {
- if (context == null) throw new ArgumentNullException(nameof(context));
-
- return GetResolverAsync(context);
- }
-
- private async Task GetResolverAsync(HttpContext context)
- {
- var blob = _fileSystemProvider
- .GetFileSystem(_name)
- .GetBlobClient(context.Request.Path);
-
- if (await blob.ExistsAsync().ConfigureAwait(false))
- return new AzureBlobStorageImageResolver(blob);
-
- return null;
- }
-
- ///
- public ProcessingBehavior ProcessingBehavior => ProcessingBehavior.CommandOnly;
-
- ///
- public Func Match
- {
- get => this._match ?? IsMatch;
- set => this._match = value;
- }
-
- private bool IsMatch(HttpContext context)
- {
- if (context == null) throw new ArgumentNullException(nameof(context));
-
- return context.Request.Path.StartsWithSegments(_rootPath, StringComparison.InvariantCultureIgnoreCase);
- }
-
- private void OptionsOnChange(AzureBlobFileSystemOptions options, string name, IHostingEnvironment hostingEnvironment)
- {
- if (name != _name) return;
-
- _rootPath = hostingEnvironment.ToAbsolute(options.VirtualPath);
- }
- }
-}
diff --git a/src/Umbraco.StorageProviders.AzureBlob/Properties/AssemblyInfo.cs b/src/Umbraco.StorageProviders.AzureBlob/Properties/AssemblyInfo.cs
index 55acad6..0e22017 100644
--- a/src/Umbraco.StorageProviders.AzureBlob/Properties/AssemblyInfo.cs
+++ b/src/Umbraco.StorageProviders.AzureBlob/Properties/AssemblyInfo.cs
@@ -1,3 +1,4 @@
using System;
-[assembly:CLSCompliant(false)]
+// This assembly exposes types that are not CLS-compliant
+[assembly: CLSCompliant(false)]
diff --git a/src/Umbraco.StorageProviders.AzureBlob/Umbraco.StorageProviders.AzureBlob.csproj b/src/Umbraco.StorageProviders.AzureBlob/Umbraco.StorageProviders.AzureBlob.csproj
index 109ddb0..25725c6 100644
--- a/src/Umbraco.StorageProviders.AzureBlob/Umbraco.StorageProviders.AzureBlob.csproj
+++ b/src/Umbraco.StorageProviders.AzureBlob/Umbraco.StorageProviders.AzureBlob.csproj
@@ -1,15 +1,16 @@
- net5.0
+ net6.0
enable
- AllEnabledByDefault
+ All
true
- Azure Blob Storage file system provider for Umbraco CMS
+ Azure Blob Storage provider for Umbraco CMS
+ umbraco storage azure blob
-
-
-
-
-
+
+
+
+
+
diff --git a/src/Umbraco.StorageProviders.AzureBlob/packages.lock.json b/src/Umbraco.StorageProviders.AzureBlob/packages.lock.json
new file mode 100644
index 0000000..ead2fcd
--- /dev/null
+++ b/src/Umbraco.StorageProviders.AzureBlob/packages.lock.json
@@ -0,0 +1,2305 @@
+{
+ "version": 1,
+ "dependencies": {
+ "net6.0": {
+ "Azure.Storage.Blobs": {
+ "type": "Direct",
+ "requested": "[12.12.0, )",
+ "resolved": "12.12.0",
+ "contentHash": "DYirbNIkP2KeCz+/7AP9Un8GkrmSfHSSE+J0k4pyIlI5d8wVWndZj5Pp74rNsgjE/jDRdr3dIhJHPQwHE4ifAg==",
+ "dependencies": {
+ "Azure.Storage.Common": "12.11.0",
+ "System.Text.Json": "4.7.2"
+ }
+ },
+ "Microsoft.SourceLink.GitHub": {
+ "type": "Direct",
+ "requested": "[1.1.1, )",
+ "resolved": "1.1.1",
+ "contentHash": "IaJGnOv/M7UQjRJks7B6p7pbPnOwisYGOIzqCz5ilGFTApZ3ktOR+6zJ12ZRPInulBmdAf1SrGdDG2MU8g6XTw==",
+ "dependencies": {
+ "Microsoft.Build.Tasks.Git": "1.1.1",
+ "Microsoft.SourceLink.Common": "1.1.1"
+ }
+ },
+ "SixLabors.ImageSharp.Web.Providers.Azure": {
+ "type": "Direct",
+ "requested": "[2.0.0, )",
+ "resolved": "2.0.0",
+ "contentHash": "P6fi6fAv3IBR+hoxXQfE3C8GZdSsRiPuxxxAGI01EXBwUzW1qB1W3XhR0AP+Uokxni3iXB7dr7xxEEd3iNeBXg==",
+ "dependencies": {
+ "Azure.Storage.Blobs": "12.10.0",
+ "SixLabors.ImageSharp.Web": "2.0.0"
+ }
+ },
+ "StyleCop.Analyzers": {
+ "type": "Direct",
+ "requested": "[1.2.0-beta.435, )",
+ "resolved": "1.2.0-beta.435",
+ "contentHash": "TADk7vdGXtfTnYCV7GyleaaRTQjfoSfZXprQrVMm7cSJtJbFc1QIbWPyLvrgrfGdfHbGmUPvaN4ODKNxg2jgPQ==",
+ "dependencies": {
+ "StyleCop.Analyzers.Unstable": "1.2.0.435"
+ }
+ },
+ "Umbraco.Cms.Web.Common": {
+ "type": "Direct",
+ "requested": "[10.0.0-rc1, )",
+ "resolved": "10.0.0-rc1",
+ "contentHash": "wcV+OmlPhF0pCTZgt9r6an1Jb0iaY8q61wdu3eSBMT7QT/YMK5Noew+eURhyK4Zc9NOIzBzV7ZCHGst0ptw40g==",
+ "dependencies": {
+ "Dazinator.Extensions.FileProviders": "2.0.0",
+ "Microsoft.AspNetCore.Mvc.NewtonsoftJson": "6.0.4",
+ "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation": "6.0.4",
+ "MiniProfiler.AspNetCore.Mvc": "4.2.22",
+ "Serilog.AspNetCore": "5.0.0",
+ "SixLabors.ImageSharp.Web": "2.0.0",
+ "Smidge.InMemory": "4.0.4",
+ "Smidge.Nuglify": "4.0.4",
+ "Umbraco.Cms.Core": "10.0.0-rc1",
+ "Umbraco.Cms.Examine.Lucene": "10.0.0-rc1",
+ "Umbraco.Cms.Infrastructure": "10.0.0-rc1",
+ "Umbraco.Cms.PublishedCache.NuCache": "10.0.0-rc1"
+ }
+ },
+ "Azure.Core": {
+ "type": "Transitive",
+ "resolved": "1.24.0",
+ "contentHash": "+/qI1j2oU1S4/nvxb2k/wDsol00iGf1AyJX5g3epV7eOpQEP/2xcgh/cxgKMeFgn3U2fmgSiBnQZdkV+l5y0Uw==",
+ "dependencies": {
+ "Microsoft.Bcl.AsyncInterfaces": "1.1.1",
+ "System.Diagnostics.DiagnosticSource": "4.6.0",
+ "System.Memory.Data": "1.0.2",
+ "System.Numerics.Vectors": "4.5.0",
+ "System.Text.Encodings.Web": "4.7.2",
+ "System.Text.Json": "4.7.2",
+ "System.Threading.Tasks.Extensions": "4.5.4"
+ }
+ },
+ "Azure.Identity": {
+ "type": "Transitive",
+ "resolved": "1.3.0",
+ "contentHash": "l1SYfZKOFBuUFG7C2SWHmJcrQQaiXgBdVCycx4vcZQkC6efDVt7mzZ5pfJAFEJDBUq7mjRQ0RPq9ZDGdSswqMg==",
+ "dependencies": {
+ "Azure.Core": "1.6.0",
+ "Microsoft.Identity.Client": "4.22.0",
+ "Microsoft.Identity.Client.Extensions.Msal": "2.16.5",
+ "System.Memory": "4.5.3",
+ "System.Security.Cryptography.ProtectedData": "4.5.0",
+ "System.Text.Json": "4.6.0",
+ "System.Threading.Tasks.Extensions": "4.5.2"
+ }
+ },
+ "Azure.Storage.Common": {
+ "type": "Transitive",
+ "resolved": "12.11.0",
+ "contentHash": "BPZ1JwYvehHGoTSXhXfAmwtFYejJghE6dkKvpZtPIL0DulzSIJdll9OZI+h5W+3wLYK0yn5hc1r6mvId0q4npA==",
+ "dependencies": {
+ "Azure.Core": "1.24.0",
+ "System.IO.Hashing": "6.0.0"
+ }
+ },
+ "CSharpTest.Net.Collections-NetStd2": {
+ "type": "Transitive",
+ "resolved": "14.906.1403.1084",
+ "contentHash": "g3QSH0PMiO+f2C6Za+uUvcdihnVs5IFbZ2cnKjCYA19l8en3fVe/Jl0qQS2te1xJzEOrY4ccen5/MY/QVoamcQ=="
+ },
+ "Dazinator.Extensions.FileProviders": {
+ "type": "Transitive",
+ "resolved": "2.0.0",
+ "contentHash": "Jb10uIvdGdaaOmEGUXeO1ssjp6YuvOuR87B5gLxGORFbroV1j7PDaVfEIgni7vV8KRcyAY5KvuMxgx6ADIEXNw==",
+ "dependencies": {
+ "DotNet.Glob": "3.1.0",
+ "Microsoft.AspNetCore.Hosting.Abstractions": "1.0.2",
+ "Microsoft.AspNetCore.Http.Abstractions": "1.0.2",
+ "Microsoft.Extensions.FileProviders.Abstractions": "1.0.1",
+ "NETStandard.Library": "1.6.1"
+ }
+ },
+ "DotNet.Glob": {
+ "type": "Transitive",
+ "resolved": "3.1.0",
+ "contentHash": "i6x0hDsFWg6Ke2isaNAcHQ9ChxBvTJu2cSmBY+Jtjiv2W4q6y9QlA3JKYuZqJ573TAZmpAn65Qf3sRpjvZ1gmw=="
+ },
+ "Examine": {
+ "type": "Transitive",
+ "resolved": "3.0.0-beta.9",
+ "contentHash": "BB5BwjzxKwP34EFdDQQWBQAgDjsZk61YaGQml1vR71DxdD6cA0Dk4ripUzM9Od9Zq4YWTjD/MjDsnt6qefeGoQ==",
+ "dependencies": {
+ "Examine.Core": "3.0.0-beta.9",
+ "Examine.Lucene": "3.0.0-beta.9",
+ "Microsoft.AspNetCore.DataProtection": "5.0.5",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0"
+ }
+ },
+ "Examine.Core": {
+ "type": "Transitive",
+ "resolved": "3.0.0-beta.9",
+ "contentHash": "hBk8ZCFD+Bv0NzBuHyAW5UD+V3OWoiyqf756U++819TT5wzziP4OYT34450ulIjZ40Rr9wPySWA31xkXJ1CfVQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Logging.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Options": "5.0.0"
+ }
+ },
+ "Examine.Lucene": {
+ "type": "Transitive",
+ "resolved": "3.0.0-beta.9",
+ "contentHash": "0yEd0LMtUqL9GKdDaRUu+MmDc1HKa4bUOzpEQa6fbdXHN8ITDDmrefZCWAc4OvplWO7DHi/OSS5lALqzsy91wg==",
+ "dependencies": {
+ "Examine.Core": "3.0.0-beta.9",
+ "Lucene.Net.QueryParser": "4.8.0-beta00016",
+ "Lucene.Net.Replicator": "4.8.0-beta00016",
+ "System.Threading": "4.3.0",
+ "System.Threading.AccessControl": "4.7.0"
+ }
+ },
+ "HtmlAgilityPack": {
+ "type": "Transitive",
+ "resolved": "1.11.42",
+ "contentHash": "LDc1bEfF14EY2DZzak4xvzWvbpNXK3vi1u0KQbBpLUN4+cx/VrvXhgCAMSJhSU5vz0oMfW9JZIR20vj/PkDHPA=="
+ },
+ "IPNetwork2": {
+ "type": "Transitive",
+ "resolved": "2.5.407",
+ "contentHash": "EqjBifFaKVzBCxV9aRHuOswCKj9p+E8KxCVuWni/0NIMNSa5thLf3kiQkyEZ7giHNMnT4jBgsf2kqEkmifRSPQ=="
+ },
+ "J2N": {
+ "type": "Transitive",
+ "resolved": "2.0.0",
+ "contentHash": "M5bwDajAARZiyqupU+rHQJnsVLxNBOHJ8vKYHd8LcLIb1FgLfzzcJvc31Qo5Xz/GEHFjDF9ScjKL/ks/zRTXuA=="
+ },
+ "K4os.Compression.LZ4": {
+ "type": "Transitive",
+ "resolved": "1.2.16",
+ "contentHash": "XLNQWNayxeMgd1gv0s6kZywM11kww7rTzu3nPGh8fQNblHGbFt79LC1Sk1/QQ8DIJb2Qfl2p+WlLIOWCSuyi8w=="
+ },
+ "Lucene.Net": {
+ "type": "Transitive",
+ "resolved": "4.8.0-beta00016",
+ "contentHash": "DCtUbE/NIrisNI7hRwU+UKS3Cr6S2vH1XB9wvEHHI3anu5OUpX1Fkr/PDC7oFCaol/QCvzVLbLZVizAT1aTLpA==",
+ "dependencies": {
+ "J2N": "2.0.0",
+ "Microsoft.Extensions.Configuration.Abstractions": "2.0.0"
+ }
+ },
+ "Lucene.Net.Analysis.Common": {
+ "type": "Transitive",
+ "resolved": "4.8.0-beta00016",
+ "contentHash": "7pjEAIliWdih6E3I0hCE8hKcKKRx1LLzeQBslF1fhvzE1Sal4NyHd8RFJHV1Z+yHlBw4gCyyVIDZADiIoyqwxg==",
+ "dependencies": {
+ "Lucene.Net": "4.8.0-beta00016"
+ }
+ },
+ "Lucene.Net.Facet": {
+ "type": "Transitive",
+ "resolved": "4.8.0-beta00016",
+ "contentHash": "O1MrRfhb9BMfRQHooyEFrkgNwYbTEbK/AkKhz26sy+xO+zAldJ8YKS/IsydHsE+frklIAWT0jyv0c3Dh9qBXSA==",
+ "dependencies": {
+ "Lucene.Net.Join": "4.8.0-beta00016",
+ "Lucene.Net.Queries": "4.8.0-beta00016"
+ }
+ },
+ "Lucene.Net.Grouping": {
+ "type": "Transitive",
+ "resolved": "4.8.0-beta00016",
+ "contentHash": "y7QSEYfSnz7gEJS30xHsf8P0oMIreGGO08qC+UzKre29IAoUXdLLE2+vUfByGkcPuoGMIpZVBP51P6O647grBg==",
+ "dependencies": {
+ "Lucene.Net": "4.8.0-beta00016",
+ "Lucene.Net.Queries": "4.8.0-beta00016"
+ }
+ },
+ "Lucene.Net.Join": {
+ "type": "Transitive",
+ "resolved": "4.8.0-beta00016",
+ "contentHash": "trUiWhV3QPgW4TNPrEP29AsTXE29ACR5+Vz22xjbPtFTwyXMozl95NELVG5aUVMTqdwyMhJ9Lj82QeoHDnN0jw==",
+ "dependencies": {
+ "Lucene.Net.Grouping": "4.8.0-beta00016"
+ }
+ },
+ "Lucene.Net.Queries": {
+ "type": "Transitive",
+ "resolved": "4.8.0-beta00016",
+ "contentHash": "XBzdMDlan68V2ZlhAlP8Fd+Xx2Le8ec7cEN1kFF45Sipa3Q8L/tilJfwS9VHvMTvGkwPM/yj62eGbfGBgIMR8Q==",
+ "dependencies": {
+ "Lucene.Net": "4.8.0-beta00016"
+ }
+ },
+ "Lucene.Net.QueryParser": {
+ "type": "Transitive",
+ "resolved": "4.8.0-beta00016",
+ "contentHash": "5dVvjXmzPaK8GD/eblJopTJMQmO6c6fvVPfBIOw46+jyZR+yESkUnWF1LtLoLXZQNrl4Dx8LKdes5G1QAM7eGA==",
+ "dependencies": {
+ "Lucene.Net.Analysis.Common": "4.8.0-beta00016",
+ "Lucene.Net.Queries": "4.8.0-beta00016",
+ "Lucene.Net.Sandbox": "4.8.0-beta00016"
+ }
+ },
+ "Lucene.Net.Replicator": {
+ "type": "Transitive",
+ "resolved": "4.8.0-beta00016",
+ "contentHash": "BP007m7TtHfOFNGoipn1Y3kgHir0yvDfyCW9g7P6PQIo7nNkyyHuEK9slVEkPhLq+21Q2EnnHl7jMGeh0aK2eA==",
+ "dependencies": {
+ "J2N": "2.0.0",
+ "Lucene.Net": "4.8.0-beta00016",
+ "Lucene.Net.Facet": "4.8.0-beta00016",
+ "Newtonsoft.Json": "10.0.1"
+ }
+ },
+ "Lucene.Net.Sandbox": {
+ "type": "Transitive",
+ "resolved": "4.8.0-beta00016",
+ "contentHash": "wMsRZtbNx0wvX3mtNjpOwQmKx3Ij4UGHWIYHbvnzMWlPUTgtOpYSj02REL4hOxI71WBZylpGB5EWfQ2eEld63g==",
+ "dependencies": {
+ "Lucene.Net": "4.8.0-beta00016"
+ }
+ },
+ "MailKit": {
+ "type": "Transitive",
+ "resolved": "3.2.0",
+ "contentHash": "5MTpTqmjqT7HPvYbP3HozRZMth5vSaT0ReN0iM3rAM4CgLI/R1qqtLDDNWGnFFIlcNzeJkZQRJJMkv8cgzWBbA==",
+ "dependencies": {
+ "MimeKit": "3.2.0"
+ }
+ },
+ "Markdown": {
+ "type": "Transitive",
+ "resolved": "2.2.1",
+ "contentHash": "A6veXuFP1n50RbmFNtTgfHxnHmwMsgFLSCgS1xWbg5L8n5N6HFEksTlXocZ0LsmGW4leBzeLJd+BY7+g83zFJA==",
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Text.RegularExpressions": "4.1.0"
+ }
+ },
+ "MessagePack": {
+ "type": "Transitive",
+ "resolved": "2.3.85",
+ "contentHash": "wOabnqkrXp7oeEYLY4Kd0m0eT4falJQukqvErfz5Y4FKKo9mSQQ1+rMxx9mapF2el+P0XQxiZOBKFm+oCvu0aw==",
+ "dependencies": {
+ "MessagePack.Annotations": "2.3.85"
+ }
+ },
+ "MessagePack.Annotations": {
+ "type": "Transitive",
+ "resolved": "2.3.85",
+ "contentHash": "2GCYZ9qgNS5Og0tiqfhWRhcfDZI/iRi8t07R0fNic1HthMMRfWxWOKDIBhtMA1RwZM4BuRsmJXUgk3evyisb1w=="
+ },
+ "Microsoft.AspNetCore.Cryptography.Internal": {
+ "type": "Transitive",
+ "resolved": "6.0.4",
+ "contentHash": "/0FX1OqckMmXAAlsHgBFNymTZuq4nuAOMhiwm6e8CEMi2aOjnMYwiMc7mtvpGTAO0O4C0zwx+iaChxDgvqit2A=="
+ },
+ "Microsoft.AspNetCore.Cryptography.KeyDerivation": {
+ "type": "Transitive",
+ "resolved": "6.0.4",
+ "contentHash": "1Lbwrxg/HRY/nbrkcrB3EUXUYQN8Tkw7Ktgb6/2on2P7ybT5aM59H05gk+OBC8ZTBxwdle9e1tyT3wxEYKw5xw==",
+ "dependencies": {
+ "Microsoft.AspNetCore.Cryptography.Internal": "6.0.4"
+ }
+ },
+ "Microsoft.AspNetCore.DataProtection": {
+ "type": "Transitive",
+ "resolved": "5.0.5",
+ "contentHash": "fYCIRLS3Q7eokBwzlcaKQnCBLDFXqjnyJO9lqOX0/V9zvy/JiOfvwKSkm6v5QJuNpXZywb/DnAq5Pdb3woc3MQ==",
+ "dependencies": {
+ "Microsoft.AspNetCore.Cryptography.Internal": "5.0.5",
+ "Microsoft.AspNetCore.DataProtection.Abstractions": "5.0.5",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Hosting.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Logging.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Options": "5.0.0",
+ "Microsoft.Win32.Registry": "5.0.0",
+ "System.Security.Cryptography.Xml": "5.0.0"
+ }
+ },
+ "Microsoft.AspNetCore.DataProtection.Abstractions": {
+ "type": "Transitive",
+ "resolved": "5.0.5",
+ "contentHash": "k1DgnNSBG0lf9P+QDnU+FFeLI4b4hhw4iT+iw29XkcRaCGpcPwq7mLJUtz2Yqq/FRyEwlcteTJmdWEoJb0Fxag=="
+ },
+ "Microsoft.AspNetCore.Hosting.Abstractions": {
+ "type": "Transitive",
+ "resolved": "1.0.2",
+ "contentHash": "CSVd9h1TdWDT2lt62C4FcgaF285J4O3MaOqTVvc7xP+3bFiwXcdp6qEd+u1CQrdJ+xJuslR+tvDW7vWQ/OH5Qw==",
+ "dependencies": {
+ "Microsoft.AspNetCore.Hosting.Server.Abstractions": "1.0.2",
+ "Microsoft.AspNetCore.Http.Abstractions": "1.0.2",
+ "Microsoft.Extensions.Configuration.Abstractions": "1.0.2",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.2",
+ "Microsoft.Extensions.FileProviders.Abstractions": "1.0.1",
+ "Microsoft.Extensions.Logging.Abstractions": "1.0.2"
+ }
+ },
+ "Microsoft.AspNetCore.Hosting.Server.Abstractions": {
+ "type": "Transitive",
+ "resolved": "1.0.2",
+ "contentHash": "6ZtFh0huTlrUl72u9Vic0icCVIQiEx7ULFDx3P7BpOI97wjb0GAXf8B4m9uSpSGf0vqLEKFlkPbvXF0MXXEzhw==",
+ "dependencies": {
+ "Microsoft.AspNetCore.Http.Features": "1.0.2",
+ "Microsoft.Extensions.Configuration.Abstractions": "1.0.2"
+ }
+ },
+ "Microsoft.AspNetCore.Http.Abstractions": {
+ "type": "Transitive",
+ "resolved": "1.0.2",
+ "contentHash": "peJqc7BgYwhTzOIfFHX3/esV6iOXf17Afekh6mCYuUD3aWyaBwQuWYaKLR+RnjBEWaSzpCDgfCMMp5Y3LUXsiA==",
+ "dependencies": {
+ "Microsoft.AspNetCore.Http.Features": "1.0.2",
+ "System.Globalization.Extensions": "4.0.1",
+ "System.Linq.Expressions": "4.1.1",
+ "System.Reflection.TypeExtensions": "4.1.0",
+ "System.Runtime.InteropServices": "4.1.0",
+ "System.Text.Encodings.Web": "4.0.0"
+ }
+ },
+ "Microsoft.AspNetCore.Http.Features": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "6sVnhFwtsjEVL09FsYpAttQ3Og6Jxg1dQFLF9XQUThi1myq64imjhj1swd92TXMLCp5wmt8szDixZXXdx64qhg==",
+ "dependencies": {
+ "Microsoft.Extensions.Primitives": "5.0.0",
+ "System.IO.Pipelines": "5.0.0"
+ }
+ },
+ "Microsoft.AspNetCore.JsonPatch": {
+ "type": "Transitive",
+ "resolved": "6.0.4",
+ "contentHash": "BDI7P53vCNqB35poKWUUeUZxr46/g/h6CyHYrU2byICC1/oGdX7iZ2naG3X8VeZcmdC1YBkbXb5LXLtutHSq1Q==",
+ "dependencies": {
+ "Microsoft.CSharp": "4.7.0",
+ "Newtonsoft.Json": "13.0.1"
+ }
+ },
+ "Microsoft.AspNetCore.Mvc.NewtonsoftJson": {
+ "type": "Transitive",
+ "resolved": "6.0.4",
+ "contentHash": "RQGy4kX3dkvcz0v84+sl6xmOYhpA3CFgylNiAPFxi36JLp4uU5SEvbbLo6u+d4tHbyGkaLe8RzKLJmnRdckZ9A==",
+ "dependencies": {
+ "Microsoft.AspNetCore.JsonPatch": "6.0.4",
+ "Newtonsoft.Json": "13.0.1",
+ "Newtonsoft.Json.Bson": "1.0.2"
+ }
+ },
+ "Microsoft.AspNetCore.Mvc.Razor.Extensions": {
+ "type": "Transitive",
+ "resolved": "6.0.4",
+ "contentHash": "LNHMPXJkxoqAJrDTHHNekUstkJVxBqu3eJcu3lSjH3iPQw38hBzWPFUieP4MgC31C3ssabULaD2PB1WeOl058Q==",
+ "dependencies": {
+ "Microsoft.AspNetCore.Razor.Language": "6.0.4",
+ "Microsoft.CodeAnalysis.Razor": "6.0.4"
+ }
+ },
+ "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation": {
+ "type": "Transitive",
+ "resolved": "6.0.4",
+ "contentHash": "9fd1xCNfJbuJPinj0o98IpjUsCeuyvGke7sfkagaN5nxhyfr1qYYcGO0Irf/0gNcUWVZHAu3e7XY6iXIhHs/Yw==",
+ "dependencies": {
+ "Microsoft.AspNetCore.Mvc.Razor.Extensions": "6.0.4",
+ "Microsoft.CodeAnalysis.Razor": "6.0.4",
+ "Microsoft.Extensions.DependencyModel": "6.0.0"
+ }
+ },
+ "Microsoft.AspNetCore.Razor.Language": {
+ "type": "Transitive",
+ "resolved": "6.0.4",
+ "contentHash": "pUBOF/SNk4/6eoK5M75cfqdQwZdlKRNGjzidO6MIuqnsgFIN5qiC7POYImgWv++0yoGyOpdNjnAHBQua7mLXVQ=="
+ },
+ "Microsoft.Bcl.AsyncInterfaces": {
+ "type": "Transitive",
+ "resolved": "1.1.1",
+ "contentHash": "yuvf07qFWFqtK3P/MRkEKLhn5r2UbSpVueRziSqj0yJQIKFwG1pq9mOayK3zE5qZCTs0CbrwL9M6R8VwqyGy2w=="
+ },
+ "Microsoft.Build.Tasks.Git": {
+ "type": "Transitive",
+ "resolved": "1.1.1",
+ "contentHash": "AT3HlgTjsqHnWpBHSNeR0KxbLZD7bztlZVj7I8vgeYG9SYqbeFGh0TM/KVtC6fg53nrWHl3VfZFvb5BiQFcY6Q=="
+ },
+ "Microsoft.CodeAnalysis.Analyzers": {
+ "type": "Transitive",
+ "resolved": "3.3.2",
+ "contentHash": "7xt6zTlIEizUgEsYAIgm37EbdkiMmr6fP6J9pDoKEpiGM4pi32BCPGr/IczmSJI9Zzp0a6HOzpr9OvpMP+2veA=="
+ },
+ "Microsoft.CodeAnalysis.Common": {
+ "type": "Transitive",
+ "resolved": "4.0.1",
+ "contentHash": "SMREwaVD5SzatlWhh9aahQAtSWdb63NcE//f+bQzgHSECU6xtDtaxk0kwV+asdFfr6HtW38UeO6jvqdfzudg3w==",
+ "dependencies": {
+ "Microsoft.CodeAnalysis.Analyzers": "3.3.2",
+ "System.Collections.Immutable": "5.0.0",
+ "System.Memory": "4.5.4",
+ "System.Reflection.Metadata": "5.0.0",
+ "System.Runtime.CompilerServices.Unsafe": "5.0.0",
+ "System.Text.Encoding.CodePages": "4.5.1",
+ "System.Threading.Tasks.Extensions": "4.5.4"
+ }
+ },
+ "Microsoft.CodeAnalysis.CSharp": {
+ "type": "Transitive",
+ "resolved": "4.0.1",
+ "contentHash": "Q9RxxydPpUElj/x1/qykDTUGsRoKbJG8H5XUSeMGmMu54fBiuX1xyanom9caa1oQfh5JIW1BgLxobSaWs4WyHQ==",
+ "dependencies": {
+ "Microsoft.CodeAnalysis.Common": "[4.0.1]"
+ }
+ },
+ "Microsoft.CodeAnalysis.Razor": {
+ "type": "Transitive",
+ "resolved": "6.0.4",
+ "contentHash": "OO9M3idcJCCjXOnShNyGTZkP2dofRlRqDNhSmA1boJtW1MSXMWwpyj3Z8DXVP0BLkMXqFQ0zFMEVMX5Eys57jw==",
+ "dependencies": {
+ "Microsoft.AspNetCore.Razor.Language": "6.0.4",
+ "Microsoft.CodeAnalysis.CSharp": "4.0.0",
+ "Microsoft.CodeAnalysis.Common": "4.0.0"
+ }
+ },
+ "Microsoft.CSharp": {
+ "type": "Transitive",
+ "resolved": "4.7.0",
+ "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA=="
+ },
+ "Microsoft.Data.SqlClient": {
+ "type": "Transitive",
+ "resolved": "3.0.0",
+ "contentHash": "MUauWfCLsZQQMUR/wZhec5MH6+NTPmPp9i/OsjIMmIu2ICYUGOVm1x7RTqKxq19UWxXMSG03/O0FyXQJrpDs9A==",
+ "dependencies": {
+ "Azure.Identity": "1.3.0",
+ "Microsoft.Data.SqlClient.SNI.runtime": "3.0.0",
+ "Microsoft.Identity.Client": "4.22.0",
+ "Microsoft.IdentityModel.JsonWebTokens": "6.8.0",
+ "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.8.0",
+ "Microsoft.Win32.Registry": "4.7.0",
+ "System.Configuration.ConfigurationManager": "4.7.0",
+ "System.Diagnostics.DiagnosticSource": "4.7.0",
+ "System.Runtime.Caching": "4.7.0",
+ "System.Security.Principal.Windows": "4.7.0",
+ "System.Text.Encoding.CodePages": "4.7.0",
+ "System.Text.Encodings.Web": "4.7.2"
+ }
+ },
+ "Microsoft.Data.SqlClient.SNI.runtime": {
+ "type": "Transitive",
+ "resolved": "3.0.0",
+ "contentHash": "n1sNyjJgu2pYWKgw3ZPikw3NiRvG4kt7Ya5MK8u77Rgj/1bTFqO/eDF4k5W9H5GXplMZCpKkNbp5kNBICgSB0w=="
+ },
+ "Microsoft.Extensions.Caching.Abstractions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "bcz5sSFJbganH0+YrfvIjJDIcKNW7TL07C4d1eTmXy/wOt52iz4LVogJb6pazs7W0+74j0YpXFErvp++Aq5Bsw==",
+ "dependencies": {
+ "Microsoft.Extensions.Primitives": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "tq2wXyh3fL17EMF2bXgRhU7JrbO3on93MRKYxzz4JzzvuGSA1l0W3GI9/tl8EO89TH+KWEymP7bcFway6z9fXg==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Primitives": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.Abstractions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Primitives": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.Binder": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.FileExtensions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "V4Dth2cYMZpw3HhGw9XUDIijpI6gN+22LDt0AhufIgOppCUfpWX4483OmN+dFXRJkJLc8Tv0Q8QK+1ingT2+KQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "6.0.0",
+ "Microsoft.Extensions.Configuration.Abstractions": "6.0.0",
+ "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0",
+ "Microsoft.Extensions.FileProviders.Physical": "6.0.0",
+ "Microsoft.Extensions.Primitives": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.Json": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "GJGery6QytCzS/BxJ96klgG9in3uH26KcUBbiVG/coNDXCRq6LGVVlUT4vXq34KPuM+R2av+LeYdX9h4IZOCUg==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "6.0.0",
+ "Microsoft.Extensions.Configuration.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0",
+ "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0",
+ "System.Text.Json": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.DependencyInjection": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "k6PWQMuoBDGGHOQTtyois2u4AwyVcIwL2LaSLlTZQm2CYcJ1pxbt6jfAnpWmzENA/wfrYRI/X9DTLoUkE4AsLw==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0",
+ "System.Runtime.CompilerServices.Unsafe": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.DependencyInjection.Abstractions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg=="
+ },
+ "Microsoft.Extensions.DependencyModel": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "TD5QHg98m3+QhgEV1YVoNMl5KtBw/4rjfxLHO0e/YV9bPUBDKntApP4xdrVtGgCeQZHVfC2EXIGsdpRNrr87Pg==",
+ "dependencies": {
+ "System.Buffers": "4.5.1",
+ "System.Memory": "4.5.4",
+ "System.Runtime.CompilerServices.Unsafe": "6.0.0",
+ "System.Text.Encodings.Web": "6.0.0",
+ "System.Text.Json": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.FileProviders.Abstractions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==",
+ "dependencies": {
+ "Microsoft.Extensions.Primitives": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.FileProviders.Composite": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "0IoXXfkgKpYJB1t2lC0jPXAxuaywRNc9y2Mq96ZZNKBthL38vusa2UK73+Bm6Kq/9a5xNHJS6NhsSN+i5TEtkA==",
+ "dependencies": {
+ "Microsoft.Extensions.FileProviders.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Primitives": "5.0.0"
+ }
+ },
+ "Microsoft.Extensions.FileProviders.Embedded": {
+ "type": "Transitive",
+ "resolved": "6.0.4",
+ "contentHash": "Ydzdq2WxGzKpQUUD4CxEDU+m2HPxR573IrQMk3pzsf3QCg5X06Td1hFRuK8+Tv0xZaLup71yQnbKN2AvNTjAYQ==",
+ "dependencies": {
+ "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.FileProviders.Physical": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "QvkL7l0nM8udt3gfyu0Vw8bbCXblxaKOl7c2oBfgGy4LCURRaL9XWZX1FWJrQc43oMokVneVxH38iz+bY1sbhg==",
+ "dependencies": {
+ "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0",
+ "Microsoft.Extensions.FileSystemGlobbing": "6.0.0",
+ "Microsoft.Extensions.Primitives": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.FileSystemGlobbing": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw=="
+ },
+ "Microsoft.Extensions.Hosting.Abstractions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "6.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0",
+ "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.Http": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "15+pa2G0bAMHbHewaQIdr/y6ag2H3yh4rd9hTXavtWDzQBkvpe2RMqFg8BxDpcQWssmjmBApGPcw93QRz6YcMg==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Logging": "6.0.0",
+ "Microsoft.Extensions.Logging.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Options": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.Identity.Core": {
+ "type": "Transitive",
+ "resolved": "6.0.4",
+ "contentHash": "8vBsyGkA8ZI3lZvm1nf+9ynRC/TzPD+UtbdgTlKk+cz+AW5I41LrK8f/adGej5uXgprOA2DMjZw33vZG6vyXxA==",
+ "dependencies": {
+ "Microsoft.AspNetCore.Cryptography.KeyDerivation": "6.0.4",
+ "Microsoft.Extensions.Logging": "6.0.0",
+ "Microsoft.Extensions.Options": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.Identity.Stores": {
+ "type": "Transitive",
+ "resolved": "6.0.4",
+ "contentHash": "linRCnWBfnqg8qjrd9u/KMISy8O4a6X/GRhpHXU0ar654YQw9LJ/Ht+psx8QLqSX5EsCBbBCZzuamatH2FWIyQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Caching.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Identity.Core": "6.0.4",
+ "Microsoft.Extensions.Logging": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.Logging": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection": "6.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Logging.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Options": "6.0.0",
+ "System.Diagnostics.DiagnosticSource": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.Logging.Abstractions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "/HggWBbTwy8TgebGSX5DBZ24ndhzi93sHUBDvP1IxbZD7FDokYzdAr6+vbWGjw2XAfR2EJ1sfKUotpjHnFWPxA=="
+ },
+ "Microsoft.Extensions.Options": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Primitives": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.Options.ConfigurationExtensions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "bXWINbTn0vC0FYc9GaQTISbxhQLAMrvtbuvD9N6JelEaIS/Pr62wUCinrq5bf1WRBGczt1v4wDhxFtVFNcMdUQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Configuration.Binder": "6.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Options": "6.0.0",
+ "Microsoft.Extensions.Primitives": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.Options.DataAnnotations": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "Fvs4plZYQT/iF/JsYwP/pppQRvQC211enBjCoIu/355M+aunlzSyzN/n3wPibyY76794MFLkLVT47JCBc3porg==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Options": "6.0.0",
+ "System.ComponentModel.Annotations": "5.0.0"
+ }
+ },
+ "Microsoft.Extensions.Primitives": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==",
+ "dependencies": {
+ "System.Runtime.CompilerServices.Unsafe": "6.0.0"
+ }
+ },
+ "Microsoft.Identity.Client": {
+ "type": "Transitive",
+ "resolved": "4.22.0",
+ "contentHash": "GlamU9rs8cSVIx9WSGv5QKpt66KkE+ImxNa/wNZZUJ3knt3PM98T9sOY8B7NcEfhw7NoxU2/0TSOcmnRSJQgqw=="
+ },
+ "Microsoft.Identity.Client.Extensions.Msal": {
+ "type": "Transitive",
+ "resolved": "2.16.5",
+ "contentHash": "VlGUZEpF8KP/GCfFI59sdE0WA0o9quqwM1YQY0dSp6jpGy5EOBkureaybLfpwCuYUUjQbLkN2p7neUIcQCfbzA==",
+ "dependencies": {
+ "Microsoft.Identity.Client": "4.22.0",
+ "System.Security.Cryptography.ProtectedData": "4.5.0"
+ }
+ },
+ "Microsoft.IdentityModel.JsonWebTokens": {
+ "type": "Transitive",
+ "resolved": "6.8.0",
+ "contentHash": "+7JIww64PkMt7NWFxoe4Y/joeF7TAtA/fQ0b2GFGcagzB59sKkTt/sMZWR6aSZht5YC7SdHi3W6yM1yylRGJCQ==",
+ "dependencies": {
+ "Microsoft.IdentityModel.Tokens": "6.8.0"
+ }
+ },
+ "Microsoft.IdentityModel.Logging": {
+ "type": "Transitive",
+ "resolved": "6.8.0",
+ "contentHash": "Rfh/p4MaN4gkmhPxwbu8IjrmoDncGfHHPh1sTnc0AcM/Oc39/fzC9doKNWvUAjzFb8LqA6lgZyblTrIsX/wDXg=="
+ },
+ "Microsoft.IdentityModel.Protocols": {
+ "type": "Transitive",
+ "resolved": "6.8.0",
+ "contentHash": "OJZx5nPdiH+MEkwCkbJrTAUiO/YzLe0VSswNlDxJsJD9bhOIdXHufh650pfm59YH1DNevp3/bXzukKrG57gA1w==",
+ "dependencies": {
+ "Microsoft.IdentityModel.Logging": "6.8.0",
+ "Microsoft.IdentityModel.Tokens": "6.8.0"
+ }
+ },
+ "Microsoft.IdentityModel.Protocols.OpenIdConnect": {
+ "type": "Transitive",
+ "resolved": "6.8.0",
+ "contentHash": "X/PiV5l3nYYsodtrNMrNQIVlDmHpjQQ5w48E+o/D5H4es2+4niEyQf3l03chvZGWNzBRhfSstaXr25/Ye4AeYw==",
+ "dependencies": {
+ "Microsoft.IdentityModel.Protocols": "6.8.0",
+ "System.IdentityModel.Tokens.Jwt": "6.8.0"
+ }
+ },
+ "Microsoft.IdentityModel.Tokens": {
+ "type": "Transitive",
+ "resolved": "6.8.0",
+ "contentHash": "gTqzsGcmD13HgtNePPcuVHZ/NXWmyV+InJgalW/FhWpII1D7V1k0obIseGlWMeA4G+tZfeGMfXr0klnWbMR/mQ==",
+ "dependencies": {
+ "Microsoft.CSharp": "4.5.0",
+ "Microsoft.IdentityModel.Logging": "6.8.0",
+ "System.Security.Cryptography.Cng": "4.5.0"
+ }
+ },
+ "Microsoft.IO.RecyclableMemoryStream": {
+ "type": "Transitive",
+ "resolved": "2.2.0",
+ "contentHash": "uyjY/cqomw1irT4L7lDeg4sJ36MsjHg3wKqpGrBAdzvZaxo85yMF+sAA9RIzTV92fDxuUzjqksMqA0+SNMkMgA=="
+ },
+ "Microsoft.NETCore.Platforms": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ=="
+ },
+ "Microsoft.NETCore.Targets": {
+ "type": "Transitive",
+ "resolved": "1.1.0",
+ "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg=="
+ },
+ "Microsoft.SourceLink.Common": {
+ "type": "Transitive",
+ "resolved": "1.1.1",
+ "contentHash": "WMcGpWKrmJmzrNeuaEb23bEMnbtR/vLmvZtkAP5qWu7vQsY59GqfRJd65sFpBszbd2k/bQ8cs8eWawQKAabkVg=="
+ },
+ "Microsoft.Win32.Primitives": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "Microsoft.Win32.Registry": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==",
+ "dependencies": {
+ "System.Security.AccessControl": "5.0.0",
+ "System.Security.Principal.Windows": "5.0.0"
+ }
+ },
+ "Microsoft.Win32.SystemEvents": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "hqTM5628jSsQiv+HGpiq3WKBl2c8v1KZfby2J6Pr7pEPlK9waPdgEO6b8A/+/xn/yZ9ulv8HuqK71ONy2tg67A=="
+ },
+ "MimeKit": {
+ "type": "Transitive",
+ "resolved": "3.2.0",
+ "contentHash": "l9YHMBhBUwY7qQHUp8fw0EvjcbmhN4Iggz6MdjqIShBf42+0nJTa5gu0kuupCOPuiARc9ZaS9c9f0gKz4OnxKw==",
+ "dependencies": {
+ "Portable.BouncyCastle": "1.9.0",
+ "System.Security.Cryptography.Pkcs": "6.0.0"
+ }
+ },
+ "MiniProfiler.AspNetCore": {
+ "type": "Transitive",
+ "resolved": "4.2.22",
+ "contentHash": "bBirB5d4Q0Bgx05Zg4yzXSmOHZQV4ZJhmxU3DGya4FZxNBwjaVHchqEKY0MJW5XLZo8axMAQm4yywgCvUlTymA==",
+ "dependencies": {
+ "MiniProfiler.Shared": "4.2.22",
+ "System.Text.Json": "4.6.0"
+ }
+ },
+ "MiniProfiler.AspNetCore.Mvc": {
+ "type": "Transitive",
+ "resolved": "4.2.22",
+ "contentHash": "nzCEaZnh77U9jw+c/qu4CtwYUpHEf+FH1ZMbYKMzIXr8CNNPlypSR6AJEAwjo3bq9TIJIpBMZIaK3inRLUCg4g==",
+ "dependencies": {
+ "MiniProfiler.AspNetCore": "4.2.22"
+ }
+ },
+ "MiniProfiler.Shared": {
+ "type": "Transitive",
+ "resolved": "4.2.22",
+ "contentHash": "OOA99Iu7FjFrdYaADcWL78KK9Kq6M+hfnZac5577aSrx0UYOM2apKlhBPKzoPtGPTRtQNKe4RK00u/FmahcU3g==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "2.0.0",
+ "Newtonsoft.Json": "10.0.3",
+ "System.ComponentModel.Primitives": "4.3.0",
+ "System.Data.Common": "4.3.0",
+ "System.Diagnostics.DiagnosticSource": "4.4.1",
+ "System.Diagnostics.StackTrace": "4.3.0",
+ "System.Dynamic.Runtime": "4.3.0",
+ "System.Reflection.Emit.Lightweight": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.Serialization.Primitives": "4.3.0",
+ "System.Threading.Tasks.Parallel": "4.3.0"
+ }
+ },
+ "NCrontab": {
+ "type": "Transitive",
+ "resolved": "3.3.1",
+ "contentHash": "G3tzcIIgsiyZyVbHNPyn5+adaM9UjeVNgjrRsvXU7wo2sMhpvpQrir29dcjIND53H/fuTdgg9nI3SfFFg7barA=="
+ },
+ "NETStandard.Library": {
+ "type": "Transitive",
+ "resolved": "1.6.1",
+ "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.Win32.Primitives": "4.3.0",
+ "System.AppContext": "4.3.0",
+ "System.Collections": "4.3.0",
+ "System.Collections.Concurrent": "4.3.0",
+ "System.Console": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Diagnostics.Tools": "4.3.0",
+ "System.Diagnostics.Tracing": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.Globalization.Calendars": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.IO.Compression": "4.3.0",
+ "System.IO.Compression.ZipFile": "4.3.0",
+ "System.IO.FileSystem": "4.3.0",
+ "System.IO.FileSystem.Primitives": "4.3.0",
+ "System.Linq": "4.3.0",
+ "System.Linq.Expressions": "4.3.0",
+ "System.Net.Http": "4.3.0",
+ "System.Net.Primitives": "4.3.0",
+ "System.Net.Sockets": "4.3.0",
+ "System.ObjectModel": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Reflection.Extensions": "4.3.0",
+ "System.Reflection.Primitives": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.Handles": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Runtime.InteropServices.RuntimeInformation": "4.3.0",
+ "System.Runtime.Numerics": "4.3.0",
+ "System.Security.Cryptography.Algorithms": "4.3.0",
+ "System.Security.Cryptography.Encoding": "4.3.0",
+ "System.Security.Cryptography.Primitives": "4.3.0",
+ "System.Security.Cryptography.X509Certificates": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Text.Encoding.Extensions": "4.3.0",
+ "System.Text.RegularExpressions": "4.3.0",
+ "System.Threading": "4.3.0",
+ "System.Threading.Tasks": "4.3.0",
+ "System.Threading.Timer": "4.3.0",
+ "System.Xml.ReaderWriter": "4.3.0",
+ "System.Xml.XDocument": "4.3.0"
+ }
+ },
+ "Newtonsoft.Json": {
+ "type": "Transitive",
+ "resolved": "13.0.1",
+ "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A=="
+ },
+ "Newtonsoft.Json.Bson": {
+ "type": "Transitive",
+ "resolved": "1.0.2",
+ "contentHash": "QYFyxhaABwmq3p/21VrZNYvCg3DaEoN/wUuw5nmfAf0X3HLjgupwhkEWdgfb9nvGAUIv3osmZoD3kKl4jxEmYQ==",
+ "dependencies": {
+ "Newtonsoft.Json": "12.0.1"
+ }
+ },
+ "NPoco": {
+ "type": "Transitive",
+ "resolved": "5.3.2",
+ "contentHash": "3eVBjurbeWT3hSC0/o7wMc+DBPOGMOL4H0boSPn/8URC/9ebzUkB+VDzWLqlQPXFLlFVjCcgh4pK/FhXoJ74yQ==",
+ "dependencies": {
+ "System.Linq.Async": "5.0.0",
+ "System.Reflection.Emit.Lightweight": "4.7.0"
+ }
+ },
+ "NPoco.SqlServer": {
+ "type": "Transitive",
+ "resolved": "5.3.2",
+ "contentHash": "6lkQHcgvDgSfIq0oga7W91QpRU1Mdmm6NgqcT8mgOOyY92ftQaacAZgzMTl8CfhgMYsg0/xzRgqIGq37CnLTxg==",
+ "dependencies": {
+ "Microsoft.Data.SqlClient": "3.0.0",
+ "NPoco": "5.3.2",
+ "Polly": "7.2.2"
+ }
+ },
+ "NUglify": {
+ "type": "Transitive",
+ "resolved": "1.13.12",
+ "contentHash": "+13YE9UjnXx4+NKP+j1Axiz/QAMtK++ZtG61u9iiR2/WzPzr7EfBDOwj+xHNyTEMS9Emq/mCyWaBGjCABhC0HQ=="
+ },
+ "Polly": {
+ "type": "Transitive",
+ "resolved": "7.2.2",
+ "contentHash": "E6CeKyS513j7taKAq4q2MESDBvzuzWnR1rQ2Y2zqJvpiVtKMm699Aubb20MUPBDmb0Ov8PmcLHTCVFdCjoy2kA=="
+ },
+ "Portable.BouncyCastle": {
+ "type": "Transitive",
+ "resolved": "1.9.0",
+ "contentHash": "eZZBCABzVOek+id9Xy04HhmgykF0wZg9wpByzrWN7q8qEI0Qen9b7tfd7w8VA3dOeesumMG7C5ZPy0jk7PSRHw=="
+ },
+ "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q=="
+ },
+ "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA=="
+ },
+ "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw=="
+ },
+ "runtime.native.System": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0"
+ }
+ },
+ "runtime.native.System.IO.Compression": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0"
+ }
+ },
+ "runtime.native.System.Net.Http": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0"
+ }
+ },
+ "runtime.native.System.Security.Cryptography.Apple": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==",
+ "dependencies": {
+ "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0"
+ }
+ },
+ "runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==",
+ "dependencies": {
+ "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0",
+ "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0",
+ "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0",
+ "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0",
+ "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0",
+ "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0",
+ "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0",
+ "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0",
+ "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0",
+ "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
+ }
+ },
+ "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A=="
+ },
+ "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ=="
+ },
+ "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ=="
+ },
+ "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g=="
+ },
+ "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg=="
+ },
+ "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ=="
+ },
+ "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A=="
+ },
+ "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg=="
+ },
+ "Serilog": {
+ "type": "Transitive",
+ "resolved": "2.10.0",
+ "contentHash": "+QX0hmf37a0/OZLxM3wL7V6/ADvC1XihXN4Kq/p6d8lCPfgkRdiuhbWlMaFjR9Av0dy5F0+MBeDmDdRZN/YwQA=="
+ },
+ "Serilog.AspNetCore": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "/JO/txIxRR61x1UXQAgUzG2Sx05o1QHCkokVBWrKzmAoDu+p5EtCAj7L/TVVg7Ezhh3GPiZ0JI9OJCmRO9tSRw==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection": "5.0.0",
+ "Microsoft.Extensions.Logging": "5.0.0",
+ "Serilog": "2.10.0",
+ "Serilog.Extensions.Hosting": "4.2.0",
+ "Serilog.Formatting.Compact": "1.1.0",
+ "Serilog.Settings.Configuration": "3.3.0",
+ "Serilog.Sinks.Console": "4.0.1",
+ "Serilog.Sinks.Debug": "2.0.0",
+ "Serilog.Sinks.File": "5.0.0"
+ }
+ },
+ "Serilog.Enrichers.Process": {
+ "type": "Transitive",
+ "resolved": "2.0.2",
+ "contentHash": "T9EjKKLsL6qC/3eOLUAKEPBLEqPDmt5BLXaQdPMaxJzuex+MeXA8DuAiPboUaftp3kbnCN4ZgZpDvs+Fa7OHuw==",
+ "dependencies": {
+ "Serilog": "2.3.0"
+ }
+ },
+ "Serilog.Enrichers.Thread": {
+ "type": "Transitive",
+ "resolved": "3.1.0",
+ "contentHash": "85lWsGRJpRxvKT6j/H67no55SUBsBIvp556TKuBTGhjtoPeq+L7j/sDWbgAtvT0p7u7/phJyX6j35PQ4Vtqw0g==",
+ "dependencies": {
+ "Serilog": "2.3.0"
+ }
+ },
+ "Serilog.Expressions": {
+ "type": "Transitive",
+ "resolved": "3.3.0",
+ "contentHash": "wKFAcFSdukSwVYK4LPhcWpY8YmEVTSGqmi3bjagHNw+9wdCseREqGdsYBBTWtkYcugwSHv3F9dtwuFKUM9T2BA==",
+ "dependencies": {
+ "Serilog": "2.10.0"
+ }
+ },
+ "Serilog.Extensions.Hosting": {
+ "type": "Transitive",
+ "resolved": "4.2.0",
+ "contentHash": "gT2keceCmPQR9EX0VpXQZvUgELdfE7yqJ7MOxBhm3WLCblcvRgswEOOTgok/DHObbM15A3V/DtF3VdVDQPIZzQ==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.8",
+ "Microsoft.Extensions.Hosting.Abstractions": "3.1.8",
+ "Microsoft.Extensions.Logging.Abstractions": "3.1.8",
+ "Serilog": "2.10.0",
+ "Serilog.Extensions.Logging": "3.1.0"
+ }
+ },
+ "Serilog.Extensions.Logging": {
+ "type": "Transitive",
+ "resolved": "3.1.0",
+ "contentHash": "IWfem7wfrFbB3iw1OikqPFNPEzfayvDuN4WP7Ue1AVFskalMByeWk3QbtUXQR34SBkv1EbZ3AySHda/ErDgpcg==",
+ "dependencies": {
+ "Microsoft.Extensions.Logging": "2.0.0",
+ "Serilog": "2.9.0"
+ }
+ },
+ "Serilog.Formatting.Compact": {
+ "type": "Transitive",
+ "resolved": "1.1.0",
+ "contentHash": "pNroKVjo+rDqlxNG5PXkRLpfSCuDOBY0ri6jp9PLe505ljqwhwZz8ospy2vWhQlFu5GkIesh3FcDs4n7sWZODA==",
+ "dependencies": {
+ "Serilog": "2.8.0"
+ }
+ },
+ "Serilog.Formatting.Compact.Reader": {
+ "type": "Transitive",
+ "resolved": "1.0.5",
+ "contentHash": "PPqEBHc9YMtXBiEAxD4qd5oqsavmr1jzdjKC9ky50Ipf/qnSp2D2l/ZggSxZUW7jfCbJStxgwKYGsH0Bnk4BIw==",
+ "dependencies": {
+ "Newtonsoft.Json": "9.0.1",
+ "Serilog": "2.3.0"
+ }
+ },
+ "Serilog.Settings.Configuration": {
+ "type": "Transitive",
+ "resolved": "3.3.0",
+ "contentHash": "7GNudISZwqaT902hqEL2OFGTZeUFWfnrNLupJkOqeF41AR3GjcxX+Hwb30xb8gG2/CDXsCMVfF8o0+8KY0fJNg==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyModel": "3.0.0",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "2.0.0",
+ "Serilog": "2.10.0"
+ }
+ },
+ "Serilog.Sinks.Async": {
+ "type": "Transitive",
+ "resolved": "1.5.0",
+ "contentHash": "csHYIqAwI4Gy9oAhXYRwxGrQEAtBg3Ep7WaCzsnA1cZuBZjVAU0n7hWaJhItjO7hbLHh/9gRVxALCUB4Dv+gZw==",
+ "dependencies": {
+ "Serilog": "2.9.0"
+ }
+ },
+ "Serilog.Sinks.Console": {
+ "type": "Transitive",
+ "resolved": "4.0.1",
+ "contentHash": "apLOvSJQLlIbKlbx+Y2UDHSP05kJsV7mou+fvJoRGs/iR+jC22r8cuFVMjjfVxz/AD4B2UCltFhE1naRLXwKNw==",
+ "dependencies": {
+ "Serilog": "2.10.0"
+ }
+ },
+ "Serilog.Sinks.Debug": {
+ "type": "Transitive",
+ "resolved": "2.0.0",
+ "contentHash": "Y6g3OBJ4JzTyyw16fDqtFcQ41qQAydnEvEqmXjhwhgjsnG/FaJ8GUqF5ldsC/bVkK8KYmqrPhDO+tm4dF6xx4A==",
+ "dependencies": {
+ "Serilog": "2.10.0"
+ }
+ },
+ "Serilog.Sinks.File": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "uwV5hdhWPwUH1szhO8PJpFiahqXmzPzJT/sOijH/kFgUx+cyoDTMM8MHD0adw9+Iem6itoibbUXHYslzXsLEAg==",
+ "dependencies": {
+ "Serilog": "2.10.0"
+ }
+ },
+ "Serilog.Sinks.Map": {
+ "type": "Transitive",
+ "resolved": "1.0.2",
+ "contentHash": "JbPBAeD5hxUQw8TZg3FlOnqVsSu1269nvqFm5DQ7hc+AmsB+hItl+zMSDphMbPJXjL8KdpMRSWNkGi7zTKRmCA==",
+ "dependencies": {
+ "Serilog": "2.8.0"
+ }
+ },
+ "SixLabors.ImageSharp": {
+ "type": "Transitive",
+ "resolved": "2.1.1",
+ "contentHash": "oNHMT8+yUR9dyuU2r7fwsXvvS4OnfCs9N5i2y2p9iBxp3nvEZbe/hZWrOGfD7MX2lxOAlWzlhzj0q2uFwP8avg==",
+ "dependencies": {
+ "System.Runtime.CompilerServices.Unsafe": "5.0.0",
+ "System.Text.Encoding.CodePages": "5.0.0"
+ }
+ },
+ "SixLabors.ImageSharp.Web": {
+ "type": "Transitive",
+ "resolved": "2.0.0",
+ "contentHash": "4sTDmj38Ab/HOHituh9ks1q1MTuX6leBtbDOe9RJ5zyiWHXDn79BWdJ8fTYzFAsAl0KeOh4Gh0RNRftnYmABZg==",
+ "dependencies": {
+ "Microsoft.IO.RecyclableMemoryStream": "2.2.0",
+ "SixLabors.ImageSharp": "2.1.1"
+ }
+ },
+ "Smidge": {
+ "type": "Transitive",
+ "resolved": "4.0.4",
+ "contentHash": "o1Y1xLzQBdxhajMP3trhfRHwYnElZpAWfWPAaCCbpKd2sQqwX/J4KtxLnQdASo98pQVzWDKW3d7Dt0v5/NU/6g==",
+ "dependencies": {
+ "Smidge.Core": "4.0.4"
+ }
+ },
+ "Smidge.Core": {
+ "type": "Transitive",
+ "resolved": "4.0.4",
+ "contentHash": "JFYGvMyfHGuVX4GOosDePsY31eZtefZseg2yQss1Vbc73B12SHeL9IbuE/Sdioi/GDXV2T5AILL8LIY6hzWJ1w==",
+ "dependencies": {
+ "Microsoft.AspNetCore.Http.Features": "5.0.0",
+ "Microsoft.Extensions.Configuration": "5.0.0",
+ "Microsoft.Extensions.Configuration.Json": "5.0.0",
+ "Microsoft.Extensions.FileProviders.Composite": "5.0.0",
+ "Microsoft.Extensions.Hosting.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Logging.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Options": "5.0.0"
+ }
+ },
+ "Smidge.InMemory": {
+ "type": "Transitive",
+ "resolved": "4.0.4",
+ "contentHash": "1Ve1ySrwZNmpjkJecAesiktVZn1uOLcZ3qNGLZ/7HzssdtzN1QP967M1iU9Zg+3h2BD3/ifQmNPk/uKJ0Vmb/w==",
+ "dependencies": {
+ "Dazinator.Extensions.FileProviders": "2.0.0",
+ "Smidge.Core": "4.0.4",
+ "System.Text.Encodings.Web": "5.0.1"
+ }
+ },
+ "Smidge.Nuglify": {
+ "type": "Transitive",
+ "resolved": "4.0.4",
+ "contentHash": "E1NoWmWVCFpLizNWh8ow81fy4z9nQE0UvYTc8gkzHGtVRrPsfHJYF7l/p+VZuryfyvD9er2NkS6LmQnv8M17Iw==",
+ "dependencies": {
+ "Nuglify": "1.13.12",
+ "Smidge": "4.0.4"
+ }
+ },
+ "StyleCop.Analyzers.Unstable": {
+ "type": "Transitive",
+ "resolved": "1.2.0.435",
+ "contentHash": "ouwPWZxbOV3SmCZxIRqHvljkSzkCyi1tDoMzQtDb/bRP8ctASV/iRJr+A2Gdj0QLaLmWnqTWDrH82/iP+X80Lg=="
+ },
+ "System.AppContext": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==",
+ "dependencies": {
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Buffers": {
+ "type": "Transitive",
+ "resolved": "4.5.1",
+ "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg=="
+ },
+ "System.Collections": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Collections.Concurrent": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Diagnostics.Tracing": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Threading": "4.3.0",
+ "System.Threading.Tasks": "4.3.0"
+ }
+ },
+ "System.Collections.Immutable": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g=="
+ },
+ "System.ComponentModel": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "VyGn1jGRZVfxnh8EdvDCi71v3bMXrsu8aYJOwoV7SNDLVhiEqwP86pPMyRGsDsxhXAm2b3o9OIqeETfN5qfezw==",
+ "dependencies": {
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.ComponentModel.Annotations": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg=="
+ },
+ "System.ComponentModel.Primitives": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "j8GUkCpM8V4d4vhLIIoBLGey2Z5bCkMVNjEZseyAlm4n5arcsJOeI3zkUP+zvZgzsbLTYh4lYeP/ZD/gdIAPrw==",
+ "dependencies": {
+ "System.ComponentModel": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Configuration.ConfigurationManager": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "7T+m0kDSlIPTHIkPMIu6m6tV6qsMqJpvQWW2jIc2qi7sn40qxFo0q+7mEQAhMPXZHMKnWrnv47ntGlM/ejvw3g==",
+ "dependencies": {
+ "System.Security.Cryptography.ProtectedData": "6.0.0",
+ "System.Security.Permissions": "6.0.0"
+ }
+ },
+ "System.Console": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.IO": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Text.Encoding": "4.3.0"
+ }
+ },
+ "System.Data.Common": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "lm6E3T5u7BOuEH0u18JpbJHxBfOJPuCyl4Kg1RH10ktYLp5uEEE1xKrHW56/We4SnZpGAuCc9N0MJpSDhTHZGQ==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Text.RegularExpressions": "4.3.0",
+ "System.Threading.Tasks": "4.3.0"
+ }
+ },
+ "System.Diagnostics.Debug": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Diagnostics.DiagnosticSource": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==",
+ "dependencies": {
+ "System.Runtime.CompilerServices.Unsafe": "6.0.0"
+ }
+ },
+ "System.Diagnostics.StackTrace": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "BiHg0vgtd35/DM9jvtaC1eKRpWZxr0gcQd643ABG7GnvSlf5pOkY2uyd42mMOJoOmKvnpNj0F4tuoS1pacTwYw==",
+ "dependencies": {
+ "System.IO.FileSystem": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Reflection.Metadata": "1.4.1",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Diagnostics.Tools": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Diagnostics.Tracing": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Drawing.Common": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "NfuoKUiP2nUWwKZN6twGqXioIe1zVD0RIj2t976A+czLHr2nY454RwwXs6JU9Htc6mwqL6Dn/nEL3dpVf2jOhg==",
+ "dependencies": {
+ "Microsoft.Win32.SystemEvents": "6.0.0"
+ }
+ },
+ "System.Dynamic.Runtime": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "SNVi1E/vfWUAs/WYKhE9+qlS6KqK0YVhnlT0HQtr8pMIA8YX3lwy3uPMownDwdYISBdmAF/2holEIldVp85Wag==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Linq": "4.3.0",
+ "System.Linq.Expressions": "4.3.0",
+ "System.ObjectModel": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Reflection.Emit": "4.3.0",
+ "System.Reflection.Emit.ILGeneration": "4.3.0",
+ "System.Reflection.Primitives": "4.3.0",
+ "System.Reflection.TypeExtensions": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Threading": "4.3.0"
+ }
+ },
+ "System.Formats.Asn1": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "T6fD00dQ3NTbPDy31m4eQUwKW84s03z0N2C8HpOklyeaDgaJPa/TexP4/SkORMSOwc7WhKifnA6Ya33AkzmafA=="
+ },
+ "System.Globalization": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Globalization.Calendars": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Globalization": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Globalization.Extensions": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "System.Globalization": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0"
+ }
+ },
+ "System.IdentityModel.Tokens.Jwt": {
+ "type": "Transitive",
+ "resolved": "6.8.0",
+ "contentHash": "5tBCjAub2Bhd5qmcd0WhR5s354e4oLYa//kOWrkX+6/7ZbDDJjMTfwLSOiZ/MMpWdE4DWPLOfTLOq/juj9CKzA==",
+ "dependencies": {
+ "Microsoft.IdentityModel.JsonWebTokens": "6.8.0",
+ "Microsoft.IdentityModel.Tokens": "6.8.0"
+ }
+ },
+ "System.IO": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Threading.Tasks": "4.3.0"
+ }
+ },
+ "System.IO.Compression": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "System.Buffers": "4.3.0",
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.Handles": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Threading": "4.3.0",
+ "System.Threading.Tasks": "4.3.0",
+ "runtime.native.System": "4.3.0",
+ "runtime.native.System.IO.Compression": "4.3.0"
+ }
+ },
+ "System.IO.Compression.ZipFile": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==",
+ "dependencies": {
+ "System.Buffers": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.IO.Compression": "4.3.0",
+ "System.IO.FileSystem": "4.3.0",
+ "System.IO.FileSystem.Primitives": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Text.Encoding": "4.3.0"
+ }
+ },
+ "System.IO.FileSystem": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.IO": "4.3.0",
+ "System.IO.FileSystem.Primitives": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Handles": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Threading.Tasks": "4.3.0"
+ }
+ },
+ "System.IO.FileSystem.AccessControl": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "SxHB3nuNrpptVk+vZ/F+7OHEpoHUIKKMl02bUmYHQr1r+glbZQxs7pRtsf4ENO29TVm2TH3AEeep2fJcy92oYw==",
+ "dependencies": {
+ "System.Security.AccessControl": "5.0.0",
+ "System.Security.Principal.Windows": "5.0.0"
+ }
+ },
+ "System.IO.FileSystem.Primitives": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==",
+ "dependencies": {
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.IO.Hashing": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "Rfm2jYCaUeGysFEZjDe7j1R4x6Z6BzumS/vUT5a1AA/AWJuGX71PoGB0RmpyX3VmrGqVnAwtfMn39OHR8Y/5+g=="
+ },
+ "System.IO.Pipelines": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "irMYm3vhVgRsYvHTU5b2gsT2CwT/SMM6LZFzuJjpIvT5Z4CshxNsaoBC1X/LltwuR3Opp8d6jOS/60WwOb7Q2Q=="
+ },
+ "System.Linq": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0"
+ }
+ },
+ "System.Linq.Async": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "cPtIuuH8TIjVHSi2ewwReWGW1PfChPE0LxPIDlfwVcLuTM9GANFTXiMB7k3aC4sk3f0cQU25LNKzx+jZMxijqw=="
+ },
+ "System.Linq.Expressions": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.Linq": "4.3.0",
+ "System.ObjectModel": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Reflection.Emit": "4.3.0",
+ "System.Reflection.Emit.ILGeneration": "4.3.0",
+ "System.Reflection.Emit.Lightweight": "4.3.0",
+ "System.Reflection.Extensions": "4.3.0",
+ "System.Reflection.Primitives": "4.3.0",
+ "System.Reflection.TypeExtensions": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Threading": "4.3.0"
+ }
+ },
+ "System.Memory": {
+ "type": "Transitive",
+ "resolved": "4.5.4",
+ "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw=="
+ },
+ "System.Memory.Data": {
+ "type": "Transitive",
+ "resolved": "1.0.2",
+ "contentHash": "JGkzeqgBsiZwKJZ1IxPNsDFZDhUvuEdX8L8BDC8N3KOj+6zMcNU28CNN59TpZE/VJYy9cP+5M+sbxtWJx3/xtw==",
+ "dependencies": {
+ "System.Text.Encodings.Web": "4.7.2",
+ "System.Text.Json": "4.6.0"
+ }
+ },
+ "System.Net.Http": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Diagnostics.DiagnosticSource": "4.3.0",
+ "System.Diagnostics.Tracing": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.Globalization.Extensions": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.IO.FileSystem": "4.3.0",
+ "System.Net.Primitives": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.Handles": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Security.Cryptography.Algorithms": "4.3.0",
+ "System.Security.Cryptography.Encoding": "4.3.0",
+ "System.Security.Cryptography.OpenSsl": "4.3.0",
+ "System.Security.Cryptography.Primitives": "4.3.0",
+ "System.Security.Cryptography.X509Certificates": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Threading": "4.3.0",
+ "System.Threading.Tasks": "4.3.0",
+ "runtime.native.System": "4.3.0",
+ "runtime.native.System.Net.Http": "4.3.0",
+ "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
+ }
+ },
+ "System.Net.Primitives": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Handles": "4.3.0"
+ }
+ },
+ "System.Net.Sockets": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.IO": "4.3.0",
+ "System.Net.Primitives": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Threading.Tasks": "4.3.0"
+ }
+ },
+ "System.Numerics.Vectors": {
+ "type": "Transitive",
+ "resolved": "4.5.0",
+ "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ=="
+ },
+ "System.ObjectModel": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Threading": "4.3.0"
+ }
+ },
+ "System.Reflection": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.IO": "4.3.0",
+ "System.Reflection.Primitives": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Reflection.Emit": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==",
+ "dependencies": {
+ "System.IO": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Reflection.Emit.ILGeneration": "4.3.0",
+ "System.Reflection.Primitives": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Reflection.Emit.ILGeneration": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==",
+ "dependencies": {
+ "System.Reflection": "4.3.0",
+ "System.Reflection.Primitives": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Reflection.Emit.Lightweight": {
+ "type": "Transitive",
+ "resolved": "4.7.0",
+ "contentHash": "a4OLB4IITxAXJeV74MDx49Oq2+PsF6Sml54XAFv+2RyWwtDBcabzoxiiJRhdhx+gaohLh4hEGCLQyBozXoQPqA=="
+ },
+ "System.Reflection.Extensions": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Reflection": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Reflection.Metadata": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ=="
+ },
+ "System.Reflection.Primitives": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Reflection.TypeExtensions": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==",
+ "dependencies": {
+ "System.Reflection": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Resources.ResourceManager": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Globalization": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Runtime": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0"
+ }
+ },
+ "System.Runtime.Caching": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "E0e03kUp5X2k+UAoVl6efmI7uU7JRBWi5EIdlQ7cr0NpBGjHG4fWII35PgsBY9T4fJQ8E4QPsL0rKksU9gcL5A==",
+ "dependencies": {
+ "System.Configuration.ConfigurationManager": "6.0.0"
+ }
+ },
+ "System.Runtime.CompilerServices.Unsafe": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg=="
+ },
+ "System.Runtime.Extensions": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Runtime.Handles": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Runtime.InteropServices": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Reflection": "4.3.0",
+ "System.Reflection.Primitives": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Handles": "4.3.0"
+ }
+ },
+ "System.Runtime.InteropServices.RuntimeInformation": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==",
+ "dependencies": {
+ "System.Reflection": "4.3.0",
+ "System.Reflection.Extensions": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Threading": "4.3.0",
+ "runtime.native.System": "4.3.0"
+ }
+ },
+ "System.Runtime.Numerics": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==",
+ "dependencies": {
+ "System.Globalization": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0"
+ }
+ },
+ "System.Runtime.Serialization.Primitives": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "Wz+0KOukJGAlXjtKr+5Xpuxf8+c8739RI1C+A2BoQZT+wMCCoMDDdO8/4IRHfaVINqL78GO8dW8G2lW/e45Mcw==",
+ "dependencies": {
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Security.AccessControl": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "AUADIc0LIEQe7MzC+I0cl0rAT8RrTAKFHl53yHjEUzNVIaUlhFY11vc2ebiVJzVBuOzun6F7FBA+8KAbGTTedQ=="
+ },
+ "System.Security.Cryptography.Algorithms": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "System.Collections": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.Handles": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Runtime.Numerics": "4.3.0",
+ "System.Security.Cryptography.Encoding": "4.3.0",
+ "System.Security.Cryptography.Primitives": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "runtime.native.System.Security.Cryptography.Apple": "4.3.0",
+ "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
+ }
+ },
+ "System.Security.Cryptography.Cng": {
+ "type": "Transitive",
+ "resolved": "4.5.0",
+ "contentHash": "WG3r7EyjUe9CMPFSs6bty5doUqT+q9pbI80hlNzo2SkPkZ4VTuZkGWjpp77JB8+uaL4DFPRdBsAY+DX3dBK92A=="
+ },
+ "System.Security.Cryptography.Csp": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "System.IO": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.Handles": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Security.Cryptography.Algorithms": "4.3.0",
+ "System.Security.Cryptography.Encoding": "4.3.0",
+ "System.Security.Cryptography.Primitives": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Threading": "4.3.0"
+ }
+ },
+ "System.Security.Cryptography.Encoding": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "System.Collections": "4.3.0",
+ "System.Collections.Concurrent": "4.3.0",
+ "System.Linq": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.Handles": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Security.Cryptography.Primitives": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
+ }
+ },
+ "System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.Handles": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Runtime.Numerics": "4.3.0",
+ "System.Security.Cryptography.Algorithms": "4.3.0",
+ "System.Security.Cryptography.Encoding": "4.3.0",
+ "System.Security.Cryptography.Primitives": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
+ }
+ },
+ "System.Security.Cryptography.Pkcs": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "elM3x+xSRhzQysiqo85SbidJJ2YbZlnvmh+53TuSZHsD7dNuuEWser+9EFtY+rYupBwkq2avc6ZCO3/6qACgmg==",
+ "dependencies": {
+ "System.Formats.Asn1": "6.0.0"
+ }
+ },
+ "System.Security.Cryptography.Primitives": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==",
+ "dependencies": {
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Threading": "4.3.0",
+ "System.Threading.Tasks": "4.3.0"
+ }
+ },
+ "System.Security.Cryptography.ProtectedData": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "rp1gMNEZpvx9vP0JW0oHLxlf8oSiQgtno77Y4PLUBjSiDYoD77Y8uXHr1Ea5XG4/pIKhqAdxZ8v8OTUtqo9PeQ=="
+ },
+ "System.Security.Cryptography.X509Certificates": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.Globalization.Calendars": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.IO.FileSystem": "4.3.0",
+ "System.IO.FileSystem.Primitives": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.Handles": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Runtime.Numerics": "4.3.0",
+ "System.Security.Cryptography.Algorithms": "4.3.0",
+ "System.Security.Cryptography.Cng": "4.3.0",
+ "System.Security.Cryptography.Csp": "4.3.0",
+ "System.Security.Cryptography.Encoding": "4.3.0",
+ "System.Security.Cryptography.OpenSsl": "4.3.0",
+ "System.Security.Cryptography.Primitives": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Threading": "4.3.0",
+ "runtime.native.System": "4.3.0",
+ "runtime.native.System.Net.Http": "4.3.0",
+ "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
+ }
+ },
+ "System.Security.Cryptography.Xml": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "MYmkHtCW+paFmPGFDktnLdOeH3zUrNchbZNki87E1ejNSMm9enSRbJokmvFrsWUrDE4bRE1lVeAle01+t6SGhA==",
+ "dependencies": {
+ "System.Security.Cryptography.Pkcs": "5.0.0",
+ "System.Security.Permissions": "5.0.0"
+ }
+ },
+ "System.Security.Permissions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "T/uuc7AklkDoxmcJ7LGkyX1CcSviZuLCa4jg3PekfJ7SU0niF0IVTXwUiNVP9DSpzou2PpxJ+eNY2IfDM90ZCg==",
+ "dependencies": {
+ "System.Security.AccessControl": "6.0.0",
+ "System.Windows.Extensions": "6.0.0"
+ }
+ },
+ "System.Security.Principal.Windows": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA=="
+ },
+ "System.Text.Encoding": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Text.Encoding.CodePages": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "NyscU59xX6Uo91qvhOs2Ccho3AR2TnZPomo1Z0K6YpyztBPM/A5VbkzOO19sy3A3i1TtEnTxA7bCe3Us+r5MWg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "5.0.0"
+ }
+ },
+ "System.Text.Encoding.Extensions": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0",
+ "System.Text.Encoding": "4.3.0"
+ }
+ },
+ "System.Text.Encodings.Web": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==",
+ "dependencies": {
+ "System.Runtime.CompilerServices.Unsafe": "6.0.0"
+ }
+ },
+ "System.Text.Json": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "zaJsHfESQvJ11vbXnNlkrR46IaMULk/gHxYsJphzSF+07kTjPHv+Oc14w6QEOfo3Q4hqLJgStUaYB9DBl0TmWg==",
+ "dependencies": {
+ "System.Runtime.CompilerServices.Unsafe": "6.0.0",
+ "System.Text.Encodings.Web": "6.0.0"
+ }
+ },
+ "System.Text.RegularExpressions": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==",
+ "dependencies": {
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Threading": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==",
+ "dependencies": {
+ "System.Runtime": "4.3.0",
+ "System.Threading.Tasks": "4.3.0"
+ }
+ },
+ "System.Threading.AccessControl": {
+ "type": "Transitive",
+ "resolved": "4.7.0",
+ "contentHash": "/fmzEf1UYrdCzfOIHVJ2cx3v9DHLLLMkUrodpzJGW17N+K+SSmBD8OA/BGmtfN1Ae0Ex3rBjQVufnIi5zKefuQ==",
+ "dependencies": {
+ "System.Security.AccessControl": "4.7.0",
+ "System.Security.Principal.Windows": "4.7.0"
+ }
+ },
+ "System.Threading.Tasks": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Threading.Tasks.Dataflow": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "+tyDCU3/B1lDdOOAJywHQoFwyXIUghIaP2BxG79uvhfTnO+D9qIgjVlL/JV2NTliYbMHpd6eKDmHp2VHpij7MA=="
+ },
+ "System.Threading.Tasks.Extensions": {
+ "type": "Transitive",
+ "resolved": "4.5.4",
+ "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg=="
+ },
+ "System.Threading.Tasks.Parallel": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "cbjBNZHf/vQCfcdhzx7knsiygoCKgxL8mZOeocXZn5gWhCdzHIq6bYNKWX0LAJCWYP7bds4yBK8p06YkP0oa0g==",
+ "dependencies": {
+ "System.Collections.Concurrent": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Diagnostics.Tracing": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Threading": "4.3.0",
+ "System.Threading.Tasks": "4.3.0"
+ }
+ },
+ "System.Threading.Timer": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Windows.Extensions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "IXoJOXIqc39AIe+CIR7koBtRGMiCt/LPM3lI+PELtDIy9XdyeSrwXFdWV9dzJ2Awl0paLWUaknLxFQ5HpHZUog==",
+ "dependencies": {
+ "System.Drawing.Common": "6.0.0"
+ }
+ },
+ "System.Xml.ReaderWriter": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.IO.FileSystem": "4.3.0",
+ "System.IO.FileSystem.Primitives": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Text.Encoding.Extensions": "4.3.0",
+ "System.Text.RegularExpressions": "4.3.0",
+ "System.Threading.Tasks": "4.3.0",
+ "System.Threading.Tasks.Extensions": "4.3.0"
+ }
+ },
+ "System.Xml.XDocument": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Diagnostics.Tools": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Threading": "4.3.0",
+ "System.Xml.ReaderWriter": "4.3.0"
+ }
+ },
+ "Umbraco.Cms.Core": {
+ "type": "Transitive",
+ "resolved": "10.0.0-rc1",
+ "contentHash": "kFQ/Z+q1ZJli7sYUNgQnv89VluuXWQcvLUu9X9mWA+6hk9v4pVHNzFNVTzcqSuEIMAcMtowSHZWtJqJxDA6CRA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "6.0.0",
+ "Microsoft.Extensions.FileProviders.Embedded": "6.0.4",
+ "Microsoft.Extensions.FileProviders.Physical": "6.0.0",
+ "Microsoft.Extensions.Hosting.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Identity.Core": "6.0.4",
+ "Microsoft.Extensions.Logging": "6.0.0",
+ "Microsoft.Extensions.Options": "6.0.0",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0",
+ "Microsoft.Extensions.Options.DataAnnotations": "6.0.0",
+ "System.ComponentModel.Annotations": "5.0.0",
+ "System.Reflection.Emit.Lightweight": "4.7.0",
+ "System.Runtime.Caching": "6.0.0"
+ }
+ },
+ "Umbraco.Cms.Examine.Lucene": {
+ "type": "Transitive",
+ "resolved": "10.0.0-rc1",
+ "contentHash": "oL3rnv5fFMlZtF35G9kci80n7BEeYHh/sMrYYrQju76xAt23EuZvc2WFHPkGzUx1SZxCRB/LYvjyFqbnCtd7rw==",
+ "dependencies": {
+ "Examine": "3.0.0-beta.9",
+ "Umbraco.Cms.Core": "10.0.0-rc1",
+ "Umbraco.Cms.Infrastructure": "10.0.0-rc1"
+ }
+ },
+ "Umbraco.Cms.Infrastructure": {
+ "type": "Transitive",
+ "resolved": "10.0.0-rc1",
+ "contentHash": "8fwyXkQ4TAqLILFmZOGkXxC6FO2kPaIgYAwPpBOMYuKHVcZSU83B1AKSCQNBjTT4ZHWe3EvC7xNBeD1iByvGQg==",
+ "dependencies": {
+ "Examine.Core": "3.0.0-beta.9",
+ "HtmlAgilityPack": "1.11.42",
+ "IPNetwork2": "2.5.407",
+ "MailKit": "3.2.0",
+ "Markdown": "2.2.1",
+ "Microsoft.CSharp": "4.7.0",
+ "Microsoft.CodeAnalysis.CSharp": "4.0.1",
+ "Microsoft.Extensions.Configuration.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Configuration.Json": "6.0.0",
+ "Microsoft.Extensions.DependencyInjection": "6.0.0",
+ "Microsoft.Extensions.Http": "6.0.0",
+ "Microsoft.Extensions.Identity.Stores": "6.0.4",
+ "MiniProfiler.Shared": "4.2.22",
+ "NPoco.SqlServer": "5.3.2",
+ "Newtonsoft.Json": "13.0.1",
+ "Serilog": "2.10.0",
+ "Serilog.Enrichers.Process": "2.0.2",
+ "Serilog.Enrichers.Thread": "3.1.0",
+ "Serilog.Expressions": "3.3.0",
+ "Serilog.Extensions.Hosting": "4.2.0",
+ "Serilog.Formatting.Compact": "1.1.0",
+ "Serilog.Formatting.Compact.Reader": "1.0.5",
+ "Serilog.Settings.Configuration": "3.3.0",
+ "Serilog.Sinks.Async": "1.5.0",
+ "Serilog.Sinks.File": "5.0.0",
+ "Serilog.Sinks.Map": "1.0.2",
+ "SixLabors.ImageSharp": "2.1.1",
+ "System.IO.FileSystem.AccessControl": "5.0.0",
+ "System.Text.Encodings.Web": "6.0.0",
+ "System.Threading.Tasks.Dataflow": "6.0.0",
+ "Umbraco.Cms.Core": "10.0.0-rc1",
+ "ncrontab": "3.3.1"
+ }
+ },
+ "Umbraco.Cms.PublishedCache.NuCache": {
+ "type": "Transitive",
+ "resolved": "10.0.0-rc1",
+ "contentHash": "qeOLycefK35h0cCMZqmn8p7Zq9ZvXRHhWqf5vLNJuWOPYGKFTesNF24b7Cl65N3xmbuVEISuE6rM6jnb2hx3JQ==",
+ "dependencies": {
+ "CSharpTest.Net.Collections-NetStd2": "14.906.1403.1084",
+ "K4os.Compression.LZ4": "1.2.16",
+ "MessagePack": "2.3.85",
+ "Newtonsoft.Json": "13.0.1",
+ "Umbraco.Cms.Core": "10.0.0-rc1",
+ "Umbraco.Cms.Infrastructure": "10.0.0-rc1"
+ }
+ },
+ "umbraco.storageproviders": {
+ "type": "Project",
+ "dependencies": {
+ "Umbraco.Cms.Web.Common": "10.0.0-rc1"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.StorageProviders/CdnMediaUrlProvider.cs b/src/Umbraco.StorageProviders/CdnMediaUrlProvider.cs
new file mode 100644
index 0000000..45097a1
--- /dev/null
+++ b/src/Umbraco.StorageProviders/CdnMediaUrlProvider.cs
@@ -0,0 +1,79 @@
+using System;
+using Microsoft.Extensions.Options;
+using Umbraco.Cms.Core.Configuration.Models;
+using Umbraco.Cms.Core.Hosting;
+using Umbraco.Cms.Core.Models.PublishedContent;
+using Umbraco.Cms.Core.PropertyEditors;
+using Umbraco.Cms.Core.Routing;
+
+namespace Umbraco.StorageProviders
+{
+ ///
+ /// A that returns a CDN URL for a media item.
+ ///
+ ///
+ public sealed class CdnMediaUrlProvider : DefaultMediaUrlProvider
+ {
+ private Uri _cdnUrl;
+ private bool _removeMediaFromPath;
+ private string _mediaPath;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The options.
+ /// The global settings.
+ /// The hosting environment.
+ /// The media path generators.
+ /// The URI utility.
+ /// is null.
+ /// is null.
+ /// is null.
+ public CdnMediaUrlProvider(IOptionsMonitor options, IOptionsMonitor globalSettings, IHostingEnvironment hostingEnvironment, MediaUrlGeneratorCollection mediaPathGenerators, UriUtility uriUtility)
+ : base(mediaPathGenerators, uriUtility)
+ {
+ ArgumentNullException.ThrowIfNull(options);
+ ArgumentNullException.ThrowIfNull(globalSettings);
+ ArgumentNullException.ThrowIfNull(hostingEnvironment);
+
+ _cdnUrl = options.CurrentValue.Url;
+ _removeMediaFromPath = options.CurrentValue.RemoveMediaFromPath;
+ _mediaPath = hostingEnvironment.ToAbsolute(globalSettings.CurrentValue.UmbracoMediaPath).TrimEnd('/');
+
+ options.OnChange((options, name) =>
+ {
+ if (name == Options.DefaultName)
+ {
+ _removeMediaFromPath = options.RemoveMediaFromPath;
+ _cdnUrl = options.Url;
+ }
+ });
+
+ globalSettings.OnChange((options, name) =>
+ {
+ if (name == Options.DefaultName)
+ {
+ _mediaPath = hostingEnvironment.ToAbsolute(options.UmbracoMediaPath).TrimEnd('/');
+ }
+ });
+ }
+
+ ///
+ public override UrlInfo? GetMediaUrl(IPublishedContent content, string propertyAlias, UrlMode mode, string? culture, Uri current)
+ {
+ var mediaUrl = base.GetMediaUrl(content, propertyAlias, UrlMode.Relative, culture, current);
+ if (mediaUrl?.IsUrl == true)
+ {
+ string url = mediaUrl.Text;
+ if (_removeMediaFromPath && url.StartsWith(_mediaPath, StringComparison.OrdinalIgnoreCase))
+ {
+ url = url[_mediaPath.Length..];
+ }
+
+ return UrlInfo.Url(_cdnUrl + url, culture);
+ }
+
+ return mediaUrl;
+ }
+ }
+}
diff --git a/src/Umbraco.StorageProviders.AzureBlob/CdnMediaUrlProviderOptions.cs b/src/Umbraco.StorageProviders/CdnMediaUrlProviderOptions.cs
similarity index 63%
rename from src/Umbraco.StorageProviders.AzureBlob/CdnMediaUrlProviderOptions.cs
rename to src/Umbraco.StorageProviders/CdnMediaUrlProviderOptions.cs
index cf4e596..703de01 100644
--- a/src/Umbraco.StorageProviders.AzureBlob/CdnMediaUrlProviderOptions.cs
+++ b/src/Umbraco.StorageProviders/CdnMediaUrlProviderOptions.cs
@@ -1,12 +1,12 @@
using System;
using System.ComponentModel.DataAnnotations;
-namespace Umbraco.StorageProviders.AzureBlob
+namespace Umbraco.StorageProviders
{
///
/// The CDN media URL provider options.
///
- public class CdnMediaUrlProviderOptions
+ public sealed class CdnMediaUrlProviderOptions
{
///
/// Gets or sets the CDN media root URL.
@@ -18,10 +18,10 @@ public class CdnMediaUrlProviderOptions
public Uri Url { get; set; } = null!;
///
- /// Gets or sets a value indicating whether to remove /media/ from the path, defaults to true.
+ /// Gets or sets a value indicating whether to remove the from the path, defaults to true.
///
///
- /// true if /media/ needs to be removed from the path; otherwise, false.
+ /// true if the media path needs to be removed from the path; otherwise, false.
///
public bool RemoveMediaFromPath { get; set; } = true;
}
diff --git a/src/Umbraco.StorageProviders/DependencyInjection/CdnMediaUrlProviderExtensions.cs b/src/Umbraco.StorageProviders/DependencyInjection/CdnMediaUrlProviderExtensions.cs
new file mode 100644
index 0000000..737e287
--- /dev/null
+++ b/src/Umbraco.StorageProviders/DependencyInjection/CdnMediaUrlProviderExtensions.cs
@@ -0,0 +1,86 @@
+using System;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Options;
+using Umbraco.StorageProviders;
+
+namespace Umbraco.Cms.Core.DependencyInjection
+{
+ ///
+ /// Extension methods to help registering a CDN media URL provider.
+ ///
+ public static class CdnMediaUrlProviderExtensions
+ {
+ ///
+ /// Registers and configures the .
+ ///
+ /// The .
+ ///
+ /// The .
+ ///
+ /// is null.
+ public static IUmbracoBuilder AddCdnMediaUrlProvider(this IUmbracoBuilder builder)
+ => builder.AddInternal();
+
+ ///
+ /// Registers and configures the .
+ ///
+ /// The .
+ /// An action used to configure the .
+ ///
+ /// The .
+ ///
+ /// is null.
+ public static IUmbracoBuilder AddCdnMediaUrlProvider(this IUmbracoBuilder builder, Action configure)
+ => builder.AddInternal(optionsBuilder => optionsBuilder.Configure(configure));
+
+ ///
+ /// Registers and configures the .
+ ///
+ /// The .
+ /// An action used to configure the .
+ ///
+ /// The .
+ ///
+ /// is null.
+ public static IUmbracoBuilder AddCdnMediaUrlProvider(this IUmbracoBuilder builder, Action configure)
+ => builder.AddInternal(optionsBuilder => optionsBuilder.Configure(configure));
+
+ ///
+ /// Registers and configures the .
+ ///
+ /// A dependency used by the configure action.
+ /// The .
+ /// An action used to configure the .
+ ///
+ /// The .
+ ///
+ /// is null.
+ public static IUmbracoBuilder AddCdnMediaUrlProvider(this IUmbracoBuilder builder, Action configure)
+ where TDep : class
+ => builder.AddInternal(optionsBuilder => optionsBuilder.Configure(configure));
+
+ ///
+ /// Registers and configures the .
+ ///
+ /// The .
+ /// An action used to configure the .
+ ///
+ /// The .
+ ///
+ /// is null.
+ internal static IUmbracoBuilder AddInternal(this IUmbracoBuilder builder, Action>? configure = null)
+ {
+ ArgumentNullException.ThrowIfNull(builder);
+
+ builder.MediaUrlProviders()?.Insert();
+
+ var optionsBuilder = builder.Services.AddOptions()
+ .BindConfiguration("Umbraco:Storage:Cdn")
+ .ValidateDataAnnotations();
+
+ configure?.Invoke(optionsBuilder);
+
+ return builder;
+ }
+ }
+}
diff --git a/src/Umbraco.StorageProviders/Properties/AssemblyInfo.cs b/src/Umbraco.StorageProviders/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..0e22017
--- /dev/null
+++ b/src/Umbraco.StorageProviders/Properties/AssemblyInfo.cs
@@ -0,0 +1,4 @@
+using System;
+
+// This assembly exposes types that are not CLS-compliant
+[assembly: CLSCompliant(false)]
diff --git a/src/Umbraco.StorageProviders/Umbraco.StorageProviders.csproj b/src/Umbraco.StorageProviders/Umbraco.StorageProviders.csproj
new file mode 100644
index 0000000..24edcd1
--- /dev/null
+++ b/src/Umbraco.StorageProviders/Umbraco.StorageProviders.csproj
@@ -0,0 +1,12 @@
+
+
+ net6.0
+ enable
+ All
+ true
+ Shared storage providers infrastructure for Umbraco CMS
+
+
+
+
+
diff --git a/src/Umbraco.StorageProviders/packages.lock.json b/src/Umbraco.StorageProviders/packages.lock.json
new file mode 100644
index 0000000..0ca15cf
--- /dev/null
+++ b/src/Umbraco.StorageProviders/packages.lock.json
@@ -0,0 +1,2256 @@
+{
+ "version": 1,
+ "dependencies": {
+ "net6.0": {
+ "Microsoft.SourceLink.GitHub": {
+ "type": "Direct",
+ "requested": "[1.1.1, )",
+ "resolved": "1.1.1",
+ "contentHash": "IaJGnOv/M7UQjRJks7B6p7pbPnOwisYGOIzqCz5ilGFTApZ3ktOR+6zJ12ZRPInulBmdAf1SrGdDG2MU8g6XTw==",
+ "dependencies": {
+ "Microsoft.Build.Tasks.Git": "1.1.1",
+ "Microsoft.SourceLink.Common": "1.1.1"
+ }
+ },
+ "StyleCop.Analyzers": {
+ "type": "Direct",
+ "requested": "[1.2.0-beta.435, )",
+ "resolved": "1.2.0-beta.435",
+ "contentHash": "TADk7vdGXtfTnYCV7GyleaaRTQjfoSfZXprQrVMm7cSJtJbFc1QIbWPyLvrgrfGdfHbGmUPvaN4ODKNxg2jgPQ==",
+ "dependencies": {
+ "StyleCop.Analyzers.Unstable": "1.2.0.435"
+ }
+ },
+ "Umbraco.Cms.Web.Common": {
+ "type": "Direct",
+ "requested": "[10.0.0-rc1, )",
+ "resolved": "10.0.0-rc1",
+ "contentHash": "wcV+OmlPhF0pCTZgt9r6an1Jb0iaY8q61wdu3eSBMT7QT/YMK5Noew+eURhyK4Zc9NOIzBzV7ZCHGst0ptw40g==",
+ "dependencies": {
+ "Dazinator.Extensions.FileProviders": "2.0.0",
+ "Microsoft.AspNetCore.Mvc.NewtonsoftJson": "6.0.4",
+ "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation": "6.0.4",
+ "MiniProfiler.AspNetCore.Mvc": "4.2.22",
+ "Serilog.AspNetCore": "5.0.0",
+ "SixLabors.ImageSharp.Web": "2.0.0",
+ "Smidge.InMemory": "4.0.4",
+ "Smidge.Nuglify": "4.0.4",
+ "Umbraco.Cms.Core": "10.0.0-rc1",
+ "Umbraco.Cms.Examine.Lucene": "10.0.0-rc1",
+ "Umbraco.Cms.Infrastructure": "10.0.0-rc1",
+ "Umbraco.Cms.PublishedCache.NuCache": "10.0.0-rc1"
+ }
+ },
+ "Azure.Core": {
+ "type": "Transitive",
+ "resolved": "1.6.0",
+ "contentHash": "kI4m2NsODPOrxo0OoKjk6B3ADbdovhDQIEmI4039upjjZKRaewVLx/Uz4DfRa/NtnIRZQPUALe1yvdHWAoRt4w==",
+ "dependencies": {
+ "Microsoft.Bcl.AsyncInterfaces": "1.0.0",
+ "System.Buffers": "4.5.0",
+ "System.Diagnostics.DiagnosticSource": "4.6.0",
+ "System.Memory": "4.5.3",
+ "System.Numerics.Vectors": "4.5.0",
+ "System.Text.Json": "4.6.0",
+ "System.Threading.Tasks.Extensions": "4.5.2"
+ }
+ },
+ "Azure.Identity": {
+ "type": "Transitive",
+ "resolved": "1.3.0",
+ "contentHash": "l1SYfZKOFBuUFG7C2SWHmJcrQQaiXgBdVCycx4vcZQkC6efDVt7mzZ5pfJAFEJDBUq7mjRQ0RPq9ZDGdSswqMg==",
+ "dependencies": {
+ "Azure.Core": "1.6.0",
+ "Microsoft.Identity.Client": "4.22.0",
+ "Microsoft.Identity.Client.Extensions.Msal": "2.16.5",
+ "System.Memory": "4.5.3",
+ "System.Security.Cryptography.ProtectedData": "4.5.0",
+ "System.Text.Json": "4.6.0",
+ "System.Threading.Tasks.Extensions": "4.5.2"
+ }
+ },
+ "CSharpTest.Net.Collections-NetStd2": {
+ "type": "Transitive",
+ "resolved": "14.906.1403.1084",
+ "contentHash": "g3QSH0PMiO+f2C6Za+uUvcdihnVs5IFbZ2cnKjCYA19l8en3fVe/Jl0qQS2te1xJzEOrY4ccen5/MY/QVoamcQ=="
+ },
+ "Dazinator.Extensions.FileProviders": {
+ "type": "Transitive",
+ "resolved": "2.0.0",
+ "contentHash": "Jb10uIvdGdaaOmEGUXeO1ssjp6YuvOuR87B5gLxGORFbroV1j7PDaVfEIgni7vV8KRcyAY5KvuMxgx6ADIEXNw==",
+ "dependencies": {
+ "DotNet.Glob": "3.1.0",
+ "Microsoft.AspNetCore.Hosting.Abstractions": "1.0.2",
+ "Microsoft.AspNetCore.Http.Abstractions": "1.0.2",
+ "Microsoft.Extensions.FileProviders.Abstractions": "1.0.1",
+ "NETStandard.Library": "1.6.1"
+ }
+ },
+ "DotNet.Glob": {
+ "type": "Transitive",
+ "resolved": "3.1.0",
+ "contentHash": "i6x0hDsFWg6Ke2isaNAcHQ9ChxBvTJu2cSmBY+Jtjiv2W4q6y9QlA3JKYuZqJ573TAZmpAn65Qf3sRpjvZ1gmw=="
+ },
+ "Examine": {
+ "type": "Transitive",
+ "resolved": "3.0.0-beta.9",
+ "contentHash": "BB5BwjzxKwP34EFdDQQWBQAgDjsZk61YaGQml1vR71DxdD6cA0Dk4ripUzM9Od9Zq4YWTjD/MjDsnt6qefeGoQ==",
+ "dependencies": {
+ "Examine.Core": "3.0.0-beta.9",
+ "Examine.Lucene": "3.0.0-beta.9",
+ "Microsoft.AspNetCore.DataProtection": "5.0.5",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0"
+ }
+ },
+ "Examine.Core": {
+ "type": "Transitive",
+ "resolved": "3.0.0-beta.9",
+ "contentHash": "hBk8ZCFD+Bv0NzBuHyAW5UD+V3OWoiyqf756U++819TT5wzziP4OYT34450ulIjZ40Rr9wPySWA31xkXJ1CfVQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Logging.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Options": "5.0.0"
+ }
+ },
+ "Examine.Lucene": {
+ "type": "Transitive",
+ "resolved": "3.0.0-beta.9",
+ "contentHash": "0yEd0LMtUqL9GKdDaRUu+MmDc1HKa4bUOzpEQa6fbdXHN8ITDDmrefZCWAc4OvplWO7DHi/OSS5lALqzsy91wg==",
+ "dependencies": {
+ "Examine.Core": "3.0.0-beta.9",
+ "Lucene.Net.QueryParser": "4.8.0-beta00016",
+ "Lucene.Net.Replicator": "4.8.0-beta00016",
+ "System.Threading": "4.3.0",
+ "System.Threading.AccessControl": "4.7.0"
+ }
+ },
+ "HtmlAgilityPack": {
+ "type": "Transitive",
+ "resolved": "1.11.42",
+ "contentHash": "LDc1bEfF14EY2DZzak4xvzWvbpNXK3vi1u0KQbBpLUN4+cx/VrvXhgCAMSJhSU5vz0oMfW9JZIR20vj/PkDHPA=="
+ },
+ "IPNetwork2": {
+ "type": "Transitive",
+ "resolved": "2.5.407",
+ "contentHash": "EqjBifFaKVzBCxV9aRHuOswCKj9p+E8KxCVuWni/0NIMNSa5thLf3kiQkyEZ7giHNMnT4jBgsf2kqEkmifRSPQ=="
+ },
+ "J2N": {
+ "type": "Transitive",
+ "resolved": "2.0.0",
+ "contentHash": "M5bwDajAARZiyqupU+rHQJnsVLxNBOHJ8vKYHd8LcLIb1FgLfzzcJvc31Qo5Xz/GEHFjDF9ScjKL/ks/zRTXuA=="
+ },
+ "K4os.Compression.LZ4": {
+ "type": "Transitive",
+ "resolved": "1.2.16",
+ "contentHash": "XLNQWNayxeMgd1gv0s6kZywM11kww7rTzu3nPGh8fQNblHGbFt79LC1Sk1/QQ8DIJb2Qfl2p+WlLIOWCSuyi8w=="
+ },
+ "Lucene.Net": {
+ "type": "Transitive",
+ "resolved": "4.8.0-beta00016",
+ "contentHash": "DCtUbE/NIrisNI7hRwU+UKS3Cr6S2vH1XB9wvEHHI3anu5OUpX1Fkr/PDC7oFCaol/QCvzVLbLZVizAT1aTLpA==",
+ "dependencies": {
+ "J2N": "2.0.0",
+ "Microsoft.Extensions.Configuration.Abstractions": "2.0.0"
+ }
+ },
+ "Lucene.Net.Analysis.Common": {
+ "type": "Transitive",
+ "resolved": "4.8.0-beta00016",
+ "contentHash": "7pjEAIliWdih6E3I0hCE8hKcKKRx1LLzeQBslF1fhvzE1Sal4NyHd8RFJHV1Z+yHlBw4gCyyVIDZADiIoyqwxg==",
+ "dependencies": {
+ "Lucene.Net": "4.8.0-beta00016"
+ }
+ },
+ "Lucene.Net.Facet": {
+ "type": "Transitive",
+ "resolved": "4.8.0-beta00016",
+ "contentHash": "O1MrRfhb9BMfRQHooyEFrkgNwYbTEbK/AkKhz26sy+xO+zAldJ8YKS/IsydHsE+frklIAWT0jyv0c3Dh9qBXSA==",
+ "dependencies": {
+ "Lucene.Net.Join": "4.8.0-beta00016",
+ "Lucene.Net.Queries": "4.8.0-beta00016"
+ }
+ },
+ "Lucene.Net.Grouping": {
+ "type": "Transitive",
+ "resolved": "4.8.0-beta00016",
+ "contentHash": "y7QSEYfSnz7gEJS30xHsf8P0oMIreGGO08qC+UzKre29IAoUXdLLE2+vUfByGkcPuoGMIpZVBP51P6O647grBg==",
+ "dependencies": {
+ "Lucene.Net": "4.8.0-beta00016",
+ "Lucene.Net.Queries": "4.8.0-beta00016"
+ }
+ },
+ "Lucene.Net.Join": {
+ "type": "Transitive",
+ "resolved": "4.8.0-beta00016",
+ "contentHash": "trUiWhV3QPgW4TNPrEP29AsTXE29ACR5+Vz22xjbPtFTwyXMozl95NELVG5aUVMTqdwyMhJ9Lj82QeoHDnN0jw==",
+ "dependencies": {
+ "Lucene.Net.Grouping": "4.8.0-beta00016"
+ }
+ },
+ "Lucene.Net.Queries": {
+ "type": "Transitive",
+ "resolved": "4.8.0-beta00016",
+ "contentHash": "XBzdMDlan68V2ZlhAlP8Fd+Xx2Le8ec7cEN1kFF45Sipa3Q8L/tilJfwS9VHvMTvGkwPM/yj62eGbfGBgIMR8Q==",
+ "dependencies": {
+ "Lucene.Net": "4.8.0-beta00016"
+ }
+ },
+ "Lucene.Net.QueryParser": {
+ "type": "Transitive",
+ "resolved": "4.8.0-beta00016",
+ "contentHash": "5dVvjXmzPaK8GD/eblJopTJMQmO6c6fvVPfBIOw46+jyZR+yESkUnWF1LtLoLXZQNrl4Dx8LKdes5G1QAM7eGA==",
+ "dependencies": {
+ "Lucene.Net.Analysis.Common": "4.8.0-beta00016",
+ "Lucene.Net.Queries": "4.8.0-beta00016",
+ "Lucene.Net.Sandbox": "4.8.0-beta00016"
+ }
+ },
+ "Lucene.Net.Replicator": {
+ "type": "Transitive",
+ "resolved": "4.8.0-beta00016",
+ "contentHash": "BP007m7TtHfOFNGoipn1Y3kgHir0yvDfyCW9g7P6PQIo7nNkyyHuEK9slVEkPhLq+21Q2EnnHl7jMGeh0aK2eA==",
+ "dependencies": {
+ "J2N": "2.0.0",
+ "Lucene.Net": "4.8.0-beta00016",
+ "Lucene.Net.Facet": "4.8.0-beta00016",
+ "Newtonsoft.Json": "10.0.1"
+ }
+ },
+ "Lucene.Net.Sandbox": {
+ "type": "Transitive",
+ "resolved": "4.8.0-beta00016",
+ "contentHash": "wMsRZtbNx0wvX3mtNjpOwQmKx3Ij4UGHWIYHbvnzMWlPUTgtOpYSj02REL4hOxI71WBZylpGB5EWfQ2eEld63g==",
+ "dependencies": {
+ "Lucene.Net": "4.8.0-beta00016"
+ }
+ },
+ "MailKit": {
+ "type": "Transitive",
+ "resolved": "3.2.0",
+ "contentHash": "5MTpTqmjqT7HPvYbP3HozRZMth5vSaT0ReN0iM3rAM4CgLI/R1qqtLDDNWGnFFIlcNzeJkZQRJJMkv8cgzWBbA==",
+ "dependencies": {
+ "MimeKit": "3.2.0"
+ }
+ },
+ "Markdown": {
+ "type": "Transitive",
+ "resolved": "2.2.1",
+ "contentHash": "A6veXuFP1n50RbmFNtTgfHxnHmwMsgFLSCgS1xWbg5L8n5N6HFEksTlXocZ0LsmGW4leBzeLJd+BY7+g83zFJA==",
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Text.RegularExpressions": "4.1.0"
+ }
+ },
+ "MessagePack": {
+ "type": "Transitive",
+ "resolved": "2.3.85",
+ "contentHash": "wOabnqkrXp7oeEYLY4Kd0m0eT4falJQukqvErfz5Y4FKKo9mSQQ1+rMxx9mapF2el+P0XQxiZOBKFm+oCvu0aw==",
+ "dependencies": {
+ "MessagePack.Annotations": "2.3.85"
+ }
+ },
+ "MessagePack.Annotations": {
+ "type": "Transitive",
+ "resolved": "2.3.85",
+ "contentHash": "2GCYZ9qgNS5Og0tiqfhWRhcfDZI/iRi8t07R0fNic1HthMMRfWxWOKDIBhtMA1RwZM4BuRsmJXUgk3evyisb1w=="
+ },
+ "Microsoft.AspNetCore.Cryptography.Internal": {
+ "type": "Transitive",
+ "resolved": "6.0.4",
+ "contentHash": "/0FX1OqckMmXAAlsHgBFNymTZuq4nuAOMhiwm6e8CEMi2aOjnMYwiMc7mtvpGTAO0O4C0zwx+iaChxDgvqit2A=="
+ },
+ "Microsoft.AspNetCore.Cryptography.KeyDerivation": {
+ "type": "Transitive",
+ "resolved": "6.0.4",
+ "contentHash": "1Lbwrxg/HRY/nbrkcrB3EUXUYQN8Tkw7Ktgb6/2on2P7ybT5aM59H05gk+OBC8ZTBxwdle9e1tyT3wxEYKw5xw==",
+ "dependencies": {
+ "Microsoft.AspNetCore.Cryptography.Internal": "6.0.4"
+ }
+ },
+ "Microsoft.AspNetCore.DataProtection": {
+ "type": "Transitive",
+ "resolved": "5.0.5",
+ "contentHash": "fYCIRLS3Q7eokBwzlcaKQnCBLDFXqjnyJO9lqOX0/V9zvy/JiOfvwKSkm6v5QJuNpXZywb/DnAq5Pdb3woc3MQ==",
+ "dependencies": {
+ "Microsoft.AspNetCore.Cryptography.Internal": "5.0.5",
+ "Microsoft.AspNetCore.DataProtection.Abstractions": "5.0.5",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Hosting.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Logging.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Options": "5.0.0",
+ "Microsoft.Win32.Registry": "5.0.0",
+ "System.Security.Cryptography.Xml": "5.0.0"
+ }
+ },
+ "Microsoft.AspNetCore.DataProtection.Abstractions": {
+ "type": "Transitive",
+ "resolved": "5.0.5",
+ "contentHash": "k1DgnNSBG0lf9P+QDnU+FFeLI4b4hhw4iT+iw29XkcRaCGpcPwq7mLJUtz2Yqq/FRyEwlcteTJmdWEoJb0Fxag=="
+ },
+ "Microsoft.AspNetCore.Hosting.Abstractions": {
+ "type": "Transitive",
+ "resolved": "1.0.2",
+ "contentHash": "CSVd9h1TdWDT2lt62C4FcgaF285J4O3MaOqTVvc7xP+3bFiwXcdp6qEd+u1CQrdJ+xJuslR+tvDW7vWQ/OH5Qw==",
+ "dependencies": {
+ "Microsoft.AspNetCore.Hosting.Server.Abstractions": "1.0.2",
+ "Microsoft.AspNetCore.Http.Abstractions": "1.0.2",
+ "Microsoft.Extensions.Configuration.Abstractions": "1.0.2",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.2",
+ "Microsoft.Extensions.FileProviders.Abstractions": "1.0.1",
+ "Microsoft.Extensions.Logging.Abstractions": "1.0.2"
+ }
+ },
+ "Microsoft.AspNetCore.Hosting.Server.Abstractions": {
+ "type": "Transitive",
+ "resolved": "1.0.2",
+ "contentHash": "6ZtFh0huTlrUl72u9Vic0icCVIQiEx7ULFDx3P7BpOI97wjb0GAXf8B4m9uSpSGf0vqLEKFlkPbvXF0MXXEzhw==",
+ "dependencies": {
+ "Microsoft.AspNetCore.Http.Features": "1.0.2",
+ "Microsoft.Extensions.Configuration.Abstractions": "1.0.2"
+ }
+ },
+ "Microsoft.AspNetCore.Http.Abstractions": {
+ "type": "Transitive",
+ "resolved": "1.0.2",
+ "contentHash": "peJqc7BgYwhTzOIfFHX3/esV6iOXf17Afekh6mCYuUD3aWyaBwQuWYaKLR+RnjBEWaSzpCDgfCMMp5Y3LUXsiA==",
+ "dependencies": {
+ "Microsoft.AspNetCore.Http.Features": "1.0.2",
+ "System.Globalization.Extensions": "4.0.1",
+ "System.Linq.Expressions": "4.1.1",
+ "System.Reflection.TypeExtensions": "4.1.0",
+ "System.Runtime.InteropServices": "4.1.0",
+ "System.Text.Encodings.Web": "4.0.0"
+ }
+ },
+ "Microsoft.AspNetCore.Http.Features": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "6sVnhFwtsjEVL09FsYpAttQ3Og6Jxg1dQFLF9XQUThi1myq64imjhj1swd92TXMLCp5wmt8szDixZXXdx64qhg==",
+ "dependencies": {
+ "Microsoft.Extensions.Primitives": "5.0.0",
+ "System.IO.Pipelines": "5.0.0"
+ }
+ },
+ "Microsoft.AspNetCore.JsonPatch": {
+ "type": "Transitive",
+ "resolved": "6.0.4",
+ "contentHash": "BDI7P53vCNqB35poKWUUeUZxr46/g/h6CyHYrU2byICC1/oGdX7iZ2naG3X8VeZcmdC1YBkbXb5LXLtutHSq1Q==",
+ "dependencies": {
+ "Microsoft.CSharp": "4.7.0",
+ "Newtonsoft.Json": "13.0.1"
+ }
+ },
+ "Microsoft.AspNetCore.Mvc.NewtonsoftJson": {
+ "type": "Transitive",
+ "resolved": "6.0.4",
+ "contentHash": "RQGy4kX3dkvcz0v84+sl6xmOYhpA3CFgylNiAPFxi36JLp4uU5SEvbbLo6u+d4tHbyGkaLe8RzKLJmnRdckZ9A==",
+ "dependencies": {
+ "Microsoft.AspNetCore.JsonPatch": "6.0.4",
+ "Newtonsoft.Json": "13.0.1",
+ "Newtonsoft.Json.Bson": "1.0.2"
+ }
+ },
+ "Microsoft.AspNetCore.Mvc.Razor.Extensions": {
+ "type": "Transitive",
+ "resolved": "6.0.4",
+ "contentHash": "LNHMPXJkxoqAJrDTHHNekUstkJVxBqu3eJcu3lSjH3iPQw38hBzWPFUieP4MgC31C3ssabULaD2PB1WeOl058Q==",
+ "dependencies": {
+ "Microsoft.AspNetCore.Razor.Language": "6.0.4",
+ "Microsoft.CodeAnalysis.Razor": "6.0.4"
+ }
+ },
+ "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation": {
+ "type": "Transitive",
+ "resolved": "6.0.4",
+ "contentHash": "9fd1xCNfJbuJPinj0o98IpjUsCeuyvGke7sfkagaN5nxhyfr1qYYcGO0Irf/0gNcUWVZHAu3e7XY6iXIhHs/Yw==",
+ "dependencies": {
+ "Microsoft.AspNetCore.Mvc.Razor.Extensions": "6.0.4",
+ "Microsoft.CodeAnalysis.Razor": "6.0.4",
+ "Microsoft.Extensions.DependencyModel": "6.0.0"
+ }
+ },
+ "Microsoft.AspNetCore.Razor.Language": {
+ "type": "Transitive",
+ "resolved": "6.0.4",
+ "contentHash": "pUBOF/SNk4/6eoK5M75cfqdQwZdlKRNGjzidO6MIuqnsgFIN5qiC7POYImgWv++0yoGyOpdNjnAHBQua7mLXVQ=="
+ },
+ "Microsoft.Bcl.AsyncInterfaces": {
+ "type": "Transitive",
+ "resolved": "1.0.0",
+ "contentHash": "K63Y4hORbBcKLWH5wnKgzyn7TOfYzevIEwIedQHBIkmkEBA9SCqgvom+XTuE+fAFGvINGkhFItaZ2dvMGdT5iw=="
+ },
+ "Microsoft.Build.Tasks.Git": {
+ "type": "Transitive",
+ "resolved": "1.1.1",
+ "contentHash": "AT3HlgTjsqHnWpBHSNeR0KxbLZD7bztlZVj7I8vgeYG9SYqbeFGh0TM/KVtC6fg53nrWHl3VfZFvb5BiQFcY6Q=="
+ },
+ "Microsoft.CodeAnalysis.Analyzers": {
+ "type": "Transitive",
+ "resolved": "3.3.2",
+ "contentHash": "7xt6zTlIEizUgEsYAIgm37EbdkiMmr6fP6J9pDoKEpiGM4pi32BCPGr/IczmSJI9Zzp0a6HOzpr9OvpMP+2veA=="
+ },
+ "Microsoft.CodeAnalysis.Common": {
+ "type": "Transitive",
+ "resolved": "4.0.1",
+ "contentHash": "SMREwaVD5SzatlWhh9aahQAtSWdb63NcE//f+bQzgHSECU6xtDtaxk0kwV+asdFfr6HtW38UeO6jvqdfzudg3w==",
+ "dependencies": {
+ "Microsoft.CodeAnalysis.Analyzers": "3.3.2",
+ "System.Collections.Immutable": "5.0.0",
+ "System.Memory": "4.5.4",
+ "System.Reflection.Metadata": "5.0.0",
+ "System.Runtime.CompilerServices.Unsafe": "5.0.0",
+ "System.Text.Encoding.CodePages": "4.5.1",
+ "System.Threading.Tasks.Extensions": "4.5.4"
+ }
+ },
+ "Microsoft.CodeAnalysis.CSharp": {
+ "type": "Transitive",
+ "resolved": "4.0.1",
+ "contentHash": "Q9RxxydPpUElj/x1/qykDTUGsRoKbJG8H5XUSeMGmMu54fBiuX1xyanom9caa1oQfh5JIW1BgLxobSaWs4WyHQ==",
+ "dependencies": {
+ "Microsoft.CodeAnalysis.Common": "[4.0.1]"
+ }
+ },
+ "Microsoft.CodeAnalysis.Razor": {
+ "type": "Transitive",
+ "resolved": "6.0.4",
+ "contentHash": "OO9M3idcJCCjXOnShNyGTZkP2dofRlRqDNhSmA1boJtW1MSXMWwpyj3Z8DXVP0BLkMXqFQ0zFMEVMX5Eys57jw==",
+ "dependencies": {
+ "Microsoft.AspNetCore.Razor.Language": "6.0.4",
+ "Microsoft.CodeAnalysis.CSharp": "4.0.0",
+ "Microsoft.CodeAnalysis.Common": "4.0.0"
+ }
+ },
+ "Microsoft.CSharp": {
+ "type": "Transitive",
+ "resolved": "4.7.0",
+ "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA=="
+ },
+ "Microsoft.Data.SqlClient": {
+ "type": "Transitive",
+ "resolved": "3.0.0",
+ "contentHash": "MUauWfCLsZQQMUR/wZhec5MH6+NTPmPp9i/OsjIMmIu2ICYUGOVm1x7RTqKxq19UWxXMSG03/O0FyXQJrpDs9A==",
+ "dependencies": {
+ "Azure.Identity": "1.3.0",
+ "Microsoft.Data.SqlClient.SNI.runtime": "3.0.0",
+ "Microsoft.Identity.Client": "4.22.0",
+ "Microsoft.IdentityModel.JsonWebTokens": "6.8.0",
+ "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.8.0",
+ "Microsoft.Win32.Registry": "4.7.0",
+ "System.Configuration.ConfigurationManager": "4.7.0",
+ "System.Diagnostics.DiagnosticSource": "4.7.0",
+ "System.Runtime.Caching": "4.7.0",
+ "System.Security.Principal.Windows": "4.7.0",
+ "System.Text.Encoding.CodePages": "4.7.0",
+ "System.Text.Encodings.Web": "4.7.2"
+ }
+ },
+ "Microsoft.Data.SqlClient.SNI.runtime": {
+ "type": "Transitive",
+ "resolved": "3.0.0",
+ "contentHash": "n1sNyjJgu2pYWKgw3ZPikw3NiRvG4kt7Ya5MK8u77Rgj/1bTFqO/eDF4k5W9H5GXplMZCpKkNbp5kNBICgSB0w=="
+ },
+ "Microsoft.Extensions.Caching.Abstractions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "bcz5sSFJbganH0+YrfvIjJDIcKNW7TL07C4d1eTmXy/wOt52iz4LVogJb6pazs7W0+74j0YpXFErvp++Aq5Bsw==",
+ "dependencies": {
+ "Microsoft.Extensions.Primitives": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "tq2wXyh3fL17EMF2bXgRhU7JrbO3on93MRKYxzz4JzzvuGSA1l0W3GI9/tl8EO89TH+KWEymP7bcFway6z9fXg==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Primitives": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.Abstractions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Primitives": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.Binder": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.FileExtensions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "V4Dth2cYMZpw3HhGw9XUDIijpI6gN+22LDt0AhufIgOppCUfpWX4483OmN+dFXRJkJLc8Tv0Q8QK+1ingT2+KQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "6.0.0",
+ "Microsoft.Extensions.Configuration.Abstractions": "6.0.0",
+ "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0",
+ "Microsoft.Extensions.FileProviders.Physical": "6.0.0",
+ "Microsoft.Extensions.Primitives": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.Json": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "GJGery6QytCzS/BxJ96klgG9in3uH26KcUBbiVG/coNDXCRq6LGVVlUT4vXq34KPuM+R2av+LeYdX9h4IZOCUg==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "6.0.0",
+ "Microsoft.Extensions.Configuration.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0",
+ "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0",
+ "System.Text.Json": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.DependencyInjection": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "k6PWQMuoBDGGHOQTtyois2u4AwyVcIwL2LaSLlTZQm2CYcJ1pxbt6jfAnpWmzENA/wfrYRI/X9DTLoUkE4AsLw==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0",
+ "System.Runtime.CompilerServices.Unsafe": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.DependencyInjection.Abstractions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg=="
+ },
+ "Microsoft.Extensions.DependencyModel": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "TD5QHg98m3+QhgEV1YVoNMl5KtBw/4rjfxLHO0e/YV9bPUBDKntApP4xdrVtGgCeQZHVfC2EXIGsdpRNrr87Pg==",
+ "dependencies": {
+ "System.Buffers": "4.5.1",
+ "System.Memory": "4.5.4",
+ "System.Runtime.CompilerServices.Unsafe": "6.0.0",
+ "System.Text.Encodings.Web": "6.0.0",
+ "System.Text.Json": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.FileProviders.Abstractions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==",
+ "dependencies": {
+ "Microsoft.Extensions.Primitives": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.FileProviders.Composite": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "0IoXXfkgKpYJB1t2lC0jPXAxuaywRNc9y2Mq96ZZNKBthL38vusa2UK73+Bm6Kq/9a5xNHJS6NhsSN+i5TEtkA==",
+ "dependencies": {
+ "Microsoft.Extensions.FileProviders.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Primitives": "5.0.0"
+ }
+ },
+ "Microsoft.Extensions.FileProviders.Embedded": {
+ "type": "Transitive",
+ "resolved": "6.0.4",
+ "contentHash": "Ydzdq2WxGzKpQUUD4CxEDU+m2HPxR573IrQMk3pzsf3QCg5X06Td1hFRuK8+Tv0xZaLup71yQnbKN2AvNTjAYQ==",
+ "dependencies": {
+ "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.FileProviders.Physical": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "QvkL7l0nM8udt3gfyu0Vw8bbCXblxaKOl7c2oBfgGy4LCURRaL9XWZX1FWJrQc43oMokVneVxH38iz+bY1sbhg==",
+ "dependencies": {
+ "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0",
+ "Microsoft.Extensions.FileSystemGlobbing": "6.0.0",
+ "Microsoft.Extensions.Primitives": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.FileSystemGlobbing": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw=="
+ },
+ "Microsoft.Extensions.Hosting.Abstractions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "6.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0",
+ "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.Http": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "15+pa2G0bAMHbHewaQIdr/y6ag2H3yh4rd9hTXavtWDzQBkvpe2RMqFg8BxDpcQWssmjmBApGPcw93QRz6YcMg==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Logging": "6.0.0",
+ "Microsoft.Extensions.Logging.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Options": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.Identity.Core": {
+ "type": "Transitive",
+ "resolved": "6.0.4",
+ "contentHash": "8vBsyGkA8ZI3lZvm1nf+9ynRC/TzPD+UtbdgTlKk+cz+AW5I41LrK8f/adGej5uXgprOA2DMjZw33vZG6vyXxA==",
+ "dependencies": {
+ "Microsoft.AspNetCore.Cryptography.KeyDerivation": "6.0.4",
+ "Microsoft.Extensions.Logging": "6.0.0",
+ "Microsoft.Extensions.Options": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.Identity.Stores": {
+ "type": "Transitive",
+ "resolved": "6.0.4",
+ "contentHash": "linRCnWBfnqg8qjrd9u/KMISy8O4a6X/GRhpHXU0ar654YQw9LJ/Ht+psx8QLqSX5EsCBbBCZzuamatH2FWIyQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Caching.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Identity.Core": "6.0.4",
+ "Microsoft.Extensions.Logging": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.Logging": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection": "6.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Logging.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Options": "6.0.0",
+ "System.Diagnostics.DiagnosticSource": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.Logging.Abstractions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "/HggWBbTwy8TgebGSX5DBZ24ndhzi93sHUBDvP1IxbZD7FDokYzdAr6+vbWGjw2XAfR2EJ1sfKUotpjHnFWPxA=="
+ },
+ "Microsoft.Extensions.Options": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Primitives": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.Options.ConfigurationExtensions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "bXWINbTn0vC0FYc9GaQTISbxhQLAMrvtbuvD9N6JelEaIS/Pr62wUCinrq5bf1WRBGczt1v4wDhxFtVFNcMdUQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Configuration.Binder": "6.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Options": "6.0.0",
+ "Microsoft.Extensions.Primitives": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.Options.DataAnnotations": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "Fvs4plZYQT/iF/JsYwP/pppQRvQC211enBjCoIu/355M+aunlzSyzN/n3wPibyY76794MFLkLVT47JCBc3porg==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Options": "6.0.0",
+ "System.ComponentModel.Annotations": "5.0.0"
+ }
+ },
+ "Microsoft.Extensions.Primitives": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==",
+ "dependencies": {
+ "System.Runtime.CompilerServices.Unsafe": "6.0.0"
+ }
+ },
+ "Microsoft.Identity.Client": {
+ "type": "Transitive",
+ "resolved": "4.22.0",
+ "contentHash": "GlamU9rs8cSVIx9WSGv5QKpt66KkE+ImxNa/wNZZUJ3knt3PM98T9sOY8B7NcEfhw7NoxU2/0TSOcmnRSJQgqw=="
+ },
+ "Microsoft.Identity.Client.Extensions.Msal": {
+ "type": "Transitive",
+ "resolved": "2.16.5",
+ "contentHash": "VlGUZEpF8KP/GCfFI59sdE0WA0o9quqwM1YQY0dSp6jpGy5EOBkureaybLfpwCuYUUjQbLkN2p7neUIcQCfbzA==",
+ "dependencies": {
+ "Microsoft.Identity.Client": "4.22.0",
+ "System.Security.Cryptography.ProtectedData": "4.5.0"
+ }
+ },
+ "Microsoft.IdentityModel.JsonWebTokens": {
+ "type": "Transitive",
+ "resolved": "6.8.0",
+ "contentHash": "+7JIww64PkMt7NWFxoe4Y/joeF7TAtA/fQ0b2GFGcagzB59sKkTt/sMZWR6aSZht5YC7SdHi3W6yM1yylRGJCQ==",
+ "dependencies": {
+ "Microsoft.IdentityModel.Tokens": "6.8.0"
+ }
+ },
+ "Microsoft.IdentityModel.Logging": {
+ "type": "Transitive",
+ "resolved": "6.8.0",
+ "contentHash": "Rfh/p4MaN4gkmhPxwbu8IjrmoDncGfHHPh1sTnc0AcM/Oc39/fzC9doKNWvUAjzFb8LqA6lgZyblTrIsX/wDXg=="
+ },
+ "Microsoft.IdentityModel.Protocols": {
+ "type": "Transitive",
+ "resolved": "6.8.0",
+ "contentHash": "OJZx5nPdiH+MEkwCkbJrTAUiO/YzLe0VSswNlDxJsJD9bhOIdXHufh650pfm59YH1DNevp3/bXzukKrG57gA1w==",
+ "dependencies": {
+ "Microsoft.IdentityModel.Logging": "6.8.0",
+ "Microsoft.IdentityModel.Tokens": "6.8.0"
+ }
+ },
+ "Microsoft.IdentityModel.Protocols.OpenIdConnect": {
+ "type": "Transitive",
+ "resolved": "6.8.0",
+ "contentHash": "X/PiV5l3nYYsodtrNMrNQIVlDmHpjQQ5w48E+o/D5H4es2+4niEyQf3l03chvZGWNzBRhfSstaXr25/Ye4AeYw==",
+ "dependencies": {
+ "Microsoft.IdentityModel.Protocols": "6.8.0",
+ "System.IdentityModel.Tokens.Jwt": "6.8.0"
+ }
+ },
+ "Microsoft.IdentityModel.Tokens": {
+ "type": "Transitive",
+ "resolved": "6.8.0",
+ "contentHash": "gTqzsGcmD13HgtNePPcuVHZ/NXWmyV+InJgalW/FhWpII1D7V1k0obIseGlWMeA4G+tZfeGMfXr0klnWbMR/mQ==",
+ "dependencies": {
+ "Microsoft.CSharp": "4.5.0",
+ "Microsoft.IdentityModel.Logging": "6.8.0",
+ "System.Security.Cryptography.Cng": "4.5.0"
+ }
+ },
+ "Microsoft.IO.RecyclableMemoryStream": {
+ "type": "Transitive",
+ "resolved": "2.2.0",
+ "contentHash": "uyjY/cqomw1irT4L7lDeg4sJ36MsjHg3wKqpGrBAdzvZaxo85yMF+sAA9RIzTV92fDxuUzjqksMqA0+SNMkMgA=="
+ },
+ "Microsoft.NETCore.Platforms": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ=="
+ },
+ "Microsoft.NETCore.Targets": {
+ "type": "Transitive",
+ "resolved": "1.1.0",
+ "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg=="
+ },
+ "Microsoft.SourceLink.Common": {
+ "type": "Transitive",
+ "resolved": "1.1.1",
+ "contentHash": "WMcGpWKrmJmzrNeuaEb23bEMnbtR/vLmvZtkAP5qWu7vQsY59GqfRJd65sFpBszbd2k/bQ8cs8eWawQKAabkVg=="
+ },
+ "Microsoft.Win32.Primitives": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "Microsoft.Win32.Registry": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==",
+ "dependencies": {
+ "System.Security.AccessControl": "5.0.0",
+ "System.Security.Principal.Windows": "5.0.0"
+ }
+ },
+ "Microsoft.Win32.SystemEvents": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "hqTM5628jSsQiv+HGpiq3WKBl2c8v1KZfby2J6Pr7pEPlK9waPdgEO6b8A/+/xn/yZ9ulv8HuqK71ONy2tg67A=="
+ },
+ "MimeKit": {
+ "type": "Transitive",
+ "resolved": "3.2.0",
+ "contentHash": "l9YHMBhBUwY7qQHUp8fw0EvjcbmhN4Iggz6MdjqIShBf42+0nJTa5gu0kuupCOPuiARc9ZaS9c9f0gKz4OnxKw==",
+ "dependencies": {
+ "Portable.BouncyCastle": "1.9.0",
+ "System.Security.Cryptography.Pkcs": "6.0.0"
+ }
+ },
+ "MiniProfiler.AspNetCore": {
+ "type": "Transitive",
+ "resolved": "4.2.22",
+ "contentHash": "bBirB5d4Q0Bgx05Zg4yzXSmOHZQV4ZJhmxU3DGya4FZxNBwjaVHchqEKY0MJW5XLZo8axMAQm4yywgCvUlTymA==",
+ "dependencies": {
+ "MiniProfiler.Shared": "4.2.22",
+ "System.Text.Json": "4.6.0"
+ }
+ },
+ "MiniProfiler.AspNetCore.Mvc": {
+ "type": "Transitive",
+ "resolved": "4.2.22",
+ "contentHash": "nzCEaZnh77U9jw+c/qu4CtwYUpHEf+FH1ZMbYKMzIXr8CNNPlypSR6AJEAwjo3bq9TIJIpBMZIaK3inRLUCg4g==",
+ "dependencies": {
+ "MiniProfiler.AspNetCore": "4.2.22"
+ }
+ },
+ "MiniProfiler.Shared": {
+ "type": "Transitive",
+ "resolved": "4.2.22",
+ "contentHash": "OOA99Iu7FjFrdYaADcWL78KK9Kq6M+hfnZac5577aSrx0UYOM2apKlhBPKzoPtGPTRtQNKe4RK00u/FmahcU3g==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "2.0.0",
+ "Newtonsoft.Json": "10.0.3",
+ "System.ComponentModel.Primitives": "4.3.0",
+ "System.Data.Common": "4.3.0",
+ "System.Diagnostics.DiagnosticSource": "4.4.1",
+ "System.Diagnostics.StackTrace": "4.3.0",
+ "System.Dynamic.Runtime": "4.3.0",
+ "System.Reflection.Emit.Lightweight": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.Serialization.Primitives": "4.3.0",
+ "System.Threading.Tasks.Parallel": "4.3.0"
+ }
+ },
+ "NCrontab": {
+ "type": "Transitive",
+ "resolved": "3.3.1",
+ "contentHash": "G3tzcIIgsiyZyVbHNPyn5+adaM9UjeVNgjrRsvXU7wo2sMhpvpQrir29dcjIND53H/fuTdgg9nI3SfFFg7barA=="
+ },
+ "NETStandard.Library": {
+ "type": "Transitive",
+ "resolved": "1.6.1",
+ "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.Win32.Primitives": "4.3.0",
+ "System.AppContext": "4.3.0",
+ "System.Collections": "4.3.0",
+ "System.Collections.Concurrent": "4.3.0",
+ "System.Console": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Diagnostics.Tools": "4.3.0",
+ "System.Diagnostics.Tracing": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.Globalization.Calendars": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.IO.Compression": "4.3.0",
+ "System.IO.Compression.ZipFile": "4.3.0",
+ "System.IO.FileSystem": "4.3.0",
+ "System.IO.FileSystem.Primitives": "4.3.0",
+ "System.Linq": "4.3.0",
+ "System.Linq.Expressions": "4.3.0",
+ "System.Net.Http": "4.3.0",
+ "System.Net.Primitives": "4.3.0",
+ "System.Net.Sockets": "4.3.0",
+ "System.ObjectModel": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Reflection.Extensions": "4.3.0",
+ "System.Reflection.Primitives": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.Handles": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Runtime.InteropServices.RuntimeInformation": "4.3.0",
+ "System.Runtime.Numerics": "4.3.0",
+ "System.Security.Cryptography.Algorithms": "4.3.0",
+ "System.Security.Cryptography.Encoding": "4.3.0",
+ "System.Security.Cryptography.Primitives": "4.3.0",
+ "System.Security.Cryptography.X509Certificates": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Text.Encoding.Extensions": "4.3.0",
+ "System.Text.RegularExpressions": "4.3.0",
+ "System.Threading": "4.3.0",
+ "System.Threading.Tasks": "4.3.0",
+ "System.Threading.Timer": "4.3.0",
+ "System.Xml.ReaderWriter": "4.3.0",
+ "System.Xml.XDocument": "4.3.0"
+ }
+ },
+ "Newtonsoft.Json": {
+ "type": "Transitive",
+ "resolved": "13.0.1",
+ "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A=="
+ },
+ "Newtonsoft.Json.Bson": {
+ "type": "Transitive",
+ "resolved": "1.0.2",
+ "contentHash": "QYFyxhaABwmq3p/21VrZNYvCg3DaEoN/wUuw5nmfAf0X3HLjgupwhkEWdgfb9nvGAUIv3osmZoD3kKl4jxEmYQ==",
+ "dependencies": {
+ "Newtonsoft.Json": "12.0.1"
+ }
+ },
+ "NPoco": {
+ "type": "Transitive",
+ "resolved": "5.3.2",
+ "contentHash": "3eVBjurbeWT3hSC0/o7wMc+DBPOGMOL4H0boSPn/8URC/9ebzUkB+VDzWLqlQPXFLlFVjCcgh4pK/FhXoJ74yQ==",
+ "dependencies": {
+ "System.Linq.Async": "5.0.0",
+ "System.Reflection.Emit.Lightweight": "4.7.0"
+ }
+ },
+ "NPoco.SqlServer": {
+ "type": "Transitive",
+ "resolved": "5.3.2",
+ "contentHash": "6lkQHcgvDgSfIq0oga7W91QpRU1Mdmm6NgqcT8mgOOyY92ftQaacAZgzMTl8CfhgMYsg0/xzRgqIGq37CnLTxg==",
+ "dependencies": {
+ "Microsoft.Data.SqlClient": "3.0.0",
+ "NPoco": "5.3.2",
+ "Polly": "7.2.2"
+ }
+ },
+ "NUglify": {
+ "type": "Transitive",
+ "resolved": "1.13.12",
+ "contentHash": "+13YE9UjnXx4+NKP+j1Axiz/QAMtK++ZtG61u9iiR2/WzPzr7EfBDOwj+xHNyTEMS9Emq/mCyWaBGjCABhC0HQ=="
+ },
+ "Polly": {
+ "type": "Transitive",
+ "resolved": "7.2.2",
+ "contentHash": "E6CeKyS513j7taKAq4q2MESDBvzuzWnR1rQ2Y2zqJvpiVtKMm699Aubb20MUPBDmb0Ov8PmcLHTCVFdCjoy2kA=="
+ },
+ "Portable.BouncyCastle": {
+ "type": "Transitive",
+ "resolved": "1.9.0",
+ "contentHash": "eZZBCABzVOek+id9Xy04HhmgykF0wZg9wpByzrWN7q8qEI0Qen9b7tfd7w8VA3dOeesumMG7C5ZPy0jk7PSRHw=="
+ },
+ "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q=="
+ },
+ "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA=="
+ },
+ "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw=="
+ },
+ "runtime.native.System": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0"
+ }
+ },
+ "runtime.native.System.IO.Compression": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0"
+ }
+ },
+ "runtime.native.System.Net.Http": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0"
+ }
+ },
+ "runtime.native.System.Security.Cryptography.Apple": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==",
+ "dependencies": {
+ "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0"
+ }
+ },
+ "runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==",
+ "dependencies": {
+ "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0",
+ "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0",
+ "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0",
+ "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0",
+ "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0",
+ "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0",
+ "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0",
+ "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0",
+ "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0",
+ "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
+ }
+ },
+ "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A=="
+ },
+ "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ=="
+ },
+ "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ=="
+ },
+ "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g=="
+ },
+ "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg=="
+ },
+ "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ=="
+ },
+ "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A=="
+ },
+ "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg=="
+ },
+ "Serilog": {
+ "type": "Transitive",
+ "resolved": "2.10.0",
+ "contentHash": "+QX0hmf37a0/OZLxM3wL7V6/ADvC1XihXN4Kq/p6d8lCPfgkRdiuhbWlMaFjR9Av0dy5F0+MBeDmDdRZN/YwQA=="
+ },
+ "Serilog.AspNetCore": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "/JO/txIxRR61x1UXQAgUzG2Sx05o1QHCkokVBWrKzmAoDu+p5EtCAj7L/TVVg7Ezhh3GPiZ0JI9OJCmRO9tSRw==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection": "5.0.0",
+ "Microsoft.Extensions.Logging": "5.0.0",
+ "Serilog": "2.10.0",
+ "Serilog.Extensions.Hosting": "4.2.0",
+ "Serilog.Formatting.Compact": "1.1.0",
+ "Serilog.Settings.Configuration": "3.3.0",
+ "Serilog.Sinks.Console": "4.0.1",
+ "Serilog.Sinks.Debug": "2.0.0",
+ "Serilog.Sinks.File": "5.0.0"
+ }
+ },
+ "Serilog.Enrichers.Process": {
+ "type": "Transitive",
+ "resolved": "2.0.2",
+ "contentHash": "T9EjKKLsL6qC/3eOLUAKEPBLEqPDmt5BLXaQdPMaxJzuex+MeXA8DuAiPboUaftp3kbnCN4ZgZpDvs+Fa7OHuw==",
+ "dependencies": {
+ "Serilog": "2.3.0"
+ }
+ },
+ "Serilog.Enrichers.Thread": {
+ "type": "Transitive",
+ "resolved": "3.1.0",
+ "contentHash": "85lWsGRJpRxvKT6j/H67no55SUBsBIvp556TKuBTGhjtoPeq+L7j/sDWbgAtvT0p7u7/phJyX6j35PQ4Vtqw0g==",
+ "dependencies": {
+ "Serilog": "2.3.0"
+ }
+ },
+ "Serilog.Expressions": {
+ "type": "Transitive",
+ "resolved": "3.3.0",
+ "contentHash": "wKFAcFSdukSwVYK4LPhcWpY8YmEVTSGqmi3bjagHNw+9wdCseREqGdsYBBTWtkYcugwSHv3F9dtwuFKUM9T2BA==",
+ "dependencies": {
+ "Serilog": "2.10.0"
+ }
+ },
+ "Serilog.Extensions.Hosting": {
+ "type": "Transitive",
+ "resolved": "4.2.0",
+ "contentHash": "gT2keceCmPQR9EX0VpXQZvUgELdfE7yqJ7MOxBhm3WLCblcvRgswEOOTgok/DHObbM15A3V/DtF3VdVDQPIZzQ==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.8",
+ "Microsoft.Extensions.Hosting.Abstractions": "3.1.8",
+ "Microsoft.Extensions.Logging.Abstractions": "3.1.8",
+ "Serilog": "2.10.0",
+ "Serilog.Extensions.Logging": "3.1.0"
+ }
+ },
+ "Serilog.Extensions.Logging": {
+ "type": "Transitive",
+ "resolved": "3.1.0",
+ "contentHash": "IWfem7wfrFbB3iw1OikqPFNPEzfayvDuN4WP7Ue1AVFskalMByeWk3QbtUXQR34SBkv1EbZ3AySHda/ErDgpcg==",
+ "dependencies": {
+ "Microsoft.Extensions.Logging": "2.0.0",
+ "Serilog": "2.9.0"
+ }
+ },
+ "Serilog.Formatting.Compact": {
+ "type": "Transitive",
+ "resolved": "1.1.0",
+ "contentHash": "pNroKVjo+rDqlxNG5PXkRLpfSCuDOBY0ri6jp9PLe505ljqwhwZz8ospy2vWhQlFu5GkIesh3FcDs4n7sWZODA==",
+ "dependencies": {
+ "Serilog": "2.8.0"
+ }
+ },
+ "Serilog.Formatting.Compact.Reader": {
+ "type": "Transitive",
+ "resolved": "1.0.5",
+ "contentHash": "PPqEBHc9YMtXBiEAxD4qd5oqsavmr1jzdjKC9ky50Ipf/qnSp2D2l/ZggSxZUW7jfCbJStxgwKYGsH0Bnk4BIw==",
+ "dependencies": {
+ "Newtonsoft.Json": "9.0.1",
+ "Serilog": "2.3.0"
+ }
+ },
+ "Serilog.Settings.Configuration": {
+ "type": "Transitive",
+ "resolved": "3.3.0",
+ "contentHash": "7GNudISZwqaT902hqEL2OFGTZeUFWfnrNLupJkOqeF41AR3GjcxX+Hwb30xb8gG2/CDXsCMVfF8o0+8KY0fJNg==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyModel": "3.0.0",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "2.0.0",
+ "Serilog": "2.10.0"
+ }
+ },
+ "Serilog.Sinks.Async": {
+ "type": "Transitive",
+ "resolved": "1.5.0",
+ "contentHash": "csHYIqAwI4Gy9oAhXYRwxGrQEAtBg3Ep7WaCzsnA1cZuBZjVAU0n7hWaJhItjO7hbLHh/9gRVxALCUB4Dv+gZw==",
+ "dependencies": {
+ "Serilog": "2.9.0"
+ }
+ },
+ "Serilog.Sinks.Console": {
+ "type": "Transitive",
+ "resolved": "4.0.1",
+ "contentHash": "apLOvSJQLlIbKlbx+Y2UDHSP05kJsV7mou+fvJoRGs/iR+jC22r8cuFVMjjfVxz/AD4B2UCltFhE1naRLXwKNw==",
+ "dependencies": {
+ "Serilog": "2.10.0"
+ }
+ },
+ "Serilog.Sinks.Debug": {
+ "type": "Transitive",
+ "resolved": "2.0.0",
+ "contentHash": "Y6g3OBJ4JzTyyw16fDqtFcQ41qQAydnEvEqmXjhwhgjsnG/FaJ8GUqF5ldsC/bVkK8KYmqrPhDO+tm4dF6xx4A==",
+ "dependencies": {
+ "Serilog": "2.10.0"
+ }
+ },
+ "Serilog.Sinks.File": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "uwV5hdhWPwUH1szhO8PJpFiahqXmzPzJT/sOijH/kFgUx+cyoDTMM8MHD0adw9+Iem6itoibbUXHYslzXsLEAg==",
+ "dependencies": {
+ "Serilog": "2.10.0"
+ }
+ },
+ "Serilog.Sinks.Map": {
+ "type": "Transitive",
+ "resolved": "1.0.2",
+ "contentHash": "JbPBAeD5hxUQw8TZg3FlOnqVsSu1269nvqFm5DQ7hc+AmsB+hItl+zMSDphMbPJXjL8KdpMRSWNkGi7zTKRmCA==",
+ "dependencies": {
+ "Serilog": "2.8.0"
+ }
+ },
+ "SixLabors.ImageSharp": {
+ "type": "Transitive",
+ "resolved": "2.1.1",
+ "contentHash": "oNHMT8+yUR9dyuU2r7fwsXvvS4OnfCs9N5i2y2p9iBxp3nvEZbe/hZWrOGfD7MX2lxOAlWzlhzj0q2uFwP8avg==",
+ "dependencies": {
+ "System.Runtime.CompilerServices.Unsafe": "5.0.0",
+ "System.Text.Encoding.CodePages": "5.0.0"
+ }
+ },
+ "SixLabors.ImageSharp.Web": {
+ "type": "Transitive",
+ "resolved": "2.0.0",
+ "contentHash": "4sTDmj38Ab/HOHituh9ks1q1MTuX6leBtbDOe9RJ5zyiWHXDn79BWdJ8fTYzFAsAl0KeOh4Gh0RNRftnYmABZg==",
+ "dependencies": {
+ "Microsoft.IO.RecyclableMemoryStream": "2.2.0",
+ "SixLabors.ImageSharp": "2.1.1"
+ }
+ },
+ "Smidge": {
+ "type": "Transitive",
+ "resolved": "4.0.4",
+ "contentHash": "o1Y1xLzQBdxhajMP3trhfRHwYnElZpAWfWPAaCCbpKd2sQqwX/J4KtxLnQdASo98pQVzWDKW3d7Dt0v5/NU/6g==",
+ "dependencies": {
+ "Smidge.Core": "4.0.4"
+ }
+ },
+ "Smidge.Core": {
+ "type": "Transitive",
+ "resolved": "4.0.4",
+ "contentHash": "JFYGvMyfHGuVX4GOosDePsY31eZtefZseg2yQss1Vbc73B12SHeL9IbuE/Sdioi/GDXV2T5AILL8LIY6hzWJ1w==",
+ "dependencies": {
+ "Microsoft.AspNetCore.Http.Features": "5.0.0",
+ "Microsoft.Extensions.Configuration": "5.0.0",
+ "Microsoft.Extensions.Configuration.Json": "5.0.0",
+ "Microsoft.Extensions.FileProviders.Composite": "5.0.0",
+ "Microsoft.Extensions.Hosting.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Logging.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Options": "5.0.0"
+ }
+ },
+ "Smidge.InMemory": {
+ "type": "Transitive",
+ "resolved": "4.0.4",
+ "contentHash": "1Ve1ySrwZNmpjkJecAesiktVZn1uOLcZ3qNGLZ/7HzssdtzN1QP967M1iU9Zg+3h2BD3/ifQmNPk/uKJ0Vmb/w==",
+ "dependencies": {
+ "Dazinator.Extensions.FileProviders": "2.0.0",
+ "Smidge.Core": "4.0.4",
+ "System.Text.Encodings.Web": "5.0.1"
+ }
+ },
+ "Smidge.Nuglify": {
+ "type": "Transitive",
+ "resolved": "4.0.4",
+ "contentHash": "E1NoWmWVCFpLizNWh8ow81fy4z9nQE0UvYTc8gkzHGtVRrPsfHJYF7l/p+VZuryfyvD9er2NkS6LmQnv8M17Iw==",
+ "dependencies": {
+ "Nuglify": "1.13.12",
+ "Smidge": "4.0.4"
+ }
+ },
+ "StyleCop.Analyzers.Unstable": {
+ "type": "Transitive",
+ "resolved": "1.2.0.435",
+ "contentHash": "ouwPWZxbOV3SmCZxIRqHvljkSzkCyi1tDoMzQtDb/bRP8ctASV/iRJr+A2Gdj0QLaLmWnqTWDrH82/iP+X80Lg=="
+ },
+ "System.AppContext": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==",
+ "dependencies": {
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Buffers": {
+ "type": "Transitive",
+ "resolved": "4.5.1",
+ "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg=="
+ },
+ "System.Collections": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Collections.Concurrent": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Diagnostics.Tracing": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Threading": "4.3.0",
+ "System.Threading.Tasks": "4.3.0"
+ }
+ },
+ "System.Collections.Immutable": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g=="
+ },
+ "System.ComponentModel": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "VyGn1jGRZVfxnh8EdvDCi71v3bMXrsu8aYJOwoV7SNDLVhiEqwP86pPMyRGsDsxhXAm2b3o9OIqeETfN5qfezw==",
+ "dependencies": {
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.ComponentModel.Annotations": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg=="
+ },
+ "System.ComponentModel.Primitives": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "j8GUkCpM8V4d4vhLIIoBLGey2Z5bCkMVNjEZseyAlm4n5arcsJOeI3zkUP+zvZgzsbLTYh4lYeP/ZD/gdIAPrw==",
+ "dependencies": {
+ "System.ComponentModel": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Configuration.ConfigurationManager": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "7T+m0kDSlIPTHIkPMIu6m6tV6qsMqJpvQWW2jIc2qi7sn40qxFo0q+7mEQAhMPXZHMKnWrnv47ntGlM/ejvw3g==",
+ "dependencies": {
+ "System.Security.Cryptography.ProtectedData": "6.0.0",
+ "System.Security.Permissions": "6.0.0"
+ }
+ },
+ "System.Console": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.IO": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Text.Encoding": "4.3.0"
+ }
+ },
+ "System.Data.Common": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "lm6E3T5u7BOuEH0u18JpbJHxBfOJPuCyl4Kg1RH10ktYLp5uEEE1xKrHW56/We4SnZpGAuCc9N0MJpSDhTHZGQ==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Text.RegularExpressions": "4.3.0",
+ "System.Threading.Tasks": "4.3.0"
+ }
+ },
+ "System.Diagnostics.Debug": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Diagnostics.DiagnosticSource": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==",
+ "dependencies": {
+ "System.Runtime.CompilerServices.Unsafe": "6.0.0"
+ }
+ },
+ "System.Diagnostics.StackTrace": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "BiHg0vgtd35/DM9jvtaC1eKRpWZxr0gcQd643ABG7GnvSlf5pOkY2uyd42mMOJoOmKvnpNj0F4tuoS1pacTwYw==",
+ "dependencies": {
+ "System.IO.FileSystem": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Reflection.Metadata": "1.4.1",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Diagnostics.Tools": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Diagnostics.Tracing": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Drawing.Common": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "NfuoKUiP2nUWwKZN6twGqXioIe1zVD0RIj2t976A+czLHr2nY454RwwXs6JU9Htc6mwqL6Dn/nEL3dpVf2jOhg==",
+ "dependencies": {
+ "Microsoft.Win32.SystemEvents": "6.0.0"
+ }
+ },
+ "System.Dynamic.Runtime": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "SNVi1E/vfWUAs/WYKhE9+qlS6KqK0YVhnlT0HQtr8pMIA8YX3lwy3uPMownDwdYISBdmAF/2holEIldVp85Wag==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Linq": "4.3.0",
+ "System.Linq.Expressions": "4.3.0",
+ "System.ObjectModel": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Reflection.Emit": "4.3.0",
+ "System.Reflection.Emit.ILGeneration": "4.3.0",
+ "System.Reflection.Primitives": "4.3.0",
+ "System.Reflection.TypeExtensions": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Threading": "4.3.0"
+ }
+ },
+ "System.Formats.Asn1": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "T6fD00dQ3NTbPDy31m4eQUwKW84s03z0N2C8HpOklyeaDgaJPa/TexP4/SkORMSOwc7WhKifnA6Ya33AkzmafA=="
+ },
+ "System.Globalization": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Globalization.Calendars": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Globalization": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Globalization.Extensions": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "System.Globalization": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0"
+ }
+ },
+ "System.IdentityModel.Tokens.Jwt": {
+ "type": "Transitive",
+ "resolved": "6.8.0",
+ "contentHash": "5tBCjAub2Bhd5qmcd0WhR5s354e4oLYa//kOWrkX+6/7ZbDDJjMTfwLSOiZ/MMpWdE4DWPLOfTLOq/juj9CKzA==",
+ "dependencies": {
+ "Microsoft.IdentityModel.JsonWebTokens": "6.8.0",
+ "Microsoft.IdentityModel.Tokens": "6.8.0"
+ }
+ },
+ "System.IO": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Threading.Tasks": "4.3.0"
+ }
+ },
+ "System.IO.Compression": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "System.Buffers": "4.3.0",
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.Handles": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Threading": "4.3.0",
+ "System.Threading.Tasks": "4.3.0",
+ "runtime.native.System": "4.3.0",
+ "runtime.native.System.IO.Compression": "4.3.0"
+ }
+ },
+ "System.IO.Compression.ZipFile": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==",
+ "dependencies": {
+ "System.Buffers": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.IO.Compression": "4.3.0",
+ "System.IO.FileSystem": "4.3.0",
+ "System.IO.FileSystem.Primitives": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Text.Encoding": "4.3.0"
+ }
+ },
+ "System.IO.FileSystem": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.IO": "4.3.0",
+ "System.IO.FileSystem.Primitives": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Handles": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Threading.Tasks": "4.3.0"
+ }
+ },
+ "System.IO.FileSystem.AccessControl": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "SxHB3nuNrpptVk+vZ/F+7OHEpoHUIKKMl02bUmYHQr1r+glbZQxs7pRtsf4ENO29TVm2TH3AEeep2fJcy92oYw==",
+ "dependencies": {
+ "System.Security.AccessControl": "5.0.0",
+ "System.Security.Principal.Windows": "5.0.0"
+ }
+ },
+ "System.IO.FileSystem.Primitives": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==",
+ "dependencies": {
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.IO.Pipelines": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "irMYm3vhVgRsYvHTU5b2gsT2CwT/SMM6LZFzuJjpIvT5Z4CshxNsaoBC1X/LltwuR3Opp8d6jOS/60WwOb7Q2Q=="
+ },
+ "System.Linq": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0"
+ }
+ },
+ "System.Linq.Async": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "cPtIuuH8TIjVHSi2ewwReWGW1PfChPE0LxPIDlfwVcLuTM9GANFTXiMB7k3aC4sk3f0cQU25LNKzx+jZMxijqw=="
+ },
+ "System.Linq.Expressions": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.Linq": "4.3.0",
+ "System.ObjectModel": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Reflection.Emit": "4.3.0",
+ "System.Reflection.Emit.ILGeneration": "4.3.0",
+ "System.Reflection.Emit.Lightweight": "4.3.0",
+ "System.Reflection.Extensions": "4.3.0",
+ "System.Reflection.Primitives": "4.3.0",
+ "System.Reflection.TypeExtensions": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Threading": "4.3.0"
+ }
+ },
+ "System.Memory": {
+ "type": "Transitive",
+ "resolved": "4.5.4",
+ "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw=="
+ },
+ "System.Net.Http": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Diagnostics.DiagnosticSource": "4.3.0",
+ "System.Diagnostics.Tracing": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.Globalization.Extensions": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.IO.FileSystem": "4.3.0",
+ "System.Net.Primitives": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.Handles": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Security.Cryptography.Algorithms": "4.3.0",
+ "System.Security.Cryptography.Encoding": "4.3.0",
+ "System.Security.Cryptography.OpenSsl": "4.3.0",
+ "System.Security.Cryptography.Primitives": "4.3.0",
+ "System.Security.Cryptography.X509Certificates": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Threading": "4.3.0",
+ "System.Threading.Tasks": "4.3.0",
+ "runtime.native.System": "4.3.0",
+ "runtime.native.System.Net.Http": "4.3.0",
+ "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
+ }
+ },
+ "System.Net.Primitives": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Handles": "4.3.0"
+ }
+ },
+ "System.Net.Sockets": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.IO": "4.3.0",
+ "System.Net.Primitives": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Threading.Tasks": "4.3.0"
+ }
+ },
+ "System.Numerics.Vectors": {
+ "type": "Transitive",
+ "resolved": "4.5.0",
+ "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ=="
+ },
+ "System.ObjectModel": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Threading": "4.3.0"
+ }
+ },
+ "System.Reflection": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.IO": "4.3.0",
+ "System.Reflection.Primitives": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Reflection.Emit": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==",
+ "dependencies": {
+ "System.IO": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Reflection.Emit.ILGeneration": "4.3.0",
+ "System.Reflection.Primitives": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Reflection.Emit.ILGeneration": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==",
+ "dependencies": {
+ "System.Reflection": "4.3.0",
+ "System.Reflection.Primitives": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Reflection.Emit.Lightweight": {
+ "type": "Transitive",
+ "resolved": "4.7.0",
+ "contentHash": "a4OLB4IITxAXJeV74MDx49Oq2+PsF6Sml54XAFv+2RyWwtDBcabzoxiiJRhdhx+gaohLh4hEGCLQyBozXoQPqA=="
+ },
+ "System.Reflection.Extensions": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Reflection": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Reflection.Metadata": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ=="
+ },
+ "System.Reflection.Primitives": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Reflection.TypeExtensions": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==",
+ "dependencies": {
+ "System.Reflection": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Resources.ResourceManager": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Globalization": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Runtime": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0"
+ }
+ },
+ "System.Runtime.Caching": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "E0e03kUp5X2k+UAoVl6efmI7uU7JRBWi5EIdlQ7cr0NpBGjHG4fWII35PgsBY9T4fJQ8E4QPsL0rKksU9gcL5A==",
+ "dependencies": {
+ "System.Configuration.ConfigurationManager": "6.0.0"
+ }
+ },
+ "System.Runtime.CompilerServices.Unsafe": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg=="
+ },
+ "System.Runtime.Extensions": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Runtime.Handles": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Runtime.InteropServices": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Reflection": "4.3.0",
+ "System.Reflection.Primitives": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Handles": "4.3.0"
+ }
+ },
+ "System.Runtime.InteropServices.RuntimeInformation": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==",
+ "dependencies": {
+ "System.Reflection": "4.3.0",
+ "System.Reflection.Extensions": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Threading": "4.3.0",
+ "runtime.native.System": "4.3.0"
+ }
+ },
+ "System.Runtime.Numerics": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==",
+ "dependencies": {
+ "System.Globalization": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0"
+ }
+ },
+ "System.Runtime.Serialization.Primitives": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "Wz+0KOukJGAlXjtKr+5Xpuxf8+c8739RI1C+A2BoQZT+wMCCoMDDdO8/4IRHfaVINqL78GO8dW8G2lW/e45Mcw==",
+ "dependencies": {
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Security.AccessControl": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "AUADIc0LIEQe7MzC+I0cl0rAT8RrTAKFHl53yHjEUzNVIaUlhFY11vc2ebiVJzVBuOzun6F7FBA+8KAbGTTedQ=="
+ },
+ "System.Security.Cryptography.Algorithms": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "System.Collections": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.Handles": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Runtime.Numerics": "4.3.0",
+ "System.Security.Cryptography.Encoding": "4.3.0",
+ "System.Security.Cryptography.Primitives": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "runtime.native.System.Security.Cryptography.Apple": "4.3.0",
+ "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
+ }
+ },
+ "System.Security.Cryptography.Cng": {
+ "type": "Transitive",
+ "resolved": "4.5.0",
+ "contentHash": "WG3r7EyjUe9CMPFSs6bty5doUqT+q9pbI80hlNzo2SkPkZ4VTuZkGWjpp77JB8+uaL4DFPRdBsAY+DX3dBK92A=="
+ },
+ "System.Security.Cryptography.Csp": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "System.IO": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.Handles": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Security.Cryptography.Algorithms": "4.3.0",
+ "System.Security.Cryptography.Encoding": "4.3.0",
+ "System.Security.Cryptography.Primitives": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Threading": "4.3.0"
+ }
+ },
+ "System.Security.Cryptography.Encoding": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "System.Collections": "4.3.0",
+ "System.Collections.Concurrent": "4.3.0",
+ "System.Linq": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.Handles": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Security.Cryptography.Primitives": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
+ }
+ },
+ "System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.Handles": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Runtime.Numerics": "4.3.0",
+ "System.Security.Cryptography.Algorithms": "4.3.0",
+ "System.Security.Cryptography.Encoding": "4.3.0",
+ "System.Security.Cryptography.Primitives": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
+ }
+ },
+ "System.Security.Cryptography.Pkcs": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "elM3x+xSRhzQysiqo85SbidJJ2YbZlnvmh+53TuSZHsD7dNuuEWser+9EFtY+rYupBwkq2avc6ZCO3/6qACgmg==",
+ "dependencies": {
+ "System.Formats.Asn1": "6.0.0"
+ }
+ },
+ "System.Security.Cryptography.Primitives": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==",
+ "dependencies": {
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Threading": "4.3.0",
+ "System.Threading.Tasks": "4.3.0"
+ }
+ },
+ "System.Security.Cryptography.ProtectedData": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "rp1gMNEZpvx9vP0JW0oHLxlf8oSiQgtno77Y4PLUBjSiDYoD77Y8uXHr1Ea5XG4/pIKhqAdxZ8v8OTUtqo9PeQ=="
+ },
+ "System.Security.Cryptography.X509Certificates": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.Globalization.Calendars": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.IO.FileSystem": "4.3.0",
+ "System.IO.FileSystem.Primitives": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.Handles": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Runtime.Numerics": "4.3.0",
+ "System.Security.Cryptography.Algorithms": "4.3.0",
+ "System.Security.Cryptography.Cng": "4.3.0",
+ "System.Security.Cryptography.Csp": "4.3.0",
+ "System.Security.Cryptography.Encoding": "4.3.0",
+ "System.Security.Cryptography.OpenSsl": "4.3.0",
+ "System.Security.Cryptography.Primitives": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Threading": "4.3.0",
+ "runtime.native.System": "4.3.0",
+ "runtime.native.System.Net.Http": "4.3.0",
+ "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
+ }
+ },
+ "System.Security.Cryptography.Xml": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "MYmkHtCW+paFmPGFDktnLdOeH3zUrNchbZNki87E1ejNSMm9enSRbJokmvFrsWUrDE4bRE1lVeAle01+t6SGhA==",
+ "dependencies": {
+ "System.Security.Cryptography.Pkcs": "5.0.0",
+ "System.Security.Permissions": "5.0.0"
+ }
+ },
+ "System.Security.Permissions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "T/uuc7AklkDoxmcJ7LGkyX1CcSviZuLCa4jg3PekfJ7SU0niF0IVTXwUiNVP9DSpzou2PpxJ+eNY2IfDM90ZCg==",
+ "dependencies": {
+ "System.Security.AccessControl": "6.0.0",
+ "System.Windows.Extensions": "6.0.0"
+ }
+ },
+ "System.Security.Principal.Windows": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA=="
+ },
+ "System.Text.Encoding": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Text.Encoding.CodePages": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "NyscU59xX6Uo91qvhOs2Ccho3AR2TnZPomo1Z0K6YpyztBPM/A5VbkzOO19sy3A3i1TtEnTxA7bCe3Us+r5MWg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "5.0.0"
+ }
+ },
+ "System.Text.Encoding.Extensions": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0",
+ "System.Text.Encoding": "4.3.0"
+ }
+ },
+ "System.Text.Encodings.Web": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==",
+ "dependencies": {
+ "System.Runtime.CompilerServices.Unsafe": "6.0.0"
+ }
+ },
+ "System.Text.Json": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "zaJsHfESQvJ11vbXnNlkrR46IaMULk/gHxYsJphzSF+07kTjPHv+Oc14w6QEOfo3Q4hqLJgStUaYB9DBl0TmWg==",
+ "dependencies": {
+ "System.Runtime.CompilerServices.Unsafe": "6.0.0",
+ "System.Text.Encodings.Web": "6.0.0"
+ }
+ },
+ "System.Text.RegularExpressions": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==",
+ "dependencies": {
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Threading": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==",
+ "dependencies": {
+ "System.Runtime": "4.3.0",
+ "System.Threading.Tasks": "4.3.0"
+ }
+ },
+ "System.Threading.AccessControl": {
+ "type": "Transitive",
+ "resolved": "4.7.0",
+ "contentHash": "/fmzEf1UYrdCzfOIHVJ2cx3v9DHLLLMkUrodpzJGW17N+K+SSmBD8OA/BGmtfN1Ae0Ex3rBjQVufnIi5zKefuQ==",
+ "dependencies": {
+ "System.Security.AccessControl": "4.7.0",
+ "System.Security.Principal.Windows": "4.7.0"
+ }
+ },
+ "System.Threading.Tasks": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Threading.Tasks.Dataflow": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "+tyDCU3/B1lDdOOAJywHQoFwyXIUghIaP2BxG79uvhfTnO+D9qIgjVlL/JV2NTliYbMHpd6eKDmHp2VHpij7MA=="
+ },
+ "System.Threading.Tasks.Extensions": {
+ "type": "Transitive",
+ "resolved": "4.5.4",
+ "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg=="
+ },
+ "System.Threading.Tasks.Parallel": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "cbjBNZHf/vQCfcdhzx7knsiygoCKgxL8mZOeocXZn5gWhCdzHIq6bYNKWX0LAJCWYP7bds4yBK8p06YkP0oa0g==",
+ "dependencies": {
+ "System.Collections.Concurrent": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Diagnostics.Tracing": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Threading": "4.3.0",
+ "System.Threading.Tasks": "4.3.0"
+ }
+ },
+ "System.Threading.Timer": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Windows.Extensions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "IXoJOXIqc39AIe+CIR7koBtRGMiCt/LPM3lI+PELtDIy9XdyeSrwXFdWV9dzJ2Awl0paLWUaknLxFQ5HpHZUog==",
+ "dependencies": {
+ "System.Drawing.Common": "6.0.0"
+ }
+ },
+ "System.Xml.ReaderWriter": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.IO.FileSystem": "4.3.0",
+ "System.IO.FileSystem.Primitives": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Text.Encoding.Extensions": "4.3.0",
+ "System.Text.RegularExpressions": "4.3.0",
+ "System.Threading.Tasks": "4.3.0",
+ "System.Threading.Tasks.Extensions": "4.3.0"
+ }
+ },
+ "System.Xml.XDocument": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Diagnostics.Tools": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Threading": "4.3.0",
+ "System.Xml.ReaderWriter": "4.3.0"
+ }
+ },
+ "Umbraco.Cms.Core": {
+ "type": "Transitive",
+ "resolved": "10.0.0-rc1",
+ "contentHash": "kFQ/Z+q1ZJli7sYUNgQnv89VluuXWQcvLUu9X9mWA+6hk9v4pVHNzFNVTzcqSuEIMAcMtowSHZWtJqJxDA6CRA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "6.0.0",
+ "Microsoft.Extensions.FileProviders.Embedded": "6.0.4",
+ "Microsoft.Extensions.FileProviders.Physical": "6.0.0",
+ "Microsoft.Extensions.Hosting.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Identity.Core": "6.0.4",
+ "Microsoft.Extensions.Logging": "6.0.0",
+ "Microsoft.Extensions.Options": "6.0.0",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0",
+ "Microsoft.Extensions.Options.DataAnnotations": "6.0.0",
+ "System.ComponentModel.Annotations": "5.0.0",
+ "System.Reflection.Emit.Lightweight": "4.7.0",
+ "System.Runtime.Caching": "6.0.0"
+ }
+ },
+ "Umbraco.Cms.Examine.Lucene": {
+ "type": "Transitive",
+ "resolved": "10.0.0-rc1",
+ "contentHash": "oL3rnv5fFMlZtF35G9kci80n7BEeYHh/sMrYYrQju76xAt23EuZvc2WFHPkGzUx1SZxCRB/LYvjyFqbnCtd7rw==",
+ "dependencies": {
+ "Examine": "3.0.0-beta.9",
+ "Umbraco.Cms.Core": "10.0.0-rc1",
+ "Umbraco.Cms.Infrastructure": "10.0.0-rc1"
+ }
+ },
+ "Umbraco.Cms.Infrastructure": {
+ "type": "Transitive",
+ "resolved": "10.0.0-rc1",
+ "contentHash": "8fwyXkQ4TAqLILFmZOGkXxC6FO2kPaIgYAwPpBOMYuKHVcZSU83B1AKSCQNBjTT4ZHWe3EvC7xNBeD1iByvGQg==",
+ "dependencies": {
+ "Examine.Core": "3.0.0-beta.9",
+ "HtmlAgilityPack": "1.11.42",
+ "IPNetwork2": "2.5.407",
+ "MailKit": "3.2.0",
+ "Markdown": "2.2.1",
+ "Microsoft.CSharp": "4.7.0",
+ "Microsoft.CodeAnalysis.CSharp": "4.0.1",
+ "Microsoft.Extensions.Configuration.Abstractions": "6.0.0",
+ "Microsoft.Extensions.Configuration.Json": "6.0.0",
+ "Microsoft.Extensions.DependencyInjection": "6.0.0",
+ "Microsoft.Extensions.Http": "6.0.0",
+ "Microsoft.Extensions.Identity.Stores": "6.0.4",
+ "MiniProfiler.Shared": "4.2.22",
+ "NPoco.SqlServer": "5.3.2",
+ "Newtonsoft.Json": "13.0.1",
+ "Serilog": "2.10.0",
+ "Serilog.Enrichers.Process": "2.0.2",
+ "Serilog.Enrichers.Thread": "3.1.0",
+ "Serilog.Expressions": "3.3.0",
+ "Serilog.Extensions.Hosting": "4.2.0",
+ "Serilog.Formatting.Compact": "1.1.0",
+ "Serilog.Formatting.Compact.Reader": "1.0.5",
+ "Serilog.Settings.Configuration": "3.3.0",
+ "Serilog.Sinks.Async": "1.5.0",
+ "Serilog.Sinks.File": "5.0.0",
+ "Serilog.Sinks.Map": "1.0.2",
+ "SixLabors.ImageSharp": "2.1.1",
+ "System.IO.FileSystem.AccessControl": "5.0.0",
+ "System.Text.Encodings.Web": "6.0.0",
+ "System.Threading.Tasks.Dataflow": "6.0.0",
+ "Umbraco.Cms.Core": "10.0.0-rc1",
+ "ncrontab": "3.3.1"
+ }
+ },
+ "Umbraco.Cms.PublishedCache.NuCache": {
+ "type": "Transitive",
+ "resolved": "10.0.0-rc1",
+ "contentHash": "qeOLycefK35h0cCMZqmn8p7Zq9ZvXRHhWqf5vLNJuWOPYGKFTesNF24b7Cl65N3xmbuVEISuE6rM6jnb2hx3JQ==",
+ "dependencies": {
+ "CSharpTest.Net.Collections-NetStd2": "14.906.1403.1084",
+ "K4os.Compression.LZ4": "1.2.16",
+ "MessagePack": "2.3.85",
+ "Newtonsoft.Json": "13.0.1",
+ "Umbraco.Cms.Core": "10.0.0-rc1",
+ "Umbraco.Cms.Infrastructure": "10.0.0-rc1"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file