From 0cc649d9ba314150c4a14c8f9824f84fb169286c Mon Sep 17 00:00:00 2001 From: Y2zz Date: Sun, 3 Mar 2019 22:15:42 +0800 Subject: [PATCH 001/111] Change MySql.Data.EntityFrameworkCore To Pomelo.EntityFrameworkCore.MySql --- .../Volo.Abp.EntityFrameworkCore.MySQL.csproj | 4 ++-- .../AbpDbContextConfigurationContextMySQLExtensions.cs | 8 ++++---- .../AbpDbContextOptionsMySQLExtensions.cs | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo.Abp.EntityFrameworkCore.MySQL.csproj b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo.Abp.EntityFrameworkCore.MySQL.csproj index 52d430bbaa..5e9c7a91fb 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo.Abp.EntityFrameworkCore.MySQL.csproj +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo.Abp.EntityFrameworkCore.MySQL.csproj @@ -16,9 +16,9 @@ - + - + diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextConfigurationContextMySQLExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextConfigurationContextMySQLExtensions.cs index 35afda3d1e..542bf9e19e 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextConfigurationContextMySQLExtensions.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextConfigurationContextMySQLExtensions.cs @@ -1,7 +1,7 @@ using JetBrains.Annotations; using Microsoft.EntityFrameworkCore; -using MySql.Data.EntityFrameworkCore.Infraestructure; using System; +using Microsoft.EntityFrameworkCore.Infrastructure; using Volo.Abp.EntityFrameworkCore.DependencyInjection; namespace Volo.Abp.EntityFrameworkCore @@ -10,15 +10,15 @@ namespace Volo.Abp.EntityFrameworkCore { public static DbContextOptionsBuilder UseMySQL( [NotNull] this AbpDbContextConfigurationContext context, - [CanBeNull] Action mySQLOptionsAction = null) + [CanBeNull] Action mySQLOptionsAction = null) { if (context.ExistingConnection != null) { - return context.DbContextOptions.UseMySQL(context.ExistingConnection, mySQLOptionsAction); + return context.DbContextOptions.UseMySql(context.ExistingConnection, mySQLOptionsAction); } else { - return context.DbContextOptions.UseMySQL(context.ConnectionString, mySQLOptionsAction); + return context.DbContextOptions.UseMySql(context.ConnectionString, mySQLOptionsAction); } } } diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextOptionsMySQLExtensions.cs b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextOptionsMySQLExtensions.cs index f71bc631ec..3e2dd911be 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextOptionsMySQLExtensions.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore.MySQL/Volo/Abp/EntityFrameworkCore/AbpDbContextOptionsMySQLExtensions.cs @@ -1,6 +1,6 @@ using JetBrains.Annotations; -using MySql.Data.EntityFrameworkCore.Infraestructure; using System; +using Microsoft.EntityFrameworkCore.Infrastructure; namespace Volo.Abp.EntityFrameworkCore { @@ -8,7 +8,7 @@ namespace Volo.Abp.EntityFrameworkCore { public static void UseMySQL( [NotNull] this AbpDbContextOptions options, - [CanBeNull] Action mySQLOptionsAction = null) + [CanBeNull] Action mySQLOptionsAction = null) { options.Configure(context => { @@ -18,7 +18,7 @@ namespace Volo.Abp.EntityFrameworkCore public static void UseMySQL( [NotNull] this AbpDbContextOptions options, - [CanBeNull] Action mySQLOptionsAction = null) + [CanBeNull] Action mySQLOptionsAction = null) where TDbContext : AbpDbContext { options.Configure(context => From a1dcd4f974633a6e4ea9d20ccd1fa5019d4fd60f Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Sun, 3 Mar 2019 22:34:14 +0300 Subject: [PATCH 002/111] Remove ITenantRepository.GetCountAsync which is already exists in the base interface. --- .../Volo/Abp/TenantManagement/ITenantRepository.cs | 2 -- .../EntityFrameworkCore/EfCoreTenantRepository.cs | 5 ----- .../Abp/TenantManagement/MongoDb/MongoTenantRepository.cs | 5 ----- .../Volo/Abp/TenantManagement/TenantRepository_Tests.cs | 7 ------- 4 files changed, 19 deletions(-) diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/ITenantRepository.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/ITenantRepository.cs index f7d430c214..7b1c7e15f1 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/ITenantRepository.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/ITenantRepository.cs @@ -20,7 +20,5 @@ namespace Volo.Abp.TenantManagement string filter = null, bool includeDetails = false, CancellationToken cancellationToken = default); - - Task GetCountAsync(CancellationToken cancellationToken = default); } } \ No newline at end of file diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.EntityFrameworkCore/Volo/Abp/TenantManagement/EntityFrameworkCore/EfCoreTenantRepository.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.EntityFrameworkCore/Volo/Abp/TenantManagement/EntityFrameworkCore/EfCoreTenantRepository.cs index 0a13f77bf0..d2859f29a1 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.EntityFrameworkCore/Volo/Abp/TenantManagement/EntityFrameworkCore/EfCoreTenantRepository.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.EntityFrameworkCore/Volo/Abp/TenantManagement/EntityFrameworkCore/EfCoreTenantRepository.cs @@ -48,11 +48,6 @@ namespace Volo.Abp.TenantManagement.EntityFrameworkCore .ToListAsync(cancellationToken); } - public virtual async Task GetCountAsync(CancellationToken cancellationToken = default) - { - return await DbSet.LongCountAsync(cancellationToken); - } - public override IQueryable WithDetails() { return GetQueryable().IncludeDetails(); diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.MongoDB/Volo/Abp/TenantManagement/MongoDb/MongoTenantRepository.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.MongoDB/Volo/Abp/TenantManagement/MongoDb/MongoTenantRepository.cs index 05aa92757a..2b30dd5a26 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.MongoDB/Volo/Abp/TenantManagement/MongoDb/MongoTenantRepository.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.MongoDB/Volo/Abp/TenantManagement/MongoDb/MongoTenantRepository.cs @@ -28,11 +28,6 @@ namespace Volo.Abp.TenantManagement.MongoDb .FirstOrDefaultAsync(t => t.Name == name, cancellationToken); } - public virtual async Task GetCountAsync(CancellationToken cancellationToken = default) - { - return await GetMongoQueryable().LongCountAsync(cancellationToken); - } - public virtual async Task> GetListAsync( string sorting = null, int maxResultCount = int.MaxValue, diff --git a/modules/tenant-management/test/Volo.Abp.TenantManagement.TestBase/Volo/Abp/TenantManagement/TenantRepository_Tests.cs b/modules/tenant-management/test/Volo.Abp.TenantManagement.TestBase/Volo/Abp/TenantManagement/TenantRepository_Tests.cs index b48299ffd1..06c75317fa 100644 --- a/modules/tenant-management/test/Volo.Abp.TenantManagement.TestBase/Volo/Abp/TenantManagement/TenantRepository_Tests.cs +++ b/modules/tenant-management/test/Volo.Abp.TenantManagement.TestBase/Volo/Abp/TenantManagement/TenantRepository_Tests.cs @@ -3,7 +3,6 @@ using System.Linq; using System.Threading.Tasks; using Shouldly; using Volo.Abp.Modularity; -using Volo.Abp.Uow; using Xunit; namespace Volo.Abp.TenantManagement @@ -48,12 +47,6 @@ namespace Volo.Abp.TenantManagement tenant.ConnectionStrings.Count.ShouldBeGreaterThanOrEqualTo(2); } - [Fact] - public async Task GetCountAsync() - { - (await TenantRepository.GetCountAsync()).ShouldBeGreaterThan(0); - } - [Fact] public async Task GetListAsync() { From 36a62c09ddc6ca8b31b13bd208e930c7b8a83711 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 4 Mar 2019 11:21:19 +0800 Subject: [PATCH 003/111] update Microservice-Demo.md --- docs/zh-Hans/Samples/Microservice-Demo.md | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/docs/zh-Hans/Samples/Microservice-Demo.md b/docs/zh-Hans/Samples/Microservice-Demo.md index e7dd2cfd8a..67ba362c24 100644 --- a/docs/zh-Hans/Samples/Microservice-Demo.md +++ b/docs/zh-Hans/Samples/Microservice-Demo.md @@ -51,6 +51,21 @@ Running as docker containers is easier since all dependencies are pre-configured - Open a command line in the `samples/MicroserviceDemo` folder of the repository. + +- Pull images from Docker Hub: + + ``` + docker-compose -f docker-compose.yml -f docker-compose.migrations.yml pull + ``` + +- If you want to build images locally you may skip the above step and instead use build command: + + ``` + docker-compose -f docker-compose.yml -f docker-compose.migrations.yml build + ``` + + Building images may take a **long time** depending on your machine. + - Restore SQL Server databases: ``` @@ -63,8 +78,6 @@ Running as docker containers is easier since all dependencies are pre-configured docker-compose up -d ``` - At the first run, it will take a **long time** because it will build all docker images. - - Add this line to the end of your `hosts` file: ``` From 5d1b17938353ca412530e9357c925803b3b3ecb4 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Mon, 4 Mar 2019 10:30:41 +0300 Subject: [PATCH 004/111] Refactor permissions --- .../IPermissionDefinitionProvider.cs | 6 +-- .../Permissions/IPermissionValueProvider.cs | 3 +- .../PermissionDefinitionManager.cs | 39 +++++++++++-------- .../PermissionDefinitionProvider.cs | 6 ++- .../Permissions/PermissionValueProvider.cs | 3 +- 5 files changed, 31 insertions(+), 26 deletions(-) diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/IPermissionDefinitionProvider.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/IPermissionDefinitionProvider.cs index d0a41b3390..ef92125595 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/IPermissionDefinitionProvider.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/IPermissionDefinitionProvider.cs @@ -1,8 +1,6 @@ -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Authorization.Permissions +namespace Volo.Abp.Authorization.Permissions { - public interface IPermissionDefinitionProvider : ISingletonDependency + public interface IPermissionDefinitionProvider { void Define(IPermissionDefinitionContext context); } diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/IPermissionValueProvider.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/IPermissionValueProvider.cs index bf19132e23..a9b5e78337 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/IPermissionValueProvider.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/IPermissionValueProvider.cs @@ -1,9 +1,8 @@ using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; namespace Volo.Abp.Authorization.Permissions { - public interface IPermissionValueProvider : ISingletonDependency + public interface IPermissionValueProvider { string Name { get; } diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionDefinitionManager.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionDefinitionManager.cs index 4915721af0..bb58089c82 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionDefinitionManager.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionDefinitionManager.cs @@ -10,9 +10,6 @@ namespace Volo.Abp.Authorization.Permissions { public class PermissionDefinitionManager : IPermissionDefinitionManager, ISingletonDependency { - protected List Providers => _lazyProviders.Value; - private readonly Lazy> _lazyProviders; - protected IDictionary PermissionGroupDefinitions => _lazyPermissionGroupDefinitions.Value; private readonly Lazy> _lazyPermissionGroupDefinitions; @@ -30,9 +27,15 @@ namespace Volo.Abp.Authorization.Permissions _serviceProvider = serviceProvider; Options = options.Value; - _lazyProviders = new Lazy>(CreatePermissionProviders, true); - _lazyPermissionDefinitions = new Lazy>(CreatePermissionDefinitions, true); - _lazyPermissionGroupDefinitions = new Lazy>(CreatePermissionGroupDefinitions, true); + _lazyPermissionDefinitions = new Lazy>( + CreatePermissionDefinitions, + isThreadSafe: true + ); + + _lazyPermissionGroupDefinitions = new Lazy>( + CreatePermissionGroupDefinitions, + isThreadSafe: true + ); } public virtual PermissionDefinition Get(string name) @@ -64,14 +67,6 @@ namespace Volo.Abp.Authorization.Permissions return PermissionGroupDefinitions.Values.ToImmutableList(); } - protected virtual List CreatePermissionProviders() - { - return Options - .DefinitionProviders - .Select(p => _serviceProvider.GetRequiredService(p) as IPermissionDefinitionProvider) - .ToList(); - } - protected virtual Dictionary CreatePermissionDefinitions() { var permissions = new Dictionary(); @@ -87,7 +82,9 @@ namespace Volo.Abp.Authorization.Permissions return permissions; } - protected virtual void AddPermissionToDictionaryRecursively(Dictionary permissions, PermissionDefinition permission) + protected virtual void AddPermissionToDictionaryRecursively( + Dictionary permissions, + PermissionDefinition permission) { if (permissions.ContainsKey(permission.Name)) { @@ -106,9 +103,17 @@ namespace Volo.Abp.Authorization.Permissions { var context = new PermissionDefinitionContext(); - foreach (var provider in Providers) + using (var scope = _serviceProvider.CreateScope()) { - provider.Define(context); + var providers = Options + .DefinitionProviders + .Select(p => scope.ServiceProvider.GetRequiredService(p) as IPermissionDefinitionProvider) + .ToList(); + + foreach (var provider in providers) + { + provider.Define(context); + } } return context.Groups; diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionDefinitionProvider.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionDefinitionProvider.cs index df1674dc2e..0584ffe426 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionDefinitionProvider.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionDefinitionProvider.cs @@ -1,6 +1,8 @@ -namespace Volo.Abp.Authorization.Permissions +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Authorization.Permissions { - public abstract class PermissionDefinitionProvider : IPermissionDefinitionProvider + public abstract class PermissionDefinitionProvider : IPermissionDefinitionProvider, ITransientDependency { public abstract void Define(IPermissionDefinitionContext context); } diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionValueProvider.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionValueProvider.cs index 914bd4af34..91351593a5 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionValueProvider.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Permissions/PermissionValueProvider.cs @@ -1,8 +1,9 @@ using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; namespace Volo.Abp.Authorization.Permissions { - public abstract class PermissionValueProvider : IPermissionValueProvider + public abstract class PermissionValueProvider : IPermissionValueProvider, ISingletonDependency { public abstract string Name { get; } From 368479e51fda94f3cd85c16858e333ee3f004614 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Mon, 4 Mar 2019 10:50:33 +0300 Subject: [PATCH 005/111] Implemented FeatureDefinitionManager --- framework/Volo.Abp.sln | 9 +- .../Authorization/AbpAuthorizationModule.cs | 1 + .../Volo/Abp/Features/AbpFeaturesModule.cs | 27 ++++- .../Volo/Abp/Features/FeatureChecker.cs | 16 ++- .../Abp/Features/FeatureCheckerExtensions.cs | 18 ++- .../Volo/Abp/Features/FeatureDefinition.cs | 14 +++ .../Abp/Features/FeatureDefinitionContext.cs | 43 ++++--- .../Abp/Features/FeatureDefinitionManager.cs | 73 +++++++++--- .../Abp/Features/FeatureGroupDefinition.cs | 108 ++++++++++++++++++ .../Abp/Features/IFeatureDefinitionContext.cs | 11 +- .../Volo.Abp.Features.Tests.csproj | 22 ++++ .../Volo/Abp/Features/AbpFeaturesTestBase.cs | 10 ++ .../Abp/Features/AbpFeaturesTestModule.cs | 18 +++ .../FeatureDefinitionManager_Tests.cs | 35 ++++++ .../Features/TestFeatureDefinitionProvider.cs | 12 ++ 15 files changed, 369 insertions(+), 48 deletions(-) create mode 100644 framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureGroupDefinition.cs create mode 100644 framework/test/Volo.Abp.Features.Tests/Volo.Abp.Features.Tests.csproj create mode 100644 framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/AbpFeaturesTestBase.cs create mode 100644 framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/AbpFeaturesTestModule.cs create mode 100644 framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureDefinitionManager_Tests.cs create mode 100644 framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/TestFeatureDefinitionProvider.cs diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index f99d6cebbc..f9c3730467 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -226,7 +226,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.AspNetCore.Mvc.Cli EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.AspNetCore.Mvc.Contracts", "src\Volo.Abp.AspNetCore.Mvc.Contracts\Volo.Abp.AspNetCore.Mvc.Contracts.csproj", "{88F6D091-CA16-4B71-9499-8D5B8FA2E712}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Features", "src\Volo.Abp.Features\Volo.Abp.Features.csproj", "{01E3D389-8872-4EB1-9D3D-13B6ED54DE0E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Features", "src\Volo.Abp.Features\Volo.Abp.Features.csproj", "{01E3D389-8872-4EB1-9D3D-13B6ED54DE0E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Features.Tests", "test\Volo.Abp.Features.Tests\Volo.Abp.Features.Tests.csproj", "{575BEFA1-19C2-49B1-8D31-B5D4472328DE}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -646,6 +648,10 @@ Global {01E3D389-8872-4EB1-9D3D-13B6ED54DE0E}.Debug|Any CPU.Build.0 = Debug|Any CPU {01E3D389-8872-4EB1-9D3D-13B6ED54DE0E}.Release|Any CPU.ActiveCfg = Release|Any CPU {01E3D389-8872-4EB1-9D3D-13B6ED54DE0E}.Release|Any CPU.Build.0 = Release|Any CPU + {575BEFA1-19C2-49B1-8D31-B5D4472328DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {575BEFA1-19C2-49B1-8D31-B5D4472328DE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {575BEFA1-19C2-49B1-8D31-B5D4472328DE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {575BEFA1-19C2-49B1-8D31-B5D4472328DE}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -756,6 +762,7 @@ Global {E803DDB8-81EA-454B-9A66-9C2941100B67} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {88F6D091-CA16-4B71-9499-8D5B8FA2E712} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {01E3D389-8872-4EB1-9D3D-13B6ED54DE0E} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {575BEFA1-19C2-49B1-8D31-B5D4472328DE} = {447C8A77-E5F0-4538-8687-7383196D04EA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs index 57472d7cf1..3ea2789e8e 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs @@ -16,6 +16,7 @@ namespace Volo.Abp.Authorization public override void PreConfigureServices(ServiceConfigurationContext context) { context.Services.OnRegistred(AuthorizationInterceptorRegistrar.RegisterIfNeeded); + //TODO: Auto Add Providers to PermissionOptions just like did in AbpFeaturesModule.AutoAddProviders } public override void ConfigureServices(ServiceConfigurationContext context) diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs index f83797334f..db64ce6c57 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs @@ -1,4 +1,7 @@ -using Volo.Abp.Localization; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using Volo.Abp.Localization; using Volo.Abp.Modularity; using Volo.Abp.MultiTenancy; @@ -10,9 +13,27 @@ namespace Volo.Abp.Features )] public class AbpFeaturesModule : AbpModule { - public override void ConfigureServices(ServiceConfigurationContext context) + public override void PreConfigureServices(ServiceConfigurationContext context) { - + AutoAddProviders(context.Services); + } + + private static void AutoAddProviders(IServiceCollection services) + { + var featureDefinitionProviders = new List(); + + services.OnRegistred(context => + { + if (typeof(IFeatureDefinitionProvider).IsAssignableFrom(context.ImplementationType)) + { + featureDefinitionProviders.Add(context.ImplementationType); + } + }); + + services.Configure(options => + { + options.DefinitionProviders.AddIfNotContains(featureDefinitionProviders); + }); } } } diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureChecker.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureChecker.cs index 17bd05db6d..68db290f1b 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureChecker.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureChecker.cs @@ -10,33 +10,37 @@ namespace Volo.Abp.Features { public class FeatureChecker : IFeatureChecker, ITransientDependency { - protected IFeatureDefinitionManager FeatureDefinitionManager { get; } - protected Lazy> Providers { get; } protected FeatureOptions Options { get; } + protected IServiceProvider ServiceProvider { get; } + protected IFeatureDefinitionManager FeatureDefinitionManager { get; } + protected List Providers => _providers.Value; + + private readonly Lazy> _providers; public FeatureChecker( IOptions options, IServiceProvider serviceProvider, IFeatureDefinitionManager featureDefinitionManager) { + ServiceProvider = serviceProvider; FeatureDefinitionManager = featureDefinitionManager; Options = options.Value; - Providers = new Lazy>( + _providers = new Lazy>( () => Options .ValueProviders - .Select(type => serviceProvider.GetRequiredService(type) as IFeatureValueProvider) + .Select(type => ServiceProvider.GetRequiredService(type) as IFeatureValueProvider) .ToList(), true ); } - + public virtual async Task GetOrNullAsync(string name) { var featureDefinition = FeatureDefinitionManager.Get(name); var providers = Enumerable - .Reverse(Providers.Value); + .Reverse(Providers); if (featureDefinition.AllowedProviders.Any()) { diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureCheckerExtensions.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureCheckerExtensions.cs index 05122e8e6a..c43f8f04de 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureCheckerExtensions.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureCheckerExtensions.cs @@ -7,7 +7,10 @@ namespace Volo.Abp.Features { public static class FeatureCheckerExtensions { - public static async Task GetAsync([NotNull] this IFeatureChecker featureChecker, [NotNull] string name, T defaultValue = default) + public static async Task GetAsync( + [NotNull] this IFeatureChecker featureChecker, + [NotNull] string name, + T defaultValue = default) where T : struct { Check.NotNull(featureChecker, nameof(featureChecker)); @@ -17,19 +20,26 @@ namespace Volo.Abp.Features return value?.To() ?? defaultValue; } - public static string GetOrNull([NotNull] this IFeatureChecker featureChecker, [NotNull] string name) + public static string GetOrNull( + [NotNull] this IFeatureChecker featureChecker, + [NotNull] string name) { Check.NotNull(featureChecker, nameof(featureChecker)); return AsyncHelper.RunSync(() => featureChecker.GetOrNullAsync(name)); } - public static T Get([NotNull] this IFeatureChecker featureChecker, [NotNull] string name, T defaultValue = default) + public static T Get( + [NotNull] this IFeatureChecker featureChecker, + [NotNull] string name, + T defaultValue = default) where T : struct { return AsyncHelper.RunSync(() => featureChecker.GetAsync(name, defaultValue)); } - public static bool IsEnabled([NotNull] this IFeatureChecker featureChecker, [NotNull] string name) + public static bool IsEnabled( + [NotNull] this IFeatureChecker featureChecker, + [NotNull] string name) { return AsyncHelper.RunSync(() => featureChecker.IsEnabledAsync(name)); } diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureDefinition.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureDefinition.cs index 675697334f..6a1c030b21 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureDefinition.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureDefinition.cs @@ -55,6 +55,20 @@ namespace Volo.Abp.Features /// public List AllowedProviders { get; } + /// + /// Gets/sets a key-value on the . + /// + /// Name of the property + /// + /// Returns the value in the dictionary by given . + /// Returns null if given is not present in the dictionary. + /// + public object this[string name] + { + get => Properties.GetOrDefault(name); + set => Properties[name] = value; + } + /// /// Can be used to get/set custom properties for this feature. /// diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureDefinitionContext.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureDefinitionContext.cs index d14695b30a..be9c1beec9 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureDefinitionContext.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureDefinitionContext.cs @@ -1,38 +1,51 @@ using System.Collections.Generic; -using System.Collections.Immutable; +using Volo.Abp.Localization; namespace Volo.Abp.Features { public class FeatureDefinitionContext : IFeatureDefinitionContext { - protected Dictionary Features { get; } + internal Dictionary Groups { get; } - public FeatureDefinitionContext(Dictionary features) + public FeatureDefinitionContext() { - Features = features; + Groups = new Dictionary(); } - public virtual FeatureDefinition GetOrNull(string name) + public FeatureGroupDefinition AddGroup(string name, ILocalizableString displayName = null) { - return Features.GetOrDefault(name); - } + Check.NotNull(name, nameof(name)); - public virtual IReadOnlyList GetAll() - { - return Features.Values.ToImmutableList(); + if (Groups.ContainsKey(name)) + { + throw new AbpException($"There is already an existing permission group with name: {name}"); + } + + return Groups[name] = new FeatureGroupDefinition(name, displayName); } - public virtual void Add(params FeatureDefinition[] definitions) + public FeatureGroupDefinition GetGroupOrNull(string name) { - if (definitions.IsNullOrEmpty()) + Check.NotNull(name, nameof(name)); + + if (!Groups.ContainsKey(name)) { - return; + return null; } - foreach (var definition in definitions) + return Groups[name]; + } + + public void RemoveGroup(string name) + { + Check.NotNull(name, nameof(name)); + + if (!Groups.ContainsKey(name)) { - Features[definition.Name] = definition; + throw new AbpException($"Undefined feature group: '{name}'."); } + + Groups.Remove(name); } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureDefinitionManager.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureDefinitionManager.cs index bf36c114d3..13d15ac95e 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureDefinitionManager.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureDefinitionManager.cs @@ -10,9 +10,11 @@ namespace Volo.Abp.Features { public class FeatureDefinitionManager : IFeatureDefinitionManager, ISingletonDependency { - protected Lazy> Providers { get; } + protected IDictionary FeatureGroupDefinitions => _lazyFeatureGroupDefinitions.Value; + private readonly Lazy> _lazyFeatureGroupDefinitions; - protected Lazy> FeatureDefinitions { get; } + protected IDictionary FeatureDefinitions => _lazyFeatureDefinitions.Value; + private readonly Lazy> _lazyFeatureDefinitions; protected FeatureOptions Options { get; } @@ -25,8 +27,15 @@ namespace Volo.Abp.Features _serviceProvider = serviceProvider; Options = options.Value; - Providers = new Lazy>(CreateFeatureProviders, true); - FeatureDefinitions = new Lazy>(CreateFeatureDefinitions, true); + _lazyFeatureDefinitions = new Lazy>( + CreateFeatureDefinitions, + isThreadSafe: true + ); + + _lazyFeatureGroupDefinitions = new Lazy>( + CreateFeatureGroupDefinitions, + isThreadSafe:true + ); } public virtual FeatureDefinition Get(string name) @@ -45,32 +54,64 @@ namespace Volo.Abp.Features public virtual IReadOnlyList GetAll() { - return FeatureDefinitions.Value.Values.ToImmutableList(); + return FeatureDefinitions.Values.ToImmutableList(); } public virtual FeatureDefinition GetOrNull(string name) { - return FeatureDefinitions.Value.GetOrDefault(name); + return FeatureDefinitions.GetOrDefault(name); } - protected virtual List CreateFeatureProviders() + protected virtual Dictionary CreateFeatureDefinitions() { - return Options - .DefinitionProviders - .Select(p => _serviceProvider.GetRequiredService(p) as IFeatureDefinitionProvider) - .ToList(); + var features = new Dictionary(); + + foreach (var groupDefinition in FeatureGroupDefinitions.Values) + { + foreach (var feature in groupDefinition.Features) + { + AddFeatureToDictionaryRecursively(features, feature); + } + } + + return features; } - protected virtual IDictionary CreateFeatureDefinitions() + protected virtual void AddFeatureToDictionaryRecursively( + Dictionary features, + FeatureDefinition feature) { - var features = new Dictionary(); + if (features.ContainsKey(feature.Name)) + { + throw new AbpException("Duplicate feature name: " + feature.Name); + } + + features[feature.Name] = feature; - foreach (var provider in Providers.Value) + foreach (var child in feature.Children) { - provider.Define(new FeatureDefinitionContext(features)); + AddFeatureToDictionaryRecursively(features, child); } + } - return features; + protected virtual Dictionary CreateFeatureGroupDefinitions() + { + var context = new FeatureDefinitionContext(); + + using (var scope = _serviceProvider.CreateScope()) + { + var providers = Options + .DefinitionProviders + .Select(p => scope.ServiceProvider.GetRequiredService(p) as IFeatureDefinitionProvider) + .ToList(); + + foreach (var provider in providers) + { + provider.Define(context); + } + } + + return context.Groups; } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureGroupDefinition.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureGroupDefinition.cs new file mode 100644 index 0000000000..4d0ccbba62 --- /dev/null +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureGroupDefinition.cs @@ -0,0 +1,108 @@ +using System.Collections.Generic; +using System.Collections.Immutable; +using Volo.Abp.Localization; + +namespace Volo.Abp.Features +{ + public class FeatureGroupDefinition + { + /// + /// Unique name of the group. + /// + public string Name { get; } + + public Dictionary Properties { get; } + + public ILocalizableString DisplayName + { + get => _displayName; + set => _displayName = Check.NotNull(value, nameof(value)); + } + private ILocalizableString _displayName; + + public IReadOnlyList Features => _features.ToImmutableList(); + private readonly List _features; + + /// + /// Gets/sets a key-value on the . + /// + /// Name of the property + /// + /// Returns the value in the dictionary by given . + /// Returns null if given is not present in the dictionary. + /// + public object this[string name] + { + get => Properties.GetOrDefault(name); + set => Properties[name] = value; + } + + protected internal FeatureGroupDefinition( + string name, + ILocalizableString displayName = null) + { + Name = name; + DisplayName = displayName ?? new FixedLocalizableString(Name); + + Properties = new Dictionary(); + _features = new List(); + } + + public virtual FeatureDefinition AddFeature( + string name, + string defaultValue = null, + ILocalizableString displayName = null, + ILocalizableString description = null, + bool isVisibleToClients = true) + { + var feature = new FeatureDefinition( + name, + defaultValue, + displayName, + description, + isVisibleToClients + ); + + _features.Add(feature); + + return feature; + } + + public virtual List GetFeaturesWithChildren() + { + var features = new List(); + + foreach (var feature in _features) + { + AddFeatureToListRecursively(features, feature); + } + + return features; + } + + /// + /// Sets a property in the dictionary. + /// This is a shortcut for nested calls on this object. + /// + public virtual FeatureGroupDefinition WithProperty(string key, object value) + { + Properties[key] = value; + return this; + } + + private void AddFeatureToListRecursively(List features, FeatureDefinition feature) + { + features.Add(feature); + + foreach (var child in feature.Children) + { + AddFeatureToListRecursively(features, child); + } + } + + public override string ToString() + { + return $"[{nameof(FeatureGroupDefinition)} {Name}]"; + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/IFeatureDefinitionContext.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/IFeatureDefinitionContext.cs index 8762b9d34b..03fc14c579 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/IFeatureDefinitionContext.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/IFeatureDefinitionContext.cs @@ -1,9 +1,14 @@ -namespace Volo.Abp.Features +using JetBrains.Annotations; +using Volo.Abp.Localization; + +namespace Volo.Abp.Features { public interface IFeatureDefinitionContext { - FeatureDefinition GetOrNull(string name); + FeatureGroupDefinition AddGroup([NotNull] string name, ILocalizableString displayName = null); - void Add(params FeatureDefinition[] definitions); + FeatureGroupDefinition GetGroupOrNull(string name); + + void RemoveGroup(string name); } } \ No newline at end of file diff --git a/framework/test/Volo.Abp.Features.Tests/Volo.Abp.Features.Tests.csproj b/framework/test/Volo.Abp.Features.Tests/Volo.Abp.Features.Tests.csproj new file mode 100644 index 0000000000..3632aa2bf3 --- /dev/null +++ b/framework/test/Volo.Abp.Features.Tests/Volo.Abp.Features.Tests.csproj @@ -0,0 +1,22 @@ + + + + netcoreapp2.2 + latest + Volo.Abp.Features.Tests + Volo.Abp.Features.Tests + true + false + false + false + + + + + + + + + + + diff --git a/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/AbpFeaturesTestBase.cs b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/AbpFeaturesTestBase.cs new file mode 100644 index 0000000000..a3c9170798 --- /dev/null +++ b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/AbpFeaturesTestBase.cs @@ -0,0 +1,10 @@ +namespace Volo.Abp.Features +{ + public class AbpFeaturesTestBase : AbpIntegratedTest + { + protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) + { + options.UseAutofac(); + } + } +} diff --git a/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/AbpFeaturesTestModule.cs b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/AbpFeaturesTestModule.cs new file mode 100644 index 0000000000..7b0927b80d --- /dev/null +++ b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/AbpFeaturesTestModule.cs @@ -0,0 +1,18 @@ +using Volo.Abp.Autofac; +using Volo.Abp.Modularity; + +namespace Volo.Abp.Features +{ + [DependsOn( + typeof(AbpFeaturesModule), + typeof(AbpTestBaseModule), + typeof(AbpAutofacModule) + )] + public class AbpFeaturesTestModule : AbpModule + { + public override void ConfigureServices(ServiceConfigurationContext context) + { + + } + } +} diff --git a/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureDefinitionManager_Tests.cs b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureDefinitionManager_Tests.cs new file mode 100644 index 0000000000..beb94ec283 --- /dev/null +++ b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureDefinitionManager_Tests.cs @@ -0,0 +1,35 @@ +using Shouldly; +using Xunit; + +namespace Volo.Abp.Features +{ + public class FeatureDefinitionManager_Tests : AbpFeaturesTestBase + { + private readonly IFeatureDefinitionManager _featureDefinitionManager; + + public FeatureDefinitionManager_Tests() + { + _featureDefinitionManager = GetRequiredService(); + } + + [Fact] + public void Should_Get_Defined_Features() + { + _featureDefinitionManager.GetOrNull("BooleanTestFeature1").ShouldNotBeNull(); + _featureDefinitionManager.Get("BooleanTestFeature1").Name.ShouldBe("BooleanTestFeature1"); + + _featureDefinitionManager.GetOrNull("IntegerTestFeature1").ShouldNotBeNull(); + _featureDefinitionManager.Get("IntegerTestFeature1").Name.ShouldBe("IntegerTestFeature1"); + } + + [Fact] + public void Should_Not_Get_Undefined_Features() + { + _featureDefinitionManager.GetOrNull("UndefinedFeature").ShouldBeNull(); + Assert.Throws(() => + { + _featureDefinitionManager.Get("UndefinedFeature"); + }); + } + } +} diff --git a/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/TestFeatureDefinitionProvider.cs b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/TestFeatureDefinitionProvider.cs new file mode 100644 index 0000000000..aceb39b6f4 --- /dev/null +++ b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/TestFeatureDefinitionProvider.cs @@ -0,0 +1,12 @@ +namespace Volo.Abp.Features +{ + public class TestFeatureDefinitionProvider : FeatureDefinitionProvider + { + public override void Define(IFeatureDefinitionContext context) + { + var group = context.AddGroup("Test Group"); + group.AddFeature("BooleanTestFeature1"); + group.AddFeature("IntegerTestFeature1", defaultValue: "1"); + } + } +} From 986a220c0733dd9d6ada66a405297fa7eeed979a Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Mon, 4 Mar 2019 10:55:01 +0300 Subject: [PATCH 006/111] Auto register permission definition providers. --- .../Authorization/AbpAuthorizationModule.cs | 24 +++++++++++++++++-- .../Volo/Abp/Features/AbpFeaturesModule.cs | 10 ++++---- .../Mvc/AbpAspNetCoreMvcTestModule.cs | 5 ---- .../AbpAuthorizationTestModule.cs | 9 ------- 4 files changed, 27 insertions(+), 21 deletions(-) diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs index 3ea2789e8e..880673f86b 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs @@ -1,4 +1,6 @@ -using Microsoft.AspNetCore.Authorization; +using System; +using System.Collections.Generic; +using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Authorization.Permissions; using Volo.Abp.Localization; @@ -16,7 +18,7 @@ namespace Volo.Abp.Authorization public override void PreConfigureServices(ServiceConfigurationContext context) { context.Services.OnRegistred(AuthorizationInterceptorRegistrar.RegisterIfNeeded); - //TODO: Auto Add Providers to PermissionOptions just like did in AbpFeaturesModule.AutoAddProviders + AutoAddDefinitionProviders(context.Services); } public override void ConfigureServices(ServiceConfigurationContext context) @@ -32,5 +34,23 @@ namespace Volo.Abp.Authorization options.ValueProviders.Add(); }); } + + private static void AutoAddDefinitionProviders(IServiceCollection services) + { + var definitionProviders = new List(); + + services.OnRegistred(context => + { + if (typeof(IPermissionDefinitionProvider).IsAssignableFrom(context.ImplementationType)) + { + definitionProviders.Add(context.ImplementationType); + } + }); + + services.Configure(options => + { + options.DefinitionProviders.AddIfNotContains(definitionProviders); + }); + } } } diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs index db64ce6c57..9179a2ff7b 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs @@ -15,24 +15,24 @@ namespace Volo.Abp.Features { public override void PreConfigureServices(ServiceConfigurationContext context) { - AutoAddProviders(context.Services); + AutoAddDefinitionProviders(context.Services); } - private static void AutoAddProviders(IServiceCollection services) + private static void AutoAddDefinitionProviders(IServiceCollection services) { - var featureDefinitionProviders = new List(); + var definitionProviders = new List(); services.OnRegistred(context => { if (typeof(IFeatureDefinitionProvider).IsAssignableFrom(context.ImplementationType)) { - featureDefinitionProviders.Add(context.ImplementationType); + definitionProviders.Add(context.ImplementationType); } }); services.Configure(options => { - options.DefinitionProviders.AddIfNotContains(featureDefinitionProviders); + options.DefinitionProviders.AddIfNotContains(definitionProviders); }); } } diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs index b079b38188..014cee2077 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs @@ -57,11 +57,6 @@ namespace Volo.Abp.AspNetCore.Mvc }); }); - Configure(options => - { - options.DefinitionProviders.Add(); - }); - Configure(options => { options.FileSets.AddEmbedded(); diff --git a/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/AbpAuthorizationTestModule.cs b/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/AbpAuthorizationTestModule.cs index 9b539e85be..51337ae871 100644 --- a/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/AbpAuthorizationTestModule.cs +++ b/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/AbpAuthorizationTestModule.cs @@ -1,5 +1,4 @@ using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.Authorization.Permissions; using Volo.Abp.Authorization.TestServices; using Volo.Abp.Autofac; using Volo.Abp.Modularity; @@ -20,13 +19,5 @@ namespace Volo.Abp.Authorization } }); } - - public override void ConfigureServices(ServiceConfigurationContext context) - { - Configure(options => - { - options.DefinitionProviders.TryAdd(); - }); - } } } \ No newline at end of file From dda709bcb4274647e254fffad06503d278da0306 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Mon, 4 Mar 2019 11:03:37 +0300 Subject: [PATCH 007/111] Auto register setting definition providers. --- .../Volo/Abp/Emailing/AbpEmailingModule.cs | 5 ---- .../Abp/Localization/AbpLocalizationModule.cs | 5 ---- .../Volo/Abp/Settings/AbpSettingsModule.cs | 28 ++++++++++++++++++- .../Abp/Settings/SettingDefinitionManager.cs | 27 ++++++++---------- .../Abp/Settings/SettingDefinitionProvider.cs | 2 +- .../Volo.Abp.Settings.Tests.csproj | 1 + .../Abp/Settings/AbpSettingsTestModule.cs | 5 ++-- .../Abp/Settings/SettingProvider_Tests.cs | 5 ++++ 8 files changed, 49 insertions(+), 29 deletions(-) diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/AbpEmailingModule.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/AbpEmailingModule.cs index 7648ddc910..b861a3898c 100644 --- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/AbpEmailingModule.cs +++ b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/AbpEmailingModule.cs @@ -18,11 +18,6 @@ namespace Volo.Abp.Emailing { public override void ConfigureServices(ServiceConfigurationContext context) { - Configure(options => - { - options.DefinitionProviders.Add(); - }); - Configure(options => { options.FileSets.AddEmbedded(); diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpLocalizationModule.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpLocalizationModule.cs index 3fcd90ac6d..a65e6863a8 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpLocalizationModule.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpLocalizationModule.cs @@ -27,11 +27,6 @@ namespace Volo.Abp.Localization .Add("en") .AddVirtualJson("/Localization/Resources/AbpValidation"); }); - - Configure(options => - { - options.DefinitionProviders.Add(); - }); } } } diff --git a/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/AbpSettingsModule.cs b/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/AbpSettingsModule.cs index d86f6ca524..1951ab61b5 100644 --- a/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/AbpSettingsModule.cs +++ b/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/AbpSettingsModule.cs @@ -1,4 +1,7 @@ -using Volo.Abp.Localization; +using System; +using System.Collections.Generic; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Localization; using Volo.Abp.Modularity; using Volo.Abp.MultiTenancy; using Volo.Abp.Security; @@ -12,6 +15,11 @@ namespace Volo.Abp.Settings )] public class AbpSettingsModule : AbpModule { + public override void PreConfigureServices(ServiceConfigurationContext context) + { + AutoAddDefinitionProviders(context.Services); + } + public override void ConfigureServices(ServiceConfigurationContext context) { Configure(options => @@ -22,5 +30,23 @@ namespace Volo.Abp.Settings options.ValueProviders.Add(); }); } + + private static void AutoAddDefinitionProviders(IServiceCollection services) + { + var definitionProviders = new List(); + + services.OnRegistred(context => + { + if (typeof(ISettingDefinitionProvider).IsAssignableFrom(context.ImplementationType)) + { + definitionProviders.Add(context.ImplementationType); + } + }); + + services.Configure(options => + { + options.DefinitionProviders.AddIfNotContains(definitionProviders); + }); + } } } diff --git a/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingDefinitionManager.cs b/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingDefinitionManager.cs index 7241d3654d..387ea77d05 100644 --- a/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingDefinitionManager.cs +++ b/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingDefinitionManager.cs @@ -10,22 +10,19 @@ namespace Volo.Abp.Settings { public class SettingDefinitionManager : ISettingDefinitionManager, ISingletonDependency { - protected Lazy> Providers { get; } - protected Lazy> SettingDefinitions { get; } protected SettingOptions Options { get; } - private readonly IServiceProvider _serviceProvider; + protected IServiceProvider ServiceProvider { get; } public SettingDefinitionManager( IOptions options, IServiceProvider serviceProvider) { - _serviceProvider = serviceProvider; + ServiceProvider = serviceProvider; Options = options.Value; - Providers = new Lazy>(CreateSettingProviders, true); SettingDefinitions = new Lazy>(CreateSettingDefinitions, true); } @@ -53,21 +50,21 @@ namespace Volo.Abp.Settings return SettingDefinitions.Value.GetOrDefault(name); } - protected virtual List CreateSettingProviders() - { - return Options - .DefinitionProviders - .Select(p => _serviceProvider.GetRequiredService(p) as ISettingDefinitionProvider) - .ToList(); - } - protected virtual IDictionary CreateSettingDefinitions() { var settings = new Dictionary(); - foreach (var provider in Providers.Value) + using (var scope = ServiceProvider.CreateScope()) { - provider.Define(new SettingDefinitionContext(settings)); + var providers = Options + .DefinitionProviders + .Select(p => scope.ServiceProvider.GetRequiredService(p) as ISettingDefinitionProvider) + .ToList(); + + foreach (var provider in providers) + { + provider.Define(new SettingDefinitionContext(settings)); + } } return settings; diff --git a/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingDefinitionProvider.cs b/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingDefinitionProvider.cs index 04e6fc7eb2..8cd4b28003 100644 --- a/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingDefinitionProvider.cs +++ b/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingDefinitionProvider.cs @@ -2,7 +2,7 @@ namespace Volo.Abp.Settings { - public abstract class SettingDefinitionProvider : ISettingDefinitionProvider, ISingletonDependency + public abstract class SettingDefinitionProvider : ISettingDefinitionProvider, ITransientDependency { public abstract void Define(ISettingDefinitionContext context); } diff --git a/framework/test/Volo.Abp.Settings.Tests/Volo.Abp.Settings.Tests.csproj b/framework/test/Volo.Abp.Settings.Tests/Volo.Abp.Settings.Tests.csproj index 47c93c6bf4..7f83c36c9a 100644 --- a/framework/test/Volo.Abp.Settings.Tests/Volo.Abp.Settings.Tests.csproj +++ b/framework/test/Volo.Abp.Settings.Tests/Volo.Abp.Settings.Tests.csproj @@ -13,6 +13,7 @@ + diff --git a/framework/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/AbpSettingsTestModule.cs b/framework/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/AbpSettingsTestModule.cs index dc4ab057a0..09a50daa5d 100644 --- a/framework/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/AbpSettingsTestModule.cs +++ b/framework/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/AbpSettingsTestModule.cs @@ -1,8 +1,10 @@ -using Volo.Abp.Modularity; +using Volo.Abp.Autofac; +using Volo.Abp.Modularity; namespace Volo.Abp.Settings { [DependsOn( + typeof(AbpAutofacModule), typeof(AbpSettingsModule), typeof(AbpTestBaseModule) )] @@ -13,7 +15,6 @@ namespace Volo.Abp.Settings Configure(options => { options.ValueProviders.Add(); - options.DefinitionProviders.Add(); }); } } diff --git a/framework/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingProvider_Tests.cs b/framework/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingProvider_Tests.cs index 6b95b0f755..c3c22f76f9 100644 --- a/framework/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingProvider_Tests.cs +++ b/framework/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingProvider_Tests.cs @@ -13,6 +13,11 @@ namespace Volo.Abp.Settings _settingProvider = GetRequiredService(); } + protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) + { + options.UseAutofac(); + } + [Fact] public async Task Should_Get_Null_If_No_Value_Provided_And_No_Default_Value() { From fcb90ff6566e17e28743a56e78bdfc115f46106e Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Mon, 4 Mar 2019 11:38:09 +0300 Subject: [PATCH 008/111] Completed FeatureChecker. --- .../Volo/Abp/Features/AbpFeaturesModule.cs | 9 ++++ .../DefaultValueSettingValueProvider.cs | 22 ++++++++ .../Volo/Abp/Features/NullFeatureStore.cs | 1 + .../Volo/Abp/Settings/NullSettingStore.cs | 1 + .../Volo/Abp/Features/FeatureChecker_Tests.cs | 53 +++++++++++++++++++ .../Volo/Abp/Features/TestFeatureStore.cs | 52 ++++++++++++++++++ 6 files changed, 138 insertions(+) create mode 100644 framework/src/Volo.Abp.Features/Volo/Abp/Features/DefaultValueSettingValueProvider.cs create mode 100644 framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureChecker_Tests.cs create mode 100644 framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/TestFeatureStore.cs diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs index 9179a2ff7b..35da247562 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs @@ -18,6 +18,15 @@ namespace Volo.Abp.Features AutoAddDefinitionProviders(context.Services); } + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.Configure(options => + { + options.ValueProviders.Add(); + options.ValueProviders.Add(); + }); + } + private static void AutoAddDefinitionProviders(IServiceCollection services) { var definitionProviders = new List(); diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/DefaultValueSettingValueProvider.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/DefaultValueSettingValueProvider.cs new file mode 100644 index 0000000000..d60a55586a --- /dev/null +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/DefaultValueSettingValueProvider.cs @@ -0,0 +1,22 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.Features +{ + public class DefaultValueFeatureValueProvider : FeatureValueProvider + { + public const string ProviderName = "Default"; + + public override string Name => ProviderName; + + public DefaultValueFeatureValueProvider(IFeatureStore settingStore) + : base(settingStore) + { + + } + + public override Task GetOrNullAsync(FeatureDefinition setting) + { + return Task.FromResult(setting.DefaultValue); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/NullFeatureStore.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/NullFeatureStore.cs index 2a4fcee0c6..d9b839a664 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/NullFeatureStore.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/NullFeatureStore.cs @@ -5,6 +5,7 @@ using Volo.Abp.DependencyInjection; namespace Volo.Abp.Features { + [Dependency(TryRegister = true)] public class NullFeatureStore : IFeatureStore, ISingletonDependency { public ILogger Logger { get; set; } diff --git a/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/NullSettingStore.cs b/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/NullSettingStore.cs index 5906306e93..8699fae972 100644 --- a/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/NullSettingStore.cs +++ b/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/NullSettingStore.cs @@ -5,6 +5,7 @@ using Volo.Abp.DependencyInjection; namespace Volo.Abp.Settings { + [Dependency(TryRegister = true)] public class NullSettingStore : ISettingStore, ISingletonDependency { public ILogger Logger { get; set; } diff --git a/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureChecker_Tests.cs b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureChecker_Tests.cs new file mode 100644 index 0000000000..bafbb25811 --- /dev/null +++ b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureChecker_Tests.cs @@ -0,0 +1,53 @@ +using Shouldly; +using System.Threading.Tasks; +using Volo.Abp.MultiTenancy; +using Xunit; + +namespace Volo.Abp.Features +{ + public class FeatureChecker_Tests : AbpFeaturesTestBase + { + private readonly IFeatureChecker _featureChecker; + private readonly ICurrentTenant _currentTenant; + + public FeatureChecker_Tests() + { + _featureChecker = GetRequiredService(); + _currentTenant = GetRequiredService(); + } + + [Fact] + public async Task IsEnabledAsync() + { + //Tenant is unknown + (await _featureChecker.IsEnabledAsync("BooleanTestFeature1")).ShouldBeFalse(); + + using (_currentTenant.Change(TestFeatureStore.Tenant1Id)) + { + (await _featureChecker.IsEnabledAsync("BooleanTestFeature1")).ShouldBeTrue(); + } + + using (_currentTenant.Change(TestFeatureStore.Tenant2Id)) + { + (await _featureChecker.IsEnabledAsync("BooleanTestFeature1")).ShouldBeFalse(); + } + } + + [Fact] + public async Task GetOrNullAsync() + { + //Tenant is unknown + (await _featureChecker.GetOrNullAsync("IntegerTestFeature1")).ShouldBe("1"); + + using (_currentTenant.Change(TestFeatureStore.Tenant1Id)) + { + (await _featureChecker.GetOrNullAsync("IntegerTestFeature1")).ShouldBe("1"); + } + + using (_currentTenant.Change(TestFeatureStore.Tenant2Id)) + { + (await _featureChecker.GetOrNullAsync("IntegerTestFeature1")).ShouldBe("34"); + } + } + } +} diff --git a/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/TestFeatureStore.cs b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/TestFeatureStore.cs new file mode 100644 index 0000000000..2d68b75fda --- /dev/null +++ b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/TestFeatureStore.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Features +{ + public class TestFeatureStore : IFeatureStore, ISingletonDependency + { + public static Guid Tenant1Id = new Guid("f460fcf7-f944-469a-967b-3b2463323dfe"); + public static Guid Tenant2Id = new Guid("e10428ad-4608-4c34-a304-6f82502156f2"); + + private readonly List _settingRecords; + + public TestFeatureStore() + { + _settingRecords = new List + { + new SettingRecord("BooleanTestFeature1", TenantFeatureValueProvider.ProviderName, Tenant1Id.ToString(), "true"), + new SettingRecord("IntegerTestFeature1", TenantFeatureValueProvider.ProviderName, Tenant2Id.ToString(), "34") + }; + } + + public Task GetOrNullAsync(string name, string providerName, string providerKey) + { + return Task.FromResult( + _settingRecords.FirstOrDefault(sr => + sr.Name == name && + sr.ProviderName == providerName && + sr.ProviderKey == providerKey + )?.Value + ); + } + + private class SettingRecord + { + public string Name { get; } + public string ProviderName { get; } + public string ProviderKey { get; } + public string Value { get; } + + public SettingRecord(string name, string providerName, string providerKey, string value) + { + Name = name; + ProviderName = providerName; + ProviderKey = providerKey; + Value = value; + } + } + } +} From 1845479b24fb7018ec0042b9395b7998eb656701 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Mon, 4 Mar 2019 14:53:54 +0300 Subject: [PATCH 009/111] Implemented feature interceptor --- .../Abp/Aspects/AbpCrossCuttingConcerns.cs | 1 + .../Volo.Abp.Ddd.Application.csproj | 1 + .../Application/AbpDddApplicationModule.cs | 8 +- .../Services/ApplicationService.cs | 3 + .../Volo/Abp/Features/AbpFeaturesModule.cs | 1 + .../Features/DisableFeatureCheckAttribute.cs | 10 ++ .../Abp/Features/FeatureCheckerExtensions.cs | 96 +++++++++++++++++++ .../Volo/Abp/Features/FeatureInterceptor.cs | 56 +++++++++++ .../Features/FeatureInterceptorRegistrar.cs | 36 +++++++ .../IMethodInvocationFeatureCheckerService.cs | 11 +++ .../MethodInvocationFeatureCheckerContext.cs | 14 +++ .../MethodInvocationFeatureCheckerService.cs | 51 ++++++++++ .../Abp/Features/RequiresFeatureAttribute.cs | 33 +++++++ .../AbpAuthorizationException.cs | 0 .../Abp/Features/ClassFeatureTestService.cs | 23 +++++ .../Volo/Abp/Features/FeatureChecker_Tests.cs | 2 +- .../FeatureDefinitionManager_Tests.cs | 2 +- .../Abp/Features/FeatureInterceptor_Tests.cs | 76 +++++++++++++++ ...FeaturesTestBase.cs => FeatureTestBase.cs} | 2 +- .../Abp/Features/IMethodFeatureTestService.cs | 11 +++ .../Abp/Features/MethodFeatureTestService.cs | 23 +++++ .../Features/TestFeatureDefinitionProvider.cs | 1 + .../Volo/Abp/Features/TestFeatureStore.cs | 8 +- 23 files changed, 461 insertions(+), 8 deletions(-) create mode 100644 framework/src/Volo.Abp.Features/Volo/Abp/Features/DisableFeatureCheckAttribute.cs create mode 100644 framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureInterceptor.cs create mode 100644 framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureInterceptorRegistrar.cs create mode 100644 framework/src/Volo.Abp.Features/Volo/Abp/Features/IMethodInvocationFeatureCheckerService.cs create mode 100644 framework/src/Volo.Abp.Features/Volo/Abp/Features/MethodInvocationFeatureCheckerContext.cs create mode 100644 framework/src/Volo.Abp.Features/Volo/Abp/Features/MethodInvocationFeatureCheckerService.cs create mode 100644 framework/src/Volo.Abp.Features/Volo/Abp/Features/RequiresFeatureAttribute.cs rename framework/src/{Volo.Abp.Authorization => Volo.Abp.Security}/Volo/Abp/Authorization/AbpAuthorizationException.cs (100%) create mode 100644 framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/ClassFeatureTestService.cs create mode 100644 framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureInterceptor_Tests.cs rename framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/{AbpFeaturesTestBase.cs => FeatureTestBase.cs} (71%) create mode 100644 framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/IMethodFeatureTestService.cs create mode 100644 framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/MethodFeatureTestService.cs diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Aspects/AbpCrossCuttingConcerns.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Aspects/AbpCrossCuttingConcerns.cs index 35aa6d0811..4c8033a0cf 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Aspects/AbpCrossCuttingConcerns.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Aspects/AbpCrossCuttingConcerns.cs @@ -12,6 +12,7 @@ namespace Volo.Abp.Aspects public const string Validation = "AbpValidation"; public const string UnitOfWork = "AbpUnitOfWork"; public const string Authorization = "AbpAuthorization"; + public const string FeatureChecking = "AbpFeatureChecking"; public static void AddApplied(object obj, params string[] concerns) { diff --git a/framework/src/Volo.Abp.Ddd.Application/Volo.Abp.Ddd.Application.csproj b/framework/src/Volo.Abp.Ddd.Application/Volo.Abp.Ddd.Application.csproj index 57f909667b..243c94e66a 100644 --- a/framework/src/Volo.Abp.Ddd.Application/Volo.Abp.Ddd.Application.csproj +++ b/framework/src/Volo.Abp.Ddd.Application/Volo.Abp.Ddd.Application.csproj @@ -17,6 +17,7 @@ + diff --git a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/AbpDddApplicationModule.cs b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/AbpDddApplicationModule.cs index 84b609b99f..fcdc29c454 100644 --- a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/AbpDddApplicationModule.cs +++ b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/AbpDddApplicationModule.cs @@ -2,6 +2,7 @@ using Volo.Abp.Application.Services; using Volo.Abp.Authorization; using Volo.Abp.Domain; +using Volo.Abp.Features; using Volo.Abp.Http; using Volo.Abp.Http.Modeling; using Volo.Abp.Modularity; @@ -20,7 +21,8 @@ namespace Volo.Abp.Application typeof(AbpValidationModule), typeof(AbpAuthorizationModule), typeof(AbpHttpAbstractionsModule), - typeof(AbpSettingsModule) + typeof(AbpSettingsModule), + typeof(AbpFeaturesModule) )] public class AbpDddApplicationModule : AbpModule { @@ -30,8 +32,8 @@ namespace Volo.Abp.Application { options.IgnoredInterfaces.AddIfNotContains(typeof(IRemoteService)); options.IgnoredInterfaces.AddIfNotContains(typeof(IApplicationService)); - options.IgnoredInterfaces.AddIfNotContains(typeof(IUnitOfWorkEnabled)); //TODO: Move to it's own module if possible? - options.IgnoredInterfaces.AddIfNotContains(typeof(IAuthorizationEnabled)); //TODO: Move to it's own module if possible? + options.IgnoredInterfaces.AddIfNotContains(typeof(IUnitOfWorkEnabled)); + options.IgnoredInterfaces.AddIfNotContains(typeof(IAuthorizationEnabled)); }); } } diff --git a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/ApplicationService.cs b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/ApplicationService.cs index 63a749e259..b4f53aff0a 100644 --- a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/ApplicationService.cs +++ b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/ApplicationService.cs @@ -9,6 +9,7 @@ using Volo.Abp.Aspects; using Volo.Abp.Auditing; using Volo.Abp.Authorization; using Volo.Abp.DependencyInjection; +using Volo.Abp.Features; using Volo.Abp.Guids; using Volo.Abp.MultiTenancy; using Volo.Abp.ObjectMapping; @@ -51,6 +52,8 @@ namespace Volo.Abp.Application.Services public IAuthorizationService AuthorizationService { get; set; } + public IFeatureChecker FeatureChecker { get; set; } + protected IUnitOfWork CurrentUnitOfWork => UnitOfWorkManager?.Current; protected ILogger Logger => _lazyLogger.Value; diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs index 35da247562..9065651b3b 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs @@ -15,6 +15,7 @@ namespace Volo.Abp.Features { public override void PreConfigureServices(ServiceConfigurationContext context) { + context.Services.OnRegistred(FeatureInterceptorRegistrar.RegisterIfNeeded); AutoAddDefinitionProviders(context.Services); } diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/DisableFeatureCheckAttribute.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/DisableFeatureCheckAttribute.cs new file mode 100644 index 0000000000..194f0eaf90 --- /dev/null +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/DisableFeatureCheckAttribute.cs @@ -0,0 +1,10 @@ +using System; + +namespace Volo.Abp.Features +{ + [AttributeUsage(AttributeTargets.Method)] + public class DisableFeatureCheckAttribute : Attribute + { + + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureCheckerExtensions.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureCheckerExtensions.cs index c43f8f04de..9d7f608c4b 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureCheckerExtensions.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureCheckerExtensions.cs @@ -1,6 +1,8 @@ using System; +using System.Collections.Generic; using System.Threading.Tasks; using JetBrains.Annotations; +using Volo.Abp.Authorization; using Volo.Abp.Threading; namespace Volo.Abp.Features @@ -43,5 +45,99 @@ namespace Volo.Abp.Features { return AsyncHelper.RunSync(() => featureChecker.IsEnabledAsync(name)); } + + public static async Task IsEnabledAsync(this IFeatureChecker featureChecker, bool requiresAll, params string[] featureNames) + { + if (featureNames.IsNullOrEmpty()) + { + return true; + } + + if (requiresAll) + { + foreach (var featureName in featureNames) + { + if (!(await featureChecker.IsEnabledAsync(featureName))) + { + return false; + } + } + + return true; + } + + foreach (var featureName in featureNames) + { + if (await featureChecker.IsEnabledAsync(featureName)) + { + return true; + } + } + + return false; + } + + public static bool IsEnabled(this IFeatureChecker featureChecker, bool requiresAll, params string[] featureNames) + { + return AsyncHelper.RunSync(() => featureChecker.IsEnabledAsync(requiresAll, featureNames)); + } + + public static async Task CheckEnabledAsync(this IFeatureChecker featureChecker, string featureName) + { + if (!(await featureChecker.IsEnabledAsync(featureName))) + { + throw new AbpAuthorizationException("Feature is not enabled: " + featureName); + } + } + + public static void CheckEnabled(this IFeatureChecker featureChecker, string featureName) + { + if (!featureChecker.IsEnabled(featureName)) + { + throw new AbpAuthorizationException("Feature is not enabled: " + featureName); + } + } + + public static async Task CheckEnabledAsync(this IFeatureChecker featureChecker, bool requiresAll, params string[] featureNames) + { + if (featureNames.IsNullOrEmpty()) + { + return; + } + + if (requiresAll) + { + foreach (var featureName in featureNames) + { + if (!(await featureChecker.IsEnabledAsync(featureName))) + { + throw new AbpAuthorizationException( + "Required features are not enabled. All of these features must be enabled: " + + string.Join(", ", featureNames) + ); + } + } + } + else + { + foreach (var featureName in featureNames) + { + if (await featureChecker.IsEnabledAsync(featureName)) + { + return; + } + } + + throw new AbpAuthorizationException( + "Required features are not enabled. At least one of these features must be enabled: " + + string.Join(", ", featureNames) + ); + } + } + + public static void CheckEnabled(this IFeatureChecker featureChecker, bool requiresAll, params string[] featureNames) + { + AsyncHelper.RunSync(() => featureChecker.CheckEnabledAsync(requiresAll, featureNames)); + } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureInterceptor.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureInterceptor.cs new file mode 100644 index 0000000000..2f684d99ef --- /dev/null +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureInterceptor.cs @@ -0,0 +1,56 @@ +using System.Threading.Tasks; +using Volo.Abp.Aspects; +using Volo.Abp.DependencyInjection; +using Volo.Abp.DynamicProxy; +using Volo.Abp.Threading; + +namespace Volo.Abp.Features +{ + public class FeatureInterceptor : AbpInterceptor, ITransientDependency + { + private readonly IMethodInvocationFeatureCheckerService _methodInvocationAuthorizationService; + + public FeatureInterceptor( + IMethodInvocationFeatureCheckerService methodInvocationAuthorizationService) + { + _methodInvocationAuthorizationService = methodInvocationAuthorizationService; + } + + public override void Intercept(IAbpMethodInvocation invocation) + { + if (AbpCrossCuttingConcerns.IsApplied( + invocation.TargetObject, + AbpCrossCuttingConcerns.FeatureChecking)) + { + invocation.Proceed(); + return; + } + + AsyncHelper.RunSync(() => CheckFeaturesAsync(invocation)); + invocation.Proceed(); + } + + public override async Task InterceptAsync(IAbpMethodInvocation invocation) + { + if (AbpCrossCuttingConcerns.IsApplied( + invocation.TargetObject, + AbpCrossCuttingConcerns.FeatureChecking)) + { + await invocation.ProceedAsync(); + return; + } + + AsyncHelper.RunSync(() => CheckFeaturesAsync(invocation)); + await invocation.ProceedAsync(); + } + + protected virtual Task CheckFeaturesAsync(IAbpMethodInvocation invocation) + { + return _methodInvocationAuthorizationService.CheckAsync( + new MethodInvocationFeatureCheckerContext( + invocation.Method + ) + ); + } + } +} diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureInterceptorRegistrar.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureInterceptorRegistrar.cs new file mode 100644 index 0000000000..4ad03c9aff --- /dev/null +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureInterceptorRegistrar.cs @@ -0,0 +1,36 @@ +using System; +using System.Linq; +using System.Reflection; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Features +{ + public static class FeatureInterceptorRegistrar + { + public static void RegisterIfNeeded(IOnServiceRegistredContext context) + { + if (ShouldIntercept(context.ImplementationType)) + { + context.Interceptors.TryAdd(); + } + } + + private static bool ShouldIntercept(Type type) + { + return type.IsDefined(typeof(RequiresFeatureAttribute), true) || + AnyMethodRequiresFeatureAttribute(type); + } + + private static bool AnyMethodRequiresFeatureAttribute(Type implementationType) + { + return implementationType + .GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) + .Any(HasRequiresFeatureAttribute); + } + + private static bool HasRequiresFeatureAttribute(MemberInfo methodInfo) + { + return methodInfo.IsDefined(typeof(RequiresFeatureAttribute), true); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/IMethodInvocationFeatureCheckerService.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/IMethodInvocationFeatureCheckerService.cs new file mode 100644 index 0000000000..7d6be55c47 --- /dev/null +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/IMethodInvocationFeatureCheckerService.cs @@ -0,0 +1,11 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.Features +{ + public interface IMethodInvocationFeatureCheckerService + { + Task CheckAsync( + MethodInvocationFeatureCheckerContext context + ); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/MethodInvocationFeatureCheckerContext.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/MethodInvocationFeatureCheckerContext.cs new file mode 100644 index 0000000000..81bbecfe68 --- /dev/null +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/MethodInvocationFeatureCheckerContext.cs @@ -0,0 +1,14 @@ +using System.Reflection; + +namespace Volo.Abp.Features +{ + public class MethodInvocationFeatureCheckerContext + { + public MethodInfo Method { get; } + + public MethodInvocationFeatureCheckerContext(MethodInfo method) + { + Method = method; + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/MethodInvocationFeatureCheckerService.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/MethodInvocationFeatureCheckerService.cs new file mode 100644 index 0000000000..28ac25fdd5 --- /dev/null +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/MethodInvocationFeatureCheckerService.cs @@ -0,0 +1,51 @@ +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Features +{ + public class MethodInvocationFeatureCheckerService : IMethodInvocationFeatureCheckerService, ITransientDependency + { + private readonly IFeatureChecker _featureChecker; + + public MethodInvocationFeatureCheckerService( + IFeatureChecker featureChecker) + { + _featureChecker = featureChecker; + } + + public async Task CheckAsync(MethodInvocationFeatureCheckerContext context) + { + if (IsFeatureCheckDisabled(context)) + { + return; + } + + foreach (var requiresFeatureAttribute in GetRequiredFeatureAttributes(context)) + { + await _featureChecker.CheckEnabledAsync(requiresFeatureAttribute.RequiresAll, requiresFeatureAttribute.Features); + } + } + + protected virtual bool IsFeatureCheckDisabled(MethodInvocationFeatureCheckerContext context) + { + return context.Method + .GetCustomAttributes(true) + .OfType() + .Any(); + } + + protected virtual RequiresFeatureAttribute[] GetRequiredFeatureAttributes(MethodInvocationFeatureCheckerContext context) + { + var classAttributes = context.Method.DeclaringType + .GetCustomAttributes(true) + .OfType(); + + var methodAttributes = context.Method + .GetCustomAttributes(true) + .OfType(); + + return classAttributes.Union(methodAttributes).ToArray(); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/RequiresFeatureAttribute.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/RequiresFeatureAttribute.cs new file mode 100644 index 0000000000..2f5b62c128 --- /dev/null +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/RequiresFeatureAttribute.cs @@ -0,0 +1,33 @@ +using System; + +namespace Volo.Abp.Features +{ + /// + /// This attribute can be used on a class/method to declare that given class/method is available + /// only if required feature(s) are enabled. + /// + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] + public class RequiresFeatureAttribute : Attribute + { + /// + /// A list of features to be checked if they are enabled. + /// + public string[] Features { get; } + + /// + /// If this property is set to true, all of the must be enabled. + /// If it's false, at least one of the must be enabled. + /// Default: false. + /// + public bool RequiresAll { get; set; } + + /// + /// Creates a new instance of class. + /// + /// A list of features to be checked if they are enabled + public RequiresFeatureAttribute(params string[] features) + { + Features = features ?? Array.Empty(); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationException.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Authorization/AbpAuthorizationException.cs similarity index 100% rename from framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationException.cs rename to framework/src/Volo.Abp.Security/Volo/Abp/Authorization/AbpAuthorizationException.cs diff --git a/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/ClassFeatureTestService.cs b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/ClassFeatureTestService.cs new file mode 100644 index 0000000000..425f69337f --- /dev/null +++ b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/ClassFeatureTestService.cs @@ -0,0 +1,23 @@ +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Features +{ + [RequiresFeature("BooleanTestFeature1")] + public class ClassFeatureTestService : ITransientDependency + { + /* Since this class is used with the class reference, + * need to virtual keywords, otherwise dynamic proxy can not work. + */ + + [RequiresFeature("BooleanTestFeature2")] + public virtual int Feature2() + { + return 42; + } + + public virtual void NoAdditionalFeature() + { + + } + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureChecker_Tests.cs b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureChecker_Tests.cs index bafbb25811..7ea01268a0 100644 --- a/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureChecker_Tests.cs +++ b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureChecker_Tests.cs @@ -5,7 +5,7 @@ using Xunit; namespace Volo.Abp.Features { - public class FeatureChecker_Tests : AbpFeaturesTestBase + public class FeatureChecker_Tests : FeatureTestBase { private readonly IFeatureChecker _featureChecker; private readonly ICurrentTenant _currentTenant; diff --git a/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureDefinitionManager_Tests.cs b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureDefinitionManager_Tests.cs index beb94ec283..5a4bbc9ea1 100644 --- a/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureDefinitionManager_Tests.cs +++ b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureDefinitionManager_Tests.cs @@ -3,7 +3,7 @@ using Xunit; namespace Volo.Abp.Features { - public class FeatureDefinitionManager_Tests : AbpFeaturesTestBase + public class FeatureDefinitionManager_Tests : FeatureTestBase { private readonly IFeatureDefinitionManager _featureDefinitionManager; diff --git a/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureInterceptor_Tests.cs b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureInterceptor_Tests.cs new file mode 100644 index 0000000000..159e2ff241 --- /dev/null +++ b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureInterceptor_Tests.cs @@ -0,0 +1,76 @@ +using Shouldly; +using System; +using System.Threading.Tasks; +using Volo.Abp.Authorization; +using Volo.Abp.MultiTenancy; +using Xunit; + +namespace Volo.Abp.Features +{ + public class FeatureInterceptor_Tests : FeatureTestBase + { + private readonly ClassFeatureTestService _classFeatureTestService; + private readonly IMethodFeatureTestService _methodFeatureTestService; + private readonly ICurrentTenant _currentTenant; + + public FeatureInterceptor_Tests() + { + _classFeatureTestService = GetRequiredService(); + _methodFeatureTestService = GetRequiredService(); + _currentTenant = GetRequiredService(); + } + + [Theory] + [InlineData(null)] //Features were not enabled for null tenantid + [InlineData(TestFeatureStore.Tenant2IdValue)] //Features were not enabled for Tenant 2 + public async Task Should_Not_Allow_To_Method_Calls_If_Related_Features_Were_Not_Enabled(string tenantIdValue) + { + using (_currentTenant.Change(ParseNullableGuid(tenantIdValue))) + { + Assert.Throws(() => + { + _classFeatureTestService.NoAdditionalFeature(); + }); + + Assert.Throws(() => + { + _classFeatureTestService.Feature2(); + }); + + await Assert.ThrowsAsync(async () => + { + await _methodFeatureTestService.Feature1Async(); + }); + } + } + + [Fact] + public async Task Should_Allow_To_Method_Calls_If_Related_Features_Were_Enabled() + { + //Features were enabled for Tenant 1 + using (_currentTenant.Change(TestFeatureStore.Tenant1Id)) + { + _classFeatureTestService.NoAdditionalFeature(); + _classFeatureTestService.Feature2().ShouldBe(42); + (await _methodFeatureTestService.Feature1Async()).ShouldBe(42); + } + } + + [Theory] + [InlineData(null)] + [InlineData(TestFeatureStore.Tenant1IdValue)] + [InlineData(TestFeatureStore.Tenant2IdValue)] + public async Task Should_Allow_To_Method_Calls_For_Those_Have_No_RequiresFeature_Attributes(string tenantIdValue) + { + using (_currentTenant.Change(ParseNullableGuid(tenantIdValue))) + { + await _methodFeatureTestService.NonFeatureAsync(); + } + } + + private static Guid? ParseNullableGuid(string tenantIdValue) + { + return tenantIdValue == null ? (Guid?)null : new Guid(tenantIdValue); + } + } +} diff --git a/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/AbpFeaturesTestBase.cs b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureTestBase.cs similarity index 71% rename from framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/AbpFeaturesTestBase.cs rename to framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureTestBase.cs index a3c9170798..b12aa9f526 100644 --- a/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/AbpFeaturesTestBase.cs +++ b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureTestBase.cs @@ -1,6 +1,6 @@ namespace Volo.Abp.Features { - public class AbpFeaturesTestBase : AbpIntegratedTest + public class FeatureTestBase : AbpIntegratedTest { protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) { diff --git a/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/IMethodFeatureTestService.cs b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/IMethodFeatureTestService.cs new file mode 100644 index 0000000000..7bc16b7e04 --- /dev/null +++ b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/IMethodFeatureTestService.cs @@ -0,0 +1,11 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.Features +{ + public interface IMethodFeatureTestService + { + Task Feature1Async(); + + Task NonFeatureAsync(); + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/MethodFeatureTestService.cs b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/MethodFeatureTestService.cs new file mode 100644 index 0000000000..e627e0c5f1 --- /dev/null +++ b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/MethodFeatureTestService.cs @@ -0,0 +1,23 @@ +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Features +{ + public class MethodFeatureTestService : ITransientDependency, IMethodFeatureTestService + { + /* Since this class is used over an interface (IMethodFeatureTestService), + * no need to virtual keywords, dynamic proxy can work. + */ + + [RequiresFeature("BooleanTestFeature1")] + public Task Feature1Async() + { + return Task.FromResult(42); + } + + public Task NonFeatureAsync() + { + return Task.CompletedTask; + } + } +} diff --git a/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/TestFeatureDefinitionProvider.cs b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/TestFeatureDefinitionProvider.cs index aceb39b6f4..0554120309 100644 --- a/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/TestFeatureDefinitionProvider.cs +++ b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/TestFeatureDefinitionProvider.cs @@ -6,6 +6,7 @@ { var group = context.AddGroup("Test Group"); group.AddFeature("BooleanTestFeature1"); + group.AddFeature("BooleanTestFeature2"); group.AddFeature("IntegerTestFeature1", defaultValue: "1"); } } diff --git a/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/TestFeatureStore.cs b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/TestFeatureStore.cs index 2d68b75fda..87fef33a8d 100644 --- a/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/TestFeatureStore.cs +++ b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/TestFeatureStore.cs @@ -8,8 +8,11 @@ namespace Volo.Abp.Features { public class TestFeatureStore : IFeatureStore, ISingletonDependency { - public static Guid Tenant1Id = new Guid("f460fcf7-f944-469a-967b-3b2463323dfe"); - public static Guid Tenant2Id = new Guid("e10428ad-4608-4c34-a304-6f82502156f2"); + public const string Tenant1IdValue = "f460fcf7-f944-469a-967b-3b2463323dfe"; + public const string Tenant2IdValue = "e10428ad-4608-4c34-a304-6f82502156f2"; + + public static Guid Tenant1Id = new Guid(Tenant1IdValue); + public static Guid Tenant2Id = new Guid(Tenant2IdValue); private readonly List _settingRecords; @@ -18,6 +21,7 @@ namespace Volo.Abp.Features _settingRecords = new List { new SettingRecord("BooleanTestFeature1", TenantFeatureValueProvider.ProviderName, Tenant1Id.ToString(), "true"), + new SettingRecord("BooleanTestFeature2", TenantFeatureValueProvider.ProviderName, Tenant1Id.ToString(), "true"), new SettingRecord("IntegerTestFeature1", TenantFeatureValueProvider.ProviderName, Tenant2Id.ToString(), "34") }; } From 0c1eab7f9aea60cfa8d10ba2d4b2bcddda7d1720 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Mon, 4 Mar 2019 15:30:34 +0300 Subject: [PATCH 010/111] Implemented AbpFeatureActionFilter. --- .../AspNetCore/Mvc/AbpMvcOptionsExtensions.cs | 2 + .../Mvc/Features/AbpFeatureActionFilter.cs | 42 +++++++++++++++++++ .../AspNetCore/Mvc/Uow/AbpUowActionFilter.cs | 1 - .../Volo/Abp/Features/FeatureChecker.cs | 26 +----------- .../Volo/Abp/Features/FeatureCheckerBase.cs | 32 ++++++++++++++ .../Mvc/AbpAspNetCoreMvcTestModule.cs | 1 - .../Mvc/Features/FakeFeatureChecker.cs | 27 ++++++++++++ .../Mvc/Features/FeatureTestController.cs | 33 +++++++++++++++ .../Features/FeatureTestController_Tests.cs | 34 +++++++++++++++ 9 files changed, 172 insertions(+), 26 deletions(-) create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Features/AbpFeatureActionFilter.cs create mode 100644 framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureCheckerBase.cs create mode 100644 framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Features/FakeFeatureChecker.cs create mode 100644 framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Features/FeatureTestController.cs create mode 100644 framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Features/FeatureTestController_Tests.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpMvcOptionsExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpMvcOptionsExtensions.cs index 4de46b2f0b..59c7de8840 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpMvcOptionsExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpMvcOptionsExtensions.cs @@ -3,6 +3,7 @@ using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AspNetCore.Mvc.Auditing; using Volo.Abp.AspNetCore.Mvc.Conventions; using Volo.Abp.AspNetCore.Mvc.ExceptionHandling; +using Volo.Abp.AspNetCore.Mvc.Features; using Volo.Abp.AspNetCore.Mvc.Uow; using Volo.Abp.AspNetCore.Mvc.Validation; @@ -26,6 +27,7 @@ namespace Volo.Abp.AspNetCore.Mvc private static void AddFilters(MvcOptions options) { options.Filters.AddService(typeof(AbpAuditActionFilter)); + options.Filters.AddService(typeof(AbpFeatureActionFilter)); options.Filters.AddService(typeof(AbpValidationActionFilter)); options.Filters.AddService(typeof(AbpUowActionFilter)); options.Filters.AddService(typeof(AbpExceptionFilter)); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Features/AbpFeatureActionFilter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Features/AbpFeatureActionFilter.cs new file mode 100644 index 0000000000..577acda339 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Features/AbpFeatureActionFilter.cs @@ -0,0 +1,42 @@ +using Microsoft.AspNetCore.Mvc.Filters; +using System; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc.Abstractions; +using Volo.Abp.Aspects; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Features; + +namespace Volo.Abp.AspNetCore.Mvc.Features +{ + public class AbpFeatureActionFilter : IAsyncActionFilter, ITransientDependency + { + private readonly IMethodInvocationFeatureCheckerService _methodInvocationAuthorizationService; + + public AbpFeatureActionFilter(IMethodInvocationFeatureCheckerService methodInvocationAuthorizationService) + { + _methodInvocationAuthorizationService = methodInvocationAuthorizationService; + } + + public async Task OnActionExecutionAsync( + ActionExecutingContext context, + ActionExecutionDelegate next) + { + if (!context.ActionDescriptor.IsControllerAction()) + { + await next(); + return; + } + + var methodInfo = context.ActionDescriptor.GetMethodInfo(); + + using (AbpCrossCuttingConcerns.Applying(context.Controller, AbpCrossCuttingConcerns.FeatureChecking)) + { + await _methodInvocationAuthorizationService.CheckAsync( + new MethodInvocationFeatureCheckerContext(methodInfo) + ); + + await next(); + } + } + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Uow/AbpUowActionFilter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Uow/AbpUowActionFilter.cs index 5a330eb7a9..0a03a0dc67 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Uow/AbpUowActionFilter.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Uow/AbpUowActionFilter.cs @@ -12,7 +12,6 @@ namespace Volo.Abp.AspNetCore.Mvc.Uow { public class AbpUowActionFilter : IAsyncActionFilter, ITransientDependency { - private readonly IUnitOfWorkManager _unitOfWorkManager; private readonly UnitOfWorkDefaultOptions _defaultOptions; diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureChecker.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureChecker.cs index 68db290f1b..bc9f8565ed 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureChecker.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureChecker.cs @@ -4,11 +4,10 @@ using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using Volo.Abp.DependencyInjection; namespace Volo.Abp.Features { - public class FeatureChecker : IFeatureChecker, ITransientDependency + public class FeatureChecker : FeatureCheckerBase { protected FeatureOptions Options { get; } protected IServiceProvider ServiceProvider { get; } @@ -36,7 +35,7 @@ namespace Volo.Abp.Features ); } - public virtual async Task GetOrNullAsync(string name) + public override async Task GetOrNullAsync(string name) { var featureDefinition = FeatureDefinitionManager.Get(name); var providers = Enumerable @@ -50,27 +49,6 @@ namespace Volo.Abp.Features return await GetOrNullValueFromProvidersAsync(providers, featureDefinition); } - public async Task IsEnabledAsync(string name) - { - var value = await GetOrNullAsync(name); - if (value == null) - { - return false; - } - - try - { - return bool.Parse(value); - } - catch (Exception ex) - { - throw new AbpException( - $"The value '{value}' for the feature '{name}' should be a boolean, but was not!", - ex - ); - } - } - protected virtual async Task GetOrNullValueFromProvidersAsync( IEnumerable providers, FeatureDefinition feature) diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureCheckerBase.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureCheckerBase.cs new file mode 100644 index 0000000000..a24e0901f7 --- /dev/null +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureCheckerBase.cs @@ -0,0 +1,32 @@ +using System; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Features +{ + public abstract class FeatureCheckerBase : IFeatureChecker, ITransientDependency + { + public abstract Task GetOrNullAsync(string name); + + public virtual async Task IsEnabledAsync(string name) + { + var value = await GetOrNullAsync(name); + if (value == null) + { + return false; + } + + try + { + return bool.Parse(value); + } + catch (Exception ex) + { + throw new AbpException( + $"The value '{value}' for the feature '{name}' should be a boolean, but was not!", + ex + ); + } + } + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs index 014cee2077..eb0fc1ef48 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs @@ -6,7 +6,6 @@ using Volo.Abp.AspNetCore.Mvc.Authorization; using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AspNetCore.Mvc.Localization.Resource; using Volo.Abp.AspNetCore.TestBase; -using Volo.Abp.Authorization.Permissions; using Volo.Abp.Autofac; using Volo.Abp.Localization; using Volo.Abp.Localization.Resources.AbpValidation; diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Features/FakeFeatureChecker.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Features/FakeFeatureChecker.cs new file mode 100644 index 0000000000..04e7fa908a --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Features/FakeFeatureChecker.cs @@ -0,0 +1,27 @@ +using System; +using System.Threading.Tasks; +using Volo.Abp.Features; + +namespace Volo.Abp.AspNetCore.Mvc.Features +{ + public class FakeFeatureChecker : FeatureCheckerBase + { + public override Task GetOrNullAsync(string name) + { + return Task.FromResult(GetOrNull(name)); + } + + private static string GetOrNull(string name) + { + switch (name) + { + case "AllowedFeature": + return true.ToString(); + case "NotAllowedFeature": + return null; //or false, doesn't matter + } + + throw new ApplicationException($"Unknown feature: '{name}'"); + } + } +} diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Features/FeatureTestController.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Features/FeatureTestController.cs new file mode 100644 index 0000000000..1d2549323d --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Features/FeatureTestController.cs @@ -0,0 +1,33 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.Features; + +namespace Volo.Abp.AspNetCore.Mvc.Features +{ + [Route("api/feature-test")] + public class FeatureTestController : AbpController + { + [HttpGet] + [Route("allowed-feature")] + [RequiresFeature("AllowedFeature")] + public Task AllowedFeatureAsync() + { + return Task.CompletedTask; + } + + [HttpGet] + [Route("not-allowed-feature")] + [RequiresFeature("NotAllowedFeature")] + public void NotAllowedFeature() + { + + } + + [HttpGet] + [Route("no-feature")] + public int NoFeature() + { + return 42; + } + } +} diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Features/FeatureTestController_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Features/FeatureTestController_Tests.cs new file mode 100644 index 0000000000..637dbe3d2b --- /dev/null +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/Features/FeatureTestController_Tests.cs @@ -0,0 +1,34 @@ +using System.Net; +using System.Threading.Tasks; +using Xunit; + +namespace Volo.Abp.AspNetCore.Mvc.Features +{ + public class FeatureTestController_Tests : AspNetCoreMvcTestBase + { + [Fact] + public async Task Should_Allow_Enabled_Features() + { + await GetResponseAsStringAsync( + "/api/feature-test/allowed-feature" + ); + } + + [Fact] + public async Task Should_Not_Allow_Not_Enabled_Features() + { + await GetResponseAsStringAsync( + "/api/feature-test/not-allowed-feature", + HttpStatusCode.Unauthorized + ); + } + + [Fact] + public async Task Should_Allow_Actions_With_No_Feature() + { + await GetResponseAsStringAsync( + "/api/feature-test/no-feature" + ); + } + } +} From 58b803e72530b207fad0ea63abb7bdc384aed4ce Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Mon, 4 Mar 2019 15:40:08 +0300 Subject: [PATCH 011/111] Resolved #858 --- .../Volo/Abp/Emailing/AbpEmailingModule.cs | 5 ----- .../Volo/Abp/Localization/AbpLocalizationModule.cs | 5 ----- .../Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs | 5 ----- .../Volo/Abp/Settings/AbpSettingsTestModule.cs | 1 - .../src/Volo.Abp.Account.Web/AbpAccountWebModule.cs | 5 ----- .../Blogging/BloggingApplicationContractsModule.cs | 5 ----- .../Docs/Admin/DocsAdminApplicationContractsModule.cs | 5 ----- .../Identity/AbpIdentityApplicationContractsModule.cs | 5 ----- .../Volo/Abp/Identity/AbpIdentityDomainModule.cs | 5 ----- .../Volo/Abp/Identity/AbpIdentityDomainTestModule.cs | 8 -------- .../AbpPermissionManagementTestBaseModule.cs | 8 -------- .../AbpSettingManagementTestBaseModule.cs | 8 -------- .../AbpTenantManagementApplicationContractsModule.cs | 5 ----- .../BookStoreApplicationModule.cs | 5 ----- .../src/Acme.BookStore.Domain/BookStoreDomainModule.cs | 5 ----- .../ProductManagementApplicationContractsModule.cs | 10 ---------- .../MyProjectNameApplicationContractsModule.cs | 5 ----- .../MyProjectName/MyProjectNameApplicationModule.cs | 5 ----- .../MyProjectNameApplicationModule.cs | 5 ----- .../MyProjectNameDomainModule.cs | 5 ----- .../MyProjectNameApplicationContractsModule.cs | 5 ----- .../MyProjectName/MyProjectNameApplicationModule.cs | 5 ----- 22 files changed, 120 deletions(-) diff --git a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/AbpEmailingModule.cs b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/AbpEmailingModule.cs index 7648ddc910..b861a3898c 100644 --- a/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/AbpEmailingModule.cs +++ b/framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/AbpEmailingModule.cs @@ -18,11 +18,6 @@ namespace Volo.Abp.Emailing { public override void ConfigureServices(ServiceConfigurationContext context) { - Configure(options => - { - options.DefinitionProviders.Add(); - }); - Configure(options => { options.FileSets.AddEmbedded(); diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpLocalizationModule.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpLocalizationModule.cs index 3fcd90ac6d..a65e6863a8 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpLocalizationModule.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/AbpLocalizationModule.cs @@ -27,11 +27,6 @@ namespace Volo.Abp.Localization .Add("en") .AddVirtualJson("/Localization/Resources/AbpValidation"); }); - - Configure(options => - { - options.DefinitionProviders.Add(); - }); } } } diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs index b079b38188..014cee2077 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs @@ -57,11 +57,6 @@ namespace Volo.Abp.AspNetCore.Mvc }); }); - Configure(options => - { - options.DefinitionProviders.Add(); - }); - Configure(options => { options.FileSets.AddEmbedded(); diff --git a/framework/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/AbpSettingsTestModule.cs b/framework/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/AbpSettingsTestModule.cs index dc4ab057a0..1aefadf97c 100644 --- a/framework/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/AbpSettingsTestModule.cs +++ b/framework/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/AbpSettingsTestModule.cs @@ -13,7 +13,6 @@ namespace Volo.Abp.Settings Configure(options => { options.ValueProviders.Add(); - options.DefinitionProviders.Add(); }); } } diff --git a/modules/account/src/Volo.Abp.Account.Web/AbpAccountWebModule.cs b/modules/account/src/Volo.Abp.Account.Web/AbpAccountWebModule.cs index 5d136bd329..e999cf1450 100644 --- a/modules/account/src/Volo.Abp.Account.Web/AbpAccountWebModule.cs +++ b/modules/account/src/Volo.Abp.Account.Web/AbpAccountWebModule.cs @@ -31,11 +31,6 @@ namespace Volo.Abp.Account.Web public override void ConfigureServices(ServiceConfigurationContext context) { - Configure(options => - { - options.DefinitionProviders.Add(); - }); - Configure(options => { options.FileSets.AddEmbedded("Volo.Abp.Account.Web"); diff --git a/modules/blogging/src/Volo.Blogging.Application.Contracts/Volo/Blogging/BloggingApplicationContractsModule.cs b/modules/blogging/src/Volo.Blogging.Application.Contracts/Volo/Blogging/BloggingApplicationContractsModule.cs index 29deef3457..e9ecdbf581 100644 --- a/modules/blogging/src/Volo.Blogging.Application.Contracts/Volo/Blogging/BloggingApplicationContractsModule.cs +++ b/modules/blogging/src/Volo.Blogging.Application.Contracts/Volo/Blogging/BloggingApplicationContractsModule.cs @@ -12,11 +12,6 @@ namespace Volo.Blogging { public override void ConfigureServices(ServiceConfigurationContext context) { - Configure(options => - { - options.DefinitionProviders.Add(); - }); - Configure(options => { options.FileSets.AddEmbedded(); diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/DocsAdminApplicationContractsModule.cs b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/DocsAdminApplicationContractsModule.cs index 545fcb25b8..e37a732a0d 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/DocsAdminApplicationContractsModule.cs +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/DocsAdminApplicationContractsModule.cs @@ -15,11 +15,6 @@ namespace Volo.Docs.Admin { public override void ConfigureServices(ServiceConfigurationContext context) { - Configure(options => - { - options.DefinitionProviders.Add(); - }); - Configure(options => { options.FileSets.AddEmbedded(); diff --git a/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/AbpIdentityApplicationContractsModule.cs b/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/AbpIdentityApplicationContractsModule.cs index 9a45258f4f..c3d142aefc 100644 --- a/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/AbpIdentityApplicationContractsModule.cs +++ b/modules/identity/src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/AbpIdentityApplicationContractsModule.cs @@ -21,11 +21,6 @@ namespace Volo.Abp.Identity { public override void ConfigureServices(ServiceConfigurationContext context) { - Configure(options => - { - options.DefinitionProviders.Add(); - }); - Configure(options => { options.FileSets.AddEmbedded(); diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityDomainModule.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityDomainModule.cs index 0b4c5b3fac..3572acdaa7 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityDomainModule.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityDomainModule.cs @@ -24,11 +24,6 @@ namespace Volo.Abp.Identity { public override void ConfigureServices(ServiceConfigurationContext context) { - Configure(options => - { - options.DefinitionProviders.Add(); - }); - Configure(options => { options.FileSets.AddEmbedded(); diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/AbpIdentityDomainTestModule.cs b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/AbpIdentityDomainTestModule.cs index 16dd6149de..cbb52f02ba 100644 --- a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/AbpIdentityDomainTestModule.cs +++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/AbpIdentityDomainTestModule.cs @@ -13,14 +13,6 @@ namespace Volo.Abp.Identity )] public class AbpIdentityDomainTestModule : AbpModule { - public override void ConfigureServices(ServiceConfigurationContext context) - { - Configure(options => - { - options.DefinitionProviders.Add(); - }); - } - public override void OnApplicationInitialization(ApplicationInitializationContext context) { SeedTestData(context); diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/AbpPermissionManagementTestBaseModule.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/AbpPermissionManagementTestBaseModule.cs index b5a616d1c4..4423cf114b 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/AbpPermissionManagementTestBaseModule.cs +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/AbpPermissionManagementTestBaseModule.cs @@ -12,14 +12,6 @@ namespace Volo.Abp.PermissionManagement )] public class AbpPermissionManagementTestBaseModule : AbpModule { - public override void ConfigureServices(ServiceConfigurationContext context) - { - Configure(options => - { - options.DefinitionProviders.Add(); - }); - } - public override void OnApplicationInitialization(ApplicationInitializationContext context) { SeedTestData(context); diff --git a/modules/setting-management/test/Volo.Abp.SettingManagement.TestBase/Volo/Abp/SettingManagement/AbpSettingManagementTestBaseModule.cs b/modules/setting-management/test/Volo.Abp.SettingManagement.TestBase/Volo/Abp/SettingManagement/AbpSettingManagementTestBaseModule.cs index ca7be601f1..7d90dcd747 100644 --- a/modules/setting-management/test/Volo.Abp.SettingManagement.TestBase/Volo/Abp/SettingManagement/AbpSettingManagementTestBaseModule.cs +++ b/modules/setting-management/test/Volo.Abp.SettingManagement.TestBase/Volo/Abp/SettingManagement/AbpSettingManagementTestBaseModule.cs @@ -11,14 +11,6 @@ namespace Volo.Abp.SettingManagement typeof(AbpSettingManagementDomainModule))] public class AbpSettingManagementTestBaseModule : AbpModule { - public override void ConfigureServices(ServiceConfigurationContext context) - { - Configure(options => - { - options.DefinitionProviders.Add(); - }); - } - public override void OnApplicationInitialization(ApplicationInitializationContext context) { SeedTestData(context); diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/AbpTenantManagementApplicationContractsModule.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/AbpTenantManagementApplicationContractsModule.cs index 24af59cda2..50c6aae024 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/AbpTenantManagementApplicationContractsModule.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/AbpTenantManagementApplicationContractsModule.cs @@ -14,11 +14,6 @@ namespace Volo.Abp.TenantManagement { public override void ConfigureServices(ServiceConfigurationContext context) { - Configure(options => - { - options.DefinitionProviders.Add(); - }); - Configure(options => { options.FileSets.AddEmbedded(); diff --git a/samples/BookStore/src/Acme.BookStore.Application/BookStoreApplicationModule.cs b/samples/BookStore/src/Acme.BookStore.Application/BookStoreApplicationModule.cs index 6c8ae1df2b..55b344b1ea 100644 --- a/samples/BookStore/src/Acme.BookStore.Application/BookStoreApplicationModule.cs +++ b/samples/BookStore/src/Acme.BookStore.Application/BookStoreApplicationModule.cs @@ -15,11 +15,6 @@ namespace Acme.BookStore { public override void ConfigureServices(ServiceConfigurationContext context) { - Configure(options => - { - options.DefinitionProviders.Add(); - }); - Configure(options => { options.AddProfile(); diff --git a/samples/BookStore/src/Acme.BookStore.Domain/BookStoreDomainModule.cs b/samples/BookStore/src/Acme.BookStore.Domain/BookStoreDomainModule.cs index 044cbbb827..abd062308b 100644 --- a/samples/BookStore/src/Acme.BookStore.Domain/BookStoreDomainModule.cs +++ b/samples/BookStore/src/Acme.BookStore.Domain/BookStoreDomainModule.cs @@ -30,11 +30,6 @@ namespace Acme.BookStore .AddBaseTypes(typeof(AbpValidationResource)) .AddVirtualJson("/Localization/BookStore"); }); - - Configure(options => - { - options.DefinitionProviders.Add(); - }); } } } diff --git a/samples/MicroserviceDemo/modules/product/src/ProductManagement.Application.Contracts/ProductManagement/ProductManagementApplicationContractsModule.cs b/samples/MicroserviceDemo/modules/product/src/ProductManagement.Application.Contracts/ProductManagement/ProductManagementApplicationContractsModule.cs index 53fe58cbe0..fedac990be 100644 --- a/samples/MicroserviceDemo/modules/product/src/ProductManagement.Application.Contracts/ProductManagement/ProductManagementApplicationContractsModule.cs +++ b/samples/MicroserviceDemo/modules/product/src/ProductManagement.Application.Contracts/ProductManagement/ProductManagementApplicationContractsModule.cs @@ -16,11 +16,6 @@ namespace ProductManagement { public override void ConfigureServices(ServiceConfigurationContext context) { - Configure(options => - { - options.DefinitionProviders.Add(); - }); - Configure(options => { options.FileSets.AddEmbedded(); @@ -32,11 +27,6 @@ namespace ProductManagement .Get() .AddVirtualJson("/ProductManagement/Localization/ApplicationContracts"); }); - - Configure(options => - { - options.DefinitionProviders.Add(); - }); } } } diff --git a/templates/module/src/MyCompanyName.MyProjectName.Application.Contracts/MyCompanyName/MyProjectName/MyProjectNameApplicationContractsModule.cs b/templates/module/src/MyCompanyName.MyProjectName.Application.Contracts/MyCompanyName/MyProjectName/MyProjectNameApplicationContractsModule.cs index 6d4c99a263..84be3eb86f 100644 --- a/templates/module/src/MyCompanyName.MyProjectName.Application.Contracts/MyCompanyName/MyProjectName/MyProjectNameApplicationContractsModule.cs +++ b/templates/module/src/MyCompanyName.MyProjectName.Application.Contracts/MyCompanyName/MyProjectName/MyProjectNameApplicationContractsModule.cs @@ -16,11 +16,6 @@ namespace MyCompanyName.MyProjectName { public override void ConfigureServices(ServiceConfigurationContext context) { - Configure(options => - { - options.DefinitionProviders.Add(); - }); - Configure(options => { options.FileSets.AddEmbedded(); diff --git a/templates/module/src/MyCompanyName.MyProjectName.Application/MyCompanyName/MyProjectName/MyProjectNameApplicationModule.cs b/templates/module/src/MyCompanyName.MyProjectName.Application/MyCompanyName/MyProjectName/MyProjectNameApplicationModule.cs index f62329d534..891ff26af3 100644 --- a/templates/module/src/MyCompanyName.MyProjectName.Application/MyCompanyName/MyProjectName/MyProjectNameApplicationModule.cs +++ b/templates/module/src/MyCompanyName.MyProjectName.Application/MyCompanyName/MyProjectName/MyProjectNameApplicationModule.cs @@ -18,11 +18,6 @@ namespace MyCompanyName.MyProjectName { options.AddProfile(validate: true); }); - - Configure(options => - { - options.DefinitionProviders.Add(); - }); } } } diff --git a/templates/mvc/src/MyCompanyName.MyProjectName.Application/MyProjectNameApplicationModule.cs b/templates/mvc/src/MyCompanyName.MyProjectName.Application/MyProjectNameApplicationModule.cs index 83a95f6946..c23175b956 100644 --- a/templates/mvc/src/MyCompanyName.MyProjectName.Application/MyProjectNameApplicationModule.cs +++ b/templates/mvc/src/MyCompanyName.MyProjectName.Application/MyProjectNameApplicationModule.cs @@ -16,11 +16,6 @@ namespace MyCompanyName.MyProjectName { public override void ConfigureServices(ServiceConfigurationContext context) { - Configure(options => - { - options.DefinitionProviders.Add(); - }); - Configure(options => { options.AddProfile(); diff --git a/templates/mvc/src/MyCompanyName.MyProjectName.Domain/MyProjectNameDomainModule.cs b/templates/mvc/src/MyCompanyName.MyProjectName.Domain/MyProjectNameDomainModule.cs index f32225025f..565e4f8d5f 100644 --- a/templates/mvc/src/MyCompanyName.MyProjectName.Domain/MyProjectNameDomainModule.cs +++ b/templates/mvc/src/MyCompanyName.MyProjectName.Domain/MyProjectNameDomainModule.cs @@ -36,11 +36,6 @@ namespace MyCompanyName.MyProjectName .AddBaseTypes(typeof(AbpValidationResource)) .AddVirtualJson("/Localization/MyProjectName"); }); - - Configure(options => - { - options.DefinitionProviders.Add(); - }); } } } diff --git a/templates/service/src/MyCompanyName.MyProjectName.Application.Contracts/MyCompanyName/MyProjectName/MyProjectNameApplicationContractsModule.cs b/templates/service/src/MyCompanyName.MyProjectName.Application.Contracts/MyCompanyName/MyProjectName/MyProjectNameApplicationContractsModule.cs index 6d4c99a263..84be3eb86f 100644 --- a/templates/service/src/MyCompanyName.MyProjectName.Application.Contracts/MyCompanyName/MyProjectName/MyProjectNameApplicationContractsModule.cs +++ b/templates/service/src/MyCompanyName.MyProjectName.Application.Contracts/MyCompanyName/MyProjectName/MyProjectNameApplicationContractsModule.cs @@ -16,11 +16,6 @@ namespace MyCompanyName.MyProjectName { public override void ConfigureServices(ServiceConfigurationContext context) { - Configure(options => - { - options.DefinitionProviders.Add(); - }); - Configure(options => { options.FileSets.AddEmbedded(); diff --git a/templates/service/src/MyCompanyName.MyProjectName.Application/MyCompanyName/MyProjectName/MyProjectNameApplicationModule.cs b/templates/service/src/MyCompanyName.MyProjectName.Application/MyCompanyName/MyProjectName/MyProjectNameApplicationModule.cs index f62329d534..891ff26af3 100644 --- a/templates/service/src/MyCompanyName.MyProjectName.Application/MyCompanyName/MyProjectName/MyProjectNameApplicationModule.cs +++ b/templates/service/src/MyCompanyName.MyProjectName.Application/MyCompanyName/MyProjectName/MyProjectNameApplicationModule.cs @@ -18,11 +18,6 @@ namespace MyCompanyName.MyProjectName { options.AddProfile(validate: true); }); - - Configure(options => - { - options.DefinitionProviders.Add(); - }); } } } From 0a8cc2681937cebf664cdce0c15cce9eed1e92b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Atakan=20=C3=96zceviz?= Date: Mon, 4 Mar 2019 14:06:57 +0100 Subject: [PATCH 012/111] Recreate k8s yaml files --- .../k8s/auth-server-deployment.yaml | 10 ++-- .../k8s/auth-server-service.yaml | 5 +- .../k8s/backend-admin-app-deployment.yaml | 5 +- .../backend-admin-app-gateway-deployment.yaml | 16 +++---- .../backend-admin-app-gateway-service.yaml | 3 +- .../k8s/backend-admin-app-service.yaml | 3 +- .../k8s/blogging-service-deployment.yaml | 10 ++-- .../k8s/blogging-service-service.yaml | 3 +- .../k8s/console-client-demo-deployment.yaml | 32 ------------- .../k8s/console-client-demo-service.yaml | 15 ------ .../MicroserviceDemo/k8s/expose-service.yaml | 47 +++++++++++++++++++ .../k8s/identity-service-deployment.yaml | 8 ++-- .../k8s/identity-service-service.yaml | 3 +- .../k8s/internal-gateway-deployment.yaml | 20 ++++---- .../k8s/internal-gateway-service.yaml | 3 +- .../k8s/migrations-deployment.yaml | 21 --------- .../MicroserviceDemo/k8s/migrations-job.yaml | 12 ----- .../k8s/mongodb-deployment.yaml | 1 - .../MicroserviceDemo/k8s/mongodb-service.yaml | 3 +- .../k8s/product-service-deployment.yaml | 8 ++-- .../k8s/product-service-service.yaml | 3 +- .../k8s/public-website-deployment.yaml | 5 +- .../public-website-gateway-deployment.yaml | 16 +++---- .../k8s/public-website-gateway-service.yaml | 3 +- .../k8s/public-website-service.yaml | 3 +- .../k8s/rabbitmq-deployment.yaml | 1 - .../k8s/redis-deployment.yaml | 1 - .../MicroserviceDemo/k8s/redis-service.yaml | 3 +- .../k8s/restore-database-job.yaml | 23 +++++++++ .../k8s/sqlserver-deployment.yaml | 1 - .../k8s/sqlserver-service.yaml | 3 +- 31 files changed, 125 insertions(+), 165 deletions(-) delete mode 100644 samples/MicroserviceDemo/k8s/console-client-demo-deployment.yaml delete mode 100644 samples/MicroserviceDemo/k8s/console-client-demo-service.yaml create mode 100644 samples/MicroserviceDemo/k8s/expose-service.yaml delete mode 100644 samples/MicroserviceDemo/k8s/migrations-deployment.yaml delete mode 100644 samples/MicroserviceDemo/k8s/migrations-job.yaml create mode 100644 samples/MicroserviceDemo/k8s/restore-database-job.yaml diff --git a/samples/MicroserviceDemo/k8s/auth-server-deployment.yaml b/samples/MicroserviceDemo/k8s/auth-server-deployment.yaml index b2307834d2..7ddbc30309 100644 --- a/samples/MicroserviceDemo/k8s/auth-server-deployment.yaml +++ b/samples/MicroserviceDemo/k8s/auth-server-deployment.yaml @@ -17,19 +17,17 @@ spec: - name: ASPNETCORE_ENVIRONMENT value: Development - name: ASPNETCORE_URLS - value: http://0.0.0.0:64999 + value: http://0.0.0.0:51511 - name: ConnectionStrings__Default - value: Server=sqlserver;Database=MsDemo_Identity;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated - Security=false + value: Server=sqlserver;Database=MsDemo_Identity;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated Security=false - name: RabbitMQ__Connections__Default__HostName value: rabbitmq - name: Redis__Configuration value: redis - image: microservice-demo/auth-server:latest + image: volosoft/microservice-demo-auth-server name: auth-server ports: - - containerPort: 64999 + - containerPort: 51511 resources: {} - imagePullPolicy: Never restartPolicy: Always status: {} diff --git a/samples/MicroserviceDemo/k8s/auth-server-service.yaml b/samples/MicroserviceDemo/k8s/auth-server-service.yaml index c96e9c3e3d..d317ba1fae 100644 --- a/samples/MicroserviceDemo/k8s/auth-server-service.yaml +++ b/samples/MicroserviceDemo/k8s/auth-server-service.yaml @@ -6,9 +6,8 @@ metadata: name: auth-server spec: ports: - - name: "64999" - port: 64999 - targetPort: 64999 + - port: 51511 + targetPort: 51511 selector: io.kompose.service: auth-server status: diff --git a/samples/MicroserviceDemo/k8s/backend-admin-app-deployment.yaml b/samples/MicroserviceDemo/k8s/backend-admin-app-deployment.yaml index ce6c238f7c..f26cb02806 100644 --- a/samples/MicroserviceDemo/k8s/backend-admin-app-deployment.yaml +++ b/samples/MicroserviceDemo/k8s/backend-admin-app-deployment.yaml @@ -19,16 +19,15 @@ spec: - name: ASPNETCORE_URLS value: http://0.0.0.0:80 - name: AuthServer__Authority - value: http://auth-server:64999 + value: http://auth-server:51511 - name: Redis__Configuration value: redis - name: RemoteServices__Default__BaseUrl value: http://backend-admin-app-gateway/ - image: microservice-demo/backend-admin-app:latest + image: volosoft/microservice-demo-backend-admin-app name: backend-admin-app ports: - containerPort: 80 resources: {} - imagePullPolicy: Never restartPolicy: Always status: {} diff --git a/samples/MicroserviceDemo/k8s/backend-admin-app-gateway-deployment.yaml b/samples/MicroserviceDemo/k8s/backend-admin-app-gateway-deployment.yaml index 10490961e5..c2f28623b2 100644 --- a/samples/MicroserviceDemo/k8s/backend-admin-app-gateway-deployment.yaml +++ b/samples/MicroserviceDemo/k8s/backend-admin-app-gateway-deployment.yaml @@ -19,29 +19,27 @@ spec: - name: ASPNETCORE_URLS value: http://0.0.0.0:80 - name: AuthServer__Authority - value: http://auth-server:64999 + value: http://auth-server:51511 - name: ConnectionStrings__Default - value: Server=sqlserver;Database=MsDemo_Identity;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated - Security=false + value: Server=sqlserver;Database=MsDemo_Identity;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated Security=false - name: GlobalConfiguration__BaseUrl value: http://backend-admin-app-gateway - - name: ReRoutes__0__DownstreamHostAndPorts__Host + - name: ReRoutes__0__DownstreamHostAndPorts__0__Host value: identity-service - - name: ReRoutes__0__DownstreamHostAndPorts__Port + - name: ReRoutes__0__DownstreamHostAndPorts__0__Port value: "80" - - name: ReRoutes__1__DownstreamHostAndPorts__Host + - name: ReRoutes__1__DownstreamHostAndPorts__0__Host value: product-service - - name: ReRoutes__1__DownstreamHostAndPorts__Port + - name: ReRoutes__1__DownstreamHostAndPorts__0__Port value: "80" - name: Redis__Configuration value: redis - name: RemoteServices__Default__BaseUrl value: http://backend-admin-app-gateway/ - image: microservice-demo/backend-admin-app-gateway:latest + image: volosoft/microservice-demo-backend-admin-app-gateway name: backend-admin-app-gateway ports: - containerPort: 80 resources: {} - imagePullPolicy: Never restartPolicy: Always status: {} diff --git a/samples/MicroserviceDemo/k8s/backend-admin-app-gateway-service.yaml b/samples/MicroserviceDemo/k8s/backend-admin-app-gateway-service.yaml index ca3faee62c..4864ee547a 100644 --- a/samples/MicroserviceDemo/k8s/backend-admin-app-gateway-service.yaml +++ b/samples/MicroserviceDemo/k8s/backend-admin-app-gateway-service.yaml @@ -6,8 +6,7 @@ metadata: name: backend-admin-app-gateway spec: ports: - - name: "65115" - port: 65115 + - port: 80 targetPort: 80 selector: io.kompose.service: backend-admin-app-gateway diff --git a/samples/MicroserviceDemo/k8s/backend-admin-app-service.yaml b/samples/MicroserviceDemo/k8s/backend-admin-app-service.yaml index f735fdae1c..f8df4e57de 100644 --- a/samples/MicroserviceDemo/k8s/backend-admin-app-service.yaml +++ b/samples/MicroserviceDemo/k8s/backend-admin-app-service.yaml @@ -6,8 +6,7 @@ metadata: name: backend-admin-app spec: ports: - - name: "3000" - port: 3000 + - port: 80 targetPort: 80 selector: io.kompose.service: backend-admin-app diff --git a/samples/MicroserviceDemo/k8s/blogging-service-deployment.yaml b/samples/MicroserviceDemo/k8s/blogging-service-deployment.yaml index a5b801106b..6bf8d33a8c 100644 --- a/samples/MicroserviceDemo/k8s/blogging-service-deployment.yaml +++ b/samples/MicroserviceDemo/k8s/blogging-service-deployment.yaml @@ -19,21 +19,21 @@ spec: - name: ASPNETCORE_URLS value: http://0.0.0.0:80 - name: AuthServer__Authority - value: http://auth-server:64999 + value: http://auth-server:51511 - name: ConnectionStrings__Blogging value: mongodb://mongodb|MsDemo_Blogging - name: ConnectionStrings__Default - value: Server=sqlserver;Database=MsDemo_Identity;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated - Security=false + value: Server=sqlserver;Database=MsDemo_Identity;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated Security=false - name: RabbitMQ__Connections__Default__HostName value: rabbitmq - name: Redis__Configuration value: redis - image: microservice-demo/blogging-service:latest + - name: RemoteServices__Default__BaseUrl + value: http://internal-gateway/ + image: volosoft/microservice-demo-blogging-service name: blogging-service ports: - containerPort: 80 resources: {} - imagePullPolicy: Never restartPolicy: Always status: {} diff --git a/samples/MicroserviceDemo/k8s/blogging-service-service.yaml b/samples/MicroserviceDemo/k8s/blogging-service-service.yaml index d0ab95528e..c2b359580a 100644 --- a/samples/MicroserviceDemo/k8s/blogging-service-service.yaml +++ b/samples/MicroserviceDemo/k8s/blogging-service-service.yaml @@ -6,8 +6,7 @@ metadata: name: blogging-service spec: ports: - - name: "62157" - port: 62157 + - port: 80 targetPort: 80 selector: io.kompose.service: blogging-service diff --git a/samples/MicroserviceDemo/k8s/console-client-demo-deployment.yaml b/samples/MicroserviceDemo/k8s/console-client-demo-deployment.yaml deleted file mode 100644 index 4ccfd788be..0000000000 --- a/samples/MicroserviceDemo/k8s/console-client-demo-deployment.yaml +++ /dev/null @@ -1,32 +0,0 @@ -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - labels: - io.kompose.service: console-client-demo - name: console-client-demo -spec: - replicas: 1 - strategy: {} - template: - metadata: - labels: - io.kompose.service: console-client-demo - spec: - containers: - - env: - - name: ASPNETCORE_ENVIRONMENT - value: Development - - name: ASPNETCORE_URLS - value: http://0.0.0.0:80 - - name: IdentityClients__Default__Authority - value: http://auth-server:64999 - - name: RemoteServices__Default__BaseUrl - value: http://internal-gateway/ - image: microservice-demo/console-client-demo:latest - name: console-client-demo - ports: - - containerPort: 80 - resources: {} - imagePullPolicy: Never - restartPolicy: Always -status: {} diff --git a/samples/MicroserviceDemo/k8s/console-client-demo-service.yaml b/samples/MicroserviceDemo/k8s/console-client-demo-service.yaml deleted file mode 100644 index 5146110356..0000000000 --- a/samples/MicroserviceDemo/k8s/console-client-demo-service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - labels: - io.kompose.service: console-client-demo - name: console-client-demo -spec: - ports: - - name: "3001" - port: 3001 - targetPort: 80 - selector: - io.kompose.service: console-client-demo -status: - loadBalancer: {} diff --git a/samples/MicroserviceDemo/k8s/expose-service.yaml b/samples/MicroserviceDemo/k8s/expose-service.yaml new file mode 100644 index 0000000000..f7a7e7dfe5 --- /dev/null +++ b/samples/MicroserviceDemo/k8s/expose-service.yaml @@ -0,0 +1,47 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + io.kompose.service: auth-server + name: auth-server-expose +spec: + type: LoadBalancer + selector: + io.kompose.service: auth-server + ports: + - protocol: TCP + port: 51511 + targetPort: 51511 + nodePort: 30001 +--- +apiVersion: v1 +kind: Service +metadata: + labels: + io.kompose.service: backend-admin-app + name: backend-admin-app-expose +spec: + type: LoadBalancer + selector: + io.kompose.service: backend-admin-app + ports: + - protocol: TCP + port: 80 + targetPort: 80 + nodePort: 30002 +--- +apiVersion: v1 +kind: Service +metadata: + labels: + io.kompose.service: public-website + name: public-website-expose +spec: + type: LoadBalancer + selector: + io.kompose.service: public-website + ports: + - protocol: TCP + port: 80 + targetPort: 80 + nodePort: 30003 \ No newline at end of file diff --git a/samples/MicroserviceDemo/k8s/identity-service-deployment.yaml b/samples/MicroserviceDemo/k8s/identity-service-deployment.yaml index 4df2099e49..6179f57e44 100644 --- a/samples/MicroserviceDemo/k8s/identity-service-deployment.yaml +++ b/samples/MicroserviceDemo/k8s/identity-service-deployment.yaml @@ -19,19 +19,17 @@ spec: - name: ASPNETCORE_URLS value: http://0.0.0.0:80 - name: AuthServer__Authority - value: http://auth-server:64999 + value: http://auth-server:51511 - name: ConnectionStrings__Default - value: Server=sqlserver;Database=MsDemo_Identity;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated - Security=false + value: Server=sqlserver;Database=MsDemo_Identity;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated Security=false - name: RabbitMQ__Connections__Default__HostName value: rabbitmq - name: Redis__Configuration value: redis - image: microservice-demo/identity-service:latest + image: volosoft/microservice-demo-identity-service name: identity-service ports: - containerPort: 80 resources: {} - imagePullPolicy: Never restartPolicy: Always status: {} diff --git a/samples/MicroserviceDemo/k8s/identity-service-service.yaml b/samples/MicroserviceDemo/k8s/identity-service-service.yaml index 8c601852a3..994f120b0b 100644 --- a/samples/MicroserviceDemo/k8s/identity-service-service.yaml +++ b/samples/MicroserviceDemo/k8s/identity-service-service.yaml @@ -6,8 +6,7 @@ metadata: name: identity-service spec: ports: - - name: "63568" - port: 63568 + - port: 80 targetPort: 80 selector: io.kompose.service: identity-service diff --git a/samples/MicroserviceDemo/k8s/internal-gateway-deployment.yaml b/samples/MicroserviceDemo/k8s/internal-gateway-deployment.yaml index 4abd77f1df..9c7edf6cdb 100644 --- a/samples/MicroserviceDemo/k8s/internal-gateway-deployment.yaml +++ b/samples/MicroserviceDemo/k8s/internal-gateway-deployment.yaml @@ -19,31 +19,29 @@ spec: - name: ASPNETCORE_URLS value: http://0.0.0.0:80 - name: AuthServer__Authority - value: http://auth-server:64999 + value: http://auth-server:51511 - name: ConnectionStrings__Default - value: Server=sqlserver;Database=MsDemo_Identity;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated - Security=false + value: Server=sqlserver;Database=MsDemo_Identity;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated Security=false - name: GlobalConfiguration__BaseUrl value: http://internal-gateway - - name: ReRoutes__0__DownstreamHostAndPorts__Host + - name: ReRoutes__0__DownstreamHostAndPorts__0__Host value: identity-service - - name: ReRoutes__0__DownstreamHostAndPorts__Port + - name: ReRoutes__0__DownstreamHostAndPorts__0__Port value: "80" - - name: ReRoutes__1__DownstreamHostAndPorts__Host + - name: ReRoutes__1__DownstreamHostAndPorts__0__Host value: product-service - - name: ReRoutes__1__DownstreamHostAndPorts__Port + - name: ReRoutes__1__DownstreamHostAndPorts__0__Port value: "80" - - name: ReRoutes__2__DownstreamHostAndPorts__Host + - name: ReRoutes__2__DownstreamHostAndPorts__0__Host value: blogging-service - - name: ReRoutes__2__DownstreamHostAndPorts__Port + - name: ReRoutes__2__DownstreamHostAndPorts__0__Port value: "80" - name: Redis__Configuration value: redis - image: microservice-demo/internal-gateway:latest + image: volosoft/microservice-demo-internal-gateway name: internal-gateway ports: - containerPort: 80 resources: {} - imagePullPolicy: Never restartPolicy: Always status: {} diff --git a/samples/MicroserviceDemo/k8s/internal-gateway-service.yaml b/samples/MicroserviceDemo/k8s/internal-gateway-service.yaml index 5b392f5619..e2766c3c3a 100644 --- a/samples/MicroserviceDemo/k8s/internal-gateway-service.yaml +++ b/samples/MicroserviceDemo/k8s/internal-gateway-service.yaml @@ -6,8 +6,7 @@ metadata: name: internal-gateway spec: ports: - - name: "65129" - port: 65129 + - port: 80 targetPort: 80 selector: io.kompose.service: internal-gateway diff --git a/samples/MicroserviceDemo/k8s/migrations-deployment.yaml b/samples/MicroserviceDemo/k8s/migrations-deployment.yaml deleted file mode 100644 index bae8d1388b..0000000000 --- a/samples/MicroserviceDemo/k8s/migrations-deployment.yaml +++ /dev/null @@ -1,21 +0,0 @@ -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - labels: - io.kompose.service: migrations - name: migrations -spec: - replicas: 1 - strategy: {} - template: - metadata: - labels: - io.kompose.service: migrations - spec: - containers: - - image: microservice-demo/migrations:latest - name: migrations - resources: {} - imagePullPolicy: Never - restartPolicy: Always -status: {} diff --git a/samples/MicroserviceDemo/k8s/migrations-job.yaml b/samples/MicroserviceDemo/k8s/migrations-job.yaml deleted file mode 100644 index 257393379e..0000000000 --- a/samples/MicroserviceDemo/k8s/migrations-job.yaml +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: batch/v1 -kind: Job -metadata: - name: migrations -spec: - template: - spec: - containers: - - image: microservice-demo/migrations:latest - name: migrations - imagePullPolicy: Never - restartPolicy: Never diff --git a/samples/MicroserviceDemo/k8s/mongodb-deployment.yaml b/samples/MicroserviceDemo/k8s/mongodb-deployment.yaml index 48617c488c..938af49960 100644 --- a/samples/MicroserviceDemo/k8s/mongodb-deployment.yaml +++ b/samples/MicroserviceDemo/k8s/mongodb-deployment.yaml @@ -18,6 +18,5 @@ spec: ports: - containerPort: 27017 resources: {} - imagePullPolicy: IfNotPresent restartPolicy: Always status: {} diff --git a/samples/MicroserviceDemo/k8s/mongodb-service.yaml b/samples/MicroserviceDemo/k8s/mongodb-service.yaml index 59480974ff..34958fb121 100644 --- a/samples/MicroserviceDemo/k8s/mongodb-service.yaml +++ b/samples/MicroserviceDemo/k8s/mongodb-service.yaml @@ -6,8 +6,7 @@ metadata: name: mongodb spec: ports: - - name: "27017" - port: 27017 + - port: 27017 targetPort: 27017 selector: io.kompose.service: mongodb diff --git a/samples/MicroserviceDemo/k8s/product-service-deployment.yaml b/samples/MicroserviceDemo/k8s/product-service-deployment.yaml index 5418a8abc7..669de15ae1 100644 --- a/samples/MicroserviceDemo/k8s/product-service-deployment.yaml +++ b/samples/MicroserviceDemo/k8s/product-service-deployment.yaml @@ -19,22 +19,20 @@ spec: - name: ASPNETCORE_URLS value: http://0.0.0.0:80 - name: AuthServer__Authority - value: http://auth-server:64999 + value: http://auth-server:51511 - name: ConnectionStrings__Default value: Server=sqlserver;Database=MsDemo_Identity;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated Security=false - name: ConnectionStrings__ProductManagement - value: Server=sqlserver;Database=MsDemo_Identity;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated - Security=false + value: Server=sqlserver;Database=MsDemo_ProductManagement;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated Security=false - name: RabbitMQ__Connections__Default__HostName value: rabbitmq - name: Redis__Configuration value: redis - image: microservice-demo/product-service:latest + image: volosoft/microservice-demo-product-service name: product-service ports: - containerPort: 80 resources: {} - imagePullPolicy: Never restartPolicy: Always status: {} diff --git a/samples/MicroserviceDemo/k8s/product-service-service.yaml b/samples/MicroserviceDemo/k8s/product-service-service.yaml index 25b52f9d7c..3c5d1f333b 100644 --- a/samples/MicroserviceDemo/k8s/product-service-service.yaml +++ b/samples/MicroserviceDemo/k8s/product-service-service.yaml @@ -6,8 +6,7 @@ metadata: name: product-service spec: ports: - - name: "60244" - port: 60244 + - port: 80 targetPort: 80 selector: io.kompose.service: product-service diff --git a/samples/MicroserviceDemo/k8s/public-website-deployment.yaml b/samples/MicroserviceDemo/k8s/public-website-deployment.yaml index 3c8955a99b..c643f68b99 100644 --- a/samples/MicroserviceDemo/k8s/public-website-deployment.yaml +++ b/samples/MicroserviceDemo/k8s/public-website-deployment.yaml @@ -19,16 +19,15 @@ spec: - name: ASPNETCORE_URLS value: http://0.0.0.0:80 - name: AuthServer__Authority - value: http://auth-server:64999 + value: http://auth-server:51511 - name: Redis__Configuration value: redis - name: RemoteServices__Default__BaseUrl value: http://public-website-gateway/ - image: microservice-demo/public-website:latest + image: volosoft/microservice-demo-public-website name: public-website ports: - containerPort: 80 resources: {} - imagePullPolicy: Never restartPolicy: Always status: {} diff --git a/samples/MicroserviceDemo/k8s/public-website-gateway-deployment.yaml b/samples/MicroserviceDemo/k8s/public-website-gateway-deployment.yaml index 9532d9334f..802f12a7e3 100644 --- a/samples/MicroserviceDemo/k8s/public-website-gateway-deployment.yaml +++ b/samples/MicroserviceDemo/k8s/public-website-gateway-deployment.yaml @@ -19,27 +19,25 @@ spec: - name: ASPNETCORE_URLS value: http://0.0.0.0:80 - name: AuthServer__Authority - value: http://auth-server:64999 + value: http://auth-server:51511 - name: ConnectionStrings__Default - value: Server=sqlserver;Database=MsDemo_Identity;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated - Security=false + value: Server=sqlserver;Database=MsDemo_Identity;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated Security=false - name: GlobalConfiguration__BaseUrl value: http://public-website-gateway - - name: ReRoutes__0__DownstreamHostAndPorts__Host + - name: ReRoutes__0__DownstreamHostAndPorts__0__Host value: product-service - - name: ReRoutes__0__DownstreamHostAndPorts__Port + - name: ReRoutes__0__DownstreamHostAndPorts__0__Port value: "80" - - name: ReRoutes__1__DownstreamHostAndPorts__Host + - name: ReRoutes__1__DownstreamHostAndPorts__0__Host value: blogging-service - - name: ReRoutes__1__DownstreamHostAndPorts__Port + - name: ReRoutes__1__DownstreamHostAndPorts__0__Port value: "80" - name: Redis__Configuration value: redis - image: microservice-demo/public-website-gateway:latest + image: volosoft/microservice-demo-public-website-gateway name: public-website-gateway ports: - containerPort: 80 resources: {} - imagePullPolicy: Never restartPolicy: Always status: {} diff --git a/samples/MicroserviceDemo/k8s/public-website-gateway-service.yaml b/samples/MicroserviceDemo/k8s/public-website-gateway-service.yaml index 4c007686b7..5ab4e428b9 100644 --- a/samples/MicroserviceDemo/k8s/public-website-gateway-service.yaml +++ b/samples/MicroserviceDemo/k8s/public-website-gateway-service.yaml @@ -6,8 +6,7 @@ metadata: name: public-website-gateway spec: ports: - - name: "64897" - port: 64897 + - port: 80 targetPort: 80 selector: io.kompose.service: public-website-gateway diff --git a/samples/MicroserviceDemo/k8s/public-website-service.yaml b/samples/MicroserviceDemo/k8s/public-website-service.yaml index 77fac13ac3..5f5c4f56d9 100644 --- a/samples/MicroserviceDemo/k8s/public-website-service.yaml +++ b/samples/MicroserviceDemo/k8s/public-website-service.yaml @@ -6,8 +6,7 @@ metadata: name: public-website spec: ports: - - name: "3002" - port: 3002 + - port: 80 targetPort: 80 selector: io.kompose.service: public-website diff --git a/samples/MicroserviceDemo/k8s/rabbitmq-deployment.yaml b/samples/MicroserviceDemo/k8s/rabbitmq-deployment.yaml index 5f32e398c1..e455bebac6 100644 --- a/samples/MicroserviceDemo/k8s/rabbitmq-deployment.yaml +++ b/samples/MicroserviceDemo/k8s/rabbitmq-deployment.yaml @@ -19,6 +19,5 @@ spec: - containerPort: 5672 - containerPort: 15672 resources: {} - imagePullPolicy: IfNotPresent restartPolicy: Always status: {} diff --git a/samples/MicroserviceDemo/k8s/redis-deployment.yaml b/samples/MicroserviceDemo/k8s/redis-deployment.yaml index b4389df699..35d9973110 100644 --- a/samples/MicroserviceDemo/k8s/redis-deployment.yaml +++ b/samples/MicroserviceDemo/k8s/redis-deployment.yaml @@ -18,6 +18,5 @@ spec: ports: - containerPort: 6379 resources: {} - imagePullPolicy: IfNotPresent restartPolicy: Always status: {} diff --git a/samples/MicroserviceDemo/k8s/redis-service.yaml b/samples/MicroserviceDemo/k8s/redis-service.yaml index 702eaab08c..8ef5014d20 100644 --- a/samples/MicroserviceDemo/k8s/redis-service.yaml +++ b/samples/MicroserviceDemo/k8s/redis-service.yaml @@ -6,8 +6,7 @@ metadata: name: redis spec: ports: - - name: "6379" - port: 6379 + - port: 6379 targetPort: 6379 selector: io.kompose.service: redis diff --git a/samples/MicroserviceDemo/k8s/restore-database-job.yaml b/samples/MicroserviceDemo/k8s/restore-database-job.yaml new file mode 100644 index 0000000000..b35b67844f --- /dev/null +++ b/samples/MicroserviceDemo/k8s/restore-database-job.yaml @@ -0,0 +1,23 @@ +apiVersion: batch/v1 +kind: Job +metadata: + name: restore-database +spec: + template: + metadata: + name: restore-database + spec: + containers: + - env: + - name: SA_PASSWORD + value: yourStrong(!)Password + name: restore-database + image: volosoft/microservice-demo-restore-database + volumeMounts: + - mountPath: /var/opt/mssql + name: dbdata + volumes: + - name: dbdata + persistentVolumeClaim: + claimName: dbdata + restartPolicy: Never \ No newline at end of file diff --git a/samples/MicroserviceDemo/k8s/sqlserver-deployment.yaml b/samples/MicroserviceDemo/k8s/sqlserver-deployment.yaml index 568f29ab4d..1de273530e 100644 --- a/samples/MicroserviceDemo/k8s/sqlserver-deployment.yaml +++ b/samples/MicroserviceDemo/k8s/sqlserver-deployment.yaml @@ -24,7 +24,6 @@ spec: ports: - containerPort: 1433 resources: {} - imagePullPolicy: IfNotPresent volumeMounts: - mountPath: /var/opt/mssql name: dbdata diff --git a/samples/MicroserviceDemo/k8s/sqlserver-service.yaml b/samples/MicroserviceDemo/k8s/sqlserver-service.yaml index 57e77a1b42..da4a98c85a 100644 --- a/samples/MicroserviceDemo/k8s/sqlserver-service.yaml +++ b/samples/MicroserviceDemo/k8s/sqlserver-service.yaml @@ -6,8 +6,7 @@ metadata: name: sqlserver spec: ports: - - name: "1433" - port: 1433 + - port: 1433 targetPort: 1433 selector: io.kompose.service: sqlserver From 8f84e72ecf698b45d44f98b03fdcab6426a0ea7d Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Mon, 4 Mar 2019 17:46:41 +0300 Subject: [PATCH 013/111] Added validation and type for features. --- .../Volo.Abp.Features.csproj | 1 + .../Volo/Abp/Features/AbpFeaturesModule.cs | 4 +- .../Volo/Abp/Features/FeatureDefinition.cs | 20 ++++- .../Abp/Features/FeatureGroupDefinition.cs | 3 + .../StringValues/AlwaysValidValueValidator.cs | 14 ++++ .../StringValues/BooleanValueValidator.cs | 24 ++++++ .../StringValues/FreeTextStringValueType.cs | 19 +++++ .../StringValues/ISelectionStringValueItem.cs | 9 +++ .../ISelectionStringValueItemSource.cs | 9 +++ .../StringValues/IStringValueType.cs | 18 +++++ .../StringValues/IValueValidator.cs | 18 +++++ .../LocalizableSelectionStringValueItem.cs | 9 +++ .../StringValues/LocalizableStringInfo.cs | 15 ++++ .../StringValues/NumericValueValidator.cs | 61 ++++++++++++++ .../StringValues/SelectionStringValueType.cs | 22 ++++++ .../StaticSelectionStringValueItemSource.cs | 14 ++++ .../StringValues/StringValueTypeAttribute.cs | 27 +++++++ .../StringValues/StringValueTypeBase.cs | 31 ++++++++ .../StringValues/StringValueValidator.cs | 79 +++++++++++++++++++ .../StringValues/ToggleStringValueType.cs | 21 +++++ .../StringValues/ValueValidatorAttribute.cs | 27 +++++++ .../StringValues/ValueValidatorBase.cs | 26 ++++++ 22 files changed, 467 insertions(+), 4 deletions(-) create mode 100644 framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/AlwaysValidValueValidator.cs create mode 100644 framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/BooleanValueValidator.cs create mode 100644 framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/FreeTextStringValueType.cs create mode 100644 framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/ISelectionStringValueItem.cs create mode 100644 framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/ISelectionStringValueItemSource.cs create mode 100644 framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/IStringValueType.cs create mode 100644 framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/IValueValidator.cs create mode 100644 framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/LocalizableSelectionStringValueItem.cs create mode 100644 framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/LocalizableStringInfo.cs create mode 100644 framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/NumericValueValidator.cs create mode 100644 framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/SelectionStringValueType.cs create mode 100644 framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/StaticSelectionStringValueItemSource.cs create mode 100644 framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/StringValueTypeAttribute.cs create mode 100644 framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/StringValueTypeBase.cs create mode 100644 framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/StringValueValidator.cs create mode 100644 framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/ToggleStringValueType.cs create mode 100644 framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/ValueValidatorAttribute.cs create mode 100644 framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/ValueValidatorBase.cs diff --git a/framework/src/Volo.Abp.Features/Volo.Abp.Features.csproj b/framework/src/Volo.Abp.Features/Volo.Abp.Features.csproj index e626a34a9f..fc59bfaa9f 100644 --- a/framework/src/Volo.Abp.Features/Volo.Abp.Features.csproj +++ b/framework/src/Volo.Abp.Features/Volo.Abp.Features.csproj @@ -16,6 +16,7 @@ + diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs index 9065651b3b..8730c04591 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs @@ -4,12 +4,14 @@ using System.Collections.Generic; using Volo.Abp.Localization; using Volo.Abp.Modularity; using Volo.Abp.MultiTenancy; +using Volo.Abp.Validation; namespace Volo.Abp.Features { [DependsOn( typeof(AbpLocalizationAbstractionsModule), - typeof(AbpMultiTenancyAbstractionsModule) + typeof(AbpMultiTenancyAbstractionsModule), + typeof(AbpValidationModule) )] public class AbpFeaturesModule : AbpModule { diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureDefinition.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureDefinition.cs index 6a1c030b21..bd79480326 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureDefinition.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureDefinition.cs @@ -3,6 +3,7 @@ using System.Collections.Immutable; using System.Linq; using JetBrains.Annotations; using Volo.Abp.Localization; +using Volo.Abp.Validation.StringValues; namespace Volo.Abp.Features { @@ -29,6 +30,7 @@ namespace Volo.Abp.Features /// Parent of this feature, if one exists. /// If set, this feature can be enabled only if the parent is enabled. /// + [CanBeNull] public FeatureDefinition Parent { get; private set; } /// @@ -53,6 +55,7 @@ namespace Volo.Abp.Features /// A list of allowed providers to get/set value of this feature. /// An empty list indicates that all providers are allowed. /// + [NotNull] public List AllowedProviders { get; } /// @@ -63,6 +66,7 @@ namespace Volo.Abp.Features /// Returns the value in the dictionary by given . /// Returns null if given is not present in the dictionary. /// + [CanBeNull] public object this[string name] { get => Properties.GetOrDefault(name); @@ -75,20 +79,28 @@ namespace Volo.Abp.Features [NotNull] public Dictionary Properties { get; } - //TODO: Implement input type like old ABP! + /// + /// Input type. + /// This can be used to prepare an input for changing this feature's value. + /// Default: . + /// + [CanBeNull] + public IStringValueType ValueType { get; set; } public FeatureDefinition( string name, string defaultValue = null, ILocalizableString displayName = null, ILocalizableString description = null, + IStringValueType valueType = null, bool isVisibleToClients = true) { Name = name; DefaultValue = defaultValue; - IsVisibleToClients = isVisibleToClients; DisplayName = displayName ?? new FixedLocalizableString(name); Description = description; + ValueType = valueType; + IsVisibleToClients = isVisibleToClients; Properties = new Dictionary(); AllowedProviders = new List(); @@ -128,13 +140,15 @@ namespace Volo.Abp.Features string defaultValue = null, ILocalizableString displayName = null, ILocalizableString description = null, + IStringValueType valueType = null, bool isVisibleToClients = true) { var feature = new FeatureDefinition( name, defaultValue, displayName, - description, + description, + valueType, isVisibleToClients) { Parent = this diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureGroupDefinition.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureGroupDefinition.cs index 4d0ccbba62..cba38070a7 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureGroupDefinition.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureGroupDefinition.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Collections.Immutable; using Volo.Abp.Localization; +using Volo.Abp.Validation.StringValues; namespace Volo.Abp.Features { @@ -53,6 +54,7 @@ namespace Volo.Abp.Features string defaultValue = null, ILocalizableString displayName = null, ILocalizableString description = null, + IStringValueType valueType = null, bool isVisibleToClients = true) { var feature = new FeatureDefinition( @@ -60,6 +62,7 @@ namespace Volo.Abp.Features defaultValue, displayName, description, + valueType, isVisibleToClients ); diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/AlwaysValidValueValidator.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/AlwaysValidValueValidator.cs new file mode 100644 index 0000000000..ec444bd62b --- /dev/null +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/AlwaysValidValueValidator.cs @@ -0,0 +1,14 @@ +using System; + +namespace Volo.Abp.Validation.StringValues +{ + [Serializable] + [ValueValidator("NULL")] + public class AlwaysValidValueValidator : ValueValidatorBase + { + public override bool IsValid(object value) + { + return true; + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/BooleanValueValidator.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/BooleanValueValidator.cs new file mode 100644 index 0000000000..41c52894cd --- /dev/null +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/BooleanValueValidator.cs @@ -0,0 +1,24 @@ +using System; + +namespace Volo.Abp.Validation.StringValues +{ + [Serializable] + [ValueValidator("BOOLEAN")] + public class BooleanValueValidator : ValueValidatorBase + { + public override bool IsValid(object value) + { + if (value == null) + { + return false; + } + + if (value is bool) + { + return true; + } + + return bool.TryParse(value.ToString(), out _); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/FreeTextStringValueType.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/FreeTextStringValueType.cs new file mode 100644 index 0000000000..c02f617b48 --- /dev/null +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/FreeTextStringValueType.cs @@ -0,0 +1,19 @@ +using System; + +namespace Volo.Abp.Validation.StringValues +{ + [Serializable] + [StringValueType("FREE_TEXT")] + public class FreeTextStringValueType : StringValueTypeBase + { + public FreeTextStringValueType() + { + + } + + public FreeTextStringValueType(IValueValidator validator) + : base(validator) + { + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/ISelectionStringValueItem.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/ISelectionStringValueItem.cs new file mode 100644 index 0000000000..1dd69158c7 --- /dev/null +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/ISelectionStringValueItem.cs @@ -0,0 +1,9 @@ +namespace Volo.Abp.Validation.StringValues +{ + public interface ISelectionStringValueItem + { + string Value { get; set; } + + LocalizableStringInfo DisplayText { get; set; } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/ISelectionStringValueItemSource.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/ISelectionStringValueItemSource.cs new file mode 100644 index 0000000000..563503a05d --- /dev/null +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/ISelectionStringValueItemSource.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Volo.Abp.Validation.StringValues +{ + public interface ISelectionStringValueItemSource + { + ICollection Items { get; } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/IStringValueType.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/IStringValueType.cs new file mode 100644 index 0000000000..674b6e55f9 --- /dev/null +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/IStringValueType.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using JetBrains.Annotations; + +namespace Volo.Abp.Validation.StringValues +{ + public interface IStringValueType + { + string Name { get; } + + [CanBeNull] + object this[string key] { get; set; } + + [NotNull] + Dictionary Properties { get; } + + IValueValidator Validator { get; set; } + } +} diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/IValueValidator.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/IValueValidator.cs new file mode 100644 index 0000000000..afcacb3e34 --- /dev/null +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/IValueValidator.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using JetBrains.Annotations; + +namespace Volo.Abp.Validation.StringValues +{ + public interface IValueValidator + { + string Name { get; } + + [CanBeNull] + object this[string key] { get; set; } + + [NotNull] + IDictionary Properties { get; } + + bool IsValid(object value); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/LocalizableSelectionStringValueItem.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/LocalizableSelectionStringValueItem.cs new file mode 100644 index 0000000000..716c9e0e1c --- /dev/null +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/LocalizableSelectionStringValueItem.cs @@ -0,0 +1,9 @@ +namespace Volo.Abp.Validation.StringValues +{ + public class LocalizableSelectionStringValueItem : ISelectionStringValueItem + { + public string Value { get; set; } + + public LocalizableStringInfo DisplayText { get; set; } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/LocalizableStringInfo.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/LocalizableStringInfo.cs new file mode 100644 index 0000000000..f4359c967f --- /dev/null +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/LocalizableStringInfo.cs @@ -0,0 +1,15 @@ +namespace Volo.Abp.Validation.StringValues +{ + public class LocalizableStringInfo + { + public string ResourceName { get; } + + public string Name { get; } + + public LocalizableStringInfo(string resourceName, string name) + { + ResourceName = resourceName; + Name = name; + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/NumericValueValidator.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/NumericValueValidator.cs new file mode 100644 index 0000000000..e1b1972258 --- /dev/null +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/NumericValueValidator.cs @@ -0,0 +1,61 @@ +using System; + +namespace Volo.Abp.Validation.StringValues +{ + [Serializable] + [ValueValidator("NUMERIC")] + public class NumericValueValidator : ValueValidatorBase + { + public int MinValue + { + get => (this["MinValue"] ?? "0").To(); + set => this["MinValue"] = value; + } + + public int MaxValue + { + get => (this["MaxValue"] ?? "0").To(); + set => this["MaxValue"] = value; + } + + public NumericValueValidator() + { + + } + + public NumericValueValidator(int minValue = int.MinValue, int maxValue = int.MaxValue) + { + MinValue = minValue; + MaxValue = maxValue; + } + + public override bool IsValid(object value) + { + if (value == null) + { + return false; + } + + if (value is int) + { + return IsValidInternal((int)value); + } + + if (value is string) + { + int intValue; + if (int.TryParse(value as string, out intValue)) + { + return IsValidInternal(intValue); + } + } + + return false; + } + + protected virtual bool IsValidInternal(int value) + { + return value.IsBetween(MinValue, MaxValue); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/SelectionStringValueType.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/SelectionStringValueType.cs new file mode 100644 index 0000000000..e2d4ecbc99 --- /dev/null +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/SelectionStringValueType.cs @@ -0,0 +1,22 @@ +using System; + +namespace Volo.Abp.Validation.StringValues +{ + [Serializable] + [StringValueType("SELECTION")] + public class SelectionStringValueType : StringValueTypeBase + { + public ISelectionStringValueItemSource ItemSource { get; set; } + + public SelectionStringValueType() + { + + } + + public SelectionStringValueType(IValueValidator validator) + : base(validator) + { + + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/StaticSelectionStringValueItemSource.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/StaticSelectionStringValueItemSource.cs new file mode 100644 index 0000000000..de0fed9879 --- /dev/null +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/StaticSelectionStringValueItemSource.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; + +namespace Volo.Abp.Validation.StringValues +{ + public class StaticSelectionStringValueItemSource : ISelectionStringValueItemSource + { + public ICollection Items { get; } + + public StaticSelectionStringValueItemSource(params ISelectionStringValueItem[] items) + { + Items = Check.NotNullOrEmpty(items, nameof(items)); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/StringValueTypeAttribute.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/StringValueTypeAttribute.cs new file mode 100644 index 0000000000..5fa8bef1ae --- /dev/null +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/StringValueTypeAttribute.cs @@ -0,0 +1,27 @@ +using System; +using System.Linq; +using System.Reflection; + +namespace Volo.Abp.Validation.StringValues +{ + [AttributeUsage(AttributeTargets.Class)] + public class StringValueTypeAttribute : Attribute + { + public string Name { get; set; } + + public StringValueTypeAttribute(string name) + { + Name = name; + } + + public static string GetName(Type type) + { + if (type.IsDefined(typeof(StringValueTypeAttribute))) + { + return type.GetCustomAttributes(typeof(StringValueTypeAttribute)).Cast().First().Name; + } + + return type.Name; + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/StringValueTypeBase.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/StringValueTypeBase.cs new file mode 100644 index 0000000000..c6fd80fc13 --- /dev/null +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/StringValueTypeBase.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; + +namespace Volo.Abp.Validation.StringValues +{ + public abstract class StringValueTypeBase : IStringValueType + { + public virtual string Name => ValueValidatorAttribute.GetName(GetType()); + + public object this[string key] + { + get => Properties.GetOrDefault(key); + set => Properties[key] = value; + } + + public Dictionary Properties { get; } + + public IValueValidator Validator { get; set; } + + protected StringValueTypeBase() + : this(new AlwaysValidValueValidator()) + { + + } + + protected StringValueTypeBase(IValueValidator validator) + { + Validator = validator; + Properties = new Dictionary(); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/StringValueValidator.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/StringValueValidator.cs new file mode 100644 index 0000000000..3edc176b0c --- /dev/null +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/StringValueValidator.cs @@ -0,0 +1,79 @@ +using System; +using System.Text.RegularExpressions; + +namespace Volo.Abp.Validation.StringValues +{ + [Serializable] + [ValueValidator("STRING")] + public class StringValueValidator : ValueValidatorBase + { + public bool AllowNull + { + get => (this["AllowNull"] ?? "false").To(); + set => this["AllowNull"] = value.ToString().ToLowerInvariant(); + } + + public int MinLength + { + get => (this["MinLength"] ?? "0").To(); + set => this["MinLength"] = value; + } + + public int MaxLength + { + get => (this["MaxLength"] ?? "0").To(); + set => this["MaxLength"] = value; + } + + public string RegularExpression + { + get => this["RegularExpression"] as string; + set => this["RegularExpression"] = value; + } + + public StringValueValidator() + { + + } + + public StringValueValidator(int minLength = 0, int maxLength = 0, string regularExpression = null, bool allowNull = false) + { + MinLength = minLength; + MaxLength = maxLength; + RegularExpression = regularExpression; + AllowNull = allowNull; + } + + public override bool IsValid(object value) + { + if (value == null) + { + return AllowNull; + } + + if (!(value is string)) + { + return false; + } + + var strValue = value as string; + + if (MinLength > 0 && strValue.Length < MinLength) + { + return false; + } + + if (MaxLength > 0 && strValue.Length > MaxLength) + { + return false; + } + + if (!RegularExpression.IsNullOrEmpty()) + { + return Regex.IsMatch(strValue, RegularExpression); + } + + return true; + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/ToggleStringValueType.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/ToggleStringValueType.cs new file mode 100644 index 0000000000..a262630766 --- /dev/null +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/ToggleStringValueType.cs @@ -0,0 +1,21 @@ +using System; + +namespace Volo.Abp.Validation.StringValues +{ + [Serializable] + [StringValueType("TOGGLE")] + public class ToggleStringValueType : StringValueTypeBase + { + public ToggleStringValueType() + : this(new BooleanValueValidator()) + { + + } + + public ToggleStringValueType(IValueValidator validator) + : base(validator) + { + + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/ValueValidatorAttribute.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/ValueValidatorAttribute.cs new file mode 100644 index 0000000000..6f40ad0651 --- /dev/null +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/ValueValidatorAttribute.cs @@ -0,0 +1,27 @@ +using System; +using System.Linq; +using System.Reflection; + +namespace Volo.Abp.Validation.StringValues +{ + [AttributeUsage(AttributeTargets.Class)] + public class ValueValidatorAttribute : Attribute + { + public string Name { get; set; } + + public ValueValidatorAttribute(string name) + { + Name = name; + } + + public static string GetName(Type type) + { + if (type.IsDefined(typeof(ValueValidatorAttribute))) + { + return type.GetCustomAttributes(typeof(ValueValidatorAttribute)).Cast().First().Name; + } + + return type.Name; + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/ValueValidatorBase.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/ValueValidatorBase.cs new file mode 100644 index 0000000000..ee91089fd4 --- /dev/null +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/StringValues/ValueValidatorBase.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; + +namespace Volo.Abp.Validation.StringValues +{ + [Serializable] + public abstract class ValueValidatorBase : IValueValidator + { + public virtual string Name => ValueValidatorAttribute.GetName(GetType()); + + public object this[string key] + { + get => Properties.GetOrDefault(key); + set => Properties[key] = value; + } + + public IDictionary Properties { get; } + + protected ValueValidatorBase() + { + Properties = new Dictionary(); + } + + public abstract bool IsValid(object value); + } +} \ No newline at end of file From d7529651e899c85cc59e4bb3d2f5e459d904922d Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Mon, 4 Mar 2019 18:01:46 +0300 Subject: [PATCH 014/111] Add and fill Features for ApplicationConfigurationDto --- .../ApplicationConfigurationDto.cs | 2 ++ .../ApplicationFeatureConfigurationDto.cs | 9 ++++++ .../Volo/Abp/AspNetCore/Mvc/AbpController.cs | 5 +++- .../AbpApplicationConfigurationAppService.cs | 30 +++++++++++++++++-- 4 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationFeatureConfigurationDto.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationDto.cs index 6f41399c29..44e9076751 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationDto.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationConfigurationDto.cs @@ -12,5 +12,7 @@ namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations public ApplicationSettingConfigurationDto Setting { get; set; } public CurrentUserDto CurrentUser { get; set; } + + public ApplicationFeatureConfigurationDto Features { get; set; } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationFeatureConfigurationDto.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationFeatureConfigurationDto.cs new file mode 100644 index 0000000000..8917e3dcfa --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Contracts/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/ApplicationFeatureConfigurationDto.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations +{ + public class ApplicationFeatureConfigurationDto + { + public Dictionary Values { get; set; } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpController.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpController.cs index e9e535c4be..48917ecd8b 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpController.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpController.cs @@ -5,6 +5,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Volo.Abp.Aspects; using Volo.Abp.AspNetCore.Mvc.Validation; +using Volo.Abp.Features; using Volo.Abp.Guids; using Volo.Abp.MultiTenancy; using Volo.Abp.ObjectMapping; @@ -33,7 +34,9 @@ namespace Volo.Abp.AspNetCore.Mvc public IClock Clock { get; set; } public IModelStateValidator ModelValidator { get; set; } - + + public IFeatureChecker FeatureChecker { get; set; } + public List AppliedCrossCuttingConcerns { get; } = new List(); protected virtual void ValidateModel() diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs index 086fbf1d72..2ea9282a91 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApplicationConfigurations/AbpApplicationConfigurationAppService.cs @@ -4,10 +4,10 @@ using Microsoft.Extensions.Localization; using Microsoft.Extensions.Options; using System; using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; using Volo.Abp.Application.Services; using Volo.Abp.Authorization; +using Volo.Abp.Features; using Volo.Abp.Localization; using Volo.Abp.Settings; using Volo.Abp.Users; @@ -23,6 +23,7 @@ namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations private readonly ICurrentUser _currentUser; private readonly ISettingProvider _settingProvider; private readonly ISettingDefinitionManager _settingDefinitionManager; + private readonly IFeatureDefinitionManager _featureDefinitionManager; public AbpApplicationConfigurationAppService( IOptions localizationOptions, @@ -31,7 +32,8 @@ namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations IAuthorizationService authorizationService, ICurrentUser currentUser, ISettingProvider settingProvider, - SettingDefinitionManager settingDefinitionManager) + SettingDefinitionManager settingDefinitionManager, + IFeatureDefinitionManager featureDefinitionManager) { _serviceProvider = serviceProvider; _abpAuthorizationPolicyProvider = abpAuthorizationPolicyProvider; @@ -39,16 +41,18 @@ namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations _currentUser = currentUser; _settingProvider = settingProvider; _settingDefinitionManager = settingDefinitionManager; + _featureDefinitionManager = featureDefinitionManager; _localizationOptions = localizationOptions.Value; } - public async Task GetAsync() + public virtual async Task GetAsync() { //TODO: Optimize & cache..? return new ApplicationConfigurationDto { Auth = await GetAuthConfigAsync(), + Features = await GetFeaturesConfigAsync(), Localization = GetLocalizationConfig(), CurrentUser = GetCurrentUser(), Setting = await GetSettingConfigAsync() @@ -126,5 +130,25 @@ namespace Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations return result; } + + protected virtual async Task GetFeaturesConfigAsync() + { + var result = new ApplicationFeatureConfigurationDto + { + Values = new Dictionary() + }; + + foreach (var featureDefinition in _featureDefinitionManager.GetAll()) + { + if (!featureDefinition.IsVisibleToClients) + { + continue; + } + + result.Values[featureDefinition.Name] = await FeatureChecker.GetOrNullAsync(featureDefinition.Name); + } + + return result; + } } } \ No newline at end of file From f027760400089fbb5b778c1add09ced6f825f20c Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Mon, 4 Mar 2019 18:04:58 +0300 Subject: [PATCH 015/111] Implemented RemoteFeatureChecker. --- .../Mvc/Client/RemoteFeatureChecker.cs | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/RemoteFeatureChecker.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/RemoteFeatureChecker.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/RemoteFeatureChecker.cs new file mode 100644 index 0000000000..0643620ec9 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/RemoteFeatureChecker.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using Volo.Abp.Features; + +namespace Volo.Abp.AspNetCore.Mvc.Client +{ + public class RemoteFeatureChecker : FeatureCheckerBase + { + protected ICachedApplicationConfigurationClient ConfigurationClient { get; } + + public RemoteFeatureChecker(ICachedApplicationConfigurationClient configurationClient) + { + ConfigurationClient = configurationClient; + } + + public override async Task GetOrNullAsync(string name) + { + var configuration = await ConfigurationClient.GetAsync(); + return configuration.Features.Values.GetOrDefault(name); + } + } +} From e5d1d8f623e9615930a18b865e6436b302eeeb46 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Mon, 4 Mar 2019 18:34:18 +0300 Subject: [PATCH 016/111] Remove IAuthorizationEnabled. Auth and feature refactor. --- .../AuthorizationInterceptorRegistrar.cs | 26 +++++++++++++++++-- .../Authorization/IAuthorizationEnabled.cs | 7 ----- .../MethodInvocationAuthorizationService.cs | 25 +++++++++++------- .../Application/AbpDddApplicationModule.cs | 1 - .../Services/ApplicationService.cs | 1 - .../Volo/Abp/Features/FeatureInterceptor.cs | 8 +++--- .../Features/FeatureInterceptorRegistrar.cs | 4 +-- .../MethodInvocationFeatureCheckerService.cs | 24 +++++++++++------ 8 files changed, 62 insertions(+), 34 deletions(-) delete mode 100644 framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/IAuthorizationEnabled.cs diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AuthorizationInterceptorRegistrar.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AuthorizationInterceptorRegistrar.cs index 76a12b6dfe..69a285ddc8 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AuthorizationInterceptorRegistrar.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AuthorizationInterceptorRegistrar.cs @@ -1,4 +1,8 @@ -using Volo.Abp.DependencyInjection; +using System; +using System.Linq; +using System.Reflection; +using Microsoft.AspNetCore.Authorization; +using Volo.Abp.DependencyInjection; namespace Volo.Abp.Authorization { @@ -6,10 +10,28 @@ namespace Volo.Abp.Authorization { public static void RegisterIfNeeded(IOnServiceRegistredContext context) { - if (typeof(IAuthorizationEnabled).IsAssignableFrom(context.ImplementationType)) + if (ShouldIntercept(context.ImplementationType)) { context.Interceptors.TryAdd(); } } + + private static bool ShouldIntercept(Type type) + { + return type.IsDefined(typeof(AuthorizeAttribute), true) || + AnyMethodHasAuthorizeAttribute(type); + } + + private static bool AnyMethodHasAuthorizeAttribute(Type implementationType) + { + return implementationType + .GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) + .Any(HasAuthorizeAttribute); + } + + private static bool HasAuthorizeAttribute(MemberInfo methodInfo) + { + return methodInfo.IsDefined(typeof(AuthorizeAttribute), true); + } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/IAuthorizationEnabled.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/IAuthorizationEnabled.cs deleted file mode 100644 index 8563a98a8c..0000000000 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/IAuthorizationEnabled.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Volo.Abp.Authorization -{ - public interface IAuthorizationEnabled - { - - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/MethodInvocationAuthorizationService.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/MethodInvocationAuthorizationService.cs index 1cca959ebe..56baba8ce4 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/MethodInvocationAuthorizationService.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/MethodInvocationAuthorizationService.cs @@ -1,4 +1,6 @@ -using System.Linq; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Volo.Abp.Clients; @@ -30,8 +32,7 @@ namespace Volo.Abp.Authorization return; } - var authorizationAttributes = GetAuthorizationDataAttributes(context); - foreach (var authorizationAttribute in authorizationAttributes) + foreach (var authorizationAttribute in GetAuthorizationDataAttributes(context.Method)) { await CheckAsync(authorizationAttribute); } @@ -42,17 +43,23 @@ namespace Volo.Abp.Authorization return context.Method.GetCustomAttributes(true).OfType().Any(); } - protected virtual IAuthorizeData[] GetAuthorizationDataAttributes(MethodInvocationAuthorizationContext context) + protected virtual IEnumerable GetAuthorizationDataAttributes(MethodInfo methodInfo) { - var classAttributes = context.Method.DeclaringType + var attributes = methodInfo .GetCustomAttributes(true) .OfType(); - var methodAttributes = context.Method - .GetCustomAttributes(true) - .OfType(); + if (methodInfo.IsPublic) + { + attributes = attributes + .Union( + methodInfo.DeclaringType + .GetCustomAttributes(true) + .OfType() + ); + } - return classAttributes.Union(methodAttributes).ToArray(); + return attributes; } protected async Task CheckAsync(IAuthorizeData authorizationAttribute) diff --git a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/AbpDddApplicationModule.cs b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/AbpDddApplicationModule.cs index fcdc29c454..e5ade49532 100644 --- a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/AbpDddApplicationModule.cs +++ b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/AbpDddApplicationModule.cs @@ -33,7 +33,6 @@ namespace Volo.Abp.Application options.IgnoredInterfaces.AddIfNotContains(typeof(IRemoteService)); options.IgnoredInterfaces.AddIfNotContains(typeof(IApplicationService)); options.IgnoredInterfaces.AddIfNotContains(typeof(IUnitOfWorkEnabled)); - options.IgnoredInterfaces.AddIfNotContains(typeof(IAuthorizationEnabled)); }); } } diff --git a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/ApplicationService.cs b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/ApplicationService.cs index b4f53aff0a..48865f38f2 100644 --- a/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/ApplicationService.cs +++ b/framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/Services/ApplicationService.cs @@ -26,7 +26,6 @@ namespace Volo.Abp.Application.Services IAvoidDuplicateCrossCuttingConcerns, IValidationEnabled, IUnitOfWorkEnabled, - IAuthorizationEnabled, IAuditingEnabled, ITransientDependency { diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureInterceptor.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureInterceptor.cs index 2f684d99ef..a0b15674f6 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureInterceptor.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureInterceptor.cs @@ -8,12 +8,12 @@ namespace Volo.Abp.Features { public class FeatureInterceptor : AbpInterceptor, ITransientDependency { - private readonly IMethodInvocationFeatureCheckerService _methodInvocationAuthorizationService; + private readonly IMethodInvocationFeatureCheckerService _methodInvocationFeatureCheckerService; public FeatureInterceptor( - IMethodInvocationFeatureCheckerService methodInvocationAuthorizationService) + IMethodInvocationFeatureCheckerService methodInvocationFeatureCheckerService) { - _methodInvocationAuthorizationService = methodInvocationAuthorizationService; + _methodInvocationFeatureCheckerService = methodInvocationFeatureCheckerService; } public override void Intercept(IAbpMethodInvocation invocation) @@ -46,7 +46,7 @@ namespace Volo.Abp.Features protected virtual Task CheckFeaturesAsync(IAbpMethodInvocation invocation) { - return _methodInvocationAuthorizationService.CheckAsync( + return _methodInvocationFeatureCheckerService.CheckAsync( new MethodInvocationFeatureCheckerContext( invocation.Method ) diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureInterceptorRegistrar.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureInterceptorRegistrar.cs index 4ad03c9aff..8cb6cd7ea5 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureInterceptorRegistrar.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureInterceptorRegistrar.cs @@ -18,10 +18,10 @@ namespace Volo.Abp.Features private static bool ShouldIntercept(Type type) { return type.IsDefined(typeof(RequiresFeatureAttribute), true) || - AnyMethodRequiresFeatureAttribute(type); + AnyMethodHasRequiresFeatureAttribute(type); } - private static bool AnyMethodRequiresFeatureAttribute(Type implementationType) + private static bool AnyMethodHasRequiresFeatureAttribute(Type implementationType) { return implementationType .GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/MethodInvocationFeatureCheckerService.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/MethodInvocationFeatureCheckerService.cs index 28ac25fdd5..da7becc61f 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/MethodInvocationFeatureCheckerService.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/MethodInvocationFeatureCheckerService.cs @@ -1,4 +1,6 @@ -using System.Linq; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; using System.Threading.Tasks; using Volo.Abp.DependencyInjection; @@ -21,7 +23,7 @@ namespace Volo.Abp.Features return; } - foreach (var requiresFeatureAttribute in GetRequiredFeatureAttributes(context)) + foreach (var requiresFeatureAttribute in GetRequiredFeatureAttributes(context.Method)) { await _featureChecker.CheckEnabledAsync(requiresFeatureAttribute.RequiresAll, requiresFeatureAttribute.Features); } @@ -35,17 +37,23 @@ namespace Volo.Abp.Features .Any(); } - protected virtual RequiresFeatureAttribute[] GetRequiredFeatureAttributes(MethodInvocationFeatureCheckerContext context) + protected virtual IEnumerable GetRequiredFeatureAttributes(MethodInfo methodInfo) { - var classAttributes = context.Method.DeclaringType + var attributes = methodInfo .GetCustomAttributes(true) .OfType(); - var methodAttributes = context.Method - .GetCustomAttributes(true) - .OfType(); + if (methodInfo.IsPublic) + { + attributes = attributes + .Union( + methodInfo.DeclaringType + .GetCustomAttributes(true) + .OfType() + ); + } - return classAttributes.Union(methodAttributes).ToArray(); + return attributes; } } } \ No newline at end of file From 9284252ce2318a826438c18a50229957c2583173 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Mon, 4 Mar 2019 19:19:21 +0300 Subject: [PATCH 017/111] Remove AbpSettingManagementDomainModule dependency. --- .../Volo.Abp.Identity.Domain/Volo.Abp.Identity.Domain.csproj | 2 -- .../Volo/Abp/Identity/AbpIdentityDomainModule.cs | 5 +---- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo.Abp.Identity.Domain.csproj b/modules/identity/src/Volo.Abp.Identity.Domain/Volo.Abp.Identity.Domain.csproj index 733c9195c6..2d7948e20d 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo.Abp.Identity.Domain.csproj +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo.Abp.Identity.Domain.csproj @@ -23,8 +23,6 @@ - - diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityDomainModule.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityDomainModule.cs index 3572acdaa7..067c0b43c9 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityDomainModule.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/AbpIdentityDomainModule.cs @@ -7,8 +7,6 @@ using Volo.Abp.EventBus.Distributed; using Volo.Abp.Identity.Localization; using Volo.Abp.Localization; using Volo.Abp.Modularity; -using Volo.Abp.SettingManagement; -using Volo.Abp.Settings; using Volo.Abp.Users; using Volo.Abp.VirtualFileSystem; @@ -17,8 +15,7 @@ namespace Volo.Abp.Identity [DependsOn( typeof(AbpDddDomainModule), typeof(AbpIdentityDomainSharedModule), - typeof(AbpUsersDomainModule), - typeof(AbpSettingManagementDomainModule) + typeof(AbpUsersDomainModule) )] public class AbpIdentityDomainModule : AbpModule { From 6ee3a94b310c39d15b1ed0a86a39667e2fb88ed0 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Mon, 4 Mar 2019 19:20:22 +0300 Subject: [PATCH 018/111] Use ISettingProvider instead of ISettingManager --- .../Pages/Identity/Shared/PersonalSettingsModal.cshtml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Shared/PersonalSettingsModal.cshtml b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Shared/PersonalSettingsModal.cshtml index 29a0600148..4c18be54eb 100644 --- a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Shared/PersonalSettingsModal.cshtml +++ b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Shared/PersonalSettingsModal.cshtml @@ -7,11 +7,11 @@ @using Volo.Abp.Settings @model PersonalSettingsModal @inject IHtmlLocalizer L -@inject ISettingManager SettingManager +@inject ISettingProvider SettingProvider @{ Layout = null; - var isUserNameUpdateEnabled = await SettingManager.IsTrueAsync(IdentitySettingNames.User.IsUserNameUpdateEnabled); - var isEmailUpdateEnabled = await SettingManager.IsTrueAsync(IdentitySettingNames.User.IsEmailUpdateEnabled); + var isUserNameUpdateEnabled = await SettingProvider.IsTrueAsync(IdentitySettingNames.User.IsUserNameUpdateEnabled); + var isEmailUpdateEnabled = await SettingProvider.IsTrueAsync(IdentitySettingNames.User.IsEmailUpdateEnabled); }
From 23a86a10ece68aca672ffdcbd264430182c89576 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 5 Mar 2019 11:10:51 +0800 Subject: [PATCH 019/111] Get it before filtering the post tag. --- .../Volo/Blogging/Posts/PostAppService.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/blogging/src/Volo.Blogging.Application/Volo/Blogging/Posts/PostAppService.cs b/modules/blogging/src/Volo.Blogging.Application/Volo/Blogging/Posts/PostAppService.cs index 8799b4e0d0..5ba5a11e9f 100644 --- a/modules/blogging/src/Volo.Blogging.Application/Volo/Blogging/Posts/PostAppService.cs +++ b/modules/blogging/src/Volo.Blogging.Application/Volo/Blogging/Posts/PostAppService.cs @@ -36,19 +36,19 @@ namespace Volo.Blogging.Posts var userDictionary = new Dictionary(); var postDtos = new List(ObjectMapper.Map, List>(posts)); - if (tag != null) + foreach (var postDto in postDtos) { - postDtos = await FilterPostsByTag(postDtos, tag); + postDto.Tags = await GetTagsOfPost(postDto.Id); } - foreach (var postDto in postDtos) + if (tag != null) { - postDto.CommentCount = await _commentRepository.GetCommentCountOfPostAsync(postDto.Id); + postDtos = await FilterPostsByTag(postDtos, tag); } foreach (var postDto in postDtos) { - postDto.Tags = await GetTagsOfPost(postDto.Id); + postDto.CommentCount = await _commentRepository.GetCommentCountOfPostAsync(postDto.Id); } foreach (var postDto in postDtos) From 676850c3ee77cb2ecff18d8d85c5cab925f5d6d0 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Tue, 5 Mar 2019 18:26:06 +0300 Subject: [PATCH 020/111] Delete old solution files. --- framework/Volo.Abp.sln | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index f9c3730467..1615d66e14 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -5,23 +5,8 @@ VisualStudioVersion = 15.0.27130.2036 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{CBCC288A-53C3-402F-99F7-E468738560F5}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{447C8A77-E5F0-4538-8687-7383196D04EA}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docker-files", "docker-files", "{0BEA55D6-E0B8-40DD-A256-B34C4DD990A5}" - ProjectSection(SolutionItems) = preProject - ..\docker\docker-compose.yml = ..\docker\docker-compose.yml - ..\docker\down.ps1 = ..\docker\down.ps1 - ..\docker\haproxy.cfg = ..\docker\haproxy.cfg - ..\docker\up.ps1 = ..\docker\up.ps1 - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{6D893E48-0739-401A-9AD1-286BCB6E5517}" - ProjectSection(SolutionItems) = preProject - ..\build\build.ps1 = ..\build\build.ps1 - EndProjectSection -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AbpTestBase", "test\AbpTestBase\AbpTestBase.csproj", "{1020F5FD-6A97-40C2-AFCA-EBDF641DF111}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.AspNetCore", "src\Volo.Abp.AspNetCore\Volo.Abp.AspNetCore.csproj", "{02BE03BA-3411-448C-AB61-CB36407CC49A}" @@ -657,8 +642,6 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {0BEA55D6-E0B8-40DD-A256-B34C4DD990A5} = {CBCC288A-53C3-402F-99F7-E468738560F5} - {6D893E48-0739-401A-9AD1-286BCB6E5517} = {CBCC288A-53C3-402F-99F7-E468738560F5} {1020F5FD-6A97-40C2-AFCA-EBDF641DF111} = {447C8A77-E5F0-4538-8687-7383196D04EA} {02BE03BA-3411-448C-AB61-CB36407CC49A} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {B1D860BB-6EC6-4BAE-ADAA-C2AEC2FFB510} = {447C8A77-E5F0-4538-8687-7383196D04EA} From e29a657ae309577b53ade56fff80d188c8ad04e6 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Tue, 5 Mar 2019 18:32:05 +0300 Subject: [PATCH 021/111] Add Volo.Abp.Caching reference to Volo.Abp.IdentityServer.Domain --- .../Volo.Abp.IdentityServer.Domain.csproj | 1 + .../Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo.Abp.IdentityServer.Domain.csproj b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo.Abp.IdentityServer.Domain.csproj index fc2969a97b..01b2f8da5a 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo.Abp.IdentityServer.Domain.csproj +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo.Abp.IdentityServer.Domain.csproj @@ -18,6 +18,7 @@ + diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs index 9b7ea50fc1..dc06ce130d 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/AbpIdentityServerDomainModule.cs @@ -2,6 +2,7 @@ using IdentityServer4.Stores; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AutoMapper; +using Volo.Abp.Caching; using Volo.Abp.Domain; using Volo.Abp.Identity; using Volo.Abp.IdentityServer.Clients; @@ -14,7 +15,8 @@ namespace Volo.Abp.IdentityServer typeof(AbpIdentityServerDomainSharedModule), typeof(AbpAutoMapperModule), typeof(AbpIdentityDomainModule), - typeof(AbpSecurityModule) + typeof(AbpSecurityModule), + typeof(AbpCachingModule) )] public class AbpIdentityServerDomainModule : AbpModule { From 8f562bc78b4b729879520b3d3e33c8335757403c Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Wed, 6 Mar 2019 11:59:13 +0300 Subject: [PATCH 022/111] Add branding providers --- .../applications/AuthServer.Host/BrandingProvider.cs | 11 +++++++++++ .../BackendAdminApp.Host/BrandingProvider.cs | 11 +++++++++++ .../PublicWebSite.Host/BrandingProvider.cs | 11 +++++++++++ 3 files changed, 33 insertions(+) create mode 100644 samples/MicroserviceDemo/applications/AuthServer.Host/BrandingProvider.cs create mode 100644 samples/MicroserviceDemo/applications/BackendAdminApp.Host/BrandingProvider.cs create mode 100644 samples/MicroserviceDemo/applications/PublicWebSite.Host/BrandingProvider.cs diff --git a/samples/MicroserviceDemo/applications/AuthServer.Host/BrandingProvider.cs b/samples/MicroserviceDemo/applications/AuthServer.Host/BrandingProvider.cs new file mode 100644 index 0000000000..820fec9adf --- /dev/null +++ b/samples/MicroserviceDemo/applications/AuthServer.Host/BrandingProvider.cs @@ -0,0 +1,11 @@ +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Components; +using Volo.Abp.DependencyInjection; + +namespace AuthServer.Host +{ + public class BrandingProvider : IBrandingProvider, ISingletonDependency + { + public string AppName => "Authentication Server"; + public string LogoUrl => null; + } +} diff --git a/samples/MicroserviceDemo/applications/BackendAdminApp.Host/BrandingProvider.cs b/samples/MicroserviceDemo/applications/BackendAdminApp.Host/BrandingProvider.cs new file mode 100644 index 0000000000..b0f5b10dd2 --- /dev/null +++ b/samples/MicroserviceDemo/applications/BackendAdminApp.Host/BrandingProvider.cs @@ -0,0 +1,11 @@ +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Components; +using Volo.Abp.DependencyInjection; + +namespace BackendAdminApp.Host +{ + public class BrandingProvider : IBrandingProvider, ISingletonDependency + { + public string AppName => "Backend Admin App"; + public string LogoUrl => null; + } +} diff --git a/samples/MicroserviceDemo/applications/PublicWebSite.Host/BrandingProvider.cs b/samples/MicroserviceDemo/applications/PublicWebSite.Host/BrandingProvider.cs new file mode 100644 index 0000000000..57f7a94f27 --- /dev/null +++ b/samples/MicroserviceDemo/applications/PublicWebSite.Host/BrandingProvider.cs @@ -0,0 +1,11 @@ +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Components; +using Volo.Abp.DependencyInjection; + +namespace PublicWebSite.Host +{ + public class BrandingProvider : IBrandingProvider, ISingletonDependency + { + public string AppName => "Public Web Site"; + public string LogoUrl => null; + } +} From 54c93d4c346ee1d962c0b50e313d946f3ab551e0 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Wed, 6 Mar 2019 11:59:24 +0300 Subject: [PATCH 023/111] Refactor ClientDemoService --- .../ConsoleClientDemo/ClientDemoService.cs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/samples/MicroserviceDemo/applications/ConsoleClientDemo/ClientDemoService.cs b/samples/MicroserviceDemo/applications/ConsoleClientDemo/ClientDemoService.cs index 4066e21156..eb1197ffc7 100644 --- a/samples/MicroserviceDemo/applications/ConsoleClientDemo/ClientDemoService.cs +++ b/samples/MicroserviceDemo/applications/ConsoleClientDemo/ClientDemoService.cs @@ -51,15 +51,17 @@ namespace ConsoleClientDemo { await _authenticator.AuthenticateAsync(client); - var response = await client.GetAsync(_remoteServiceOptions.RemoteServices.Default.BaseUrl.EnsureEndsWith('/') + "Test/Index"); + var url = GetServerUrl() + "Test/Index"; + var response = await client.GetAsync(url); + if (!response.IsSuccessStatusCode) { Console.WriteLine(response.StatusCode); } else { - var content = await response.Content.ReadAsStringAsync(); - Console.WriteLine(content); + var responseContent = await response.Content.ReadAsStringAsync(); + Console.WriteLine(responseContent); } } } @@ -125,5 +127,10 @@ namespace ConsoleClientDemo Console.WriteLine(e); } } + + private string GetServerUrl() + { + return _remoteServiceOptions.RemoteServices.Default.BaseUrl.EnsureEndsWith('/'); + } } } \ No newline at end of file From 37405268ccd1799a6dbff199c6ac864a9acf47f0 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Wed, 6 Mar 2019 12:03:23 +0300 Subject: [PATCH 024/111] Update ClientDemoService.cs --- .../applications/ConsoleClientDemo/ClientDemoService.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/samples/MicroserviceDemo/applications/ConsoleClientDemo/ClientDemoService.cs b/samples/MicroserviceDemo/applications/ConsoleClientDemo/ClientDemoService.cs index eb1197ffc7..6dcf146f10 100644 --- a/samples/MicroserviceDemo/applications/ConsoleClientDemo/ClientDemoService.cs +++ b/samples/MicroserviceDemo/applications/ConsoleClientDemo/ClientDemoService.cs @@ -52,6 +52,7 @@ namespace ConsoleClientDemo await _authenticator.AuthenticateAsync(client); var url = GetServerUrl() + "Test/Index"; + var response = await client.GetAsync(url); if (!response.IsSuccessStatusCode) From c40f8e290e3156f610f00229e9921cabf5f2849e Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Wed, 6 Mar 2019 12:42:01 +0300 Subject: [PATCH 025/111] Fix method name in Blogs\index.js --- .../blogging/src/Volo.Blogging.Web/Pages/Admin/Blogs/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/blogging/src/Volo.Blogging.Web/Pages/Admin/Blogs/index.js b/modules/blogging/src/Volo.Blogging.Web/Pages/Admin/Blogs/index.js index a7604b9d41..4bce7322cf 100644 --- a/modules/blogging/src/Volo.Blogging.Web/Pages/Admin/Blogs/index.js +++ b/modules/blogging/src/Volo.Blogging.Web/Pages/Admin/Blogs/index.js @@ -12,7 +12,7 @@ autoWidth: false, scrollCollapse: true, order: [[3, "desc"]], - ajax: abp.libs.datatables.createAjax(volo.blogging.blogs.getListPaged), + ajax: abp.libs.datatables.createAjax(volo.blogging.blogs.getList), columnDefs: [ { rowAction: { From b9c692d64ff57b76873490d012f442cab1244d6f Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Wed, 6 Mar 2019 12:42:20 +0300 Subject: [PATCH 026/111] Format MapWhen usage --- .../BackendAdminAppGatewayHostModule.cs | 11 +++++------ .../InternalGateway.Host/InternalGatewayHostModule.cs | 11 +++++------ .../PublicWebSiteGatewayHostModule.cs | 7 +++++-- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/BackendAdminAppGatewayHostModule.cs b/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/BackendAdminAppGatewayHostModule.cs index 660419662c..6b80cb6693 100644 --- a/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/BackendAdminAppGatewayHostModule.cs +++ b/samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/BackendAdminAppGatewayHostModule.cs @@ -98,12 +98,11 @@ namespace BackendAdminAppGateway.Host options.SwaggerEndpoint("/swagger/v1/swagger.json", "BackendAdminApp Gateway API"); }); - app.MapWhen(ctx => ctx.Request.Path.ToString().StartsWith("/api/abp/") || - ctx.Request.Path.ToString().StartsWith("/Abp/"), - app2 => - { - app2.UseMvcWithDefaultRouteAndArea(); - }); + app.MapWhen( + ctx => ctx.Request.Path.ToString().StartsWith("/api/abp/") || + ctx.Request.Path.ToString().StartsWith("/Abp/"), + app2 => { app2.UseMvcWithDefaultRouteAndArea(); } + ); app.UseOcelot().Wait(); } diff --git a/samples/MicroserviceDemo/gateways/InternalGateway.Host/InternalGatewayHostModule.cs b/samples/MicroserviceDemo/gateways/InternalGateway.Host/InternalGatewayHostModule.cs index 943eaf0fc9..b4e8b23b14 100644 --- a/samples/MicroserviceDemo/gateways/InternalGateway.Host/InternalGatewayHostModule.cs +++ b/samples/MicroserviceDemo/gateways/InternalGateway.Host/InternalGatewayHostModule.cs @@ -87,14 +87,13 @@ namespace InternalGateway.Host options.SwaggerEndpoint("/swagger/v1/swagger.json", "Internal Gateway API"); }); - app.MapWhen(ctx => - ctx.Request.Path.ToString().StartsWith("/api/abp/") || + app.MapWhen( + ctx => + ctx.Request.Path.ToString().StartsWith("/api/abp/") || ctx.Request.Path.ToString().StartsWith("/Abp/") || ctx.Request.Path.ToString().StartsWith("/Test/"), - app2 => - { - app2.UseMvcWithDefaultRouteAndArea(); - }); + app2 => { app2.UseMvcWithDefaultRouteAndArea(); } + ); app.UseOcelot().Wait(); } diff --git a/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/PublicWebSiteGatewayHostModule.cs b/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/PublicWebSiteGatewayHostModule.cs index 88e74045d0..c40bac1d55 100644 --- a/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/PublicWebSiteGatewayHostModule.cs +++ b/samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/PublicWebSiteGatewayHostModule.cs @@ -85,8 +85,11 @@ namespace PublicWebSiteGateway.Host options.SwaggerEndpoint("/swagger/v1/swagger.json", "PublicWebSite Gateway API"); }); - app.MapWhen(ctx => ctx.Request.Path.ToString().StartsWith("/api/abp/") || ctx.Request.Path.ToString().StartsWith("/Abp/"), - app2 => { app2.UseMvcWithDefaultRouteAndArea(); }); + app.MapWhen( + ctx => ctx.Request.Path.ToString().StartsWith("/api/abp/") || + ctx.Request.Path.ToString().StartsWith("/Abp/"), + app2 => { app2.UseMvcWithDefaultRouteAndArea(); } + ); app.UseOcelot().Wait(); } From 6df1221f784f797e307a2dc9bde91b45ae6219d2 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Wed, 6 Mar 2019 13:37:01 +0300 Subject: [PATCH 027/111] Remove temp code --- samples/RabbitMqEventBus/App1/Program.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/samples/RabbitMqEventBus/App1/Program.cs b/samples/RabbitMqEventBus/App1/Program.cs index aab454523a..26decc1248 100644 --- a/samples/RabbitMqEventBus/App1/Program.cs +++ b/samples/RabbitMqEventBus/App1/Program.cs @@ -14,8 +14,6 @@ namespace App1 { application.Initialize(); - var x = application.ServiceProvider.GetRequiredService(); - var messagingService = application .ServiceProvider .GetRequiredService(); From a7708e3dc9458551b925648c7223ec473edd2224 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Wed, 6 Mar 2019 13:37:24 +0300 Subject: [PATCH 028/111] Initialize the RabbitMqDistributedEventBus. --- .../EventBus/RabbitMq/AbpEventBusRabbitMqModule.cs | 8 ++++++++ .../RabbitMq/RabbitMqDistributedEventBus.cs | 13 +++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/AbpEventBusRabbitMqModule.cs b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/AbpEventBusRabbitMqModule.cs index 4fc74bddec..f13f1ae2fe 100644 --- a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/AbpEventBusRabbitMqModule.cs +++ b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/AbpEventBusRabbitMqModule.cs @@ -15,5 +15,13 @@ namespace Volo.Abp.EventBus.RabbitMq Configure(configuration.GetSection("RabbitMQ:EventBus")); } + + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + context + .ServiceProvider + .GetRequiredService() + .Initialize(); + } } } diff --git a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs index a8dd36f913..d26e489afe 100644 --- a/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs +++ b/framework/src/Volo.Abp.EventBus.RabbitMQ/Volo/Abp/EventBus/RabbitMq/RabbitMqDistributedEventBus.cs @@ -30,7 +30,7 @@ namespace Volo.Abp.EventBus.RabbitMq protected ConcurrentDictionary> HandlerFactories { get; } protected ConcurrentDictionary EventTypes { get; } protected IRabbitMqMessageConsumerFactory MessageConsumerFactory { get; } - protected IRabbitMqMessageConsumer Consumer { get; } + protected IRabbitMqMessageConsumer Consumer { get; private set; } public RabbitMqDistributedEventBus( IOptions options, @@ -50,18 +50,23 @@ namespace Volo.Abp.EventBus.RabbitMq HandlerFactories = new ConcurrentDictionary>(); EventTypes = new ConcurrentDictionary(); + Initialize(); + } + + public void Initialize() + { Consumer = MessageConsumerFactory.Create( new ExchangeDeclareConfiguration( - RabbitMqEventBusOptions.ExchangeName, + RabbitMqEventBusOptions.ExchangeName, type: "direct", durable: true - ), + ), new QueueDeclareConfiguration( RabbitMqEventBusOptions.ClientName, durable: true, exclusive: false, autoDelete: false - ), + ), RabbitMqEventBusOptions.ConnectionName ); From 0428a580b81635d140c0bf18758b4e2c838122a5 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Wed, 6 Mar 2019 13:37:38 +0300 Subject: [PATCH 029/111] Add/remove spaces --- .../Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs | 1 - .../applications/ConsoleClientDemo/ClientDemoService.cs | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs index b108ca92f6..10d2c98126 100644 --- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs +++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs @@ -35,7 +35,6 @@ namespace Volo.Abp.Http.Client.DynamicProxying protected IJsonSerializer JsonSerializer { get; } protected IRemoteServiceHttpClientAuthenticator ClientAuthenticator { get; } - public ILogger> Logger { get; set; } static DynamicHttpProxyInterceptor() diff --git a/samples/MicroserviceDemo/applications/ConsoleClientDemo/ClientDemoService.cs b/samples/MicroserviceDemo/applications/ConsoleClientDemo/ClientDemoService.cs index 6dcf146f10..1560c383d1 100644 --- a/samples/MicroserviceDemo/applications/ConsoleClientDemo/ClientDemoService.cs +++ b/samples/MicroserviceDemo/applications/ConsoleClientDemo/ClientDemoService.cs @@ -116,6 +116,7 @@ namespace ConsoleClientDemo try { var output = await _productAppService.GetListAsync(); + Console.WriteLine("Total product count: " + output.Items.Count); foreach (var product in output.Items) From 0b0620138673a1684826b9978356275ff258373c Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Thu, 7 Mar 2019 08:40:18 +0300 Subject: [PATCH 030/111] Resolved #861 --- .../blogging/src/Volo.Blogging.Web/Pages/Admin/Blogs/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/blogging/src/Volo.Blogging.Web/Pages/Admin/Blogs/index.js b/modules/blogging/src/Volo.Blogging.Web/Pages/Admin/Blogs/index.js index 4bce7322cf..c370f10a67 100644 --- a/modules/blogging/src/Volo.Blogging.Web/Pages/Admin/Blogs/index.js +++ b/modules/blogging/src/Volo.Blogging.Web/Pages/Admin/Blogs/index.js @@ -7,7 +7,8 @@ var _dataTable = $('#BlogsTable').DataTable(abp.libs.datatables.normalizeConfiguration({ processing: true, serverSide: true, - paging: true, + paging: false, + info: false, searching: false, autoWidth: false, scrollCollapse: true, From 1275f2207fc39d850d23472294e456c8504f20d2 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Thu, 7 Mar 2019 09:06:35 +0300 Subject: [PATCH 031/111] Update BlogUserSynchronizer.cs --- .../Volo/Blogging/Users/BlogUserSynchronizer.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/blogging/src/Volo.Blogging.Domain/Volo/Blogging/Users/BlogUserSynchronizer.cs b/modules/blogging/src/Volo.Blogging.Domain/Volo/Blogging/Users/BlogUserSynchronizer.cs index e6e961b8a7..899f5c3d8d 100644 --- a/modules/blogging/src/Volo.Blogging.Domain/Volo/Blogging/Users/BlogUserSynchronizer.cs +++ b/modules/blogging/src/Volo.Blogging.Domain/Volo/Blogging/Users/BlogUserSynchronizer.cs @@ -13,7 +13,9 @@ namespace Volo.Blogging.Users protected IBlogUserRepository UserRepository { get; } protected IBlogUserLookupService UserLookupService { get; } - public BlogUserSynchronizer(IBlogUserRepository userRepository, IBlogUserLookupService userLookupService) + public BlogUserSynchronizer( + IBlogUserRepository userRepository, + IBlogUserLookupService userLookupService) { UserRepository = userRepository; UserLookupService = userLookupService; @@ -24,7 +26,6 @@ namespace Volo.Blogging.Users var user = await UserRepository.FindAsync(eventData.Entity.Id); if (user == null) { - //TODO: Why needed (ask to @ebicoglu)? user = await UserLookupService.FindByIdAsync(eventData.Entity.Id); if (user == null) { From ac69dc0a0aecbac09874f7a1f9aac8fe49e37a97 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Thu, 7 Mar 2019 10:03:03 +0300 Subject: [PATCH 032/111] Added Image to products --- .../PublicWebSite.Host/Pages/Products.cshtml | 4 + .../PublicWebSite.Host.csproj | 24 ++++++ .../wwwroot/product-images/asus.jpg | Bin 0 -> 33856 bytes .../wwwroot/product-images/beats.jpg | Bin 0 -> 14994 bytes .../wwwroot/product-images/bluecat.jpg | Bin 0 -> 22493 bytes .../wwwroot/product-images/lego.jpg | Bin 0 -> 96032 bytes .../wwwroot/product-images/nikon.jpg | Bin 0 -> 48244 bytes .../wwwroot/product-images/oki.jpg | Bin 0 -> 15514 bytes .../wwwroot/product-images/playstation.jpg | Bin 0 -> 12477 bytes .../wwwroot/product-images/rampage.jpg | Bin 0 -> 29142 bytes .../wwwroot/product-images/sunny.jpg | Bin 0 -> 68081 bytes ...413_Added_ImageName_To_Product.Designer.cs | 74 ++++++++++++++++++ ...190307065413_Added_ImageName_To_Product.cs | 23 ++++++ ...tServiceMigrationDbContextModelSnapshot.cs | 3 + .../ProductManagement/CreateProductDto.cs | 11 ++- .../ProductManagement/ProductDto.cs | 2 + .../ProductManagement/UpdateProductDto.cs | 9 ++- .../ProductManagement/ProductAppService.cs | 9 ++- .../ProductManagement/ProductConsts.cs | 2 + .../ProductManagement/Product.cs | 22 +++++- .../ProductManagement/ProductManager.cs | 6 +- ...agementDbContextModelCreatingExtensions.cs | 1 + .../Resources/ProductManagement/en.json | 1 + .../Products/Create.cshtml.cs | 9 ++- .../ProductManagement/Products/Edit.cshtml.cs | 12 +-- .../ProductManagementWebAutoMapperProfile.cs | 4 +- 26 files changed, 199 insertions(+), 17 deletions(-) create mode 100644 samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/product-images/asus.jpg create mode 100644 samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/product-images/beats.jpg create mode 100644 samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/product-images/bluecat.jpg create mode 100644 samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/product-images/lego.jpg create mode 100644 samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/product-images/nikon.jpg create mode 100644 samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/product-images/oki.jpg create mode 100644 samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/product-images/playstation.jpg create mode 100644 samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/product-images/rampage.jpg create mode 100644 samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/product-images/sunny.jpg create mode 100644 samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/20190307065413_Added_ImageName_To_Product.Designer.cs create mode 100644 samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/20190307065413_Added_ImageName_To_Product.cs diff --git a/samples/MicroserviceDemo/applications/PublicWebSite.Host/Pages/Products.cshtml b/samples/MicroserviceDemo/applications/PublicWebSite.Host/Pages/Products.cshtml index 4165781b58..9e32a2acad 100644 --- a/samples/MicroserviceDemo/applications/PublicWebSite.Host/Pages/Products.cshtml +++ b/samples/MicroserviceDemo/applications/PublicWebSite.Host/Pages/Products.cshtml @@ -8,6 +8,10 @@ @foreach (var product in Model.Products.Items) {
  • + @if (!product.ImageName.IsNullOrEmpty()) + { + + } @product.Code / @product.Name / $@product.Price
    Stock count: @product.StockCount
  • diff --git a/samples/MicroserviceDemo/applications/PublicWebSite.Host/PublicWebSite.Host.csproj b/samples/MicroserviceDemo/applications/PublicWebSite.Host/PublicWebSite.Host.csproj index 158e41f576..b97bc35b68 100644 --- a/samples/MicroserviceDemo/applications/PublicWebSite.Host/PublicWebSite.Host.csproj +++ b/samples/MicroserviceDemo/applications/PublicWebSite.Host/PublicWebSite.Host.csproj @@ -39,6 +39,30 @@
    + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/product-images/asus.jpg b/samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/product-images/asus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..44de167813487758404baacf71d8f24a277ceeee GIT binary patch literal 33856 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

    !G#H&xv6MNi6<~$jodT zlEMryBQL8Y8g-YJv>|PW6-7b@#gVG90%%c!%CHMk=~aLtax(t(Dyl_!?_9*uaoCIA zj+x4!U{}EKDk+Wm(?esa7L{QYJBpB~#)zpFL&K=Ct4{tgN0ooHiv0e)j7&Jan3$hP zG9^U6(jq9drZ})v%3x1N#18188=?AKkibv@dRL(D`Oqho>M(>#4C2zaeYiT2d}m~ zzC9m4pVTNnRc+pc zL|@sjjGl(O%)D;A?w4pF^bSI4=Na9|!5SFbm5_WCO}hMl>+ibx1G5Ez5qik{i<=P~ z3y1n|Z4vJl{)21jGW+=l1_Jk&(m~)@wJ!;NBK%>a1g|61VFAK7ekVj8N0~<@ZG!(& zE>yC&c;k?#?hvW;t$bPM(uYXpa>`@kuT&I0F8)$^vEg9x`me24o#R~*jyAQIM74jo z5dNQPUH?}5A>X*)XzdS(<>nx3v&Iv;#vkEDZg%+mBfNj95_lKdw)T?#4@jDh^-DzQ z1pjhZ+m+T=2(!EpX4n2>7Aw-l*HO*A6w&Gq2<}DfzbaGuM`c+D_|!L2%}YRf;AspcQG{-@qH#IW|sn>%^MxEEYE3uXl~)0X)m=l(>R zbNz+?@W}t+eiBfoc>^-8?D*Tf0;Y$JLAAr|bN%W6u>PYEVR!0OzQp|DqU78KWSa*pR6S}8~$Nm3A{%(yad8kgtSuX&1ERrL>`YsbqbfuPI5q#h7M}M1Yrub%k#vS9AZFY2 z>#s^xh;4oUngD*Q_Zc_DKuUQ({j0PjD?EXZw#mQx|EOMt?|&>L_J1toA4~aTA@cP* z|JV=Z|GfGw|LOiess!G?vuOpP|M{xOlct=}4XBSD e!^ZXZ`d4-QE5FIsy9sXVUlg%KrhK)(AEL literal 0 HcmV?d00001 diff --git a/samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/product-images/beats.jpg b/samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/product-images/beats.jpg new file mode 100644 index 0000000000000000000000000000000000000000..08417c235b2097373f7f239d47e0b579efb9bbb6 GIT binary patch literal 14994 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 Dxjr27 literal 0 HcmV?d00001 diff --git a/samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/product-images/lego.jpg b/samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/product-images/lego.jpg new file mode 100644 index 0000000000000000000000000000000000000000..63e31e95774b5ac232978c0266c8792c3dfe0225 GIT binary patch literal 96032 zcmdpdRZyHkx9#BW65Juo;O=h2;DdY6;K36J5`w!9?hNiOL4rFWxDzyZfM7un|GibG z&g*$SyZWiSx_5Vf^{w8$*Xoz0msNlq00|NCKjqbsUkeI43JNkZ3MLvFDmpeMHZ~R} z78VXJAwCW+0WKC6J}Eu{5itn~2{zsvGE!nPLSho){|thF^x6j*1p@^IgBS-3hxmVO zFW&(K=m=K`S4ap907L==Bm#t&0RRmEfPjpIfPet_Z$m*vLq|f!Kt#ZNZ8yOOARr+k zBO@cdI!8svLPbMBd|d(o0F{s)jfh7Eok7cj*ewWygpoH<7FtkG%EV{cE9d?-sp01v zW-AZx!p1E!eqnj9YMxEcAj&Ku+7z zy}`=kYf|CM3IH4FwF?0f0YD0Hl#5NqO;5)C?t93)-e5$6U{q{$#s3RcR$GGKLvK+f z&1o^8>gauY<3-O&z6cF*h90Aezv1?f>IhV|!P>yKpQuzQ6*NhG;4!9zi63cl{AIEz z*WL-lv&(!w{~_W)ptO%SzXOjiFg>T2IJcxo+aU@jAcnsH`j|bWjz9x zPkUR&te{9xmo^00bPr=2aoCsMs63+w#Y<|AP>!nF%njFofiQ-F z7eI4DRzUhY-GF%qY|msOhVHKTXCbqQ_|!=cp619U4o`}tTCX9j7!QZqn>u}BSX2PG zKuL>6K}tKB4li8}{rQufPQdI2yB^f2WcG3nt+t_XhDllSf#YhEl2qbb(?60j57YAm ze|?=lf8sNH|M0#zip!O^~UdOv#x^S2TA6_plW{D2@CPR9Hr9;Kn2kRmQ`!|QwEqq?vbbSKrT zCUv#S)@ZI}4fyv*<(!#xd-Ht3G@$LO-`DnCnNHSk4q|(IXj9QPrOFx65&nHj&*#Jl zN&+sPB!p8z)%F2JW*p|ygpM<3t5|WV@gww#_f@TGu3u$s=69OZI!^R(DM+};sK|?x zsJ7J*E^(@HH3pLWgJtxGNsVe25>nF7hGTNBDyUc|1440Pgb$k|p;;>KY`Wp=P%zL` zd5AFi1Yeqw6tDlSm8hJh7-xWtek(!HjHglXYUxBxqmG}uYbK#gtZtQV?F-=M9{D%g z@fZ@0(eMg$|Gj;qNT9&j^ZoWvM1nt_#1+B4RjMv_>qWJ2v#NF!cupT=6x$U#+Wd6B z=mH}FLPjlsTCD;g84Y8cAs!SWW^a9Es}+uG;~&sF!<_nk>aZ7p!t7DrN{~X_Lu6=@ z&fj;Ypo|Q9!9ua5)N!~)Z2I%O=+S;qQfT{qS8MQ1BRJVAEHcB6up9HdY%1Ji-KWz4DbOTL(~ z)@fKtUyi!V(R3-gD81oRpInz>4u;)G=nFN_-M9F)4qgy?(cCTX*Gt zLqn@aJs2DEX9Z{I_uQenAAHzZvA4sN{HsE>ds5f?MR(WG#ESX?YmK%_*qidJMas8l z2Xjrs39D(67EI!pe*#yOSDnMinjgQVnnskA#avP|j&k~IF|4kw!wclsJSh!sg)`Hz ztxIc$@-ZgRY-XxwbhCIR+=|eqB)HYTQ(ZK#wNlrE`{iH&&Df z7k>STc_z82zWD`hBrCEdxgP%)B!wgbx_+5iJ&NtS9P}%F<)wiz-Yr_OpU4! zIJugCSp6O1myb0m9MLXwu|}_4j|!Gg;A;3;>G?QQ;3T6P+Jcs<#M<*{T5v8#yRHXx zQ=0mI+vlEl<5D#4waH)WiZP_>mKGAg_NllJeFD2N%cRm~KQ@$+mqaH&C~$1;i_aw9 zRSH@O=LgL0S=D$G2XPnrnd0+j%MpzY{ks*}A5E!)tDB9HYF%zBjI>w{BkY0RVzh`g z+lk3S{I)x{Zf*KPsD$qOj&R$1F%k!Ab!y8DdeO`bL|HSN-V=BdcNxs#)XA>3V9QIQ!@vB~gbUSV98`(1Ak`v0%`5B7Z_!|!@Gob&E#6T$2W?=T2!LDEXr-#t%F zS*QJHAwoM>X9~i7Vpynld^Ud(Ny$fi_fFl`hAj6+Dt1~m(LXV!6s6aH;@d)LFVcF$ zn!_4TC4Cb=mt@Y)5(mhX%xTQx9OcDxlFZKN%=~4V7Hdqi$q%S0Kq8wUb<&L)p3oj! zTyg6k^M((Pixgbr1SLcyCe>DK_8f8dRXkPcEUcJ+cfD3v^$8H{?t=#S!G!~J1>bz^ z<7{RU^01l4ig`oRw(o3wYCIX=Qm-<)Y)jdA|@? z!mRLl0kBKIX}yjb@T9yqsKvpIkLkvmHGz-}i0Txx<(GytZ@vI@Lam}lek2urDe>UL z{s;w5CvD^vQmFHGN#mmu|3jtKO6T`u?S*J!>XZ`fU^E$ksBl4)9#nRFcC`L9+c~6 zJ}>1rEaQH~`cKN6tB4NxA~sI5Oi5CY3iPxiRH|!aIlEVyVnmEuZz>L9R;N})!-i^N z;YmzPUOF8o-Xl``Eopd%VK(Nc))R4}0Y@XAtS48rZ=gx{e=g;Kr1v{{M-vsjMKzG??)qSY zu(V6ZIq8DxdlO~CTnnk@ayBm}nl30>H?_#ep&I|~d1_qi8n&8hlX}j*M3qwLTfBcY z?xuJ&3$nGRQC?}Fb5PQBNV0q-%&<}vI^Oz}Qk7Mp)S&B`r!`CN!J<^WxB;q=(Sc;@ zx=9iS&_IaA%Eg%9UrF9o<)Ku(H^XhCLVae84?0&HjL}9U*W@LtU+?x4m(B7pkM3q4 zs2B;?t@eoSPmX_jQ5+iKC%yPEs|_vjAjJsWRCsutISxF zHx%vh${^kQb}6dk)>cyCAtl z)66htHD;HuAtF43)uN|+$Vtu~79Op&WtqJ3XzmN|zdX2=k+^tDhji}_&x{$nNt@7B z>$R;#Tk+Qbgj2J1dF$2eIamvvbxH+8qbZGkWjzOz6_-vsVQ}a-*ib@%60-c!|&Fx5$*|4!eTyv~q zN(UG}s_aTi^}7YF48U6cwmGHfIIPR18CDqbO?86)igg_m0?qg5>d*;pu7V>)3+Y*; zCsSe%_V%Z@^eCuNvv7os{QKpoqTzgXV)O!-?%bUtR`PFmo?X&HH)%SssqQdWo&g_z zzPcT%AHSsIU>=K6J`f8aIZHgQlt!DymA`OcYZCrR&W8+V7QbCh(4p3Qc62y(6D`3+~^S5 zCTl_@RsX&%@Xd=x)NxV}POMtwzsVdT9uy$Ak`iu!_LmuiZ2I^x{12Ad_*gCK*kE$GX}x3fJZ+^(C^^N-a$ z5u8GzwnkhIFid{yYITNNQ4GX^JnauwafPB2V#J|;dGpxr!oNy1~Tn|V)46Owkq1D?I@ouQ)h7d^N~L%hZu!Nbj~=afh%;(F)pK%KO-tUQ0a>w z4?Y%{1u;h~n=|h%z8xUjH%^3%YPSiG)>THF~FTSVEu!TrcMv!&)$i)R?RKlp z8vUkJh*zVDcV+AtH|)wQPOhd@(eR&-*a~_4mTnvXlP^?^mqZfEezs5n(#s!G1VN!{ zXY62!n-+0f(P5lJ0hX;rOF8Y9NBJ52rnZ&vQ$Sw|@$#w-K*{n$)R1tndg`=)4Q(%! zN=YosU_!;L?sFFKTk`#mVGTc|q>f4Z@&;Ut5-W(|E4R?qis@xuFz5ukP3Veq?fD~M zPl9Dk7N^L++IU{tS}uabr!X6!Rx zL-W5E(QghxtY%DP!)gZYQ1{opZ-(JEV>uknk|)>FN$6PS^mfkgu9t0uUH~dJblJ2Dt?eq2jdx0BIw$qnQiZ$=vTIoiWz8g9G(EA{<<7#A_GqM8VLgtmR}v#vXG{Vb zQv{g(fdMu;q|8jlf5k`w6#P~VUI0Q=-TC_l{3D^^mxF>8hf7j)T{WvWknevM*6TA1 zbYN!A_Ev1Yaab00Wv*+OYPD^m5j|bsEWdFXa|=?1ZM0sgW9^N%{~ip8{KT;x9%e@O zu0&C3avJpG5Ys)o`O;RP^_2S?yWe-lO~RIfbdSajjbW=15!6aPQ8X}u=QPV z?-s_^^hOV>I3x9nAkI59@&fd{NG{05^2`I2tcF&f@lvthU};khg|HE-6IJ*`r70t6r{F##Vw6%47<&wF^eWrls6NVdZG5w?=3=MSDq(?JO`t>XAl!q`qS zI-4VxR3gOz7EQjueZz63B|J9wq2dXs|0wU;11bkrUQmK&Q!5YUqb5AdR%=%Ngh?0= z$0M+Y$|@1t#S`Czm?UY8r-qtS(T}Yud`Srdaa#?W%P@x#BD?@Z=$!x3mT;IsM@=Ma zc2$3hkoWQXp1g~1BTJ?eBK^ccZ?tAWqcy=vmv5+yPOaPxVyc2AdD@D3CtK`)OXn8n zHS(SUt!)R+Cnjxe@Zm|M$yD^%ha=f9+&N5I)+y7W6DwmrgCL3&x_Ql3;RMt_RmVie zDi?p8$0%t$UrYyv0oOXX&{szY@Fz`yQ!JoFf#tQ|j6!eK$80#_#e6%=-2vTqYr$Ec zxG=q_EraQGZpx2ri!qkI%4ZOsvHx`!2njKIHf5~7J&Z6lrdyw&VX7qS$}RlZk0bX2 zcti^LsE65n(^^ot1wT*nYx#aj4jUpjiZ2N%F#myn_U^&)FWg7H9xHUt4ofy-Ry6-F z+^-Ls&CmM+Aa8InE8H82vk89#N|yLAk)2x9=BPEQm&){4)AK~zOUT0W1eJl4LytEe ze}CMKAIz_3nz|ct+Hj7_2!Tl3U><1_!?-4=t3pCz>nnK(S8eGRcX4wal)DoB6rLnPf2qPrB|i%Po_CMRuI6cPidy9Y!a`fx{@D8$do!#L zmkDPz=tsW*x(gKZFMK2Tnt=u5wk?yHl>^kAY2N!m2VFPE(JO{l-988&8bP#y3crOz znHBhA7$!fR(cMKq>8$2HDqQ3y{0;QeYpmuU2OBFqeuwiPfsu*bDP_U+XjYrppg7+j zB)%Rb6gjrC`D1Ky8oF$=G+01M>qDL3wxy+@Mcj@+96H-5F<3XnV$tuIR@ZXwnfX#V zY7J4Ih8na}hGFNr2v(g>Y+gks&IC+!Z_-u0MA~$th*w?!c3yw6;?jmalx4!_m2xS? zrk(~UmtDPtL%sMjY?1L0c0G|<_&dkaYdvzZ)cpGzV4YD`>M5%aKOD54c=Dd{;fhAG z9&9n8SR05Gwwt`Oa=29EF!x9M@>qpjI1m$$ei5l!$#wNIb#jbrnr$MBU=~}ni^BTo zt3f6aPAQEv)EbDB!z@iAnD12Yc$VaAk#~ANSgVNkHM02<;>7fJ@Pqocd?b6WjYGSL z^$WoIRPi;Ga;*%U@6#2nr0Ak|GzAVD$-3+`I6zuzRT7kYTJDx7+HEquEbgvK%)CKP z6wE*`7xT9IuI_YjkXjZ)U4&afMq?6jPp}HBQ3SZ7Cei=P+GD-&S3xJl#S)L+wNf=g zW{wrO2U^NR^_ne*Ox>;zbrfL(A!f%CE5N&fh1?7!TRw&6GKjq+M4G0!OPMCM?zV3LSgSD3mZ<7btQj}vGnj!BUc~6XitLl% zn}tQQYfRKMuoulYdUW;n$oH`GNKX*Qjfi+M^H^X5wp_M#my&7DIjDPl)*F~ z4ktykBr0dv*~In1<=vwuVI4>fQu)xZtpnq2Muei)Va`ZDes@yn8iQ1-1$A{7;kHnG zY~_Pg`KwuLjNP!*=g(1mDv{%3t7K5}j8P_OZ095h^2B>kWyfxaL0p-zZak~S; zVXJYMNdknIeTbhwYPRrPu79e=?JT|w1nCui`;6N&j5i`c=7k2GD+S_f!a_^rNAgn= z4>Z5lma6(r(RwYsci+gNs7lR(P$nze@8kDq=NC&_ttGZ^Vzh;2nXn0px0wyFUU6UM zL9Un!935mZdS(~*!mFjkzNwai2-AZ^Lg38hyauw?0xrFlE8+D$^+Q=c(1dTqGZnmO zw_gWe0I5Pndtpe{L*t`PAtxu{3DJJntQH!+VSJTeBo2$PcB%D}f3+m**NhdZBnlE1 zYr+xP*F3Ay4W0`86_}jcHrUuLNjL2eKM12# zTT*<0JinjYCU-+eE%*gv=jWwtstf9spU-3;;R2S@b^kSH#)=^P>u~B>v%B>A+nT)P zQ%NdJn#6VZ^G^?c_yWL|{3}G4lJNug>w=H%RewgC?H#kV8jG!Ej@ z$bm3&vfr95?$uLpOF^6Swj!k3XM-*r*8;{YWF(jU^+$YsOGVDCJ5Ys&YKF6nc4_|XqX$75>|J_%Xx{0LiC&0F35#vTqT#`Jt=PqZqu!;cOmK`N?Sa{x^v}fo-;H8mxJ3wEq{4Y29K8A<+V!Pz< zxjfB%k}vRaBb7K%pSUPw`0huR8B-yAO*+t)UC@YDjdjr9mLA9M*`UT}V|aq4?0lIu z{zAoK+-+Cq3C1^!-vA@l{-qo_Se5j%p^W4vrFG}+&t{_P#skgDz>k!58(Y7LX?2{w znS2gkF1goF^@zHvD}LVLV+U;Jdm{ab>f(#=NwuRtdQ!HRP#P%1o2Fubq&|*f`O4Ku z9=!l~*R`PW6S-|gC8;H_-GK+Z^*dU+8V9=4a=SwVjHjiu>hELiF90slN6RDo)3+lH zrdXh!zTsgNf zJWC+xup=m4GnbRcjG+U|XH)|vv{3f^vHMLg+BLG-%@*v++!=_=H~s<;K;E(MY}N7n z_fD#(!uj$18&gilaH*@BDC_Rs;KN+iA`vf>2&!;Pwt-emdQ9f`bqYQH-=&5zaaIB-!3(gvx@3C}NoSlEuDrFt%2$X6|lT{o(qL&Ivc0447u!^Yg;!mHf739el$c)J>Q%vyV;;|4cwhrCg^1mdMP4?4Jp<`Y z^Biy@Hq@PEYKX6=Pg);+7HkTSl&3%a!i3fy1M&`QA~%{P#|cj&J0X9F`C$yX-emE+Us(y4_r~2JEqQ7{vNZ*I{f2Bh&vs!` zTf)IUdEsQ8RXO_hxMG8E;N+e6J~U_QAgUvBcF<`a$a8PxJS~P-&lIcO8xw zfZ+7&%E;W(I8fZLnFQZQUzl)jTOx@oPO9Y_VpNQSY1a0(nz#?QE3o`DCJ*$+)GXgg zN&22I^hag*c9WE~=N8LAV?;pqpvMt9;=F=B8B)RC%^Cp@qYGHymIn6athh2(w25%A z)j^4Pe7apm)^^r}$WdwPE}wcLb1_S9DDPtmQ|b;Ae9ckJQ4?UrAz9FWv`z!a%KmFg zQF4U;7I=5)-;(B7))aO+p)7_~&h)XH{vEj2<2Yg!TkXz3JUPkIYc??HW9}_&N2b|? z3C+Xut>nq%huMUw62>kLkdFr3iOMWLX=YAnCWQm2H<0KN{Y-S{L2wJgzq1|5T*Xv1 zfRf!&NrL`l3lQ=$(kl4R=~w*V1I5 z(LoP%1x>LYw%Nl)j@9By<`S)02^IH*NRJl@wgj7N-8RXSA(>|h5lJK-7Pj;4PduG5 zSte#lK=-OjgUb=r{mmcbMzw~l{^|O}uD^t)eAhk9syP zZ=2?&qCJDvDiiQyey1&Cct6FY@4QE=NbYH2`z$V8E9!T`Kb$S}-dt9_(AlNuah0(=s?;z~9va@81`|_c_P8s>(cECPu zHvP`*Z=T2RQF6CY4CY=`xhm#qm_6MWX{{T^Qa=~nzs-tTT4ipwU7E_Exzzn`7r@Hs zykl~6PaGG+kb}W07%5&tsbnlkl_F#68;0H9zjX*B{r)0hcw!PuAJANYi$yG926n64 zOow#F5o;7HS&3-!(N<}E&X8w1rDZ3nVAx3dKpCrD;>_iPpLFf~wihHZ>r=^64 zEym47^aiRz4-8xJQ_5vFAH)}cX12VWa@?fd`D6KNxV(@@d{o`cUqVSy)kB}lPzvKC zkk1ectlav#&AtI|oFZz{=QX;34ZzFk)&wxKI96$Lu5i=HYHEO3pHeA}2$q?RM(&p^ zPNgRsG*=kM;IPBT28#jdkENeWhFb)lxAdN3zkPYEUJaiWl3l%pF@dK#MV#eKJp>j= z937&;HU;->_wgT8Kk505b~d$R0pC*;>c0!8&F;t0Hx5wLJ@|anhxk`@c&8=3iF_PL zSIxqEXarjg#s z_Z01Hlaz)vTq@E9PN^NtqA`ZeBVVtf4z`REOH+42lW|vQ2#i=b=_rZICCaEL^=|&_ zlp`3SQ6+8(RA*M4vMzrTP|{x_sXW$v6n}HQV3m|#dsIcd6ulIedK~kR>I~;H?TxkCdv-o%q7v_kY-bvq&ZDMI6;hoMaJv zegTL(w)P`7q3+sZoY7&~Dc7}@?Cvmp(wB2)%sg2}#*O}j@Q5n-JgNP504);g8S64i zTB&5u_F>0EwOqyRdr}&6G~7$*FM)I1gZC;$L-{gmu@Q@C*GaMPKM>_o%0H*iD?5QT zRO-77uQ5+m8tOAIl61dTMJCT8nV?QguE*7KkJ4B7K)8AM$Yb6{Y zGeEK-GJ;EottwkhVc8zm#SZ@v-56U@ngYNF;8SaC7e1W6rZ2f&&dv3yTTExKB7wL> z#j2mB-BP%e+hKtXc(sTvi|(0mzvl%h}2-E{OaOsp%oF-lmw67x;r*Lk>yTGihDhNO<0fFn``OyVnCV9Q~ zXJXI%^hA|dpW-m!F4yKRk1bLgZf&`^(4QUqD&8BJ+RtcsCHl2vRBBHMo0tiQ9xUao zwrqc@jSX8;YInJZZ|+%d?JihR&a^r{StvMs=YI%)_(OY+gxJ8rAkp+)MrsqJ|5rGr z(nq#F?JJH^yl5)*I;xXCIo3ZCCUcyBnmPs6(X=~3b924zMRu)U*9!)YG6@be(;pLx z^5Y)s)QOi$n#K@t=m@%!61d^>%)T!GP9ZH7O)zERW#2M|AVz9qrmS0zU_Ddr*Sr4n zjuhoL!mcH$rPQ=ZVgJhH0hhR5f8_h zIOTz=tVLX7nlmjrL??=O3WqI<8p!GC7b_68et6z8rIkJWOG5tgKZ4LO-a|Ws@;cwu z&)CjFU<~DY_3kfm!H1z#5c|56?1{G@D55ON+X?;D0|nLfz8Ze;e0u ztUC9oeqhO*^F$7t4BsPDS3)gi{8Ex>@9y1!sAPJP6D9Yf4H33STS9GLN>TvQM0m57 zQyp3)>yWJBVts1}S2W-AwQO>fTGQA!zh^v-TCOnq?vfXmPMD#X+Qg48cIw}gDpATc zQQq{1q_`99w~@AW>5=!D#Q9CJ{$+Nl-T+rr)ugimXN|Ua`UJsJYo&G+%Yy^r>ShbY z(GMtzZo<07q?QGTk-T0L|5#|0ECnUj)%B*I$KP!qT!Xcw z@!Ya0)Sno&eULQ?q)_7!=Oq^>QHua6LTirDAKKV5!NfHV`SMgP3vi~&3E#3ToT-g3 zRvMzNzXcW>Vy$?(lpYGP@O9}^R9%HwpvIa;sjF|NG(%Fd5=2j17)NvwZ*;SdyKPmK zbP5)pU-NL@KzNzI0dn^)KKgFSyC|`UVMKTorQ$aja5)x_kHsYQ8RSG3AvHf;h!Z5C z!{sj#bmV$y#n~`}m;z5wT$HGrKJOee8Y9#@F3=!Mdi|`*haOi0rN*T!$R12AKhH22 z3qL%QeM(a_8KUMaF7lv3NO6#L8jqRKL*GY6nsuHc$X0bsDCRJ0AthT)7UcV}ZnSnq zlgI8kcz+k;3%~fMzP&nk#XV_u7;>Ar-gv5XdJ$F8XHnDUwXb%oG-TebT?7% zPV@MMiDpEtKD5I#(ve<4nR=|HcZR4Vys)L$SK2Iz_`&|oVf~OTf~y^#(fXGbUWI(# z#f)L4_P!9i7#K2dPP{HbME129gWGg1j*{#NN!ik4eJB1HB_(TK?$XG+rfG`2pT~X< z;DkP1+oV>7)>c2cEM8AQZ^gl%AmI@W1Orz=t;up_!?iyh3NL^#Y?nJ4XYl#85;RFu z9|Ubm{u}_L-3q35Lb}UZdy}kB`=HbHd%q272=Do(vGqAC=LImpg~Jq`E#5Y_Tt9nIZ6RLl|_+IMXm<;DFop?Pl8UN8Q71jtQ622))#5@Gl=a2mw9alILWJ8Ku`RfI++m`+=Ey8>3rVaqmywxML&oH9j;{ zFf2HSpccj6`@`7FWJUY*{TD#UwqjmQ@rUN{S(?@S-~ViT?-FFziZNwn?g74mkpp!^ z{*zy>h3AvHkjCHnE14L_pu#fS2mZ0%>$C3eQf;!=Za1o2L zH1&UtAs-$uI%>%G(w$&rGuE_!x|J?lh+`Up%Mt?>D6t*DwY-FyrHLNX$7Gx9cH6Xo z3u!LzQI3gr*|=|fD%Pu|{N?5oJ6jG+^0=mgAn;i#Q424Fu}kHcO4t+O*V#a^V<_DwpR}f(4H*^w%q%W7%(1*_Xk~$b;%k76k~m8X;Jc5r1j7 z;%gMjzLiWDSDMRORUtj{EZ9Z6xCqm~Mkj`F{NBbg+xz0fJFblZq=wPx;A*QyC&P z5U$`Btt?*k8;6J!RJiGj)N*R;%-M4cB=aop#xvU4FeOxaf&{_0dZHo&ofnC`ab~IG z8JS1|hHhi;7{-lETu<`2)e|H}TNvXT7sJ6-^#fGjtHp0O)R;>-Jo4E)F1sOmL05xA z)bV>y{UnVte|zTEMuJr%8(696K&;PhE^rxsdM(^O+@u#dN^ILGRzCyn&j$ z5|;b~*8`!H;bp1)?#4oLMMl!6r*T?KB@*;wwnAq}yF`Ve(g-*|-4?1-X!7TFzo#eD zn0&-?X;G4Md;!G0<-+cy99vTw&lu3Rs*yk7rTd1lV7gb0q2(%^yQM6sHrNpqt3hh$ zGf_Fr-b(>RWY^SmcCo}nknQ#b(;j4lX;AE9_pvwiI6~7XJ}B2OeGR3gE$fy*BdAF& z1sozACm{Ukimy;)O<##VzXw)w*pQJ!c&%m*U6%m})mlc{VVfJkZpn!vX?Hsq1HX9` zX!$)v?I~<^8@w$j9nqO+qM%ux>04ON)s}2Y=p@K^7#FaoPHWpH5(OXzrLaz^x$HZA zBn+h!mJ;kPT>rc?R$iAGb@J~w&Umds&d1eJQ_mCUhSpINqf7k^yZE0+W4f}Lm!6#L zJ%dj1iHBGBmSGof=mO;%t&cviC9P0ty{kCt;A+jf=?-M~Oy;$jd)fnz#JKMOfAra5 z8NSV@NiW`D;Cp(NIHtQY3@t?QxeVx}5ZoPe!dM?etD}Ed+mr|6^Di=oP+rbPMV0Yf zgd6Lk4;CUS{0X#ha*|RfSZ0Dd3AMNS`DZW~k2iT%H^r|V1@xQ^Ax~GhCkM!-O3cSw zeh${PGR(5@f**lBm*{~f3Zp~ok}zT#%Or^JzqsFr@jb5Ki2V#9XH#jl+7GW9aBn%) zSadM7`%`7c;<5y>j~BhO2xlIVr;>JD;HM>Q=8tF511nFpQJ{_mS&Yxy6UyW`-+FR;+M`P6h8Z?c;dnK)VhK#s@WJ68^IQfZDAP;*M&w%Cq-wfL zUXzLeQu8UsVltMyVY(Q)c|nLVoqYX##9KBK;-iutKGu1{;LHfd)U05JC)eo-^2K{4 zjJ=N5BQMcl8mzL(LBd@6@*QgV9lOT8o zH*ca4b^XH91KTODpNzkS7sg9h<&HHquI=D+N_q*C+M6TxWkvu3p64$H7k7Au>0)vd zAA_bp=IBPFdnd*Vn7F@16#m+|s2NA$@MSJ_$@mf!p#=ca)uyEUOR3*j0GRE14Ho^{ z*LekSltNv20qxAh#3S{%L~H5S2js(1u(nf`FtZLAg*fUe21KqLN(FUp2h(OK zX_CGXF1g6^rqQ0@PW5cZiDU;om%mC^v5jc>KgCXDE9t6b*THS>;^NFoq`8zKP;aCA zmBmAg)2Mn0Ugn9~!MK&wYjrZO)ZTjNBAnoUlbQtsxd1Ntop1(?8gI`spKQg%*cos9 zyc7@j+)|sjT8)ndElY=maBCVr1%|ZO6HpXrVybvaqx@q{GHwHEm3qwThT(r%$Z{aw zN?2H{%d96^Djn zT;h&S+$uXgor4ffu+t|Wu&i1O_;_v0Kv5Pfo^`Y8WaS^iMDj>|+Wmyen9>ZNkYKBoA<>bOA{#*hW!)M(-xPq$TkS8jRe4&eK@| zHf3>lyY6vO_Nb@cdCaG?5aXz=3w$i5$ZA*7uXxLP>a_ClX&z5{ASx|;9w!)A%^u5A zlJ%lh<4+m0+W}>cYsDY)%yef48kg!4s<{tQ>+*O`zBd>K`xYl?Q2p2){03~rPer7T zCcn_=Fq197|PA6TDZ8y5(aX;f-2JQjy&PpFTBIRrE?_ zWuBfsdsBUsY`cunSYg-RD2{E!M~Wb=+wN|@F<+v6?@$+I)PC3~abnMu<^XP=xdFdt zt=szccfZp=8~s_1995&l1gP41NWGR&6j*#-hf_!75f`AU*KHp6o|do+k=E)duk-~# zO&s`~|9F<1F*X;b3@oYB@K>IHyl7dMWb)67>NnqSN_-}pO3-oQbi27%U!diSx>aMl z_K3UyU9$6rGhH6^?3t4Z6r`C#9#m0o}h^XgIkj8{*WY4}Qtr2X{sf3kd) zh`hq@Dc-ZXv7MvwXO~)4rm1YNp!dRci=N;45e@Dyq3{ME{!dElD=704X z;~_7fB||Fq#hW=r1J0{Jd_PMPI9H6Yuw>2<7Lr@IINpMQdvBo_n^YnBUFmkZ!d|{& zMClm>yBz~1R#hQY)Zr?WSFNt#Vf{|JiwhG&V7{%>H$E=gw)1D!h6haN)+}WVXmXhe z9yjB@lGCRbK+~PJZ4HUcuW$pS?O*X72dqb`uBpa02%mC(tf`(qWEz!eTW6#w%}(s9 zzSnmC@J=y-GkVFzCAt0x7u4c+L7j7#%nHtf>hKb3kCy@$Gz-phtZ8$_%ySw@7^Q6f z5&KpNGAnsuLgY?EL)HvVJ`>ba56@DW?%bj*{dxhAIvRRo?cIA=OAuGBgJo;)93;lj zfjzDWgEdHUvZiOVeKV)MEjtksMZ0Nbxk@poZmrC7e^7PW4$d!Nq!eJ|Dzt1Nrt(2% z5HwOONx6Mc_CY0!!_7OvM;U^`lMoKrtT^Mkw_N%3rktgCYb8Q)TdXqH<7t4-vd+Kc z(yBez{Q(0^NMXSY>Cs8aGC%eMhV}jM4{afx2v9c$|Mt4xy3uJ-P`)L&`_Xv`6@;V~ zJ0BnjpU?(BlgV!7AziK*JE|%A3GPn0=1m;cG)QJvUk$Sge*`=7zo$^6P9=VrVam5h zd@wIvEM25-9rrA0*f1%XMf{>FJYtMOs3Ll_YYb3~o4fKM)tq zlGnL4zRO_OvMOU%R_|3YP|x~f;o-4bB3v)#-oodMA=F*+C?@T|p zIc_V^UW^46y# zWOa{n>#?1&F}(~l-N}w}4{>(s@qfPXBS{t;uk;!*Dlv8;Dj*OfgaF71sylOz`U7%2 ze&>NWU(PUUN8NHg7<0j~oyPi}y@)q5#h|LNp`4wA*DQ+sy{!I6@s-GRA!@PhHtnN9 zRyNP#W~4o&+QYbTl-v@@rk)P!B)?G{#*Q4}f3%#)Z4k|N%&x~s zIx7Kf;UN;?1j>}@9EPnj=OW`&K#l^#y)+<6edBI0HDgM5rCV>6y^78}JH1-SS4e1R zlHi&zO`r$Uda{o(us(wr7Rci;aq3O z5RT!i8ubb4_i1MR)YMs-qM5TKb>Bqd{ zNRbtn(*W?8zOa2z!6CEx8-;K~VIBK6R4tp8^w4wDC<3GY&1od0YfwDCf2~%txM|Jz zNej-x$KK!tEKFcex_hg>3fOoEaMIpytIl%JrneD+{j1W&xv$ z>c+VxyhjN&9S2YO<4B5_W<_TXLZs@1L=1(v%{tE<*X$d5{#1pF zQMDKv+@(p&X3De!Ay2xWJ-cFSP$`MlO*u(;{q}P(c#UF_!Easprl;t2tH+4HX9D;p7&J85M zddJtEipkME+B{GpGZhJI^15XM6TAhZ(DU9ZaSsKnRG17EG8N;J2pfaUQ+H|x%$F<; zf29U|WYe+p6Ba*mIJim~D{I@1Fafd}%E&3O3|kU|nLZrPblL!$AJh7=r#8&WJH~dE zpbkoBNd8?k(R<`S{s-H{wV!M{4{YoLP$3&LBB;7Nb#-KA02exK1H5j6WZ4 z(lH)I8!;0k_Fn*(Kxn^%>JB-2IVQvEMI}Mh4G#y79zB=3PG*?TOA+JbS2Zfx&RhzV zxUatZk{ESOI9piKRFh+GYvDQk+Uw+np~VB!Tg2m9y%pJY>ZF9Dccr|r2S5voBHv7E zwMLNWH*H$Iao&KyE)(KO-KEOecDCBU1(hgw0cU(_nzD|~#zFw!b93{?WYJ$AY- zR4s7Ndz@FyDMqi<;!)*NnW#!;nJL6OA{%chEV{H`LX?1PN^WdVOXDGAD+|EMY(lGL zH{~Z(WG$6A2)NP~2_$zG1mbDq`=z>MpsGuBX%gy7ky3!$;nYN$5ZZLNZG%p-TYWaR z>rl1th);sCqRyR_;!OkKL~>aP)fzd;^`zGV~MYiGhzP#M;l_A)6Y_$n(MKq z%K%Ahl2H`X-XEB*Ic-1{TTx~UPx4MOiF#6R*B+CD5$;jnlJcx~Ojf7=0DHb=N;v@lWwZ{Tj_+@L zJ1MlOb&0IQgBj_P-%vwLM{KRdsP+jPlZJ;57G28dD%h9Z{&=+nToh zgPn833#-=i1aK81hd^xDa=&rc)zJ0)qrN;(6zL?yp9BK$d&n2ti6r&`zdZodudiVC zk{@P$kD{!QW^s*yqnXM*2NfLFcnib~zertDp_J-zptoY_T zH8RVE46@^hR@de&O6jNY?{6+G4pi{Nz;6wiW)*9Tb8`KEIMfMpere9{A?GH^uv3AQ zyhut@eS$^pYm=%{Pe^;?dA)k)YoeijO&xD8D=)~tFfyH5ulF6;HxP&?XkJoVJVbweU@HQv*u!~w8qZVXqip- zp(oUb6hR<*+ZLlB_;cX5itiFNT>F%$5dQ$+uP(=C1co3-F{$~2t`uC=$^Zp4$`pX3 zU>2ngpc~k31Nf)NTw1Pi3oqq}aj4mAB)W)Zr1OkNizs=*)YC%RT1jmAj>LLlxc!-N zC#I=!95RNt%#iDz>kh?1RsB!)hM}!%Bn%^R8a3~~(Q~DF6CqJ)bllG;KDU{&wOzu^ z9wu6dr)u>{0NGK|8C$lr+-fS=Y8Jil^{8;xp+n10)#@G=^W!;fhKtYC6_^@TL8gGY zbK!u!z}$;%iTA;m2eK5NCUJMf3@C9J%d)F;W965*VKL)EYySWmmdLe|9C0hL7P3%n zvav1rHt{1^@i~-po^YvBA<^>OYV+`Dg`louu-igOTg67jUTw$#Zbi1lu=_CpY4@34 z^TSfx4jMMsJjvt04HZ3ix8Bg#Ii=Mlwjb-D?>1bn-TGVAgoR<5fC6IV4-U zw)@JkTG6Li00MT@F@J{AvkwNkvSxrZ7B>R>>(7E&_jmC|({uZ>=@*6mA>_UuaBD13 zCT1#SKCa{>R34|hAQ=F<+E;RczT8 z8dL%9H?^?Y&Yl{oygJH5GS~BUITGCR$ELc`Qmt z@ZXwp=L)!i3p8eSUy{rvj#Nm23U$R>P$VdT03kOd;@WXD$ITA6!%Ev3Y81$|`E05) zB5R2SkgbcONFdl>YmT^!Ab2f=>xpu0P5nfIpwiM0(CIis@ddyfx5NCCNq&hAXqNQO zOo`Ixt>4%sDG0Dg)nmV1tT44jb`Ocy0_mT3kTd`Rz-ml%CQSRnLy&2YG+uL;qs*%UQEl{I#GB)xl<_|<#7i+|nrv`3{8ThQ zU9s_(6`0>sD6F+peF@g4(KRnABi6x2!`~iv{oMK=xRJT!&8o|_5=8mb^sH$ zIvd813bFXFOcNq!4 zH7GraBEcN0Q^F*ZJY`PVkdMjLK6xJXB?>^k5=U%@dLw_QOdazyH}*D zwN|S`in$H^e3qJMB_mSRr760INF*lv+ZC1uT+Fpf>L)&i={Z3Q7J0^0WXrlY03Ynr zbFntPx*STLApBj@v*!*f)EY$=WdfnA;#rir9K!2u-%uJ-Eqz_i*o^ZJ7F&4IpqCzP z2xWyl6sz+a<%Q{NU(Qc*ZEt)g>_WD7JEoA3e|r^_Omt(a+Z8BNxP3#*NP1Nk8km(( zcSOmcjZ!&-PL(K&+ogaYY<9w2Z0Qd#WM@%Vl=Dur%w;Mnuqp(n^Aon+y6umY=4WQ= z92)C2aTbpqB1A}zYEfFi+^7%Bu&_Jtw@gP|L9N2e+0J9Lo=Yc4kr7XMgKAy%6a&>p zIQDkDY|GyM7bX9smoZ;j^;X0r%);n!HT2-CQ6b>P`5<4aj4u5rr$h6 zx!IRos^#~q^2EkLTsaRsqoC=zK{x0(9YuyV@}^*v$$8k(5V`WM>s0*%bm}1oNU$FN z0LL1c@iitgq@h*`_^9%cBbb$?X(?DBkVn49gr^tuyrK;Nz4`B_6+xY@1+O--;kLXN%%_*>RjwXXYLXy{GlP0e zhcEakM_nJftJ>$#;Zhc0mr12CA=AxfRM3W*WeOyh2=a{}9acO2EO61wnQARsr&56~ zOR*{O9dU06|B?%YUe8@jsDscL~-2$?^$#HNZ1-6IzM38p!s1BQ4U#HU?slhq!g)OUsyKS9ro?o_({!mx_)6|Yw$UNxH8#ww^g!~FQBX2w%xJre0t-MW7lO= z5Vm8k%|~;};@Ufv+zT6%)31C;bGd=H%eb-gA2k@r*Oyy1#{P%ooORswPp1ZAIES5- zr;&86IugraK$17ytER(XJKqhOB_gKu>ctWrP3mkUNps>2%8(mT1Q3gj)#V*Wzf3!+ zGpTbj)R(6!GfcjV%jW4S(t<)jP4BAq({EBod^FWta)+6|Ix9`eW^@J|C_1jaK2xNp zaILNN#4vS3n8w)Kj@Jrl^(}MGm*KsNSE5s2g8}MX#Ub+@Whrq7QdE;-2)_OBo1P^| zp=AZCAq@pdZ7wTFAs~fzAoU{|KKQItE7B2Mgs3ja(ze>tG=za*kU=-Fu=T%P@vp@9 zRQ6bi$1x~sROIU_+w!(ZH|^I1O?xXDn~A?-j-avhkITy6Af=8C@iL*3pv7(tHJX&F z#Y!A?yChvKfR$ZZK;1`Gg^0Et8Qzg6hOjGZ$`wURnOm64b5#)~66tyz3n}uGXB34H zZZ-)dVIzl+(Xz!R3a3-K!c=s++_u)Oao^E)-A?=IRf$3C+YY?HnQL4%G^%@YQ&X*H zY{H4J)Jjt&wa0iAxS~==;*}>zN$5Q-Y$pXsl0pWA9XoZ_>A9)h6kw5XM!sATo-$h; zOF6Ee!kz;En-FL)OSIQ}%KMjnJCHj_E8HuTRmQq_O5my;{Tx_j2{4}J3 zpf7TtrX(DL#41*H%GLMj6lQ4AjY-B?b%r@;n9>|0nx$A>M1$q*2=&CZa6v2?rC=eN zfPdB9i6|QRCuCsXF>9gr6%SQ=?f+nEQj(TjQSh!agEbqkE9qfO#fs@s#)}Ysi2$R-N#inljQ#oKW@O z5657GZd+OsJKEU9DM$(hXxpYBlMxLYsT+mnH@ak)m%fy%bI@ZWbZ6EMhV8MjH`{DJ z+od$E!%0dI3j|pw=S57!a!HvSap3z7_MIs<6 z9S7kj1{AU*Mm|Z)?I|3kBA*>42lhy9J7CAUL#%D?3+8G60LuGwKQ;Nq@k-Lz@gv0a zIFf~o$v){lf45#D>`T5bQ-2e@Q#R?C=KlcNs}U9^P@@?VvELZ+^c!G8lyVmkqC-R| zl7V4yz)D>w$gzHe_Vm6i*AsJnH#hLw9M&PpO=0;-ex*Dl{4B)=kkf9ZUz9wwqRt?1 zcC{UdCW{3T&IeWF zJW-U^O~XnbF^>NL2Bv$c*etmmYFO$q8Rm%HrOqJs5>$!dnbH5_X$$JTy>Wt@O$q6018wt8_}xIWyLEkGfex=D`Cf2 zE;2c;AQNq5tz;9>o8!wU;19-YY90QEAo1%v&#UCSuWGS3R8iryBjJt~9}+e6vZ($W zs%?0)`$Y5K6W9H3E97XO0YoHS8nr2wRxkU&Nq7A;;%@PwC&P71F4ZeMSC>VvR%j4p zM1@ODRGF?xYt<`8F_#T=2o+ z&XeG7xtenRT&LBc9IEulxt;cwnbM>sq8oIrc2FhYJhs!?*2LppsqjO^zX9n&zgnc! zvSZ>j^)kAsh-13Y2SbD{DnUuql_cA~D*phAt}fI(NMyNOEb#YBYO9j6vu#PMRbmcQ z8H$Z%N2S9yv!>_@Av+xa4Yw;)RKrObnxWyX97(X%Y}PsE%@-;|@joGc7{1N=c1@)= zwyLvfaB{;)WF2dMLP3&185}Ahk!Y!D$`e*-IWh8MpI8YmZ~%dabKBhF9M={$tMrzvgDUS)KIjboySXy z`eUO0pD@FRNWyM&YI%|_Pl?rfC-ox_W*1#aLd}^ANB;oRu6$0bONDg`WhaOZ*>RNx4T%>UgVPt^1jU)mrg(Uv~JW#aK zTZ~8GlCNBJufh!UaRY$)eoWODDpcUQWVIfuTPm_terPB-&$ZN(%REv>@&N=84YeBm zeHWWjNXXbjfK)?>*(!VvHRft;ruoxmREy0z8wo3E&=!CI000tf02cD%@MP?%RHWrf zJw3d zzNOto30TyHf2@)|xRv-5!|Al%5oLONsVU`0Q>7_QuD2DfXZ1GvVs7Hk4;jy#IId9I zVGEHVopHgi{A4I8z5989!u>iFJg1f;q5Un!r$hzSo`EPu)PI3E(X`Tt4HJ*?-#3om zORY^qZ_)wQ*>l&$y%uziBvWZ`4K%oP;HJskt@Wn$0XDLW|Ewt1) zup{dHs*-iO;J>e#3Ho98#m)%R^T!RV6uHGnY&In!#&&VFwsoaR_t^fY6|%LP8HJka zxz>pY)@p69??D$yQq~HB@1%Kwu-oN}*+8ws&6#?iR*0bV3XEptwtFeJ5*1_gHpOIg z5w^nmkR9EA9t$&0_Sl8Uw|H45JFa|MxyTDrQl`~%v3-d7iyU-&!>(ATIl>&i8AXdR z(94N7xLQ&IhAQ_GXb$kVGtZ&~1V?5=hAXSEC9a1c1uZ!(wtHl z3QAlg4S*!1T;d+^Z^1mw&l_RX=R~Pc;8Pner^?`z#MW{g*;u_a|{a^rKkAfopvKEoXi@fqQpH+X`oa;4{!O3SgyFzIljr6>f86*{F7R=(G; z03C+s5RD7$xn^cy_{`Us#Mp>NmeCGNt*_XdAaAhV_(n|bbAwty+w;Ewfpo$Zh7$lJjX*%S*NNpKjpy7^_}0dB+~OT#u<;59+%lnRAeMd;=;tV^Eb?Km|B1t=_^GHh&iwxjEb zarqI_!<^!h){+(#xGA>(0K*Jr=^@K5gmL=)(gIF~T=1P2=k9)2tFI5DW>(5sR~#-5U$p?{cyhYxQ|gGr{fq7rSyXlvvukxb*(*)ov)2w5xLzDaeFmU zXwSoTf||ON!omQ1%0MYnueb^aZ*OchgTd6IN^ZB%pmdMg_r5vl;(Nezw>w#PH1kK6 z<8C)o7D?jV$_7RmW{%ras;GJP7TcgUBQ>hw#k{X7QbDllaNUuartu!79r~R$mnt#Q z%J_B~x^N?88Tw!5gML|I$kr%W{KaTeZP3+m)|ko~^4BlI|S)@tFWvNOiR%l%icflmM=ty-wEo zVQO7kq`7E{sRhWbxExACQjvRF=D=LrZSk#nDXYVE%ni4L&7bWtloZ9LFybg#;H zHr#E7V}5oXnC7*QYEkVBa4`#T>{?Vjrz0^{S2hJq(__>cXgH+ovJ#&?@6g4K!?*Ji3K4YxR%)qDM|(Z0A}A& zZkR^R^W3h{Y7B>V*MJN^t144Yg?vrcW@6_SBB7PluOcR+(}~-ofDWj%pmRk1d-Bw%Z%(>Tuy!WQhinxN^}UZtnAK=^VXe z6z;3^0N-KljG2sfYYuMx@7S;+5_O(3_i{}-9S#k8tx#s7lI&;?6bS7So@K$(bqgMr zJx2ckrV{55=;cy_EtEYfEICic2>=%qk!1io6S?|~ZOLMwjM~_x$y8Z$<21B59MFwP z@~ErWTKHFsmgZ!t{JM0CgHSVtm;~a&9fRc(G9B%yI!^ zef(|`Y}e&xiAYkyA)%x>A(-+MOos?ZO(OaR$FEa_toJpVj}Kro%hfUI$tid++8IiJwn;v6;9pMiH56nJSkN6H}{4#+5bY zN|oF4kOa){5Ps_Vxps#9+@f&MdhVW#B~bU_Koh90s%_;D#rFZ;r{@YIF|;u z{Tt!=qNkReu+n7LoJO^=cGLZuK)3-)7bJ^raFFgsYbfR{kqRQ%s_^cRxs?~Q5+idM zUo{8H;Yle{65uEuP1S^CV@`&^?m2Nf_NSwH155XLYC9IDNUS-P8)5|*5adHw!S5QF);}3Tg3M5)JFD@c% zY8^Tv7>>-%CFCfTEn#X;=JP0keE`CB^*L$W*XZrO_f~jKCVIxm!FGU8n6OU;RbFgf z$=G`T0ERpwsHgh85HHXSH_-{_fJ)peS?zpo2!;VlRbqSZbB+#Ko56Z(BjzlY8oZ7QWz*Z(LYU1@uhQTi_L5iI`%Ca!o~-oTgM7nQ06t-77#(Py&;v z9>>_?DbM*Tp$Ec?d08$$S*%6k6Y!hlf}--vM&A2^4*kjW!T{P!-92l^vW9#*QVn-L zKO7JUgzEh|6ynk+B?yU8vKL|bLN~-2;R=T`4;pH8$!sb#*!1}gJj=q$LXxxs2=xaS zfvmEpMyE7|jni%Ik4C~K$w~)lRWcn_f8oYsrBG_Q;(?kVy)!Fj6C#&XW+}7nAe1Q% zw}0D0z)&6fVrHaqZ#re{trspw@lxV4tVV+o)gLPAtcDUSmdmOeC;$LfqHzJ|Mm`IO zS+%Qa2&%jJf6PV_bsg-pW7Hgc{fRnwaVnW9W^{SnZ)~Ra(*0m;cwBuK*Z6O+m{+uT zMFnM6X1}9gIY`t1q?m8;ngvz4w3m2^m22_Tvb^U=t&hCwg=bRNDJt^Zt9vB$>wIi4 zh&e+o*BQ)Ih!yJtdgSS=^|{O7w1e zfwnQ`UM<)25~-~;^AtL5En4Z+$}1uqXh*V}LM`V0@g)1|(o1jo zeFFJo`n1q-xR3t;On>rnO>-|IFPUX6tGOcQ7RSK8WRBcy!9WBD6tv7wZA5uge@#E8 zD@th2INzN|du(n_B>w;nuCFR_R+j4uyH9Fu)b~w=STtB8IhjVmB)Dy3AZRzcf zc6fy1td20}%A}ZXII2B1d(mNlY!n)^Wkcptuh$$bO&E-Vo;PZBzi|86OB60?%<-b> zlWw8rkm3{;g@B}}8-fV9IE_3=SK6TPZ!#6V$ui@rAXqzutQ~*#Lcd%vIB()7EEqfNyS{?TT%|4-naJh8aGemek{|sB3ye z-6ND7UztN|sP-K@VVB3gKexszX`>hjO*%Ay<4!uD;CuVpNChNVTjp@<+fh|k=EV`Q zHn|4C4LNPaNcc;LbBeb0P9^X=CT3A8O;;?$u1^U-dA7pdcw7XFr6%I`!}BI_3od6W zC&$nvrOIn=t%RORnHNd1(v<*o-=VdSQI1r)>07~Tcb=4iZC6kO(0XCtm-x+^vVAfQ zHiuMhj|~cO$NvBcF0M%`^4zQPgpVi*weD}*4o`#CQ$`;N4m>~>)5M@a*XeV0J9z9s zg<7Ol*hzg7qb&&u-%F_2kC6oj{S%7=z}Yc!zX`J2P6pb3R5oTk%N9v-#?n+r)MJ^v zd+{ReTt;4CsJd3lNn)27!gUrB7ENdQq>!IIicNy8s6uhS*lD36amln2W zp}fCL66JS8^Y&kqP`1NNo<+@A^=Sw+yVw(*G6%|=mvPn&@60u`$sXoM8lQkUQ zocOt!+56(5KQK>_@)lBTZ>0WfBmrPAx#%%CW=Rb)?I{a=v^?bI*4kE~sd`Byf!@{^ z!ZOoI19Ld_$tL}pdM2q_+PKS4!ri;d>~#Js)8H^3l~JcbYS+~&b1e&hq^vWmo+t7> z3?RkriEYJp5;4k5Q32G2XtokVUddVAj) zm6s}!Yi!l$<^e4XIJ8BljYPJUB-q~Cb^_j_!xc}J>?b?;U+|u09LE8a9qqTO>CJz~ zzX_<)8jQT|Cd_r-N+Q##?>e%tkqNh6rx9-!yn9Ee<>x8+A*swtnu3K@YHg*X9S3W+ z&?J@m6%YrZIHhMN)0ir+3UZyQEymnT$6c~_*y&H@Hw1f&Um2;HsswD0CYAT8k5hGM zLy+4+THOUVNYVw=o7(4~8;$Uzr7|=I5_zi#u=wM3-{77ZUaVCvd$Ka^7cxc-ha5#+ zEdaY}DhXPKt!mYMjmZNE5b0DL`%##wlo%1=AudYzSdg32&?fp2HUMvH`dbNZ=BXJn zl`Ya=`&t`lgM^FILZ7$YZG^EZ9lzk z_#<@IX=}9a`zGaV8IEu-+xb~?e+Fpz+cD2-8d{+xxFl$e9E7c5+a6*Hx{jL>(+X$9 z-gczNU)@!jB&L!G(I%dtub<{3_<4AGfbz3!=u?_pDREhZMqM9L7p%M zR#^5E^}3&?n*C>7c7;ouuhS@yi**IdVdMFlR2M(wlUZMAT8bD#rORWtqAu1^Z zfNVjv?fQ<`)CfL1A3ws|-liHG5UY!Fsw;@aIl0crh8t?l6@r9>^aI-pb7QkBm(P8K zDIJvRNBH8yF~NMTQ=~YSUwYzEVCh(6&@-VZc=7`D#vo2Ng#V)t+561YE5H? z{6wr}s1-L%C@O3+>+LoiQdHU&H4vK<=Iw@KrT2?P8?Hd(rxl~|7Dd;4O^+nLx>lNs zoKDCmPylzv9w1&Uc+a$@HSx1PBT{xZ_+XV=>JBq-$yE&HDwhPeQlByD36Akf(H=Sh zHwsg|ZhbcS;ortSAJ=JILrop_6B3zAgv+cnPP7#`f)?U>l?_2al6E7t@qq-C(+-sI zJ}OaH6-x_Z)SGxIpD5F^)_KcRQ&fO2A+02pg`_PPPQu`l4%m@u*^?@99tLB{xsFs=d47n*B+1QDn@}z~ zw*LULaFOL9CqX2gO9tIAm4O7bTyY*+k2PU(EF5**tww5kU%H1VNxwlUEPG$nHcF;$2q+9jFg1eQ`O3eQN2Nh*h*c8}sV+#Pc zbfBqjtsnpvtDqBY!bUflp(SX#wX5W81~?3ExuS6yIy8Ls`q_Fm14<*NGLfr~GmsUxVytqwAdV5ha*$!K5Zv5oAi!kcw_O( z4VTHQ^O56s{{Sm~Eq~HEf9>KB0Gv)fIGg48y5iDrfByiOrT+l6h&(F5`{O8IG4&gs zxcQH%weTTyv%%*O(^&A%{R)PbrRKT}cZ#Xgm&y*IYf_t1NZ&!ekgwhrINb2#Q>SNM z8E0DEaw2Im>G_sq=Oam7jXl!B5OrU^onwDoMjR%fzMl^HH;MT%D3h8pXqOVLPGLt~ zMhcu#oQ}H->Iqh~_1K$s#7mtQo+>f3#&XII%$vjf%~Iu5#8j2oHXC#YN9=*GPNC?a zabD&J5<3-xNoWVPNtr}3Lh+AYl9B^cD4!6bdIF?3{_I&F=?g1BQVNK*?mA+q*DA=1 z;<{{xfDQe|&?zdgNGza%e{HcQe@s%Q!c;&_?PQ&Z^*;FTa2Rvp>_5B`H3IUu_NE?l zcu3FrwZxJVx}%5wqA-(T=y0<)El8->YBL$CwHh?Z3Xx?*E;x&TEPTLr{y5u-!`7q{ z9?Ub`NZ6)34Kz>iQOBOv`zeW4Rm&?H151e)Bbxe?0{*37m`)E(M<{!q#sENX5IK?) zZ~}e)V;@RSUY^8T4p%Zw4U`^Ys*=_Z`Dv;~-y{KqsdOB^*YyG~bw4;q# z>{Vg^03@v*WluNtf{1^DmB+k+_en0xjK%q~8E)Nf>PPtFRM%;s?J=hhqjy>V0IPg1 z(`k^tAaW^?+qZPbMaS0Ic+!#>At@+jBy0tfhvW7wgZz{E54xn6`ng#BA*5*UaX%mw zddj3pv5ifsNe5tBg5`<%kOnu|pymlS#OD%6!q3+Z&;_x8ri zb73+?-f64$I~+LAWGGwlJ;%o1MNc>NKOU3(VU6x-KQdHvN#X8ems6)XA{;0&*_gzK z3zI_Er3(rmB_Qu%>x%~&aZ)vaHCpEkahPez0U`8XrT6~;b~fVXI(mpoOO9V-%Sqqr zann%Yuwn6->A?W%c&|6cF^b%FpjB5pGr+dMX>xdXl>J1sI-e$xJ;kxRPm;I~B2;N> zhandTb)#h>;De<0HYb04Gb7d7Ks>fok=VFyapCO3@;3Y;J10)~b@2y+)3H=pN^sL2 zZ!1gqm=y_aN(s}>GF)+Ff22+Dg;%IH^oOJt(Bsc6y6diu)T7j!TXJ{CoAssgij>-R z-s5Z`O{|AnUE2w8j)e63<4SrcDfNYcy}%EW-tH%?Rtk+sC2BfSp4YGk2okdkVOy*f z1JG}T+KS{!TZA~;6MLJSCMFsSsn;nR_6HViV_UL;(mPBu*6R_?2MpP;a#Hh-EwHB^eYPVul3jU9@}!P~-)^V2A$}rp{iXx)GRaHt4*O2iaXd}Vcx2ySj`{P zTGWW^gC-PaTPqGpb4go-fnuJAr%}Gx!xlDaO;xEir(=EEhZfsxuv4vSAC*c#-8KZ+ z{Kh@P&T(^GzFj@{-9$8%rAtkbbr5um?hV1X>An;wnXOf))MZf7N2kF`+?6Iv+V1J{ zj#(gCHX8$bkPmEgGPt)jm-^@#|Fw}DsfiQZ{{dX_uS!sH|B!ss z`FrDcDvEy#=`!;=p(>;*pV?DZ_(P2$ODaW$i8~Mo0G^#~i0$0rRL_hpx~Xbpc#QK~ zj#JBNAdk#KNHznxJ6jDZc5a82U5!+z$$c>fq#^jy*#)~Nfb7Dry>({^N23#b{^Lty(NXTIiZsz_;^ACu1%56l-k5`t74x1Mc zuR2>uzK~7LuVIZE?rx-2su0o5hbF4yfkpIyr<^KRoR>P44YpTa!)zfpZflD>B>*6Q zGyWJ*my>AJb;F#Pi-}TOsZn)qlg`)sK?L+0ZjrUc`r-({B!`oGa80~q10VxcW3#6b z#RZ1wQK_=utGbi~Nm7y-LP)l>^(sHzu-^AJ!j@+lxpcG~pkk#fNA;&%N(+rB+ji8m zYoALSTH@IGnRt&z%TxmjT(IR(p*mn9I+Ud>r((5Q!8h(tPJ;VkJ3sLt@YasgsHLK& z^rp(tmAtDlU79SW|sN~q~(klF{()cS=t7ryO zbrMpwEhGVAEnrQ+1AH;4TwbnG7f_|mi5{UYqUw_(Y`0Y)tXoaMvUM91vGfAK3~Q8@ zo0TJBaU#v}RxY7eg8pJnE+XRme<^M)sH+7nTGmRyCrKdO1HFd$N6ma;p~s$zKB-2b z%tJ1&Vgn7ZH4Be2uA&kRh!*dC?TW~`^&G8IOsY*vd|@FgLQ!P4MSxKONCM>C5@?=UP2R6v}l{R8+8u zvD#5|locn-xw4O!w`<}00`@ymZ9LM|wDEL%-&BVJWco|o_%a1O3pNXqy(w7i3VI*V z{P8e5n_S6Rjs&;r&@=3L5KzR2790+tHVQ0(eQYTz{HsRY_XLba6KJhgmdfeyrbI$6 zrAwUl?}5IcfSq9=b{kv16zJJfby}z&qR4|jtW*$XR4S}TZ6@a08P#$C1ldIF3Db+0 zHPs+A>Uk=rxs;B~-3LG4-qkf_reNn82(R$^xh54_2la(VLbOzAzBgA@o^6a(2$u)X}#^h8hD|Coe&Rc=TlBTtJRF!J5N0jRAu)`OJycWy} zT?aC`n&=9sxgbxAQl&h#$kVAwQ)wtlM#@d^ds^dgZH=xVimJ1t*_yWOWKxtmpfj7pqSU9PuaOpC&qn94fs+y-6Fw?Y#W^;+-!?(1nAvz=) zM50TK(;=!;ZLsbxS zu1lNq3cj`MhL%!K`k#?q2S-n-!GR;ogCANimDlGx$3EUKc(?xmNM(Puh$|D%j@0P! zfyJTI{y&g^TO2^x5R7^o9C-%D`1B5?5>DqCLcHD(vnFQ9TpOdwr)BwdXf;gDC8=%1 zZ1X-C#YpF*^dSx>zqlQ7v%_B$G!6%GFFoXZ#Z3|N+`7~9S(g=}M0Ge46ot3@hpycT zJ7ZVF*NeQ7!Y%?*a@ARylB&&_1x-g{=}=pXAwfrCI)Cyo(W>yCFNqEpXAUFfNa`7a zpI&}bkQ`7hy9~0@l-alKB&BLksMI>*yHh32?4P*FVY<@dxl9igHAk5VEj>+b#*aW! zT27KZt=kR;YYsY;>M2Mc-P`rULqAvP`M1O~RVr+zX25=g!D(^TZ~$ZipJE6i$9y=O zhJ>j;Wvq>YZ?-$^1^H;2-YIz+T=L|<7OI~yaEBB-Uu-F&yz&@I64+@!vOwJZez=q} zcZX)PF9MO6!rX_LWytu*ue$mZ85HzLM0X0?zOsDFc&rNqHg^}p>K}!is}`*p6*`t? zjtQRFr&WV6q*N6h=33@3P!vN-ON(?~NrvLf!_;CV0J3MDHTdOV81b^VYg6>CB##sN@OxrQXEIBZj}rB962)nR?Jm;1iI8H zYLN+vap9`SQCqIRtTvX@Yp-_H4xWa?zAT+T#9t4nbqLZXDot{1YBWk?@+ou{p~RP= zQVYm!f~4}0r96cIe1rl@Nwu3W{9@BG)iR9DK8;X)$ZtV$RJn5-H27(c8OZBQL?s%K zT;>-wD)wJcdf_8f@IDnQL&>-bEMte+#6+sgk(X*M#-%Gv<+&8M@TS_Vu&W!`gJ21< zzf2)r!D4jV+Y(k|@rO3MPs~)*&|?^NSm=cvGM`hw3es5Q>Mekl*5$Vg2~Lx>hyY?D zrAT&jti_DWs(t09rqgSvsG9-vz9Vf}I=MR=97WumP}nXKO42sjC$1bc$Y}~dE*_mm z!xQxbfc!g|m1wTjn5|N)PC!GGn~67CQt(xj08&WY1zWHp-SJ;DWQHkkvdk}vTY$*t?ulqCQQ4NBh( z*KKogw@bq&65;8QbF35GoD5*t7R=GRh8g9s2YPdUk zgMrGVRf1Hoka}MlE1JsQ(-{s(Rf*Et4gUc8V{+?jbfvDODwLnO_*&$QyCowsyvT66 zr0WUpq+I^hx^@TG6m6Ts} zj@KkuZco!5eOFhT;TIY%!U$Olaz~<0SHw-sZa1DJM*FNl`1C_*D=mdz%F4(WD)t>t z6!LCXtxL;!VjHo(4uH(VDN;*EQBu@O8dm+U*4?_}Vv`asTSabmZKy=9RFfSJ9&3aI zgr?0kqygsG+fPz@;Xw(l=ErioQev8QEsw-9N>)RTsXkW0I}JC#t;Q2C8Axc;)BdYW zr#5GspH$$=6SCe%&a(ifKv};j(NgML4>Bdmm7rPW0-{QVj-4aE`}f9PBykd#m?gr9 z+iF|}i>|Iq$CTOfSb2Jc+>4XG8&KMzF_3R?8)Lcjpp_X6N=>5U&(EsZ-icKyAJEu@IOwGwXMMB)_KYN)dc zo~Q-(ng!P3B_NXz906 z(-&Ou;(S$(aX0Y>_wrjY>&;TBjAhTdUz07Olp;dZ13C{??YL0vJ#qG_P_IW*(5Z4; zVicef;>rPWvwg}H)L#k?xQ$l;YUzAnE^pTgiM7rf-+gscbb4jF)30UJS5q7**Be`D zDJw#(RFl*nTq{wHDvtDKY7RnfBPcoq?L56e5;j)E-`5)9;M-uYI&q|R^dZTnyhsRFaS`zR`hICFJzl+ z3AMJk>5MTmBRQUQsUe4Bw#W!Tbyw5{&F$N5tTxzpzBVb0#iCA1IgQ4E(uz>;FewST zyuN$euXE7#!lb6xoHHZMQuWoPIHaNPf@G`}Z~J25eo!v2Tj9bRX8_aR+4oC~-BL)m zC8Zo_N=fVakIdmZqmoet$hCyjB|7p{rHJk%^4ba~NJ+V{zpa79t4iQzZ>o{Zry>Jt z>Snx@5I$R+4)7y5OU#YaC)Sz!owSv|CLJx zcG(P_DougXqJMjF=JvV9`zd5V8!JBuFuZ;dyq_4n%0V%2FVrN%>?#T_S7)u5)@j^Q>p)7xW(+^56b!Nly! z#SSf9`1yZXksv8YLk*4AeL5uA9fz<74IYrnF6$CFe3IYB*vSph9xLTQA{JheS(wWU z_;jst8IYYt^`gakQTt&R1wd`M2W#RJs%NQndd$j^We!y*EUn3|pg8eS?wzcVIslQd z0@$0grb@1HBQn-sqse{zv6t4mbO_Y8RJFGlkOD{m>05-ADMsZ*S37JZ9}gT6$(3p@ zbbh5&g_WvQTk=yb>z4Wwf~D!XABqA<2o}1C80je~84P1Sq^?S`x=M*UngOz|*>{5( zpFJTm)fL)vXlNNSXE;{lrsV1fJBy7V17WwmEH{Sl3zV$+H#3Hl@zXN&e~JsKJd`E# zp(L%g#=rn~D!BnW;qT$+HPkX_&dfEH*qYUB1+gZkv~!qrwlq9a0l7-e$~q{dcEUpH z**k(w&8yd|5^6PR0SSLxg*fZWN_6hh4^w|OvH`yMvKn_Pyu5cvITjqLx$3axIxSwU zMi7#y@5T-_8MhRKgsBO&l$!%|3lGFe>~ZTjaF;G;y2CRn6+FjInM;lpCHiF~Ol~OF zLtv*`bd_0ZQkUqE2E^gfmbk*cBV{)8AKWj+qA^u4sqx%(C~d_y)}rEqe<(_dKmy|9 zbFstHxx(6S5%>be4yh_TyLBUdhNO|I;|{rmLM9tt*HAU> zGW17NYxpMj33z{!^0iJiCV^e4*3mWQ*E(fVI#_bT>rz{3B-kap-usn%0g3yETu`rZ z8^xUli&ZLaEfXqK=f;j$ODbwSr`z~cEG0x25W*S+{{VP*2NbtEacUm{c;8N49*(-0 zrZU3j#SU`9lvw3Bl$#q8lY912!^^=h5MJU3iCphcRD@7v)MzfW!_r*{ZZHaE453Qs zls1Hce&>Fq3{=!MNt_AQpdUZ_D=1wIahBV!apkT4isE>as?pV*sqm8YR6iODN{UU& z^{ABoQNF`(o+9RCG90sRB}-3!Q8xMCVfDg}Z(+Kgd8;ZEcG#z~{{X_pjKV??hTHOj zexXL*`0|XnpNB%60R)@a5vS-e^0qls47Jj}`;+!xM&VG3S_oos)B)?N_RLW!0mtX9 zfDSvFRaHw^H_=H^P}tjYw6gA7LXs3?l`B=!G+2*w{{Vg@jD?rqUTmZ|wHCr8 zC0bMM*qkqA?52jB8qyWtNgvM-dKDot>d}ZuPL+>-oiTIl-W6MjR>4*patE~e5WL?N z#zUC)4j`!sJEV0OG4(%}20qMQO20aOJb&`R;?Mq`fB7d6CM+M1`00t`BZ}>X6$4pQ zmp-a(3M2U9zN`RtI)|d#CJiuNC#{D@Q2}=x&HuzRGucWI`t^@`sF4Bha#a$Drwa?l_@E=RDuZt{Vk23 z4!JH~O7M%AGuB&SXE;=4wp*0K0^MpWa!`dOBYmtKDi+*)u`F=oirE{6b&e;unrk%r zTffpidK!Ps>cNb~loM;8HSKSFSC_ayFAaWa@X%YE_hnZ2olK-r)k@g&6PKEN@SiDXo;&dhmzOf^+twL^v@q<~l$K+}Z*?I` zvaHqBZ5Gm^yAi%Nc>e%j&R^5XnNv4ANmKb|Ly-h}G$h7^mldT>ID`N$SLM2h{g40v zTNgj<^5S0&UsD+~E@gM%=YP4(%GGggr%bYk04Yj}inQHegn$#V+W4kkFk}^Yo8nRd zQgqf_xCy@65xML!pL-@labOV}3#2W!$v1(VI;!!@iquS%t}B%CPvhrQt6L^m^~Xl~msbU5skwoTKku+(w04xcsKDbk>lE&)z~W8Z!4 zi>ct}!!~<^#f+7mDj85Ql#-RoGi18S3u(ye4XG&9RG>oZKpT3`(u+CO@)AcFr8GX7nuN^0IfC_{_wWpzKsPqF-Ei7#iCLZ%K0G*8>Vy^}enB2W-7ZdCe=n;;66!Cl--&R% z8f^}wCdn>eP*Oap7bfWiLAhFuCW%*ml~IiJT9XcP-H4=l@7t!t8{8;tM&jcV9$C&6 zI-X1WhPNS5t7(ApAiU8$_<$`TOeIS;bS)qyL#lPzCd7;&RO$+;Q>iFyw;r2Kj;OMi zFpr2RC{^R7Y3d4;cL&RDg^nG9TYPT)`gpBkWY2BLy3nU(h)pf#YcdTkQd;i!z@jC2Y=1MYn~L2|@K2x%3-hwI?&Gc@SeuT&+4= zI*?vVAgCmOfNn2vE_wmm3USbs)#7vqL!~3Nv>YW>G}BVeBb{b|EC)XS0MJ#GZDdn1 ztrs`lJ~&e@lbCa&p3IH1-71eA$!J<$4JGsd0#Zj^R#ndC_WEL8%{hu)T8%b~OKo(z zV=%&!^Y#emET@;G1lZ_FB$3~2LVOm3LYY#k%dV*|M1d6xL}KQJI-;NxWAg)U_r%Ga zE7dyX8l_8&;^`41Aq_Jr^;j+SD(hN6AF`2aj^`Bb%E*ITb8dTYzu`xn^3*gF_xh1Tl%moh?uPjT36z>KxJr(6NGNFW4|f!GeD zjAh2-p8d;K^=-rF;=a>iQfQEC@c!^(qg7hmCUecL#hD65=E~nt+o9+-IAP|RL`k{A zh01B?<;c~}ks9op%U69>Is+o#$`At3?3UPm&?QdaX zHp4$Km7M2AZJRCB$9Sb66Xvn7_w9wuj_C*ofl~;^L2<+^DWg_l&0+ezVY;7?wuYNm z_G0%1TL5p=5qv5v>LDo>0}0WmW;M-AmB^@s!;NZXgaAU64T}1b4{H)WSlv>}en;CC z^*M{|;ygA@!ayHtO_KX9=Q5jIte=ueX#&i9aoh*?~jk=)Mk!MbCxB}pQrr6HaI!v3EW4iE4O4ZA3s>$^}gWTg@qdKoaS|6nHM3jvVu_dtL zR0!CS?TKMO$TE-$(pL2jVQ{2x4%r@)EmhiON&^$q9y(Bk%4+2r)~!ka^icqB+qNt& zR?ARwg*{NIjRqN6)V&|Jef>@UhCNmImzirs z{6$_!K|hhT=uhY^hD?U%TdKEHx$d~oD|0@-Or#6UpBgWyb<~6Ub;CZr#!RtCj$SWF zkkg@QZOHM|QnCRA1)BqGRp9!RO4L;2q-LVgk(pp;EQCJ8|dyCw6 z1OwBjUu}164Q&8ra7Fo07Z{su|H1T@tv3z z8Pw(l7PPutmfGdI;tPmNi6YuI+@8CeSYLc>AZQIPAOe~)p0ipmLQ-HaFV~WZP9c|L z$mOg_N=R*6SSTHd-=W(0!Br96uQVb}W_*wf@1i#4v#fxEM#V%6?XbQRX*8`c-K5nJ zW+}xhobp{OTCHMqoxthWdtr8mlOyHnfl$Nk$C#3|B~IMkwWTJ?2IU~C-#g<{BW>(; z;mf^j9P$CSoO!Lb8IzjR3Kb@qRF@)DgcUm>g*4M3-%@dOP(0y{{Tp2(HvLBd`TR`9BE30k~F12?Q_56!;d4>a@PT9?dL4_RE(s-CU%bl^&$H zqHcO(_YI>W(>!Uz?zx;!yg&F@d;ZEu;rm&)g@~@qW~k0mr%%_eGGuF0O)0$vE-geS zP`R>=$RHlLiL2aO$T<#lRo8)<&s&aU9zP23SZ_v z`+a*N2qnGOP#U<{yk=zXoF4eVFTnp(TF^kl|BJl91|LAY3Urg~hR_ksXnjs+pPB z>GcY=Ds#zlsU3)=$Ao6vA%d3>q?X%K`G))MrD`Bs4ovZ%X`DZEGUh3;*%ITzy)Le5 zLPL@ml920+rMA>i5EPb>g;*?tq0_CSW^A#r#_Yh32IEy;_+1o_YsH8>bUG@b#cmhB z#QrN+WaX$YPnh(FVk#3U+n$Eh=>cU|R;>#FTI9BO+zevjZw+&PM5tFK)v0w_6es8} zwA}vyf*jcICqwLz-GMhP4x_(ZKR7^|lnk&d0oU5D%&t-zh@?2AIA$(UeS3}eN>&f3 zKKPuc=a`&c%sfVr%K590He4m$(iHN)5d}i&1DCJ@#Qy*yX))URj4qd_hA`j=&2z9i zU(Bm4CXNh3pv5!GZVj!(?{6TSCB#1|>Vr>@hnAxIXJjd9Uf`bhAm8ha_=rR4Pzy>F z4g9Ix{Wpz>c zVo1x;!*LQ-)nu>z*yVHk%}j9)Ym&ukvokAG&n?rE^O}?bl7V}A;nvFuE+=4{5JiR> zR4L*SQk8OzHXwJx{7SNB)EH^B*k4g6N#ytk5RH@Ua$RLoyRji?807=rYl6|j?d_Um^ zQ1NS%c#T|nwZf`@NS;+buGl=rn+&!Pl@HoNf^JfJ6Sc7D@S($MKN5U7?r%9FcpYNFR*O8hluRm+L=hZEl&GDhQ94 zWM>wWQ4hb#WHF_+D_V_$Q{@1XdK2r0uYt}m#^4VZY8j@dm#fwI&e9%$i1av0kmoUO zHlcoi3n2IO!Y3SZ=5OOi8FPMkr{p}rOQzQ68EmsvjFuGGC`xRivXtM;>)#Up0I^!z z`J8xJbVI~GZ}6|h$#l0f_Y$GYiAQ0^qM=RBnU<){kW!&PFhfGc z#lI>RqCZSZ{95Cke~Z~OF6CU~#JrCZi9rqg6BJl--*ZwLwIV)!_rimk_I5RN>}DuGXoP?2{RT3B;-^OnwtFRij&~Hyfcl++5>d$9IVQ(vCM& zDLFfc($kdZmJhPfBb*BiwCY6_OtPZv=ybZnd z<02>U?kFXiMrx{Cr^Hku!$JQ5MYfhl>x|{PbVDCYovrY!mvin8`TFP)1r5!46iiefZ z+syKu{c#hl)n?4k&@~_>ZMbxyZK(PM1B|V-uuq*JbiMHLlb-XHN)(80Rn*is&{}ph z7_3HZXgxsxHpPqrp$Y$&(;e6C;q~3IY&<2?VFQ#m2{Lj+kDati4Lh z?;<0DJuMCDRY^cOGIZoP2n``5a@uVtd+bVqy~ZKh=MfZu%dN_c@n`m)WW2R?^OJuv zyIkx57-B+WZJDc&m+xw&eMmPWKs|qXDMvR>rPFB&rN1RrneE*|TOmB8>@1VGS5CJ* zy|EQfuS%`I2jKO~4?LKPk<1*n-B(18gP`q%sfUrMA*Epp`7_LO}$icNoDj-4&W>zf!U3`zIRK${$528X^|uo;w@ro?Hcu zL~=!1qghfG^l=%uu{pXHw^w@+>%F$I#DT<&54_23l?K+QPdl`@?>o*m6BCubEL(5#^W=17bK-hY*z|7A3-) ziz4LMU-)C1mQY4f!rSaOPt()&x>p_e4a#C?h7nSBRX$6n`ae#Nm&YI_PaP>Av`vV) zzrG(CZoM+48!pr6QO=lf`Og=cKtOnlAt6`3;F5X_M_JOD0#v$-(j0lXRQ2;Tw2-wZ z01}X^n-P0oe*0ouq)v8HX@Z9l6Vnb7Tw4f=LxF0r(xr8`Q`X-2K-g2X0jcucJl!fD zNw5HSq}MXEcr-~>3d$r+sWCNAEHIYKVfCn6ZPTP|1&Fn=lQCy5MMgXAO=XC%m?M=b zkd&DPR?-RGLc_7P_>%Hx1QYQzr|WJdO%<6>)7VkarIl&{O21?2>DLek6Y|wPs=jDv zpUtYKViMYS-Rjv7Mq>aB^E<<`!0N|Oiq32gq;daj_Cwn7851q zx@AWzW%=@{(U&mALxu9t)S^Z1NyIzG7p=rP?T7hB$NuR!#8jdlu_o(zaW8s36I);t z73+czTibhM%6eniR-tcSTzPB_M}L+XIt2*Stf!dR)!X&P&3*bCRH|}Q_j+cnYSN|x zRO`wr0P0eG1^S-W#x*>Y_qiL~V^*b+DUo1Bti=*c)hTaE)JG{EV3d$8>U~MX^!aXc z8z|<^K*|@`*~*!fm}WIW5}kD@3gt89=A_=~O8N_pi9Y>tjug4jp)mD2nfIfQBU7=H zaI_64a7REdzteGrI&)O#sY(?w2ze47T#yQy9Ri8`$pfeZuGrO})oHY*S#qN+!iyjz zwe;EpIMpT^gAq|6T~lOe0SPw!^#Y}D`zc-d)_)MkQ7$nAWh}#Cmi4C&q80R=9wv`RcbVnKeqp z=VZungJG#;8zc|Pl>Shk*#HbgH6U4<`(Z^v3MmBQ&sQO%Ch+c!OLD>HDaer^E2vtN z%vJvY*0w6k&Z+lS;s$tSA4038M^?}p5uQ+8E1Hafyt%XIpJl%S)gnbB4Wdi32g~VklE@RN=3%C2af=9 zTpWom13Y2cSunHfJnkO5^2b$aQe7e_=j8gQp%fz*juS>UR9|GwTVheHumdP~hx3dJU;&6`{K>u&YXVUlvep(Th3ul>Y$bt;Em&0LhL20K&D3$AJjP)b+>JTv!{64S~m; z2vesFd_iVhjl);CcMPHmp-_-v2)yh98)-tQ;@Kh zWoKw~_pi2uITfVpH`>6EPp~-VTQ3$=m7!%0BzB$aw6YkruHGFVfU)C4C|xog<`u_i`?AoOU9bvl2I@azo{ zMi>st?u?mQU2V#Vl2-Z~%G792DTr(!scLy|6^77_H(4ZY ze^ZB^N${J)yw#N|*{&4}h}>eQD=^HZ(*ER@!yMSL+ePF&r!8Q&3yDpQ)HLmgdw|*M zi;(zJ#~F@P*@2uY6j<~+EOjo=zT5AAS}g!CvH-c;Y&ke7#10qIawbQz9XhQM&*t$#;T`?oH4KFDADs|jMG44Ex+b% zPY_iSLDF>~l!B!u_ayZ1hLyz(+nh57YOCj;4^+(SBC%N&xNp_tIR)4YN>YZI=colb z!cv4;wGash*J#Vf5~DCobRyU7QeIvA^M;La28|m(WIh@3r5U-I)%ui>+*tBxrIab3 zflAVU2!aV|BT*!afa0Jq z{{R%Ytxn9@pD<=d_{xHicPO`&=YT_92r40T&Yt1=&6Knd+bvqe1sjBp*X!jrwegXhze&rDu)5Ub)ZPwBofWo zloFn*B}etbj9T2P$%fWgfZSM7)ZYM5pB<|{kFzgIhsXYN5nNL55-Cv zX(49tH6=i~rNRQAbMp`z8b*l-me7DR?3AU{_*b;AHd)o-K z*$70o9A53FDs_B;-wMt-Q_U<&afA^~dF1MGZ8y#l&_##<_aoeaiWsGH*>`G3HDKm8 zGnKk_4+S1(XfY(snL13Bu?idHhSGwt@zeqmp>biizsnaVB*3QST$2bCwGmQcvh#r> z%<}XCO}eP{#Vf2rW=%xRl|SL(B1WHwP*F^Um78Brr(2QR67@qoa_Vw~R4#jPVYI?t zW#UO$9#L~}3P2aqHp5SQqlPfifBLHN3uc|=&anI`b29OLxK#F@rzy4wSY-;3lc{PX zgQXxF5pMXdqN?3SE7_W&S3bQiT46M{+zpiU0F;5g*X@NVvgOjU<1W;td}A!M9w<+o zyCqk$LccNHUcHVR8EOm&w0IegM?Di9kYmJPASe=4Q|G?m?4!4)5CQ)H6VI29iovXn zwrdBUhN?`-Id3p=Z#YkjM{NDw0y}LjQe6mXhYHT4VRLPO*j(GDGVue4PjIU~>lL1R zk}2tF($Fj%nDe=ahQt`L;xyWj){<09icluQRjfUJcxL#d zZXRaNQsI0;RMBN9S&l-;Qc^b9?eBh=!=q~$9kuP`qHNE6-54N&f2xP86$YNHy0p64 zOjICA$-AW*oIiKH>;N2$RR#pJlDPLw_do_Ziyc+ zNPZkL;-jo3N-pV9xf_d%Tzv;ze1`>y8p9|J>O0%M7jcXeYxaIsi*t}K;*aT3t+>QN zOjKnywJJl-tSviSB`u90r>^9ZPsuh>$WNNVJ5Aw!3P!CWGEaW!p9aXW(gGNrE0B(K(pY{R8ed6&_xQkyWpm{&+ zCl&)O*}SVl9mEDVAM;}s*Nc)t;thV@U+WgJ{{S&K!?g;ooPQxHtQ;1wIKUoJaX@uf)?<`rKwIbd{q?x0`Dp z)Sa=s%O*p*Te_5XB|q=Rg4 z6$Hh$8J5CwlpNZ_awPN9El5jkDUoq|*bO$`OoFOf; z+5szCly*u|0VMXeHYrqD4#(0eGa$6;14c6pwx=(99$L-HZ~fiQ*!#x}+f3nhM019e zMv%Jf^t8JC!tXV45Su9wlCfc~;VO394UzlUnkb~Gb7N`KXelqO5p*ReaHRg*IUdBK(m5W z_F`^#(xOzNJuDN1ejw&3*^<7@$ZBx5m@y-$xSJhqu!hxb&eut{A6zY;BBNcTKO{7! z>2$|b(QTBrKnhY&6jS-l)}wQC(|xhnLla?OV@82+(#q+iGCbUr;NyLDMm0*y1iVtn zH|ul$;fM!CjkYBF;rqo3v6S>yluE8t;TQT3@xu@ESQFD>iCwyYpd=^(z3}znj!RZ+ zs?TW+d`t0Z?@VqXQBOTc(sU9x7X!C!d6eJj-_AH*qa@ClMs-H3-SQ`Q#uj>@kms)G9=d9p*IFi;dGnCl>RJk<3Mf(ojev zR;@O;wff?+o}Qi6(K<%vZeegZ>Jk;zCOT;ZM#jd+mWl`P)l#kJN$j5@!jQ(3DP zlv0HPH3A0EAL&}}*bl6xV3|Yn*Qiw_l6c0k18{+T!j{17MQLTUiSS;cNu6MV13xxK4 z^1(`aL!mbxy{qjmAuAfv5ZX6Z*2cu?+~)}@8WXSs9^{i5l(r9t=g93VB$JQ&&*XQf)Gfli~@guk5#6SN4 z$j&P5@o7HOWR&>W;yuN#XlAFO09nb}O8>n^Q}$R+S4I z5paH>jC^IKytJVSDq4<|f!v*jEsq{}6-&#UH+wfsZPZoRrBiAD015e0)PN9$tzF8r z`EAfz``lr9W^7JqcO4YWh{y>X6?x%%36-1Uw4kjew>Ll}{$FfOD5S1SOKnAM3+$yJ zsN3HVpA7@2I7Q_vO0=(kZ6^4g8-mPJ&XF`n@8(vLuk=OEHI?PM1=`?owbbOeX@9bm zvTqA#t0Tv+Maua(Z0VA?(lZmSre#nu=6{gW&RNX^ZIY3-h0Yf!G(I&{%{)@FV-yIL zHrDhNB9{shN>JZ5M^Qj1vtwPBN0)K79Go8Fa_QVP`<4b<&AFkqB4bOYsia7u&QrjI zxU@LZ+-$Z@?9oo5kVyvkbmq=1=USZ;?#O&JYKaj|I+dEeNe#9OuoVqq0nS&KO0@#A zwG-6Z)=|?m?sZKV=4;MYHrL$S>TXgFN#TbQGbVn8NzS>ZO&*o^f*`-m%w?6#Dv$9R zVH8~to>4;lyJ=7txdRMZSBCfVCTgKms+p%RQu93Ui8AR@8<#R|J~NCh_MLQ}!%~ZA z1fePfYfn?Q9Q2Mh=iIu83`no=;+$#iMrr_>>ob>6Q!!H)n8<86P_?#z7i)`wU@@Ye zELIUsff9ch!ehWnLtk^z9#g6bLXd>5(%WUglr2e4vTPN$BXq5A3#J=SS1Ybu8an~= z*rm*|;f9M*$&m9rywOmJO_Jm}T)|3eGL=u0FX5YbAgxMDw@U7zq>F)jUlI;g@b8y6 zKbi9NPHl0@y>+)-q)3kBl!jweQ4&j%$xVP$LA6H-x%|pI^u!X5Cgtcl;)3y@pJVwgmGm9BUeL)Tq6q)taU1ZyJC8pDUpS*ivb5h`R zYH-j`BS>_ljdTLqc-c?PaQDORK&0hqB+%+IQyEV;BBeAsDhKZMtwu{h(ns~32}sh} z2g(Av;;>2LC1!IoGW!*2D5p+JR_z9o(vcBYTHMkRun0*~hzDWog<39jq`y4}`Vp0= zke!gr0p-DZp(VwwT0#()UDBnU&zo+&aPiGq)^1A8b?DC5DS1kT3FxuZ)ef5!N}kHo zq=h&eJe6HnCvpv}HpPuRGEZk68mX#kV#6F`H+#;y@cMB{880PIr$Cccr-(A-Lzdbq z1=U=|VNKknu#i%x4zv;Eh?=1vTGY7iAn9?|?h;a~Z(uhU_r%3p z;w0LfI09a0%u(u5BQ1xr`_pXCB}YStRQQ=KDqBi* zEo>VatdgXglesoMFN+!4*r5@(V!6gn`l_c-Cbk|*IHA6}ld@Zo$&;-dsO_M665@`^ zBjtb8V#T)(G*mS|HOl5WDZy%Lg1HR1lnVrelc?#i-)o;-L|idxbgE+IH0s0e6t9;T zNmytrs?@I|NjA2noB9KZ4uv9Qkr${I5 zZKP>!I&~0)055K~!;?0s24j$H3#1G69Wb9Zn3^O=B*J?F|fp=ltbhZ(#cyls>nWSlHHx@_~*-S^B71>JB88NjuZF?jhw(o}n z^6FWQryLQ2DX&QnE>Ml7O|+9_l9ZbyuH8-l09-ZcQX;cZrd| zQ>rOqj3lK35|%-I>yQ*SBWw4=@tWjJyHTn|ry=G{R*;bMZU;eqNhA^brq;N*>xPa| zr_?4#gt;;sO$jne+m5#qm96p!3IOh)o0DLEm{+S*>Dg8lT@5zpE}l@XT$H30$RlBK zYmSF;u)ZdHvyjId@&mm<)(Gz-MX$L{+WlgyCbdkW!j5XQqNPqPq$H~EDJRWj+wxpn z-wSO};LzYvrO28VBa}4EXEhSz#E_*9!9d@r?bi*Qxz44oxjG8W^~`B8lQUYZT_aN5 zPS?^DdV6)lnY_H@R%q``nB1CtGJx6~bZS%T7SC%3M71i`dDLp zf;#ucg(_s1*C}-t)YQc~PbFz7Eeik>W4O1z_)uE4TiXd#T*z;_ZX0A4*?3pwIQW+U zZDl)Nxe%Cj)@#U2h{rjB~wOAy&gxecjWY=n)?w%-wE zV9U(sJj+$8Hs>X$oGzq2u>!zbZu@+&pHjax7;LB})M+unN*ez$E^ivA0)UNp!e>1nLDzXhCqhq#;Qv zDj|2eejH& zu5#qoq_-(@(&KtcolTULSX^G`wXMDFgzUvviAm@CrP-{;zEb;IFxvG6;z5HUTXRmQ4zIUViKK1{-g`xxt-$)_1v(Os`{vKR7vPG zv$+2NtBD?+P52%i(|#!&g{_rJS`OAKI=Xh)4Y1pFOKeJoGlZo`t~v?0YzFWAPw_ZK z4G?$R=Z&XUUDz9LMoljhc|k!i5$ zFV!WtjM=|JiG18-bULxWagSdF6hR=p$(>=J{x$4&S_ zoma&E8)fY5s%uoETY`y+gB)45bzjP#VQg}0PX>MkMq5azN6X}e)MGavn&T}Z=a|cG zDJgMDCuFGXPS~IPJNU!mR!`yMnKitnPBh%HM35=dWyF!plJXaHA$C=iR2Hu)M)nx6 z_Nxe!8KrA!OGAUNxEfp3-BZy%N=XQNNd$J4(3HTFHNr!8Cg-LbHO?nwEROkZy_;!J zq@(`;HxF}MA2c_pkFF>S++E`*8$`usDvfdlH3|t7n5})^9l%A+(wh|l({gbuaO;IR z9Oal&GZQRFs_IuYwMtSz7ux7awXKdClh|n5>s3xK*|(YdE`jy4Ihlh92eVaoYdOO& zWcaPgs84N#xPam>x|EVG6=BeCjNTqN-$~-$WX%w0>@VS{=wvQSgk5S`Re(=nBHQhHuWk?}6+yDmH)%zbDT}Fw-+JnTc*CfGgl^dIA zabMzb)?gmXe{ZX0OpXML+RBEyqB$UN0N+j5Mh8q72TU0CMawP%eW*zd_}k(TNVUWg zfA%(URPk&6)G(9dZ-`p1Jg{x^_%?A=Fd-QF6LV|h<~<~CFM$fi_+#PC9MUA`49QGp zsKVqJ6via(*mM9^@lWk&)SCm`;$iVCRjX#+0_G%WGu@`ukRNy<30rZJy|+Oj#HC6C z9C0Lma)`n=N&rD}w)TF+R zOpvrX%ZSoJNa#h%PkWD1j&50G>H1CptH|SNhbIyjHu!e85t}0xiAsuG2FBZIH^k3K zr8!cN5ZVi>CfY{l_+mTC8CG=%j1J}WwnX?($&7U)QC5(ldwhlQHZznfaGNMp#l%AY z05TY}WnKK*P4MMqQzAAb0z&IOo1}cy<-xZB$K({h!TtgC^uNL zlA^AFE9YfT4!j)Bbt-mU%@7!+aTbY8tGK5!m2RcWVwoW6B6El*P3#FuhN5r1@h`y2 zc?{>?C2d+?aay}NCRxk1IMkTUWd>5G>JL8HbqgHL znm}zpkZwu19j_wgzXdefetpir84{zOs5A(Wq|)g~k^s0sN57hT)732{Nce}1xk+s) zC1erMe6g#OIHwOOXMFb6dyeqaE~xV}o~X4$O#&KDg?IcU<9N96Xj1^W9DG- zWtMn@nRt&w%uq8o^dmCGg%O&aJx#Y!1}bcqR@$taI&Ml&O@SNjxTu6QIO+O#)b?;o zm@y~F<}jB61;__(uENdNeU1BwQ2zjkY=uVQ?-QM+)3U8&D@9CJpERnRgvjNsK-{qK zQn`$t$|m~}w@ff$$c(QlSZM`41B$snrXM_c;zVvJW|~{{)@4&N{SKDJ7MTh4{6vz& zck{Zwg=!>|>9E9XwwR0tq__#*%KYD;#Wd4LBhFGv?x-oJikdMnv#qW7@!d*1C}yN; zG2V+BA*KZ_GbFsqR-vZFw%Z4EsFf3}4Xtl%M`m+Oac48b%h8az>UD7wSg8IWg4TeQ zx>l=#RN|Ge8nysh_>l4o@#vJgm0-3=6P~qJ zMN*kQcic**HOo_POL>yanuDk%I@~1dP}5_5h15pVk^2A7Z?ZW;;~GEz#kyq6QX zD)Nv$0JuFdE9NP62y}^)YID&(qV|IEZAx2g1Pvt#QQb)vB&c^M(-7AZR}M5By&e=+ zt;|yNHcg$jk#VbV3BK6YrR2&Q3AT$yM%Gi8TT}R6nXdy)r=|@(T$H$m68z+X%MR(= zOCw^g`q!xR>4&yk%2Da-er-xfks-y094_qMpgQR8etj^TM54@kTxaVgF$&*P=%+fp z3l5M0U5L7XNJ#7S#rLOhhc3(T&zC2PRXv=-spPJPUKp^VwSF@v4EeA zrZJh^RT6hU)N>s5Qu0k1>eRq=s!31bH|kGody+9O@Ed~lI&Tsvd8aw%ML$%gx~Xxg zad&C8CABDOHtpyD`Qv6qMZB*{LcdT20Ue3Wj%3z-7$u=wW6ZSf}og>atfPq#!IMVi(OiJD3Pk$b+!GB z;-IKeh`o!V#Etq4W^w#+t9TFcNp4{vQH%vuX^E-2({PJUa}@oJ^iN_0A%P6T=UvcYZJq3450aD^W#m9?;~ zKDPVxR6&lHV`*v05*u2Qw$ji+2pW%>O5AqnF%SUhZ{1Y;3*947nyM~}%&83pQ7QcA zV=BOFe?hQ2>e3DR4!CSY`0DgpE7gU!_hmwMgvV^?)3u9-_qtni{P4R?a&1C_+9gLZ z>9p1)C5cIGKtAD5h;Z)x)^DP4&o_P?(|enAKGwtUDbwGl z!;mI8ho(IwyyBa2D+G`L+;rG<+Sp-IR~2fmJ1s00{_s-29>q5u>~=p}<56d4F4Sqa zf{@*#MGpFi)H9-gFf^|(SoQ6zvZb9`-wwG(dGN{J>clKiN88irg@LJ~BKU$E>t z<90KFX;B>r>xd;~oOH6@H{GLE;ck_>eKGM0CGZ9JHphYsPNX?>6%9!W7P$2u*w|Z3 zg3EH&l&Q5W>=X$}0^?BX0sjDg3tvF7ekDm0Xt0eDRR>@+;+jHKCAfN6Yys`Q*6)p& zb$E2x@)0I#A+2qbb)?-ue(3{q*KAkn*AVJ8Ns4in*@WALDpDHMp>fdpiT+sAuV#vs zaR~T{uPrJ4l&eVo7}2;aj>;u=pCw@YdY(J8-&iiV zyP-NXXh8CzAPt3*5-shA&lvNfB+GLw(WNChZj|bo)eX!2;UOlY6PvZMT5CCLg?ddhU0{&8-E0oT&_uxs-ZWl-qyf!dxm3M{&;svxI? zJ1tpq3u$awML}muwmrf^iS9SUL6&;fA7J<%(Y&r=2&Q` zt)5LdywmI>N>a-V1r~quxT0MR#{K18Bc{N2KRhnv!o&1>nly;+r$QTE zkfNm%@9VI}YJCM&B{^g?o+42ab`r6H_VV)KuQCu^C$~? z6K|#=juvq4hs2&Y(&WQ&s<+%Um~TyZjcp}iAA_RfVzN?w!f|og%8anrHRnT3q+Loj zNS%E>QOb4(JUavEX4^NP1$DgpUoFU%e|GNl4f!&4xo(R;VfbX<$| zP*3IgT%2>TVf8aS5Yua`S+P!`4b#0=48>BA-esaX^KUx2tC8^%q`0NHQk37JJ&xOS z#{NUh5aoD+$_zrNnZb~xJch1YX=+u1ZhEK=plmPK4QFYO!_Q1tCrxSC^ImnROex~0 z5vuCa0UHhb9@tvQ)QCA_jk!(uvE&D5&er1AtF|nm`9+4G&C|Xc2qj0;6|T1@F{VUxHT@v7@Xs%ptqoUs}aZrAM5QXbNs3QWor~b*ORF(I1!=)S^kf zz_B;$usCB?yhGBc`Gmsw2P!nsNA#cH1zzw`M6(AUSkaGB=4T#E|o?WtiNtsS%W^D=E}A)UQ$OEsaOK zMQ38#zpBxr+#6_$wOhCCFMqBhe3V1keWFFjHO{|0C`*iF6s4pW6iD)kuu})S__4WpP-LSp$)`yU^J>p6#5&kZjJOckT1guz zHy26$)4hl|rE^1iMwM{G)oBWgaZ(~riKw*%Bqeofdo!E~Nl4}@K9$%V#_2eBq8gOJ zP-n`2Y~T1{6N(QQ+0ljrwnf4BwjaJS@o)MGXm-#Cfby9g;;saGiWG)RK!?EtRWbd)u}wrv!3*r!o%) zYr->&qtRgIlTeg-Xg)%3s7oeJhmg z)JZy-b|S*%B}reINzj$qdjo7f>6|FZykKRV&rzvY zSer3LefU11t1^++TScXbH#fq(VlX@QOp!9!Nhp9%A`hXbaud1 zNtaNTVlDL`1pGik+)*OdvGvB5T+LZOhFloom2#;zV5zZ1uE3_#BQg}!o_mG0mAii? zl0oQi^v0$1;l?lphP>^t^W8<85PVFZGqaPBSXh&1oirU?8?A<$+f}EOIA_A@ggk=y z%ZQ~`>$Lgv;Zw5>ZEi-K;u0H(hu7uMmt5AM6VxKtH?|=jHsu;^FN-yH>A7;Dl%uki zjEXzx{{Y3F4T9)oYEdnzTcdMup=?Q6)5O0BS*b^QK2)hzA{sk%2jf&_w8~hBhP0%{ zDGDvSsA|@Kd0p`kXKpsg;~x_dQbjqq5d$p6VmcP5*3@QNvtdi!OI?M^h!-cOA`LTT zWMF(lVYu!56zm-}GvuD5Fc}^3I{8h>01KP))NtQ|)|*jkmysccsZKPyqwOVB_S&)|e4COp$*a}gvvl;zaV{704NembQ_-*} zLV1N-fNfwp4u#oTvBzdn2_WAv+6HO%o&nXiw*`E40PC8HnM#;Clyx`R5-hD!nmEmunQhvbnVDdTSwi} zW=u?~i>xW;S#T(+ringaPTpb-`g9oU21(0}HNgC>2(*yDx>?k8i;|>j-}T2Rcymst zQ`U&_Uv^yQ7)sReN|CKD}@@@*p=o*?_Ui>I6j zg`CQuTx`nj&{(WE$~>wy z+>6*OO(WrW4btUfROvHwtXg}{sKfZD8Vvw6fC)dYB#g;W*Gdp#p`|Gimh6QofvK^i z1lhyuf66^E7!%9l99!RNinsdWK+RK|6vah`!%n`at6Yf<>gFSKr6^Zpa&{irPG*ep zfIrvtrfHl@BqaX;x9CXmYVs>oQ58hRjZBE*G=&l*IBbxhI&3fMZcaAx%^GyJVacfi zsEKXJ^z(Gx7wV#)&C{VG*w;-~USXkp1az&KH0Y%cM$vGpG;X(PHYZb1G0@KZFk#9rs>n@-4~Q>imT5Q>^0 z6}G}RVNN)0asW5f6jC<7L$*D+Tb)stPNlH5r7*&tmdP56j)aW>dXi4(Y$v}=flj7K zROiaYHA~XvJc5Gih&MMERmlL{-wQN4%MtS(HI`w*@#`s!7 z16<~e+y4IZO~wguYtB)p@9!kz%5<49DDOKqI^xQ9Q;w~LAf%uh04;m$2iFV=bV#x( zjg>%-y>2P>Db#BvMMPhHx?)nM)!eO7S3O4I=bbIxVPz-^vQu%kz+x?1nxBY+zp3JXjJHb(n`zJS! zR(tn7Ha6Q9KC@7y%v1*A&x0mYlC0BlidL;URjo=O`9{O83=Z;-x7Xf&ve)gOQV?b-Klbu83-T-iBKMWK;FZ06Kmer*kg8PbWTowF%+h%?dd8) zUQ&_^w*+g`y3^3<+Wxql)YQCyG*y{cFLe-c1BH}6AJZs}(_y&6oDYc+-cXUP#4IH$ z1wfr!+QV*}UktqK#V2wGSF2@OE2TN2qLCh@Q4a*76l+~^SOff_*)A+}7ea65IGQ-6 z#L6y2Vhn1c+o|y$G)E<(l(e2yM;;;2>+2f_5`l2o+!ZGFwkdXS47FRH%UTkZyUu07 zbsY=y+V}U^^}}>D@04_t3;lak6%%FZH2(5PkIXJeE=NE>2q_J)odczmdYopJJquyz z?WB-~!72a%PnP!|PPg9)@)oyVy{xSzATGdI4!BT=>r$LlbtOq?B_(S;I;W`g`QxZz zvge*|QB1B)ZaY!o#ttpJ*;-1-_qRcfC~rSWkldkmpJ{1%H`~4c07HkoX>>Wy@)b5^ zEsF%{S~-p1qLt+%uU#jl`r+2k1ZjD-OiZTdYB-MDZ8o&aZEXHf0pD;hZsc{wqbB2u z*tSE#O1u({9+8&k{7hfF=B=a@18^P=qft@;+T|!EL?1Cmzy#tA<2=+!&gG;Vw;hm# z*#6P;EBTC0@G=!zg&i=`>}TRXE8@(QrD<`17NsQ!Bze$MwE{NXM2@Er{$=2PdaKqR zo%eiqfhSIxt=~@e>PKs1StgHG<_cy;@s#CEIs>XyX^3e-4xzTR6WzezxAV3pzYlyU z98%3L#Y}n6LPH534H;o3L&VuFgVU-OP5T^2(6~LFX~~n#p-60{wCP$F+U}sOLe^Kd zELVr+R5&XFp_(MhX{y@khAc>EHZe->4bo5M1!UY@jqy#2Oj!ZwPgv+Jugm7FC?YPA zq2oc%K&<}&3{sB{xelbMON5NqT&S*W>%N!N(LPq0MZCIDl=n6r1?`H}$NvBoRa(1` zu-#?JZMOFw@& zuNBJ;7vzms((29a^iGkEa}UD$S$bNn$>aOnx{CV9>7&a|2YTGE@fM|9ORhaJXVC*| z{+MV#Sd_G{@l|38wejoV+f6*Yrw+2cDITM~JW`Vt%B(ca)$mGr0sSV&m#AvDrr7Rc ziXbe|xQVBg=I$!lGR*wRK%v#eIwC3X6|3S^EgbhHJO%(lwKu{E&=rgB0G^&}+;9W{D($H%0p z!=+B#4%Ws2spaTJ)J`0<42pZXLWs;H#-hg&Sx|2O0EnPBD^WX} z?}WNUMky3%ahcN74K@;xq6fMCZ-u;`<1s5O%5o&Rs6vx*6_Ty4FS)Ske)z3@RIj@j zdy`Fpjn%_dZfaaDgTS6V>*{YS<_Z&(s>G_irMjrI7QpA*+32&AV#)g7OPwa!bfb0kuZg`pE6$&?pcifHe^%wKY zZNsIspp}MTwnCKY8`(hb?6stR&K_T9jXA1!0NxFtCz)E5qDOs@Kf?|{T-!1G*(WuN z3x?NLbYQ?bV8h83!QZuo1zt3>M&MeX0PcVNI&n_1b3WG8g!s>|Saqe-$^QVqglR;Uf~*buDGPBv`(o{IjcS)t&8#et8=mTb z2h5OCf%@-#@yiNy_vv#Oml?v-?5sG2r>G-wj+sc}RTG5yG5#P$TB=l9$YH=#l9e#0 zS_&yC0{f^CkbijZY*bc6;Uiu)R+Q2L!qdS(Ty2FOnc{0JP#IERG`cbvaeZ|uNp*Yu z6hB-$Aiz=p8byxhwkyRKh?01R;uY-KQ30nXzVp1j$Y~t1lpuVP0QzEMou6c~-l$NP z>Myg)Iuq^F{rKat=p=OPV+Z<=nO^Jc6+{u?vc6NUbGQE1s|7N-3ctc!otB@kMWZ5) z@^J{vVHi&DBSp|gPV6a>R2@-lg#<3 zqxwykD#&(CGc0Dh>^SG~oK)7DX*W9;3r#Og{R)TI33;1~YMTO|OM50$#XgvYrUXi) z>2gsW3s$A*NK<3Xp>lmjCtCEXwnO6t*IAcCpi=6TaJC^pl*8*-hq$F_7P!^K-)mS4bJps$%i^tC9D-@|e6vR&-71GeVM`zBx)y(q6!O0p zbDZh2M7s4}L~_Y*;UFk5l@*Yk!yz^RT>OS6NIWUw97>F#&dt^LT6>n50s_;n%G@nU zZ6zewq$jP?Z)`2+z7)}9(&tg~p9^brsdYH61kRTEX-yCSM<^BP3O5$jw&Zp53#u8! zl?`VvqU5ovcEe2hY(P3|ruOE0)p)PxIcSKMtCdHiYe`fn&QuG{l_Kgax>QZ?bo-C4 z5NNgNbyZ4`q`HuaAxdc$yUJR0hR7iKQg=Tt*lA~4oe9~r_^_$fCuPQvT$3qFZPN0u zW4_>!6We2P?S$N`og1S_TWwQWGG)4!mgCN=nA$aT9lG^DOm)t=Zi~!B&FO(BsuYD+ zn^0oAc#X;&xb{?*Pm!Q{h4$P7YxL`gqJ|_^oUIklZUift5*<@|^<6*&+o`!dzIcC1 zs>q!eFjQKG<5cuEqzQVw+YQh_RkV}pH?|vjUoX>X^!U!smRywbn_449P2572ay0@x z!${TT>54d>=4K~<(yymrnamfvb^9qtg%tP>W*8KzY*(9L$Z4)?in?D}S`t>9fNj4` z`eUy-kMLnB1EL0z^xGV!;enBtvwc4@RjBS$Xw;$Y8o3+z19<|$6z<< zizA!-Y}NB*q@tAqCR?VyQl?#$;C1(qSLXpn$O{6-!+R^+6jf2V&LHV@)7WJV$*}w> zbBTsLNEDZ5xZG&Jd&E<(JfM^z30YZDC!iW}6>+zW8GAit=~;S}A^8Y0<2dxT+p|e* zsM$cCpxdpjwjd1e#(HjSi#0A!sb&N&de6kTwK1VK)1)@yep*Pd7B{{ld6~|phXZ12 zoSxCpm!Py;actZu1%&KCw%6}-g=53aG7Fp8OBi5oa&=2N%Pqj9S0)IKvj%D(QaQC3 z6Cp_{7C~3Awd|2??Q3Ev&012}A$rm!r9pZ$Y8N}{?S8iH(+-+`T7xS$6HkK=;+u%< zrVOURKzEWCtzdQ1NmqTxd^B@flIw32xR-%^E0~mMO7|yFPhfi6-yL*LWS4UVv{cV* zkr3Gp>{f+J?B~QT_R~@S02JZznWo2u8TfG9TIDW3IroC~pxt9iN_!jh_84I1M@xCB zOC(%PN{{G+huv;uS_)($IdRFV(=FsYfy=iu%0V0NxUuxu;4p51GCo2$EY@DV)6=s3oL2WX38b=al92kaj8->N;P1Sgs~krBt|b^O2fYz{F-c zV?1-oX z_N71v$i7MmA52YtBj+%lC1zOAW+F{0Bc-_Mj*e7t64>1hjgmU_7=)mbm=N!|wGaTY=G3jy_CPLiM6zYo2f(QeB{e~sA2$Y!MtGI{0xTFS^G z>k1=lY<#C}@dj{pEJNZ|HKif;9`g{~gj-^RVhHctZHbu_ywcq0(<<{CyX3JYOt6{rc$5;F-?S&fTkEqfdNEpPkpu@ z#|%?J(o6u`u zxR!3?VLOhV{jnQqV2QR3QJRUK>*iCZ4CgVJqCP5c;=9X0R;L+G{=Kl#tGoL9zB`K7`xqb1&8 zKj&({d{*BK$btU=4tW+#Ou+R@T-egys76z2Y(-cOhT1A7&J`dbX4?XwJ7V!>O0V2G zYOPYxrTi2pr0GDpIvY~9{W0hM($?abb$cMEsdrorE_Wo3J<8sRl$CIFj)(v^`>u9z z_lH?;B0j>XDwf-FXGm$N@4L(iX}u#=> zjT#(sfYXZ(6)8$9QuZDEqv?$4hU*C{42D}rasb}jb;qsJ$uu`Tx^>?yY53@7{Qqx>iq0E&^l^~^;quR?UNFSJNNC$Ca+Y+`x<1Dl~avCXP`wYD{Uxk(^&+M*B5m4A<^1R)m>FCN8U4{>3grK?9)k5!20%R`Gi~f5LYWtGT1#(*RVT=7`}$ z>9Rs@ea@Sa*qdQ?He=7ZysgE^s#XfyQ-2dtlH!{e>Z>T)_S<2FyrsaI&p3x?JdSP0 zl_|I%EF(2cZFXZ|eN!;fODjWK3Hc@lS;+HhVKThzFb%@`6Y|85N6Js@VWc?giAO|w z`rQ3-IOVDdqhEb^e)S!BH#Fa<56QgRJidHq{e37hQLwOpoH`Q zsOmQAcg5`RRYzS9fzeuVB_+x7ov{|!tbe-|6`4s=R<$dd6i1Yvzg%7)4UCpJM@j@* z?mVqNo^!Suppnu_OOFLzh%u~$2J=#w>4O4#V8=kY)xv+Z!6iO3D`fOlCZ0$BtN!d$ z3|$|!)BgZ0ny>zcr~d%ioKoxvMghJI7!bXWD7E_H(^j~dM$VoZrR8YurRu#NhXzB7 zBG%ISQlt-3kWx?i-#k@tcIl0{6-hMZJXl#rIhC;B?4&4IgNP-BN?LEIH&aI;j^lw& z{tO0>5-B0&=xXi-8(;jIv1TMwBUBQWm~GxsJO0j~I(6xa$-$(R@fwhjl`869$rnG7 zSh&=vDbNdvLaZzbPCWkr+F5!khPZ#n>Q~U8)0jl~WUX-1Iq%u2&5+^8Yb(X4)HtC# zCN#N4EYoQz+&6v8iU}H4T(L@&q5=xKZV%kUPvLDgu{hMKdDn=N8gPab?BXI72QH#q zI!e=WwIrk@6K;gz9!y_|vPliM@*Cq(mg6PT2~&X^>rmL^pN|-ktOF>z?Pc~}nrWRO zc>wSh9D4=*R`nJB9@6TSS@3vY_lpj@48w(5n5P3tZ3mvUI4^SJnogTq#NTU-EwPxT5VM{rlWwClMXsYkU9JQ5?q&$yhcW0V8|*4*2VRpQWi}j*?+``Kot3{)7HQn3^i#gOSP0P`n5b% zFW=3o{{W!H?E615O(LnBII~olNrN?t22y=3{7hsxls=@ARy70W?S8fxr;j#aLV)^G z3Q!KDdW(=p=yB)=P`pEmd~nw*jK@bYYfi?GMSXgUkzGP01gS>+#aNIAn{?XvQl&LV z%TB2fp`lHSywciImX(4ukxTq!jBs-_{wbs(wLB|6&(R+}XB2c^$_@y@xqfh5~i*hb(o<<~%*^*sAooVkf% z5vkGKLkUS_664&lU|rR8-r#;)bo3-)vrud@x0)Lz<)%WA3DOir$qDE$?T3z5$}6qq zs+CPLgJ^`3pvqcO*69f8bL#Qb^U>aOrlpiF5^$CZLJLI ztw}2?S=0*7$~X14FuxTKsb$r=rq%&0rNWlU(`%3|ex1%dIWKjAxwr@P!1LNgiMdGw z>1;;UxH{oV;?mud^C3rc=BnhnbatPqL#9eG*?aptd@@G0dA3hRRAwAbF1GY*;|&HKa9HOxC(XoA*SCnkciTW*KhAZ7N}h{CI$6{r*wDpbdeu-u^ zag3zob}5Q+Yl+HRi%n$jvHGu3O<*J1P+h$1#o8GyB4LtvHn0Qglb)s;TRGzHK07B55^GP?(GBG|?>=OQL(126 zuE2FCzWByd$Z4kc8e0Oy?kthl2zl(2MWv-nD0rYx(K$kk7QqBJ5xetYQWl*$s`aPAP>XlXVA=TRzE&4)pXu+1rq zy)CuJW8fZ>518~+q@*?q!cwg#ai|O1>)#H#^>U+--uMKq*p>MWC2}51npY8(rs-r6 zxLVV?`Vf*6-B?Y{Gf9>`yMAdptH)yP)Q`u>S$4MLG)i1@^&*lveC52a>rV}fgad0{ z{{U0+#ZjF>j?H?}scD$2=@FEoq5;!&1e3Y3BzD`rCT3BB{j%GU`H- zp`lw4di`*l#x4a^>Urg3Ejl33X0n+NrPqpCWzee>0C%_T0nl9It)_HcS~wVQZTOyL zbCR}3wA9M}s5>aJ*5k8P%#AxKs%s8DOC{BH)2hIG?l6^3gA!CmU>SyEKrJqagQy;K z+g+|f)B&}(#LY$U@06h_E@mv_PJ)1Z$ZbVy{QxS)Oz)PmEe#OApmUw5Jd`Wq)iNnS zRg{uBWkj2isW;l!9=N(~4@BO%RnM#Gjo36$y)9AWMwL35l+4(%Pz%zkYjNh91lTD- zu!M`9tfEH!@Rd4Kk4uo^+ipIk>q1#Zgl;;db{?Lcv3a=NLZ(UZc~Y*@=_#SNHWXQE zh|@i7le0UR=Iwei^p|b2<5mvPMdDjP3{cI0kTvtUiYWhIU16^zL zvT@OxM=-lmMeLQby?#lO#CfR|D60L3ltR<~YR2REk8Den3gdyQr8%Pd*+VQckBCrO zn?O+^yNc z9eZP#bTusuji7=x4(ETR$z6LNPR2W=a3GDje%VNT9pRm0F7aP1%V{O5lMlD5IvG&% zX|shyi`zjY`eN4c-!M%fBVc!l| zoEXei#I|2cP{{uP^R92x_eIU|W|+#Vq@_(5A+xx(fJpxUL|YhLSb~Dul!nx`Y@}QG zW2|*_hekHZX5q~L0C$q1s!xR~By=hIy z?7m+)&X(Ou_ur-^NpHg_NL;0{Bw;J+-L{b!tw^E~Jywu?3-x>``-!_=`4bzCDozQttg2VNK>BWOBc7w=Mu7*?&4M?oHTVp zkeZedl{DIuru*F_SbWb@?Y=#;5pJ^My7ZE(HjD0mU+@@9rm(ol3y|Y9*6p}coY&8{ zwiS{V+hMjEbqQJ26l{${)Tvva;4wEw8?vu_?kUMafY?z(jg?x&kSv0I$=u_1tgnbX zv^S`;bbk*O7ykgm!W5nmNoc7)PA^9%K2FcVVSd9Qr7*I6`-qF1NqcF4ULC> zy)gWG8D_f=TJ@#gL%=7lf`t6~5pUBK^VH-yS-4izv|>S;PCF)V3ggM7@j{l?k|Z|b zld$zdw;xUMZE14WrV!(rl&@a+t{FkZ{{X|?Eku!RHz#lMC;seDwVcd~3_fr|q}Y^% zw4W+_?xT(m+7RjIhykf+`IYaV)5k|khtBu9%@02&rRS z0zt7+S-0>Qj3)6`uwAv7d8G zH3~deVTVGB*3y6>3Mn9NQa4aN2W{}rY87g%+p%CmEysPb+PTaqscHh@BXMiv&~Ubv z(}&0`O7I_QCT!L2jsuykwxe!p_x+l*sSfyZT%e?x+T}`lZbG>~obzKL zXhKi!D1v`NKaLgTNK&CjxhKxGU-ZLrpG0N~rp#==A`E3DB2(ZZ>Ob8b?e1-bX5E)i zj?*xyvZSq~t-@5D3D8Kgx7?3#F<()Y&bU`pWX8;{-s-{dRUaRaYw^_-Nnk$O)aNv( zlopK&xasCeBY%8DdHo4*Gt|Q%CORHaKpg@`!+dX3srjBgF>su#ri%q(FD@)sP2>Z% zuzDzg`!@C3_}HDp*l_+K`NDlkQQc(O)9H>@2%Ae$EUtaS&VXM{ z0OO**EqtH`x6Lt}lGi+;E9WSX18gL?qHWkG8%d^B>Kx}IzzoN1gu3LV-DtkoEvDpe z>xbKta{VoujAYG#Ln}*><3|dR)7Cz2Q~Rg80{}XIfO3X0;Xs%7P^_mm|uY z;B9OzHq^Z-z4}=xCvLrP(W`as8$AC2KwAn>b$k4lwF;?L$<9>UYN`EVYh0J!iKQV; zC<~xWC>LoB$wHoh;bW5q$O^t z0rcMb4Z8e}*qS!=#uwJf7=`_x<$y}^8Wya z5V(Z3Efg_jCtGeWNfx%Jj^8{v(N2>sWV03b(SOX_N>Kek!Zlj8q;W3!t6FUd9D{yK zR<$Cm-f5nUyUQ-BQUl455Lzk?r*&)c>~GfzDH6pxOnGJ2s>Raljwt!{-uJk}h1t<^ z#eS}evr_|7Cn-hPiAt6QhnC7v7x%xe#|n%|r=~p2-&P5L)8WL@;VoK}>e2#IZ*9_z ziB`a?Y)0pnfY3D3$B8L{5ObXJb=Kp69Q;yVUzay4m!D+0H#a!qA1}yHIWYo!!r@m7 zbnJZB2^PNn6Dm1?yUwUfl(}*xI$U;Bs=0Z^+>@)hBp=fl<8ca`Lz2tPmmkx9ZL4sFHVC z!oz}l@N%N_Tu7w7DJ6)_xU%bx4JkkgP&X%G^}?4QxX((NQil$R;_7X*g_qrm_u+%J zx()m9hujCL45~7gwEh!iu+u44gK|kK9mu%=o`4J@XDqD6T5)qL(V#h2s7rCl&Q5Id zT-1^}UfoI905>>FDKg8`NB?yl05Pa4))t@~uBHXDEV2GKV2-IJF@&O2V2! z9d0%z*wf2U^F4Diw@OP1Ly}twO0?(}aDEb$Z?aTK-`@C!aD`lz=F~ehPgUf6SY&HiLFybZd574)TxhS88 zwXC(sJ*sJ?RWlZP;L@@!NI^6eu$Yg4+wMVZe z<$^+iCg$LLu=vYazaVh(vsax*uhl6GOKr3}Q8GlA9RqzTY}-P06TR>4imH~?#a8%W zX#v-D?Q!GCrel3G>02Y+cMUs2hM4f%QQ&VAY0TDUQ>t>rbV+HjP1{R>Nz&lIm3FfY%N=Q-(y^i0mFX{SbM`<12spZJ`bwX%oeD@ZZ&_j^kN>*+_Qg;In zntp1e(!49xsuct90;(K-Jb4NM*&cpUIb-&(r0zBtujZ1@cH+cH^~orv(BG&r9Zxu< zrIwj19K|@Ie2KNi{qbVFP-euf^z^zpbCY1o-$4vtm^jdxVqTlI?MpM(L{lIp{$ZG_l`b|=2T-rcW@_bZ1U8S_R{ zrp=E@k1ks%X@`>4P3V$TLtrSphY7ahZ6FU!K^X&tYN=G6j|Bv};R}~gd(4IqO@eP> ze_%IPQ?@3|#llKdJ|4|xjT}2R6Mqz!-nO|5Nb`%Gg~jYWZH*mKF&VOhZ`~7*rGz*& z&mfbkPH!V{rkR&#P+_j3)fQWv_aKUdXA&IJ6Rj&#MPXJ0aCYs~-9v{oej4QZjJERp zI-6BlOqSi9HlmppXjw^3l8`{UN59h$TzbVJM@x<^3)P?j87ENyUfbTln_*8cXSyv5 zFh^W@LCH;%t}>elD;?6H6?=N(l4{~h;B+=Te)}spaQvmSHe1_o+o|(0RHiXcJhnup z39^vo$sXd@Hu;=1h;elUrE(jLkIa_&sBYuX8>wH*8uUIOL(CE;G{}9X06f-PVTRja zgZoY_leNayzB0R+N`DFrrlg>Nu3K_Tsvd^TX&0M-(2 z0+PMQt-?W9`oj&m;rOnkGSXx3uzhW`56C48BkR6CRI@cLM_iNrbzmfii@HJe{?PuL zVLmlxJI;inD^<5O5D^*ziA?~qKuy2hBY zEsu9z+iygp<%c~2N(3%VHMiE1ohp=uz8#W#=~j?P_at8pYJ!GYnyJnzi2B2B#>ruwIm+lDq5|7dtj+iPI0HyscNY{+tb-pQ6;B!I@wm& zMZ5iRj*`%!Q(!%Bj6(#D9V~GZHx2x|lx>l`IW@z+BUK?yex}sJPKhusLxrc5 zHEBkxUvDk#i#wM&ap1aCwJpVism%nCK4%JSR5Im2()g0DYFkthhZn?h?~EpI5rbpZxPmh7=!93yUR?wn%= zKH$ajq+B=qVGvQ`^pZuFm!OgQxh?c?@mSboDG9E5-IowCZ!Ss!)Q~QmHP4U)Y^HdRx;9)%RPG9-6k0 zb*3*N}wZV57g`9~jPxWdz8Bg$+nF4s-5BIdW8a;eI4QspH* zP@RB1_UJJW$du$xF1++rlsJheN|W2mZN0H1(^#DH*7D1PntaRC=1}js!kCm+m69F} z0d;=PSGF1%q9E%bK7+MxQ>iMfEo{StWQ*UJ;>gqNeX$_Wa-2x<(ed&aVbBhcml8^T zpZ#!&LZ!PUw6>SsP$SHMqBi>jlxX5y&qab?{8; z-6k9I0vP;Yjk&5#$@L<@3@1I7Bfk#MT&W`I1ltouHz6Sk{;-wX_fgdS1{*v#weuu69HzkTtqP0Mg%$Zwe;V6q0LR z+9}xxHqEbjQYmjMWwoUeXR@_NkcDVNhDwl?i>*o1O`s0 z*+Z=9NmEU-R%{&s7f{%MQca0Im}WN>rkKzG>IJRXVQ(+gWK)Esu}4)&04&8k0TP@s`t#G!)WH4~Nhbet~0U4}5AN0II+X01`2` zE&?e}DiTyQv3B-aSJ2z@Cu8*68m-v6PeF*uCv$bZfZ)9;;Folbj+|;b^_mCOR>pUu zxR(&{ZAGi-E?de8=n3uh$CoKjG|a@m%VBW;01;uuY(cevBI4%zV`jHvv?S~n6+A7e7|tqH7<4CDhY=6PkzpcNB)DUy_9PyF zk#TYjy|C{zXw0(8GRhw$fE2Q#oeAr4Yn`#P4c%}rw*`kcD6w^uWrt(399)8t86a!&+;Z+UZQNl%GQ;K8&8oINz^ploq~=ct{-@8%=zgO9EO?};Stv#Jx~+P0 z&*DsplmkLWU5?Eq#f7@t3s`pI{T6RyVn;)TqP{GJHCnzl0`ht22i<7;novU|e^3ra97Y- zxB!j)Milb54|7KkD|E{9luD#UG@$zu9YIWKDF($M#M~$z`}DpiJ{#q!m6}x6tI^&2 z+M85%pHQ9@9c|e}^9f3=wUVTbBG%L28rips`Icr=Tq*PsPlcDAFlpS5V=l}>i7Hx> zyMR)Vl5N*m#r$ulbY>aNjjVZgu3}i_e4Qi$<8jP)rVT@jIf>_G)MHbi!*%D=tt`go zr7F-j^P3CUeD^p_nZ?}VfxkYSR+0*#q%&iE%948g!L|}AJXD2HyjjiFgNX!P4yR>$ z{{ZqZ>&aOgF!2{H^YWcSl~R3`skG7RH5QqutM;yxx)OzheS%kiY)=#swSkcisL*#L z-y_S3an&_i%@cDjWk9OcUyyYKIGGDNz$0O(Uu&D#AJYz;x5J#nJ#yK0HGSsLE{P3O z`7J0X(dQOWkbB>JIkeROr8E8avPg0bX5<0dKrDDMD3c8G2iVqh! zNmi3jmzgrMAXgU2Y{`XGEUnvs6ju%9Xw`k}0N)ZA!&#BNQm_l0a~(phtk>#!Zl5Y7 z+`80SGSLh|sk#uiYJ@lV>T$tzIFt_Qut~Rbiq)L!5OWn;qb8Y7Ts1v4Yi~=cQbH_{ z5|Ati3JT~wG0{B7;O8iDsyv#eUCz^KlouQ!>RKUu3J~S*YoM0wZb|Z;_roTa_J7CA z*`A&SW~KK;HLb>&mbN7|sYG0bqe_!!CwEH?DSN5(9>A2CIKJjhXJp+`f_PG2Y`7qW`2euDm;u&FHru51${F+EXr%=r24 zMK*l#A~})F)&qlO>fYA}VlRZuuf$rGSY^grv0=wKiYb0+XZ`YyQ62BU_0Z*XS z+Gd9X;y0vCX z+`grzM3s=BH?Y)gd`0dszHvj~w50h;RFVpPt&OO(=cPE7*llmEM#%^l)$9jcH3^Cn znau=ts9!Ae8(iw9sVOxEBR2Fuh+@J0cQ!X9*jSCnYwf-~Q)#j%)M_tE%cxJqB|ytl zg=%)@9OWeq%h2PSIhWRrb0onQAkJtgxBqjIgG+G=-29TLaX_fsF zyRYkFagnNfy1`Qv2@NGYu%{kck?d_?572hQsqPX&ktH%?Nto1$DsZ;K5~o(3)TE^$ zH*rY_8?>scxwfCp6$p1WbjRYLt5d@PnB?HBo` z{XZ^JtMzxX+}fC>p~NJ`RW6W*3&Ubo+LyUax?l4UM_fI#Wh#|Tbtcr_JBf1gq`+wFY4)PJ9FF|9i_bZv4L8)HMZSIT^lLfF z;$yKS$&K)4J3$MQS{hev!V-by01{8v4q{=h5QrV7x3>>H?yKo~OwKZXg};<2u-%o+ zOIn;82OhhM9=5*NQ{o%>j+F{HrNELPG@|467|Tg@DqfW6N^Sy2s*b>6+mj!q!hQ&y zAaYXbRI;YhlxYWYqv`90M~jXi(sLymgGr&vr&g)|021Qn$AFNvrC}qMNfsIho9l-# zvT5Av&;c#d$Bp;>)n;}Ix3-kKC_3MjlUpa|*ql${G+dPu7HrKGWoCf#-88qJOj3tb zONHiuY&MWU(v<^Y(|lTP4CJcDQTu_ zP%cTtYvJRLc`GGw$1YH671!vF#MWPc+*dTAMbe_L!%dE$LBF;gb-e!oLYJA7RHe<4 zT-28I)MqxdBU^5*#+4b9Vic0$9L3lRSOeD#;*}xsvn{&X*l56qOx zYw)Nv=T=i4A?DQ0zqQmAp7U>WpaaI^YacTydqLKoHBwP_n@T zWT_rriyiuZ4%o94x0z@pT?hbJY8`PUZ9h!r9>qQnQ_({tfBKW2iA!Z` zNJDDV+^JS4<%u&dK|&fxLJ|n>Z-4vF7}<5isX(-XZML-weQk&RCDMR}FSkpMpG;Lg z7PQ$~I;GAQ3BtoHrF^pMWY8o>HDUhTRzl&+c0QA%?vH9B` z;u!96>U+sW-$qzr0m7r@)g@rqbQcL2dwt0r_fWmoM^XoTVbO*WWTbOBz~8x159q_0 zm2)!YUZMO|RXX+RYTUFW0JUl-Yby8c)7J>n27}8f-M=sBEsJqB4M&IBzc@~XO<~F` zn9Fp^=cp;AxngV*FSDB+_tY*n#b-uBs!dwoaZNT)oqOusuSZd~0aM6k4%!aC)^x7PY#=g%cflZQEe{)%+l4=*#f{Q-%!5jJ$n*yo&3E< zL|Khfoo=HwD*?2|EaCR5A7U^2=hgA1O=KNYFicqEW7q%8?by-j% zOJX%4a|D#=_{5h#tC6{|PQ;KuYi+T)8zWYnYfyx?Qg5oxp^Ca%nXPpPS8&Myvu&DPFg*~*Y4GxzK zTS^qa#8s?!+TX4;T;h&msGuP=Asw{zOnCZ0^|i(}6zv+h_wEQYy!;Kfc~V|j;KppN z&>AddNojdbCPZ44nGMHaCwe=(M@s>F4xNS@&Sn%cr7Tn99`}&ym->K3 z@jGCK+AyB-qIA=7cpbv(TV8CW)7XO2vlRIscao@|0LmHVD4UWMYm@!rcDC3|R&k^W z9OO`>PH?MPa%_b;t$)0rNd)!Wi{XWpD-|r$nJM&UB(VeI9t{Uuij@@gH}yZR9r@y! zGlj8Op9?WFS*kj|L1trZt+tRsI>I#@8-Ol-P8noYcwlQq`!17~pf#n=dykEhig<-o zWycdtrb4GS=IRmH(m#cuZcK*Tr1@DNdqej>xAn2gE{4 zA%@n2&?`s^vG&4bx}9-Idr~Rz`EA^eU{ahmR>0idUPW!St&3qwK-K5NMMUb>xah&- za-^qo9EC(vQfsf4RCOr@@(`o$HCy;$3T=9e3|)0Ll(X3?zw*NpT^&_vZK_>B$VyNV zcyUPyR<4%X;9mFsc*Lx<)GBf&KTMjYnMhOWT7nXyQ(yqZFE+E!g% zR^in)9f3L@;tet{GnXOPwE_r2EC}?yv9&(G2A7#pNvWhlLKJ}Xl_b8FQltff5)IX| zfUv_?E@dXOwCNCNl&Xxmhf~Q*K4h}kDg5N^Yic@)9kG)(<#zJLP{w+jQf1)RG_^g% zf<~ial_Yt=7CU?TVaCN9HETzbLDS6t0Ex%VJbpKZH0R6mGZtW}EoDk9(&=rmfqm>0 z>hEuRV+AKMWLX*hfij&Mt3rVuSd}_WR$?D*@YpLz(3AiaNC~yb-|L9!6@|B>;UUFh z-3Vkjqw`X)d}~x{lIFG=lKtA%t3Uu)`vKDv4HN~}7FUml)aqXka$N?mQkx!SX1L1g ztAQqHZ6A)ZdCv=rl%~l*JKU9S1&oD~_^HA?%8HD7{eFcV5oUZl(5ucg`T$55S{H9J z4x*4!FLazx*;$IX!eAn=Oo)uTFd?+l+hqwt5zrL%S{Jb(lY9GZhV#^h8=pQ4FBL6| zC6`JPl&M8uwpGwuxZ4$CmQJ11I!*XlI4T2J7}o9Dx;vRXD{zN2WO13Y9;FzL^!e6nx<+RLLy5({$GA4z|)ZP&!DkZp!m|9{q9dtH%80NQ+EF9LX&$rZZ?$ zWqj700`^jp=BqE%e2;u$YI)x9_}`bgO&svGwvo3gTh5a+5*lwTMa(FbOlE)eb*6L4 zDs+xm32dZj+Z-OzIY8?pg3o%F3EnQ7?+l16v{`I2hUjR6RCyTXs@F`h0H&amXLd4V|FU3Ml{OV8$ zIySY^6@N@CGb#Yg^WvX|cx)LM@G7(AT+dyiRH7n*n+pn4$#L2=b-y2&Z*UUY!5t4! zHW$Z5cw3mWWXd}(W=UUo%5f#)B4~+l~A)uDFJju2K>QFx*>l(AfU~3{4$Ov9{!p(xR2I z$SeTAVouH3lTK81aAcZ&$&RHdS5Z&^><7$u#02oF#!IuIQ>DrKxgqtq^Fd8MqNC+4 zsQIty=rJo*GW}G`ixtF3g8;0pPpN5iAy(KWByLHtzhSt>{BVj*I-tasV%1(2Q*13< zu%)Ez6r->MbA;;Zi@?e+$!`oHyQUsg%{&w04OtW^)R%I#PNLG6CTA@)wnExP)vPG# zvPJBon|8kViMX|qvdnDjUZK;ct2HVNcF_Vu+>@tJO56=P-GYypSxUc43u7i~;k8;Q zt7k9h`!pntair9jQA@0ptc9rrZl5)V$F;Eu#m;$ddTI@_s#3lkNnC{{Kf{z+T2i94 z1lU}GeunshNrg*Db1eQ~eU$8JfP*Mby5L=SF6%?e4 zX#&boQi;957)*=6xH*ZWHZCEg3t77 zYj4g=iP}v>NQ@f&phLH@J6p}$8}v-Wn&ZH%qc+p2bTl%aWO-3zg)UzE`I}L)b_3jz zh(jdUNo#Mf(NEJia@|uGG4MvQN~KDbA=w5qMKRLTdeZ99bdpq3NSOrdq-1J5+E6Sy_blVq;@Z){9CZ;15=vkR1V9+upc#9X^L=Pj)% zAZWXrY9xyTvGv2Motvem4Oyz4IdEdhZ6)bun37VhLraH1A!n%X*S0nySlO679>tL} zBsMLv=en*`+?$x9%Z}O_nK9UnDJn!}0+vuk(t_8KWEEcOH`~`9nPpJ^1&1l>Orq)L zQ)(^gB}&z0B@3_#NZWJiiziRaG=|d}RZ625Gq9978Y>OOOKXX!f~OD&v0ah?3Itr? zdoN0poFg|*sO8#=aT8*xN`&0xDLqO{Ta8xkEn~H?tEZ9HE@u3@(=3s!xV^%x)I7^F zjTfI5w){2(o>(!Id5yJw)U?>QV|#b818wm6%N`*!mR)A1!xCatBQ35&$dbZKFEYCj z+MGgkrAimLP~2Q$@iT{9KFmv&jSN!cT!M&_l@Pn6+y%6|pc{eZDYg*T;i|ElB}-0T zlI2U{Jj#btjE0*EH?d2t5`k;qu-h6xC>f*{9lCm^TPq~$w_BveagL1id9*r)Tw_CW zn|1Y56o-}Mx|PdVNKio+1b|0RY%gVwE@gV#jl`k4{Mltewji>~m3y7F4xkR3T;YVz z2PwH~D|2&&b6>#~Fs@6ShSOtmbq&@%J#e8+<7_;SJ{$QypAsu-bxSoV%Q2$J<=I6F z{k5Hi`;wu2Kq>^CN>Jx_ZRS%>qUgs-F%9q3`2^(SJiP6aZBDZ}xiS|rSHw6&DG5@-m(=VoNdtbEx{5Qz1x))` z9zB**Wh$oDP#+gts=!S^0Hz_P@(VxSQc?;+y@@u)O#cAHXsxA}XVz- zzhSKIFSYG&Ofd3RUWDteRV3A^?z+zHM0fJ)vGXrofdj3qaj~BvWm=@BCDu5DCb?CR z5`hwz4^kLN770^}DM+`V76YKhTIM!T1q1Wp2 zs*bf4FGxaA(mxdkSP9(p+k26Z&>Jb`wgvBC1}$lCcXezyDm*|Ar&{NV$$S_GOc=3M z3yD8$zy4K}ulg|){@z9?a#T`oI^z6&vyG)5DJY5p%2rp6fBm9B#Rt9cAvS)iIVs*9k4S;`OVbvxj^}`Eqh8mAEpUN|wt{B)F6-NhrOP z0qwQ%C{x-*thA;hH1g8puOXzU1vsEwQBCc!HY2Cg6}4>A{h?jq@62*?1!RzZ^sS}k zvWA*;=7kctwUELraeEP;DMm zybY9(W9W9+{uj!RJk^JigziER_->9&jzk3yK2dp17-xKA8MPY0aAnlAE3E4Tb&s;&{rn)v3np zw5Wq^)OvcI?fh|PD{jzx5)@N5JmB+F{$GsLc9GLp&g9`%Zen7di;@CBz0`VPgGa1_ z$VyZSEpu+?+qON)MB20$RSk!wOIz(mj>|16)fKH{dn9a-kV&_;_@^;ucUfC|(*U}C zHIZ{gJBhXWth!>_iq2StC2o~n2nFS-O==q#Kv+_cIt$`P%C0JOFo@{pIOqde=rF_1 z_3kHTJ|^b+EC{vM>8{6hlr-HhmW2efZIn}W>QKGC2^Yhgfk>%M%Mce@j`cEd1*e*j z-z{3wNGDIfTxO!3t%;K62ZezL_q8KWU7AP3V{l2?H9SIQN%;zyN~F6L`i(BO>yagj zY)x|6Y$*iLrSS_ z!!{2bxsf+3s`-ycz-sGHVR1Rc>&-I$|LR0ygi{%6K0}2`Iid7|69i~8lDOYGn zM9RtKa~d|%P>Xl%ef>bg0&9;|R25Lnj7d?w(866-J1OpK)ykm zCg$za>Q>D9oat?;EwAGqE7?^EY6t`M7Q#(RnK~sdRM%_N79M4;V1*LyytB8IY(P8r zJ782QV+B`Kw}?q9<-<#2$K7O`V=ZLHk47h2uFV59k&mZ_;ha^<7;ND3$y^xD|QDiEKeNlb?2Jy%?Y%TKA> zww6LytPpyrsG`TP2iFdUT4C0or9NdjT+r*tn5V+nE+i9HtibqL&vJ-yQFJsOQ>LN2EI97XIl{$r~h}@W%dG%u8<}%%VkdFEo|wQuSRrh_Sy*ZEN%`;Nq6Ml=>@gvB}?uj_wpt2}mRJ5PY^5-{f$zhLFLG znKv&uge2R#tz+MP{V$BkT<1HeKW%bs}@9$BAIeKiZ)0YV#{&~|j@BQQI zalDM9SZ+F&+-huP4ai}&IW#;O#Tzx81iA-`; zs>0n!umb(}wjI$Gs^#A))v)!%bJWPkWoC+KDPwzcNw1oOYSE_TxYc~KA+$0aQdH{D zl9eq;Bxq6Sr0;R`I9H-Wha)J|p;aa{%-T}ZQl+dCu#|1hM^DM9q}u&&Zl?}jGtm;c z37Um!khWV=n&gl!TTbO<*pdL)4X=gxl)4Om=~U`Ogsz8{^0Ho=Qd>$5N~k_khTCl_ zvD2+ZDbzOzD(Q}vic>Rl6RPEL2t*GJXwgA0LWJB(e3TMjQCG&IS<={2kC#XvUtw%{ zgCp*$OrkO1?(MyxqLR6$SE(0W+k#W}M#GGr% zefbG_nFxy?o2BBthLK`LfbM#CKP)|aDullERMe;y2j|s3B3ON-)8nwKEl${KP)F>f z4yX2&Yj?)BY30zfEa=?TNqL4^VatoBni8I373z?y-?<|NKQ+^-bH4Zy9GPDU1%x=- zQ5G|RSt|(_D=Dxk2EzNB^unG=;Kp*|Y$s}zdU|9-RIh?u*;86&3Xn#!i>*MZL~o5r zYX!+$fL?49SrwL}t>)Dox0>ZCrcx84`n#z0*zarh7*429ROPgJX>UVe2FCi-I;i`c zXRgv7q12y&DIBS6EVlX&RICydKT-0+Zjcgp-v?^Yf(?qY-UmD~)HweD#8;;+m=5La zx|Ze6MMqMbeM&ZMtt0ar-9;pTLM(PT>~9UKkaBGineQYflKf<)a_0in#W<2d9IF6^ z!c*l+Yyh^_$1J|ft}?;l*A;8oeycJw5VI5{C5GlamYQ~3P7YEvD{V^)T0q6Y;~$93 zzrd`=Eax|B`HwSHpdw5d(=HdVO?BN?MT>qK9gzumvhwc2G^ys}XZ-YUSCJDb7le)lud&Bbb=)fVAn* zZ*Y1LLUtXFE2j_h^+%3eQAJxaB{A~UCX~%ChSP;Hp$#B~Y&`3@P1kMiZLk9qwrr(* zbQauZQsbz$41_hQTap1vO}mUxI#COH2fJTS(5)F8q&e6$Ogzb+EA$+}9%TxwXE&?pp*KW{IQ^{)m5y=NST=9Hw{~ISxHI;{{Xs_fr$t?ej9kK zh}sRaU$}kMpUE5%r{;Xr!_=D9D>+As+R3IyWwc$=ohf!_Djl}TGnycu24 ziM%Y~OzP>|>vWAI{X>-qlVo2fLb|hKJo1ERN!$V42ai&r^QWT+WAgm~*SM(O& z3>sWo%$(RLw5nwP0E$#+WTn-AS3%GP&s=Gt+D!G%l;+iSMATr)aeXdYn0U0Fx~I!>TUXdxa&Z0v&(D<+qG5n z1n3e)KP1$+rNnwAGc&VOg_h}Bo}ApLxlX#Va#=!>PnkpnlY6BlM;5N3#Vo*zB_bAD zjSnhQBfxA5d;!aKq+7V^Rshs4e8T>>#2=HY+$)V$h$L0pq}3-c;a3?_*C9&Qv2o2v zDY+)s+pk+_UO4aqy=#+srr32dwf zo`-8FUrOi5H6zJEJ|U_(jt*akoLHwfP;24~6CHILR9aQJN;W!y3e=NuZK*rh;iHlK zPs_=9PJ0xlBGN097k`bG+T=2X=^zB9JB3`6atP_RB_1qs7Nd}96*$Gm>Pda(qB6vm z^tRoOrD|E(dPp`vxVKZbDaK@ax0`EHCN|u5WAki;hLX{6Ue~Y|#Y|DQst$rtXs>Z| z!uJ69`YR`cOEHz2zhiEEQ{DrvRI60_l}e!O^{}^GcC5I_sG(Z|goXl>ZSDzGhU0Cp zof4!Nrbc$0$&DrhZ#5~$A9J4}4k#kYL0L*kxEfm*u){u6^D@MwgiUR1xRY*MiWg1o zrAf9Fq1Q~xlVgD?T40qCMLg6_8IU3pn?1n}z*AVPJO z1j>%I%?Y?J*)~#A2SQhKxZ4}jA+VZ`s%uhVN1G{b!l)|m%3Faxbd{mBsQi)u-x?4q zu~9J-100vaff5)gbt*UNq^|e*6NQEf>CHxVl3}+!x1D`cQOu7az`xnPu#|u<06`y^ z;dvVP^mp&?=u9v)?fd)sQc7qMUTL-*Q!!kh2b#+P)|_{o7rIuZ6oxJZ>@KdJxc5k` z$)nd*QKz5i`c%G9Vj_92HVR20C~-^PqV zJT$MJ)?nL@0phg$J!Cxj#O(P;s3JtT^u}hf&zSp#EfjN7RGSgGHnoSZYH?@NWHhmQ${TCiOoYC=L;T7p2p!2 zNWjx^ZO}Sk!Gjm;np{%*Xa4~5p`iZ&(RkndM2t{ebSLeogc|V|l%(swJ1n-6n{?A9 z{{H~!W1iR$ojE=WGpW^7zY#JJkl79to3?JEETOo)i1+$o>6Dl7)HnePSw^Kghc^lW zrb4Y}UZix&8uR^y5+nXNXj3rmA0<^>b z0Lpukl$wfU%~GG`tDcX>Dcb9~>OFrh{=ItR(=w@}E#?Yy>p_@?oO&vj04C@cNIt!8 zpKh3RT%n7=!>tl(7EeS0!hg)H3WkTXa^@OJ1 zyaC(!;wNrQ`tgoixNZD75@#SY^K z6>}bGtX5M3ry`w7k0ni|h^J1bQmrJY^*8E&Oi%eIimY)jF;v;hQ)VKG1g*g3QXyf- zkS(Pxr~)-^o0HQ}Bv_1A3iKCgX0(^vCCM)q+D@T&61O!K1Keo`%r?2j10*edh_M{k zP0+Wa&3l8%CoUW|-sZJZGeTCf(rgv2r43iVYb*7>63%9AEvaEjQWDocZklyz>^*V3 z+l(+&(qaZ)1>zEVrJ^i=2e0zNmRaCVWv-ztNo|@?Ttu{0AeE^EuU6L{b52~BRf$SdOLBWA9EzC- zU&E@!ZMHfjE1_3XI#^+;@eWK=B|%R(l=9N2PNJQxgo~blcJ{|-5BS=+8j=jow>6T7 z8SZm37S7Dgz zGAAvS^V)L5`r|~nd232^1`&b|(v>suHx=J6rc~UA`47C#Eowt90{7G%T?mQfkOU%TcAb_zEBZNEajZ{&;j& za@kXqciccqlC-O*Ltt%(1RSEoIITF#t8FctuTTrrep_|Jnp`$2l*Sy;7Uqy!2XYSB zf+?ApNH+XgH!Lo53pnZMZ}?T*<@vIvXF?iLZD~+J18-5jBrX#8c;W?XgAeA&GzR9; z>5M7okeN*?PJ|LlgnN~qgn&RQv9LI@{vUWbBQ(^fPHQd2t$@*Jw^5K;iiN0KTKQ>H zjt~j5Qa#FsELKI}u3+HYl_w}8EkTOlZ{s0FW=lzTNh;PzT1LMyNLd%K1ExAiX`59B zXPX0ScnfN|nd+TMK3K)bz5Gq|Tz;cwl~8GOoOOgIO-4(vM~qYkk*HZG($+n?;!KR> zdY2(hJj`~VAnSQyA+UOqFMYSzZ;8{#j|}0>sj*z0mY~xs64`af{sqo+G71z2JtZkZ zlB+Cg3Ioi7cLw;W6X+4nUdvUevzz#sVF`Ika?5m^f{i^%8~lbj`iL4{M#ksxx;kmx zSRJ?^A6->`oTfC(vlDW(g;s-RCnkGB7E7!ieniejvr;3 zOO%QPcg*^Px$5W5tS@%vr<_-E;n;qF57gr43yIM{2|KQL7@e}uU^NTU=P4*c z2Q&K;(bhr%9aYox`eRXO_>D!fmlTxTr3u&|4!1bdH$6{(TtD*ePn8!enGeQvPp>+P zZ7qucr4^`o)p9hXnLR+QN)B{%AlNh0SP92@WvoA^~* zIg>ipvcs>+LoCCK5=+ZTSyFTrINB1MUc%Qm!}p9_E8*@$sY7|xt>@(-=jOjPrOHn= zBo(b8ZZ?D> z8g;b!RJM6{D^p-709Rs_0ynlQR61Olg)20+-d;s#FF4x} z-(}_)WruahYgUlW&cfF`(swtvc-zOv2lD3#Gu~2fAY}-&NcDPSs*xI+!h#EpJESNL z?4p$mp7t1_sFYHP$6dOYb)W)@Pz(p6P%J8UhT0U)-PlX0-~ z1r=PAzAELGu5daa06QM;O59S?(_A{`+`H4?gZ>`!u2w|UHAHmFd=)VHbQJ;sdWXduq?Y6}|Dq?GmhSMTLS5s$ks0&+dM}K@pHLny=X2qn}s4NKaX2%ajYNN_+ z>nS@f>v;*V?_jOXt%vsp^R{Bm^5L$nQZsDR*Fu6#k1@Mgr3eZMB}oJeSoK$2S2l^# zNz%xA3Q`m*~Z>aoLu?E_ayq_5BN$oS+gy4 zdYri@bIX0tDer9~4zCn7%06r2?rxkOWHTPAC7Aq{fguTTN$Pg$J7N@bH8&emOjPO! zNb=b#N-hFUeMC1DkajXIYU9!D%T z@H)RTN=XXuzS#5ZP0aU)O$$LSIZm2w%dneYQ*TQed0yfpcNG-zH-MSyJ59eps6oy1 zR932@VK~wrQ~HTgn%0Du60OPJ_w~LqpFQ_A&vJoriGzYdV#Q*SEZd3Bp4T#J*?8}EpQK78Xx9cN2k zL!?2;bXsdmbDCtfl>%*Gr`#7)rr-d8I*(oCpnfx5A4UsW0X=h}+hM7{mdT0z-kIRJ zu5lx8$WD(Abj4zojrlTSoUzQHWMs$zc?VdWtpm0!%Hq^j2>fNi!eHb+#56cqeE zQcTdc8IZ8UqAX{LS-KR`QUNId8=KzvhpFqxUK98kNv2QCa%5Dhbte^6tUl6@$4Lp$ z@MQ_PcQ@3d)Y}S~JH`DoHs)y59G{nKwI)_l%av6}(;0+pd4(fU0O8rtrRjP+Z0`l~q%M7RhBVmg5%I zkbsansX$n5V3Kh~Y4sWm2})f~vi*1g`BKXaq^r=c_C9*Pn7F<(X>V3IAzhzdQ_y3# zDkG*tqf)hVER>{QazQp8gWDYRl}O4eU^tA)D6D?R!Ca(&t!#3Xk%<`m*VV^{zIIo0 z9*ND%VnF9_MDnTEGObRe=9*M`WM9aoIaK(M&=ec}4ioBCsswh>DH3No(l$~|K+03^ zvi#Ti3^UdK82@E|&S|OMv-C-nr3HfCnLqY^8O)3V3npWB@=Pb%J~)=GX`<3^vv5eWeisC0ypq^Ctr7T}Ra*rNy-9-A_jBPwRe$c<>cV^JlUH#o zo0!~qr5}ddEG$@hdkj}ghM8vRTtGW>J{l_+@i7#A8yZ|U;5GWIMZp>QhQG(|7r=o@ z_&Ne}6hix|T2@zQ0=Kavu!IM^4k$}t^`&g0-a%cfG4+JpYQ(wxZ*+K-gRd!rBwQ?P-)Motq&zPdLoG_D;NC9 zxZGixGCOY6;PTX$94?+&Jr*oRq3S=6%wo75Kvu0`0mt`s5K&%CT*DRBzT{-3>z8Aj zEgPT8ZY+K8iMNJ%X0634lk|!li1Zki57a7Crdpg?vrRJ|3!7rsvU_ z&9ka3HkflGGFmWpH!ZD7+^Cd=T_<5|Lc=7Pn%=YQrI1G$Yu+-l1;D95-HAQ zuY_TqWSI+j$xsVAkPt}A+-Kt4T5eq7|EX@R4XqEyYx?lqP)@< z0cucrO`&8RD|7$~!hr->SoGU`HFADUmny2Mk*TO|LkR&PgcOGn)OovgxAVi^ry@&S zH&p>r+GV)U2}RK-SSZv$x^1ak=p}Fgd z-4?pUD78fi5v3NRIjHbOX$wtu`Gu#P7jMOsvCOg90*;UNp3lU3m?p0F;tS zmO@6}ryh}o#Mj_bg4+-ejkaECi_GR@acg^!I|at6;R2YI#eQsb)ZUL30p}g&M`Ou* z0s$pTzn}!-xAFPPUSG`fqBP1IT&6-2w5RdqDZ~T5kOtaFa$_CDL! zdtLkJIb8>L{0`Q-@3q$V^F7*yA5^O-C6Q%a?a!qJ)c~5na59gD<3DlzB50W_|HO73 z99U1k?SGReJg^FJHBL=U&4gQdg-k!#y89ee9qcE+f`JZk^p&Vmo<~$k_w!8V=N6TJ zFX=Z-dnRi5gDl5#!slyR!xqMsB*VSEWn`~dXn*ctd*u^JG4VuCd>s+Yn{X99f=X(f zuVy+Ab(OWvR`f7*rTT6D=HtAZ{Y+1ej#}lzOA(xfviH^Zg(r1elyN!(l{wQcTTC*m zc53-xSAD;NX2_?~uMvnS>*t{GW`pLRD_`oo%kxWpa5fszGsbiJxO?a1##bDC-Gd`# z&LDMrUj%b7kHg%9Fgum+0`39$iZ5G%ESmTO2S5&&+D|`b@_4jrHEL}cRLW}a$(`QG zAsv+XL56cDv2dZR@kd+zHv*4m<&cMg+Ih_~6?`j`wddKa0}|#d6cqTF5;R|?Z#$@h z&sAKrR-?(6968Ln6kT7|bVyri(`T`)l=44EZyUNM@2(F?cS}3b(d%JBql!Ed5kuF}v4>+nL+j2&3^U=tpvV!waxxID|saN0VR<%i4 z=zB?nUA_&ZUQ()JrIU%9*03APS1{;TJ4aW_1=o4XQ-Wx zH-m{E0%0zcqDC+k(MYkg!N#!=-Ds(wg>eigUiJrlx5<4Mu$=kH(K=Bc?H=%-c;)n{ z5{6ZdQ(upJ2b(kR`-1}A)VStcqW))^pa39$M*!&wCa#Ynhc@z6z>9?2 zrV{1Cc&Su1Y32!3QQe5PXQ`+ghAV~>?+a^Ioxa&O!Db|jJf||rE_Y$8v#A=EnEidD zKC!q~m8w%4&UC3pr2@J<30GJksFJ5xw)PwUzZfxBE6F=oqh(F)k?d+8Y`oa5{^l|U z0PK+BReqHQy5@1!a0!SV1uB4SZGi%%_zJTkRjtP{5$+maX8eZ`o$_8oY&>7FP*9bi zA}BmoFvBWe5r69u`_xELih1BE)1kVQYOpoO*M87++}@0=Vw@Cq=%yhg|Mf}cGk@DN zEgngZ!qa5u?oY`jksXP(<%0ei0$W0tZpJTGU2CX0mtgI0=Y_{6aCl%Mn8d_f-uMgX zd;E!!Kgn@gJCO3cADSCgtoT=%p0WZ`DG+uUHB24AbOI5alPG&-dn0G$q zBo%B!1+NcpguBhCJO(*}T4gHJC2^skWwYx-J^9Y-&QNrhBBz@8xyLBrF8o&zKc6{lrgJWPpf>A>pcmI(~B zKv-paKUXx;%<1xCbF&5D;9i=Ynk)zSC7@|l6O#lxiI9hF(9cfuOR@}-D>=c`&*xsi zq#QiGGcX|r^ECK%%-pVTg+SIIW0?*_O%8m9*eat+sCvpOo}f&xLOpYml#%E9guek+@S`fw_>xeh}LbR6kM!MG}+b?7$!&^`ovJ}V`exp)kb~RYwth z>ga^~HKQ@TX>i|(l&*`kr}~N1*925~&ie~{TpUyp=N49=8}8F-VaDa_;j@66c$W}Z z0nKaGjw$pqbOGI_*QF}XyM-tu^O8mu(dmzG1f|h9?DXdVXLp2U2y%f&${@@=n>AfD z2XyVW?TPK6os(V36(KZP(>BhhrZR&d2>9Aor}?}-9D9Z7v!fW%0XAPygXginuXB&$ zIJ3n%p`_B!GNdszpEnk7L!qucb=IPW%PHRX1Vqnz9H9Y^e!eC_d!t*xaQ}3>b4!uo zWPtZ~XR}zKVRoG+fDZ%zpvk(~!bv($L=w;Zed`d9jX}7kC;QAoO*3Pf_>w`rSDT4{ z1^h`hDg}wr0a%6C8tY}?22=b1r&zf6ZB!NQvuV3wT_lIoziIm0ciYrp?}RHsivA~t z8tNQfGqImK4rWtN2Ga3lXvCSCSL3H&MN}H-=lt#W^`YCdfU}7vJajPH0#~}G`qwy$ z=PA7sZ15(ws>tE=ajSlU3;DN)Ui`p?b*Kr1Bh7vgLq~j%AlyJje-z49YM&W?zfPZ0=AktkjSO`-wObESPzsh! z!U959os76@KedIW+kcJXemv1_Zt7zjKuA`?NyM(6q1m|DiQRr3aT6o4$KnfxLWj8dA;(o z!SNi!E98cjxzuuQlq$(R$w&I#TkcNLuQ4BMijDbWm+6EGG^B@$r}fg%%zqD)%Qt`G z8e?r(e{PNFz_V5-l9qsaeD%C(!ajpA&b>p0{HZTT!cJXVhAw3A@OSe45EP=pJwb#5WfOzJ`dMeQ3gfAm`G2iPOc7v^F+rDpQK` zt1hbjRiQ9ZU)l*>`CRtA-Rrxo3ZX*a!5!SrV`-)QiHyb6_c;Z}Jj_VvOFsMJHWj^9 z4PMB|53k8sicFi$Hat0{o8j%00>743a$s&~p6C!D*@AlB;Wy_jW^tbr7nob8uLOfsyz(Um(OQG56S#>?=8T-pP zP_L-!Ft?R&R(Y1j$(RXT-y{hHe6eNw?3hR?QFNZQ5n-w%sv4yr^}3T6KEv7i#`EEe zVTnXn+Cm|L(Tm5=DY{x{Ryw}+*j@Y%Ev;@2gUw$eLGV)t$975kM(zMn<#DTRe58Tp zv;Qz~lzhdUGd#n&?FD#mH;Lj4T+as6cYwFXd=q(lmFTQ}neme6j=H`rrDP~6&jcM% zU#c*NilGi4iu;B1^DL`Q-Ea zs47FLjKd;XsUR(L8>=zu=gfLz?;#(BN-s>ZX%v`&+;>hP`TAjJNeYHNQLpVTztLP zvVAz8W?g1td+_Lg*xK5E`tTMl8ZeRm9FA`hhwoe#RnKj)GWS7$PbR$S?+Qv?*R0bN zp=uyg=+PDt7O1JWlH9VLR0$r;mQ(^O(gL(DNq4-@C-w2}8saRCXX!uI5yu=?r0hwK zG}r~X8+{*hl*FHOuI$(jBe_lCK)q_gHe@|> zy_KjkOZoeRE2b9y3e4~#Wonc9frUd0B~Hu@oZD5xZ*y^SiX>w3DhC?n$jQOun(Zzk{{LB5w<<=H2pv65(bA9D|-A%GM?< zshe^&6^GyZ#jy~n;5ygq$F3CHEpb0F-2!fdZS8Qqf)1jYMAr@mT2p~TixHzuO{?TLM>4$=~Ix)O^bu%X zQhXwnF=0B!utm{7cq>{qe4AINt-t4^r$rQgu&QzOqB_VjZ)fEVtOr-;4#Q3DcPjd73CneNVrrU2f75Qd+|YmHV( zYWN}6rXu9TNkA|dcXxse@t%3*_~5WmH@bu6&wkg^(E34*6~8e%PqQh={OJ`#xP9n@ zTM7Q3p->^ww8K3(UG<-wEDL`G3Q;37N9_<^rL|dl?6^tXK<_*v8b)FMrV~)jS&{Y< zMUy&VZ)1?EDR1E6mJ!2P@E0Cmoiz9i6a0ut?>lBS@`lnljG`UoyKus z=J{*zyAbfyU0xcYkThS{4++@{ignDAk}8Z>-03*I@JOROQN>y%wJuz`8eEwHja$nxHm6UxBcj z#UGPPbhuy=N$4NNS+wb?tzvM;KqM;FIQ(f7i%&b`em!k(%7?7H4y8=MXx>qu{FN|0 z$YF#hG3|np03NFS{g2^XC~?AzO5WLCK?@j(d`?}ergd+ zliux#$Q({&R*3}XY9~n8M3D!0EDd=iY{=&}=60`P&=U!5`}3g{E_`(|{#9lSA_ z%(}D*tu)%GGj=hc)^YaTgp==CfHP#d^L+`k7@q9vHc8!+bQ|Vx$>Hoq&KjX9MitI9 zD^+5t9FoA!fI7p+Wdc_mxexNU5hAfa+GLj|ffLSVh>kztqHqj1C3X#dL28V{i~!d) zqy#NHMY1C0VPIYjTQuAa9%xkdm{n1;)3gF&;B8h`0xyAO$8ndtBu9N8Mz-y}-~FbQ zCbbb_JXTr{yXPb#$clJLBo#&8=+oK2KNFE)tuN|qZk#EU(LRx6q94!ry9`$BWQZnRY)@Jn?3@L0xnScH|rSfiou z$Jz)}dYN3bPm*Jt?t?W5%deZ`ujIGbCOW^Vru8pcaq{1qsXM4{FREmj;Mx8E6}ja|{UkJ)+g0;S|y3eV|qt$x8VR+!z) zFnc7oePw;0kAB zKQiHoH_CqY<9TXTa!Zn&Y{|he_j&%7gA0Kp<9_DyIi306xyiNnDX4+K!Cmez$Te_d z=bqLzLlUqUb_}5CZu`kR6O42Ck`nAu-}rB7G2vizhCc9b3VfcehPPN-#8!@i%S=?)hXBk3%}+BFQq2k1Rm zBNSF54}P$$+Ho`c?eU|qxBQF^G2^khS6ptm)_X>vvm6aY(qKBo!O|1Msk zMOcR#?U^A}q(;xe?roB!{`9cr7h5DC6+e*htq|_UM&;1bsvVH|g(%T#d$*m?89B_^o#$O(w_B2eL~2U&Wp934aTsW8xV-J5cj81an&82 zGAl!an{XK-vj&(=6>V)A@5@%Ks=nkLCMdtYs=+a75^_B>RIuhE?g=E~k6vr@2%%|6 zN)8MRh~KR}t|IXL_**2~YRZAA;Mf|PYdqfMn3WT_BStpQ|4eJQErq+gCmF%~S+(Dl zNr7*%i%iYr)09Y~X0=B3SJ|OTWq4gyTStC0L#fNf)A55t%-OwQTu$5HQbSl^M+SkV zJxMHQ7P;HzL^Yh_p>pKM*>1(H;M8h|R&mbZ?zpGt_JtFzNvJ1ZM#5q3isvko-A^oI zSt_)s*ybAFNVGs^C+1@sq@gAsySCLJ;4}^Ixz{qOY(Gj;X7}+6CEpygGY&KFpHNW( z1ATyYM@4y1RJvf*LdGU#@JoVT`LQElV2Z+Sf@^0niW9I{wd~OR*nA_(Ox;3tHCa4_ zJ^xmqkTbw$ZXr5 z#_~c^l{VdA6QcO4P0YkKC;+;3{EiP=&%xt2inyCP7V&+8kK#~Aw8!rb{fSE;4?tiB z<5@@;_2APqd1Xk|!u<<&ZtwTeI#^C}{AWh;_8s$&=Q+Tt<=Z|b4S4|h_XgubLGN)?T*CP0k1(*b3}JQ`5CEXtu+eXTx*Un&jNfL=TLvJP>ykdvm%R?(Qpo3-^ z)B>YEIIi5>dKFc(jX}%Fo0`h z%E!x9U2kGqj8HbGq14TzY!=^3*{l5%zh};lu)a%WU9J1c>kMs%d@HxIo{C}D?WpD- zkQHiF?JEs+*VMdnfiHUC1d|C;Un`Eaue{B;%L=ke*Qa#71mog?Nnk06!6&2go=Q{B zijIr`j?BU(lZNtHhu$SWea3fxjC}6ZEhj0+F0+YdUA=1X751Yt?h6FbQh?UZAx_`w zmOs6swHo%Iz203th)~vVuBp8M)o6x7WN0i=kiyaS*>7#w2JtP)^Zo=&is5ww%agw} zsQS0Drwp?4Gh=nHa!R40^cvx;jgbkDE%0#~LmmLP?tmr(adQ1R@A!Gjw}b#0r%WG0 z-iDIPHx{|c4+(~vtP(gJ#3_}xb>{jlO>5`RSt8q@OW(PDs!B$OF$fi05oZM)1Vgb*O?y8?LKNSxIf$b!TZzmGQjHgZrf5|pQzk+ zA~#eVWO>bj8*S*Mu43a|)>dKdeDic_1%XAIco?5J9e7Rn{oUz76fdf7ccLF4;+KG} zrZ{IS4b;!T^wA!&TeXYGEceQl%Dt!x4}G@tgQx1ORS@X4nSKS~kZSp)wqG=aCHcAg!L?ty*bmxpVZJiOv4zv~{!30TGvDPA>2@rrg>rDbjz zko!2A)HX$UZEC~J|0xbF!k>mF&m}>v&&hsMwbc%l6_X#pnEUgygjbkY-h6Y%v)V)U zI~0@DoVM+T$vMk>eOXxTAxzG5zv^;}f+Al+t76@&CLp;oY9Tumf$a&2)0=ylHQWk^ zs5Q%%-mDtAgoDe(QnviLfe^M?Zc#cM{)t%3w!T!gq=Jr8pH7>c)HA!UQRpr8XS95w zt53vxliwt{eQQR8ZHpjrrVjoFO0|e~bD2(T$^)N{2YYEfsckRm z32xx(Yqli=2Aj=E$AA{k*=0cO5I|-5TxsE=+ZnkS^2sYcFtDuRniM#XYoq3xKzQLS zvXfJ1k+2Ci*(R9NglJi4{atuVJ0z!}?P<&gSRQ&aQ9}^;dWlSMA$;j)PII7WBweeN z;o7I&74yhfkgRqQrt#L5F*Gp_t6c%K@wGDgx#S*wlAaso z6KlJCJ|ZiRPvV(Yi?ZTx0e4|nS=M(Z`Y$-@L|w*a!c^A{tzZu7(F=IS4eg|3Q~zWq zn%iS`Nn_-hTC*Hb5>_RqzQkTY!$Uz#5rj!$y+>0NybH3&c)DoJQJQaF_w_TmGt{v|Do&Wp*&(1VY1(^J8>t^tQV>2J(L_t z*EaeZz@wKLkuDetK3Unoc~;&*+j2^H2{sZt$6U@AkTsuTWR+Noy=d#Mu3L7=9xwc*o4^D&%(f715A=k zA1{rb;#pwIa;k^@`F|LsjQ?Sj>9sxziwjY!9;v6oQyf~U*|k)Qp?i)$(> z<#@&NZZ{YVnEw0kQh?X>aPF8qkf){k&Y4;!QMVYZ!=a>IOOlEjSz<#WIcx^IM>S#x z@hC(}0yH&Eq~~d_xD0~&V52@6>~nv-$&Senj_Gy8az0l3kpuc1FkN&b()Ye%`ARhZ z305|j6j^|Ne^(4f0CN_DKO_2YS5qyZ3mkCjiesk_4WDh7iEM=5uwZkVNGg14&`6HNL-&baJ}05 z;Zq$jYOS2gKDO7k&0u*hcA&+a#r0ca;HP=L*3{XO8YkmxkG@P`wN6^~!C^avQKMzX z$_n9Dt6KU{7v`uUmB$eMLwo&l3_?2DE1nr!bBbo}q1s}pPYYjpL5mk(KNPh&u+r2k zj#|_Q&So1TjEHV$4+Q7wEYJPx^`ww_9>FtfbLF*r`xDF5|9TU;h2YF$(%J!?Mjcjs z=?HiJb^D7GZ?3NEQR51aep{j+B7fPBMNrZRTwKa6o|?&4rskr^z%pT6G6GVhyq zPQnRrUhtr|WR+p_LK*JMs~Ma}-Rc9Q1RZ*z6HYyQY|={ulTUQH_c*Us8*` z7|jiAVbqpLpi-w&cr*p2oOSR;-Ot4Ic5OZXReMshHl}*8{7?I}l&)#~Ps&{=d3MXI zL<@cRNR4-y?LWYC)1-Cw;_B$pe*IiSnc%W-zd~=gabLA>EcIFQMD3)a!AwP+_173% z-*tYyq^QFK6(C#fTQqJmW;cx1mrj6EsXRrmc-*|yBzc68>Vw-buO5X3uPn5kJivB% znT*GjJX@>cVW3jNL}AXG?>`JiAqEo-utaC?=1zwHdB(DjuX*?ugYZ-UClr)|?eS(k zwMP4;`kdNR*W019Qk` zz6CNgH_JrENFVKXqv!jpkeEOR1mgic_aOU;#!s7OrH1L4;=Zto1+U{n8n{A><8xgX(l+Z7SC3Jn0pFn!aQRjv)5?4`TtNf;Lzk z3KAjU4wNeUK@dsazoMLSK9cby zE<<4LBJPX+zCu;Bpa$iLEOr>Bs_kueCfd&8)=leiyxfz@IIzp)_z$B#UY$ut68dlw z3d1rM-iAV8MLb=lCR+HDr%LX}Wmx>pkKp|OIrrK}#mUuhkg>jyF&8}GHa?jzG-|t! zPWwn3DKyVyo)LFloBjc3=^!;P0shjVr3IH$w*E%@-TR5*cAZk=OTswGWk{V2ru>1M z;^4;!?kC*vUnTyHZ--D_2KAszp0$*kO#(5UX0yr03!qVVyX0p{644Z%f6?jqqrdxs zx37L>fqte9Y%~od^`6eBv04W8Q2Fr8zxF?TrPM{nuH;ULtq$c+3{J=8G;EwMGB`6G z)w#%mYi)TtS?WD$Ae4g2lie?bSdb*I%Kv|p32NiG9<9jsL^H(n_-%t zl@F5*nUfP@_0{0{7q^;pLE?xC5x`xq%+~SM`wv6BrhhlSj{9HYBS!_FKzHt?x}8KP zzd$QB?e#@T-R*Ws){BR5f<~x*tM*_A1dn@b2UdqB>jF))9_t?G5C;mCoH{jMJsEdQ zEZqd1bUM|wVGAh{2%**IOIwnCFS~?T9aWUtqAJHVe`7SgxWQ@ui;K;Ui*|GW_(I4| zS;+2NI3C(2@&6kd9VXm9A;PoTJwLy3QbpNU`(Q<#tyJyJzpbSUX<~4we4kDKn;~c+ z)VNs9Gmw@ES)@LxSE*{sx=Clc+(lQ z{YD~ONNoM7`u; zT`UoT5quShW`(r+_eRlF{(VaTxfJ~((SZDl1X*WJV+Zxrzk_Yt2g*O>$kN{`=-85C zqyY?C3vG&(>i=D57r9FtIkl9`lMv_n5VCCy_V_2)bSq>!L@6_lf8xrX{2YJbwYOQx zmCW!i0cDE&J0=4Tf0nN!2z=6BSo#5g9fB6bc}o}yKQs+Hvr_Jde{WfqonJ^MdgIXZ zuh37-DmMeAd;6kMv(U^6Ad8BGzFaidj+IxCK8s*0nCvV_P$Bx} z3;sUo!HdtqohXHPt?yHjf87S%>K}P>MooD}4}Lt)ex1%~#MRYxm*7k2Gkd4G!_t!J zs?`HhJ`JiylY9LTj)E>K*$jnRrJ4l7cLN12EAKD@*}?OxrUV`N8#cE)Fh?QK?0J*P zxs+T~G$(qMSf_5U+en5Hd0zE3nmC(t-l2@$OVe`Pa)Qvpi1t?TgQWo;OY}1%Jk2pH z&TWpPfrM$dy52~7ekH@aG%zGiH9HS%*<bLNTkmXb6?P%#S~n3(mU{ArihOt3>C`est{~!nO^w;_$_GjD4R-g4zU9`6 zPUgIhntW$;%~#WeAj8y+jQW(%591(AT&Ey$_TpQp6A}qknV2;e-w$j#{8&=)+9TAT zO>?0HTtcuQ=n~%LjkI0`DXrqK2pj$Lwk%x-1(}$J$}~SZ|Ugc1cSHZuq{yI z3@Jt8HCKnx7B6bYqGFAKnZ1?ttiYZRCd(_B_gfKn1*85+NRsss%1j4I*(>KA9K^^I z>(ErMLE|#ZoI}UZK`meXA}y8WvoXWt9>Yf;c5lxluAw5u>;V|K=FY5>{a(qmRwsmL zG^At9qjLBgOOj&#H9Oge^0Yi%`FEC8SbK6fUBY zlo~#{2o0ScUvB{TiK;HO9ZH>Kea_pbeP8FlA3;LobW>k&dzWnoR4A+_?Ku2)g`FN2 zL)IF^$hai|${NMKjn46taLfl(){;mv*%F=|fZ|y$6bZXEaX4?dI=Iok$!3JI{eJ5d zE<{q%Jki8d)nY(nm+snkaUesBM*BNu{YtjDnt6{78v$dihnoyteuSC|W+%RWi;qULZu~~7E=w?hofwh$5E+bN#5(nAF zcMYf$Cz4?2&`%Q4KaU6Bsp~yWMWObgGtDZpMkdyiR%#`4?YxF+G7NLc55<#~ShxRA zxvwIrnQr=@J_!g3`JANc8W(4~5M3SG)ejZpTM)AC_G!pH;re9C&LbVsp8FFQVVVzq zw>c$YvBBkbZ7!t&)-3-EXEnzceUM0cZsxs03er^h0R*bVe z(|l2ZdX0R-=v8vQl86iDuNSV4KufR4DJT!#niTJ*%nq69DB1IkLW#uEoJuRAI7sb; zvlUMSFGmczA~WSjlVz3*T#eth{4|GZOam6QPs;z%7?gx94J~K(4QUuLm^h>I43sY0 zH4)TS?{T`C`}+z43^+(~gjfwGt8T>4^y0*g4|B_f1^?OZ>X_PK$gyFhQ?ff3wBfq&)w=!6BQbDr`;~!88dyp+vaEr!}C zRYQOU{B^JPU&g{?^ZVViw zYOK@DKL8AjdF3Pwl=J8Fn(!y7mXE4P>tj)Hs0;YBPN0vO6Tz(E>j35S3(2HThtwXEMpH&%+d29gfUQ zYXPH1;RI+V4)Gg-Syq3CmxO>JGV24kEi+;V$_4gldiXa za4;ewDwx>z2B+>Ub?@_U6Gv(pamgiR&UuR1RM0!Aqr<+(18F!OHJDA$AoT;r^HX*> z(dS?(>l@44Xv??N38CipLy4knU7ksQd(0OUk^#TN9HBwN97NxTx(tn5+P_5{RbieK z>eWkG=U63$HqL*(h%}p9UpHnvj~odGRhs0dzmwSLF(v>7it{b<9poD*(u;K{j8|#m zFWZ%&J3Z~^pssjTRTDOCD2?VLAm4U3xqpYWMKXp??YC?YBFJ=8 zW+;v+k8XbPGZDwOFv7-_2ng!N-)nNb1%lg(tA{74P^8gZ94Pgb#u*5I{XRt$N4}_dluxE3&{n8u4J~a zgmoF9-2a6bnkS}T%_=##N(^X=D#7M(rzrd|=qi49gY0+y4?DYB@s}U6 z?MyV%R?Yoy%ZR_?!4=BAPV0v&v8t}cxvNA6`8tEy;uz5@|#CF@B%BWlGoJhf=k{ls|crR@x-ULqhfZ<-n{V;Id`SN*m#6)2_5T1A-TYGk literal 0 HcmV?d00001 diff --git a/samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/product-images/nikon.jpg b/samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/product-images/nikon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eb6fb605a18830f916369834c1def5669331dbdf GIT binary patch literal 48244 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

      0S5UhTPbFpke+G0%4atTXJPJuJnu8DO!S6 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 literal 0 HcmV?d00001 diff --git a/samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/product-images/oki.jpg b/samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/product-images/oki.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6fefeec6e312d8baf88ca0a51217e42f36a2b39e GIT binary patch literal 15514 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 literal 0 HcmV?d00001 diff --git a/samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/product-images/playstation.jpg b/samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/product-images/playstation.jpg new file mode 100644 index 0000000000000000000000000000000000000000..880832401aa9153eb759d338f4d9bbf51dc601dd GIT binary patch literal 12477 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 F{TBdKa8LjM literal 0 HcmV?d00001 diff --git a/samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/product-images/rampage.jpg b/samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/product-images/rampage.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e49660df170acdceee2a5c4167a09dbdd2baf95b GIT binary patch literal 29142 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

      +CHI~r!+P-at|%Tb*Oh? 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 MEt12Xs{elz0F7-dC;$Ke literal 0 HcmV?d00001 diff --git a/samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/20190307065413_Added_ImageName_To_Product.Designer.cs b/samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/20190307065413_Added_ImageName_To_Product.Designer.cs new file mode 100644 index 0000000000..7106d08d50 --- /dev/null +++ b/samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/20190307065413_Added_ImageName_To_Product.Designer.cs @@ -0,0 +1,74 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using ProductService.Host.EntityFrameworkCore; + +namespace ProductService.Host.Migrations +{ + [DbContext(typeof(ProductServiceMigrationDbContext))] + [Migration("20190307065413_Added_ImageName_To_Product")] + partial class Added_ImageName_To_Product + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "2.2.0-rtm-35687") + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("ProductManagement.Product", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Code") + .IsRequired() + .HasMaxLength(32); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnName("CreatorId"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("ImageName") + .HasMaxLength(128); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256); + + b.Property("Price"); + + b.Property("StockCount"); + + b.HasKey("Id"); + + b.HasIndex("Code"); + + b.HasIndex("Name"); + + b.ToTable("PmProducts"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/20190307065413_Added_ImageName_To_Product.cs b/samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/20190307065413_Added_ImageName_To_Product.cs new file mode 100644 index 0000000000..082bf9bf52 --- /dev/null +++ b/samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/20190307065413_Added_ImageName_To_Product.cs @@ -0,0 +1,23 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace ProductService.Host.Migrations +{ + public partial class Added_ImageName_To_Product : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "ImageName", + table: "PmProducts", + maxLength: 128, + nullable: true); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "ImageName", + table: "PmProducts"); + } + } +} diff --git a/samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/ProductServiceMigrationDbContextModelSnapshot.cs b/samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/ProductServiceMigrationDbContextModelSnapshot.cs index 5bc9669fb0..dcbec3288c 100644 --- a/samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/ProductServiceMigrationDbContextModelSnapshot.cs +++ b/samples/MicroserviceDemo/microservices/ProductService.Host/Migrations/ProductServiceMigrationDbContextModelSnapshot.cs @@ -41,6 +41,9 @@ namespace ProductService.Host.Migrations b.Property("ExtraProperties") .HasColumnName("ExtraProperties"); + b.Property("ImageName") + .HasMaxLength(128); + b.Property("LastModificationTime") .HasColumnName("LastModificationTime"); diff --git a/samples/MicroserviceDemo/modules/product/src/ProductManagement.Application.Contracts/ProductManagement/CreateProductDto.cs b/samples/MicroserviceDemo/modules/product/src/ProductManagement.Application.Contracts/ProductManagement/CreateProductDto.cs index 693dd0d501..42091eb6ec 100644 --- a/samples/MicroserviceDemo/modules/product/src/ProductManagement.Application.Contracts/ProductManagement/CreateProductDto.cs +++ b/samples/MicroserviceDemo/modules/product/src/ProductManagement.Application.Contracts/ProductManagement/CreateProductDto.cs @@ -1,11 +1,20 @@ -namespace ProductManagement +using System.ComponentModel.DataAnnotations; + +namespace ProductManagement { public class CreateProductDto { + [Required] + [StringLength(ProductConsts.MaxCodeLength)] public string Code { get; set; } + [Required] + [StringLength(ProductConsts.MaxNameLength)] public string Name { get; set; } + [StringLength(ProductConsts.MaxImageNameLength)] + public string ImageName { get; set; } + public float Price { get; set; } public int StockCount { get; set; } diff --git a/samples/MicroserviceDemo/modules/product/src/ProductManagement.Application.Contracts/ProductManagement/ProductDto.cs b/samples/MicroserviceDemo/modules/product/src/ProductManagement.Application.Contracts/ProductManagement/ProductDto.cs index 86a4536785..959473001c 100644 --- a/samples/MicroserviceDemo/modules/product/src/ProductManagement.Application.Contracts/ProductManagement/ProductDto.cs +++ b/samples/MicroserviceDemo/modules/product/src/ProductManagement.Application.Contracts/ProductManagement/ProductDto.cs @@ -9,6 +9,8 @@ namespace ProductManagement public string Name { get; set; } + public string ImageName { get; set; } + public float Price { get; set; } public int StockCount { get; set; } diff --git a/samples/MicroserviceDemo/modules/product/src/ProductManagement.Application.Contracts/ProductManagement/UpdateProductDto.cs b/samples/MicroserviceDemo/modules/product/src/ProductManagement.Application.Contracts/ProductManagement/UpdateProductDto.cs index aa96bf9c51..744d58dbbe 100644 --- a/samples/MicroserviceDemo/modules/product/src/ProductManagement.Application.Contracts/ProductManagement/UpdateProductDto.cs +++ b/samples/MicroserviceDemo/modules/product/src/ProductManagement.Application.Contracts/ProductManagement/UpdateProductDto.cs @@ -1,9 +1,16 @@ -namespace ProductManagement +using System.ComponentModel.DataAnnotations; + +namespace ProductManagement { public class UpdateProductDto { + [Required] + [StringLength(ProductConsts.MaxNameLength)] public string Name { get; set; } + [StringLength(ProductConsts.MaxImageNameLength)] + public string ImageName { get; set; } + public float Price { get; set; } public int StockCount { get; set; } diff --git a/samples/MicroserviceDemo/modules/product/src/ProductManagement.Application/ProductManagement/ProductAppService.cs b/samples/MicroserviceDemo/modules/product/src/ProductManagement.Application/ProductManagement/ProductAppService.cs index c993f27f02..25a596b24e 100644 --- a/samples/MicroserviceDemo/modules/product/src/ProductManagement.Application/ProductManagement/ProductAppService.cs +++ b/samples/MicroserviceDemo/modules/product/src/ProductManagement.Application/ProductManagement/ProductAppService.cs @@ -59,7 +59,13 @@ namespace ProductManagement [Authorize(ProductManagementPermissions.Products.Create)] public async Task CreateAsync(CreateProductDto input) { - var product = await _productManager.CreateAsync(input.Code, input.Name, input.Price, input.StockCount); + var product = await _productManager.CreateAsync( + input.Code, + input.Name, + input.Price, + input.StockCount, + input.ImageName + ); return ObjectMapper.Map(product); } @@ -72,6 +78,7 @@ namespace ProductManagement product.SetName(input.Name); product.SetPrice(input.Price); product.SetStockCount(input.StockCount); + product.SetImageName(input.ImageName); return ObjectMapper.Map(product); } diff --git a/samples/MicroserviceDemo/modules/product/src/ProductManagement.Domain.Shared/ProductManagement/ProductConsts.cs b/samples/MicroserviceDemo/modules/product/src/ProductManagement.Domain.Shared/ProductManagement/ProductConsts.cs index c6cc028936..26ca7ccea5 100644 --- a/samples/MicroserviceDemo/modules/product/src/ProductManagement.Domain.Shared/ProductManagement/ProductConsts.cs +++ b/samples/MicroserviceDemo/modules/product/src/ProductManagement.Domain.Shared/ProductManagement/ProductConsts.cs @@ -5,5 +5,7 @@ public const int MaxCodeLength = 32; public const int MaxNameLength = 256; + + public const int MaxImageNameLength = 128; } } diff --git a/samples/MicroserviceDemo/modules/product/src/ProductManagement.Domain/ProductManagement/Product.cs b/samples/MicroserviceDemo/modules/product/src/ProductManagement.Domain/ProductManagement/Product.cs index bca0a7b09d..6686637185 100644 --- a/samples/MicroserviceDemo/modules/product/src/ProductManagement.Domain/ProductManagement/Product.cs +++ b/samples/MicroserviceDemo/modules/product/src/ProductManagement.Domain/ProductManagement/Product.cs @@ -22,6 +22,8 @@ namespace ProductManagement public int StockCount { get; private set; } + public string ImageName { get; private set; } + private Product() { //Default constructor is needed for ORMs. @@ -32,7 +34,8 @@ namespace ProductManagement [NotNull] string code, [NotNull] string name, float price = 0.0f, - int stockCount = 0) + int stockCount = 0, + string imageName = null) { Check.NotNullOrWhiteSpace(code, nameof(code)); @@ -45,6 +48,7 @@ namespace ProductManagement Code = code; SetName(Check.NotNullOrWhiteSpace(name, nameof(name))); SetPrice(price); + SetImageName(imageName); SetStockCountInternal(stockCount, triggerEvent: false); } @@ -61,6 +65,22 @@ namespace ProductManagement return this; } + public Product SetImageName([CanBeNull] string imageName) + { + if (imageName == null) + { + return this; + } + + if (imageName.Length >= ProductConsts.MaxImageNameLength) + { + throw new ArgumentException($"Product image name can not be longer than {ProductConsts.MaxImageNameLength}"); + } + + ImageName = imageName; + return this; + } + public Product SetPrice(float price) { if (price < 0.0f) diff --git a/samples/MicroserviceDemo/modules/product/src/ProductManagement.Domain/ProductManagement/ProductManager.cs b/samples/MicroserviceDemo/modules/product/src/ProductManagement.Domain/ProductManagement/ProductManager.cs index 4c39feb7bf..9b924ca1d6 100644 --- a/samples/MicroserviceDemo/modules/product/src/ProductManagement.Domain/ProductManagement/ProductManager.cs +++ b/samples/MicroserviceDemo/modules/product/src/ProductManagement.Domain/ProductManagement/ProductManager.cs @@ -20,7 +20,8 @@ namespace ProductManagement [NotNull] string code, [NotNull] string name, float price = 0.0f, - int stockCount = 0) + int stockCount = 0, + string imageName = null) { var existingProduct = await _productRepository.FirstOrDefaultAsync(p => p.Code == code); if (existingProduct != null) @@ -34,7 +35,8 @@ namespace ProductManagement code, name, price, - stockCount + stockCount, + imageName ) ); } diff --git a/samples/MicroserviceDemo/modules/product/src/ProductManagement.EntityFrameworkCore/ProductManagement/EntityFrameworkCore/ProductManagementDbContextModelCreatingExtensions.cs b/samples/MicroserviceDemo/modules/product/src/ProductManagement.EntityFrameworkCore/ProductManagement/EntityFrameworkCore/ProductManagementDbContextModelCreatingExtensions.cs index 8a12ad11a8..94d74e836f 100644 --- a/samples/MicroserviceDemo/modules/product/src/ProductManagement.EntityFrameworkCore/ProductManagement/EntityFrameworkCore/ProductManagementDbContextModelCreatingExtensions.cs +++ b/samples/MicroserviceDemo/modules/product/src/ProductManagement.EntityFrameworkCore/ProductManagement/EntityFrameworkCore/ProductManagementDbContextModelCreatingExtensions.cs @@ -27,6 +27,7 @@ namespace ProductManagement.EntityFrameworkCore b.Property(x => x.Code).IsRequired().HasMaxLength(ProductConsts.MaxCodeLength); b.Property(x => x.Name).IsRequired().HasMaxLength(ProductConsts.MaxNameLength); + b.Property(x => x.ImageName).HasMaxLength(ProductConsts.MaxImageNameLength); b.HasIndex(q => q.Code); b.HasIndex(q => q.Name); diff --git a/samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/Localization/Resources/ProductManagement/en.json b/samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/Localization/Resources/ProductManagement/en.json index d9e9ea167a..39d48b30e2 100644 --- a/samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/Localization/Resources/ProductManagement/en.json +++ b/samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/Localization/Resources/ProductManagement/en.json @@ -10,6 +10,7 @@ "Code": "Code", "Name": "Name", "Price": "Price", + "ImageName": "Image Name", "ProductDeletionWarningMessage": "Are you sure you want to delete this product?" } } \ No newline at end of file diff --git a/samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/Pages/ProductManagement/Products/Create.cshtml.cs b/samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/Pages/ProductManagement/Products/Create.cshtml.cs index 89188ad2d2..e660ff8f8b 100644 --- a/samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/Pages/ProductManagement/Products/Create.cshtml.cs +++ b/samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/Pages/ProductManagement/Products/Create.cshtml.cs @@ -10,7 +10,7 @@ namespace ProductManagement.Pages.ProductManagement.Products private readonly IProductAppService _productAppService; [BindProperty] - public ProductCreateModalView Product { get; set; } = new ProductCreateModalView(); + public ProductCreateViewModel Product { get; set; } = new ProductCreateViewModel(); public CreateModel(IProductAppService productAppService) { @@ -19,14 +19,14 @@ namespace ProductManagement.Pages.ProductManagement.Products public async Task OnPostAsync() { - var createProductDto = ObjectMapper.Map(Product); + var createProductDto = ObjectMapper.Map(Product); await _productAppService.CreateAsync(createProductDto); return NoContent(); } - public class ProductCreateModalView + public class ProductCreateViewModel { [Required] [StringLength(ProductConsts.MaxCodeLength)] @@ -36,6 +36,9 @@ namespace ProductManagement.Pages.ProductManagement.Products [StringLength(ProductConsts.MaxNameLength)] public string Name { get; set; } + [StringLength(ProductConsts.MaxImageNameLength)] + public string ImageName { get; set; } + public float Price { get; set; } public int StockCount { get; set; } diff --git a/samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/Pages/ProductManagement/Products/Edit.cshtml.cs b/samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/Pages/ProductManagement/Products/Edit.cshtml.cs index 4776f135bd..d0b2450e97 100644 --- a/samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/Pages/ProductManagement/Products/Edit.cshtml.cs +++ b/samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/Pages/ProductManagement/Products/Edit.cshtml.cs @@ -1,10 +1,7 @@ using System; -using System.Collections.Generic; using System.ComponentModel.DataAnnotations; -using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.RazorPages; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; namespace ProductManagement.Pages.ProductManagement.Products @@ -14,7 +11,7 @@ namespace ProductManagement.Pages.ProductManagement.Products private readonly IProductAppService _productAppService; [BindProperty] - public ProductEditModalView Product { get; set; } = new ProductEditModalView(); + public ProductEditViewModel Product { get; set; } = new ProductEditViewModel(); public EditModel(IProductAppService productAppService) { @@ -25,7 +22,7 @@ namespace ProductManagement.Pages.ProductManagement.Products { var productDto = await _productAppService.GetAsync(productId); - Product = ObjectMapper.Map(productDto); + Product = ObjectMapper.Map(productDto); return Page(); } @@ -40,7 +37,7 @@ namespace ProductManagement.Pages.ProductManagement.Products }); } - public class ProductEditModalView + public class ProductEditViewModel { [HiddenInput] [Required] @@ -50,6 +47,9 @@ namespace ProductManagement.Pages.ProductManagement.Products [StringLength(ProductConsts.MaxNameLength)] public string Name { get; set; } + [StringLength(ProductConsts.MaxImageNameLength)] + public string ImageName { get; set; } + public float Price { get; set; } public int StockCount { get; set; } diff --git a/samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/ProductManagementWebAutoMapperProfile.cs b/samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/ProductManagementWebAutoMapperProfile.cs index 43b2be406a..577aa0f352 100644 --- a/samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/ProductManagementWebAutoMapperProfile.cs +++ b/samples/MicroserviceDemo/modules/product/src/ProductManagement.Web/ProductManagementWebAutoMapperProfile.cs @@ -7,8 +7,8 @@ namespace ProductManagement { public ProductManagementWebAutoMapperProfile() { - CreateMap(); - CreateMap(); + CreateMap(); + CreateMap(); } } } \ No newline at end of file From 9f1fecf7725439c92eba0206ac62efe272a0152b Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Thu, 7 Mar 2019 11:01:03 +0300 Subject: [PATCH 033/111] Stylize the products page --- .../PublicWebSite.Host/Pages/Products.cshtml | 52 ++++++++++++++---- .../PublicWebSite.Host/Pages/Products.css | 30 ++++++++++ .../wwwroot/product-images/noimage.jpg | Bin 0 -> 9672 bytes 3 files changed, 71 insertions(+), 11 deletions(-) create mode 100644 samples/MicroserviceDemo/applications/PublicWebSite.Host/Pages/Products.css create mode 100644 samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/product-images/noimage.jpg diff --git a/samples/MicroserviceDemo/applications/PublicWebSite.Host/Pages/Products.cshtml b/samples/MicroserviceDemo/applications/PublicWebSite.Host/Pages/Products.cshtml index 9e32a2acad..8f7664dad6 100644 --- a/samples/MicroserviceDemo/applications/PublicWebSite.Host/Pages/Products.cshtml +++ b/samples/MicroserviceDemo/applications/PublicWebSite.Host/Pages/Products.cshtml @@ -3,20 +3,50 @@ @using Volo.Abp.Settings @model PublicWebSite.Host.Pages.ProductsModel @inject ISettingProvider SettingProvider -

      Our Products

      -
        - @foreach (var product in Model.Products.Items) +@{ + const int columnSize = 3; +} +@section styles{ + +} +

        Our Products

        +
        + @for (int i = 0; i < Math.Ceiling(Model.Products.Items.Count / (double)columnSize); i++) { -
      • - @if (!product.ImageName.IsNullOrEmpty()) + + @for (int j = 0; j < columnSize; j++) { - + + @if ((i * columnSize) + j < Model.Products.Items.Count) + { + var product = Model.Products.Items[(i * columnSize) + j]; +
        + @if (!product.ImageName.IsNullOrEmpty()) + { + + } + else + { + + } +
        +
        +
        +
        @product.Name
        + @product.Code - Stock count: @product.StockCount +
        +
        +
        + $@product.Price +
        +
        +
        + } +
        } - @product.Code / @product.Name / $@product.Price
        - Stock count: @product.StockCount -
      • + } -
      + @* An example to show how to read settings from the client side / UI *@ -

      Maximum allowed page size: @await SettingProvider.GetOrNullAsync(ProductManagementSettings.MaxPageSize)

      \ No newline at end of file +

      Maximum allowed page size: @await SettingProvider.GetOrNullAsync(ProductManagementSettings.MaxPageSize)

      \ No newline at end of file diff --git a/samples/MicroserviceDemo/applications/PublicWebSite.Host/Pages/Products.css b/samples/MicroserviceDemo/applications/PublicWebSite.Host/Pages/Products.css new file mode 100644 index 0000000000..4ce2df2f4a --- /dev/null +++ b/samples/MicroserviceDemo/applications/PublicWebSite.Host/Pages/Products.css @@ -0,0 +1,30 @@ +body { + background-color: #f9f9f9; +} + +.product-list-item { + background-color: #fff; + padding: 2em; + border: 1px solid #eee; + border-radius: 3px; + box-shadow: 0 0 10px rgba(0, 0, 0, .05); + margin-bottom: 2em; + transition: all .2s; +} + +.product-list-item:hover { + box-shadow: 0 0 20px rgba(0, 0, 0, .1); + cursor: pointer; +} + +.product-list-item img { + width: 100%; +} + +.product-list-item .text-muted { + opacity: .8 +} + +.product-info-box { + min-height: 80px; +} diff --git a/samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/product-images/noimage.jpg b/samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/product-images/noimage.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4c5133c8c9b98f750b22a44530ba71e378fd0fdd GIT binary patch literal 9672 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

      =|uTTJGY!sKidOy8X?Rkm+}!R; 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 literal 0 HcmV?d00001 From 590c68d67850b80b366d69a8a24843aa8bf4c570 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Thu, 7 Mar 2019 11:25:20 +0300 Subject: [PATCH 034/111] Added BlogFilesController --- .../Volo/Blogging/BlogFilesController.cs | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 modules/blogging/src/Volo.Blogging.HttpApi/Volo/Blogging/BlogFilesController.cs diff --git a/modules/blogging/src/Volo.Blogging.HttpApi/Volo/Blogging/BlogFilesController.cs b/modules/blogging/src/Volo.Blogging.HttpApi/Volo/Blogging/BlogFilesController.cs new file mode 100644 index 0000000000..48f15e8657 --- /dev/null +++ b/modules/blogging/src/Volo.Blogging.HttpApi/Volo/Blogging/BlogFilesController.cs @@ -0,0 +1,27 @@ +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Blogging.Files; + +namespace Volo.Blogging +{ + [RemoteService] + [Area("blogging")] + [Route("api/blogging/files")] + public class BlogFilesController : AbpController, IFileAppService + { + private readonly IFileAppService _fileAppService; + + public BlogFilesController(IFileAppService fileAppService) + { + _fileAppService = fileAppService; + } + + [HttpPost] + public Task UploadAsync(FileUploadInputDto input) + { + return _fileAppService.UploadAsync(input); + } + } +} From 981c76d7c7a32c65b4275d94c4db26db859b2dc1 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Thu, 7 Mar 2019 11:58:31 +0300 Subject: [PATCH 035/111] Remove blog menu item --- .../Blog/Controllers/CommentsController.cs | 2 ++ .../Areas/Blog/Controllers/PostsController.cs | 2 ++ .../BloggingMenuContributor.cs | 22 +++++++------------ .../Resources/Blogging/Web/en.json | 2 +- .../Resources/Blogging/Web/pt-BR.json | 2 +- .../Resources/Blogging/Web/tr.json | 2 +- 6 files changed, 15 insertions(+), 17 deletions(-) diff --git a/modules/blogging/src/Volo.Blogging.Web/Areas/Blog/Controllers/CommentsController.cs b/modules/blogging/src/Volo.Blogging.Web/Areas/Blog/Controllers/CommentsController.cs index 89ed0f1968..80ef132c21 100644 --- a/modules/blogging/src/Volo.Blogging.Web/Areas/Blog/Controllers/CommentsController.cs +++ b/modules/blogging/src/Volo.Blogging.Web/Areas/Blog/Controllers/CommentsController.cs @@ -7,6 +7,8 @@ using Volo.Blogging.Comments.Dtos; namespace Volo.Blogging.Areas.Blog.Controllers { + //TODO: Is that being used? + [Area("Blog")] [Route("Blog/[controller]/[action]")] public class CommentsController : AbpController diff --git a/modules/blogging/src/Volo.Blogging.Web/Areas/Blog/Controllers/PostsController.cs b/modules/blogging/src/Volo.Blogging.Web/Areas/Blog/Controllers/PostsController.cs index 55a96f6ccc..383f08284f 100644 --- a/modules/blogging/src/Volo.Blogging.Web/Areas/Blog/Controllers/PostsController.cs +++ b/modules/blogging/src/Volo.Blogging.Web/Areas/Blog/Controllers/PostsController.cs @@ -6,6 +6,8 @@ using Volo.Blogging.Posts; namespace Volo.Blogging.Areas.Blog.Controllers { + //TODO: Is that being used? + [Area("Blog")] [Route("Blog/[controller]/[action]")] public class PostsController : AbpController diff --git a/modules/blogging/src/Volo.Blogging.Web/BloggingMenuContributor.cs b/modules/blogging/src/Volo.Blogging.Web/BloggingMenuContributor.cs index f20c946232..cf1f12ed02 100644 --- a/modules/blogging/src/Volo.Blogging.Web/BloggingMenuContributor.cs +++ b/modules/blogging/src/Volo.Blogging.Web/BloggingMenuContributor.cs @@ -1,7 +1,7 @@ -using System.Threading.Tasks; -using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Localization; +using System.Threading.Tasks; using Volo.Abp.UI.Navigation; using Volo.Blogging.Localization; @@ -22,23 +22,17 @@ namespace Volo.Blogging var authorizationService = context.ServiceProvider.GetRequiredService(); var l = context.ServiceProvider.GetRequiredService>(); - if (await authorizationService.IsGrantedAsync(BloggingPermissions.Blogs.Default)) + if (await authorizationService.IsGrantedAsync(BloggingPermissions.Blogs.Management)) { - var rootMenuItem = new ApplicationMenuItem("Blogs", l["Menu:Blogs"], "/Blog"); - - context.Menu.AddItem(rootMenuItem); + var managementRootMenuItem = new ApplicationMenuItem("BlogManagement", l["Menu:BlogManagement"]); + //TODO: Using the same permission. Reconsider. if (await authorizationService.IsGrantedAsync(BloggingPermissions.Blogs.Management)) { - var managementRootMenuItem = new ApplicationMenuItem("BlogManagement", l["Menu:BlogManagement"]); - - if (await authorizationService.IsGrantedAsync(BloggingPermissions.Blogs.Management)) - { - managementRootMenuItem.AddItem(new ApplicationMenuItem("BlogsAdmin", l["Menu:Blogs"], "/Admin/Blogs")); - } - - context.Menu.AddItem(managementRootMenuItem); + managementRootMenuItem.AddItem(new ApplicationMenuItem("BlogManagement.Blogs", l["Menu:Blogs"], "/Admin/Blogs")); } + + context.Menu.AddItem(managementRootMenuItem); } } } diff --git a/modules/blogging/src/Volo.Blogging.Web/Localization/Resources/Blogging/Web/en.json b/modules/blogging/src/Volo.Blogging.Web/Localization/Resources/Blogging/Web/en.json index b9e7b543b9..444c3d80af 100644 --- a/modules/blogging/src/Volo.Blogging.Web/Localization/Resources/Blogging/Web/en.json +++ b/modules/blogging/src/Volo.Blogging.Web/Localization/Resources/Blogging/Web/en.json @@ -1,7 +1,7 @@ { "culture": "en", "texts": { - "Menu:Blogs": "Blog", + "Menu:Blogs": "Blogs", "Menu:BlogManagement": "Blog Management", "Title": "Title", "Delete": "Delete", diff --git a/modules/blogging/src/Volo.Blogging.Web/Localization/Resources/Blogging/Web/pt-BR.json b/modules/blogging/src/Volo.Blogging.Web/Localization/Resources/Blogging/Web/pt-BR.json index 81740c65db..cf98e56b06 100644 --- a/modules/blogging/src/Volo.Blogging.Web/Localization/Resources/Blogging/Web/pt-BR.json +++ b/modules/blogging/src/Volo.Blogging.Web/Localization/Resources/Blogging/Web/pt-BR.json @@ -1,7 +1,7 @@ { "culture": "pt-BR", "texts": { - "Menu:Blogs": "Blog", + "Menu:Blogs": "Blogs", "Menu:BlogManagement": "Gerenciar Blog", "Title": "Título", "Delete": "Excluir", diff --git a/modules/blogging/src/Volo.Blogging.Web/Localization/Resources/Blogging/Web/tr.json b/modules/blogging/src/Volo.Blogging.Web/Localization/Resources/Blogging/Web/tr.json index a5a705d506..7d8386e517 100644 --- a/modules/blogging/src/Volo.Blogging.Web/Localization/Resources/Blogging/Web/tr.json +++ b/modules/blogging/src/Volo.Blogging.Web/Localization/Resources/Blogging/Web/tr.json @@ -1,7 +1,7 @@ { "culture": "tr", "texts": { - "Menu:Blogs": "Blog", + "Menu:Blogs": "Bloglar", "Title": "Başlık", "Delete": "Sil", "Reply": "Yanıtla", From c826ec5916f70a835712c0dc837c2b5fe2b9825d Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Thu, 7 Mar 2019 11:58:35 +0300 Subject: [PATCH 036/111] Create 90974f3f1edb4ab0a10cf9759fd5f9ae.png --- .../files/90974f3f1edb4ab0a10cf9759fd5f9ae.png | Bin 0 -> 158215 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/files/90974f3f1edb4ab0a10cf9759fd5f9ae.png diff --git a/samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/files/90974f3f1edb4ab0a10cf9759fd5f9ae.png b/samples/MicroserviceDemo/applications/PublicWebSite.Host/wwwroot/files/90974f3f1edb4ab0a10cf9759fd5f9ae.png new file mode 100644 index 0000000000000000000000000000000000000000..17aea07098fdb739c548265f30e2f540a88912f6 GIT binary patch literal 158215 zcmd43Ra6|^7A@Q{2nmqj79_a4YeH}h(l`yl-CYw14#C}mLlYplOK@%68Vl|;?($d8 zm+zea;Xd5QTcgLI=&r8Xvi4eY&b4-jd{mG`dqMaD1OlN+ONl9iK+hIIpeI<*9|P~O z4#t2%ATp4&*n3sCw7msaFC6f-$l>PTAQK%=dKBa{C@TPh{W>p{{Dq6sRCSh@wWXf! z^yEV3Gj%2PsRJmj+S76}@og!Zs_$8pU!x#4z>%7Ka$^{?95es*T|e6LiOeKidWc<_IYOaI@9f6qZMJ*lC8|G7j{=J@yA$A1F#@A>B?GOj0o&wum$ zzj}FuQ$8|k8s9_s2I79>QQ9NZHUc}O|I?p9n0H`c5DymA%XAoqV4AiYfa@5M+(1pl75zPCX7d){UXW8~tn+qmUe@c1+7|2YW#q5r3AfA3Y> zMPU42jCD-wzm59rnA(x^hOr8o7VO56UnyLk^$4lFB!^%9e^bNcP*`ViOjMj6+7GVY zP7Y@?XwMI#J_~zknK{ER{NK)e7w3)c$f@HaprSC0P+VO*t_wNZh?`0iiAs6&PpdyC zVB%whC`V?=vA^44DY5wql1}%yUrR^3Ei3|(O*zu{m{h$9vydt^54NU6HilB z+&_$abj;rJ_P_R462>L``TD<21053muOrS!-N+x8lJ`fdZc>rqwCI1Iw}p+5;yfFu zf}}CNM#Me*cY;3SVgxi)y`(UCfvt=jZA3}_*7-HTkQikyD!B?7T?Vy+!=mWFlli-8 z^_12nQS!A`!LW4w!Vn+EYRrns<7mFmbwOJbkNR>wCSY|{MFE!K|7{pA!mFI(q8)l?b(Z{sKj2X9&!+-@eO#HieFFXrt{ezliYT8;OBu1_x{C zZmh3;W}_C^pX9qC!18M_WmSR-NH8suy#5^F9M*~Xzd<1-dL+qo!}qtiHH$L`!@%JQz-_RNpKWENzt z8~w4a+n23xk<75tu+-h%g=^zq(D}P{q1Z41Q{rg(mSq^P0Zpj>TZkh>w>#|H^M%0U z6d6bolM_*U`s8gVLUbo8c3d_74L6r%x)kBN$10BO0i8aSH43-}%Tp8s zzAV(G!q>VRDSO$|r6eiX7!&lS=P#=k|5`V1CY!R(S_PJ2Ze3pyn&4X1bY>y_yrz7( z6u2&@;T%WOxtSgx20kd9lCe@iPn#UtQ*+d+H$LA?Kv0pJpi{>`B!Ruw1uQQz3$5Z~ zGt<9tY}T%+!wXX$eKxt8rkK7FcnWlsS5b%$;piI#8rd#ym}){pKBKOXKsIID|IyTP z{u?D#E=GEbJ8q6)a`ol{PfhRQS74b9X(|cUn3lS^B5<#NZ27Ze$5DR@i|bkx{mW50 zBUJrmd(r-Pm|yqUd#qpb;LWDpqaRxR&jV}*l3uLi&Ec>oX=tF@$Ezl5W`A8nC5PL$ zpU>0^;8f=c14pI&qIX$&7Rf%NgFQFTB zw6O4V*KiPMKj1_H*_vk`wJ5Eum!53JFYl#vK74}<+AiAg{HS@-&{Je7nWtLsw%R{d z+o$CG>pzhr&9y&F@rUO9IxK>LVL;YMlbSqdlvX;Xs9*A{s;D*8oYhdb<_z zL~DnIBM=;$Mi!d`2}7Nh*N;Fh7s^PRX5cxM+C7N-Rydv4bb}1|6U=7#{dJ~- z+^NOW!Q@|zl)16A(PS@BwkZjM*?^BxO_bvko@zl>7rmR(cufn)|V zXsN03fGS^em(iSdO9j*2}EO}oX%r;*5B76@QVyN`I4-tkzm8JD}7>@7m zl0hKi5#Q;%a;qhjXs+td!5HgtbJAe(ATC;0Z7dF)$VRQ#&muW!ZB4Pp>!7Ok@pXhr zt*PbRjF^eTi?Wt+B_p?iaNH{ z5K~E^z2vjhlm;7cX)^vw}FQ{-PcDHoFFH&m^LYwRK~0?7`jEHoG6aq`02O|)~5kT zuJTp}DFyk^23AGRSlU4{bDIsFGwb=ae3Hdch{ zlRMcunl97Y7pk9JW7W7;iA=wIq9p9!FU3KAsZ8M~yAOlI2_=x;2fyHUu1<<2=hs1@ zyx0A+$Unnu7l!q0b#Ferd)H=Z+v0xIwMwY)`<#3@!}aP*fU1g^x9#D*YOT$}q7Pz0 z+osNb?s`3hPN+w*wLaYs3B+rumkC3CB1UxO+{2ckjTUn=!sfg)MC=I%QlU%F{BUiZG1vr?O`l`c}#Ez%jz2*duRb$Q0 zExu_o@X>7tBglpMB0QpS&E%MIqQ3WwNTk{7r0f??Jm(%cu7mY z#5`|qf&3o`{*I=0CG}Ma&bkV7D*x_=W`sfvF=a~O(NuhnM8xg5wQp%@#r^FNvNa|Z z=pE5-E;XAnGU~$=dWi0Ox!>qSWy}Ix$V0uF@->(SkNGSMp-K1@>S$n`X_553wJCA~ zv5GM5uwY)g4EUD|ahzmzTugOou$%GQqR@o9x8lNFyz$y$bt`XI=CwMF@i6Qy+1%66 zRMt{*56Q@3LJBcL5ksHeXE9RCOA(S$pW($`zjS^Gk$%$Ic`s@pf}7llYEmHS<7;{F zmB&Z3VbjeJ%)9>=SZ@s;J65{dYFeX|->xqQX<~U+vrqNDx}sUI-%OY8lWwdn?GteL z>Foa$WX2FaSxU)oJVJ)^y>-UUZl|dMuUUAPqiEr5IX~5#?rICdoaASLFO*P39em&N$75f847f?vt&h+xT}T5E(gn|} zz59(X+%KN}iO1h3t+g)<<>iMa%o8tmW=}X(cD2OmLn}-X_bV%KJv@fcY$!d3xP%0( z?wl}jyxw^Kl{Fzis4lUsQSg)S-*?uROiXVQ^pTWE1=Ydz!PwJkw$V_`*j{|8PRcH! zi)@Je+Ws8!KfL7oxPw5tr>hk!VT8J#XUQ;1&+#$D?f#0T<#tN{$ATeP->+x2{-Fh# zCNk4*df&AaayQV3Xu7$(ShCDacj>~x4Ksd#Mc5?fq%Q&_VuCH$O6%b%`TG(^%E)4$ zWmI+P_*B}4qm-h;y!y_sblwI*)HkgJtS)AM_~~bb;={}6>{~-24=2*3XeES-P3=vy z>!K$jz1GpeA;W8fFSPhUU|?))jI>p+#$x?Nw?<@!P){T&DK_>*j_1YV_O^h_97f1yak4GHJU&U@(--@g8mpT$&?0dLamE za;!dlsWpbk4`O0Uzw$%2?K{OFF&zvFX^d&h7I)ko!YJgm@rM);C`(WeR&Y>pAhhc{T6)(4Xmxj*1#*oa{(~Nhs4- z-M&HFolcBTVDF}s_P7~(rjjowEho1(*~o)|Lo#gsQ2PWl@+Rivv|=I(BYQ@$`H;OO z@+US3nycm9T}2eLGeH`y$+oBtmF!pj5K3~)rt5p8z!zUWb%I}@Vm$s3QfyT7+`c&k zAH`sQ{aG|+?CZ=@<4+0%ucLc3dF07PDLc=m_}hUisvxYQR*K|f(^Sd1@NqT%c^Z1+ zU346lKEawRGrB&K7}Q*Pnx&fgnQw4sdOH3oNIm{JXJe76=BjXX9IT636nAKDndivf)GnA+d*C@9?gT55===YdN64`YN zGllXbJy?z4C8Gd2fqVpu?#g6^%EnG(YK6#>eN`1aUC;a>r?CHnUkz($fOuu8IU{Wq zw?k>vn3P3eIb1caCo5t7r2lbD_=gon#3CpA%!HCMxhZZ>Tk=U!mu2A}p96viRpv{? zP|E%k_occS$x^((XazZbp4%s3Wi|XYXG=pxjTzne%P<5A?Go>*U38iI{?^~~Y$rZ0 z4x5BTLG0JBU)i*L#OLQ;6d;f=pYghgCHeuaQ`BCmXGAPC2HH^EFEmxr?YZJ$@R*Hy zdge#{6mJ>fEG&idvZK0?9q#AT5B#R#ssTo?T&JT-s?)`h!wP9`ZXa$zts}vxx`7|x1MV+nw`_N``G&5t+BCVL;7g!1fxLXg2PGWuN^1~E#KAod zGu2;8UspMqFG`GpKyFBJC{3Ws0pCYPLZZXnx+@BLJf;INq#AW&pJaZX+xy9+NKt3z z>_bdhzf^cl(j0jUZYkSe1%kiiXE3d1f~;(4^(#vY3mI9Nr|9d-o-PG5sN?h3Hl)F zre8}d`%w3@$}DVzFx99QSsTrBGc1Oa&2u z+`!|YQG0I{jL&XeY-KLRy zKCpG;=l_tKtNBuX~&UNNy;k19%WntiVE&%hv&8+1N(fY+DA1uxludX?j*V8RFM z`~Dv@PcgroDT<->xth&RNg*UBd9L!ibiR0RSbbm*&3M2 zuZ<*qf@j95^uXya<99O2CWCmKSySg+4NWicI$g42IPb%q0XKEAzf_i=->uJD2yHl@ z)_X(yhyG%}n^D*YkrJDF(|vmtL#t3{kkI#L<^b^o)P^h(_l7`D?l+04wQ~Nr z>ti+Jm<2Jh&fwyvJzkXdE};gU(T6vSys!S6%i7pAIsu2fiKh8>&MP4uFj!p7T*$-g zde)R@!6A$`RG~oS_0wp3WuYI_XWhjKFEE;S(tp|1irn|+1Ox;$b4Z{QaZHlhJ_fbb zLPp=_(yvuaQyZ&RbKt@3;sp=jh@G#+-3K~W4uo&KK_>?NZgS@Id|1yh zU?Ii18IMuCC6;C2jjBI;x1r`MxvVYu4GjeAHJ)CGpE4b(VbUgPdU(VnfHj#n(3H5z zbiFf>`fysX7DxG(GP=9fJnazaWoVJ>j|CgwEf(L|Iv-tCr@hHqAx4=^i(i5uCz-p| z4yx|@p00TA?WcnwIxp&RjtkdR>vopVz6+MZU3;E7%ubF8V&snwvJO}S~6m_FmH>EANBX> zo7lvBH6BwXIu-5<$GX~6W=omnM|47C91;=f>@F+u_vmQfbDlp(&G1HuEP5Pe;S3}$ z-EYoi_#OouEHq+`M!o$Ih)Q5k2}TK5u`}y<;^^S`aDBPDJN*LcwEfSwcNNaiN`6K>s!CQ3#r0I!M zroR*9Q%f7KQ(lQ&j+j)MXI5y4`Vp=fLyL>?d~W-kIm#A)y674ume$VSL_(ef)_P8W zKm{0tX86%#0m1f?;Qb8oP~}=rCD}fDU$@U!K}A^))3SAy$l7kwhjWI0j7S?naDrKH z2RwS}!~VxM3|P;OW(SZv1CgpcIZIFhyZ&rauE_v&Ci?zU^-zP&dJK2NRF7@*_Y!sf zl;+k5=207x+mpBf$u5XUk*gtAX}WhScijqnZjPZ)3z$EX3QY#c?VRqcW->g;kXo+Q z`9S5*3=e+Y{*~~NydTy-IM8=)84ez?v#iR3&LzGf zNo~YxkQmwQ zq^%ejlas!W9y^JBNf;s8xUGH|VJlAX@uIc7uzc`YFX34V4-O6v4P{RmvPmrdQC0Qh z$Kbk?4AKYH>B~_7YNmQb^u1X_v^@e5a%H*7MTxo8#tJ|+Kl0iKU?)E<4=4chlH!@7 z{ywlxxU(aFaEt2G_^3=sO3cMRbvgB(hsGiiEFZ4=%3a5qlr3h#V)+v}A-3sNkMR>Y z#n+l3$RAU#*a>0@rk%m`7^YzPpgi*cN&vVvB-y;c8}gKc=p=aF*!nv1uIK zi%BT#I5m&HNRHeVd5uOKD{MD`xT)E{-%sp7<`|HD5gHc8w;9f+6vz1XQ}gx3o`}=n z=jBz=j+|R!Mo^o%Q`ifV*^+@B5g9jUf|oBS403w`CAGR+l%Sgzi&Ck7K;&rJ7v{NL z_6onVQ;pa9q*NX%XH!6eQUukyM6S0a_m_L9x6u%bDrzP-*Zw0;q(MIU9Ke_?gQXZ^ z2?UO0O6*KJ%9ivz)`#vR&|s$US}KfZNSe2V&)fK<<8p3`mhjqW@zL+Jwx<b ze(`v0+|_f~-3jL8{e~#>_+UEK8zQUSP~p|r?sxl!oKVnU{_8-grAIj!7>Q8hFc)jx z9Ht9)$r{^)> z2ZnC7q|C;nX#_{D?T8Ac`8I+1_LCm@lu?=v$+D5kx>)&_HD4`WR#@!SY>?&wp2Kie z1u3Ggu)Mcg8^a3a&a3M^`L)S%s-E|)MD-9MQKrL*Ze&Ed+d8p&Bz^BN&v`Y6#N@zhfIy~oFuah8%1D~I3CyCiCV40D z2TK1w1tyaY-m_Jx^~2+YftUXSC}jvES+M15L#mNI_cnf*uD#`5w^U8<}ERM?9Qs= zO%8Z$Venh*p`AzyvzQh`t&W@1Zh!drdT~#gCrR`HZWh*myR*uZ;d?@K_txtsf6}(~ zI4&c)2yZSFA(Yye#gZXA`8Dkg16j&zIA=doLB?^<&+&!rWgX ze7q+5`n1`-`5N73#yJ`s=S;Z*fGyX8YAiyj{Hu!B zVceDh8QPt^*YAJRKxF}>K&8j#vp&DrDbf#}1++?yPHpFatic7bl zJM(-W&;^~;d|Sx&@8pAyOB5iQz1cA#9Lj=#p2dChD-)#?d|W5ZZo!cCR3dF_H|ID} zQV`%_1ka{6+zBGXup>#v`_0xbDaX5q92(FMPc+fT%NxORyQS)X*ZC1B}`OlE3Izt-T>w zYHAIDU-%4RImcZ)m&sly!^Qr+ya2rb!^wHEBzM!Rvs>W7Oe`EG?M?{cDR1^b#T1uS zJ)2amsLYdf$+8Fnks;HozQ{0<7d2mZsAR8s9!6ev_jDHkMghFu3@t7lYLuLY2X}{O z=C{`UUZ(-lbF1+?P(iK4#3$aYjpnA2rI|kWyUY_0XUK)aYC|S_Xc!bgm2hTS)Pm zeKa%;HQe#fBHN5LYB0CEO`U$lBg?el4t-(~;R3|y^c1!D?`0-qW|k?zQl78RwC%(k zNj-}ev9^a?h4aw>cXDd1l9HL=m5oMnJ7?~y+?Hy4_NhXh9t!7@*88;vd1?H7MjLtgPY@3o~mEfl?dCUj)v3zRNM5M zIPQCwXatnNqFKNlz&LX0Y}yZpfYC4bob>`>Wf@>lnJ0KGI`7~RL$q_e%CCV-Uh3AU z9ui}lINm1K-Ev8bGvz?=^oWo0vHIjwdLCqX7;KMrl3HZ$U3~$zuC!UIf}2wQN*KAx zxa4t>25fy~L8xZ>a}wD~XP9H~3H)nV%SjbacQ8uzLw$PF?N<-8)U@VFaEjvOddMKO zN|Cuc6&f|?E(4K>p7ax$IQGKKo9)09u!IEuspK$&15u(no*k_i|5W|dOY(+@z^7a5tY-}~QPURrbn37%z4^=C3%Gu}@${8o z7Nj8G)dp&ME~J=UImov^@+E!O_dcH$5#0L3oS2JyH-T#jF<+&eAXJcv1{&c8lH{BD zXq=(pa|7JeJIhFo@Ft7Y< zgMA+NA!I1GHQSgUz*u9qEhQzgmaQwRXNv?L79R={m7WHDY@_rZ!hj?Jsbyml$|-mLpcNxKU>Bc=%at~@<65EEeQ3JL0u0*O z$t%6d;h#Q}W9_$Z5V*aXp0!+F6vAA%fm8WC1rt>*5hdnhyFX8JaWIT+mcFCyxug#3 z%Y-U!ad>D9`kdVhl9RkPsy`V`R2frP8i{s1aGG(~HI;FE_noY2e0VF( zF|kqtY)OhQmk(0nUoSB8be^1Jxu-(d;j(cXo#qm43g-1}9MuUOz?am+vd!3$YZM1T zc8e)vG&Zm;lCm<99|>=AD!ix(q+d(3vwi?2qUQDkE1SHSByq=qHZ&V&no{Dayi8={ zC$oNWb6qMWvh2-3q{SLoDR{Ap2}~V%W279&M&4Z<>OQJe>gFdG=&KuTf02}7{pM@t zpUQ`kH~>F>^q-U?^v<=6wpF4=9 z$$Z1FiJYGN+Na0T4|@d7iMWe>fhZ|Jh;;XD-JHD&+ZnpGKaxDFX|cdjDNW1c;?M$u zz(qS%GfVieQNm&!GK@jQ`;KIjezPgR!Q$??EHyUes4o4%-NgnhPPdtc(mqe47b(3r zg`R~O&FH!4v&@ng&;!ty^4$Zsrlk?KMXYlhJ{Nj$xDL~LCABqhyL~3ph?Ndt{&7HM_zHt4rV>&pbg&t61o`vo!HK%Qq3&U zB-~x$U{h<7dsLk#5VsNM?FQg^1k!H6Ry_%YebNy&Qc+wsH!IxlTMe497S$u|=O*4dwcC84oIo zzh7LZ@5{KBCg`pkhYcLpmBc+|qwhVPi1Vq{o9P&lf)}3f=`GTL+L8f1hR}t>y1lf- zvROoM9NFzKVbM2<`zOyT&tPLs>EsFfFih_cCa_MSkS*2D9pTgl17@cGk)iC|qGjeQ zw)IC9-ANm~Nm;|G9~yFy;$$EU`joCQXL%1cow4|{Bqc?SIo?)j8d49Py7Dr`PYB(0 z^C?n0BgQM2qO=dZxo0pp5WygjnVZ9!sc!=r+eB0C&ujQA9u{~s4Qsx`f!zRiV~0)I zk(*KT=W;fsFJtYpe$?Hv=*bEk)pX&7HczN){jn9TArf;`{rf9jd^_dM^J)^E%)3~X z$BVKDBy%UXeFLxmWUvWy3bgWJNeg0$OOZ<+%L9=Rifpim*K)IC#68Ft*V>H8l6g+_ znlNw5dUlSpgk>+81P5ahOa#!aZj%zT>u87`+r*57$UbRmMkHDGw~w!~XneNJ~@8Eo&{=R!uOYj1OCc)WBEubZn}x6wfF1n{Hb z>tQ01EvuDGo-eFwncyuHtvjRkLhVn`m?N{Hq2t@H#gt+wrDMK!7h_;Cb}O=AY*_td z8H%TpFx9B;l?F=#DW?!mCNbm37&Ns2s|8y|*L+b0@-IEq=gDlWN>+$|sfP~$=V`08 z#cR$(BRm*dvmU%O*Rn7H!u%g(qeex>Dn+yhuc%p8+ErsVCl|>^TzKIw*rn>DpiS4J zY1KMN8)}o)md<>Ip9WnF@s%W98VT7}EKei6Z92yXYeza`3M;?Kw?;4|cyDn0DmT#F z_b3NoG0#a=Nhzy{`UA=Cg6mK2Eig~v#XdX~z#@Q3sMl&yG)1DVJ%nwAGFiJmbw=<} zo2VMlHMsk+-b*ILHkUQ!er9{WZXqf&Txwt7#j~+#@^HRe@j1r1wP-wF^M;l=P(`J;Emw}dN%x%M?s zfVVeS-lt^9k^E#uWeh1IZKQJPqjw9G9@*u=qzq~|kv9K^{-zDRwx^FTky2&peGaNb zY)=05g^+eV6qBM)e~;tvu~N*7lW%LJ0#18deG5wr3^Fygx5>fyrXdUCIoXD;R$ALG zjlr?M%-(QX`2Es9{Z{jX_ThJnbvTCsB>`$jPc{M*lvbW4jUkJ8}5i1Y@>|Cj@E z^Ukl$MY%=g@#~#eJB>9Zjhy!;ch1%i`G8*i?1W@`*T!lpRB_S0JUMlBqPWw%KGnu| zEjh>pW7N+*k|sa*$_h<8DU%5M&Df5mBKQ6E9f6R~uIHUs)o(q3bu|^!1037;?kWf% z^wp_3iC-rgb>Ss8FlZG=#6Fa0qY2Q%#ZH$~ANIz$S{A3b3aB#8X8Fle>{l0tMD~-f z&HHG=@R;kaN_&vdS_>Dai&;f3x>^_VB9J5T3w*PfvX=iax|ayxz4hj@n%YV;qCM-0 z89KQ2!yoP}LTE?>nLQN!z=B`KlYey2G1lv{ayo~Zb9Z?Tj{;c za;WXYro+@$8FqT_LbJQ`_4k*8%%+Cb7oIgGy0@dnQxyhx<22uh;q~_GbpxfXz*n<1 zwBI|f{mv*`$}G_3;b)#Td(kTplb5+Rv;1SIm61s32+CmFq8EcImP^~e^3bfTq*aJW z8{*Tey=Bn4$H5>N`l8rUK|3*%mtD2haiwUX$nhv)ghua*oR*i;aW`dssR`k&|7kHg z;Nc1xgRQ%??&zUg*X6D|Ue@8&{`jKmPpTio-(NN@O+bw^Z_fwVnc$GSAPN9%nbOda zZ=K9_H&tA>F|@v!cWK(mSFF()Wm1m}Yo=x`Rv7sMr z=;LB0Eh7`@%gvu{%S!D_uDl!rIR0&l3Dgb>xiQcTx&E|cS1t;mz)=~;LBI`MWKl+D zT3tiu8d>;zj(JPi(#@i(YyN;I|H&VLr7b9;)u#+CC6*xBsY@PyvbhrQvT0YKw0<4J zRDZa-5?KKxSXzuyn&CA*lgcH^9~8GZIo&#W_uBv|Oz^G^jo^bM9?sf6yyASJjHmX{ z8?9OYc7mYNSLar#ddLI8g!RYi+y3q?+~OsNmd`mvzL`H9r~vSx+8&00#k^{X%PJtD zX{ts|b8)jd-UI^7hkgZYE zhdBw$aZavD@UtsEtr#XrF=d@C!oWQ9)t0+|U@Y(wC?()>?#{eM z#n0#Jq+=3}cD($4j;l46;yQ8|c3KvEE@PNy3J949nhn^G8cm?{DJvZQ0@68%n+`uXEc9a(9&GC{5TGtYt6t2WbnD$D8o?ql{wpBv-l)L~i& z>+z=&;aD`};?cgE=S5^viF&^33(n$@g2PLtZjC!fhZg%TgB-Tsp{W}lqz*gSCE|WH z??Nyz4CUe|#S=oLu+iY0)X&kLY(T782n>OoF|2Q~m`cyZN@F=arKnu*0Rb`A+zei&wf=eA>;K>~N za0Of#Yxik(*T9OIe$w)!_vtJt7nRE_S&W;^OG3z;nuKi6L`~9>U1BVhp)MyhZBi#* zI%+V6m7HrQKdWz?1GD2XY+Q!G_75n${OQ#vYCUplK|S>SlVSDy_dee)Y%fh=DXI0| z{^w3mAr#9pOT_^y@vDeD6TkynpkN=v-^dJ$RgC~V__Y(-U3bKpsz5CIF#W+K_ zJuG75UF5)fF^|CPtQfzhGU23xbz^+PaFm3f&uhoGom4F)?<%Z5d35(4Y!jeGPNE;( zM+K|GrteR?qDEtZDv01-eNF;YiO8N3PvlAH7iJImj0jKOkY_ z*quZfA{HlX7H6;Yc|fUyZ@7Qniirg!VoTYRhuyaloM3^W)lTl|&Q$pr#4GS2mb|sa z`?R9@>Os@htYdkl>n1FLm{uyXCVU&0tK4<^i+$FoN6Jx39TH z{Ozu{V?S(uk=`EMA4th(`G-8l!>2Il#J5*~ib4m46dcqX6VubU4_q)eDW8+8H@Ko? zznl1EG0ouB( zr&DBvA_2#zYapZ0*-2x&RHc==dO~ms=u2CKsda!QHFs_R5o;@R@|8JbP^z#w*PbCg@nYvp4}jKA*lXEA$~&!c|m8=6QDO@VaGa!pW%>(q>h+gaH<)iXG_w9eiJ5gy&i zht>5vN`l9b(0z2>8(FvRDlyN}_gYziwcaz6=-`?G17kDckd{1j4|A^hqV2~*D&HoT z%Us6(?&%%0rcAFilU~SBm8@m+(RVH>KRd9*it*iwIx(Y89g}I-m)qtpF3%SZi+4;k zQwB1TDBDDa+r-w=5fz<5DWY;Q@AYG7pNA9V!P^O7Mcp~4FS0g+2u%x)#rbx4f-FPn zq0c5iknjL?Xg$(4G>Jl;ywUGEpHNNZ$o6&#HGV_jaIkaHV;i%haTYFHjRCcHA!b0` zZ)=5(^-MAZ}~ajYIwTyF5mN`>$HJyyGXAm~?8)9&OIQ zd41YBkQpE@VXIwxJN_VCjJI*R$8);j`S1w^g@(MKqvdeO^kQG5tSf4wdDwrrC1>)G zA@p`EhX*gccT(7SP7kuBr_NGD*DD~12oa&H7z}1y)+NcTWi4dRx*DhmSn{rUC-Bp> z_0xr*W~=IcE!Tjs?~S{)C{UMslc7oW+(7A9c_L}%z6)Q7l>S~R4P;+PUu@S01;(TZ zyGc95e>{SOj;rMhqu02T9G%LcGIpsQq*Mk=8&O9Sh~eT`g`%>4O`@!PAO4)%ULia> z`&cXm!p#+ejfyVEswcf10=p5z7(*r_-82%GxXQsh~ z?*J|Vj$6dXDQ0g$_l?Y5oDjKWckPWSE+A%~ed`x+_~=_MdEMsMM4`11LCsyBN=YC{ zQahj-o0&?COR(?#3!3frz^|gT zw$aK07OL0$F}xI#{|et69o1#VI_;#1LbE6GK6*k(=%iLp$Og~cS%?h<$WO%GfbVk!KUDVP?r{Td`SkvfCA0+EpLJ0;4{AV8kPUySQdx2pmwva#T8*ss&( zbM9+&K1GiL&zAIEQekNXTJMRydD}RQJ7W4$A-#>aY$#kc0nd}PaDN0lc4X+L>#$HG zmak1oWhkWajZ5MH#>DwRuqZ`C?ioRo>kU7wKD)QkM>{?VZaKXHzW(a-p*u-#^Q@Z+ zG&1#6!anPfI;vEi!Mn#8v$_t|+AxM%JoQEyC^2)Sme#%lo%0Pd8?I4Y`xDe~C8H=l z!CrhEqtKe9ClN8TWKyE0%n{}Se>bWv6Zl^B8qp}@V!o{ql8Gj_jEH?BG|g| z$8nL}0YbOSb%aADy%g}(F}|3dOFfKV6a9^I-yfak=$@FU@vNVg*C*FzGM?40vx|w3 z4^T^9uuH$EF510nPIVUeLyZ2I2n!{nG7+!k9#w$*SwC0@mI4ISKuP!7`ET+&BvvRY z&Bt`txC`OsNna)7xdC8?=RbcPjf*S_k(9dM2Ra&me7> zkQ@ZslKYAJpY1ERWs=w5M}nEd*Aa5u0 zj0ii;Sdq4n6XMe}>ep6R`~*w7%4)--h1Hm(kybx{TGhfA1TuhL|IXq|RP=hcoikb7 zmiJ<5Thj=<{rM((dj2eEc5d!r-7v7YLSi^=cAPVBH%S5ZbX=jhG++No+)HMd&=Y*# zLdk(E$|MK z6w_UeJ!4a!T-R%@^_XoJS-8+y`i1AAD7(wS%PH8e1#w`X?a;6o_8GPB16*+WLNa&= z*yOD@_k-w3%B2s9d`?;w4*ql#Q zi|oy{EN=g_M4p-{_NsX;OmP?ZZL}wi7lY3d>b^=qpsRc#oE5Em>eG?t7&$O&ceCI2 zI|}kdVx-7A1UVu_qfChn7%Lf#kw3dTLHqJxY&FSY6@1igP1gq|@52E2Zd%=9XCj*k zN+hPZG*Rq@GWq+adsq*9pq`GWDls`G{>!jEkDd+|=iPKAPuQ~5_2UH&?*R*Z@xG*<}V4AlM3wzX7FLmSpP$pS=;YtPq*^xvW zD;|XyPJ-7rK7TJv>I4SG@td+yeJ*Pmv|>=7Q=*GfOSE0lcaQ+e$iU1(x7OLwo!Yv{{;1uJ!eq686D8G!-f=ZHUf z_;GbtT|H|fo<7BMzE1GraYS~j|FN~T%V@{a0dt|lc_i8u;;ciN-2aYPsb{he3n=si z4&tTq4owlSBfaX<4DY?QWF}i(R8aa@mcg9LfD36Yf2cL=qL$>wN3W%o;&>>h&{sR5 zzF-Do;CSm$bsT_m1Kcbq@b7OHwA%CU0k=A@aUMwjW1}rB7)!&{Ej2?YuW7gu z`)%}Pp-T9U^9oLwm#A7D8EXOCwb_I`x}m7(wmRFvko%X|uy$(80(pAfiOK4-LgW07 zxG2bF!w-jUJ~no#ILrDbS}Re!-3IJk<;Xz-3d{%^Mm)R#Md8L;GS(@}w!>nZmexrd z;3pr_DE`^u5ByX^pGu1TDa$9-kM#K=^T|69+&E7o$%|T5>VSzidpqzw`$DLU-#Zd^ zlu&=M&>z=KI)fAvxv%@MJ&by4s$QjaCzZyhifP+RZ@I-wOU$NdU49~~BnfU>+M?Ut znJ@IHlcY8hq_* z5?BfBz^)h9f7_?6adyu7;Zuv-uY(Eo5ZZhPDivKZdJKE&m_b*nR#lvtL`PUWOXU+MM1A~OL#(P(H$WiN z9y|gEy7jHL4z|cw3I@RxdYp)C8v3slXa%BqkT<#eMabb(KUsM2Iu7~@33d)kC@%)~3&fzX?u|#Q zp-Mz$WU>STU%Vwr=YNwGo+3^kxtHteF-ZFs|7|)Ebl+oR-E{)nMT$)d1G$*RGQ^3^ z0Po%)+X5ajyptBGl*QmYiGA`ESwt_=|D%k+FNwEPsjpQS`1fmGtG-WQeKt8lC}{*s zlBwTNHJRX%#pzg0dezk~*2W6!4qaIGj;V&_W9TLq`S<2ET?hcB0jl4Q{Xr+{3+N*3 z$hHpg?ipdtohwNbjpvUkOsVp(#cA`AG@vC-PO8ZXF(QJ=AsP7L%1ov>?%Pfx1b*q5 zDmvLKuL$TVbPA^U35r}?Qk}%`cf=T3*!7-{8++s4Imu?PIEEsI^xt$ZaAc?WF$G+i zf_p{!+kf5*pn7z__7sy>Hs$`_{XMU$q-~f1zJvbLR%r`2bDm+@w35?UYi-=&!&%_n z$~%+({bD4M2oPqr>$fZ|SrD&n+6i%#lDz3KS8dZS?@F7Dms`7SOCZIm+DaRPUx<(> z3O0+Ik$7B5@v<6<;6dB?-D1SNYEVbDmt)+t;dk3_&)+>f@SLznkE!yWo<=c>Wv``0 zzk;Wev(&KL$IkB_yQ;fhR{~KVkSN9ssdy|l$|wcM;daE1@1_;uw*s!K@tro`S4h+> zkmSO6ic&#Aley=A<05>__%l$QBB8*JWwH>K9-b~Dl1NhrjNeDr-*1~~Hy!yTufFY3 zsDTUIaG>3KQR}Y;G09T({}ltXxLps|L5Hfp82^hy#ScAT2UPj%4hgYbp7`M4=K&#Q zV{ir7`Z=-roEX@+;~6=H69ep#-om1C_5f`#Is`VNQ?&i3(c@)0-3N8N(x~#IdexA* zror`t z*#u1>QMy*$^JZ4BkmWAMRw?)MVo^py0G`1l8wSC=eUs~BsvJ&JowLVUu8Wi*ilT_w z1&wItDhY`Ibqis>(64MFl_LkMG4WxR3y!=$6<$2WbmbvC{qW5=&sUYW+DzGBd#I(_)QyWrfIvj2L$4>}vP-Q8rtvr#O!Y=Q7TL>=IJ1ZMm7C61g<4ZgiaEXF z9*OPlMm)H)_J>m}tm-ugqk1Re-~6h;!+bl6nFWz|K;z+1G9ll!=` zY^}FPLkiCv4)P)j|FPYLO~!(o&*;%o`hD#P`WOp!=5XSuhhjg8lFb}6NaGa!TzkK{ zU*zpZEJzTbF6B`2y75L|(kXka#$r0ex+A@}16*@-!89SLn!0H8h9;gkVYJ9U>xsi2^%OI1!>q$>b^|;%+4fLBg+k zm8bFi>3YfQwZE`;GFztYS3ZPR?&)mpliU;4ZDVX0)pt(4pOoxA8 zJAbdhD6VmP-~!QPIciXLz`BOZuVi1Ib2d}yrb`?p`l_Q0Lueem^GdMV;6ACeqJ>*} z|GjP3~(rK6*ul1n_JyYlm{e8K4oj`^L^PqIbm}GDv5k zKG}AHiTo!EUT&Qq0WKU+wM?a&OFR@7x3@h~{+zZ6xa`k2>AOmtrBc2l>;jbu?y4W} zzQ5pFyabCZIY_nl>}ch-dwlhM{!yuW_kapX4JyTfYA8kW*=mup*NNyS z7&61<_L{a4!NLT5pCg1nf&83I)o^KqpOYBlv^h!XB;bA$5$qi*_4kAI^)uwQ?lK$+ zBqcM1>77obizTy-?p3I5LJ%|lsjKBVy#1*&x3#aInuX;x9(_Fxg#-q+o!H7LYqKEn zj_3g;8?oQiJzSW4N}^U35n<`N<$+DI_vWxZdWMp*F7rttA2-5%tfCFaRGIE_V z|2?nB%KSYk9uC^gokm}W?o|pMG~t8g9@^PWUZ;Zx+tcr_zC*tV;cTTKAk z60)+gVjrDHYxXm;uJfLJ2!&5c7(xOa<#DZdC))Iu9_n<1F5+_i^|!f#B5&9d%V1i? zBcA4KX%$@yg2=GoGY{SIpE+9y;M3Gm(uXsdfahgrM)P|**g^sw5`=dX`J15^4Zj>+ zJ<2vuR`6IA_3`=4*j2h?GjBKU2E~q!c5EceDi8Fw&T&YESvi`0BO!2Sk26vD$j<)E z$uJBhO0$_PM6U4)W#2c_-$f>aQiw!!jMloL^8@hdoFxXP%8E+AUat>58ia^WrrZlW zS_ud9e?-B-?yvj&Z*iqvc{^00`D@)xW83yV%LC*H_h&G#9o&S(%gMl43oP{98P0Np zRG(PYB#z2$Nc*Fq_;CO&`~l%k%;Q-DtY0msnx3QCXsrh(*GA;h!i6c=0ZF8Dv?5qn zE+SJSkzh&%=Xu$>s$2t}w6$4E_-+vKMR63QU&E&x@_vX_1*bq^7#kIkQdZ(>VDMB2_h{V zA!Sm?ytS8*T1A(}KU9V%wa&rW`G!JFC4+h$y2lpmgnw<^fa4%Gu0z@6&ug(Kwnw)B za4#9S5Rz=+I$}K%e6*xWy@9k_s7_~oQ>U*cx-WnPgY?5kKPMP@%K;&nAS1XbP*(vJ z$!TV49a`Z;3TIh|dLw+Eg7RunK{$j6iFj`zX+741^?OFQXa*={(=YO#V$QG|5}!EV zBeeY0B|#UZJGe;{5`__iaK1Kf7-~cpdxpNmpx1}@n&#M_VQG-RoQO z#1Hy&JKa~tRIz*F$x%>$?%Dz+ECxn|2Eh7U&5|iNGc4*mHf@zDiK9HzS^&a$lbJXD z;8NZenMJg(VAFkFzdEIJnNXkK9AMS;5{YgRu-7GF%y?vkHRTS+O_R%O?r7Ad3NKp; zOV6LA98&X4J}BEfqZ6D!T;W1}R~LIGK0=Qk^7d(3qb;;T2O^}j;DQb$HOH&x#nMbA~^ zRNJnKCw~?N*_Krun_;#K8g0tG7N~vRQzeMk*kUq|>gXeR5C6QLE`vQ#WseC|dqVHM zU^^M4E^*sFpgjAEWi!B2O&O&tj{Oj`K2;|wJq^J&Q&3fY}E}i34(#J-JgeD zD!EI>(5@kOu*_`ao4FB3&R|_|Fq}Iiw#fjNB1BP#70HRf4>6hF`Blw@Nx8Fx4!EYE zEc8{la1q^tgnjO3Q3V8h2gZ)Ne$$rHYXOc{p3pCPDJ74@r8?>-iZOfu(I{_F#Z=RT zzvrKc()k^P)^7mD54T+8OImwpIZ3vR2@?LjSu|21S-a_PD`YTvp74m;14uJf??7XSAd@0F6+t~-+TIBK~ z&R^7fo+wzU2pUl{v5onHIFic11Adj_$Z-}5_gKM_s64qDfC*zde89ay{68xZHaU(e zcBE(XZU^r&dVtd@^Xs>?l%krm@{b|>xeY}Q`RiD?w_-#Ilja4hUpE9%fLVHuzz|GEgU+w>y-kCx_%HmunACjoa z5W;)SOrx2w9U=1I&i+Ll4}s+=a^ha4JzJwn%d3+19F9x@W?ZO-;b zA0`NSizBQ+lZ4W4dHv#m#N?U`wxZ312Dg59DqgQUaDKJuVb5>^C}(BuDz~cI(PlW- zlbbEurKHkpH`|pr)frAulPr^#7Xc;^EXA7L;TI72P{a|n@hNsc-S{^=cx(;|r5Ftb zLBM5z-_NeIAjvD_gXQXk*jWgDXzeU~c6@4BltEIFEh#2E*4D`a&tfY0HRwhF_O79} z4fXbjl$_z5oZ68|CL+dy#{gm`F+`hEQ^!K$hg8qeK1+PExd57l@Q0fQpg#L4+4_l|2)Zu z!!N>BC9VC*ye}4@vr~__mafTstG8Rtdl9*Kx@;;qUJIH;(G#3QWER;zk1xGdj=)BG zGXy|W~7{VT=kwQtz=g->$jQu z%J|RfjppC^->%Mku5rzftN$>fs!?@GkOB|ZN+IonGl1Ogj zQj3guBqpcCuc$hal84AWRT6F`59J%HIczD_>|mWj!aZ!Y`hU?P^lcs|fYzcVgc6s! zw2B?g^rRdZ`9T>s!!^34mh6+N=dz|XJmvef2P?~r?B)aA{D$*#eN#|>X%3)zMXnC| z-F>l$b_;enJpq9XJz>72uJZYw|o)LeuFB}yvBFV9=wY;UPmiUxObED5pAHI+BR z{#xd^k>Z@@UXBSsd=kcVxY!?Q&Gi? zc1J$$xq*6NILM5n20HBhr9|t=opABuBe5_NP2h-I;^SjmL{0}TZa6KG`bKCuQ8-$s z01r-llTJ^VzgP%!uAy?sTnl^Q>NKP#_k@Bxj}GsPrQ`O(qn#qD2Hfat^uNb0t&-T! zXyUm3IDG^%k4-5;Ad>NgUTZ6+WPnN(e!6Sl&23Y?e$2jUTv;Dc7-@w0fH;E8;sEDi z@P>Pc`eyK^Ma7qiCpnK~nGZz7Di*TNaA3W%=t@MVj8!0~g6+x|!d5!oTWO8dRf)w= zE{Xv;Ztg(xW|AmHMaxog9;gcf%uj| zOF3t*yx!+TIq7Okq1>!q&&zni<3}UI=43*d&oZ)z_RfYKYteV=-% zEm$o;5KbyW;I)#X)%*xj(E(F)3uh|yn+%1@F(JUbrl5m=%ZV6Hgo>49&^WOo<6JKZ6%=lRDaH{VA~CE2Sjw6TAy?`yPN_uk-cmx4TC| z*Ucf1B#1&UcM`X2H)-pWs8B!QWXd;G-ha(lk zNmJ~q{u3eswtM+(wzo6v7z;N?Awqp`8AUBZcva+kgNI1S(KoO@9y-$PEkDbvnh4e( z_xXTBc-idJ9tNQ0k=hX$;G`MsfMEV?${e8@EL6XHoQd zXU>)t1mT^>#Rq<6zi=XxhNbaaH5w+nk=3}FW9(k5qB ztvtU?Q3o-c2w^kTzBzTjEnyNoEWA3M?kkfnwinZE3bcbLi}w5U+S7l?NdV!^EOHQ$ zu+gt-sfD^Gs_AS85Cvpa7KVWF{qX&WWrW{NaIvJH;Q50p#ns%@FI)PfAuF^kkbL5W zP@F<~ZJ~Mo5sc+1qv0h94XHG~V;uu~;W+cJm%FXR=Et`OWmvKI) z9}yXuItNQNBskp)d*EYulK!3F?GYtCq9v&!YA(e5o?2>YwsFzuex?SQD4^5&#k;_B zITkDidi>2EQn`s5oO@R-zGwy3dvzUM;?9p9op%%|=u-#f;anOEN=zu35Mn?47{VAh zd3t<9!!1V~LJ=h?$v*%c2THvdFo6|v&#W?1e?6L(4ve3KwE%;5WKt1x_;kStmP=H_e&t!VKsQIk>AjrO~xu` zS*L<60G+Mpm9hL|$Kx^PN2V63xZ}n1YgBojTISr*Z@5T%tq;rTTra7A4xeUJtu`() zu@RfF-M8OxL$vT#=6fH=C!~b>-8o%zvW88{W{C+x@tXysKW5c8du*CN5`L|sGNeX@ zeTE>g9lVde?Vm#!Wx8m%p@7OdU@6xq+YL4hZ zu?gGGN((L>f_+Q3SuBxAcSW0OwCr>VO+n{3078|RVPXEq%tFnOSH1X?R{#ja>3_Yi z>0|Wo+rLbyseijoLsJX?z6C{%XYhx;`K>h_5&j)Nl&6?OylL=%T<`z>2&$CtU#khV z%Jd)H1l9EVUlRnJ=KnaR|NB_}?_b_aZDRXB94atyPm4E|2ES+U`)LA%v~S^0I?C@~ zZRO(rQ-J$_9j>}MW2CEt>iLo}j{Ls`&v_kuRQ?4qQ2(`xtK%Bmn1uhc@c;GEFVp|~ zr2hY`SVa(K^2N}@`+|RPO@a=3_X4px6_Lof{aYxU-Ss~^>^WS1h4aAs5^4winbMsV z*0bcFC<(A$zp@+u^^R8encVYgDWG<#(Hk?uH0YE!U+TGrcRwW89-U!#*o zVmZ$BUCYIb&a3sKZig>*?UIZx?VF*XmR|ln{GJwVB>NRVJbvzXd-=5%WKUGPUsUCU z1;{L*h}a86%t0i>$I2oUwpsh`E@=x-#+h8#jv`(_l_12{cfa{70lc-+_U$X{$TKu+ zsqPQ<1mpAWMeiJ`iuOlTT|#5PU?M@XGUv*>_x{parB1@8Pk!NM%f%Q_X&m30HGUsi z;L!Tze(wFc51mp|;0L3?$+yX9e0*ln z2F&2qKcZ|4XN|CQn(IBdrA^9m@ZiEaq~KMgLvYM_; zoQ9Y_Xich4GkEtc_(DV3TKyx^4RG-Zf`f&N5RbNbVWIQK?hNsjz(c7c0WJ{Hq1LZFTTG28=E1d@4&Wyp!RGGOdD7SOYkpuo z$o?G^T74L+j=lc23qA}76G+}g6a(FI=EvIvTD}NYiRj819J{Uh{kq9JKYAyP@`4g+ zl`=Wg;%E_q+gGOzUks%)sLFDOO8xoQD4g$&p`c2f{(Ntm+Q3k5`9`q+z=kk`Gq%DBF|RtkGZZ zJe>9*+n|sBco|bG=0z=9f(k29xOBl+CQHFA-wXVIq{W38#$rEhpuR4*&JdZx=0}JJ zdPZ*)o^)!TEChY*S7;PC{THiC7oVMR=p97LTRF!2PFYtlp5V3GrpaJty=rG?C+FR6 zrq64Hb8Iql^1J=QQv2h@y{-bNRoB1sKjo!78XXWKuMP82xiG~=F#WrdxJ(lzV^%dZ3uUi+=f^0WkOTwCl zk>b965HEuyn;CtHj5WAN)i-h1LUbMt3&S%FmSD<T=9g zUYwsVyFr%p2Vyj~H3Y+Oxg1Yd#W*16C+|n2|0qY#k`6tqR#w|POt8Vr6B9f9sXVW! zk83GR6Hk>;)O_uZ8+}9Uh9MaQGyb4=I7U||+B;DZvczl>NzH4qPG>|rUOq!d+$`OO% zq`7WSU>$){j*>w6()lW5pwL>ZYi1bF6Du9vS%j1jJM^m8pF{tPV_s9(?tDOu4Q^GZ z&#e=TAG6;yL^2KO0jSr|*77!RnkP#IXHI&E#*`FFn+)^t%?gi27J9bL58(uM$&<3O0n&T?jtq~!321vZl=nvL_ zycUoZIe+Y(PJX{s-CBKx+=8u;B5XXxCjYa19~qG)kI@W^%eC1|ki&|b!*CK?F@jo+ z+1%aLfy2=}3JMC7`@_vxrjVAZ?kbb%bdgHsHj*ifCkZum%kZs%`ybr#2~g3V@2d|! zOQ?x^IUq)gdO3_mitWnp!AP!noJJ}X7)fx~X`Zc^CS_ik9fXrs631s?o(S+nh1kgWMMvrpewi z?D||C4@H2#v`)HB@0(Ml%39{MdTh1;)3tDGnd;19vdigyHV^B|1cTv8=98w{bFmwKsNB95q0wTLq~%HSF@?()?!wP5rkS#stkHSFW%uy3z9STG?&QM72b7-o4NK+U zFxNnE>^8J0Fl@E#c#E3%?5=ZR`{ZRu-U4aGxF1dNE+7n&aE&}%c{X^33-uSn92zv+ z!^sONXB-a4gM))a8JnA%?XJN7e6{d|J^`A~ zOJ9lf9RTZdwQJWdx42rAieH(74#d=uoqVc4)cnTw;nY8M%&XEOq zv+rwH3`E=uhGhnaJC zDa_`omD98XF;r>|wq%GB35`$$bKBkbD*Y4zh9SN-2XS zoUG6sf9jW_UIhl23NMDjDQEXho2?$^n^g6}oz3ypdsA>;x@-#%*G+>^K|5?cqz@IQ zTeF8rzHe~L+NOGO?3XCWx*9#|+fH#@%?XT2bprS+KY!_=ey&8~_P)ggu3D{y03-D1 zUr%qe3x~qG^}C&}agK*N9IV4;gH}~sR;M3gILD!pfnzGFBnJA4yLN?o+T?((%R3k& z0P2LfvyvuQ6&t)89X}$&QG-&?ERf36LrSbB04yb7s0Z&=b}0Jws{42M^yi5p&*~a( za(}f*CCMB(5$LexuYB@h9zVPH_-Y$ITt}CaG;;Y!g7NiUZNPe}`c|~VIJ;VvZn<&*`EOUS2a;wf@TM?Sdz~57yU_4(pOaWbjAHf^l zBk!{lgK|8ItA-~1P#ClJ#opR((uj~E7W?(w*fU&EygE*jtz^ZlZkz94gVC+t&cN<+|8+Z7WnUTPpG?iLTr8I#cXw-3Xxk z`4lQ{S>eTh4a782H2G1`!7UqY{Ywt$Vv`skY)kL2^aJ)i(^Xy9DhAE03cpvzdRoIe zI4oQCnAY0M>N;(?X0=7J75BZb<;C@{QR7ftE_T370e}P$cYFJnDXdlmh*Oi3RjoGP z@9Xd8vvPBDv$7}wVQBN7zE6U-b@^*yRk!94_f+Y=c==uD6m3))U^QQ(BaSs_fIx2% zj}lg)mqzoC=Ii8jmq*-tS}y>TpYYk`3^#-#fvtvI8O1^>Nl^e~kF4aTuFxQ*VyA4t za9`kaJL*2&f{gIu%s%>krEbYPEw`&F0L}rWxk@ySR7^f0BX1-OMnpzV@DUfQR2od? z$y6GSxS#itA`bD+*#FBi@S>r))tu>zC;(eNV=qmWyjITf<$!f7cD%%AlErU2X({pT zs_T}&>mf;rUTW#;x9BI=b2p~_&+a>FYcEHl4yWlw>DEH$BivfLTo|W>T$A3nl}f2^ zcGPzMXx>8894Rxxwy~S5x7h&@Q$$2WMn=XwgZo^Ce#!N(AXKXTx`OS&cm@C#G;8wM z?N1uq^S|(f{o@htu5%8A+Hcm3T5g^0Z3}^o%qlp>X6tf0)OMy5OHWlGSq+e+J8QTQ zwuLwAV+%A})T7mJ?MWau&FWNs2vw+tCU=V}c#A!PAU?MuQjhCG);wugc9v%*`R^58 z%|E;*OupVFqBQ%*Z5ZC;X!6CdTgHB%a(uj+(Q?{~p5`{6md>$UX>oFLN@OrfhiX9j>rZqch^GB`(@&HAVS1t{VCOKcN{1hg!w`8)f`5rdQ&VIHLfBlw z|IX$p=kkIZ(w|9T7o#a8*E5!2UgeB6l>i0au9I09)9(-C>C72gT`Km8Jxn14H0br$xr+Bhv z=d1lu9d%8&D}|Y$z`#JsI-Fljfmil_V%a#yQqWJfI1W+T@zmfNCb8B=zPrt4H=oi;dl|i3-JtwNa0;NZ6+k1 z%-{YHwYF{(-D9EZci*@$#COCaMZjs6n(3{s!nfH&Qcl|JQ;ADhGAm~@s3lIfPCbWY z$Ge*}6pKQDiKP*5eQCIqvYw*8u^#{G)vBzEsEYe2scqWT=<`cm!GwLu3N}2*cXl^| z2-CYI^EZday66=@?tW(a1(Qy8v%OzBswqR$?;fHzr6!ycm|j_sf>QEbTwKh`%DN5~ zmy$Z!)qyH8{>PUaEm)#?-O2R4`1d2+2@koVM2>%WjnX& z8hy#0%dOtmeR(EsX^}p-f_m8$mQ7t5Qj{N}mzR;_gDkAxRe?^e}HE~t-(p8leRn-fUj43!HJBq}HP|Vq7uH1z>VJwBElyQ^9HD>DB zZWY`Vw|tVYhF`+Fie`cqBj?imUJ;S#l2l(@i+oZf#+I)If5o5WcnTejKlaa$s1ph} zu^t#5Mht-s>YZ|@9MDPSKGJED<57RxpUgjLhNNhgIy7sPeQT4G;+nE09y{L}$jr=a zeK;SWsAw{}+MfcvY7^aG)5U5W?6@y?G5>N~wtNTn^;+MUkR4}(7fZ#yVoH8bD*eQ? z7)9HLj&5nW%aO?RD2$NJtzXJ?c_VExKg=#hG^`Z?V|5)_f=n#9cA83_2iuRZ!g#Zk zX>rfIN=!#bx3{-f@>r&E>Fnn0>}+hDZ}=f6o!>tvE331+TQl6qpv_zHTo_L6jxQnM7%njn=n;)$t(8HVlX9EF4B}Gyj9;1{M5MocIL&Kn?tXP9xf+B!AS;Va2)qI9F1xf8$fVQ`>Y*l6u}% zun!Tb5=l}dU?XI9yfRMHF9~gOxjw|8)9I|xA0UxP*feQLOiDV$*hrwvR4mlh(E(Zy zEH0{xL;xmx-q_()-S%IOb=PEBRRZ)Wt;>YuGeH4o0e21E7vl!)&Ie41QpYjX6ZYdb zNs=wlZUvYuRJy|FRPKQwSY#%x^Tx3~78#jqsnm?Q5Q;=)1Uh=Z(zABmU%qt-=OwDu z{WhIbu1cjdEC@Qk-EpJwERkgOxIzXxsH!*3f7t1UD7oz8$E=jNA5-GI`Y>nLuia;L zvy*~J2?EfBQH4PSxelO~LB-OwB3N}o;^DBFP`g*+Xm0-RYS^b$`c&VSZy)9;Me2EV z(iV9dZJX#-tB&x*#m2_Q#jzTXXN8*fa5!J?x|}q#u(LN*zwq+%0x`PXT>`Ds8bb$@ zIcm$w%6#@;)S>>R0(NEB3Fqf?-Zex|JbX&+ZJ3=sN+B#ds#|ra>?|n8A7MxeYk1HP zxI$qhlYDM;T9SaL&^2u_K*tj_I^|**L3}VYT_mONaCUn95Nrg*nNbBZa4HQ-Bw^oU z3yX>-aJxA#kcqq4H(9h&sns~XjIGJeVzi+2PfmnNsIP;OU|Sg+0o-ZW=-(}RfMg-j znllSnnjd|&EL?d-_kjwplnIv04)9P9DvR((m@bzr10L0-JAv!RS6uXqxwc+uhuKB< zcmqoL{hDWF?g^~bRF^O=zrrH z0K5ouLxXrSI}qEz0H-F{&a#%YW7-AT8&_@=QAt&y_7mb6QX)i1(danpcP-FQC{DZ2GyOunj3Rm) z=$EQtiD6iu!JZ5TDP-_7@WH#qnX`5YUk|&Y##%azH>A!KtJPAovE8=8;wACmd1x=H zYinx*>JPwA6B85nkP|Hp4GF`YUU)2KGk{t_CY8jd(|Pq9>8XcbfdC2xpCG6!A|>T% zN=eJ9X4hi7GXOatAOH}{4si_6>A&aQ(i(*6b!X=FD9mAgGG^A7h{|iZ7;S~&C+~{f=^0XRKVvmsrC>4fI)dSt zl6WuSbXxuXIgEr<73^@7a&g5q@{C%5%$s@n++)-LOX+Ek4tB9(#8Pr9HcdyO41o`0 zGFI-YstG&7s(&7!8J^Dv?we8m4^G(yg`zGAy_1uZO~8QRP$}zHd#}GU;R0>g(6HY^ zne+dNh9!qwjj6i3=7zio7FEk;9W}m!vL!ZHey*|;E~~hK+=;X#;fvljYSwEKqxXs< z0oUj5##+}A6plm-i+N*iXbK5<6&_v^sssqHzdTGIDJY1kbdAmfZ$UqOHWDho<`lRh zO}hGw$Yxhdm!xVi)FAy9hX63?9`=0^#9~0}su*ewRcYx}_LT77Pr1=pMqec9Z!`7u z^rT64Vsg5h8TKBRvo7St+}vDoFKpYgIx7=;*7%&in&f-;9HO} z=~2L?uA2!Jr_->1H7Fcz`f?}nQ{F1cDyV2*ZrG~drh#qUJlDQyoS4C%VxjW_q z`=Mn}km05trJ*J$$ROfGGIKza|94k2UJycIiXHZn`;(Pm_Lax>z4^%=5R>`URahfb zO8r>Nd`%^JG3-Qbm4}~PBIa6IblP-&Yt;A zF0UU**kBOo5L4(rD13XEjcYZ6)>V*m4=N#vnj)y94*LW}m$~taF9w>h2y+ zX>NgI;wm~e6kW-hs30;yxngrT7wPBZnJuD63nZ-Qr8XA z>^`tSQfbYJwcEGQPbN-s(%RvXaS>19bh^Jj0#4zOL4Q_uc2`%IL_Gc0L$=iSY`|f? z=?y0Y{6k3*5fM%bGBRU8R{+h|lv|(n123T1g#nJBL|-uWZwu=*IY3KL9iX1;_W+7E zx@Paa#Qs8xLP%X0xTdA!BhVaH9Z4iZs{pTm<2i2??)aTs^Wbz4aZ9O1uF9K&>~!X< z5K;4@){L*_OMOfaqOQesXK3|Kv3G+uAR@9%ry=wPr zQT2NY#IejUZs)!uFEkp>MYGJ~i=(+p!%i?_ti9U@N+a*WMg1J&zp?7%o|s!-|#^^XUA%hCEwxs_0c zuE-ogGPk%JMYcCf`k_z4@>lYhEvLse)hiFT7gDL*&Gtw0Igv)z*4C(0s*}D-Y+aq5 zpU}`)5}U2Ls{t@2BO{YSXnt}qd5x3mcCA8Cp-g$wa&KW~M%h6Nc&;EuK%VJzyUmsw zqQSDVvN1GT?pwH@(%}B)-zD=^#A7OQnckk^%wS^(W-F{*7o9};28$ND-SCvqaqHr> z4pKAZijtjD>&OO(WT!BEVQJMcd^C-||MZ($XWhw^awj67kJ}yH8^|woX^XXI`X-Ex zb2*3J>VYic8*0^xX+U&yjFYYw{`p>&0>_~57_<8xz6O?iSM7n7Fd-p@nvT59A&+4- ztjV5Im#ceTvKQ0d<~nlOF-nZZ>3lPqLdn3;@V7dZ2y0Yi3&G*22`aXBzM4|X%*aqL z1*o8NRqb+Ra2|lhZHPEH?#GXB7HvlIr%Zyn&U*>N0E3qcz^}brfQe3`)o%AgzycfH zUGBv~zC&qX|MhXc4^OCEok&3rdx*lY_92_(Gws9#I`XPO^~+5wej1N{abpCG;U~{{ zEzxJQo|Usy^6b_kBiF|3MUlr3OM(EP&3<7OtD?%{O>?wACY5Mqd837-kZ6*8wi5l! z)p$%@I6BKGNZ{nwYs!sc*-NQXLYP4r1!11aKUjn{lbUUd#hztd>u9)xWs_fX-(BnY&S{thCRb zfoYX$aK};P0h-VbY|(YgrEKzs;LIn2jfR-n6`Z}oElcqUM8QV46UH0D{b}ghS=R#2Eg zj+bJwtJNu$gc5<7S08DY(C$XWO1!Xz{p)jQp6d4unWD|px1Lh!jEj2+xh+&um8hDa zPOIk_<~C@#K8mSzm;?iK3*y*@gGO5-v@I^|N(pm0Uts%W+VkKcokQ@GZerT7nWH^v zYKl-8E6ni6r|`7aSY!$meaoAq7A?E&((^ln;L35Ek_nH9jBB`vBy;s=%!q`92J5Z< z3(~P7fDt~NE&pvD?UmR7i1;zQwA7MxrM98rR`CGpd-)%4jMu-+(2};;wP}ukL|~;n z*#?sL4TwG?j(N10n$B)hLSE(xo$Lk|q`9!GX3fTIY&f}OfLiW<_Ujn(%w?g_=#F4i zhPWLCc@EuAWq`bAOXTE>@?#AkRD70;>4{URj}CPkaEVzgVu*@cZxWxOuSX3J+oaAL z5?|?C23*9d^N@YV6v4%pcY_=tDqM?fmFxKS%?r4DpH{t-l#sZ>9_;I@2ZnFH+%%_C zPDDyt%QaX{Cnq2vko!phaDoAF3$pFQF^6jKp+3g~>YYHTbEyZ#4Vt1cAKm;`7fSY; zgD~~%DVwnkJ6%<~czB42Tyz1K4Kc8r+l>p*wX-sgSIiApP7u#ujk|rsLo-tKnDA0+ z;-D(44_8TRxN}8W8nAnP#K%$^&^c5V)rXjb#k0H}22A!G?$#m$TT|$JT7{TG4b+VX z-{1%rN^ItJAPbnf1H|>JG(7d2{jSDnY7bKn&Ib#CCuorP3CpJ z`d~0N=LRRoZ5MKd@=?fyHa4ft)0s~$iYUwy`{2XXdx`0{(VxekIJdmy-f7mIa$>?P zd>lLuL!8)<@Cc=B6jM8ot1!VZ>_cR0?y!uYI<$<*Bc8?;E7pE4^W!8f)hdligl5zU z3E+?+IMGo<2cXnH*0#9Vy1|cRj8eJm*UStH&{X?K8=x+9&~rkLX^$K(cV!4LfhN#c zx{9Tm5+EifrsSHzcdM#I7k_xW(QH;J!}uBMOWT-mUx=cV=I$JBBZCB%kQ6n(PXPCA zcut6^_OBA3C@oPCqwd#2G&+@p*6%=wsdz+g`mCGqH8K!AQMAk)d0uYn5ls#NUhV~9 z386CG9_*9Gj=~;{U|7=r<|7TT+|CKz&c@lw$8I4*GjrLq#TPTQdKdORD}N zO=<1nHk z#v&)iiv_yh9OCYfifsoJyK92;k2;>ad!b`>5`6EJRKdp$F!+6HPOYMxJDK^skW}{A zK1@jL-3=_njmOo`K!S*XT|rdqdE9krI$zeID*Pkgz;?qy-%zfHJD+LI*g@(Ky2;^)Y-y^#fm$=JaUHGh?$LcL}e)_VaC^awrddMSpMpw>IyK;n$vmf6Im_ zdFnAR6**6zZ*Zgth_}e0-bt$LcB%XI;%I&x>%mI&uq}w1HX|f(zFN=ycF4XPN}Cg! znYx@|ykRuSo4_1;U7SWrB2%1y>o{{5mOQZMyT@qqc_?9564f3j3y5nHV9qCAy9-y6 zjOTeBzi{C(ThuGqBTsqO{|Knd{Ijuj!d>4z+w%dN%#-dBywRFi?alkBi_Iwo zT+R?PEU4d=UKS$jV-3LHN7<7u%o@im(F*p_&(o^PEJ#VTb9v06yh2l})~{B7Mu+W? zE*174Yp)3IEblBw8u%$n-KQ@r+mxvloSCTi1;^xk^S2;z0+D zjtf(%^*q1{0>ULHE6Z6AkC;ET4^ZU*+)f1oWh5lqqDzHkWv9_fnsa5^{I<4LJ86Zn zA-{8Jwt<`(?XL%N$S*v>>;RMxdHaOp2InbxD(0SCD+ZKAaAs2L{Eg2z^tDMHVvNVq zUI8l!1jAtu5=*_Ue3@R%!;M_ArkXY&AU3;e7F|3|TrN&-!v+AdLp3;bYaMjo6)`tt zgU}p`$|dgbFvT@!Q$oST#`9>rFQ3ox3TWG@3Kqj{2mwU&LAHM=m+$RSK_r+Y%$ih1 z%aAeW>!cpj1T;&n0#fz8SYy(9sj7Fc^3kAq2PLEl>3Un237%il3!i{5ZCPe`3S&OW zHCvWCfS`W9Q$5z`+1X!kn8|E$hodTX2uRhzS~*>VG+=CqAK2gf9rzxxareEo7qJdg z>doT!?ay-bFD-Ce@+_6O6>Y6yPq6izot^asbd&o3W9ut`vf84557H?pNJ|JvgLFwr zcXvsLhye(a5~75FfOJcjA|b6H(w!2b(%oHeasThlyqWjDxnppV56;N1ZQd}Rx(|`wr0*8oWOx|6$FyxTpo}?iuUT8Nne}6Mri+0 zoNX$k=GMQsq>Sv$CjP`-EUdvDphUOGR-hV37+Z?EY+w9#4LfX~mI4hq7<=}I~d zJZE$+>QHv#aImvWKWKWiVQ6p9JZi(8p#E>D-1fbC_lfk=|E{7o2&%V2T3A?E zqC1jyi)M2lxIGTt+6!HoqA=Fi`LQ=LVO6Bq^e!W>#2!QCpj$8L?~Z1FWl7H}B_$7? zUM4>N5*q2I&!6NvM^=+sOs?k^f7J}U$h=R#xvICG5e-@;lnrYCJD64H{U!DDJ~j&t z+2L@-6Rm~vV*jM%gWv!clQs4qOW$hTNLI?`26IEDQSRJlK`JVVt1FAizYRra1vYXv zvtkF+O0r)4sgaXk+pU@u{>!ww=~M8wkr=^q{dn;}Y51)SD{6Ft5=z#?Gy6u)dA^@- zyPcMstH->G9b=KH>8sajIgY!#JNWGXiVY)(2nq)Zj>F}K((59WMr#tL+B zFGKL77Cgi zR+hp?=@JE9+(zzmFl%Sn6`shuJdB0ejz{+S-ZjKR^6or2mE%80?aebX60H5)|I^}AL4 zl5p$$P`Pkx@Po_Do5bB#VymkKJ$ZzMJrCA?5#!jvuOA(EqC;Ilz7_d+ee^Jzt>-6j?a+D6wRJ_J-d`hIJ8F0y0zpbIo6jR9;z2rdT z66WwC&4KJWBdSOvSC5i!tI@4que4TrtmbBo!9f}N(p>ANY?{as;al13vt|d$=9w5p zOp~%qfj{_0CoNwFFU{^K%{lkXG~@rcQ7Di%At}#Fta-c9Qe4UIf-gU|C)T%M^09ps z$j=>&Wu{q+DJ%8uhWduTCdZm5uU?{X#bKR6xRI{U1(FUBmHPerH>AaI&^62{@bU5C zG}|v+c?d~XvDR1q*sI|k8Vw%cE6yD2P5MrVfAxkMu~sRu=^7>utl>i zeljt$2HszEEPm(KWbiXVo#trPLRB@UR4?Ms{4UGn(SYjdv+siRA*GIOV#AMYv??Db zefzDXl1*eI?YN`-K|@W~^L_8$jJ1x5)aGL@ydBQRGt%9bgouWLTwPNB=Vi3RBmC4* zrOwyO=oOdczsX$#Xx~KQ@YV$H>4xkvj>Oj7!IiIzTej~kWQgsq4mXbcHKWIs=l%24 zd5hH2!MQ>Mmum~Am4%l5*sSQT{5B0#Y?yAPiiriqS!Y#|`dU((mk*9hf4P`C7e;ZSA}14rnhl+Y zy?$LIrQ%-tqB~Wid8NLLn%OD}oAb;m;vZ$yjpeehg~&oVR;Sh}Y&m}ITocMj!a49< zZBZcZQd1)?CP4QIcwG?S+uPe?QcpW0DGtyab3{c&C9yj4ZVV1aM`YyWM*Ujt`qFYn zA~Xzk{fdOw16d zzLztX=jnsCMS6OA_(wcn9@5F!kmTvT`A0yM#dFlR9nWje8C-Hc;FNp~iY;<$qga@? z{I&>LLEKrb@wU8Zc1GnyR^*GmB-He{&>G$VEiBkPWetKWIjVZR!j+{&P8XqPRM#m; zqIfsOar0cR4NpHU5O91v5s%wQ)Zx*Up=Bdr`@R+2FUGl$iy)EKg0;)q!H$Js ziygzifwY2gB;A&9mo*-RIJ6<|DEkgu5p$#&uZ#Go$6iu_#RDkZI&bo|$k7oT<$}I1 z3CFU0nQyer6ysQ9UdUJ~88VXWAIR1BT1|Q66P+5|Ii1FII33YqCedP((LwS*Xla!v zMh+$F-cWkyZ?^ZauRyFei~l-;*Hq`;)pdEgRN})QrT#=ya{!Rn27z9)asj2t~9E(y?QeW+EVq^!X z$JnOGKYDum^Ze}W70e1e4z+i1VCf;@Vq+^RF6QIr9&hry1bWouYk~8%rpC0+-FdD( z+Et{Xwzl>Fadvj*C{g!iyda6HS7ZLor*pO@a`IuIJbR=24m)Yz&xn;6+8%!*ai0|% zL~O7@PW;VR4AjMz0jDRsL{tq|e+*X*9pz@-T1TZ`N01v@8C`heqnTN_dP^XlYB1?UB0ZLPtkMh#yd0A8A39l zOWsYNMirDP zb2{bjG6qMghSCwg&ozrYyXWz4?&kf}FHFl^pq4a&mC*G;sE_(gKhFv`gn4Eea6v$ zKz#c;J44^Tm15zAgW){`W@mk3JZ;XUOeRR77c6JviLJ#o^@Nq?6AHHl8-ng}v@^*+n9VepPQxGEh9s~kkZxI>M*;U(=JHx$25df&q!Dd*m*7n)X8oSH-Cf5NvrPX$=mzR|ARCa1bNh_%tFEUPy z%lw#K!dxA7%hOo;p}iyEowH~-e}8m z^PMb;9CZFM5?d`>q3;>~M*{yD?sE3aIQ%sR>wauh(*mZ|1`S;)ZAOJ@LNN!CIMp2w zFE8^Z-}@{qir=q$04{)t29>z?*FlCPaI?VdP)id#){e);$0xxFzIE%CccUfwN2td) zY=Wf!0vc<~rQRGa&_?<8^C!k(P_u=Ozq9|nD^}HWCr-)fZYC6D5J`TGk6YW>siz1< z_t-{Kiylr1M6j+_4T)f@cT#&(n;OU#Zh1h#Uoy zM-`NWiczEyOig0Tmq{IYem$+1i(awD3ib=1_!=CtQemd#Xy=DHuNg}(2UpJi~c!4UWPy(*;?6S-1zg`tNQ+tTLCo-K>^ zJ=3T9Gp+crk6P2(`Rqbp?;%U&r*H_(@D86Vd|^<|UJ+%9t(TtPQ8Fc4QV={hA^g;{ zr1X9?jB25IAozA^+z#q{vrhu)!$Tvn8)>Jb1-c|iJJ!+cn+u6}x9XJs`=1nKvady8 zph=l1|3kaZg|o#fMT%3zY%BJ3g>qq+9U7`OadYWioNgdiFXM^OipR^+_1ljeG`7z) zWr=YR|46UnAh(}(n~ul(ESrORGMR`J;jc|H=k6bOI=AiR$5yonXLO{& zNRUqO8Q#K|n(cBjc*KYx!A-j_y^D?Oi4& zkUcTc&?=lKtG<3c0()EJ>AxRik^Lhh`ylX$-R6>z@cY{w>^xBc{s6g%YkpeV?XXt* zkOq(K=8lfHd#Vh_A0!wt zMwAyLY@B(kj(V8axo!{T;hn!y^=cv8D@r8NfBDq;UDaz=^WXgP`^{X-s+2lHE;>(b zNNoCDY=3PoMYBDhw~4M*=&@zL40$1;8c2(^d3zpLjx<`SzgPmlcV;N152njfsC!VO&UcYYne;Uru^NNt{^9HXoS6SiGu7#k8>Z~{X}vw4qYD^S9E zYK#Vzot~$C{;$OwM+06ijw#|kB0N0h?v34`2?PWN)|fno?H?8vMtP@#OIkqz zt1$i9^XGSLlKL_gzL~yYt6UDf_Wgq_NeRSQs`UO*HRIp)A*Kl%Qa?z}?OzMc&h$VML$P z$Wf>`n2GE?EB@$nwER#Z9tZiAgN8r2efY9m&W5C?$QV6F?Z&x54bD zc{h8_W07={Pd%T$rWk3;auj{Mfrb`DPH;AIc0Ojgn@7%$BN=BB&8Tkt)WOT?sTZ53 z5y7e=#!bW;Ev2zUHoK#~Rv(e{B~q0m9DC3An*AP4)i9n9zNzIw+e05Ds+w_hFzRz+ zA;aC9Z=Xp2-DNmb1&t?Z%;)!GJ`oP13WLvY#zJC2W;mc?KCOka6|G!t+7b=Y1h=2xLZnADtIyN@knx2k3gjkTrdPgN3a49B8 zd;PW;C~j!}A=haN({Bu(DJUq=M#2X@&W^U1hw@%*{+=EjEC&xEH#Zj^zdGRU?M*-} zqGMp7Kw$gjR~po^+qWgowgMv}BHq2bYCWx}r~n1etl{PSzklx&5|;k{)zr|~f|y3r z#Yxx9j07K_D@4M;WFp3qWsOTpOg!K1lc0}gW?@+dLJ3mcVsC1Ud4O8pQnwq*}LvyT@f58q9dA8ZL7!DJR~J-d~$% zzJh9gU7__Q!u59OQvOWF0)_e$KN8*kPZj_@Zs(PdbPj?fP}av=kyTQ74dws&Rq{`f zX;Fo$tw2{-Nr3m5u}}*P$e>S>NZJ@LNtp1 zyt{ZzOfzC(qx6HJNSu}P(MfmGf8Cq|0|OANynI$tdF*|q98FJ6_4A@4aA*JU-NMUV z_P-*PyR!KuT?i7{HoNTs6lH&JZ*8*LWgR5}Mwu?g^clQ+_s(1Vvd*VF^xZp7R@T9x zAyj{e*`i8%d)I3)S5#FsLJ!1@-(`bU8-b{3-R=7?!$I+e3%|rFk_tC;V|MmVw8GDK z)Lqs*&}*Pbh!!Cy>ble)fR1b1lf)0_8yG_97#I{}WPqURfG5>Fn}@^B@8Wn-;__?= zJg2iW?^lvrV0=_*@zz@R?9;=R`i2ISjIUpX`1trFBrdNGP4~5N z0Nc2@xS049L9cCWY^LiyzYrb37~;a`+A;%m?FZw;RaFaHB&t)}q=Coo5Cjrem(~hkc7h{AL>+R%gE1{F401gceTl;7=2t z)wW2TB@O1zyJfg8L!1gpilmLIq>YS>$u6WXu3m@#{#nkUOlce)9pO=n3{Out90VHr z`ud(PUdP7PysYepNKNBp9x>iRwuQsO?f}K-q-8z>)^_$^E7Rkjhcix<(R#+^lG63c z&z;6~GpK19va)oio0^{`xJ1L(gd}8!6)I{Vw0XHf7ce3wCMGQ{4bsGD{s2Gb+4=c= zQ!2>gFHZYo;^O$h=IHO&P*qhW2;l|$36hH7izws_!Yw}s>;$T3Rb^$41~c?Q-^n4r zb0_)RC_s>p@AshEPNZSpCGSn1a|RIo{7c ziA$BdA!xtBfX}h`hKMvQxNL7s*Fh33_V;wW+>S`*S-Xj6n|aS)w#L?jakB2}Yf{Lw zBx&jHt=sdboXcWe)-EUUb?w#p2S@rf;T(Bi(WF#pjHFLLt-X~yr&=W^my#OeSqdr% zX1E|Gvdllik}te`R>s-t&m0G=h)Jfb!K z1TTGQtJB6_t$Zc0Fi|g8#yiaRTcx79dgQxzkE03#0s_SD--p8~x+hT#bcgV_Z-pTP z7%0YlbaFB=KAtap1eI!LT^k2uS2HP)FPq<%_e+VTm2d&A_71(8hx;_CNkUHP>Fiiw z@5@W`ecBhB&(WwqFd-UbYwC3?R`z?xiME!;=PRYm7YZ%C;m0TSKBsz(?hYW5LjD>B z1qJ!Dx*C>~coKMn^R~G6c&;iXLC8?HeB{q}`S*Uo=?cf>18M30Dj9kCnVRQzkhca2 z1nvw|2=tCA8XG5nxA5@r*n1(}Z;C?j+aUPE&rt?2?BGglZ7meWb{>(B(5ry>2- zu+`;U{62);<+N#HbKDu8 zbYH3I20{7ybpA_oToW%_oysk&Yj~4#_n5IrM?rUh|Lq)b zEYh2NW7I=l`YP$-9}`+i-{yWv&G!i_1Rfj}ctUp*xAJ0DV!t%VonO;R!!ENlR|&== ze=m7W@37#yk-9+F6BH6MHiV3~wb_9M0kyi_J`zng*1XZX<~vOTE1Sec6D9)5Q>mdX z?G}q9_8zIEO!6w7XYcJ~XASR7){wf8?d?A}d2L}JoQ<0F89&a6m95u#$^+ayE3x43 zx#U$p235W=aC7(f^}!KQaQO~hn^as}e975BMI~H=d2OPSEwXKQd;2X!oY(p(B4F3T z%|Js(F9DDXfzKOn83YAMg`4{?yaoUUSb2G!LS+w;%XXe=^l1*l2Bw3KfGdY2K#wz! zvCZi^L0DJ+{{0j8IRRPC`d^m?cXLY%DTfiC^90{3$tYk=u==*Pp6Kh3!P?|9s=(@z zcs8eysbQd}cQ9t|cON<%;jPHY$pKg*k~vx^w7{0`-p#A8pZf6w4FP0v9~czuys{?K zks6lfAvQP``m0^FMI&B4C+B!t?TDBAO4$9usz-QLs;sW46Ly%CSeJ#^%O2aox2?Xi zA}JKkmL7efO4x4a_Zseux%T~Z5~(U29QqK4Q{do2=7N(TNtia>_2C^yY`Pw6wno9Q zKlg*<7-F2(QE945o)DE%&kx^)Zg)+)>9ysk#=ULaGsWgupffg*-8_77{7p?7A=?Uk zvh(eI1F7rX62aT!pPPRhX|aC%t!~5EFif_o8UB&nfnS4}*pOOUsoI@h`GKN4N{n2b z=ZiAhzAuSCXtdE$GGE(m+Dmx%tjrs9JnS&5fA~YfNPrlS-qi2U-n z>lRhE>tADQjI$EaUWmDF&NR_bKd&)CB!7PcV6~!N?l{7FyjTR9KXl;2_4cd5L>(DX zfi>WDxH11k=-MlPZ{=6tEn)|~Mfeoa6N9@<2K1NH3Pubg5&uG~Zu0U^pC35Ya#NpZ z3)PkndP^HzL)LEJq!5MYX&EjXBa(CvlNfgn@^@g(z|qgh&rec0Mu!DGtMrh}VrMTd zEdaz1gh5IQg(5vJF30kd7`(YX$#Io9V&UveO-`N|7blCc1$hWaXHM{fj(!7e`_Fe& z9y~s}S{d2vYmi1A9@gRWgSrIfIAAtkDqv{+ z`3V4l?w%gtD7h+$gUq$z!25rR`)S2LtnqME{~hc`j<=x9UE}AVd{c3S(ss^y-Ad3k z&4#D0x@=06%TMEO=Gmuv4PEazI`&t!vpPPsiv5#mb&$XN{29*Dxk*S_+|RHTz{^i<#Wd##XWVJzXh>yEHO6L>8SXmdziu*c-%np#U0L9?tyy&lS3{U2 z_*$4xSk=YZXlC%ylxdIZ-MvfkyyW8#7gl{dG=~&pWNfpJ#$l}Yo#!XQF~Z0eHAhFa z#Om!lDR-}@gijiVMxG@Jj%I%>et*(ulS*y(wK~mSsDilcRMEfOqe3Vsurfb2?kJ|- zmauEx@nWJ><#=I6@kz}TbXhj|p4To(Kng%yv`2=Puo(K)fTeVG6%m<_%gD&6B=Vp) z+{eMjb|~fs{Wf4BieEcoQ%d`xh^y<@0~9Wmp93@f_C9#BYOxWhEuQ`JyZmK?-hk-nck36VwF(n@-{#R@V+dPAC}%EgB{!RL>@* zwmiht)zzWM)y}bwL`5X_8v!m~-1hj$_DM^K>Rn`HAKd-9b!4ECW!l;`l8%lJ=Fr5= zkXLXB2nf7-rOFqQLOi|X`V#8w48UJdx)_x|AV@)#D|A=Ery`$V1HfBpKk|2NK5VrWny}9(9rP#n1mcj%)d5 z(MaPmd!+@@pTS-!64|c5R4iA%Y3V1k z21m1Fe0Dl8&LQ9+R#JV=7!=}^6XIlJM#mv9Nvg>F(ul|D4z}TQ8J@3UPbBX?loQX+ zPbtiiO4u#zIJtuuEE&rX$`03##IT?$-#y^UVewjb`gqq=pp@Ig$lKy*@FPG9Vi20vcLLb8Hx>SEtTfr6+~?e4Ia!QGRRkwL2y7?Y4- zaGD2kp(4E!5Tml8rsK4Zjghhl0TyKN&&?G=g%MABE8IQDgrw=VsQfR z+_@9Y3EUl=>|0b+_0E$5uOuxVKFl;y*Hi*sY*2~QyfM5tBgKv&BwNJI9tsl(@-nG(B&q2`2nh-M`JUSW51T_LLb!Q&EI+U8{Z&#_ zbQmclK{N_;ZOm z_9fTa%uKpeH3*hGH|1>)kGY)XU9X4!#1FFuJnop{8#f@ zED1SO8B!m~N{s7_NP*c8EaRz2+X2uoFVJ5Re*{kP#P?{t1S+;=lK~@oqlO4-rJH`)VHY?aXsB&#R zv`=#{u7X#XnDVl+nQeFXYME(iX_=UEGcx|b;Q_lcJ+5_9k8J{&l;p zYp>&YgR_+tWCrUic4osI+vMhx93zaBc|T`zkI#KlpCFGAm(V7AWauCs8bel_&^%!C zf=V+jQ|!5xQ@1TK38Jt&#Oku9DWc-C?2Hp=T5HFOJUQvhGIocv+oAEukWZ;Ys!l1b zOewsu{y=}dgixYM)A#Gos+i?|bEiEcX#=f_D#5xUnpI4fibN%@Ha^4Rl9ENp9YV!J z+IxFT&!f|{R^M{b)6+vcB@+_{0%T~OI=I7|+|!ehkB``qE84?tfkd*YZwY6hxYY|=x3nHSTP7V$*3k=+RYaSr1(A1pgO2QP=Va)^0_CS+R z5IEw&FocZBZveU=WKeqG#=fHRD|(;RuBNi~*a|W}R#%#E2T!KCp)b+;=I%=g7yhYx ztEpDXtyARP&qQe;HSwi|m@|91a`~t>==JNYrY>OMa5k?0Zm0vc2?iIy_N}XzL9MF; z#7V)WguWMP@d$5Cg?sJe<40`lA>X~T`4)@GYYmN&sJQw#iGusvT<)Yaz!NkL=}D|R zm39k6es)(ixcW{MJ*kmPPp`cDD9_kk(h?2n_s~&=EtRBd=~ z#W}^sko`{qK!OFdHyL#KtSEc`9EUOqx!yv!jlQn*3Uxo4#N|+W_-XkAwJWN+MosRH zRU*N;8>)IghbXPv@;NuY>HcBJKrI`h(^PsarjZ(d4Z)*iTsMW?v{Aont%FGNRt-=z z+*<#1jhO*9k^P~gZT~&n7uy3AUlMt(Gn+l}4;_@M{{i*XnMq*t692pnw z+EH14q2hPT&%PJOc1U|qPXqMB0F+?3(E-M_smV$=4xgZ4-q5n;=OYkk(EWFIo*_c+ zYh)|2e^*vcK(B$3XUrb@xM%@jVQ%w=R6Nc%=%Ep{| zSwFHh;ACqRGBjuZ{hqX&N;}@y&n*tp*4EbS##O~I-v!|AT(Um3Rq+lcDSjJ;pA_j)Ng@$KBXEWdW%Qx#HXvvYR)ew+3$=@9N-BuN2ESD;p~; z2ThMe@_LBtwi#si^;ut_$2oR4#SN2$UUC&9k-qM z2GYNk@b{?7!y3wC`jS1p#M(gD5x64MH~bE%PgwiO#%HxEJ<4NJ`& zUruowxqXOR2zz{SCscx7!ujShN3iBiO3GxA-PWe-^i`AJPxz24b_5pBN9S=4KnYVS zfXWD}iyS7zS&DqemZ=NaMN8~dQDcZvi z-@bjTuNMQQHz42|L}`!x2y$R!(Dzvtz%*ety<$mBC^Yapgl2gX*DlUap`~>kR#>n! zNKQEo4fm1Q4pTFkAK%6gLngN#{afGK)42{NRa2`UvRaq zqGt0hWrsDnT-Q4YFE^2BE;veC$@_oj6G%(N6%!>zz8RyKknp+lsYZel-u~1UbnxQQ z77Ec6Cd~9cn)@#+l9P==glb%hhvQWalfJl&W6F zU)=wEu%hHfj#!Kz0>t~FaJ-YVb5prLl%gSTEKSMvZr0h>BL=?Mbb|mR)eb={JCVJ- z?c)9l1?Bf7iyvsxOnn~_(GeBYm;x`JD}whqJG$W*8dU#k{$a(&H3XP+r#idTE9|~f zHf%~dwi4}Qx#Y;IERj2kuDdjdq;cV%SY1)N$iptBUF8?*Qptv?(K^0o`mVxXO6rmX z-yL^?6014)*C{f@(+B9@JUW0D zys%aNK9~kTF>olb&tcfaBU=IY)0=kVc+%=sLQhv$+j47XUb$ShTFXPs49KuX-a4G~pjbm`0Ouz_H?e)Y`rj}P zkKt=x`_h9s)0t3k4=uQ9S|=-TMVLS6FvQnCp0Y?H$ltbsat#Wiq@;g#_MOh(Bv@$e zVx>}MMPeRX83%zk6FD2;M=ZCdbW`|d!R?o?k2`qY^Hpn5`K0`6|ln^0o zz7ZV#uPvTW%$D_$v?&~J0Ve#~Jw~1^Kqr@(+;{HI%(R9a%a{L~T1i>#7P(;u)ulb} z_nUu_PcZuQpPH#Ey-<(7BrWJwpbugse#hCMYj@ONhdIRe77Vh82*y-Z;wfXt7bYjn zD^0#{!@{1syUS5Wi;H$WaA@op3+Y?TexEqu{w4pS3#{hmX6fI{3to2^8Ev3B{^aCD ztALM%rJ%h0hG8FAPhadHc!=%~!h?{A$im_xjkxy_oI4Omu>N@yK|@1>{fc~pmI%-= zfbv$tcvCPcz$pYE_Ev^IrbDNQ_a>7H79Kq0`?)PhDUTmtvCOyyM}DmLW7rTwY!7wv z4qMK3r`jX|p>0H;pIU5z^#yAy)Ctcha_&OgiIbIX@pz^Qku5fV?{kfSaBp+jD~t%D zrug#(l@@WzjHb7Rz@k?cm8`gDIQNU;P#z4|iDH>?B`2X7@X!Nff%WjS_aM%*Yam=Q z#6?e-rf3wr+na84dr|nh6#O1yj5?9k=m0%wml1O6C5-e^pSZzaSf4HbzE+7U@F>X@ zN7}_J1TPr!O@@*>3u4KRcdb>2Fe^v~ETv^4_%WQ8bL9K(CK>-YzV9bF)#aiNp zLqPCYt5R6W5W=$}0K;fw4^+{St6kw!J&1>ZPGJJ6B|wre>K2%I;rtE6e!6xa=ruSU zUripXsr4ocxl{ z=O)HTN2I_4Z$aPNmy=+R9Z!&swGf~#8M+Yt!~j+4MU^z^U6JbpYSL=f`)c*n+g z@{m8gooz0Ro)9bQ+sDQf9n#+3UVI@usZjG37xd+*K|a&-AC}wDS_sPD7r4w1Tf`sV z|7QE8&UJa`DppS|0z#1^G;@RO3APAa!)&brXsCf9UB-2CWBp@SFLRjq20abesYO6k z=Le(&Wh-C%r+W5)+&e1I*`E<`JQCfJqZLhljZShedi}E|(apz^5bsaA*N!J-dQ@eg z^;G1r_rUAuX&bZY6z~vZKBxAdn zxY4mUx!s0YhhI|^yIW8dj@EvZAzLX#mC+ zt|ZT6=;FvgRqx~4-`Xb2C43w%GsDe6c`ug+>!>`<~S$N$9d^CoP%hlwreZ1SALM+<>?ndqLC& zcs1hxj_)S1Qbn3a-E{tSkuJ+xq8LS2T7O)MW8GTQjGK)8_D!Kx@%@AI3x!>+fmd1$ z3tysd%}Y)*YSIKhUJvN3?2P0nEV&i8k%)s3V;BPrwfEjnzB?C;Pk0{#m5`V?NPGl< zd$9Wc!omVhp^|}t!MdZ(J@z;MCkv1Z_G+dE7IG!{c>MXZdko&IPPE7>xN;&YULGD% zow71AXpZR9fb+Tb&>m3iog5!`%w$(qx|x`yoUA887gGpWV=gXvaz4;!9&(ex>5!S32?vMnU36Pm`(U)g zmob2X=GZ%}L72t!_c+4l^lYBmukuVltHu`pD-N(;KGk~FI*14%8tescI6bDu|MC$4 zF^vcfmF^SXGLKmUD0_>T7(j^ZGA<<^#*mEtf+4ShvFD7!n;dLJ#^!B+4R-K%t*?ah z1N|J-BswI3s%x8=kEiH;y%k+oVIEw#bA{Y6UuB6>@#lnxhY1=pqS28YTqFoHm1%IP zTnZiT$Tnj8f(iu*`XuA9uInauV}jFG^o6V3nON;Y^YzUDC|YihA?s;jZB5J|4>=Z) zWPfcffz!+&|GVZnCL%c`*P0yBExJ4jb$CN%*IO~A|Gv;+l9 zM`s?GPj|B5brw-r*?&zoZQ^kK|$c5 zK>uH<;TMe5_)F60ke0tNhJ>G!lVJTh`~*r|H*kVssFTLs9l6ZnVio#m*Og%h(5RU? z6zHSdufGWmU72ZWDk@rSy1c*z_8Ics;?dMsO$a~#{_P90FY*LJ7ohnQ5f5IJ z5=D}Kb^}Wv`M5|X4zgCrVg#ynN(&CgIfjj#UkAlkEvZaDc=*Z9cY>|{lOcfbI43~) z{=cf?`6N`AL*vFSvW$iA8M)bt;M+EN(gQ7H>y4|g?Eg*`U{}4rf4lnK*UMLKV$xN)DK;Jq(nFA63Yh9hOfdK%upFipa z^W_NKD`S*?M$*jWswTspekMe9{rdIes!J;%3d(KixSVa>t zU|g~6$q2z^hera~TUmW^UDi6@#kr)%k-)*i(l{C;#tGKWRdI+i`(yqNFgqBs;Z(vq zkj$~Y0ZY+Xn%`R9Dx=$*B&OJ=97(GHzO4-m6YDmzgxV?3|n&#=Cb#MMbLt*MMQM z^L-80^w+OsmEIz5E5so!4*3{!IPaRmKTtzevedlls&Qej-u<<+bBWN3?M@s%!oa)S z|AA(6KbZ>bI%;aTaNa&Xlph&{IXTrXw&9G-wQ73@+u=@MhA#ntBjA+#<^+Kb<^K}{ z9tJ{bFUEErC9|UpBB=GfJ2UTU0TnSb%Cz`Uy!h=o{by)O*v{dnKxKn%A@6&c7xY(7 zX)*uH5?=-S7rlnIlV(6cJ+0JD@5Ki9NoqUn;mXWQkmTtrp(nx-)8dl^JQet=TcG+X zM?(q!OAc5(x?zW&g2vk;2(yE2@bNbh8JWBLM=O{J!xX@aGUPD#N>S5t9KiB$Jxr1iI@8zUcT^HD1_n5SUKX6Qp&{SBQu zhrI@`LwL{G+1Y_m>CCHi3A`t3tr2)jKw;khi7Z8!&~pFa;LGiQ ztx$a@s$IA)hrpn6-~4@*HGpr~=Cc9JR{>N9smBbh0>H8T0|Rte(#FQ8ewU}v#f^jX z+w%d{glz`h_QVKe??5{Mla+&mBT>cH%1=l}$*x9M?ClK?4aJyqvaww~Jz=cO zJifykMnO9fnqmlF;Pkn~a#;?h)#I-ISImOC`WfaEhH73=2qrK|!pVMrxWQ8&`XE_ zoh=0f&8$`RI-D`;4GeegJXl_h z1*tQVM#5~F5zqzAdV79BLBU@A*(ud~=*kC4!Iyn7QYOc8pmsyEm2rnT!jJ{LS7Mx; z(sWyE>wF0k;A2_Kxc4ffJFG!f1zl9abtwwK%$b!vB%W++7~_;iKw%ml{-{*|PA8xk z_!R;E&!m>J^ykkL=-Gt|=iua|udDmnfE^hJiweZ}G>DT!GNrhfoi(o0@^ijUq4#5b zSWLRQBoT5$@YRN#E{36EmBCxVvhD5c1SF+*zNrTJGY~5bpAwvWc^y?6*^ZnUKWG5n{dwx4D1z&yDy(I5@KnDs5&`04S!31 z#DyR*9}^1;3qlR~m(R#lcwg@*25+RtW<7U&1dp#8Njmk6e#osFO34+5VsVtIA3?2f zC*$8u@dZkHW@fCKGc-(0Kb<~lAfZ|Er7nAyC_v&tc!Og(58w%0_s4+00sTR83j|=G zOJJR|vURcqg%_30l=_6g4S;ETkwB8bj+S`75H3Rx`$t=Q7XS+&TnLOo9*~iSuhsIN z6d`aYX5wc;DUb@PbQ;^3s9e2L8hTSet?2UDmu4vZ$oos~CzH3hA54%n;T#(tj%~Hn zg-E@gUa7(7e^-!dV8HQrSTl{&|39G1Jp&EcIM9X-O{&PJKE^25^ka92e|`a)p9jI+ zY@ad~Pmg3Bn!m%v%=~BDW1l_KQ8G{fQV|+`0l8rOgKV_&;N{EOlhkDB>3RbeB!^i& z83K;v>Hex6WD!?J*p8W?&-Me=^U31k#j;+odk-G9mopCeU3hMnHHEfX^1SVsnxaDB zj7U^jIK@p=L1?i8yDraLQrO=`xCsY2XtWhM3SbZ)GlUCZ}699|2C-*PbBAT!04QhPm zvhxJGaPJf}IbjTT+d2rNT-6QE^EY%EypIUp`0 z+>kmO96T9Le*gbkycmIWhL0Bm2_VFtxtF*Z3cCRUfB*i`+do|cOeZ{ZY0nHRPoJPaoQokC?7)$P7LPnyP zC(kYWB*wYjsFUk*g>@SIKG5KBHC?mG@AC4r=@QjnDi9+&kxT5hdVE(;O}V@Yy9K48 zaUUM(zG<_?Q`d>FWF9KQ`&1pAlE%v+~?EJWRdb#zKL zr<&aQr4+-`_ymljJfO$B@iIJ7$FV2f2=?TJ!{tsF7u5O4$jEqTtpBa-_E-tBOPW)3 zdmPilYR`{w+^av2n*cnsaO52*XNrGf(^+k2VNRnlq?oDk6%YhY@C_=e@FeL@<-7SE z+0toUb~h;~l0JO+IlB$z>Wbq0v!(o4YJxEOM#O~kzTOV0$I#sy)DdOjMY>z0bL9t)K}2^LoeN=-$Pudv>E=3&@@DJX|X z`ypX?M1(AtDa7Z__3^N=rTA5WO7wJgDnXiCRaI7)2hK)y_>;Q2{B)(}PiFYSxX{k_ zJ-=&}{;7wD5CX+vj6b)OCN4HMKcS|yNZcy3?;`pdG{?aU<|_bO(A&L%my1n*<1HE9 zYXCEmk?JrGRN&G06Q~sObT&o53lA?*tvX7%vy`czc?!N%CZLF#*|cC#Q0J<}@e z8Yq5%_1O}4vp}Y|0=$L%8C{>Gjr+K9mP7kDyvp>DH9G%jS@r1zM-$O+QTGi?o-PJWxgU-gedw6lnnkWXMzp#+-zskaHA7ZEL@xQaX z;p<}i4U|j9$OjJ|j1?QU{CxuXnPtqgg&qhKP(sJwi747B;7e>Fob}K1O+CH6kMnP^ z{_i$?InxbWeHoRssc}tj-K#DYm~Hv<-L=4DZ^#M3!%9~E{E^HXLa~66O_1vWFaSxZ z%Bm_TCK+(9XQEz;`A})^G4P0PQr9Z6m%S_0g-rOXrq1O^qMi-A@0 zFn8u)Z;y|1pk&iOYUBP(xFeU483YpFKQ#2<`gcGs0Dhi6eF|sE`QeP;NKNpK=)Jkw zW+LjnmVOVT?PTh;$o98wmlF}i@NNB#L%#3lm35Qa%`?skZ6DdbbMmsn!f?NI9P+5 zO_v-0{tW_mg`ufv)?B(}UCF2neLHmGK z7!$T+7@nd80$@|}W(^+!C=VM!(!UMXTd1m15vWZ8x?j9-VHYE#=kV+MXo5pRLrqOh zDFStQffk{i_z1`@slxSWW_zdlK|<-ts`!$=tOqB!&?BoCGi+SAI!M)`c2;6TgFK=< zCc{X6)eMHfiJ~ITUAi>(K4Rz1#$3`D7+x*8r!0Qz<9i%cH+-_2H*eO~*6x$0r^&ux zjMRr}GeOf96E@ICzfVrez+@d}NHQ41L1&6GaLcKvlw^1xz{sZ(e;Wi~NO3M+yx125 zbGY+7F%WM|!l`{+gm??k4!rM^Skwb~7A6wF$pQPqfB7>e1~^;zF0p1r_o9oJWW3%F z1La$C!3U4J%*XqOP0F6{O2+1{8Yz=1WT%TwkZAriO>b?Yp`9f{jqhgQwmF zCO>FKsPQXNHcg&S1$7-{AkZ;!yzA=faFvVmAZLt^i_0!3NWOP3J<5ucISd(OY-s2y z>Q_*-ISamaj+ki(N89E{XZ)2^3QZ^`k*Ttr+&J5g2%8E1UsF?4pG%>-o{34Gcc47G z+Ue7)0Si+y0wcdRDVBV)ZIgKVxVSubsUPLjIMemY#^ki$Zo%sgtpZ08wJM=kLFUh$_tfF)JZp>Zb&)Gf`>%PA(9!y(qAN6>X zXp)?0G+NV%w&+{|7m3SwYZvFa?iYZU%Subn*$7eB_6Q}N%6-0L+qOnsN-rwhQiz0r zPohP0aB#pkh*)S=yHb?(1Dyd}kw}Wdr}p~5S5fE|II`8-JmS5RkqgRHK|z59pe39| zx%K(oiR_B=lON;Th6Rit177Zu$b>KQ>>Dkx&ucH$Iz<$}q#pUwlT9-lDblsM3u48T6w{L&u zGWZ2UKm5k9yQrur9wB`3SB6?+Y-v(2PaO)ErX;@i{@l~S9uzfeJI|(-k@)+UV~S9c zI)oc{?l@dH)N^BRN={EMAm+2I+Z3jyY*pzV>i-m;D@bizEML!%@@7w=ZuZyi{JJ{O z#)<#a>JeS4d-HFyW~#p`-4>4C3y6e+IXVXsba`UHRzH9-joWM$4FSsAITI7IK(sN4 zEl`YMBNnoV|K^6D`>8W$?x9FfQhJG&`lXd{znB5s!rs3(LLHKxhxtrtzZ0OAQlCXA zIo9ExGD4dwYP<6U{UarblC44X6RDs6Otwhz=)ol+R6i7q|0{27AnuNdj>fe+_oWwS zYR|FVyJjN&isW-6YADKVpRQ*Zc+!%|$9mQsnr*u>X{wdEP<24Go?M*vn_Rs{DZ_vV zzhu7Gv3va}S=DjL!@Ob+icFGs@%r>M)# zdTcw4J7~(2SO-)T^J4PviMQGi@?Kwa7k*W1JB6v^Blascd+e9JJX&1k+=l-yQ`NMg z^Ku?7w#OeIsSb%X=9OIhoE)Q=q7G(KK4nv%dA#^1a=c7n-44RK#Qouu&6h(a_Fbl4 zFM7@6?N?PwLn9AY(b%8uvy{9#aqd`J)4Yu}2jLiH{zH(VoJ>cjlT;oaI~L(xl$#56 zFCRaDdrM1hrfO*QJuuu39!vw0%!qZS-ZQa$`Yn_ni74QVU^WA%MFzfSCn_QW2oII< zKIg2$!e5&k)0rN8NHO)Hu@~|UCN?&6yFNMi zM8s804-I)jxCmVeHj}{4=bjm*EB7vi6iqvew=bV0ZX>$?LG$e}p10TJ>aS~DRdl>h z=n3mbf&&?ThMYffrFHEs-Hs#P~r-3}^2I=(IiE-7TtQ%SYT0PQknbHERilB4$hH zx?kPnROP*sUs&igV|k`R{!A~57$9Je5ph@q9sHx)tV;*tXO?}BCj)}ry?_52_MHG4 z!fuUgz-#bI2~uA9C_xR56tT@f6FM>Ba8E5ZC8gG`^8hTVFtCiKtua;e`(@_Nu5mkV zX71bQ zE#?^I*H@mFyij_^11xapQRMbp zoK`v(GZd5X;y!iyStaH@;y!8F+H4(#J?ocTxRsah*CFMt`8Ug(SX%koj_4+dBHevYeGrx@{+%bc&i|_{3tV z(8xk7BV)8xLrTtf5PmHxT{&89Fq2G68$@-c?#BufFsYpG7AU$fNx=`g)VsHDqqGIv zJpFJBK`Oemwd>r6pZVww{*McwfkxJ}ZfB70X|IV(Djg$ozgIq13du&xSRJ`p(1CE^ zb9O7=q17XycYm3`Gj3pO5dR3}KefCBb+myH~@d|Z^>CcBv{y#zIQYa=wpKa&|jewDUu--9e5m8P7_))F7M zj8+$I2$F&$WSyXiU{(pqtBH}31cq1Oj6ktOM8(H1{w%3aN=}vojt3!Oe*OgbDEO*z zXRzzEI5(Fd?qtA$@C$RMP4e@oODfTu#{YI+oLwnb7Nq9rLaa8thv&Ce~y)ZgYKLjzM98pdAyMwZHIP0Nrbs#P(ljVh(x8E!8v^ z7IDRs5tK&BGM+WQ-#)Cgu#`Odv&0o7?NxLqmG5);ozy&Jf;^`eL*tJAE1W(r4VcUo z?cJU|l}u)c%^%zA{_CW8?LrhY*K!{2TQzl9VPT*d-?3KxJyqmLue0V9c^^bPYo57e zDST#jC%YP5KawL?cRjvx;8*&O`~B=@j~3-G6}CkFPP0%?EnTSI!f~^U<$=g9~ILL^)Z{ND6u8-AaM0H3w zCrcY4_K&SEEG>=B$Q|!-e3qX+#QRc4TU#3t24*Rqj`(%^(Wl5xEoIwlqdvCkt48k6 zlkpdM1N*hvw=FGWsCqD(fOdTT8oXT?y}7vECw@gjGJZ(0XxdM)=n{Y@xKBLy7}eI) zY=_GPE+urCsi|K8G{MoQWpvI5kc+vwxrs@uZ5bjaMw^1>)nW*yu#-W{kMy>Lo&@~` zCg_8{b6OuGVj8=$7HwacKi#E}t3D>l^JLz{j+c@@4aOOys;2pevZ|`7iOIcC+TVZv zOajlw&=I&FCO1QA=z+DgwPj&8mrTRP(Mu`iBBnp5b-wu7t)YIIYvxl~+ItTqlgVF` z{%-iS#pnj7vic}S2an$4dT%!pDPM8@brL1zKXZfi+xNE)&fMS{B_ne8(v155zAhT_ z`he7dmUmrLHR?A}5g=)$7jGprC+i4yjoLSZGpEM27rRrYxJ}KK^4^mL+K41^sUnHt zw_el-a9`fOxpCjD|F>@(s^LTX4%`-74HC z>npFQsE5SP*Kxj?1>{@IWD@rGe&KCwX}J|HD*b%qE{VK^>}qFke*%sVE2X%2Q3uA` zf!F#CS-yE7wecRYy!7eQErG~iJauNh`$0|urp*)cXX>-*U*bwsZPNl+gSI>xnGxUTcu7mWC4bEC z^1v<>HNq+RdmbwYc#OT}SY{7t{=v<~C03nu8;scfqPF2El6+MZdAd-=aAI#94sj(1 zk3x#YXoRgpU29t(^R9nY$>kN3f88o*3ozH#d7XP}P49sl6@ggUrt^R!LTyKPo4<(? z^Rt$vWt&x&C_W}y7a@bg;?g=q6yp7)g*@|n{Lw!igZG`hIBwpv=8kn@HJvdHT-(km znFE1wCp%6eN@Z;-x(IbPeafgiQH)?`TmvP_-;O@4z!l^>DY={lYkVW zHHJn;FoZasx%Gy;>z@fj05*uyB#1`{V3UHZ130I*Hm+f+i{AkZrg%VP=&h(5x;OQc zv8k!D7_3#7V~eFg{PRm)hrD@CJ2^SIxd{`-CVa&$oP65|P(9?oHNiE;v8543%6JU4 ztMK3bGdIWi8A2>@{TYc$vngD@u_>r2$r`?Vsav4psqRPA5nEqZ)QU?=0z7N!;zYtp-m@Pwub|;do!tu5;;rNqEbjF81D;cacDV}lIB{iOpRQd5{UGIm z+1y9n=q_OUJlx!HA-e}qQg>V{$Yol2T{kv8c24+;3g#&{1 z_^tIQ)yZO;hsI-Og)^w)lRPiBb$MOi8n4Kd%J4<%{O-zm?2yh2h~zbJ=NP`&;{9l) zw<5>uGLFGLFLkquVV97J-+be_->QWS-~014#aZ+ymDuW)W@~2d;V(aHPt_NCey>(W zXf}o%@gX7q25s97r3mzA%G#hK0!9n8DDZe(8G{6nXntS=Aruod@qx7;-uehiZh%TK}s`VGvR1)4rzBHv0IP1>>^n^7#qpx7K2WuGNK< z#Nfgj`iUeCy;bvQ!#anjB`Zfh_uei%XO$@R)=sVU%gT15-fKFn`S(In_CP`6!za-a zw2lrdAxT9GJH@m7?~rr1@F6f8V|y_QF!=Gil6cCoUKV~+Oi8^=90_zp}4UN)Q? z-Q5N}NmqY4v3HI7bE4a`b)S-yHm5H&RS_$P>RCmEg!V`{e}aswwbwGL?UL(3${?xx z+SQ7?YxC7O>K~3uqXj4`Npeb2D`(-(o1nY=@0N%Vmv8>RPc#>6`LDIUo)EambF4Kp zY=1@B#M0&yO%>6~0c$}nulF{zEJX3#`BEMIl!8S0;+Hfx+Z@B<0|#zZS9?#!%$lA& z9+-M6^Q4qYp1J*=^M_Tro~H{+qwYgfP{OCE(FrdFE>TerfQhqb-XOcTPQK=s&QFoQ zcdZ43Zu}s%_}}mnh*p?nmyz*~jgH5tT`6 zON*|dp*Y|-aq&ODf0LLZ=&c8xe;D*hppI-^x*q$uM(P`l%xy}JAl=Lw8uM0JEp)$$ zNO|NtEyA7E(=5(iGiU-TqC%v+MG>?oBCi;cEIy z)I?2r-q_QT?EKO@R>OkKGBx}@atQv-2R7=^Brp7KeQQi+x$Ki?zuElNp`d?Fb^f=A zNr!wwb#b3jf zS6Mmuq>ZyP?1s8QmVsLw22}VeLDBL4tpEH%@^k7Rkz|2fbFx5XIkHab(IgbwZuj2r z)>56a5XV!ci5chhvFYi93=G|}<~^9rw5aZw<$F~0^BreUQkJNSXqLdXzbK#Ss)@+D zl5%HkYfninulkd`_s@5#??^j7AXqD#+hsefKC9nK1|Yz%D|~?W>fekUDri_YtfFp_ z)%bRXhB@br!L7W0s`D&$mrryxwF#Ye%Pa^f*17%d!}a{VH0ae1EuU-J8aRwj*fueo z$1$nJA$vgDx@~D0uo9Du{{1?Qb@eFK1$%|dp&QAmL3?Kb3=i+1fL~f)zXD2Yzk6B* za3IFh%RYF%%01Y#*0y7>g@r|R)(j?9_{*&ik}%JRxfH@kbJn;6koi1Ls>Fkqx8xKQ zn1vpb(`kl-Xps2k+MG^7jePG(bkd3;GvL~#p|F|^~g#0Me0Pe!dp_r^9gtySk#b`Wix96N6o z6irnZ+KTu5d^cn`7)DM|hGkYgj5HC|Os!j(y_K}MS)QcV%n)unz+Btc1*49!^}DfG zSLW>*BC~RGutXsEOV;g1OEDj{@D-f;7Qy=&a(PjCN3AcPK~bU}tF~Q{ffcHCk)xyV zVW0Jbc}?(;2#}f#348Ed(PVl>Mli;v4<7Z-bgpKgbqEl&sDo3&eUTe&82c?u86Lmt ztV|Qh6Z4*q;Jt9-EWp=vo+sT0KD>Dqh}AP6uDi1a>5le}XRspklqTiXdSu z;kcXkC}(n?`m-?G*?AvdhS};osb|gl;(Okhdfd<~I3r&A?!i8dQkvP|diDH+W?KmK zhG_b-f*$AJD_@wUE;Sdc*=b`y%Rf%u1jyjrrpyQVWG(}%+4+4R_NxEedHDIwve3xs z8Fgy=2dzER!gEI>n|yJov);eSN{V1Czwr2HE|cEq2d)!zU;o5?gp@zK%hau_B;$>` z@C(ysbrxX2HR3FQcJDn61BT}RyK13(&|qHE=7syRsanw?`)$q=A4giwsuJw=oA;ty z+{ch;Fh1NuNqIc;B~1}Jde*D=)`EK%x%(WtdmN*`FD+fen)g00clUfzMPO1~M;{|7 zivt$$PBEYu`$vR}@=%XmQth;)!!dM!(rD(I-lGYBYImD;>x6)K0J-vQHr-YRj-W60 z$?Xmr@{}^pbLCA5ZR|m@U3kKJra=rl_VKbS#8n8D&oe&Liyk^@2{=N!6UgoLf;Ue> zBmd%nuUyE=_ua#vIgGpI6i>4HTC}aoYu$=*%Tb>@OWjyCt)}wOLCCCamH7Oyun<+S zDv^8V%jw&}G|Z}PtAQvMTsndelsyya#k}8JZ@0u)Vzg2E)Pf0xxsl4&dnz9kn`4Se z{~jRq$C9O`|IA+8(DFM*%T5-fA!u`TV7E-A+D_h6_Aw5}n|`h*I9R2eD@eRVY6x8K z;80BcYBKeTtfAO1twU*K8a*eUZXrUY8jW{%^Hc}4C|vZ^1d3u=pdspu(cPXM#&7g} z_NjU2opE)2JUba>B4j2YAt{+K#Lsn)tcuYVJX-7iGe9JLuPGVzO8cAjr*VN(X+3?I zii(PK_J4#F@46)wRZ=poBe!mVk^3qH<@p$CX(oyBLC~;HrSiDLyyeD{Nlp0O+oC9u zZ#=JKJJG_(XuEyli(aN7Y6n&i)}SbnB<2n-m6gLP&qgZN2Mkt{6fSaK4BlMRV1Ccr z&bv#d(%8*iCQ+Y)C@m#FGvT$dz~^;b?^(bp!*+kE{r8ydj9&dRD%`4XZnCP zsDg9sowd!@jI22fV_H1v)Xyp`m$Y%804%So{5~qZ_*m<8-Ho5_>gUBYY6JFvVj;@I3h>%(M({%M^He9SUJ!MnD* zupM@}B`JNz?E}**+PkWI4w}sEycO(KY@2aERFLVx=K1KkK>ni?cNbtJEkVM{^Z2-1dD*zRK(qj ztVJ@#SLMsXYS#X|xA0UrgYkJn!nL^(tESN_Qb+hbvX=e4+vW+{g@V<(4JUptCsqvIh@x)dX5uLm0!MG#DlzQVl^)M zGr^E(xM+VexiY?4@6*}RUv{5M;iZ%?K)E>gu2)N^L&LhnPp~lWmow`%qBj`xL zauo^KSQ}{iQsHvYo|ZuAnkjU0CHNDFIo+dB+l`LKKX|||cL2l>Fp;7}w{G=fOq6o{ zN}Qml-eO%$s}N!3D%Mx%IO4kPhie`WLK&?&%{4m}$9MWhEjHjE3E?w}Z)Xup&+b|X z)9Vsv{1SPsLS!d0FGirsdGCJ~ZY!d}I-G&nn3&y({EE-6OpJYd7-DQ<0>0pKp5f%f zy81$8zAmO_BZ|M5F#AW?QLi_hoXwp)Q`|9^&Z)`9yIr}0B~u1FJXqKEs5EWW%5~JA z93y+Wvvl*Gh|xO}O%}eAl`C5?Lyen}W_HTkOOx|bp>dhVWhh*C^2jk6c!c&uiM4Ipl2bbcy0`)ji0d$41<^t)m{bi>1}f*01LvK48a*$g&KP{f7U>$zI57nF5;;MBgI!4Iac1-EPEjEt zxK{HYJ*v-p`YEJIii%C(+ul(+bn)U3P?8IwgPTc(C)Y`PMH(%w>GYDHn+DQ zM*}zZ5uUOj@Pk3LjR02-`~}9_N?tpG@~(s3k3l;`FIfSdxK)t7Vr?9(g`kVYQlG+t zg0>$sq&t_E7645$9xd#>;H^_*)N%aku7BAm2#mDCZRr6bA5XjG4I!mJXO?riC0l2@F2E_OZTlUhxGo}n-%hPiWQtqKn*b1R*1gC5hiWuC- zJty3=f`eayG~$3MZmiOwWx!L|W-#$ffhR^>h=7S4o!pu$_IHAX87&8B^*cTw;GN&U z`pe)vMo!?-AW#lgx@Fcy#x}ExhAN3>#9pGk+i}c^7ISf?i_QlxI;Ux#;;=Ady&v!~ z;B9D!<6*RWUk-nK{rZTM)L!Ip-55(Tym7Yn!Ft;x@N}L268jWJ`pR1g#&?IhMzQjQ zcx+rKRg$jG#ekKe%P+H_Ek)?^v>Bt!1uMq9h10I3Y)fcUI@LP`>~JTKZluSgVDE z6sS3DoJ8i#66h(3Q+GL&SURH2LijaanNg-Y?~v$JL6l9-%i|*eKfZS14^BFjNPZ*Y zJZDTR7>S~P%AxfhpO`pnWK`ixTsEqYI^WEt{Ys+&6CSatl`ALXD2d;%?%#gYndA+% zt>lOZb$VQr2^z-UMmSsdbt#S=YT=3<2)4}97zjWXi{b?{uWC; z^5#w^CV+><^d?4hsQ=l+snUe=JzPIVg|Dv<csdaDV4eVY?N-tZ>8OzQ~cemG;( z(+5`3DC7=<^Mrp)*{sgD|NZ-`P*{RH7hUp#H2MYDjO7zVCB85~W;yVB1J1Lu7t04w zhw9mP&aiP?sN6 ziHWO|$a~z8SH(jJ`O|MiDVR6@$?+wAOU89|QH&Esf5QBN1|nW`rw@EQf^{&-B7KjL_85f-2*$Um49K|9r8PcyVri!DZW%Cq{~-!W@%Gf#5}1 z$vvxvlW{7oy_vKYsD022DY&!ZLXM3=TlwScL58$WItYH~=t|~HV4n+}1yE54Ant1* zIVNEg4wq+6sQU-%PzgqAQ@n?-0QeJF#Cub==L+{ndIzRs{1oA3h&$9?;iR8Zc+~)`f$1ckby} z^T7avQU*Ej%s!=WBL#ey2wRDchP~%R9kY*kTNFq{;u!5i5{RT5ReFEbWOYac5*f&y z{|t)|zb7jOH^6(wppZ06cXkHyjDZe_cg}zAJ*7|XIIFK8BiCdpgjvGA4jXDf76S1f zk1HzX_B37s^hQ6i-T42Y`YbL|L>ay;GRH;rt^d8+XV$G?t=(;wMq=GJEP|Vv<>{9K zzFugPx|-S<L$j^Ki7pZ0ImtFv}k8fmRh_KOGGXQaxy7boemRE~y`mg}0?IFyLBLyPtfX=Xh5BB3&w@3x1D0@f_xCl3TmDD?ezbIMs%(3vIsxFCbYyD1z~3rfjSPuA$ZP#hy;hZ7uF&YP9KEel(mQN<*Q7dT-njQt)6k!onK|AI*KsJte~z=s;N5%2Ut_JN zl!-(aiK9vS3jeT{zPRx z_M;2lLxZ&li1!6>q_lcc2OJ!n(ljXi@C%|FCQB%!Q-m%k;00Qbp}PPdHyaBNo<7|V zN2|?^#rpjGBRfN(eeOnRdeC9(=-@!!@E_jN``_+|gQ^pbhuc<<9&e%s^h;&+e_*8l z`&+i3oTR+BfXwvO!B^UAsMv*NWnPDnT>l;!pI+cQ%o5!OiFbwbU0Roa4Gsq1mt|Bg zf0e{zXxIm+6kG!^(;^PYoP&ea;^(Wl3{J=Qkrblf8Og}V`23j|o}BbU8BH>4{?liK zVG~Yo>9c2Fp4#`I!W%bJIdl*5Khn4j6#+i$_3PImvBZ~!btn?z;>V60*(+jAO+0`_ zT;^R_cm@=0xYJLxyS}5rz3KG=9fqeXoR>RE+D4p@CY)YDO+C5&q`KJd`vI%dPgmz; zY@gYK_lHBGb?zlsOe^9G82LYc{VL4JASd+ldK()rAgC9~9w!n+Y_L`$5)xR@HX(t< zxX`X62~#*R@A*q`$p!55H`gF8qr^hOGB-9}LJ2hWrPkEk+z+deQ1fIbV_jP!)S1d> zpnY5Y9wvx35LWhB7vhE$2O!sj=gSjgVqoyp`Lk5JjjqJYhDX~;--^+TLE(sBZ?nEV zSx!lnRCMV0T8R8nlPccxuH2S7KH&Jjj51pSQ*%=5rF>ZiMB>x2$qSPK(UT|562l+| z(n*oRdsRy7$Mg*LkOcu{p!<*>qNpfEAewi?jW~a(ZH@uDZW~4qb`>tw^*CxcCU}ns zF$7q1FldGU1zw1>>;aRk$B%`M9{m|6Sf_jD%<|yo1`9Lu6_6T0y~lP10A&CVqn|VL z8@qzIBt>;|(DckVD2~ia_3(U(#%(p-rf<^)AlHDX4T5CWN7U9&z^o`MgN4y)HML6c zF<|IlQX-f*(lqS8_^ZDMJqU)l6!PG&k;(HiuB@)Uk8fk|9sWl85)^Vzrw0vl4~8FZ zt}(O&HJeR3)%I^$cFyNb5@=N3Iiq3M@`;9Z?mr2O6_-=m=>L;0hL-T55S)$N8MGWB z@`b6G?}ZEBAVLH%MSKPB0SQVr?*wK*5L`Y5@x0!@R*kE)yxb2D8PsvGkMWLH@d42c zlp6DMOCP%L#(O7P;}Ko}t5E*CV5EL?=176>^vxBDG%N*i3P)RKRUY9x-}XV;(@zVgwt^! z9DjT`fn&$E5;*nPa-F>ZbA6XD;kRy~MY~Eu@2#y*Q{L5O3GDiNm-`-vL>}(aG@O?u zbtP)*)@4~QUn;5D-McixQG@Wh*JJgm;(Npau4drbLl5iBtL2uy-UO`{)EEe7%*S5&ncl$$Pt{$18@3`^;$+aq48BZi z?sjEljh;jBA4p%sGJsMYEGxNRR^~xrB(f*Gp`oFqZpC5g_cu^Du#P4cZrqU7LrzlW zb5O*(1=NvNVVIWb>wCDlCBl;n+#qyyYxvS}H7CZ#U?h$~5_tJ|OS_3AsXk?PdMA+e zaepy-g+xaXeL}0_IkAi4qOq}Tn12N6=DY%awly%=ty%ht5CY|L>!=7p&%jVRFtgje zM)Zf1G!2PVGGvMJo7SS$QplM9EWS#FX>@X=y8tQ!6Eib5g4r&jIe1%OB*RvJxUVW?3*F9Yz!_J8t62N09N5&hZ(gaj82xZ z`w6QT-?cf1bW})$+Z9jzl#2NnKz%b>7?Nyw=#!k$GW`(g*1_Qr5D-{j`O{P-n)}oK z+g?u6@uyBNzFjQIsa^Z!?^AlC&Jo}L)IMe{>n|&uJ$vjz_QS^!|3)PyvhLok7|FtK z{8pv5H?(aS6;W$i*W0(2B8jNA7U$+Nc^xol24$!@a&7zG+K{!Y@eX%W|EXzjm-8=d zS0Db<%l+t9+R5u6JM+f0?w$Hs)+zh3)CSc4(+UbNzt5B9j!!@Rjp1ZmNPPOy6VA`?hJ_kPU>jRc7vuBsxrg_@*Dw2)o8Pk>v^Xm8 zTI8TDNIGN$iilP416pa420$H{8Xsrfvj?_-*p(SEG-Q249<%BbkU#Q7u%;K&{%r(v z9j#_px*U@pf7fi%cuhuV9F_Lo|7Vqd%bqtvOS@Yd*ed89Xnken*x3W$*kIKVlRK-` zjZ+=-O~;Q&G>y)U_i4V?Nu2rfr`BUMaxHNhY+S_Y*NZ-2C4^Po@!bcX!)L=!vWF#9W3^9x9iNY1A(0kurW9Kw)$z12Siw?^$Ts zQM`f!4A^&=DqJ@{^gprC#;ZwOi}kv=z9r+v6LWHlwb`Acd*xuIaV?4J`YSdW#-J~L zT=CoJ=nm7Nsl!T~iJI=Jc;#efipblyTid~fM7I{Q*dDhC-5GlGWl{9rubpfzJ2+@K z^y6}2Mb18A|Ni~(;oDpH^P@|B$FXaC$BvQ{$HNRKSC%`r%dlxhY_5&U!RcgqZWIQM zNJYZJPYMfZ2#mL}M*yD!{PH6Vw+##pan!+#x3jb)2mruBVq&Cn4Oe3#4Bbx1?*K|t z4sFxBYNELl^ly<3>3yfgl+U|$Fz(qpbN5?vre)a{?WdC}M=#s-(-48D)*q%htI};v zznT_ZMRQ8$fqj^`7GAJ$+@_Iycn9$lSjYJIpL>}(Iqy+&sko3Fxl!Q(ct`0N7k3s_ zvSTNchK^1EHdn0w2GJI`o+>coV~)}qIZvqmx<~=<%sCwtSnG;AwfuxbjwId`3wONlEM^vFD%+5Cz3lxTqT{3f9&mjiq$e2b=E=E zCkw+PNKLKD-zn=b)1H-;;^%cyGBsQmWKOOg`|r_*eqfglz^&=mGu*-K^!h! zf*%Ix>Klk~jLN7%@v|`2rO3|=F(h&)zj^gMP+E|wpcF(2w!J5Se&X3*SShGl(zs75@RlYJL5(I@6W`ZU|9f^MSCub;}ljW9Xhh z(sipc3l2j&jMDwGqvL71yOw2rD+aQxjlKMZg4uQ5oTibdE`8 z*UbF4fM#fGGv8K1kAmki2Eu0c1#|fBcCt%0luR5A*Z46F>-K zTDio%AwAp$2!fTBkKr~UZ)9{8!XZ*2B5d^%1psLo%$1rrsQu9~-uMdK6>i<26`cSx z236%x2yh(w^3mrPWc@JyJ9jP#lAGLIXn0Lx2Bm|l5B)cP zg*SE?l%;B4xisPIn8YaNvP)m(zzSP$Uu$PMzVmHYkWoP0^@VAwuS2FD(PHJ(ok{+O zKfZXKDAZRMdHnt~V|uame>Q>*eHa`}`=yh`rAH&Fud8;4tVi0RLJ4f4eo;Wg8q4Gj zTW&T!l<4H4+U{e&J1Hp%cOU)(*o_LM1`Xv!?25uexAu>~&ac0vS_6zHfnj4@Cummb zIyoR-N>`DY`6HV9G<vuzDK0F0wBShY0nI@Me zX5WotgRKI{&b$n_A#_7rI%{rz8S@Nur_4vY;EGVczVH!&J1#aBj()oc06LghK{13` z2L#%r7qbE#5{*c_fH`akutW_@y*OOF&KM`Qa*Eees-64#n+uc z34?T5nt{`Ny+lrM^H1}@#c2HQ`+c``p6E}k%vCtJv$AP@5TdhcVn0q3N%g|o6x$Q8 z3wdxd#@ANWRTlEZcXb7Q5PE18c<08C8xJ$L5kmdUxd|27?d_lScHjGDV(8)KwC6)Y z-@LIWW$qpuyOPSKrk;}tPCG`QDLCzMN-*;9*M9un|69=qK85K!@X}m1W-28Ln zO)9wg#%viy#KFabbs^xi?RdpY_V#|*+=Ldt^Ua%$wYg5RuXq(8)@2BXVq%CGSq4Xj z=avy0P^WCJPX}P{lHr3pt z{{<|+gIN6RddEnKVb`kE6(P1moOI9FLOU193I61nv)8|_Fvd65l#mggVjNP8bsK_` zJE@w#34LS|@V6+t|EK4qr0Z12F{AH}w&f3&N3>YV%rC4TCW!c{y8F@ALyeD~6U5-L z8{9pP+EP11qnHSSd)Sq`Zkyoato?BvfnkG920pI)cUo++)S1rO8eGOfoesjoEiI)y z7uDAA)2d-8!RbRUgJ-Zg=B3$@p&7i1nktc~PN4kV=5_2+X+=f6APorI{4rQQcJ0&w z*fNrK4GavxoiZC8BlyLHuC6YY53b_Au2kEKB$Bdyf7#*dA0TVKA#Z7CcNG$T%mUC9 z5Q(UZGli(z&9eZ{z0SX# znL)#S+w6J^b0qwAjOOR;D}5^>_X?MPR?9!}P;}?@>T|e|0-u9(uIrk;n>iXNoA~gW ziqQ_rKR0u(Hy9QFrd2S%3)us#jN*nw2+Kz@j|~y~_lZ`)q|(GhJTn;mZH$*XXx!}d zL<4SC>&|{LNXCPo^JpbK#ZaE|<`WbR2+OoshT=5A#T*7LH_?D?p%+XaQ9kbf1!5Qo zqoM7U%K*3m#7bUxv1K_T!y zK9kpGt4Ck2zo^hL?_?c$8*Ge3mv+e>??55#-?x9EaZdri2BZ? z+U(n%qdf(QV|#10l+VPzC|1$Si#=bc)O-Fr$)DiSBLo_Zy@nQ*8Ez|C8^*qnyBb*0^I#%bK)Ax9R$ob?f|8k zc)s#-i4*j@cZ-6zLc8yHA>O;7U2mU{2XneMzi@XwcU$;> zi{Gu3sxhrUsR*#JR}CJVd2H>i<*h)qo0e1AV_$ZwpU25u>`z$xA#vY14%<*33*WrB zkI98gT}%B$`?lh$53LopH*?0`K0C+N$B|O!@x5SW^W5^66!!;8^V)||TNV$t4XqwvqfHx;F0=U_Ak-?0=)w?hP$pYVf$4oaPc?~Jmirx-!Q zDzb%u#!&)2G_W5&xddmS&{v+L}cP9 zx5wn4QlV<6jvF5In|qwvzh1OklF7Ec>oEIvmEx7khChL}mrZNw9hLU0ch>SZR~orY zjejh^TT43IOL`8)@%ut{6mjwQWj<2W?9*5&*dgVul)DYaS|0`CIo33@gY7IR0&~|s zh8FrId%B?C)zqXRu+J`F({|%Z3dBE&?P#Z9S8UiPF*rivn}kJ#g~4-953@8n?Cph` zStWeWsRKw7-WX046o77shIawA@=y(65`!a;c=H#$a|f{79RZ*J*fA_DNPvXM@f|-3 zcwl9ug=xTZQ4``4nw`M!yZ?U0VgWB$($;VwZ~!m?Y2plZ_#C94u=?+T+3~CjO~K2~ z?>1{EMQ&$5uZr1DhGH`h7 zB^A10?w-M47eBv~%Idj#+9|m4#>71aN=2SHCLtfEqkETa(w4qByofx&qNjm{xxgZm zM?~J1S~bkavI4b<3y)~E2H$E8v5wXZA#fJ`uOHZYLl;o)W6DpOLp4E11M^ZXY`v|l z#L`z1^Oz92^!6c!?vK$Gd#Q**JqK?_cuMS|-U1*V7c7hS^`}ozPA6vh9Zv=j{R^9b zK$>!KnZ{j0yWTo`ti`$%JEvhW3GbW#NOd+BCYdL_f_06$pKjGUE2>yz8}h767YB=@ zHyf2n^&Zznv!17u*E)O?2kgVht0!LDaYW4<%=8bJ$kF;qjd!#j?j$4p@7mY=D@0h= z5l{xNWFOIz9*fc*>!gQ7l;-Y` z%`N+ScmA?1u|3rCGEqek%rCZDGhS})SMBX!_mGUk7?sHyfO%kD-APzUfyxLepA)t< z0pvs7MnOpfBGN1ddQAD`Sa}5hBKXFG47nDgBb&~P!Aud-CZ>6K$_KF=sm-?88$RGU&k;NcI1S-r{`0cCskD~$6NSgK(YdnJ*rA55j6b2(Gz7f2i~7Gu7S|wFRP*Lo4IG@UH1oJiULqZGKoJPvMNy(3Kef#}^LxdN69dZhUnR z^%mb1@ecn0^3)MB;#&0!gH?$N{34;su^~*eGSs2IPxNgcd5r(>)-A64H%8W;3jdz7 z=jEe1T=j<@m-FjJL(i70&HpxK+LE3w(<7_$-$#BP;R%a|%AEX82Cs&ajKR;^l1m8z zX-eF6)R{ZMzA1D4rXUq>U$mYu@uS$KLWqL~jsNkHg)<|?DDy-V^eQVRLsU;|X{DgO z0Kf|L6-*{XVQ;j1q$0Mt8OQ@@JD^B{X8}>0vV}!Gntt3Ul*e)iX?X6ND?bJG^?QKn zTzehM2WSG(8b7dC#1FC>D(Bs|mGtsF@uK)|AN016>LYsMNz1MNDg#rswK#fZgw-zPbBWkwbK8VMn#s|7 z1M}lni65=PE`9xPYQP4fqaj=!zo(uGkh^yDYHmdD^G7>g($m-xfzxrk0!l0VTl|ad zUIpeHT^lPgJ~gslPHVXH{Ba8Z?bqg9Kh7j|Bu`jhq-3cN=#ljkW||w>yYlMaklOpJ zEp)b}$IRC15>u`m{pQgDB zbyYZ&hz3!;O@Dgww|#>ZE6eU7L0yZRS&kszv>ojt2k z{qys4xJ=vzKGpQ$3DAWIs-zYRRO=*>7?KoX$E{c2!HKD^s)83Te%dT}?rXq(yJK{& zIbvTt3Kj4rF+>4LAx*wFYr2TKyq-CmThj3_;X(yb0t0)LmW2GCs}H1Yyj1VzqA}UZ z)*+R@HgW02So+s*TMnLhze^^{^r<*w=O!bOrWyD-hg}v^jrNEBmZFSjul4QNWmftj7-UZe^|6U~Z3HmDN1c`=peEvo~xd z-^itNm(0cXk(p~9Uqq7uRFU71PZX(riiSlb zQ4x&_cM!9aj# zOKvWbBKDd+hK)w!UeVA;lVj5=IKFMi8^C3W&%|mAh)^RcW0lJm@KIwxe7}kNtIK#6U zBSWNT)I+dcgo6k17|wH;oRbinS)(a1;u|e7EHu*5DS7oTd`}i5OlZWq9|DCkIKo{Jhs82= zs26a?VMc@gUq^0TOh%?Qc$!kdoT4~M8U0c<3n~MXW~FUy&+UZ2K0~i;oB!rz^;yet zhf_LL{YSaBkP%m#t4$rl{0gO!|6i0jOe*EoY4XR&sh?r5zoKv?PI(7y=@yxR>rT03 z|Hn6aJ}eS6`zjCtxiz()c(|sQO$lUOR93c*RRS>;nxaR!xntnLVF3rkhZ|GRr-uX| z^1g0vKFrIjrlUi*kyg99Gwl1sUc%qjC!PNv_FLo`|7_cSB_cQQ%tZz!v2AgCp8qTH zE9V{%7sfc6MbRMiHwI;gLo8Rxc!f|@@`OGM2KYsIFs-W0E z5W4UWEKq=2gU^R;Qh-DHE8799p=I$0n-WpwCH4*1`F$K5+)TOpWqB;~Zm$DrtC8cn z5WT}8p})by;mVd2@;>3`Wb!_n{2$A<^{H%xY4a@Vcf6Ez=H9!Y7(7o!=+=B-_BhN7kTXt=2A-XH;e+fu-a8-U-A`P%h14luGMcb`T891s&nf zngsxw0}<`{`5itIQS2BL2pES)D7C@IvNDFph{>w7>(9(%7iGzd^>l|(HyrdO3}jTJ zNeB%=8WLw$(2?!4tzt_#$yb~IpyLF;<$K8U-Okik-TnhUr^UQl{?c@Rx#9ljcDw$R z_G6ratRfO2rjk&n+dnAgIFVcP(s#>wzH{=?(=csuR%_eT#kbQbxx2ceI+q6zPGK_- z3lLbp&H(V~5lfz>u_FycIv5V(HK70&(EYpBH@ppic`elK3i<5lNOE@FtJ?gqv;)oV z(Az%Fo*@1fm&rivC(nop;>2HI=>Jq)9F&hfJoyCABL--AK~hJDs#pYkdQkZ+>0wZ$ z=T$?4zp>2HiJz0)N$y&X&^ybVge&VXBnip#F6sRGidr5`1j~Dg|M(@_FQ&!;te*UP zIU;qoA5t>6QVVAJhF+F5;ZW347czJ!@T_YnW>E1B_1_BTwU=`oruN%Nj7f0bAmhg5cDEn^NQNEoTAc?gT5I^Wz=Yf&6m71;eLDw|ENgx`d z0J*RahjIu6dz;6`Tp@3&d})H+&jIur2qLa5u;@Tcj`eav@SEo+2l)?u^4+vn zw8~4P5po(Volsz-B**yFRb^E{u?<0>T_3u8ve*bnZpNiB+qwC`B}AAXR2t!)4bR%Z zUL9gD>%hpJ3zbHY?|L(mh_l}vl ztDt1+wFwQ&68tFR{O(0rSP&!`)u82S z^sVI#E>(yqcoZhSFWTo;%S$uIroiSWF=EKfNHu&R$$^!*B7r9|&ZXt^^QC~BKixu< zfSXV1LF3Q+hP2jfs*>*)x%fF>8E6{$cM?h0i%K@f+7i=s_?Xh&z6~fgG?6>uAb2qI zb`R`W!tcGP5LkxZ6=bOrAGq4Xc&a@VuAHEN0CW%yAUgtWDhy0QLqkC=V%k0J-BJFH z8P~@#o|Sx>F3$5fPgXq~?d(dFnKxk50cxbp*U%ba!@9At0hm8N>v7;%2iC?Car&hE zMNSE%J{hKty}~AU36VXeRG8Vpucv!YC8AkEa=iHHX53;If^J^89nS` zLav@rJ)hMtVG$>$fY*fhrk*^&7vpmC$uc``d|9ns9xk)Fu={<2=Up$0pD`)f<=)mW z%=bR`^?499|G?X>;`U9oh|4pp!t+*EUmjbvC?b#~4jp#s@6tXtzGA$XDFPP>5h;GP zg=IIfpqZha7ufUZ%FAtzhn<;SKorb56fRqn09go_U_LzE7TaYAZjFb=4Nei{q} zkaT(tSV!O^kCi&ci*g*c9o-h+sF|qPVV9}4esLENDaa3)8k0wN%>My^&MSL+fH#0G zp5jyk!+Tv(^?%b!=Jz*TZ6epSY|uKfznfGU)>oydy@{*JH?$iQn+y`JRm z3(Qhpx3&Cu(thjWZd??lS>KRswW`^3+AAg}=G9}h!j+B?_Ju`t|f@{57{zds^%PwwS{svtfJa7j z-H#u^vFK0flQ*oDE5fL8y*o|Tt(AGhQlof36xEmnuDa)Z_!awHF3Y5r-b{c>ZgmAc z{OJxYXVvS`*Hm&K%ou>?oADGvkLeWzraxMBsvNQdcl6?>KB$QUo#6yp_BOZ{0PVa0 ztuW+1ILv_65P&XUAC8&1)$86Ol8F^Om|Ms@Kf8p80J=(YScVjKy7nNlz!{sbStObr z+xXw5P@sEJfxI+YPA!ma$P{dN+Hh#y{E4zA5EEhiMasLMDt|32tz&A+mRG;&r`>^e zAO#i9F+viz)z(jw%9z$$}nU;WQixA9m6Wn3nlT)?oSMEv@m!K$P0 z8F2HKp?*?TEx<)BI^5usAh$v#K>H5DOmBkF(PF$U>{dWu5I*}BAOyZRu8|=x`TqgT z4|-#|WOy!*IEorAFKqautoUWY0j(y#zfdKGE+zL% zgq3M4Cf%(SSd5!S^H%!3qvco5jiF7j&EI^7T&qu$Qjd9r8BO1F?&pD@?~*%#-V#@{ z=vJocV!8W7I>k$9RddwWH#co^631W*VoD?IHptIu53nDQEg4=+6il!I8i`Jg1DZED zjw0%x&HG@h0>}h_&V7Lo1<@4U8^EOqXiI(Ax6K_UxpBh>84iKn0UjkWC8a9>feTb& zzR(UM^g+`d93HfxE8X8W%ZzpG;3DAgur@p+lrrwlCJoe7==F?iYhiHQ=k?STOjC`h zzvY{xWE=3fJ4!ik5T~Gf(;`*k!-S%*NKu-rV9=NrQ$Y5}qXh+BD@GnlDZsaCIt?DiJDS z5pa60Mb%8AKVQe#*?VB)TM@^exVme96*qw2PY$d4M4N?UYFKi9R8-E8rJ2gV*DO$s zUWzC3_({n5KdnE#%ic|wIhH(84mTC7P;_)(x@%`KP4beME1}cJ6p`UFOI(tE@4+6d z^rJ8`mYV31R`BvV|6ym#wdBiAn`g43m@BC?QB*uR);|E+*OmhzNV5*vh8O}Du)jcy zuQXUPYv2qD73Rp?sLJlPHjp)Lfl*j&csK?E1R>yJ=$4rVRaPFs%mCb+QMz0RKRl^G zQ9C<5gJ2r&Oi+)0wI_)Kz!bbLngp>e;Y)v-h z_sj@~^OK3N&#dQXB%x1aUULbr9gDA}kz4IvIl;SM_^CNb)@5@eQ^5YKrELW3d^O@7 z_R(S9XR%%=yYbg~2OaZV#Ku^>>H~tbK84=BV-l>Q3YIut&XI|3B0^?)`@?4w=_Whj z16Xp2JC9s1P7eOe>9nrns(ARI#Tj59u*N*P^Nf*^RFY{}@mY^XQZ;RPWdDhj&D^z6 z<@DD>W!VKvb|pUH3B6j}wDEOMvfdeSsQR9l53RgGTXnsmC#SU8vnpx3aIm2rJ`+}; z^&miYvvJ-ovEAAtlm3}c3jXc0fG{RO;RAXtC!vglkofD%?wzWZnfOtX=04_lXjGJX zRO^%Oo^u8WfBdVFdzDyB2+U}5YuB>;QN!iq9iu~O0M^69Gu-ga#=*e>hRd4PF2~Ss zqr^#{(4kzq)mhJH-w}d{eNs$J_Q;w=92xEh6o3FG()C_vZe`A$?d<>{{Q-q;MxQw> zBPv~X05l*o;GnKP3iH^}kCC924`aM6SnEN747AY*f(67U;X9r?eh} zhD5ZDZw8bd2$b(OauSm=2P~~Ss*n;O@0e|Wzmf0WVB7wbt~c~TMvMy&;{$VoWQK~r zbUFIM(~&)5UCAElIVG=S$+6}MRX5>h%)_o#+1BYYtre^J+PZ^0@rL-7LE$x#^@kca zie9<%G&N=j^;1`S&-JsIn(lA2`#tTrH;4odO^H)!F`j0_Fi?BM*s9v1|>c)<5;C|3oPz@SwCQE^RBK}D7iegn(? zbnEp+EzFo<|9nR#hKPu08wgOSNB0KA(tGJ$HL(`jP-cL}B}D{4Rr1QV^x~{d?TbrZ0JAxhyp3)ShkJ zOET^9y6fCiTm8r*!on;ME6#l}E^^1yOUUYIwq!`?jq95!714*c$vB0Da=yfcF_D;) zGM^ucu}K8m#*zvj)&H}=#VMd2mzvE^<3G~V8*^-Wew>2!$SY#3(D5qbcpjx}OQKZc zqP4q)A8(^8j!~0~c&E;Gdwmf0R3;I3+)>`pNEAG=7O378`Mfc<#`*fu!YJ(tG41VN z@1o-m^V)m0sr}94%H|~kCf{1VcA8b>_7ziYVp2LJKh|#P=9nljsqs~M{=)Y`PBM}A ztGnfUn`LN6NuQbBE0Ie{yLZBNGA_BX*<@GYX&|+AX=6SeOfY57OB#c=;l)5o&I9PV zP&%ownnf8XBjyto8xX5e+y{vAJCi^wxUnu6%tJR*K1!?uDq^et-9j?(|lbDQRMGTQ4bHMV99$R2C3S~j!BMfW8` z|I~GBY4PN`@!U6PDjd(4Ih13WLvjswNzl*U{?t$#WOixEYzMuOnji}lEfNGBcX?4H-|%*s zusT*cTH2pe&NEXmkAY-u9tY~~ngDnJNb$z(EP?=d>k1AI3^@tGBj6mAEn$ve0-+yJ zH;&HE;D+}DBreaPY6jiBFf9cVQn2@c8VU$NZ(8ReVt0>^3&P%zfguBc{gB#WIe*C; zsAqiBE=_Z`m?t+ z3@Hel1ocJIGDat(d@ay}KCzJXaptUKtxZ1^cZ*B0crJxKV@}t^eJ56!pu!DXBn=~| z!uV+c84OLLUwCj}i73qKYZ0?ZcFvhC?3(+OlyP`&B~0X-owL3S+MXCdGtgZEYm15Aae__+WocXx-@0wdK8MnxmFo`@Lj$Xs|@m`W;?p z$S!TRwN8514{q>CfntBN`MTs^2@p)JTP>vnFcLe3ndTUsIahDo9+#qcl!kO+XWf(f5m=dGvf#wI2v=C-g>o))^LP=4uKJ9`>`Zx>b6 zrbLr4l$suKt7ylKyrn1?b=8mMJ)zR@-s!oM=-xfgDY^2)kRLTZ6ZvEJlBGndNVB|k zo0u7?h?*WGb)rUY$)VY`^XMvD*A*FiV z-XAhfZ_?K_%G~2b3-jq^%dcyjMPg8HpG|}vijh?U{CazP8&2$oCoK>?xwyhRd5)$` z72w*TdMF5MEJbywN>*`|0*R1fXu1zyx_5L0s-d63ju41pcV*)SVFUrBw18%Yc2(52 z0HA5GiiF{HVnhTtC|*GKPzQw&fRl^M%I0@m5U_CZ0=PHm)s+{{5Qqlhn*NPzI8QuV z!`|FEln|DA2D3B@2~MjN<5AJI_KCLW2S+wM4X@k?e$}^qla%qj>7;fZmhPbbx%^ir z#*$P*0yiGg*hA$(mH)oEb7{fNoWNs9fBH5-k;9J^hXP9fRC>4WiHZfExGrp_jsWct z<7@0$^lML;Qz@|rsh)qD{Orl>EB1;X5BXfoL|S3cg=x?+Y>$TEtQT5ss6SbAec@CY zSi|lbac7jwg8Yxj15=4lUu-4QB^%B7N#sc)6Rm$=PU^%WxP(xI_t*LGNyN@vU?G~q z2aHW0#O(6LVE~Y^im4P)eSm>@KgovMl+2jY*hN62l}M{A#>)}P_T0XpbZ)otz~_Aa z2BmqeKpWQLpZpP+#q`4nZ^m^g!C8+2?g%ielq!TAY5FY7fm*~ekr!_e1KTm!XN6l! zZPo4d0N77}`jch>YS;>uXF^EG4;X|1UWSlHkeiRs83;fERd+^H|3Q)S* zST`3mOV z^^GMq$x`3!$qg^JaSyAvncbKQ5|TvzhNC|MwOH`s9tiw%{jy=W5DEFKa=}mDMYc}X*1-U}kRK<1bM6L}Ol3?x*H03?ivu#&~&GoKtEdu)Hb zbWrc`-ZCZ1J@CJ4p8RCkiet8BdLUh}!N(elVO40_h2H9+I#Quw8x~5&VlHP&iAT_h_{q0#rpI=uAlIF!tzD%U1PT9E$s~nbb z$i7o0MDSF8>rK*+y>Dfbq~5VA*s)i_XoQlQQXqraZ1WM>OYec+%3|xhut3s+L|Xj# zY|c|vt#+jG&8dL+f#DAN%3YR z^mr#99^9*>n<2>1&FDizUNTCh%!yGRCGqQc&32;IIJau)7RH+Nyh2M>f0pAf&9Gwb zs61)p?Dx@@t!rg2O7pM+jo_hBO^?PB*N0!7nEc0GN8G2IIz*Mif)gGy3%{?Dkzpf5 zX4$0mv^fvMi2Q(0@X%d#h|TC=9-1ex(AKDP;mFy#f?OHAIq<(&0AOnaisg&**1t}~ zuznz&`3lC5J!*dPX>a~cfN{`}?RxyP+<+ddyjl%q1+Bn&&M<>3vh251Y%P1s8SpkP zBgF;ZlG2juOh*x(1GWH}0A1CM_paB(D_uy$6i6@v%XK@j2r%$`TkX>Q7X@1+T^8M~ zu4%Y>AdJH=%byB)`TGlW(6J*XllLwoySP<|eEJ)@pr8Cngx7o)c3f*7e3)&$5GdC2 zS1faRolyG9jx~<+LGLkvT+$woAOZ5AlZ|wwt?g%Mkb=h39hxArhVi-2e{6jpU|lR? z^i3HntYbWe-p&TCHQn|&=Ibt51yy}wrHx$YvGLD*`-p=rQvwbSPdWC=CcZ`cZOrB`*g8D&T2)v|V(}kyHaI9w+?v0==8;*9 zWlmMR9H`9>`^~$Eh;r_2bu@47y!^`Vv9S8g*Qu@WTFeasuQ)J|R^FNG>MFe|{63C# zU?U%@B_hj2SZYRIib6xuRDbL`NPmzB%rSDxOT)LjS!PGs8OM!xUXAOwLUaSm=xvwY z-cS*Ols$c0A9QlXhT-juGU7ct(>OA)Z{egUd(N}LN-yV_=`*j}@TA|x{1dO|^c-zH$VV^uTRA3z z$dOa@Uo-u5zpU;b^y3Z2Q&Q`yut_H;oMUI+`qDYaPZ|VQ74*&U37z9#%d`22C8C=K zy_dbhy8R=!)G&L~z9(Quyf>#;#jllBY`&^WVof*;|IsPiy&$@)^rq6iFJGaWfK!Y}JS(eVYI;|* z?tK%2A#=<$wop4Ke$!Y>+CloFcSRvC#MC?}>bHG>bgx=Ol588NQXuEl(# zo31!}&fW9_uW8{v@zsq%(d!S2_05w+?e}<}*A!(LpHu$?Slj8?YaPJ~w$iBn;DHk- z-rp*(`X_3m)+GcT*CH>;O&xG2pt+qt z9h~zrf?X0Kr%8{%`BNG(M&rq~h3O|LoHRrNSlcaGKG|rYS>D~3XdmEuUG#r$@z+NC zsc_%PwLLQDDGxV%FYirON6$oby3|{AxZgfCZ5Bz3i*@wG$JoU1RXTY6D0qVNkDemQ z*l~qk9pQ{D*PdyomRa&m$h(Q?&vm)>=!11QyEtc?7vGIP`b@<-P3JRCzjtLN!Ez=l zqWr0Z*~+G;;mrw2&Az+3?pkNpJ@>@XpEjB~xaB5?%o}H6AZC}Q;4c|O<5ESkvOWt+ zvFbDWuZ&49Y~_(`Q(`A4hcvZlBaL6AL*;6-Mz#WOn&GHe=6)#Hd}rWFGj1N}%%(ts z${HhiQhqU+h(C|A0!OQA?zQdM%HO0PF$3ir5pOA3I|004BMJN1J>5^LatU877NERU zkXP<y>e- zl-rgGo5P&(spi76D+kFVO57ND@`h+e48zixQr9gwf?s6r28lG*4X@COqsa$8zobc{ zlAp2fCe>(`pYb`S$jTsNG0xqf+1O*{jcx$OJrDeQ{yoLD|EvblnqcdLiqsw~CC%>$ z3bBhHkXNsH@w>IFZ6%0L?C#VpVmODVbO*>; z>YZDD>~yJV%rcr)Aw;}u+qaeY=`))isr^hlAhL-#znBOxj%B;q)O8g>Bv*=$@>d!P z(jCOin+CAF5?`qI7CbpN;Cu4q>(LjnM>n~6+&Zw3?(xBf-W6(jgZBay<>GnH-Y2eyCIK2JS06(?Lx z!DKw5V!woa#5vRGuCBLN)IYGjWHGV7bgJ@dpnlwvBAHt=goU5nR@(W-3x)ijI(2L& zVqD0rtDHqAB=w6%US~*SO0sn))g5yjS53awB_4O{W{EyZVj>Nq%BkMrCad@jL1G#j zSwTs#+X6OGxQ?1J-+)g#D&q`JNa>P6+XvHGAV4xA67<9%r$HPC2579z%t!8oDR=N* z{B1beM1C-ZtQ$djYrV@OJ*9f>^;1U={4`Yr=^YFBY*0Gb&B8nI!v)t%$kdIQiH0r} zP$LCixGg6_K15H=iB8Y11ztwK=(&Ffr_knu#%tw-25OF;xC$p+fYB+rlb`d$1l}zY=`T$a7ngytK@x zQ%fq9q9Ku};k*1>v&~-9X*Jii&y{a}+-fqk?|8y2L9_59*`Du%%2CRY)ehM&mgkke z)M^Tv8FsPJ--<46INc~u+ILE{%8oGCLlrc8+7dhJCjYX{GDA8F)Q?EF%5Ip zi#t$W?!f4zqKCO*L!uAj+y05xc0`G}bU13}hzy@|u+_GUGOoY9^+<;A8hb3XaJM*UY+~2=jhzw@qIFw} z^&oafSn}QDeyUg(N|3EI6{vY3ZqZD#gQMERoS}I4@adA@R}U< zYy@xm5bkTrI1#p&ceL~I4fm$Qs&M~3wl}P2!X6jDvUOshNO+8+g8ScxqFoh=!ei|h z)rt;H9_4uV-2_lGc_lAax!A=**vDOQ#q2MID(T}42j;MjH057YLqptLV#nyQ^v`F_ zj96-d$INl!@7o`EwST1*MnmXQ^@nb7U1t3rNj?(3p>RiAiwYa})r4VJ;WeZM^GyN| z(pdCNn&xh8?0P=SjDd2quWEd=7Ev&}zByM(VDu;XMhWrHxgY-=G32x}eei$vJGWe~ zRrK|YpjX_1L`(GMvY>AuG$c_|ghjrRFl3UG+Q!C2{a4%y$Nz0A zQiuW6P@CnqVXwng6Zrm{@D)jIA7TxyARQ%gog`+SDqq@6BB#1vwQAIbbe-;xbKu%yVGM2}JAwpMi2CkqCpnt#J{zTKI$J_W^?&QVZdy{UqEM?J z3S;IPA-=^_|LfLem&g&MQ=RmtCJkFdjf*mE6ZZ$thXfVBE6?`OZk?t#1=nio29Q5; z`}TTU{pDQgklBT`iCLN!_fLT&wT;r+APw(#y^8mmY}WxBl3KQQ?4AJ<4fFHsoS+6+ zql+!NobfMY11Iv^rbYksBdz)PAG`bT$t+w2>ppgF|5MLe)?is$$$?2A!J%&`i-|P; zNCeigS!3>TuPhGV{-aET_4O_)E|D>*kT+gnf4yf;2*`TFz5 zk7@q}uCjHjWgp$-1-88#O19!=qlsgjv8??3qsJ(<&XyVaCxcT|M53~YlR1i0CeJk2 zNVys_g(Uku66+jz5wiL%n-p4Yi#E=NX9rhm)O#R|Y)I$b)*nFUf8845D~cOEs4kU> zH4H2jzK*GhT;>jBQbBg(D(nAL#|Gc!$vq)c=Y>DGeV(yLi1c(>$z|WC1 zAG+_xd`jh-+A3!$8csVy42$G`DSpcOKkW@1k_}(pTL?Gv_~764Q$$)TApk1w^hcMd zm&>cbQHUwmEPc5v){AA;JQWB@Azxv>Ac3ZDbZr7NOq45>GI}gQ6^B-t?B7XFHVLeS zeT*#S?R*qiA}&R(a1zgoYx~GHSujF}yUp0fbYFR>ysWUF_a9t}t+kw>U8xp?0(b6k zm-ki2G`8s{?`N+Yqk_?pT@nVJY%AFSe|4GczQj8fx^m`@H;gg}3pUASy2d0{)E@Y| zf6*K)Qwpt>z82gm5}V59s7%by%Nw=dh3yThf06aK8oy>mHG5O;i*~tJ*obE*P;9TUe&oQIjKjwr-q4js-*=MtMMvs)^Pf#*lzIfK`RRx zDa20QQrXyN;Y-G7i_F)rUqQggv?z9D)0%TM#5lIX8Kk3g+)`pkJ@<@`x{J~>{%-q1 z_2-!YO;LI;hgoKh6E-;C3U99(dk(ddVd(CsO700^yzt`VRo!ha%FL>`f!@n}$#eA6 zV9HF)V$Uy<#>phK+~Mi?{eDwtt`j$^w>XqQ6|dcZJv^RUq^@2R!Tk z;nDlkDn1=TrDg@HQRAELR-QJos*W8!HD<*QBw{A~_olX?2BT@rDl>oQ6ZPsO_tSR1 zn>1!q+`metoQK}Hg-P-4(p3ehd7&L!+7fXgsoP=ls2cvvErZp9N$I4iBketX^V_i4 z%X5N%zF_E`Ypg`ev*(dH~w(_qnM#wp=JsvV73?WNql;n7CPm-|tUF`))AWvMRF%#8+4{;hNLm z3ykeOMq3VBQ2cc*v^RUSa%dOYJj(BB*Ygbq-dawsZY9kI$^Fzshhoe3g>3IR|A73< z=*TSZt=GO=ulefjhuajzU!4gxB{D#~{0q74?$Rni=V*~pbYbpZHh`yZXlhP@i+)}j z)R~Zv-ExT@uhKF)c1nfIz#v6qCsG}cB4sf->U!Y6*j`an96>Bax)+H4puf}+H?+Xv zna@S$IGf0ZPkwh8uyN27j~X@#*L78%)B0V%Gse9z^<(7PjZL4MW>lM(kwo_GW(Wx{ za`vee2P@t_pn~96Lwd;iCPi49eeEY!*;CQEo0$pm9>NB_#5nkz=}93%zSv)@gG}ch z8@-(!S3RCP3nMLco-V`mVmc#ilNxEaTv8;ajOFR~*i~S=sp&`_EZ=-;B|Pf=F~h$H zbn<|%jqWXTC;riwu&uUna*U@qJgy{UwJ6D_5Dh3DBpWPPrOflz!dUQE(P&95I*QtG+EKGrXC@YIHuHXR$B zclJgKwA5A(4006Gr6X#;bGU8~OBFrC;oE+WxM;Z~&@u?Foqb4&uOgN)V zv>onje;X;UR*{mzo#1kZ;$Ow}vQ`kk_yHd3ymaL1nzz{QyTNW?&7A4)EJFGChA`9y za1(GVJ_VM{#ryjASlu>CEQ{tgrfe}G5)BFuyeB+hi$$50oj8<9e_sow|2Ep&TjXD6 z#G(IQ9_zomxxl=Vnqc4bD}w#@N$Jai}R{G9Xl-Tpn`R1G*Q zQYF)mt{c;)S%qKga8fb>Xoz}C%+dTWu_t-6gV7B(A+54*HH_Pf)oc~^noS~GxHmjYVy(zR> zJxE8a5LB;PY@dw?cvaj$ZjCU%C@!!72`l6Kc5_d_?5JRb{Q#E%V{+g<5$D$z%UFMd zmcq3I8fn}!OT%EC+E2*~D<9m+!m98XN?WS%M3)!n=B1%BTeq{nQ^zRSv}vEK3{>~O zSPP&vD^KO13K*2t&r6k>Cm&chbf+}paxrGKZI>BtDf|9+?MScwH<|vO?+dTqzw3a& z+!VqitkAG^Xhd;Tw1NV9ikY}TKnCLMPy+eiyZH_!P7H!sI1Hs^4!HE?rnpUy`j*na z22|l`(NoaA*JV#%#=G3{UR%Qzj@Q_NGFr7ZENUfNQ0w2Zy1nswS={a?rrNqoT;eU! zstYQc4QwxXbp}H0*IdQ!p`{4={`Uhg0U1X5_ZApK>Wsl}RnA!M01m)-@(UrJZJw*`t3)mDNQAkpR-_U-&MqvR`U; z!FtTnbV9*HIK%gN!c)0O(@XyE^LB-Rps+jL>d2;AH8#~vHC~JMeH`Au?PxX~Ja(fM zV@Slqy~kpOKsRD#9=R z)&}#O5kLHy*o_Bqb)JfXZK0rNf!894x9h>I)~{Rc&g0k+7MAc!wmj9hz^si8(e8|( zG|W+B)WUPgQ8QPmF$a4f-mbqwiy^L1@T@Ld8?&wo>5f{{Q>W19PO^71~|2@`RgB-Ogts@~N5J>E1@tzjQx2|KO zu)7ddYIGZuKgj6Fy&)2PU;BMW<_jr3{=u6jsZ!B||qQ+|~xu z8%oVZcY?}6>#L&om{1pt`LTjB>b@?1GFTOoQ1IB3@1qoJ!28?4(=wE1{s$H|8}x@T zP)u=OG@I%2%k9`f-jC~CaS+Ut3NBd`fS65eSQt72=a6iy`w6DdkuFiCPN7OidB^g4 z6>{mO^b{rSK4)&zkFGa68>^d(I6NOirX=y}G2x`Xf*o=0{0oY5bi}1ccR0KfFkSXi z(6G|?m~SNkgjh7&kK^yvTKn}?%f!P1cC3v7hK+022r(LaK66pTmBiF>^B=NJo?W*e zNS?cCr9Sq~OpoHXfJ=jFli#O8Z}*GAlPB4(*}4V)U+M7`>NTj^VuLynZ&ZLWpX-GR z+ed>=6lW-w>rA!nSP=<%5lO42`V=HTo;|}rg?es_Fq5S?R8fN?9rTTTJSy}ElNawz zjCDw~reqZ+5+U&N2*-*VcPA@XSiy$MiUK|Qyr}1{X!p|uTXU*qjl5}l93En`YYYE< ze5ic@PfGt^G%}(FYggbhAn;y3{{Cbe^MUTY{8Y$axQ1y!PxdB#*!;hhRa8O%2?m_T zw!ltxyB73Mo>#_>9&42cP$D#l5{^6hw>jxXay7G5Ql8l5qTruMM&P z$p70UK`4x<&!@M8rDS~}A?^EBaqoA8*BPq&t8pG!eeJJ}RRik-qwDgMfqJ4n!nMX|vk^R16=Tc>YS z7Wt-zM85%4qD$*0hf;vtb|<*)4k_yl~Zn_FA;096F~sKw>w z*2|>20r$!~$VpKSP@voR8ZAf53e(LIZEv zXK>K%w_^((KA5Y z3qN=Oz+2erp91^>KpD9@wNIy5ih-F7>{W1%-kSD2ngX5?5H?0yv(N+`?puBUV4KcU zbm-=aT{#whRy*IusQAhYuqKYaXL9{B%^^FUy1W({%H*TMvVTjZ{QuqJ7yVa0^BlHZ zw*@75ikmB7#{e5TSpwc0z+L}yv~{%4dLo%0895}hRj1V333QdPQ&GQsh9)vqDmY|t z^%ZZ#D6qT)bINSV@nQpv? z)t`fBc?DqU48mnUD}_As$HU*jvjtJ2Cg#&dY7i<>SNy%E%NcixaOM)JXE`~u)Z zFs0Gym1dR$j0EWFlHRy64eFAmW`GyH9V)SE%>e;qv?`EM|0(G_=ljOq?Z@aSFT%J) zSW9x^5D+|ks2>}64-2VQrL;FO(UIZHu_n^O<7ef`WzQ6e{F+axtW`c~^#1RD?4EFr zvZd3!qK!=3A=?1j|XagoxTLQ38~g@0QDfwMBsQp>Gb0T#|fvPP~j*49#sB` z6Zo6D+*a)PsdKy7cfjlcC2d#ZAX%V_(O7EI3DdpGHF;qGLQfVOyi;bz@&*|=U{QZg zPHy}~^)RV-erMHy1C?uHrvBy{PAda^8^wNcp#`62RUc4A1t$s__Gk?6q@GGT_HLrT$+vzV$Y!c}JOZFEzlYLM>+9=-H99)-FzFG9boi(z zeEmn@6-eqJv%oirzNdE%+A| z4TK+K!os~+;#qz3RC0ThjOMhvoDC86kH|1=5J%S=~vbC|<1hhNaENVLq zs@7D-9{?T$pbW$t6f{15#Hk1Oh<$S(17+sO9TS+J;(kbdu4YIbeboUs0#8fAjco{l zLQYr~y45?dS>fd+LyS4cp#Bb$qk&4N0Eg>j@o9jZa7hp?X($^ubpnlZ>(FLHSwZs> zJh{9SacFscGZpGyO`B^0DzE)Eo?T^&nkhcZUQv@LKgP2tIei+iz=!!zjLMA-CzftV zF>jh`3{)A65d?HK>A%0)o_!opRE*}=Y_K2QkL(rzd90#XwtV~jFG1v?kNC%X`LfDP}f4bKTkh2$QG0F&-{ z1t$mI{MJ^{$l4aL$DB4a!=pi0BxFO)F&zf@6)D7!{{c}A;~CLGXI4tc!v!02fXuzB zuVe}(Ea-Lz%C#T&)95UP*f}^&zOCAbN*J%A*oNQeq&*_2+jdM%nNl+VbEqk@p!?qO%wc~xfG-YNM7ZUmn@tpkdI|)N` zi;ER6M%YVDOVc6nMtVAvy$%~9y?L|u6GSZVLjY-mZ%`6RW%R>!XlbTgMURLM7gbOO zSe%~wMmYdmU0qyGA(?=@^2TUM8qhu+9QGm1ft2m9`T6<9MJEszzk2&A;vF0;2kd%) zIS+yCI@ll`7F13H+Jwc{)oLaKII5wIgbnh|hRd<|(1Uz0B?oXo{$8wT3zR%s9!pni zvn+rr0aFXkmLD>n`c!Uc*<*RZn(xYK3Cg$GEB_Y@5XV3eV`CrEm%H-TZ2TEVZrUT> zw%o3{@)bNJ;(OH6dV#w~*&*NOKfmdk$yZ(}?(t#9*NY6A<^SrILlcR25Wi~LQ0CKU z_HoFa1x@7Dn)=U%BFiti<3tCPEX$|ZBMoc}C0Iz!E$L`4Jx422w%+>6rO!Q4#8X&fp;VCpg!K*^pEv*|{PAlLM3O*-A}KDeLl^e( z58%5%M@&FSsM2z%qoczT1j|8WNDh3(q@}NegBMij@DgB%^Aa#&AhiT^&IQoPLnZ5v{qN0bx&FE&JL&gZPhF$tvrrvx0;Ng=`+S4AO&iHVxN}FSKs@F>oQ5M2&e`%6#c5eg zU5qx7q@zK)yj+g>6(Py456vZZ#H0K>!tUe=li3ZQeT8+W!#|%fzFix9oOE#iB05u# zF}>XdG9_^3pR~X=2kgq7_{SjT^ckpWJ_YSkPo6wc=hZC+fpP$wQXv5C>e9UrsuWI> z8389Vb*Ml{_3eDU@Nrdj^%*1>V+Pdz+I80$K*^wR;X^<(4y7D;$h`OQDU~a#yKCWe zQ$q*U{L9FIC^aT(2U1}%un4yre2n*ZcWdBz2EC|KP!j`s1Lz!sHc07A6c|H2c;Eqg z%mM-es1t$8rCQLLms6+2B>M zwzbuJuFuQP-oxK${1`&+r>_>6V z3c}%ko0Dlgb**?;sM%n06!D_7J3P{Szr6YpED(N-igB@a7Z}xKIk(4*{8sVu^@2w~ zY*cFIT>I$Pr?ED1VV2`B{^yuQXga?=-vnJlaB8v0#jV-h(MG-o;W0Ky%yNCV`shEA zi-FwNEFTjZybieyCLL)VBM<9DyqHd=FNn6+4bh66M_$6?M1>s@$ z*loWHVs^;O3?4-zj;0Xa}COwNU6`vJEy&$H{lol85+&&P$8|9J#CjemT0Q&>oOVWU5FgpSvcks{ll#pnHm<~$eJW$hs;xK57 z+uGWKw>+FkczsavWnsy~x-Ki)8 z=5)-2thcZA?K*T$Q$yb+3#=O$)FJTh!xP6ALjN{?n^b2U$oIv&at+m?1&@_5VA>9Y zn(nA`wkv$xw1d=j+~uYYa$C9gHfS$MH~%od?&SA;&Wy+tYqci_Q@J@hioW{8Pq{7p zCqlS0RN$4Bloux3GH2JiY}Iob#Jfk9%e`WHTWB8xd79TV!&&%pM(x*#!qr2A^OnBx zbe6zOf)~1}Ev6_r4Yf~TXO&FVDIHYz7;ynYaz`S=<$id0eo2=RzKM7Nbxh6xjYySFot2-q$@j4bG#YHG^EJ!;2bTq$*42%Tf1w^DU>|}$P08aB_&>mv z;eaeaGcf@T$zO^*=+%I}P!+gbf%+K`O`sS>N&F6L*#=Q?e1oAQfYO0e0w>4_2u4uw zr7MCF&1wXb5-`ea&CJYVWuWq`Mj28FIrsdv&AYxd97AM*3JHY;{GNa8w7xT-{pzU<&S=_6(3?$YlBQ+c3aA$6S z5fW9w-<{ESziYC%2x|EF)yL?YVw$CfgK6wh3``UvoXNzv4$%0xQ+y8l-T)K|R^PJ{O)ydP0-l8%=lB73GI1v;r4_@L{5N zB%^P}Ao%~4jZC+1pV#6;NHRXX0?cMbcc_Wmq-69@;RZ-1C1 z9m2CQCe;M`4`4|)-x9aa0D3LDpUo8{BqYFZ!xv&8C}V(HW8c^qB;NS?MWAy-l4$Tc z`wgiYSnGqS;sKDAp%CGRum2GocW4Ps#Xz`HY(F{l|N7F21Ic9Uj@R@uqRF18u%k0Ea2ddy&Ye|tn8 zJvD2@n6KqkLj0*qgQ_lKq@$Bas?AN^L%83iNEWMYFi(BuEHT__C}-5sX$ z`qNZ`s@WzduvUAm(bVAf=Rl%Uu4I(>2VB!RYOanTlq6 zvGknvfyHXaNW9oyRVq{Eli&X+5BVLaKd;)kjV0T4NNYM_6wjtg7byi?uTifSMBmo- zk>U4`V7Gko=MOL(s{ECrt-o2@YazE5Y(dM~xU{zQI|#nm+uKX%`m{6g27?)t0Ms#{ zXka4UU)*f|Jn?~rhX?4N0}_Mxp&>+JTiXlJo&zl@&mQW%oIx1pxIrm7b`NBip$)Z&xy z>Y$y6D)C1k=|EiuAp`o@JASUZB6@&!HjTh+46?1v&4NEdWd!D^~!U+XHg z)piljQu~G$6SF&DY{OF=&GRBtTU0E4%&N>x%y-@1Kl0=6!19E$;F&`56JuHM-xbz4#b5id%PS-0S#RMt6$i$`Rg+HIDILB!0QeNq1jd zyGOaWWjfyGN0OFur8E%Z8XVd6@cGo~l$LgW2xIV@iak03PO~zWpQDwLp7z?afA0KY z=jVM6|H3=qta?g@h#Vbf(w?>EylXU*$QT((PY^&5iD^w^t^+>eF1lxoer!duW^06A zIji^Ra>>EC_x8JZJ~krG>)ht@a3J7ldBORBw)pJm%LOQ)Uq&D_#J%UuU4T$R&-``T z6~wEJv--hBin&`5#!py?-xI^I6|r4&2?B9ZQFM*0_Nh@rZjeVaAOy9*f4-Z5K@<>d zD2SQVOAMRC@5+G}2IP}2_8iCuAoj3cOnA!37wO4aG&6Oor9~ zvK}O#q2Kr=og!~;VuFRhAOlQ&5TGAC0XdlunJW;<{F@Dl$Dubq0dhb1r}=_XC=@X; zA)5lPHJC$!Qpm4|S`}8+;9^`^=?u9GEjc+^Btx+~j%N+@XpsA$k-HoG2Mp1Q&r($L z)j2@#8Vc7Eg*KSZn3s>o)wkk?RN>|HTtNUBzQ)cjR(y1?aJ-ibCICB-JJ*vo*7dYh z9{cx%*!iz&w2=?f|^D zPl@BFZ}xAJh+ibFj>>Uhcxa`K~-7UzmzP?z5XTAhqa9A z%sOM_`oQ;uHl2PpXGuOq9f_oHsfI3{{%(Ggr_|ii@Cw@U$4iFxj}`VW`mi)e^yt@l zOZ!DAa&N+fg8t+x)Rv!>Gr~|sF3ftry}vNqs+*6inSOL`9QK|RPm7n%GSq-Hg`KF} zk}dgAE8S8@MT@2COT~<4`Eq5G0v7e75;_&?LB9>P{41oS)NTFDbftWu#iCALuc_-~ z#c*h?gty3x8VHUO-Fsf$Qx20$T-xgjf{E7U%ap=yD2o$&dqpLT3~Vhet-;lp&IMu? z+sUfF?rv+ST$3NaAygzo^v6G2__rzyW3PS_>ryC9f9%Tr-T>bpjMaFMknnJ>m$M>t zZ%iN@1G#^3?}U}?1qjkG-v-@4T~M8UfBD)+ty_b!1zHowNhQh2w*&>_KAyrX4(h&y zH6oImH-o)yHbBDV9UdmLUIj86nbQkmC7#W^3{O`Z)@>U#P*4y_x-)how+mjI>tGBKhIj9tPEh&NY%WpcNyn_#JlHnm0`4^OHJlPR% zI=Meuoj@z{YIewA@BUYj*f&>S#oy|nVpO7_3k#{Zg^4shdP>`r zzoux}o`PS9C~Cw^KJg*eu(7?KS*AdiZ6oN=j`8R6FZLYzdN&%v*B$F5dhMdqsj41F zd?0r=pW&x z!$L#F^(pD)F8+yOnezpnao%)STfpSLra&A%+7FwRx-f_$BqY#Mi>jt?0r&{;q(+Uj zcD#jS*-b)19thTr550mwB?e>|0j9FU9$*d8g$T4H6;1WxN_gG4r(c!Z)c3*g6Ab2< z2=sObOVT1RuDL*jbJ+lthMGdIE7IumM}vj{QhRX_Xs7=a9*#p1xxBM;x!8LPCpZpD z-=U$pO%fHNvWTrG_0}EIb_*V2XntIdkW`vs2l1C`C=jL zw4AoY3YGNR2OZBf4Q z3UWI^#rXL68a{gkMMX)CHx`cep>N()*VZzzbq)u^w+(?G6N_&A1O^F;Hns~7K7DHp z>9nA&r03?|1NTyQGTQ3UnQ5Y~j)uHt zvQt|t;y&NFEGX=&$S+;%=$w!m=L<8vbbydZuBLa;FOtJ!DUf!XtZ=Ej^0kPh8ZqIc z*{QuMrVh@e;I#C>Cla^d2Zfi=NMu=z<0!;iI#?-(0*sOsAku!WKd|Le}FhM~^}Akp@D2$nRkIm+leUTA2i{ z8J+t0!m{e^lP2iR!aB$clzN2u;kvl9+)vAx39& zikmQuh?G{vP}dxc#toLPJ=FlA}aB?>kaM>@K%nbn)*3CRW+)#kVzA%Hq04Q zu^~viHsDs;ahd*9#4VjaaP9e71Yb^Q=?6)T_|BHkO_ZseeKK3V7*gVTH~Th9CWf>E zSNE*q>!dz9J{6=PqLz%MT_y;l^-CLR6d=SziaR%mF(Wrfj|-Pbg-W1KMsd-{C{p)Z*4NjsQ{9i* zy|wo5z4xs$S{`RCL(}-%IeJBhV872oQ}+ty(I4)9w)JXg<<_4mV>xN*4oK|<5^>}c z%7(mtJ1e1s<)~DzasdukWu|J_$pH!lgycmUbA=b1k&zVeaTIA5Was2Sz#{a-L)W4oxXX{{ z-z#3}?LNhRm?pTt%N!Kv9M~}|$FJhwVEdRWSya;3SJWIS_56z07G*V4m(Pnen^lzd zB~dgvGk-{)_x#Ow>;v8TC|1vFE1o*HH3ex{pO0qs^;M(!JDPJ_tXcdh+3Lez& zhWAL(evRjoGnl|Ws$7rV`$`d2UM#k6RgH$<7qfI?rR%~*iYq~X}IEEom=fal`= zt5@h+Xp7t1*AbxZ3YW3;BWXfs=*B;?v9Mq<_7GfeRg5u^gU-*c zFW^LK?hfmQ2_?Cem97ww1^|@_Y*_GFot^CL{QUX;A`X6Qs1LEX7jj=#wy{|`JoEs$ z5~R&D3=lvBR;f{)2Gd*PMlV+wn<2silCxm2fJc^}kI%AF&#AT*&}@{a`wi*6MYlR> zI$$Mb6a;TeCqK<%t$bh_V*jf@wJM}zc;~cgYiXw=#rj$I-D6*%O#QR zLRPnxO<%8e=Ey8vM^l&0s+jrt zb{%d40kNS$`R?JGCVrXyxPQ7%eJDs9Q1M%!jf2W0<}>9YRO2NKy`|;l1!HRv%gDvg zpQpwGo_aB8s9=8QBYDpAJ~tV7xD1gOlMvP2cdrG0?NEPzoC-bs(5+2>Q!O@QF%Z^Sv&79~Kee_+00}WDssOxj=|BCnFyqkma}n zOMpxu5Ky&zIT8fVB&H^9<>6U0cpAZ!D*ka+-W_W0M#KTVd9cg|9i6WiY2*3E*V2VN zp(k&svs0$>S|Y`w+aG8d!pFmdia!9kVL5Gts$6PnYJs$udkZq1-Ah1snzg&Zf>#-=rXyDbPB4uz5qZ3q+3JGZ*^#Yg z-VY#MM^5w*xRu+b)^w|MV<{$YZuWVUKK3Uuy`%HnTj(iX{Vv9729DR^*ohw z{e)YE%Y(z&-ttmdb7)608kJsmor(?V%6iZcobF|poD{zB zk%SN7I*d#lH?o=3I0Wsxt2%BC>lxCHco^Jan2k#L-7?Hcs2m+gal`#SRUUc@6iFsH zWnn|Y5FD_?SFxbA_UBJ)Q`$~Zxl}26Ho%b-M`Zzb2LhI_bb&VaH6%39<)na1oo!(H zvnxFX9>Nna|;T78ybRo z5=C|rfD(lS1ZqEj_BuOU126~OAD{!AE9lV73=N6q?I9x2Tms7yoG7A@wgt*4zFwE& zq9ULr0I?Q&aa{UzG>a~-YV)jJDTY(Z+Hn2q&ZdMhro=}Fl9^ESyQl{~!^8V4o@B2F zQ~s_uGw1yG)Be8=YtE*&dq+hp-o;6xCrtbRI(Ny}2WE@C()(+<^v+A1e=@0jV|6ik z{Y!)rSv;RfoXcRy8;W19iGMpRWQoB$d2QpnC%wm~BE?VQ&r*UE3$>hcLod!Rd5v66 z@~-DSEc>&Qs6iNG&mgI`JF70eyNgG$ig&OR?>w8l{aT(H)u{lD-cnLh^z`&4B_&Ob zjWeYUd;9xPyAT->A+4L2pP#+|7RW-osa1op&!6ufW~Q|Nf{t7G9w2>&4=ip#ItUA= zcUstGvb~xFVpT?#H)zMD?}7X#qJ6soIx=GZMgT1f2ugcf8&&|+)I;S*4kS01Jx8E? z2;?=`BBK=*74YoSqZPs*!N4G`vIuMg?7T2XLRAK8Xu-v$ztaX~1taM%|Hglx_!Kl; z0L5q{LoCqREq@8^z$8KqK7aP1i#%I%0#fgWO(G)=n3mAQRaFOp--Fx{Pk0y_g^90T z0@ujTe*_XOx>zivxTJ)ahX;rW=q!M4?B~au`ZX{}fv0~Dph{>BtaYA)y#M6X)NrG0 zlyVKi3S)W~q2dJ!=(6mYinI)%z)oMksOo4Guyc2JcM!mwPUxC?R%oecB+fmtz~>ru z7yUmiz^E0x?@d25nzH;uMW;x6rQ9T%A_}r;X)ps@4>2LTBw*$b)C~a$`D}Y3fP{YK zdxYHYt9G$26>E5r+3NL$iie&xo3Ddg8)IvR9P&@-y?yl8KSi`vW<7Dl(@iI}`p3F* zuqwqY_y)@&AocoJ28uv_&)Y9oE!8I(A&ooSPhaV%WNn$YDcbJ}QvY2m(06iSmgvDd zxvk6V19n7VR-r+ZDg?s9QqR(G5Ecf@vyvbdUbK&NlI~hhH=XYvC7Ab+6Gpa@kxL8k zky_OtIwV|I)sJ5%1;9P*|Qy! z>#qY}F?dj0(5uv{g()*_fLtXYpcQmZAZ=4pQo4#BkWIY{lOy1ShX5o0^Ix8kFF143yHBYIIu@uS& zUMMNs6jLa&t-p!CKI0y;I*PBA=~lVB{$ZF8^Ow)XwQrxOqbDMTitAvFh}OJs7L3!ox#C@0gNId2`8PqWSNC zJ)g->ORdL~#~Fpk$`Ye`*@f7^;_f!%yXKVPOom``j+GuSE4XwwRR5-S@SvV6YQF2D z7jjqGi@od>+FeZHk1suxM-z{Cjjd?2!DZ1YP#f31~!6Bozzp6b1^8{R9A?OZej8C<+#v{mi)eP`Q+Nv3E zF)3r=EyXPphd7!^4%4 zkukDl+YRVov5~~m+bf{|^@lUHlRC!2S`C`yVQGO!13W_tdbn`$!Z-w^{g&b=76>RB z0Qv@LhZ`W9fbanNYFh8X>Piyk3|tLJ2X5j7gWN+IBDbx_Y->=xGe0i>nQCanm6z`T z6an~<`tA>(g8|?!q2vL8(2syS0=~4i7Unwy5!z_tEJPteL6F%6&GoD6>ui|S!2Y9J z>yx>DfevT}kTb=Jk?VEuP1KV{GMej>R(Y`M|MD>mgk~~X*r5(sNiX3$d)Gd>m!uFq zSoxFiFCh=$=a51-?}Ng^dqVMz`fES^m~M~eQ5Fh+bm+?4#xA}6^A(fwqp^)Va&vm5 zrxRUanis#EK%|+yq})QqK!N)izyxlU;s%-REscg65c_CFC4RS-iIDcvPptQIu+R=> z_Bh^y7M-sg(xkQNr4||Ave*WeE_awme)p9s+-0Srq*IWNOZwVUt84W)cQR%%k4{}G zaxXHM<<^l~+<}9krm}SOJ*Dt!JzrCeQX{M^#liA~30=iL_t392GQ&}dkF<}A<&(Wl zZc&@o&_5n8;A=2n^qrI!mV8)jl9j+5=E1o9S*GKLywPd2VEqyIJKn}uYf{X&qAAqU zif7yu%w^LE3G?06y)}zz;fI4U0WRPKeYWtjCwyz=vok{WlG>*GIoR+Ja%{OI$SW$2 z?z+lIOWU&G;lqYaR^n4kF*+lq8J60hc8LMUPx8ZO&VT8~@al{%po1I(BhYRvAL@t) z0HN4pKO?rNo~HKMMML27oS2-v4pSil?BFHl4h z&<}XXcehdy$nrNCr`p}GMjLdr-O-MF#izBBExk2QLu|-GREMRZYMaepXi{*bX85MS z*mj>~{jumbOIGsoQiCAZ`u-?f3F?*I_lGU{;1qUNjl>vc7K0A{5zqm2c(Mu$EjTA z=vD8Gs;yNTw&m4fL!FH0Z_+t3JL8lX#rt5_1~?;rwv9mAz;5S})+%n!n^##)m0qMajQl*#%BM7+XR6=}Y;D|HTv>S*{P#BI z*l$qzzn{ql;DPX?8Q_5M-N`4diCLxe_I%k-t6U0`GimnubL1zm{hhMz*(DnE!50Bb z9=GuGra4@X+0U;Y`mK^Ge{uVy~cBKEQkC$a9a z`uX6D&9l2~YycX;7yxHyuO+=~#O}cXN_Ux;w*>tB(2^T}3%zffs$`P+Df`;TdOReC z?Cf(sHk@~=(DpZC2CS>&(`S6xic}vvR~M*|pJ9{*KQ6gl#}l2Wh{mqxBIGMH>yOE* zuXsEVM~~@~;Jl`GdXIu{LSmg&J}lsAK~wWQ%Le-S4`nYGQLcu~XVHonkLA3!G{V>J zn!&gJyyVxO7wE)*$OlyLDv2$Z3t7+)$U-MU;FCIE5xe}e`1TQ$lEHZV3AE7kpZ1t` zRN_Nr7HyLLVW96MU(ph&uQ9tQ=w&@gPseor(cDy31v;`Y$*dZqb8xc3Rdydbdm*$s zD^UH~BSx>CM$^Lra!=(b0jvDM`sTnCy_B z)kC6&kh%)xk&%%qYH9?A(b`8e5;Iq*zU_6rxjxUI+Cjel`+UuBNkOP zc?$)d32#=GmY`^`KmCCw3&FV?i}#mJuKc2pWtWOMd2+m^VipuBf(c2wHgn)@<_0DR zs@~wSxda&mRIy2BaR~_-uq9YS6~W}Bz1KYee+xyiVmNv8ZZuBOEs~9lNslYzpawgt zY;H}`qkd<6>c^y#QTj*sDJBG)rimKAez0fhEgG*Hak@csHRk3Yo=fSAGbPOTd104g zf^lr6)5NBpOHX_`W<_Ry>2c3pON1(TWnTIB`W0qqsD}j;usy&{G9I{FLuESxJ!_yf zhQAMnIG{A?nD|AXNi<*Xpa=Kz-QkY>O%5Ia?ML6HURsQnr6F8Cr@OGvuWf9U7|jB5 z2JPmGd7@rV#2Vg@Pfd_6iu3+_64ErZX~UYNVAA2t71TvsqJ!ZtO$T?%uP65*nGmS} zAr^GQ+GD;p@WXJP#?u(f{*Its+i ze}m%VQO6-6iqQ!Ca}82k;Rgo7A2oKjI9=Ng?K&*DNB(@DpZ7i8{RK-miU9ojwW_9O zw)SPie;3cb2P&JzUfXJ0ZJ zdgEm0t9ycv-#LzaB&T~TPZ^%Mm^sfhpepQfziVQG7=d2E&w%s-*cVB`&&JJt6IuAJ z-KeFlP+{0|sahrZ`1TFI{2f90(O1LIe#`RG>Ew0xc2A_>yZ_1nQ>mHtid}CbZkCIt_JPV=q@2%K52GA z0Vx3iNO*TvR=R&Z!Msid@@9oBH7~#v;2t%t^Y)an?FoFFcJSyQQZH*6Cf>DzCZ15S z2U`nyYaJ|2;Aert zHkeKnX+le{QSjmmXwf?(CT-1b@u=GK(;d^ zKK>58AqwoD65KkV=Kk6*UtU~_7aiL3a+=*Vzo5WjKfoSdevs9UBul)cnz59*x)zKt#oZ$?K8SX4 zW_-LKDf#Wp;AO_33z=mH&ynX@&xjWbVMMrnmG-2dc|8tc(bj`x6RE$sDTllw$K_=3 z-ue3Y_yBvdxUunlEWnJ*0Oq5&07*((a`W>3g^1*GqdIgT8dVIy*8#U8=*g_F`k^CZ z=NKRk3s#IA?mH0x)YQksL zQ!tp{&W^XWMwFpyN)`B=9$-VVi2TOKU(?0J2$1pf2ZDTjTF;IC-9`9q3?JroGL~gj zebS9R4VO;2!`j|uCUi4J`502%zjt+o^ji9!?{$MQft^H&odjZ|qsX}FgoNrF8-;;d z$;y%dJR6=Ikm3W!6&fAwxBD|doCapL^=~ciE7#u*6{xX*N#rhVv#`%;OsB;b)Vyv8(AN#yG9dMCY`Te`vqBH!od)9M98wyjT2I_#?ltig*p~ zP5c|4OY^)tD@h3hA(rr+=tAptd{$m8OQFE7k~?xaXZfPtdfo7}T1a(mKdIcM^B_0T zJZf*-i2XF_o5Z!^*dG`sf%K z*YL;)C@6~W7r$M1jhJB_+EJjo&sVXs>~_~Fja z;CGk=U>HhJQc_bvMR+(hrI&Yo5-?zRJEnkd2i{D>)HFKI0uBY@mGQ~RL`atw5P+1j znX$10P)tQZQK-jSoDnDUG9bdxcmoLz&=E;W`V5l70q!o>ukISHl2W}3w*#5zK)CV` z4V%@#w7HJXq55LpyRa|S$a;C*r$9v@d}^9OAriOyh!C%ZF4(seZJsZ5JuPEO41b?s zq7gu{B5CD1s+m!}5)$JPdMm8dI% z*@$@hNrkgtMJp+@&}VDGFNemjHm#)}-CBBeCi?9v6+C{%AS{YS<4PMq)z{vT8$%aR zIjNAtG8d};Gu=B7XpM$En*F@)>hU5kMfV&>N$Lfz)C>B=A`9}7c-nV#rY5(VE;i1O zO$S6%bbQ7_t%N*#d`NNcAwT)G9dw^|kn;O^o7>r50s+H2*V6y{A^~1ITs|`87p($c zjIX+%lLA2JRtbF+FGOxDF`EHa)7h`^KOK+AZCv<1Y^9(CU0rg5GOLQ_p`7ewJ!+q{_BAI9SF(2@Of=gIZ9l zv}JyZ?7~6$uT_78grqE1b3|1T8s!FYEo*ZapLC^i`$42UH9dV~%U-<4{d9Vf>d+W6 z-F=d7uQ=Pfbn_U;kffNTb?2|0)z}ot$%Ju|n0SN_+RXp>7uSeg#PRqxhEKXRx_E1e zP3=ESTKpx=p>pDTjiyiZ8-70fq4!{t+bsFxz4f#ijtz2nA0Z8D#W5uf2FPttV&pvLch4N1l@erKsEc z>MfLh=chI24J4oX#q?OfA=1%(VQ`Cxs0P|)V5(wfX7&i`TY`6Gw%*eL$a_GJZb#h= z93g^2lET757}7pHa7Ud~wdZpKS`g;Y+x@M#mz9G9pWjTQ9fTDm_e|0g67r0{geLlx zUj0uQF_LWmtF(otIH@2TYm5^lV|a)b?#g^Qqd8ZyAjX|&8yA;oZ(gYBJ7&uvXUzX` zx#u%2g24JFkrlrd7-5mBWxZmZ{Y&UF#iM8OW0tbE6!x1Bk3JvB&KqpZ`)!iR`Q<5P z>gMmX{L}7sG5;F#$e6v61AmM7#?x@wx9`-iA}h^GPA}GZgycI7Tn_UkvRXyeA6?rc z8EK`UPv;+F95!ZBzb}CJ?|;HBti5ygZkut0453;1CUCJAxa#_y@Z&sl!)jnxRwc`C z3y>Mw;{Hd!?DhQxK(53zph+OW(Tr({WHRJ#T4UTa346;uRvk_jGbF|h*XrYvO4v1q zt9BiHtr_$}?dbA+m;m#kcoPst@!qRKry!kpm}dRcL?#XuI5D`T@=2#r1*F(9UXLkxa`Biu#@`A z%FCa5cxYW3>KYj}!gvT4enz=8RW!y-8c$h`#7H6g6Kl^9Ah8s9*kD zqt@HV@MLev6JgHvBsg=$DDx6(%@Xa$8-6>wb3R$~TgnPSi9koKASL%jHO$PQ_!@OM z*#DEDD5LBnG*MA>d*{Q+j|(A>*`c1)Z_=%Yf~+TPee2!#N~jBxX7^!URQ^GM*q>@Y z`Wol5)b;Eu2gA81!>@9BS$0i09YYM7Ut5^*M!x{a4wP$nrn&oaQ1L_sBbA^omzX5y{kdkccU3{i>oElV;@I=<UToo_fc4b~zqS{N7oEDM#7l;cjf-no zZH@n?6CL49O3Tdjh4p`Z-5!DAItX~yl9Ib`It`kAp3CKuLsbhR-T*f&4G~Uzdpn4b zz$ZaPL}cmYl#!P97Z}>nH4lp@Wv1`dHqme2YPz}cylyWlE$ts1bar&C`Sj^iWhEdm zs4o=-c_b#H^kGJfByZr4>|1h!Gz_qIJO}qP(5Rksks!6y?9YfLf3l-%16(95c;i_L zhkQ4`!OhWxmihsItS$O$4Z+^U0x5G$5nkd_$2|K$P15P9^+?u#lkVgUulB}9jZ$jS zFJ0MLBawEe6cHP&uSu+B0}V-jVZ){|;$wUM6IY%HJpM5q@$z~X=loO6YiT#+%qvp5 zbV8!^Qd`XoFqC+W(K~0c5r*ewOmn^KY(1FPM7+$!Wv?yV6qWSe!gH8zs$@aVmJt_k zGe#x+z29<#ToeO8=*AG+9YMYGyA$5F2O2W^aicAkvy#YrA+J%#Sp{|}kOj8i)r%QT zf66(il4Wp%kurJ2n8_|~Gw^vIHV)1iX#7V`;SGVXCXN-@Y^;GdgVA=5k^&P0`Lg5& z^18%~46rQCPEDcs!-4b%yfif8a&p%YXh|(9vh(&ngT#x;a?{JfhdTrptq@-a%Qrv& z#LSGrNG&Rg0nWTP(a|N`#0~rt^d}AZtW2z|z2Cn-WML_!{M}}D(c1pnuVqTib3GogJfM8Qs)Lxptc0S~ zVdV7%H3D3*bj11aIfJ;VhaEN4Vq#(fH4j!#5a2=lC@Izz1f-52vpo87sVb+Q5xb}8 zaB`KBJz_N1sPJ#rjpHTeO;9T?z4FF)NQFzbU`*O`iM)((Bt2sNcvUcyzW4I!2wgxj zy8~f`Y&FHbBeS54PFR=2G4JY>t~!ZS69cs6{cL-uEMsZo@Xv{ZU8mq!xXZBzQPT}V zgk1dP(g!MW%;6>KLo@HIi<#Gd;s-6SUPXWeiu9%ZO`=#AjEGme>Q)oMDJ{SB%XD^f zzZ5h#4_ZhN7Hie+@Agsurvk0^YMf|7E{ zt**tdIxWKpjj;|^8*Xp~z%S^qhyR9sUVVlrLwn|`ag-_)IM!I5vkZdtBF6>LNFW4L zV`J5|w4^&UwX||;e#7K$`29L?j{%ZSTXp6_H$klmrg^AZ5#{3Ag;}x;c!l2H=b-Nc z(`X(rd7GQS5=K}jCMCU*&aSVohv<-((Dey&S5TtDi3OJxU|zuYKyRk{Nq6)(IiKu$ zL@s;7-*($ugi`O|K8Z{t%<&dLN%Eu_zP(g5cvnJ-&A_JQrK|k0oNHd!no4`_Ua5|s z=sRu$Nr9|`9f8$h~ey4lD3`2lh0g%kgDw7i(5-115R^TIl~v~2 z!VllSPzG{x5*-?>ayP0?Ehx7X|@`E?MP=nCD< zkNM-l@uMozQ%hY{by$D9B~)fU4f`48EB&1hoFxN)k1kI5%kHl==BXh@80Ke>%mga7 zdWT%T^e(AgT*)=2Cd-#=B{X7&!|gpgv7L72SqcnK45YY-zrYv6r7I!2Tn38q6ZWdC zw4ZBq#)67da%UxFGJGD0J;eSjWG zrc}qssNbRzR3P$}RbYy6tusPw|DazlVnEEStYkK$^ctRWP*6d2_kGA@gtTRxGA*H*2Wii_~GM2yV(#|4s@}||AVCJt~U#^mi zIL(F(_7cW}G0KRU)r;vqm{X+rHFpFNS(*T*ft8g+a=wW(p)CXZkndGxW4_<{e~)^6 zx;O4qMC#1f9coo?r&#(XI4KSWGmr2nrxpoQ72!}`+lvr%E=x8al7d+HKQLbY>=XOa zL(<~v_q$c>muiS;&oz95S}FT5&>111CMhnH>#GJL{=bQWY_C=tEIvk-mdoRAH?va} z>~Q7qp>n>Xs+;^Xu#~aXp`wZ%cZ{EBKtIX<8a8$#1 zjppBJ0hNgI?RoHud@I$*K)r5&D>59W0#XqL=jhN%wO*;y_lplC($)b~*X4@tgvVHm zOYliV+%g@b4{NKL4McY9THi`O98(e?O;=7QH z-L&M<2S1{n-5MOfpdf-HIXL+02w9qH0l*B_lcoB=3x-BS@bU6WbpsuqmX_Asd=XB3 z7Z`;EMbP;}T+7OKj!Pl0w8~qCOZ6eySFMfOt8N|iTRE9dy`TTQm04C$-CM%h58UZn zGo(zpg@_Mw6>| z$Hn$<3nCXo`zW$KNcAxJT!r!jUvl$}L~9}P;y`AK_s(+bv~fDg%}NR1Dv#bLKS1-Z zIEp8~LfgOz-J!b-j`I@8`x&%|U6b~=FP@bL#k6j9Cb zV4wk47f@^&ryx@vy!ah02EYANkRL*N2C9cig!J!^;my~SJ|pa_C#s$yYu}A%S-exH zs$=04r6k!27fxy>oX}kL)-WlO&{^zbR??lFzVhruZ}yVDkT1B?t0JhYK_+%$Rp3rJ zuj!AmJ^M%Rlv31zDtUhE22DVIV&2;K)5<6`zyz{f?VRR+R}t}>>RV;(^0c?xr{`sf zAViJcwZEdHVa-}s+qZ5myo1~!X54PB-2al{;-xYHFI!8W&Fvo_hNLhn+%Wo%OSE>B zF;hi#Y~~#+zA5X{I{d7CAa{6L<+#sQ6+k{QqrFB%=&)!JkX@Wj2y1HL^sR{t<2=p6 zhPO3zawDW6rQIVm=K{9Vy_A6?SD4;T@6+($Ip3lSly%1<&&wO*YSf8}c`Bv+CMwFh zQZGD{r|14MJm-)J1}tefNG)tx>W$u3pcmm%+P#-uTs* zy@;i*ck{OI1g^-uX}3~&>_M7`zopb;MZIOe)z60|Hu%==ZhA~^A1Qz zmbcHx4;&Q6{T9iC{fSX?fu#)|53-Rwz4I-dPVIP^dS-E2#c_?sabb zoD>33mzMJOXTYcoU%>aNDVn#&TQt(tM>{DX5)NC)`CmrMB5Pm`Aw+t3oP*4M_vFN; zQm@0OZTpkev^r#ezy%Wfw>-5BV!C1>-G5^e&_G8t>~`E%q}G-H{bDTC^mNg* zA)9YK56VDje4pNem0MZxv1ko8qH&z+%~=+YWfxM*^Sf2pBV70Wfv&J26N6@!dV2HU z=XK2$^NO4pw_g@D*G=`Pj=T8#J8@W0D9AV6Kgg6%!N$X@sjdc|LI^EUo~PzB=6xm# zmHZ71)bTYpSvrG)9&k*Gl!lb=Hm`|!aHrV`PjbI^Z+iWg!NB1zLptw4NMK%yYJO8y z@Xx`U8RlsJeIchinbS$n9I8TB*YNYPiL% z2lr?R`H8^Ir@@B_dE%ONk}xhf#HkdtuN?gTed(L!NmBxuYU=sp1moza*J5!fI2T?COS}kp z8}JXZRNVAcCf9r&m0Xuh`!Cul(P%DfeS4)6`}!&BsMxCX2C2utT77KuR+M5as|_8z zo12tZX=1`fsA{J0Zn@$b$ z6X{m~9D7$T{Ci6CI|1tI^KTpnkT@lb4|}{6vp>$&8yhzo(E2d@T=#GjlOiTX&%D(G zTe^fEDp(e_N|wPxO7F_R%xnXThxA(}jccNJX+A~)#${1N6nptfLs!k|W>TL_IH87l z3>_f^m?E7IE?;iPe&BnD1*wO zC-*d9y8*Wtzf7joH?E$pURjYYHo%;P|0&`9sPgJ#N6YWnPE333Ap-i(1)9H(Da<>Z zb+e_ViRmvguf17k6?rK&usPq9*8Lj|67Zrep6?r?e>IUvVQ<2T9|X>1d|1?u>0kfX zL*C*(EbamM84m1Q)?Yw#i01!`SXqE85cL@bGLUJFT?wC1<}eDfYUDvJsq*Yn2^m@A zQUY8~JB-Pn2*%g35Td`-c0J%ZNBsMiP>c=0w+4Fs1bqDbcCN&urZFw|+)8?T?Go>U z>KY57x{lg8+4$qZm#!560eTBtTPouUMFCv#5A^pNV79CE5Ug|Odp4%a(MPk=kcb1L{tk$8^J140V!tRIve6|u`O+FIQ&`_6RFb^*Bi2}>2biu{BuoEm-pkSm*H9c3)J$T z>JlIxegiWnbEo-l)X)lse^QdJrKM%V2br#VgZKjil_Km=jhu=Ku7Ph7`dsWJcfmBe z#x5U=c9j?v@l?3U!ptnEE=)JW_U?YxTEhScGspkh0mp!PnaKsEc?9wc2;OwQA>oje zjbnR`qTbiWCX`o2Vx|+D)G}zRtSuWg$jfVNfC=Jp%lh$Jd_Mq#)LV!M57TV-HUBGv z^^$J(#LCDOGGJZ(S7&H*FgwKb`Mt|W$mtiWtk)Bt zou?{`A#<|-&`B$k-y&u3iQ#cTpCrQKbyP~Z&%CEc)!D-wfK-523vM5~WdCZgtP}kK zf0kPBC3( z`05$qf_$_%sOh~3ODK5+F(E|#Jv#3+PEN6UqA0kQ%BkjntsDNH5efw1GgKLWp6tcw!V+QKP~fC*$B zgtxFrNn7KGXB8I8k6@4m9Fh`Y)D&`n5dWqt4gx7aMCB0XA-*OF!b6(TU^;qwO-;=S zG7Oig3N-v-5rE&G=0@O-g<%D^!D5Z_@M;#Q-i9HwCzc+j{(oTe0M+u&OZg-TP-2Fw zq*ADsN>s_;kR0d3)@JmwALtuht|7`R@7*x_j{S4eb3q66fd0KdnHtoOsAY+oKjrs3 z+G^@!-t|mk6noA1`Fr{0XM^wL6Y@!D{tHARY?>cjXfcr(sh8kssQQ)hq`Kjkb?}LY zO8QlS9E$XF)938PY@hS|oHQ>}eKNKiV?mKa_qOuUN&hw$h%AiQ8>fIxey{1Fe0Wy! zr;5j8^E3)D&gUu<^&S}f3PRfWjMuh(G~3HJPoI+YQ{oM#u30iz4HS7>O1Te|OIm+n zd3zPfC4N9bf!rO9_wrxelZEbDfV(9vh!Fu=Z-Pc6rpjUyX@EL~5 z%7@S3$0-@$PyyZvSvv4t1Mc-7j4uJH6uAYEzGT$o4KL`83`Qn`LUwrxJ9gXjjDOLa z)gT4ErC#I_B(Ww5Rx&sjSpH(h#>I`M)@y;mFeN37E%$wJIahuX&0Eit?v{+}8aAP` zDP8VqXz#DR&>g$>7X(~9CPhYSKf+$7D%K6yu_~VbK`wj{u{*C{mY7YRs!kUV4ev-5 z7QMbS#8+}Ha8t&es%?8^@sdr-dTsEN$BM3XW#;CmVYK(FJ?nmgEZ9#aS=Aqm{pvz-K#8~88{xMoG7t;1DQ?!P&cDQ% z#h@I+(L;TKSMB}_B2iP`{O*}W^Cvm;DB6}?d7{f&QX__`q(q#g4Wa2((&p9gx?A$s zD(hl%4(J%S8BU<{*~l3{ zF>C8(FmS~4NCU_Ou;M4D@5_seLF-{K#9o{q48_F6fKUQvv+P%4sQyDZHa$E&tt$0= zL@#0C2=A2s|BWk5B+?EfBqWd^r(1-Ha}yBG$6a`f-hunhMD5>UpRd0eFOee+k{@vR zK}a1Y9+`ND`|5BOxM{k&WJ%s=1ChU945xe+pQGqIYC^*7iy{jygE8C*^2OjE@nm@q zU%IbwUdSLmJXz0;jIMHH@2+6Lclncx%n{c)W7p309a@r_`S=%0rPxk9glO*DOYhXj zOC$0w+0&TXlXIK8em^P>{XOUX4K&2m>622QDT!?rR+{_8j&%s(J`+{1Vjzyw$WeA` zqKt{<8k6U-*Zy-LhQCA2l@M0qIPb8!-T+0-()?rJ?U0Bm->o;9*U=Cf;4!iNJ~p8L zbdq43TxP4o%Z(enes!$D_8lL}P3rMEWIa;uxHuGCN$T3e3=Tip@Uc*12~#<2c)+7+ zd7sdAUgOub$6wSBWWv3ZX-BVWq7SwOz&XJNSe3<^wI*K|Ji5^R>a~pl(;Q8c!eIFX zUD34zfiaUZ+W!cfh9y*de8K@3%CrWV;qx5M)sM440Lv`P_*m9ElvSc~<)Crd9*g0l2RvhKG$P|cgwE-(`J~tBGU=%(2_*bIexeb~ z_NKKlQq5zLp^6GIG2-v3b6ow{*!U}pHkd6d1^WSY61i&e*N0YLn+kOACWcw@YdH$31aeec+PoaRwEq-PuCd`QxP-C@ZV17w% z4#0cQbB%%SeeD=WLp~WriNrj=y1Dl?nCT8~u82t%u|Q-DW30^K>3&Ifl3_#4r^n%` zRt~j|-vNCLf}5EtI5jw zM)T)q!ID{vi;Eqdoj2tm=M=p6niP?;R9PBDfUUN8tU>H?D&)>XY(%6i{UijYKxPtL z83_pqka!EpwJ14~!CUKOBb5h?`bTs(0 z#?~x(>S}9`AsVJjTQ=>2XXH9wDHa2U|#hx2IYp~37io>vA}M7A;N#N&3mQhTul?W@p2i5^p30VBI2BM-^3<=Ck+Qfe<5v_fch0-oX9+*xjze4 z=Fd~NKjSl6hVRcTe>gvpygL?sGA8(THPt?W{XMz#(5An?vpq#*t8F0O`}GIH3dpCY z7uoY+m;~l_%LAB7ycyB34ae6@Qu3)vP2@a!&s+M39_v?owFo6P=D{+z)mI|q=fNK~ z+)^%zHtT92VXd8=O~44mB=~n03O9#D|MriJ?6q9}yN4WZeA@w81DrhY!P#C9leTws z6n=Tehpeuxy#zH51Xo@B`5VP{CZ+&;rE5-JV!PX#C2dK7#kT0d-G;Pz!)cc?`8}#Dexhok^809ryx0{Trrj;tDe4;t*DU!RmgF_}jh~13_md7!mfADSN3rzy zh^Y*?d+Rc;z8Gv>x(45e>=~DXa4Eh$KbPgTTYM(L)*e66eJ zASEJnrM38nrgwQ3rR5y-{9$akd|nYdFX?Eq=MrCj=|X_0!lP^l`ob2M9wn}u>Q?XR zX?b%WPbO$v@n&W&&YsPWzEDZYRB(5a=``&xScwpBDYZ>e#6W1S4I%*t<1_u5vL^3z zV_A&%2lv5qD$i+y67M!|P5(dIzA~zgZrhR=L`Vqk5DxCaT>=NU;10nZg2TZg$RSwp z00Dx#yNBTJ?(Xj1n|$}a_eS@7WAu;i8u@WDs#2+{z1QAL=9=?{WjYGCNV?B>+rq5I zqL~?Zh)%V%;Sf;JkDYpE5=m~r^5J{e{4mX1d&Hx6u{vQ+Sk^m_Mi}|t*1=zm;^=`= zGawlOjsn<7hTATKKL0I~dgf)GG!p~J_Y;tQZGViU%HsGPWS{Q)yZ~|)6nIs6iBM6C zfHeSg6<~pN0NGTqCE&1I;>bhOAIHlA0OTd03C$EixR+iBjy%8_Mrt^NE?-N~-Ux7g zQsUx2Ksz`BNYM&_GBoh_?k>j~O2;!5-!L7&tml;Xa`ETfBRT%b-E^!Ce6o%wCuF{! z97uxi6`mwoef29q7bd1Lgc~n^*^@MKUhtdPe~W+GmUD{9?@IWk>Grlfo#?c!sbgzj zgqAoWxy3abIq+G?57@0hu>IDD!)mW)iEXs2m(t2sJi(1rin_AsV~Sw4|HWiv$AvLF z%;AKwyj@H(w*EspD_MghZEth$7Br|eaP-LkXQ)?4{ z4zs=4Lxd`1Z^sB`8j)IT|KoY9FH-bpm-f5ia+EEcrHVrdvRc2-Z6bd}{ zeU{PuR=b2~OulfZpXxhAU%Ziy#n*XQ-p|CsJ9Ek1N`PP>BhHw?)<#HfHjlxqEoXAF zed)O;-U;`K`*)>VD6+E6%Wm|8S2We)R}C2vEru*9hO6a%rs)!DuksXwVLtMg;%>+d zd|!}9IiSPY=%^FD+b5@52-Y0=x(9h$u2;hou0C1}1uNNwqClks9aZt@_9;PInfZu0 zaL4tF)Nst$&RYXh7r=R)@`(SIkX%)O!1vTJHq0oBMeA~ zzunWNCg$}YLF_`}^K^r<9J*03p>f%;#ChKRnX-RSIRk_v{NeX3?Z0$d`k~uSZXi_* z67r0xlxY5jfRA;md}M2GIe(Rn#|LD|tf zuAGQGjI`w>BafKN%RxC_T6ekINTpsqi`#fu5N~n{x3ODC!858d3<#I4AI;SXbRbnSrL(-z%wz+ca z1mV8&cuTp$&8K4ak0m~W46v???Qg$hcH~6&Mjbzs{)-d96`aLTPARh#;7J|@va=B|W zqn^lEIff4G==+;GkNWB|M@?UESrZF&QP?x7n@=tIxOg)=zlO5NwAi_Pg{*FD@+izD zlMy1JhSF~#n6w}LwFiJ`noam)l?HpLkjTQIkmUd}>Sc_k*&9wIJz1V3BWRT^ht}Mr zJKWN6<89ZNpCr*Ic}dPvk5;sj_{Q#FcGmRY@&IMO!L$XP5b%pc7I zt-a2SIuUgJaB~7=xn`yX+ZG`P`vVT$rYB~5F;%(Vl#s7Qn0ozCP^toC9zmo6@aIKzTa)@7=4DQs!}qWwP|p4H1MnLIQrBis>|_%qLjxf` z83#vnKBH+h*sXk?$UvKma|cYPD{K;Tu518_Isi;)y@-H923ESFhlYkw0Q)gO!Gle# zQnyTv4nSK$2dq1AFjzcLIa1BJ4X71^-K$)6dfM5F`3>mA*k6a9EC;vJ{FKnzvs~X| z;0`PIgx+ePEa`f5H(h+q_=&_Acy=8nX7DrTo2>RnQI-q_PR1boZ9Vt1SB`zP{N-tA zs3Kx8YauN~6MY2day#}tMx*n>FptD1*aWH$IM!4(6jh~iJ4dGSx4NA<8`-mrtCC8= zi!TPH{FJKvB3fygv%WoqNTm=lBEwl}Z?=i>3|R|6(ct-=H40z=^!GnFwA4rqouSA| z)qqTXw5<9lYSYQc!1z?D!g>jPppyPG-zB+$zbx)Bso{LPb@=NZgyDw+$Os726yEvO z0C}S4?p}Mf3JP-*Acu)sE(jR;cTy$7XJK3P)jG2ftN=jH0f@sTp-we?08$5Z8$j*U ziBE+Ljb5kL1>hN>hOBsit_60oS!Ox_S;#IdI|W=;(olffN8vx84Xe3zFrHdoydfp@2t9(apo56&mI!$vbV&h!{2|~ z6LeChpgH~`PbD6@h$nB{>|0)m ztK&O(p6Gd*^>M!$U2b~e<)%Io z^P8kKu?~$%ZP?jIW7AuAU_6x~4DWZRI;L1YX-4sj!C(P$%fMuQ(zYudyC#3qYvtyc=cw2x5RD-bA;EC8=-;<%7TFK zQ8Nqei;I#}mE=w&9dF;5`ldqSGeaXInRxCpBX&e5ITOpZ!N58GA><8Y(lPOxSN52_ zteR!AH#=M!V%$rL!s;^NomGoI(SNLdtMn#J|H3~n$VpQr_c1ZLxpfWF+mQ5Sw(wis zl=q>5Tg1JkFP)Ni4UxC&avF%dLq)Y!slR?sX|}XerTQ_lyScg9+sDV%k%7L25m)N6 zJP7sl16sKrB$?U5-|fY$7)&nuo1yRF!?T&PxM5%sv1=j-6{YFZT|gBafp>v3-)NQj z;YgEB*JU7Tu#ZDJt`1EQOq{bYVR`_$z#=n@xo_=E`|e3$j=yxxhqcBu3mIO@QrDM((_~J&nXqwY`7rGB-~*(z0fC zDyZ15<(JEX%5)0R+1}gP;K4=q1#b4UHlWIv>`Xb7oGWpc+^w;AIj~unD^XC|kS&Yr zkav9Oo1)9s=T5Z2$Cn;nq8@D#gNdNzmyHWvAXD;We=1PR;Pyz&Jbw~b!q0S+BZ6i5 z&^QH5CslSs4w~lJLkbT^`bEV4Z6hcY|1Ni2c50@N#~iB=h%`d_idHcPTl7!(m#7{r|_+Y z39F&}3v=m9a?F^hsElFuQFg8Jl0QXs_McF`EIH?;D?WW=_c4&8vxyhbITaO}0EQF{ zJcJq^uq%X0)rdO9VQix3bFA!fmQ+hRc8_`0&%g`Z%=@PrW6OycC7{fDL)MKO*T{hzce5QMMaSEnpEDRKw)2)70m$i9K+vARn z&LF%GrznV>h%_?YR0VG)sQCJ{&$@i_uear_9&C9(2V19o;c8W78?$P}iFJY~^^#E5 z1MN%FuS9rI4NUE7QQGqNb~LE+P^!A)3dxFE0UwHbDJZKYqQ^d~%uL=GExb@e}s?Ibd6ciWb&g^>TcAJo)7$fB{lVUv$lx+UB7 zwS3PqQZc}^ctRU5SO2k$$&IWj4`LF+eSHW8;i|lf|*TpsX1Fp*=Wht5miE$$;6OLOYjhIoBN>}+}>xP9{St==I@V9D3 z)Pz=Gw>)y(B_z(bpw>_HGVUEL#oj19Kvr1FSOssp(?d%xcq_zoH8?ynS>{fI^5v^Q zcwN7q>1VAjE{wYF&Cud*TPRtVM?>k7sOVXx^j(TJYENw6YgDFO8A6K#SExd{oUN67 z3~wkp(%3<)@c{toK0^W~4ms^U&2QBvdh(IdLX9=N-dOYoN#NSR=@BJ>IU&#oGoPwM z?9y1s{n5*YRM;1fWT>U`Ht@N=u0@qY9GmcZOhHwdh|rvHO_WM1%P1htTMe(@hhH{% zSg{vVn)~I;b)j%E*g6HN8gsbsX}*&BQMV~<^BquFFYs+23YPst|04Wn0X#T0dWo8( zTwgh2E9DtXtUrc$V@u}vNOp}LH3@@QN-ijS($x5)+~hGy-HBC8xGs+F+1SI1aP%z) zlX99r8NB@zB>el6!p*i&!> z^_aT{7IorKf)qW@0ya-OfPc1SLm=X?{^<X+N|jKI=G+<$3-(zB zE|jkoGE;h;R7CmvGPWBfU#g|iRGX7PYAB+Hf+CEAoq{mpLbCeqQc7o>1C#5tr&TPu zk}Au^EhX(=&bQR(j$AdkY6FnL$G3l@2daYJC!131Shbt`$=hEH977N*Nt0f_1y4IH zgL{?R5A)5>V993_5gBn4Uh9V= z{osn%I92SbF+ZFhc}7Y~db8+vndLBij`mjb5S=m#?X>TE&E#ZMI&y}ZV~o*9lS;0M zGfP)<{Xo;RmiOFo)LlX4_-ngU0$e#rMQ-CsmVCccxf%QU_{>!2#Mnt+@Vp52 zq5i7>5a!~>5JbWION_oF07^!hTwdLtgxdRZ=eAu#cW6HD%PargeXD5&;EIAZ&Z7f~ zkHH+1+K?(Jq1QAck4_@DnzL<-hxNhqH{|mErIn>CGtckLE&1Wei}V=Ru~j1ky&S>x ze1<1Cnpu6OIs{ZScT%=H23dOX!bE0=gyhr{%^Hl7(pOg5Zn?L2AGQ%~C#-#0Y;$AF zwD%YNAQgzeD;zok3!o>|wjKybn4R=bpoKAZf_HD#)StJjHf#1H| zi3c_mshG^`TbzWYT2}NQN4vzOI%K3eP%<8tQD164y6b%lStDocXio+Kz+hg3NqGU3 ztx9|Q+Y4%Fgh6K?)5?prxejTxSKhU&{^d=rKGQ2@>Z5)A@S>&~-qjuT%8ifMM%Lst z6&V9)aQL4AgKd?;LQ@L!Ykl*1&;$wGxHwxm6Ha04gE0R|FVBuk-%(eCc~_jy!2IV2c6?#C&`#G6B0iXrb%h!z=|f9{%+I!e)L&aU$Wru-|b z+{JF3v+&ySzU*%#MZqgUxhe26ZL?81g^BX5JR4B0!p6c{ZHbw#b-Sr~F%T%mmF}+V zPt%z(d)4hK2XY|ZUynpG7}n*mBXmwVE!EbIX6<~hE2P`tkJ zO727i%1jvKIW=|k2~lta#5V}6Y9|h&N6XQR-`nH7iaE&!!N@F-CB+e!`c;J-B{j#hrK`or(zOPvIXWesv(}xrM$I5?;u5eWs@YB_ zzu_rA@eTsfCpffLNo1-W*VQW4);O2S+SD9%_vI`oTVbHjs2e*wtx8j6d1k)HjJ`6Y zxARHW#y?Ug+QSk2^~He6FD&%h<4RoiXpJL$5fp{Im=^S?h17NxCy8&%3n z=EpB-k;YaCGtIi`Bf2Va=n-w?8fC6bVV5R0au0W*996AP@1snF>0jwmCOB2Aft!IL zJsC4S0x#xe74%V7UF)O!oQNgTP9(9@hD6dbFj^Vm;^xzx2?RPsr&eam)-4xiVS|KG zD)u;Am^lnd(p>K?`Dq$XtHvWl$KtZ=zU|g>ifdJuTnNZIR_J#Ges6b=tz)V?|JkUb z($!9t_=;!OwNEwKyu4~AHK#S;^X4e#&yJkIM zy*+uQJ_WSc28=I}6QuEE!+nS32a+{S`z*iaS!&OImMh^{{c)H>$;|YC&k2jbUckO< zg&BG*)rwYL8UKf;f{`hL<}cc74PzM-f)*zuuNO5<5>peHH`}o|HKz|+Ren!0aF?F>cV~Zhl#gCI+<O2rWU?b8>3Mkb6`68wu z5eq>xH~HR+z{42uPAk1PWNm}J_I^}Y**PSPYlMC~hpPrq{Jc~*&#;s8w%u{o4?!TaJ zp5l_o6rSiyCs_VoZbAr?m>{as!!+n3g;=y(`rGmtGz^_d=CFjiChrv5k~k-wKS8j@ zNxlzWO%1`i)^{99KF8aHYxfKc`I-2{VSTj>pNCh?`_V0LCS$4Ft_S9BVve!m6CA&& zIv@=JV^Z{*>v2uFHBU7-6Ke(TBdwp##kh)&@02CX?IU)pgmsgt;@5>RSYKdUU9p!%rQ} ztAxXCw$z(Z?0&4M>|o@z_JzzbvhAS9gcOZRHOI{C*=6ow#e`_r#2OTfU$eeSpwwk^ zHYlm{dFtQ&&+^*Nw4z!?L&nVLD}b>w^uYf=t%3{`NY;5sQ(4kzbyfJT%X9mFP?I{62L17Q7q82ukPcj z&&fuW4l#%O7^y$sUob>VSTnofS5`?d9M(=(0IH3Y&rphJ4YfK^eY85;+9J3)SJwoF z^Bhi#oTJlHX@e8OpIlA0A=6y#z`wXi^3Y$wa^$R&Ts~kQeU^4@kd4wI+>A_k+bnf1 z4oRi7RBi?qN*<*w?D&~qG)eQ#K8QVFxi)WrG zG-jIN6nJQVU-+M?D3f_Hg!|5cEX_zk;dxJ-&_YsK&^4$3{YVzu@oCAx)4aziViv5B zbu}=ZkXlYScCMucD#BMnQofB-p`#LZh3YW84p8GS5Wfz&3Zmf>5Re!viyx6&I=2gV zYCT_UC{DY(kx7X-Fy}fG)E!!2DV`C-WFcb8ok^K=5FE*iA6fX7pcm!zxx5C_!*8B1 zTqr}{aB%ER5=_tn5o1!;(NFt+@Eq4Gj^2oQywjV4nFu}Rt39sVK}WsI;^g^01HAL*wkjV&<|>QE@i6x9Cd&tg?0oiS`ef*Xn9e3V&qM+*iOpw zB;rI5mT0BJWiczmB*yaA8%R|I{&dQ9?7Lx#e$+)1)y~RC85k%p=`QTTRdN(!^DG-= zv4}C9RaLw8#3B~*atWAdo)jqCHF^dkQ%*x!%;!&lkTE zV1*JHkDR%EOei5eK@GGxU3GcF`@daCFs>2AJmf7ook)Q){Wr) z-Jg#qE)@KB6p8uI7r>&tTO}PK=T`w)3Tbw?BU=rxs3Cg;c7cL_Y@{bilG|XixKNV2 zDJ}>UO7RYY!o|=~jaIm~^m$<(T&M%3Mau;zyl+SYe&FcqQ;~KxjVM#IE@G}BGz_qM zpc<*_V3vI#XJU%j2LrWwGkn0b)=r~1X&;f!Xs3gTNLH)4RQf{7bOLcxV1%o3$$-@( zbZrAOs{czQCaF)`F4v}>;m(n?%h-j1p1+@)f4dDU6BDb4{F1xb%Xs&$G1}=t?%zbH z=2vIU$?OkK_g`yfl$ZDB4V3}Rpe_#RV@QB?{Ow+V>hjO{7n25u{o zO7&_*<<8{595QXy_70QkI=!y7(bt!7Cgz5jhVdpwC7~!Y%CWK3C6jxFO1`EhjYWEH zb86AfztSHdYECTX>iR%eJ4h2%vm(H{{~3yifG2+$i_1~c{j~1hrTG=})-K3tQWC8B z$=*xxHCXWj{4ZR5~N1E>y+xVEWRqPu|2Urfs+2fJ9Vr zp>u~q>|<`&NTVKVV80T&vn7PWd!6AZ9UQsV5H<}?-icsjSC6X z%Tu#w-_GW0t+@rzj3F5r4iw^I%7o4k^Q`T$I)C#+(H!FS6OmVVz7bT)*VDvN<=SvW zFYLzCH+>!L^eEh>1LnhXR#BhfSJm8%xJ4j|%ZPO#S@jjZXdvm6gPPRKz*yHruRW>3 z6%41UE+MZ5Evb7R9-VtziVOr|<&Lj*iOn{M)t$F=k;GQ8q9_$4xk59G_+!Sl={QgK z8&O`C7dtbD8$$z~8bBne8|^$_6Tk!fvJqAKmdD4HV+}ki^bZ83zW()3VWTO)fv zu86kGghc0gOu_7sP(gaqblQQ!mXG|t9O-BL`%Ya7ih(Nm)s6kU1617uasJP$y9!$@ zm&>;>MSu9JTw0A=|AGB5d%Nq#TvvRRG)Q2E3C{4mMkN#wBhE|C)smD=Tfh z={>7vzv%5v8>z|8pX%&&6vanPI-YpZdtqoefFy9gfL?vx-B{4m+=^Z0BJoYQ@rIku z5TOiow+aCDc_>G3w39)&%>r`TwwKqCB~NNMJ;oGas z#J{lsFpYYrkj;Kv^>;<>jiI6)&NeoLZq5^rJY>+A_HIkD>z`r-ocATrz8|aBWJlFz z!0>9&F1gBF)F^_(9n9N4F+`1_9dit^jMr!ZPaD`eSNb(bJpfrQu~>n3CTI^TXlbcm zkM<5$<8|>GJVe`#;O$Q4s-*SpWiL<1;&OC4d(%=eAjxO=I$w&`GFkq>L(=ky<%Q^8 z?n*o>il`1u4@!d=j2sA^wC(npjY9FJ!+|48@xm>5u$CBpUv~bj5X|02lt-P9WLn(foyHq+yu^c_}Wgo18R%DUEDvysx%{AecGrL;p zjcpJ$OGyF4nb-AK6^m0-*MwvqO++WQtISGmFKQDqM41b+_3ZlO(U#Q@!K>}TEA0fq z+&UhYVPtyNIhY;wz6#|AnPu9)=;z){R_bc&S1aFP%_np{P2fFrO^jzenYb9_iILc? z0%;&j^nL^R5U&Kc4->&|vvH_QcmO+LFp{k-Z3J4c;y6^VyuMW9Ap3H+;RKD`rg>=t z9_0Pa$;5rY@Td7>x!8!UJjFREiwM(dww8;8q!F|w;Pf|m-5GU7VPav8a@m{8ADi1J$@wUnV@?JfEE_twJD zqwE%LDdWMr7Pm^HTP2h-E`gg>UbSQQ5v?X&sXbl^l=@AA)oN97x$F#q-D3NAl6E9H zH@Fli?qrX2eaoeJKwlAo zh_up#-yL1Q87G9M;;mnA`xGKKHaQok@u=!;1EGpvS#kY|%ffGKV=$fJOB>6s8%Q}0 zS8_CocXIRJR1dY&7(mg_gd_dQ-H`T(R6^z4Tl+8XsF(aR+o`xeN~V9G4I^g(As(;m z@)1o}#C;rmH=s<)Ql(8-USDsZUHS1d98~;)nwmdou%QI)@6^<0pmW|4kz9rbP@q#& zXLa7WgW5eALG9_J1;Czx{>B13RX`RAV40vF9N^ErLsppqV_b7HG+s6uXt-fvfmZ&X z5fR7RC4E2}$Q^)LMu?x#kLJZjgN)tpJXtz?Z{l&~=ZY;ZqM_HSjpCbG-@==&&{4_Lz(&Z%zQX6?;qEL) z{?O`SJd!eA<1n)vL=p}PEO66{bjdZJ5ovCj8QQ?ji?o^UWzF1WR`ND`7GkESU>Tq` zyq+go+4=G_Cq^Ybvw~Q~?^3hDbz^frp;rqOd3>w=)Ej<=&Q&O0=uUjIDQDkq$i+Tv zxss*&;#ls*r$x8S3|-E!4cxXlRGxzkNEfGTpJ=s;WQJap_cds-F}EANVP|&&ZRjP& zJsQP^9Y9^hfBj@k*QWQ`@$O9An(G;Nv_|Jgpfz&>y8-3v99@k%7#k|zQ8$ZnFQZ!F z8!!&s+?PNV7pVUNHJ4G)6%PO`JU~qe9Bss2wW0h-tVn-j()lN~6Q+~J-#OfVKk>cLv#ri%*G&#osZa;DjfOXD``lQn zV8|#J(e`enXI{S7U9OIEMcEvqvg^#@QR-&G63DtC}@_meX{uF!KKI9Oez%d%W z43ZVB)tb3d-oA#|UpDxL1^j~4Yr1#^&L5{YXI^T;mGt$koJ4azQW=#!VIq(d>+P(c z%+a82TI>xkE)e&eO`CNRk5MI)<)LrTdS7;#u(Z+aY6eqj zagv{K4cjX>!@8EMa1S_L7Rj<8>l^Yv8f-E#RN+xH#K@b=xb&<^{{?ketUcCBSWCV& zl&NX{oxrxj%mNX8;g3vX^os(hxC7`Bo!nJx88Vq5W_Bq7 zp9qj_$Q#qkc{=?Ii%FU(Cx##vmr2+>qa}_Bq;R-4VD%`$0|6!!M=&sF1p5T zPR`7v=q(ZBE%S~itnz-$GtM>&$f3d8lCoG|uFH`V3z(p}w65{P1FWU7q+L~zjmcg+ zuS7hH&zDZ64i+{&^cabpjCp3#j#iI$NN!JuqK)ES4gXNVh=M2F@$TE~`MDpL+=b~n z7I+e}UiN&SX~Xz4Vy{YuKKsIB2mkKmO37gMsmD#tFPkurki=;I(|7F_x~ke#p^>z> zXHM-?b63DmUfKv}t52DG8ehXapVPxneA9OqS|QA@y+s@7@Ugo)?Lmmg>snIngLSt& zV|o;weSy1@XkcZjG0}YPzcELh{6F(asY{$leTje4_Pt$j$9tBRJHGd(8*Hoh(s$+q zi$%CHqN1&UXHn~=MR7?E*rsP3?nR#}H;cuYEuy=N(#JgHgKg>V|}pL~%$%iV>6OjY17+cDNE zSc>~kD717fv*eZ0VS60RvNtj=Zq$+5Zwu#F&NTA)TQhmsxB*r|OHhqNJb3rk`l{dM`_qB_@yP^K+^$r{c zy(`8nSkC(yj!&%U-t)$DrR!6`MeinN!Wsx|1k_f}`nA*i8JGFErr!dD-Q-*>Oe4y^ zY|yYgJsU@#7*~r%-)zBrrZ}j&*D6;^x3YNSrfZMiwnwbRqv+jP7g5>UAA0bmm@0vb zCzqUPy6sozG1ukqPJ6Aa^ct17eC;?_V4C9eU||F)n=Yo6vAej>JVCDuUJn2P@lEcF zY5P7PS-}I6@3+?%fI<(*kHG+Q!`b%4lIId=EKEsGhMR&@peqS9y)^lu6b$M)gRa+m zdYw|Uq1EmfK%jKL9jHi{c#B9sLPY)nC@-N<@BLE1q3Z>1rMyaw(W_K-19Zs8HXOh< zlgWGzaP83Hl8iMk{O9ECfTEnJKgsi1y=nddMU)mx$9DMB1l~Qc$pGX8l428lBS{Ri0WmNcH z@0F)_j1*ATljs`6>uL;hKCQaT|{Hn7A)XDZJP`dbQuIW#2O`QNVd;*Lu}6o^Fp{ zo>dPnuS;`bRKOyvr#^_^g7S*$>Z7EdCEzqJmB?A%-P7!~O^(NXK9)kqZanlLO~Kg9 z^w-9)$i`vM|F$fy>yfgqOb^ZV< zKVb2#JWKBY@`aL;lH%f-I(Ve4DAqtCv#9~c)c>yuf5L_fLwr7oa+pNlqfP2cpZp|I z?PU9~AR4dL^QmEW85u*zW4kqxqV$ukF3C#%ZKzCb#x6ZW+!+rF5s|`_FmS7}N(icF z!;C*TuQf)s-qvi+`EsF@XDHKIz|58EcJtPvM;*e?@*DYj1R88t>iN^KkI3&X<@)bD zaOY_f7dRmh3GJ)&Zz3lXp&eg4Y+Ltqss_{YxOPgJ^>o^cgEWHgQwx)YaxDkf;kJ>3 zjn9OoxPp1yMOR}Jq&xYTY6pMFKkDR6m~+a67;w9bMtO)}VOt#zakB5KqLRWK;7sDG z@|pHFeTU_r%ZH-LE?}s%$H{s>ym&t-(b8Pbzm>KkPK}&lWmwMd*wLTc4J%wqIP2vr z3?!~Ooqp6c`pV@buN{9A?@2{XWo0EWD7iTHAUHt3A->8T&aai6WilV8vYVpoIC*?V z7@y#E>k2_T#Eu4i22}||Aglqc)O9*uO)@$OuB*6pI(w2P_gv4AY@)^AI~jU$Cii7l zRtC}hP!yOJ|GF)N`R*cRXP7}x%!;_Ck8Pu@6&3)tKAY5uv8`sxX}2XgHy3zGf>E!X z#))y7R2O@HN#g5<5}iKV9dW|DS5`Nf3Ig+g&|nKJ$(L4p^xJ7Wn{h+;Fd=H%Xn+%% z^JQD57|N$)oLjbB*BlC#8W}l~vZ(HG(~c9o3d7DP&xq`~>DU_+V5{<3Ok-TNi2NzL z^9JH!M%ci_7U2)iOxO8Swnc1qF}I~!Kb3y5s5q6wnNEY6{7dO7RzBtJ$+-|fDk~v8*A5ECI`k-uAuTGSMr4?zi43cv5Q3x_M zX>vF=8E+dQCwXF-)}n?;ORaRofDCrV6akbt$B%+-6G=$;IfS*T`%-d4yaX!ij9oCE7g9UdOi zKi=vAB}hQR_ZmW?_bC0o?~fRlh)5PnPR@p{qeJ|t;_*Kv357~#JP^7JF0(ri()A-H&#$yv**LNWb2y@d zEk7A)fNVmBqg(rj)I8#ub`vl1&j~lpTqcm%!w()dxp((wW%Fz?Sw?$GJ@J-|YNvFu zOJ?%UZTK~j`I_tPaT<4LGc%*4OM(r)T3dBSYwa@(!my~bR~3^4 z$OjQ&`ODJ}iG4}(!j9y*v;?}y-6LZOQKeFlqT)Fj=bXeRiX3f28OWrxr<``Dm&RQ zt%^}a+0{#6PCh?!^rYVCd=QEiwV=5{kTX{c3E$UR`3_x|=sto%bK%(qta!71#~pZc zJz3cs2H%{GsgR8py@FWaY7j`;Ps-$$q5PNY`bCr3v)N(xuX@*JO_3zEXtll*`H z#=R;uNjo^if$R|+ehxN$tpP;Et61)2KnV6;JBK2&t|1#%r!9fZlWk1vJzV2gXvt^}q0>3Y4JY&CdZjxE~!-*KRz# z{{+#Du(I(LIzNuT2wjzPfs*_=_F&)6u6?@qgiRN`u!~^xJsTh`1 zw2DhZ{Pwi$0NQG&k~c4OO#s%cfU#x`%(a~S;}B8#w$3c}&!<0TS7NZ!vSNyZu9PLK z3|s`(R_7M-Ea|$4x+A1oYBd^_FZ}d=`lATiqj7Ijkdr^F(S7kE7(|cSRnn1lF^>U| zYgfkg{>ww~xE(UDegFlR>Ql>3FbGmo0dROGb^QU5H}@T39s!clAV>!+41gH7=s}_2 zx&;tFWCM+5XGefdz^3*vT zu}p4kf)bOX^hhyw2%7#@jkeN_7@E8bRZqN-ea0|fal#QsF09171PuJM^?1@*>rU%e(_OEe}qXkQThteeom6zWOboNa-C%5r^oMt3*EWsCC-zYG+< z(y^c%Cs~PiS^d_!$KmJ%tiNerYocpxy5hs~4RO*9;6ZTTGZv$@4SvnF8cWf7X@!G` zTA@&lj?6iQL?ibxei70QG@TiJqR%ut}na$`AqQ{l2HkH|mT45^bztIRQ*2M1JICWKTn~ z>mKX_UItG6W;lRN1KRnPwzjMDb3nF1NltELWF+5nWiH(HkGqTT>lug{-shBttlMl7 z85_Y*38D+8azZ5t?gDAC5TV}V{4p@A)xqB*UZyCn!;RF4N= z$Df3oyl@}JRQHFI3sYa6BQ@&Fi=cjMY3+7te!IzFaw6$jbiN_d$oGfNb^u`iHLH9k zN_AtxlB{=ZV%|23L+=RWi`Oa_`_MZnu^tN?2uhfKT9OPk74u!JXzIM{t)DE@2K1?W z8!EFTz%@-4bn1AHeE`^yXD@~BwhF%o?Ax;K888}j6RylT@f zy7Zq+fRIA|orCLUR>o>iTy$6%Gf-yo^137Bak^)S6MBe7NC+B6c7alpZl<|y44`G? z*{ePJ^MVm@8ErXKgLNFh`Q3IOIdIPa)r2{hr6AX%)n|Qxy5BjQ)yvjv70@bpmnng; z5xAP8Qxp^wtt~CeHdsryN!K?w_fS~SOab~;UZD4HIDj|?@K>Ax9SjC< zNx+GF2^wMW&u>0szjYUW{ye3Xks|q+t-=$N8u&-0mJN)C@b!9F1@i;bB8naq{vXt9 zu2FDrtjhQ)wcDE?p6@wIt_ojVEH(%6cVu-cl>8uBbV-0e^w>r@X5-_jCTlK89#1WV zvfjq4h=@il(U!Ho)r>i##HK)|#q_NG!I)4?Ma3i6$=rP+aB%dfCZgdaBpLqRL@_QI z?KE81!Qw2_>Q$6W0*)xzqVEZF&y`71K`f7>{3Qs@fivR?+sSTYAV@4Yx^T$b)7I{u z>#3%3%IR5f(KzzEJUZc5JB^Rz;y-`u7cRIlz)9UrPqXGf(d)MAcHX-)hiaO8m?1PpL;qta_vV@%m_e2tTq z`Uh8v(C=OEv9g(Fu{ac+b^!}j`r~YFwKY0RgQ+Tm3-&UBbCU(y5Io=yoW_6ms*usN zHZp13YMa$oF-k3%JUGHvtu$wP(ia|*om`x5_1&YX##Oy4j3t^JMw+91Ff*yiQ&#?M zx?1MatO|TJSwiLOF|L?_=EoZZ02!dIY2=JtW_7n;3~e48COiRi58XE+d%4z)K^RIW z95SoPZTD$IE%;b6R6J#w$5&$tal)s*0TOiw9@q)#BHJ1iau8fFh=}R|^inxTr4I1J z&L+GVe(~1O<9GLg>KtmDhR{N-w~x#VjblFXeF(RKshL|{iMR(f1k+_6$@u(pI;{P9^vx$*vC`)i|dgBGpqLgz5sSa@bCW(6tvm? z0-^q1T8sD>K6d~6)7YE;a)*CEI0AysKUK2(OMYAYjUMlRBDlQ#XO!-L7yJVoz5n?? z-W-n4%I(n;ND&LZ=ilQu;nTkj4}brn)3ndKx5M?XQwY;Z{}+$TN*C*o*T89hy+{%J z{9pg_cRb>Mx#@pC`F!ilGTwiT#{aXI`hWAq77>GFby-sUSN}bLACZLqVm|L*>eJX; z-aa?C`);1UhcngR!TtODe;k9C0mdM?8jROa>7V|0YJ$r@X1x0^H~r5iueALSbmRR^ z|36QI|NMXV@&1Q7);ya4)_w;Oo70n1420iT*Ry=n-8Mfjy5Pp1qzI)S1BfOjyKSzo z4$*tAMG;I%Jbw)4ap{f$=q+ z==uu``};Nj`4Cp0{yhr+lWoKTbjW{Wq`%Dnnj^T?e>Ico$~Y~9e|a4L+bNfz@hM=} zpPrw7u?S8Uf}kNi{&sy`$43aRt5iIwT{3?*LD>AZ=YSij4bc=Qt(0r_N&n&f2i)i1 zis>HIZiqX*)$8FlV5Fu)4qI#U@LLEWtfWMPfiB{M zB!6m-kUohnz6mDvB|-Eedh{s@zT~>-8oU;_iwW^vY0kAdz{^G!Ie)nQtWvp#wMt32hAl4S-Fa-mCBiBbJi?P zuTkw8avU}?E-`g!kf!r+Zwe20Npdxoc2FK8y!@?MU~AMy(2AVDUD_1ZHYEus;4R7( z?-2hA&3+nMjh(a6(mCbkmJZhI&m^MFg@azNqGo(_c^czifyGoXd`VJD=IRW`>!zjD zE3w(K_^A27u>O{ZN|cP5mO?5CH(=an~8nCOTh+1z{xB{=9k321)XtO2Jd7b6m^b_4+V zHwY5YcSW#|1e~G-Z^J@=VRIr(_hLYv1??sgjEzm9KiKELH&dDRSl431F5luE z&8mPkTwl&$M(2j^quQC?sU76DNHUw}?zU0J=TtrW@_$6!^xhq8D)aU+@$O9$d?qd4 z=SB5r)Mm{)AKY)M_~z+sCMJ-J#~pZbV6`f@=IHl|Sf~CPAEJ*#K}x!`5^X|*(QC8` z^ci%$j_8}-A~%6pb|6|emL$BRmRr3N{ov<_d||KC1}%*MwZ6Y)Z4hZ(UAd-Oc?9)L zTl5ZXL!lblp|fo}dLVR6>*xuBDgX1(h^;xTGwD?D)wi6n+d^A9(L>cD#Hxs+ z*9xM_6X{2};7>c;66hXP0G-!HRYd!goQyHq_GVbwiC3vE7#>@uW5 z!9priIL3c-dRCFpRgA5LZstK|HB~|r`7vIZ%A=JsbGNRq)TY97#W^axZDt797j6V> zCtieA^+;MEufO2BAX!d#M>r(YcZTt><|bN5jSg#eB<}lKR}ZFc`GnSPb@P!Sdt96s z>?0*D_d(w6xR+Y5`v`@qg~XOc7GCdY%kG<+uhDS(+?b*5OTOZL4xFNDGl~}o{kdeh z?F%{m*KiTg#dJKZtFu5HUeuLB@aFHb z@;La5MH){zK1Uv-oB-Jp7n0no;3dLWcH^$WCOE!ozHpKR`&%kBCjFwF#f#(>e=r4+ zrSzFl&31_gUdiZMzu4dPBq`V-a?U4#gsNbVyNfcDrAY$QK+K6 zoUrm!IPp__(QpoR-1FE(YNJWMta9?G-l>Xyku`!>LF`(F=au1O{KtOudbnzZ%YwkE zw-pr?HvkhFI6CJ3DDLO@HgD5+g}amsXcXO{KyI#biX0BYFD`$asA#wni(f#KHSg_s zsqNAsV*@1lF78C~YjR9Hk5jICT`b(UttE(vrS)bIoSd#PLFqdZ$i03xfXv#!v(mQ( zZ1J=6c+ZAk5SY9(CvlmX-mh^@P)0xmL|Q_+Lvkb>Y3c4px?4I$hLV*lv7-?emU>6E%L?9-Ke07T|2@KVIMqp|3xdK zp@tA&QqVNZCA0D9Pzdj5mfFq#&<&CX!FWbfF8$*B5 z|H6Xljb3fow7xtCIsp^&gY;3)%+Zrl8eS{&tCp+LF#$#*oQ;N%U%+u&k65>fquv`k zR-84c94@IW<`BLy)BNWK+o+X#`#=)8=6yajn(|mvm=dCTBz4n!vXb&Wt`j-=zE;Q* zFFp?Kd-Yy?-e;Dm;G#J>JUFM;@)JC@U^t(?iZKrnDIR^&^WZ+roM0+Qv5&jq;lX8t zKBvCWfYWT&kD--8r1vO=2!+?y`(u#}^BT`@0cd-N^e*8}#MF|Gc0O-PZs-X#Qhh^U zm_FJ`@pVE~7&~|nNn=U;jd78N?Lkoi=ft#`3jLeT5=w~SWqE_C*&P|>lWG>+BLRqm zu;StFnUb0s@6`=HBzusp-RIjkGz)Kmgq4@tp`GhjTRoZHGt%OzH)-&TI&uFA@QFN^ zB5L#-!M@e9H;$F17l%gh0!dY%A-SXS@=(Kc^tk-&bvb%!!1nMx_+oKsca~Z;!#2$Wi%e8+z+OI@qNBKntN$c6td@ zBKA4JyXTzcfBHv1+JL)TN~&9mM>F(zaFsRdacL^$lhj?V7r_B5rR&wELoN=|u!uMw zKbb#U%uN&iZXO@s)c^6;TX+_2FP|uw@_@L#gVwYY~bfNR&fs%L2 z*^O2W4Bpt-sG6FcuJ;G867R*ticg0YdC-#G?nE6f7=*%(y%W7Ds*xP)s(8a{1G18F>{_@(MqvNcLL5x7ZeXrhTN$WF5LX}n0Apwv+ zOsF_nFY!~n=hC?$D9(UI%~U8FRj?^sH}EHcu@};Zv;BcE1wOpbxQb^1_|(11{+PoE zOxk@+`V_h85XV;-aj!qY#&%E5Yl`cV-qAwgRIq4CS}1jHhaq3uf?$Ud$e1~@ zTa@P3O2T+=C_s*U-2It9udr~O<^G!zMyH{wZBjYRs^K&|YJwPtCdSff#J;Kp3_be2 zMI0Ti;ElCj|H`N?-(=->IG>p7}bG>H%_oDF`=Fw*W4Zc(3m ze7hrOnv4ksOn>&{;n_-WG0=qQyRMO+^2hUP$b(?i^7LAGw2kDv?$_fEtNEME(l*{_ zM%*>2SmQ9|gk2GEpJyiy1`QG;DEO`EHDPd~dqkwB_aNfA63`Tqo-Ph_`Kr0EiMjV6Q1rRLI2a#cv}-lLF-7vQl}VoXTr2nehukCy!N zsp_O9WZfg05dDF%Ce2`n8E%jPtNFx)rZ=%km2oQt2YuBi-NVOv59fBDBf|wKs#xOa zKANeiO5jDg3h{{q4G(SN;9PvCxw~#e)_gF;f_MaT3)*gc{lX&iI6r>L&Qy!ngP{tu zvS+G`sGByDO*x#23q1i^Yb6Ha7UsVg#nVMVzL*csSLii;8Y*aXZU;+6STLH%oJ>2t zjP;t)P0{P$uS(v$)zCQKNXD%{{PCVsohXDS34GKY8&2NB%Ma4{65ZHRIQ(>HE8ZnG z347IA-v-{>*zop02!lx}=TvFR4Rv77@Nao1CuZy`gAe;G5MmTu+YmGM zhgnp|M2RTh1d&?J;@!Gz$nly;s*+#x-OO3n-HS+q80pSzB_1+DDKzeAkp8O4QrvTS z5BI4l-ahRm{?Oohad`C}L9iEs=O6^>k91bs6J~75vPd(nq%^*Gv$^%tzUpYs z{xJ|!r5BU=(X-B+Dn6u9joKsXW2G6-(>xvy67bckU$#b`q6TF;XtfXvHh3R{Wa z`4#Jn3>-f2J^NfE5`4#Nd8CcAF$)Rekp5KE9t$a+Ex}^#Tq_-!)SE-$MOUy2Q;ZVE z-sQHn=_lna9JHAH3VBkp(5_u?dxlL(0H>Er7qEKc#C)X5Qg3u~`8JG9Gx{EMh1R@sc`g=tYaZ?B;XctW?IS#qoP@|5H_pqkush0 z$-UUkqIap$_nu25|BlJgS^NGSHlWiezclLXi9yowT18L2q8o{W(IDP35_#R-;73N` z?7MmE%tpd5TxkcL^z<@j*VV#}xl){}Yg{kg%G>Jch;YC&qr^cJBlRet-*muE#@-H$ zly1EyoJnSx?rKBQ5kZj zO-xP|l;de9-(Ji$ZzY1llsf2w{}m5#ikv=n3$<8^A5&6Jgu)j#Q! zQpUpyLi490xF40%S6w!3Jv`EnnEzTw_~*hW+mNIE^JlFq2Z22op`Z>bbkqM_L#~{} z>3I&;lpgwfNKgu%thAdOAMZgnT?niwJ}?pna24a)Pm?rBGI;RMFd7Wy*QGtE7ha(Z zuU>B33*+{GVi!KYo;C2j2LWk~PkB5XjJ@UMhd1TZAV1TcM-WZ4@U6J8yR}mfKR*;T zMEpC_rKtK?$!udyDoWq)bozY|7T=OAQMZM~kbu`O%ag~n=#gcAZ~X2m^t|2nwHuAQ zckSEal9FcjJ_D+Jp~joPlVfz`QEDn{lKY7L`WQVt&>~ z`XKWwZI{wOv)#;4U;#;B}IO1uKf(n%*WGP?VJ6g>^!{IqKTk9sG`? zwQn=?l8Ey3vtiMzHtjw>j3pP`a}dCIFD^{1;!2o_a&~g6AaUJz=Dw6TRd)_P^_xHI zu|VMV`1jTH)5vv!){c*HnVIov+?KyTHXpWPLx2nTbz$=%buhV@pRO`dWiR(e6GARG zApk}u=D5b%u!IBg9z4I@$PRElJX zPg+h!u2AuJZ!BR|ntM^BVg?-kw;ho|*4A`ApHQB;X2ik~>#7QdR`Py*Fm ztNXH6ow3=wcjb(c5JL_!**9EnwnDl;eTTTj17r4CN6_}mQJa9a?-&4urLfS0VPmVSfV{`Y&h{MUabJ$*;hF6M0_ zlDr28#XRnAPIvvBgfarDiWqG8()LqQfZY1lKlZLwYjjn~^1^+ERr{+0>g-vBUbM6c zYGOic(PRB@1mXPc)6drrBVK&JQH!#UrR)vx93tVcH#-$fZ`6z*monMy(y126C9c7t zrcr(!)tf@>>{LALvXbBKgD8-~B_6uj59iqd#v!8WlazbW-v^ds9pc;F~qWNek4CXU+>L3 zzBI;g?1y_R)t<7#6tUgLqr#_$Xc$6%#`nO37f3Nt)B{6%wu8=P%5`h_T7VffZo zTrQAyL9x)^i~sER7v*%nO_nx!vmBH_B=G;onon+m+Ou^cIApCv!U=#Eckh)hM8&a7H14g}vL0gRT>DcsT5M+rl|_ zT+=vTqjXx|bvoGSRhScb;Q_B{pCJMX3Qe2CI6>j$^Fibbf1k69#a@b=sMJPQ==a_% zANokK-X#t^6Alu#7KdMrs6PlrMTX$7OPMigeC7JB1y(f)0xnxhR4}={LC3}LN1g2C zg5Ry{Xo7G2R={c3u5;Tuic%q~v^J-oHe)QWHtvoTTk-d|)}{uNKv-Y&6=I zuRRSav|6>5iCh(OcW@z8k;dShT(ECbYb(5tX;`r?k?*U%{zZ6~%I(dEj=6;jmQ*If z5HUh1HzBa4p;DFl(~^~Y81ksws5Fj{%k3qIt!35xBH7p_wBp!KmCPY zs(y3v9{Wbrz?dB#&Ir}7oJE~<=Zs7K2(N6rZSy|3v04%eR)VXm5Iv`e#SQ#<>V^MI z*s^9W4Z)qp|IY7c+ZFl4uz5}UG3IK5`(fuG*~ntHLJb&EU+*x>?{;`D9-J?GJ}Gwm zkY^-RbZHS1*zsVO-*&n7;!fYoYU&fAVwbP2lG%#S9J;rZRSFdL_0(tN95clZ2itE>D?tN# zxit=UGp>&c(g+MV@lNKS+W!__NhKX-W^WZf*+{-mEt|~JcyiFJUHVLGK7TNwSVbn9 zJkCIAY>Luie~0&c$vJlAP|R)b2Y#vFCx_|#_AcNm89Y`3o5b(%ocBh1yUvrF4X(r%i)?sywdg?umjM^1 zLO4|~K7V|=(HG!YKdvft@M0nSR}ULgNA=$4_ZWrpX#>2Z3kM?Jz=}OBJbB!@&VAX@ zJC+I~TB7(DV-Z{gnle%$PhfQ?fp)N6}6;?+x+y~vq9XLOXwsq)T zCb68%V;hCRGd->;ZDz};Ax{i^#uIic*_oJ(G-tLQSb)di$X+b@!`@f;!hbgc@5w*$ z(=plm>exCs0M+8dmq688gw@>lmgln8}-UtuQ?5QT6SV~T^@@wTgaFB zGL=I4-GzqAaa-hbCV~i$R(+X_+=9(d<6~buz~Ox|*6B|l%%W560!kEC&}zXpKmQ{y zC9N#1T%4&Q7k(AW^oPB<_;=kPhE_bw`7-*MSQ{|8#mZGC=r-ioI`tq)l9$ug_d3cy z6}!QNfIy>WyW?MWOU+ib+R89^_Q&4!;?i<}c3-x%`KFy67L|JcRP-+?EuFOF;a~pK zJ6Q4cyIsQ|QdQaUcjvi9xn7Oiekw0_rr+f@DK|m$58HYj`*v2^P9&IPGvn+yNNTlN zJFBw|9k!9rDgAk5k~W@X`rG{qp*@vvVc_T~Ip$s8wy3vXD6r#68#eR3j3!&6T2p-{ zayctQ`5*)i8LRZa<230_aNEwA+?A5R!@{6wU?@(J;vv|cX{N5Q#$?c7{8l}Y8aKDEYd>>taQ;`G>f|>Yt=698R_Kwzpyk2d+?2sNC zuRH77#A78Q$k>-qY<7zie=A&P1Tym)CAP%I50PuREU~F*t;fiaYhDd~AA}SLmj~Z! z-PovE_Kt;=Y2Ny(SYbitKS*D!|4Bpn9!Y_q>;0p3nOJgpYf=ozo!3tBEyiWTqUc`W zNujRT>F`|}8f4f1vN(k&_npXhGRWoGF2CFLSHT)F^Z>98u57ib@qbM#Ni=Sa6VF+h zP;4_Bnt)za zew4zQ+tkqg)S53E`Nh$dckXpO$1&2fV|Bj|A%b(j&69?I{dGy&fJL^P4piN9W{th= z^l0wLnd4njE z;wOH)A74zzY0w>(ejyY^Zd~Arpvw?BZ#erI;DZi39(R{gu4m-Y>t+aJGK*Dd>@G9V6r$5wr>&PbzsKquSq zt~1$u=xPm@_k;PLPn>t2w~c%Ui-sJ3_xV>~aImr=ntq}zT^%MTyX<-OOy(WH_eSql za5bXI5`X9`X?on=L#^=nUe5E{phmBb3)1WlCN%xnI*mR5#>pVhX8gYe09R{=+rV6z z4{#%guiU~olN_zw1>&KipA@B>4 zTuhAKgX>&WCH}YUAUB1{Nz1LAS&J{i=&!ZeplF7{m{Niiv58@UkK@8M2%z8YW5trt z#t>K8miaWCZ2L>r+rHl7fR(Isuu(GVyz$?Y74{W_m_Z#ta$S_oMq(1x?KB=jyKpdI$)oQ)JiRl= z90>xt9=Ya&YMU$1YTgq|nWmbo%(TDg33RT{zEljc_c6#HKiMJw@I>F^s1c>FS?kfC zDY9{TdK!`B)tb4(l~DgkN?G0>L5dl@lGtTgAcz_KqZB)kH%?W!1r73ZkbM&kPMQ>r zeRqvYqCNnp_~76uc7T2RMS)4<`}>#a&I*o&#+XGVB`?Mk=@4~wb&^ic3r$Vlk8$h`82-Pvw>1DP%f_DT^CMUi|mJOfpf!LogOkZJNq)D`~?eQoL{Iw z7WqRvjgL6}7#C*>`Z9U&@%=Crp<0O*7=oeR&vHO3?7zs7b#N?sr0sQt#OreH7>Jf8 zThIng^&YWQC1cl9kvFNxFF0p!j9ck;NPBu5i9bwIh4MJUq{y*jDo3pG_nAV=$*?Us zOg03cj_z_uLvR9eh$GOcAg+Nh;_i`WA~vB$z!f_)c~-a%_4jDrfez^q2c}K?w$n2N zLwXJ!y<3E|i9#VW5f1&3FK3UH`H3egbHRDc5Shv$Ipks;+MHz2cM4%TYoS#Pq;BlyMSXstPU@(GGKr$A`c1Jgt2E`5 ziKfZX(7uykynjtsck!zC_tmw`LrSaw5EDd9lxdnx!B6asgNd=f=fAS->ssdu&1SA> zp|J`AC!bcidgW}hjfMAg42av}bz~xopnKC?zI3x zM33>Msb>^x99;yA09t$QC?go9WEJ|4wRuHlYEP$IG)_iZAb|!nULu`DoVFjNRoEl! zB%p)U+Fea^qm^X)1aTX=NY$sYIszjjCtgET;t@MoC5tfRh7k1uVK?6cGbnn(mzq^h zbv=^TomDWjwd6b@YKo-iHqHxcXMwOaO}DP!xY~XjPR*pD2o@LYpbj9=smql;c8+-$ zdUW9<+RpA+41-_XyLiW-fFW*Puw+~(kWrD4M;d)JwOiQoXKnBlj5t3cNM(7*M11~& z_$HZT-&0pGcu2=KA!p2UYTr}g&#Z-@&u|KedDlUpk^%$7<#0T=jt`Kc z;#5R9V4_ipGtU_>df~zsVwBR-(h~IeF*fr<(etc3UH{Gp7E?9-`)(lV2~%m};@4%( zw7KkPpTpF&@6{>)%@zLFz2iZJRHVai!+X+D*c&=#URqYx;mnlnQ!g7E8$ycycT|H; ze@&y7%bA!I3b_d)r~)2-N~7<#QVl!^`1W14>aBMiM*_xae}%<_qC)`7!qLplKKH*+c3nrAxAGrCfY> z6>t=_wO+lzrzk5eb!}b(Sm^H2<<2g^lUgg=L`K7AetPQXPNN4fLUTUS{gq1Ec$JuV zbq+?%3b$rmyX1x4(;4qpzxI{G^Q?hvrgpsl4JYCO@ah(J@;9ijav%74nZ8K|I6%#g z$X@nhoAp13`XLB(@N*vBFOKTf3;fvQ1kMF+Jgkq<2*zp+A`E0+Q%^0C*%SvU7B%kR zf~RPVnc8D%E9fsP2i&vQfhw>-WFEv)VHKOyWHDDJHjhSXuPYA&9=;e^Ze>Fyu3gTj zedR0$&E|2QN4T4k^jLBdC&bG}mOf5)OFnQ&9?fB0e!GJ}Y<&3jR!;oft7Y7h2#o{Jtr6Lm45j9EkSFLqD}30v zbO74PF#Kn3f*A^hlK^>cr7&n!oTg3X&2*UV0w6q1aLZ{=T9)56;+#Tc0K~`xwS`sk z1mF+dD$eWU4LKMQ1k!!xFE8-M3^{ZKt*5YS%tJa?@6Laiu($s;t^^BQ$)^W1;BPiP zoTy0c0;u554um?%%%tj5i6<`xb(bRxM3M#+x71DT7m;t3m8<+$+SYk_ccf0fihxOe z9dR+2Pw@K!EdWxBGF`wJJ+Zc0wd8S|=plMj+Q(%g&#y=tb}B^Ej~UPv;auSR6XnXc9(NULaIW8w~mz59yP*i=L5bXa;7s(pE;paw`9MRMWh6u;bbz zMY6Eel9&4296cj&Q1NuK~cS;K> z1KW`r@8fXGRJ0IedsGF7Lh?9mQ$NJKh}0lj%7Lj6O?;;+KqSTgOa%5!w0QvGMiWQq z`Kh6W%l!C$;`U+oj=XV_aR5RPzV;Y1`ST?qhNzhVXRwmZoCs@_q%nP+HkV#Am_Xio zfnK5DsmW3ND4=Qssa*D?fQ1OE1N+dR*=}jRZnvbQgs_J{f}a5%PKWSozZ-5?_WL`E zUpMqCM+p*u5{wCz*?%Kv{o%XSLg`4KQ&#k^X-yqkvX~1rSzD*PX@Klm{LCWU44(wnLpN{K`xYr<(wp_c>X?h?r7?z28nds8=7b#nr zCd|an&OR5u5%H-| zg-Y&}A>q;9r-_s2%f9E;%xw0}`V++;|3o}_7gK>~S=^Us2JfRm z&^|&XV(uD9aUkepMz$zV++Leh6dM{^_(1ipWP2K+kWk1*>I@Mq>UnOld!=-43eUFC zQomCi!TtlRSE!Nal}^YayLAKX9qO-9t~NGlUf;@5ExZ~>38 z@hL=o@-{W)Gdj^A_h+AKC7D$HxW0#b(6*~Uh9zee0dN~xS@)^wd>`jWIV2PF&xgPG z6f2OL+s}$j=XvLBzAnMSF6UhrP{$v-7$S&R~2+x@J)T{}`>AnZ{4B~B*?lp3TSdN`EpG@sRPHxyNmf9?qK{<9UAl9)e| z%t9<{X0{RJ-*lItm;t|dEDnW`FzEKU?@Maa&BL^MqRk!qc3D@hH5*RwidFSrGW~n~ zi%zp5=P)?AtE&owJRrvw+U-}sgLC@r6@F$92Jdqt(n%LrYrv@5E`E_vCMuo2>{3zG z_ZXLAOxy7{}lBTn`C1Hey?k6Y~;dhNu5ijNak z81Z@r);Ae>FgQtQ|KO-i z`TK#AMCREt{Ra>*JdD?{3$LiYmM5>M^WAs5`g(u8SDpkP;+Iv~)Z_)CX8zG4O?5Ww zRX?2XE=Hx2b$xa|C`6#;sm>OI<@>K+J?1IxluQBjP9f-HdQuPr(8{@X`}VXciM)E0?}~P~a%St5Vq(v!tO(3-8G;t1 zr6I}FULAoCGMbN_RG)W$PHDyJi4zFxB%qOQzULBY-3ykK%$ z4$6Z|%;xj^{Z)LD*F8wq==m^!VD{8H_d(-yP*yf%K2yjtxQRl6d+EV5uD^HsK6CqS zrA!LdEVI+o%2uJs1kkx%|GqhAI_zk;oz{>!_h5Bo z8K8H-5^_SAJI(G)#VZJOz4@@YA)gIn-)~z{RuOz1>Z$X&&e!(d9{07dxBb4lX?EXl z`kfPn{PSsGY00CldLdDpRp;>#hugmn5T8WgXXsP=bUw44%%$eR!E@k(12X3Td<o zRDKOYv|m;h4sI_t7m`D;@W{vBCcp3DT7C8{ea5hR!->wZHCxHgD4fa~`_H(67g`*W zRD-swKnK=~M(xB>kMWaoLnm`@dZmy4&QVONqHQyEW5uuGy7@3?e5+=3$ix3EY`>Ci zMFHKfeR357Nirdb%gSG=`4*)3*SaxMotUByIDn4%({Mnn}tgXM|`<|N2lH9ud5r3a_A$jYk1a zYb=t9P8^?EVhX~>HA^PbNJDwZ28xzBIi-p}NSz123d@Q6=oL;(5IY}BypDYI#DL2_ zWxvI*@Wz@dIP}3Yq{rirW{qH?JZUtjBu~ACma-pS7m0Ff2L?&Q1>NXq@6K2(aFQ|La_qtl#jFF$q6%Ct^A=A(l$3w^IbiV zbc#ECK1#e%br8&ee4gEPc6L%|<%ftv^#r|CCr8r!?m=?s3i5O{%hhY<RAf=q0SbjIF}$?g+$xo`gaLps&0Nl8 zN>HWF=}IIfWzes(mJOX5L_7W>NZd{peFFXV;0(OXns<+Bk<-kc_#-xE0)iN^COTS3ssz{GQ`L z^hQAzggv#3?UkJOD5?kaGeOOh>KuK92CL=E0w0NE4HnecY9{IB{7j~kP@eLwBPpy& zj{)#%yz~N@CC~k{L8K0B=Q-kS!c3%fY1o)yPr>RQxqaCWl=oUCslS(|%KUz)PX`gerdkg% z(J4o6Ew4U2OV)LAv_g$Ugzy#)o}Ox~sA^EEgk?V*^-Fz`t#o@%BJ44yvEmnhYzHNb zc}ShE+9e6aV=-4W+UI6vEzfhdsO+sVn>249O-^E&%D*WJtwYjv>o_ti*~cfS+n8xt z?Og|dr4H(VVCKYG3Xt3RBkY~EwUr$mf#UGi_o}3{1V_Q=I4@F&FIdUgcB$EY){+M< ze0$?Q*!$t>Y^DN-bcvV?4^p`Ig%Lyg&Wna&J7z}4AAsaJ&}-IZn=LL3Qf7Q6nMB&$ zE$qoMV-p`d1p7`RAKmdot~$=7D(my@>41p;&RaKnEVZ|9oko4nMJ~DsA;0HKD?gA3 zRu_FerR$oya9S2V&D;kUr^!a-j+fXofmRoFZjmL|E!tYeie>W3G@oo_^6b$|eYKBH zn+W;TInmhpL}f;xnwEquR<^)W&Jpif7VxA&MVI6(VH|sdMi2RoKq?|#NOT032OQ@K z%L58 zi3(Co9{a76eiA%n!>+UXSM$4fYLosD@uUr47qq|JT3GA+FR*rEVp2-kWor6ak-(ON z07RTsz1nU`F;^z0T9a$a55Vpkdb~$L_!bOaN#K+?9s`9fJtf7eM$1ggt#J_mlw;#> zXacE%;nc1Mr~dBy^R2#DA6ga{!Fl@u1>_EDYIRi5h+EDcDXEaT7-kcqH({Z3EIDC2&Ob_F9-i%x6mp1p2;|3Fo8`HSRilw?GruC(GW(vp#oMn}qB6 z)<<;Zd@z|1fR43gL!kpM7x(S~_z4iW+dy5SSLd|Rhs!Q(C8l0FY|3}B4 z!{geo{gPTOF~w}o=!xzZ|2qH@-0ci20@ZQ<<4$cb}TF?XKhd z1+J=M3g>zcecKyZ#lhjh6R+0DoU-fNtAnL@frAU5Hc2XdMiL>`S8thES=B;*f}y+# z5R^JeBdSFCO-nJd#!*u)WXTxz@+eE+cRq$0QCAn1I#vZN%H!^l|K@zLl>bxwF7EEadw zp$~Nenve6{mG=D#>1gtc5gmJsZ_eDexwB8b&h`)ie{XJc!|;KkYrV>7>id@d;1 z%*D5eP2&({Wqkl?`}ESiQ*jp;2N!61KwC3syD7j%90kHQO}E#&ZTxf}KwWp2%iXmO z3wn1Z3uC>mT7NH|1b-~s+q0x2fMQN?bBze1()qAFr+GE}Ic$95jyCmkPW^a)^M`ud{w2aAyy z*f2OCcM;OL4$+*Me!Hwdpg@4Rs(8Nm(rO@Kl~(!(_dW?V0*R>{EtQ+C)VF&SO(Mv} z&5R4-Vj%?rxjS&94Fq9R-Yu*Yu5c}xa&@me7EabRwD^D?|EZsLrD!k8m$ULN04-my zsn$RtmB({}!Ff|McRUs~R9sd@F5)Iyy+XW8}`RKUz zSl3F~Y1beVHK7yhMH|dGkS25H&Ykbho$*%A;4Mk0=dUW6LWN8M9ISuRQb4;RZZhY8 zhN+dpJ3gudtiCQX2lM(pc$-P=2LDj&92npTBryJo>Lk6Rk3yd4eYKcn3;D=@cNN-U z*s`@2rI{2ZNy}Dv^6eJmDZlNHuSP+$>(mfvHjrc#<~gG%M7&)zCG7@&KcY2n`{N`` zu~O$e3sgs5yZa4hd4;%vN(P57oqqkUFJJJ}Za7df%fGZcnQU^+0t(zBPLmN`N5?l| z*%Nr6|H_l5qYxvH*|g!Yc0-bVGe&tb_ZAl;M3srON1c%O9dQF?h+^eYS{Oyl zcKx?TQSie;i`B_m2(H?K(?s5@DM-D=e3sAUicm(y_Lr-(-Puz2O0bW#;eEE~G&u|f z%mqi!t5M3c+c3%!z2Yl=@0MR18#gEY{vv0|GR9RufEuFy-5eYWql(}j9vPwFwku0* z`U*Pi59Fe9(DyxflcDd?&>@&gGlhE{VRwtQcd~4)f07pLd{N~Mv~hh`hi&}3OYVfR zpF^q9;LzoppBQSXXaU{_&F-C{r`d*E|8#x7Hq+ytV=`g@9SFqqofoG3_aiKDk z<0zsqv*oO5_cLb^Y(Dw{%l6`heeB&$R_xs?qVAa8S$oZPeUY%PemA!L^pED+&BpR^ zboZ&Jj4X_S9-F2=lv&0SJE2Y;86n#M=|Q|QC)4hC3O3R&UOa)%84i;|uXg52XZPI~ zZ~aHxArN-qt3^P+zI}7!y&J=iwk+3z;PK6V1$8}KzDXhFPAz^hyW-GU{ahAbO&uKZ z3|Ss)bEMpwNin_aNJg4yv;defPYTU=I88tBY-#oS9=ve)b$vAUdSgnlUS>2izEC0M zrXvhgPVFy-bI9l5O($)52tN!i+7O@Sa;pN{n^8CIy|+SFopV{k8KwMNiZ@#c1?k2g z9{m^Oz`1P;aQ2XJd$rnu#RpoM4+0n6IoAhFyoF2crwmkx;SR+B*iVwh*#6n> zp#5TrVA#iXx@X+9`;GC(vek7=EeL!{PU8^<%J!R0ou@OE=N`gHx_)FZY|RtE)@ehV zLvr4S%M6(1rsn3L6g)PXQsp!v+1w@_H8rzf*Q)K?c9Eue1P|{weZk1Mwa|W-pR6}u zs!=&Ac6A-q=v-P_0`xE?T6p9*?JbEZB=(&bF5< z2xh9d|MHZt(W@OM_jzg%G{tR1Qt(x!@QAQSF@vvsLpE;O+V`fM|L&-v9X$G(FdAqe z6*L$o&Is&^%M|A}H1q|HfAxi&pxVzzn(Z2%ny~OadQ~SR(pgR3yE+r{BKV_vrHQ7x zJqMr8t@p30UhoUs!?%#3eWZn?sV>`jqn%MvTYC~7N81}idFUc^2aKt`-44+LUJFFO z^=8hyCZN*(l@8CYjX6JRgBV`S&eVu}G{9ZXSZJqkuX@pI$x-jnl7VuKIpZ9o6QZXA z;2-pLP6EpyLQ3teKrkp-h9p=<2xWLAd6F5E*46`_(0;>UIXoMbqQes`2%b3PzdJ6) z5_1v|a`=ouE=?Uh#FAAUc>X?K%beOE|zWkO#hBk&d8|ar$i7I zKIxv5kU{3f8v$}^%n`xDy&0VXhD9Id7ccbh4%4bMqhVVM=Zk6fmnJnhsd2AOPc~VB z>{4mi%%L-fm@(3}VPWLuc}pB^n2NuAV$CVceYTBGyB23XP zAuRy*_G8@goVnUtPqbHfJ;GUNL#@w6q|G<;h4`{YQ4Rt$s}4bIKt&rP9n>+#VtkLx zMEo$$T)s$aRKe7+B!~vw>Q6+tVl{;R>SZ*BzxZGzu7om(J4|3{+l$5y%7U>Y!nuCC(vMC8YGjr+2f5e#278+)! zX9&=(tTxjZTh z?y;>$ub@VcxN6e>Eej3u%=bbdSdsyfkGolM^p&HTxWso62#8qwKy6BMmr?qNlUpV~ z7arE18s-P^YWOvBizp;uYVnj_4QTKH2VJ2DXniJT=E>c(QR{i>e;YN*8mQmc*O6sg zr(UJg$dtsy5~C8v$htaLz=@OK(FB9h+sWC9n|nWk+qrS^>g(uu$ftSz#pz`lA z9!tkpmAN098}I^9@+G;ezI`j5ELITpWM)cy{F2Z1-uZ(>^Z8eLbi%g%s4!Y1OA+Q^ zSkA_elj9SQ(Cu%#PmHy&vaf_r$+I+kaA@W}m=G6|C)O^4Ejys6JrFu6488b%9+$0;32qk`4kRd0y3@=2ejz|I`Ij%BzkE@7zMY4HIJ`l5TDm)rFq5r<=-Rsl0Rs*36wA*h~u9!)ob#wq`mEvL#G*(%)O6b z9eVa}8DB1!QL~a)kz()%mo`&>o_#r;%F{l_Rd0>qu9h{no_LhJ3gg|v7?KdYGb9bk zItXeKzzTS3tcJ3oQR4A4&-D@hFf+V=Eor8V&1lQoCtz$X!waB zqb<4PQ{}W3r#h~^2?P_S{EK$HFH`9^SVC5w3gQcU75>|2JI|_c{hEpBjT75YzrX7k z80_c99aNgWOHbvP}>%F~DYQNc?&RD?NL zUy3An%tM*Rx4lTCL$oslu#$E>4IO4ZrLD>CWd>K#x0rXC|iZDjIjG*HPRdOeYT} zc_21`^tDgs+F5)Jz;k6Nb#+<0&)0f`L-jXYRS%x02+g!o-ToBTCw!2#BfykUGu)`r zo>xHXil?0&@lS&jG;ST%@^>ZoiGKBA#_UbAJC*oE#1VT0nVcWuSQh!v1h;o#icBsB z9*woGTh14c@^zoSy{2Ulx_nO3ZHP)e_=h z)ek6UPJ47t*c#F6?CQbg6lmT5Y{gfMFW31cDiTQ$Wp@~d?#5;GbIW1F&0&Ky0mXAt z{7>8!waa3_PmfULr1U`>cz8i%1gYWkYLd!}IX@qDf2ApPO@{Gg6>>sY;E@W+ z?%Rp^vn!^Q0(m05qKrfXR;Esf*|#e5OS>BHjy(Z&p;fP;kn|p;-2E?XxjB8uFEsY^u19obUfDAy+@TfyJ1!ZY z1+Vg6B*zT2+a|c9&IU%sgwCdo``6V2UNf|1@o3&7Tzhoy{}uP0QB7{^x}YeE2#SLA z4$@T!(m@d^p(#BOKw9VsNUtsd8@&XCNRSdRQUxgqLQp_JO6X0h7?CbgLeH73wa-5H zj&a8x=ii-wfRKEdbAI1^`};iQBJ8Z1NQa=fv#u3%H*b_=l1#{K^pDv)m6N~Nk5a<| z=zMYnvCP#z=kA`SvY=tTkdtk!JUjl~y|4foaOhNa5;St_M1~H7q*zGAe0rcb`6ps* z3m|Zqd%2zce8xvPy+Bt2CdVAmJ-k4ixF-tQ>O?i}k9yPxFKhSy?$DLa?27y3{Sr@4 zbwNj!b(8DNZfK^Gqs5)v1H)SwHc%a^U@8&bQ@yEBOKylPv&7H*{%9B;8X*0+g++?+ z4$YKKO1g}VpQBHx@;M;p-YCdDebeDl`PeeeNh}!{ zSj4QIvB>3@boQ`0S@SP(Sp_UI7DdkbKaEG6*h2=~ZiZxo+M@&XKf#FC+B+$L$?YTxit6QO)2j@PP}rpX3xwEiM;aBLH7)7 z=sBn=#J+lm4L^^C7EQeh|D@fuP8i)a0?pbN^Mi0J1cYVb;P?=b6jf)+;oDb%Mt3Z7E1kRkD8X z3S=7qN7TIeJAm@qfYl~d=1TPc-Ik^>lB+0nx^80%peH$4*wD7&BYDfY@QhPg)=NRGKxjseg<~8nB4hu z7hOg##-47e(>SBq-tHR^f7AA1*9e=($88VBbZ|)7`Dl_By~r}pofKlvzh7QBo9U|D zJFDH!oH#Cv9~izG^9S_=Dg#8luco&6N=Q$0K6_^US^OhZz!F5Da7F0X zY3vspL49hh6mo{W`mu4rpqPp+dyx=x=%a>57f>2<^PcXV$=_FIvqo74GMX}88ZA<3 zCYzWD)Kd2twFdQl7t4Ew_qdhUgTJNcRX)->yDg9CpIGViWSZh3Y(*_}dCLn5#oILI z5DNOd(axG-=wS4;GEs(SoZ=k0kr9hrQ=!z(Q@#y>zDGnV<_U#p^{`?6Cn{N6!_ehr zkmMA{eK%df{(JH6l$~M5i0!{nM_b`*dl_;iUplBPgh#w^d*kl$R%{;_A9Tlx_;;IH zm3h4_F00&P6G$$OM+Y9ns<~(nA~GRUUI&NYD4X91`-Esjh3iESAYt~~s$RqGHnwz= zh1{-D4$5tJRw?a7g8!IXjY-A6^9mQ#^M%F~e(@dos5tRq=*;v~#m1`STEWT*Dk?KT zl>k4?QNt~P!lS(ggpME+ER!rEn}$ya9vf{r(@oXnRu|FMw54>~EA&T_1oOdO>p8UU zsrru23XZi1vVLS`Cui{QJ+70*$<|a<6}ScgreKN^<@z$53Uw-%jmko04L|$EiW~Zn zG7w22&{4Mfy8@5q4I{!pIcQs?Z?`WKQyO4VB}aM(R+1lu)8r=F{GDH7b-Iz2%0V z4QuC=I>9BV%;>-r&cypHJ&UIV9i$&dZZBQ2-9crrM3^^h{!}|^9*W#qT{_wsR@+N8 zr1Ys!erEj&ZSD~OAAO9x3!uf+x63%Z4(=_2Y(OIp?13_J=S%{-oG z1$6vecUli8JU0v^7_Yp5Z#0shW&e!}TI_juD(oK^!NdTEZQMAeIvnrFT7FLXg( z2w3FbL;Vi;y5qqMS&2dH1*#1Z_OZ-g|3SiRLNvcUrl1AW>b>wUSkGVZj7M?c28~L9 z)^S0mOf;H7Nx)i1I5k;YFtsB(J9%5XCbh$Hlx@9+$-MfWhz5UhZf>rVvM}$DZ`Fu% zgO)c{R2tIH6;2clTc1yq^>T3$VS16)Nve>kWZT-@1aAlaPJpHvGK_Td8!Rxfm;SN- zr^=E`R}DlktBw0!4fpYK450g3S2z_1@7a(i`6>X*aDS`$N@AK_u{0@ z%2W?pVpz2$z%K_M7@(v9gkiU8d>#l%L`6jvy8he<&Jwl=09em;MvGISYeQCFNtKt= zdqZv0opj7w%8H7dU0mAlqhh`T9CSvxlSiurN(5#Q08FbB?u}jtszNnKPQR+W-0)!< z@0;ePrdx{HHtyt-$4Hd2JsS^ChV2y=7NBk{fH&9}3Nke`G=$6AC5HS88i(};;D?2Jav?O{hZ>~tp3Z9FX<5Y_#eQ%9jEz@qWAYH`YjH_!tz5G9;L;X=Evndf za$bG)wy#=$#AZGZjtruIV; zp_s}?^9F7DPHhQXP|*R%H>kB{7&UKfS zhlhuY%M=RGe0Fz(cZ<@XnD_5*U47uXLPOa239={lQxR6dsd((Sv5l&D5SnnzxgWJ8?GNZ;&wx>6gl_jja2!{cfv_sd4@jjTYG;a>n z_wImyDkaPC)_E^*7$JuC;Em|hTeQ2gp9 zellh6VZ;WiMpaf`e$)j5xY|5;qCfgN;(Nd9v(x3>6X8?}&=W;MF)UZE_;VDOm#@9J zicX4zJ|A;8fB5jB1dFk`Wqea*5<_By{70$Htt~Fqu$>`uTO`vBY3Y8LsX+BxZo^tW z9c_S^^3;mM!6B*M5ZqnO{G(71UznYp1r>{#nQR!7_ZG?_n=Z~T0)~ICuP+!zT8f&M zkATNoIWTCw^~w;^;;{uB?g3#>O-=1YK64uUzgDer`r-v}vpH;4bIgx#P`du5QZQA} z>1Yf!6=QxnUCz!H>XB9G{OBEc`46eH7>z9p+pfwn1+%|Jri*!^ccuTYPJco6_@15~ z=;JMS+kMN?F<3sRMvsH@7R0U|&d{peGhfx97E0A&E6nOfjA(~>2L)Mt33;s&I(%rZ zg3__4wh;IsY>G8`HE{X(%yHy&VH=mq>c{ueyy(IXmuyEkRHj$?mbMmU-N9qp$k@TM z8|>$2QvMvPCcflkRy?Gh%d6GvKJg2)mPM+7$e=`mnaJgo zj)ERj=}eF9-}<(ulrGwj>^%FUZI=z>E5aOOBo^?2Uu;+$XNh{kbGs@;lJE8(r;(DK z4};&n70(NgUXsk{oSU1&>*?@SUz-&zPXFqm<&SZTAGN`cn8on2u(0^OJbCiuYHFo~ zct+$_Hm-L!1%o1oz-`~SLwU}&Mj$M zAe%nPtVcN?G|Hfoj>;5kmKHx#P{STE?BrVWHMZE+%?vnY@#q~b@kJv^lR{Rq%WwybigEkM^kLk=()6E!_#!t%Ql+EgB6MTFCU8BcmV;3FA8Rw@;hO zcD~DAUYOpts!|l+vDVZD%G|}S;Td9cWn$9Mg)OUZ#bJ`sXL?ld&4aAM#=n4&v5-Kl z;ddr#H?6y`(|6cmO;YacMk6+UcMz7;fh8{@Ec+n3}#&X()+leU#| z@&^xzk`%50B((K9efTL(t=}Gc1xBJBksxxJnR!FsIIvl{{2c?c!jaFX@~25r^7t^I z9x|)%K=Jj`XPL74Y!`qq4}~Q;jPIMTx>cDKcgRh1!?p*duPWLo$jS;?agzGbuLaKZ zm!zMu;Tv@?(BS7A$u+{t=PiDQ=vzMo?Ke|uezuuFHH3QJD;_E!0R7;H@XN!Ryc?6H zXDXUfKGXd{_ewB1$MPwnz}S=Z=@e6iJS3|&*a&N)%w0P|kA&WR`BZ6Qx$sQ)_V%>%Qsk@? zaXAhPmsL=j?mR#Mx%Y)IcJEBMTYWh(5gvyiDjrxdcV~(28KO^0g{jLZCggYE!xLCi z>Tf?#({AdG^Wv9RJiB+J`cMU0StLN8%L6z^5Po4T&N=B5MH7|OZieH@kIvSOs&O2+ z$uq3(PTO8P(_O;VP3ND~8y9vr`~>yh{B(v4`3S~Kb;btxh=gglfWWd z28o!6DUR|TH**o*!9j{+!VF+fxFnbI0>pI!@!eUT+jGB$6AXH8WNDhCRpo>!mtZLM zv)vWL^pDT4BF$}JeRG6)m9_g&r>ZfpVFjg#gCMJNJ753+t881c!_jEZ`id0%mpli0 zlmBZ%#y!pa`@sqrgZtYM{eh!&8jOjpZO$@oPogsguJWf{0BBMUjz>QZF6Hb*?;X1K zgD0tZshltsu=>~Zh`vz%2;kW;!-#(U?crnqUIof@_S2`PY=T1$ zVr>udCiATWC;g$=@-UKkcY0xpsRMV!j$K=Tb-eAzpuUYL!v5sicsKo<2EaIE=WM6Y zK_{O;hIEMS8wDL!OBA_l2&am^_ntjF5I7d~XkeoI^NT$(551Rl8h`1Bo_#e?s{ zMYS8bpoe#4ZIx=Gv#F^pV3U3?{Hu0`tsZ*T5Dx)b#^N9rAy0mlZz)N9{w zp0(B0gqA2yU|(#9sZy3~Dfr33!w&wh$5+3`HD70^+h3^xr{(;V!251!5%*~RE6KMi zhV1ujKHbX8H5fuRJ#3;?of%~U&xl{|^hwSsz{HWDCLWJyzOH;OORsl;q|I_Zd;yaI zY+#Le$J;No`V-^81;Z$Fz-9#>VbJ=QYB?xO+J^A?uH%I8FD4XE*@0d6k{* z{}DD^SpurW4#8dz-W|2>=Lz5J%diQ-T1WupqLQh%I!&0q=$3Irlp!h$Fl&2*TWpb7 z{{1sM-(9Rse}Hd^I#YrChYuAM-m{-iS+hJLbmD+1$`Z>Q+X|4)pt#;O#NNcb>d2ot z$xc^VMb!)hm}$ve=-#GlpzIKka=Z#;xO-u3?a1{wU~Wg8#Va`g3wk5Wx;9|_``xya zcZ2vLC#m!oE?!W5IGLcC9~&F1mB5}bDx`xF{n{qiT2U{%&UT^Ow z>R~#ML?_*!tPQx7oU}C4?-{O^@Gu%2dlUPh$3d2c&}O-GLZK0MlT2>2fA0bb0np4K zQOx=!KT&nuiQBJf6KvQJ$H0Og0O0vq;c0qCb(t&97xxjEx@?|5@`35orgpUc>z9ja z4iOmg9yhrY4fXWo6(fM?g{?UO7Qe}PP76(@u=mrkCs}BD(w)wqKM%GgA@O(b9Y*jA zn3sYAw(KLS1JccVJN+>U@@AFTI&gRw-BS&Ln`@ZF_g zYH7Om%;Q>}t&rOqxXDiexS3JZf17}bw-vji*EG#VEnuz^z zL)yQ8MVt=}2>~J%03{tMY%oUd+`**TvEtW~0k+>*Ny(iBn-SjU0pc_~d(@Rqu>Onw z65Fn}vhXDUe*%Z6kz~#{gZeE%UFc_`qc7Kn2FxoW}3*a#JE| z2aD!}MG12TAfZm?yY@DCedh1)C?8ouA6~#Nfo4Ui-7Tf*-2|h>_ifyu2CkpB4$wXR z_~A&-CjwzdOW4MoH+U_do2Cdl#E%a5m2~+Z#LO6e*?ENLFvY&P8A4PPiwed=GRR?IErIDHY#+oAZUlkcSG;u zl2Ud{tu51aKd^xyLB*$q`K}mszMZ14q(30hm1YDCo(9D%wLpirrESpLujPF{zvp$4 z%6L>HB+1&=k0$w!ZRk8-MJh}HP9W&9=&O9sA5MT`zSj-n;8HWMMnS!W2nKZX3a9!| zs^LUJ@Z$zS9^HTq=G08ZeULX%tuAKUNfKH z9vi^uAJkvyd2uz5Q%$;QxiwQ&7t~H+>Dh>?mf;pZxnZ!}LG< zxQamGnb1{?50@X?%$3XulqgyE+yKJrLDYcZy_1cLz~75YOzdp3ZoY1itwZqI!q`bMf25ET$C z?d$7vl*V2&skZEPlm>?oc#8ez$*LANQA2zwzPM$ZEOXJVow>x$V9bE)7|ya39G0G+ z9<&5@b;Rs*VJfOKi^m)Rkv9~%8%~XO*x%stqXI76$B+O&KS*kaHmm~heTIarO*KHV z8vMELjMzqiasT5b8jS|ABfuO5+cK5P0C=;YScxH6d5QJ0fYTy4hxm^Y5)#^FS;>l} zmZe``09*S*a&oexwCMg7x>IZ`F04-@uD#fN^0GA#o$UrQlg{*0wktC$23nyiaLR9I zzYyh>BDuf4B14~VgcVHH2{i{g3q_9IAuJsWV{GRLWN%7+S^u~7u(VE zUGo+a!r|&ULYB+H+iZ>y8JYY?#fFl=iz19(r{DeLqhgFrb1vIF@Yd;TV2Yk6@a_z` z1VsB^ErHI=WbS;DDJ96DUS0;S!q3sws$Y-oSSt-n%{Ia=JZ=kZWe4sG590&Ai5yZ!^qK24}%>LT7wVmTO3a(}ssR6-)Wa zif7hFwnV%IA&F3il~BC6COQ6e{BN;nmFWm4Vy!Lg(61fH z8yl~>SC;L|h(GJqqa6={2+2tY-o8K`8>QOljB4|_mj1P9vc90~bhs+1v6NP#XdACR zf3HST0rn9vO!!s5*CBkyC2@ zF3!7qN0Wx4m>``?6SkkOqiV1L(~r`wCSOoEEzL-nBx_NrI_l&D8@H@? z{hG~3kB-c3Lo3~plbz~bMk|dv4ygh_I~WJ;%sxXJ zU2EL2A7%R_%x_(y!T&z498bd?G(%0=>Q5r&P1F6bK-XB7E;_y2ftGXP3_%B!$a35R zfnO^t$PQuUtj}Vps6jlp^u%9aGdm#pJ;y3swEdhk2%H9cN1JZ^NHrA0H2#jc77c=; zBEUlfKyWtY<@fvwLEPJ{M>SyCLXe4#{qMobdR@QDLL#dW&@SSb7Su&eOU(dJ>&ms4 zC-9r24vAQCvcLoXAHFzXp9gu0SRSi5k z@F$tY%>3hB34x$02z`2w;+haQKrD4wegBqs@$VI=aB9iLioH5RJ0S_F%2$eJ%(l3m z>;EY|^8d(~{HK?ygqG>4EO?|StqB!XR1akKHr5zpvQJT=CZ~)enFCm;JiO!nl~OsQ zU(n|go&67`+2gHukz`{iwm&l}JN)&1z?ySBa_t7`|NiBc3+vxxt5j4M*wz30pM1ct zIUX0Xw$)`0>vK|^o&jhQFnU!qk2&1Hh<@7puM5oMUpr|0JL&VEmheBRq5s{xtQ2?j zD62(jMi?1dm0H@ii}EM5X3hZa9&eh2rvLMg3burqsDCf*1%y4mV&m^wQdQ{u#}w87 gZXW+1-?c%ZE~JsQQtX+`K33zs;?X#fBK literal 0 HcmV?d00001 From 87ac963a3ec1006c21051edc2f93eade20a80543 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Thu, 7 Mar 2019 16:39:02 +0300 Subject: [PATCH 037/111] Revise the auth server UI --- .../AuthServer.Host/Pages/Index.cshtml | 44 ++++++++++++------ .../wwwroot/images/anonymous-user.png | Bin 0 -> 23671 bytes 2 files changed, 30 insertions(+), 14 deletions(-) create mode 100644 samples/MicroserviceDemo/applications/AuthServer.Host/wwwroot/images/anonymous-user.png diff --git a/samples/MicroserviceDemo/applications/AuthServer.Host/Pages/Index.cshtml b/samples/MicroserviceDemo/applications/AuthServer.Host/Pages/Index.cshtml index 53bcfed077..ebedf8f8d5 100644 --- a/samples/MicroserviceDemo/applications/AuthServer.Host/Pages/Index.cshtml +++ b/samples/MicroserviceDemo/applications/AuthServer.Host/Pages/Index.cshtml @@ -2,22 +2,38 @@ @using Volo.Abp.Users @model AuthServer.Host.Pages.IndexModel @inject ICurrentUser CurrentUser -

      Running the AuthServer.Host application!

      -

      Current User

      -
        -
      • IsAuthenticated: @CurrentUser.IsAuthenticated
      • -
      • UserName: @CurrentUser.UserName
      • -
      • Email: @CurrentUser.Email
      • -
      • Roles: @CurrentUser.Roles.JoinAsString(", ")
      • - @*
      • Claims: @CurrentUser.GetAllClaims().Select(c => $"{c.Type}={c.Value}").JoinAsString(" | ")
      • *@ -
      • TenantId: @CurrentUser.TenantId
      • -
      - +@section styles { + +} @if (CurrentUser.IsAuthenticated) { -
      Logout + } -else + +@if (!CurrentUser.IsAuthenticated) { - Login +
      +

      + Login +
      } \ No newline at end of file diff --git a/samples/MicroserviceDemo/applications/AuthServer.Host/wwwroot/images/anonymous-user.png b/samples/MicroserviceDemo/applications/AuthServer.Host/wwwroot/images/anonymous-user.png new file mode 100644 index 0000000000000000000000000000000000000000..fdae8cbe7f82828aad2b59bc9615f80bf32aa426 GIT binary patch literal 23671 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 literal 0 HcmV?d00001 From aee07e52dda1b83f244ea1c086c5519173023920 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Thu, 7 Mar 2019 16:41:57 +0300 Subject: [PATCH 038/111] Remove unused styles section --- .../applications/AuthServer.Host/Pages/Index.cshtml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/samples/MicroserviceDemo/applications/AuthServer.Host/Pages/Index.cshtml b/samples/MicroserviceDemo/applications/AuthServer.Host/Pages/Index.cshtml index ebedf8f8d5..0a1f18c6f1 100644 --- a/samples/MicroserviceDemo/applications/AuthServer.Host/Pages/Index.cshtml +++ b/samples/MicroserviceDemo/applications/AuthServer.Host/Pages/Index.cshtml @@ -2,15 +2,9 @@ @using Volo.Abp.Users @model AuthServer.Host.Pages.IndexModel @inject ICurrentUser CurrentUser -@section styles { - -} @if (CurrentUser.IsAuthenticated) { -