diff --git a/src/ApiService/ApiService/ApiService.csproj b/src/ApiService/ApiService/ApiService.csproj index 3e4e2c2b1..645abb483 100644 --- a/src/ApiService/ApiService/ApiService.csproj +++ b/src/ApiService/ApiService/ApiService.csproj @@ -44,4 +44,4 @@ Never - + \ No newline at end of file diff --git a/src/ApiService/ApiService/HttpClient.cs b/src/ApiService/ApiService/HttpClient.cs index a51ca6bfe..ca95e0b19 100644 --- a/src/ApiService/ApiService/HttpClient.cs +++ b/src/ApiService/ApiService/HttpClient.cs @@ -47,18 +47,18 @@ public class Request { public async Task Post(Uri url, String json, IDictionary? headers = null) { using var b = new StringContent(json); b.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json"); - return await Send(method: HttpMethod.Post, url: url, headers: headers); + return await Send(method: HttpMethod.Post, content: b, url: url, headers: headers); } public async Task Put(Uri url, String json, IDictionary? headers = null) { using var b = new StringContent(json); b.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json"); - return await Send(method: HttpMethod.Put, url: url, headers: headers); + return await Send(method: HttpMethod.Put, content: b, url: url, headers: headers); } public async Task Patch(Uri url, String json, IDictionary? headers = null) { using var b = new StringContent(json); b.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json"); - return await Send(method: HttpMethod.Patch, url: url, headers: headers); + return await Send(method: HttpMethod.Patch, content: b, url: url, headers: headers); } } diff --git a/src/ApiService/ApiService/Log.cs b/src/ApiService/ApiService/Log.cs index 31bce2b09..1fc04436b 100644 --- a/src/ApiService/ApiService/Log.cs +++ b/src/ApiService/ApiService/Log.cs @@ -105,7 +105,7 @@ public interface ILogTracer { void Critical(string message); void Error(string message); void Event(string evt, IReadOnlyDictionary? metrics); - void Exception(Exception ex, IReadOnlyDictionary? metrics); + void Exception(Exception ex, IReadOnlyDictionary? metrics = null); void ForceFlush(); void Info(string message); void Warning(string message); diff --git a/src/ApiService/ApiService/OneFuzzTypes/Events.cs b/src/ApiService/ApiService/OneFuzzTypes/Events.cs index 222e30e25..772a7671e 100644 --- a/src/ApiService/ApiService/OneFuzzTypes/Events.cs +++ b/src/ApiService/ApiService/OneFuzzTypes/Events.cs @@ -45,6 +45,7 @@ public abstract record BaseEvent() { this switch { EventNodeHeartbeat _ => EventType.NodeHeartbeat, EventTaskHeartbeat _ => EventType.TaskHeartbeat, + EventPing _ => EventType.Ping, EventInstanceConfigUpdated _ => EventType.InstanceConfigUpdated, EventProxyCreated _ => EventType.ProxyCreated, EventProxyDeleted _ => EventType.ProxyDeleted, @@ -66,6 +67,7 @@ public abstract record BaseEvent() { EventType.NodeHeartbeat => typeof(EventNodeHeartbeat), EventType.InstanceConfigUpdated => typeof(EventInstanceConfigUpdated), EventType.TaskHeartbeat => typeof(EventTaskHeartbeat), + EventType.Ping => typeof(EventPing), EventType.ProxyCreated => typeof(EventProxyCreated), EventType.ProxyDeleted => typeof(EventProxyDeleted), EventType.ProxyFailed => typeof(EventProxyFailed), @@ -151,11 +153,9 @@ public record EventTaskHeartbeat( TaskConfig Config ) : BaseEvent(); - -//record EventPing( -// PingId: Guid -//): BaseEvent(); - +public record EventPing( + Guid PingId +) : BaseEvent(); //record EventScalesetCreated( // Guid ScalesetId, @@ -295,7 +295,7 @@ public record EventMessage( BaseEvent Event, Guid InstanceId, String InstanceName -) : EntityBase(); +); public class BaseEventConverter : JsonConverter { public override BaseEvent? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { diff --git a/src/ApiService/ApiService/OneFuzzTypes/Model.cs b/src/ApiService/ApiService/OneFuzzTypes/Model.cs index 4c870b316..d90e3a675 100644 --- a/src/ApiService/ApiService/OneFuzzTypes/Model.cs +++ b/src/ApiService/ApiService/OneFuzzTypes/Model.cs @@ -245,7 +245,6 @@ public record NodeAssignment( public record Task( - // Timestamp: Optional[datetime] = Field(alias="Timestamp") [PartitionKey] Guid JobId, [RowKey] Guid TaskId, TaskState State, @@ -307,13 +306,13 @@ public record ApiAccessRule( Guid[] AllowedGroups ); +//# initial set of admins can only be set during deployment. +//# if admins are set, only admins can update instance configs. +//# if set, only admins can manage pools or scalesets public record InstanceConfig ( [PartitionKey, RowKey] string InstanceName, - //# initial set of admins can only be set during deployment. - //# if admins are set, only admins can update instance configs. Guid[]? Admins, - //# if set, only admins can manage pools or scalesets bool? AllowPoolManagement, string[] AllowedAadTenants, NetworkConfig NetworkConfig, @@ -490,20 +489,20 @@ public record Repro( UserInfo? UserInfo ) : StatefulEntityBase(State); +// TODO: Make this >1 and < 7*24 (more than one hour, less than seven days) public record ReproConfig( Container Container, string Path, - // TODO: Make this >1 and < 7*24 (more than one hour, less than seven days) int Duration ); +// Skipping AutoScaleConfig because it's not used anymore public record Pool( DateTimeOffset Timestamp, PoolName Name, Guid PoolId, Os Os, bool Managed, - // Skipping AutoScaleConfig because it's not used anymore Architecture Architecture, PoolState State, Guid? ClientId, diff --git a/src/ApiService/ApiService/OneFuzzTypes/Webhooks.cs b/src/ApiService/ApiService/OneFuzzTypes/Webhooks.cs index 1e6205426..bcf159e16 100644 --- a/src/ApiService/ApiService/OneFuzzTypes/Webhooks.cs +++ b/src/ApiService/ApiService/OneFuzzTypes/Webhooks.cs @@ -9,6 +9,11 @@ public enum WebhookMessageFormat { EventGrid } +public record WebhookMessageQueueObj( + Guid WebhookId, + Guid EventId + ); + public record WebhookMessage(Guid EventId, EventType EventType, BaseEvent Event, @@ -27,24 +32,18 @@ public record WebhookMessageEventGrid( [property: JsonConverter(typeof(BaseEventConverter))] BaseEvent Data); - -// TODO: This should inherit from Entity Base ? no, since there is -// a table WebhookMessaageLog public record WebhookMessageLog( [RowKey] Guid EventId, EventType EventType, + [property: TypeDiscrimnatorAttribute("EventType", typeof(EventTypeProvider))] + [property: JsonConverter(typeof(BaseEventConverter))] BaseEvent Event, Guid InstanceId, String InstanceName, [PartitionKey] Guid WebhookId, - WebhookMessageState State = WebhookMessageState.Queued, - int TryCount = 0 - ) : WebhookMessage(EventId, - EventType, - Event, - InstanceId, - InstanceName, - WebhookId); + long TryCount, + WebhookMessageState State = WebhookMessageState.Queued + ) : EntityBase(); public record Webhook( [PartitionKey] Guid WebhookId, diff --git a/src/ApiService/ApiService/Program.cs b/src/ApiService/ApiService/Program.cs index 8ffaf3bb2..3188819bf 100644 --- a/src/ApiService/ApiService/Program.cs +++ b/src/ApiService/ApiService/Program.cs @@ -45,7 +45,8 @@ public class Program { return loggers; } - + //Move out expensive resources into separate class, and add those as Singleton + // ArmClient, Table Client(s), Queue Client(s), HttpClient, etc. public static void Main() { var host = new HostBuilder() .ConfigureFunctionsWorkerDefaults( @@ -82,7 +83,7 @@ public class Program { .AddScoped() //Move out expensive resources into separate class, and add those as Singleton - // ArmClient, Table Client(s), Queue Client(s), HttpClient, etc. + // ArmClient, Table Client(s), Queue Client(s), HttpClient, etc.\ .AddSingleton() .AddSingleton() .AddHttpClient() diff --git a/src/ApiService/ApiService/QueueWebhooks.cs b/src/ApiService/ApiService/QueueWebhooks.cs new file mode 100644 index 000000000..c5cd0fa3c --- /dev/null +++ b/src/ApiService/ApiService/QueueWebhooks.cs @@ -0,0 +1,24 @@ +using System.Text.Json; +using Microsoft.Azure.Functions.Worker; +using Microsoft.OneFuzz.Service.OneFuzzLib.Orm; + +namespace Microsoft.OneFuzz.Service; + +public class QueueWebhooks { + private readonly ILogTracer _log; + private readonly IWebhookMessageLogOperations _webhookMessageLog; + public QueueWebhooks(ILogTracer log, IWebhookMessageLogOperations webhookMessageLog) { + _log = log; + _webhookMessageLog = webhookMessageLog; + } + + [Function("QueueWebhooks")] + public async Async.Task Run([QueueTrigger("myqueue-items", Connection = "AzureWebJobsStorage")] string msg) { + + _log.Info($"Webhook Message Queued: {msg}"); + + var obj = JsonSerializer.Deserialize(msg, EntityConverter.GetJsonSerializerOptions()).EnsureNotNull($"wrong data {msg}"); + + await _webhookMessageLog.ProcessFromQueue(obj); + } +} diff --git a/src/ApiService/ApiService/ServiceConfiguration.cs b/src/ApiService/ApiService/ServiceConfiguration.cs index 416c324f6..cf4cc7589 100644 --- a/src/ApiService/ApiService/ServiceConfiguration.cs +++ b/src/ApiService/ApiService/ServiceConfiguration.cs @@ -35,7 +35,7 @@ public interface IServiceConfig { public string? OneFuzzResourceGroup { get; } public string? OneFuzzTelemetry { get; } - public string OnefuzzVersion { get; } + public string OneFuzzVersion { get; } } public class ServiceConfiguration : IServiceConfig { @@ -77,5 +77,5 @@ public class ServiceConfiguration : IServiceConfig { public string? OneFuzzOwner { get => Environment.GetEnvironmentVariable("ONEFUZZ_OWNER"); } public string? OneFuzzResourceGroup { get => Environment.GetEnvironmentVariable("ONEFUZZ_RESOURCE_GROUP"); } public string? OneFuzzTelemetry { get => Environment.GetEnvironmentVariable("ONEFUZZ_TELEMETRY"); } - public string OnefuzzVersion { get => Environment.GetEnvironmentVariable("ONEFUZZ_VERSION") ?? "0.0.0"; } + public string OneFuzzVersion { get => Environment.GetEnvironmentVariable("ONEFUZZ_VERSION") ?? "0.0.0"; } } diff --git a/src/ApiService/ApiService/onefuzzlib/Containers.cs b/src/ApiService/ApiService/onefuzzlib/Containers.cs index 3a4694285..1c271a9af 100644 --- a/src/ApiService/ApiService/onefuzzlib/Containers.cs +++ b/src/ApiService/ApiService/onefuzzlib/Containers.cs @@ -1,125 +1,124 @@ -using System.Threading.Tasks; -using Azure; -using Azure.ResourceManager; -using Azure.Storage; -using Azure.Storage.Blobs; -using Azure.Storage.Sas; - -namespace Microsoft.OneFuzz.Service; - - -public interface IContainers { - public Task GetBlob(Container container, string name, StorageType storageType); - - public Async.Task FindContainer(Container container, StorageType storageType); - - public Async.Task GetFileSasUrl(Container container, string name, StorageType storageType, BlobSasPermissions permissions, TimeSpan? duration = null); - Async.Task saveBlob(Container container, string v1, string v2, StorageType config); - Task GetInstanceId(); -} - -public class Containers : IContainers { - private ILogTracer _log; - private IStorage _storage; - private ICreds _creds; - private ArmClient _armClient; - public Containers(ILogTracer log, IStorage storage, ICreds creds) { - _log = log; - _storage = storage; - _creds = creds; - _armClient = creds.ArmClient; - } - public async Task GetBlob(Container container, string name, StorageType storageType) { - var client = await FindContainer(container, storageType); - - if (client == null) { - return null; - } - - try { - return (await client.GetBlobClient(name).DownloadContentAsync()) - .Value.Content; - } catch (RequestFailedException) { - return null; - } - } - - public async Async.Task FindContainer(Container container, StorageType storageType) { - // # check secondary accounts first by searching in reverse. - // # - // # By implementation, the primary account is specified first, followed by - // # any secondary accounts. - // # - // # Secondary accounts, if they exist, are preferred for containers and have - // # increased IOP rates, this should be a slight optimization - return await _storage.GetAccounts(storageType) - .Reverse() - .Select(account => GetBlobService(account)?.GetBlobContainerClient(container.ContainerName)) - .ToAsyncEnumerable() - .WhereAwait(async client => client != null && (await client.ExistsAsync()).Value) - .FirstOrDefaultAsync(); - } - - private BlobServiceClient? GetBlobService(string accountId) { - _log.Info($"getting blob container (account_id: {accountId}"); - var (accountName, accountKey) = _storage.GetStorageAccountNameAndKey(accountId); - if (accountName == null) { - _log.Error("Failed to get storage account name"); - return null; - } - var storageKeyCredential = new StorageSharedKeyCredential(accountName, accountKey); - var accountUrl = GetUrl(accountName); - return new BlobServiceClient(accountUrl, storageKeyCredential); - } - - private static Uri GetUrl(string accountName) { - return new Uri($"https://{accountName}.blob.core.windows.net/"); - } - - public async Async.Task GetFileSasUrl(Container container, string name, StorageType storageType, BlobSasPermissions permissions, TimeSpan? duration = null) { - var client = await FindContainer(container, storageType) ?? throw new Exception($"unable to find container: {container.ContainerName} - {storageType}"); - var (accountName, accountKey) = _storage.GetStorageAccountNameAndKey(client.AccountName); - - var (startTime, endTime) = SasTimeWindow(duration ?? TimeSpan.FromDays(30)); - - var sasBuilder = new BlobSasBuilder(permissions, endTime) { - StartsOn = startTime, - BlobContainerName = container.ContainerName, - BlobName = name - }; - - var sasUrl = client.GetBlobClient(name).GenerateSasUri(sasBuilder); - return sasUrl; - } - - public (DateTimeOffset, DateTimeOffset) SasTimeWindow(TimeSpan timeSpan) { - // SAS URLs are valid 6 hours earlier, primarily to work around dev - // workstations having out-of-sync time. Additionally, SAS URLs are stopped - // 15 minutes later than requested based on "Be careful with SAS start time" - // guidance. - // Ref: https://docs.microsoft.com/en-us/azure/storage/common/storage-sas-overview - - var SAS_START_TIME_DELTA = TimeSpan.FromHours(6); - var SAS_END_TIME_DELTA = TimeSpan.FromMinutes(6); - - var now = DateTimeOffset.UtcNow; - var start = now - SAS_START_TIME_DELTA; - var expiry = now + timeSpan + SAS_END_TIME_DELTA; - return (start, expiry); - } - - public async System.Threading.Tasks.Task saveBlob(Container container, string name, string data, StorageType storageType) { - var client = await FindContainer(container, storageType) ?? throw new Exception($"unable to find container: {container.ContainerName} - {storageType}"); - - await client.UploadBlobAsync(name, new BinaryData(data)); - } - - public async Async.Task GetInstanceId() { - var blob = await GetBlob(new Container("base-config"), "instance_id", StorageType.Config); - if (blob == null) { - throw new System.Exception("Blob Not Found"); - } - return System.Guid.Parse(blob.ToString()); - } -} - +using System.Threading.Tasks; +using Azure; +using Azure.ResourceManager; +using Azure.Storage; +using Azure.Storage.Blobs; +using Azure.Storage.Sas; + +namespace Microsoft.OneFuzz.Service; + + +public interface IContainers { + public Task GetBlob(Container container, string name, StorageType storageType); + + public Async.Task FindContainer(Container container, StorageType storageType); + + public Async.Task GetFileSasUrl(Container container, string name, StorageType storageType, BlobSasPermissions permissions, TimeSpan? duration = null); + Async.Task saveBlob(Container container, string v1, string v2, StorageType config); + Task GetInstanceId(); +} + +public class Containers : IContainers { + private ILogTracer _log; + private IStorage _storage; + private ICreds _creds; + private ArmClient _armClient; + public Containers(ILogTracer log, IStorage storage, ICreds creds) { + _log = log; + _storage = storage; + _creds = creds; + _armClient = creds.ArmClient; + } + public async Task GetBlob(Container container, string name, StorageType storageType) { + var client = await FindContainer(container, storageType); + + if (client == null) { + return null; + } + + try { + return (await client.GetBlobClient(name).DownloadContentAsync()) + .Value.Content; + } catch (RequestFailedException) { + return null; + } + } + + public async Async.Task FindContainer(Container container, StorageType storageType) { + // # check secondary accounts first by searching in reverse. + // # + // # By implementation, the primary account is specified first, followed by + // # any secondary accounts. + // # + // # Secondary accounts, if they exist, are preferred for containers and have + // # increased IOP rates, this should be a slight optimization + return await _storage.GetAccounts(storageType) + .Reverse() + .Select(account => GetBlobService(account)?.GetBlobContainerClient(container.ContainerName)) + .ToAsyncEnumerable() + .WhereAwait(async client => client != null && (await client.ExistsAsync()).Value) + .FirstOrDefaultAsync(); + } + + private BlobServiceClient? GetBlobService(string accountId) { + _log.Info($"getting blob container (account_id: {accountId}"); + var (accountName, accountKey) = _storage.GetStorageAccountNameAndKey(accountId); + if (accountName == null) { + _log.Error("Failed to get storage account name"); + return null; + } + var storageKeyCredential = new StorageSharedKeyCredential(accountName, accountKey); + var accountUrl = GetUrl(accountName); + return new BlobServiceClient(accountUrl, storageKeyCredential); + } + + private static Uri GetUrl(string accountName) { + return new Uri($"https://{accountName}.blob.core.windows.net/"); + } + + public async Async.Task GetFileSasUrl(Container container, string name, StorageType storageType, BlobSasPermissions permissions, TimeSpan? duration = null) { + var client = await FindContainer(container, storageType) ?? throw new Exception($"unable to find container: {container.ContainerName} - {storageType}"); + var (accountName, accountKey) = _storage.GetStorageAccountNameAndKey(client.AccountName); + + var (startTime, endTime) = SasTimeWindow(duration ?? TimeSpan.FromDays(30)); + + var sasBuilder = new BlobSasBuilder(permissions, endTime) { + StartsOn = startTime, + BlobContainerName = container.ContainerName, + BlobName = name + }; + + var sasUrl = client.GetBlobClient(name).GenerateSasUri(sasBuilder); + return sasUrl; + } + + public (DateTimeOffset, DateTimeOffset) SasTimeWindow(TimeSpan timeSpan) { + // SAS URLs are valid 6 hours earlier, primarily to work around dev + // workstations having out-of-sync time. Additionally, SAS URLs are stopped + // 15 minutes later than requested based on "Be careful with SAS start time" + // guidance. + // Ref: https://docs.microsoft.com/en-us/azure/storage/common/storage-sas-overview + + var SAS_START_TIME_DELTA = TimeSpan.FromHours(6); + var SAS_END_TIME_DELTA = TimeSpan.FromMinutes(6); + + var now = DateTimeOffset.UtcNow; + var start = now - SAS_START_TIME_DELTA; + var expiry = now + timeSpan + SAS_END_TIME_DELTA; + return (start, expiry); + } + + public async System.Threading.Tasks.Task saveBlob(Container container, string name, string data, StorageType storageType) { + var client = await FindContainer(container, storageType) ?? throw new Exception($"unable to find container: {container.ContainerName} - {storageType}"); + + await client.UploadBlobAsync(name, new BinaryData(data)); + } + + public async Async.Task GetInstanceId() { + var blob = await GetBlob(new Container("base-config"), "instance_id", StorageType.Config); + if (blob == null) { + throw new System.Exception("Blob Not Found"); + } + return System.Guid.Parse(blob.ToString()); + } +} diff --git a/src/ApiService/ApiService/onefuzzlib/Creds.cs b/src/ApiService/ApiService/onefuzzlib/Creds.cs index 97b7d221c..8e2b8c871 100644 --- a/src/ApiService/ApiService/onefuzzlib/Creds.cs +++ b/src/ApiService/ApiService/onefuzzlib/Creds.cs @@ -14,6 +14,7 @@ public interface ICreds { public ResourceIdentifier GetResourceGroupResourceIdentifier(); + public string GetInstanceName(); public ArmClient ArmClient { get; } @@ -59,6 +60,13 @@ public class Creds : ICreds { return new ResourceIdentifier(resourceId); } + public string GetInstanceName() { + var instanceName = _config.OneFuzzInstanceName + ?? throw new System.Exception("Instance Name env var is not present"); + + return instanceName; + } + public ResourceGroupResource GetResourceGroupResource() { var resourceId = GetResourceGroupResourceIdentifier(); return ArmClient.GetResourceGroupResource(resourceId); diff --git a/src/ApiService/ApiService/onefuzzlib/Network.cs b/src/ApiService/ApiService/onefuzzlib/Network.cs index dd63f765b..0adf20cd7 100644 --- a/src/ApiService/ApiService/onefuzzlib/Network.cs +++ b/src/ApiService/ApiService/onefuzzlib/Network.cs @@ -55,5 +55,4 @@ public partial class TimerProxy { } -} - +} diff --git a/src/ApiService/ApiService/onefuzzlib/ProxyOperations.cs b/src/ApiService/ApiService/onefuzzlib/ProxyOperations.cs index 847bfa136..6c4697039 100644 --- a/src/ApiService/ApiService/onefuzzlib/ProxyOperations.cs +++ b/src/ApiService/ApiService/onefuzzlib/ProxyOperations.cs @@ -55,7 +55,7 @@ public class ProxyOperations : StatefulOrm, IProxyOperations { } _logTracer.Info($"creating proxy: region:{region}"); - var newProxy = new Proxy(region, Guid.NewGuid(), DateTimeOffset.UtcNow, VmState.Init, Auth.BuildAuth(), null, null, _config.OnefuzzVersion, null, false); + var newProxy = new Proxy(region, Guid.NewGuid(), DateTimeOffset.UtcNow, VmState.Init, Auth.BuildAuth(), null, null, _config.OneFuzzVersion, null, false); await Replace(newProxy); await _events.SendEvent(new EventProxyCreated(region, newProxy.ProxyId)); @@ -83,8 +83,8 @@ public class ProxyOperations : StatefulOrm, IProxyOperations { return false; } - if (proxy.Version != _config.OnefuzzVersion) { - _logTracer.Info($"mismatch version: proxy:{proxy.Version} service:{_config.OnefuzzVersion} state:{proxy.State}"); + if (proxy.Version != _config.OneFuzzVersion) { + _logTracer.Info($"mismatch version: proxy:{proxy.Version} service:{_config.OneFuzzVersion} state:{proxy.State}"); return true; } diff --git a/src/ApiService/ApiService/onefuzzlib/Storage.cs b/src/ApiService/ApiService/onefuzzlib/Storage.cs index 92775df8c..6e7b12f33 100644 --- a/src/ApiService/ApiService/onefuzzlib/Storage.cs +++ b/src/ApiService/ApiService/onefuzzlib/Storage.cs @@ -14,7 +14,6 @@ public interface IStorage { public IEnumerable CorpusAccounts(); string GetPrimaryAccount(StorageType storageType); public (string?, string?) GetStorageAccountNameAndKey(string accountId); - public IEnumerable GetAccounts(StorageType storageType); } @@ -98,6 +97,28 @@ public class Storage : IStorage { return (resourceId.Name, key?.Value); } + public string ChooseAccounts(StorageType storageType) { + var accounts = GetAccounts(storageType); + if (!accounts.Any()) { + throw new Exception($"No Storage Accounts for {storageType}"); + } + + var account_list = accounts.ToList(); + if (account_list.Count == 1) { + return account_list[0]; + } + + // Use a random secondary storage account if any are available. This + // reduces IOP contention for the Storage Queues, which are only available + // on primary accounts + // + // security note: this is not used as a security feature + var random = new Random(); + var index = random.Next(account_list.Count); + + return account_list[index]; // nosec + } + public IEnumerable GetAccounts(StorageType storageType) { switch (storageType) { case StorageType.Corpus: diff --git a/src/ApiService/ApiService/onefuzzlib/WebhookOperations.cs b/src/ApiService/ApiService/onefuzzlib/WebhookOperations.cs index 9651cd9dc..b58c8a283 100644 --- a/src/ApiService/ApiService/onefuzzlib/WebhookOperations.cs +++ b/src/ApiService/ApiService/onefuzzlib/WebhookOperations.cs @@ -1,106 +1,253 @@ -using ApiService.OneFuzzLib.Orm; - -namespace Microsoft.OneFuzz.Service; - - -public interface IWebhookMessageLogOperations : IOrm { - IAsyncEnumerable SearchExpired(); -} - - -public class WebhookMessageLogOperations : Orm, IWebhookMessageLogOperations { - const int EXPIRE_DAYS = 7; - - record WebhookMessageQueueObj( - Guid WebhookId, - Guid EventId - ); - - private readonly IQueue _queue; - private readonly ILogTracer _log; - public WebhookMessageLogOperations(IStorage storage, IQueue queue, ILogTracer log, IServiceConfig config) : base(storage, log, config) { - _queue = queue; - _log = log; - } - - - public async Async.Task QueueWebhook(WebhookMessageLog webhookLog) { - var obj = new WebhookMessageQueueObj(webhookLog.WebhookId, webhookLog.EventId); - - TimeSpan? visibilityTimeout = webhookLog.State switch { - WebhookMessageState.Queued => TimeSpan.Zero, - WebhookMessageState.Retrying => TimeSpan.FromSeconds(30), - _ => null - }; - - if (visibilityTimeout == null) { - _log.WithTags( - new[] { - ("WebhookId", webhookLog.WebhookId.ToString()), - ("EventId", webhookLog.EventId.ToString()) } - ). - Error($"invalid WebhookMessage queue state, not queuing. {webhookLog.WebhookId}:{webhookLog.EventId} - {webhookLog.State}"); - } else { - await _queue.QueueObject("webhooks", obj, StorageType.Config, visibilityTimeout: visibilityTimeout); - } - } - - private void QueueObject(string v, WebhookMessageQueueObj obj, StorageType config, int? visibility_timeout) { - throw new NotImplementedException(); - } - - public IAsyncEnumerable SearchExpired() { - var expireTime = (DateTimeOffset.UtcNow - TimeSpan.FromDays(EXPIRE_DAYS)).ToString("o"); - - var timeFilter = $"Timestamp lt datetime'{expireTime}'"; - return QueryAsync(filter: timeFilter); - } -} - - -public interface IWebhookOperations { - Async.Task SendEvent(EventMessage eventMessage); -} - -public class WebhookOperations : Orm, IWebhookOperations { - private readonly IWebhookMessageLogOperations _webhookMessageLogOperations; - private readonly ILogTracer _log; - public WebhookOperations(IStorage storage, IWebhookMessageLogOperations webhookMessageLogOperations, ILogTracer log, IServiceConfig config) - : base(storage, log, config) { - _webhookMessageLogOperations = webhookMessageLogOperations; - _log = log; - } - - async public Async.Task SendEvent(EventMessage eventMessage) { - await foreach (var webhook in GetWebhooksCached()) { - if (!webhook.EventTypes.Contains(eventMessage.EventType)) { - continue; - } - await AddEvent(webhook, eventMessage); - } - } - - async private Async.Task AddEvent(Webhook webhook, EventMessage eventMessage) { - var message = new WebhookMessageLog( - EventId: eventMessage.EventId, - EventType: eventMessage.EventType, - Event: eventMessage.Event, - InstanceId: eventMessage.InstanceId, - InstanceName: eventMessage.InstanceName, - WebhookId: webhook.WebhookId - ); - - var r = await _webhookMessageLogOperations.Replace(message); - if (!r.IsOk) { - var (status, reason) = r.ErrorV; - _log.Error($"Failed to replace webhook message log due to [{status}] {reason}"); - } - } - - - //todo: caching - public IAsyncEnumerable GetWebhooksCached() { - return QueryAsync(); - } - -} +using System.Net; +using System.Net.Http; +using System.Security.Cryptography; +using System.Text.Json; +using ApiService.OneFuzzLib.Orm; +using Microsoft.OneFuzz.Service.OneFuzzLib.Orm; + +namespace Microsoft.OneFuzz.Service; + +public interface IWebhookOperations { + Async.Task SendEvent(EventMessage eventMessage); + Async.Task GetByWebhookId(Guid webhookId); + Async.Task Send(WebhookMessageLog messageLog); +} + +public class WebhookOperations : Orm, IWebhookOperations { + + private readonly IWebhookMessageLogOperations _webhookMessageLogOperations; + private readonly ILogTracer _log; + private readonly ICreds _creds; + private readonly IContainers _containers; + private readonly IHttpClientFactory _httpFactory; + + public WebhookOperations(IHttpClientFactory httpFactory, ICreds creds, IStorage storage, IWebhookMessageLogOperations webhookMessageLogOperations, IContainers containers, ILogTracer log, IServiceConfig config) + : base(storage, log, config) { + _webhookMessageLogOperations = webhookMessageLogOperations; + _log = log; + _creds = creds; + _containers = containers; + _httpFactory = httpFactory; + } + + async public Async.Task SendEvent(EventMessage eventMessage) { + await foreach (var webhook in GetWebhooksCached()) { + if (!webhook.EventTypes.Contains(eventMessage.EventType)) { + continue; + } + await AddEvent(webhook, eventMessage); + } + } + + async private Async.Task AddEvent(Webhook webhook, EventMessage eventMessage) { + var message = new WebhookMessageLog( + EventId: eventMessage.EventId, + EventType: eventMessage.EventType, + Event: eventMessage.Event, + InstanceId: eventMessage.InstanceId, + InstanceName: eventMessage.InstanceName, + WebhookId: webhook.WebhookId, + TryCount: 0 + ); + + var r = await _webhookMessageLogOperations.Replace(message); + if (!r.IsOk) { + var (status, reason) = r.ErrorV; + _log.Error($"Failed to replace webhook message log due to [{status}] {reason}"); + } + } + + public async Async.Task Send(WebhookMessageLog messageLog) { + var webhook = await GetByWebhookId(messageLog.WebhookId); + if (webhook == null || webhook.Url == null) { + throw new Exception($"Invalid Webhook. Webhook with WebhookId: {messageLog.WebhookId} Not Found"); + } + + var (data, digest) = await BuildMessage(webhookId: webhook.WebhookId, eventId: messageLog.EventId, eventType: messageLog.EventType, webhookEvent: messageLog.Event, secretToken: webhook.SecretToken, messageFormat: webhook.MessageFormat); + + var headers = new Dictionary { { "User-Agent", $"onefuzz-webhook {_config.OneFuzzVersion}" } }; + + if (digest != null) { + headers["X-Onefuzz-Digest"] = digest; + } + + var client = new Request(_httpFactory.CreateClient()); + _log.Info(data); + var response = client.Post(url: webhook.Url, json: data, headers: headers); + var result = response.Result; + if (result.StatusCode == HttpStatusCode.Accepted) { + return true; + } + return false; + } + + // Not converting to bytes, as it's not neccessary in C#. Just keeping as string. + public async Async.Task> BuildMessage(Guid webhookId, Guid eventId, EventType eventType, BaseEvent webhookEvent, String? secretToken, WebhookMessageFormat? messageFormat) { + var entityConverter = new EntityConverter(); + string data = ""; + if (messageFormat != null && messageFormat == WebhookMessageFormat.EventGrid) { + var eventGridMessage = new[] { new WebhookMessageEventGrid(Id: eventId, Data: webhookEvent, DataVersion: "1.0.0", Subject: _creds.GetInstanceName(), EventType: eventType, EventTime: DateTimeOffset.UtcNow) }; + data = JsonSerializer.Serialize(eventGridMessage, options: EntityConverter.GetJsonSerializerOptions()); + } else { + var instanceId = await _containers.GetInstanceId(); + var webhookMessage = new WebhookMessage(WebhookId: webhookId, EventId: eventId, EventType: eventType, Event: webhookEvent, InstanceId: instanceId, InstanceName: _creds.GetInstanceName()); + + data = JsonSerializer.Serialize(webhookMessage, options: EntityConverter.GetJsonSerializerOptions()); + } + + string? digest = null; + var hmac = HMAC.Create("HMACSHA512"); + if (secretToken != null && hmac != null) { + hmac.Key = System.Text.Encoding.UTF8.GetBytes(secretToken); + digest = Convert.ToHexString(hmac.ComputeHash(System.Text.Encoding.UTF8.GetBytes(data))); + } + return new Tuple(data, digest); + + } + + public async Async.Task GetByWebhookId(Guid webhookId) { + var data = QueryAsync(filter: $"PartitionKey eq '{webhookId}'"); + + return await data.FirstOrDefaultAsync(); + } + + //todo: caching + public IAsyncEnumerable GetWebhooksCached() { + return QueryAsync(); + } + +} + +public interface IWebhookMessageLogOperations : IOrm { + IAsyncEnumerable SearchExpired(); + public Async.Task ProcessFromQueue(WebhookMessageQueueObj obj); +} + + +public class WebhookMessageLogOperations : Orm, IWebhookMessageLogOperations { + const int EXPIRE_DAYS = 7; + const int MAX_TRIES = 5; + + private readonly IQueue _queue; + private readonly ILogTracer _log; + private readonly IWebhookOperations _webhook; + + public WebhookMessageLogOperations(IStorage storage, IQueue queue, ILogTracer log, IServiceConfig config, ICreds creds, IHttpClientFactory httpFactory, IContainers containers) : base(storage, log, config) { + _queue = queue; + _log = log; + _webhook = new WebhookOperations(httpFactory: httpFactory, creds: creds, storage: storage, webhookMessageLogOperations: this, containers: containers, log: log, config: config); + } + + + public async Async.Task QueueWebhook(WebhookMessageLog webhookLog) { + var obj = new WebhookMessageQueueObj(webhookLog.WebhookId, webhookLog.EventId); + + TimeSpan? visibilityTimeout = webhookLog.State switch { + WebhookMessageState.Queued => TimeSpan.Zero, + WebhookMessageState.Retrying => TimeSpan.FromSeconds(30), + _ => null + }; + + if (visibilityTimeout == null) { + _log.WithTags( + new[] { + ("WebhookId", webhookLog.WebhookId.ToString()), + ("EventId", webhookLog.EventId.ToString()) } + ). + Error($"invalid WebhookMessage queue state, not queuing. {webhookLog.WebhookId}:{webhookLog.EventId} - {webhookLog.State}"); + } else { + await _queue.QueueObject("webhooks", obj, StorageType.Config, visibilityTimeout: visibilityTimeout); + } + } + + public async Async.Task ProcessFromQueue(WebhookMessageQueueObj obj) { + var message = await GetWebhookMessageById(obj.WebhookId, obj.EventId); + + if (message == null) { + _log.WithTags( + new[] { + ("WebhookId", obj.WebhookId.ToString()), + ("EventId", obj.EventId.ToString()) } + ). + Error($"webhook message log not found for webhookId: {obj.WebhookId} and eventId: {obj.EventId}"); + } else { + await Process(message); + } + } + + private async System.Threading.Tasks.Task Process(WebhookMessageLog message) { + + if (message.State == WebhookMessageState.Failed || message.State == WebhookMessageState.Succeeded) { + _log.WithTags( + new[] { + ("WebhookId", message.WebhookId.ToString()), + ("EventId", message.EventId.ToString()) } + ). + Error($"webhook message already handled. {message.WebhookId}:{message.EventId}"); + return; + } + + var newMessage = message with { TryCount = message.TryCount + 1 }; + + _log.Info($"sending webhook: {message.WebhookId}:{message.EventId}"); + var success = await Send(newMessage); + if (success) { + newMessage = newMessage with { State = WebhookMessageState.Succeeded }; + await Replace(newMessage); + _log.Info($"sent webhook event {newMessage.WebhookId}:{newMessage.EventId}"); + } else if (newMessage.TryCount < MAX_TRIES) { + newMessage = newMessage with { State = WebhookMessageState.Retrying }; + await Replace(newMessage); + await QueueWebhook(newMessage); + _log.Warning($"sending webhook event failed, re-queued {newMessage.WebhookId}:{newMessage.EventId}"); + } else { + newMessage = newMessage with { State = WebhookMessageState.Failed }; + await Replace(newMessage); + _log.Info($"sending webhook: {newMessage.WebhookId} event: {newMessage.EventId} failed {newMessage.TryCount} times."); + } + + } + + private async Async.Task Send(WebhookMessageLog message) { + var webhook = await _webhook.GetByWebhookId(message.WebhookId); + if (webhook == null) { + _log.WithTags( + new[] { + ("WebhookId", message.WebhookId.ToString()), + } + ). + Error($"webhook not found for webhookId: {message.WebhookId}"); + return false; + } + + try { + return await _webhook.Send(message); + } catch (Exception exc) { + _log.WithTags( + new[] { + ("WebhookId", message.WebhookId.ToString()) + } + ). + Exception(exc); + return false; + } + + } + + private void QueueObject(string v, WebhookMessageQueueObj obj, StorageType config, int? visibility_timeout) { + throw new NotImplementedException(); + } + + public IAsyncEnumerable SearchExpired() { + var expireTime = (DateTimeOffset.UtcNow - TimeSpan.FromDays(EXPIRE_DAYS)).ToString("o"); + + var timeFilter = $"Timestamp lt datetime'{expireTime}'"; + return QueryAsync(filter: timeFilter); + } + + public async Async.Task GetWebhookMessageById(Guid webhookId, Guid eventId) { + var data = QueryAsync(filter: $"PartitionKey eq '{webhookId}' and RowKey eq '{eventId}'"); + + return await data.FirstOrDefaultAsync(); + } +} diff --git a/src/ApiService/ApiService/packages.lock.json b/src/ApiService/ApiService/packages.lock.json index 35c0b219f..2e1238ae4 100644 --- a/src/ApiService/ApiService/packages.lock.json +++ b/src/ApiService/ApiService/packages.lock.json @@ -1,1067 +1,1067 @@ -{ - "version": 1, - "dependencies": { - "net6.0": { - "Azure.Core": { - "type": "Direct", - "requested": "[1.24.0, )", - "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.Data.Tables": { - "type": "Direct", - "requested": "[12.5.0, )", - "resolved": "12.5.0", - "contentHash": "XeIxPf+rF1NXkX3NJSB0ZTNgU233vyPXGmaFsR0lUVibtWP/lj+Qu1FcPxoslURcX0KC+UgTb226nqVdHjoweQ==", - "dependencies": { - "Azure.Core": "1.22.0", - "System.Text.Json": "4.7.2" - } - }, - "Azure.Identity": { - "type": "Direct", - "requested": "[1.6.0, )", - "resolved": "1.6.0", - "contentHash": "EycyMsb6rD2PK9P0SyibFfEhvWWttdrYhyPF4f41uzdB/44yQlV+2Wehxyg489Rj6gbPvSPgbKq0xsHJBhipZA==", - "dependencies": { - "Azure.Core": "1.24.0", - "Microsoft.Identity.Client": "4.39.0", - "Microsoft.Identity.Client.Extensions.Msal": "2.19.3", - "System.Memory": "4.5.4", - "System.Security.Cryptography.ProtectedData": "4.7.0", - "System.Text.Json": "4.7.2", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Azure.Messaging.EventGrid": { - "type": "Direct", - "requested": "[4.10.0, )", - "resolved": "4.10.0", - "contentHash": "X3dh3Cek/7wFPUrBJ2KbnkJteGjWvKBoSBmD/uQm8reMIavCFTKhnl95F937eLn/2cSsm5l3oPHtYPFtDerA7Q==", - "dependencies": { - "Azure.Core": "1.24.0", - "System.Memory.Data": "1.0.2", - "System.Text.Json": "4.7.2" - } - }, - "Azure.ResourceManager": { - "type": "Direct", - "requested": "[1.0.0, )", - "resolved": "1.0.0", - "contentHash": "UGaoiPcJ8a9Et030+F3zc2KhTssPAgPm7uXm4E9kyNI4jYYenUe6zj2J1bTimaTfcOZnn5scSjSYxKtZCzftcA==", - "dependencies": { - "Azure.Core": "1.24.0", - "System.Text.Json": "4.7.2" - } - }, - "Azure.ResourceManager.Compute": { - "type": "Direct", - "requested": "[1.0.0-beta.8, )", - "resolved": "1.0.0-beta.8", - "contentHash": "rYYjjmEdmcOa8O4UgO/bdJ/qQclNZjuHdalxRJ0AhUHCORcM1f1BbIKR9CoN83IpfuEE+X+n5XY9QZcKvfrGVA==", - "dependencies": { - "Azure.Core": "1.24.0", - "Azure.ResourceManager": "1.0.0", - "System.Text.Json": "4.7.2" - } - }, - "Azure.ResourceManager.Network": { - "type": "Direct", - "requested": "[1.0.0-beta.7, )", - "resolved": "1.0.0-beta.7", - "contentHash": "Ih8tb6OwxEEEEXATVzgX6oHJzVr9p4X6GfOfBnNAI3aIt9+G8blyQLltaCcJAGJ+dO1sBT/Nalgj/HinO+cBlw==", - "dependencies": { - "Azure.Core": "1.24.0", - "Azure.ResourceManager": "1.0.0", - "System.Text.Json": "4.7.2" - } - }, - "Azure.ResourceManager.Resources": { - "type": "Direct", - "requested": "[1.0.0, )", - "resolved": "1.0.0", - "contentHash": "oNQRWfh05v9BiY8DMQjV+++kVafR+3ry2FGfMKObovKNfAb4i5J6DQpv0CUIx4jeIZe0fnhxyXRRCe293YtMqw==", - "dependencies": { - "Azure.Core": "1.24.0", - "Azure.ResourceManager": "1.0.0", - "System.Text.Json": "4.7.2" - } - }, - "Azure.ResourceManager.Storage": { - "type": "Direct", - "requested": "[1.0.0-beta.8, )", - "resolved": "1.0.0-beta.8", - "contentHash": "tlVqStqG53lyGxr0dRq2KSkFdeC/+NQImWgsRXD9o5R4qBia4cx7zAGYBlnDeUxh1WldSZF5ZsBi2n5SAwxbxQ==", - "dependencies": { - "Azure.Core": "1.24.0", - "Azure.ResourceManager": "1.0.0", - "System.Text.Json": "4.7.2" - } - }, - "Azure.Security.KeyVault.Secrets": { - "type": "Direct", - "requested": "[4.3.0, )", - "resolved": "4.3.0", - "contentHash": "GRnmQzTXDVABry1rC8PwuVOHSDCUGn4Om1ABTCzWfHdDSOwRydtQ13ucJ1Z0YtdajklNwxEL6lhHGhFCI0diAw==", - "dependencies": { - "Azure.Core": "1.23.0", - "System.Memory": "4.5.4", - "System.Text.Json": "4.7.2", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Azure.Storage.Blobs": { - "type": "Direct", - "requested": "[12.11.0, )", - "resolved": "12.11.0", - "contentHash": "50eRjIhY7Q1JN7kT2MSawDKCcwSb7uRZUkz00P/BLjSg47gm2hxUYsnJPyvzCHntYMbOWzrvaVQTwYwXabaR5Q==", - "dependencies": { - "Azure.Storage.Common": "12.10.0", - "System.Text.Json": "4.7.2" - } - }, - "Azure.Storage.Queues": { - "type": "Direct", - "requested": "[12.9.0, )", - "resolved": "12.9.0", - "contentHash": "jDiyHtsCUCrWNvZW7SjJnJb46UhpdgQrWCbL8aWpapDHlq9LvbvxYpfLh4dfKAz09QiTznLMIU3i+md9+7GzqQ==", - "dependencies": { - "Azure.Storage.Common": "12.10.0", - "System.Memory.Data": "1.0.2", - "System.Text.Json": "4.7.2" - } - }, - "Faithlife.Utility": { - "type": "Direct", - "requested": "[0.12.2, )", - "resolved": "0.12.2", - "contentHash": "JgMAGj8ekeAzKkagubXqf1UqgfHq89GyA1UQYWbkAe441uRr2Rh2rktkx5Z0LPwmD/aOqu9cxjekD2GZjP8rbw==" - }, - "Microsoft.Azure.Functions.Worker": { - "type": "Direct", - "requested": "[1.6.0, )", - "resolved": "1.6.0", - "contentHash": "Gzq2IPcMCym6wPpFayLbuvhrfr72OEInJJlKaIAqU9+HldVaTt54cm3hPe7kIok+QuWnwb/TtYtlmrkR0Nbhsg==", - "dependencies": { - "Azure.Core": "1.10.0", - "Microsoft.Azure.Functions.Worker.Core": "1.4.0", - "Microsoft.Azure.Functions.Worker.Grpc": "1.3.1", - "Microsoft.Extensions.Hosting": "5.0.0", - "Microsoft.Extensions.Hosting.Abstractions": "5.0.0" - } - }, - "Microsoft.Azure.Functions.Worker.Extensions.EventGrid": { - "type": "Direct", - "requested": "[2.1.0, )", - "resolved": "2.1.0", - "contentHash": "8Kjhxaj2gK2Bi5K5jiNAG/e9tTlRItFNCINj+kfUDMBbf5lsiZUBChyAQCxrnITeHKkwAtgXB7GBX4W1Xcoc0A==", - "dependencies": { - "Microsoft.Azure.Functions.Worker.Extensions.Abstractions": "1.0.0" - } - }, - "Microsoft.Azure.Functions.Worker.Extensions.Http": { - "type": "Direct", - "requested": "[3.0.13, )", - "resolved": "3.0.13", - "contentHash": "GX41psGbjLSPKuFnBcGGB7PAAdhfLsgxvGVsyGq/jQwgGwjAVRRx2UbSl35+imKwCPZdT5vGjq6YV1rgXIeEvA==", - "dependencies": { - "Microsoft.Azure.Functions.Worker.Extensions.Abstractions": "1.0.0" - } - }, - "Microsoft.Azure.Functions.Worker.Extensions.SignalRService": { - "type": "Direct", - "requested": "[1.7.0, )", - "resolved": "1.7.0", - "contentHash": "mgk7ZnrXLPCI70cYgqxi+TJMJJgRMPYzZwIFMpxP2cto3D6XSxbF8eGj46T4DwopBBqWpfJ4Y2QFB93hNb4Yxg==", - "dependencies": { - "Microsoft.Azure.Functions.Worker.Extensions.Abstractions": "1.1.0", - "Microsoft.Extensions.Primitives": "5.0.1", - "System.Text.Json": "5.0.2" - } - }, - "Microsoft.Azure.Functions.Worker.Extensions.Storage": { - "type": "Direct", - "requested": "[5.0.0, )", - "resolved": "5.0.0", - "contentHash": "VwcmWk29//8CkXCxCR7vxMnqsuh+O0018eavRCGscI+uRKHdvlHDG97vwfdwuTzwKuoo7ztQbAvHfkp+sxoiEQ==", - "dependencies": { - "Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs": "5.0.0", - "Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues": "5.0.0" - } - }, - "Microsoft.Azure.Functions.Worker.Extensions.Timer": { - "type": "Direct", - "requested": "[4.1.0, )", - "resolved": "4.1.0", - "contentHash": "8HvZaChaw40EKBfBew0XG132YhO6bEw0nznvey7gkhm9thUe6wkA2LXTXHXxcYefbx0rlh57WedSiJgKTG7MvQ==", - "dependencies": { - "Microsoft.Azure.Functions.Worker.Extensions.Abstractions": "1.0.0" - } - }, - "Microsoft.Azure.Functions.Worker.Sdk": { - "type": "Direct", - "requested": "[1.3.0, )", - "resolved": "1.3.0", - "contentHash": "g9oXOl9xr1O3alWItAiYLNu3BnXebLW51BRB06yuO86LPGRZewyJu88EwUdC2NU9wnIeE3/ObMuEAnRALZeuTQ==", - "dependencies": { - "Microsoft.Azure.Functions.Worker.Sdk.Analyzers": "1.1.0" - } - }, - "Microsoft.Extensions.Logging.ApplicationInsights": { - "type": "Direct", - "requested": "[2.20.0, )", - "resolved": "2.20.0", - "contentHash": "phuNUDeTlffkJi6zAsMQNOpijNOQ4Olda1WL2L+F33u4fqXmY+EGQnPg81rHW6dOXIYCQvrQUr2gVN5NNMvwKA==", - "dependencies": { - "Microsoft.ApplicationInsights": "2.20.0", - "Microsoft.Extensions.Logging": "2.1.1" - } - }, - "Microsoft.Graph": { - "type": "Direct", - "requested": "[4.24.0, )", - "resolved": "4.24.0", - "contentHash": "OPyHQ+EzuYjp3XExGB0SvySXY3pxU+bXLl3ADdvje/yOMFvpNOpEu111tmh2aM/RCplaoMQjBA5oa9pUVIH0cg==", - "dependencies": { - "Microsoft.Graph.Core": "2.0.8" - } - }, - "Microsoft.Identity.Client": { - "type": "Direct", - "requested": "[4.43.0, )", - "resolved": "4.43.0", - "contentHash": "uaUMZB3Ywi7IPVvgRZOQotlYhD8sA4wtZESkA0qF9SYAifr1RzJyaGTFtfbAyZ/J5kGUhRklrCJIRpd0MaihKQ==" - }, - "Microsoft.Identity.Web.TokenCache": { - "type": "Direct", - "requested": "[1.23.1, )", - "resolved": "1.23.1", - "contentHash": "fU85i6XDUXL/z6B+pTmNZbof0hL9Jkgsi6GWpQEWjL7Ek0GH0A8btxbqzojPCRdGN7EK/vyEVu5Smy9/spZj2g==", - "dependencies": { - "Microsoft.AspNetCore.DataProtection": "5.0.8", - "Microsoft.Extensions.Caching.Memory": "5.0.0", - "Microsoft.Extensions.Logging": "5.0.0", - "Microsoft.Identity.Client": "4.42.0", - "System.Text.Encodings.Web": "5.0.1" - } - }, - "System.IdentityModel.Tokens.Jwt": { - "type": "Direct", - "requested": "[6.17.0, )", - "resolved": "6.17.0", - "contentHash": "G3rY4WLr54Mo+97+AEq0ANpiKvW7E8Qu5bKWfVMa7rkyJtvrOxUqp/OLqrGw/6JDbD5GlxnAtFKukGteUuB0rQ==", - "dependencies": { - "Microsoft.IdentityModel.JsonWebTokens": "6.17.0", - "Microsoft.IdentityModel.Tokens": "6.17.0" - } - }, - "System.Linq.Async": { - "type": "Direct", - "requested": "[6.0.1, )", - "resolved": "6.0.1", - "contentHash": "0YhHcaroWpQ9UCot3Pizah7ryAzQhNvobLMSxeDIGmnXfkQn8u5owvpOH0K6EVB+z9L7u6Cc4W17Br/+jyttEQ==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "6.0.0" - } - }, - "Azure.Storage.Common": { - "type": "Transitive", - "resolved": "12.10.0", - "contentHash": "vYkHGzUkdZTace/cDPZLG+Mh/EoPqQuGxDIBOau9D+XWoDPmuUFGk325aXplkFE4JFGpSwoytNYzk/qBCaiHqg==", - "dependencies": { - "Azure.Core": "1.22.0", - "System.IO.Hashing": "6.0.0" - } - }, - "Google.Protobuf": { - "type": "Transitive", - "resolved": "3.15.8", - "contentHash": "tA0S9QXJq+r3CjwBlcn5glEUrbdAxhPWO4yhq5+ycn6WW6+nsvqzO6Qf6NE9XWbEz/F2QSpBTxjdTI7SvVy7CQ==", - "dependencies": { - "System.Memory": "4.5.3", - "System.Runtime.CompilerServices.Unsafe": "4.5.2" - } - }, - "Grpc.Core.Api": { - "type": "Transitive", - "resolved": "2.37.0", - "contentHash": "ubqW2nTpiHyDudYGVXM+Vjh6WbgsI1fVQxsDK14/GnyPgiNMuNl8+GQcAYp5QPhAk5H4fjHJPI+KvbpVk8z6iQ==", - "dependencies": { - "System.Memory": "4.5.3" - } - }, - "Grpc.Net.Client": { - "type": "Transitive", - "resolved": "2.37.0", - "contentHash": "oMDNXAPkBzfXljv/ZzlZSf22TEstBNI6je85/c3iztlFbbixTMLgi0sIu/uHtEKoEWUPr0nmBMvD+jtqKorGTg==", - "dependencies": { - "Grpc.Net.Common": "2.37.0", - "Microsoft.Extensions.Logging.Abstractions": "3.0.3" - } - }, - "Grpc.Net.ClientFactory": { - "type": "Transitive", - "resolved": "2.37.0", - "contentHash": "zyeFej1A36+s5K6+zDUirmDEGHEFnHapQisT7YsR9nQqKsw1uYqjtG1gSVSg/Zvk0KYeLHs5/URtTU71kS4APg==", - "dependencies": { - "Grpc.Net.Client": "2.37.0", - "Microsoft.Extensions.Http": "3.0.3" - } - }, - "Grpc.Net.Common": { - "type": "Transitive", - "resolved": "2.37.0", - "contentHash": "V7fZb+87qB6Jio6uWXDHkxI9WT+y4EFwicAHkzB2lm/9wJazD0V35HhQjxvoONsldObaUimjqd4b/XZ0G07sDQ==", - "dependencies": { - "Grpc.Core.Api": "2.37.0" - } - }, - "Microsoft.ApplicationInsights": { - "type": "Transitive", - "resolved": "2.20.0", - "contentHash": "mb+EC5j06Msn5HhKrhrsMAst6JxvYUnphQMGY2cixCabgGAO3q79Y8o/p1Zce1Azgd1IVkRKAMzAV4vDCbXOqA==", - "dependencies": { - "System.Diagnostics.DiagnosticSource": "5.0.0" - } - }, - "Microsoft.AspNetCore.Cryptography.Internal": { - "type": "Transitive", - "resolved": "5.0.8", - "contentHash": "giHheyNLOb+cAHpb8b0GhaS0xJ+hAIIDSyWPe5aOPwpgctsjOPRKFyn/268xv+zBVuEtyRJJEnBUlkOVzyIpZA==" - }, - "Microsoft.AspNetCore.DataProtection": { - "type": "Transitive", - "resolved": "5.0.8", - "contentHash": "wCMdfuKA+ePcB4nEDau5tNhhhC5NFa2LEXoRhk2Xaot13FFlyKA4t5UzIyV/OnAfB/bqbAIvChJD+biWY7u5SA==", - "dependencies": { - "Microsoft.AspNetCore.Cryptography.Internal": "5.0.8", - "Microsoft.AspNetCore.DataProtection.Abstractions": "5.0.8", - "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.8", - "contentHash": "ZI9S2NGjuOKXN3PxJcF8EKVwd1cqpWyUSqiVoH8gqq5tlHaXULwPmoR0DBOFON4sEFETRWI69f5RQ3tJWw205A==" - }, - "Microsoft.Azure.Functions.Worker.Core": { - "type": "Transitive", - "resolved": "1.4.0", - "contentHash": "6fTSb6JDm+1CNKsaPziL36c3tfN4xxYnC9XoJsm0g9tY+72dVqUa2aPc6RtkwBmT5sjNrsUDlUC+IhG+ehjppQ==", - "dependencies": { - "Azure.Core": "1.10.0", - "Microsoft.Extensions.Hosting": "5.0.0", - "Microsoft.Extensions.Hosting.Abstractions": "5.0.0" - } - }, - "Microsoft.Azure.Functions.Worker.Extensions.Abstractions": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "kAs9BTuzdOvyuN2m5CYyQzyvzXKJ6hhIOgcwm0W8Q+Fwj91a1eBmRSi9pVzpM4V3skNt/+pkPD3wxFD4nEw0bg==" - }, - "Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "Cr+ziBQA/Lyt5rMURHBje+foGook+B82gnAfEE32bHcXGlpKJnnVdLqHy0OqHliUksFddkRYS2gY8dYx+NH/mA==", - "dependencies": { - "Microsoft.Azure.Functions.Worker.Extensions.Abstractions": "1.1.0" - } - }, - "Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "cF95kiiU6PD9sptrV3GKQKzRv2DYATYNTpOtvUtbAYQ4xPFKgF4ke3fDBcu+cu2O1/C8FQ7MhzkEQv00bx552A==", - "dependencies": { - "Microsoft.Azure.Functions.Worker.Extensions.Abstractions": "1.1.0" - } - }, - "Microsoft.Azure.Functions.Worker.Grpc": { - "type": "Transitive", - "resolved": "1.3.1", - "contentHash": "lMlbyfRagSQZVWN73jnaB0tVTMhfKHSy6IvFXC7fCGh+7uA9LJNjcMOQbVkUnmvb/I/SxslMqD7xcebrxFL3TQ==", - "dependencies": { - "Azure.Core": "1.10.0", - "Google.Protobuf": "3.15.8", - "Grpc.Net.Client": "2.37.0", - "Grpc.Net.ClientFactory": "2.37.0", - "Microsoft.Azure.Functions.Worker.Core": "1.3.1", - "Microsoft.Extensions.Hosting": "5.0.0", - "Microsoft.Extensions.Hosting.Abstractions": "5.0.0" - } - }, - "Microsoft.Azure.Functions.Worker.Sdk.Analyzers": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "J7AZ9iv/UCd4Di0c84h1P/Sa1aQr5uqO0EBUKwE0AZeWJ11dDfKAwxMiAxYOKR+giy31DWBnuFc4GKY3BQYUjg==" - }, - "Microsoft.Bcl.AsyncInterfaces": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" - }, - "Microsoft.CSharp": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ==" - }, - "Microsoft.Extensions.Caching.Abstractions": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "bu8As90/SBAouMZ6fJ+qRNo1X+KgHGrVueFhhYi+E5WqEhcnp2HoWRFnMzXQ6g4RdZbvPowFerSbKNH4Dtg5yg==", - "dependencies": { - "Microsoft.Extensions.Primitives": "5.0.0" - } - }, - "Microsoft.Extensions.Caching.Memory": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "/1qPCleFOkJe0O+xmFqCNLFYQZTJz965sVw8CUB/BQgsApBwzAUsL2BUkDvQW+geRUVTXUS9zLa0pBjC2VJ1gA==", - "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "5.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0", - "Microsoft.Extensions.Logging.Abstractions": "5.0.0", - "Microsoft.Extensions.Options": "5.0.0", - "Microsoft.Extensions.Primitives": "5.0.0" - } - }, - "Microsoft.Extensions.Configuration": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "LN322qEKHjuVEhhXueTUe7RNePooZmS8aGid5aK2woX3NPjSnONFyKUc6+JknOS6ce6h2tCLfKPTBXE3mN/6Ag==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "5.0.0", - "Microsoft.Extensions.Primitives": "5.0.0" - } - }, - "Microsoft.Extensions.Configuration.Abstractions": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "ETjSBHMp3OAZ4HxGQYpwyGsD8Sw5FegQXphi0rpoGMT74S4+I2mm7XJEswwn59XAaKOzC15oDSOWEE8SzDCd6Q==", - "dependencies": { - "Microsoft.Extensions.Primitives": "5.0.0" - } - }, - "Microsoft.Extensions.Configuration.Binder": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "Of1Irt1+NzWO+yEYkuDh5TpT4On7LKl98Q9iLqCdOZps6XXEWDj3AKtmyvzJPVXZe4apmkJJIiDL7rR1yC+hjQ==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "5.0.0" - } - }, - "Microsoft.Extensions.Configuration.CommandLine": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "OelM+VQdhZ0XMXsEQBq/bt3kFzD+EBGqR4TAgFDRAye0JfvHAaRi+3BxCRcwqUAwDhV0U0HieljBGHlTgYseRA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "5.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "5.0.0" - } - }, - "Microsoft.Extensions.Configuration.EnvironmentVariables": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "fqh6y6hAi0Z0fRsb4B/mP9OkKkSlifh5osa+N/YSQ+/S2a//+zYApZMUC1XeP9fdjlgZoPQoZ72Q2eLHyKLddQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "5.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "5.0.0" - } - }, - "Microsoft.Extensions.Configuration.FileExtensions": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "rRdspYKA18ViPOISwAihhCMbusHsARCOtDMwa23f+BGEdIjpKPlhs3LLjmKlxfhpGXBjIsS0JpXcChjRUN+PAw==", - "dependencies": { - "Microsoft.Extensions.Configuration": "5.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "5.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "5.0.0", - "Microsoft.Extensions.FileProviders.Physical": "5.0.0", - "Microsoft.Extensions.Primitives": "5.0.0" - } - }, - "Microsoft.Extensions.Configuration.Json": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "Pak8ymSUfdzPfBTLHxeOwcR32YDbuVfhnH2hkfOLnJNQd19ItlBdpMjIDY9C5O/nS2Sn9bzDMai0ZrvF7KyY/Q==", - "dependencies": { - "Microsoft.Extensions.Configuration": "5.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "5.0.0", - "Microsoft.Extensions.Configuration.FileExtensions": "5.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "5.0.0" - } - }, - "Microsoft.Extensions.Configuration.UserSecrets": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "+tK3seG68106lN277YWQvqmfyI/89w0uTu/5Gz5VYSUu5TI4mqwsaWLlSmT9Bl1yW/i1Nr06gHJxqaqB5NU9Tw==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "5.0.0", - "Microsoft.Extensions.Configuration.Json": "5.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "5.0.0", - "Microsoft.Extensions.FileProviders.Physical": "5.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "Rc2kb/p3Ze6cP6rhFC3PJRdWGbLvSHZc0ev7YlyeU6FmHciDMLrhoVoTUEzKPhN5ZjFgKF1Cf5fOz8mCMIkvpA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "ORj7Zh81gC69TyvmcUm9tSzytcy8AVousi+IVRAI8nLieQjOFryRusSFh7+aLk16FN9pQNqJAiMd7BTKINK0kA==" - }, - "Microsoft.Extensions.FileProviders.Abstractions": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "iuZIiZ3mteEb+nsUqpGXKx2cGF+cv6gWPd5jqQI4hzqdiJ6I94ddLjKhQOuRW1lueHwocIw30xbSHGhQj0zjdQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "5.0.0" - } - }, - "Microsoft.Extensions.FileProviders.Physical": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "1rkd8UO2qf21biwO7X0hL9uHP7vtfmdv/NLvKgCRHkdz1XnW8zVQJXyEYiN68WYpExgtVWn55QF0qBzgfh1mGg==", - "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "5.0.0", - "Microsoft.Extensions.FileSystemGlobbing": "5.0.0", - "Microsoft.Extensions.Primitives": "5.0.0" - } - }, - "Microsoft.Extensions.FileSystemGlobbing": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "ArliS8lGk8sWRtrWpqI8yUVYJpRruPjCDT+EIjrgkA/AAPRctlAkRISVZ334chAKktTLzD1+PK8F5IZpGedSqA==" - }, - "Microsoft.Extensions.Hosting": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "hiokSU1TOVfcqpQAnpiOzP2rE9p+niq92g5yeAnwlbSrUlIdIS6M8emCknZvhdOagQA9x5YWNwe1n0kFUwE0NQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "5.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "5.0.0", - "Microsoft.Extensions.Configuration.Binder": "5.0.0", - "Microsoft.Extensions.Configuration.CommandLine": "5.0.0", - "Microsoft.Extensions.Configuration.EnvironmentVariables": "5.0.0", - "Microsoft.Extensions.Configuration.FileExtensions": "5.0.0", - "Microsoft.Extensions.Configuration.Json": "5.0.0", - "Microsoft.Extensions.Configuration.UserSecrets": "5.0.0", - "Microsoft.Extensions.DependencyInjection": "5.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "5.0.0", - "Microsoft.Extensions.FileProviders.Physical": "5.0.0", - "Microsoft.Extensions.Hosting.Abstractions": "5.0.0", - "Microsoft.Extensions.Logging": "5.0.0", - "Microsoft.Extensions.Logging.Abstractions": "5.0.0", - "Microsoft.Extensions.Logging.Configuration": "5.0.0", - "Microsoft.Extensions.Logging.Console": "5.0.0", - "Microsoft.Extensions.Logging.Debug": "5.0.0", - "Microsoft.Extensions.Logging.EventLog": "5.0.0", - "Microsoft.Extensions.Logging.EventSource": "5.0.0", - "Microsoft.Extensions.Options": "5.0.0" - } - }, - "Microsoft.Extensions.Hosting.Abstractions": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "cbUOCePYBl1UhM+N2zmDSUyJ6cODulbtUd9gEzMFIK3RQDtP/gJsE08oLcBSXH3Q1RAQ0ex7OAB3HeTKB9bXpg==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "5.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0", - "Microsoft.Extensions.FileProviders.Abstractions": "5.0.0" - } - }, - "Microsoft.Extensions.Http": { - "type": "Transitive", - "resolved": "3.0.3", - "contentHash": "dcyB8szIcSynjVZRuFgqkZpPgTc5zeRSj1HMXSmNqWbHYKiPYJl8ZQgBHz6wmZNSUUNGpCs5uxUg8DZHHDC1Ew==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "3.0.3", - "Microsoft.Extensions.Logging": "3.0.3", - "Microsoft.Extensions.Options": "3.0.3" - } - }, - "Microsoft.Extensions.Logging": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "MgOwK6tPzB6YNH21wssJcw/2MKwee8b2gI7SllYfn6rvTpIrVvVS5HAjSU2vqSku1fwqRvWP0MdIi14qjd93Aw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "5.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0", - "Microsoft.Extensions.Logging.Abstractions": "5.0.0", - "Microsoft.Extensions.Options": "5.0.0" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "NxP6ahFcBnnSfwNBi2KH2Oz8Xl5Sm2krjId/jRR3I7teFphwiUoUeZPwTNA21EX+5PtjqmyAvKaOeBXcJjcH/w==" - }, - "Microsoft.Extensions.Logging.Configuration": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "N3/d0HeMRnBekadbZlmbp+In8EvNNkQHSdbtRzjrGVckdZWpYs5GNrAfaYqVplDFW0WUedSaFJ3khB50BWYGsw==", - "dependencies": { - "Microsoft.Extensions.Configuration": "5.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "5.0.0", - "Microsoft.Extensions.Configuration.Binder": "5.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0", - "Microsoft.Extensions.Logging": "5.0.0", - "Microsoft.Extensions.Logging.Abstractions": "5.0.0", - "Microsoft.Extensions.Options": "5.0.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "5.0.0" - } - }, - "Microsoft.Extensions.Logging.Console": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "jH0wbWhfvXjOVmCkbra4vbiovDtTUIWLQjCeJ7Xun3h4AHvwfzm7V7wlsXKs3tNnPrsCxZ9oaV0vUAgGY1JxOA==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "5.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0", - "Microsoft.Extensions.Logging": "5.0.0", - "Microsoft.Extensions.Logging.Abstractions": "5.0.0", - "Microsoft.Extensions.Logging.Configuration": "5.0.0", - "Microsoft.Extensions.Options": "5.0.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "5.0.0" - } - }, - "Microsoft.Extensions.Logging.Debug": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "9dvt0xqRrClvhaPNpfyS39WxnW9G55l5lrV5ZX7IrEgwo4VwtmJKtoPiKVYKbhAuOBGUI5WY3hWLvF+PSbJp5A==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0", - "Microsoft.Extensions.Logging": "5.0.0", - "Microsoft.Extensions.Logging.Abstractions": "5.0.0" - } - }, - "Microsoft.Extensions.Logging.EventLog": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "CYzsgF2lqgahGl/HuErsIDaZZ9ueN+MBjGfO/0jVDLPaXLaywxlGKFpDgXMaB053DRYZwD1H2Lb1I60mTXS3jg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0", - "Microsoft.Extensions.Logging": "5.0.0", - "Microsoft.Extensions.Logging.Abstractions": "5.0.0", - "Microsoft.Extensions.Options": "5.0.0", - "System.Diagnostics.EventLog": "5.0.0" - } - }, - "Microsoft.Extensions.Logging.EventSource": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "hF+D6PJkrM0qXcSEGs1BwZwgP8c0BRkj26P/5wmYTcHKOp52GRey/Z/YKRmRIHIrXxj9tz/JgIjU9oWmiJ5HMw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0", - "Microsoft.Extensions.Logging": "5.0.0", - "Microsoft.Extensions.Logging.Abstractions": "5.0.0", - "Microsoft.Extensions.Options": "5.0.0", - "Microsoft.Extensions.Primitives": "5.0.0" - } - }, - "Microsoft.Extensions.Options": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "CBvR92TCJ5uBIdd9/HzDSrxYak+0W/3+yxrNg8Qm6Bmrkh5L+nu6m3WeazQehcZ5q1/6dDA7J5YdQjim0165zg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0", - "Microsoft.Extensions.Primitives": "5.0.0" - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "280RxNJqOeQqq47aJLy5D9LN61CAWeuRA83gPToQ8B9jl9SNdQ5EXjlfvF66zQI5AXMl+C/3hGnbtIEN+X3mqA==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "5.0.0", - "Microsoft.Extensions.Configuration.Binder": "5.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0", - "Microsoft.Extensions.Options": "5.0.0", - "Microsoft.Extensions.Primitives": "5.0.0" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "5.0.1", - "contentHash": "5WPSmL4YeP7eW+Vc8XZ4DwjYWBAiSwDV9Hm63JJWcz1Ie3Xjv4KuJXzgCstj48LkLfVCYa7mLcx7y+q6yqVvtw==" - }, - "Microsoft.Graph.Core": { - "type": "Transitive", - "resolved": "2.0.8", - "contentHash": "CcsCgY1O+LQaKMJkQCpVZPmK6uiFFUu49MwqTxoTBYtFG2/NwyGAIpla5gct8jWlS0DBKXWAyRlIzKt/6UGIDQ==", - "dependencies": { - "Azure.Core": "1.22.0", - "Microsoft.Identity.Client": "4.41.0", - "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.15.1", - "System.Diagnostics.DiagnosticSource": "4.7.1", - "System.Security.Claims": "4.3.0", - "System.Text.Json": "6.0.2" - } - }, - "Microsoft.Identity.Client.Extensions.Msal": { - "type": "Transitive", - "resolved": "2.19.3", - "contentHash": "zVVZjn8aW7W79rC1crioDgdOwaFTQorsSO6RgVlDDjc7MvbEGz071wSNrjVhzR0CdQn6Sefx7Abf1o7vasmrLg==", - "dependencies": { - "Microsoft.Identity.Client": "4.38.0", - "System.Security.Cryptography.ProtectedData": "4.5.0" - } - }, - "Microsoft.IdentityModel.JsonWebTokens": { - "type": "Transitive", - "resolved": "6.17.0", - "contentHash": "I3cSVE185qF3a222/iQIdmBFhrhZBtz7wZ1RUUbMuHC1un79XCI7vggbWdmbqIttFcUoeziemadO6t+3FLjcSA==", - "dependencies": { - "Microsoft.IdentityModel.Tokens": "6.17.0" - } - }, - "Microsoft.IdentityModel.Logging": { - "type": "Transitive", - "resolved": "6.17.0", - "contentHash": "Ix6/CMLDoo939NDf1ARDuGK6YERY7pAX9WYbfwb4gZqx7r52unMFIykJk+zlEBX7jjtbDz/0uzikQFvheV9KsQ==" - }, - "Microsoft.IdentityModel.Protocols": { - "type": "Transitive", - "resolved": "6.15.1", - "contentHash": "6nHr+4yE8vj620Vy4L0pl7kmkvWc06wBrJ+AOo/gjqzu/UD/MYgySUqRGlZYrvvNmKkUWMw4hdn78MPCb4bstA==", - "dependencies": { - "Microsoft.IdentityModel.Logging": "6.15.1", - "Microsoft.IdentityModel.Tokens": "6.15.1" - } - }, - "Microsoft.IdentityModel.Protocols.OpenIdConnect": { - "type": "Transitive", - "resolved": "6.15.1", - "contentHash": "WwecgT/PNrytLNUWjkYtnnG2LXMAzkINSaZM+8dPPiEpOGz1bQDBWAenTSurYICxGoA1sOPriFXk+ocnQyprKw==", - "dependencies": { - "Microsoft.IdentityModel.Protocols": "6.15.1", - "System.IdentityModel.Tokens.Jwt": "6.15.1" - } - }, - "Microsoft.IdentityModel.Tokens": { - "type": "Transitive", - "resolved": "6.17.0", - "contentHash": "mhOe+d9BQg5U45TkTCyXAFOjl7RvwaFj6v9qo8b+WFolkuGsfjSFfQ+WI9D3ho9sD/fK75gvL4JptmjLzyUPkw==", - "dependencies": { - "Microsoft.CSharp": "4.5.0", - "Microsoft.IdentityModel.Logging": "6.17.0", - "System.Security.Cryptography.Cng": "4.5.0" - } - }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, - "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": "5.0.0", - "contentHash": "Bh6blKG8VAKvXiLe2L+sEsn62nc1Ij34MrNxepD2OCrS5cpCwQa9MeLyhVQPQ/R4Wlzwuy6wMK8hLb11QPDRsQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "5.0.0" - } - }, - "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.Diagnostics.DiagnosticSource": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "tCQTzPsGZh/A9LhhA6zrqCRV4hOHsK90/G7q3Khxmn6tnB1PuNU0cRaKANP2AWcF9bn0zsuOoZOSrHuJk6oNBA==" - }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "FHkCwUfsTs+/5tsK+c0egLfacUgbhvcwi3wUFWSEEArSXao343mYqcpOVVFMlcCkdNtjU4YwAWaKYwal6f02og==", - "dependencies": { - "Microsoft.NETCore.Platforms": "5.0.0", - "Microsoft.Win32.Registry": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.Drawing.Common": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "SztFwAnpfKC8+sEKXAFxCBWhKQaEd97EiOL7oZJZP56zbqnLpmxACWA8aGseaUExciuEAUuR9dY8f7HkTRAdnw==", - "dependencies": { - "Microsoft.Win32.SystemEvents": "5.0.0" - } - }, - "System.Formats.Asn1": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "MTvUIktmemNB+El0Fgw9egyqT9AYSIk6DTJeoDSpc3GIHxHCMo8COqkWT1mptX5tZ1SlQ6HJZ0OsSvMth1c12w==" - }, - "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.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.Hashing": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "Rfm2jYCaUeGysFEZjDe7j1R4x6Z6BzumS/vUT5a1AA/AWJuGX71PoGB0RmpyX3VmrGqVnAwtfMn39OHR8Y/5+g==" - }, - "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.Numerics.Vectors": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" - }, - "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.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.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.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.Security.AccessControl": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.Security.Claims": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==", - "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.Security.Principal": "4.3.0" - } - }, - "System.Security.Cryptography.Cng": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "jIMXsKn94T9JY7PvPq/tMfqa6GAaHpElRDpmG+SuL+D3+sTw2M8VhnibKnN8Tq+4JqbPJ/f+BwtLeDMEnzAvRg==", - "dependencies": { - "System.Formats.Asn1": "5.0.0" - } - }, - "System.Security.Cryptography.Pkcs": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "9TPLGjBCGKmNvG8pjwPeuYy0SMVmGZRwlTZvyPHDbYv/DRkoeumJdfumaaDNQzVGMEmbWtg07zUpSW9q70IlDQ==", - "dependencies": { - "System.Formats.Asn1": "5.0.0", - "System.Security.Cryptography.Cng": "5.0.0" - } - }, - "System.Security.Cryptography.ProtectedData": { - "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "ehYW0m9ptxpGWvE4zgqongBVWpSDU/JCFD4K7krxkQwSz/sFQjEXCUqpvencjy6DYDbn7Ig09R8GFffu8TtneQ==" - }, - "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": "5.0.0", - "contentHash": "uE8juAhEkp7KDBCdjDIE3H9R1HJuEHqeqX8nLX9gmYKWwsqk3T5qZlPx8qle5DPKimC/Fy3AFTdV7HamgCh9qQ==", - "dependencies": { - "System.Security.AccessControl": "5.0.0", - "System.Windows.Extensions": "5.0.0" - } - }, - "System.Security.Principal": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", - "dependencies": { - "System.Runtime": "4.3.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.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.2", - "contentHash": "0nE2gwXLn3PTBOPwORLqwuYvWB+Beomt9ZBX+6LmogMNKUvfD1SoDb/ycB1vBntT94rGaB/SvxEyeLu14H6aEg==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.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.Extensions": { - "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" - }, - "System.Windows.Extensions": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "c1ho9WU9ZxMZawML+ssPKZfdnrg/OjR3pe0m9v8230z3acqphwvPJqzAkH54xRYm5ntZHGG1EPP3sux9H3qSPg==", - "dependencies": { - "System.Drawing.Common": "5.0.0" - } - } - } - } +{ + "version": 1, + "dependencies": { + "net6.0": { + "Azure.Core": { + "type": "Direct", + "requested": "[1.24.0, )", + "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.Data.Tables": { + "type": "Direct", + "requested": "[12.5.0, )", + "resolved": "12.5.0", + "contentHash": "XeIxPf+rF1NXkX3NJSB0ZTNgU233vyPXGmaFsR0lUVibtWP/lj+Qu1FcPxoslURcX0KC+UgTb226nqVdHjoweQ==", + "dependencies": { + "Azure.Core": "1.22.0", + "System.Text.Json": "4.7.2" + } + }, + "Azure.Identity": { + "type": "Direct", + "requested": "[1.6.0, )", + "resolved": "1.6.0", + "contentHash": "EycyMsb6rD2PK9P0SyibFfEhvWWttdrYhyPF4f41uzdB/44yQlV+2Wehxyg489Rj6gbPvSPgbKq0xsHJBhipZA==", + "dependencies": { + "Azure.Core": "1.24.0", + "Microsoft.Identity.Client": "4.39.0", + "Microsoft.Identity.Client.Extensions.Msal": "2.19.3", + "System.Memory": "4.5.4", + "System.Security.Cryptography.ProtectedData": "4.7.0", + "System.Text.Json": "4.7.2", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "Azure.Messaging.EventGrid": { + "type": "Direct", + "requested": "[4.10.0, )", + "resolved": "4.10.0", + "contentHash": "X3dh3Cek/7wFPUrBJ2KbnkJteGjWvKBoSBmD/uQm8reMIavCFTKhnl95F937eLn/2cSsm5l3oPHtYPFtDerA7Q==", + "dependencies": { + "Azure.Core": "1.24.0", + "System.Memory.Data": "1.0.2", + "System.Text.Json": "4.7.2" + } + }, + "Azure.ResourceManager": { + "type": "Direct", + "requested": "[1.0.0, )", + "resolved": "1.0.0", + "contentHash": "UGaoiPcJ8a9Et030+F3zc2KhTssPAgPm7uXm4E9kyNI4jYYenUe6zj2J1bTimaTfcOZnn5scSjSYxKtZCzftcA==", + "dependencies": { + "Azure.Core": "1.24.0", + "System.Text.Json": "4.7.2" + } + }, + "Azure.ResourceManager.Compute": { + "type": "Direct", + "requested": "[1.0.0-beta.8, )", + "resolved": "1.0.0-beta.8", + "contentHash": "rYYjjmEdmcOa8O4UgO/bdJ/qQclNZjuHdalxRJ0AhUHCORcM1f1BbIKR9CoN83IpfuEE+X+n5XY9QZcKvfrGVA==", + "dependencies": { + "Azure.Core": "1.24.0", + "Azure.ResourceManager": "1.0.0", + "System.Text.Json": "4.7.2" + } + }, + "Azure.ResourceManager.Network": { + "type": "Direct", + "requested": "[1.0.0-beta.7, )", + "resolved": "1.0.0-beta.7", + "contentHash": "Ih8tb6OwxEEEEXATVzgX6oHJzVr9p4X6GfOfBnNAI3aIt9+G8blyQLltaCcJAGJ+dO1sBT/Nalgj/HinO+cBlw==", + "dependencies": { + "Azure.Core": "1.24.0", + "Azure.ResourceManager": "1.0.0", + "System.Text.Json": "4.7.2" + } + }, + "Azure.ResourceManager.Resources": { + "type": "Direct", + "requested": "[1.0.0, )", + "resolved": "1.0.0", + "contentHash": "oNQRWfh05v9BiY8DMQjV+++kVafR+3ry2FGfMKObovKNfAb4i5J6DQpv0CUIx4jeIZe0fnhxyXRRCe293YtMqw==", + "dependencies": { + "Azure.Core": "1.24.0", + "Azure.ResourceManager": "1.0.0", + "System.Text.Json": "4.7.2" + } + }, + "Azure.ResourceManager.Storage": { + "type": "Direct", + "requested": "[1.0.0-beta.8, )", + "resolved": "1.0.0-beta.8", + "contentHash": "tlVqStqG53lyGxr0dRq2KSkFdeC/+NQImWgsRXD9o5R4qBia4cx7zAGYBlnDeUxh1WldSZF5ZsBi2n5SAwxbxQ==", + "dependencies": { + "Azure.Core": "1.24.0", + "Azure.ResourceManager": "1.0.0", + "System.Text.Json": "4.7.2" + } + }, + "Azure.Security.KeyVault.Secrets": { + "type": "Direct", + "requested": "[4.3.0, )", + "resolved": "4.3.0", + "contentHash": "GRnmQzTXDVABry1rC8PwuVOHSDCUGn4Om1ABTCzWfHdDSOwRydtQ13ucJ1Z0YtdajklNwxEL6lhHGhFCI0diAw==", + "dependencies": { + "Azure.Core": "1.23.0", + "System.Memory": "4.5.4", + "System.Text.Json": "4.7.2", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "Azure.Storage.Blobs": { + "type": "Direct", + "requested": "[12.11.0, )", + "resolved": "12.11.0", + "contentHash": "50eRjIhY7Q1JN7kT2MSawDKCcwSb7uRZUkz00P/BLjSg47gm2hxUYsnJPyvzCHntYMbOWzrvaVQTwYwXabaR5Q==", + "dependencies": { + "Azure.Storage.Common": "12.10.0", + "System.Text.Json": "4.7.2" + } + }, + "Azure.Storage.Queues": { + "type": "Direct", + "requested": "[12.9.0, )", + "resolved": "12.9.0", + "contentHash": "jDiyHtsCUCrWNvZW7SjJnJb46UhpdgQrWCbL8aWpapDHlq9LvbvxYpfLh4dfKAz09QiTznLMIU3i+md9+7GzqQ==", + "dependencies": { + "Azure.Storage.Common": "12.10.0", + "System.Memory.Data": "1.0.2", + "System.Text.Json": "4.7.2" + } + }, + "Faithlife.Utility": { + "type": "Direct", + "requested": "[0.12.2, )", + "resolved": "0.12.2", + "contentHash": "JgMAGj8ekeAzKkagubXqf1UqgfHq89GyA1UQYWbkAe441uRr2Rh2rktkx5Z0LPwmD/aOqu9cxjekD2GZjP8rbw==" + }, + "Microsoft.Azure.Functions.Worker": { + "type": "Direct", + "requested": "[1.6.0, )", + "resolved": "1.6.0", + "contentHash": "Gzq2IPcMCym6wPpFayLbuvhrfr72OEInJJlKaIAqU9+HldVaTt54cm3hPe7kIok+QuWnwb/TtYtlmrkR0Nbhsg==", + "dependencies": { + "Azure.Core": "1.10.0", + "Microsoft.Azure.Functions.Worker.Core": "1.4.0", + "Microsoft.Azure.Functions.Worker.Grpc": "1.3.1", + "Microsoft.Extensions.Hosting": "5.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "5.0.0" + } + }, + "Microsoft.Azure.Functions.Worker.Extensions.EventGrid": { + "type": "Direct", + "requested": "[2.1.0, )", + "resolved": "2.1.0", + "contentHash": "8Kjhxaj2gK2Bi5K5jiNAG/e9tTlRItFNCINj+kfUDMBbf5lsiZUBChyAQCxrnITeHKkwAtgXB7GBX4W1Xcoc0A==", + "dependencies": { + "Microsoft.Azure.Functions.Worker.Extensions.Abstractions": "1.0.0" + } + }, + "Microsoft.Azure.Functions.Worker.Extensions.Http": { + "type": "Direct", + "requested": "[3.0.13, )", + "resolved": "3.0.13", + "contentHash": "GX41psGbjLSPKuFnBcGGB7PAAdhfLsgxvGVsyGq/jQwgGwjAVRRx2UbSl35+imKwCPZdT5vGjq6YV1rgXIeEvA==", + "dependencies": { + "Microsoft.Azure.Functions.Worker.Extensions.Abstractions": "1.0.0" + } + }, + "Microsoft.Azure.Functions.Worker.Extensions.SignalRService": { + "type": "Direct", + "requested": "[1.7.0, )", + "resolved": "1.7.0", + "contentHash": "mgk7ZnrXLPCI70cYgqxi+TJMJJgRMPYzZwIFMpxP2cto3D6XSxbF8eGj46T4DwopBBqWpfJ4Y2QFB93hNb4Yxg==", + "dependencies": { + "Microsoft.Azure.Functions.Worker.Extensions.Abstractions": "1.1.0", + "Microsoft.Extensions.Primitives": "5.0.1", + "System.Text.Json": "5.0.2" + } + }, + "Microsoft.Azure.Functions.Worker.Extensions.Storage": { + "type": "Direct", + "requested": "[5.0.0, )", + "resolved": "5.0.0", + "contentHash": "VwcmWk29//8CkXCxCR7vxMnqsuh+O0018eavRCGscI+uRKHdvlHDG97vwfdwuTzwKuoo7ztQbAvHfkp+sxoiEQ==", + "dependencies": { + "Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs": "5.0.0", + "Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues": "5.0.0" + } + }, + "Microsoft.Azure.Functions.Worker.Extensions.Timer": { + "type": "Direct", + "requested": "[4.1.0, )", + "resolved": "4.1.0", + "contentHash": "8HvZaChaw40EKBfBew0XG132YhO6bEw0nznvey7gkhm9thUe6wkA2LXTXHXxcYefbx0rlh57WedSiJgKTG7MvQ==", + "dependencies": { + "Microsoft.Azure.Functions.Worker.Extensions.Abstractions": "1.0.0" + } + }, + "Microsoft.Azure.Functions.Worker.Sdk": { + "type": "Direct", + "requested": "[1.3.0, )", + "resolved": "1.3.0", + "contentHash": "g9oXOl9xr1O3alWItAiYLNu3BnXebLW51BRB06yuO86LPGRZewyJu88EwUdC2NU9wnIeE3/ObMuEAnRALZeuTQ==", + "dependencies": { + "Microsoft.Azure.Functions.Worker.Sdk.Analyzers": "1.1.0" + } + }, + "Microsoft.Extensions.Logging.ApplicationInsights": { + "type": "Direct", + "requested": "[2.20.0, )", + "resolved": "2.20.0", + "contentHash": "phuNUDeTlffkJi6zAsMQNOpijNOQ4Olda1WL2L+F33u4fqXmY+EGQnPg81rHW6dOXIYCQvrQUr2gVN5NNMvwKA==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.20.0", + "Microsoft.Extensions.Logging": "2.1.1" + } + }, + "Microsoft.Graph": { + "type": "Direct", + "requested": "[4.24.0, )", + "resolved": "4.24.0", + "contentHash": "OPyHQ+EzuYjp3XExGB0SvySXY3pxU+bXLl3ADdvje/yOMFvpNOpEu111tmh2aM/RCplaoMQjBA5oa9pUVIH0cg==", + "dependencies": { + "Microsoft.Graph.Core": "2.0.8" + } + }, + "Microsoft.Identity.Client": { + "type": "Direct", + "requested": "[4.43.0, )", + "resolved": "4.43.0", + "contentHash": "uaUMZB3Ywi7IPVvgRZOQotlYhD8sA4wtZESkA0qF9SYAifr1RzJyaGTFtfbAyZ/J5kGUhRklrCJIRpd0MaihKQ==" + }, + "Microsoft.Identity.Web.TokenCache": { + "type": "Direct", + "requested": "[1.23.1, )", + "resolved": "1.23.1", + "contentHash": "fU85i6XDUXL/z6B+pTmNZbof0hL9Jkgsi6GWpQEWjL7Ek0GH0A8btxbqzojPCRdGN7EK/vyEVu5Smy9/spZj2g==", + "dependencies": { + "Microsoft.AspNetCore.DataProtection": "5.0.8", + "Microsoft.Extensions.Caching.Memory": "5.0.0", + "Microsoft.Extensions.Logging": "5.0.0", + "Microsoft.Identity.Client": "4.42.0", + "System.Text.Encodings.Web": "5.0.1" + } + }, + "System.IdentityModel.Tokens.Jwt": { + "type": "Direct", + "requested": "[6.17.0, )", + "resolved": "6.17.0", + "contentHash": "G3rY4WLr54Mo+97+AEq0ANpiKvW7E8Qu5bKWfVMa7rkyJtvrOxUqp/OLqrGw/6JDbD5GlxnAtFKukGteUuB0rQ==", + "dependencies": { + "Microsoft.IdentityModel.JsonWebTokens": "6.17.0", + "Microsoft.IdentityModel.Tokens": "6.17.0" + } + }, + "System.Linq.Async": { + "type": "Direct", + "requested": "[6.0.1, )", + "resolved": "6.0.1", + "contentHash": "0YhHcaroWpQ9UCot3Pizah7ryAzQhNvobLMSxeDIGmnXfkQn8u5owvpOH0K6EVB+z9L7u6Cc4W17Br/+jyttEQ==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, + "Azure.Storage.Common": { + "type": "Transitive", + "resolved": "12.10.0", + "contentHash": "vYkHGzUkdZTace/cDPZLG+Mh/EoPqQuGxDIBOau9D+XWoDPmuUFGk325aXplkFE4JFGpSwoytNYzk/qBCaiHqg==", + "dependencies": { + "Azure.Core": "1.22.0", + "System.IO.Hashing": "6.0.0" + } + }, + "Google.Protobuf": { + "type": "Transitive", + "resolved": "3.15.8", + "contentHash": "tA0S9QXJq+r3CjwBlcn5glEUrbdAxhPWO4yhq5+ycn6WW6+nsvqzO6Qf6NE9XWbEz/F2QSpBTxjdTI7SvVy7CQ==", + "dependencies": { + "System.Memory": "4.5.3", + "System.Runtime.CompilerServices.Unsafe": "4.5.2" + } + }, + "Grpc.Core.Api": { + "type": "Transitive", + "resolved": "2.37.0", + "contentHash": "ubqW2nTpiHyDudYGVXM+Vjh6WbgsI1fVQxsDK14/GnyPgiNMuNl8+GQcAYp5QPhAk5H4fjHJPI+KvbpVk8z6iQ==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "Grpc.Net.Client": { + "type": "Transitive", + "resolved": "2.37.0", + "contentHash": "oMDNXAPkBzfXljv/ZzlZSf22TEstBNI6je85/c3iztlFbbixTMLgi0sIu/uHtEKoEWUPr0nmBMvD+jtqKorGTg==", + "dependencies": { + "Grpc.Net.Common": "2.37.0", + "Microsoft.Extensions.Logging.Abstractions": "3.0.3" + } + }, + "Grpc.Net.ClientFactory": { + "type": "Transitive", + "resolved": "2.37.0", + "contentHash": "zyeFej1A36+s5K6+zDUirmDEGHEFnHapQisT7YsR9nQqKsw1uYqjtG1gSVSg/Zvk0KYeLHs5/URtTU71kS4APg==", + "dependencies": { + "Grpc.Net.Client": "2.37.0", + "Microsoft.Extensions.Http": "3.0.3" + } + }, + "Grpc.Net.Common": { + "type": "Transitive", + "resolved": "2.37.0", + "contentHash": "V7fZb+87qB6Jio6uWXDHkxI9WT+y4EFwicAHkzB2lm/9wJazD0V35HhQjxvoONsldObaUimjqd4b/XZ0G07sDQ==", + "dependencies": { + "Grpc.Core.Api": "2.37.0" + } + }, + "Microsoft.ApplicationInsights": { + "type": "Transitive", + "resolved": "2.20.0", + "contentHash": "mb+EC5j06Msn5HhKrhrsMAst6JxvYUnphQMGY2cixCabgGAO3q79Y8o/p1Zce1Azgd1IVkRKAMzAV4vDCbXOqA==", + "dependencies": { + "System.Diagnostics.DiagnosticSource": "5.0.0" + } + }, + "Microsoft.AspNetCore.Cryptography.Internal": { + "type": "Transitive", + "resolved": "5.0.8", + "contentHash": "giHheyNLOb+cAHpb8b0GhaS0xJ+hAIIDSyWPe5aOPwpgctsjOPRKFyn/268xv+zBVuEtyRJJEnBUlkOVzyIpZA==" + }, + "Microsoft.AspNetCore.DataProtection": { + "type": "Transitive", + "resolved": "5.0.8", + "contentHash": "wCMdfuKA+ePcB4nEDau5tNhhhC5NFa2LEXoRhk2Xaot13FFlyKA4t5UzIyV/OnAfB/bqbAIvChJD+biWY7u5SA==", + "dependencies": { + "Microsoft.AspNetCore.Cryptography.Internal": "5.0.8", + "Microsoft.AspNetCore.DataProtection.Abstractions": "5.0.8", + "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.8", + "contentHash": "ZI9S2NGjuOKXN3PxJcF8EKVwd1cqpWyUSqiVoH8gqq5tlHaXULwPmoR0DBOFON4sEFETRWI69f5RQ3tJWw205A==" + }, + "Microsoft.Azure.Functions.Worker.Core": { + "type": "Transitive", + "resolved": "1.4.0", + "contentHash": "6fTSb6JDm+1CNKsaPziL36c3tfN4xxYnC9XoJsm0g9tY+72dVqUa2aPc6RtkwBmT5sjNrsUDlUC+IhG+ehjppQ==", + "dependencies": { + "Azure.Core": "1.10.0", + "Microsoft.Extensions.Hosting": "5.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "5.0.0" + } + }, + "Microsoft.Azure.Functions.Worker.Extensions.Abstractions": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kAs9BTuzdOvyuN2m5CYyQzyvzXKJ6hhIOgcwm0W8Q+Fwj91a1eBmRSi9pVzpM4V3skNt/+pkPD3wxFD4nEw0bg==" + }, + "Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "Cr+ziBQA/Lyt5rMURHBje+foGook+B82gnAfEE32bHcXGlpKJnnVdLqHy0OqHliUksFddkRYS2gY8dYx+NH/mA==", + "dependencies": { + "Microsoft.Azure.Functions.Worker.Extensions.Abstractions": "1.1.0" + } + }, + "Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "cF95kiiU6PD9sptrV3GKQKzRv2DYATYNTpOtvUtbAYQ4xPFKgF4ke3fDBcu+cu2O1/C8FQ7MhzkEQv00bx552A==", + "dependencies": { + "Microsoft.Azure.Functions.Worker.Extensions.Abstractions": "1.1.0" + } + }, + "Microsoft.Azure.Functions.Worker.Grpc": { + "type": "Transitive", + "resolved": "1.3.1", + "contentHash": "lMlbyfRagSQZVWN73jnaB0tVTMhfKHSy6IvFXC7fCGh+7uA9LJNjcMOQbVkUnmvb/I/SxslMqD7xcebrxFL3TQ==", + "dependencies": { + "Azure.Core": "1.10.0", + "Google.Protobuf": "3.15.8", + "Grpc.Net.Client": "2.37.0", + "Grpc.Net.ClientFactory": "2.37.0", + "Microsoft.Azure.Functions.Worker.Core": "1.3.1", + "Microsoft.Extensions.Hosting": "5.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "5.0.0" + } + }, + "Microsoft.Azure.Functions.Worker.Sdk.Analyzers": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "J7AZ9iv/UCd4Di0c84h1P/Sa1aQr5uqO0EBUKwE0AZeWJ11dDfKAwxMiAxYOKR+giy31DWBnuFc4GKY3BQYUjg==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ==" + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "bu8As90/SBAouMZ6fJ+qRNo1X+KgHGrVueFhhYi+E5WqEhcnp2HoWRFnMzXQ6g4RdZbvPowFerSbKNH4Dtg5yg==", + "dependencies": { + "Microsoft.Extensions.Primitives": "5.0.0" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "/1qPCleFOkJe0O+xmFqCNLFYQZTJz965sVw8CUB/BQgsApBwzAUsL2BUkDvQW+geRUVTXUS9zLa0pBjC2VJ1gA==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "5.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0", + "Microsoft.Extensions.Logging.Abstractions": "5.0.0", + "Microsoft.Extensions.Options": "5.0.0", + "Microsoft.Extensions.Primitives": "5.0.0" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "LN322qEKHjuVEhhXueTUe7RNePooZmS8aGid5aK2woX3NPjSnONFyKUc6+JknOS6ce6h2tCLfKPTBXE3mN/6Ag==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "5.0.0", + "Microsoft.Extensions.Primitives": "5.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ETjSBHMp3OAZ4HxGQYpwyGsD8Sw5FegQXphi0rpoGMT74S4+I2mm7XJEswwn59XAaKOzC15oDSOWEE8SzDCd6Q==", + "dependencies": { + "Microsoft.Extensions.Primitives": "5.0.0" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "Of1Irt1+NzWO+yEYkuDh5TpT4On7LKl98Q9iLqCdOZps6XXEWDj3AKtmyvzJPVXZe4apmkJJIiDL7rR1yC+hjQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "5.0.0" + } + }, + "Microsoft.Extensions.Configuration.CommandLine": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "OelM+VQdhZ0XMXsEQBq/bt3kFzD+EBGqR4TAgFDRAye0JfvHAaRi+3BxCRcwqUAwDhV0U0HieljBGHlTgYseRA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "5.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "5.0.0" + } + }, + "Microsoft.Extensions.Configuration.EnvironmentVariables": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "fqh6y6hAi0Z0fRsb4B/mP9OkKkSlifh5osa+N/YSQ+/S2a//+zYApZMUC1XeP9fdjlgZoPQoZ72Q2eLHyKLddQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "5.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "5.0.0" + } + }, + "Microsoft.Extensions.Configuration.FileExtensions": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "rRdspYKA18ViPOISwAihhCMbusHsARCOtDMwa23f+BGEdIjpKPlhs3LLjmKlxfhpGXBjIsS0JpXcChjRUN+PAw==", + "dependencies": { + "Microsoft.Extensions.Configuration": "5.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "5.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "5.0.0", + "Microsoft.Extensions.FileProviders.Physical": "5.0.0", + "Microsoft.Extensions.Primitives": "5.0.0" + } + }, + "Microsoft.Extensions.Configuration.Json": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "Pak8ymSUfdzPfBTLHxeOwcR32YDbuVfhnH2hkfOLnJNQd19ItlBdpMjIDY9C5O/nS2Sn9bzDMai0ZrvF7KyY/Q==", + "dependencies": { + "Microsoft.Extensions.Configuration": "5.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "5.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "5.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "5.0.0" + } + }, + "Microsoft.Extensions.Configuration.UserSecrets": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "+tK3seG68106lN277YWQvqmfyI/89w0uTu/5Gz5VYSUu5TI4mqwsaWLlSmT9Bl1yW/i1Nr06gHJxqaqB5NU9Tw==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "5.0.0", + "Microsoft.Extensions.Configuration.Json": "5.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "5.0.0", + "Microsoft.Extensions.FileProviders.Physical": "5.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "Rc2kb/p3Ze6cP6rhFC3PJRdWGbLvSHZc0ev7YlyeU6FmHciDMLrhoVoTUEzKPhN5ZjFgKF1Cf5fOz8mCMIkvpA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ORj7Zh81gC69TyvmcUm9tSzytcy8AVousi+IVRAI8nLieQjOFryRusSFh7+aLk16FN9pQNqJAiMd7BTKINK0kA==" + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "iuZIiZ3mteEb+nsUqpGXKx2cGF+cv6gWPd5jqQI4hzqdiJ6I94ddLjKhQOuRW1lueHwocIw30xbSHGhQj0zjdQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "5.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Physical": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "1rkd8UO2qf21biwO7X0hL9uHP7vtfmdv/NLvKgCRHkdz1XnW8zVQJXyEYiN68WYpExgtVWn55QF0qBzgfh1mGg==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "5.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "5.0.0", + "Microsoft.Extensions.Primitives": "5.0.0" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "ArliS8lGk8sWRtrWpqI8yUVYJpRruPjCDT+EIjrgkA/AAPRctlAkRISVZ334chAKktTLzD1+PK8F5IZpGedSqA==" + }, + "Microsoft.Extensions.Hosting": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "hiokSU1TOVfcqpQAnpiOzP2rE9p+niq92g5yeAnwlbSrUlIdIS6M8emCknZvhdOagQA9x5YWNwe1n0kFUwE0NQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "5.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "5.0.0", + "Microsoft.Extensions.Configuration.Binder": "5.0.0", + "Microsoft.Extensions.Configuration.CommandLine": "5.0.0", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "5.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "5.0.0", + "Microsoft.Extensions.Configuration.Json": "5.0.0", + "Microsoft.Extensions.Configuration.UserSecrets": "5.0.0", + "Microsoft.Extensions.DependencyInjection": "5.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "5.0.0", + "Microsoft.Extensions.FileProviders.Physical": "5.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "5.0.0", + "Microsoft.Extensions.Logging": "5.0.0", + "Microsoft.Extensions.Logging.Abstractions": "5.0.0", + "Microsoft.Extensions.Logging.Configuration": "5.0.0", + "Microsoft.Extensions.Logging.Console": "5.0.0", + "Microsoft.Extensions.Logging.Debug": "5.0.0", + "Microsoft.Extensions.Logging.EventLog": "5.0.0", + "Microsoft.Extensions.Logging.EventSource": "5.0.0", + "Microsoft.Extensions.Options": "5.0.0" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "cbUOCePYBl1UhM+N2zmDSUyJ6cODulbtUd9gEzMFIK3RQDtP/gJsE08oLcBSXH3Q1RAQ0ex7OAB3HeTKB9bXpg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "5.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "5.0.0" + } + }, + "Microsoft.Extensions.Http": { + "type": "Transitive", + "resolved": "3.0.3", + "contentHash": "dcyB8szIcSynjVZRuFgqkZpPgTc5zeRSj1HMXSmNqWbHYKiPYJl8ZQgBHz6wmZNSUUNGpCs5uxUg8DZHHDC1Ew==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "3.0.3", + "Microsoft.Extensions.Logging": "3.0.3", + "Microsoft.Extensions.Options": "3.0.3" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MgOwK6tPzB6YNH21wssJcw/2MKwee8b2gI7SllYfn6rvTpIrVvVS5HAjSU2vqSku1fwqRvWP0MdIi14qjd93Aw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "5.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0", + "Microsoft.Extensions.Logging.Abstractions": "5.0.0", + "Microsoft.Extensions.Options": "5.0.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "NxP6ahFcBnnSfwNBi2KH2Oz8Xl5Sm2krjId/jRR3I7teFphwiUoUeZPwTNA21EX+5PtjqmyAvKaOeBXcJjcH/w==" + }, + "Microsoft.Extensions.Logging.Configuration": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "N3/d0HeMRnBekadbZlmbp+In8EvNNkQHSdbtRzjrGVckdZWpYs5GNrAfaYqVplDFW0WUedSaFJ3khB50BWYGsw==", + "dependencies": { + "Microsoft.Extensions.Configuration": "5.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "5.0.0", + "Microsoft.Extensions.Configuration.Binder": "5.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0", + "Microsoft.Extensions.Logging": "5.0.0", + "Microsoft.Extensions.Logging.Abstractions": "5.0.0", + "Microsoft.Extensions.Options": "5.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "5.0.0" + } + }, + "Microsoft.Extensions.Logging.Console": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "jH0wbWhfvXjOVmCkbra4vbiovDtTUIWLQjCeJ7Xun3h4AHvwfzm7V7wlsXKs3tNnPrsCxZ9oaV0vUAgGY1JxOA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "5.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0", + "Microsoft.Extensions.Logging": "5.0.0", + "Microsoft.Extensions.Logging.Abstractions": "5.0.0", + "Microsoft.Extensions.Logging.Configuration": "5.0.0", + "Microsoft.Extensions.Options": "5.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "5.0.0" + } + }, + "Microsoft.Extensions.Logging.Debug": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "9dvt0xqRrClvhaPNpfyS39WxnW9G55l5lrV5ZX7IrEgwo4VwtmJKtoPiKVYKbhAuOBGUI5WY3hWLvF+PSbJp5A==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0", + "Microsoft.Extensions.Logging": "5.0.0", + "Microsoft.Extensions.Logging.Abstractions": "5.0.0" + } + }, + "Microsoft.Extensions.Logging.EventLog": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "CYzsgF2lqgahGl/HuErsIDaZZ9ueN+MBjGfO/0jVDLPaXLaywxlGKFpDgXMaB053DRYZwD1H2Lb1I60mTXS3jg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0", + "Microsoft.Extensions.Logging": "5.0.0", + "Microsoft.Extensions.Logging.Abstractions": "5.0.0", + "Microsoft.Extensions.Options": "5.0.0", + "System.Diagnostics.EventLog": "5.0.0" + } + }, + "Microsoft.Extensions.Logging.EventSource": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "hF+D6PJkrM0qXcSEGs1BwZwgP8c0BRkj26P/5wmYTcHKOp52GRey/Z/YKRmRIHIrXxj9tz/JgIjU9oWmiJ5HMw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0", + "Microsoft.Extensions.Logging": "5.0.0", + "Microsoft.Extensions.Logging.Abstractions": "5.0.0", + "Microsoft.Extensions.Options": "5.0.0", + "Microsoft.Extensions.Primitives": "5.0.0" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "CBvR92TCJ5uBIdd9/HzDSrxYak+0W/3+yxrNg8Qm6Bmrkh5L+nu6m3WeazQehcZ5q1/6dDA7J5YdQjim0165zg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0", + "Microsoft.Extensions.Primitives": "5.0.0" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "280RxNJqOeQqq47aJLy5D9LN61CAWeuRA83gPToQ8B9jl9SNdQ5EXjlfvF66zQI5AXMl+C/3hGnbtIEN+X3mqA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "5.0.0", + "Microsoft.Extensions.Configuration.Binder": "5.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0", + "Microsoft.Extensions.Options": "5.0.0", + "Microsoft.Extensions.Primitives": "5.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "5.0.1", + "contentHash": "5WPSmL4YeP7eW+Vc8XZ4DwjYWBAiSwDV9Hm63JJWcz1Ie3Xjv4KuJXzgCstj48LkLfVCYa7mLcx7y+q6yqVvtw==" + }, + "Microsoft.Graph.Core": { + "type": "Transitive", + "resolved": "2.0.8", + "contentHash": "CcsCgY1O+LQaKMJkQCpVZPmK6uiFFUu49MwqTxoTBYtFG2/NwyGAIpla5gct8jWlS0DBKXWAyRlIzKt/6UGIDQ==", + "dependencies": { + "Azure.Core": "1.22.0", + "Microsoft.Identity.Client": "4.41.0", + "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.15.1", + "System.Diagnostics.DiagnosticSource": "4.7.1", + "System.Security.Claims": "4.3.0", + "System.Text.Json": "6.0.2" + } + }, + "Microsoft.Identity.Client.Extensions.Msal": { + "type": "Transitive", + "resolved": "2.19.3", + "contentHash": "zVVZjn8aW7W79rC1crioDgdOwaFTQorsSO6RgVlDDjc7MvbEGz071wSNrjVhzR0CdQn6Sefx7Abf1o7vasmrLg==", + "dependencies": { + "Microsoft.Identity.Client": "4.38.0", + "System.Security.Cryptography.ProtectedData": "4.5.0" + } + }, + "Microsoft.IdentityModel.JsonWebTokens": { + "type": "Transitive", + "resolved": "6.17.0", + "contentHash": "I3cSVE185qF3a222/iQIdmBFhrhZBtz7wZ1RUUbMuHC1un79XCI7vggbWdmbqIttFcUoeziemadO6t+3FLjcSA==", + "dependencies": { + "Microsoft.IdentityModel.Tokens": "6.17.0" + } + }, + "Microsoft.IdentityModel.Logging": { + "type": "Transitive", + "resolved": "6.17.0", + "contentHash": "Ix6/CMLDoo939NDf1ARDuGK6YERY7pAX9WYbfwb4gZqx7r52unMFIykJk+zlEBX7jjtbDz/0uzikQFvheV9KsQ==" + }, + "Microsoft.IdentityModel.Protocols": { + "type": "Transitive", + "resolved": "6.15.1", + "contentHash": "6nHr+4yE8vj620Vy4L0pl7kmkvWc06wBrJ+AOo/gjqzu/UD/MYgySUqRGlZYrvvNmKkUWMw4hdn78MPCb4bstA==", + "dependencies": { + "Microsoft.IdentityModel.Logging": "6.15.1", + "Microsoft.IdentityModel.Tokens": "6.15.1" + } + }, + "Microsoft.IdentityModel.Protocols.OpenIdConnect": { + "type": "Transitive", + "resolved": "6.15.1", + "contentHash": "WwecgT/PNrytLNUWjkYtnnG2LXMAzkINSaZM+8dPPiEpOGz1bQDBWAenTSurYICxGoA1sOPriFXk+ocnQyprKw==", + "dependencies": { + "Microsoft.IdentityModel.Protocols": "6.15.1", + "System.IdentityModel.Tokens.Jwt": "6.15.1" + } + }, + "Microsoft.IdentityModel.Tokens": { + "type": "Transitive", + "resolved": "6.17.0", + "contentHash": "mhOe+d9BQg5U45TkTCyXAFOjl7RvwaFj6v9qo8b+WFolkuGsfjSFfQ+WI9D3ho9sD/fK75gvL4JptmjLzyUPkw==", + "dependencies": { + "Microsoft.CSharp": "4.5.0", + "Microsoft.IdentityModel.Logging": "6.17.0", + "System.Security.Cryptography.Cng": "4.5.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "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": "5.0.0", + "contentHash": "Bh6blKG8VAKvXiLe2L+sEsn62nc1Ij34MrNxepD2OCrS5cpCwQa9MeLyhVQPQ/R4Wlzwuy6wMK8hLb11QPDRsQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0" + } + }, + "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.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "tCQTzPsGZh/A9LhhA6zrqCRV4hOHsK90/G7q3Khxmn6tnB1PuNU0cRaKANP2AWcF9bn0zsuOoZOSrHuJk6oNBA==" + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "FHkCwUfsTs+/5tsK+c0egLfacUgbhvcwi3wUFWSEEArSXao343mYqcpOVVFMlcCkdNtjU4YwAWaKYwal6f02og==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "Microsoft.Win32.Registry": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Drawing.Common": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "SztFwAnpfKC8+sEKXAFxCBWhKQaEd97EiOL7oZJZP56zbqnLpmxACWA8aGseaUExciuEAUuR9dY8f7HkTRAdnw==", + "dependencies": { + "Microsoft.Win32.SystemEvents": "5.0.0" + } + }, + "System.Formats.Asn1": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "MTvUIktmemNB+El0Fgw9egyqT9AYSIk6DTJeoDSpc3GIHxHCMo8COqkWT1mptX5tZ1SlQ6HJZ0OsSvMth1c12w==" + }, + "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.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.Hashing": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "Rfm2jYCaUeGysFEZjDe7j1R4x6Z6BzumS/vUT5a1AA/AWJuGX71PoGB0RmpyX3VmrGqVnAwtfMn39OHR8Y/5+g==" + }, + "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.Numerics.Vectors": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" + }, + "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.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.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.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.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Claims": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==", + "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.Security.Principal": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "jIMXsKn94T9JY7PvPq/tMfqa6GAaHpElRDpmG+SuL+D3+sTw2M8VhnibKnN8Tq+4JqbPJ/f+BwtLeDMEnzAvRg==", + "dependencies": { + "System.Formats.Asn1": "5.0.0" + } + }, + "System.Security.Cryptography.Pkcs": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "9TPLGjBCGKmNvG8pjwPeuYy0SMVmGZRwlTZvyPHDbYv/DRkoeumJdfumaaDNQzVGMEmbWtg07zUpSW9q70IlDQ==", + "dependencies": { + "System.Formats.Asn1": "5.0.0", + "System.Security.Cryptography.Cng": "5.0.0" + } + }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "ehYW0m9ptxpGWvE4zgqongBVWpSDU/JCFD4K7krxkQwSz/sFQjEXCUqpvencjy6DYDbn7Ig09R8GFffu8TtneQ==" + }, + "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": "5.0.0", + "contentHash": "uE8juAhEkp7KDBCdjDIE3H9R1HJuEHqeqX8nLX9gmYKWwsqk3T5qZlPx8qle5DPKimC/Fy3AFTdV7HamgCh9qQ==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Windows.Extensions": "5.0.0" + } + }, + "System.Security.Principal": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", + "dependencies": { + "System.Runtime": "4.3.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.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.2", + "contentHash": "0nE2gwXLn3PTBOPwORLqwuYvWB+Beomt9ZBX+6LmogMNKUvfD1SoDb/ycB1vBntT94rGaB/SvxEyeLu14H6aEg==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.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.Extensions": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" + }, + "System.Windows.Extensions": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "c1ho9WU9ZxMZawML+ssPKZfdnrg/OjR3pe0m9v8230z3acqphwvPJqzAkH54xRYm5ntZHGG1EPP3sux9H3qSPg==", + "dependencies": { + "System.Drawing.Common": "5.0.0" + } + } + } + } } \ No newline at end of file diff --git a/src/ApiService/Tests/OrmModelsTest.cs b/src/ApiService/Tests/OrmModelsTest.cs index d470a2d16..35070840b 100644 --- a/src/ApiService/Tests/OrmModelsTest.cs +++ b/src/ApiService/Tests/OrmModelsTest.cs @@ -244,9 +244,6 @@ namespace Tests { ); ; } - - - public static Gen Report() { return Arb.Generate, Guid, int>>().Select( arg => @@ -373,6 +370,7 @@ namespace Tests { return Arb.From(OrmGenerators.Notification()); } + public static Arbitrary WebhookMessageEventGrid() { return Arb.From(OrmGenerators.WebhookMessageEventGrid()); } @@ -548,7 +546,6 @@ namespace Tests { return Test(n); } - [Property] public bool Job(Job j) { return Test(j); diff --git a/src/ApiService/Tests/OrmTest.cs b/src/ApiService/Tests/OrmTest.cs index bd042e608..cd49d44b5 100644 --- a/src/ApiService/Tests/OrmTest.cs +++ b/src/ApiService/Tests/OrmTest.cs @@ -246,19 +246,6 @@ namespace Tests { Assert.Equal(expected.TheName, actual.TheName); } - - [Fact] - public void TestEventSerialization2() { - - var converter = new EntityConverter(); - var expectedEvent = new EventMessage(Guid.NewGuid(), EventType.NodeHeartbeat, new EventNodeHeartbeat(Guid.NewGuid(), Guid.NewGuid(), "test Poool"), Guid.NewGuid(), "test") { - ETag = new Azure.ETag("33a64df551425fcc55e4d42a148795d9f25f89d4") - }; - var te = converter.ToTableEntity(expectedEvent); - var actualEvent = converter.ToRecord(te); - Assert.Equal(expectedEvent, actualEvent); - } - record Entity3( [PartitionKey] int Id, [RowKey] string TheName,