From ae3c7ae66906a29bba4a17dc9fbc178ae8c8a95e Mon Sep 17 00:00:00 2001 From: Klaus Fischer <klaus.fischer@eloware.com> Date: Sun, 18 Sep 2022 11:22:19 +0200 Subject: [PATCH] Added E2E Test for pre encrypted submission --- DemoRunner/SenderDemo.cs | 28 ++++-- E2ETest/E2ETest.csproj | 16 ++-- E2ETest/EndToEndTestBase.cs | 2 +- E2ETest/StraightForwardTest.cs | 3 +- E2ETest/StraightPreEncryptedForwardTest.cs | 88 +++++++++++++++++++ FitConnect/EncryptedSender.cs | 11 +++ FitConnect/Encryption/FitEncryption.cs | 6 +- .../Sender/ISenderWithAttachments.cs | 6 -- .../Interfaces/Sender/ISenderWithService.cs | 7 ++ MockContainer/MockContainer.cs | 2 +- 10 files changed, 146 insertions(+), 23 deletions(-) create mode 100644 E2ETest/StraightPreEncryptedForwardTest.cs diff --git a/DemoRunner/SenderDemo.cs b/DemoRunner/SenderDemo.cs index ad1027e5..9787805c 100644 --- a/DemoRunner/SenderDemo.cs +++ b/DemoRunner/SenderDemo.cs @@ -1,5 +1,6 @@ using System.Threading.Channels; using FitConnect; +using FitConnect.Encryption; using FitConnect.Models; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; @@ -30,13 +31,30 @@ public static class SenderDemo { var destinationId = config["FitConnect:Sender:DestinationId"]; var leikaKey = config["FitConnect:Sender:LeikaKey"]; + + FitEncryption encryption; + Dictionary<string, string>? encryptedAttachments = null; + string? encryptedMetadata = null; + string? encryptedData = null; + var sender = Client .GetSender(FitConnectEnvironment.Testing, clientId, clientSecret, logger) - .WithDestination(destinationId, (key) => Console.WriteLine(key)) - .WithServiceType("FIT Connect Demo", leikaKey) - .WithEncryptedAttachments(new Dictionary<string, string>()) - .WithEncryptedMetaData("") - .WithEncryptedData("") + .WithDestination(destinationId, + (k) => { + logger?.LogInformation("Received public key: {Key}", k); + encryption = new FitEncryption(k, logger); + encryptedAttachments = new Dictionary<string, string>() { { "", "" } }; + encryptedMetadata = ""; + encryptedData = encryption.Encrypt("{\"message\":\"Hello World\"}"); + }); + + // Return the public key to the JavaScript client + // Come back later with the encrypted data + + sender.WithServiceType("FIT Connect Demo", leikaKey) + .WithEncryptedAttachments(encryptedAttachments) + .WithEncryptedMetaData(encryptedMetadata) + .WithEncryptedData(encryptedData) .Submit(); } } diff --git a/E2ETest/E2ETest.csproj b/E2ETest/E2ETest.csproj index 974a92a0..4881ea4e 100644 --- a/E2ETest/E2ETest.csproj +++ b/E2ETest/E2ETest.csproj @@ -9,17 +9,17 @@ </PropertyGroup> <ItemGroup> - <PackageReference Include="FluentAssertions" Version="6.7.0"/> - <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0"/> - <PackageReference Include="NUnit" Version="3.13.3"/> - <PackageReference Include="NUnit3TestAdapter" Version="4.2.1"/> - <PackageReference Include="NUnit.Analyzers" Version="3.3.0"/> - <PackageReference Include="coverlet.collector" Version="3.1.2"/> + <PackageReference Include="FluentAssertions" Version="6.7.0" /> + <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" /> + <PackageReference Include="NUnit" Version="3.13.3" /> + <PackageReference Include="NUnit3TestAdapter" Version="4.2.1" /> + <PackageReference Include="NUnit.Analyzers" Version="3.3.0" /> + <PackageReference Include="coverlet.collector" Version="3.1.2" /> </ItemGroup> <ItemGroup> - <ProjectReference Include="..\FitConnect\FitConnect.csproj"/> - <ProjectReference Include="..\MockContainer\MockContainer.csproj"/> + <ProjectReference Include="..\FitConnect\FitConnect.csproj" /> + <ProjectReference Include="..\MockContainer\MockContainer.csproj" /> </ItemGroup> </Project> diff --git a/E2ETest/EndToEndTestBase.cs b/E2ETest/EndToEndTestBase.cs index 4052e4d4..85bc6975 100644 --- a/E2ETest/EndToEndTestBase.cs +++ b/E2ETest/EndToEndTestBase.cs @@ -22,7 +22,7 @@ public abstract class EndToEndTestBase { Logger = LoggerFactory.Create( builder => { builder.AddConsole(); - builder.SetMinimumLevel(LogLevel.Debug); + builder.SetMinimumLevel(LogLevel.Trace); }).CreateLogger("E2E Test"); diff --git a/E2ETest/StraightForwardTest.cs b/E2ETest/StraightForwardTest.cs index 19a3000b..61fd4404 100644 --- a/E2ETest/StraightForwardTest.cs +++ b/E2ETest/StraightForwardTest.cs @@ -4,6 +4,7 @@ using Microsoft.Extensions.Logging; namespace E2ETest; +[TestFixture] public class StraightForwardTest : EndToEndTestBase { private string _caseId = null!; private string _submissionId = null!; @@ -47,7 +48,7 @@ public class StraightForwardTest : EndToEndTestBase { status.ForEach( s => Logger.LogInformation("Status {When} {Event}", s.EventTime, s.EventType)); } - + [Test] [Order(40)] public void RequestSubmission() { diff --git a/E2ETest/StraightPreEncryptedForwardTest.cs b/E2ETest/StraightPreEncryptedForwardTest.cs new file mode 100644 index 00000000..a7c31756 --- /dev/null +++ b/E2ETest/StraightPreEncryptedForwardTest.cs @@ -0,0 +1,88 @@ +using FitConnect.Encryption; +using FitConnect.Models; +using FluentAssertions; +using Microsoft.Extensions.Logging; + +namespace E2ETest; + +[TestFixture] +public class StraightPreEncryptedForwardTest : EndToEndTestBase { + private string _caseId = null!; + private string _submissionId = null!; + + [Order(10)] + [Test] + public void SendingSubmission() { + var submission = Sender.WithDestination(Settings.DestinationId) + .WithServiceType("Straight forward test", Settings.LeikaKey) + .WithEncryptedAttachments(new Dictionary<string, string>() { + { + "a2c0667a-8162-443b-a08a-a80936709ba0", + "eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMjU2R0NNIiwia2lkIjoidnI3Y1dLR2wtZzRXYV9DUkdvd05oQVlXX2dRYi1ha01iaWlneE4wRWtESSIsImN0eSI6ImFwcGxpY2F0aW9uL2pzb24iLCJ6aXAiOiJERUYifQ.dIJJGlWOaV5HqJxcLUyHngWwE6fLk66iOvrLfbP8pLfcYcuPU6HFdScVKBWTWAtWCBO62--uEagzW2kmbWnBcj8eZo6Nus4JLLq28Bk03S3ZXyMjHy4wHaHW_oXdSogSi5KJLEr-xR6fj3ztAmReNwa3zRmKb7VncknxtI4AzQuC3WEO4SnwAhUJYCxzNoFf7ewgjkNJcJK5un9ZlJe6Xljbd9RGQ47FnPbKSqQDlBFVeapwK6WjZmjQktpxQN2sROAcjP1xeYxGlEDo5OmLJ-Nd-QbQ3eTn8d5rfT9pyTZiG1Mm7-DsmtQCM-KHBsygQR4Zk7PxD6tuOvwo0YthiC_aCxIa4KtJRdL2Tk-YUv9QMYT9pKrHlXK_v97mgsmNWU8jp6MKSk-7baKTGqlXB9wMgGpOBzTPulGpaYaPn9QcoGg_xSrL6m781RYkYDsiUfW5QBxfbiaWhAKbIsohmA6GLfdAZaTFJM7Ic4Cryh2Rzh8CMI13b5OZxZu0XoHwM8d5G7cYI5S99S0cBy6V4OMMJSvwvKXrAldUkR83nZrJMAT7O78GmeXWWNvmO2zFeXFWv6HEikd12EaZ472qy2pMmotKbW4VdX2Mp3fg67ECdn_9DjmMdIdvcr-9hrvxlDVerpZA71wZ5SX2p37KGTkTWpijJ99qHKZLfvkQumg.byGlrhJG-rwiSjyv.uofMXOJKsnBvY-NUs408UKyKoR2hlWom_CM5aXHS67i5V64WNkt_XcEUHbdGmJA1J-y-AGutVjrO8O6OGC8XWT_lSFMCymo62MCLr7PPr5hP3U7ZZJGg8UD7dwVO9aOL_Fd3IWVI3pW_GgmIiub72XWj0oenbvpJ2eegfo_jgAwZJVxt4eJe0K9YKoWKySp16Y7UQymb0LGtib1udacmJ4er6MQQ6vGVSiYUDQi9GmDhflEPvDRx7lHbRdTLEtLJ7QOMtHY6gdMiq_aZokvSoLkjmkygDg94nkuez3K3S6eMVBGm_w550DN8OI8Gdub0D7QsLcLbqBFAm-vF0lIyhRnBo10edMg6_0LL88jJfBzQSrvQqDZG6b3N-R-HnKw7BnAvZpIkXQkXqyWGNu2cw-SBammi_B1Jox5QfDOwxIVxNZe8Zvqth6tvEH19hean71NdERWuLVgLgwrnlkuy1smbCpG-oLBVytbEaM-ZcZw-y89E7KWcGti7rIV8f8GDOuaX-7ZgkFB3pk9IIg22-SwYGVG6aSSWEPLIrR0fxAs3ABiCmiKjTD7Kkb57LTZAq1NB1RZxOzlRAk3_Ji64BadmonErSanwT1ZT58Nv5WMYxgTtjOyvZOYMoRzDZbvFD-5W-oxXSvSOsewN32LdBkyidF-56b78fAAeB2K3609G5Kvl-vWD9ZsUJ5AaK-gQBRFW3CO3qGmNsgGdT5VNgpHIwUjerClLNf6H2Q8uxQdkOxLarQQMc73jbHXEqtTrt0U3-VFowNVsG6_Zh4MoCZer4iHhToa0Mpl9Ap6AyursYtYYrvATZ3sr82K_T8Un1R9jEuPfAnMTSRzBoNHRcMfGT6vSRoUwUk-KXKfqyUk1k7miBvBtl8_t1Wl8_dX7Y1c6031Pv2MW0b7Sl6GTG4fvPuCdL29GYzKMZwyCOn4NnNWfA16b8l8j6XI5VyD7dxqroIVzkb7IxF5zLDa7h8-riH6x-zaE81s6fmFEuOoDgHoFENSs-1vZg1uP27rBKgfjjptTdLvIlrfUPeTaYv9dJAczymygg2_YeTXStH_B4vkGKfimQCJsV1xi38sVCsa1ZfLFg8l1X_wFbegxWMy43jrI8PuDbAy778MxaOfB2YV7uBnmbdiB5P09FqmD2Kbys2AGBOIK_XysKGZrqNGBpp3FsMK4qrfEhj-yPsnZWsmJ7t_5J9TVV5nxJYdKk5DW9d3m8B9ur49vveYQHabMiwOwbmnTSy6c5lnVPT_XRhpUKqVH--ugF6_GkiLfkQax0bZSGo2Z42JMfWHqURIEC3dSs0AG-yf7Pnqew96-t_PYKv4l4-fOt3VYiedj6qDXwt08Qkmk4MCtvud_uqVJMkHrSyR6EfJQSvRMBhquzW5G6LvAvNe_nsiRcQluLAAqca4GRUREFR_AQDg3gAUuWln2P0P0y0uqiclFjnc-4VUAywjVnId8u1iCqxlLA1YntpL6jMGXjyMFlT_BjpR1Vjj8lSC6qPVDDrW5lPEHa4lTXcBes-AYXLTKBgxSti6Ya723kbv5IfqpIizAmVVTwI3j9DD4FrbbC0FHfxjFE4sJF4hfbiaAUCXqFwflFeKnNbrznIb_k-VU4Cyr79USkEmiVpsVwrWAu7FKyNgljJ7oULtGH6maeFCiU6ugt-XGtL9nAzcpC0VBs_buqM0f3VPYaIj0mZvctuqS83BbsD_f0H2dUjlQ3ko783YMf4jQbcB4AxAhnc_Gg_pNDzY2jTRC6Qk3pesjGrCFbaQEfWJCAK709msIMASmCDwxNo45r0Ru9FywNErWP5_Om8lkhgtPA5T0PgO3_2Ko_eYbw5ZZybU7GUuoH5gXgpMniuYFZaYVI2u6rCHMwSxPbCU3kGV0tNAaiLxim7zpk1DjCh7rkWhP3EQX4rryEeAqR90SShLkEmU4qAJvxq2nuGoGlY7ZaUvMXc-1k6NwRBr9jKgNNM_ryxraglwDx4EWghlQYUK9R4X6X7XjXIi7c1MW7bV9vah5DsozA346aKJacrLha2hC7ZGVYTtUAZNXRTEKddK1rPiBKgLCV5m1EVtbA8-MF1NcPGqj1Q9n7zO70mnB2sXjOc47i4HhlcrJBmoKZbyOl-GsBT3GDSeKhALM-GR-Bx7aX_pbli-FPK-SFBR22FuQLKrSD0oPCeYI-PtrxwMcOA-K7ilyXwRYfMRLQnIH9ftPMmmWAhoGTM4Ze-MT-L0MBkM9kAX3BlWrP1ChfLsu1AL18jYyDhJY0K_56_laf0jxNSEuflLIPoiqTy1-n3unjp40mN7dIS1qw2w43k_wfGd-U-6_db0bUfnKbv0SIew5sAWwcF_P9jmrm1fC5k5YWrQzVlC6CRItIJOd5pARZBjkNCWevNxHEz_1mv_U9gcTFP_8NLTEZTwMmoyIx3yGxsW-tsd5VNQH_l05xEytek8vT3qvCV5-NL9xGUXXMU0pyqKw_SYPTcL8eEptnCST13cWoIIHvdxAsFEeRKx5jQbL4qXKXe6CZPu1QlrZO2RVEh-aYanL7AfyDJlfZc352vv1-oXb9GnUU60Z4UOSMp-p4Awuam6XXgDTUz0B4Mjg7tl5Ayx78LNVvu3lsC_WyKK7OS8po8LBWBYz6ueI-YtVNfLkqx1D_AZo3pJwxMRXQqJdxF8pT_cdoyPF7aQc2OAMkL5l-Nt8brCluz55Ykc_h4-juLd-cAAtyBzybvlc0gFf1AoOAxLWs8kZql2ZXzqSNiFcv-OC_5pC1GpTvzK1b_O6tUZAw53n3UTxYZ7h3hrVOHc9UWqCiLzXCpvtHHu5wNHENZ5MAlGYUtXfmniQc9_pG0xqVWN_I2NisiWOay6AQ802Syr2k73AeIP6wKKxoclygQMKUy_guHntG_rlBJf-bdbqbgkUun81mHLddRvIcz5mAr6vsO11HH3oDQ6kqQXmBOOWENlw0cr9SFev731M0zBi3QsIvEbX33Pl0ZRFXBfC_Uo6xzFTmsxVEaT4IyaCs42RepCMCDkpxqq-vNyiBZC_OlM8mLWpxlodQtqymAAF-lL0sCpdEaPsBbLUtZjRu-4835tAPPs-sLJ0vggvtJioj8YexskI0gQdU2tyXBdI5_1guIJkPJjUI1ZiwBwXPxFRuG_lxHxXUfs9Ho_0PmCQVPqx4hGZf38RTtWYM8o3xbEl8JwTGj6BN8Z9j7roaS4YSeUjSFwgYinqOsqEqCtrjnsgl4ZwCU-KtG-pXNdt414auPO-lnOK51EjGrE0ZI-KrNcgvRJjUwEpx_wWyh7pXNuD1MxkmnOJwLm_FYV4kYx89mBrS9Kn4iBM8ekUUmrH7FVd1JJcoeLyE9Q9Rlg4j2tkWtM6ttujXPBQo6Ot5JpEIFcamwVuoX4Lf0qqOB5yC9O3863SBg-5aAm64y0o2BDfW9yxtI5tVpFC6MzFbUpiLX8DdzYiDPmZLOqcF1xGYYBtzTnGmhG9aILfjyp85lECinyTnT6hlSkgNJnw3qIycB-mHdBn7hQ2lRrqjaM4cZyM1PHAeti8XCleEBcyb31aRWC4V9WYacSpXOmmEd1EcgtstNkpPloMudyYwVvffbSwdKXMjM9bv2MKxaymPgCDdKx8QudU7jxE72ua8qYHlQzyzUgJvKfiaUn9Nw18rpIyRSAi357r2xc_EhDhwuMKG2LIEQ30IAI4ymJL7PcaapASPfc-0HISdmtiLqqhwPrXZv4UnFRKMYYj26gqZeHw4OqoNcdGsVR6LuCEK3MP6_KHe6SE0wPdSS0OyH_xY1ylLVxrAgeL3NnHQDTW14QAXTOH1troCChG45672OLTCZnR2WhyyG1HbJatHzEzoS9-Fem8PA0IayiCYid1CnlILxWDNL_ZYEdatdwbxL1ZKP6hlZxRpYjpDIu6B-Hq2It2g1nC26uhggf1hO3K0N816MBTBI7G72WOJRDZcxFNjnzHJS8F9krWuYrrdwHEWWmXAE7yS7UmMzSzxYUMh6PyCX6U9dOfoyN5SvzabvVVMbbjomxIm8DCRLE8FG4dmwwkqNFdf8LAZWjQd3sra7_NafaJAlyKhNnrrr7dC1gtzloVaEGQutVwXrJYbNYr5FTPeT9Mr1YU6MVt-o8id5ZzaOWgTyBPNXDYJj5SlismA8GavpVf1HmAg_z5vTZkfGWrRFJFTNESLyy9-wrqJXszT478VTigmFBHg79-VNqGXS_YwBbm3XQVyPz1l0HYKOnutBeaeBhoAUCbPmHi4f_i2-ObGOWBVScNiMK3YZ7yhfp4wHZvzdBa1WeQOo12KlOAe__GCFB-IppF2oN5msJO4kLSAPZi6Dzwuih84b9ZcJlqnSWKnUi0EGuNlHa4qTuvV5h22D5Lj0tmQxf6jay9uJpgURyhtR_b2-fvvLqoniXslEUd45Ussh45OMPNAhhNKYIhZnRJKm4SU8FKebi_KOwAs963V_eZyzQxtfRRrXiaFrj6kRzlX7DwhxzRyQYCzA7iHWBqvsDrjJRI-tRQLYtR3A5tuSgBpMt1oM9U-XMBLsKvz1iMF23DAY8jlnpOy9cqiIoAeeJAZzac7fRbqim-qKiA-iJHaO_FBtf6bTVp37m0Um9TRuFWVCHy797dTEMIWsvz8NQjpY4NGQN6q4zWLkT0jnbWeNU6Y0N2fmY3aE5S059g3ccoCWJg2I7bhTEXOm24p1HF_Hvord22nwNMIZWDHmMwjHFW43y-UsdchYsX3zJqRUToxyW7uxV81coFI0GtymAOR600R6nYpkfUOA5amFEw9YQ_DpbBqpf2D7oeXL5mD3aIwVWzwINdmrfo9q7GObeZ5VCK85hts6fTbPnlPQqpts2noX_ZJS8KiFRL6BffBQ18kWQ8sSc2mT5xzeHm3tJCNj7hngbz1iwKwxsJS6MBFND6GY_JAfi5XKVAvQs08fpcwtn_0MK9vC9fZCj8_zSUbIuxB1qEA5LJUKb2R8IShI6y_u6a9QtZZRxglc9WBCgZJYtVK6DjoyQU1gnYbSjzSFNbDsVfaCPNAL6j9ohUBqHKDCesXvxAhNmOsrv9mpVnRGRlFNYNDcFd03GsPpeNMfIgHzHTsrfa2msilSS4dfpaJ2SW4aBaCp-XuOBZEwKf4-UUe0WdmlWKZYFZpbCZIn_jm2FG5YORW11yxEHAGA27XmoNMbQ14kMh40qpuLXdSjqjatL4do__P3PS9Da3s_HygtYotHBGA0tVJxEm3nXoTwqEqS3Ff3bhpRJy7rBO7v9uPO8Fpakj4wX-vJ-uFhamApXaQG2gghTfqtgLRatrl6ruHKKykMnE96fs8Pv5O7jmxBz094yoiuA8lO8n33ymHM_c9rFY1L8RbYEIP4AIJ2r-b3ZgGGPM-kQ5WLMKU26TRHnXcUKnpSMR5MF_eKr2eBnXE2bFW72cIVABSdOA73X7IVoR-mRfBPtE4FPGkjqjgrvHMSULItFMlbKTvjk1XzjD92kgTy0AnwwxgPw346_KY0OSkUP8O77ZZhDVYPuy7SEQ-98lquRV3HCOEblmiJYMCNUgEKjC-m0AnMx-n3cyrnD5GtWTAxirBj2CvE0C9TXkcF6s9V2xTEHi65y3zvwyQqUuGnKat_7K61apmePps4l7yr-r5aoQKaABG_tfj_-T3jlqITxFgxMQAWRJXJSPXUxPEp-rUi6_bmHbNXARGjLvAePLsiy79QhkrWYCQES1E11aP6BxG5vHW9Cti7yT7CcRwucKsUA3GQJWa7u4zavl2_XrF6pBTk4JZD9KjI3UfHDdyS2ueA-lx7qLSE0BFEXqpjEEjtJBmzfZQR4LGFH6k8G0hsBYV7WcgEYelqwPwCIUqomb8lRLkLnokwbeuey0gSbekfec6csMABwwYgJoyR12abmS6qhxsVlTQ198yzF_doJm_jJkjE56p94_XKqsdvgVLE6HLCSAsmJUCc-nWDE1S0EHSKC-7LtUyGjfvGQH058M9ub4xOojugaZvj4RHStw9pE3_uYgDNig_PviRnO85Z_05PFehcVUJZUjPjnSnkcpqTJTWVxsZ0okfLvwieSiGHM_VFteGQkyg9-YKKjRlQtRV4rsXCVlIInVXyXgohsm4kV8AwnXFx2r2N3BP5-tpd-J1v4Vmh36MuCuIZyLxlN-n6YXIoOr9u_jiVR_5kwG35fnx2KZMcx663amZxo1EHYwseYIvxVdVGnLkcmMu1syulCiPthTxcuuMZSsF4ZW7wJ5wf6HIzzqbFy1O-lpLb75tRsl37ArlovWEW5tANSjcVoAm2qQtBkhJxwVeqAfCd7djiRtLf93NPdeu6tzDKqtR9bljGx62Fz9iIIBKlpUXJiky5pq0HE9FlsntWG4Xwb1elQ1O0bvdDtD-0sWKc60eis-bP3ZNsqrtdSDW1py6WOIvStIE589cD9L82qxmDQJ3K1xEl4B_PzuvCbFugSqegDes7DDdYZOi1f2TCdFxERUFmeIYnDnJ1qnut8GSPrccG9Mj4O01akCJxn7cNjnvt9kvZUz0qXYzya-ZsvO2KcZTjDKYxvLsQj-KKYYp59PFiB3ePjqEvDmvG9XNnJM3isCCM9jUikzlGX2yFaveMH9KlYd22PH6k0MW_UV0qoN7mNg8-5OfvAZz09ZgeDJLk7c2sJiBLpMhFs9gCHlUC1g735-P2LaplMxdozYJTRKgaja9EN8BBr6eAz1BRTFiSj2G_eT0vUNc5oCSc_Z3ea7wZZvPZeuFwHU9qcCQ5vOsnioZWk3iAg0eavqGi5_P_HCXSLcvGXX2P0vosjN9rviRW6MX3ou2HjvRoia86w6kHBBuAkJW3uZVq3c6rKbjI7H7fURpJ2-mtOccNGnNwy1xb1VqYvq5-pDdpynQGucNs8FbcLkpFWGjU92E41yKDOCGP-ynSP8UEhfm5VPNmUhSL9SJOqAsjyTu9B0mcXV1j80fJiiyz_rl58J40Fuu9ISMjm6TUpSLjuiKMNWWwRitTlSboOas6uGnOfM5sVwpgJFgVBZHHv-bOG03t4xS3Zbjc9GkoVZITl6zVENu20iTNeWWyzi562mQMazc-PIOtWJbdDaNlUPO88PbQH9eZnmUGrOriV-qMvf-VH8D3oy48McR8CiAdz6pvAcwvc3eP6RvpmVt7RSXsrM3KEP140w1YllOhwYVwR2sQSvLDNSZSfzRarfN0QfE2MXCu6EbJBBB5sdM7OhhasaFUfJy-4z_gve9MsTAyASBNDodWK1ln4JdSJPyqBTziB4tOYjRigz_GLN1LnqJd88SBnf9GN2HrpWwDqlqxd7cgYPB6xAMJ2NZMGvpaIn70-oBNv-qTK3tyMXx1pdc0CDhfxbTt6hRT4oGRdi4LKRheaIIpsZU77m2-n-i_bSzX5qfw60mkRfjrVEYoUSP6yCWmj_OH7fLW8sSgXXKF_pS4yP296FUeX50hg7dOQNHTDUV5A52uQ-VYTEyczdUIrye2jVbcUvoAhJPRSjtBCrBQAHsBc4q4V931wosVW00BHmnL4S1J-r6ar-oQndtmiNqsNGCZfItbwMgG7xSf9H13FgeHnNRLguz86JCjGbeS2izK846rP1iGT1lPQHgJYwWG_imafcqUED35ON0Vh35GhFT8WVci9dhKGNrKli_tatufshWAGMOQhZC6azJMnZ3sya1sM7Grba_pIcdj68K3kh5sXfsAVoCEGbbx2K3HKEqCDzwYfqIA8SuW2kCqW_MS_gbb7nNlftDfXG2DkSyzE6OD2ZjTNN1DpC9iAxL8Lx1zeNcwzKGftPfjuVjaGS0j0xQgbKsRd9iuOvGK7Cw-W3ELYMjweOA7O7rgHwPesB-0j6gNJIbJq70PzL79vAGRSSvwVq04z0TTUhYQCWCNgTpFxp_QD0PKOiemD7-s2dHC2-E7DQYzHq_sgefCatUwkHuPKOvmQZ0AdNhKnAWLW0zyA56wbUvtywUD2y5T_6cUMPYXIQtpgCwa_8HgsBUeU_0lW9pFa7H9yzHlewrodtU_3rDnM2OTgF1QIaA9emwD4g1vx0pQ6V1rGGqqf46RFdREEFk0vfcTW19v-Hshyub6NUWhaOf4V-AvG--4kBaMTasxw8pPdIEriUkP4LdtqhdgYz9s14Xtl2Vz797F1-cDJoS2IOmm1pknHV6HNldVnEi1ZpX2_Bd7xxujTYUvShbVeqLfzNsTvEXmgbFMDciW-ywDzoAKQ3at5kdg4sZgq8l24Uy9kNNyWJr8acf2nw1JhZ-81siqnPWWBLZrxObUtDTslEtgNpV_FyYvAVKE3G0NIIDdfhXjMEMUf65mIHBScZth603GduFPQGHD8KEq2npRKUTRiJt3j_5Quhv-bgdW5-isbUZbZjORaxvUjug560AI7XG5SS2K6dfLqTD6bU3eoHyz8BirVxuwWFlHIk_7sGN_Tefu0_SuOo72m1diwBi4LqPJ9EYq0nGuWDlRDpLKZ1PSbndMOcFDQYxbHNHDaKdVLEVYZAlQVA3BA9Uf75gwAWbZOot3DYZIOdl0hgmIMJhX8EagYFJ7LhgCtztYTHmT2iyOk4to22fpmru5kZ43vt8MPNKgPJNu-x4bidXn24FbvI3MAkOJGNTBoItKb9SC1LRVUcDvFzwJNYXEXkhZef6kURVbCm2eD7SigBSdZw7sr9gmnickR76MYrytZDhAh6i8dZlmzeMhHGVzuxFsFR97XLXhOXWiaULZlq6t52aUztNOCa13Yy3iFqqtncZ-I_4D1B-5aJ3D3DAAjLAqG73BEqguqbNzKYmkg-Aeqne5fmnK621IMPZxHr5-fqthJOZ0Vydm3VT9ODrVvU5IpvgKss4U1AiYbvTtqkGkGICX253Nk_jh48BRxugT00ewwgSn84K9eqQIUCr0wpVvCeXLKGz0Xo-vu2FTzVGtk6deAfka7FiVKzdn_WvDKevEegMJ0G7aMGZB9zynZ8A-efuxDnpaPcd8qwsvKFGQcJmtLaCgGkWr-UGiw4dwWXUbHItaKZ5BQaSontpMKbWWxgPQaNWZq_-1tXTXi17mR64RPkpsKskP_G8L1yr6ccFc095sY4ZnZjOs_qWs3z53TGTkDuva1WPWap2z9nGhkZFj7sGpWs_mJhFZJ4Fs64Uw-plKXNazuzprrDExZXy5dHBoeiF9wYIU9LkFHZIKPy3Wzj8YbNvGzQj5gJaW1T9JXuegpO8DnjSVf1J0bLWD_m3ECuE-6iQ7UZZqkbsvQ0G2tPyPUlwQTNQvEpXSCJ8lYYV4N6OBbZ8G7tLpJTzaIVoqm9hmZDYTN-b2LJFsRv7zDD0uXWDbg6fY3wGY6Luhgi3PWNdK6IuDxwkTaEw6Aam9wsNiXu9_3n6bUySbsAm_wS_Edcnb-RI-eTSY0Q_ghqfj0qsFOV2Qn-iSpQ5jpbKqMPu-SlJGX2XdM3IbUypdPWPQYB4xCKBcSYh5yfxaSHDjxJ6ST-_L0RrKoG_tSVHVe872B0efmyu3GBGDVFS4TEIs3-fbDrOxIA37cw1CD1ORisYIJEfSwkJPwuuYOFbgqTv4IRijt2R8dPYQz59M9vwK8nDxTBV8nY1DuMIEsMSrS-IfpTn4RtzPC6JUudQ7wjubJX5Xa77AeK1b8qy3S5goAbhpl29HTJ3zHmEOWZ6xQzrHKiXicIGiiOe4C195EDs74ieMP6y_9nkK8hCWq3_oFld2lpu_azdPex9CZHboEN_dh9fIRGPP5g42VzyN2HXyuzG4Yib_FE1IPVTFZ8xj62DtxteXbrIryyDoJ0H9ZiRO9d0lJTEF8L9toL3ZrPR7648wb0U0XefBYDkC7l83lZY1NOaE1ma3XMWuqf1LJx9A2Cb45uNEFdWHSzxhrbnt0vd6NW7eImTxnqiKPrxGY5E-1a5O4OYdeaQlJdFQMCqinXA8VATa4dxos894J1ljDfFlSiqtzuYZcIGA9D2EBclR9ZgiJhktalDxafPYGkisqYaPd4w_hhCYkNdrDYCxXLKajghVlybjMH0j1jtk4GvZMq1Y3jXZVaVr2w0JsBrDY9Dafnb4a-uj_t7JacogRieq4BgTpuJncb8pCTjwK-fhV4R1syd18xBofY61NTJGGZsEkhofC0daUYCnKnqivZ8l6X3FGcTBlDNGkk0OqQIOxsXXn6JcK5LC12ey07xLY8fqvQP-D1yyXUjJk2DoxHOjyHKOdCUhB5uibh12MM-gLSDn9kzMu2iewUHAzOV_WumIWO_OZ0WYvMax_Ug9ifFFXR0RPPiSJTJgMnUzlldxoF7-5-AncCNUpwXkXcV8aIYW_6CCqctLQ5f01OeeOmwV4bCstAGrVmyjbE0tRBOlP-6lDTQ0gQNLBT_JR0gr6_p5BbCQjihcncXQMNYBBzmi4SLFJkU4jXbdxXteAJYQmIeLeoY8RGz-WJVYcZ7tIsCFZomC2ErgUH45Qd_qlS2cbPtlaFgvO0tEYHmtiOiTh3MHCwdBYFZvHfHBGHhffT4dnXQg58bLVEg5_01fZ5ioMXzaT5lld-_8A3vQbE1OSlqrGiQv2CUe5xCGctWUuxt6SE2CZ2h2R97jCPJHaWP38NMwEfEHib_iTl9Sviz5zadLUn-Mj4r9rj9gQz99A1rJYkuARRZd9wozIzhUtTXGUcHiveRW7cEvsPnZKB1yptdPJtsyHwrxWTwj-UVQ_tXVbKZnfTFrX35uN_LCS-8ZesBXn8xY7FxhiJB3MUoYekit2zDgEsJOrD5S_dj59HmPtNO6-KbP-3hwyK8z9jpKVrtqOzOZp5FUuPAQwSk__DsDvY4W-WV2pNlcx9Kf6X-7lKNBiLmzDZoFZ6ZFtj6ZjUux_HF84Lxf-D7A1_hQLhAsjFmUm0Ba0TKoEIGqwf7P9HhHFz2qryRUx7w0Zfjx9MyPPN8HmVw2VCER1I_BW8T9u9suEvjl3PILvcy67UG5VN2YEXqVO1kL1Nycu_lcVDWTAsPhX6isFt_tMbonDYDCv2w9-0K9BGNpEbshDp0saqxhbpS2_9F_1HnUdC7PVMVeIfhZX6FEVhWPo58ydn-FrddmTMoJlwcIN4wmzP17gxyzq_uk72GzwX3_SGvxUnTa2NYbfk96ig4zDZA-efi6YmByVSgB7RiFtm1iK7YhVkgAyuZqvCz10-nRDDRvg0rTcicgyFyOkF6zsbpsolIPCLlNm_7UDDJYJlHoYjUNzF5Od8WRjf9W2TTEQnw4anmBOZSNTQFVpxizrpGnmf7en7LPUB_HlIi2ZlZ1G3FwOmu7ysN__ejDJf3s0hiurftNAXk_Hx9FyYDpgrLMiRzfdf4ygdy30OeeLG1X4BNXBzS0RtOSASULh47uPu3C1tWvebu0vye47bMkyvO6KZD72NlF3lzdJV-u7XaFRPE4mhuthx_WB210GCcBB6n2H-u7izEq-BiU4UxMvn8VilZE1wsHsPg8rznXZ8Fh7C2epUzDjkjFgdBUVwVzZwLy_UgZffp2BTOyBJYbzDBi2EG9H4yrweOYZ6vFnRLyDlTk1r4jrnFsPXYBtsA8Oqq_aC5mHeq5Q4fD9fwQqOQA0qO6RCkpdpjgtUjUlIwsjVIywNQpt7qbjatPsakUKvb6YN4oRT5x3XtMur3FYu34oUrPvGXY6-Pt5Hu-pqHHds6pz_AAQ-MTSskYGQuXR8hhsYYzDMTW2HUolnaoMcHA4TbATe02TekQGga3NyAqXooSKNcgT7NBqMYzsZq0esFj2wiz_z2ght8S2hQqNOu2RI2f6NT_E4WgCk4_sRJUTOcAdpMQhLrZmvTcTXGAsRQxLYorCDgDU_bo9qk4HNyiCCD7RZqjlTrbEg001QUNKluuks7svBg5JcCAjs7C7fsYCfYf995HzIo_PDXoynbl8GOpZ9edG9EVfww9phvRAEafhmzz7Lhsypce6E4DB68b5fg1DamVUDhI1rZvFiyj-xZkG4Mdym5VTLm_P2DyOsc-IpNEVxfHsK-BSs3MNOx9vYOgQAj7XHcgmrj4YZAAd4s7WVBg3xhxlYPVsgcx39w_CQzLlYhL3CPKk2fiK44Zn4I4KqM-Z5uwgyskIPicmG504HNCyfllDKcXZbvfasH8PPZhTk_10Y40ch1U7-4MXC1xkv0zFlGAgUr8EFB4A_lmx8Gw4i9wGq1iyEu_us2YCG_wufvX2hL7_C0TN7oWXDtikYEHPZLZWpBPxAxmljKkJKF5w7QIbVnOlTr37ICNOki_HYsIM4hbQqDZXL5H8AgR1OSqKp15HKub9Icem5KNsrogq3q7VnkeXkX_HPtCgwehjUxnJDT_6GR3YC7D2JGqd-qn9ln1V1KvgusnvgPZiUClvExJO13RjXoGCpmuwRC1CtNc1FeGXm_1jHGN8rfkNMv3ZY0Cg-eAsT6h1ijpPxazPmUHaoRKsC8lJny1f0xLqmbouJXPHfAUNGTeJW9F-dQiAoi6wtOvUACIrsROFR4pKnQQprJFlfuHtvofhRqQ8rD3ts4O1UdOatSx05xcPvz2a-t-XhBSHYEZGSBgT_ZWIdPj1MsKMh8iUdgLdUm-u8ZrSSFyd6jSt61re1JT8tokaBOyTb7giW_wbIebBHzYlPqs71Oz7D8leSwyvigYNcSf9pSZzJX1Lc1MQrCJGUGFQkGJJt_EbHKhmZJKaA-SVUQEYeeh4Gqx0ofNiYrb8T3h8fz-mlnXPqAm_JWHbbPH5VqvU48fCws6R1hTBg7QRHDikPDx2V54U2HogwUBl0aS_9iTx6Fz7uPuarZjbFdr0AWOXiIdgGY92ctZJVion2DLf_4czZVfXV64lHEOjzoMsINSAepRYyOp87XxKB75ANMPfMLEg2yKGGGQJ9xk0olhgX73Mtyx87wpC02Ewh11kTp-lEqWEOKzD-_e5zoGsPBMVGqsxLdpxrPtA02gMGQIsnsEObqFUTG7ZG3u8q4WSlzQTPweohXu8ryIdukptcOo5lL71OCBzQQ_1o7XYpl0jdksDcRUYL2LuTEUtKsa3NEhSEmQt4I25c9uEmaK_lapCldwWo4LPW0DMKs7h5JXYXtoro88SoBuCVpxviL2JY9hoY_7QKduHsMGHs_kH_WiVzGNKgjrzgc2IYu7kk3kdp0ok1HSbpeEe5-p76v8Bc3NPFHNdiW7Dn9BahNuzNWxxzKjzvTmH9d5OYOlRxmU-_HnzbX6PubztCvnY7etfGuJHxqfzqyctfUb86Cu3xWaNSd9C3T66yaohcggV3OabsUIwf_dRKZkhx6i78bB61Y9kxFKsALGhypAxOKCEZO3tqzwjxs0k8_rwe4dgPgUrvsZvSrp006vWGTJGA0lZtM8xYQ0piJ8sNipRz18UH1Fv0AOTcaBOA-H8zZTPmfmc80Bgb-g0jsTVnv6Q6K-ryV710gEmcJFqH3nlht8KHNE72T9M56cQ9iQOrlAIZGdyPXvYSGU4C2bGVjy9eVb2remXIK0p1BjBM9U8c5Fi504qKpw4DCHr6_s0a5uOpmeScEoJilBjBhxciBzquqy3R7Lg0z506O5mdE12EkCSr6DCPjoClYXw8uFPIgPys5siPUsinajHNdZzQVbYMR2NrhuPx0AP40Yt_Gk9hagU8ttdjonRIhxR1-2wCWVp_Vf7YpI47Dy4Q4cl5pxH-RE1y4IQ4iC_AZDTRPBjdSznXKzUn1-HpSoNpkd0HbNXrm2kJqxktlO_UAyvh_1y8LND8Zb85fNEB_Nc2tnk5SPJe_eJVbsrDyiBTEnjEm3FB4atSbPk_zCa40udBpPvwg7VlS02eKCU9-0RsxfWHd6Hi7tlJhj5Sr-LnlSUzte5Mclf1rm15h1si3_VFj5n0KRwzrAjy6LvYlZXzZOeikveBYsHy8Ev0Ls0H_FXwvXdbVbW7wRoLRyDEvHQtG1cD08_UkKPKli5UfaHlG69gsU0kqOqdVs9DEKwfSAXwzOvsdxAw0t1n4EP-MPVDXxtcnN-KZwuaL4Ni5IqpH6YoPRKMHGX25qO6Ct9Zfzn5iud5hNCwLgUxrFzRaPk-1Io2pEHPW33UiUYCmFyfeerRuI845mMtR_QqWRHtAC3pFK8ORn8k_bW0z55_kk35RbWRVZTk4h96KdKa9gI_1POXhyxDyKRQcq1BzW2v5bweRQmxOrRPZxHcpJ2wkhrIseUyJrLK4oaNDNpTncJZXEytHLAa-WisGBRxsHMkAv4IeIy9fx83Uc0HNA72O9kw03ghoujuWcIEbCT7uSniXh8f3a2fnJUJZZT7X-bUyUf2Vvb0ynmKGxVe9gvz6SDMa48I-QyehWrdmEtPqURLK3vGTdn8RhBb2bCUoJkZMgdlPQqgw2bJ5ie-ybBu_OPnKYjbPM0WdIK3gYTDs_-DAQZB-nOntfIvYJsTJhVY_sd4ER7AYacKcG7Zq-ghnAtDAa3L3hAPpI7fNXoyl-cdGKEArEzVMdXFcaF9jkUzXIVZHVlNVt2GqgkcsfNue5ZnWn7wyZ-GJ6gRX5Q0z9xot8lvudpCDQDFxCPvr3Hg-hsvrz8Y61H5tIdc4NRauKIX5Z1k2AlRDJCFcIbvegioabewxfxKB_dCnvVXhj04Nx1PJ0f2OD6ksWgSwoAJZSMkdvNrrxANj9t4-trxqosEW4cSAeGHeDIHayT7cfqG78-hMdwnA662U281_Id-sQL8IXXsA854i_-bqitVd0ZNvbwUHH86Y2lkfP1oTjrXeEmsPhspI4Y0_AdRS1M6TLE2q7cha3abVGO9oqyHgp2NEL8bOEklMqW44g_FVNdyKvxW0BAH8Osa4d-jJs7tonxirlnvHEhELarsQ9J920vnqv2Dxm6huAdvtqwWhrtGI26OqTE1slZvYWDu4PmCNdDIXmZ_aMStW-k_pxikVj-kKFtNMpURVZNRqClWP3YL3EeP6DwUEQKxCy7uamrOQL5ZpYPNCXtkDwFugzEEEk3h_G144CLkRPXb3TeH4h0FcIRrnQBfOHMsyidgUMOIQaCV-OyjSYbXBH79pITDp1NiZAE1TlI0pr8EauztJ5RRJHEag7wKgXZ2R1WOD7rSOGpXYr9t4FYIu1MUkiI-vqIolG3J8bH7TrA95PImVGT2Wx__VED6BM3vtUlmLgS1Ga_T8mkZJBcXzvpUJIjZylel4Qo9x_Ttvs4RV3grMgspxDCnKvKmv54IinKYrEGVCC4uTG2gmej8aBG1u8HeZ9XRVaAnrx6Sz2pULx9hjbMrgju4iv7IIdg8IcjSRNq76Ae1ldMjVmZxwoX7EXXLocBcWKkP14etq_lTGXttNjCNumNXnaNF1-vUxsURXTx10S23SNptshnKD9jRRvv6Q4LeAogjmuayzWI69wiELv4Jgi1hHhrlHkw78s42uUUvWPtrayCpFbpa2LIzwXpe7Eup2EyQfZbOp1WIJAGbS5jbm6ao1Ls157NYm2_jdRGyMUqrqHnnNEYUa9a0qZUIa2XPR77QzIrTCwCFotbeiKl1r5Y3fq_9E9irkSAJjxtP_7XNyup3mtu9iWM-khm3L3uF7jdjmZvHj0vjXe7VfPPuf8P-TKsyXXb38x112pOl5jgFJMASonbT9aOQwPzJDUgvJ4QbYd0BoBUOaaDNiOaoUU188ElBVafHyxAT8SkbhephDa5rhL4TCqDersou7KopIlvl1IWKXmJJ7iXccO_ah738A9oYnoWbHb18NB7ExYGQOBwCvnGlGVe_UCLX0Q9LJ-Kq1-uuzelOwQEBYOO_TqDp91fxIqZKpzxjWmfpr2XhUgvquoZUC2uxqksWSgb9R6oLyv06X4AjxZLaV3HO3p6Jrxl4SP-7gQZu4fUXbyO2uJGwdOyOSgovqpNJMBX0yUZPmS7rHq-DIVUTYGv5RfdUzERI96gqsqrYPrF4TaJgrx-KdljqhzIwKH85r_cGTs97i19VPn4RcY7TzrxUsenoePioa1PAts-vgI8nu5F5B5gZ0Ofn39oaSPNG13-Y7-thNkTFS_crFpm8FtqTPZ_WrTIzIlQTboFc4RzpetHo6UvbgpYM8jDIuV2xVy_Gmvw5jRIsCLNVkEaRuTFTAkVlQYohLLndSxgNdRUNlvUez1Bvpk1hsDr-z2eiDc-GUfJFF2ZhYb3HGU2PS2y-Rvq70X0ZqEqVjUbgObIwToxT21-oZ3B4hRu2b-SbGGd_rmA6iTE9Jca6-BlRif5DiwrVyFiATmR0XuOMfF-ZCEuCAgf_ZhFojRT3nc_Aa_z1xMYqaAXUkaxvwKmiLmjHzxTeXBKApLz8N-___zT1VYeeOvBf7JFXe_dhdhjF16e9GvrN34eEWBHgovmjQWkaNnE6aD4ZdzFbOtin5oUg3OoN3Fulz5oNXfJR7q0qw7w4KvraTEIKq1oiuCjYsduYVsFsNyKR_8wwwWZxClJ_rtOPd0Bc3RkIUYGmLlSJyG_oVeYIOHg695bZ6WmO6MeLFbUufLcZWM7s4x8X7mR6-KkuDvCPyeEjA6JTJXWLA8w-K2BGyTn9fHX-rqv0IJQhf1fnwbzck3LujVIiWCT4--4Y5h_jKdeZlA2TKeLSY9_33YEqrZG1msvf8RLwf0B6t8BYZOCsHhaToFMUouNwCzdzP_KtyCcg35njd3UgNLE4_MJdRzLUGT93VCrSxqcO_59J310oa9JQBMWfM-9Ak61oi_2RnTilgbRyGxGDbLEX5hyJXVkxDW9-ihvwdc228VSQutNORaXu0CJebj-AyDo1wTY882qAFxtOO0Ef1Yym4AXBu12rZzK6ajzou4GYuzI4i1sLSND7PAWsyERPmCZ4SO3txG8Qq8wrp56gKvS8o-v3xoxBPn45dVJchmZBy6L-0EktJRJQzsCDlwn0LShkjN9MtgP3PaUtXigqmmzWpM2Q_3OuEzKzGa6vxnm8qexa7KobBcC1ETWh4sU9iLKUAVr9zPRtLsh0AZRsVw8gv2i2rVS0bEZXQZ4yTL1wKSEUhZFACOYLsYP1_F0c_6rLbbtRQvukgoL5KuP-8Bp2zxD3zBZnr2QwhvYOCHjxWBy9b2qCaLEQpnCGGNIebyRziuqyVdQpzE3q5wqA4BHOlYCyguV13JsL0fTyULs8HdHSp3HBTPOPkofBhrC13O-ziSS4l59fbBAVVCLksKdmTNC7W7Q4tUy7dHXNes4u0jgNrMyJgCJOXZRzKVN8QsAQoIYH_aB_3RcHHXAGK-GGQJl0sDRfv5aGWuBwRA8169fy-r7h1rQ9jpNMb6ZU6sOaZnZUU3h7dSk6rFqceTHx3smqFb-iYp4pc1aBC23OMqqXgbhKX5MfCmHe3hTd0ZcYO3aGEjM-nrRCS723RlaSXKELXrKFb5xdfanHqycAZCxZHz5ijpa-BzTQGhyNvLymTlR5nIxz1abGEyZ0Jf7HfCtiyMjUYF_zRSZuHiJBhSZh1CXW3JmlENyUCtsTfPougboEEXcQqvNRKTTpXOW5SroP9n7GwfqenxtnXIfDHLi4cTHjGj8zHHHnoh9KVEkFhzINPMgoV54fMzF5KhFXbaT7N_FN2fKUgbuVLYRL4n5yx7_KcBY2SkYpMF8832Tp-mkms1QtYKzks0l8Rjz708Gt5blpY47RkhV-Z3y_uakANfsEyx1D1AYpv86JMvfS-Dwey7SbdH0NHsTAMqwuaFkD2NUrR1wAdCQhi4Q-79BqCJrv5-am3qmkfrA7EE2wEUsHMnhrA1nbMV-i4qQW8s4X9_BxzLF7Wvmk7TnGdH6EddiSFY0TS9mg7t-SNQAfhpP1PN-vRmlZjMTf29FM64facY3vYJ0Xh9gOgrCH6C-3fZYKTT_lnGuITYT2dss_E6ECpxoJkxw2wvBslLJLzy_hCPZwbcCnTQjW0rtvei5L5A0_wylwTCb30Je2XbxpRZTj_PkiZgVg-RvQqzKgdZ_ufGS7FW8HNX0DSb1Z5FRhAshOHP2Rx9StzFrthheDUYBW8TimhpaufZsj8CzDfu8rJgbzLLfZA5SUKRJjaJ7BY5J52VmA7xIg3X_1gke9bNiAYU2d4N6b99HXSA4sm4NqVhy5Zqvp_Vk1ZseFFM1NJfg5tO4pSjL7ymnMMhFSn5djaCl4jcmUMfUPQ9e73S1rYAdfw8IyTQWG-_doU-qQuBS_umsFQG5o--SyYt9lhwh2GfcyizJvyE4Y43C7ZZWi9PSq0daEhFK071pbdwsk6_grmMORVL8lEPEO-osAhlgVdUhHCBZZ3NtnbCHsNgVIK46r8NvFqzI4qnM.icyXeQcvcxbVSflIIZFeBQ" + } + }) + .WithEncryptedMetaData( + "eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMjU2R0NNIiwia2lkIjoidnI3Y1dLR2wtZzRXYV9DUkdvd05oQVlXX2dRYi1ha01iaWlneE4wRWtESSIsImN0eSI6ImFwcGxpY2F0aW9uL2pzb24iLCJ6aXAiOiJERUYifQ.qZQOE3A2YltQnDGSjul_0S_WJhhpiXdSA49hGDcWuGruv-MdU98jfk1rM1M9u4xnwtqn-qsP0v5SPa4nPDhcpTMcKRAslknCUIBmf6VeI4sw6MhiSpK1gUNrHhsOshgasdjcdsr_pAZnCGehjRgbho3HCK70ZySvluSkSiqe5cRoDCRV2sjOAjhCjCKczF02eQObdhz0jAyTo_R8HLJBK6hvTYASpETg_SZA2g7Nfo4bppnKfGZ1O5ckU9g5PzvFq_HKYveFNscUDSnEWmYP226xxCWmmu08vXoeBbxUqxl74Psh122YQ53MBrYR3vB2gATfXqtDf3Ihx6LF_Si-wkN9x33dkGmY4bWQ2SW6fb31YX_t3TADPjfqNp8dvWxB_mvlEocDLtB1O23vRarFTpq9K_XStkJesJHWLQuVsYNOaOb5xI0hbavWGn7dYFeeBWV5mubBGhcHmV0Trp78kBoE0Szivtj-fIII8hvJClSLi6_e3DPXjjXRGH7V3Eqy5p1rSthRMiaEXvwh_rDVdANOlBqKjpJxxjYblweaRsKslH3lnFESBF-mOE8y1DZZaDJaHKX0xZunFAdqHTb3D004Fl9QaJ4OWls9xlrhgPQzcE6Ys8Fzkza729gZIUv3Dhamus6b4eYNr5Xim76A-wWmdEtWc8NO7nxQWdNR_7w.9lMbW8qmYyLUa36X.OX03rP-YobtUG_9rS8WHH7X3CnQ52N3zZojB0njIK-Jja2G6OEVcbAKnCBr7GNw27KSGpGFMNJi9GKZMQT8vDEvgoKLGgFmReErCgbRQxeJatHq_wNQ582TdmvJ7Dfcn7EsGHhUiC_xJY-tLJB86ah3OFUR3-K3IkmAvGzygXpTpQFKm4Af_mNS4i3f5lzCBZzYlPxJ9QJzKabzYM2doDKZrAmLx5FhRVrxznCUfZLvriBiut32MLozr-A_81ExAp1dclacUb5GsqYJYKVpfL_FpXqIcBFEO5N473fy_fLbb4TlUBog_3tkpYVMN7ScZpDDOUafgiJBqy4NSFg9bX-BUPZep8hax3m06q0IlXZmHVJcK-WcPA2NDXkAIunZB1LMPinp7AAsyAn9415RHV-kzOj-9KS22gc63undtOn5CXDg16aD7FFiMFVCaZIvBdU_1sHJak1yNzfFWdDFH1jEgj7SSOlX37_c1XbT5mgFlcUcz9McSoLn3ygVjFUu6HWJNwrIFDFgDA4NFIyq3foD0ERI.xwF5NBhFKq_akxCFVTgFFw") + .WithEncryptedData( + "eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMjU2R0NNIiwia2lkIjoidnI3Y1dLR2wtZzRXYV9DUkdvd05oQVlXX2dRYi1ha01iaWlneE4wRWtESSIsImN0eSI6ImFwcGxpY2F0aW9uL2pzb24iLCJ6aXAiOiJERUYifQ.n4wCQ34WFuY_KJPrEUvnSGmbhDX2WcO4AxvPFHuYNWPbNUNqU_wXnQT2mMgg0Wvlga3BchZAyZHTvX6SVWGTHWrP05lT42mrok9M3hH-fzd9Ep_Xy6LtSQtskGY0TMeGNNhZBwDPQYeOQnEXgW0z1AFSaVKRqCN4yy63R7Gx9qww-KyI8gMMJOEYhXmk8p7apOrZcaBQZTYSV7lK_MmzfpmieVvGJbrFU7a190sMb_8EIxkHCOB4HFew5W9gFVX_WvS5ZviuHhEidBfACPd4xX6LeEV43hGNRkfeWKL88Ospbf0kfQfplYWli4_E1PfpQM_hUr-qd1HBzC-MyMbCGUohJHn3QzKN-vU8TSbLEQtloe-8LSn9ZyzMiaIraM7CzPhlH77N1Z7zV31b0-_71NFHACavbX5aw3NocO4QS7NbnRTDQVwLFqSPTc-oQCPGIFBu_R624FmIo63ZtfdCQ1zGP2qZDwoQtTwtFhAp3f3D1kqSw0nSZk0-bfcJA3zF4xK4gaPGS0BbHLi38Nq1GV2udPkPUr_1qZu2c0th5QYHumpi_KhGsWhRtNS4BdESkrovByYAl0bnZUo5J6LACk_Xvnf6rIAEkwAtQU1rHarWItxrREKEfSc-4Rx7OBusQa2JBrvL4b_Bjmiridn_f_idVlAP9slSoBzXIYAfF30._c6-H64cPnq6ORgK.f5g2GlsRxur6JjzodgP9cnqQ.fg5tUwRYYhSMvTwQKRJa_A") + .Submit(); + + _caseId = submission.CaseId!; + _submissionId = submission.Id!; + + _caseId.Should().NotBeNull(); + _submissionId.Should().NotBeNull(); + } + + [Test] + [Order(20)] + public void Sender_GetSubmissionState() { + // Act + var status = Sender.GetStatusForSubmission(_caseId, Settings.DestinationId); + + // Assert + status.Count.Should().BeGreaterThan(0); + status.ForEach( + s => Logger.LogInformation("Status {When} {Event}", s.EventTime, s.EventType)); + } + + [Test] + [Order(30)] + public void Subscriber_GetSubmissionState() { + // Act + var status = Subscriber.GetStatusForSubmission(_caseId, Settings.DestinationId); + + // Assert + status.Count.Should().BeGreaterThan(0); + status.ForEach( + s => Logger.LogInformation("Status {When} {Event}", s.EventTime, s.EventType)); + } + + [Test] + [Order(40)] + public void RequestSubmission() { + var subscriberWithSubmission = Subscriber.RequestSubmission(_submissionId); + + var data = subscriberWithSubmission.GetDataJson(); + Logger.LogInformation("Data {Data}", data); + + data.Should().Be(@"{""data"":""value""}"); + + var attachments = subscriberWithSubmission.GetAttachments(); + attachments.First().Filename.Should().Be("Test.pdf"); + + subscriberWithSubmission.AcceptSubmission(); + } + + [Test] + [Order(50)] + public void Sender_GetSubmissionState_AfterAccepting() { + // Act + var status = Sender.GetStatusForSubmission(_caseId, Settings.DestinationId); + + // Assert + status.Count.Should().BeGreaterThan(0); + status.ForEach( + s => Logger.LogInformation("Status {When} {Event}", s.EventTime, s.EventType)); + } +} diff --git a/FitConnect/EncryptedSender.cs b/FitConnect/EncryptedSender.cs index 9ccbc2b9..b9fa33f6 100644 --- a/FitConnect/EncryptedSender.cs +++ b/FitConnect/EncryptedSender.cs @@ -8,6 +8,17 @@ namespace FitConnect; public partial class Sender { public IWithEncryptedAttachments WithEncryptedAttachments( Dictionary<string, string> attachments) { + if (Submission?.ServiceType == null) { + Logger?.LogError("Submission has no service type"); + throw new ArgumentException("Submission has no service type"); + } + + var createSubmissionDto = (CreateSubmissionDto)Submission; + createSubmissionDto.AnnouncedAttachments = attachments.Keys.ToList(); + var created = SubmissionService.CreateSubmission(createSubmissionDto); + Submission.Id = created.SubmissionId; + Submission.CaseId = created.CaseId; + if (Submission?.Id == null) throw new ArgumentException("Submission is not ready"); diff --git a/FitConnect/Encryption/FitEncryption.cs b/FitConnect/Encryption/FitEncryption.cs index 4975ed14..9a611b59 100644 --- a/FitConnect/Encryption/FitEncryption.cs +++ b/FitConnect/Encryption/FitEncryption.cs @@ -49,6 +49,10 @@ public class FitEncryption { PublicKeySignatureVerification = keySet.PublicKeySignatureVerification; } + public FitEncryption(string publicKeyEncryption, ILogger? logger) : this(logger) { + PublicKeyEncryption = publicKeyEncryption; + } + public (string plainText, byte[] plainBytes, byte[] tag) Decrypt(string cypherText, string key) { @@ -270,4 +274,4 @@ public class FitEncryption { return result.IsValid; } -} \ No newline at end of file +} diff --git a/FitConnect/Interfaces/Sender/ISenderWithAttachments.cs b/FitConnect/Interfaces/Sender/ISenderWithAttachments.cs index 4bdd84d1..c9c0d707 100644 --- a/FitConnect/Interfaces/Sender/ISenderWithAttachments.cs +++ b/FitConnect/Interfaces/Sender/ISenderWithAttachments.cs @@ -14,10 +14,4 @@ public interface ISenderWithAttachments : ISenderReady { public ISenderWithData WithData(string data); } -public interface ISenderWithEncryptedMetaData { - public ISenderWithEncryptedData WithEncryptedData(string data); -} -public interface ISenderWithEncryptedData { - public Submission Submit(); -} diff --git a/FitConnect/Interfaces/Sender/ISenderWithService.cs b/FitConnect/Interfaces/Sender/ISenderWithService.cs index 13d0e07d..680e5f8f 100644 --- a/FitConnect/Interfaces/Sender/ISenderWithService.cs +++ b/FitConnect/Interfaces/Sender/ISenderWithService.cs @@ -30,3 +30,10 @@ public interface IWithEncryptedAttachments { public ISenderWithEncryptedMetaData WithEncryptedMetaData(string metaData); } +public interface ISenderWithEncryptedMetaData : ISenderWithEncryptedData { + public ISenderWithEncryptedData WithEncryptedData(string data); +} + +public interface ISenderWithEncryptedData { + public Submission Submit(); +} diff --git a/MockContainer/MockContainer.cs b/MockContainer/MockContainer.cs index d8d625ad..b931ee64 100644 --- a/MockContainer/MockContainer.cs +++ b/MockContainer/MockContainer.cs @@ -113,7 +113,7 @@ public static class Container { subscriberClientId, subscriberClientSecret, destinationId, leikaKey, callbackSecret, setPublicKeys); } - catch (Exception e) { + catch { Console.WriteLine("Files not found, using environment variables"); return null; } -- GitLab