From 2749f6c192683d66a67b64242325508623a0641f Mon Sep 17 00:00:00 2001 From: John Peters Date: Wed, 10 Apr 2024 10:27:23 -0400 Subject: [PATCH 01/34] Update SQLPagedQuery to handle users not having the required Order by Updated SQLDataSource to handle commands to modify the database Added a sample project Removed .NetStandard2.1 from framework types --- .../Root16.Sprout.Dataverse.csproj | 2 +- .../packages.lock.json | 584 ----------------- src/Root16.Sprout.Sample.SqlServer/Program.cs | 39 ++ .../Root16.Sprout.Sample.SqlServer.csproj | 22 + .../SampleSQLStep.cs | 62 ++ .../DataSources/Sql/SqlDataSource.cs | 36 +- .../DataSources/Sql/SqlPagedQuery.cs | 45 +- .../Root16.Sprout.SqlServer.csproj | 2 +- .../packages.lock.json | 584 ----------------- src/Root16.Sprout.sln | 10 +- src/Root16.Sprout/Root16.Sprout.csproj | 2 +- src/Root16.Sprout/packages.lock.json | 598 ------------------ 12 files changed, 192 insertions(+), 1794 deletions(-) create mode 100644 src/Root16.Sprout.Sample.SqlServer/Program.cs create mode 100644 src/Root16.Sprout.Sample.SqlServer/Root16.Sprout.Sample.SqlServer.csproj create mode 100644 src/Root16.Sprout.Sample.SqlServer/SampleSQLStep.cs diff --git a/src/Root16.Sprout.Dataverse/Root16.Sprout.Dataverse.csproj b/src/Root16.Sprout.Dataverse/Root16.Sprout.Dataverse.csproj index 5c3278e..430da5c 100644 --- a/src/Root16.Sprout.Dataverse/Root16.Sprout.Dataverse.csproj +++ b/src/Root16.Sprout.Dataverse/Root16.Sprout.Dataverse.csproj @@ -1,7 +1,7 @@  - net8.0;netstandard2.1 + net8.0 enable enable https://github.com/Root16/sprout diff --git a/src/Root16.Sprout.Dataverse/packages.lock.json b/src/Root16.Sprout.Dataverse/packages.lock.json index 1805e3c..73c000a 100644 --- a/src/Root16.Sprout.Dataverse/packages.lock.json +++ b/src/Root16.Sprout.Dataverse/packages.lock.json @@ -1,590 +1,6 @@ { "version": 1, "dependencies": { - ".NETStandard,Version=v2.1": { - "Microsoft.PowerPlatform.Dataverse.Client": { - "type": "Direct", - "requested": "[1.1.17, )", - "resolved": "1.1.17", - "contentHash": "gSgD7N52EATY0PkNIbBtqZeG0FDGK11X1x8nBnPclfykw73bvqyfortjNIwAGcj0esMqk8DSieuRCVi47hg9qQ==", - "dependencies": { - "Microsoft.Extensions.Caching.Memory": "3.1.8", - "Microsoft.Extensions.DependencyInjection": "3.1.8", - "Microsoft.Extensions.Http": "3.1.8", - "Microsoft.Extensions.Logging": "3.1.8", - "Microsoft.Identity.Client": "4.56.0", - "Microsoft.Identity.Client.Extensions.Msal": "4.56.0", - "Microsoft.Rest.ClientRuntime": "2.3.24", - "Newtonsoft.Json": "13.0.1", - "System.Text.Json": "7.0.3" - } - }, - "Azure.Core": { - "type": "Transitive", - "resolved": "1.35.0", - "contentHash": "hENcx03Jyuqv05F4RBEPbxz29UrM3Nbhnr6Wl6NQpoU9BCIbL3XLentrxDCTrH54NLS11Exxi/o8MYgT/cnKFA==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "1.1.1", - "System.Diagnostics.DiagnosticSource": "6.0.1", - "System.Memory.Data": "1.0.2", - "System.Numerics.Vectors": "4.5.0", - "System.Text.Encodings.Web": "4.7.2", - "System.Text.Json": "4.7.2", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Azure.Identity": { - "type": "Transitive", - "resolved": "1.10.3", - "contentHash": "l1Xm2MWOF2Mzcwuarlw8kWQXLZk3UeB55aQXVyjj23aBfDwOZ3gu5GP2kJ6KlmZeZv2TCzw7x4L3V36iNr3gww==", - "dependencies": { - "Azure.Core": "1.35.0", - "Microsoft.Identity.Client": "4.56.0", - "Microsoft.Identity.Client.Extensions.Msal": "4.56.0", - "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" - } - }, - "Microsoft.Bcl.AsyncInterfaces": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "3aeMZ1N0lJoSyzqiP03hqemtb1BijhsJADdobn/4nsMJ8V1H+CrpuduUe4hlRdx+ikBQju1VGjMD1GJ3Sk05Eg==" - }, - "Microsoft.CSharp": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ==" - }, - "Microsoft.Data.SqlClient": { - "type": "Transitive", - "resolved": "5.2.0", - "contentHash": "3alfyqRN3ELRtdvU1dGtLBRNQqprr3TJ0WrUJfMISPwg1nPUN2P3Lelah68IKWuV27Ceb7ig95hWNHFTSXfxMg==", - "dependencies": { - "Azure.Identity": "1.10.3", - "Microsoft.Data.SqlClient.SNI.runtime": "5.2.0", - "Microsoft.Identity.Client": "4.56.0", - "Microsoft.IdentityModel.JsonWebTokens": "6.35.0", - "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.35.0", - "Microsoft.SqlServer.Server": "1.0.0", - "Microsoft.Win32.Registry": "5.0.0", - "System.Configuration.ConfigurationManager": "6.0.1", - "System.Diagnostics.DiagnosticSource": "6.0.1", - "System.Runtime.Caching": "6.0.0", - "System.Runtime.Loader": "4.3.0", - "System.Security.Cryptography.Cng": "5.0.0", - "System.Security.Principal.Windows": "5.0.0", - "System.Text.Encoding.CodePages": "6.0.0", - "System.Text.Encodings.Web": "6.0.0" - } - }, - "Microsoft.Data.SqlClient.SNI.runtime": { - "type": "Transitive", - "resolved": "5.2.0", - "contentHash": "po1jhvFd+8pbfvJR/puh+fkHi0GRanAdvayh/0e47yaM6CXWZ6opUjCMFuYlAnD2LcbyvQE7fPJKvogmaUcN+w==" - }, - "Microsoft.Extensions.Caching.Abstractions": { - "type": "Transitive", - "resolved": "3.1.8", - "contentHash": "iBIdKjKa2nR4LdknV2JMSRpJVM5TOca25EckPm6SZQT6HfH8RoHrn9m14GUAkvzE+uOziXRoAwr8YIC6ZOpyXg==", - "dependencies": { - "Microsoft.Extensions.Primitives": "3.1.8" - } - }, - "Microsoft.Extensions.Caching.Memory": { - "type": "Transitive", - "resolved": "3.1.8", - "contentHash": "u04q7+tgc8l6pQ5HOcr6scgapkQQHnrhpGoCaaAZd24R36/NxGsGxuhSmhHOrQx9CsBLe2CVBN/4CkLlxtnnXw==", - "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "3.1.8", - "Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.8", - "Microsoft.Extensions.Logging.Abstractions": "3.1.8", - "Microsoft.Extensions.Options": "3.1.8" - } - }, - "Microsoft.Extensions.Configuration": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "tldQUBWt/xeH2K7/hMPPo5g8zuLc3Ro9I5d4o/XrxvxOCA2EZBtW7bCHHTc49fcBtvB8tLAb/Qsmfrq+2SJ4vA==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", - "Microsoft.Extensions.Primitives": "7.0.0" - } - }, - "Microsoft.Extensions.Configuration.Abstractions": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "f34u2eaqIjNO9YLHBz8rozVZ+TcFiFs0F3r7nUJd7FRkVSxk8u4OpoK226mi49MwexHOR2ibP9MFvRUaLilcQQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "7.0.0" - } - }, - "Microsoft.Extensions.Configuration.Binder": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "tgU4u7bZsoS9MKVRiotVMAwHtbREHr5/5zSEV+JPhg46+ox47Au84E3D2IacAaB0bk5ePNaNieTlPrfjbbRJkg==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "7.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==" - }, - "Microsoft.Extensions.Http": { - "type": "Transitive", - "resolved": "3.1.8", - "contentHash": "GRkzBs2wJG6jTGqRrT8l/Sqk4MiO0yQltiekDNw/X7L2l5/gKSud/6Vcjb9b5SPtgn6lxcn8qCmfDtk2kP/cOw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.8", - "Microsoft.Extensions.Logging": "3.1.8", - "Microsoft.Extensions.Options": "3.1.8" - } - }, - "Microsoft.Extensions.Logging": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "Nw2muoNrOG5U5qa2ZekXwudUn2BJcD41e65zwmDHb1fQegTX66UokLWZkJRpqSSHXDOWZ5V0iqhbxOEky91atA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "7.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Logging.Abstractions": "7.0.0", - "Microsoft.Extensions.Options": "7.0.0", - "System.Diagnostics.DiagnosticSource": "7.0.0" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "kmn78+LPVMOWeITUjIlfxUPDsI0R6G0RkeAMBmQxAJ7vBJn4q2dTva7pWi65ceN5vPGjJ9q/Uae2WKgvfktJAw==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.5" - } - }, - "Microsoft.Extensions.Logging.Configuration": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "FLDA0HcffKA8ycoDQLJuCNGIE42cLWPxgdQGRBaSzZrYTkMBjnf9zrr8pGT06psLq9Q+RKWmmZczQ9bCrXEBcA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "7.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", - "Microsoft.Extensions.Configuration.Binder": "7.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Logging": "7.0.0", - "Microsoft.Extensions.Logging.Abstractions": "7.0.0", - "Microsoft.Extensions.Options": "7.0.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "7.0.0" - } - }, - "Microsoft.Extensions.Logging.Console": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "qt5n8bHLZPUfuRnFxJKW5q9ZwOTncdh96rtWzWpX3Y/064MlxzCSw2ELF5Jlwdo+Y4wK3I47NmUTFsV7Sg8rqg==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Logging": "7.0.0", - "Microsoft.Extensions.Logging.Abstractions": "7.0.0", - "Microsoft.Extensions.Logging.Configuration": "7.0.0", - "Microsoft.Extensions.Options": "7.0.0", - "System.Buffers": "4.5.1", - "System.Text.Json": "7.0.0" - } - }, - "Microsoft.Extensions.Options": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "lP1yBnTTU42cKpMozuafbvNtQ7QcBjr/CcK3bYOGEMH55Fjt+iecXjT6chR7vbgCMqy3PG3aNQSZgo/EuY/9qQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Primitives": "7.0.0" - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "95UnxZkkFdXxF6vSrtJsMHCzkDeSMuUWGs2hDT54cX+U5eVajrCJ3qLyQRW+CtpTt5OJ8bmTvpQVHu1DLhH+cA==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", - "Microsoft.Extensions.Configuration.Binder": "7.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Options": "7.0.0", - "Microsoft.Extensions.Primitives": "7.0.0" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "um1KU5kxcRp3CNuI8o/GrZtD4AIOXDk+RLsytjZ9QPok3ttLUelLKpilVPuaFT3TFjOhSibUAso0odbOaCDj3Q==", - "dependencies": { - "System.Memory": "4.5.5", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "Microsoft.Identity.Client": { - "type": "Transitive", - "resolved": "4.56.0", - "contentHash": "rr4zbidvHy9r4NvOAs5hdd964Ao2A0pAeFBJKR95u1CJAVzbd1p6tPTXUZ+5ld0cfThiVSGvz6UHwY6JjraTpA==", - "dependencies": { - "Microsoft.IdentityModel.Abstractions": "6.22.0" - } - }, - "Microsoft.Identity.Client.Extensions.Msal": { - "type": "Transitive", - "resolved": "4.56.0", - "contentHash": "H12YAzEGK55vZ+QpxUzozhW8ZZtgPDuWvgA0JbdIR9UhMUplj29JhIgE2imuH8W2Nw9D8JKygR1uxRFtpSNcrg==", - "dependencies": { - "Microsoft.Identity.Client": "4.56.0", - "System.IO.FileSystem.AccessControl": "5.0.0", - "System.Security.Cryptography.ProtectedData": "4.5.0" - } - }, - "Microsoft.IdentityModel.Abstractions": { - "type": "Transitive", - "resolved": "6.35.0", - "contentHash": "xuR8E4Rd96M41CnUSCiOJ2DBh+z+zQSmyrYHdYhD6K4fXBcQGVnRCFQ0efROUYpP+p0zC1BLKr0JRpVuujTZSg==" - }, - "Microsoft.IdentityModel.JsonWebTokens": { - "type": "Transitive", - "resolved": "6.35.0", - "contentHash": "9wxai3hKgZUb4/NjdRKfQd0QJvtXKDlvmGMYACbEC8DFaicMFCFhQFZq9ZET1kJLwZahf2lfY5Gtcpsx8zYzbg==", - "dependencies": { - "Microsoft.IdentityModel.Tokens": "6.35.0", - "System.Text.Encoding": "4.3.0", - "System.Text.Encodings.Web": "4.7.2", - "System.Text.Json": "4.7.2" - } - }, - "Microsoft.IdentityModel.Logging": { - "type": "Transitive", - "resolved": "6.35.0", - "contentHash": "jePrSfGAmqT81JDCNSY+fxVWoGuJKt9e6eJ+vT7+quVS55nWl//jGjUQn4eFtVKt4rt5dXaleZdHRB9J9AJZ7Q==", - "dependencies": { - "Microsoft.IdentityModel.Abstractions": "6.35.0" - } - }, - "Microsoft.IdentityModel.Protocols": { - "type": "Transitive", - "resolved": "6.35.0", - "contentHash": "BPQhlDzdFvv1PzaUxNSk+VEPwezlDEVADIKmyxubw7IiELK18uJ06RQ9QKKkds30XI+gDu9n8j24XQ8w7fjWcg==", - "dependencies": { - "Microsoft.IdentityModel.Logging": "6.35.0", - "Microsoft.IdentityModel.Tokens": "6.35.0" - } - }, - "Microsoft.IdentityModel.Protocols.OpenIdConnect": { - "type": "Transitive", - "resolved": "6.35.0", - "contentHash": "LMtVqnECCCdSmyFoCOxIE5tXQqkOLrvGrL7OxHg41DIm1bpWtaCdGyVcTAfOQpJXvzND9zUKIN/lhngPkYR8vg==", - "dependencies": { - "Microsoft.IdentityModel.Protocols": "6.35.0", - "System.IdentityModel.Tokens.Jwt": "6.35.0", - "System.Text.Encoding": "4.3.0", - "System.Text.Encodings.Web": "4.7.2", - "System.Text.Json": "4.7.2" - } - }, - "Microsoft.IdentityModel.Tokens": { - "type": "Transitive", - "resolved": "6.35.0", - "contentHash": "RN7lvp7s3Boucg1NaNAbqDbxtlLj5Qeb+4uSS1TeK5FSBVM40P4DKaTKChT43sHyKfh7V0zkrMph6DdHvyA4bg==", - "dependencies": { - "Microsoft.CSharp": "4.5.0", - "Microsoft.IdentityModel.Logging": "6.35.0", - "System.Security.Cryptography.Cng": "4.5.0", - "System.Text.Encoding": "4.3.0", - "System.Text.Encodings.Web": "4.7.2", - "System.Text.Json": "4.7.2" - } - }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, - "Microsoft.Rest.ClientRuntime": { - "type": "Transitive", - "resolved": "2.3.24", - "contentHash": "hZH7XgM3eV2jFrnq7Yf0nBD4WVXQzDrer2gEY7HMNiwio2hwDsTHO6LWuueNQAfRpNp4W7mKxcXpwXUiuVIlYw==", - "dependencies": { - "Newtonsoft.Json": "10.0.3" - } - }, - "Microsoft.SqlServer.Server": { - "type": "Transitive", - "resolved": "1.0.0", - "contentHash": "N4KeF3cpcm1PUHym1RmakkzfkEv3GRMyofVv40uXsQhCQeglr2OHNcUk2WOG51AKpGO8ynGpo9M/kFXSzghwug==" - }, - "Microsoft.Win32.Registry": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.4", - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "Newtonsoft.Json": { - "type": "Transitive", - "resolved": "13.0.1", - "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" - }, - "System.Buffers": { - "type": "Transitive", - "resolved": "4.5.1", - "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" - }, - "System.Configuration.ConfigurationManager": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "jXw9MlUu/kRfEU0WyTptAVueupqIeE3/rl0EZDMlf8pcvJnitQ8HeVEp69rZdaStXwTV72boi/Bhw8lOeO+U2w==", - "dependencies": { - "System.Security.Cryptography.ProtectedData": "6.0.0", - "System.Security.Permissions": "6.0.0" - } - }, - "System.Diagnostics.DiagnosticSource": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "9W0ewWDuAyDqS2PigdTxk6jDKonfgscY/hP8hm7VpxYhNHZHKvZTdRckberlFk3VnCmr3xBUyMBut12Q+T2aOw==", - "dependencies": { - "System.Memory": "4.5.5", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "System.IdentityModel.Tokens.Jwt": { - "type": "Transitive", - "resolved": "6.35.0", - "contentHash": "yxGIQd3BFK7F6S62/7RdZk3C/mfwyVxvh6ngd1VYMBmbJ1YZZA9+Ku6suylVtso0FjI0wbElpJ0d27CdsyLpBQ==", - "dependencies": { - "Microsoft.IdentityModel.JsonWebTokens": "6.35.0", - "Microsoft.IdentityModel.Tokens": "6.35.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.FileSystem.AccessControl": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "SxHB3nuNrpptVk+vZ/F+7OHEpoHUIKKMl02bUmYHQr1r+glbZQxs7pRtsf4ENO29TVm2TH3AEeep2fJcy92oYw==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.4", - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.Memory": { - "type": "Transitive", - "resolved": "4.5.5", - "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Numerics.Vectors": "4.4.0", - "System.Runtime.CompilerServices.Unsafe": "4.5.3" - } - }, - "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.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "System.Runtime.Caching": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "E0e03kUp5X2k+UAoVl6efmI7uU7JRBWi5EIdlQ7cr0NpBGjHG4fWII35PgsBY9T4fJQ8E4QPsL0rKksU9gcL5A==", - "dependencies": { - "System.Configuration.ConfigurationManager": "6.0.0" - } - }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" - }, - "System.Runtime.Loader": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "DHMaRn8D8YCK2GG2pw+UzNxn/OHVfaWx7OTLBD/hPegHZZgcZh3H6seWegrC4BYwsfuGrywIuT+MQs+rPqRLTQ==", - "dependencies": { - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Security.AccessControl": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "AUADIc0LIEQe7MzC+I0cl0rAT8RrTAKFHl53yHjEUzNVIaUlhFY11vc2ebiVJzVBuOzun6F7FBA+8KAbGTTedQ==", - "dependencies": { - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.Security.Cryptography.Cng": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "jIMXsKn94T9JY7PvPq/tMfqa6GAaHpElRDpmG+SuL+D3+sTw2M8VhnibKnN8Tq+4JqbPJ/f+BwtLeDMEnzAvRg==" - }, - "System.Security.Cryptography.ProtectedData": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "rp1gMNEZpvx9vP0JW0oHLxlf8oSiQgtno77Y4PLUBjSiDYoD77Y8uXHr1Ea5XG4/pIKhqAdxZ8v8OTUtqo9PeQ==", - "dependencies": { - "System.Memory": "4.5.4" - } - }, - "System.Security.Permissions": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "T/uuc7AklkDoxmcJ7LGkyX1CcSviZuLCa4jg3PekfJ7SU0niF0IVTXwUiNVP9DSpzou2PpxJ+eNY2IfDM90ZCg==", - "dependencies": { - "System.Security.AccessControl": "6.0.0" - } - }, - "System.Security.Principal.Windows": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" - }, - "System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Text.Encoding.CodePages": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "ZFCILZuOvtKPauZ/j/swhvw68ZRi9ATCfvGbk1QfydmcXBkIWecWKn/250UH7rahZ5OoDBaiAudJtPvLwzw85A==", - "dependencies": { - "System.Memory": "4.5.4", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "OP6umVGxc0Z0MvZQBVigj4/U31Pw72ITihDWP9WiWDm+q5aoe0GaJivsfYGq53o6dxH7DcXWiCTl7+0o2CGdmg==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.5", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "System.Text.Json": { - "type": "Transitive", - "resolved": "7.0.3", - "contentHash": "AyjhwXN1zTFeIibHimfJn6eAsZ7rTBib79JQpzg8WAuR/HKDu9JGNHTuu3nbbXQ/bgI+U4z6HtZmCHNXB1QXrQ==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "System.Buffers": "4.5.1", - "System.Memory": "4.5.5", - "System.Numerics.Vectors": "4.5.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "7.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "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==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "4.5.3" - } - }, - "root16.sprout": { - "type": "Project", - "dependencies": { - "Microsoft.Data.SqlClient": "[5.2.0, )", - "Microsoft.Extensions.Logging": "[7.0.0, )", - "Microsoft.Extensions.Logging.Console": "[7.0.0, )", - "Microsoft.PowerPlatform.Dataverse.Client": "[1.1.16, )" - } - } - }, "net8.0": { "Microsoft.PowerPlatform.Dataverse.Client": { "type": "Direct", diff --git a/src/Root16.Sprout.Sample.SqlServer/Program.cs b/src/Root16.Sprout.Sample.SqlServer/Program.cs new file mode 100644 index 0000000..98e6c55 --- /dev/null +++ b/src/Root16.Sprout.Sample.SqlServer/Program.cs @@ -0,0 +1,39 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Root16.Sprout; +using Root16.Sprout.DataSources.Dataverse; +using Root16.Sprout.Sample.SqlServer; +using System.Diagnostics; + +HostApplicationBuilder builder = Host.CreateApplicationBuilder(args); +builder.Configuration.AddUserSecrets(); + +builder.Services.AddSprout(); +builder.Services.AddSproutDataverse(); + +builder.Services.RegisterStep(); + +//Hide Logs Below Warning for Dataverse connections +builder.Logging.AddFilter("Microsoft.PowerPlatform.Dataverse", LogLevel.Warning); + +builder.Services.AddScoped((serviceProvider) => +{ + var connectionString = "Server=localhost\\MSSQLSERVER01;Database=master;Integrated Security=True;Trusted_Connection=True;TrustServerCertificate=true;"; + Debugger.Break(); + var logger = serviceProvider.GetRequiredService>(); + var dataSource = new SqlDataSource(connectionString, logger); + + return dataSource; +}); + +var host = builder.Build(); +host.Start(); + +var runtime = host.Services.GetRequiredService(); + + +await runtime.RunAllStepsAsync(); + +Console.WriteLine("Sprout Sample Complete."); \ No newline at end of file diff --git a/src/Root16.Sprout.Sample.SqlServer/Root16.Sprout.Sample.SqlServer.csproj b/src/Root16.Sprout.Sample.SqlServer/Root16.Sprout.Sample.SqlServer.csproj new file mode 100644 index 0000000..b717918 --- /dev/null +++ b/src/Root16.Sprout.Sample.SqlServer/Root16.Sprout.Sample.SqlServer.csproj @@ -0,0 +1,22 @@ + + + + Exe + net8.0 + enable + enable + 0b1b1af8-4ba4-4491-82cd-b2dfb96db68a + + + + + + + + + + + + + + diff --git a/src/Root16.Sprout.Sample.SqlServer/SampleSQLStep.cs b/src/Root16.Sprout.Sample.SqlServer/SampleSQLStep.cs new file mode 100644 index 0000000..e716a9b --- /dev/null +++ b/src/Root16.Sprout.Sample.SqlServer/SampleSQLStep.cs @@ -0,0 +1,62 @@ +using Microsoft.Data.SqlClient; +using Microsoft.Xrm.Sdk; +using Root16.Sprout.BatchProcessing; +using Root16.Sprout.DataSources; +using Root16.Sprout.DataSources.Dataverse; +using System.Data; + +namespace Root16.Sprout.Sample.SqlServer +{ + public class SampleSQLStep : BatchIntegrationStep + { + private readonly DataverseDataSource? _targetDataverseDataSource; + private readonly EntityOperationReducer _reducer; + private readonly SqlDataSource _sqlDataSource; + private readonly BatchProcessor _batchProcessor; + + public SampleSQLStep(IDataverseDataSourceFactory factory, BatchProcessor batchProcessor, EntityOperationReducer reducer, SqlDataSource sqlDataSource) + { + _targetDataverseDataSource = null; + _batchProcessor = batchProcessor; + _reducer = reducer; + _sqlDataSource = sqlDataSource; + BatchSize = 50; + } + + public override IDataSource OutputDataSource => _sqlDataSource; + + //Todo: Add + public override IPagedQuery GetInputQuery() + { + return _sqlDataSource.CreatePagedQuery("SELECT [PersonID],[LastName],[FirstName],[Address],[City] FROM [master].[dbo].[Persons]"); + } + + public override IReadOnlyList> MapRecord(DataRow source) + { + List> operations = new(); + + for (int i = 0; i < 25; i++) + { + var command = new SqlCommand + { + CommandText = "INSERT INTO [dbo].[Persons] ([PersonID],[LastName],[FirstName],[Address],[City]) VALUES (@PersonId,@LastName,@FirstName,@Address,@City)", + CommandType = CommandType.Text + }; + command.Parameters.Add(new SqlParameter("@PersonId", "ItsATest")); + command.Parameters.Add(new SqlParameter("@LastName", "Tester")); + command.Parameters.Add(new SqlParameter("@FirstName", "Tester")); + command.Parameters.Add(new SqlParameter("@Address", "Tester")); + command.Parameters.Add(new SqlParameter("@City", "Tester")); + + operations.Add(new DataOperation("Insert", command)); + } + + return operations; + } + + public override async Task RunAsync() + { + await _batchProcessor.ProcessAllBatchesAsync(this); + } + } +} diff --git a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs index e69120a..5be7782 100644 --- a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs +++ b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs @@ -1,10 +1,11 @@ using Microsoft.Extensions.Logging; using Microsoft.Data.SqlClient; using System.Data; +using Azure; namespace Root16.Sprout.DataSources.Dataverse; -public class SqlDataSource : IDataSource +public class SqlDataSource : IDataSource, IDataSource { private readonly string connectionString; private readonly ILogger logger; @@ -29,19 +30,48 @@ public DynamicSqlPagedQuery CreatePagedQuery(Func commandGener public void ExecuteNonQuery(string commandText) { - using (var command = connection.CreateCommand()) + using var command = connection.CreateCommand(); + command.CommandText = commandText; + command.Connection.Open(); + try { - command.CommandText = commandText; + command.ExecuteNonQuery(); + } + finally + { + command.Connection.Close(); + } + } + + public async Task>> PerformOperationsAsync(IEnumerable> operations, bool dryRun, IEnumerable dataOperationFlags) + { + if (dryRun) + { + return operations.Select(x => new DataOperationResult(x, true)).ToList(); + } + + var finishedOperations = new List>(); + foreach (var dataOperation in operations) + { + var command = dataOperation.Data; + command.Connection = connection; command.Connection.Open(); try { command.ExecuteNonQuery(); + finishedOperations.Add(new DataOperationResult(dataOperation, true)); + } catch(Exception ex) + { + logger.LogError(ex.Message); + finishedOperations.Add(new DataOperationResult(dataOperation, false)); } finally { command.Connection.Close(); } } + + return finishedOperations; } public Task>> PerformOperationsAsync(IEnumerable> operations, bool dryRun, IEnumerable dataOperationFlags) diff --git a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs index 4e37f03..b5f5ffe 100644 --- a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs +++ b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs @@ -20,33 +20,38 @@ public SqlPagedQuery(SqlConnection connection, string commandText, string? total public async Task> GetNextPageAsync(int pageNumber, int pageSize, object? bookmark) { - using (var command = connection.CreateCommand()) + using var command = connection.CreateCommand(); + command.CommandText = commandText; + if (addPaging) { - command.CommandText = commandText; - if (addPaging) + if (commandText.Contains("ORDER BY", StringComparison.OrdinalIgnoreCase)) { command.CommandText += $" OFFSET {pageNumber * pageSize} ROWS FETCH NEXT {pageSize} ROWS ONLY"; } - command.Connection.Open(); - var reader = await command.ExecuteReaderAsync(CommandBehavior.CloseConnection); - try + else { - DataTable table = new DataTable(); - table.Load(reader); - - var rows = new List(table.Rows.Cast()); - return new PagedQueryResult - ( - rows, - table.Rows.Count == pageSize, - null - ); - } - finally - { - command.Connection.Close(); + command.CommandText += $" ORDER BY (SELECT NULL) OFFSET {pageNumber * pageSize} ROWS FETCH NEXT {pageSize} ROWS ONLY"; } } + command.Connection.Open(); + var reader = await command.ExecuteReaderAsync(CommandBehavior.CloseConnection); + try + { + DataTable table = new DataTable(); + table.Load(reader); + + var rows = new List(table.Rows.Cast()); + return new PagedQueryResult + ( + rows, + table.Rows.Count == pageSize, + null + ); + } + finally + { + command.Connection.Close(); + } } public async Task GetTotalRecordCountAsync() diff --git a/src/Root16.Sprout.SqlServer/Root16.Sprout.SqlServer.csproj b/src/Root16.Sprout.SqlServer/Root16.Sprout.SqlServer.csproj index 8778269..ae71b07 100644 --- a/src/Root16.Sprout.SqlServer/Root16.Sprout.SqlServer.csproj +++ b/src/Root16.Sprout.SqlServer/Root16.Sprout.SqlServer.csproj @@ -1,7 +1,7 @@  - net8.0;netstandard2.1 + net8.0 enable enable https://github.com/Root16/sprout diff --git a/src/Root16.Sprout.SqlServer/packages.lock.json b/src/Root16.Sprout.SqlServer/packages.lock.json index f2cbb72..3e9c945 100644 --- a/src/Root16.Sprout.SqlServer/packages.lock.json +++ b/src/Root16.Sprout.SqlServer/packages.lock.json @@ -1,590 +1,6 @@ { "version": 1, "dependencies": { - ".NETStandard,Version=v2.1": { - "Microsoft.Data.SqlClient": { - "type": "Direct", - "requested": "[5.2.0, )", - "resolved": "5.2.0", - "contentHash": "3alfyqRN3ELRtdvU1dGtLBRNQqprr3TJ0WrUJfMISPwg1nPUN2P3Lelah68IKWuV27Ceb7ig95hWNHFTSXfxMg==", - "dependencies": { - "Azure.Identity": "1.10.3", - "Microsoft.Data.SqlClient.SNI.runtime": "5.2.0", - "Microsoft.Identity.Client": "4.56.0", - "Microsoft.IdentityModel.JsonWebTokens": "6.35.0", - "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.35.0", - "Microsoft.SqlServer.Server": "1.0.0", - "Microsoft.Win32.Registry": "5.0.0", - "System.Configuration.ConfigurationManager": "6.0.1", - "System.Diagnostics.DiagnosticSource": "6.0.1", - "System.Runtime.Caching": "6.0.0", - "System.Runtime.Loader": "4.3.0", - "System.Security.Cryptography.Cng": "5.0.0", - "System.Security.Principal.Windows": "5.0.0", - "System.Text.Encoding.CodePages": "6.0.0", - "System.Text.Encodings.Web": "6.0.0" - } - }, - "Azure.Core": { - "type": "Transitive", - "resolved": "1.35.0", - "contentHash": "hENcx03Jyuqv05F4RBEPbxz29UrM3Nbhnr6Wl6NQpoU9BCIbL3XLentrxDCTrH54NLS11Exxi/o8MYgT/cnKFA==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "1.1.1", - "System.Diagnostics.DiagnosticSource": "6.0.1", - "System.Memory.Data": "1.0.2", - "System.Numerics.Vectors": "4.5.0", - "System.Text.Encodings.Web": "4.7.2", - "System.Text.Json": "4.7.2", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Azure.Identity": { - "type": "Transitive", - "resolved": "1.10.3", - "contentHash": "l1Xm2MWOF2Mzcwuarlw8kWQXLZk3UeB55aQXVyjj23aBfDwOZ3gu5GP2kJ6KlmZeZv2TCzw7x4L3V36iNr3gww==", - "dependencies": { - "Azure.Core": "1.35.0", - "Microsoft.Identity.Client": "4.56.0", - "Microsoft.Identity.Client.Extensions.Msal": "4.56.0", - "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" - } - }, - "Microsoft.Bcl.AsyncInterfaces": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "3aeMZ1N0lJoSyzqiP03hqemtb1BijhsJADdobn/4nsMJ8V1H+CrpuduUe4hlRdx+ikBQju1VGjMD1GJ3Sk05Eg==" - }, - "Microsoft.CSharp": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ==" - }, - "Microsoft.Data.SqlClient.SNI.runtime": { - "type": "Transitive", - "resolved": "5.2.0", - "contentHash": "po1jhvFd+8pbfvJR/puh+fkHi0GRanAdvayh/0e47yaM6CXWZ6opUjCMFuYlAnD2LcbyvQE7fPJKvogmaUcN+w==" - }, - "Microsoft.Extensions.Caching.Abstractions": { - "type": "Transitive", - "resolved": "3.1.8", - "contentHash": "iBIdKjKa2nR4LdknV2JMSRpJVM5TOca25EckPm6SZQT6HfH8RoHrn9m14GUAkvzE+uOziXRoAwr8YIC6ZOpyXg==", - "dependencies": { - "Microsoft.Extensions.Primitives": "3.1.8" - } - }, - "Microsoft.Extensions.Caching.Memory": { - "type": "Transitive", - "resolved": "3.1.8", - "contentHash": "u04q7+tgc8l6pQ5HOcr6scgapkQQHnrhpGoCaaAZd24R36/NxGsGxuhSmhHOrQx9CsBLe2CVBN/4CkLlxtnnXw==", - "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "3.1.8", - "Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.8", - "Microsoft.Extensions.Logging.Abstractions": "3.1.8", - "Microsoft.Extensions.Options": "3.1.8" - } - }, - "Microsoft.Extensions.Configuration": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "tldQUBWt/xeH2K7/hMPPo5g8zuLc3Ro9I5d4o/XrxvxOCA2EZBtW7bCHHTc49fcBtvB8tLAb/Qsmfrq+2SJ4vA==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", - "Microsoft.Extensions.Primitives": "7.0.0" - } - }, - "Microsoft.Extensions.Configuration.Abstractions": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "f34u2eaqIjNO9YLHBz8rozVZ+TcFiFs0F3r7nUJd7FRkVSxk8u4OpoK226mi49MwexHOR2ibP9MFvRUaLilcQQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "7.0.0" - } - }, - "Microsoft.Extensions.Configuration.Binder": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "tgU4u7bZsoS9MKVRiotVMAwHtbREHr5/5zSEV+JPhg46+ox47Au84E3D2IacAaB0bk5ePNaNieTlPrfjbbRJkg==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "7.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==" - }, - "Microsoft.Extensions.Http": { - "type": "Transitive", - "resolved": "3.1.8", - "contentHash": "GRkzBs2wJG6jTGqRrT8l/Sqk4MiO0yQltiekDNw/X7L2l5/gKSud/6Vcjb9b5SPtgn6lxcn8qCmfDtk2kP/cOw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.8", - "Microsoft.Extensions.Logging": "3.1.8", - "Microsoft.Extensions.Options": "3.1.8" - } - }, - "Microsoft.Extensions.Logging": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "Nw2muoNrOG5U5qa2ZekXwudUn2BJcD41e65zwmDHb1fQegTX66UokLWZkJRpqSSHXDOWZ5V0iqhbxOEky91atA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "7.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Logging.Abstractions": "7.0.0", - "Microsoft.Extensions.Options": "7.0.0", - "System.Diagnostics.DiagnosticSource": "7.0.0" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "kmn78+LPVMOWeITUjIlfxUPDsI0R6G0RkeAMBmQxAJ7vBJn4q2dTva7pWi65ceN5vPGjJ9q/Uae2WKgvfktJAw==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.5" - } - }, - "Microsoft.Extensions.Logging.Configuration": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "FLDA0HcffKA8ycoDQLJuCNGIE42cLWPxgdQGRBaSzZrYTkMBjnf9zrr8pGT06psLq9Q+RKWmmZczQ9bCrXEBcA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "7.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", - "Microsoft.Extensions.Configuration.Binder": "7.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Logging": "7.0.0", - "Microsoft.Extensions.Logging.Abstractions": "7.0.0", - "Microsoft.Extensions.Options": "7.0.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "7.0.0" - } - }, - "Microsoft.Extensions.Logging.Console": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "qt5n8bHLZPUfuRnFxJKW5q9ZwOTncdh96rtWzWpX3Y/064MlxzCSw2ELF5Jlwdo+Y4wK3I47NmUTFsV7Sg8rqg==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Logging": "7.0.0", - "Microsoft.Extensions.Logging.Abstractions": "7.0.0", - "Microsoft.Extensions.Logging.Configuration": "7.0.0", - "Microsoft.Extensions.Options": "7.0.0", - "System.Buffers": "4.5.1", - "System.Text.Json": "7.0.0" - } - }, - "Microsoft.Extensions.Options": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "lP1yBnTTU42cKpMozuafbvNtQ7QcBjr/CcK3bYOGEMH55Fjt+iecXjT6chR7vbgCMqy3PG3aNQSZgo/EuY/9qQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Primitives": "7.0.0" - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "95UnxZkkFdXxF6vSrtJsMHCzkDeSMuUWGs2hDT54cX+U5eVajrCJ3qLyQRW+CtpTt5OJ8bmTvpQVHu1DLhH+cA==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", - "Microsoft.Extensions.Configuration.Binder": "7.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Options": "7.0.0", - "Microsoft.Extensions.Primitives": "7.0.0" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "um1KU5kxcRp3CNuI8o/GrZtD4AIOXDk+RLsytjZ9QPok3ttLUelLKpilVPuaFT3TFjOhSibUAso0odbOaCDj3Q==", - "dependencies": { - "System.Memory": "4.5.5", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "Microsoft.Identity.Client": { - "type": "Transitive", - "resolved": "4.56.0", - "contentHash": "rr4zbidvHy9r4NvOAs5hdd964Ao2A0pAeFBJKR95u1CJAVzbd1p6tPTXUZ+5ld0cfThiVSGvz6UHwY6JjraTpA==", - "dependencies": { - "Microsoft.IdentityModel.Abstractions": "6.22.0" - } - }, - "Microsoft.Identity.Client.Extensions.Msal": { - "type": "Transitive", - "resolved": "4.56.0", - "contentHash": "H12YAzEGK55vZ+QpxUzozhW8ZZtgPDuWvgA0JbdIR9UhMUplj29JhIgE2imuH8W2Nw9D8JKygR1uxRFtpSNcrg==", - "dependencies": { - "Microsoft.Identity.Client": "4.56.0", - "System.IO.FileSystem.AccessControl": "5.0.0", - "System.Security.Cryptography.ProtectedData": "4.5.0" - } - }, - "Microsoft.IdentityModel.Abstractions": { - "type": "Transitive", - "resolved": "6.35.0", - "contentHash": "xuR8E4Rd96M41CnUSCiOJ2DBh+z+zQSmyrYHdYhD6K4fXBcQGVnRCFQ0efROUYpP+p0zC1BLKr0JRpVuujTZSg==" - }, - "Microsoft.IdentityModel.JsonWebTokens": { - "type": "Transitive", - "resolved": "6.35.0", - "contentHash": "9wxai3hKgZUb4/NjdRKfQd0QJvtXKDlvmGMYACbEC8DFaicMFCFhQFZq9ZET1kJLwZahf2lfY5Gtcpsx8zYzbg==", - "dependencies": { - "Microsoft.IdentityModel.Tokens": "6.35.0", - "System.Text.Encoding": "4.3.0", - "System.Text.Encodings.Web": "4.7.2", - "System.Text.Json": "4.7.2" - } - }, - "Microsoft.IdentityModel.Logging": { - "type": "Transitive", - "resolved": "6.35.0", - "contentHash": "jePrSfGAmqT81JDCNSY+fxVWoGuJKt9e6eJ+vT7+quVS55nWl//jGjUQn4eFtVKt4rt5dXaleZdHRB9J9AJZ7Q==", - "dependencies": { - "Microsoft.IdentityModel.Abstractions": "6.35.0" - } - }, - "Microsoft.IdentityModel.Protocols": { - "type": "Transitive", - "resolved": "6.35.0", - "contentHash": "BPQhlDzdFvv1PzaUxNSk+VEPwezlDEVADIKmyxubw7IiELK18uJ06RQ9QKKkds30XI+gDu9n8j24XQ8w7fjWcg==", - "dependencies": { - "Microsoft.IdentityModel.Logging": "6.35.0", - "Microsoft.IdentityModel.Tokens": "6.35.0" - } - }, - "Microsoft.IdentityModel.Protocols.OpenIdConnect": { - "type": "Transitive", - "resolved": "6.35.0", - "contentHash": "LMtVqnECCCdSmyFoCOxIE5tXQqkOLrvGrL7OxHg41DIm1bpWtaCdGyVcTAfOQpJXvzND9zUKIN/lhngPkYR8vg==", - "dependencies": { - "Microsoft.IdentityModel.Protocols": "6.35.0", - "System.IdentityModel.Tokens.Jwt": "6.35.0", - "System.Text.Encoding": "4.3.0", - "System.Text.Encodings.Web": "4.7.2", - "System.Text.Json": "4.7.2" - } - }, - "Microsoft.IdentityModel.Tokens": { - "type": "Transitive", - "resolved": "6.35.0", - "contentHash": "RN7lvp7s3Boucg1NaNAbqDbxtlLj5Qeb+4uSS1TeK5FSBVM40P4DKaTKChT43sHyKfh7V0zkrMph6DdHvyA4bg==", - "dependencies": { - "Microsoft.CSharp": "4.5.0", - "Microsoft.IdentityModel.Logging": "6.35.0", - "System.Security.Cryptography.Cng": "4.5.0", - "System.Text.Encoding": "4.3.0", - "System.Text.Encodings.Web": "4.7.2", - "System.Text.Json": "4.7.2" - } - }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, - "Microsoft.PowerPlatform.Dataverse.Client": { - "type": "Transitive", - "resolved": "1.1.16", - "contentHash": "zrkb4MIwynYE+lBF1Y4ljyYWwQvXIvDgviSZ2r1TY9P9a3UmEGLWp/jJFbOt+3v4Uw4fXcL4Yed8HRfc/GOnQQ==", - "dependencies": { - "Microsoft.Extensions.Caching.Memory": "3.1.8", - "Microsoft.Extensions.DependencyInjection": "3.1.8", - "Microsoft.Extensions.Http": "3.1.8", - "Microsoft.Extensions.Logging": "3.1.8", - "Microsoft.Identity.Client": "4.56.0", - "Microsoft.Identity.Client.Extensions.Msal": "4.56.0", - "Microsoft.Rest.ClientRuntime": "2.3.24", - "Newtonsoft.Json": "13.0.1", - "System.Text.Json": "7.0.3" - } - }, - "Microsoft.Rest.ClientRuntime": { - "type": "Transitive", - "resolved": "2.3.24", - "contentHash": "hZH7XgM3eV2jFrnq7Yf0nBD4WVXQzDrer2gEY7HMNiwio2hwDsTHO6LWuueNQAfRpNp4W7mKxcXpwXUiuVIlYw==", - "dependencies": { - "Newtonsoft.Json": "10.0.3" - } - }, - "Microsoft.SqlServer.Server": { - "type": "Transitive", - "resolved": "1.0.0", - "contentHash": "N4KeF3cpcm1PUHym1RmakkzfkEv3GRMyofVv40uXsQhCQeglr2OHNcUk2WOG51AKpGO8ynGpo9M/kFXSzghwug==" - }, - "Microsoft.Win32.Registry": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.4", - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "Newtonsoft.Json": { - "type": "Transitive", - "resolved": "13.0.1", - "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" - }, - "System.Buffers": { - "type": "Transitive", - "resolved": "4.5.1", - "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" - }, - "System.Configuration.ConfigurationManager": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "jXw9MlUu/kRfEU0WyTptAVueupqIeE3/rl0EZDMlf8pcvJnitQ8HeVEp69rZdaStXwTV72boi/Bhw8lOeO+U2w==", - "dependencies": { - "System.Security.Cryptography.ProtectedData": "6.0.0", - "System.Security.Permissions": "6.0.0" - } - }, - "System.Diagnostics.DiagnosticSource": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "9W0ewWDuAyDqS2PigdTxk6jDKonfgscY/hP8hm7VpxYhNHZHKvZTdRckberlFk3VnCmr3xBUyMBut12Q+T2aOw==", - "dependencies": { - "System.Memory": "4.5.5", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "System.IdentityModel.Tokens.Jwt": { - "type": "Transitive", - "resolved": "6.35.0", - "contentHash": "yxGIQd3BFK7F6S62/7RdZk3C/mfwyVxvh6ngd1VYMBmbJ1YZZA9+Ku6suylVtso0FjI0wbElpJ0d27CdsyLpBQ==", - "dependencies": { - "Microsoft.IdentityModel.JsonWebTokens": "6.35.0", - "Microsoft.IdentityModel.Tokens": "6.35.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.FileSystem.AccessControl": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "SxHB3nuNrpptVk+vZ/F+7OHEpoHUIKKMl02bUmYHQr1r+glbZQxs7pRtsf4ENO29TVm2TH3AEeep2fJcy92oYw==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.4", - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.Memory": { - "type": "Transitive", - "resolved": "4.5.5", - "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Numerics.Vectors": "4.4.0", - "System.Runtime.CompilerServices.Unsafe": "4.5.3" - } - }, - "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.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "System.Runtime.Caching": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "E0e03kUp5X2k+UAoVl6efmI7uU7JRBWi5EIdlQ7cr0NpBGjHG4fWII35PgsBY9T4fJQ8E4QPsL0rKksU9gcL5A==", - "dependencies": { - "System.Configuration.ConfigurationManager": "6.0.0" - } - }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" - }, - "System.Runtime.Loader": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "DHMaRn8D8YCK2GG2pw+UzNxn/OHVfaWx7OTLBD/hPegHZZgcZh3H6seWegrC4BYwsfuGrywIuT+MQs+rPqRLTQ==", - "dependencies": { - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Security.AccessControl": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "AUADIc0LIEQe7MzC+I0cl0rAT8RrTAKFHl53yHjEUzNVIaUlhFY11vc2ebiVJzVBuOzun6F7FBA+8KAbGTTedQ==", - "dependencies": { - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.Security.Cryptography.Cng": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "jIMXsKn94T9JY7PvPq/tMfqa6GAaHpElRDpmG+SuL+D3+sTw2M8VhnibKnN8Tq+4JqbPJ/f+BwtLeDMEnzAvRg==" - }, - "System.Security.Cryptography.ProtectedData": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "rp1gMNEZpvx9vP0JW0oHLxlf8oSiQgtno77Y4PLUBjSiDYoD77Y8uXHr1Ea5XG4/pIKhqAdxZ8v8OTUtqo9PeQ==", - "dependencies": { - "System.Memory": "4.5.4" - } - }, - "System.Security.Permissions": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "T/uuc7AklkDoxmcJ7LGkyX1CcSviZuLCa4jg3PekfJ7SU0niF0IVTXwUiNVP9DSpzou2PpxJ+eNY2IfDM90ZCg==", - "dependencies": { - "System.Security.AccessControl": "6.0.0" - } - }, - "System.Security.Principal.Windows": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" - }, - "System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Text.Encoding.CodePages": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "ZFCILZuOvtKPauZ/j/swhvw68ZRi9ATCfvGbk1QfydmcXBkIWecWKn/250UH7rahZ5OoDBaiAudJtPvLwzw85A==", - "dependencies": { - "System.Memory": "4.5.4", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "OP6umVGxc0Z0MvZQBVigj4/U31Pw72ITihDWP9WiWDm+q5aoe0GaJivsfYGq53o6dxH7DcXWiCTl7+0o2CGdmg==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.5", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "System.Text.Json": { - "type": "Transitive", - "resolved": "7.0.3", - "contentHash": "AyjhwXN1zTFeIibHimfJn6eAsZ7rTBib79JQpzg8WAuR/HKDu9JGNHTuu3nbbXQ/bgI+U4z6HtZmCHNXB1QXrQ==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "System.Buffers": "4.5.1", - "System.Memory": "4.5.5", - "System.Numerics.Vectors": "4.5.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "7.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "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==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "4.5.3" - } - }, - "root16.sprout": { - "type": "Project", - "dependencies": { - "Microsoft.Data.SqlClient": "[5.2.0, )", - "Microsoft.Extensions.Logging": "[7.0.0, )", - "Microsoft.Extensions.Logging.Console": "[7.0.0, )", - "Microsoft.PowerPlatform.Dataverse.Client": "[1.1.16, )" - } - } - }, "net8.0": { "Microsoft.Data.SqlClient": { "type": "Direct", diff --git a/src/Root16.Sprout.sln b/src/Root16.Sprout.sln index bcb7c1f..1bd7a20 100644 --- a/src/Root16.Sprout.sln +++ b/src/Root16.Sprout.sln @@ -9,9 +9,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Root16.Sprout.Sample.Parall EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Root16.Sprout.Sample.CreatesAndUpdates", "Root16.Sprout.Sample.CreatesAndUpdates\Root16.Sprout.Sample.CreatesAndUpdates.csproj", "{258956BF-023D-46A4-BCC3-F3F3B339612C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Root16.Sprout.Dataverse", "Root16.Sprout.Dataverse\Root16.Sprout.Dataverse.csproj", "{5DE864A9-B356-4920-BE17-181051EDFAA2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Root16.Sprout.Dataverse", "Root16.Sprout.Dataverse\Root16.Sprout.Dataverse.csproj", "{5DE864A9-B356-4920-BE17-181051EDFAA2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Root16.Sprout.SqlServer", "Root16.Sprout.SqlServer\Root16.Sprout.SqlServer.csproj", "{2D4771B9-310D-4829-AE16-219EFFC1A707}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Root16.Sprout.SqlServer", "Root16.Sprout.SqlServer\Root16.Sprout.SqlServer.csproj", "{2D4771B9-310D-4829-AE16-219EFFC1A707}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Root16.Sprout.Sample.SqlServer", "Root16.Sprout.Sample.SqlServer\Root16.Sprout.Sample.SqlServer.csproj", "{DE0FA5BD-0445-406E-9158-7F89FC2B6958}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -39,6 +41,10 @@ Global {2D4771B9-310D-4829-AE16-219EFFC1A707}.Debug|Any CPU.Build.0 = Debug|Any CPU {2D4771B9-310D-4829-AE16-219EFFC1A707}.Release|Any CPU.ActiveCfg = Release|Any CPU {2D4771B9-310D-4829-AE16-219EFFC1A707}.Release|Any CPU.Build.0 = Release|Any CPU + {DE0FA5BD-0445-406E-9158-7F89FC2B6958}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DE0FA5BD-0445-406E-9158-7F89FC2B6958}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DE0FA5BD-0445-406E-9158-7F89FC2B6958}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DE0FA5BD-0445-406E-9158-7F89FC2B6958}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/Root16.Sprout/Root16.Sprout.csproj b/src/Root16.Sprout/Root16.Sprout.csproj index b5bc2ae..e31d930 100644 --- a/src/Root16.Sprout/Root16.Sprout.csproj +++ b/src/Root16.Sprout/Root16.Sprout.csproj @@ -1,7 +1,7 @@  - net8.0;netstandard2.1 + net8.0 enable enable https://github.com/Root16/sprout diff --git a/src/Root16.Sprout/packages.lock.json b/src/Root16.Sprout/packages.lock.json index 2d3af4c..db9dfe2 100644 --- a/src/Root16.Sprout/packages.lock.json +++ b/src/Root16.Sprout/packages.lock.json @@ -1,604 +1,6 @@ { "version": 1, "dependencies": { - ".NETStandard,Version=v2.1": { - "Microsoft.Data.SqlClient": { - "type": "Direct", - "requested": "[5.2.0, )", - "resolved": "5.2.0", - "contentHash": "3alfyqRN3ELRtdvU1dGtLBRNQqprr3TJ0WrUJfMISPwg1nPUN2P3Lelah68IKWuV27Ceb7ig95hWNHFTSXfxMg==", - "dependencies": { - "Azure.Identity": "1.10.3", - "Microsoft.Data.SqlClient.SNI.runtime": "5.2.0", - "Microsoft.Identity.Client": "4.56.0", - "Microsoft.IdentityModel.JsonWebTokens": "6.35.0", - "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.35.0", - "Microsoft.SqlServer.Server": "1.0.0", - "Microsoft.Win32.Registry": "5.0.0", - "System.Configuration.ConfigurationManager": "6.0.1", - "System.Diagnostics.DiagnosticSource": "6.0.1", - "System.Runtime.Caching": "6.0.0", - "System.Runtime.Loader": "4.3.0", - "System.Security.Cryptography.Cng": "5.0.0", - "System.Security.Principal.Windows": "5.0.0", - "System.Text.Encoding.CodePages": "6.0.0", - "System.Text.Encodings.Web": "6.0.0" - } - }, - "Microsoft.Extensions.Logging": { - "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "Nw2muoNrOG5U5qa2ZekXwudUn2BJcD41e65zwmDHb1fQegTX66UokLWZkJRpqSSHXDOWZ5V0iqhbxOEky91atA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "7.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Logging.Abstractions": "7.0.0", - "Microsoft.Extensions.Options": "7.0.0", - "System.Diagnostics.DiagnosticSource": "7.0.0" - } - }, - "Microsoft.Extensions.Logging.Console": { - "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "qt5n8bHLZPUfuRnFxJKW5q9ZwOTncdh96rtWzWpX3Y/064MlxzCSw2ELF5Jlwdo+Y4wK3I47NmUTFsV7Sg8rqg==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Logging": "7.0.0", - "Microsoft.Extensions.Logging.Abstractions": "7.0.0", - "Microsoft.Extensions.Logging.Configuration": "7.0.0", - "Microsoft.Extensions.Options": "7.0.0", - "System.Buffers": "4.5.1", - "System.Text.Json": "7.0.0" - } - }, - "Microsoft.PowerPlatform.Dataverse.Client": { - "type": "Direct", - "requested": "[1.1.16, )", - "resolved": "1.1.16", - "contentHash": "zrkb4MIwynYE+lBF1Y4ljyYWwQvXIvDgviSZ2r1TY9P9a3UmEGLWp/jJFbOt+3v4Uw4fXcL4Yed8HRfc/GOnQQ==", - "dependencies": { - "Microsoft.Extensions.Caching.Memory": "3.1.8", - "Microsoft.Extensions.DependencyInjection": "3.1.8", - "Microsoft.Extensions.Http": "3.1.8", - "Microsoft.Extensions.Logging": "3.1.8", - "Microsoft.Identity.Client": "4.56.0", - "Microsoft.Identity.Client.Extensions.Msal": "4.56.0", - "Microsoft.Rest.ClientRuntime": "2.3.24", - "Newtonsoft.Json": "13.0.1", - "System.Text.Json": "7.0.3" - } - }, - "Microsoft.SourceLink.GitHub": { - "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", - "dependencies": { - "Microsoft.Build.Tasks.Git": "8.0.0", - "Microsoft.SourceLink.Common": "8.0.0" - } - }, - "Azure.Core": { - "type": "Transitive", - "resolved": "1.35.0", - "contentHash": "hENcx03Jyuqv05F4RBEPbxz29UrM3Nbhnr6Wl6NQpoU9BCIbL3XLentrxDCTrH54NLS11Exxi/o8MYgT/cnKFA==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "1.1.1", - "System.Diagnostics.DiagnosticSource": "6.0.1", - "System.Memory.Data": "1.0.2", - "System.Numerics.Vectors": "4.5.0", - "System.Text.Encodings.Web": "4.7.2", - "System.Text.Json": "4.7.2", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Azure.Identity": { - "type": "Transitive", - "resolved": "1.10.3", - "contentHash": "l1Xm2MWOF2Mzcwuarlw8kWQXLZk3UeB55aQXVyjj23aBfDwOZ3gu5GP2kJ6KlmZeZv2TCzw7x4L3V36iNr3gww==", - "dependencies": { - "Azure.Core": "1.35.0", - "Microsoft.Identity.Client": "4.56.0", - "Microsoft.Identity.Client.Extensions.Msal": "4.56.0", - "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" - } - }, - "Microsoft.Bcl.AsyncInterfaces": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "3aeMZ1N0lJoSyzqiP03hqemtb1BijhsJADdobn/4nsMJ8V1H+CrpuduUe4hlRdx+ikBQju1VGjMD1GJ3Sk05Eg==" - }, - "Microsoft.Build.Tasks.Git": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" - }, - "Microsoft.CSharp": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ==" - }, - "Microsoft.Data.SqlClient.SNI.runtime": { - "type": "Transitive", - "resolved": "5.2.0", - "contentHash": "po1jhvFd+8pbfvJR/puh+fkHi0GRanAdvayh/0e47yaM6CXWZ6opUjCMFuYlAnD2LcbyvQE7fPJKvogmaUcN+w==" - }, - "Microsoft.Extensions.Caching.Abstractions": { - "type": "Transitive", - "resolved": "3.1.8", - "contentHash": "iBIdKjKa2nR4LdknV2JMSRpJVM5TOca25EckPm6SZQT6HfH8RoHrn9m14GUAkvzE+uOziXRoAwr8YIC6ZOpyXg==", - "dependencies": { - "Microsoft.Extensions.Primitives": "3.1.8" - } - }, - "Microsoft.Extensions.Caching.Memory": { - "type": "Transitive", - "resolved": "3.1.8", - "contentHash": "u04q7+tgc8l6pQ5HOcr6scgapkQQHnrhpGoCaaAZd24R36/NxGsGxuhSmhHOrQx9CsBLe2CVBN/4CkLlxtnnXw==", - "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "3.1.8", - "Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.8", - "Microsoft.Extensions.Logging.Abstractions": "3.1.8", - "Microsoft.Extensions.Options": "3.1.8" - } - }, - "Microsoft.Extensions.Configuration": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "tldQUBWt/xeH2K7/hMPPo5g8zuLc3Ro9I5d4o/XrxvxOCA2EZBtW7bCHHTc49fcBtvB8tLAb/Qsmfrq+2SJ4vA==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", - "Microsoft.Extensions.Primitives": "7.0.0" - } - }, - "Microsoft.Extensions.Configuration.Abstractions": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "f34u2eaqIjNO9YLHBz8rozVZ+TcFiFs0F3r7nUJd7FRkVSxk8u4OpoK226mi49MwexHOR2ibP9MFvRUaLilcQQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "7.0.0" - } - }, - "Microsoft.Extensions.Configuration.Binder": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "tgU4u7bZsoS9MKVRiotVMAwHtbREHr5/5zSEV+JPhg46+ox47Au84E3D2IacAaB0bk5ePNaNieTlPrfjbbRJkg==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "7.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==" - }, - "Microsoft.Extensions.Http": { - "type": "Transitive", - "resolved": "3.1.8", - "contentHash": "GRkzBs2wJG6jTGqRrT8l/Sqk4MiO0yQltiekDNw/X7L2l5/gKSud/6Vcjb9b5SPtgn6lxcn8qCmfDtk2kP/cOw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.8", - "Microsoft.Extensions.Logging": "3.1.8", - "Microsoft.Extensions.Options": "3.1.8" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "kmn78+LPVMOWeITUjIlfxUPDsI0R6G0RkeAMBmQxAJ7vBJn4q2dTva7pWi65ceN5vPGjJ9q/Uae2WKgvfktJAw==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.5" - } - }, - "Microsoft.Extensions.Logging.Configuration": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "FLDA0HcffKA8ycoDQLJuCNGIE42cLWPxgdQGRBaSzZrYTkMBjnf9zrr8pGT06psLq9Q+RKWmmZczQ9bCrXEBcA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "7.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", - "Microsoft.Extensions.Configuration.Binder": "7.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Logging": "7.0.0", - "Microsoft.Extensions.Logging.Abstractions": "7.0.0", - "Microsoft.Extensions.Options": "7.0.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "7.0.0" - } - }, - "Microsoft.Extensions.Options": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "lP1yBnTTU42cKpMozuafbvNtQ7QcBjr/CcK3bYOGEMH55Fjt+iecXjT6chR7vbgCMqy3PG3aNQSZgo/EuY/9qQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Primitives": "7.0.0" - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "95UnxZkkFdXxF6vSrtJsMHCzkDeSMuUWGs2hDT54cX+U5eVajrCJ3qLyQRW+CtpTt5OJ8bmTvpQVHu1DLhH+cA==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", - "Microsoft.Extensions.Configuration.Binder": "7.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Options": "7.0.0", - "Microsoft.Extensions.Primitives": "7.0.0" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "um1KU5kxcRp3CNuI8o/GrZtD4AIOXDk+RLsytjZ9QPok3ttLUelLKpilVPuaFT3TFjOhSibUAso0odbOaCDj3Q==", - "dependencies": { - "System.Memory": "4.5.5", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "Microsoft.Identity.Client": { - "type": "Transitive", - "resolved": "4.56.0", - "contentHash": "rr4zbidvHy9r4NvOAs5hdd964Ao2A0pAeFBJKR95u1CJAVzbd1p6tPTXUZ+5ld0cfThiVSGvz6UHwY6JjraTpA==", - "dependencies": { - "Microsoft.IdentityModel.Abstractions": "6.22.0" - } - }, - "Microsoft.Identity.Client.Extensions.Msal": { - "type": "Transitive", - "resolved": "4.56.0", - "contentHash": "H12YAzEGK55vZ+QpxUzozhW8ZZtgPDuWvgA0JbdIR9UhMUplj29JhIgE2imuH8W2Nw9D8JKygR1uxRFtpSNcrg==", - "dependencies": { - "Microsoft.Identity.Client": "4.56.0", - "System.IO.FileSystem.AccessControl": "5.0.0", - "System.Security.Cryptography.ProtectedData": "4.5.0" - } - }, - "Microsoft.IdentityModel.Abstractions": { - "type": "Transitive", - "resolved": "6.35.0", - "contentHash": "xuR8E4Rd96M41CnUSCiOJ2DBh+z+zQSmyrYHdYhD6K4fXBcQGVnRCFQ0efROUYpP+p0zC1BLKr0JRpVuujTZSg==" - }, - "Microsoft.IdentityModel.JsonWebTokens": { - "type": "Transitive", - "resolved": "6.35.0", - "contentHash": "9wxai3hKgZUb4/NjdRKfQd0QJvtXKDlvmGMYACbEC8DFaicMFCFhQFZq9ZET1kJLwZahf2lfY5Gtcpsx8zYzbg==", - "dependencies": { - "Microsoft.IdentityModel.Tokens": "6.35.0", - "System.Text.Encoding": "4.3.0", - "System.Text.Encodings.Web": "4.7.2", - "System.Text.Json": "4.7.2" - } - }, - "Microsoft.IdentityModel.Logging": { - "type": "Transitive", - "resolved": "6.35.0", - "contentHash": "jePrSfGAmqT81JDCNSY+fxVWoGuJKt9e6eJ+vT7+quVS55nWl//jGjUQn4eFtVKt4rt5dXaleZdHRB9J9AJZ7Q==", - "dependencies": { - "Microsoft.IdentityModel.Abstractions": "6.35.0" - } - }, - "Microsoft.IdentityModel.Protocols": { - "type": "Transitive", - "resolved": "6.35.0", - "contentHash": "BPQhlDzdFvv1PzaUxNSk+VEPwezlDEVADIKmyxubw7IiELK18uJ06RQ9QKKkds30XI+gDu9n8j24XQ8w7fjWcg==", - "dependencies": { - "Microsoft.IdentityModel.Logging": "6.35.0", - "Microsoft.IdentityModel.Tokens": "6.35.0" - } - }, - "Microsoft.IdentityModel.Protocols.OpenIdConnect": { - "type": "Transitive", - "resolved": "6.35.0", - "contentHash": "LMtVqnECCCdSmyFoCOxIE5tXQqkOLrvGrL7OxHg41DIm1bpWtaCdGyVcTAfOQpJXvzND9zUKIN/lhngPkYR8vg==", - "dependencies": { - "Microsoft.IdentityModel.Protocols": "6.35.0", - "System.IdentityModel.Tokens.Jwt": "6.35.0", - "System.Text.Encoding": "4.3.0", - "System.Text.Encodings.Web": "4.7.2", - "System.Text.Json": "4.7.2" - } - }, - "Microsoft.IdentityModel.Tokens": { - "type": "Transitive", - "resolved": "6.35.0", - "contentHash": "RN7lvp7s3Boucg1NaNAbqDbxtlLj5Qeb+4uSS1TeK5FSBVM40P4DKaTKChT43sHyKfh7V0zkrMph6DdHvyA4bg==", - "dependencies": { - "Microsoft.CSharp": "4.5.0", - "Microsoft.IdentityModel.Logging": "6.35.0", - "System.Security.Cryptography.Cng": "4.5.0", - "System.Text.Encoding": "4.3.0", - "System.Text.Encodings.Web": "4.7.2", - "System.Text.Json": "4.7.2" - } - }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, - "Microsoft.Rest.ClientRuntime": { - "type": "Transitive", - "resolved": "2.3.24", - "contentHash": "hZH7XgM3eV2jFrnq7Yf0nBD4WVXQzDrer2gEY7HMNiwio2hwDsTHO6LWuueNQAfRpNp4W7mKxcXpwXUiuVIlYw==", - "dependencies": { - "Newtonsoft.Json": "10.0.3" - } - }, - "Microsoft.SourceLink.Common": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" - }, - "Microsoft.SqlServer.Server": { - "type": "Transitive", - "resolved": "1.0.0", - "contentHash": "N4KeF3cpcm1PUHym1RmakkzfkEv3GRMyofVv40uXsQhCQeglr2OHNcUk2WOG51AKpGO8ynGpo9M/kFXSzghwug==" - }, - "Microsoft.Win32.Registry": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.4", - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "Newtonsoft.Json": { - "type": "Transitive", - "resolved": "13.0.1", - "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" - }, - "System.Buffers": { - "type": "Transitive", - "resolved": "4.5.1", - "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" - }, - "System.Configuration.ConfigurationManager": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "jXw9MlUu/kRfEU0WyTptAVueupqIeE3/rl0EZDMlf8pcvJnitQ8HeVEp69rZdaStXwTV72boi/Bhw8lOeO+U2w==", - "dependencies": { - "System.Security.Cryptography.ProtectedData": "6.0.0", - "System.Security.Permissions": "6.0.0" - } - }, - "System.Diagnostics.DiagnosticSource": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "9W0ewWDuAyDqS2PigdTxk6jDKonfgscY/hP8hm7VpxYhNHZHKvZTdRckberlFk3VnCmr3xBUyMBut12Q+T2aOw==", - "dependencies": { - "System.Memory": "4.5.5", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "System.IdentityModel.Tokens.Jwt": { - "type": "Transitive", - "resolved": "6.35.0", - "contentHash": "yxGIQd3BFK7F6S62/7RdZk3C/mfwyVxvh6ngd1VYMBmbJ1YZZA9+Ku6suylVtso0FjI0wbElpJ0d27CdsyLpBQ==", - "dependencies": { - "Microsoft.IdentityModel.JsonWebTokens": "6.35.0", - "Microsoft.IdentityModel.Tokens": "6.35.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.FileSystem.AccessControl": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "SxHB3nuNrpptVk+vZ/F+7OHEpoHUIKKMl02bUmYHQr1r+glbZQxs7pRtsf4ENO29TVm2TH3AEeep2fJcy92oYw==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.4", - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.Memory": { - "type": "Transitive", - "resolved": "4.5.5", - "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Numerics.Vectors": "4.4.0", - "System.Runtime.CompilerServices.Unsafe": "4.5.3" - } - }, - "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.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "System.Runtime.Caching": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "E0e03kUp5X2k+UAoVl6efmI7uU7JRBWi5EIdlQ7cr0NpBGjHG4fWII35PgsBY9T4fJQ8E4QPsL0rKksU9gcL5A==", - "dependencies": { - "System.Configuration.ConfigurationManager": "6.0.0" - } - }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" - }, - "System.Runtime.Loader": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "DHMaRn8D8YCK2GG2pw+UzNxn/OHVfaWx7OTLBD/hPegHZZgcZh3H6seWegrC4BYwsfuGrywIuT+MQs+rPqRLTQ==", - "dependencies": { - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Security.AccessControl": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "AUADIc0LIEQe7MzC+I0cl0rAT8RrTAKFHl53yHjEUzNVIaUlhFY11vc2ebiVJzVBuOzun6F7FBA+8KAbGTTedQ==", - "dependencies": { - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.Security.Cryptography.Cng": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "jIMXsKn94T9JY7PvPq/tMfqa6GAaHpElRDpmG+SuL+D3+sTw2M8VhnibKnN8Tq+4JqbPJ/f+BwtLeDMEnzAvRg==" - }, - "System.Security.Cryptography.ProtectedData": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "rp1gMNEZpvx9vP0JW0oHLxlf8oSiQgtno77Y4PLUBjSiDYoD77Y8uXHr1Ea5XG4/pIKhqAdxZ8v8OTUtqo9PeQ==", - "dependencies": { - "System.Memory": "4.5.4" - } - }, - "System.Security.Permissions": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "T/uuc7AklkDoxmcJ7LGkyX1CcSviZuLCa4jg3PekfJ7SU0niF0IVTXwUiNVP9DSpzou2PpxJ+eNY2IfDM90ZCg==", - "dependencies": { - "System.Security.AccessControl": "6.0.0" - } - }, - "System.Security.Principal.Windows": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" - }, - "System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Text.Encoding.CodePages": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "ZFCILZuOvtKPauZ/j/swhvw68ZRi9ATCfvGbk1QfydmcXBkIWecWKn/250UH7rahZ5OoDBaiAudJtPvLwzw85A==", - "dependencies": { - "System.Memory": "4.5.4", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "OP6umVGxc0Z0MvZQBVigj4/U31Pw72ITihDWP9WiWDm+q5aoe0GaJivsfYGq53o6dxH7DcXWiCTl7+0o2CGdmg==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.5", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "System.Text.Json": { - "type": "Transitive", - "resolved": "7.0.3", - "contentHash": "AyjhwXN1zTFeIibHimfJn6eAsZ7rTBib79JQpzg8WAuR/HKDu9JGNHTuu3nbbXQ/bgI+U4z6HtZmCHNXB1QXrQ==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "System.Buffers": "4.5.1", - "System.Memory": "4.5.5", - "System.Numerics.Vectors": "4.5.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "7.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "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==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "4.5.3" - } - } - }, "net8.0": { "Microsoft.Data.SqlClient": { "type": "Direct", From 30b128417adfe6f4e676ff8a8e32c894b3fa1dcc Mon Sep 17 00:00:00 2001 From: John Peters Date: Wed, 10 Apr 2024 10:39:49 -0400 Subject: [PATCH 02/34] Updated Code to match .Net8 syntactic sugar --- .../Dataverse/DataverseDataSource.cs | 2 +- .../Dataverse/DataverseDataSourceFactory.cs | 9 ++----- .../Dataverse/DataverseFetchXmlPagedQuery.cs | 12 +++------ .../ContactInvalidDependencyTestStep.cs | 4 +-- .../SampleSQLStep.cs | 10 +++----- .../DataSources/Sql/DynamicSqlPagedQuery.cs | 17 ++++--------- .../DataSources/Sql/SqlDataSource.cs | 14 +++-------- .../DataSources/Sql/SqlPagedQuery.cs | 20 +++++---------- .../BatchProcessing/BatchIntegrationStep.cs | 2 +- .../BatchProcessing/BatchProcessor.cs | 14 +++-------- .../DataSources/MemoryDataSource.cs | 4 +-- .../DataSources/MemoryPagedQuery.cs | 9 ++----- .../DependencyInjection/StepRegistration.cs | 2 +- .../StepRegistrationDependencyList.cs | 8 ------ .../Extensions/IEnumerableExtensions.cs | 25 ------------------- src/Root16.Sprout/IntegrationRuntime.cs | 10 ++++---- .../ServiceCollectionExtensions.cs | 2 +- 17 files changed, 40 insertions(+), 124 deletions(-) delete mode 100644 src/Root16.Sprout/DependencyInjection/StepRegistrationDependencyList.cs diff --git a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSource.cs b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSource.cs index b511f48..7dbef0c 100644 --- a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSource.cs +++ b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSource.cs @@ -125,7 +125,7 @@ public async Task>> ExecuteMultipleAsy { List ListofRequestCollections = []; - foreach (var request in requestCollection.ChunkBy(1000)) + foreach (var request in requestCollection.Chunk(1000)) { var orgRequestCollection = new OrganizationRequestCollection(); orgRequestCollection.AddRange(request); diff --git a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSourceFactory.cs b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSourceFactory.cs index bd140d4..513d0d8 100644 --- a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSourceFactory.cs +++ b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSourceFactory.cs @@ -6,14 +6,9 @@ namespace Root16.Sprout.DependencyInjection; -public class DataverseDataSourceFactory : IDataverseDataSourceFactory +public class DataverseDataSourceFactory(IServiceProvider serviceProvider) : IDataverseDataSourceFactory { - private readonly IServiceProvider serviceProvider; - - public DataverseDataSourceFactory(IServiceProvider serviceProvider) - { - this.serviceProvider = serviceProvider; - } + private readonly IServiceProvider serviceProvider = serviceProvider; public DataverseDataSource CreateDataSource(string connectionStringName) { diff --git a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseFetchXmlPagedQuery.cs b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseFetchXmlPagedQuery.cs index 2d0766a..d693c78 100644 --- a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseFetchXmlPagedQuery.cs +++ b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseFetchXmlPagedQuery.cs @@ -6,16 +6,10 @@ namespace Root16.Sprout.DataSources.Dataverse; -public class DataverseFetchXmlPagedQuery : IPagedQuery +public class DataverseFetchXmlPagedQuery(DataverseDataSource dataSource, string fetchXml) : IPagedQuery { - private readonly DataverseDataSource dataSource; - private readonly string fetchXml; - - public DataverseFetchXmlPagedQuery(DataverseDataSource dataSource, string fetchXml) - { - this.dataSource = dataSource; - this.fetchXml = fetchXml; - } + private readonly DataverseDataSource dataSource = dataSource; + private readonly string fetchXml = fetchXml; private static string AddPaging(string fetchXml, int page, int pageSize, string? pagingCookie) { diff --git a/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/ContactInvalidDependencyTestStep.cs b/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/ContactInvalidDependencyTestStep.cs index 4d88e3e..ae39946 100644 --- a/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/ContactInvalidDependencyTestStep.cs +++ b/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/ContactInvalidDependencyTestStep.cs @@ -12,7 +12,7 @@ internal class ContactInvalidDependencyTestStep : BatchIntegrationStep memoryDS; + private readonly MemoryDataSource memoryDS; public ContactInvalidDependencyTestStep(MemoryDataSource memoryDS, DataverseDataSource dataverseDataSource, EntityOperationReducer reducer, BatchProcessor batchProcessor) { @@ -82,7 +82,7 @@ public override IReadOnlyList> MapRecord(Contact source) } }; - return new[] { new DataOperation("Create", result) }; + return [new DataOperation("Create", result)]; } } diff --git a/src/Root16.Sprout.Sample.SqlServer/SampleSQLStep.cs b/src/Root16.Sprout.Sample.SqlServer/SampleSQLStep.cs index e716a9b..b036368 100644 --- a/src/Root16.Sprout.Sample.SqlServer/SampleSQLStep.cs +++ b/src/Root16.Sprout.Sample.SqlServer/SampleSQLStep.cs @@ -9,16 +9,12 @@ namespace Root16.Sprout.Sample.SqlServer { public class SampleSQLStep : BatchIntegrationStep { - private readonly DataverseDataSource? _targetDataverseDataSource; - private readonly EntityOperationReducer _reducer; private readonly SqlDataSource _sqlDataSource; private readonly BatchProcessor _batchProcessor; - public SampleSQLStep(IDataverseDataSourceFactory factory, BatchProcessor batchProcessor, EntityOperationReducer reducer, SqlDataSource sqlDataSource) + public SampleSQLStep(BatchProcessor batchProcessor, SqlDataSource sqlDataSource) { - _targetDataverseDataSource = null; _batchProcessor = batchProcessor; - _reducer = reducer; _sqlDataSource = sqlDataSource; BatchSize = 50; } @@ -33,7 +29,7 @@ public override IPagedQuery GetInputQuery() public override IReadOnlyList> MapRecord(DataRow source) { - List> operations = new(); + List> operations = []; for (int i = 0; i < 25; i++) { @@ -42,7 +38,7 @@ public override IReadOnlyList> MapRecord(DataRow sourc CommandText = "INSERT INTO [dbo].[Persons] ([PersonID],[LastName],[FirstName],[Address],[City]) VALUES (@PersonId,@LastName,@FirstName,@Address,@City)", CommandType = CommandType.Text }; - command.Parameters.Add(new SqlParameter("@PersonId", "ItsATest")); + command.Parameters.Add(new SqlParameter("@PersonId", 5)); command.Parameters.Add(new SqlParameter("@LastName", "Tester")); command.Parameters.Add(new SqlParameter("@FirstName", "Tester")); command.Parameters.Add(new SqlParameter("@Address", "Tester")); diff --git a/src/Root16.Sprout.SqlServer/DataSources/Sql/DynamicSqlPagedQuery.cs b/src/Root16.Sprout.SqlServer/DataSources/Sql/DynamicSqlPagedQuery.cs index fa15e2c..7314730 100644 --- a/src/Root16.Sprout.SqlServer/DataSources/Sql/DynamicSqlPagedQuery.cs +++ b/src/Root16.Sprout.SqlServer/DataSources/Sql/DynamicSqlPagedQuery.cs @@ -3,18 +3,11 @@ namespace Root16.Sprout.DataSources.Dataverse; -public class DynamicSqlPagedQuery : IPagedQuery +public class DynamicSqlPagedQuery(SqlConnection connection, Func commandGenerator, string? totalRowCountCommandText = null) : IPagedQuery { - private readonly SqlConnection connection; - private readonly Func commandGenerator; - private readonly string? totalRowCountCommandText; - - public DynamicSqlPagedQuery(SqlConnection connection, Func commandGenerator, string? totalRowCountCommandText = null) - { - this.connection = connection; - this.commandGenerator = commandGenerator; - this.totalRowCountCommandText = totalRowCountCommandText; - } + private readonly SqlConnection connection = connection; + private readonly Func commandGenerator = commandGenerator; + private readonly string? totalRowCountCommandText = totalRowCountCommandText; public async Task> GetNextPageAsync(int pageNumber, int pageSize, object? bookmark) { @@ -24,7 +17,7 @@ public async Task> GetNextPageAsync(int pageNumber, in var reader = await command.ExecuteReaderAsync(CommandBehavior.CloseConnection); try { - DataTable table = new DataTable(); + DataTable table = new(); table.Load(reader); var rows = new List(table.Rows.Cast()); diff --git a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs index 5be7782..ffe4f7b 100644 --- a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs +++ b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs @@ -5,18 +5,10 @@ namespace Root16.Sprout.DataSources.Dataverse; -public class SqlDataSource : IDataSource, IDataSource +public class SqlDataSource(string connectionString, ILogger logger) : IDataSource, IDataSource { - private readonly string connectionString; - private readonly ILogger logger; - private readonly SqlConnection connection; - - public SqlDataSource(string connectionString, ILogger logger) - { - this.connectionString = connectionString; - this.logger = logger; - connection = new SqlConnection(connectionString); - } + private readonly ILogger logger = logger; + private readonly SqlConnection connection = new(connectionString); public SqlPagedQuery CreatePagedQuery(string commandText, string? totalRowCountCommandText = null, bool addPaging = true) { diff --git a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs index b5f5ffe..2768ae7 100644 --- a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs +++ b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs @@ -3,20 +3,12 @@ namespace Root16.Sprout.DataSources.Dataverse; -public class SqlPagedQuery : IPagedQuery +public class SqlPagedQuery(SqlConnection connection, string commandText, string? totalRowCountCommandText = null, bool addPaging = true) : IPagedQuery { - private readonly SqlConnection connection; - private readonly string commandText; - private readonly string? totalRowCountCommandText; - private readonly bool addPaging; - - public SqlPagedQuery(SqlConnection connection, string commandText, string? totalRowCountCommandText = null, bool addPaging = true) - { - this.connection = connection; - this.commandText = commandText; - this.totalRowCountCommandText = totalRowCountCommandText; - this.addPaging = addPaging; - } + private readonly SqlConnection connection = connection; + private readonly string commandText = commandText; + private readonly string? totalRowCountCommandText = totalRowCountCommandText; + private readonly bool addPaging = addPaging; public async Task> GetNextPageAsync(int pageNumber, int pageSize, object? bookmark) { @@ -37,7 +29,7 @@ public async Task> GetNextPageAsync(int pageNumber, in var reader = await command.ExecuteReaderAsync(CommandBehavior.CloseConnection); try { - DataTable table = new DataTable(); + DataTable table = new(); table.Load(reader); var rows = new List(table.Rows.Cast()); diff --git a/src/Root16.Sprout/BatchProcessing/BatchIntegrationStep.cs b/src/Root16.Sprout/BatchProcessing/BatchIntegrationStep.cs index 14d3214..7b44523 100644 --- a/src/Root16.Sprout/BatchProcessing/BatchIntegrationStep.cs +++ b/src/Root16.Sprout/BatchProcessing/BatchIntegrationStep.cs @@ -12,7 +12,7 @@ protected BatchIntegrationStep() public bool DryRun { get; set; } public int BatchSize { get; set; } - private HashSet dataOperationFlags = new(StringComparer.OrdinalIgnoreCase); + private readonly HashSet dataOperationFlags = new(StringComparer.OrdinalIgnoreCase); public IEnumerable DataOperationFlags { get { return dataOperationFlags; } } diff --git a/src/Root16.Sprout/BatchProcessing/BatchProcessor.cs b/src/Root16.Sprout/BatchProcessing/BatchProcessor.cs index ee4cf42..ab4312a 100644 --- a/src/Root16.Sprout/BatchProcessing/BatchProcessor.cs +++ b/src/Root16.Sprout/BatchProcessing/BatchProcessor.cs @@ -3,14 +3,9 @@ namespace Root16.Sprout.BatchProcessing; -public class BatchProcessor +public class BatchProcessor(IProgressListener progressListener) { - public BatchProcessor(IProgressListener progressListener) - { - this.progressListener = progressListener; - } - - private readonly IProgressListener progressListener; + private readonly IProgressListener progressListener = progressListener; public async Task ProcessAllBatchesAsync( IBatchIntegrationStep step) @@ -40,10 +35,7 @@ public async Task> ProcessBatchAsync( queryState = new(0, step.BatchSize, 0, total, true, null); } - if (progress is null) - { - progress = new IntegrationProgress(step.GetType().Name, queryState.TotalRecordCount); - } + progress ??= new IntegrationProgress(step.GetType().Name, queryState.TotalRecordCount); // get batch of data (IPagedQuery) var result = await query.GetNextPageAsync(queryState.NextPageNumber, queryState.RecordsPerPage, queryState.Bookmark); diff --git a/src/Root16.Sprout/DataSources/MemoryDataSource.cs b/src/Root16.Sprout/DataSources/MemoryDataSource.cs index a0b1041..d9e6ffa 100644 --- a/src/Root16.Sprout/DataSources/MemoryDataSource.cs +++ b/src/Root16.Sprout/DataSources/MemoryDataSource.cs @@ -10,12 +10,12 @@ public MemoryDataSource(IEnumerable records) } public MemoryDataSource() { - Records = new List(); + Records = []; } public IPagedQuery CreatePagedQuery() { - return new MemoryPagedQuery(Records.ToArray()); + return new MemoryPagedQuery([.. Records]); } public Task>> PerformOperationsAsync(IEnumerable> operations, bool dryRun, IEnumerable dataOperationFlags) diff --git a/src/Root16.Sprout/DataSources/MemoryPagedQuery.cs b/src/Root16.Sprout/DataSources/MemoryPagedQuery.cs index 7c8acf1..3452f38 100644 --- a/src/Root16.Sprout/DataSources/MemoryPagedQuery.cs +++ b/src/Root16.Sprout/DataSources/MemoryPagedQuery.cs @@ -1,14 +1,9 @@  namespace Root16.Sprout.DataSources; -public class MemoryPagedQuery : IPagedQuery +public class MemoryPagedQuery(IEnumerable data) : IPagedQuery { - private readonly List data; - - public MemoryPagedQuery(IEnumerable data) - { - this.data = data.ToList(); - } + private readonly List data = data.ToList(); public Task> GetNextPageAsync(int pageNumber, int pageSize, object? bookmark) { diff --git a/src/Root16.Sprout/DependencyInjection/StepRegistration.cs b/src/Root16.Sprout/DependencyInjection/StepRegistration.cs index d9fc9a6..ebc8d3c 100644 --- a/src/Root16.Sprout/DependencyInjection/StepRegistration.cs +++ b/src/Root16.Sprout/DependencyInjection/StepRegistration.cs @@ -4,7 +4,7 @@ public class StepRegistration { public Type StepType { get; } public string Name { get; } - public List PrerequisteSteps { get; } = new List(); + public List PrerequisteSteps { get; } = []; internal HashSet DependentSteps { get; set; } = new HashSet(StringComparer.OrdinalIgnoreCase); public StepRegistration(Type stepType, List? prerequisteSteps = null) { diff --git a/src/Root16.Sprout/DependencyInjection/StepRegistrationDependencyList.cs b/src/Root16.Sprout/DependencyInjection/StepRegistrationDependencyList.cs deleted file mode 100644 index 7df9fd8..0000000 --- a/src/Root16.Sprout/DependencyInjection/StepRegistrationDependencyList.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Root16.Sprout.DependencyInjection; - -public class StepRegistrationDependencyList : List -{ - public StepRegistrationDependencyList(params Type[] steps) : base(steps) - { - } -} diff --git a/src/Root16.Sprout/Extensions/IEnumerableExtensions.cs b/src/Root16.Sprout/Extensions/IEnumerableExtensions.cs index 82431ad..ebfe742 100644 --- a/src/Root16.Sprout/Extensions/IEnumerableExtensions.cs +++ b/src/Root16.Sprout/Extensions/IEnumerableExtensions.cs @@ -13,29 +13,4 @@ public async static Task> ToListAsync(this IAsyncEnumerable values } return returnedValues; } - - public static List> ChunkBy(this List source, int chunkSize) - { - return source - .Select((x, i) => new { Index = i, Value = x }) - .GroupBy(x => x.Index / chunkSize) - .Select(x => x.Select(v => v.Value).ToList()) - .ToList(); - } - - public static List> ChunkBy(this OrganizationRequestCollection source, int chunkSize) - { - if(source is null) - { - return []; - } - - IEnumerable? sourceAsEnum = source as IEnumerable; - - return sourceAsEnum - .Select((x, i) => new { Index = i, Value = x }) - .GroupBy(x => x.Index / chunkSize) - .Select(x => x.Select(v => v.Value).ToList()) - .ToList(); - } } diff --git a/src/Root16.Sprout/IntegrationRuntime.cs b/src/Root16.Sprout/IntegrationRuntime.cs index 6183f9c..df40844 100644 --- a/src/Root16.Sprout/IntegrationRuntime.cs +++ b/src/Root16.Sprout/IntegrationRuntime.cs @@ -55,7 +55,7 @@ public async Task RunAllStepsAsync(int maxDegreesOfParallelism = 1, Action(); var runningSteps = new List>(); - while (queuedSteps.Any() || runningSteps.Any() || waitingSteps.Any()) + while (queuedSteps.Count != 0 || runningSteps.Count != 0 || waitingSteps.Count != 0) { queuedSteps.AddRange(waitingSteps.Where(s => s.StepRegistration.PrerequisteSteps.TrueForAll(preReq => completedStepNames.Contains(preReq)))); waitingSteps = waitingSteps.Except(queuedSteps).ToList(); @@ -99,7 +99,7 @@ private void CheckStepDependencyTree() { var stepsThatWontRun = CheckForStepsThatWillNotRun(); - if (stepsThatWontRun.Any()) + if (stepsThatWontRun.Count != 0) { throw new InvalidDataException($"Unreachable steps found: {string.Join(", ", stepsThatWontRun)}"); } @@ -116,9 +116,9 @@ .. stepRegistrations.Where(x => x.PrerequisteSteps.Intersect(x.DependentSteps).A return [.. stepsThatWontRun]; } - private IEnumerable GetAllStepsThatWontRun(List stepsThatWontRun) + private List GetAllStepsThatWontRun(List stepsThatWontRun) { - if (!stepsThatWontRun.Any()) + if (stepsThatWontRun.Count == 0) { return []; } @@ -130,7 +130,7 @@ private IEnumerable GetAllStepsThatWontRun(List stepsThatWontRun .ToList(); steps.AddRange(newStepsThatWontRun); - steps.AddRange(GetAllStepsThatWontRun(steps).ToList()); + steps.AddRange([.. GetAllStepsThatWontRun(steps)]); return steps; } } diff --git a/src/Root16.Sprout/ServiceCollectionExtensions.cs b/src/Root16.Sprout/ServiceCollectionExtensions.cs index c2c7a43..dd98961 100644 --- a/src/Root16.Sprout/ServiceCollectionExtensions.cs +++ b/src/Root16.Sprout/ServiceCollectionExtensions.cs @@ -10,7 +10,7 @@ public static class ServiceCollectionExtensions { public static IServiceCollection RegisterStep(this IServiceCollection services, params string[] prerequisiteStepNames) where TStep : class, IIntegrationStep { - services.AddSingleton(new StepRegistration(typeof(TStep), prerequisiteStepNames.ToList())); + services.AddSingleton(new StepRegistration(typeof(TStep), [.. prerequisiteStepNames])); services.AddTransient(); return services; From d63959015fa2b3ebd532b533d9de2edca080c515 Mon Sep 17 00:00:00 2001 From: John Peters Date: Thu, 11 Apr 2024 09:51:06 -0400 Subject: [PATCH 03/34] Updating compatibility to work with .Net6, 7, and 8. --- .../Root16.Sprout.Dataverse.csproj | 2 +- .../packages.lock.json | 2298 ++++++++++++++++ .../Root16.Sprout.SqlServer.csproj | 2 +- .../packages.lock.json | 2298 ++++++++++++++++ src/Root16.Sprout/Root16.Sprout.csproj | 2 +- src/Root16.Sprout/packages.lock.json | 2326 +++++++++++++++++ 6 files changed, 6925 insertions(+), 3 deletions(-) diff --git a/src/Root16.Sprout.Dataverse/Root16.Sprout.Dataverse.csproj b/src/Root16.Sprout.Dataverse/Root16.Sprout.Dataverse.csproj index 430da5c..530af45 100644 --- a/src/Root16.Sprout.Dataverse/Root16.Sprout.Dataverse.csproj +++ b/src/Root16.Sprout.Dataverse/Root16.Sprout.Dataverse.csproj @@ -1,7 +1,7 @@  - net8.0 + net8.0;net7.0;net6.0 enable enable https://github.com/Root16/sprout diff --git a/src/Root16.Sprout.Dataverse/packages.lock.json b/src/Root16.Sprout.Dataverse/packages.lock.json index 73c000a..64ce1cf 100644 --- a/src/Root16.Sprout.Dataverse/packages.lock.json +++ b/src/Root16.Sprout.Dataverse/packages.lock.json @@ -1,6 +1,2304 @@ { "version": 1, "dependencies": { + "net6.0": { + "Microsoft.PowerPlatform.Dataverse.Client": { + "type": "Direct", + "requested": "[1.1.17, )", + "resolved": "1.1.17", + "contentHash": "gSgD7N52EATY0PkNIbBtqZeG0FDGK11X1x8nBnPclfykw73bvqyfortjNIwAGcj0esMqk8DSieuRCVi47hg9qQ==", + "dependencies": { + "Microsoft.Extensions.Caching.Memory": "3.1.8", + "Microsoft.Extensions.DependencyInjection": "3.1.8", + "Microsoft.Extensions.Http": "3.1.8", + "Microsoft.Extensions.Logging": "3.1.8", + "Microsoft.Identity.Client": "4.56.0", + "Microsoft.Identity.Client.Extensions.Msal": "4.56.0", + "Microsoft.Rest.ClientRuntime": "2.3.24", + "Microsoft.VisualBasic": "10.3.0", + "Newtonsoft.Json": "13.0.1", + "System.Collections": "4.3.0", + "System.Configuration.ConfigurationManager": "4.7.0", + "System.Drawing.Common": "5.0.3", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Private.DataContractSerialization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.TypeExtensions": "4.7.0", + "System.Runtime.Caching": "4.7.0", + "System.Runtime.Serialization.Primitives": "4.3.0", + "System.Runtime.Serialization.Xml": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.1", + "System.Security.Cryptography.ProtectedData": "4.7.0", + "System.Security.Permissions": "5.0.0", + "System.ServiceModel.Http": "4.10.2", + "System.Text.Json": "7.0.3" + } + }, + "Azure.Core": { + "type": "Transitive", + "resolved": "1.35.0", + "contentHash": "hENcx03Jyuqv05F4RBEPbxz29UrM3Nbhnr6Wl6NQpoU9BCIbL3XLentrxDCTrH54NLS11Exxi/o8MYgT/cnKFA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "1.1.1", + "System.Diagnostics.DiagnosticSource": "6.0.1", + "System.Memory.Data": "1.0.2", + "System.Numerics.Vectors": "4.5.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "Azure.Identity": { + "type": "Transitive", + "resolved": "1.10.3", + "contentHash": "l1Xm2MWOF2Mzcwuarlw8kWQXLZk3UeB55aQXVyjj23aBfDwOZ3gu5GP2kJ6KlmZeZv2TCzw7x4L3V36iNr3gww==", + "dependencies": { + "Azure.Core": "1.35.0", + "Microsoft.Identity.Client": "4.56.0", + "Microsoft.Identity.Client.Extensions.Msal": "4.56.0", + "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" + } + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ==" + }, + "Microsoft.Data.SqlClient": { + "type": "Transitive", + "resolved": "5.2.0", + "contentHash": "3alfyqRN3ELRtdvU1dGtLBRNQqprr3TJ0WrUJfMISPwg1nPUN2P3Lelah68IKWuV27Ceb7ig95hWNHFTSXfxMg==", + "dependencies": { + "Azure.Identity": "1.10.3", + "Microsoft.Data.SqlClient.SNI.runtime": "5.2.0", + "Microsoft.Identity.Client": "4.56.0", + "Microsoft.IdentityModel.JsonWebTokens": "6.35.0", + "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.35.0", + "Microsoft.SqlServer.Server": "1.0.0", + "System.Configuration.ConfigurationManager": "6.0.1", + "System.Runtime.Caching": "6.0.0" + } + }, + "Microsoft.Data.SqlClient.SNI.runtime": { + "type": "Transitive", + "resolved": "5.2.0", + "contentHash": "po1jhvFd+8pbfvJR/puh+fkHi0GRanAdvayh/0e47yaM6CXWZ6opUjCMFuYlAnD2LcbyvQE7fPJKvogmaUcN+w==" + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Transitive", + "resolved": "3.1.8", + "contentHash": "iBIdKjKa2nR4LdknV2JMSRpJVM5TOca25EckPm6SZQT6HfH8RoHrn9m14GUAkvzE+uOziXRoAwr8YIC6ZOpyXg==", + "dependencies": { + "Microsoft.Extensions.Primitives": "3.1.8" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "3.1.8", + "contentHash": "u04q7+tgc8l6pQ5HOcr6scgapkQQHnrhpGoCaaAZd24R36/NxGsGxuhSmhHOrQx9CsBLe2CVBN/4CkLlxtnnXw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "3.1.8", + "Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.8", + "Microsoft.Extensions.Logging.Abstractions": "3.1.8", + "Microsoft.Extensions.Options": "3.1.8" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "tldQUBWt/xeH2K7/hMPPo5g8zuLc3Ro9I5d4o/XrxvxOCA2EZBtW7bCHHTc49fcBtvB8tLAb/Qsmfrq+2SJ4vA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "f34u2eaqIjNO9YLHBz8rozVZ+TcFiFs0F3r7nUJd7FRkVSxk8u4OpoK226mi49MwexHOR2ibP9MFvRUaLilcQQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "tgU4u7bZsoS9MKVRiotVMAwHtbREHr5/5zSEV+JPhg46+ox47Au84E3D2IacAaB0bk5ePNaNieTlPrfjbbRJkg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==" + }, + "Microsoft.Extensions.Http": { + "type": "Transitive", + "resolved": "3.1.8", + "contentHash": "GRkzBs2wJG6jTGqRrT8l/Sqk4MiO0yQltiekDNw/X7L2l5/gKSud/6Vcjb9b5SPtgn6lxcn8qCmfDtk2kP/cOw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.8", + "Microsoft.Extensions.Logging": "3.1.8", + "Microsoft.Extensions.Options": "3.1.8" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "Nw2muoNrOG5U5qa2ZekXwudUn2BJcD41e65zwmDHb1fQegTX66UokLWZkJRpqSSHXDOWZ5V0iqhbxOEky91atA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "7.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "kmn78+LPVMOWeITUjIlfxUPDsI0R6G0RkeAMBmQxAJ7vBJn4q2dTva7pWi65ceN5vPGjJ9q/Uae2WKgvfktJAw==" + }, + "Microsoft.Extensions.Logging.Configuration": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "FLDA0HcffKA8ycoDQLJuCNGIE42cLWPxgdQGRBaSzZrYTkMBjnf9zrr8pGT06psLq9Q+RKWmmZczQ9bCrXEBcA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "7.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", + "Microsoft.Extensions.Configuration.Binder": "7.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "7.0.0" + } + }, + "Microsoft.Extensions.Logging.Console": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "qt5n8bHLZPUfuRnFxJKW5q9ZwOTncdh96rtWzWpX3Y/064MlxzCSw2ELF5Jlwdo+Y4wK3I47NmUTFsV7Sg8rqg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging.Configuration": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Json": "7.0.0" + } + }, + "Microsoft.Extensions.ObjectPool": { + "type": "Transitive", + "resolved": "5.0.10", + "contentHash": "pp9tbGqIhdEXL6Q1yJl+zevAJSq4BsxqhS1GXzBvEsEz9DDNu9GLNzgUy2xyFc4YjB4m4Ff2YEWTnvQvVYdkvQ==" + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "lP1yBnTTU42cKpMozuafbvNtQ7QcBjr/CcK3bYOGEMH55Fjt+iecXjT6chR7vbgCMqy3PG3aNQSZgo/EuY/9qQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "95UnxZkkFdXxF6vSrtJsMHCzkDeSMuUWGs2hDT54cX+U5eVajrCJ3qLyQRW+CtpTt5OJ8bmTvpQVHu1DLhH+cA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", + "Microsoft.Extensions.Configuration.Binder": "7.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0", + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "um1KU5kxcRp3CNuI8o/GrZtD4AIOXDk+RLsytjZ9QPok3ttLUelLKpilVPuaFT3TFjOhSibUAso0odbOaCDj3Q==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.Identity.Client": { + "type": "Transitive", + "resolved": "4.56.0", + "contentHash": "rr4zbidvHy9r4NvOAs5hdd964Ao2A0pAeFBJKR95u1CJAVzbd1p6tPTXUZ+5ld0cfThiVSGvz6UHwY6JjraTpA==", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "6.22.0" + } + }, + "Microsoft.Identity.Client.Extensions.Msal": { + "type": "Transitive", + "resolved": "4.56.0", + "contentHash": "H12YAzEGK55vZ+QpxUzozhW8ZZtgPDuWvgA0JbdIR9UhMUplj29JhIgE2imuH8W2Nw9D8JKygR1uxRFtpSNcrg==", + "dependencies": { + "Microsoft.Identity.Client": "4.56.0", + "System.IO.FileSystem.AccessControl": "5.0.0", + "System.Security.Cryptography.ProtectedData": "4.5.0" + } + }, + "Microsoft.IdentityModel.Abstractions": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "xuR8E4Rd96M41CnUSCiOJ2DBh+z+zQSmyrYHdYhD6K4fXBcQGVnRCFQ0efROUYpP+p0zC1BLKr0JRpVuujTZSg==" + }, + "Microsoft.IdentityModel.JsonWebTokens": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "9wxai3hKgZUb4/NjdRKfQd0QJvtXKDlvmGMYACbEC8DFaicMFCFhQFZq9ZET1kJLwZahf2lfY5Gtcpsx8zYzbg==", + "dependencies": { + "Microsoft.IdentityModel.Tokens": "6.35.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2" + } + }, + "Microsoft.IdentityModel.Logging": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "jePrSfGAmqT81JDCNSY+fxVWoGuJKt9e6eJ+vT7+quVS55nWl//jGjUQn4eFtVKt4rt5dXaleZdHRB9J9AJZ7Q==", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "6.35.0" + } + }, + "Microsoft.IdentityModel.Protocols": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "BPQhlDzdFvv1PzaUxNSk+VEPwezlDEVADIKmyxubw7IiELK18uJ06RQ9QKKkds30XI+gDu9n8j24XQ8w7fjWcg==", + "dependencies": { + "Microsoft.IdentityModel.Logging": "6.35.0", + "Microsoft.IdentityModel.Tokens": "6.35.0" + } + }, + "Microsoft.IdentityModel.Protocols.OpenIdConnect": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "LMtVqnECCCdSmyFoCOxIE5tXQqkOLrvGrL7OxHg41DIm1bpWtaCdGyVcTAfOQpJXvzND9zUKIN/lhngPkYR8vg==", + "dependencies": { + "Microsoft.IdentityModel.Protocols": "6.35.0", + "System.IdentityModel.Tokens.Jwt": "6.35.0" + } + }, + "Microsoft.IdentityModel.Tokens": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "RN7lvp7s3Boucg1NaNAbqDbxtlLj5Qeb+4uSS1TeK5FSBVM40P4DKaTKChT43sHyKfh7V0zkrMph6DdHvyA4bg==", + "dependencies": { + "Microsoft.CSharp": "4.5.0", + "Microsoft.IdentityModel.Logging": "6.35.0", + "System.Security.Cryptography.Cng": "4.5.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.Rest.ClientRuntime": { + "type": "Transitive", + "resolved": "2.3.24", + "contentHash": "hZH7XgM3eV2jFrnq7Yf0nBD4WVXQzDrer2gEY7HMNiwio2hwDsTHO6LWuueNQAfRpNp4W7mKxcXpwXUiuVIlYw==", + "dependencies": { + "Newtonsoft.Json": "10.0.3" + } + }, + "Microsoft.SqlServer.Server": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "N4KeF3cpcm1PUHym1RmakkzfkEv3GRMyofVv40uXsQhCQeglr2OHNcUk2WOG51AKpGO8ynGpo9M/kFXSzghwug==" + }, + "Microsoft.VisualBasic": { + "type": "Transitive", + "resolved": "10.3.0", + "contentHash": "AvMDjmJHjz9bdlvxiSdEHHcWP+sZtp7zwule5ab6DaUbgoBnwCsd7nymj69vSz18ypXuEv3SI7ZUNwbIKrvtMA==" + }, + "Microsoft.Win32.SystemEvents": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "hqTM5628jSsQiv+HGpiq3WKBl2c8v1KZfby2J6Pr7pEPlK9waPdgEO6b8A/+/xn/yZ9ulv8HuqK71ONy2tg67A==" + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "7VSGO0URRKoMEAq0Sc9cRz8mb6zbyx/BZDEWhgPdzzpmFhkam3fJ1DAGWFXBI4nGlma+uPKpfuMQP5LXRnOH5g==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "0oAaTAm6e2oVH+/Zttt0cuhGaePQYKII1dY8iaqP7CvOpVKgLybKRFvQjXR2LtxXOXTVPNv14j0ot8uV+HrUmw==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "G24ibsCNi5Kbz0oXWynBoRgtGvsw5ZSVEWjv13/KiCAM8C6wz9zzcCniMeQFIkJ2tasjo2kXlvlBZhplL51kGg==" + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.1", + "contentHash": "UPrVPlqPRSVZaB4ADmbsQ77KXn9ORiWXyA1RP2W2+byCh3bhgT1bQz0jbeOoog9/2oTQ5wWZSDSMeb74MjezcA==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.1" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "QR1OwtwehHxSeQvZKXe+iSd+d3XZNkEcuWMFYa2i0aG1l+lR739HPicKMlTbJst3spmeekDVBUS7SeS26s4U/g==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "I+GNKGg2xCHueRd1m9PzeEW7WLbNNLznmTuEi8/vZX71HudUbx1UTwlGkiwMri7JLl8hGaIAWnA/GONhu+LOyQ==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "1Z3TAq1ytS1IBRtPXJvEUZdVsfWfeNEhBkbiOCGEl9wwAfsjP2lz3ZFDx5tq8p60/EqbS0HItG5piHuB71RjoA==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.1", + "contentHash": "t15yGf5r6vMV1rB5O6TgfXKChtCaN3niwFw44M2ImX3eZ8yzueplqMqXPCbWzoBDHJVz9fE+9LFUGCsUmS2Jgg==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "6mU/cVmmHtQiDXhnzUImxIcDL48GbTk+TsptXyJA+MIOG9LRjPoAQC/qBFB7X+UNyK86bmvGwC8t+M66wsYC8w==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "vjwG0GGcTW/PPg6KVud8F9GLWYuAV1rrw1BKAqY0oh4jcUqg15oYF1+qkGR2x2ZHM4DQnWKQ7cJgYbfncz/lYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "7KMFpTkHC/zoExs+PwP8jDCWcrK9H6L7soowT80CUx3e+nxP/AFnq0AQAW5W76z2WYbLAYCRyPfwYFG6zkvQRw==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "xrlmRCnKZJLHxyyLIqkZjNXqgxnKdZxfItrPkjI+6pkRo5lHX8YvSZlWrSI5AVwLMi4HbNWP7064hcAWeZKp5w==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "leXiwfiIkW7Gmn7cgnNcdtNAU70SjmKW3jxGj1iKHOvdn0zRWsgv/l2OJUO5zdGdiv2VRFnAsxxhDgMzofPdWg==" + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Configuration.ConfigurationManager": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "jXw9MlUu/kRfEU0WyTptAVueupqIeE3/rl0EZDMlf8pcvJnitQ8HeVEp69rZdaStXwTV72boi/Bhw8lOeO+U2w==", + "dependencies": { + "System.Security.Cryptography.ProtectedData": "6.0.0", + "System.Security.Permissions": "6.0.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "KiLYDu2k2J82Q9BJpWiuQqCkFjRBWVq4jDzKKWawVi9KWzyD0XG3cmfX0vqTQlL14Wi9EufJrbL0+KCLTbqWiQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Drawing.Common": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "NfuoKUiP2nUWwKZN6twGqXioIe1zVD0RIj2t976A+czLHr2nY454RwwXs6JU9Htc6mwqL6Dn/nEL3dpVf2jOhg==", + "dependencies": { + "Microsoft.Win32.SystemEvents": "6.0.0" + } + }, + "System.Formats.Asn1": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "T6fD00dQ3NTbPDy31m4eQUwKW84s03z0N2C8HpOklyeaDgaJPa/TexP4/SkORMSOwc7WhKifnA6Ya33AkzmafA==" + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.IdentityModel.Tokens.Jwt": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "yxGIQd3BFK7F6S62/7RdZk3C/mfwyVxvh6ngd1VYMBmbJ1YZZA9+Ku6suylVtso0FjI0wbElpJ0d27CdsyLpBQ==", + "dependencies": { + "Microsoft.IdentityModel.JsonWebTokens": "6.35.0", + "Microsoft.IdentityModel.Tokens": "6.35.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.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "SxHB3nuNrpptVk+vZ/F+7OHEpoHUIKKMl02bUmYHQr1r+glbZQxs7pRtsf4ENO29TVm2TH3AEeep2fJcy92oYw==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Memory.Data": { + "type": "Transitive", + "resolved": "1.0.2", + "contentHash": "JGkzeqgBsiZwKJZ1IxPNsDFZDhUvuEdX8L8BDC8N3KOj+6zMcNU28CNN59TpZE/VJYy9cP+5M+sbxtWJx3/xtw==", + "dependencies": { + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.6.0" + } + }, + "System.Numerics.Vectors": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yDaJ2x3mMmjdZEDB4IbezSnCsnjQ4BxinKhRAaP6kEgL6Bb6jANWphs5SzyD8imqeC/3FxgsuXT6ykkiH1uUmA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Serialization.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0", + "System.Xml.XmlDocument": "4.3.0", + "System.Xml.XmlSerializer": "4.3.0" + } + }, + "System.Private.ServiceModel": { + "type": "Transitive", + "resolved": "4.10.2", + "contentHash": "bi2/w2EDXqxno8zfbt6vHcrpGw0Pav8tEMzmJraHwJvWYJd45wcqr7gNa2IUs91j4z+BNGMooStaWS6pm2Lq0A==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "5.0.0", + "Microsoft.Extensions.ObjectPool": "5.0.10", + "System.Numerics.Vectors": "4.5.0", + "System.Reflection.DispatchProxy": "4.7.1", + "System.Security.Cryptography.Xml": "6.0.1", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.DispatchProxy": { + "type": "Transitive", + "resolved": "4.7.1", + "contentHash": "C1sMLwIG6ILQ2bmOT4gh62V6oJlyF4BlHcVMrOoor49p0Ji2tA8QAoqyMcIhAdH6OHKJ8m7BU+r4LK2CUEOKqw==" + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.Caching": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "E0e03kUp5X2k+UAoVl6efmI7uU7JRBWi5EIdlQ7cr0NpBGjHG4fWII35PgsBY9T4fJQ8E4QPsL0rKksU9gcL5A==", + "dependencies": { + "System.Configuration.ConfigurationManager": "6.0.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Wz+0KOukJGAlXjtKr+5Xpuxf8+c8739RI1C+A2BoQZT+wMCCoMDDdO8/4IRHfaVINqL78GO8dW8G2lW/e45Mcw==", + "dependencies": { + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Serialization.Xml": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nUQx/5OVgrqEba3+j7OdiofvVq9koWZAC7Z3xGI8IIViZqApWnZ5+lLcwYgTlbkobrl/Rat+Jb8GeD4WQESD2A==", + "dependencies": { + "System.IO": "4.3.0", + "System.Private.DataContractSerialization": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Serialization.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "AUADIc0LIEQe7MzC+I0cl0rAT8RrTAKFHl53yHjEUzNVIaUlhFY11vc2ebiVJzVBuOzun6F7FBA+8KAbGTTedQ==" + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.1", + "contentHash": "DVUblnRfnarrI5olEC2B/OCsJQd0anjVaObQMndHSc43efbc88/RMOlDyg/EyY0ix5ecyZMXS8zMksb5ukebZA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.1", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "WG3r7EyjUe9CMPFSs6bty5doUqT+q9pbI80hlNzo2SkPkZ4VTuZkGWjpp77JB8+uaL4DFPRdBsAY+DX3dBK92A==" + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Pkcs": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "ynmbW2GjIGg9K1wXmVIRs4IlyDolf0JXNpzFQ8JCVgwM+myUC2JeUggl2PwQig2PNVMegKmN1aAx7WPQ8tI3vA==", + "dependencies": { + "System.Formats.Asn1": "6.0.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "rp1gMNEZpvx9vP0JW0oHLxlf8oSiQgtno77Y4PLUBjSiDYoD77Y8uXHr1Ea5XG4/pIKhqAdxZ8v8OTUtqo9PeQ==" + }, + "System.Security.Cryptography.Xml": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "5e5bI28T0x73AwTsbuFP4qSRzthmU2C0Gqgg3AZ3KTxmSyA+Uhk31puA3srdaeWaacVnHhLdJywCzqOiEpbO/w==", + "dependencies": { + "System.Security.AccessControl": "6.0.0", + "System.Security.Cryptography.Pkcs": "6.0.1" + } + }, + "System.Security.Permissions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "T/uuc7AklkDoxmcJ7LGkyX1CcSviZuLCa4jg3PekfJ7SU0niF0IVTXwUiNVP9DSpzou2PpxJ+eNY2IfDM90ZCg==", + "dependencies": { + "System.Security.AccessControl": "6.0.0", + "System.Windows.Extensions": "6.0.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.ServiceModel.Http": { + "type": "Transitive", + "resolved": "4.10.2", + "contentHash": "1AhiJwPc+90GjBd/sDkT93RVuRj688ZQInXzWfd56AEjDzWieUcAUh9ppXhRuEVpT+x48D5GBYJc1VxDP4IT+Q==", + "dependencies": { + "System.Private.ServiceModel": "4.10.2", + "System.ServiceModel.Primitives": "4.10.2" + } + }, + "System.ServiceModel.Primitives": { + "type": "Transitive", + "resolved": "4.10.2", + "contentHash": "8QOguIqHtWYywBt7SubPhdICE2LClHzqOMDy0LQIui4T3QJOae7g6UR+alCW61nEufYNtO8Uss41EbXqD8hdww==", + "dependencies": { + "System.Private.ServiceModel": "4.10.2" + } + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "OP6umVGxc0Z0MvZQBVigj4/U31Pw72ITihDWP9WiWDm+q5aoe0GaJivsfYGq53o6dxH7DcXWiCTl7+0o2CGdmg==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "7.0.3", + "contentHash": "AyjhwXN1zTFeIibHimfJn6eAsZ7rTBib79JQpzg8WAuR/HKDu9JGNHTuu3nbbXQ/bgI+U4z6HtZmCHNXB1QXrQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "7.0.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.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": "6.0.0", + "contentHash": "IXoJOXIqc39AIe+CIR7koBtRGMiCt/LPM3lI+PELtDIy9XdyeSrwXFdWV9dzJ2Awl0paLWUaknLxFQ5HpHZUog==", + "dependencies": { + "System.Drawing.Common": "6.0.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lJ8AxvkX7GQxpC6GFCeBj8ThYVyQczx2+f/cWHJU8tjS7YfI6Cv6bon70jVEgs2CiFbmmM8b9j1oZVx0dSI2Ww==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "MYoTCP7EZ98RrANESW05J5ZwskKDoN0AuZ06ZflnowE50LTpbR5yRg3tHckTVm5j/m47stuGgCrCHWePyHS70Q==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XmlDocument": "4.3.0" + } + }, + "root16.sprout": { + "type": "Project", + "dependencies": { + "Microsoft.Data.SqlClient": "[5.2.0, )", + "Microsoft.Extensions.Logging": "[7.0.0, )", + "Microsoft.Extensions.Logging.Console": "[7.0.0, )", + "Microsoft.PowerPlatform.Dataverse.Client": "[1.1.16, )" + } + } + }, + "net7.0": { + "Microsoft.PowerPlatform.Dataverse.Client": { + "type": "Direct", + "requested": "[1.1.17, )", + "resolved": "1.1.17", + "contentHash": "gSgD7N52EATY0PkNIbBtqZeG0FDGK11X1x8nBnPclfykw73bvqyfortjNIwAGcj0esMqk8DSieuRCVi47hg9qQ==", + "dependencies": { + "Microsoft.Extensions.Caching.Memory": "3.1.8", + "Microsoft.Extensions.DependencyInjection": "3.1.8", + "Microsoft.Extensions.Http": "3.1.8", + "Microsoft.Extensions.Logging": "3.1.8", + "Microsoft.Identity.Client": "4.56.0", + "Microsoft.Identity.Client.Extensions.Msal": "4.56.0", + "Microsoft.Rest.ClientRuntime": "2.3.24", + "Microsoft.VisualBasic": "10.3.0", + "Newtonsoft.Json": "13.0.1", + "System.Collections": "4.3.0", + "System.Configuration.ConfigurationManager": "4.7.0", + "System.Drawing.Common": "5.0.3", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Private.DataContractSerialization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.TypeExtensions": "4.7.0", + "System.Runtime.Caching": "4.7.0", + "System.Runtime.Serialization.Primitives": "4.3.0", + "System.Runtime.Serialization.Xml": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.1", + "System.Security.Cryptography.ProtectedData": "4.7.0", + "System.Security.Permissions": "5.0.0", + "System.ServiceModel.Http": "4.10.2", + "System.Text.Json": "7.0.3" + } + }, + "Azure.Core": { + "type": "Transitive", + "resolved": "1.35.0", + "contentHash": "hENcx03Jyuqv05F4RBEPbxz29UrM3Nbhnr6Wl6NQpoU9BCIbL3XLentrxDCTrH54NLS11Exxi/o8MYgT/cnKFA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "1.1.1", + "System.Diagnostics.DiagnosticSource": "6.0.1", + "System.Memory.Data": "1.0.2", + "System.Numerics.Vectors": "4.5.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "Azure.Identity": { + "type": "Transitive", + "resolved": "1.10.3", + "contentHash": "l1Xm2MWOF2Mzcwuarlw8kWQXLZk3UeB55aQXVyjj23aBfDwOZ3gu5GP2kJ6KlmZeZv2TCzw7x4L3V36iNr3gww==", + "dependencies": { + "Azure.Core": "1.35.0", + "Microsoft.Identity.Client": "4.56.0", + "Microsoft.Identity.Client.Extensions.Msal": "4.56.0", + "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" + } + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ==" + }, + "Microsoft.Data.SqlClient": { + "type": "Transitive", + "resolved": "5.2.0", + "contentHash": "3alfyqRN3ELRtdvU1dGtLBRNQqprr3TJ0WrUJfMISPwg1nPUN2P3Lelah68IKWuV27Ceb7ig95hWNHFTSXfxMg==", + "dependencies": { + "Azure.Identity": "1.10.3", + "Microsoft.Data.SqlClient.SNI.runtime": "5.2.0", + "Microsoft.Identity.Client": "4.56.0", + "Microsoft.IdentityModel.JsonWebTokens": "6.35.0", + "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.35.0", + "Microsoft.SqlServer.Server": "1.0.0", + "System.Configuration.ConfigurationManager": "6.0.1", + "System.Runtime.Caching": "6.0.0" + } + }, + "Microsoft.Data.SqlClient.SNI.runtime": { + "type": "Transitive", + "resolved": "5.2.0", + "contentHash": "po1jhvFd+8pbfvJR/puh+fkHi0GRanAdvayh/0e47yaM6CXWZ6opUjCMFuYlAnD2LcbyvQE7fPJKvogmaUcN+w==" + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Transitive", + "resolved": "3.1.8", + "contentHash": "iBIdKjKa2nR4LdknV2JMSRpJVM5TOca25EckPm6SZQT6HfH8RoHrn9m14GUAkvzE+uOziXRoAwr8YIC6ZOpyXg==", + "dependencies": { + "Microsoft.Extensions.Primitives": "3.1.8" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "3.1.8", + "contentHash": "u04q7+tgc8l6pQ5HOcr6scgapkQQHnrhpGoCaaAZd24R36/NxGsGxuhSmhHOrQx9CsBLe2CVBN/4CkLlxtnnXw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "3.1.8", + "Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.8", + "Microsoft.Extensions.Logging.Abstractions": "3.1.8", + "Microsoft.Extensions.Options": "3.1.8" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "tldQUBWt/xeH2K7/hMPPo5g8zuLc3Ro9I5d4o/XrxvxOCA2EZBtW7bCHHTc49fcBtvB8tLAb/Qsmfrq+2SJ4vA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "f34u2eaqIjNO9YLHBz8rozVZ+TcFiFs0F3r7nUJd7FRkVSxk8u4OpoK226mi49MwexHOR2ibP9MFvRUaLilcQQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "tgU4u7bZsoS9MKVRiotVMAwHtbREHr5/5zSEV+JPhg46+ox47Au84E3D2IacAaB0bk5ePNaNieTlPrfjbbRJkg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==" + }, + "Microsoft.Extensions.Http": { + "type": "Transitive", + "resolved": "3.1.8", + "contentHash": "GRkzBs2wJG6jTGqRrT8l/Sqk4MiO0yQltiekDNw/X7L2l5/gKSud/6Vcjb9b5SPtgn6lxcn8qCmfDtk2kP/cOw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.8", + "Microsoft.Extensions.Logging": "3.1.8", + "Microsoft.Extensions.Options": "3.1.8" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "Nw2muoNrOG5U5qa2ZekXwudUn2BJcD41e65zwmDHb1fQegTX66UokLWZkJRpqSSHXDOWZ5V0iqhbxOEky91atA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "7.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "kmn78+LPVMOWeITUjIlfxUPDsI0R6G0RkeAMBmQxAJ7vBJn4q2dTva7pWi65ceN5vPGjJ9q/Uae2WKgvfktJAw==" + }, + "Microsoft.Extensions.Logging.Configuration": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "FLDA0HcffKA8ycoDQLJuCNGIE42cLWPxgdQGRBaSzZrYTkMBjnf9zrr8pGT06psLq9Q+RKWmmZczQ9bCrXEBcA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "7.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", + "Microsoft.Extensions.Configuration.Binder": "7.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "7.0.0" + } + }, + "Microsoft.Extensions.Logging.Console": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "qt5n8bHLZPUfuRnFxJKW5q9ZwOTncdh96rtWzWpX3Y/064MlxzCSw2ELF5Jlwdo+Y4wK3I47NmUTFsV7Sg8rqg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging.Configuration": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0", + "System.Text.Json": "7.0.0" + } + }, + "Microsoft.Extensions.ObjectPool": { + "type": "Transitive", + "resolved": "5.0.10", + "contentHash": "pp9tbGqIhdEXL6Q1yJl+zevAJSq4BsxqhS1GXzBvEsEz9DDNu9GLNzgUy2xyFc4YjB4m4Ff2YEWTnvQvVYdkvQ==" + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "lP1yBnTTU42cKpMozuafbvNtQ7QcBjr/CcK3bYOGEMH55Fjt+iecXjT6chR7vbgCMqy3PG3aNQSZgo/EuY/9qQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "95UnxZkkFdXxF6vSrtJsMHCzkDeSMuUWGs2hDT54cX+U5eVajrCJ3qLyQRW+CtpTt5OJ8bmTvpQVHu1DLhH+cA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", + "Microsoft.Extensions.Configuration.Binder": "7.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0", + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "um1KU5kxcRp3CNuI8o/GrZtD4AIOXDk+RLsytjZ9QPok3ttLUelLKpilVPuaFT3TFjOhSibUAso0odbOaCDj3Q==" + }, + "Microsoft.Identity.Client": { + "type": "Transitive", + "resolved": "4.56.0", + "contentHash": "rr4zbidvHy9r4NvOAs5hdd964Ao2A0pAeFBJKR95u1CJAVzbd1p6tPTXUZ+5ld0cfThiVSGvz6UHwY6JjraTpA==", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "6.22.0" + } + }, + "Microsoft.Identity.Client.Extensions.Msal": { + "type": "Transitive", + "resolved": "4.56.0", + "contentHash": "H12YAzEGK55vZ+QpxUzozhW8ZZtgPDuWvgA0JbdIR9UhMUplj29JhIgE2imuH8W2Nw9D8JKygR1uxRFtpSNcrg==", + "dependencies": { + "Microsoft.Identity.Client": "4.56.0", + "System.IO.FileSystem.AccessControl": "5.0.0", + "System.Security.Cryptography.ProtectedData": "4.5.0" + } + }, + "Microsoft.IdentityModel.Abstractions": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "xuR8E4Rd96M41CnUSCiOJ2DBh+z+zQSmyrYHdYhD6K4fXBcQGVnRCFQ0efROUYpP+p0zC1BLKr0JRpVuujTZSg==" + }, + "Microsoft.IdentityModel.JsonWebTokens": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "9wxai3hKgZUb4/NjdRKfQd0QJvtXKDlvmGMYACbEC8DFaicMFCFhQFZq9ZET1kJLwZahf2lfY5Gtcpsx8zYzbg==", + "dependencies": { + "Microsoft.IdentityModel.Tokens": "6.35.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2" + } + }, + "Microsoft.IdentityModel.Logging": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "jePrSfGAmqT81JDCNSY+fxVWoGuJKt9e6eJ+vT7+quVS55nWl//jGjUQn4eFtVKt4rt5dXaleZdHRB9J9AJZ7Q==", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "6.35.0" + } + }, + "Microsoft.IdentityModel.Protocols": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "BPQhlDzdFvv1PzaUxNSk+VEPwezlDEVADIKmyxubw7IiELK18uJ06RQ9QKKkds30XI+gDu9n8j24XQ8w7fjWcg==", + "dependencies": { + "Microsoft.IdentityModel.Logging": "6.35.0", + "Microsoft.IdentityModel.Tokens": "6.35.0" + } + }, + "Microsoft.IdentityModel.Protocols.OpenIdConnect": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "LMtVqnECCCdSmyFoCOxIE5tXQqkOLrvGrL7OxHg41DIm1bpWtaCdGyVcTAfOQpJXvzND9zUKIN/lhngPkYR8vg==", + "dependencies": { + "Microsoft.IdentityModel.Protocols": "6.35.0", + "System.IdentityModel.Tokens.Jwt": "6.35.0" + } + }, + "Microsoft.IdentityModel.Tokens": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "RN7lvp7s3Boucg1NaNAbqDbxtlLj5Qeb+4uSS1TeK5FSBVM40P4DKaTKChT43sHyKfh7V0zkrMph6DdHvyA4bg==", + "dependencies": { + "Microsoft.CSharp": "4.5.0", + "Microsoft.IdentityModel.Logging": "6.35.0", + "System.Security.Cryptography.Cng": "4.5.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.Rest.ClientRuntime": { + "type": "Transitive", + "resolved": "2.3.24", + "contentHash": "hZH7XgM3eV2jFrnq7Yf0nBD4WVXQzDrer2gEY7HMNiwio2hwDsTHO6LWuueNQAfRpNp4W7mKxcXpwXUiuVIlYw==", + "dependencies": { + "Newtonsoft.Json": "10.0.3" + } + }, + "Microsoft.SqlServer.Server": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "N4KeF3cpcm1PUHym1RmakkzfkEv3GRMyofVv40uXsQhCQeglr2OHNcUk2WOG51AKpGO8ynGpo9M/kFXSzghwug==" + }, + "Microsoft.VisualBasic": { + "type": "Transitive", + "resolved": "10.3.0", + "contentHash": "AvMDjmJHjz9bdlvxiSdEHHcWP+sZtp7zwule5ab6DaUbgoBnwCsd7nymj69vSz18ypXuEv3SI7ZUNwbIKrvtMA==" + }, + "Microsoft.Win32.SystemEvents": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "hqTM5628jSsQiv+HGpiq3WKBl2c8v1KZfby2J6Pr7pEPlK9waPdgEO6b8A/+/xn/yZ9ulv8HuqK71ONy2tg67A==" + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "7VSGO0URRKoMEAq0Sc9cRz8mb6zbyx/BZDEWhgPdzzpmFhkam3fJ1DAGWFXBI4nGlma+uPKpfuMQP5LXRnOH5g==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "0oAaTAm6e2oVH+/Zttt0cuhGaePQYKII1dY8iaqP7CvOpVKgLybKRFvQjXR2LtxXOXTVPNv14j0ot8uV+HrUmw==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "G24ibsCNi5Kbz0oXWynBoRgtGvsw5ZSVEWjv13/KiCAM8C6wz9zzcCniMeQFIkJ2tasjo2kXlvlBZhplL51kGg==" + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.1", + "contentHash": "UPrVPlqPRSVZaB4ADmbsQ77KXn9ORiWXyA1RP2W2+byCh3bhgT1bQz0jbeOoog9/2oTQ5wWZSDSMeb74MjezcA==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.1" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "QR1OwtwehHxSeQvZKXe+iSd+d3XZNkEcuWMFYa2i0aG1l+lR739HPicKMlTbJst3spmeekDVBUS7SeS26s4U/g==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "I+GNKGg2xCHueRd1m9PzeEW7WLbNNLznmTuEi8/vZX71HudUbx1UTwlGkiwMri7JLl8hGaIAWnA/GONhu+LOyQ==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "1Z3TAq1ytS1IBRtPXJvEUZdVsfWfeNEhBkbiOCGEl9wwAfsjP2lz3ZFDx5tq8p60/EqbS0HItG5piHuB71RjoA==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.1", + "contentHash": "t15yGf5r6vMV1rB5O6TgfXKChtCaN3niwFw44M2ImX3eZ8yzueplqMqXPCbWzoBDHJVz9fE+9LFUGCsUmS2Jgg==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "6mU/cVmmHtQiDXhnzUImxIcDL48GbTk+TsptXyJA+MIOG9LRjPoAQC/qBFB7X+UNyK86bmvGwC8t+M66wsYC8w==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "vjwG0GGcTW/PPg6KVud8F9GLWYuAV1rrw1BKAqY0oh4jcUqg15oYF1+qkGR2x2ZHM4DQnWKQ7cJgYbfncz/lYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "7KMFpTkHC/zoExs+PwP8jDCWcrK9H6L7soowT80CUx3e+nxP/AFnq0AQAW5W76z2WYbLAYCRyPfwYFG6zkvQRw==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "xrlmRCnKZJLHxyyLIqkZjNXqgxnKdZxfItrPkjI+6pkRo5lHX8YvSZlWrSI5AVwLMi4HbNWP7064hcAWeZKp5w==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "leXiwfiIkW7Gmn7cgnNcdtNAU70SjmKW3jxGj1iKHOvdn0zRWsgv/l2OJUO5zdGdiv2VRFnAsxxhDgMzofPdWg==" + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Configuration.ConfigurationManager": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "jXw9MlUu/kRfEU0WyTptAVueupqIeE3/rl0EZDMlf8pcvJnitQ8HeVEp69rZdaStXwTV72boi/Bhw8lOeO+U2w==", + "dependencies": { + "System.Security.Cryptography.ProtectedData": "6.0.0", + "System.Security.Permissions": "6.0.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "KiLYDu2k2J82Q9BJpWiuQqCkFjRBWVq4jDzKKWawVi9KWzyD0XG3cmfX0vqTQlL14Wi9EufJrbL0+KCLTbqWiQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Drawing.Common": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "NfuoKUiP2nUWwKZN6twGqXioIe1zVD0RIj2t976A+czLHr2nY454RwwXs6JU9Htc6mwqL6Dn/nEL3dpVf2jOhg==", + "dependencies": { + "Microsoft.Win32.SystemEvents": "6.0.0" + } + }, + "System.Formats.Asn1": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "T6fD00dQ3NTbPDy31m4eQUwKW84s03z0N2C8HpOklyeaDgaJPa/TexP4/SkORMSOwc7WhKifnA6Ya33AkzmafA==" + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.IdentityModel.Tokens.Jwt": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "yxGIQd3BFK7F6S62/7RdZk3C/mfwyVxvh6ngd1VYMBmbJ1YZZA9+Ku6suylVtso0FjI0wbElpJ0d27CdsyLpBQ==", + "dependencies": { + "Microsoft.IdentityModel.JsonWebTokens": "6.35.0", + "Microsoft.IdentityModel.Tokens": "6.35.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.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "SxHB3nuNrpptVk+vZ/F+7OHEpoHUIKKMl02bUmYHQr1r+glbZQxs7pRtsf4ENO29TVm2TH3AEeep2fJcy92oYw==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Memory.Data": { + "type": "Transitive", + "resolved": "1.0.2", + "contentHash": "JGkzeqgBsiZwKJZ1IxPNsDFZDhUvuEdX8L8BDC8N3KOj+6zMcNU28CNN59TpZE/VJYy9cP+5M+sbxtWJx3/xtw==", + "dependencies": { + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.6.0" + } + }, + "System.Numerics.Vectors": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yDaJ2x3mMmjdZEDB4IbezSnCsnjQ4BxinKhRAaP6kEgL6Bb6jANWphs5SzyD8imqeC/3FxgsuXT6ykkiH1uUmA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Serialization.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0", + "System.Xml.XmlDocument": "4.3.0", + "System.Xml.XmlSerializer": "4.3.0" + } + }, + "System.Private.ServiceModel": { + "type": "Transitive", + "resolved": "4.10.2", + "contentHash": "bi2/w2EDXqxno8zfbt6vHcrpGw0Pav8tEMzmJraHwJvWYJd45wcqr7gNa2IUs91j4z+BNGMooStaWS6pm2Lq0A==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "5.0.0", + "Microsoft.Extensions.ObjectPool": "5.0.10", + "System.Numerics.Vectors": "4.5.0", + "System.Reflection.DispatchProxy": "4.7.1", + "System.Security.Cryptography.Xml": "6.0.1", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.DispatchProxy": { + "type": "Transitive", + "resolved": "4.7.1", + "contentHash": "C1sMLwIG6ILQ2bmOT4gh62V6oJlyF4BlHcVMrOoor49p0Ji2tA8QAoqyMcIhAdH6OHKJ8m7BU+r4LK2CUEOKqw==" + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.Caching": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "E0e03kUp5X2k+UAoVl6efmI7uU7JRBWi5EIdlQ7cr0NpBGjHG4fWII35PgsBY9T4fJQ8E4QPsL0rKksU9gcL5A==", + "dependencies": { + "System.Configuration.ConfigurationManager": "6.0.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Wz+0KOukJGAlXjtKr+5Xpuxf8+c8739RI1C+A2BoQZT+wMCCoMDDdO8/4IRHfaVINqL78GO8dW8G2lW/e45Mcw==", + "dependencies": { + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Serialization.Xml": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nUQx/5OVgrqEba3+j7OdiofvVq9koWZAC7Z3xGI8IIViZqApWnZ5+lLcwYgTlbkobrl/Rat+Jb8GeD4WQESD2A==", + "dependencies": { + "System.IO": "4.3.0", + "System.Private.DataContractSerialization": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Serialization.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "AUADIc0LIEQe7MzC+I0cl0rAT8RrTAKFHl53yHjEUzNVIaUlhFY11vc2ebiVJzVBuOzun6F7FBA+8KAbGTTedQ==" + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.1", + "contentHash": "DVUblnRfnarrI5olEC2B/OCsJQd0anjVaObQMndHSc43efbc88/RMOlDyg/EyY0ix5ecyZMXS8zMksb5ukebZA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.1", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "WG3r7EyjUe9CMPFSs6bty5doUqT+q9pbI80hlNzo2SkPkZ4VTuZkGWjpp77JB8+uaL4DFPRdBsAY+DX3dBK92A==" + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Pkcs": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "ynmbW2GjIGg9K1wXmVIRs4IlyDolf0JXNpzFQ8JCVgwM+myUC2JeUggl2PwQig2PNVMegKmN1aAx7WPQ8tI3vA==", + "dependencies": { + "System.Formats.Asn1": "6.0.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "rp1gMNEZpvx9vP0JW0oHLxlf8oSiQgtno77Y4PLUBjSiDYoD77Y8uXHr1Ea5XG4/pIKhqAdxZ8v8OTUtqo9PeQ==" + }, + "System.Security.Cryptography.Xml": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "5e5bI28T0x73AwTsbuFP4qSRzthmU2C0Gqgg3AZ3KTxmSyA+Uhk31puA3srdaeWaacVnHhLdJywCzqOiEpbO/w==", + "dependencies": { + "System.Security.AccessControl": "6.0.0", + "System.Security.Cryptography.Pkcs": "6.0.1" + } + }, + "System.Security.Permissions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "T/uuc7AklkDoxmcJ7LGkyX1CcSviZuLCa4jg3PekfJ7SU0niF0IVTXwUiNVP9DSpzou2PpxJ+eNY2IfDM90ZCg==", + "dependencies": { + "System.Security.AccessControl": "6.0.0", + "System.Windows.Extensions": "6.0.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.ServiceModel.Http": { + "type": "Transitive", + "resolved": "4.10.2", + "contentHash": "1AhiJwPc+90GjBd/sDkT93RVuRj688ZQInXzWfd56AEjDzWieUcAUh9ppXhRuEVpT+x48D5GBYJc1VxDP4IT+Q==", + "dependencies": { + "System.Private.ServiceModel": "4.10.2", + "System.ServiceModel.Primitives": "4.10.2" + } + }, + "System.ServiceModel.Primitives": { + "type": "Transitive", + "resolved": "4.10.2", + "contentHash": "8QOguIqHtWYywBt7SubPhdICE2LClHzqOMDy0LQIui4T3QJOae7g6UR+alCW61nEufYNtO8Uss41EbXqD8hdww==", + "dependencies": { + "System.Private.ServiceModel": "4.10.2" + } + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "OP6umVGxc0Z0MvZQBVigj4/U31Pw72ITihDWP9WiWDm+q5aoe0GaJivsfYGq53o6dxH7DcXWiCTl7+0o2CGdmg==" + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "7.0.3", + "contentHash": "AyjhwXN1zTFeIibHimfJn6eAsZ7rTBib79JQpzg8WAuR/HKDu9JGNHTuu3nbbXQ/bgI+U4z6HtZmCHNXB1QXrQ==", + "dependencies": { + "System.Text.Encodings.Web": "7.0.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.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": "6.0.0", + "contentHash": "IXoJOXIqc39AIe+CIR7koBtRGMiCt/LPM3lI+PELtDIy9XdyeSrwXFdWV9dzJ2Awl0paLWUaknLxFQ5HpHZUog==", + "dependencies": { + "System.Drawing.Common": "6.0.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lJ8AxvkX7GQxpC6GFCeBj8ThYVyQczx2+f/cWHJU8tjS7YfI6Cv6bon70jVEgs2CiFbmmM8b9j1oZVx0dSI2Ww==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "MYoTCP7EZ98RrANESW05J5ZwskKDoN0AuZ06ZflnowE50LTpbR5yRg3tHckTVm5j/m47stuGgCrCHWePyHS70Q==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XmlDocument": "4.3.0" + } + }, + "root16.sprout": { + "type": "Project", + "dependencies": { + "Microsoft.Data.SqlClient": "[5.2.0, )", + "Microsoft.Extensions.Logging": "[7.0.0, )", + "Microsoft.Extensions.Logging.Console": "[7.0.0, )", + "Microsoft.PowerPlatform.Dataverse.Client": "[1.1.16, )" + } + } + }, "net8.0": { "Microsoft.PowerPlatform.Dataverse.Client": { "type": "Direct", diff --git a/src/Root16.Sprout.SqlServer/Root16.Sprout.SqlServer.csproj b/src/Root16.Sprout.SqlServer/Root16.Sprout.SqlServer.csproj index ae71b07..93b5535 100644 --- a/src/Root16.Sprout.SqlServer/Root16.Sprout.SqlServer.csproj +++ b/src/Root16.Sprout.SqlServer/Root16.Sprout.SqlServer.csproj @@ -1,7 +1,7 @@  - net8.0 + net8.0;net7.0;net6.0 enable enable https://github.com/Root16/sprout diff --git a/src/Root16.Sprout.SqlServer/packages.lock.json b/src/Root16.Sprout.SqlServer/packages.lock.json index 3e9c945..a3762fd 100644 --- a/src/Root16.Sprout.SqlServer/packages.lock.json +++ b/src/Root16.Sprout.SqlServer/packages.lock.json @@ -1,6 +1,2304 @@ { "version": 1, "dependencies": { + "net6.0": { + "Microsoft.Data.SqlClient": { + "type": "Direct", + "requested": "[5.2.0, )", + "resolved": "5.2.0", + "contentHash": "3alfyqRN3ELRtdvU1dGtLBRNQqprr3TJ0WrUJfMISPwg1nPUN2P3Lelah68IKWuV27Ceb7ig95hWNHFTSXfxMg==", + "dependencies": { + "Azure.Identity": "1.10.3", + "Microsoft.Data.SqlClient.SNI.runtime": "5.2.0", + "Microsoft.Identity.Client": "4.56.0", + "Microsoft.IdentityModel.JsonWebTokens": "6.35.0", + "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.35.0", + "Microsoft.SqlServer.Server": "1.0.0", + "System.Configuration.ConfigurationManager": "6.0.1", + "System.Runtime.Caching": "6.0.0" + } + }, + "Azure.Core": { + "type": "Transitive", + "resolved": "1.35.0", + "contentHash": "hENcx03Jyuqv05F4RBEPbxz29UrM3Nbhnr6Wl6NQpoU9BCIbL3XLentrxDCTrH54NLS11Exxi/o8MYgT/cnKFA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "1.1.1", + "System.Diagnostics.DiagnosticSource": "6.0.1", + "System.Memory.Data": "1.0.2", + "System.Numerics.Vectors": "4.5.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "Azure.Identity": { + "type": "Transitive", + "resolved": "1.10.3", + "contentHash": "l1Xm2MWOF2Mzcwuarlw8kWQXLZk3UeB55aQXVyjj23aBfDwOZ3gu5GP2kJ6KlmZeZv2TCzw7x4L3V36iNr3gww==", + "dependencies": { + "Azure.Core": "1.35.0", + "Microsoft.Identity.Client": "4.56.0", + "Microsoft.Identity.Client.Extensions.Msal": "4.56.0", + "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" + } + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ==" + }, + "Microsoft.Data.SqlClient.SNI.runtime": { + "type": "Transitive", + "resolved": "5.2.0", + "contentHash": "po1jhvFd+8pbfvJR/puh+fkHi0GRanAdvayh/0e47yaM6CXWZ6opUjCMFuYlAnD2LcbyvQE7fPJKvogmaUcN+w==" + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Transitive", + "resolved": "3.1.8", + "contentHash": "iBIdKjKa2nR4LdknV2JMSRpJVM5TOca25EckPm6SZQT6HfH8RoHrn9m14GUAkvzE+uOziXRoAwr8YIC6ZOpyXg==", + "dependencies": { + "Microsoft.Extensions.Primitives": "3.1.8" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "3.1.8", + "contentHash": "u04q7+tgc8l6pQ5HOcr6scgapkQQHnrhpGoCaaAZd24R36/NxGsGxuhSmhHOrQx9CsBLe2CVBN/4CkLlxtnnXw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "3.1.8", + "Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.8", + "Microsoft.Extensions.Logging.Abstractions": "3.1.8", + "Microsoft.Extensions.Options": "3.1.8" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "tldQUBWt/xeH2K7/hMPPo5g8zuLc3Ro9I5d4o/XrxvxOCA2EZBtW7bCHHTc49fcBtvB8tLAb/Qsmfrq+2SJ4vA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "f34u2eaqIjNO9YLHBz8rozVZ+TcFiFs0F3r7nUJd7FRkVSxk8u4OpoK226mi49MwexHOR2ibP9MFvRUaLilcQQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "tgU4u7bZsoS9MKVRiotVMAwHtbREHr5/5zSEV+JPhg46+ox47Au84E3D2IacAaB0bk5ePNaNieTlPrfjbbRJkg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==" + }, + "Microsoft.Extensions.Http": { + "type": "Transitive", + "resolved": "3.1.8", + "contentHash": "GRkzBs2wJG6jTGqRrT8l/Sqk4MiO0yQltiekDNw/X7L2l5/gKSud/6Vcjb9b5SPtgn6lxcn8qCmfDtk2kP/cOw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.8", + "Microsoft.Extensions.Logging": "3.1.8", + "Microsoft.Extensions.Options": "3.1.8" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "Nw2muoNrOG5U5qa2ZekXwudUn2BJcD41e65zwmDHb1fQegTX66UokLWZkJRpqSSHXDOWZ5V0iqhbxOEky91atA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "7.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "kmn78+LPVMOWeITUjIlfxUPDsI0R6G0RkeAMBmQxAJ7vBJn4q2dTva7pWi65ceN5vPGjJ9q/Uae2WKgvfktJAw==" + }, + "Microsoft.Extensions.Logging.Configuration": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "FLDA0HcffKA8ycoDQLJuCNGIE42cLWPxgdQGRBaSzZrYTkMBjnf9zrr8pGT06psLq9Q+RKWmmZczQ9bCrXEBcA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "7.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", + "Microsoft.Extensions.Configuration.Binder": "7.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "7.0.0" + } + }, + "Microsoft.Extensions.Logging.Console": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "qt5n8bHLZPUfuRnFxJKW5q9ZwOTncdh96rtWzWpX3Y/064MlxzCSw2ELF5Jlwdo+Y4wK3I47NmUTFsV7Sg8rqg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging.Configuration": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Json": "7.0.0" + } + }, + "Microsoft.Extensions.ObjectPool": { + "type": "Transitive", + "resolved": "5.0.10", + "contentHash": "pp9tbGqIhdEXL6Q1yJl+zevAJSq4BsxqhS1GXzBvEsEz9DDNu9GLNzgUy2xyFc4YjB4m4Ff2YEWTnvQvVYdkvQ==" + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "lP1yBnTTU42cKpMozuafbvNtQ7QcBjr/CcK3bYOGEMH55Fjt+iecXjT6chR7vbgCMqy3PG3aNQSZgo/EuY/9qQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "95UnxZkkFdXxF6vSrtJsMHCzkDeSMuUWGs2hDT54cX+U5eVajrCJ3qLyQRW+CtpTt5OJ8bmTvpQVHu1DLhH+cA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", + "Microsoft.Extensions.Configuration.Binder": "7.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0", + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "um1KU5kxcRp3CNuI8o/GrZtD4AIOXDk+RLsytjZ9QPok3ttLUelLKpilVPuaFT3TFjOhSibUAso0odbOaCDj3Q==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.Identity.Client": { + "type": "Transitive", + "resolved": "4.56.0", + "contentHash": "rr4zbidvHy9r4NvOAs5hdd964Ao2A0pAeFBJKR95u1CJAVzbd1p6tPTXUZ+5ld0cfThiVSGvz6UHwY6JjraTpA==", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "6.22.0" + } + }, + "Microsoft.Identity.Client.Extensions.Msal": { + "type": "Transitive", + "resolved": "4.56.0", + "contentHash": "H12YAzEGK55vZ+QpxUzozhW8ZZtgPDuWvgA0JbdIR9UhMUplj29JhIgE2imuH8W2Nw9D8JKygR1uxRFtpSNcrg==", + "dependencies": { + "Microsoft.Identity.Client": "4.56.0", + "System.IO.FileSystem.AccessControl": "5.0.0", + "System.Security.Cryptography.ProtectedData": "4.5.0" + } + }, + "Microsoft.IdentityModel.Abstractions": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "xuR8E4Rd96M41CnUSCiOJ2DBh+z+zQSmyrYHdYhD6K4fXBcQGVnRCFQ0efROUYpP+p0zC1BLKr0JRpVuujTZSg==" + }, + "Microsoft.IdentityModel.JsonWebTokens": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "9wxai3hKgZUb4/NjdRKfQd0QJvtXKDlvmGMYACbEC8DFaicMFCFhQFZq9ZET1kJLwZahf2lfY5Gtcpsx8zYzbg==", + "dependencies": { + "Microsoft.IdentityModel.Tokens": "6.35.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2" + } + }, + "Microsoft.IdentityModel.Logging": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "jePrSfGAmqT81JDCNSY+fxVWoGuJKt9e6eJ+vT7+quVS55nWl//jGjUQn4eFtVKt4rt5dXaleZdHRB9J9AJZ7Q==", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "6.35.0" + } + }, + "Microsoft.IdentityModel.Protocols": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "BPQhlDzdFvv1PzaUxNSk+VEPwezlDEVADIKmyxubw7IiELK18uJ06RQ9QKKkds30XI+gDu9n8j24XQ8w7fjWcg==", + "dependencies": { + "Microsoft.IdentityModel.Logging": "6.35.0", + "Microsoft.IdentityModel.Tokens": "6.35.0" + } + }, + "Microsoft.IdentityModel.Protocols.OpenIdConnect": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "LMtVqnECCCdSmyFoCOxIE5tXQqkOLrvGrL7OxHg41DIm1bpWtaCdGyVcTAfOQpJXvzND9zUKIN/lhngPkYR8vg==", + "dependencies": { + "Microsoft.IdentityModel.Protocols": "6.35.0", + "System.IdentityModel.Tokens.Jwt": "6.35.0" + } + }, + "Microsoft.IdentityModel.Tokens": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "RN7lvp7s3Boucg1NaNAbqDbxtlLj5Qeb+4uSS1TeK5FSBVM40P4DKaTKChT43sHyKfh7V0zkrMph6DdHvyA4bg==", + "dependencies": { + "Microsoft.CSharp": "4.5.0", + "Microsoft.IdentityModel.Logging": "6.35.0", + "System.Security.Cryptography.Cng": "4.5.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.PowerPlatform.Dataverse.Client": { + "type": "Transitive", + "resolved": "1.1.16", + "contentHash": "zrkb4MIwynYE+lBF1Y4ljyYWwQvXIvDgviSZ2r1TY9P9a3UmEGLWp/jJFbOt+3v4Uw4fXcL4Yed8HRfc/GOnQQ==", + "dependencies": { + "Microsoft.Extensions.Caching.Memory": "3.1.8", + "Microsoft.Extensions.DependencyInjection": "3.1.8", + "Microsoft.Extensions.Http": "3.1.8", + "Microsoft.Extensions.Logging": "3.1.8", + "Microsoft.Identity.Client": "4.56.0", + "Microsoft.Identity.Client.Extensions.Msal": "4.56.0", + "Microsoft.Rest.ClientRuntime": "2.3.24", + "Microsoft.VisualBasic": "10.3.0", + "Newtonsoft.Json": "13.0.1", + "System.Collections": "4.3.0", + "System.Configuration.ConfigurationManager": "4.7.0", + "System.Drawing.Common": "5.0.3", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Private.DataContractSerialization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.TypeExtensions": "4.7.0", + "System.Runtime.Caching": "4.7.0", + "System.Runtime.Serialization.Primitives": "4.3.0", + "System.Runtime.Serialization.Xml": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.1", + "System.Security.Cryptography.ProtectedData": "4.7.0", + "System.Security.Permissions": "5.0.0", + "System.ServiceModel.Http": "4.10.2", + "System.Text.Json": "7.0.3" + } + }, + "Microsoft.Rest.ClientRuntime": { + "type": "Transitive", + "resolved": "2.3.24", + "contentHash": "hZH7XgM3eV2jFrnq7Yf0nBD4WVXQzDrer2gEY7HMNiwio2hwDsTHO6LWuueNQAfRpNp4W7mKxcXpwXUiuVIlYw==", + "dependencies": { + "Newtonsoft.Json": "10.0.3" + } + }, + "Microsoft.SqlServer.Server": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "N4KeF3cpcm1PUHym1RmakkzfkEv3GRMyofVv40uXsQhCQeglr2OHNcUk2WOG51AKpGO8ynGpo9M/kFXSzghwug==" + }, + "Microsoft.VisualBasic": { + "type": "Transitive", + "resolved": "10.3.0", + "contentHash": "AvMDjmJHjz9bdlvxiSdEHHcWP+sZtp7zwule5ab6DaUbgoBnwCsd7nymj69vSz18ypXuEv3SI7ZUNwbIKrvtMA==" + }, + "Microsoft.Win32.SystemEvents": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "hqTM5628jSsQiv+HGpiq3WKBl2c8v1KZfby2J6Pr7pEPlK9waPdgEO6b8A/+/xn/yZ9ulv8HuqK71ONy2tg67A==" + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "7VSGO0URRKoMEAq0Sc9cRz8mb6zbyx/BZDEWhgPdzzpmFhkam3fJ1DAGWFXBI4nGlma+uPKpfuMQP5LXRnOH5g==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "0oAaTAm6e2oVH+/Zttt0cuhGaePQYKII1dY8iaqP7CvOpVKgLybKRFvQjXR2LtxXOXTVPNv14j0ot8uV+HrUmw==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "G24ibsCNi5Kbz0oXWynBoRgtGvsw5ZSVEWjv13/KiCAM8C6wz9zzcCniMeQFIkJ2tasjo2kXlvlBZhplL51kGg==" + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.1", + "contentHash": "UPrVPlqPRSVZaB4ADmbsQ77KXn9ORiWXyA1RP2W2+byCh3bhgT1bQz0jbeOoog9/2oTQ5wWZSDSMeb74MjezcA==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.1" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "QR1OwtwehHxSeQvZKXe+iSd+d3XZNkEcuWMFYa2i0aG1l+lR739HPicKMlTbJst3spmeekDVBUS7SeS26s4U/g==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "I+GNKGg2xCHueRd1m9PzeEW7WLbNNLznmTuEi8/vZX71HudUbx1UTwlGkiwMri7JLl8hGaIAWnA/GONhu+LOyQ==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "1Z3TAq1ytS1IBRtPXJvEUZdVsfWfeNEhBkbiOCGEl9wwAfsjP2lz3ZFDx5tq8p60/EqbS0HItG5piHuB71RjoA==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.1", + "contentHash": "t15yGf5r6vMV1rB5O6TgfXKChtCaN3niwFw44M2ImX3eZ8yzueplqMqXPCbWzoBDHJVz9fE+9LFUGCsUmS2Jgg==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "6mU/cVmmHtQiDXhnzUImxIcDL48GbTk+TsptXyJA+MIOG9LRjPoAQC/qBFB7X+UNyK86bmvGwC8t+M66wsYC8w==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "vjwG0GGcTW/PPg6KVud8F9GLWYuAV1rrw1BKAqY0oh4jcUqg15oYF1+qkGR2x2ZHM4DQnWKQ7cJgYbfncz/lYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "7KMFpTkHC/zoExs+PwP8jDCWcrK9H6L7soowT80CUx3e+nxP/AFnq0AQAW5W76z2WYbLAYCRyPfwYFG6zkvQRw==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "xrlmRCnKZJLHxyyLIqkZjNXqgxnKdZxfItrPkjI+6pkRo5lHX8YvSZlWrSI5AVwLMi4HbNWP7064hcAWeZKp5w==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "leXiwfiIkW7Gmn7cgnNcdtNAU70SjmKW3jxGj1iKHOvdn0zRWsgv/l2OJUO5zdGdiv2VRFnAsxxhDgMzofPdWg==" + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Configuration.ConfigurationManager": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "jXw9MlUu/kRfEU0WyTptAVueupqIeE3/rl0EZDMlf8pcvJnitQ8HeVEp69rZdaStXwTV72boi/Bhw8lOeO+U2w==", + "dependencies": { + "System.Security.Cryptography.ProtectedData": "6.0.0", + "System.Security.Permissions": "6.0.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "KiLYDu2k2J82Q9BJpWiuQqCkFjRBWVq4jDzKKWawVi9KWzyD0XG3cmfX0vqTQlL14Wi9EufJrbL0+KCLTbqWiQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Drawing.Common": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "NfuoKUiP2nUWwKZN6twGqXioIe1zVD0RIj2t976A+czLHr2nY454RwwXs6JU9Htc6mwqL6Dn/nEL3dpVf2jOhg==", + "dependencies": { + "Microsoft.Win32.SystemEvents": "6.0.0" + } + }, + "System.Formats.Asn1": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "T6fD00dQ3NTbPDy31m4eQUwKW84s03z0N2C8HpOklyeaDgaJPa/TexP4/SkORMSOwc7WhKifnA6Ya33AkzmafA==" + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.IdentityModel.Tokens.Jwt": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "yxGIQd3BFK7F6S62/7RdZk3C/mfwyVxvh6ngd1VYMBmbJ1YZZA9+Ku6suylVtso0FjI0wbElpJ0d27CdsyLpBQ==", + "dependencies": { + "Microsoft.IdentityModel.JsonWebTokens": "6.35.0", + "Microsoft.IdentityModel.Tokens": "6.35.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.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "SxHB3nuNrpptVk+vZ/F+7OHEpoHUIKKMl02bUmYHQr1r+glbZQxs7pRtsf4ENO29TVm2TH3AEeep2fJcy92oYw==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Memory.Data": { + "type": "Transitive", + "resolved": "1.0.2", + "contentHash": "JGkzeqgBsiZwKJZ1IxPNsDFZDhUvuEdX8L8BDC8N3KOj+6zMcNU28CNN59TpZE/VJYy9cP+5M+sbxtWJx3/xtw==", + "dependencies": { + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.6.0" + } + }, + "System.Numerics.Vectors": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yDaJ2x3mMmjdZEDB4IbezSnCsnjQ4BxinKhRAaP6kEgL6Bb6jANWphs5SzyD8imqeC/3FxgsuXT6ykkiH1uUmA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Serialization.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0", + "System.Xml.XmlDocument": "4.3.0", + "System.Xml.XmlSerializer": "4.3.0" + } + }, + "System.Private.ServiceModel": { + "type": "Transitive", + "resolved": "4.10.2", + "contentHash": "bi2/w2EDXqxno8zfbt6vHcrpGw0Pav8tEMzmJraHwJvWYJd45wcqr7gNa2IUs91j4z+BNGMooStaWS6pm2Lq0A==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "5.0.0", + "Microsoft.Extensions.ObjectPool": "5.0.10", + "System.Numerics.Vectors": "4.5.0", + "System.Reflection.DispatchProxy": "4.7.1", + "System.Security.Cryptography.Xml": "6.0.1", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.DispatchProxy": { + "type": "Transitive", + "resolved": "4.7.1", + "contentHash": "C1sMLwIG6ILQ2bmOT4gh62V6oJlyF4BlHcVMrOoor49p0Ji2tA8QAoqyMcIhAdH6OHKJ8m7BU+r4LK2CUEOKqw==" + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.Caching": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "E0e03kUp5X2k+UAoVl6efmI7uU7JRBWi5EIdlQ7cr0NpBGjHG4fWII35PgsBY9T4fJQ8E4QPsL0rKksU9gcL5A==", + "dependencies": { + "System.Configuration.ConfigurationManager": "6.0.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Wz+0KOukJGAlXjtKr+5Xpuxf8+c8739RI1C+A2BoQZT+wMCCoMDDdO8/4IRHfaVINqL78GO8dW8G2lW/e45Mcw==", + "dependencies": { + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Serialization.Xml": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nUQx/5OVgrqEba3+j7OdiofvVq9koWZAC7Z3xGI8IIViZqApWnZ5+lLcwYgTlbkobrl/Rat+Jb8GeD4WQESD2A==", + "dependencies": { + "System.IO": "4.3.0", + "System.Private.DataContractSerialization": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Serialization.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "AUADIc0LIEQe7MzC+I0cl0rAT8RrTAKFHl53yHjEUzNVIaUlhFY11vc2ebiVJzVBuOzun6F7FBA+8KAbGTTedQ==" + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.1", + "contentHash": "DVUblnRfnarrI5olEC2B/OCsJQd0anjVaObQMndHSc43efbc88/RMOlDyg/EyY0ix5ecyZMXS8zMksb5ukebZA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.1", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "WG3r7EyjUe9CMPFSs6bty5doUqT+q9pbI80hlNzo2SkPkZ4VTuZkGWjpp77JB8+uaL4DFPRdBsAY+DX3dBK92A==" + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Pkcs": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "ynmbW2GjIGg9K1wXmVIRs4IlyDolf0JXNpzFQ8JCVgwM+myUC2JeUggl2PwQig2PNVMegKmN1aAx7WPQ8tI3vA==", + "dependencies": { + "System.Formats.Asn1": "6.0.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "rp1gMNEZpvx9vP0JW0oHLxlf8oSiQgtno77Y4PLUBjSiDYoD77Y8uXHr1Ea5XG4/pIKhqAdxZ8v8OTUtqo9PeQ==" + }, + "System.Security.Cryptography.Xml": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "5e5bI28T0x73AwTsbuFP4qSRzthmU2C0Gqgg3AZ3KTxmSyA+Uhk31puA3srdaeWaacVnHhLdJywCzqOiEpbO/w==", + "dependencies": { + "System.Security.AccessControl": "6.0.0", + "System.Security.Cryptography.Pkcs": "6.0.1" + } + }, + "System.Security.Permissions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "T/uuc7AklkDoxmcJ7LGkyX1CcSviZuLCa4jg3PekfJ7SU0niF0IVTXwUiNVP9DSpzou2PpxJ+eNY2IfDM90ZCg==", + "dependencies": { + "System.Security.AccessControl": "6.0.0", + "System.Windows.Extensions": "6.0.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.ServiceModel.Http": { + "type": "Transitive", + "resolved": "4.10.2", + "contentHash": "1AhiJwPc+90GjBd/sDkT93RVuRj688ZQInXzWfd56AEjDzWieUcAUh9ppXhRuEVpT+x48D5GBYJc1VxDP4IT+Q==", + "dependencies": { + "System.Private.ServiceModel": "4.10.2", + "System.ServiceModel.Primitives": "4.10.2" + } + }, + "System.ServiceModel.Primitives": { + "type": "Transitive", + "resolved": "4.10.2", + "contentHash": "8QOguIqHtWYywBt7SubPhdICE2LClHzqOMDy0LQIui4T3QJOae7g6UR+alCW61nEufYNtO8Uss41EbXqD8hdww==", + "dependencies": { + "System.Private.ServiceModel": "4.10.2" + } + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "OP6umVGxc0Z0MvZQBVigj4/U31Pw72ITihDWP9WiWDm+q5aoe0GaJivsfYGq53o6dxH7DcXWiCTl7+0o2CGdmg==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "7.0.3", + "contentHash": "AyjhwXN1zTFeIibHimfJn6eAsZ7rTBib79JQpzg8WAuR/HKDu9JGNHTuu3nbbXQ/bgI+U4z6HtZmCHNXB1QXrQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "7.0.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.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": "6.0.0", + "contentHash": "IXoJOXIqc39AIe+CIR7koBtRGMiCt/LPM3lI+PELtDIy9XdyeSrwXFdWV9dzJ2Awl0paLWUaknLxFQ5HpHZUog==", + "dependencies": { + "System.Drawing.Common": "6.0.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lJ8AxvkX7GQxpC6GFCeBj8ThYVyQczx2+f/cWHJU8tjS7YfI6Cv6bon70jVEgs2CiFbmmM8b9j1oZVx0dSI2Ww==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "MYoTCP7EZ98RrANESW05J5ZwskKDoN0AuZ06ZflnowE50LTpbR5yRg3tHckTVm5j/m47stuGgCrCHWePyHS70Q==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XmlDocument": "4.3.0" + } + }, + "root16.sprout": { + "type": "Project", + "dependencies": { + "Microsoft.Data.SqlClient": "[5.2.0, )", + "Microsoft.Extensions.Logging": "[7.0.0, )", + "Microsoft.Extensions.Logging.Console": "[7.0.0, )", + "Microsoft.PowerPlatform.Dataverse.Client": "[1.1.16, )" + } + } + }, + "net7.0": { + "Microsoft.Data.SqlClient": { + "type": "Direct", + "requested": "[5.2.0, )", + "resolved": "5.2.0", + "contentHash": "3alfyqRN3ELRtdvU1dGtLBRNQqprr3TJ0WrUJfMISPwg1nPUN2P3Lelah68IKWuV27Ceb7ig95hWNHFTSXfxMg==", + "dependencies": { + "Azure.Identity": "1.10.3", + "Microsoft.Data.SqlClient.SNI.runtime": "5.2.0", + "Microsoft.Identity.Client": "4.56.0", + "Microsoft.IdentityModel.JsonWebTokens": "6.35.0", + "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.35.0", + "Microsoft.SqlServer.Server": "1.0.0", + "System.Configuration.ConfigurationManager": "6.0.1", + "System.Runtime.Caching": "6.0.0" + } + }, + "Azure.Core": { + "type": "Transitive", + "resolved": "1.35.0", + "contentHash": "hENcx03Jyuqv05F4RBEPbxz29UrM3Nbhnr6Wl6NQpoU9BCIbL3XLentrxDCTrH54NLS11Exxi/o8MYgT/cnKFA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "1.1.1", + "System.Diagnostics.DiagnosticSource": "6.0.1", + "System.Memory.Data": "1.0.2", + "System.Numerics.Vectors": "4.5.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "Azure.Identity": { + "type": "Transitive", + "resolved": "1.10.3", + "contentHash": "l1Xm2MWOF2Mzcwuarlw8kWQXLZk3UeB55aQXVyjj23aBfDwOZ3gu5GP2kJ6KlmZeZv2TCzw7x4L3V36iNr3gww==", + "dependencies": { + "Azure.Core": "1.35.0", + "Microsoft.Identity.Client": "4.56.0", + "Microsoft.Identity.Client.Extensions.Msal": "4.56.0", + "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" + } + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ==" + }, + "Microsoft.Data.SqlClient.SNI.runtime": { + "type": "Transitive", + "resolved": "5.2.0", + "contentHash": "po1jhvFd+8pbfvJR/puh+fkHi0GRanAdvayh/0e47yaM6CXWZ6opUjCMFuYlAnD2LcbyvQE7fPJKvogmaUcN+w==" + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Transitive", + "resolved": "3.1.8", + "contentHash": "iBIdKjKa2nR4LdknV2JMSRpJVM5TOca25EckPm6SZQT6HfH8RoHrn9m14GUAkvzE+uOziXRoAwr8YIC6ZOpyXg==", + "dependencies": { + "Microsoft.Extensions.Primitives": "3.1.8" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "3.1.8", + "contentHash": "u04q7+tgc8l6pQ5HOcr6scgapkQQHnrhpGoCaaAZd24R36/NxGsGxuhSmhHOrQx9CsBLe2CVBN/4CkLlxtnnXw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "3.1.8", + "Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.8", + "Microsoft.Extensions.Logging.Abstractions": "3.1.8", + "Microsoft.Extensions.Options": "3.1.8" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "tldQUBWt/xeH2K7/hMPPo5g8zuLc3Ro9I5d4o/XrxvxOCA2EZBtW7bCHHTc49fcBtvB8tLAb/Qsmfrq+2SJ4vA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "f34u2eaqIjNO9YLHBz8rozVZ+TcFiFs0F3r7nUJd7FRkVSxk8u4OpoK226mi49MwexHOR2ibP9MFvRUaLilcQQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "tgU4u7bZsoS9MKVRiotVMAwHtbREHr5/5zSEV+JPhg46+ox47Au84E3D2IacAaB0bk5ePNaNieTlPrfjbbRJkg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==" + }, + "Microsoft.Extensions.Http": { + "type": "Transitive", + "resolved": "3.1.8", + "contentHash": "GRkzBs2wJG6jTGqRrT8l/Sqk4MiO0yQltiekDNw/X7L2l5/gKSud/6Vcjb9b5SPtgn6lxcn8qCmfDtk2kP/cOw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.8", + "Microsoft.Extensions.Logging": "3.1.8", + "Microsoft.Extensions.Options": "3.1.8" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "Nw2muoNrOG5U5qa2ZekXwudUn2BJcD41e65zwmDHb1fQegTX66UokLWZkJRpqSSHXDOWZ5V0iqhbxOEky91atA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "7.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "kmn78+LPVMOWeITUjIlfxUPDsI0R6G0RkeAMBmQxAJ7vBJn4q2dTva7pWi65ceN5vPGjJ9q/Uae2WKgvfktJAw==" + }, + "Microsoft.Extensions.Logging.Configuration": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "FLDA0HcffKA8ycoDQLJuCNGIE42cLWPxgdQGRBaSzZrYTkMBjnf9zrr8pGT06psLq9Q+RKWmmZczQ9bCrXEBcA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "7.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", + "Microsoft.Extensions.Configuration.Binder": "7.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "7.0.0" + } + }, + "Microsoft.Extensions.Logging.Console": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "qt5n8bHLZPUfuRnFxJKW5q9ZwOTncdh96rtWzWpX3Y/064MlxzCSw2ELF5Jlwdo+Y4wK3I47NmUTFsV7Sg8rqg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging.Configuration": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0", + "System.Text.Json": "7.0.0" + } + }, + "Microsoft.Extensions.ObjectPool": { + "type": "Transitive", + "resolved": "5.0.10", + "contentHash": "pp9tbGqIhdEXL6Q1yJl+zevAJSq4BsxqhS1GXzBvEsEz9DDNu9GLNzgUy2xyFc4YjB4m4Ff2YEWTnvQvVYdkvQ==" + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "lP1yBnTTU42cKpMozuafbvNtQ7QcBjr/CcK3bYOGEMH55Fjt+iecXjT6chR7vbgCMqy3PG3aNQSZgo/EuY/9qQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "95UnxZkkFdXxF6vSrtJsMHCzkDeSMuUWGs2hDT54cX+U5eVajrCJ3qLyQRW+CtpTt5OJ8bmTvpQVHu1DLhH+cA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", + "Microsoft.Extensions.Configuration.Binder": "7.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0", + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "um1KU5kxcRp3CNuI8o/GrZtD4AIOXDk+RLsytjZ9QPok3ttLUelLKpilVPuaFT3TFjOhSibUAso0odbOaCDj3Q==" + }, + "Microsoft.Identity.Client": { + "type": "Transitive", + "resolved": "4.56.0", + "contentHash": "rr4zbidvHy9r4NvOAs5hdd964Ao2A0pAeFBJKR95u1CJAVzbd1p6tPTXUZ+5ld0cfThiVSGvz6UHwY6JjraTpA==", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "6.22.0" + } + }, + "Microsoft.Identity.Client.Extensions.Msal": { + "type": "Transitive", + "resolved": "4.56.0", + "contentHash": "H12YAzEGK55vZ+QpxUzozhW8ZZtgPDuWvgA0JbdIR9UhMUplj29JhIgE2imuH8W2Nw9D8JKygR1uxRFtpSNcrg==", + "dependencies": { + "Microsoft.Identity.Client": "4.56.0", + "System.IO.FileSystem.AccessControl": "5.0.0", + "System.Security.Cryptography.ProtectedData": "4.5.0" + } + }, + "Microsoft.IdentityModel.Abstractions": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "xuR8E4Rd96M41CnUSCiOJ2DBh+z+zQSmyrYHdYhD6K4fXBcQGVnRCFQ0efROUYpP+p0zC1BLKr0JRpVuujTZSg==" + }, + "Microsoft.IdentityModel.JsonWebTokens": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "9wxai3hKgZUb4/NjdRKfQd0QJvtXKDlvmGMYACbEC8DFaicMFCFhQFZq9ZET1kJLwZahf2lfY5Gtcpsx8zYzbg==", + "dependencies": { + "Microsoft.IdentityModel.Tokens": "6.35.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2" + } + }, + "Microsoft.IdentityModel.Logging": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "jePrSfGAmqT81JDCNSY+fxVWoGuJKt9e6eJ+vT7+quVS55nWl//jGjUQn4eFtVKt4rt5dXaleZdHRB9J9AJZ7Q==", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "6.35.0" + } + }, + "Microsoft.IdentityModel.Protocols": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "BPQhlDzdFvv1PzaUxNSk+VEPwezlDEVADIKmyxubw7IiELK18uJ06RQ9QKKkds30XI+gDu9n8j24XQ8w7fjWcg==", + "dependencies": { + "Microsoft.IdentityModel.Logging": "6.35.0", + "Microsoft.IdentityModel.Tokens": "6.35.0" + } + }, + "Microsoft.IdentityModel.Protocols.OpenIdConnect": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "LMtVqnECCCdSmyFoCOxIE5tXQqkOLrvGrL7OxHg41DIm1bpWtaCdGyVcTAfOQpJXvzND9zUKIN/lhngPkYR8vg==", + "dependencies": { + "Microsoft.IdentityModel.Protocols": "6.35.0", + "System.IdentityModel.Tokens.Jwt": "6.35.0" + } + }, + "Microsoft.IdentityModel.Tokens": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "RN7lvp7s3Boucg1NaNAbqDbxtlLj5Qeb+4uSS1TeK5FSBVM40P4DKaTKChT43sHyKfh7V0zkrMph6DdHvyA4bg==", + "dependencies": { + "Microsoft.CSharp": "4.5.0", + "Microsoft.IdentityModel.Logging": "6.35.0", + "System.Security.Cryptography.Cng": "4.5.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.PowerPlatform.Dataverse.Client": { + "type": "Transitive", + "resolved": "1.1.16", + "contentHash": "zrkb4MIwynYE+lBF1Y4ljyYWwQvXIvDgviSZ2r1TY9P9a3UmEGLWp/jJFbOt+3v4Uw4fXcL4Yed8HRfc/GOnQQ==", + "dependencies": { + "Microsoft.Extensions.Caching.Memory": "3.1.8", + "Microsoft.Extensions.DependencyInjection": "3.1.8", + "Microsoft.Extensions.Http": "3.1.8", + "Microsoft.Extensions.Logging": "3.1.8", + "Microsoft.Identity.Client": "4.56.0", + "Microsoft.Identity.Client.Extensions.Msal": "4.56.0", + "Microsoft.Rest.ClientRuntime": "2.3.24", + "Microsoft.VisualBasic": "10.3.0", + "Newtonsoft.Json": "13.0.1", + "System.Collections": "4.3.0", + "System.Configuration.ConfigurationManager": "4.7.0", + "System.Drawing.Common": "5.0.3", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Private.DataContractSerialization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.TypeExtensions": "4.7.0", + "System.Runtime.Caching": "4.7.0", + "System.Runtime.Serialization.Primitives": "4.3.0", + "System.Runtime.Serialization.Xml": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.1", + "System.Security.Cryptography.ProtectedData": "4.7.0", + "System.Security.Permissions": "5.0.0", + "System.ServiceModel.Http": "4.10.2", + "System.Text.Json": "7.0.3" + } + }, + "Microsoft.Rest.ClientRuntime": { + "type": "Transitive", + "resolved": "2.3.24", + "contentHash": "hZH7XgM3eV2jFrnq7Yf0nBD4WVXQzDrer2gEY7HMNiwio2hwDsTHO6LWuueNQAfRpNp4W7mKxcXpwXUiuVIlYw==", + "dependencies": { + "Newtonsoft.Json": "10.0.3" + } + }, + "Microsoft.SqlServer.Server": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "N4KeF3cpcm1PUHym1RmakkzfkEv3GRMyofVv40uXsQhCQeglr2OHNcUk2WOG51AKpGO8ynGpo9M/kFXSzghwug==" + }, + "Microsoft.VisualBasic": { + "type": "Transitive", + "resolved": "10.3.0", + "contentHash": "AvMDjmJHjz9bdlvxiSdEHHcWP+sZtp7zwule5ab6DaUbgoBnwCsd7nymj69vSz18ypXuEv3SI7ZUNwbIKrvtMA==" + }, + "Microsoft.Win32.SystemEvents": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "hqTM5628jSsQiv+HGpiq3WKBl2c8v1KZfby2J6Pr7pEPlK9waPdgEO6b8A/+/xn/yZ9ulv8HuqK71ONy2tg67A==" + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "7VSGO0URRKoMEAq0Sc9cRz8mb6zbyx/BZDEWhgPdzzpmFhkam3fJ1DAGWFXBI4nGlma+uPKpfuMQP5LXRnOH5g==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "0oAaTAm6e2oVH+/Zttt0cuhGaePQYKII1dY8iaqP7CvOpVKgLybKRFvQjXR2LtxXOXTVPNv14j0ot8uV+HrUmw==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "G24ibsCNi5Kbz0oXWynBoRgtGvsw5ZSVEWjv13/KiCAM8C6wz9zzcCniMeQFIkJ2tasjo2kXlvlBZhplL51kGg==" + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.1", + "contentHash": "UPrVPlqPRSVZaB4ADmbsQ77KXn9ORiWXyA1RP2W2+byCh3bhgT1bQz0jbeOoog9/2oTQ5wWZSDSMeb74MjezcA==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.1" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "QR1OwtwehHxSeQvZKXe+iSd+d3XZNkEcuWMFYa2i0aG1l+lR739HPicKMlTbJst3spmeekDVBUS7SeS26s4U/g==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "I+GNKGg2xCHueRd1m9PzeEW7WLbNNLznmTuEi8/vZX71HudUbx1UTwlGkiwMri7JLl8hGaIAWnA/GONhu+LOyQ==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "1Z3TAq1ytS1IBRtPXJvEUZdVsfWfeNEhBkbiOCGEl9wwAfsjP2lz3ZFDx5tq8p60/EqbS0HItG5piHuB71RjoA==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.1", + "contentHash": "t15yGf5r6vMV1rB5O6TgfXKChtCaN3niwFw44M2ImX3eZ8yzueplqMqXPCbWzoBDHJVz9fE+9LFUGCsUmS2Jgg==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "6mU/cVmmHtQiDXhnzUImxIcDL48GbTk+TsptXyJA+MIOG9LRjPoAQC/qBFB7X+UNyK86bmvGwC8t+M66wsYC8w==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "vjwG0GGcTW/PPg6KVud8F9GLWYuAV1rrw1BKAqY0oh4jcUqg15oYF1+qkGR2x2ZHM4DQnWKQ7cJgYbfncz/lYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "7KMFpTkHC/zoExs+PwP8jDCWcrK9H6L7soowT80CUx3e+nxP/AFnq0AQAW5W76z2WYbLAYCRyPfwYFG6zkvQRw==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "xrlmRCnKZJLHxyyLIqkZjNXqgxnKdZxfItrPkjI+6pkRo5lHX8YvSZlWrSI5AVwLMi4HbNWP7064hcAWeZKp5w==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "leXiwfiIkW7Gmn7cgnNcdtNAU70SjmKW3jxGj1iKHOvdn0zRWsgv/l2OJUO5zdGdiv2VRFnAsxxhDgMzofPdWg==" + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Configuration.ConfigurationManager": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "jXw9MlUu/kRfEU0WyTptAVueupqIeE3/rl0EZDMlf8pcvJnitQ8HeVEp69rZdaStXwTV72boi/Bhw8lOeO+U2w==", + "dependencies": { + "System.Security.Cryptography.ProtectedData": "6.0.0", + "System.Security.Permissions": "6.0.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "KiLYDu2k2J82Q9BJpWiuQqCkFjRBWVq4jDzKKWawVi9KWzyD0XG3cmfX0vqTQlL14Wi9EufJrbL0+KCLTbqWiQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Drawing.Common": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "NfuoKUiP2nUWwKZN6twGqXioIe1zVD0RIj2t976A+czLHr2nY454RwwXs6JU9Htc6mwqL6Dn/nEL3dpVf2jOhg==", + "dependencies": { + "Microsoft.Win32.SystemEvents": "6.0.0" + } + }, + "System.Formats.Asn1": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "T6fD00dQ3NTbPDy31m4eQUwKW84s03z0N2C8HpOklyeaDgaJPa/TexP4/SkORMSOwc7WhKifnA6Ya33AkzmafA==" + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.IdentityModel.Tokens.Jwt": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "yxGIQd3BFK7F6S62/7RdZk3C/mfwyVxvh6ngd1VYMBmbJ1YZZA9+Ku6suylVtso0FjI0wbElpJ0d27CdsyLpBQ==", + "dependencies": { + "Microsoft.IdentityModel.JsonWebTokens": "6.35.0", + "Microsoft.IdentityModel.Tokens": "6.35.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.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "SxHB3nuNrpptVk+vZ/F+7OHEpoHUIKKMl02bUmYHQr1r+glbZQxs7pRtsf4ENO29TVm2TH3AEeep2fJcy92oYw==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Memory.Data": { + "type": "Transitive", + "resolved": "1.0.2", + "contentHash": "JGkzeqgBsiZwKJZ1IxPNsDFZDhUvuEdX8L8BDC8N3KOj+6zMcNU28CNN59TpZE/VJYy9cP+5M+sbxtWJx3/xtw==", + "dependencies": { + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.6.0" + } + }, + "System.Numerics.Vectors": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yDaJ2x3mMmjdZEDB4IbezSnCsnjQ4BxinKhRAaP6kEgL6Bb6jANWphs5SzyD8imqeC/3FxgsuXT6ykkiH1uUmA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Serialization.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0", + "System.Xml.XmlDocument": "4.3.0", + "System.Xml.XmlSerializer": "4.3.0" + } + }, + "System.Private.ServiceModel": { + "type": "Transitive", + "resolved": "4.10.2", + "contentHash": "bi2/w2EDXqxno8zfbt6vHcrpGw0Pav8tEMzmJraHwJvWYJd45wcqr7gNa2IUs91j4z+BNGMooStaWS6pm2Lq0A==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "5.0.0", + "Microsoft.Extensions.ObjectPool": "5.0.10", + "System.Numerics.Vectors": "4.5.0", + "System.Reflection.DispatchProxy": "4.7.1", + "System.Security.Cryptography.Xml": "6.0.1", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.DispatchProxy": { + "type": "Transitive", + "resolved": "4.7.1", + "contentHash": "C1sMLwIG6ILQ2bmOT4gh62V6oJlyF4BlHcVMrOoor49p0Ji2tA8QAoqyMcIhAdH6OHKJ8m7BU+r4LK2CUEOKqw==" + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.Caching": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "E0e03kUp5X2k+UAoVl6efmI7uU7JRBWi5EIdlQ7cr0NpBGjHG4fWII35PgsBY9T4fJQ8E4QPsL0rKksU9gcL5A==", + "dependencies": { + "System.Configuration.ConfigurationManager": "6.0.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Wz+0KOukJGAlXjtKr+5Xpuxf8+c8739RI1C+A2BoQZT+wMCCoMDDdO8/4IRHfaVINqL78GO8dW8G2lW/e45Mcw==", + "dependencies": { + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Serialization.Xml": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nUQx/5OVgrqEba3+j7OdiofvVq9koWZAC7Z3xGI8IIViZqApWnZ5+lLcwYgTlbkobrl/Rat+Jb8GeD4WQESD2A==", + "dependencies": { + "System.IO": "4.3.0", + "System.Private.DataContractSerialization": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Serialization.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "AUADIc0LIEQe7MzC+I0cl0rAT8RrTAKFHl53yHjEUzNVIaUlhFY11vc2ebiVJzVBuOzun6F7FBA+8KAbGTTedQ==" + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.1", + "contentHash": "DVUblnRfnarrI5olEC2B/OCsJQd0anjVaObQMndHSc43efbc88/RMOlDyg/EyY0ix5ecyZMXS8zMksb5ukebZA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.1", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "WG3r7EyjUe9CMPFSs6bty5doUqT+q9pbI80hlNzo2SkPkZ4VTuZkGWjpp77JB8+uaL4DFPRdBsAY+DX3dBK92A==" + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Pkcs": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "ynmbW2GjIGg9K1wXmVIRs4IlyDolf0JXNpzFQ8JCVgwM+myUC2JeUggl2PwQig2PNVMegKmN1aAx7WPQ8tI3vA==", + "dependencies": { + "System.Formats.Asn1": "6.0.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "rp1gMNEZpvx9vP0JW0oHLxlf8oSiQgtno77Y4PLUBjSiDYoD77Y8uXHr1Ea5XG4/pIKhqAdxZ8v8OTUtqo9PeQ==" + }, + "System.Security.Cryptography.Xml": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "5e5bI28T0x73AwTsbuFP4qSRzthmU2C0Gqgg3AZ3KTxmSyA+Uhk31puA3srdaeWaacVnHhLdJywCzqOiEpbO/w==", + "dependencies": { + "System.Security.AccessControl": "6.0.0", + "System.Security.Cryptography.Pkcs": "6.0.1" + } + }, + "System.Security.Permissions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "T/uuc7AklkDoxmcJ7LGkyX1CcSviZuLCa4jg3PekfJ7SU0niF0IVTXwUiNVP9DSpzou2PpxJ+eNY2IfDM90ZCg==", + "dependencies": { + "System.Security.AccessControl": "6.0.0", + "System.Windows.Extensions": "6.0.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.ServiceModel.Http": { + "type": "Transitive", + "resolved": "4.10.2", + "contentHash": "1AhiJwPc+90GjBd/sDkT93RVuRj688ZQInXzWfd56AEjDzWieUcAUh9ppXhRuEVpT+x48D5GBYJc1VxDP4IT+Q==", + "dependencies": { + "System.Private.ServiceModel": "4.10.2", + "System.ServiceModel.Primitives": "4.10.2" + } + }, + "System.ServiceModel.Primitives": { + "type": "Transitive", + "resolved": "4.10.2", + "contentHash": "8QOguIqHtWYywBt7SubPhdICE2LClHzqOMDy0LQIui4T3QJOae7g6UR+alCW61nEufYNtO8Uss41EbXqD8hdww==", + "dependencies": { + "System.Private.ServiceModel": "4.10.2" + } + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "OP6umVGxc0Z0MvZQBVigj4/U31Pw72ITihDWP9WiWDm+q5aoe0GaJivsfYGq53o6dxH7DcXWiCTl7+0o2CGdmg==" + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "7.0.3", + "contentHash": "AyjhwXN1zTFeIibHimfJn6eAsZ7rTBib79JQpzg8WAuR/HKDu9JGNHTuu3nbbXQ/bgI+U4z6HtZmCHNXB1QXrQ==", + "dependencies": { + "System.Text.Encodings.Web": "7.0.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.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": "6.0.0", + "contentHash": "IXoJOXIqc39AIe+CIR7koBtRGMiCt/LPM3lI+PELtDIy9XdyeSrwXFdWV9dzJ2Awl0paLWUaknLxFQ5HpHZUog==", + "dependencies": { + "System.Drawing.Common": "6.0.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lJ8AxvkX7GQxpC6GFCeBj8ThYVyQczx2+f/cWHJU8tjS7YfI6Cv6bon70jVEgs2CiFbmmM8b9j1oZVx0dSI2Ww==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "MYoTCP7EZ98RrANESW05J5ZwskKDoN0AuZ06ZflnowE50LTpbR5yRg3tHckTVm5j/m47stuGgCrCHWePyHS70Q==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XmlDocument": "4.3.0" + } + }, + "root16.sprout": { + "type": "Project", + "dependencies": { + "Microsoft.Data.SqlClient": "[5.2.0, )", + "Microsoft.Extensions.Logging": "[7.0.0, )", + "Microsoft.Extensions.Logging.Console": "[7.0.0, )", + "Microsoft.PowerPlatform.Dataverse.Client": "[1.1.16, )" + } + } + }, "net8.0": { "Microsoft.Data.SqlClient": { "type": "Direct", diff --git a/src/Root16.Sprout/Root16.Sprout.csproj b/src/Root16.Sprout/Root16.Sprout.csproj index e31d930..353459d 100644 --- a/src/Root16.Sprout/Root16.Sprout.csproj +++ b/src/Root16.Sprout/Root16.Sprout.csproj @@ -1,7 +1,7 @@  - net8.0 + net8.0;net7.0;net6.0 enable enable https://github.com/Root16/sprout diff --git a/src/Root16.Sprout/packages.lock.json b/src/Root16.Sprout/packages.lock.json index db9dfe2..8f57c50 100644 --- a/src/Root16.Sprout/packages.lock.json +++ b/src/Root16.Sprout/packages.lock.json @@ -1,6 +1,2332 @@ { "version": 1, "dependencies": { + "net6.0": { + "Microsoft.Data.SqlClient": { + "type": "Direct", + "requested": "[5.2.0, )", + "resolved": "5.2.0", + "contentHash": "3alfyqRN3ELRtdvU1dGtLBRNQqprr3TJ0WrUJfMISPwg1nPUN2P3Lelah68IKWuV27Ceb7ig95hWNHFTSXfxMg==", + "dependencies": { + "Azure.Identity": "1.10.3", + "Microsoft.Data.SqlClient.SNI.runtime": "5.2.0", + "Microsoft.Identity.Client": "4.56.0", + "Microsoft.IdentityModel.JsonWebTokens": "6.35.0", + "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.35.0", + "Microsoft.SqlServer.Server": "1.0.0", + "System.Configuration.ConfigurationManager": "6.0.1", + "System.Runtime.Caching": "6.0.0" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Direct", + "requested": "[7.0.0, )", + "resolved": "7.0.0", + "contentHash": "Nw2muoNrOG5U5qa2ZekXwudUn2BJcD41e65zwmDHb1fQegTX66UokLWZkJRpqSSHXDOWZ5V0iqhbxOEky91atA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "7.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0" + } + }, + "Microsoft.Extensions.Logging.Console": { + "type": "Direct", + "requested": "[7.0.0, )", + "resolved": "7.0.0", + "contentHash": "qt5n8bHLZPUfuRnFxJKW5q9ZwOTncdh96rtWzWpX3Y/064MlxzCSw2ELF5Jlwdo+Y4wK3I47NmUTFsV7Sg8rqg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging.Configuration": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Json": "7.0.0" + } + }, + "Microsoft.PowerPlatform.Dataverse.Client": { + "type": "Direct", + "requested": "[1.1.16, )", + "resolved": "1.1.16", + "contentHash": "zrkb4MIwynYE+lBF1Y4ljyYWwQvXIvDgviSZ2r1TY9P9a3UmEGLWp/jJFbOt+3v4Uw4fXcL4Yed8HRfc/GOnQQ==", + "dependencies": { + "Microsoft.Extensions.Caching.Memory": "3.1.8", + "Microsoft.Extensions.DependencyInjection": "3.1.8", + "Microsoft.Extensions.Http": "3.1.8", + "Microsoft.Extensions.Logging": "3.1.8", + "Microsoft.Identity.Client": "4.56.0", + "Microsoft.Identity.Client.Extensions.Msal": "4.56.0", + "Microsoft.Rest.ClientRuntime": "2.3.24", + "Microsoft.VisualBasic": "10.3.0", + "Newtonsoft.Json": "13.0.1", + "System.Collections": "4.3.0", + "System.Configuration.ConfigurationManager": "4.7.0", + "System.Drawing.Common": "5.0.3", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Private.DataContractSerialization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.TypeExtensions": "4.7.0", + "System.Runtime.Caching": "4.7.0", + "System.Runtime.Serialization.Primitives": "4.3.0", + "System.Runtime.Serialization.Xml": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.1", + "System.Security.Cryptography.ProtectedData": "4.7.0", + "System.Security.Permissions": "5.0.0", + "System.ServiceModel.Http": "4.10.2", + "System.Text.Json": "7.0.3" + } + }, + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" + } + }, + "Azure.Core": { + "type": "Transitive", + "resolved": "1.35.0", + "contentHash": "hENcx03Jyuqv05F4RBEPbxz29UrM3Nbhnr6Wl6NQpoU9BCIbL3XLentrxDCTrH54NLS11Exxi/o8MYgT/cnKFA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "1.1.1", + "System.Diagnostics.DiagnosticSource": "6.0.1", + "System.Memory.Data": "1.0.2", + "System.Numerics.Vectors": "4.5.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "Azure.Identity": { + "type": "Transitive", + "resolved": "1.10.3", + "contentHash": "l1Xm2MWOF2Mzcwuarlw8kWQXLZk3UeB55aQXVyjj23aBfDwOZ3gu5GP2kJ6KlmZeZv2TCzw7x4L3V36iNr3gww==", + "dependencies": { + "Azure.Core": "1.35.0", + "Microsoft.Identity.Client": "4.56.0", + "Microsoft.Identity.Client.Extensions.Msal": "4.56.0", + "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" + } + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ==" + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ==" + }, + "Microsoft.Data.SqlClient.SNI.runtime": { + "type": "Transitive", + "resolved": "5.2.0", + "contentHash": "po1jhvFd+8pbfvJR/puh+fkHi0GRanAdvayh/0e47yaM6CXWZ6opUjCMFuYlAnD2LcbyvQE7fPJKvogmaUcN+w==" + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Transitive", + "resolved": "3.1.8", + "contentHash": "iBIdKjKa2nR4LdknV2JMSRpJVM5TOca25EckPm6SZQT6HfH8RoHrn9m14GUAkvzE+uOziXRoAwr8YIC6ZOpyXg==", + "dependencies": { + "Microsoft.Extensions.Primitives": "3.1.8" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "3.1.8", + "contentHash": "u04q7+tgc8l6pQ5HOcr6scgapkQQHnrhpGoCaaAZd24R36/NxGsGxuhSmhHOrQx9CsBLe2CVBN/4CkLlxtnnXw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "3.1.8", + "Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.8", + "Microsoft.Extensions.Logging.Abstractions": "3.1.8", + "Microsoft.Extensions.Options": "3.1.8" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "tldQUBWt/xeH2K7/hMPPo5g8zuLc3Ro9I5d4o/XrxvxOCA2EZBtW7bCHHTc49fcBtvB8tLAb/Qsmfrq+2SJ4vA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "f34u2eaqIjNO9YLHBz8rozVZ+TcFiFs0F3r7nUJd7FRkVSxk8u4OpoK226mi49MwexHOR2ibP9MFvRUaLilcQQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "tgU4u7bZsoS9MKVRiotVMAwHtbREHr5/5zSEV+JPhg46+ox47Au84E3D2IacAaB0bk5ePNaNieTlPrfjbbRJkg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==" + }, + "Microsoft.Extensions.Http": { + "type": "Transitive", + "resolved": "3.1.8", + "contentHash": "GRkzBs2wJG6jTGqRrT8l/Sqk4MiO0yQltiekDNw/X7L2l5/gKSud/6Vcjb9b5SPtgn6lxcn8qCmfDtk2kP/cOw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.8", + "Microsoft.Extensions.Logging": "3.1.8", + "Microsoft.Extensions.Options": "3.1.8" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "kmn78+LPVMOWeITUjIlfxUPDsI0R6G0RkeAMBmQxAJ7vBJn4q2dTva7pWi65ceN5vPGjJ9q/Uae2WKgvfktJAw==" + }, + "Microsoft.Extensions.Logging.Configuration": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "FLDA0HcffKA8ycoDQLJuCNGIE42cLWPxgdQGRBaSzZrYTkMBjnf9zrr8pGT06psLq9Q+RKWmmZczQ9bCrXEBcA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "7.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", + "Microsoft.Extensions.Configuration.Binder": "7.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "7.0.0" + } + }, + "Microsoft.Extensions.ObjectPool": { + "type": "Transitive", + "resolved": "5.0.10", + "contentHash": "pp9tbGqIhdEXL6Q1yJl+zevAJSq4BsxqhS1GXzBvEsEz9DDNu9GLNzgUy2xyFc4YjB4m4Ff2YEWTnvQvVYdkvQ==" + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "lP1yBnTTU42cKpMozuafbvNtQ7QcBjr/CcK3bYOGEMH55Fjt+iecXjT6chR7vbgCMqy3PG3aNQSZgo/EuY/9qQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "95UnxZkkFdXxF6vSrtJsMHCzkDeSMuUWGs2hDT54cX+U5eVajrCJ3qLyQRW+CtpTt5OJ8bmTvpQVHu1DLhH+cA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", + "Microsoft.Extensions.Configuration.Binder": "7.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0", + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "um1KU5kxcRp3CNuI8o/GrZtD4AIOXDk+RLsytjZ9QPok3ttLUelLKpilVPuaFT3TFjOhSibUAso0odbOaCDj3Q==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.Identity.Client": { + "type": "Transitive", + "resolved": "4.56.0", + "contentHash": "rr4zbidvHy9r4NvOAs5hdd964Ao2A0pAeFBJKR95u1CJAVzbd1p6tPTXUZ+5ld0cfThiVSGvz6UHwY6JjraTpA==", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "6.22.0" + } + }, + "Microsoft.Identity.Client.Extensions.Msal": { + "type": "Transitive", + "resolved": "4.56.0", + "contentHash": "H12YAzEGK55vZ+QpxUzozhW8ZZtgPDuWvgA0JbdIR9UhMUplj29JhIgE2imuH8W2Nw9D8JKygR1uxRFtpSNcrg==", + "dependencies": { + "Microsoft.Identity.Client": "4.56.0", + "System.IO.FileSystem.AccessControl": "5.0.0", + "System.Security.Cryptography.ProtectedData": "4.5.0" + } + }, + "Microsoft.IdentityModel.Abstractions": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "xuR8E4Rd96M41CnUSCiOJ2DBh+z+zQSmyrYHdYhD6K4fXBcQGVnRCFQ0efROUYpP+p0zC1BLKr0JRpVuujTZSg==" + }, + "Microsoft.IdentityModel.JsonWebTokens": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "9wxai3hKgZUb4/NjdRKfQd0QJvtXKDlvmGMYACbEC8DFaicMFCFhQFZq9ZET1kJLwZahf2lfY5Gtcpsx8zYzbg==", + "dependencies": { + "Microsoft.IdentityModel.Tokens": "6.35.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2" + } + }, + "Microsoft.IdentityModel.Logging": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "jePrSfGAmqT81JDCNSY+fxVWoGuJKt9e6eJ+vT7+quVS55nWl//jGjUQn4eFtVKt4rt5dXaleZdHRB9J9AJZ7Q==", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "6.35.0" + } + }, + "Microsoft.IdentityModel.Protocols": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "BPQhlDzdFvv1PzaUxNSk+VEPwezlDEVADIKmyxubw7IiELK18uJ06RQ9QKKkds30XI+gDu9n8j24XQ8w7fjWcg==", + "dependencies": { + "Microsoft.IdentityModel.Logging": "6.35.0", + "Microsoft.IdentityModel.Tokens": "6.35.0" + } + }, + "Microsoft.IdentityModel.Protocols.OpenIdConnect": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "LMtVqnECCCdSmyFoCOxIE5tXQqkOLrvGrL7OxHg41DIm1bpWtaCdGyVcTAfOQpJXvzND9zUKIN/lhngPkYR8vg==", + "dependencies": { + "Microsoft.IdentityModel.Protocols": "6.35.0", + "System.IdentityModel.Tokens.Jwt": "6.35.0" + } + }, + "Microsoft.IdentityModel.Tokens": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "RN7lvp7s3Boucg1NaNAbqDbxtlLj5Qeb+4uSS1TeK5FSBVM40P4DKaTKChT43sHyKfh7V0zkrMph6DdHvyA4bg==", + "dependencies": { + "Microsoft.CSharp": "4.5.0", + "Microsoft.IdentityModel.Logging": "6.35.0", + "System.Security.Cryptography.Cng": "4.5.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.Rest.ClientRuntime": { + "type": "Transitive", + "resolved": "2.3.24", + "contentHash": "hZH7XgM3eV2jFrnq7Yf0nBD4WVXQzDrer2gEY7HMNiwio2hwDsTHO6LWuueNQAfRpNp4W7mKxcXpwXUiuVIlYw==", + "dependencies": { + "Newtonsoft.Json": "10.0.3" + } + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, + "Microsoft.SqlServer.Server": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "N4KeF3cpcm1PUHym1RmakkzfkEv3GRMyofVv40uXsQhCQeglr2OHNcUk2WOG51AKpGO8ynGpo9M/kFXSzghwug==" + }, + "Microsoft.VisualBasic": { + "type": "Transitive", + "resolved": "10.3.0", + "contentHash": "AvMDjmJHjz9bdlvxiSdEHHcWP+sZtp7zwule5ab6DaUbgoBnwCsd7nymj69vSz18ypXuEv3SI7ZUNwbIKrvtMA==" + }, + "Microsoft.Win32.SystemEvents": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "hqTM5628jSsQiv+HGpiq3WKBl2c8v1KZfby2J6Pr7pEPlK9waPdgEO6b8A/+/xn/yZ9ulv8HuqK71ONy2tg67A==" + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "7VSGO0URRKoMEAq0Sc9cRz8mb6zbyx/BZDEWhgPdzzpmFhkam3fJ1DAGWFXBI4nGlma+uPKpfuMQP5LXRnOH5g==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "0oAaTAm6e2oVH+/Zttt0cuhGaePQYKII1dY8iaqP7CvOpVKgLybKRFvQjXR2LtxXOXTVPNv14j0ot8uV+HrUmw==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "G24ibsCNi5Kbz0oXWynBoRgtGvsw5ZSVEWjv13/KiCAM8C6wz9zzcCniMeQFIkJ2tasjo2kXlvlBZhplL51kGg==" + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.1", + "contentHash": "UPrVPlqPRSVZaB4ADmbsQ77KXn9ORiWXyA1RP2W2+byCh3bhgT1bQz0jbeOoog9/2oTQ5wWZSDSMeb74MjezcA==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.1" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "QR1OwtwehHxSeQvZKXe+iSd+d3XZNkEcuWMFYa2i0aG1l+lR739HPicKMlTbJst3spmeekDVBUS7SeS26s4U/g==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "I+GNKGg2xCHueRd1m9PzeEW7WLbNNLznmTuEi8/vZX71HudUbx1UTwlGkiwMri7JLl8hGaIAWnA/GONhu+LOyQ==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "1Z3TAq1ytS1IBRtPXJvEUZdVsfWfeNEhBkbiOCGEl9wwAfsjP2lz3ZFDx5tq8p60/EqbS0HItG5piHuB71RjoA==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.1", + "contentHash": "t15yGf5r6vMV1rB5O6TgfXKChtCaN3niwFw44M2ImX3eZ8yzueplqMqXPCbWzoBDHJVz9fE+9LFUGCsUmS2Jgg==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "6mU/cVmmHtQiDXhnzUImxIcDL48GbTk+TsptXyJA+MIOG9LRjPoAQC/qBFB7X+UNyK86bmvGwC8t+M66wsYC8w==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "vjwG0GGcTW/PPg6KVud8F9GLWYuAV1rrw1BKAqY0oh4jcUqg15oYF1+qkGR2x2ZHM4DQnWKQ7cJgYbfncz/lYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "7KMFpTkHC/zoExs+PwP8jDCWcrK9H6L7soowT80CUx3e+nxP/AFnq0AQAW5W76z2WYbLAYCRyPfwYFG6zkvQRw==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "xrlmRCnKZJLHxyyLIqkZjNXqgxnKdZxfItrPkjI+6pkRo5lHX8YvSZlWrSI5AVwLMi4HbNWP7064hcAWeZKp5w==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "leXiwfiIkW7Gmn7cgnNcdtNAU70SjmKW3jxGj1iKHOvdn0zRWsgv/l2OJUO5zdGdiv2VRFnAsxxhDgMzofPdWg==" + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Configuration.ConfigurationManager": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "jXw9MlUu/kRfEU0WyTptAVueupqIeE3/rl0EZDMlf8pcvJnitQ8HeVEp69rZdaStXwTV72boi/Bhw8lOeO+U2w==", + "dependencies": { + "System.Security.Cryptography.ProtectedData": "6.0.0", + "System.Security.Permissions": "6.0.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "KiLYDu2k2J82Q9BJpWiuQqCkFjRBWVq4jDzKKWawVi9KWzyD0XG3cmfX0vqTQlL14Wi9EufJrbL0+KCLTbqWiQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Drawing.Common": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "NfuoKUiP2nUWwKZN6twGqXioIe1zVD0RIj2t976A+czLHr2nY454RwwXs6JU9Htc6mwqL6Dn/nEL3dpVf2jOhg==", + "dependencies": { + "Microsoft.Win32.SystemEvents": "6.0.0" + } + }, + "System.Formats.Asn1": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "T6fD00dQ3NTbPDy31m4eQUwKW84s03z0N2C8HpOklyeaDgaJPa/TexP4/SkORMSOwc7WhKifnA6Ya33AkzmafA==" + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.IdentityModel.Tokens.Jwt": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "yxGIQd3BFK7F6S62/7RdZk3C/mfwyVxvh6ngd1VYMBmbJ1YZZA9+Ku6suylVtso0FjI0wbElpJ0d27CdsyLpBQ==", + "dependencies": { + "Microsoft.IdentityModel.JsonWebTokens": "6.35.0", + "Microsoft.IdentityModel.Tokens": "6.35.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.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "SxHB3nuNrpptVk+vZ/F+7OHEpoHUIKKMl02bUmYHQr1r+glbZQxs7pRtsf4ENO29TVm2TH3AEeep2fJcy92oYw==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Memory.Data": { + "type": "Transitive", + "resolved": "1.0.2", + "contentHash": "JGkzeqgBsiZwKJZ1IxPNsDFZDhUvuEdX8L8BDC8N3KOj+6zMcNU28CNN59TpZE/VJYy9cP+5M+sbxtWJx3/xtw==", + "dependencies": { + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.6.0" + } + }, + "System.Numerics.Vectors": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yDaJ2x3mMmjdZEDB4IbezSnCsnjQ4BxinKhRAaP6kEgL6Bb6jANWphs5SzyD8imqeC/3FxgsuXT6ykkiH1uUmA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Serialization.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0", + "System.Xml.XmlDocument": "4.3.0", + "System.Xml.XmlSerializer": "4.3.0" + } + }, + "System.Private.ServiceModel": { + "type": "Transitive", + "resolved": "4.10.2", + "contentHash": "bi2/w2EDXqxno8zfbt6vHcrpGw0Pav8tEMzmJraHwJvWYJd45wcqr7gNa2IUs91j4z+BNGMooStaWS6pm2Lq0A==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "5.0.0", + "Microsoft.Extensions.ObjectPool": "5.0.10", + "System.Numerics.Vectors": "4.5.0", + "System.Reflection.DispatchProxy": "4.7.1", + "System.Security.Cryptography.Xml": "6.0.1", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.DispatchProxy": { + "type": "Transitive", + "resolved": "4.7.1", + "contentHash": "C1sMLwIG6ILQ2bmOT4gh62V6oJlyF4BlHcVMrOoor49p0Ji2tA8QAoqyMcIhAdH6OHKJ8m7BU+r4LK2CUEOKqw==" + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.Caching": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "E0e03kUp5X2k+UAoVl6efmI7uU7JRBWi5EIdlQ7cr0NpBGjHG4fWII35PgsBY9T4fJQ8E4QPsL0rKksU9gcL5A==", + "dependencies": { + "System.Configuration.ConfigurationManager": "6.0.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Wz+0KOukJGAlXjtKr+5Xpuxf8+c8739RI1C+A2BoQZT+wMCCoMDDdO8/4IRHfaVINqL78GO8dW8G2lW/e45Mcw==", + "dependencies": { + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Serialization.Xml": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nUQx/5OVgrqEba3+j7OdiofvVq9koWZAC7Z3xGI8IIViZqApWnZ5+lLcwYgTlbkobrl/Rat+Jb8GeD4WQESD2A==", + "dependencies": { + "System.IO": "4.3.0", + "System.Private.DataContractSerialization": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Serialization.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "AUADIc0LIEQe7MzC+I0cl0rAT8RrTAKFHl53yHjEUzNVIaUlhFY11vc2ebiVJzVBuOzun6F7FBA+8KAbGTTedQ==" + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.1", + "contentHash": "DVUblnRfnarrI5olEC2B/OCsJQd0anjVaObQMndHSc43efbc88/RMOlDyg/EyY0ix5ecyZMXS8zMksb5ukebZA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.1", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "WG3r7EyjUe9CMPFSs6bty5doUqT+q9pbI80hlNzo2SkPkZ4VTuZkGWjpp77JB8+uaL4DFPRdBsAY+DX3dBK92A==" + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Pkcs": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "ynmbW2GjIGg9K1wXmVIRs4IlyDolf0JXNpzFQ8JCVgwM+myUC2JeUggl2PwQig2PNVMegKmN1aAx7WPQ8tI3vA==", + "dependencies": { + "System.Formats.Asn1": "6.0.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "rp1gMNEZpvx9vP0JW0oHLxlf8oSiQgtno77Y4PLUBjSiDYoD77Y8uXHr1Ea5XG4/pIKhqAdxZ8v8OTUtqo9PeQ==" + }, + "System.Security.Cryptography.Xml": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "5e5bI28T0x73AwTsbuFP4qSRzthmU2C0Gqgg3AZ3KTxmSyA+Uhk31puA3srdaeWaacVnHhLdJywCzqOiEpbO/w==", + "dependencies": { + "System.Security.AccessControl": "6.0.0", + "System.Security.Cryptography.Pkcs": "6.0.1" + } + }, + "System.Security.Permissions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "T/uuc7AklkDoxmcJ7LGkyX1CcSviZuLCa4jg3PekfJ7SU0niF0IVTXwUiNVP9DSpzou2PpxJ+eNY2IfDM90ZCg==", + "dependencies": { + "System.Security.AccessControl": "6.0.0", + "System.Windows.Extensions": "6.0.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.ServiceModel.Http": { + "type": "Transitive", + "resolved": "4.10.2", + "contentHash": "1AhiJwPc+90GjBd/sDkT93RVuRj688ZQInXzWfd56AEjDzWieUcAUh9ppXhRuEVpT+x48D5GBYJc1VxDP4IT+Q==", + "dependencies": { + "System.Private.ServiceModel": "4.10.2", + "System.ServiceModel.Primitives": "4.10.2" + } + }, + "System.ServiceModel.Primitives": { + "type": "Transitive", + "resolved": "4.10.2", + "contentHash": "8QOguIqHtWYywBt7SubPhdICE2LClHzqOMDy0LQIui4T3QJOae7g6UR+alCW61nEufYNtO8Uss41EbXqD8hdww==", + "dependencies": { + "System.Private.ServiceModel": "4.10.2" + } + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "OP6umVGxc0Z0MvZQBVigj4/U31Pw72ITihDWP9WiWDm+q5aoe0GaJivsfYGq53o6dxH7DcXWiCTl7+0o2CGdmg==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "7.0.3", + "contentHash": "AyjhwXN1zTFeIibHimfJn6eAsZ7rTBib79JQpzg8WAuR/HKDu9JGNHTuu3nbbXQ/bgI+U4z6HtZmCHNXB1QXrQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "7.0.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.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": "6.0.0", + "contentHash": "IXoJOXIqc39AIe+CIR7koBtRGMiCt/LPM3lI+PELtDIy9XdyeSrwXFdWV9dzJ2Awl0paLWUaknLxFQ5HpHZUog==", + "dependencies": { + "System.Drawing.Common": "6.0.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lJ8AxvkX7GQxpC6GFCeBj8ThYVyQczx2+f/cWHJU8tjS7YfI6Cv6bon70jVEgs2CiFbmmM8b9j1oZVx0dSI2Ww==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "MYoTCP7EZ98RrANESW05J5ZwskKDoN0AuZ06ZflnowE50LTpbR5yRg3tHckTVm5j/m47stuGgCrCHWePyHS70Q==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XmlDocument": "4.3.0" + } + } + }, + "net7.0": { + "Microsoft.Data.SqlClient": { + "type": "Direct", + "requested": "[5.2.0, )", + "resolved": "5.2.0", + "contentHash": "3alfyqRN3ELRtdvU1dGtLBRNQqprr3TJ0WrUJfMISPwg1nPUN2P3Lelah68IKWuV27Ceb7ig95hWNHFTSXfxMg==", + "dependencies": { + "Azure.Identity": "1.10.3", + "Microsoft.Data.SqlClient.SNI.runtime": "5.2.0", + "Microsoft.Identity.Client": "4.56.0", + "Microsoft.IdentityModel.JsonWebTokens": "6.35.0", + "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.35.0", + "Microsoft.SqlServer.Server": "1.0.0", + "System.Configuration.ConfigurationManager": "6.0.1", + "System.Runtime.Caching": "6.0.0" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Direct", + "requested": "[7.0.0, )", + "resolved": "7.0.0", + "contentHash": "Nw2muoNrOG5U5qa2ZekXwudUn2BJcD41e65zwmDHb1fQegTX66UokLWZkJRpqSSHXDOWZ5V0iqhbxOEky91atA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "7.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0" + } + }, + "Microsoft.Extensions.Logging.Console": { + "type": "Direct", + "requested": "[7.0.0, )", + "resolved": "7.0.0", + "contentHash": "qt5n8bHLZPUfuRnFxJKW5q9ZwOTncdh96rtWzWpX3Y/064MlxzCSw2ELF5Jlwdo+Y4wK3I47NmUTFsV7Sg8rqg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging.Configuration": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0", + "System.Text.Json": "7.0.0" + } + }, + "Microsoft.PowerPlatform.Dataverse.Client": { + "type": "Direct", + "requested": "[1.1.16, )", + "resolved": "1.1.16", + "contentHash": "zrkb4MIwynYE+lBF1Y4ljyYWwQvXIvDgviSZ2r1TY9P9a3UmEGLWp/jJFbOt+3v4Uw4fXcL4Yed8HRfc/GOnQQ==", + "dependencies": { + "Microsoft.Extensions.Caching.Memory": "3.1.8", + "Microsoft.Extensions.DependencyInjection": "3.1.8", + "Microsoft.Extensions.Http": "3.1.8", + "Microsoft.Extensions.Logging": "3.1.8", + "Microsoft.Identity.Client": "4.56.0", + "Microsoft.Identity.Client.Extensions.Msal": "4.56.0", + "Microsoft.Rest.ClientRuntime": "2.3.24", + "Microsoft.VisualBasic": "10.3.0", + "Newtonsoft.Json": "13.0.1", + "System.Collections": "4.3.0", + "System.Configuration.ConfigurationManager": "4.7.0", + "System.Drawing.Common": "5.0.3", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Private.DataContractSerialization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.TypeExtensions": "4.7.0", + "System.Runtime.Caching": "4.7.0", + "System.Runtime.Serialization.Primitives": "4.3.0", + "System.Runtime.Serialization.Xml": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.1", + "System.Security.Cryptography.ProtectedData": "4.7.0", + "System.Security.Permissions": "5.0.0", + "System.ServiceModel.Http": "4.10.2", + "System.Text.Json": "7.0.3" + } + }, + "Microsoft.SourceLink.GitHub": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==", + "dependencies": { + "Microsoft.Build.Tasks.Git": "8.0.0", + "Microsoft.SourceLink.Common": "8.0.0" + } + }, + "Azure.Core": { + "type": "Transitive", + "resolved": "1.35.0", + "contentHash": "hENcx03Jyuqv05F4RBEPbxz29UrM3Nbhnr6Wl6NQpoU9BCIbL3XLentrxDCTrH54NLS11Exxi/o8MYgT/cnKFA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "1.1.1", + "System.Diagnostics.DiagnosticSource": "6.0.1", + "System.Memory.Data": "1.0.2", + "System.Numerics.Vectors": "4.5.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "Azure.Identity": { + "type": "Transitive", + "resolved": "1.10.3", + "contentHash": "l1Xm2MWOF2Mzcwuarlw8kWQXLZk3UeB55aQXVyjj23aBfDwOZ3gu5GP2kJ6KlmZeZv2TCzw7x4L3V36iNr3gww==", + "dependencies": { + "Azure.Core": "1.35.0", + "Microsoft.Identity.Client": "4.56.0", + "Microsoft.Identity.Client.Extensions.Msal": "4.56.0", + "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" + } + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ==" + }, + "Microsoft.Build.Tasks.Git": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ==" + }, + "Microsoft.Data.SqlClient.SNI.runtime": { + "type": "Transitive", + "resolved": "5.2.0", + "contentHash": "po1jhvFd+8pbfvJR/puh+fkHi0GRanAdvayh/0e47yaM6CXWZ6opUjCMFuYlAnD2LcbyvQE7fPJKvogmaUcN+w==" + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Transitive", + "resolved": "3.1.8", + "contentHash": "iBIdKjKa2nR4LdknV2JMSRpJVM5TOca25EckPm6SZQT6HfH8RoHrn9m14GUAkvzE+uOziXRoAwr8YIC6ZOpyXg==", + "dependencies": { + "Microsoft.Extensions.Primitives": "3.1.8" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "3.1.8", + "contentHash": "u04q7+tgc8l6pQ5HOcr6scgapkQQHnrhpGoCaaAZd24R36/NxGsGxuhSmhHOrQx9CsBLe2CVBN/4CkLlxtnnXw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "3.1.8", + "Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.8", + "Microsoft.Extensions.Logging.Abstractions": "3.1.8", + "Microsoft.Extensions.Options": "3.1.8" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "tldQUBWt/xeH2K7/hMPPo5g8zuLc3Ro9I5d4o/XrxvxOCA2EZBtW7bCHHTc49fcBtvB8tLAb/Qsmfrq+2SJ4vA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "f34u2eaqIjNO9YLHBz8rozVZ+TcFiFs0F3r7nUJd7FRkVSxk8u4OpoK226mi49MwexHOR2ibP9MFvRUaLilcQQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "tgU4u7bZsoS9MKVRiotVMAwHtbREHr5/5zSEV+JPhg46+ox47Au84E3D2IacAaB0bk5ePNaNieTlPrfjbbRJkg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==" + }, + "Microsoft.Extensions.Http": { + "type": "Transitive", + "resolved": "3.1.8", + "contentHash": "GRkzBs2wJG6jTGqRrT8l/Sqk4MiO0yQltiekDNw/X7L2l5/gKSud/6Vcjb9b5SPtgn6lxcn8qCmfDtk2kP/cOw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.8", + "Microsoft.Extensions.Logging": "3.1.8", + "Microsoft.Extensions.Options": "3.1.8" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "kmn78+LPVMOWeITUjIlfxUPDsI0R6G0RkeAMBmQxAJ7vBJn4q2dTva7pWi65ceN5vPGjJ9q/Uae2WKgvfktJAw==" + }, + "Microsoft.Extensions.Logging.Configuration": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "FLDA0HcffKA8ycoDQLJuCNGIE42cLWPxgdQGRBaSzZrYTkMBjnf9zrr8pGT06psLq9Q+RKWmmZczQ9bCrXEBcA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "7.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", + "Microsoft.Extensions.Configuration.Binder": "7.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Logging": "7.0.0", + "Microsoft.Extensions.Logging.Abstractions": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "7.0.0" + } + }, + "Microsoft.Extensions.ObjectPool": { + "type": "Transitive", + "resolved": "5.0.10", + "contentHash": "pp9tbGqIhdEXL6Q1yJl+zevAJSq4BsxqhS1GXzBvEsEz9DDNu9GLNzgUy2xyFc4YjB4m4Ff2YEWTnvQvVYdkvQ==" + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "lP1yBnTTU42cKpMozuafbvNtQ7QcBjr/CcK3bYOGEMH55Fjt+iecXjT6chR7vbgCMqy3PG3aNQSZgo/EuY/9qQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "95UnxZkkFdXxF6vSrtJsMHCzkDeSMuUWGs2hDT54cX+U5eVajrCJ3qLyQRW+CtpTt5OJ8bmTvpQVHu1DLhH+cA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "7.0.0", + "Microsoft.Extensions.Configuration.Binder": "7.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", + "Microsoft.Extensions.Options": "7.0.0", + "Microsoft.Extensions.Primitives": "7.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "um1KU5kxcRp3CNuI8o/GrZtD4AIOXDk+RLsytjZ9QPok3ttLUelLKpilVPuaFT3TFjOhSibUAso0odbOaCDj3Q==" + }, + "Microsoft.Identity.Client": { + "type": "Transitive", + "resolved": "4.56.0", + "contentHash": "rr4zbidvHy9r4NvOAs5hdd964Ao2A0pAeFBJKR95u1CJAVzbd1p6tPTXUZ+5ld0cfThiVSGvz6UHwY6JjraTpA==", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "6.22.0" + } + }, + "Microsoft.Identity.Client.Extensions.Msal": { + "type": "Transitive", + "resolved": "4.56.0", + "contentHash": "H12YAzEGK55vZ+QpxUzozhW8ZZtgPDuWvgA0JbdIR9UhMUplj29JhIgE2imuH8W2Nw9D8JKygR1uxRFtpSNcrg==", + "dependencies": { + "Microsoft.Identity.Client": "4.56.0", + "System.IO.FileSystem.AccessControl": "5.0.0", + "System.Security.Cryptography.ProtectedData": "4.5.0" + } + }, + "Microsoft.IdentityModel.Abstractions": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "xuR8E4Rd96M41CnUSCiOJ2DBh+z+zQSmyrYHdYhD6K4fXBcQGVnRCFQ0efROUYpP+p0zC1BLKr0JRpVuujTZSg==" + }, + "Microsoft.IdentityModel.JsonWebTokens": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "9wxai3hKgZUb4/NjdRKfQd0QJvtXKDlvmGMYACbEC8DFaicMFCFhQFZq9ZET1kJLwZahf2lfY5Gtcpsx8zYzbg==", + "dependencies": { + "Microsoft.IdentityModel.Tokens": "6.35.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2" + } + }, + "Microsoft.IdentityModel.Logging": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "jePrSfGAmqT81JDCNSY+fxVWoGuJKt9e6eJ+vT7+quVS55nWl//jGjUQn4eFtVKt4rt5dXaleZdHRB9J9AJZ7Q==", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "6.35.0" + } + }, + "Microsoft.IdentityModel.Protocols": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "BPQhlDzdFvv1PzaUxNSk+VEPwezlDEVADIKmyxubw7IiELK18uJ06RQ9QKKkds30XI+gDu9n8j24XQ8w7fjWcg==", + "dependencies": { + "Microsoft.IdentityModel.Logging": "6.35.0", + "Microsoft.IdentityModel.Tokens": "6.35.0" + } + }, + "Microsoft.IdentityModel.Protocols.OpenIdConnect": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "LMtVqnECCCdSmyFoCOxIE5tXQqkOLrvGrL7OxHg41DIm1bpWtaCdGyVcTAfOQpJXvzND9zUKIN/lhngPkYR8vg==", + "dependencies": { + "Microsoft.IdentityModel.Protocols": "6.35.0", + "System.IdentityModel.Tokens.Jwt": "6.35.0" + } + }, + "Microsoft.IdentityModel.Tokens": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "RN7lvp7s3Boucg1NaNAbqDbxtlLj5Qeb+4uSS1TeK5FSBVM40P4DKaTKChT43sHyKfh7V0zkrMph6DdHvyA4bg==", + "dependencies": { + "Microsoft.CSharp": "4.5.0", + "Microsoft.IdentityModel.Logging": "6.35.0", + "System.Security.Cryptography.Cng": "4.5.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.Rest.ClientRuntime": { + "type": "Transitive", + "resolved": "2.3.24", + "contentHash": "hZH7XgM3eV2jFrnq7Yf0nBD4WVXQzDrer2gEY7HMNiwio2hwDsTHO6LWuueNQAfRpNp4W7mKxcXpwXUiuVIlYw==", + "dependencies": { + "Newtonsoft.Json": "10.0.3" + } + }, + "Microsoft.SourceLink.Common": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw==" + }, + "Microsoft.SqlServer.Server": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "N4KeF3cpcm1PUHym1RmakkzfkEv3GRMyofVv40uXsQhCQeglr2OHNcUk2WOG51AKpGO8ynGpo9M/kFXSzghwug==" + }, + "Microsoft.VisualBasic": { + "type": "Transitive", + "resolved": "10.3.0", + "contentHash": "AvMDjmJHjz9bdlvxiSdEHHcWP+sZtp7zwule5ab6DaUbgoBnwCsd7nymj69vSz18ypXuEv3SI7ZUNwbIKrvtMA==" + }, + "Microsoft.Win32.SystemEvents": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "hqTM5628jSsQiv+HGpiq3WKBl2c8v1KZfby2J6Pr7pEPlK9waPdgEO6b8A/+/xn/yZ9ulv8HuqK71ONy2tg67A==" + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "7VSGO0URRKoMEAq0Sc9cRz8mb6zbyx/BZDEWhgPdzzpmFhkam3fJ1DAGWFXBI4nGlma+uPKpfuMQP5LXRnOH5g==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "0oAaTAm6e2oVH+/Zttt0cuhGaePQYKII1dY8iaqP7CvOpVKgLybKRFvQjXR2LtxXOXTVPNv14j0ot8uV+HrUmw==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "G24ibsCNi5Kbz0oXWynBoRgtGvsw5ZSVEWjv13/KiCAM8C6wz9zzcCniMeQFIkJ2tasjo2kXlvlBZhplL51kGg==" + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.1", + "contentHash": "UPrVPlqPRSVZaB4ADmbsQ77KXn9ORiWXyA1RP2W2+byCh3bhgT1bQz0jbeOoog9/2oTQ5wWZSDSMeb74MjezcA==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.1" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "QR1OwtwehHxSeQvZKXe+iSd+d3XZNkEcuWMFYa2i0aG1l+lR739HPicKMlTbJst3spmeekDVBUS7SeS26s4U/g==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "I+GNKGg2xCHueRd1m9PzeEW7WLbNNLznmTuEi8/vZX71HudUbx1UTwlGkiwMri7JLl8hGaIAWnA/GONhu+LOyQ==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "1Z3TAq1ytS1IBRtPXJvEUZdVsfWfeNEhBkbiOCGEl9wwAfsjP2lz3ZFDx5tq8p60/EqbS0HItG5piHuB71RjoA==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.1", + "contentHash": "t15yGf5r6vMV1rB5O6TgfXKChtCaN3niwFw44M2ImX3eZ8yzueplqMqXPCbWzoBDHJVz9fE+9LFUGCsUmS2Jgg==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "6mU/cVmmHtQiDXhnzUImxIcDL48GbTk+TsptXyJA+MIOG9LRjPoAQC/qBFB7X+UNyK86bmvGwC8t+M66wsYC8w==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "vjwG0GGcTW/PPg6KVud8F9GLWYuAV1rrw1BKAqY0oh4jcUqg15oYF1+qkGR2x2ZHM4DQnWKQ7cJgYbfncz/lYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "7KMFpTkHC/zoExs+PwP8jDCWcrK9H6L7soowT80CUx3e+nxP/AFnq0AQAW5W76z2WYbLAYCRyPfwYFG6zkvQRw==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "xrlmRCnKZJLHxyyLIqkZjNXqgxnKdZxfItrPkjI+6pkRo5lHX8YvSZlWrSI5AVwLMi4HbNWP7064hcAWeZKp5w==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "leXiwfiIkW7Gmn7cgnNcdtNAU70SjmKW3jxGj1iKHOvdn0zRWsgv/l2OJUO5zdGdiv2VRFnAsxxhDgMzofPdWg==" + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Configuration.ConfigurationManager": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "jXw9MlUu/kRfEU0WyTptAVueupqIeE3/rl0EZDMlf8pcvJnitQ8HeVEp69rZdaStXwTV72boi/Bhw8lOeO+U2w==", + "dependencies": { + "System.Security.Cryptography.ProtectedData": "6.0.0", + "System.Security.Permissions": "6.0.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "KiLYDu2k2J82Q9BJpWiuQqCkFjRBWVq4jDzKKWawVi9KWzyD0XG3cmfX0vqTQlL14Wi9EufJrbL0+KCLTbqWiQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Drawing.Common": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "NfuoKUiP2nUWwKZN6twGqXioIe1zVD0RIj2t976A+czLHr2nY454RwwXs6JU9Htc6mwqL6Dn/nEL3dpVf2jOhg==", + "dependencies": { + "Microsoft.Win32.SystemEvents": "6.0.0" + } + }, + "System.Formats.Asn1": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "T6fD00dQ3NTbPDy31m4eQUwKW84s03z0N2C8HpOklyeaDgaJPa/TexP4/SkORMSOwc7WhKifnA6Ya33AkzmafA==" + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.IdentityModel.Tokens.Jwt": { + "type": "Transitive", + "resolved": "6.35.0", + "contentHash": "yxGIQd3BFK7F6S62/7RdZk3C/mfwyVxvh6ngd1VYMBmbJ1YZZA9+Ku6suylVtso0FjI0wbElpJ0d27CdsyLpBQ==", + "dependencies": { + "Microsoft.IdentityModel.JsonWebTokens": "6.35.0", + "Microsoft.IdentityModel.Tokens": "6.35.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.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "SxHB3nuNrpptVk+vZ/F+7OHEpoHUIKKMl02bUmYHQr1r+glbZQxs7pRtsf4ENO29TVm2TH3AEeep2fJcy92oYw==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Memory.Data": { + "type": "Transitive", + "resolved": "1.0.2", + "contentHash": "JGkzeqgBsiZwKJZ1IxPNsDFZDhUvuEdX8L8BDC8N3KOj+6zMcNU28CNN59TpZE/VJYy9cP+5M+sbxtWJx3/xtw==", + "dependencies": { + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.6.0" + } + }, + "System.Numerics.Vectors": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Private.DataContractSerialization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yDaJ2x3mMmjdZEDB4IbezSnCsnjQ4BxinKhRAaP6kEgL6Bb6jANWphs5SzyD8imqeC/3FxgsuXT6ykkiH1uUmA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Serialization.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0", + "System.Xml.XmlDocument": "4.3.0", + "System.Xml.XmlSerializer": "4.3.0" + } + }, + "System.Private.ServiceModel": { + "type": "Transitive", + "resolved": "4.10.2", + "contentHash": "bi2/w2EDXqxno8zfbt6vHcrpGw0Pav8tEMzmJraHwJvWYJd45wcqr7gNa2IUs91j4z+BNGMooStaWS6pm2Lq0A==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "5.0.0", + "Microsoft.Extensions.ObjectPool": "5.0.10", + "System.Numerics.Vectors": "4.5.0", + "System.Reflection.DispatchProxy": "4.7.1", + "System.Security.Cryptography.Xml": "6.0.1", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.DispatchProxy": { + "type": "Transitive", + "resolved": "4.7.1", + "contentHash": "C1sMLwIG6ILQ2bmOT4gh62V6oJlyF4BlHcVMrOoor49p0Ji2tA8QAoqyMcIhAdH6OHKJ8m7BU+r4LK2CUEOKqw==" + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.Caching": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "E0e03kUp5X2k+UAoVl6efmI7uU7JRBWi5EIdlQ7cr0NpBGjHG4fWII35PgsBY9T4fJQ8E4QPsL0rKksU9gcL5A==", + "dependencies": { + "System.Configuration.ConfigurationManager": "6.0.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Wz+0KOukJGAlXjtKr+5Xpuxf8+c8739RI1C+A2BoQZT+wMCCoMDDdO8/4IRHfaVINqL78GO8dW8G2lW/e45Mcw==", + "dependencies": { + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Serialization.Xml": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nUQx/5OVgrqEba3+j7OdiofvVq9koWZAC7Z3xGI8IIViZqApWnZ5+lLcwYgTlbkobrl/Rat+Jb8GeD4WQESD2A==", + "dependencies": { + "System.IO": "4.3.0", + "System.Private.DataContractSerialization": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Serialization.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "AUADIc0LIEQe7MzC+I0cl0rAT8RrTAKFHl53yHjEUzNVIaUlhFY11vc2ebiVJzVBuOzun6F7FBA+8KAbGTTedQ==" + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.1", + "contentHash": "DVUblnRfnarrI5olEC2B/OCsJQd0anjVaObQMndHSc43efbc88/RMOlDyg/EyY0ix5ecyZMXS8zMksb5ukebZA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.1", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "WG3r7EyjUe9CMPFSs6bty5doUqT+q9pbI80hlNzo2SkPkZ4VTuZkGWjpp77JB8+uaL4DFPRdBsAY+DX3dBK92A==" + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Pkcs": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "ynmbW2GjIGg9K1wXmVIRs4IlyDolf0JXNpzFQ8JCVgwM+myUC2JeUggl2PwQig2PNVMegKmN1aAx7WPQ8tI3vA==", + "dependencies": { + "System.Formats.Asn1": "6.0.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "rp1gMNEZpvx9vP0JW0oHLxlf8oSiQgtno77Y4PLUBjSiDYoD77Y8uXHr1Ea5XG4/pIKhqAdxZ8v8OTUtqo9PeQ==" + }, + "System.Security.Cryptography.Xml": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "5e5bI28T0x73AwTsbuFP4qSRzthmU2C0Gqgg3AZ3KTxmSyA+Uhk31puA3srdaeWaacVnHhLdJywCzqOiEpbO/w==", + "dependencies": { + "System.Security.AccessControl": "6.0.0", + "System.Security.Cryptography.Pkcs": "6.0.1" + } + }, + "System.Security.Permissions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "T/uuc7AklkDoxmcJ7LGkyX1CcSviZuLCa4jg3PekfJ7SU0niF0IVTXwUiNVP9DSpzou2PpxJ+eNY2IfDM90ZCg==", + "dependencies": { + "System.Security.AccessControl": "6.0.0", + "System.Windows.Extensions": "6.0.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.ServiceModel.Http": { + "type": "Transitive", + "resolved": "4.10.2", + "contentHash": "1AhiJwPc+90GjBd/sDkT93RVuRj688ZQInXzWfd56AEjDzWieUcAUh9ppXhRuEVpT+x48D5GBYJc1VxDP4IT+Q==", + "dependencies": { + "System.Private.ServiceModel": "4.10.2", + "System.ServiceModel.Primitives": "4.10.2" + } + }, + "System.ServiceModel.Primitives": { + "type": "Transitive", + "resolved": "4.10.2", + "contentHash": "8QOguIqHtWYywBt7SubPhdICE2LClHzqOMDy0LQIui4T3QJOae7g6UR+alCW61nEufYNtO8Uss41EbXqD8hdww==", + "dependencies": { + "System.Private.ServiceModel": "4.10.2" + } + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "OP6umVGxc0Z0MvZQBVigj4/U31Pw72ITihDWP9WiWDm+q5aoe0GaJivsfYGq53o6dxH7DcXWiCTl7+0o2CGdmg==" + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "7.0.3", + "contentHash": "AyjhwXN1zTFeIibHimfJn6eAsZ7rTBib79JQpzg8WAuR/HKDu9JGNHTuu3nbbXQ/bgI+U4z6HtZmCHNXB1QXrQ==", + "dependencies": { + "System.Text.Encodings.Web": "7.0.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.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": "6.0.0", + "contentHash": "IXoJOXIqc39AIe+CIR7koBtRGMiCt/LPM3lI+PELtDIy9XdyeSrwXFdWV9dzJ2Awl0paLWUaknLxFQ5HpHZUog==", + "dependencies": { + "System.Drawing.Common": "6.0.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lJ8AxvkX7GQxpC6GFCeBj8ThYVyQczx2+f/cWHJU8tjS7YfI6Cv6bon70jVEgs2CiFbmmM8b9j1oZVx0dSI2Ww==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlSerializer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "MYoTCP7EZ98RrANESW05J5ZwskKDoN0AuZ06ZflnowE50LTpbR5yRg3tHckTVm5j/m47stuGgCrCHWePyHS70Q==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XmlDocument": "4.3.0" + } + } + }, "net8.0": { "Microsoft.Data.SqlClient": { "type": "Direct", From 13a8738cf1179df276338d8f48c192a60670ff36 Mon Sep 17 00:00:00 2001 From: John Peters Date: Fri, 12 Apr 2024 00:11:08 -0400 Subject: [PATCH 04/34] Updating namespaces --- src/Root16.Sprout.Sample.SqlServer/Program.cs | 2 +- src/Root16.Sprout.Sample.SqlServer/SampleSQLStep.cs | 3 +-- .../DataSources/Sql/DynamicSqlPagedQuery.cs | 2 +- src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs | 3 +-- src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs | 2 +- 5 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/Root16.Sprout.Sample.SqlServer/Program.cs b/src/Root16.Sprout.Sample.SqlServer/Program.cs index 98e6c55..0c2d8c6 100644 --- a/src/Root16.Sprout.Sample.SqlServer/Program.cs +++ b/src/Root16.Sprout.Sample.SqlServer/Program.cs @@ -3,7 +3,7 @@ using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Root16.Sprout; -using Root16.Sprout.DataSources.Dataverse; +using Root16.Sprout.DataSources.Sql; using Root16.Sprout.Sample.SqlServer; using System.Diagnostics; diff --git a/src/Root16.Sprout.Sample.SqlServer/SampleSQLStep.cs b/src/Root16.Sprout.Sample.SqlServer/SampleSQLStep.cs index b036368..875420e 100644 --- a/src/Root16.Sprout.Sample.SqlServer/SampleSQLStep.cs +++ b/src/Root16.Sprout.Sample.SqlServer/SampleSQLStep.cs @@ -1,8 +1,7 @@ using Microsoft.Data.SqlClient; -using Microsoft.Xrm.Sdk; using Root16.Sprout.BatchProcessing; using Root16.Sprout.DataSources; -using Root16.Sprout.DataSources.Dataverse; +using Root16.Sprout.DataSources.Sql; using System.Data; namespace Root16.Sprout.Sample.SqlServer diff --git a/src/Root16.Sprout.SqlServer/DataSources/Sql/DynamicSqlPagedQuery.cs b/src/Root16.Sprout.SqlServer/DataSources/Sql/DynamicSqlPagedQuery.cs index 7314730..dd25552 100644 --- a/src/Root16.Sprout.SqlServer/DataSources/Sql/DynamicSqlPagedQuery.cs +++ b/src/Root16.Sprout.SqlServer/DataSources/Sql/DynamicSqlPagedQuery.cs @@ -1,7 +1,7 @@ using Microsoft.Data.SqlClient; using System.Data; -namespace Root16.Sprout.DataSources.Dataverse; +namespace Root16.Sprout.DataSources.Sql; public class DynamicSqlPagedQuery(SqlConnection connection, Func commandGenerator, string? totalRowCountCommandText = null) : IPagedQuery { diff --git a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs index ffe4f7b..2902ee9 100644 --- a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs +++ b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs @@ -1,9 +1,8 @@ using Microsoft.Extensions.Logging; using Microsoft.Data.SqlClient; using System.Data; -using Azure; -namespace Root16.Sprout.DataSources.Dataverse; +namespace Root16.Sprout.DataSources.Sql; public class SqlDataSource(string connectionString, ILogger logger) : IDataSource, IDataSource { diff --git a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs index 2768ae7..516cc07 100644 --- a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs +++ b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs @@ -1,7 +1,7 @@ using Microsoft.Data.SqlClient; using System.Data; -namespace Root16.Sprout.DataSources.Dataverse; +namespace Root16.Sprout.DataSources.Sql; public class SqlPagedQuery(SqlConnection connection, string commandText, string? totalRowCountCommandText = null, bool addPaging = true) : IPagedQuery { From 485a8a80cf1a31cb8120906724f4f2350cabb3d0 Mon Sep 17 00:00:00 2001 From: John Peters Date: Mon, 15 Apr 2024 12:54:02 -0400 Subject: [PATCH 05/34] Making SQLConnection Public To Match DataverseDataSource --- src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs index 2902ee9..81ce393 100644 --- a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs +++ b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs @@ -7,7 +7,7 @@ namespace Root16.Sprout.DataSources.Sql; public class SqlDataSource(string connectionString, ILogger logger) : IDataSource, IDataSource { private readonly ILogger logger = logger; - private readonly SqlConnection connection = new(connectionString); + public readonly SqlConnection connection = new(connectionString); public SqlPagedQuery CreatePagedQuery(string commandText, string? totalRowCountCommandText = null, bool addPaging = true) { From ba15ca53fd8ffe2a293293b39a8a6544ad9e8280 Mon Sep 17 00:00:00 2001 From: Paul Lohmuller Date: Fri, 10 May 2024 19:42:04 -0500 Subject: [PATCH 06/34] Use Task Parallel Library to process Dataverse requests --- .../Dataverse/DataverseDataSource.cs | 49 +++++++++---------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSource.cs b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSource.cs index 7dbef0c..ddf94a7 100644 --- a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSource.cs +++ b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSource.cs @@ -2,7 +2,8 @@ using Microsoft.PowerPlatform.Dataverse.Client; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Messages; -using Root16.Sprout.Extensions; +using System.Collections.Concurrent; +using System.Net; namespace Root16.Sprout.DataSources.Dataverse; @@ -15,6 +16,12 @@ public DataverseDataSource(ServiceClient crmServiceClient, ILogger>> ExecuteMultipleAsy } else { - List ListofRequestCollections = []; + ConcurrentBag> parallelResults = []; - foreach (var request in requestCollection.Chunk(1000)) - { - var orgRequestCollection = new OrganizationRequestCollection(); - orgRequestCollection.AddRange(request); - ListofRequestCollections.Add(orgRequestCollection); - } + ParallelOptions parallelOptions = new() { MaxDegreeOfParallelism = CrmServiceClient.RecommendedDegreesOfParallelism }; - List> requestTasks = []; - - foreach (var requests in ListofRequestCollections) + await Parallel.ForEachAsync(requestCollection.Chunk(10), parallelOptions, async (batch, token) => { - requestTasks.Add(CrmServiceClient.ExecuteAsync(new ExecuteMultipleRequest + ExecuteMultipleRequest request = new() { Settings = new ExecuteMultipleSettings { ContinueOnError = true, }, - Requests = requests - })); - } + Requests = [] + }; + request.Requests.AddRange(batch); - OrganizationResponse[] organizationResponses = await Task.WhenAll(requestTasks); - List executeMultipleResponses = organizationResponses.Select(x => (ExecuteMultipleResponse)x).ToList(); + ExecuteMultipleResponse batchResponse = await CrmServiceClient.ExecuteAsync(request, token) as ExecuteMultipleResponse; - for (var i = 0; i < executeMultipleResponses.Count; i++) - { - var responses = executeMultipleResponses[i].Responses; - var matchingRequests = ListofRequestCollections[i]; - for (var k = 0; k < matchingRequests.Count; k++) + for (var k = 0; k < batch.Length; k++) { - var response = responses.FirstOrDefault(r => r.RequestIndex == k); + var response = batchResponse.Responses.FirstOrDefault(r => r.RequestIndex == k); if (response?.Fault is not null) { - results.Add(ResultFromRequestType(matchingRequests[k], false)); + parallelResults.Add(ResultFromRequestType(batch[k], false)); if (response?.Fault?.InnerFault?.InnerFault?.Message is not null && response.Fault.InnerFault.InnerFault is OrganizationServiceFault innermostFault) { @@ -171,10 +166,12 @@ public async Task>> ExecuteMultipleAsy } else { - results.Add(ResultFromRequestType(matchingRequests[k], true)); + parallelResults.Add(ResultFromRequestType(batch[k], true)); } } - } + }); + + results.AddRange(parallelResults); } } return results; From bbadd44874fcd1b439b8631c90809d00e9884c07 Mon Sep 17 00:00:00 2001 From: Paul Lohmuller Date: Thu, 23 May 2024 10:59:30 -0500 Subject: [PATCH 07/34] Add multiple retry policy to handle network errors --- .../Dataverse/DataverseDataSource.cs | 78 +++++++++++++------ src/Root16.Sprout.Sample.SqlServer/Program.cs | 4 +- .../DataSources/Sql/DynamicSqlPagedQuery.cs | 32 +++++++- .../DataSources/Sql/SqlDataSource.cs | 9 ++- .../DataSources/Sql/SqlPagedQuery.cs | 32 +++++++- 5 files changed, 121 insertions(+), 34 deletions(-) diff --git a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSource.cs b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSource.cs index ddf94a7..8fa33e0 100644 --- a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSource.cs +++ b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSource.cs @@ -12,6 +12,8 @@ public class DataverseDataSource : IDataSource private readonly ILogger logger; public string? ImpersonateUsingAttribute { get; set; } + const int MaxRetries = 10; + public DataverseDataSource(ServiceClient crmServiceClient, ILogger logger) { CrmServiceClient = crmServiceClient; @@ -109,7 +111,7 @@ public async Task>> ExecuteMultipleAsy { if (!dryRun) { - var response = await CrmServiceClient.ExecuteAsync(requestCollection[0]); + var response = await TryExecuteRequestAsync(requestCollection[0]); } results.Add(ResultFromRequestType(requestCollection[0], true)); } @@ -136,38 +138,46 @@ public async Task>> ExecuteMultipleAsy await Parallel.ForEachAsync(requestCollection.Chunk(10), parallelOptions, async (batch, token) => { - ExecuteMultipleRequest request = new() + if (batch.Count() == 1) + { + var response = await TryExecuteRequestAsync(batch.Single()); + results.Add(ResultFromRequestType(batch.Single(), true)); + } + else { - Settings = new ExecuteMultipleSettings + ExecuteMultipleRequest request = new() { - ContinueOnError = true, - }, - Requests = [] - }; - request.Requests.AddRange(batch); + Settings = new ExecuteMultipleSettings + { + ContinueOnError = true, + }, + Requests = [] + }; + request.Requests.AddRange(batch); - ExecuteMultipleResponse batchResponse = await CrmServiceClient.ExecuteAsync(request, token) as ExecuteMultipleResponse; + ExecuteMultipleResponse batchResponse = await TryExecuteRequestAsync(request, token); - for (var k = 0; k < batch.Length; k++) - { - var response = batchResponse.Responses.FirstOrDefault(r => r.RequestIndex == k); - if (response?.Fault is not null) + for (var k = 0; k < batch.Length; k++) { - parallelResults.Add(ResultFromRequestType(batch[k], false)); - if (response?.Fault?.InnerFault?.InnerFault?.Message is not null - && response.Fault.InnerFault.InnerFault is OrganizationServiceFault innermostFault) + var response = batchResponse.Responses.FirstOrDefault(r => r.RequestIndex == k); + if (response?.Fault is not null) { - logger.LogError(innermostFault.Message); + parallelResults.Add(ResultFromRequestType(batch[k], false)); + if (response?.Fault?.InnerFault?.InnerFault?.Message is not null + && response.Fault.InnerFault.InnerFault is OrganizationServiceFault innermostFault) + { + logger.LogError(innermostFault.Message); + } + else + { + logger.LogError(response?.Fault.Message); + } } else { - logger.LogError(response?.Fault.Message); + parallelResults.Add(ResultFromRequestType(batch[k], true)); } } - else - { - parallelResults.Add(ResultFromRequestType(batch[k], true)); - } } }); @@ -237,4 +247,28 @@ public IPagedQuery CreateFetchXmlQuery(string fetchXml) return request; } + + private Task TryExecuteRequestAsync(OrganizationRequest request, CancellationToken token = default) + => TryExecuteRequestAsync(request, token); + + private async Task TryExecuteRequestAsync(OrganizationRequest request, CancellationToken token = default) + where T : OrganizationResponse + { + var retryCount = 0; + Exception lastException; + do + { + try + { + return (T)await CrmServiceClient.ExecuteAsync(request, token); + } + catch (Exception ex) + { + logger.LogError(ex, ex.Message); + lastException = ex; + } + } while (retryCount++ < MaxRetries); + + throw lastException; + } } diff --git a/src/Root16.Sprout.Sample.SqlServer/Program.cs b/src/Root16.Sprout.Sample.SqlServer/Program.cs index 0c2d8c6..2db71bc 100644 --- a/src/Root16.Sprout.Sample.SqlServer/Program.cs +++ b/src/Root16.Sprout.Sample.SqlServer/Program.cs @@ -22,8 +22,8 @@ { var connectionString = "Server=localhost\\MSSQLSERVER01;Database=master;Integrated Security=True;Trusted_Connection=True;TrustServerCertificate=true;"; Debugger.Break(); - var logger = serviceProvider.GetRequiredService>(); - var dataSource = new SqlDataSource(connectionString, logger); + var loggerFactory = serviceProvider.GetRequiredService(); + var dataSource = new SqlDataSource(connectionString, loggerFactory); return dataSource; }); diff --git a/src/Root16.Sprout.SqlServer/DataSources/Sql/DynamicSqlPagedQuery.cs b/src/Root16.Sprout.SqlServer/DataSources/Sql/DynamicSqlPagedQuery.cs index dd25552..b187206 100644 --- a/src/Root16.Sprout.SqlServer/DataSources/Sql/DynamicSqlPagedQuery.cs +++ b/src/Root16.Sprout.SqlServer/DataSources/Sql/DynamicSqlPagedQuery.cs @@ -1,20 +1,26 @@ using Microsoft.Data.SqlClient; +using Microsoft.Extensions.Logging; +using Microsoft.Xrm.Sdk; using System.Data; namespace Root16.Sprout.DataSources.Sql; -public class DynamicSqlPagedQuery(SqlConnection connection, Func commandGenerator, string? totalRowCountCommandText = null) : IPagedQuery +public class DynamicSqlPagedQuery(ILogger logger, SqlConnection connection, Func commandGenerator, string? totalRowCountCommandText = null) : IPagedQuery { + private readonly ILogger logger = logger; private readonly SqlConnection connection = connection; private readonly Func commandGenerator = commandGenerator; private readonly string? totalRowCountCommandText = totalRowCountCommandText; + const int MaxRetries = 10; + public async Task> GetNextPageAsync(int pageNumber, int pageSize, object? bookmark) { using var command = connection.CreateCommand(); command.CommandText = commandGenerator(pageNumber, pageSize); command.Connection.Open(); - var reader = await command.ExecuteReaderAsync(CommandBehavior.CloseConnection); + + var reader = await TryAsync(async () => await command.ExecuteReaderAsync(CommandBehavior.CloseConnection)); try { DataTable table = new(); @@ -43,11 +49,31 @@ public async Task> GetNextPageAsync(int pageNumber, in cmd.Connection.Open(); try { - return (int?)await cmd.ExecuteScalarAsync(); + return await TryAsync(async () => (int?)await cmd.ExecuteScalarAsync()); } finally { cmd.Connection.Close(); } } + + private async Task TryAsync(Func> sqlRequest) + { + var retryCount = 0; + Exception lastException; + do + { + try + { + return await sqlRequest(); + } + catch (Exception ex) + { + logger.LogError(ex, ex.Message); + lastException = ex; + } + } while (retryCount++ < MaxRetries); + + throw lastException; + } } diff --git a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs index 81ce393..2eda5ff 100644 --- a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs +++ b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs @@ -4,19 +4,20 @@ namespace Root16.Sprout.DataSources.Sql; -public class SqlDataSource(string connectionString, ILogger logger) : IDataSource, IDataSource +public class SqlDataSource(string connectionString, ILoggerFactory loggerFactory) : IDataSource, IDataSource { - private readonly ILogger logger = logger; + private readonly ILoggerFactory loggerFactory = loggerFactory; + private readonly ILogger logger = loggerFactory.CreateLogger(); public readonly SqlConnection connection = new(connectionString); public SqlPagedQuery CreatePagedQuery(string commandText, string? totalRowCountCommandText = null, bool addPaging = true) { - return new SqlPagedQuery(connection, commandText, totalRowCountCommandText, addPaging); + return new SqlPagedQuery(loggerFactory.CreateLogger(), connection, commandText, totalRowCountCommandText, addPaging); } public DynamicSqlPagedQuery CreatePagedQuery(Func commandGenerator, string? totalRowCountCommandText = null) { - return new DynamicSqlPagedQuery(connection, commandGenerator, totalRowCountCommandText); + return new DynamicSqlPagedQuery(loggerFactory.CreateLogger(), connection, commandGenerator, totalRowCountCommandText); } public void ExecuteNonQuery(string commandText) diff --git a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs index 516cc07..d19880b 100644 --- a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs +++ b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs @@ -1,15 +1,19 @@ using Microsoft.Data.SqlClient; +using Microsoft.Extensions.Logging; using System.Data; namespace Root16.Sprout.DataSources.Sql; -public class SqlPagedQuery(SqlConnection connection, string commandText, string? totalRowCountCommandText = null, bool addPaging = true) : IPagedQuery +public class SqlPagedQuery(ILogger logger, SqlConnection connection, string commandText, string? totalRowCountCommandText = null, bool addPaging = true) : IPagedQuery { + private readonly ILogger logger = logger; private readonly SqlConnection connection = connection; private readonly string commandText = commandText; private readonly string? totalRowCountCommandText = totalRowCountCommandText; private readonly bool addPaging = addPaging; + const int MaxRetries = 10; + public async Task> GetNextPageAsync(int pageNumber, int pageSize, object? bookmark) { using var command = connection.CreateCommand(); @@ -26,7 +30,7 @@ public async Task> GetNextPageAsync(int pageNumber, in } } command.Connection.Open(); - var reader = await command.ExecuteReaderAsync(CommandBehavior.CloseConnection); + var reader = await TryAsync(() => command.ExecuteReaderAsync(CommandBehavior.CloseConnection)); try { DataTable table = new(); @@ -55,11 +59,33 @@ public async Task> GetNextPageAsync(int pageNumber, in cmd.Connection.Open(); try { - return (int?)await cmd.ExecuteScalarAsync(); + return await TryAsync(async () => (int?)await cmd.ExecuteScalarAsync()); } finally { cmd.Connection.Close(); } } + + + private async Task TryAsync(Func> sqlRequest) + { + var retryCount = 0; + Exception lastException; + do + { + try + { + return await sqlRequest(); + } + catch (Exception ex) + { + logger.LogError(ex, ex.Message); + lastException = ex; + } + } while (retryCount++ < MaxRetries); + + throw lastException; + } + } From 29f6921e67dd36f1f3c3cf1b740869a2c1321ad8 Mon Sep 17 00:00:00 2001 From: Paul Lohmuller Date: Thu, 23 May 2024 11:43:31 -0500 Subject: [PATCH 08/34] Prefer EMR for single requests for consistent error handling --- .../Dataverse/DataverseDataSource.cs | 50 ++++++++----------- 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSource.cs b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSource.cs index 8fa33e0..303330e 100644 --- a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSource.cs +++ b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSource.cs @@ -138,46 +138,38 @@ public async Task>> ExecuteMultipleAsy await Parallel.ForEachAsync(requestCollection.Chunk(10), parallelOptions, async (batch, token) => { - if (batch.Count() == 1) + ExecuteMultipleRequest request = new() { - var response = await TryExecuteRequestAsync(batch.Single()); - results.Add(ResultFromRequestType(batch.Single(), true)); - } - else - { - ExecuteMultipleRequest request = new() + Settings = new ExecuteMultipleSettings { - Settings = new ExecuteMultipleSettings - { - ContinueOnError = true, - }, - Requests = [] - }; - request.Requests.AddRange(batch); + ContinueOnError = true, + }, + Requests = [] + }; + request.Requests.AddRange(batch); - ExecuteMultipleResponse batchResponse = await TryExecuteRequestAsync(request, token); + ExecuteMultipleResponse batchResponse = await TryExecuteRequestAsync(request, token); - for (var k = 0; k < batch.Length; k++) + for (var k = 0; k < batch.Length; k++) + { + var response = batchResponse.Responses.FirstOrDefault(r => r.RequestIndex == k); + if (response?.Fault is not null) { - var response = batchResponse.Responses.FirstOrDefault(r => r.RequestIndex == k); - if (response?.Fault is not null) + parallelResults.Add(ResultFromRequestType(batch[k], false)); + if (response?.Fault?.InnerFault?.InnerFault?.Message is not null + && response.Fault.InnerFault.InnerFault is OrganizationServiceFault innermostFault) { - parallelResults.Add(ResultFromRequestType(batch[k], false)); - if (response?.Fault?.InnerFault?.InnerFault?.Message is not null - && response.Fault.InnerFault.InnerFault is OrganizationServiceFault innermostFault) - { - logger.LogError(innermostFault.Message); - } - else - { - logger.LogError(response?.Fault.Message); - } + logger.LogError(innermostFault.Message); } else { - parallelResults.Add(ResultFromRequestType(batch[k], true)); + logger.LogError(response?.Fault.Message); } } + else + { + parallelResults.Add(ResultFromRequestType(batch[k], true)); + } } }); From 73db4cafa5f89a4c0957e449b6a13c8c305a61cb Mon Sep 17 00:00:00 2001 From: John Peters Date: Fri, 24 May 2024 10:29:07 -0400 Subject: [PATCH 09/34] Only log exceptions if the message changes --- .../DataSources/Dataverse/DataverseDataSource.cs | 7 +++++-- .../DataSources/Sql/DynamicSqlPagedQuery.cs | 7 +++++-- .../DataSources/Sql/SqlPagedQuery.cs | 7 +++++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSource.cs b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSource.cs index 8fa33e0..d25974f 100644 --- a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSource.cs +++ b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSource.cs @@ -255,7 +255,7 @@ private async Task TryExecuteRequestAsync(OrganizationRequest request, Can where T : OrganizationResponse { var retryCount = 0; - Exception lastException; + Exception? lastException = null; do { try @@ -264,7 +264,10 @@ private async Task TryExecuteRequestAsync(OrganizationRequest request, Can } catch (Exception ex) { - logger.LogError(ex, ex.Message); + if (lastException is null || !ex.Message.Equals(lastException.Message, StringComparison.OrdinalIgnoreCase)) + { + logger.LogError(ex, ex.Message); + } lastException = ex; } } while (retryCount++ < MaxRetries); diff --git a/src/Root16.Sprout.SqlServer/DataSources/Sql/DynamicSqlPagedQuery.cs b/src/Root16.Sprout.SqlServer/DataSources/Sql/DynamicSqlPagedQuery.cs index b187206..a512200 100644 --- a/src/Root16.Sprout.SqlServer/DataSources/Sql/DynamicSqlPagedQuery.cs +++ b/src/Root16.Sprout.SqlServer/DataSources/Sql/DynamicSqlPagedQuery.cs @@ -60,7 +60,7 @@ public async Task> GetNextPageAsync(int pageNumber, in private async Task TryAsync(Func> sqlRequest) { var retryCount = 0; - Exception lastException; + Exception? lastException = null; do { try @@ -69,7 +69,10 @@ private async Task TryAsync(Func> sqlRequest) } catch (Exception ex) { - logger.LogError(ex, ex.Message); + if (lastException is null || !ex.Message.Equals(lastException.Message, StringComparison.OrdinalIgnoreCase)) + { + logger.LogError(ex, ex.Message); + } lastException = ex; } } while (retryCount++ < MaxRetries); diff --git a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs index d19880b..3503bf9 100644 --- a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs +++ b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs @@ -71,7 +71,7 @@ public async Task> GetNextPageAsync(int pageNumber, in private async Task TryAsync(Func> sqlRequest) { var retryCount = 0; - Exception lastException; + Exception? lastException = null; do { try @@ -80,7 +80,10 @@ private async Task TryAsync(Func> sqlRequest) } catch (Exception ex) { - logger.LogError(ex, ex.Message); + if (lastException is null || !ex.Message.Equals(lastException.Message, StringComparison.OrdinalIgnoreCase)) + { + logger.LogError(ex, ex.Message); + } lastException = ex; } } while (retryCount++ < MaxRetries); From c0192f43a905206a57aba3e0d25178045c1f99ba Mon Sep 17 00:00:00 2001 From: John Peters Date: Fri, 24 May 2024 15:39:17 -0400 Subject: [PATCH 10/34] Moved to primary constructor --- .../DataSources/Dataverse/EntityOperationReducer.cs | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/EntityOperationReducer.cs b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/EntityOperationReducer.cs index c141732..496721d 100644 --- a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/EntityOperationReducer.cs +++ b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/EntityOperationReducer.cs @@ -4,15 +4,10 @@ namespace Root16.Sprout.DataSources.Dataverse; -public class EntityOperationReducer +public class EntityOperationReducer(ILogger logger) { private IEnumerable? entities; - private readonly ILogger logger; - - public EntityOperationReducer(ILogger logger) - { - this.logger = logger; - } + private readonly ILogger logger = logger; public void SetPotentialMatches(IEnumerable entities) { From 01453417aea9bb5f30afe74afe492b407a602393 Mon Sep 17 00:00:00 2001 From: John Peters Date: Tue, 25 Jun 2024 15:12:46 -0400 Subject: [PATCH 11/34] Enable Creating A Generic Step That Can Be Called Multiple Times with Different Parameters Added Step Naming Back. - Good for naming step when programatically created for generic step Added Logging Created Step Name --- .../packages.lock.json | 36 ++++---- .../CreateContactTestStep.cs | 8 +- .../UpdateContactTestStep.cs | 8 +- .../AccountInvalidDependencyTestStep.cs | 8 +- .../TestSteps/AccountTestStep.cs | 8 +- .../ContactInvalidDependencyTestStep.cs | 4 +- .../TestSteps/ContactTestStep.cs | 8 +- .../TestSteps/EmailTestStepcs.cs | 8 +- .../TestSteps/LetterTestStep.cs | 8 +- .../TestSteps/TaskTestStep.cs | 8 +- .../GenericSampleSQLStep.cs | 59 +++++++++++++ src/Root16.Sprout.Sample.SqlServer/Program.cs | 32 ++++++- .../SampleSQLStep.cs | 10 +-- .../packages.lock.json | 36 ++++---- .../BatchProcessing/BatchIntegrationStep.cs | 2 +- .../BatchProcessing/BatchProcessor.cs | 8 +- .../DependencyInjection/StepRegistration.cs | 14 +++- src/Root16.Sprout/IIntegrationStep.cs | 2 +- src/Root16.Sprout/IntegrationRuntime.cs | 9 +- .../Progress/IntegrationProgress.cs | 2 +- src/Root16.Sprout/Root16.Sprout.csproj | 2 + .../ServiceCollectionExtensions.cs | 32 ++++++- src/Root16.Sprout/packages.lock.json | 84 ++++++++++--------- 23 files changed, 274 insertions(+), 122 deletions(-) create mode 100644 src/Root16.Sprout.Sample.SqlServer/GenericSampleSQLStep.cs diff --git a/src/Root16.Sprout.Dataverse/packages.lock.json b/src/Root16.Sprout.Dataverse/packages.lock.json index 64ce1cf..4abf98e 100644 --- a/src/Root16.Sprout.Dataverse/packages.lock.json +++ b/src/Root16.Sprout.Dataverse/packages.lock.json @@ -141,16 +141,16 @@ }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" }, "Microsoft.Extensions.Http": { "type": "Transitive", @@ -1148,6 +1148,8 @@ "type": "Project", "dependencies": { "Microsoft.Data.SqlClient": "[5.2.0, )", + "Microsoft.Extensions.DependencyInjection": "[8.0.0, )", + "Microsoft.Extensions.DependencyInjection.Abstractions": "[8.0.0, )", "Microsoft.Extensions.Logging": "[7.0.0, )", "Microsoft.Extensions.Logging.Console": "[7.0.0, )", "Microsoft.PowerPlatform.Dataverse.Client": "[1.1.16, )" @@ -1294,16 +1296,16 @@ }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" }, "Microsoft.Extensions.Http": { "type": "Transitive", @@ -2293,6 +2295,8 @@ "type": "Project", "dependencies": { "Microsoft.Data.SqlClient": "[5.2.0, )", + "Microsoft.Extensions.DependencyInjection": "[8.0.0, )", + "Microsoft.Extensions.DependencyInjection.Abstractions": "[8.0.0, )", "Microsoft.Extensions.Logging": "[7.0.0, )", "Microsoft.Extensions.Logging.Console": "[7.0.0, )", "Microsoft.PowerPlatform.Dataverse.Client": "[1.1.16, )" @@ -2439,16 +2443,16 @@ }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" }, "Microsoft.Extensions.Http": { "type": "Transitive", @@ -3446,6 +3450,8 @@ "type": "Project", "dependencies": { "Microsoft.Data.SqlClient": "[5.2.0, )", + "Microsoft.Extensions.DependencyInjection": "[8.0.0, )", + "Microsoft.Extensions.DependencyInjection.Abstractions": "[8.0.0, )", "Microsoft.Extensions.Logging": "[7.0.0, )", "Microsoft.Extensions.Logging.Console": "[7.0.0, )", "Microsoft.PowerPlatform.Dataverse.Client": "[1.1.16, )" diff --git a/src/Root16.Sprout.Sample.CreatesAndUpdates/CreateContactTestStep.cs b/src/Root16.Sprout.Sample.CreatesAndUpdates/CreateContactTestStep.cs index 7704b99..88f19a8 100644 --- a/src/Root16.Sprout.Sample.CreatesAndUpdates/CreateContactTestStep.cs +++ b/src/Root16.Sprout.Sample.CreatesAndUpdates/CreateContactTestStep.cs @@ -11,7 +11,7 @@ internal class CreateContactTestStep : BatchIntegrationStep memoryDS; + private readonly MemoryDataSource memoryDS; public CreateContactTestStep(MemoryDataSource memoryDS, DataverseDataSource dataverseDataSource, EntityOperationReducer reducer, BatchProcessor batchProcessor) { @@ -58,9 +58,9 @@ public override IReadOnlyList> OnBeforeDelivery(IReadOnlyL )); } - public override async Task RunAsync() + public override async Task RunAsync(string stepName) { - await batchProcessor.ProcessAllBatchesAsync(this); + await batchProcessor.ProcessAllBatchesAsync(this, stepName); } public override IDataSource OutputDataSource => dataverseDataSource; @@ -81,6 +81,6 @@ public override IReadOnlyList> MapRecord(CreateContact sou } }; - return new[] { new DataOperation("Create", result) }; + return [new DataOperation("Create", result)]; } } diff --git a/src/Root16.Sprout.Sample.CreatesAndUpdates/UpdateContactTestStep.cs b/src/Root16.Sprout.Sample.CreatesAndUpdates/UpdateContactTestStep.cs index b395b73..f08f88d 100644 --- a/src/Root16.Sprout.Sample.CreatesAndUpdates/UpdateContactTestStep.cs +++ b/src/Root16.Sprout.Sample.CreatesAndUpdates/UpdateContactTestStep.cs @@ -11,7 +11,7 @@ internal class UpdateContactTestStep : BatchIntegrationStep memoryDS; + private readonly MemoryDataSource memoryDS; public UpdateContactTestStep(MemoryDataSource memoryDS, DataverseDataSource dataverseDataSource, EntityOperationReducer reducer, BatchProcessor batchProcessor) { @@ -58,9 +58,9 @@ public override IReadOnlyList> OnBeforeDelivery(IReadOnlyL )); } - public override async Task RunAsync() + public override async Task RunAsync(string stepName) { - await batchProcessor.ProcessAllBatchesAsync(this); + await batchProcessor.ProcessAllBatchesAsync(this, stepName); } public override IDataSource OutputDataSource => dataverseDataSource; @@ -82,6 +82,6 @@ public override IReadOnlyList> MapRecord(UpdateContact sou } }; - return new[] { new DataOperation("Update", result) }; + return [new DataOperation("Update", result)]; } } diff --git a/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/AccountInvalidDependencyTestStep.cs b/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/AccountInvalidDependencyTestStep.cs index b0803e2..80f634a 100644 --- a/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/AccountInvalidDependencyTestStep.cs +++ b/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/AccountInvalidDependencyTestStep.cs @@ -13,7 +13,7 @@ internal class AccountInvalidDependencyTestStep : BatchIntegrationStep memoryDS; + private readonly MemoryDataSource memoryDS; public AccountInvalidDependencyTestStep(MemoryDataSource memoryDS, DataverseDataSource dataverseDataSource, EntityOperationReducer reducer, BatchProcessor batchProcessor) { @@ -51,9 +51,9 @@ public override IReadOnlyList> OnBeforeDelivery(IReadOnlyL return reducer.ReduceOperations(batch, entity => entity.GetAttributeValue("name")); } - public override async Task RunAsync() + public override async Task RunAsync(string stepName) { - await batchProcessor.ProcessAllBatchesAsync(this); + await batchProcessor.ProcessAllBatchesAsync(this, stepName); } public override IDataSource OutputDataSource => dataverseDataSource; @@ -73,7 +73,7 @@ public override IReadOnlyList> MapRecord(Account source) } }; - return new[] { new DataOperation("Create", result) }; + return [new DataOperation("Create", result)]; } } diff --git a/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/AccountTestStep.cs b/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/AccountTestStep.cs index febdc1b..f60a736 100644 --- a/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/AccountTestStep.cs +++ b/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/AccountTestStep.cs @@ -13,7 +13,7 @@ internal class AccountTestStep : BatchIntegrationStep private readonly DataverseDataSource dataverseDataSource; private readonly EntityOperationReducer reducer; private readonly BatchProcessor batchProcessor; - private MemoryDataSource memoryDS; + private readonly MemoryDataSource memoryDS; public AccountTestStep(MemoryDataSource memoryDS, DataverseDataSource dataverseDataSource, EntityOperationReducer reducer, BatchProcessor batchProcessor) { @@ -51,9 +51,9 @@ public override IReadOnlyList> OnBeforeDelivery(IReadOnlyL return reducer.ReduceOperations(batch, entity => entity.GetAttributeValue("name")); } - public override async Task RunAsync() + public override async Task RunAsync(string stepName) { - await batchProcessor.ProcessAllBatchesAsync(this); + await batchProcessor.ProcessAllBatchesAsync(this, stepName); } public override IDataSource OutputDataSource => dataverseDataSource; @@ -73,7 +73,7 @@ public override IReadOnlyList> MapRecord(Account source) } }; - return new[] { new DataOperation("Create", result) }; + return [new DataOperation("Create", result)]; } } diff --git a/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/ContactInvalidDependencyTestStep.cs b/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/ContactInvalidDependencyTestStep.cs index ae39946..b221a53 100644 --- a/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/ContactInvalidDependencyTestStep.cs +++ b/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/ContactInvalidDependencyTestStep.cs @@ -59,9 +59,9 @@ public override IReadOnlyList> OnBeforeDelivery(IReadOnlyL )); } - public override async Task RunAsync() + public override async Task RunAsync(string stepName) { - await batchProcessor.ProcessAllBatchesAsync(this); + await batchProcessor.ProcessAllBatchesAsync(this, stepName); } public override IDataSource OutputDataSource => dataverseDataSource; diff --git a/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/ContactTestStep.cs b/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/ContactTestStep.cs index 65598de..33e6921 100644 --- a/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/ContactTestStep.cs +++ b/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/ContactTestStep.cs @@ -12,7 +12,7 @@ internal class ContactTestStep : BatchIntegrationStep private readonly DataverseDataSource dataverseDataSource; private readonly EntityOperationReducer reducer; private readonly BatchProcessor batchProcessor; - private MemoryDataSource memoryDS; + private readonly MemoryDataSource memoryDS; public ContactTestStep(MemoryDataSource memoryDS, DataverseDataSource dataverseDataSource, EntityOperationReducer reducer, BatchProcessor batchProcessor) { @@ -59,9 +59,9 @@ public override IReadOnlyList> OnBeforeDelivery(IReadOnlyL )); } - public override async Task RunAsync() + public override async Task RunAsync(string stepName) { - await batchProcessor.ProcessAllBatchesAsync(this); + await batchProcessor.ProcessAllBatchesAsync(this, stepName); } public override IDataSource OutputDataSource => dataverseDataSource; @@ -82,7 +82,7 @@ public override IReadOnlyList> MapRecord(Contact source) } }; - return new[] { new DataOperation("Create", result) }; + return [new DataOperation("Create", result)]; } } diff --git a/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/EmailTestStepcs.cs b/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/EmailTestStepcs.cs index 33c9859..b78ff7d 100644 --- a/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/EmailTestStepcs.cs +++ b/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/EmailTestStepcs.cs @@ -13,7 +13,7 @@ internal class EmailTestStep : BatchIntegrationStep private readonly DataverseDataSource dataverseDataSource; private readonly EntityOperationReducer reducer; private readonly BatchProcessor batchProcessor; - private MemoryDataSource memoryDS; + private readonly MemoryDataSource memoryDS; public EmailTestStep(MemoryDataSource memoryDS, DataverseDataSource dataverseDataSource, EntityOperationReducer reducer, BatchProcessor batchProcessor) { @@ -51,9 +51,9 @@ public override IReadOnlyList> OnBeforeDelivery(IReadOnlyL return reducer.ReduceOperations(batch, entity => entity.GetAttributeValue("subject")); } - public override async Task RunAsync() + public override async Task RunAsync(string stepName) { - await batchProcessor.ProcessAllBatchesAsync(this); + await batchProcessor.ProcessAllBatchesAsync(this, stepName); } public override IDataSource OutputDataSource => dataverseDataSource; @@ -73,7 +73,7 @@ public override IReadOnlyList> MapRecord(Email source) } }; - return new[] { new DataOperation("Create", result) }; + return [new DataOperation("Create", result)]; } } diff --git a/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/LetterTestStep.cs b/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/LetterTestStep.cs index a3388c7..ed456d9 100644 --- a/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/LetterTestStep.cs +++ b/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/LetterTestStep.cs @@ -13,7 +13,7 @@ internal class LetterTestStep : BatchIntegrationStep private readonly DataverseDataSource dataverseDataSource; private readonly EntityOperationReducer reducer; private readonly BatchProcessor batchProcessor; - private MemoryDataSource memoryDS; + private readonly MemoryDataSource memoryDS; public LetterTestStep(MemoryDataSource memoryDS, DataverseDataSource dataverseDataSource, EntityOperationReducer reducer, BatchProcessor batchProcessor) { @@ -51,9 +51,9 @@ public override IReadOnlyList> OnBeforeDelivery(IReadOnlyL return reducer.ReduceOperations(batch, entity => entity.GetAttributeValue("subject")); } - public override async Task RunAsync() + public override async Task RunAsync(string stepName) { - await batchProcessor.ProcessAllBatchesAsync(this); + await batchProcessor.ProcessAllBatchesAsync(this, stepName); } public override IDataSource OutputDataSource => dataverseDataSource; @@ -73,7 +73,7 @@ public override IReadOnlyList> MapRecord(Letter source) } }; - return new[] { new DataOperation("Create", result) }; + return [new DataOperation("Create", result)]; } } diff --git a/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/TaskTestStep.cs b/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/TaskTestStep.cs index 36366c9..d27f7a4 100644 --- a/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/TaskTestStep.cs +++ b/src/Root16.Sprout.Sample.ParallelSteps/TestSteps/TaskTestStep.cs @@ -13,7 +13,7 @@ internal class TaskTestStep : BatchIntegrationStep private readonly DataverseDataSource dataverseDataSource; private readonly EntityOperationReducer reducer; private readonly BatchProcessor batchProcessor; - private MemoryDataSource memoryDS; + private readonly MemoryDataSource memoryDS; public TaskTestStep(MemoryDataSource memoryDS, DataverseDataSource dataverseDataSource, EntityOperationReducer reducer, BatchProcessor batchProcessor) { @@ -51,9 +51,9 @@ public override IReadOnlyList> OnBeforeDelivery(IReadOnlyL return reducer.ReduceOperations(batch, entity => entity.GetAttributeValue("subject")); } - public override async Task RunAsync() + public override async Task RunAsync(string stepName) { - await batchProcessor.ProcessAllBatchesAsync(this); + await batchProcessor.ProcessAllBatchesAsync(this, stepName); } public override IDataSource OutputDataSource => dataverseDataSource; @@ -73,7 +73,7 @@ public override IReadOnlyList> MapRecord(TaskData source) } }; - return new[] { new DataOperation("Create", result) }; + return [new DataOperation("Create", result)]; } } diff --git a/src/Root16.Sprout.Sample.SqlServer/GenericSampleSQLStep.cs b/src/Root16.Sprout.Sample.SqlServer/GenericSampleSQLStep.cs new file mode 100644 index 0000000..7b8dde3 --- /dev/null +++ b/src/Root16.Sprout.Sample.SqlServer/GenericSampleSQLStep.cs @@ -0,0 +1,59 @@ +using Microsoft.Data.SqlClient; +using Microsoft.Extensions.DependencyInjection; +using Root16.Sprout.BatchProcessing; +using Root16.Sprout.DataSources; +using Root16.Sprout.DataSources.Sql; +using System.Data; + +namespace Root16.Sprout.Sample.SqlServer +{ + public class GenericSampleSQLStep : BatchIntegrationStep + { + private readonly SqlDataSource _sqlDataSource; + private readonly BatchProcessor _batchProcessor; + private readonly string _keyName; + + public GenericSampleSQLStep(string keyName, IServiceProvider provider, BatchProcessor batchProcessor) + { + _keyName = keyName; + _batchProcessor = batchProcessor; + _sqlDataSource = provider.GetRequiredKeyedService(keyName); + BatchSize = 5000; + } + + public override IDataSource OutputDataSource => _sqlDataSource; + + public override IPagedQuery GetInputQuery() + { + return _sqlDataSource.CreatePagedQuery("SELECT [PersonID],[LastName],[FirstName],[Address],[City] FROM [master].[dbo].[Persons]"); + } + + public override IReadOnlyList> MapRecord(DataRow source) + { + List> operations = []; + + for (int i = 0; i < 25; i++) + { + var command = new SqlCommand + { + CommandText = "INSERT INTO [dbo].[Persons] ([PersonID],[LastName],[FirstName],[Address],[City]) VALUES (@PersonId,@LastName,@FirstName,@Address,@City)", + CommandType = CommandType.Text + }; + command.Parameters.Add(new SqlParameter("@PersonId", 5)); + command.Parameters.Add(new SqlParameter("@LastName", "Tester")); + command.Parameters.Add(new SqlParameter("@FirstName", "Tester")); + command.Parameters.Add(new SqlParameter("@Address", "Tester")); + command.Parameters.Add(new SqlParameter("@City", _keyName)); + + operations.Add(new DataOperation("Insert", command)); + } + + return operations; + } + + public override async Task RunAsync(string stepName) + { + await _batchProcessor.ProcessAllBatchesAsync(this, stepName); + } + } +} diff --git a/src/Root16.Sprout.Sample.SqlServer/Program.cs b/src/Root16.Sprout.Sample.SqlServer/Program.cs index 2db71bc..c699308 100644 --- a/src/Root16.Sprout.Sample.SqlServer/Program.cs +++ b/src/Root16.Sprout.Sample.SqlServer/Program.cs @@ -3,8 +3,10 @@ using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Root16.Sprout; +using Root16.Sprout.BatchProcessing; using Root16.Sprout.DataSources.Sql; using Root16.Sprout.Sample.SqlServer; +using System; using System.Diagnostics; HostApplicationBuilder builder = Host.CreateApplicationBuilder(args); @@ -15,13 +17,39 @@ builder.Services.RegisterStep(); +builder.Services.RegisterStep("SecondSQLDataSourceStep", (serviceProvider) => +{ + return new GenericSampleSQLStep("secondSQLDataSource", serviceProvider, serviceProvider.GetRequiredService()); +}); +builder.Services.RegisterStep("ThirdSQLDataSourceStep", (serviceProvider) => +{ + return new GenericSampleSQLStep("thirdSQLDataSource", serviceProvider, serviceProvider.GetRequiredService()); +}); + //Hide Logs Below Warning for Dataverse connections builder.Logging.AddFilter("Microsoft.PowerPlatform.Dataverse", LogLevel.Warning); -builder.Services.AddScoped((serviceProvider) => +builder.Services.AddKeyedScoped(null, (serviceProvider, key) => +{ + var connectionString = "Server=localhost\\MSSQLSERVER01;Database=master;Integrated Security=True;Trusted_Connection=True;TrustServerCertificate=true;"; + var loggerFactory = serviceProvider.GetRequiredService(); + var dataSource = new SqlDataSource(connectionString, loggerFactory); + + return dataSource; +}); + +builder.Services.AddKeyedScoped("secondSQLDataSource", (serviceProvider, key) => +{ + var connectionString = "Server=localhost\\MSSQLSERVER01;Database=master;Integrated Security=True;Trusted_Connection=True;TrustServerCertificate=true;"; + var loggerFactory = serviceProvider.GetRequiredService(); + var dataSource = new SqlDataSource(connectionString, loggerFactory); + + return dataSource; +}); + +builder.Services.AddKeyedScoped("thirdSQLDataSource", (serviceProvider, key) => { var connectionString = "Server=localhost\\MSSQLSERVER01;Database=master;Integrated Security=True;Trusted_Connection=True;TrustServerCertificate=true;"; - Debugger.Break(); var loggerFactory = serviceProvider.GetRequiredService(); var dataSource = new SqlDataSource(connectionString, loggerFactory); diff --git a/src/Root16.Sprout.Sample.SqlServer/SampleSQLStep.cs b/src/Root16.Sprout.Sample.SqlServer/SampleSQLStep.cs index 875420e..9bd382d 100644 --- a/src/Root16.Sprout.Sample.SqlServer/SampleSQLStep.cs +++ b/src/Root16.Sprout.Sample.SqlServer/SampleSQLStep.cs @@ -15,7 +15,7 @@ public SampleSQLStep(BatchProcessor batchProcessor, SqlDataSource sqlDataSource) { _batchProcessor = batchProcessor; _sqlDataSource = sqlDataSource; - BatchSize = 50; + BatchSize = 5000; } public override IDataSource OutputDataSource => _sqlDataSource; @@ -30,14 +30,14 @@ public override IReadOnlyList> MapRecord(DataRow sourc { List> operations = []; - for (int i = 0; i < 25; i++) + for (int i = 0; i < 10; i++) { var command = new SqlCommand { CommandText = "INSERT INTO [dbo].[Persons] ([PersonID],[LastName],[FirstName],[Address],[City]) VALUES (@PersonId,@LastName,@FirstName,@Address,@City)", CommandType = CommandType.Text }; - command.Parameters.Add(new SqlParameter("@PersonId", 5)); + command.Parameters.Add(new SqlParameter("@PersonId", 9)); command.Parameters.Add(new SqlParameter("@LastName", "Tester")); command.Parameters.Add(new SqlParameter("@FirstName", "Tester")); command.Parameters.Add(new SqlParameter("@Address", "Tester")); @@ -49,9 +49,9 @@ public override IReadOnlyList> MapRecord(DataRow sourc return operations; } - public override async Task RunAsync() + public override async Task RunAsync(string stepName) { - await _batchProcessor.ProcessAllBatchesAsync(this); + await _batchProcessor.ProcessAllBatchesAsync(this, stepName); } } } diff --git a/src/Root16.Sprout.SqlServer/packages.lock.json b/src/Root16.Sprout.SqlServer/packages.lock.json index a3762fd..2625b2d 100644 --- a/src/Root16.Sprout.SqlServer/packages.lock.json +++ b/src/Root16.Sprout.SqlServer/packages.lock.json @@ -107,16 +107,16 @@ }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" }, "Microsoft.Extensions.Http": { "type": "Transitive", @@ -1148,6 +1148,8 @@ "type": "Project", "dependencies": { "Microsoft.Data.SqlClient": "[5.2.0, )", + "Microsoft.Extensions.DependencyInjection": "[8.0.0, )", + "Microsoft.Extensions.DependencyInjection.Abstractions": "[8.0.0, )", "Microsoft.Extensions.Logging": "[7.0.0, )", "Microsoft.Extensions.Logging.Console": "[7.0.0, )", "Microsoft.PowerPlatform.Dataverse.Client": "[1.1.16, )" @@ -1260,16 +1262,16 @@ }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" }, "Microsoft.Extensions.Http": { "type": "Transitive", @@ -2293,6 +2295,8 @@ "type": "Project", "dependencies": { "Microsoft.Data.SqlClient": "[5.2.0, )", + "Microsoft.Extensions.DependencyInjection": "[8.0.0, )", + "Microsoft.Extensions.DependencyInjection.Abstractions": "[8.0.0, )", "Microsoft.Extensions.Logging": "[7.0.0, )", "Microsoft.Extensions.Logging.Console": "[7.0.0, )", "Microsoft.PowerPlatform.Dataverse.Client": "[1.1.16, )" @@ -2405,16 +2409,16 @@ }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" }, "Microsoft.Extensions.Http": { "type": "Transitive", @@ -3446,6 +3450,8 @@ "type": "Project", "dependencies": { "Microsoft.Data.SqlClient": "[5.2.0, )", + "Microsoft.Extensions.DependencyInjection": "[8.0.0, )", + "Microsoft.Extensions.DependencyInjection.Abstractions": "[8.0.0, )", "Microsoft.Extensions.Logging": "[7.0.0, )", "Microsoft.Extensions.Logging.Console": "[7.0.0, )", "Microsoft.PowerPlatform.Dataverse.Client": "[1.1.16, )" diff --git a/src/Root16.Sprout/BatchProcessing/BatchIntegrationStep.cs b/src/Root16.Sprout/BatchProcessing/BatchIntegrationStep.cs index 7b44523..764389e 100644 --- a/src/Root16.Sprout/BatchProcessing/BatchIntegrationStep.cs +++ b/src/Root16.Sprout/BatchProcessing/BatchIntegrationStep.cs @@ -36,6 +36,6 @@ public virtual void OnAfterDelivery(IReadOnlyList> public virtual IReadOnlyList> OnBeforeDelivery(IReadOnlyList> batch) => batch; public virtual IReadOnlyList OnBeforeMap(IReadOnlyList batch) => batch; - public abstract Task RunAsync(); + public abstract Task RunAsync(string stepName); } diff --git a/src/Root16.Sprout/BatchProcessing/BatchProcessor.cs b/src/Root16.Sprout/BatchProcessing/BatchProcessor.cs index ab4312a..09ad019 100644 --- a/src/Root16.Sprout/BatchProcessing/BatchProcessor.cs +++ b/src/Root16.Sprout/BatchProcessing/BatchProcessor.cs @@ -8,19 +8,19 @@ public class BatchProcessor(IProgressListener progressListener) private readonly IProgressListener progressListener = progressListener; public async Task ProcessAllBatchesAsync( - IBatchIntegrationStep step) + IBatchIntegrationStep step, string stepName) { BatchState? batchState = null; do { - batchState = await ProcessBatchAsync(step, batchState); + batchState = await ProcessBatchAsync(step, stepName, batchState); } while (batchState.QueryState?.MoreRecords == true); } public async Task> ProcessBatchAsync( - IBatchIntegrationStep step, + IBatchIntegrationStep step, string stepName, BatchState? batchState) { @@ -35,7 +35,7 @@ public async Task> ProcessBatchAsync( queryState = new(0, step.BatchSize, 0, total, true, null); } - progress ??= new IntegrationProgress(step.GetType().Name, queryState.TotalRecordCount); + progress ??= new IntegrationProgress(stepName, queryState.TotalRecordCount); // get batch of data (IPagedQuery) var result = await query.GetNextPageAsync(queryState.NextPageNumber, queryState.RecordsPerPage, queryState.Bookmark); diff --git a/src/Root16.Sprout/DependencyInjection/StepRegistration.cs b/src/Root16.Sprout/DependencyInjection/StepRegistration.cs index ebc8d3c..faa0261 100644 --- a/src/Root16.Sprout/DependencyInjection/StepRegistration.cs +++ b/src/Root16.Sprout/DependencyInjection/StepRegistration.cs @@ -6,7 +6,8 @@ public class StepRegistration public string Name { get; } public List PrerequisteSteps { get; } = []; internal HashSet DependentSteps { get; set; } = new HashSet(StringComparer.OrdinalIgnoreCase); - public StepRegistration(Type stepType, List? prerequisteSteps = null) + + public StepRegistration(Type stepType, List? prerequisteSteps = default) { StepType = stepType; Name = stepType.Name; @@ -15,4 +16,15 @@ public StepRegistration(Type stepType, List? prerequisteSteps = null) PrerequisteSteps = prerequisteSteps; } } + + public StepRegistration(Type stepType, string name, List? prerequisteSteps = default) + { + StepType = stepType; + Name = name; + if(prerequisteSteps is not null) + { + PrerequisteSteps = prerequisteSteps; + } + } + } \ No newline at end of file diff --git a/src/Root16.Sprout/IIntegrationStep.cs b/src/Root16.Sprout/IIntegrationStep.cs index c54ba8a..d07d6b2 100644 --- a/src/Root16.Sprout/IIntegrationStep.cs +++ b/src/Root16.Sprout/IIntegrationStep.cs @@ -2,6 +2,6 @@ public interface IIntegrationStep { - Task RunAsync(); + Task RunAsync(string stepName); } diff --git a/src/Root16.Sprout/IntegrationRuntime.cs b/src/Root16.Sprout/IntegrationRuntime.cs index df40844..72d8f34 100644 --- a/src/Root16.Sprout/IntegrationRuntime.cs +++ b/src/Root16.Sprout/IntegrationRuntime.cs @@ -1,4 +1,5 @@ using Microsoft.Extensions.DependencyInjection; +using Root16.Sprout.BatchProcessing; using Root16.Sprout.DependencyInjection; using Root16.Sprout.Progress; @@ -10,10 +11,12 @@ public class IntegrationRuntime : IIntegrationRuntime private readonly IEnumerable stepRegistrations = []; private readonly IServiceScopeFactory serviceScopeFactory; private readonly IProgressListener progressListener; + private readonly IEnumerable _steps; - public IntegrationRuntime(IEnumerable stepRegistrations, IServiceScopeFactory serviceScopeFactory, IProgressListener progressListener) + public IntegrationRuntime(IEnumerable stepRegistrations, IEnumerable steps, IServiceScopeFactory serviceScopeFactory, IProgressListener progressListener) { this.stepRegistrations = stepRegistrations; + _steps = steps; this.serviceScopeFactory = serviceScopeFactory; this.progressListener = progressListener; CheckRegistrations(); @@ -38,8 +41,8 @@ private async Task RunStepAsync(StepRegistration reg) { progressListener.OnStepStart(reg.Name); using var scope = serviceScopeFactory.CreateScope(); - var step = (IIntegrationStep)scope.ServiceProvider.GetRequiredService(reg.StepType); - await step.RunAsync(); + var step = (IIntegrationStep)scope.ServiceProvider.GetRequiredKeyedService(reg.StepType, reg.Name); + await step.RunAsync(reg.Name); progressListener.OnStepComplete(reg.Name); return reg.Name; } diff --git a/src/Root16.Sprout/Progress/IntegrationProgress.cs b/src/Root16.Sprout/Progress/IntegrationProgress.cs index e8f4415..bd60987 100644 --- a/src/Root16.Sprout/Progress/IntegrationProgress.cs +++ b/src/Root16.Sprout/Progress/IntegrationProgress.cs @@ -91,7 +91,7 @@ public override string ToString() } } - message.Append($"{values[values.Length - 1].Interval}{values[values.Length - 1].Label} remaining "); + message.Append($"{values[^1].Interval}{values[^1].Label} remaining "); } message.Append( diff --git a/src/Root16.Sprout/Root16.Sprout.csproj b/src/Root16.Sprout/Root16.Sprout.csproj index 353459d..1375351 100644 --- a/src/Root16.Sprout/Root16.Sprout.csproj +++ b/src/Root16.Sprout/Root16.Sprout.csproj @@ -36,6 +36,8 @@ + + diff --git a/src/Root16.Sprout/ServiceCollectionExtensions.cs b/src/Root16.Sprout/ServiceCollectionExtensions.cs index dd98961..57636a3 100644 --- a/src/Root16.Sprout/ServiceCollectionExtensions.cs +++ b/src/Root16.Sprout/ServiceCollectionExtensions.cs @@ -11,7 +11,37 @@ public static class ServiceCollectionExtensions public static IServiceCollection RegisterStep(this IServiceCollection services, params string[] prerequisiteStepNames) where TStep : class, IIntegrationStep { services.AddSingleton(new StepRegistration(typeof(TStep), [.. prerequisiteStepNames])); - services.AddTransient(); + services.AddKeyedTransient(typeof(TStep).Name); + + return services; + } + + public static IServiceCollection RegisterStep(this IServiceCollection services, string StepName, params string[] prerequisiteStepNames) where TStep : class, IIntegrationStep + { + services.AddSingleton(new StepRegistration(typeof(TStep), StepName, [.. prerequisiteStepNames])); + services.AddKeyedTransient(StepName); + + return services; + } + + public static IServiceCollection RegisterStep(this IServiceCollection services, Func implementationFactory, params string[] prerequisiteStepNames) where TStep : class, IIntegrationStep + { + services.AddSingleton(new StepRegistration(typeof(TStep), [.. prerequisiteStepNames])); + services.AddKeyedTransient(typeof(TStep).Name, (serviceProvider, myKey) => + { + return implementationFactory(serviceProvider); + }); + + return services; + } + + public static IServiceCollection RegisterStep(this IServiceCollection services, string StepName, Func implementationFactory, params string[] prerequisiteStepNames) where TStep : class, IIntegrationStep + { + services.AddSingleton(new StepRegistration(typeof(TStep), StepName, [.. prerequisiteStepNames])); + services.AddKeyedTransient(StepName, (serviceProvider, myKey) => + { + return implementationFactory(serviceProvider); + }); return services; } diff --git a/src/Root16.Sprout/packages.lock.json b/src/Root16.Sprout/packages.lock.json index 8f57c50..0733a65 100644 --- a/src/Root16.Sprout/packages.lock.json +++ b/src/Root16.Sprout/packages.lock.json @@ -18,6 +18,21 @@ "System.Runtime.Caching": "6.0.0" } }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" + }, "Microsoft.Extensions.Logging": { "type": "Direct", "requested": "[7.0.0, )", @@ -182,19 +197,6 @@ "Microsoft.Extensions.Configuration.Abstractions": "7.0.0" } }, - "Microsoft.Extensions.DependencyInjection": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==" - }, "Microsoft.Extensions.Http": { "type": "Transitive", "resolved": "3.1.8", @@ -1185,6 +1187,21 @@ "System.Runtime.Caching": "6.0.0" } }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" + }, "Microsoft.Extensions.Logging": { "type": "Direct", "requested": "[7.0.0, )", @@ -1348,19 +1365,6 @@ "Microsoft.Extensions.Configuration.Abstractions": "7.0.0" } }, - "Microsoft.Extensions.DependencyInjection": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==" - }, "Microsoft.Extensions.Http": { "type": "Transitive", "resolved": "3.1.8", @@ -2344,6 +2348,21 @@ "System.Runtime.Caching": "8.0.0" } }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Direct", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" + }, "Microsoft.Extensions.Logging": { "type": "Direct", "requested": "[7.0.0, )", @@ -2507,19 +2526,6 @@ "Microsoft.Extensions.Configuration.Abstractions": "7.0.0" } }, - "Microsoft.Extensions.DependencyInjection": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==" - }, "Microsoft.Extensions.Http": { "type": "Transitive", "resolved": "3.1.8", From 8de6fcbb923cb6bfc83f8bec90cc0773fdff1eb0 Mon Sep 17 00:00:00 2001 From: John Peters Date: Tue, 2 Jul 2024 22:25:07 -0400 Subject: [PATCH 12/34] Adding pulling SQL Queries from a file Removed unneeded RegisterStep method Add required object for keyed implementation factory --- .../GenericSampleSQLStep.cs | 6 +- src/Root16.Sprout.Sample.SqlServer/Program.cs | 14 +++-- .../Root16.Sprout.Sample.SqlServer.csproj | 4 ++ .../SQLFiles/count.sql | 4 ++ .../SQLFiles/query.sql | 4 ++ .../SampleSQLFileStep.cs | 57 +++++++++++++++++++ .../SampleSQLFilesStep.cs | 57 +++++++++++++++++++ .../SampleSQLStep.cs | 6 +- .../DataSources/Sql/SqlDataSource.cs | 16 ++++++ .../DataSources/Sql/SqlPagedQuery.cs | 7 ++- .../ServiceCollectionExtensions.cs | 16 ++---- 11 files changed, 166 insertions(+), 25 deletions(-) create mode 100644 src/Root16.Sprout.Sample.SqlServer/SQLFiles/count.sql create mode 100644 src/Root16.Sprout.Sample.SqlServer/SQLFiles/query.sql create mode 100644 src/Root16.Sprout.Sample.SqlServer/SampleSQLFileStep.cs create mode 100644 src/Root16.Sprout.Sample.SqlServer/SampleSQLFilesStep.cs diff --git a/src/Root16.Sprout.Sample.SqlServer/GenericSampleSQLStep.cs b/src/Root16.Sprout.Sample.SqlServer/GenericSampleSQLStep.cs index 7b8dde3..a246a2d 100644 --- a/src/Root16.Sprout.Sample.SqlServer/GenericSampleSQLStep.cs +++ b/src/Root16.Sprout.Sample.SqlServer/GenericSampleSQLStep.cs @@ -18,7 +18,7 @@ public GenericSampleSQLStep(string keyName, IServiceProvider provider, BatchProc _keyName = keyName; _batchProcessor = batchProcessor; _sqlDataSource = provider.GetRequiredKeyedService(keyName); - BatchSize = 5000; + BatchSize = 1; } public override IDataSource OutputDataSource => _sqlDataSource; @@ -32,11 +32,11 @@ public override IReadOnlyList> MapRecord(DataRow sourc { List> operations = []; - for (int i = 0; i < 25; i++) + for (int i = 0; i < 2; i++) { var command = new SqlCommand { - CommandText = "INSERT INTO [dbo].[Persons] ([PersonID],[LastName],[FirstName],[Address],[City]) VALUES (@PersonId,@LastName,@FirstName,@Address,@City)", + CommandText = "INSERT INTO [dbo].[MorePersons] ([PersonID],[LastName],[FirstName],[Address],[City]) VALUES (@PersonId,@LastName,@FirstName,@Address,@City)", CommandType = CommandType.Text }; command.Parameters.Add(new SqlParameter("@PersonId", 5)); diff --git a/src/Root16.Sprout.Sample.SqlServer/Program.cs b/src/Root16.Sprout.Sample.SqlServer/Program.cs index c699308..45a0158 100644 --- a/src/Root16.Sprout.Sample.SqlServer/Program.cs +++ b/src/Root16.Sprout.Sample.SqlServer/Program.cs @@ -16,14 +16,16 @@ builder.Services.AddSproutDataverse(); builder.Services.RegisterStep(); +builder.Services.RegisterStep(); +builder.Services.RegisterStep(); -builder.Services.RegisterStep("SecondSQLDataSourceStep", (serviceProvider) => +builder.Services.RegisterStep("SecondSQLDataSourceStep", (serviceProvider, myKey) => { - return new GenericSampleSQLStep("secondSQLDataSource", serviceProvider, serviceProvider.GetRequiredService()); + return new GenericSampleSQLStep(myKey as string, serviceProvider, serviceProvider.GetRequiredService()); }); -builder.Services.RegisterStep("ThirdSQLDataSourceStep", (serviceProvider) => +builder.Services.RegisterStep("ThirdSQLDataSourceStep", (serviceProvider, myKey) => { - return new GenericSampleSQLStep("thirdSQLDataSource", serviceProvider, serviceProvider.GetRequiredService()); + return new GenericSampleSQLStep(myKey as string, serviceProvider, serviceProvider.GetRequiredService()); }); //Hide Logs Below Warning for Dataverse connections @@ -38,7 +40,7 @@ return dataSource; }); -builder.Services.AddKeyedScoped("secondSQLDataSource", (serviceProvider, key) => +builder.Services.AddKeyedScoped("SecondSQLDataSourceStep", (serviceProvider, key) => { var connectionString = "Server=localhost\\MSSQLSERVER01;Database=master;Integrated Security=True;Trusted_Connection=True;TrustServerCertificate=true;"; var loggerFactory = serviceProvider.GetRequiredService(); @@ -47,7 +49,7 @@ return dataSource; }); -builder.Services.AddKeyedScoped("thirdSQLDataSource", (serviceProvider, key) => +builder.Services.AddKeyedScoped("ThirdSQLDataSourceStep", (serviceProvider, key) => { var connectionString = "Server=localhost\\MSSQLSERVER01;Database=master;Integrated Security=True;Trusted_Connection=True;TrustServerCertificate=true;"; var loggerFactory = serviceProvider.GetRequiredService(); diff --git a/src/Root16.Sprout.Sample.SqlServer/Root16.Sprout.Sample.SqlServer.csproj b/src/Root16.Sprout.Sample.SqlServer/Root16.Sprout.Sample.SqlServer.csproj index b717918..679675a 100644 --- a/src/Root16.Sprout.Sample.SqlServer/Root16.Sprout.Sample.SqlServer.csproj +++ b/src/Root16.Sprout.Sample.SqlServer/Root16.Sprout.Sample.SqlServer.csproj @@ -19,4 +19,8 @@ + + + + diff --git a/src/Root16.Sprout.Sample.SqlServer/SQLFiles/count.sql b/src/Root16.Sprout.Sample.SqlServer/SQLFiles/count.sql new file mode 100644 index 0000000..9012f72 --- /dev/null +++ b/src/Root16.Sprout.Sample.SqlServer/SQLFiles/count.sql @@ -0,0 +1,4 @@ +SELECT + count(*) as Count +FROM + [master].[dbo].[Persons]; \ No newline at end of file diff --git a/src/Root16.Sprout.Sample.SqlServer/SQLFiles/query.sql b/src/Root16.Sprout.Sample.SqlServer/SQLFiles/query.sql new file mode 100644 index 0000000..e5dfb64 --- /dev/null +++ b/src/Root16.Sprout.Sample.SqlServer/SQLFiles/query.sql @@ -0,0 +1,4 @@ +SELECT + [PersonID],[LastName],[FirstName],[Address],[City] +FROM + [master].[dbo].[Persons]; \ No newline at end of file diff --git a/src/Root16.Sprout.Sample.SqlServer/SampleSQLFileStep.cs b/src/Root16.Sprout.Sample.SqlServer/SampleSQLFileStep.cs new file mode 100644 index 0000000..5d96e7a --- /dev/null +++ b/src/Root16.Sprout.Sample.SqlServer/SampleSQLFileStep.cs @@ -0,0 +1,57 @@ +using Microsoft.Data.SqlClient; +using Root16.Sprout.BatchProcessing; +using Root16.Sprout.DataSources; +using Root16.Sprout.DataSources.Sql; +using System.Data; + +namespace Root16.Sprout.Sample.SqlServer +{ + public class SampleSQLFileStep : BatchIntegrationStep + { + private readonly SqlDataSource _sqlDataSource; + private readonly BatchProcessor _batchProcessor; + + public SampleSQLFileStep(BatchProcessor batchProcessor, SqlDataSource sqlDataSource) + { + _batchProcessor = batchProcessor; + _sqlDataSource = sqlDataSource; + BatchSize = 1; + } + + public override IDataSource OutputDataSource => _sqlDataSource; + + //Todo: Add + public override IPagedQuery GetInputQuery() + { + return _sqlDataSource.CreatePagedQueryFromFile(@"..\..\..\SQLFiles\query.sql", @"SELECT count(*) as Count FROM [master].[dbo].[Persons];"); + } + + public override IReadOnlyList> MapRecord(DataRow source) + { + List> operations = []; + + for (int i = 0; i < 2; i++) + { + var command = new SqlCommand + { + CommandText = "INSERT INTO [dbo].[MorePersons] ([PersonID],[LastName],[FirstName],[Address],[City]) VALUES (@PersonId,@LastName,@FirstName,@Address,@City)", + CommandType = CommandType.Text + }; + command.Parameters.Add(new SqlParameter("@PersonId", 12)); + command.Parameters.Add(new SqlParameter("@LastName", "Tester")); + command.Parameters.Add(new SqlParameter("@FirstName", "Tester")); + command.Parameters.Add(new SqlParameter("@Address", "Tester")); + command.Parameters.Add(new SqlParameter("@City", "SingularFile")); + + operations.Add(new DataOperation("Insert", command)); + } + + return operations; + } + + public override async Task RunAsync(string stepName) + { + await _batchProcessor.ProcessAllBatchesAsync(this, stepName); + } + } +} diff --git a/src/Root16.Sprout.Sample.SqlServer/SampleSQLFilesStep.cs b/src/Root16.Sprout.Sample.SqlServer/SampleSQLFilesStep.cs new file mode 100644 index 0000000..54117ac --- /dev/null +++ b/src/Root16.Sprout.Sample.SqlServer/SampleSQLFilesStep.cs @@ -0,0 +1,57 @@ +using Microsoft.Data.SqlClient; +using Root16.Sprout.BatchProcessing; +using Root16.Sprout.DataSources; +using Root16.Sprout.DataSources.Sql; +using System.Data; + +namespace Root16.Sprout.Sample.SqlServer +{ + public class SampleSQLFilesStep : BatchIntegrationStep + { + private readonly SqlDataSource _sqlDataSource; + private readonly BatchProcessor _batchProcessor; + + public SampleSQLFilesStep(BatchProcessor batchProcessor, SqlDataSource sqlDataSource) + { + _batchProcessor = batchProcessor; + _sqlDataSource = sqlDataSource; + BatchSize = 1; + } + + public override IDataSource OutputDataSource => _sqlDataSource; + + //Todo: Add + public override IPagedQuery GetInputQuery() + { + return _sqlDataSource.CreatePagedQueryFromFiles(@"..\..\..\SQLFiles\query.sql", @"..\..\..\SQLFiles\count.sql"); + } + + public override IReadOnlyList> MapRecord(DataRow source) + { + List> operations = []; + + for (int i = 0; i < 2; i++) + { + var command = new SqlCommand + { + CommandText = "INSERT INTO [dbo].[MorePersons] ([PersonID],[LastName],[FirstName],[Address],[City]) VALUES (@PersonId,@LastName,@FirstName,@Address,@City)", + CommandType = CommandType.Text + }; + command.Parameters.Add(new SqlParameter("@PersonId", 21)); + command.Parameters.Add(new SqlParameter("@LastName", "Tester")); + command.Parameters.Add(new SqlParameter("@FirstName", "Tester")); + command.Parameters.Add(new SqlParameter("@Address", "Tester")); + command.Parameters.Add(new SqlParameter("@City", "TwoFiles")); + + operations.Add(new DataOperation("Insert", command)); + } + + return operations; + } + + public override async Task RunAsync(string stepName) + { + await _batchProcessor.ProcessAllBatchesAsync(this, stepName); + } + } +} diff --git a/src/Root16.Sprout.Sample.SqlServer/SampleSQLStep.cs b/src/Root16.Sprout.Sample.SqlServer/SampleSQLStep.cs index 9bd382d..5870acf 100644 --- a/src/Root16.Sprout.Sample.SqlServer/SampleSQLStep.cs +++ b/src/Root16.Sprout.Sample.SqlServer/SampleSQLStep.cs @@ -15,7 +15,7 @@ public SampleSQLStep(BatchProcessor batchProcessor, SqlDataSource sqlDataSource) { _batchProcessor = batchProcessor; _sqlDataSource = sqlDataSource; - BatchSize = 5000; + BatchSize = 1; } public override IDataSource OutputDataSource => _sqlDataSource; @@ -30,11 +30,11 @@ public override IReadOnlyList> MapRecord(DataRow sourc { List> operations = []; - for (int i = 0; i < 10; i++) + for (int i = 0; i < 2; i++) { var command = new SqlCommand { - CommandText = "INSERT INTO [dbo].[Persons] ([PersonID],[LastName],[FirstName],[Address],[City]) VALUES (@PersonId,@LastName,@FirstName,@Address,@City)", + CommandText = "INSERT INTO [dbo].[MorePersons] ([PersonID],[LastName],[FirstName],[Address],[City]) VALUES (@PersonId,@LastName,@FirstName,@Address,@City)", CommandType = CommandType.Text }; command.Parameters.Add(new SqlParameter("@PersonId", 9)); diff --git a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs index 2eda5ff..ff52734 100644 --- a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs +++ b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs @@ -20,6 +20,22 @@ public DynamicSqlPagedQuery CreatePagedQuery(Func commandGener return new DynamicSqlPagedQuery(loggerFactory.CreateLogger(), connection, commandGenerator, totalRowCountCommandText); } + public SqlPagedQuery CreatePagedQueryFromFile(string commandFilePath, string? totalRowCountCommandText = null, bool addPaging = true) + { + using StreamReader reader = new(commandFilePath.ToString()); + var commandText = reader.ReadToEnd(); + return new SqlPagedQuery(loggerFactory.CreateLogger(), connection, commandText, totalRowCountCommandText, addPaging); + } + + public SqlPagedQuery CreatePagedQueryFromFiles(string commandFilePath, string totalRowCommandTextFilePath, bool addPaging = true) + { + using StreamReader commandReader = new(commandFilePath); + using StreamReader totalRowCommandReader = new(totalRowCommandTextFilePath); + var command = commandReader.ReadToEnd(); + var totalCommand = totalRowCommandReader.ReadToEnd(); + return new SqlPagedQuery(loggerFactory.CreateLogger(), connection, command, totalCommand, addPaging); + } + public void ExecuteNonQuery(string commandText) { using var command = connection.CreateCommand(); diff --git a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs index 3503bf9..f8f7feb 100644 --- a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs +++ b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs @@ -17,9 +17,14 @@ public class SqlPagedQuery(ILogger logger, SqlConnection connecti public async Task> GetNextPageAsync(int pageNumber, int pageSize, object? bookmark) { using var command = connection.CreateCommand(); - command.CommandText = commandText; + command.CommandText = commandText.Trim(); if (addPaging) { + if (command.CommandText.EndsWith(";")) + { + command.CommandText = command.CommandText.Remove(command.CommandText.Length - 1); + } + if (commandText.Contains("ORDER BY", StringComparison.OrdinalIgnoreCase)) { command.CommandText += $" OFFSET {pageNumber * pageSize} ROWS FETCH NEXT {pageSize} ROWS ONLY"; diff --git a/src/Root16.Sprout/ServiceCollectionExtensions.cs b/src/Root16.Sprout/ServiceCollectionExtensions.cs index 57636a3..287d9ce 100644 --- a/src/Root16.Sprout/ServiceCollectionExtensions.cs +++ b/src/Root16.Sprout/ServiceCollectionExtensions.cs @@ -16,31 +16,23 @@ public static IServiceCollection RegisterStep(this IServiceCollection ser return services; } - public static IServiceCollection RegisterStep(this IServiceCollection services, string StepName, params string[] prerequisiteStepNames) where TStep : class, IIntegrationStep - { - services.AddSingleton(new StepRegistration(typeof(TStep), StepName, [.. prerequisiteStepNames])); - services.AddKeyedTransient(StepName); - - return services; - } - - public static IServiceCollection RegisterStep(this IServiceCollection services, Func implementationFactory, params string[] prerequisiteStepNames) where TStep : class, IIntegrationStep + public static IServiceCollection RegisterStep(this IServiceCollection services, Func keyedImplementationFactory, params string[] prerequisiteStepNames) where TStep : class, IIntegrationStep { services.AddSingleton(new StepRegistration(typeof(TStep), [.. prerequisiteStepNames])); services.AddKeyedTransient(typeof(TStep).Name, (serviceProvider, myKey) => { - return implementationFactory(serviceProvider); + return keyedImplementationFactory(serviceProvider, myKey); }); return services; } - public static IServiceCollection RegisterStep(this IServiceCollection services, string StepName, Func implementationFactory, params string[] prerequisiteStepNames) where TStep : class, IIntegrationStep + public static IServiceCollection RegisterStep(this IServiceCollection services, string StepName, Func keyedImplementationFactory, params string[] prerequisiteStepNames) where TStep : class, IIntegrationStep { services.AddSingleton(new StepRegistration(typeof(TStep), StepName, [.. prerequisiteStepNames])); services.AddKeyedTransient(StepName, (serviceProvider, myKey) => { - return implementationFactory(serviceProvider); + return keyedImplementationFactory(serviceProvider, myKey); }); return services; From adc6f56f381289f43b1185dc21758b3441ba377e Mon Sep 17 00:00:00 2001 From: John Yenter-Briars Date: Thu, 25 Jul 2024 08:43:13 -0500 Subject: [PATCH 13/34] make operationcounts dictionary public for consumers to see progress metrics. Also add onstep start,finished,error to let consumers override methods for custom actions / logging --- .../BatchProcessing/BatchIntegrationStep.cs | 4 +++- .../BatchProcessing/BatchProcessor.cs | 3 +++ .../BatchProcessing/IBatchIntegrationStep.cs | 3 +++ .../Progress/IntegrationProgress.cs | 16 ++++++++-------- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/Root16.Sprout/BatchProcessing/BatchIntegrationStep.cs b/src/Root16.Sprout/BatchProcessing/BatchIntegrationStep.cs index 764389e..438a8ab 100644 --- a/src/Root16.Sprout/BatchProcessing/BatchIntegrationStep.cs +++ b/src/Root16.Sprout/BatchProcessing/BatchIntegrationStep.cs @@ -35,7 +35,9 @@ public virtual void OnAfterDelivery(IReadOnlyList> public virtual IReadOnlyList> OnAfterMap(IReadOnlyList> batch) => batch; public virtual IReadOnlyList> OnBeforeDelivery(IReadOnlyList> batch) => batch; public virtual IReadOnlyList OnBeforeMap(IReadOnlyList batch) => batch; - public abstract Task RunAsync(string stepName); + public virtual void OnStepStart() { } + public virtual void OnStepFinished() { } + public virtual void OnStepError() { } } diff --git a/src/Root16.Sprout/BatchProcessing/BatchProcessor.cs b/src/Root16.Sprout/BatchProcessing/BatchProcessor.cs index 09ad019..22cb7bb 100644 --- a/src/Root16.Sprout/BatchProcessing/BatchProcessor.cs +++ b/src/Root16.Sprout/BatchProcessing/BatchProcessor.cs @@ -10,6 +10,8 @@ public class BatchProcessor(IProgressListener progressListener) public async Task ProcessAllBatchesAsync( IBatchIntegrationStep step, string stepName) { + step.OnStepStart(); + BatchState? batchState = null; do { @@ -17,6 +19,7 @@ public async Task ProcessAllBatchesAsync( } while (batchState.QueryState?.MoreRecords == true); + step.OnStepFinished(); } public async Task> ProcessBatchAsync( diff --git a/src/Root16.Sprout/BatchProcessing/IBatchIntegrationStep.cs b/src/Root16.Sprout/BatchProcessing/IBatchIntegrationStep.cs index 18d41af..7f3e4e3 100644 --- a/src/Root16.Sprout/BatchProcessing/IBatchIntegrationStep.cs +++ b/src/Root16.Sprout/BatchProcessing/IBatchIntegrationStep.cs @@ -16,6 +16,9 @@ public interface IBatchIntegrationStep : IIntegrationStep Task>> OnAfterMapAsync(IReadOnlyList> batch); Task>> OnBeforeDeliveryAsync(IReadOnlyList> batch); Task OnAfterDeliveryAsync(IReadOnlyList> results); + void OnStepStart(); + void OnStepFinished(); + void OnStepError(); } diff --git a/src/Root16.Sprout/Progress/IntegrationProgress.cs b/src/Root16.Sprout/Progress/IntegrationProgress.cs index bd60987..571382f 100644 --- a/src/Root16.Sprout/Progress/IntegrationProgress.cs +++ b/src/Root16.Sprout/Progress/IntegrationProgress.cs @@ -11,12 +11,12 @@ public class IntegrationProgress public IntegrationProgress(string stepName, int? totalRecordCount) { StepName = stepName; - operationCounts = new Dictionary(StringComparer.OrdinalIgnoreCase); - TotalRecordCount = totalRecordCount; + OperationCounts = new Dictionary(StringComparer.OrdinalIgnoreCase); + TotalRecordCount = totalRecordCount; StartTime = DateTime.Now; } - private readonly Dictionary operationCounts; + public Dictionary OperationCounts { get; private set; } public string StepName { get; private set; } @@ -44,14 +44,14 @@ public void AddOperations(int processedRecordCount, IEnumerable operatio ProcessedRecordCount += processedRecordCount; foreach (var operationGroup in operations.GroupBy(o => o, StringComparer.OrdinalIgnoreCase)) { - if (operationCounts.ContainsKey(operationGroup.Key)) + if (OperationCounts.ContainsKey(operationGroup.Key)) { - operationCounts[operationGroup.Key] += operationGroup.Count(); + OperationCounts[operationGroup.Key] += operationGroup.Count(); } else { - operationCounts[operationGroup.Key] = operationGroup.Count(); - } + OperationCounts[operationGroup.Key] = operationGroup.Count(); + } } } @@ -95,7 +95,7 @@ public override string ToString() } message.Append( - string.Join(", ", operationCounts.Select(pair => $"{pair.Key}: {pair.Value}"))); + string.Join(", ", OperationCounts.Select(pair => $"{pair.Key}: {pair.Value}"))); return message.ToString(); } } From c75cb47b2ea8abc158f8c657ff61cf981bc76cc6 Mon Sep 17 00:00:00 2001 From: John Peters Date: Wed, 25 Sep 2024 14:16:24 -0400 Subject: [PATCH 14/34] Updating automatic Order By To Order By 1 --- src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs index f8f7feb..b2cc4ea 100644 --- a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs +++ b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlPagedQuery.cs @@ -31,7 +31,7 @@ public async Task> GetNextPageAsync(int pageNumber, in } else { - command.CommandText += $" ORDER BY (SELECT NULL) OFFSET {pageNumber * pageSize} ROWS FETCH NEXT {pageSize} ROWS ONLY"; + command.CommandText += $" ORDER BY 1 OFFSET {pageNumber * pageSize} ROWS FETCH NEXT {pageSize} ROWS ONLY"; } } command.Connection.Open(); From 614f951d6c9ae84a8d76f703a40b4ad02e013aee Mon Sep 17 00:00:00 2001 From: James Trieu Date: Tue, 21 Jan 2025 11:49:10 -0600 Subject: [PATCH 15/34] add sql datasource --- .../DataSources/Sql/ISqlDataSourceFactory.cs | 6 ++++++ .../Sql/ServiceCollectionExtensions.cs | 17 +++++++++++++++++ .../DataSources/Sql/SqlDataSourceFactory.cs | 18 ++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 src/Root16.Sprout.SqlServer/DataSources/Sql/ISqlDataSourceFactory.cs create mode 100644 src/Root16.Sprout.SqlServer/DataSources/Sql/ServiceCollectionExtensions.cs create mode 100644 src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSourceFactory.cs diff --git a/src/Root16.Sprout.SqlServer/DataSources/Sql/ISqlDataSourceFactory.cs b/src/Root16.Sprout.SqlServer/DataSources/Sql/ISqlDataSourceFactory.cs new file mode 100644 index 0000000..6461ea0 --- /dev/null +++ b/src/Root16.Sprout.SqlServer/DataSources/Sql/ISqlDataSourceFactory.cs @@ -0,0 +1,6 @@ +namespace Root16.Sprout.DataSources.Sql; + +public interface ISqlDataSourceFactory +{ + SqlDataSource CreateDataSource(string name); +} \ No newline at end of file diff --git a/src/Root16.Sprout.SqlServer/DataSources/Sql/ServiceCollectionExtensions.cs b/src/Root16.Sprout.SqlServer/DataSources/Sql/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..c020053 --- /dev/null +++ b/src/Root16.Sprout.SqlServer/DataSources/Sql/ServiceCollectionExtensions.cs @@ -0,0 +1,17 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; + +namespace Root16.Sprout.DataSources.Sql; + +public static partial class ServiceCollectionExtensions +{ + public static IServiceCollection AddSqlDataSource(this IServiceCollection services, string connectionStringName) + { + services.TryAddSingleton(); + return services.AddTransient(services => + { + var factory = services.GetRequiredService(); + return factory.CreateDataSource(connectionStringName); + }); + } +} diff --git a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSourceFactory.cs b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSourceFactory.cs new file mode 100644 index 0000000..8c25111 --- /dev/null +++ b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSourceFactory.cs @@ -0,0 +1,18 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; + +namespace Root16.Sprout.DataSources.Sql; + +public class SqlDataSourceFactory(IServiceProvider serviceProvider) : ISqlDataSourceFactory +{ + private readonly IServiceProvider serviceProvider = serviceProvider; + + public SqlDataSource CreateDataSource(string connectionStringName) + { + var config = serviceProvider.GetRequiredService(); + var loggerFactory = serviceProvider.GetRequiredService(); + var ds = new SqlDataSource(config.GetConnectionString(connectionStringName)!, loggerFactory); + return ds; + } +} \ No newline at end of file From 53ef5c0127dc7fc365bf12afc3af170f10f52b98 Mon Sep 17 00:00:00 2001 From: James Trieu Date: Wed, 22 Jan 2025 17:23:20 -0600 Subject: [PATCH 16/34] add datarow extensions --- .../Extensions/DataRowExtensions.cs | 116 ++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 src/Root16.Sprout.SqlServer/Extensions/DataRowExtensions.cs diff --git a/src/Root16.Sprout.SqlServer/Extensions/DataRowExtensions.cs b/src/Root16.Sprout.SqlServer/Extensions/DataRowExtensions.cs new file mode 100644 index 0000000..b184daa --- /dev/null +++ b/src/Root16.Sprout.SqlServer/Extensions/DataRowExtensions.cs @@ -0,0 +1,116 @@ +using Microsoft.Xrm.Sdk; +using System.Data; + +namespace Root16.Sprout.DataSources.Sql; + +public static partial class DataRowExtensions +{ + public static object GetValue(this DataRow row, string column) + { + return row.Table.Columns.Contains(column) ? row[column] : null!; + } + + public static TOut GetValue(this DataRow row, string column) + { + if (row.Table.Columns.Contains(column) && row[column] != null && row[column] is not DBNull) + { + return (TOut)row[column]; + } + + return default!; + } + + public static bool TryGetValue(this DataRow row, string column, out TOut value) + { + if (row.Table.Columns.Contains(column) && row[column] != null && row[column] is not DBNull) + { + value = (TOut)row[column]; + return true; + } + + value = default(TOut)!; + return false; + } + + + /// + /// Set Entity's string attribute values from the datarow's corresponding column. Datarow field and entity field types must match. Datarow field name or alias and entity field name must be the same. + /// + /// Microsoft.Xrm.Sdk.Entity + public static Entity MapStrings(this DataRow row, Entity entity, params string[] attributes) + { + foreach (var attribute in attributes) + entity[attribute.ToLower()] = row.GetValue(attribute); + return entity; + } + + /// + /// Set Entity's boolean attribute values from the datarow's corresponding column. Datarow field and entity field types must match. Datarow field name or alias and entity field name must be the same. + /// + /// Microsoft.Xrm.Sdk.Entity + public static Entity MapBooleans(this DataRow row, Entity entity, params string[] attributes) + { + foreach (var attribute in attributes) + entity[attribute.ToLower()] = row.GetValue(attribute); + return entity; + } + + /// + /// Set Entity's integer attribute values from the datarow's corresponding column. Datarow field and entity field types must match. Datarow field name or alias and entity field name must be the same. + /// + /// Microsoft.Xrm.Sdk.Entity + public static Entity MapIntegers(this DataRow row, Entity entity, params string[] attributes) + { + foreach (var attribute in attributes) + entity[attribute.ToLower()] = row.GetValue(attribute); + return entity; + + } + + /// + /// Set Entity's decimal attribute values from the datarow's corresponding column. Datarow field and entity field types must match. Datarow field name or alias and entity field name must be the same. + /// + /// Microsoft.Xrm.Sdk.Entity + public static Entity MapDecimals(this DataRow row, Entity entity, params string[] attributes) + { + foreach (var attribute in attributes) + entity[attribute.ToLower()] = row.GetValue(attribute); + + return entity; + + } + + /// + /// Set Entity's money attribute values from the datarow's corresponding column. Datarow field and entity field types must match. Datarow field name or alias and entity field name must be the same. + /// + /// Microsoft.Xrm.Sdk.Entity + public static Entity MapMonies(this DataRow row, Entity entity, params string[] attributes) + { + foreach (var attribute in attributes) + entity[attribute.ToLower()] = new Money(row.GetValue(attribute)); + return entity; + } + + /// + /// Set Entity's datetime attribute values from the datarow's corresponding column. Datarow field and entity field types must match. Datarow field name or alias and entity field name must be the same. + /// + /// Microsoft.Xrm.Sdk.Entity + public static Entity MapDateTimes(this DataRow row, Entity entity, params string[] attributes) + { + foreach (var attribute in attributes) + entity[attribute.ToLower()] = row.GetValue(attribute); + return entity; + } + + ///// + ///// Set Entity's optionset attribute values from the datarow's corresponding column. Datarow field and entity field types must match. Datarow field name or alias and entity field name must be the same. + ///// + ///// Microsoft.Xrm.Sdk.Entity + //public static Entity MapOptionSets(this DataRow row, Entity entity, IOptionSetMapper optionSetMapper, params string[] attributes) + //{ + // if (string.IsNullOrWhiteSpace(entity.LogicalName)) return entity; + // foreach (var attribute in attributes) + // entity[attribute.ToLower()] = optionSetMapper.MapOptionSetByLabel(entity.LogicalName, attribute, row.GetValue(attribute)?.Trim()); + // return entity; + //} +} \ No newline at end of file From 50831bfe66964fcbe0d9bc8816eaa32704e28e7c Mon Sep 17 00:00:00 2001 From: James Trieu Date: Thu, 23 Jan 2025 12:42:19 -0600 Subject: [PATCH 17/34] remove comment --- .../Extensions/DataRowExtensions.cs | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/Root16.Sprout.SqlServer/Extensions/DataRowExtensions.cs b/src/Root16.Sprout.SqlServer/Extensions/DataRowExtensions.cs index b184daa..59fdffa 100644 --- a/src/Root16.Sprout.SqlServer/Extensions/DataRowExtensions.cs +++ b/src/Root16.Sprout.SqlServer/Extensions/DataRowExtensions.cs @@ -101,16 +101,4 @@ public static Entity MapDateTimes(this DataRow row, Entity entity, params string entity[attribute.ToLower()] = row.GetValue(attribute); return entity; } - - ///// - ///// Set Entity's optionset attribute values from the datarow's corresponding column. Datarow field and entity field types must match. Datarow field name or alias and entity field name must be the same. - ///// - ///// Microsoft.Xrm.Sdk.Entity - //public static Entity MapOptionSets(this DataRow row, Entity entity, IOptionSetMapper optionSetMapper, params string[] attributes) - //{ - // if (string.IsNullOrWhiteSpace(entity.LogicalName)) return entity; - // foreach (var attribute in attributes) - // entity[attribute.ToLower()] = optionSetMapper.MapOptionSetByLabel(entity.LogicalName, attribute, row.GetValue(attribute)?.Trim()); - // return entity; - //} } \ No newline at end of file From 5addf5c248bdfbf56b1c45b7c7b3d5b26b06c6c7 Mon Sep 17 00:00:00 2001 From: James Trieu Date: Thu, 23 Jan 2025 13:53:38 -0600 Subject: [PATCH 18/34] update mapmonies for decimal and int types --- src/Root16.Sprout.SqlServer/Extensions/DataRowExtensions.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Root16.Sprout.SqlServer/Extensions/DataRowExtensions.cs b/src/Root16.Sprout.SqlServer/Extensions/DataRowExtensions.cs index 59fdffa..5bf2624 100644 --- a/src/Root16.Sprout.SqlServer/Extensions/DataRowExtensions.cs +++ b/src/Root16.Sprout.SqlServer/Extensions/DataRowExtensions.cs @@ -87,7 +87,11 @@ public static Entity MapDecimals(this DataRow row, Entity entity, params string[ public static Entity MapMonies(this DataRow row, Entity entity, params string[] attributes) { foreach (var attribute in attributes) - entity[attribute.ToLower()] = new Money(row.GetValue(attribute)); + { + var rowVal = row.GetValue(attribute) ?? 0m; + if (rowVal is decimal d) entity[attribute.ToLower()] = new Money(d); + else if (rowVal is int i) entity[attribute.ToLower()] = new Money(i); + } return entity; } From 1839f7917c8e7401d508bb3e8fc5566724d2218f Mon Sep 17 00:00:00 2001 From: Travis Gilbert Date: Fri, 24 Jan 2025 10:09:21 -0600 Subject: [PATCH 19/34] Entity extension updates and test cases --- .../DataSources/Dataverse/EntityExtensions.cs | 93 +++- .../EntityExtensionsTests.cs | 450 ++++++++++++++++++ .../Root16.Sprout.UnitTests.csproj | 28 ++ src/Root16.Sprout.sln | 6 + 4 files changed, 561 insertions(+), 16 deletions(-) create mode 100644 src/Root16.Sprout.UnitTests/EntityExtensionsTests.cs create mode 100644 src/Root16.Sprout.UnitTests/Root16.Sprout.UnitTests.csproj diff --git a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/EntityExtensions.cs b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/EntityExtensions.cs index 426cf57..69be915 100644 --- a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/EntityExtensions.cs +++ b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/EntityExtensions.cs @@ -1,4 +1,5 @@ using Microsoft.Xrm.Sdk; +using System.Collections.Generic; using System.Text; namespace Root16.Sprout.DataSources.Dataverse; @@ -25,7 +26,68 @@ public static Entity CloneWithModifiedAttributes(this Entity updates, Entity ori different = true; } } - else if (updateValue is Money || originalValue is Money) + else if (updateValue is EntityReferenceCollection || originalValue is EntityReferenceCollection) + { + var originalCollection = (EntityReferenceCollection)originalValue; + var updateCollection = (EntityReferenceCollection)updateValue; + + var groupedOriginalCollection = originalCollection.GroupBy(o => o.LogicalName).OrderBy(g => g.Key).ToList(); + var groupedUpdateCollection = updateCollection.GroupBy(o => o.LogicalName).OrderBy(g => g.Key).ToList(); + + // Check If Same Amount Of Groups + if (groupedOriginalCollection.Count != groupedUpdateCollection.Count) + { + different = true; + } + else + { + var originalTypes = groupedOriginalCollection.Select(g => g.Key).Distinct(); + var updateTypes = groupedUpdateCollection.Select(g => g.Key).Distinct(); + + // Check if the distinct record types are the same + if (!originalTypes.SequenceEqual(updateTypes)) + { + different = true; + } + else + { + // Loop through each group and check if they have the same amount of records + foreach (var originalGroup in groupedOriginalCollection) + { + var updateGroup = groupedUpdateCollection.FirstOrDefault(g => g.Key == originalGroup.Key); + if (updateGroup == null || originalGroup.Count() != updateGroup.Count()) + { + different = true; + break; + } + + var originalIds = new HashSet(originalGroup.Select(o => o.Id)); + var updateIds = new HashSet(updateGroup.Select(u => u.Id)); + + if (!originalIds.SetEquals(updateIds)) + { + different = true; + break; + } + } + } + } + } + else if (updateValue is EntityCollection || originalValue is EntityCollection) + { + var originalCollection = (EntityCollection)originalValue; + var updateCollection = (EntityCollection)updateValue; + + var originalPartyIds = new HashSet(originalCollection.Entities.Select(e => e.GetAttributeValue("partyid").Id)); + var updatePartyIds = new HashSet(updateCollection.Entities.Select(e => e.GetAttributeValue("partyid").Id)); + + if (!originalPartyIds.SetEquals(updatePartyIds)) + { + different = true; + } + + } + else if (updateValue is Money || originalValue is Money) { var originalMoney = (Money)originalValue; var updateMoney = (Money)updateValue; @@ -69,23 +131,22 @@ public static Entity CloneWithModifiedAttributes(this Entity updates, Entity ori different = true; } } - else + else if (updateValue is DateTime || originalValue is DateTime) { - if (updateValue is DateTime dt) - { - updateValue = (new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, dt.Kind)).ToUniversalTime(); - if (originalValue is DateTime time) - { - originalValue = time.ToUniversalTime(); - } - } - - if (!Equals(updateValue, originalValue)) - { - different = true; - } - } + if (updateValue is DateTime dt) + { + updateValue = (new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, dt.Kind)).ToUniversalTime(); + if (originalValue is DateTime time) + { + originalValue = time.ToUniversalTime(); + } + } + if (!Equals(updateValue, originalValue)) + { + different = true; + } + } if (different) { diff --git a/src/Root16.Sprout.UnitTests/EntityExtensionsTests.cs b/src/Root16.Sprout.UnitTests/EntityExtensionsTests.cs new file mode 100644 index 0000000..910abc7 --- /dev/null +++ b/src/Root16.Sprout.UnitTests/EntityExtensionsTests.cs @@ -0,0 +1,450 @@ +using System.ComponentModel; +using Microsoft.Xrm.Sdk; +using Root16.Sprout.DataSources.Dataverse; + +namespace Root16.Sprout.UnitTests +{ + public class EntityExtensionsTests + { + #region EntityReferenceCollection Tests + [Fact] + public void CloneWithModifiedAttributes_ShouldDetectDifferentNumberOfGroups() + { + var originalCollection = new EntityReferenceCollection + { + new EntityReference("contact", Guid.NewGuid()) + }; + + var updateCollection = new EntityReferenceCollection + { + new EntityReference("contact", Guid.NewGuid()), + new EntityReference("account", Guid.NewGuid()) + }; + + var original = new Entity("account", Guid.NewGuid()) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "relatedEntities", originalCollection } + } + }; + + var updates = new Entity("account", original.Id) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "relatedEntities", updateCollection } + } + }; + + var delta = updates.CloneWithModifiedAttributes(original); + + Assert.Single(delta.Attributes); + Assert.Equal(updateCollection, delta["relatedEntities"]); + } + + [Fact] + public void CloneWithModifiedAttributes_ShouldDetectDifferentGroupTypes() + { + var originalCollection = new EntityReferenceCollection + { + new EntityReference("contact", Guid.NewGuid()) + }; + + var updateCollection = new EntityReferenceCollection + { + new EntityReference("account", Guid.NewGuid()) + }; + + var original = new Entity("account", Guid.NewGuid()) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "relatedEntities", originalCollection } + } + }; + + var updates = new Entity("account", original.Id) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "relatedEntities", updateCollection } + } + }; + + var delta = updates.CloneWithModifiedAttributes(original); + + Assert.Single(delta.Attributes); + Assert.Equal(updateCollection, delta["relatedEntities"]); + } + + [Fact] + public void CloneWithModifiedAttributes_ShouldDetectDifferentNumberOfRecordsInGroups() + { + var originalCollection = new EntityReferenceCollection + { + new EntityReference("contact", Guid.NewGuid()) + }; + + var updateCollection = new EntityReferenceCollection + { + new EntityReference("contact", Guid.NewGuid()), + new EntityReference("contact", Guid.NewGuid()) + }; + + var original = new Entity("account", Guid.NewGuid()) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "relatedEntities", originalCollection } + } + }; + + var updates = new Entity("account", original.Id) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "relatedEntities", updateCollection } + } + }; + + var delta = updates.CloneWithModifiedAttributes(original); + + Assert.Single(delta.Attributes); + Assert.Equal(updateCollection, delta["relatedEntities"]); + } + + [Fact] + public void CloneWithModifiedAttributes_ShouldDetectDifferentRecordsInGroups() + { + var originalCollection = new EntityReferenceCollection + { + new EntityReference("contact", Guid.NewGuid()), + new EntityReference("contact", Guid.NewGuid()) + }; + + var updateCollection = new EntityReferenceCollection + { + new EntityReference("contact", originalCollection[0].Id), + new EntityReference("contact", Guid.NewGuid()) // Different ID + }; + + var original = new Entity("account", Guid.NewGuid()) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "relatedEntities", originalCollection } + } + }; + + var updates = new Entity("account", original.Id) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "relatedEntities", updateCollection } + } + }; + + var delta = updates.CloneWithModifiedAttributes(original); + + Assert.Single(delta.Attributes); + Assert.Equal(updateCollection, delta["relatedEntities"]); + } + + [Fact] + public void CloneWithModifiedAttributes_ShouldReturnEmptyDelta_WhenRecordsAreSame() + { + var originalCollection = new EntityReferenceCollection + { + new EntityReference("contact", Guid.NewGuid()), + new EntityReference("contact", Guid.NewGuid()) + }; + + var updateCollection = new EntityReferenceCollection + { + new EntityReference("contact", originalCollection[0].Id), + new EntityReference("contact", originalCollection[1].Id) // Same IDs + }; + + var original = new Entity("account", Guid.NewGuid()) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "relatedEntities", originalCollection } + } + }; + + var updates = new Entity("account", original.Id) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "relatedEntities", updateCollection } + } + }; + + var delta = updates.CloneWithModifiedAttributes(original); + + Assert.Empty(delta.Attributes); + } + #endregion + + #region EntityCollection Tests + [Fact] + public void CloneWithModifiedAttributes_EntityCollection_SamePartyIds() + { + var original = new Entity("test_entity", Guid.NewGuid()) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "partylist", new EntityCollection(new List + { + new Entity("party") { ["partyid"] = new EntityReference("party", Guid.NewGuid()) }, + new Entity("party") { ["partyid"] = new EntityReference("party", Guid.NewGuid()) } + }) + } + } + }; + + var updates = new Entity("test_entity", original.Id) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "partylist", new EntityCollection(new List + { + new Entity("party") { ["partyid"] = original.GetAttributeValue("partylist").Entities[0].GetAttributeValue("partyid") }, + new Entity("party") { ["partyid"] = original.GetAttributeValue("partylist").Entities[1].GetAttributeValue("partyid") } + }) + } + } + }; + + var delta = updates.CloneWithModifiedAttributes(original); + + Assert.Empty(delta.Attributes); + } + + [Fact] + public void CloneWithModifiedAttributes_EntityCollection_DifferentPartyIds() + { + var original = new Entity("test_entity", Guid.NewGuid()) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "partylist", new EntityCollection(new List + { + new Entity("party") { ["partyid"] = new EntityReference("party", Guid.NewGuid()) }, + new Entity("party") { ["partyid"] = new EntityReference("party", Guid.NewGuid()) } + }) + } + } + }; + + var updates = new Entity("test_entity", original.Id) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "partylist", new EntityCollection(new List + { + new Entity("party") { ["partyid"] = new EntityReference("party", Guid.NewGuid()) }, + new Entity("party") { ["partyid"] = new EntityReference("party", Guid.NewGuid()) } + }) + } + } + }; + + var delta = updates.CloneWithModifiedAttributes(original); + + Assert.Single(delta.Attributes); + Assert.True(delta.Attributes.ContainsKey("partylist")); + } + + [Fact] + public void CloneWithModifiedAttributes_EntityCollection_EmptyOriginal() + { + var original = new Entity("test_entity", Guid.NewGuid()) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "partylist", new EntityCollection(new List()) } + } + }; + + var updates = new Entity("test_entity", original.Id) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "partylist", new EntityCollection(new List + { + new Entity("party") { ["partyid"] = new EntityReference("party", Guid.NewGuid()) } + }) + } + } + }; + + var delta = updates.CloneWithModifiedAttributes(original); + + Assert.Single(delta.Attributes); + Assert.True(delta.Attributes.ContainsKey("partylist")); + } + + [Fact] + public void CloneWithModifiedAttributes_EntityCollection_EmptyUpdates() + { + var original = new Entity("test_entity", Guid.NewGuid()) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "partylist", new EntityCollection(new List + { + new Entity("party") { ["partyid"] = new EntityReference("party", Guid.NewGuid()) } + }) + } + } + }; + + var updates = new Entity("test_entity", original.Id) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "partylist", new EntityCollection(new List()) } + } + }; + + var delta = updates.CloneWithModifiedAttributes(original); + + Assert.Single(delta.Attributes); + Assert.True(delta.Attributes.ContainsKey("partylist")); + } + #endregion + + + #region DateTime Tests + [Fact] + public void CloneWithModifiedAttributes_ShouldDetectDifferentDateTimeValues() + { + var original = new Entity("account", Guid.NewGuid()) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "modifiedon", new DateTime(2023, 1, 1, 12, 0, 0, DateTimeKind.Utc) } + } + }; + + var updates = new Entity("account", original.Id) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "modifiedon", new DateTime(2023, 1, 2, 12, 0, 0, DateTimeKind.Utc) } + } + }; + + var delta = updates.CloneWithModifiedAttributes(original); + + Assert.Single(delta.Attributes); + Assert.Equal(new DateTime(2023, 1, 2, 12, 0, 0, DateTimeKind.Utc), delta["modifiedon"]); + } + + [Fact] + public void CloneWithModifiedAttributes_ShouldReturnEmptyDelta_WhenDateTimeValuesAreSame() + { + var original = new Entity("account", Guid.NewGuid()) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "modifiedon", new DateTime(2023, 1, 1, 12, 0, 0, DateTimeKind.Utc) } + } + }; + + var updates = new Entity("account", original.Id) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "modifiedon", new DateTime(2023, 1, 1, 12, 0, 0, DateTimeKind.Utc) } + } + }; + + var delta = updates.CloneWithModifiedAttributes(original); + + Assert.Empty(delta.Attributes); + } + + [Fact] + public void CloneWithModifiedAttributes_ShouldDetectDifferentDateTimeValuesWithDifferentTimeZones() + { + var originalDateTime = new DateTime(2023, 1, 1, 12, 0, 0, DateTimeKind.Utc); + var localTimeZone = TimeZoneInfo.Local; + var updateDateTime = TimeZoneInfo.ConvertTimeToUtc(new DateTime(2023, 1, 1, 6, 0, 0, DateTimeKind.Local), localTimeZone); + + var original = new Entity("account", Guid.NewGuid()) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "modifiedon", originalDateTime } + } + }; + + var updates = new Entity("account", original.Id) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "modifiedon", updateDateTime } + } + }; + + var delta = updates.CloneWithModifiedAttributes(original); + + Assert.Empty(delta.Attributes); + } + + [Fact] + public void CloneWithModifiedAttributes_ShouldDetectNullOriginalDateTime() + { + var original = new Entity("account", Guid.NewGuid()) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "modifiedon", null } + } + }; + + var updates = new Entity("account", original.Id) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "modifiedon", new DateTime(2023, 1, 1, 12, 0, 0, DateTimeKind.Utc) } + } + }; + + var delta = updates.CloneWithModifiedAttributes(original); + + Assert.Single(delta.Attributes); + Assert.Equal(new DateTime(2023, 1, 1, 12, 0, 0, DateTimeKind.Utc), delta["modifiedon"]); + } + + [Fact] + public void CloneWithModifiedAttributes_ShouldDetectNullUpdateDateTime() + { + var original = new Entity("account", Guid.NewGuid()) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "modifiedon", new DateTime(2023, 1, 1, 12, 0, 0, DateTimeKind.Utc) } + } + }; + + var updates = new Entity("account", original.Id) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "modifiedon", null } + } + }; + + var delta = updates.CloneWithModifiedAttributes(original); + + Assert.Single(delta.Attributes); + Assert.Null(delta["modifiedon"]); + } + #endregion + } +} \ No newline at end of file diff --git a/src/Root16.Sprout.UnitTests/Root16.Sprout.UnitTests.csproj b/src/Root16.Sprout.UnitTests/Root16.Sprout.UnitTests.csproj new file mode 100644 index 0000000..884a1f8 --- /dev/null +++ b/src/Root16.Sprout.UnitTests/Root16.Sprout.UnitTests.csproj @@ -0,0 +1,28 @@ + + + + net8.0 + enable + enable + + false + true + + + + + + + + + + + + + + + + + + + diff --git a/src/Root16.Sprout.sln b/src/Root16.Sprout.sln index bcb7c1f..ac7488c 100644 --- a/src/Root16.Sprout.sln +++ b/src/Root16.Sprout.sln @@ -13,6 +13,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Root16.Sprout.Dataverse", " EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Root16.Sprout.SqlServer", "Root16.Sprout.SqlServer\Root16.Sprout.SqlServer.csproj", "{2D4771B9-310D-4829-AE16-219EFFC1A707}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Root16.Sprout.UnitTests", "Root16.Sprout.UnitTests\Root16.Sprout.UnitTests.csproj", "{EB25A8E9-F0D4-4F8A-98EA-0F27EE330598}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -39,6 +41,10 @@ Global {2D4771B9-310D-4829-AE16-219EFFC1A707}.Debug|Any CPU.Build.0 = Debug|Any CPU {2D4771B9-310D-4829-AE16-219EFFC1A707}.Release|Any CPU.ActiveCfg = Release|Any CPU {2D4771B9-310D-4829-AE16-219EFFC1A707}.Release|Any CPU.Build.0 = Release|Any CPU + {EB25A8E9-F0D4-4F8A-98EA-0F27EE330598}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EB25A8E9-F0D4-4F8A-98EA-0F27EE330598}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EB25A8E9-F0D4-4F8A-98EA-0F27EE330598}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EB25A8E9-F0D4-4F8A-98EA-0F27EE330598}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 4e8df7a83bb07358ede44c4c9b8ad97428264903 Mon Sep 17 00:00:00 2001 From: James Trieu Date: Fri, 24 Jan 2025 16:09:04 -0600 Subject: [PATCH 20/34] add OrganizationRequest Information, DataverseFetchXmlReducingQuery, RetrieveMultipleWithRetryAsync, OptionSetMapper --- .../Dataverse/DataverseDataSource.cs | 7 + .../Dataverse/DataverseDataSourceFactory.cs | 3 +- .../Dataverse/DataverseFetchXmlPagedQuery.cs | 2 +- .../DataverseFetchXmlReducingQuery.cs | 100 ++++++++++ .../DataSources/Dataverse/EntityExtensions.cs | 138 ------------- .../DataSources/Dataverse/IOptionSetMapper.cs | 12 ++ .../IOrganizationRequestDataSourceFactory.cs | 6 + .../DataSources/Dataverse/OptionSetMapper.cs | 126 ++++++++++++ .../OrganizationRequestDataSource.cs | 98 ++++++++++ .../OrganizationRequestDataSourceFactory.cs | 23 +++ .../Dataverse/ServiceCollectionExtensions.cs | 30 --- .../DataverseServiceExtensions.cs | 6 +- .../Extensions/EntityExtensions.cs | 185 ++++++++++++++++++ .../Extensions/ServiceClientExtensions.cs | 34 ++++ .../Extensions/ServiceCollectionExtensions.cs | 48 +++++ 15 files changed, 645 insertions(+), 173 deletions(-) create mode 100644 src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseFetchXmlReducingQuery.cs delete mode 100644 src/Root16.Sprout.Dataverse/DataSources/Dataverse/EntityExtensions.cs create mode 100644 src/Root16.Sprout.Dataverse/DataSources/Dataverse/IOptionSetMapper.cs create mode 100644 src/Root16.Sprout.Dataverse/DataSources/Dataverse/IOrganizationRequestDataSourceFactory.cs create mode 100644 src/Root16.Sprout.Dataverse/DataSources/Dataverse/OptionSetMapper.cs create mode 100644 src/Root16.Sprout.Dataverse/DataSources/Dataverse/OrganizationRequestDataSource.cs create mode 100644 src/Root16.Sprout.Dataverse/DataSources/Dataverse/OrganizationRequestDataSourceFactory.cs delete mode 100644 src/Root16.Sprout.Dataverse/DataSources/Dataverse/ServiceCollectionExtensions.cs create mode 100644 src/Root16.Sprout.Dataverse/Extensions/EntityExtensions.cs create mode 100644 src/Root16.Sprout.Dataverse/Extensions/ServiceClientExtensions.cs create mode 100644 src/Root16.Sprout.Dataverse/Extensions/ServiceCollectionExtensions.cs diff --git a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSource.cs b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSource.cs index dcf688b..34b4218 100644 --- a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSource.cs +++ b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSource.cs @@ -4,6 +4,7 @@ using Microsoft.Xrm.Sdk.Messages; using System.Collections.Concurrent; using System.Net; +using System.ServiceModel; namespace Root16.Sprout.DataSources.Dataverse; @@ -198,6 +199,11 @@ public IPagedQuery CreateFetchXmlQuery(string fetchXml) return new DataverseFetchXmlPagedQuery(this, fetchXml); } + public IPagedQuery CreateFetchXmlReducingQuery(string fetchXml, string? primaryAttribute = null) + { + return new DataverseFetchXmlReducingQuery(this, fetchXml, primaryAttribute); + } + protected static OrganizationRequest? CreateOrganizationRequest(DataOperation change, IEnumerable dataOperationFlags) { OrganizationRequest request; @@ -254,6 +260,7 @@ private async Task TryExecuteRequestAsync(OrganizationRequest request, Can { return (T)await CrmServiceClient.ExecuteAsync(request, token); } + catch (FaultException) { throw; } catch (Exception ex) { if (lastException is null || !ex.Message.Equals(lastException.Message, StringComparison.OrdinalIgnoreCase)) diff --git a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSourceFactory.cs b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSourceFactory.cs index 513d0d8..fc5574d 100644 --- a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSourceFactory.cs +++ b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSourceFactory.cs @@ -2,9 +2,8 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.PowerPlatform.Dataverse.Client; -using Root16.Sprout.DataSources.Dataverse; -namespace Root16.Sprout.DependencyInjection; +namespace Root16.Sprout.DataSources.Dataverse; public class DataverseDataSourceFactory(IServiceProvider serviceProvider) : IDataverseDataSourceFactory { diff --git a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseFetchXmlPagedQuery.cs b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseFetchXmlPagedQuery.cs index d693c78..c6ed139 100644 --- a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseFetchXmlPagedQuery.cs +++ b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseFetchXmlPagedQuery.cs @@ -30,7 +30,7 @@ private static void AddPaging(XDocument fetchDoc, int page, int pageSize, string public async Task> GetNextPageAsync(int pageNumber, int pageSize, object? bookmark) { - var results = await dataSource.CrmServiceClient.RetrieveMultipleAsync(new FetchExpression(AddPaging(fetchXml, ++pageNumber, pageSize, (string?)bookmark))); + var results = await dataSource.CrmServiceClient.RetrieveMultipleWithRetryAsync(new FetchExpression(AddPaging(fetchXml, ++pageNumber, pageSize, (string?)bookmark))); return new PagedQueryResult ( diff --git a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseFetchXmlReducingQuery.cs b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseFetchXmlReducingQuery.cs new file mode 100644 index 0000000..5432ae6 --- /dev/null +++ b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseFetchXmlReducingQuery.cs @@ -0,0 +1,100 @@ +using Microsoft.PowerPlatform.Dataverse.Client.Extensions; +using Microsoft.Xrm.Sdk; +using Microsoft.Xrm.Sdk.Metadata; +using Microsoft.Xrm.Sdk.Query; +using System.Xml.Linq; + +namespace Root16.Sprout.DataSources.Dataverse; + +public class DataverseFetchXmlReducingQuery(DataverseDataSource dataSource, string fetchXml, string? primaryAttribute = null) : IPagedQuery +{ + private readonly DataverseDataSource dataSource = dataSource; + private readonly string fetchXml = fetchXml; + private readonly string? primaryAttribute = primaryAttribute; + private static string AddPaging(string fetchXml, int? page, int? pageSize, string? pagingCookie) + { + var fetchDoc = XDocument.Parse(fetchXml); + AddPaging(fetchDoc, page, pageSize, pagingCookie); + return fetchDoc.ToString(SaveOptions.DisableFormatting); + } + + private static void AddPaging(XDocument fetchDoc, int? page, int? pageSize, string? pagingCookie) + { + if (page is not null) + fetchDoc.Root?.SetAttributeValue("page", page); + if (pageSize is not null) + fetchDoc.Root?.SetAttributeValue("count", pageSize); + if (pagingCookie is not null) + { + fetchDoc.Root?.SetAttributeValue("paging-cookie", pagingCookie); + } + } + + // results should be 'different' everytime cause reducing + public async Task> GetNextPageAsync(int pageNumber, int pageSize, object? bookmark) + { + var results = await dataSource.CrmServiceClient.RetrieveMultipleWithRetryAsync(new FetchExpression(fetchXml)); + + return new PagedQueryResult + ( + [.. results.Entities.Take(pageSize)], + results.MoreRecords || results.Entities.Count > pageSize, + results.PagingCookie + ); + } + + public Task GetTotalRecordCountAsync() + { + var fetchDoc = XDocument.Parse(fetchXml); + if (fetchDoc.Root is null) + { + return Task.FromResult(null); + } + + if ((bool?)fetchDoc.Root?.Attribute("aggregate") == true) + { + return Task.FromResult(null); + } + + var entityElem = fetchDoc.Root?.Element("entity"); + if (entityElem is null) + { + return Task.FromResult(null); + } + + var attributeElements = fetchDoc.Root?.Descendants().Where(e => e.Name == "attribute").ToArray(); + if (attributeElements is null) + { + return Task.FromResult(null); + } + + foreach (var attr in attributeElements) + { + attr.Remove(); + } + + var entityMetadata = dataSource.CrmServiceClient.GetEntityMetadata(entityElem.Attribute("name")?.Value, EntityFilters.Entity); + var primaryAttribute = entityMetadata.PrimaryIdAttribute; + entityElem.Add(new XElement("attribute", new XAttribute("name", !string.IsNullOrWhiteSpace(this.primaryAttribute) ? this.primaryAttribute : primaryAttribute))); + + int page = 1; + + bool moreRecords; + string? pagingCookie = null; + int pageSize = 5000; + int totalCount = 0; + + do + { + AddPaging(fetchDoc, page, pageSize, pagingCookie); + var results = dataSource.CrmServiceClient.RetrieveMultiple(new FetchExpression { Query = fetchDoc.ToString(SaveOptions.DisableFormatting) }); + totalCount += results.Entities.Count; + moreRecords = results.MoreRecords; + pagingCookie = results.PagingCookie; + page++; + } + while (moreRecords); + + return Task.FromResult(totalCount); + } +} \ No newline at end of file diff --git a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/EntityExtensions.cs b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/EntityExtensions.cs deleted file mode 100644 index 426cf57..0000000 --- a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/EntityExtensions.cs +++ /dev/null @@ -1,138 +0,0 @@ -using Microsoft.Xrm.Sdk; -using System.Text; - -namespace Root16.Sprout.DataSources.Dataverse; - -public static class EntityExtensions -{ - public static Entity CloneWithModifiedAttributes(this Entity updates, Entity original) - { - Entity delta = new(original.LogicalName, original.Id); - foreach (var attribute in updates.Attributes) - { - bool different = false; - original.Attributes.TryGetValue(attribute.Key, out object originalValue); - var updateValue = attribute.Value; - - if (updateValue is EntityReference || originalValue is EntityReference) - { - var originalLookup = (EntityReference)originalValue; - var updateLookup = (EntityReference)updateValue; - - if (updateLookup?.Id != originalLookup?.Id || - updateLookup?.LogicalName != originalLookup?.LogicalName) - { - different = true; - } - } - else if (updateValue is Money || originalValue is Money) - { - var originalMoney = (Money)originalValue; - var updateMoney = (Money)updateValue; - - if (updateMoney?.Value != originalMoney?.Value) - { - different = true; - } - } - else if (updateValue is OptionSetValue || originalValue is OptionSetValue) - { - var originalOptionSetValue = (OptionSetValue)originalValue; - var updateOptionSetValue = (OptionSetValue)updateValue; - - if (updateOptionSetValue?.Value != originalOptionSetValue?.Value) - { - different = true; - } - } - else if (updateValue is OptionSetValueCollection || originalValue is OptionSetValueCollection) - { - var originalOptionSetValue = (OptionSetValueCollection)originalValue; - var updateOptionSetValue = (OptionSetValueCollection)updateValue; - var originalOptions = originalOptionSetValue?.Select(o => o.Value)?.ToArray() ?? []; - var updateOptions = updateOptionSetValue?.Select(o => o.Value)?.ToArray() ?? []; - - if (originalOptions.Length != updateOptions.Length || - originalOptions.Intersect(updateOptions).Count() != originalOptions.Length) - { - different = true; - } - } - else if (updateValue is string || originalValue is string) - { - if ((string)updateValue == "" && originalValue is null) - { - different = false; - } - else if (!Equals(updateValue, originalValue)) - { - different = true; - } - } - else - { - if (updateValue is DateTime dt) - { - updateValue = (new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, dt.Kind)).ToUniversalTime(); - if (originalValue is DateTime time) - { - originalValue = time.ToUniversalTime(); - } - } - - if (!Equals(updateValue, originalValue)) - { - different = true; - } - } - - - if (different) - { - delta[attribute.Key] = updateValue; - } - } - return delta; - } - - public static string FormatChanges(this Entity entity, Entity previousValues) - { - StringBuilder sb = new(); - sb.AppendLine($"updating ({entity.LogicalName}, {entity.Id}):"); - foreach (var attribute in entity.Attributes) - { - previousValues.Attributes.TryGetValue(attribute.Key, out object matchValue); - sb.AppendLine($" {attribute.Key}: {DisplayAttributeValue(matchValue)} => {DisplayAttributeValue(attribute.Value)}"); - } - - return sb.ToString(); - } - - public static object DisplayAttributeValue(object attributeValue) - { - if (attributeValue is null) - { - return "(null)"; - } - else if (attributeValue is EntityReference entityRef) - { - return $"({entityRef.LogicalName}, {entityRef.Id})"; - } - else if (attributeValue is Money money) - { - return money.Value; - } - else if (attributeValue is OptionSetValue optionSetValue) - { - return optionSetValue.Value; - } - else if (attributeValue is string) - { - return $"'{attributeValue}'"; - } - else - { - return attributeValue; - } - } -} diff --git a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/IOptionSetMapper.cs b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/IOptionSetMapper.cs new file mode 100644 index 0000000..d86fdde --- /dev/null +++ b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/IOptionSetMapper.cs @@ -0,0 +1,12 @@ +using Microsoft.Xrm.Sdk; + +namespace Root16.Sprout.DataSources.Dataverse; + +public interface IOptionSetMapper +{ + OptionSetValue? MapOptionSetByLabel(string entityLogicalName, string attributeLogicalName, string label, StringComparison stringComparison = StringComparison.InvariantCultureIgnoreCase); + OptionSetValueCollection? MapMultiSelectByLabels(string entityLogicalName, string attributeLogicalName, string labels, StringComparison stringComparison = StringComparison.InvariantCultureIgnoreCase); + OptionSetValue? MapStateByLabel(string entityLogicalName, string label, StringComparison stringComparison = StringComparison.InvariantCultureIgnoreCase); + OptionSetValue? MapStatusByLabel(string entityLogicalName, string label, int? state = null, StringComparison stringComparison = StringComparison.InvariantCultureIgnoreCase); + OptionSetValue? MapStateByStatusLabel(string entityLogicalName, string label, StringComparison stringComparison = StringComparison.InvariantCultureIgnoreCase); +} \ No newline at end of file diff --git a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/IOrganizationRequestDataSourceFactory.cs b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/IOrganizationRequestDataSourceFactory.cs new file mode 100644 index 0000000..aee82bf --- /dev/null +++ b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/IOrganizationRequestDataSourceFactory.cs @@ -0,0 +1,6 @@ +namespace Root16.Sprout.DataSources.Dataverse; + +public interface IOrganizationRequestDataSourceFactory +{ + OrganizationRequestDataSource CreateDataSource(string name); +} diff --git a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/OptionSetMapper.cs b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/OptionSetMapper.cs new file mode 100644 index 0000000..0cff568 --- /dev/null +++ b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/OptionSetMapper.cs @@ -0,0 +1,126 @@ +using Microsoft.Extensions.Caching.Memory; +using Microsoft.Xrm.Sdk; +using Microsoft.Xrm.Sdk.Messages; +using Microsoft.Xrm.Sdk.Metadata; + +namespace Root16.Sprout.DataSources.Dataverse; + +public class OptionSetMapper(DataverseDataSource dataverseDataSource, IMemoryCache memoryCache) : IOptionSetMapper +{ + private EntityMetadata GetEntityMetadata(string entityLogicalName) + { + var metadata = memoryCache.GetOrCreate($"dataverse-metadata-{dataverseDataSource.CrmServiceClient.EnvironmentId}-{entityLogicalName}", entry => + { + entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(60); + + var request = new RetrieveEntityRequest + { + LogicalName = entityLogicalName, + EntityFilters = EntityFilters.Attributes + }; + var response = (RetrieveEntityResponse)dataverseDataSource.CrmServiceClient.Execute(request); + + return response.EntityMetadata; + }); + + return metadata; + } + + public OptionSetValue? MapOptionSetByLabel(string entityLogicalName, string attributeLogicalName, string label, StringComparison stringComparison = StringComparison.InvariantCultureIgnoreCase) + { + if (string.IsNullOrWhiteSpace(label)) return null; + + var metadata = GetEntityMetadata(entityLogicalName); + var picklistMetadata = (PicklistAttributeMetadata)metadata.Attributes.Where(a => a.AttributeType == AttributeTypeCode.Picklist && a.LogicalName == attributeLogicalName).First(); + var option = picklistMetadata.OptionSet.Options.Where(o => string.Equals(o.Label.UserLocalizedLabel.Label, label, stringComparison)).FirstOrDefault(); + + if (option != null && option.Value != null) + { + return new OptionSetValue + { + Value = option.Value.Value + }; + } + else + return null; + } + + public OptionSetValueCollection? MapMultiSelectByLabels(string entityLogicalName, string attributeLogicalName, string labels, StringComparison stringComparison = StringComparison.InvariantCultureIgnoreCase) + { + if (string.IsNullOrWhiteSpace(labels)) return null; + + var metadata = GetEntityMetadata(entityLogicalName); + var picklistMetaData = (MultiSelectPicklistAttributeMetadata)metadata.Attributes.Where(a => a.GetType() == typeof(MultiSelectPicklistAttributeMetadata) && a.LogicalName == attributeLogicalName).First(); + var labelList = labels.Split(';', StringSplitOptions.TrimEntries).Where(l => !string.IsNullOrWhiteSpace(l)); + List values = new List(); + + foreach (var l in labelList) + { + var option = picklistMetaData.OptionSet.Options.Where(o => string.Equals(o.Label.UserLocalizedLabel.Label, l, stringComparison)).FirstOrDefault(); + if (option != null && option.Value != null) + { + values.Add(new OptionSetValue(option.Value.Value)); + } + } + + if (values.Count > 0) + { + return new OptionSetValueCollection(values); + } + else + return null; + } + + public OptionSetValue? MapStateByLabel(string entityLogicalName, string label, StringComparison stringComparison = StringComparison.InvariantCultureIgnoreCase) + { + var metadata = GetEntityMetadata(entityLogicalName); + var stateMetaData = (StateAttributeMetadata)metadata.Attributes.Where(a => a.AttributeType == AttributeTypeCode.State && a.LogicalName == "statecode").First(); + var option = stateMetaData.OptionSet.Options.Where(o => string.Equals(o.Label.UserLocalizedLabel.Label, label, stringComparison)).FirstOrDefault(); + + if (option != null && option.Value != null) + { + return new OptionSetValue + { + Value = option.Value.Value + }; + } + else + return null; + } + + public OptionSetValue? MapStatusByLabel(string entityLogicalName, string label, int? state = null, StringComparison stringComparison = StringComparison.InvariantCultureIgnoreCase) + { + if (string.IsNullOrWhiteSpace(label)) return null; + var metadata = GetEntityMetadata(entityLogicalName); + var statusMetaData = (StatusAttributeMetadata)metadata.Attributes.Where(a => a.AttributeType == AttributeTypeCode.Status && a.LogicalName == "statuscode").First(); + var option = statusMetaData.OptionSet.Options.Where(o => string.Equals(o.Label.UserLocalizedLabel.Label, label, stringComparison)).FirstOrDefault(o => state is null || (state.HasValue && state.Value == ((StatusOptionMetadata)o).State)); + + if (option != null && option.Value != null) + { + return new OptionSetValue + { + Value = option.Value.Value + }; + } + else + return null; + } + + public OptionSetValue? MapStateByStatusLabel(string entityLogicalName, string label, StringComparison stringComparison = StringComparison.InvariantCultureIgnoreCase) + { + if (string.IsNullOrWhiteSpace(label)) return null; + var metadata = GetEntityMetadata(entityLogicalName); + var statusMetaData = (StatusAttributeMetadata)metadata.Attributes.Where(a => a.AttributeType == AttributeTypeCode.Status && a.LogicalName == "statuscode").First(); + var option = statusMetaData.OptionSet.Options.Where(o => string.Equals(o.Label.UserLocalizedLabel.Label, label, stringComparison)).FirstOrDefault() as StatusOptionMetadata; + + if (option != null && option.Value != null && option.State != null) + { + return new OptionSetValue + { + Value = (int)option.State + }; + } + else + return null; + } +} diff --git a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/OrganizationRequestDataSource.cs b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/OrganizationRequestDataSource.cs new file mode 100644 index 0000000..6e35d78 --- /dev/null +++ b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/OrganizationRequestDataSource.cs @@ -0,0 +1,98 @@ +using Microsoft.Extensions.Logging; +using Microsoft.PowerPlatform.Dataverse.Client; +using Microsoft.Xrm.Sdk; +using Microsoft.Xrm.Sdk.Messages; +using System.ServiceModel; + +namespace Root16.Sprout.DataSources.Dataverse; + +public class OrganizationRequestDataSource(DataverseDataSource dataverseDataSource, ILogger logger) : IDataSource +{ + const int MaxRetries = 10; + public ServiceClient CrmServiceClient { get { return dataverseDataSource.CrmServiceClient; } } + + public async Task>> PerformOperationsAsync(IEnumerable> operations, bool dryRun, IEnumerable dataOperationFlags) + { + var results = new List>(); + + if (dryRun) + { + foreach (var operation in operations) + { + results.Add(new DataOperationResult(operation, true)); + } + return results; + } + + var executeMultipleRequest = new ExecuteMultipleRequest + { + Requests = new OrganizationRequestCollection(), + Settings = new ExecuteMultipleSettings + { + ContinueOnError = true, + ReturnResponses = true, + } + }; + executeMultipleRequest.Requests.AddRange(operations.Select(op => CreateOrganizationRequest(op, dataOperationFlags))); + + var executeMultipleResponse = (ExecuteMultipleResponse)await dataverseDataSource.CrmServiceClient.ExecuteAsync(executeMultipleRequest); + + foreach (var response in executeMultipleResponse.Responses) + { + if (response.Fault is not null) + { + logger.LogError(response.Fault.ToString()); + } + + results.Add(new DataOperationResult( + operations.Skip(response.RequestIndex).First(), + response.Fault is null)); + } + return results; + } + + private static OrganizationRequest? CreateOrganizationRequest(DataOperation change, IEnumerable dataOperationFlags) + { + OrganizationRequest request = change.Data; + + if (dataOperationFlags.Contains(DataverseDataSourceFlags.BypassCustomPluginExecution) == true) + { + request.Parameters.Add(DataverseDataSourceFlags.BypassCustomPluginExecution, true); + } + + if (dataOperationFlags.Contains(DataverseDataSourceFlags.SuppressCallbackRegistrationExpanderJob) == true) + { + request.Parameters.Add(DataverseDataSourceFlags.SuppressCallbackRegistrationExpanderJob, true); + } + + return request; + } + + private Task TryExecuteRequestAsync(OrganizationRequest request, CancellationToken token = default) + => TryExecuteRequestAsync(request, token); + + private async Task TryExecuteRequestAsync(OrganizationRequest request, CancellationToken token = default) + where T : OrganizationResponse + { + var retryCount = 0; + Exception? lastException = null; + do + { + try + { + return (T)await CrmServiceClient.ExecuteAsync(request, token); + } + catch (FaultException) { throw; } + catch (Exception ex) + { + if (lastException is null || !ex.Message.Equals(lastException.Message, StringComparison.OrdinalIgnoreCase)) + { + logger.LogError(ex, ex.Message); + } + lastException = ex; + } + } while (retryCount++ < MaxRetries); + + throw lastException; + } +} \ No newline at end of file diff --git a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/OrganizationRequestDataSourceFactory.cs b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/OrganizationRequestDataSourceFactory.cs new file mode 100644 index 0000000..4d6756c --- /dev/null +++ b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/OrganizationRequestDataSourceFactory.cs @@ -0,0 +1,23 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.PowerPlatform.Dataverse.Client; + +namespace Root16.Sprout.DataSources.Dataverse; + +public class OrganizationRequestDataSourceFactory(IServiceProvider serviceProvider) : IOrganizationRequestDataSourceFactory +{ + public OrganizationRequestDataSource CreateDataSource(string connectionStringName) + { + var config = serviceProvider.GetRequiredService(); + var dsLogger = serviceProvider.GetRequiredService>(); + var serviceClient = new ServiceClient( + config.GetConnectionString(connectionStringName), + serviceProvider.GetRequiredService>() + ); + var ds = new DataverseDataSource(serviceClient, dsLogger); + var ordsLogger = serviceProvider.GetRequiredService>(); + var ords = new OrganizationRequestDataSource(ds, ordsLogger); + return ords; + } +} \ No newline at end of file diff --git a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/ServiceCollectionExtensions.cs b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/ServiceCollectionExtensions.cs deleted file mode 100644 index c35a12e..0000000 --- a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/ServiceCollectionExtensions.cs +++ /dev/null @@ -1,30 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; - -namespace Root16.Sprout.DataSources.Dataverse; - -public static class ServiceCollectionExtensions -{ - - - public static IServiceCollection AddDataverseDataSource(this IServiceCollection services, string connectionStringName) - { - return services.AddTransient(services => - { - var factory = services.GetRequiredService(); - return factory.CreateDataSource(connectionStringName); - }); - } - - public static IServiceCollection AddDataverseDataSource(this IServiceCollection services, string connectionStringName, Action initializer) - { - return services.AddTransient(services => - { - var factory = services.GetRequiredService(); - var result = factory.CreateDataSource(connectionStringName); - initializer(result); - return result; - }); - } - - -} diff --git a/src/Root16.Sprout.Dataverse/DataverseServiceExtensions.cs b/src/Root16.Sprout.Dataverse/DataverseServiceExtensions.cs index b5f6278..33828c8 100644 --- a/src/Root16.Sprout.Dataverse/DataverseServiceExtensions.cs +++ b/src/Root16.Sprout.Dataverse/DataverseServiceExtensions.cs @@ -1,7 +1,7 @@ -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Caching.Memory; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Root16.Sprout.DataSources.Dataverse; -using Root16.Sprout.DependencyInjection; namespace Root16.Sprout; @@ -13,6 +13,8 @@ public static IServiceCollection AddSproutDataverse(this IServiceCollection serv services.TryAddTransient(); services.TryAddTransient(); services.TryAddSingleton(); + services.TryAddSingleton(); + services.TryAddSingleton(); return services; } diff --git a/src/Root16.Sprout.Dataverse/Extensions/EntityExtensions.cs b/src/Root16.Sprout.Dataverse/Extensions/EntityExtensions.cs new file mode 100644 index 0000000..1fdb2d1 --- /dev/null +++ b/src/Root16.Sprout.Dataverse/Extensions/EntityExtensions.cs @@ -0,0 +1,185 @@ +using Microsoft.Xrm.Sdk; +using System.Text; + +namespace Root16.Sprout.DataSources.Dataverse; + +public static class EntityExtensions +{ + public static Entity CloneWithModifiedAttributes(this Entity updates, Entity original) + { + Entity delta = new(original.LogicalName, original.Id); + foreach (var attribute in updates.Attributes) + { + bool different = false; + original.Attributes.TryGetValue(attribute.Key, out object originalValue); + var updateValue = attribute.Value; + + if (updateValue is EntityReference || originalValue is EntityReference) + { + var originalLookup = (EntityReference)originalValue; + var updateLookup = (EntityReference)updateValue; + + if (updateLookup?.Id != originalLookup?.Id || + updateLookup?.LogicalName != originalLookup?.LogicalName) + { + different = true; + } + } + else if (updateValue is Money || originalValue is Money) + { + var originalMoney = (Money)originalValue; + var updateMoney = (Money)updateValue; + + if (updateMoney?.Value != originalMoney?.Value) + { + different = true; + } + } + else if (updateValue is OptionSetValue || originalValue is OptionSetValue) + { + var originalOptionSetValue = (OptionSetValue)originalValue; + var updateOptionSetValue = (OptionSetValue)updateValue; + + if (updateOptionSetValue?.Value != originalOptionSetValue?.Value) + { + different = true; + } + } + else if (updateValue is OptionSetValueCollection || originalValue is OptionSetValueCollection) + { + var originalOptionSetValue = (OptionSetValueCollection)originalValue; + var updateOptionSetValue = (OptionSetValueCollection)updateValue; + var originalOptions = originalOptionSetValue?.Select(o => o.Value)?.ToArray() ?? []; + var updateOptions = updateOptionSetValue?.Select(o => o.Value)?.ToArray() ?? []; + + if (originalOptions.Length != updateOptions.Length || + originalOptions.Intersect(updateOptions).Count() != originalOptions.Length) + { + different = true; + } + } + else if (updateValue is string || originalValue is string) + { + if ((string)updateValue == "" && originalValue is null) + { + different = false; + } + else if (!Equals(updateValue, originalValue)) + { + different = true; + } + } + else + { + if (updateValue is DateTime dt) + { + updateValue = (new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, dt.Kind)).ToUniversalTime(); + if (originalValue is DateTime time) + { + originalValue = time.ToUniversalTime(); + } + } + + if (!Equals(updateValue, originalValue)) + { + different = true; + } + } + + + if (different) + { + delta[attribute.Key] = updateValue; + } + } + return delta; + } + + public static string FormatChanges(this Entity entity, Entity previousValues) + { + StringBuilder sb = new(); + sb.AppendLine($"updating ({entity.LogicalName}, {entity.Id}):"); + foreach (var attribute in entity.Attributes) + { + previousValues.Attributes.TryGetValue(attribute.Key, out object matchValue); + sb.AppendLine($" {attribute.Key}: {DisplayAttributeValue(matchValue)} => {DisplayAttributeValue(attribute.Value)}"); + } + + return sb.ToString(); + } + + public static object DisplayAttributeValue(object attributeValue) + { + if (attributeValue is null) + { + return "(null)"; + } + else if (attributeValue is EntityReference entityRef) + { + return $"({entityRef.LogicalName}, {entityRef.Id})"; + } + else if (attributeValue is Money money) + { + return money.Value; + } + else if (attributeValue is OptionSetValue optionSetValue) + { + return optionSetValue.Value; + } + else if (attributeValue is string) + { + return $"'{attributeValue}'"; + } + else + { + return attributeValue; + } + } + + public static string GetFormattedValue(this Entity entity, string attributeKey) + { + string result = string.Empty; + if (entity.FormattedValues.ContainsKey(attributeKey)) + result = entity.FormattedValues[attributeKey]; + + return result; + } + + public static T GetAliasedAttributeValue(this Entity entity, string attributeKey) + { + var aliasedValue = entity.GetAttributeValue(attributeKey); + if (aliasedValue?.Value is null) + { + return default!; + } + + return (T)aliasedValue.Value; + } + + public static bool TryGetAliasedAttributeValue(this Entity entity, string attributeKey, out T result) + { + try + { + AliasedValue aliasedValue = entity.GetAttributeValue(attributeKey); + if (aliasedValue?.Value is null) + { + result = default!; + return false; + } + + if (aliasedValue.Value is T val) + { + result = val; + return true; + } + + System.ComponentModel.TypeConverter converter = System.ComponentModel.TypeDescriptor.GetConverter(typeof(T)); + result = (T)converter.ConvertFrom(aliasedValue.Value)!; + return true; + } + catch { } + + result = default!; + return false; + } +} diff --git a/src/Root16.Sprout.Dataverse/Extensions/ServiceClientExtensions.cs b/src/Root16.Sprout.Dataverse/Extensions/ServiceClientExtensions.cs new file mode 100644 index 0000000..f0109b6 --- /dev/null +++ b/src/Root16.Sprout.Dataverse/Extensions/ServiceClientExtensions.cs @@ -0,0 +1,34 @@ +using Microsoft.PowerPlatform.Dataverse.Client; +using Microsoft.Xrm.Sdk; +using Microsoft.Xrm.Sdk.Query; +using System.ServiceModel; + +namespace Root16.Sprout.DataSources.Dataverse; + +public static class ServiceClientExtensions +{ + public static async Task RetrieveMultipleWithRetryAsync(this ServiceClient serviceClient, QueryBase query, int retryCount = 5) + { + var retryAfter = TimeSpan.FromSeconds(0); + var retry = 0; + do + { + try + { + Thread.Sleep(retryAfter); + return await serviceClient.RetrieveMultipleAsync(query); + } + catch (FaultException) { throw; } + catch (CommunicationException) + { + if (retry > retryCount) throw; + retry++; + var retrypause = serviceClient.RetryPauseTime; + if (retrypause.TotalSeconds > 0) + retryAfter = serviceClient.RetryPauseTime; + else retryAfter = TimeSpan.FromSeconds(5 * retryCount); + } + } while (retry < retryCount); + throw new Exception($"{nameof(RetrieveMultipleWithRetryAsync)} : {serviceClient.LastException.Message}"); + } +} diff --git a/src/Root16.Sprout.Dataverse/Extensions/ServiceCollectionExtensions.cs b/src/Root16.Sprout.Dataverse/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..94ef065 --- /dev/null +++ b/src/Root16.Sprout.Dataverse/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,48 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; + +namespace Root16.Sprout.DataSources.Dataverse; + +public static class ServiceCollectionExtensions +{ + public static IServiceCollection AddDataverseDataSource(this IServiceCollection services, string connectionStringName) + { + return services.AddTransient(services => + { + var factory = services.GetRequiredService(); + return factory.CreateDataSource(connectionStringName); + }); + } + + public static IServiceCollection AddDataverseDataSource(this IServiceCollection services, string connectionStringName, Action initializer) + { + return services.AddTransient(services => + { + var factory = services.GetRequiredService(); + var result = factory.CreateDataSource(connectionStringName); + initializer(result); + return result; + }); + } + + public static IServiceCollection AddOrganizationRequestDataSource(this IServiceCollection services, string connectionStringName) + { + services.TryAddSingleton(); + return services.AddTransient(services => + { + var factory = services.GetRequiredService(); + return factory.CreateDataSource(connectionStringName); + }); + } + + public static IServiceCollection AddOrganizationRequestDataSource(this IServiceCollection services, string connectionStringName, Action initializer) + { + return services.AddTransient(services => + { + var factory = services.GetRequiredService(); + var result = factory.CreateDataSource(connectionStringName); + initializer(result); + return result; + }); + } +} From 030d405bc83492dda4cb366a64547c65ffa3ce9f Mon Sep 17 00:00:00 2001 From: James Trieu Date: Mon, 27 Jan 2025 07:41:06 -0600 Subject: [PATCH 21/34] add dictionary & string extensions --- .../Extensions/DictionaryExtensions.cs | 10 +++++++++ .../Extensions/StringExtensions.cs | 22 +++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 src/Root16.Sprout/Extensions/DictionaryExtensions.cs create mode 100644 src/Root16.Sprout/Extensions/StringExtensions.cs diff --git a/src/Root16.Sprout/Extensions/DictionaryExtensions.cs b/src/Root16.Sprout/Extensions/DictionaryExtensions.cs new file mode 100644 index 0000000..3156f74 --- /dev/null +++ b/src/Root16.Sprout/Extensions/DictionaryExtensions.cs @@ -0,0 +1,10 @@ +namespace Root16.Sprout.Extensions; + +public static partial class DictionaryExtensions +{ + public static TOut? GetValue(this IDictionary dict, string key) + { + if (string.IsNullOrEmpty(key)) return default; + return dict.TryGetValue(key, out var value) ? value : default; + } +} diff --git a/src/Root16.Sprout/Extensions/StringExtensions.cs b/src/Root16.Sprout/Extensions/StringExtensions.cs new file mode 100644 index 0000000..96dbf29 --- /dev/null +++ b/src/Root16.Sprout/Extensions/StringExtensions.cs @@ -0,0 +1,22 @@ +using System.Text.RegularExpressions; + +namespace Root16.Sprout.Extensions; + +public static partial class StringExtensions +{ + public static string? ToMaxLength(this string? value, int maxLength) + { + return !string.IsNullOrEmpty(value) + ? new string(value.Take(maxLength).ToArray()) + : null; + } + + public static string? FormatForSharepoint(this string? name) + { + if (string.IsNullOrEmpty(name)) return null; + var replacedSPChars = "[\\~#%&*.{}/:<>?|\"]"; + var formattedName = Regex.Replace(name.Trim(), replacedSPChars, "-").Replace(@"\", "-").Trim(); + + return formattedName; + } +} From 223cc4f34ccfeedcd63ec747999414cec1dff235 Mon Sep 17 00:00:00 2001 From: John Yenter-Briars Date: Wed, 29 Jan 2025 10:27:46 -0600 Subject: [PATCH 22/34] add methods to directly query db --- .../SampleSQLStep.cs | 9 +++ .../DataSources/Sql/SqlDataSource.cs | 69 +++++++++++++++++++ 2 files changed, 78 insertions(+) diff --git a/src/Root16.Sprout.Sample.SqlServer/SampleSQLStep.cs b/src/Root16.Sprout.Sample.SqlServer/SampleSQLStep.cs index 5870acf..8554615 100644 --- a/src/Root16.Sprout.Sample.SqlServer/SampleSQLStep.cs +++ b/src/Root16.Sprout.Sample.SqlServer/SampleSQLStep.cs @@ -25,7 +25,16 @@ public override IPagedQuery GetInputQuery() { return _sqlDataSource.CreatePagedQuery("SELECT [PersonID],[LastName],[FirstName],[Address],[City] FROM [master].[dbo].[Persons]"); } + public override async Task> OnBeforeMapAsync(IReadOnlyList batch) + { + var standardQuery = await _sqlDataSource.ExecuteQueryAsync("SELECT TOP 20 [PersonID],[LastName],[FirstName],[Address],[City] FROM [master].[dbo].[Persons]"); + var pagedQuery = await _sqlDataSource.ExecuteQueryWithPagingAsync("SELECT [PersonID],[LastName],[FirstName],[Address],[City] FROM [master].[dbo].[Persons]"); + + var pagedQueryWithBatchSize = await _sqlDataSource.ExecuteQueryWithPagingAsync("SELECT [PersonID],[LastName],[FirstName],[Address],[City] FROM [master].[dbo].[Persons]", batchSize: 3); + + return await base.OnBeforeMapAsync(batch); + } public override IReadOnlyList> MapRecord(DataRow source) { List> operations = []; diff --git a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs index ff52734..f92dbc0 100644 --- a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs +++ b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs @@ -50,7 +50,76 @@ public void ExecuteNonQuery(string commandText) command.Connection.Close(); } } + public async Task> ExecuteQueryAsync(string commandText) + { + var records = new List(); + await using var command = connection.CreateCommand(); + command.CommandText = commandText; + + await command.Connection.OpenAsync(); + try + { + await using var reader = await command.ExecuteReaderAsync(); + var table = new DataTable(); + table.Load(reader); + + records.AddRange(table.Rows.Cast()); + } + finally + { + await command.Connection.CloseAsync(); + } + + return records; + } + public async Task> ExecuteQueryWithPagingAsync(string commandText, int batchSize = 200) + { + var records = new List(); + + var query = new SqlPagedQuery( + loggerFactory.CreateLogger(), + connection, + commandText, + null, //not relevant for this method + addPaging: true); + + PagedQueryState queryState = new( + 0, + batchSize, + 0, + null, //not relevant for this method + true, + null); + + while (queryState.MoreRecords) + { + var result = await query.GetNextPageAsync( + queryState.NextPageNumber, + queryState.RecordsPerPage, + queryState.Bookmark); + + var batch = result.Records; + + var proccessedCount = batch.Count; + + logger.LogInformation($"{nameof(proccessedCount)}: {proccessedCount}"); + + queryState = new + ( + queryState.NextPageNumber + 1, + queryState.RecordsPerPage, + proccessedCount, + null, //Not relevant for this method + result.MoreRecords, + queryState.Bookmark + ); + + records.AddRange(batch); + } + + return records; + } public async Task>> PerformOperationsAsync(IEnumerable> operations, bool dryRun, IEnumerable dataOperationFlags) { if (dryRun) From b855be8a327d3b7dd94e480a546160b99b77f34a Mon Sep 17 00:00:00 2001 From: James Trieu Date: Fri, 31 Jan 2025 11:10:51 -0600 Subject: [PATCH 23/34] update to task.delay --- .../Extensions/ServiceClientExtensions.cs | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/Root16.Sprout.Dataverse/Extensions/ServiceClientExtensions.cs b/src/Root16.Sprout.Dataverse/Extensions/ServiceClientExtensions.cs index f0109b6..c669591 100644 --- a/src/Root16.Sprout.Dataverse/Extensions/ServiceClientExtensions.cs +++ b/src/Root16.Sprout.Dataverse/Extensions/ServiceClientExtensions.cs @@ -15,7 +15,7 @@ public static async Task RetrieveMultipleWithRetryAsync(this S { try { - Thread.Sleep(retryAfter); + await Task.Delay(retryAfter); return await serviceClient.RetrieveMultipleAsync(query); } catch (FaultException) { throw; } @@ -31,4 +31,29 @@ public static async Task RetrieveMultipleWithRetryAsync(this S } while (retry < retryCount); throw new Exception($"{nameof(RetrieveMultipleWithRetryAsync)} : {serviceClient.LastException.Message}"); } + + public static async Task RetrieveMultipleWithRetryAsync(this ServiceClient serviceClient, QueryBase query, int retryCount, CancellationToken cancellationToken) + { + var retryAfter = TimeSpan.FromSeconds(0); + var retry = 0; + do + { + try + { + await Task.Delay(retryAfter, cancellationToken); + return await serviceClient.RetrieveMultipleAsync(query, cancellationToken); + } + catch (FaultException) { throw; } + catch (CommunicationException) + { + if (retry > retryCount) throw; + retry++; + var retrypause = serviceClient.RetryPauseTime; + if (retrypause.TotalSeconds > 0) + retryAfter = serviceClient.RetryPauseTime; + else retryAfter = TimeSpan.FromSeconds(5 * retryCount); + } + } while (retry < retryCount); + throw new Exception($"{nameof(RetrieveMultipleWithRetryAsync)} : {serviceClient.LastException.Message}"); + } } From 0db6319491d440ec88dbfa8005da25f8b8c0c1bb Mon Sep 17 00:00:00 2001 From: James Trieu Date: Fri, 31 Jan 2025 11:18:15 -0600 Subject: [PATCH 24/34] default token --- .../Extensions/ServiceClientExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Root16.Sprout.Dataverse/Extensions/ServiceClientExtensions.cs b/src/Root16.Sprout.Dataverse/Extensions/ServiceClientExtensions.cs index c669591..e9f0bf8 100644 --- a/src/Root16.Sprout.Dataverse/Extensions/ServiceClientExtensions.cs +++ b/src/Root16.Sprout.Dataverse/Extensions/ServiceClientExtensions.cs @@ -32,7 +32,7 @@ public static async Task RetrieveMultipleWithRetryAsync(this S throw new Exception($"{nameof(RetrieveMultipleWithRetryAsync)} : {serviceClient.LastException.Message}"); } - public static async Task RetrieveMultipleWithRetryAsync(this ServiceClient serviceClient, QueryBase query, int retryCount, CancellationToken cancellationToken) + public static async Task RetrieveMultipleWithRetryAsync(this ServiceClient serviceClient, QueryBase query, int retryCount, CancellationToken cancellationToken = default) { var retryAfter = TimeSpan.FromSeconds(0); var retry = 0; From f8c84a162c5db8cf693966466f4020fa3b5b05ae Mon Sep 17 00:00:00 2001 From: James Trieu Date: Fri, 31 Jan 2025 12:34:34 -0600 Subject: [PATCH 25/34] update reducingquery --- .../DataSources/Dataverse/DataverseDataSource.cs | 4 ++-- .../Dataverse/DataverseFetchXmlReducingQuery.cs | 14 +++++++++----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSource.cs b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSource.cs index 34b4218..2ab5565 100644 --- a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSource.cs +++ b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseDataSource.cs @@ -199,9 +199,9 @@ public IPagedQuery CreateFetchXmlQuery(string fetchXml) return new DataverseFetchXmlPagedQuery(this, fetchXml); } - public IPagedQuery CreateFetchXmlReducingQuery(string fetchXml, string? primaryAttribute = null) + public IPagedQuery CreateFetchXmlReducingQuery(string fetchXml, string? countByAttribute = null) { - return new DataverseFetchXmlReducingQuery(this, fetchXml, primaryAttribute); + return new DataverseFetchXmlReducingQuery(this, fetchXml, countByAttribute); } protected static OrganizationRequest? CreateOrganizationRequest(DataOperation change, IEnumerable dataOperationFlags) diff --git a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseFetchXmlReducingQuery.cs b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseFetchXmlReducingQuery.cs index 5432ae6..66a6a91 100644 --- a/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseFetchXmlReducingQuery.cs +++ b/src/Root16.Sprout.Dataverse/DataSources/Dataverse/DataverseFetchXmlReducingQuery.cs @@ -6,11 +6,11 @@ namespace Root16.Sprout.DataSources.Dataverse; -public class DataverseFetchXmlReducingQuery(DataverseDataSource dataSource, string fetchXml, string? primaryAttribute = null) : IPagedQuery +public class DataverseFetchXmlReducingQuery(DataverseDataSource dataSource, string fetchXml, string? countByAttribute = null) : IPagedQuery { private readonly DataverseDataSource dataSource = dataSource; private readonly string fetchXml = fetchXml; - private readonly string? primaryAttribute = primaryAttribute; + private readonly string? countByAttribute = countByAttribute; private static string AddPaging(string fetchXml, int? page, int? pageSize, string? pagingCookie) { var fetchDoc = XDocument.Parse(fetchXml); @@ -73,9 +73,13 @@ [.. results.Entities.Take(pageSize)], attr.Remove(); } - var entityMetadata = dataSource.CrmServiceClient.GetEntityMetadata(entityElem.Attribute("name")?.Value, EntityFilters.Entity); - var primaryAttribute = entityMetadata.PrimaryIdAttribute; - entityElem.Add(new XElement("attribute", new XAttribute("name", !string.IsNullOrWhiteSpace(this.primaryAttribute) ? this.primaryAttribute : primaryAttribute))); + string? primaryAttribute = this.countByAttribute; + if (string.IsNullOrWhiteSpace(primaryAttribute)) + { + var entityMetadata = dataSource.CrmServiceClient.GetEntityMetadata(entityElem.Attribute("name")?.Value, EntityFilters.Entity); + primaryAttribute = entityMetadata.PrimaryIdAttribute; + } + entityElem.Add(new XElement("attribute", new XAttribute("name", primaryAttribute))); int page = 1; From bf57b54a43ef3272f1b74cb71e70984651cec2fd Mon Sep 17 00:00:00 2001 From: John Yenter-Briars Date: Fri, 31 Jan 2025 16:10:51 -0600 Subject: [PATCH 26/34] reuse more code from SQLPagedQuery --- .../DataSources/Sql/SqlDataSource.cs | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs index f92dbc0..12ffc8e 100644 --- a/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs +++ b/src/Root16.Sprout.SqlServer/DataSources/Sql/SqlDataSource.cs @@ -54,22 +54,21 @@ public async Task> ExecuteQueryAsync(string commandText) { var records = new List(); - await using var command = connection.CreateCommand(); - command.CommandText = commandText; + var query = new SqlPagedQuery( + loggerFactory.CreateLogger(), + connection, + commandText, + null, //not relevant for this method + addPaging: false); - await command.Connection.OpenAsync(); - try - { - await using var reader = await command.ExecuteReaderAsync(); - var table = new DataTable(); - table.Load(reader); + var result = await query.GetNextPageAsync( + 0, + -1, //Not needed when addPaging was set to false + null); - records.AddRange(table.Rows.Cast()); - } - finally - { - await command.Connection.CloseAsync(); - } + var batch = result.Records; + + records.AddRange(batch); return records; } @@ -103,8 +102,6 @@ public async Task> ExecuteQueryWithPagingAsync(string com var proccessedCount = batch.Count; - logger.LogInformation($"{nameof(proccessedCount)}: {proccessedCount}"); - queryState = new ( queryState.NextPageNumber + 1, From 0c309ba70a1817da4ab3e043e645dcc509b0a13f Mon Sep 17 00:00:00 2001 From: James Trieu Date: Tue, 4 Feb 2025 11:19:29 -0600 Subject: [PATCH 27/34] add delayable batching --- .../BatchProcessing/BatchIntegrationStep.cs | 3 ++- src/Root16.Sprout/BatchProcessing/BatchProcessor.cs | 7 +++++-- .../BatchProcessing/IBatchIntegrationStep.cs | 1 + src/Root16.Sprout/ServiceCollectionExtensions.cs | 11 +++++++++++ 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/Root16.Sprout/BatchProcessing/BatchIntegrationStep.cs b/src/Root16.Sprout/BatchProcessing/BatchIntegrationStep.cs index 438a8ab..efda0ca 100644 --- a/src/Root16.Sprout/BatchProcessing/BatchIntegrationStep.cs +++ b/src/Root16.Sprout/BatchProcessing/BatchIntegrationStep.cs @@ -11,7 +11,8 @@ protected BatchIntegrationStep() public bool DryRun { get; set; } public int BatchSize { get; set; } - + public TimeSpan? BatchDelay { get; set; } + private readonly HashSet dataOperationFlags = new(StringComparer.OrdinalIgnoreCase); public IEnumerable DataOperationFlags { get { return dataOperationFlags; } } diff --git a/src/Root16.Sprout/BatchProcessing/BatchProcessor.cs b/src/Root16.Sprout/BatchProcessing/BatchProcessor.cs index 22cb7bb..57bd936 100644 --- a/src/Root16.Sprout/BatchProcessing/BatchProcessor.cs +++ b/src/Root16.Sprout/BatchProcessing/BatchProcessor.cs @@ -3,9 +3,10 @@ namespace Root16.Sprout.BatchProcessing; -public class BatchProcessor(IProgressListener progressListener) +public class BatchProcessor(IProgressListener progressListener, TimeSpan batchDelay = default) { private readonly IProgressListener progressListener = progressListener; + private readonly TimeSpan defaultBatchDelay = batchDelay; public async Task ProcessAllBatchesAsync( IBatchIntegrationStep step, string stepName) @@ -13,8 +14,10 @@ public async Task ProcessAllBatchesAsync( step.OnStepStart(); BatchState? batchState = null; + TimeSpan batchDelay = step.BatchDelay ?? this.defaultBatchDelay; do { + if (batchState is not null && batchDelay.Ticks > 0) await Task.Delay(batchDelay); batchState = await ProcessBatchAsync(step, stepName, batchState); } while (batchState.QueryState?.MoreRecords == true); @@ -23,7 +26,7 @@ public async Task ProcessAllBatchesAsync( } public async Task> ProcessBatchAsync( - IBatchIntegrationStep step, string stepName, + IBatchIntegrationStep step, string stepName, BatchState? batchState) { diff --git a/src/Root16.Sprout/BatchProcessing/IBatchIntegrationStep.cs b/src/Root16.Sprout/BatchProcessing/IBatchIntegrationStep.cs index 7f3e4e3..bfd6368 100644 --- a/src/Root16.Sprout/BatchProcessing/IBatchIntegrationStep.cs +++ b/src/Root16.Sprout/BatchProcessing/IBatchIntegrationStep.cs @@ -9,6 +9,7 @@ public interface IBatchIntegrationStep : IIntegrationStep IReadOnlyList> MapRecord(TInput input); int BatchSize { get; } + TimeSpan? BatchDelay { get; } bool DryRun { get; } IEnumerable DataOperationFlags { get; } diff --git a/src/Root16.Sprout/ServiceCollectionExtensions.cs b/src/Root16.Sprout/ServiceCollectionExtensions.cs index 287d9ce..8506ae3 100644 --- a/src/Root16.Sprout/ServiceCollectionExtensions.cs +++ b/src/Root16.Sprout/ServiceCollectionExtensions.cs @@ -45,4 +45,15 @@ public static IServiceCollection AddSprout(this IServiceCollection services) services.TryAddSingleton(); return services; } + + public static IServiceCollection AddSprout(this IServiceCollection services, TimeSpan defaultBatchDelay) + { + services.TryAddSingleton(); + services.TryAddTransient((serviceProvider) => + { + return new (serviceProvider.GetRequiredService(), defaultBatchDelay); + }); + services.TryAddSingleton(); + return services; + } } From 7476629816de7af21fd6a2e37db89ab5036e6518 Mon Sep 17 00:00:00 2001 From: James Trieu Date: Tue, 4 Feb 2025 15:18:15 -0600 Subject: [PATCH 28/34] rename AddSproutWithBatchDelay --- src/Root16.Sprout/ServiceCollectionExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Root16.Sprout/ServiceCollectionExtensions.cs b/src/Root16.Sprout/ServiceCollectionExtensions.cs index 8506ae3..5e685d8 100644 --- a/src/Root16.Sprout/ServiceCollectionExtensions.cs +++ b/src/Root16.Sprout/ServiceCollectionExtensions.cs @@ -46,7 +46,7 @@ public static IServiceCollection AddSprout(this IServiceCollection services) return services; } - public static IServiceCollection AddSprout(this IServiceCollection services, TimeSpan defaultBatchDelay) + public static IServiceCollection AddSproutWithBatchDelay(this IServiceCollection services, TimeSpan defaultBatchDelay) { services.TryAddSingleton(); services.TryAddTransient((serviceProvider) => From efd9d706a458592eb33213208aca455757b631c2 Mon Sep 17 00:00:00 2001 From: James Trieu Date: Tue, 4 Feb 2025 16:58:11 -0600 Subject: [PATCH 29/34] remove generic, add optionset mapping --- .../Extensions/DataRowExtensions.cs | 15 ++++++++- .../Root16.Sprout.SqlServer.csproj | 1 + .../packages.lock.json | 33 +++++++++++++++---- 3 files changed, 42 insertions(+), 7 deletions(-) diff --git a/src/Root16.Sprout.SqlServer/Extensions/DataRowExtensions.cs b/src/Root16.Sprout.SqlServer/Extensions/DataRowExtensions.cs index 5bf2624..7cdcf30 100644 --- a/src/Root16.Sprout.SqlServer/Extensions/DataRowExtensions.cs +++ b/src/Root16.Sprout.SqlServer/Extensions/DataRowExtensions.cs @@ -1,4 +1,5 @@ using Microsoft.Xrm.Sdk; +using Root16.Sprout.DataSources.Dataverse; using System.Data; namespace Root16.Sprout.DataSources.Sql; @@ -48,7 +49,7 @@ public static Entity MapStrings(this DataRow row, Entity entity, params string[] /// Set Entity's boolean attribute values from the datarow's corresponding column. Datarow field and entity field types must match. Datarow field name or alias and entity field name must be the same. /// /// Microsoft.Xrm.Sdk.Entity - public static Entity MapBooleans(this DataRow row, Entity entity, params string[] attributes) + public static Entity MapBooleans(this DataRow row, Entity entity, params string[] attributes) { foreach (var attribute in attributes) entity[attribute.ToLower()] = row.GetValue(attribute); @@ -105,4 +106,16 @@ public static Entity MapDateTimes(this DataRow row, Entity entity, params string entity[attribute.ToLower()] = row.GetValue(attribute); return entity; } + + /// + /// Set Entity's optionset attribute values from the datarow's corresponding column. Datarow field and entity field types must match. Datarow field name or alias and entity field name must be the same. + /// + /// Microsoft.Xrm.Sdk.Entity + public static Entity MapOptionSets(this DataRow row, Entity entity, IOptionSetMapper optionSetMapper, params string[] attributes) + { + if (string.IsNullOrWhiteSpace(entity.LogicalName)) return entity; + foreach (var attribute in attributes) + entity[attribute.ToLower()] = optionSetMapper.MapOptionSetByLabel(entity.LogicalName, attribute, row.GetValue(attribute)?.Trim()!); + return entity; + } } \ No newline at end of file diff --git a/src/Root16.Sprout.SqlServer/Root16.Sprout.SqlServer.csproj b/src/Root16.Sprout.SqlServer/Root16.Sprout.SqlServer.csproj index 93b5535..2993d3c 100644 --- a/src/Root16.Sprout.SqlServer/Root16.Sprout.SqlServer.csproj +++ b/src/Root16.Sprout.SqlServer/Root16.Sprout.SqlServer.csproj @@ -27,6 +27,7 @@ + diff --git a/src/Root16.Sprout.SqlServer/packages.lock.json b/src/Root16.Sprout.SqlServer/packages.lock.json index 2625b2d..5e37eef 100644 --- a/src/Root16.Sprout.SqlServer/packages.lock.json +++ b/src/Root16.Sprout.SqlServer/packages.lock.json @@ -289,8 +289,8 @@ }, "Microsoft.PowerPlatform.Dataverse.Client": { "type": "Transitive", - "resolved": "1.1.16", - "contentHash": "zrkb4MIwynYE+lBF1Y4ljyYWwQvXIvDgviSZ2r1TY9P9a3UmEGLWp/jJFbOt+3v4Uw4fXcL4Yed8HRfc/GOnQQ==", + "resolved": "1.1.17", + "contentHash": "gSgD7N52EATY0PkNIbBtqZeG0FDGK11X1x8nBnPclfykw73bvqyfortjNIwAGcj0esMqk8DSieuRCVi47hg9qQ==", "dependencies": { "Microsoft.Extensions.Caching.Memory": "3.1.8", "Microsoft.Extensions.DependencyInjection": "3.1.8", @@ -1154,6 +1154,13 @@ "Microsoft.Extensions.Logging.Console": "[7.0.0, )", "Microsoft.PowerPlatform.Dataverse.Client": "[1.1.16, )" } + }, + "root16.sprout.dataverse": { + "type": "Project", + "dependencies": { + "Microsoft.PowerPlatform.Dataverse.Client": "[1.1.17, )", + "Root16.Sprout": "[1.0.0, )" + } } }, "net7.0": { @@ -1440,8 +1447,8 @@ }, "Microsoft.PowerPlatform.Dataverse.Client": { "type": "Transitive", - "resolved": "1.1.16", - "contentHash": "zrkb4MIwynYE+lBF1Y4ljyYWwQvXIvDgviSZ2r1TY9P9a3UmEGLWp/jJFbOt+3v4Uw4fXcL4Yed8HRfc/GOnQQ==", + "resolved": "1.1.17", + "contentHash": "gSgD7N52EATY0PkNIbBtqZeG0FDGK11X1x8nBnPclfykw73bvqyfortjNIwAGcj0esMqk8DSieuRCVi47hg9qQ==", "dependencies": { "Microsoft.Extensions.Caching.Memory": "3.1.8", "Microsoft.Extensions.DependencyInjection": "3.1.8", @@ -2301,6 +2308,13 @@ "Microsoft.Extensions.Logging.Console": "[7.0.0, )", "Microsoft.PowerPlatform.Dataverse.Client": "[1.1.16, )" } + }, + "root16.sprout.dataverse": { + "type": "Project", + "dependencies": { + "Microsoft.PowerPlatform.Dataverse.Client": "[1.1.17, )", + "Root16.Sprout": "[1.0.0, )" + } } }, "net8.0": { @@ -2587,8 +2601,8 @@ }, "Microsoft.PowerPlatform.Dataverse.Client": { "type": "Transitive", - "resolved": "1.1.16", - "contentHash": "zrkb4MIwynYE+lBF1Y4ljyYWwQvXIvDgviSZ2r1TY9P9a3UmEGLWp/jJFbOt+3v4Uw4fXcL4Yed8HRfc/GOnQQ==", + "resolved": "1.1.17", + "contentHash": "gSgD7N52EATY0PkNIbBtqZeG0FDGK11X1x8nBnPclfykw73bvqyfortjNIwAGcj0esMqk8DSieuRCVi47hg9qQ==", "dependencies": { "Microsoft.Extensions.Caching.Memory": "3.1.8", "Microsoft.Extensions.DependencyInjection": "3.1.8", @@ -3456,6 +3470,13 @@ "Microsoft.Extensions.Logging.Console": "[7.0.0, )", "Microsoft.PowerPlatform.Dataverse.Client": "[1.1.16, )" } + }, + "root16.sprout.dataverse": { + "type": "Project", + "dependencies": { + "Microsoft.PowerPlatform.Dataverse.Client": "[1.1.17, )", + "Root16.Sprout": "[1.0.0, )" + } } } } From 81f9c8a1f7ac324352b8705a7fde4fb003b6e28e Mon Sep 17 00:00:00 2001 From: Jacob Herner Date: Tue, 11 Feb 2025 09:54:43 -0600 Subject: [PATCH 30/34] Added overload to allow a hook to be passed in to run step which allows for state to be passed in --- src/Root16.Sprout/IIntegrationRuntime.cs | 2 +- src/Root16.Sprout/IntegrationRuntime.cs | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/Root16.Sprout/IIntegrationRuntime.cs b/src/Root16.Sprout/IIntegrationRuntime.cs index 1e6878c..7faaf8f 100644 --- a/src/Root16.Sprout/IIntegrationRuntime.cs +++ b/src/Root16.Sprout/IIntegrationRuntime.cs @@ -2,7 +2,7 @@ public interface IIntegrationRuntime { - Task RunStepAsync() where TStep : class, IIntegrationStep; + Task RunStepAsync(Action? configurator = null) where TStep : class, IIntegrationStep; Task RunStepAsync(string name); IEnumerable GetStepNames(); Task RunAllStepsAsync(int maxDegreesOfParallelism = 1, Action? completionHandler = null); diff --git a/src/Root16.Sprout/IntegrationRuntime.cs b/src/Root16.Sprout/IntegrationRuntime.cs index 72d8f34..d64969d 100644 --- a/src/Root16.Sprout/IntegrationRuntime.cs +++ b/src/Root16.Sprout/IntegrationRuntime.cs @@ -30,10 +30,21 @@ public async Task RunStepAsync(string name) return reg.Name; } - public async Task RunStepAsync() where TStep : class, IIntegrationStep + public async Task RunStepAsync(Action? configurator = null) where TStep : class, IIntegrationStep { var reg = stepRegistrations.FirstOrDefault(step => step.StepType == typeof(TStep)) ?? throw new InvalidOperationException($"Step of type '{typeof(TStep)}' is not registered."); - await RunStepAsync(reg); + await RunStepAsync(reg, configurator); + return reg.Name; + } + + private async Task RunStepAsync(StepRegistration reg, Action? configurator = null) where TStep : class, IIntegrationStep + { + progressListener.OnStepStart(reg.Name); + using var scope = serviceScopeFactory.CreateScope(); + var step = (IIntegrationStep)scope.ServiceProvider.GetRequiredKeyedService(reg.StepType, reg.Name); + configurator?.Invoke((TStep)step); + await step.RunAsync(reg.Name); + progressListener.OnStepComplete(reg.Name); return reg.Name; } From 431c07ffdd1e7b531c185801e096ae2aa43cf1d6 Mon Sep 17 00:00:00 2001 From: Jacob Herner Date: Tue, 11 Feb 2025 11:42:52 -0600 Subject: [PATCH 31/34] Changed structure of configurator and run step arguments --- .../DependencyInjection/DelayedStep.cs | 2 +- src/Root16.Sprout/IIntegrationRuntime.cs | 6 ++--- src/Root16.Sprout/IntegrationRuntime.cs | 22 +++++-------------- 3 files changed, 10 insertions(+), 20 deletions(-) diff --git a/src/Root16.Sprout/DependencyInjection/DelayedStep.cs b/src/Root16.Sprout/DependencyInjection/DelayedStep.cs index 363384f..b629971 100644 --- a/src/Root16.Sprout/DependencyInjection/DelayedStep.cs +++ b/src/Root16.Sprout/DependencyInjection/DelayedStep.cs @@ -1,6 +1,6 @@ namespace Root16.Sprout.DependencyInjection; -internal delegate Task AsyncStepRunner(StepRegistration stepRegistration); +internal delegate Task AsyncStepRunner(StepRegistration stepRegistration, Action? stepConfigurator = null); record DelayedStep(StepRegistration StepRegistration, AsyncStepRunner StepRunner) { diff --git a/src/Root16.Sprout/IIntegrationRuntime.cs b/src/Root16.Sprout/IIntegrationRuntime.cs index 7faaf8f..29cd052 100644 --- a/src/Root16.Sprout/IIntegrationRuntime.cs +++ b/src/Root16.Sprout/IIntegrationRuntime.cs @@ -2,8 +2,8 @@ public interface IIntegrationRuntime { - Task RunStepAsync(Action? configurator = null) where TStep : class, IIntegrationStep; - Task RunStepAsync(string name); - IEnumerable GetStepNames(); + IEnumerable GetStepNames(); + Task RunStepAsync(string name, Action? stepConfigurator = null); + Task RunStepAsync(Action? stepConfigurator = null) where TStep : class, IIntegrationStep; Task RunAllStepsAsync(int maxDegreesOfParallelism = 1, Action? completionHandler = null); } diff --git a/src/Root16.Sprout/IntegrationRuntime.cs b/src/Root16.Sprout/IntegrationRuntime.cs index d64969d..902217d 100644 --- a/src/Root16.Sprout/IntegrationRuntime.cs +++ b/src/Root16.Sprout/IntegrationRuntime.cs @@ -23,36 +23,26 @@ public IntegrationRuntime(IEnumerable stepRegistrations, IEnum BuildDependencyTree(); } - public async Task RunStepAsync(string name) + public async Task RunStepAsync(string name, Action? stepConfigurator = null) { var reg = stepRegistrations.FirstOrDefault(step => step.Name == name) ?? throw new InvalidOperationException($"Step named '{name}' is not registered."); - await RunStepAsync(reg); + await RunStepAsync(reg, stepConfigurator); return reg.Name; } - public async Task RunStepAsync(Action? configurator = null) where TStep : class, IIntegrationStep + public async Task RunStepAsync(Action? stepConfigurator = null) where TStep : class, IIntegrationStep { var reg = stepRegistrations.FirstOrDefault(step => step.StepType == typeof(TStep)) ?? throw new InvalidOperationException($"Step of type '{typeof(TStep)}' is not registered."); - await RunStepAsync(reg, configurator); + await RunStepAsync(reg, stepConfigurator); return reg.Name; } - private async Task RunStepAsync(StepRegistration reg, Action? configurator = null) where TStep : class, IIntegrationStep - { - progressListener.OnStepStart(reg.Name); - using var scope = serviceScopeFactory.CreateScope(); - var step = (IIntegrationStep)scope.ServiceProvider.GetRequiredKeyedService(reg.StepType, reg.Name); - configurator?.Invoke((TStep)step); - await step.RunAsync(reg.Name); - progressListener.OnStepComplete(reg.Name); - return reg.Name; - } - - private async Task RunStepAsync(StepRegistration reg) + private async Task RunStepAsync(StepRegistration reg, Action? stepConfigurator = null) { progressListener.OnStepStart(reg.Name); using var scope = serviceScopeFactory.CreateScope(); var step = (IIntegrationStep)scope.ServiceProvider.GetRequiredKeyedService(reg.StepType, reg.Name); + stepConfigurator?.Invoke(step); await step.RunAsync(reg.Name); progressListener.OnStepComplete(reg.Name); return reg.Name; From 2b4c56e30aaf6644972d19ea52c419e2dbdf9616 Mon Sep 17 00:00:00 2001 From: Travis Gilbert Date: Fri, 24 Jan 2025 10:09:21 -0600 Subject: [PATCH 32/34] Entity extension updates and test cases --- .../Extensions/EntityExtensions.cs | 63 ++- .../EntityExtensionsTests.cs | 450 ++++++++++++++++++ .../Root16.Sprout.UnitTests.csproj | 28 ++ src/Root16.Sprout.sln | 6 + 4 files changed, 546 insertions(+), 1 deletion(-) create mode 100644 src/Root16.Sprout.UnitTests/EntityExtensionsTests.cs create mode 100644 src/Root16.Sprout.UnitTests/Root16.Sprout.UnitTests.csproj diff --git a/src/Root16.Sprout.Dataverse/Extensions/EntityExtensions.cs b/src/Root16.Sprout.Dataverse/Extensions/EntityExtensions.cs index 1fdb2d1..9d0bb5a 100644 --- a/src/Root16.Sprout.Dataverse/Extensions/EntityExtensions.cs +++ b/src/Root16.Sprout.Dataverse/Extensions/EntityExtensions.cs @@ -25,6 +25,67 @@ public static Entity CloneWithModifiedAttributes(this Entity updates, Entity ori different = true; } } + else if (updateValue is EntityReferenceCollection || originalValue is EntityReferenceCollection) + { + var originalCollection = (EntityReferenceCollection)originalValue; + var updateCollection = (EntityReferenceCollection)updateValue; + + var groupedOriginalCollection = originalCollection.GroupBy(o => o.LogicalName).OrderBy(g => g.Key).ToList(); + var groupedUpdateCollection = updateCollection.GroupBy(o => o.LogicalName).OrderBy(g => g.Key).ToList(); + + // Check If Same Amount Of Groups + if (groupedOriginalCollection.Count != groupedUpdateCollection.Count) + { + different = true; + } + else + { + var originalTypes = groupedOriginalCollection.Select(g => g.Key).Distinct(); + var updateTypes = groupedUpdateCollection.Select(g => g.Key).Distinct(); + + // Check if the distinct record types are the same + if (!originalTypes.SequenceEqual(updateTypes)) + { + different = true; + } + else + { + // Loop through each group and check if they have the same amount of records + foreach (var originalGroup in groupedOriginalCollection) + { + var updateGroup = groupedUpdateCollection.FirstOrDefault(g => g.Key == originalGroup.Key); + if (updateGroup == null || originalGroup.Count() != updateGroup.Count()) + { + different = true; + break; + } + + var originalIds = new HashSet(originalGroup.Select(o => o.Id)); + var updateIds = new HashSet(updateGroup.Select(u => u.Id)); + + if (!originalIds.SetEquals(updateIds)) + { + different = true; + break; + } + } + } + } + } + else if (updateValue is EntityCollection || originalValue is EntityCollection) + { + var originalCollection = (EntityCollection)originalValue; + var updateCollection = (EntityCollection)updateValue; + + var originalPartyIds = new HashSet(originalCollection.Entities.Select(e => e.GetAttributeValue("partyid").Id)); + var updatePartyIds = new HashSet(updateCollection.Entities.Select(e => e.GetAttributeValue("partyid").Id)); + + if (!originalPartyIds.SetEquals(updatePartyIds)) + { + different = true; + } + + } else if (updateValue is Money || originalValue is Money) { var originalMoney = (Money)originalValue; @@ -69,7 +130,7 @@ public static Entity CloneWithModifiedAttributes(this Entity updates, Entity ori different = true; } } - else + else if (updateValue is DateTime || originalValue is DateTime) { if (updateValue is DateTime dt) { diff --git a/src/Root16.Sprout.UnitTests/EntityExtensionsTests.cs b/src/Root16.Sprout.UnitTests/EntityExtensionsTests.cs new file mode 100644 index 0000000..910abc7 --- /dev/null +++ b/src/Root16.Sprout.UnitTests/EntityExtensionsTests.cs @@ -0,0 +1,450 @@ +using System.ComponentModel; +using Microsoft.Xrm.Sdk; +using Root16.Sprout.DataSources.Dataverse; + +namespace Root16.Sprout.UnitTests +{ + public class EntityExtensionsTests + { + #region EntityReferenceCollection Tests + [Fact] + public void CloneWithModifiedAttributes_ShouldDetectDifferentNumberOfGroups() + { + var originalCollection = new EntityReferenceCollection + { + new EntityReference("contact", Guid.NewGuid()) + }; + + var updateCollection = new EntityReferenceCollection + { + new EntityReference("contact", Guid.NewGuid()), + new EntityReference("account", Guid.NewGuid()) + }; + + var original = new Entity("account", Guid.NewGuid()) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "relatedEntities", originalCollection } + } + }; + + var updates = new Entity("account", original.Id) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "relatedEntities", updateCollection } + } + }; + + var delta = updates.CloneWithModifiedAttributes(original); + + Assert.Single(delta.Attributes); + Assert.Equal(updateCollection, delta["relatedEntities"]); + } + + [Fact] + public void CloneWithModifiedAttributes_ShouldDetectDifferentGroupTypes() + { + var originalCollection = new EntityReferenceCollection + { + new EntityReference("contact", Guid.NewGuid()) + }; + + var updateCollection = new EntityReferenceCollection + { + new EntityReference("account", Guid.NewGuid()) + }; + + var original = new Entity("account", Guid.NewGuid()) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "relatedEntities", originalCollection } + } + }; + + var updates = new Entity("account", original.Id) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "relatedEntities", updateCollection } + } + }; + + var delta = updates.CloneWithModifiedAttributes(original); + + Assert.Single(delta.Attributes); + Assert.Equal(updateCollection, delta["relatedEntities"]); + } + + [Fact] + public void CloneWithModifiedAttributes_ShouldDetectDifferentNumberOfRecordsInGroups() + { + var originalCollection = new EntityReferenceCollection + { + new EntityReference("contact", Guid.NewGuid()) + }; + + var updateCollection = new EntityReferenceCollection + { + new EntityReference("contact", Guid.NewGuid()), + new EntityReference("contact", Guid.NewGuid()) + }; + + var original = new Entity("account", Guid.NewGuid()) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "relatedEntities", originalCollection } + } + }; + + var updates = new Entity("account", original.Id) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "relatedEntities", updateCollection } + } + }; + + var delta = updates.CloneWithModifiedAttributes(original); + + Assert.Single(delta.Attributes); + Assert.Equal(updateCollection, delta["relatedEntities"]); + } + + [Fact] + public void CloneWithModifiedAttributes_ShouldDetectDifferentRecordsInGroups() + { + var originalCollection = new EntityReferenceCollection + { + new EntityReference("contact", Guid.NewGuid()), + new EntityReference("contact", Guid.NewGuid()) + }; + + var updateCollection = new EntityReferenceCollection + { + new EntityReference("contact", originalCollection[0].Id), + new EntityReference("contact", Guid.NewGuid()) // Different ID + }; + + var original = new Entity("account", Guid.NewGuid()) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "relatedEntities", originalCollection } + } + }; + + var updates = new Entity("account", original.Id) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "relatedEntities", updateCollection } + } + }; + + var delta = updates.CloneWithModifiedAttributes(original); + + Assert.Single(delta.Attributes); + Assert.Equal(updateCollection, delta["relatedEntities"]); + } + + [Fact] + public void CloneWithModifiedAttributes_ShouldReturnEmptyDelta_WhenRecordsAreSame() + { + var originalCollection = new EntityReferenceCollection + { + new EntityReference("contact", Guid.NewGuid()), + new EntityReference("contact", Guid.NewGuid()) + }; + + var updateCollection = new EntityReferenceCollection + { + new EntityReference("contact", originalCollection[0].Id), + new EntityReference("contact", originalCollection[1].Id) // Same IDs + }; + + var original = new Entity("account", Guid.NewGuid()) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "relatedEntities", originalCollection } + } + }; + + var updates = new Entity("account", original.Id) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "relatedEntities", updateCollection } + } + }; + + var delta = updates.CloneWithModifiedAttributes(original); + + Assert.Empty(delta.Attributes); + } + #endregion + + #region EntityCollection Tests + [Fact] + public void CloneWithModifiedAttributes_EntityCollection_SamePartyIds() + { + var original = new Entity("test_entity", Guid.NewGuid()) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "partylist", new EntityCollection(new List + { + new Entity("party") { ["partyid"] = new EntityReference("party", Guid.NewGuid()) }, + new Entity("party") { ["partyid"] = new EntityReference("party", Guid.NewGuid()) } + }) + } + } + }; + + var updates = new Entity("test_entity", original.Id) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "partylist", new EntityCollection(new List + { + new Entity("party") { ["partyid"] = original.GetAttributeValue("partylist").Entities[0].GetAttributeValue("partyid") }, + new Entity("party") { ["partyid"] = original.GetAttributeValue("partylist").Entities[1].GetAttributeValue("partyid") } + }) + } + } + }; + + var delta = updates.CloneWithModifiedAttributes(original); + + Assert.Empty(delta.Attributes); + } + + [Fact] + public void CloneWithModifiedAttributes_EntityCollection_DifferentPartyIds() + { + var original = new Entity("test_entity", Guid.NewGuid()) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "partylist", new EntityCollection(new List + { + new Entity("party") { ["partyid"] = new EntityReference("party", Guid.NewGuid()) }, + new Entity("party") { ["partyid"] = new EntityReference("party", Guid.NewGuid()) } + }) + } + } + }; + + var updates = new Entity("test_entity", original.Id) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "partylist", new EntityCollection(new List + { + new Entity("party") { ["partyid"] = new EntityReference("party", Guid.NewGuid()) }, + new Entity("party") { ["partyid"] = new EntityReference("party", Guid.NewGuid()) } + }) + } + } + }; + + var delta = updates.CloneWithModifiedAttributes(original); + + Assert.Single(delta.Attributes); + Assert.True(delta.Attributes.ContainsKey("partylist")); + } + + [Fact] + public void CloneWithModifiedAttributes_EntityCollection_EmptyOriginal() + { + var original = new Entity("test_entity", Guid.NewGuid()) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "partylist", new EntityCollection(new List()) } + } + }; + + var updates = new Entity("test_entity", original.Id) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "partylist", new EntityCollection(new List + { + new Entity("party") { ["partyid"] = new EntityReference("party", Guid.NewGuid()) } + }) + } + } + }; + + var delta = updates.CloneWithModifiedAttributes(original); + + Assert.Single(delta.Attributes); + Assert.True(delta.Attributes.ContainsKey("partylist")); + } + + [Fact] + public void CloneWithModifiedAttributes_EntityCollection_EmptyUpdates() + { + var original = new Entity("test_entity", Guid.NewGuid()) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "partylist", new EntityCollection(new List + { + new Entity("party") { ["partyid"] = new EntityReference("party", Guid.NewGuid()) } + }) + } + } + }; + + var updates = new Entity("test_entity", original.Id) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "partylist", new EntityCollection(new List()) } + } + }; + + var delta = updates.CloneWithModifiedAttributes(original); + + Assert.Single(delta.Attributes); + Assert.True(delta.Attributes.ContainsKey("partylist")); + } + #endregion + + + #region DateTime Tests + [Fact] + public void CloneWithModifiedAttributes_ShouldDetectDifferentDateTimeValues() + { + var original = new Entity("account", Guid.NewGuid()) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "modifiedon", new DateTime(2023, 1, 1, 12, 0, 0, DateTimeKind.Utc) } + } + }; + + var updates = new Entity("account", original.Id) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "modifiedon", new DateTime(2023, 1, 2, 12, 0, 0, DateTimeKind.Utc) } + } + }; + + var delta = updates.CloneWithModifiedAttributes(original); + + Assert.Single(delta.Attributes); + Assert.Equal(new DateTime(2023, 1, 2, 12, 0, 0, DateTimeKind.Utc), delta["modifiedon"]); + } + + [Fact] + public void CloneWithModifiedAttributes_ShouldReturnEmptyDelta_WhenDateTimeValuesAreSame() + { + var original = new Entity("account", Guid.NewGuid()) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "modifiedon", new DateTime(2023, 1, 1, 12, 0, 0, DateTimeKind.Utc) } + } + }; + + var updates = new Entity("account", original.Id) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "modifiedon", new DateTime(2023, 1, 1, 12, 0, 0, DateTimeKind.Utc) } + } + }; + + var delta = updates.CloneWithModifiedAttributes(original); + + Assert.Empty(delta.Attributes); + } + + [Fact] + public void CloneWithModifiedAttributes_ShouldDetectDifferentDateTimeValuesWithDifferentTimeZones() + { + var originalDateTime = new DateTime(2023, 1, 1, 12, 0, 0, DateTimeKind.Utc); + var localTimeZone = TimeZoneInfo.Local; + var updateDateTime = TimeZoneInfo.ConvertTimeToUtc(new DateTime(2023, 1, 1, 6, 0, 0, DateTimeKind.Local), localTimeZone); + + var original = new Entity("account", Guid.NewGuid()) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "modifiedon", originalDateTime } + } + }; + + var updates = new Entity("account", original.Id) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "modifiedon", updateDateTime } + } + }; + + var delta = updates.CloneWithModifiedAttributes(original); + + Assert.Empty(delta.Attributes); + } + + [Fact] + public void CloneWithModifiedAttributes_ShouldDetectNullOriginalDateTime() + { + var original = new Entity("account", Guid.NewGuid()) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "modifiedon", null } + } + }; + + var updates = new Entity("account", original.Id) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "modifiedon", new DateTime(2023, 1, 1, 12, 0, 0, DateTimeKind.Utc) } + } + }; + + var delta = updates.CloneWithModifiedAttributes(original); + + Assert.Single(delta.Attributes); + Assert.Equal(new DateTime(2023, 1, 1, 12, 0, 0, DateTimeKind.Utc), delta["modifiedon"]); + } + + [Fact] + public void CloneWithModifiedAttributes_ShouldDetectNullUpdateDateTime() + { + var original = new Entity("account", Guid.NewGuid()) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "modifiedon", new DateTime(2023, 1, 1, 12, 0, 0, DateTimeKind.Utc) } + } + }; + + var updates = new Entity("account", original.Id) + { + Attributes = new Microsoft.Xrm.Sdk.AttributeCollection + { + { "modifiedon", null } + } + }; + + var delta = updates.CloneWithModifiedAttributes(original); + + Assert.Single(delta.Attributes); + Assert.Null(delta["modifiedon"]); + } + #endregion + } +} \ No newline at end of file diff --git a/src/Root16.Sprout.UnitTests/Root16.Sprout.UnitTests.csproj b/src/Root16.Sprout.UnitTests/Root16.Sprout.UnitTests.csproj new file mode 100644 index 0000000..884a1f8 --- /dev/null +++ b/src/Root16.Sprout.UnitTests/Root16.Sprout.UnitTests.csproj @@ -0,0 +1,28 @@ + + + + net8.0 + enable + enable + + false + true + + + + + + + + + + + + + + + + + + + diff --git a/src/Root16.Sprout.sln b/src/Root16.Sprout.sln index 1bd7a20..a7d48f3 100644 --- a/src/Root16.Sprout.sln +++ b/src/Root16.Sprout.sln @@ -15,6 +15,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Root16.Sprout.SqlServer", " EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Root16.Sprout.Sample.SqlServer", "Root16.Sprout.Sample.SqlServer\Root16.Sprout.Sample.SqlServer.csproj", "{DE0FA5BD-0445-406E-9158-7F89FC2B6958}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Root16.Sprout.UnitTests", "Root16.Sprout.UnitTests\Root16.Sprout.UnitTests.csproj", "{EB25A8E9-F0D4-4F8A-98EA-0F27EE330598}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -45,6 +47,10 @@ Global {DE0FA5BD-0445-406E-9158-7F89FC2B6958}.Debug|Any CPU.Build.0 = Debug|Any CPU {DE0FA5BD-0445-406E-9158-7F89FC2B6958}.Release|Any CPU.ActiveCfg = Release|Any CPU {DE0FA5BD-0445-406E-9158-7F89FC2B6958}.Release|Any CPU.Build.0 = Release|Any CPU + {EB25A8E9-F0D4-4F8A-98EA-0F27EE330598}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EB25A8E9-F0D4-4F8A-98EA-0F27EE330598}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EB25A8E9-F0D4-4F8A-98EA-0F27EE330598}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EB25A8E9-F0D4-4F8A-98EA-0F27EE330598}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 35164ca29812407d1906d46badf0de3c9daef70d Mon Sep 17 00:00:00 2001 From: James Trieu Date: Thu, 13 Feb 2025 12:57:28 -0600 Subject: [PATCH 33/34] move datarow extensions, remove dependency on dataverse from sql --- .../Extensions/DataRowExtensions.cs | 32 ++---------------- .../Root16.Sprout.SqlServer.csproj | 1 - .../packages.lock.json | 21 ------------ .../Extensions/DataRowExtensions.cs | 33 +++++++++++++++++++ .../Extensions/IEnumerableExtensions.cs | 4 +-- 5 files changed, 36 insertions(+), 55 deletions(-) rename src/{Root16.Sprout.SqlServer => Root16.Sprout.Dataverse}/Extensions/DataRowExtensions.cs (83%) create mode 100644 src/Root16.Sprout/Extensions/DataRowExtensions.cs diff --git a/src/Root16.Sprout.SqlServer/Extensions/DataRowExtensions.cs b/src/Root16.Sprout.Dataverse/Extensions/DataRowExtensions.cs similarity index 83% rename from src/Root16.Sprout.SqlServer/Extensions/DataRowExtensions.cs rename to src/Root16.Sprout.Dataverse/Extensions/DataRowExtensions.cs index 7cdcf30..278b9a5 100644 --- a/src/Root16.Sprout.SqlServer/Extensions/DataRowExtensions.cs +++ b/src/Root16.Sprout.Dataverse/Extensions/DataRowExtensions.cs @@ -1,39 +1,11 @@ using Microsoft.Xrm.Sdk; -using Root16.Sprout.DataSources.Dataverse; +using Root16.Sprout.Extensions; using System.Data; -namespace Root16.Sprout.DataSources.Sql; +namespace Root16.Sprout.DataSources.Dataverse; public static partial class DataRowExtensions { - public static object GetValue(this DataRow row, string column) - { - return row.Table.Columns.Contains(column) ? row[column] : null!; - } - - public static TOut GetValue(this DataRow row, string column) - { - if (row.Table.Columns.Contains(column) && row[column] != null && row[column] is not DBNull) - { - return (TOut)row[column]; - } - - return default!; - } - - public static bool TryGetValue(this DataRow row, string column, out TOut value) - { - if (row.Table.Columns.Contains(column) && row[column] != null && row[column] is not DBNull) - { - value = (TOut)row[column]; - return true; - } - - value = default(TOut)!; - return false; - } - - /// /// Set Entity's string attribute values from the datarow's corresponding column. Datarow field and entity field types must match. Datarow field name or alias and entity field name must be the same. /// diff --git a/src/Root16.Sprout.SqlServer/Root16.Sprout.SqlServer.csproj b/src/Root16.Sprout.SqlServer/Root16.Sprout.SqlServer.csproj index 2993d3c..93b5535 100644 --- a/src/Root16.Sprout.SqlServer/Root16.Sprout.SqlServer.csproj +++ b/src/Root16.Sprout.SqlServer/Root16.Sprout.SqlServer.csproj @@ -27,7 +27,6 @@ - diff --git a/src/Root16.Sprout.SqlServer/packages.lock.json b/src/Root16.Sprout.SqlServer/packages.lock.json index 5e37eef..67ae461 100644 --- a/src/Root16.Sprout.SqlServer/packages.lock.json +++ b/src/Root16.Sprout.SqlServer/packages.lock.json @@ -1154,13 +1154,6 @@ "Microsoft.Extensions.Logging.Console": "[7.0.0, )", "Microsoft.PowerPlatform.Dataverse.Client": "[1.1.16, )" } - }, - "root16.sprout.dataverse": { - "type": "Project", - "dependencies": { - "Microsoft.PowerPlatform.Dataverse.Client": "[1.1.17, )", - "Root16.Sprout": "[1.0.0, )" - } } }, "net7.0": { @@ -2308,13 +2301,6 @@ "Microsoft.Extensions.Logging.Console": "[7.0.0, )", "Microsoft.PowerPlatform.Dataverse.Client": "[1.1.16, )" } - }, - "root16.sprout.dataverse": { - "type": "Project", - "dependencies": { - "Microsoft.PowerPlatform.Dataverse.Client": "[1.1.17, )", - "Root16.Sprout": "[1.0.0, )" - } } }, "net8.0": { @@ -3470,13 +3456,6 @@ "Microsoft.Extensions.Logging.Console": "[7.0.0, )", "Microsoft.PowerPlatform.Dataverse.Client": "[1.1.16, )" } - }, - "root16.sprout.dataverse": { - "type": "Project", - "dependencies": { - "Microsoft.PowerPlatform.Dataverse.Client": "[1.1.17, )", - "Root16.Sprout": "[1.0.0, )" - } } } } diff --git a/src/Root16.Sprout/Extensions/DataRowExtensions.cs b/src/Root16.Sprout/Extensions/DataRowExtensions.cs new file mode 100644 index 0000000..0b9ac1d --- /dev/null +++ b/src/Root16.Sprout/Extensions/DataRowExtensions.cs @@ -0,0 +1,33 @@ +using System.Data; + +namespace Root16.Sprout.Extensions; + +public static partial class DataRowExtensions +{ + public static object GetValue(this DataRow row, string column) + { + return row.Table.Columns.Contains(column) ? row[column] : null!; + } + + public static TOut GetValue(this DataRow row, string column) + { + if (row.Table.Columns.Contains(column) && row[column] != null && row[column] is not DBNull) + { + return (TOut)row[column]; + } + + return default!; + } + + public static bool TryGetValue(this DataRow row, string column, out TOut value) + { + if (row.Table.Columns.Contains(column) && row[column] != null && row[column] is not DBNull) + { + value = (TOut)row[column]; + return true; + } + + value = default(TOut)!; + return false; + } +} \ No newline at end of file diff --git a/src/Root16.Sprout/Extensions/IEnumerableExtensions.cs b/src/Root16.Sprout/Extensions/IEnumerableExtensions.cs index ebfe742..dbc0540 100644 --- a/src/Root16.Sprout/Extensions/IEnumerableExtensions.cs +++ b/src/Root16.Sprout/Extensions/IEnumerableExtensions.cs @@ -1,6 +1,4 @@ -using Microsoft.Xrm.Sdk; - -namespace Root16.Sprout.Extensions; +namespace Root16.Sprout.Extensions; public static class IEnumerableExtensions { From f6d9d4e81db696242047c19dab7ddd12379b85cb Mon Sep 17 00:00:00 2001 From: Corey O'Brien Date: Fri, 14 Feb 2025 10:38:36 -0600 Subject: [PATCH 34/34] Update deploy-to-nuget.yml updated main branch name --- .github/workflows/deploy-to-nuget.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-to-nuget.yml b/.github/workflows/deploy-to-nuget.yml index a0647ce..25093fc 100644 --- a/.github/workflows/deploy-to-nuget.yml +++ b/.github/workflows/deploy-to-nuget.yml @@ -21,7 +21,7 @@ jobs: - name: Set variables id: setvars run: | - if [[ "${{github.base_ref}}" == "master" || "${{github.ref}}" == "refs/heads/master" ]]; then + if [[ "${{github.base_ref}}" == "main" || "${{github.ref}}" == "refs/heads/main" ]]; then echo "VERSION_SUFFIX=" >> "$GITHUB_ENV" fi