From bf802eabbd342ca39f3755bd65498ac404f9bfe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 27 Nov 2020 12:42:58 +0300 Subject: [PATCH 01/17] Update Getting-Started.md --- docs/en/Getting-Started.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/en/Getting-Started.md b/docs/en/Getting-Started.md index 6bfacc9a53..b1e4795757 100644 --- a/docs/en/Getting-Started.md +++ b/docs/en/Getting-Started.md @@ -34,8 +34,12 @@ The following tools should be installed on your development machine: 1 _You can use another editor instead of Visual Studio as long as it supports .NET Core and ASP.NET Core._ [↩](#a-editor) +{{ if UI != "Blazor" }} + 2 _Yarn v2 works differently and is not supported._ [↩](#a-yarn) +{{ end }} + ### Install the ABP CLI [ABP CLI](./CLI.md) is a command line interface that is used to automate some common tasks for ABP based solutions. From 19bf8867b293bdcf4493397881f21e348118ddf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 27 Nov 2020 21:27:52 +0300 Subject: [PATCH 02/17] Documented input DTO best practices. --- ...main-Driven-Design-Implementation-Guide.md | 132 +++++++++++++++++- 1 file changed, 131 insertions(+), 1 deletion(-) diff --git a/docs/en/Domain-Driven-Design-Implementation-Guide.md b/docs/en/Domain-Driven-Design-Implementation-Guide.md index 230288cb28..f9abf9a884 100644 --- a/docs/en/Domain-Driven-Design-Implementation-Guide.md +++ b/docs/en/Domain-Driven-Design-Implementation-Guide.md @@ -1179,4 +1179,134 @@ namespace IssueTracking.Issues ### Data Transfer Objects -TODO \ No newline at end of file +A [DTO](Data-Transfer-Objects.md) is a simple object that is used to transfer state (data) between the Application and Presentation Layers. So, Application Service methods gets and returns DTOs. + +#### Common DTO Principles & Best Practices + +* A DTO **should be serializable**, by its nature. Because, most of the time it is transferred over network. So, it should have a **parameterless (empty) constructor**. +* Should not contain any **business logic**. +* **Never** inherit from or reference to **entities**. + +**Input DTOs** (those are passed to the Application Service methods) have different natures than **Output DTOs** (those are returned from the Application Service methods). So, they will be treated differently. + +#### Input DTO Best Practices + +##### Do not Define Unused Properties for Input DTOs + +Define **only the properties needed** for the use case! Otherwise, it will be **confusing for the clients** to use the Application Service method. You can surely define **optional properties**, but they should effect how the use case is working, when the client provides them. + +This rule seems unnecessary first. Who would define unused parameters (input DTO properties) for a method? But it happens, especially when you try to reuse input DTOs. + +##### Do not Re-Use Input DTOs + +Define a **specialized input DTO for each use case** (Application Service method). Otherwise, some properties are not used in some cases and this violates the rule defined above: *Do not Define Unused Properties for Input DTOs*. + +Sometimes, it seems appealing to reuse the same DTO class for two use cases, because they are almost same. Even if they are same now, they will probably become different by the time and you will come the same problem. **Code duplication is a better practice than coupling use cases**. + +Another way of reusing input DTOs is **inheriting** DTOs from each other. While this can be useful in some rare cases, most of the time it brings you to the same point. + +**Example: User Application Service** + +````csharp +public interface IUserAppService : IApplicationService +{ + Task CreateAsync(UserDto input); + Task UpdateAsync(UserDto input); + Task ChangePasswordAsync(UserDto input); +} +```` + +`IUserAppService` uses `UserDto` as the input DTO in all methods (use cases). `UserDto` is defined below: + +````csharp +public class UserDto +{ + public Guid Id { get; set; } + public string UserName { get; set; } + public string Email { get; set; } + public string Password { get; set; } + public DateTime CreationTime { get; set; } +} +```` + +For this example; + +* `Id` is not used in *Create* since the server determines it. +* `Password` is not used in *Update* since we have another method for it. +* `CreationTime` is never used since we can't allow client to send the Creation Time. It should be set in the server. + +A true implementation can be like that: + +````csharp +public interface IUserAppService : IApplicationService +{ + Task CreateAsync(UserCreationDto input); + Task UpdateAsync(UserUpdateDto input); + Task ChangePasswordAsync(UserChangePasswordDto input); +} +```` + +With the given input DTO classes: + +````csharp +public class UserCreationDto +{ + public string UserName { get; set; } + public string Email { get; set; } + public string Password { get; set; } +} + +public class UserUpdateDto +{ + public Guid Id { get; set; } + public string UserName { get; set; } + public string Email { get; set; } +} + +public class UserChangePasswordDto +{ + public Guid Id { get; set; } + public string Password { get; set; } +} +```` + +This is more maintainable approach, while it seems you write more code. + +**Exceptional Case**: There can be some exceptions for this rule: If you always want to develop two methods **in parallel**, they may share the same input DTO (by inheritance or direct reuse). For example, if you have a reporting page that has some filters and you have multiple Application Service methods (like screen report, excel report and csv report methods) use the same filters but returns different results, you may want to reuse the same filter input DTO to **couple these use cases**. Because, in this example, whenever you change a filter, you have to make the necessary changes in all the methods to have a consistent reporting system. + +##### Input DTO Validation Logic + +* Implement only **formal validation** inside the DTO. Use Data Annotation Validation Attributes or implement `IValidatableObject` for formal validation. +* **Do not perform domain validation**. For example, don't try to check unique username constraint in the DTOs. + +**Example: Using Data Annotation Attributes** + +````csharp +using System.ComponentModel.DataAnnotations; + +namespace IssueTracking.Users +{ + public class UserCreationDto + { + [Required] + [StringLength(UserConsts.MaxUserNameLength)] + public string UserName { get; set; } + + [Required] + [EmailAddress] + [StringLength(UserConsts.MaxEmailLength)] + public string Email { get; set; } + + [Required] + [StringLength(UserConsts.MaxEmailLength, + MinimumLength = UserConsts.MinPasswordLength)] + public string Password { get; set; } + } +} +```` + +ABP Framework automatically validates input DTOs, throws `AbpValidationException` and returns HTTP Status `400` to the client in case of an invalid input. + +> Some developers think it is better to separate the validation rules and DTO classes. We think the declarative (Data Annotation) approach is practical and useful and doesn't cause any design problem. However, ABP also supports [FluentValidation integration](FluentValidation.md) if you prefer the other approach. + +> See the [Validation document](Validation.md) for all validation options. \ No newline at end of file From 947dd87c2fcf9892c53420e9be59de41ddc4b975 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 27 Nov 2020 22:16:28 +0300 Subject: [PATCH 03/17] Documented: Output DTO Best Practices --- ...main-Driven-Design-Implementation-Guide.md | 74 ++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/docs/en/Domain-Driven-Design-Implementation-Guide.md b/docs/en/Domain-Driven-Design-Implementation-Guide.md index f9abf9a884..046bf6b3e1 100644 --- a/docs/en/Domain-Driven-Design-Implementation-Guide.md +++ b/docs/en/Domain-Driven-Design-Implementation-Guide.md @@ -1309,4 +1309,76 @@ ABP Framework automatically validates input DTOs, throws `AbpValidationException > Some developers think it is better to separate the validation rules and DTO classes. We think the declarative (Data Annotation) approach is practical and useful and doesn't cause any design problem. However, ABP also supports [FluentValidation integration](FluentValidation.md) if you prefer the other approach. -> See the [Validation document](Validation.md) for all validation options. \ No newline at end of file +> See the [Validation document](Validation.md) for all validation options. + +#### Output DTO Best Practices + +* Keep output **DTO count minimum**. **Reuse** where possible (exception: Do not reuse input DTOs as output DTOs). +* Output DTOs can contain **more properties** than used in the client code. +* Return entity DTO from **Create** and **Update** methods. + +The main goals of these suggestions are; + +* Make client code easy to develop and extend; + * Dealing with **similar, but not same** DTOs are problematic on the client side. + * It is common to **need to other properties** on the UI/client in the future. Returning all properties (by considering security and privileges) of an entity makes client code easy to improve without requiring to touch to the backend code. + * If you are opening your API to **3rd-party clients**, you can't know requirements of each client. +* Make the server side code easy to develop and extend; + * You have less class to **understand and maintain**. + * You can reuse the Entity->DTO **object mapping** code. + * Returning same types from different methods make it easy and clear to create **new methods**. + +**Example: Returning Different DTO types from different methods** + +````csharp +public interface IUserAppService : IApplicationService +{ + UserDto Get(Guid id); + List GetUserNameAndEmail(Guid id); + List GetRoles(Guid id); + List GetList(); + UserCreateResultDto Create(UserCreationDto input); + UserUpdateResultDto Update(UserUpdateDto input); +} +```` + +*(We haven't used async methods to make the example cleaner, but you use async in your real code!)* + +The example code above returns different DTO types for each method. As you can guess, there will be a lot of code duplications for querying data, mapping entities to DTOs. + +The `IUserAppService` service above can be simplified: + +````csharp +public interface IUserAppService : IApplicationService +{ + UserDto Get(Guid id); + List GetList(); + UserDto Create(UserCreationDto input); + UserDto Update(UserUpdateDto input); +} +```` + +With a single output DTO: + +````csharp +public class UserDto +{ + public Guid Id { get; set; } + public string UserName { get; set; } + public string Email { get; set; } + public DateTime CreationTime { get; set; } + public List Roles { get; set; } +} +```` + +* Removed `GetUserNameAndEmail` and `GetRoles` since `Get` method already returns the necessary information. +* `GetList` now returns same with `Get`. +* `Create` and `Update` also returns the same `UserDto`. + +Using the same DTO has a lot of advantages as explained before. For example, think a scenario where you show a **data grid** of Users on the UI. After updating a user, you can get the return value and **update it on the UI**. So, you don't need to call `GetList` again. This is why we suggest to return the entity DTO (`UserDto` here) as return value from the `Create` and `Update` operations. + +##### Discussion + +Some of the output DTO suggestions may not fit every scenario. These suggestions can be ignored for **performance** reasons, especially when **large data sets** returned or when you create services for your own UI and you have **too many concurrent requests**. + +In these cases, you may want to create **specialized output DTOs with minimal information**. The suggestions above are especially for applications where **maintaining the codebase** is more important than **negligible performance lost**. \ No newline at end of file From 31d6aec8121802e9ade9271df848970bdfa6358a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 27 Nov 2020 22:22:02 +0300 Subject: [PATCH 04/17] Update Domain-Driven-Design-Implementation-Guide.md --- docs/en/Domain-Driven-Design-Implementation-Guide.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/Domain-Driven-Design-Implementation-Guide.md b/docs/en/Domain-Driven-Design-Implementation-Guide.md index 046bf6b3e1..2808e75576 100644 --- a/docs/en/Domain-Driven-Design-Implementation-Guide.md +++ b/docs/en/Domain-Driven-Design-Implementation-Guide.md @@ -12,6 +12,7 @@ The goals of this document are; * Explain the **layered architecture** & solution structure offered by the ABP Framework. * Introduce **explicit rules** to implement DDD patterns and best practices by giving **concrete examples**. * Show what **ABP Framework provides** you as the infrastructure for implementing DDD in a proper way. +* And finally, provide **suggestions** based on software development **best practices** and our experiences to create a **maintainable codebase**. ### Simple Code! From 66cfdf4dc9d0b3f897dc1f56809796d7f6f38e39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Fri, 27 Nov 2020 22:35:06 +0300 Subject: [PATCH 05/17] Added Implementing DDD to navigation menu --- docs/en/Domain-Driven-Design.md | 14 +++++++------- docs/en/docs-nav.json | 4 ++++ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/docs/en/Domain-Driven-Design.md b/docs/en/Domain-Driven-Design.md index f3d2699cab..f18c1882ef 100644 --- a/docs/en/Domain-Driven-Design.md +++ b/docs/en/Domain-Driven-Design.md @@ -10,7 +10,7 @@ ABP framework provides an **infrastructure** to make **Domain Driven Design** ba > - Basing complex designs on a model of the domain; > - Initiating a creative collaboration between technical and domain experts to iteratively refine a conceptual model that addresses particular domain problems. -### Layers +## Layers & Building Blocks ABP follows DDD principles and patterns to achieve a layered application model which consists of four fundamental layers: @@ -19,11 +19,7 @@ ABP follows DDD principles and patterns to achieve a layered application model w - **Domain Layer**: Includes business objects and the core (domain) business rules. This is the heart of the application. - **Infrastructure Layer**: Provides generic technical capabilities that support higher layers mostly using 3rd-party libraries. -DDD mostly interest in the **Domain** and the **Application** layers, rather than the Infrastructure and the Presentation layers. - -## Contents - -See the following documents to learn what ABP Framework provides to you to implement DDD in your project. +DDD mostly interest in the **Domain** and the **Application** layers, rather than the Infrastructure and the Presentation layers. The following documents explains the **infrastructure** provided by the ABP Framework to implement **Building Blocks** of the DDD: * **Domain Layer** * [Entities & Aggregate Roots](Entities.md) @@ -34,4 +30,8 @@ See the following documents to learn what ABP Framework provides to you to imple * **Application Layer** * [Application Services](Application-Services.md) * [Data Transfer Objects (DTOs)](Data-Transfer-Objects.md) - * [Unit of Work](Unit-Of-Work.md) \ No newline at end of file + * [Unit of Work](Unit-Of-Work.md) + +## The Ultimate DDD Implementation Guide + +See the [Implementing Domain Driven Design](Domain-Driven-Design-Implementation-Guide.md) guide as a **complete reference**. The Guide explains the Domain Driven Design and introduces explicit **rules and examples** to give a deep understanding of the **implementation details**. \ No newline at end of file diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index 3a174bb7b1..c776cb34c8 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -377,6 +377,10 @@ "path": "Unit-Of-Work.md" } ] + }, + { + "text": "Guide: Implementing DDD", + "path": "Domain-Driven-Design-Implementation-Guide.md" } ] }, From 82e23467778da94362d51bff8abea5670ff005b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 28 Nov 2020 18:39:56 +0300 Subject: [PATCH 06/17] Documened Object to Object Mapping in DDD guide. --- ...main-Driven-Design-Implementation-Guide.md | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/docs/en/Domain-Driven-Design-Implementation-Guide.md b/docs/en/Domain-Driven-Design-Implementation-Guide.md index 2808e75576..15691cb756 100644 --- a/docs/en/Domain-Driven-Design-Implementation-Guide.md +++ b/docs/en/Domain-Driven-Design-Implementation-Guide.md @@ -1382,4 +1382,28 @@ Using the same DTO has a lot of advantages as explained before. For example, thi Some of the output DTO suggestions may not fit every scenario. These suggestions can be ignored for **performance** reasons, especially when **large data sets** returned or when you create services for your own UI and you have **too many concurrent requests**. -In these cases, you may want to create **specialized output DTOs with minimal information**. The suggestions above are especially for applications where **maintaining the codebase** is more important than **negligible performance lost**. \ No newline at end of file +In these cases, you may want to create **specialized output DTOs with minimal information**. The suggestions above are especially for applications where **maintaining the codebase** is more important than **negligible performance lost**. + +#### Object to Object Mapping + +Automatic [object to object mapping](Object-To-Object-Mapping.md) is a useful approach to copy values from one object to another when two objects have same or similar properties. + +DTO and Entity classes generally have same/similar properties and you typically need to create DTO objects from Entities. ABP's [object to object mapping system](Object-To-Object-Mapping.md) with [AutoMapper](http://automapper.org/) integration makes these operations much easier comparing to manual mapping. + +* **Use** auto object mapping only for **Entity to output DTO** mappings. +* **Do not use** auto object mapping for **input DTO to Entity** mappings. + +There are some reasons why you **should not use** input DTO to Entity auto mapping; + +1. An Entity class typically has a **constructor** that takes parameters and ensures valid object creation. Auto object mapping operation generally requires an empty constructor. +2. Most of the entity properties will have **private setters** and you should use methods to change these properties in a controlled way. +3. You typically need to **carefully validate and process** the user/client input rather than blindly mapping to the entity properties. + +While some of these problems can be solved through mapping configurations (For example, AutoMapper allows to define custom mapping rules), it makes your business code **implicit/hidden** and **tightly coupled** to the infrastructure. We think the business code should be explicit, clear and easy to understand. + +#### Example: Creating an Entity + +TODO + + + From 3b66890e0504627567dd2713c75646c8555ad7db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 28 Nov 2020 19:11:26 +0300 Subject: [PATCH 07/17] Example: Entity Creation --- ...main-Driven-Design-Implementation-Guide.md | 97 ++++++++++++++++++- 1 file changed, 95 insertions(+), 2 deletions(-) diff --git a/docs/en/Domain-Driven-Design-Implementation-Guide.md b/docs/en/Domain-Driven-Design-Implementation-Guide.md index 15691cb756..03178ed5a6 100644 --- a/docs/en/Domain-Driven-Design-Implementation-Guide.md +++ b/docs/en/Domain-Driven-Design-Implementation-Guide.md @@ -1401,9 +1401,102 @@ There are some reasons why you **should not use** input DTO to Entity auto mappi While some of these problems can be solved through mapping configurations (For example, AutoMapper allows to define custom mapping rules), it makes your business code **implicit/hidden** and **tightly coupled** to the infrastructure. We think the business code should be explicit, clear and easy to understand. -#### Example: Creating an Entity +See the *Entity Creation* section below for an example implementation of the suggestions made in this section. -TODO +## Implementation: Examples +This section will demonstrate some example use cases and discuss alternative scenarios. +### Entity Creation +Creating an object from an Entity / Aggregate Root class is the first step of the lifecycle of that entity. The *Aggregate / Aggregate Root Rules & Best Practices* section suggests to **create a primary constructor** for the Entity class that guarantees to **create a valid entity**. So, whenever we need to create an instance of that entity, we should always **use that constructor**. + +See the `Issue` Aggregate Root class below: + +````csharp +public class Issue : AggregateRoot +{ + public Guid RepositoryId { get; private set; } + public string Title { get; private set; } + public string Text { get; set; } + public Guid? AssignedUserId { get; internal set; } + + public Issue( + Guid id, + Guid repositoryId, + string title, + string text = null + ) : base(id) + { + RepositoryId = repositoryId; + Title = Check.NotNullOrWhiteSpace(title, nameof(title)); + Text = text; //Allow empty/null + } + + private Issue() { /* Empty constructor is for ORMs */ } + + public void SetTitle(string title) + { + Title = Check.NotNullOrWhiteSpace(title, nameof(title)); + } + + //... +} +```` + +* This class guarantees to create a valid entity by its constructor. +* If you need to change the `Title` later, you need to use the `SetTitle` method which continues to keep `Title` in a valid state. +* If you want to assign this issue to a user, you need to use `IssueManager` (it implements some business rules before the assignment - see the *Domain Services* section above to remember). +* The `Text` property has a public setter, because it also accepts null values and haven't any validation rule for this example. It is also optional in the constructor. + +Let's see an Application Service method that is used to create an issue: + +````csharp +public class IssueAppService : ApplicationService, IIssueAppService +{ + private readonly IssueManager _issueManager; + private readonly IRepository _issueRepository; + private readonly IRepository _userRepository; + + public IssueAppService( + IssueManager issueManager, + IRepository issueRepository, + IRepository userRepository) + { + _issueManager = issueManager; + _issueRepository = issueRepository; + _userRepository = userRepository; + } + + public async Task CreateAsync(IssueCreationDto input) + { + // Create a valid entity + var issue = new Issue( + GuidGenerator.Create(), + input.RepositoryId, + input.Title, + input.Text + ); + + // Apply additional domain actions + if (input.AssignedUserId.HasValue) + { + var user = await _userRepository.GetAsync(input.AssignedUserId.Value); + await _issueManager.AssignToAsync(issue, user); + } + + // Save + await _issueRepository.InsertAsync(issue); + + // Return a DTO represents the new Issue + return ObjectMapper.Map(issue); + } +} +```` + +`CreateAsync` method; + +* Uses the `Issue` **constructor** to create a valid issue. It passes the `Id` using the [IGuidGenerator](Guid-Generation.md) service. It doesn't use auto object mapping here. +* If client wants to **assign this issue to a user** on object creation, it uses the `IssueManager` to do it by allowing the `IssueManager` to perform the necessary checks before this assignment. +* **Saves** the entity to the database. +* Finally uses the `IObjectMapper` to return an `IssueDto` that is automatically created by mapping from the `Issue` entity. \ No newline at end of file From 2fa2d713977c17516d5a584c22aa56c90e03e667 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 28 Nov 2020 19:57:28 +0300 Subject: [PATCH 08/17] Applying Domain Rules on Entity Creation --- ...main-Driven-Design-Implementation-Guide.md | 147 +++++++++++++++++- 1 file changed, 146 insertions(+), 1 deletion(-) diff --git a/docs/en/Domain-Driven-Design-Implementation-Guide.md b/docs/en/Domain-Driven-Design-Implementation-Guide.md index 03178ed5a6..0819aaac55 100644 --- a/docs/en/Domain-Driven-Design-Implementation-Guide.md +++ b/docs/en/Domain-Driven-Design-Implementation-Guide.md @@ -1499,4 +1499,149 @@ public class IssueAppService : ApplicationService, IIssueAppService * Uses the `Issue` **constructor** to create a valid issue. It passes the `Id` using the [IGuidGenerator](Guid-Generation.md) service. It doesn't use auto object mapping here. * If client wants to **assign this issue to a user** on object creation, it uses the `IssueManager` to do it by allowing the `IssueManager` to perform the necessary checks before this assignment. * **Saves** the entity to the database. -* Finally uses the `IObjectMapper` to return an `IssueDto` that is automatically created by mapping from the `Issue` entity. \ No newline at end of file +* Finally uses the `IObjectMapper` to return an `IssueDto` that is automatically created by mapping from the `Issue` entity. + +#### Applying Domain Rules on Entity Creation + +The example `Issue` entity has no business rule on entity creation, except some formal validations in the constructor. However, there maybe scenarios where entity creation should check some extra business rules. + +For example, assume that you **don't want** to allow to create an issue if there is already an issue with **exactly the same `Title`**. Where to implement this rule? It is **not proper** to implement this rule in the **Application Service**, because it is a **core business (domain) rule** that should always be checked. + +This rule should be implemented in a **Domain Service**, `IssueManager` in this case. So, we need to force the Application Layer always to use the `IssueManager` to create a new `Issue.` + +First, we can make the `Issue` constructor `internal`, instead of `public`: + +````csharp +public class Issue : AggregateRoot +{ + //... + + internal Issue( + Guid id, + Guid repositoryId, + string title, + string text = null + ) : base(id) + { + RepositoryId = repositoryId; + Title = Check.NotNullOrWhiteSpace(title, nameof(title)); + Text = text; //Allow empty/null + } + + //... +} +```` + +This prevents Application Services to directly use the constructor, so they will use the `IssueManager`. Then we can add a `CreateAsync` method to the `IssueManager`: + +````csharp +using System; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.Domain.Services; + +namespace IssueTracking.Issues +{ + public class IssueManager : DomainService + { + private readonly IRepository _issueRepository; + + public IssueManager(IRepository issueRepository) + { + _issueRepository = issueRepository; + } + + public async Task CreateAsync( + Guid repositoryId, + string title, + string text = null) + { + if (await _issueRepository.AnyAsync(i => i.Title == title)) + { + throw new BusinessException("IssueTracking:IssueWithSameTitleExists"); + } + + return new Issue( + GuidGenerator.Create(), + repositoryId, + title, + text + ); + } + } +} +```` + +* `CreateAsync` method checks if there is already an issue with the same title and throws a business exception in this case. +* If there is no duplication, it create and returns a new `Issue`. + +The `IssueAppService` is changed as shown below in order to use the `IssueManager`'s `CreateAsync` method: + +````csharp +public class IssueAppService : ApplicationService, IIssueAppService +{ + private readonly IssueManager _issueManager; + private readonly IRepository _issueRepository; + private readonly IRepository _userRepository; + + public IssueAppService( + IssueManager issueManager, + IRepository issueRepository, + IRepository userRepository) + { + _issueManager = issueManager; + _issueRepository = issueRepository; + _userRepository = userRepository; + } + + public async Task CreateAsync(IssueCreationDto input) + { + // Create a valid entity using the IssueManager + var issue = await _issueManager.CreateAsync( + input.RepositoryId, + input.Title, + input.Text + ); + + // Apply additional domain actions + if (input.AssignedUserId.HasValue) + { + var user = await _userRepository.GetAsync(input.AssignedUserId.Value); + await _issueManager.AssignToAsync(issue, user); + } + + // Save + await _issueRepository.InsertAsync(issue); + + // Return a DTO represents the new Issue + return ObjectMapper.Map(issue); + } +} +```` + +##### Discussion: Why not saved Issue to database in the `IssueManager`? + +You may ask "**Why `IssueManager` hasn't saved the `Issue` into the database?**". We think it is the responsibility of the Application Service. + +Because, the Application Service may require additional changes/operations on the `Issue` object before saving it. If Domain Service saves it, then the *Save* operation is duplicated; + +* It causes performance lost because of double database round trip. +* It requires explicit database transaction that covers both operations. +* If additional actions cancel the entity creation because of a business rule, the transaction should be rolled back in the database. + +When you check the `IssueAppService`, you see the advantage of **not saving** `Issue` to database in the `IssueManager.CreateAsync`. Otherwise, we would need to perform one *Insert* (in the `IssueManager`) and one *Update* (after the Assignment). + +##### Discussion: Why not implemented the duplicate Title check in the Application Service? + +We could simple say "Because it is a **core domain logic** and should be implemented in the Domain Layer". However, it brings a new question "**How did you decide** that it is a core domain logic, but not an application logic?" (we will discuss the difference later in mode details). + +For this example, a simple question can help us to make the decision: "If we have another way (use case) of creating an issue, should we still apply the same rule? Is that rule should *always* be implemented". You may think "Why we have a second way of creating an issue?". However, in real life, you have; + +* End users of the application may create issues in your application's standard UI. +* You may have a second back office application that is used by your own employee and you may want to provide a way of creating issues (probably with different authorization rules in this case). +* You may have an HTTP API that is open to 3rd-party companies and they create issues. +* You may have a background worker service that do something and creates issues if it detects some problems. In this way, it will create an issue without any user interaction (and probably without any standard authorization check). +* You may have a button on the UI that converts something (for example, a discussion) to an issues. + +We can give more examples. All of these are should be implemented by different Application Service methods (see the *Multiple Application Layers* section below), but they always follow the rule: Title of the new issue can not be same of any existing issue! That's why this logic is a core domain logic, should be located in the Domain Layer and should not be duplicated in all these application service methods. \ No newline at end of file From df9b93983008b2e29cba67e3047636b8b453c025 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 28 Nov 2020 20:00:13 +0300 Subject: [PATCH 09/17] Update Domain-Driven-Design-Implementation-Guide.md --- ...main-Driven-Design-Implementation-Guide.md | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/docs/en/Domain-Driven-Design-Implementation-Guide.md b/docs/en/Domain-Driven-Design-Implementation-Guide.md index 0819aaac55..563e4713ad 100644 --- a/docs/en/Domain-Driven-Design-Implementation-Guide.md +++ b/docs/en/Domain-Driven-Design-Implementation-Guide.md @@ -1616,7 +1616,16 @@ public class IssueAppService : ApplicationService, IIssueAppService // Return a DTO represents the new Issue return ObjectMapper.Map(issue); - } + } +} + +// *** IssueCreationDto class *** +public class IssueCreationDto +{ + public string Title { get; set; } + public Guid RepositoryId { get; set; } + public Guid? AssignedUserId { get; set; } + public string Text { get; set; } } ```` @@ -1638,10 +1647,11 @@ We could simple say "Because it is a **core domain logic** and should be impleme For this example, a simple question can help us to make the decision: "If we have another way (use case) of creating an issue, should we still apply the same rule? Is that rule should *always* be implemented". You may think "Why we have a second way of creating an issue?". However, in real life, you have; -* End users of the application may create issues in your application's standard UI. -* You may have a second back office application that is used by your own employee and you may want to provide a way of creating issues (probably with different authorization rules in this case). -* You may have an HTTP API that is open to 3rd-party companies and they create issues. -* You may have a background worker service that do something and creates issues if it detects some problems. In this way, it will create an issue without any user interaction (and probably without any standard authorization check). -* You may have a button on the UI that converts something (for example, a discussion) to an issues. +* **End users** of the application may create issues in your application's standard UI. +* You may have a second **back office** application that is used by your own employee and you may want to provide a way of creating issues (probably with different authorization rules in this case). +* You may have an HTTP API that is open to **3rd-party clients** and they create issues. +* You may have a **background worker** service that do something and creates issues if it detects some problems. In this way, it will create an issue without any user interaction (and probably without any standard authorization check). +* You may have a button on the UI that **converts** something (for example, a discussion) to an issue. + +We can give more examples. All of these are should be implemented by **different Application Service methods** (see the *Multiple Application Layers* section below), but they **always** follow the rule: Title of the new issue can not be same of any existing issue! That's why this logic is a **core domain logic**, should be located in the Domain Layer and **should not be duplicated** in all these application service methods. -We can give more examples. All of these are should be implemented by different Application Service methods (see the *Multiple Application Layers* section below), but they always follow the rule: Title of the new issue can not be same of any existing issue! That's why this logic is a core domain logic, should be located in the Domain Layer and should not be duplicated in all these application service methods. \ No newline at end of file From 6ff6fc076f951094c93c2eeb7b8f92271c30684b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 28 Nov 2020 20:27:22 +0300 Subject: [PATCH 10/17] DDD guide: Updating / Manipulating An Entity --- ...main-Driven-Design-Implementation-Guide.md | 109 +++++++++++++++++- 1 file changed, 107 insertions(+), 2 deletions(-) diff --git a/docs/en/Domain-Driven-Design-Implementation-Guide.md b/docs/en/Domain-Driven-Design-Implementation-Guide.md index 563e4713ad..2ea523349c 100644 --- a/docs/en/Domain-Driven-Design-Implementation-Guide.md +++ b/docs/en/Domain-Driven-Design-Implementation-Guide.md @@ -1499,7 +1499,7 @@ public class IssueAppService : ApplicationService, IIssueAppService * Uses the `Issue` **constructor** to create a valid issue. It passes the `Id` using the [IGuidGenerator](Guid-Generation.md) service. It doesn't use auto object mapping here. * If client wants to **assign this issue to a user** on object creation, it uses the `IssueManager` to do it by allowing the `IssueManager` to perform the necessary checks before this assignment. * **Saves** the entity to the database. -* Finally uses the `IObjectMapper` to return an `IssueDto` that is automatically created by mapping from the `Issue` entity. +* Finally uses the `IObjectMapper` to return an `IssueDto` that is automatically created by **mapping** from the new `Issue` entity. #### Applying Domain Rules on Entity Creation @@ -1622,8 +1622,9 @@ public class IssueAppService : ApplicationService, IIssueAppService // *** IssueCreationDto class *** public class IssueCreationDto { - public string Title { get; set; } public Guid RepositoryId { get; set; } + [Required] + public string Title { get; set; } public Guid? AssignedUserId { get; set; } public string Text { get; set; } } @@ -1655,3 +1656,107 @@ For this example, a simple question can help us to make the decision: "If we hav We can give more examples. All of these are should be implemented by **different Application Service methods** (see the *Multiple Application Layers* section below), but they **always** follow the rule: Title of the new issue can not be same of any existing issue! That's why this logic is a **core domain logic**, should be located in the Domain Layer and **should not be duplicated** in all these application service methods. +### Updating / Manipulating An Entity + +Once an entity is created, it is updated/manipulated by the use cases until it is deleted from the system. There can be different type of use cases directly or indirectly changes an entity. + +In this section, we will discuss a typical update operation that changes multiple properties of an `Issue`. + +This time, beginning from the *Update* DTO: + +````csharp +public class UpdateIssueDto +{ + [Required] + public string Title { get; set; } + public string Text { get; set; } + public Guid? AssignedUserId { get; set; } +} +```` + +By comparing to `IssueCreationDto`, you see no `RepositoryId`. Because, our system doesn't allow to move issues across repositories (think as GitHub repositories). Only `Title` is required and the other properties are optional. + +Let's see the *Update* implementation in the `IssueAppService`: + +````csharp +public class IssueAppService : ApplicationService, IIssueAppService +{ + private readonly IssueManager _issueManager; + private readonly IRepository _issueRepository; + private readonly IRepository _userRepository; + + public IssueAppService( + IssueManager issueManager, + IRepository issueRepository, + IRepository userRepository) + { + _issueManager = issueManager; + _issueRepository = issueRepository; + _userRepository = userRepository; + } + + public async Task UpdateAsync(Guid id, UpdateIssueDto input) + { + // Get entity from database + var issue = await _issueRepository.GetAsync(id); + + // Change Title + await _issueManager.ChangeTitleAsync(issue, input.Title); + + // Change Assigned User + if (input.AssignedUserId.HasValue) + { + var user = await _userRepository.GetAsync(input.AssignedUserId.Value); + await _issueManager.AssignToAsync(issue, user); + } + + // Change Text (no business rule, all values accepted) + issue.Text = input.Text; + + // Update entity in the database + await _issueRepository.UpdateAsync(issue); + + // Return a DTO represents the new Issue + return ObjectMapper.Map(issue); + } +} +```` + +* `UpdateAsync` method gets `id` as a separate parameter. It is not included in the `UpdateIssueDto`. This is a design decision that helps ABP to properly define HTTP routes when you [auto expose](API/Auto-API-Controllers.md) this service as an HTTP API endpoint. So, that's not related to DDD. +* It starts by **getting** the `Issue` entity **from database**. +* Uses `IssueManager`'s `ChangeTitleAsync` instead of directly calling `Issue.SetTitle(...)`. Because we need to implement the **duplicate Title check** as just done in the *Entity Creation*. This requires some changes in the `Issue` and `IssueManager` classes (will be explained below). +* Uses `IssueManager`'s `AssignToAsync` method if the **assigned user** is being changed with this request. +* Directly sets the `Issue.Text` since there is **no business rule** for that. If we need later, we can always refactor. +* **Saves changes** to database. Again, saving changed entities is a responsibility of the Application Service method that coordinates the business objects and the transaction. If `IssueManager` had saved internally in `ChangeTitleAsync` and `AssignToAsync` method, there would be double database operation (see the *Discussion: Why not saved Issue to database in the `IssueManager`?* above). +* Finally uses the `IObjectMapper` to return an `IssueDto` that is automatically created by **mapping** from the updated `Issue` entity. + +As said, we need some changes in the `Issue` and `IssueManager` classes. + +First, made `SetTitle` internal on the `Issue` class: + +````csharp +internal void SetTitle(string title) +{ + Title = Check.NotNullOrWhiteSpace(title, nameof(title)); +} +```` + +Then added a new method on the `IssueManager` to change the Title: + +````csharp +public async Task ChangeTitleAsync(Issue issue, string title) +{ + if (issue.Title == title) + { + return; + } + + if (await _issueRepository.AnyAsync(i => i.Title == title)) + { + throw new BusinessException("IssueTracking:IssueWithSameTitleExists"); + } + + issue.SetTitle(title); +} +```` + From 6e94d5a1304e972a766825a16c3881c5ff1004c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sat, 28 Nov 2020 20:31:13 +0300 Subject: [PATCH 11/17] Update Domain-Driven-Design-Implementation-Guide.md --- docs/en/Domain-Driven-Design-Implementation-Guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Domain-Driven-Design-Implementation-Guide.md b/docs/en/Domain-Driven-Design-Implementation-Guide.md index 2ea523349c..940c012d5c 100644 --- a/docs/en/Domain-Driven-Design-Implementation-Guide.md +++ b/docs/en/Domain-Driven-Design-Implementation-Guide.md @@ -1644,7 +1644,7 @@ When you check the `IssueAppService`, you see the advantage of **not saving** `I ##### Discussion: Why not implemented the duplicate Title check in the Application Service? -We could simple say "Because it is a **core domain logic** and should be implemented in the Domain Layer". However, it brings a new question "**How did you decide** that it is a core domain logic, but not an application logic?" (we will discuss the difference later in mode details). +We could simple say "Because it is a **core domain logic** and should be implemented in the Domain Layer". However, it brings a new question "**How did you decide** that it is a core domain logic, but not an application logic?" (we will discuss the difference later with more details). For this example, a simple question can help us to make the decision: "If we have another way (use case) of creating an issue, should we still apply the same rule? Is that rule should *always* be implemented". You may think "Why we have a second way of creating an issue?". However, in real life, you have; From 36947c9ff825e32138f9f5298297d03577910a7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 29 Nov 2020 19:02:13 +0300 Subject: [PATCH 12/17] Documented: Domain Logic & Application Logic --- ...main-Driven-Design-Implementation-Guide.md | 41 +++++++++++++++++- ...ven-design-domain-vs-application-logic.png | Bin 0 -> 23607 bytes ...in-driven-design-multiple-applications.png | Bin 0 -> 118814 bytes 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 docs/en/images/domain-driven-design-domain-vs-application-logic.png create mode 100644 docs/en/images/domain-driven-design-multiple-applications.png diff --git a/docs/en/Domain-Driven-Design-Implementation-Guide.md b/docs/en/Domain-Driven-Design-Implementation-Guide.md index 940c012d5c..606347adcb 100644 --- a/docs/en/Domain-Driven-Design-Implementation-Guide.md +++ b/docs/en/Domain-Driven-Design-Implementation-Guide.md @@ -1403,7 +1403,7 @@ While some of these problems can be solved through mapping configurations (For e See the *Entity Creation* section below for an example implementation of the suggestions made in this section. -## Implementation: Examples +## Example Use Cases This section will demonstrate some example use cases and discuss alternative scenarios. @@ -1760,3 +1760,42 @@ public async Task ChangeTitleAsync(Issue issue, string title) } ```` +## Domain Logic & Application Logic + +As mentioned before, *Business Logic* in the Domain Driven Design is splitted into two parts (layers): *Domain Logic* and *Application Logic*: + +![domain-driven-design-domain-vs-application-logic](images/domain-driven-design-domain-vs-application-logic.png) + +Domain Logic consists of the *Core Domain Rules* of the system while Application Logic implements application specific *Use Cases*. + +While the definition is clear, the implementation may not be easy. You may be undecided which code should stand in the Application Layer, which code should be in the Domain Layer. This section tries to explain the differences. + +### Multiple Application Layers + +DDD helps to **deal with complexity** when your system is large. Especially, if there are **multiple applications** are being developed on a **single domain,** then the **Domain Logic vs Application Logic separation** becomes much more important. + +Assume that you are building a system that has multiple applications; + +* A **Public Web Site Application**, built with ASP.NET Core MVC, to show your products to users. Such a web site doesn't require authentication to see the products. The users login to the web site, only if they are performing some actions (like adding a product to the basket). +* A **Back Office Application**, built with Angular UI (that uses REST APIs). This application used by office workers of the company to manage the system (like editing product descriptions). +* A **Mobile Application** that has much simpler UI compared to the Public Web Site. It may communicate to the server via REST APIs or another technology (like TCP sockets). + +![domain-driven-design-multiple-applications](images/domain-driven-design-multiple-applications.png) + +Every application will have different **requirements**, different **use cases** (Application Service methods), different **DTOs**, different **validation** and **authorization** rules... etc. + +Mixing all these logics into a single application layer makes your services contain too many `if`s with **complicated business logic** makes your code **hard to develop, maintain and test** and leads to potential bugs. + +If you've multiple applications with a single domain; + +* Create **separate application layers** for each application/client type and implement application specific business logic in these separate layers. +* Use a **single domain layer** to share the core domain logic. + +Such a design makes it even more important to distinguish between Domain logic and Application Logic. + +To be more clear about the implementation, you can create different projects (`.csproj`) for each application types. For example; + +* `IssueTracker.Admin.Application` & `IssueTracker.Admin.Application.Contacts` projects for the Back Office (admin) Application. +* `IssueTracker.Public.Application` & `IssueTracker.Public.Application.Contracts` projects for the Public Web Application. +* `IssueTracker.Mobile.Application` & `IssueTracker.Mobile.Application.Contracts` projects for the Public Web Application. + diff --git a/docs/en/images/domain-driven-design-domain-vs-application-logic.png b/docs/en/images/domain-driven-design-domain-vs-application-logic.png new file mode 100644 index 0000000000000000000000000000000000000000..e370cba71e1df3b81f1c09b5e481f17923651012 GIT binary patch literal 23607 zcmeFZcT^P3*Dl%v5)=?n$p|P2f@H}V6eLL!1Ox^YBnJ^Bhfze7EE&m?bIuImRX{+3 zfJDhTXNDo3YTw`a);jB)d;dIt-21s)4s=)T+O_N1&ko(=Ck?enBv)v!KoCTtr1($^ zg78xz2v?C12V7xWs#Sp?CP?X_thQU?`b4h{i1E;rU#4G2(_Px6>o57n6_3Ue*iE;s*8QkxRo2x) z(w@hRMlO{!E--u*Q=z~k+F?j`q>j@PxsKo>~nOXIHt zSStv1e8~&`4Ch5K!k;Xv%>?l0od2`5|Go{I=YKQu|827V3?l~qCO#7KP7$q!hR9xfDWBegKz1kOD7qN3Nfpy20ikUAh&Ft@Q7>9+n`N%-1 zz`w|np~z%1slL4@CU&LkrJEaJd;3OVzG>KiWW@FYP z^PB>iA_4? zi{I@|9<89M7%xl?mU?-7hh~(aWl;(*h*#Oz2m77m=`AC|ndKZg^1iOvEw7nP>#V)K z5<`X7>yI97apulr_gpvUcW8wse|P3Zl>WHmT0FmemoxT_^=xv((myL!HFbgLi>#|g z<*vU8TC1r6s!=KGC5YO3r68wc2M zT_GlY09)#}2lKN*Jau~Q^+Ri)>>a+f%EzfrdKntp#$Alp9Hh?A-1;;5VSIdhy9BFp z`(E0RCtHvw(%Wymv7PN(7CxzwdXF5liy5-@@`U#@)7`RzZwK4kJu_pD7xzx2PpZ7L z^8@U65KwU2i4g#W<&=kt38Tv#hrjWf=X)dLCah{{fRPFV!5unGoWYbGR~BmR)ayZA zbz|wX9m%34L0#SY9!$VRb4@DM+W)hlXM&7Tjk+8iqAUFQIW*Yf8f3e-vuhG#Drj4F^^;#N@bFYBb zPh?!3ZzN0mUXR{P*_`W>ULaQT27|oUE3{cJAn8N&Ou6j9{n;t-3iT1y(^urj79z5tT4D)5&cH; zKH2gouR`2gAek!_%Q!N#RTT7+zKvoR;>4Eh&e7jy~NO^spQ;dyN_g-b5Ldqqov>b^jFOAD>PqzwfEHFFK-Io8NRMk=bALl>vXUje}m-Y6@=nN<$X*qOzw zlZD?;0|V65zrCh8A+PNQK(L1_(pn-qZYn=tjx@MaM0#jviVURTgk%V1!C60W@xIy9 z^UscBP0a||-kZjmv4ev}XZH86JZOuGA}+^W1uiIzDlfUvi#QOg37LAmqNF`$TbdCf zd9sd62-)5Oo=aZSc(uKK!EJVV`P2JZ$R$H%W(}3gmVkfw*e{?*|D$#uiG<{YhiXr6 zS8JSjC@<7J3360k+O@eCbW_X)AJ*1*}D?Xm+?`|O>D`tUD+CT9}MW{0dv5HE5 z0o)Vi8tFR{tnaz(@-f@n`%d$RLaMAALQ98Sws?@(ZID>qruXq$YHMM-<^M4Kn{5R^ zgvt)*;N7x&FW=Ginyj$D@;Y^qdb4s^UG4A{U0&XK4*})KgX0m%8}&X54NGXK{-&2w zIra%C*W3G#$DF%PCc#FVxR)1$Zg-bFC;7)ZM~-k7^(&1qk}`bj7j8$K|-;x6#T&X9`AKND}7aUwWkc zLTZ|K2Xg{B?6icQbrxK8NEumM=-RbNRz=&`?hQwIFU}{XVCt%Ap%Fg-R zkCZdh)7kRA3QhXb9UB@|YALI!t9z0c2)HdDyHF097N4Bt@JLAWV3v@Ewv7vO#5>D( z|4dbD6(46DFgG!1*gN|&78RLwL%iBByVt={w)~d2r`w25ZpGwbO}cfiLS40?!UFRe zRwe(wQbHM@zZJ(E>@iO2WP9|1-jq;c%r z+-AiF7l6lzNTSd5R!1TKA8>Lb*bCgb;yrbzVIM7)6QG0uLE4;5E${)-=R09>2mE* zY*gUfT!~?fbnUS@W9$)yQKY<;PA1KF5{5ddM1SS5`GkbmZPk1zaWRj`V#%VW@k7#y zNvWL-5hu9Tb`IXSoqIiK!yK`ED8c?gK)A4reRg;I_?Tv>tMAIAM+ts@ zv&p8kn!_sLflZsCZplB5j~8cOI1RabJZs9y13b}CUc!YMKm6#uKJ)y6j!Ai-SiJ&& z$)4YFdYm! zSWdVV(MdQ@B>Ts-Ie(Xa!5HL)jN-4HyKevKX zeF3e6N9Cpc{PqBhxh_M`IGl?Xlj3$*ZQ7ijwcC91Y^I8S>Bw!^$0Ce^uXEEdcfYux zSDR~M#&oAW1F21QkyLaZJwDDGZ)>CnLg;9@hEj;zPU%go$a1Of$AWUkIKYePB_m)yljRNl7 zlFXkWz1NC-?I~oNoZ>LDR!At`c*>8?L*Eqg$)5QoOefSGn&T00aCJhXS8gYjB<j< z%gpd1>-^U%9^z8;X8XV*5Bovx3yDW7Z$BH8A%jxk%ofs4JHHAo)4)Ggn0wn6c>!O5 z0}_;1Q=9v0uHQM7%|Z(o(gso?R8rvEf9_>xYtsC!B6xiJ&%GfTBDl{`GLW4TBkkk? z^5AdX-5;+0fgScb_~o~bh?vKcZ#)Qe6?11rRGu1cMFbH22Y4%>Ojz^4gCGa1U*KO*+Wz0Jy1=6U zRaXChZtX*#VInB?K9AJ7>@et)K_yE44 z|E1ODumWv}Cb0Zxw)XXM9eP2L5(qjVgw3GEH00Yu4#|81OQq8Kn{PPUA|Purc%3u> z&dX}o|GhOG5;w2-Nk3mrO)a@0MD{KO-GLRj^5WWE>&O%wXpjl)nd#0mX9T1SdxgXI zeIE`!8=d)?Xi%O=z`Yx{2ey|WnLzmNt%up397ki6PVePQAt(%no*b`SwJ>o%9+aaD z_CVG}IDs4f6$jD=Bo7hFYU*i$1pQw*gt9^Q4%8V$kVZ7nnJEUf#rty3olQI5Rf7YtU)cl;3;WF2lnd*W|*woHpg<)FhVl0l?Xq1D0Z+wG7^BP zc&*)&h28Gc{vE0a3qQX5nobHY4uar$gD;euUqrBiq&yH7%F}A>9rH4t+XzBY!?zo5 z<4VzOAH+vdLNY-0;NgjhiO6ccp2`QGyMOV60rS9g&2Fui9RkH9&6u*!Uu$FY;=ovyOD2Eo@h@(}7R z>uM&{Z@3cnSA}QCrsOwZgdj)N-#r5kbL$pc`ny`P~JVY#@_Pt}pYyF5U1Y zX?{@}rN_3K4h&8YJE|vS5bch zLWKfvMWw-bTyjI_&?Q-+6oP{@R|g*-YyHj51-uRp$9nqzgxew6QAVl zFjB@D#5rrgNy$JAHS@yS%`dq7xVzIhsdU$xk{QQlYf?ef_*`|6%ZUJAFR z_I~GpS{DTXz+`7`Q^M^t*7l-Q17JBr4Olh2>c_66|1(q5F?@)Z0Y0(!t+884iHQ}p zWFBl?Wk0?=9spn+gyEv4V^#Ixl0{zlgm0Bvjg2EP=+F`KwRq!@{~>XDQ2HB z1;Ux#UH;d-;P}rqKt{sC>SO!Pn)B%_qmb-xHYl7HG|Oa^cO}BYtTH?cwDT5%9aew_ zxUdGn$_86jJqxAEA$38ma$>{~3*5;J5AHC#<_^qbtDURqDwWc%J`E;>!^)6E? z(CKup&vwZppgNd{uceB{W@%dwRs!}5e~)QsB7ydey?VZi#!e(ldQ!^O05H_tN^mg8&jurAGZZ*;*%sXO0NpAR^D>&j6cB%^69^Bf zDuVrzeu9<;$xGl8(=GVYeQ>F}mi|L9DWv$39l%;R!*hSiSuAAgCVyN$5#$VqMCVlN zIyT|7d$6Djn8wp|9%JMPi}aSm!MtTrPoOw~4)a80bYEefU&2N^$WGx$E+UDvE6Js` z&P59H$zY%e3pk-yOb4(M%YGg-Q)c|RgX16whrwentuW-~SC=FI?)q=`P#C$%M+~o- z0@jqN&+sHx+6eA_Knq#I6D&VFht1^1?ieAF9wxXDS3GBIR}mmd;wK?J4}q*4VYXpr zddL#4+%5f`!&>rVcYfc4E`fLgP}^71`hqWB705)!yzE-w?w_Jk_w8z&dyy7K&AWE#6L;;CGj)b8Y5d`z=iAZ5t4*& z%A&;@Jv^WOC)+p_Oj67AB$JElT>_`lMx~bhM4bRit-=^8K~NHRy;Awd{`xUz z^K8W5Z#rCj$Z!huPAIGN=`#J?MYXCMMhsHYo)XZgL37V8o9U8p+EM&Evzb zUcvsC6-MS%e;_(at-GNhGp}SwvV>iK0xMEfKE)|Shs5F}Bf_QozAVwo*$$i6} z_SSnq-zmLxM&!iG$xB@euY2QQ#23J_-E4YqV#+uZy3Ma(nEI0qcJaOmLnyL$;L!9& z@7w$+Q=MVZuC&NQlI3nT2iIB*4iw39xdSdsmT^jZIp`vM=apxXvu%6t1U z9>JoO%s4Ik0?`Z5-uc@+m3#6F*%w0;(68O5yZsXng#bx-bF(1zhER^gdt*ou&od2JC^D*4EvAE zGrjQeyrFP0FrKA&$FP_;rB~jwPu=djmux=))Byy`--4w6e@4b(OCmP_hwRyhnHfrB;J2_C1l0 z8Ag^)23nGSNc%WB7K)W4)QVwlt=Q+njs%J&N4A{o}TEt)d#Ei`Sa5ylAQY8T;jdZn{*w3*AF*%H1NK*e|2v!c@ zo2r{-Q~!Kschba{a_MizwEbR(p*pXM$SA;B@CKfsOM8H$*vO&RhCV65n@hOOaCSWT z%Wlb*E@~Zd&pnyZHn!KV^fD6!KsvqAFgAl;rr1EN0kpm-Rjf;Os2;VY1lk3I5(f2| z137iIIO5Ka1C%AM<%D;CUSlr<9z+Zn4duul`1AwSDqbx^NdO;<_sm*}`b$RW8z}Eg zj_?f&s2Y0?-swlmTvv$L_b(oIi#|Z`5`#VA+Yr|#Ymi!Yl=!}vGXEh0;euMn#PWj} zAG4QHI@>Vr)dIpMe8xkiV@NR;EHgtrf9~NDjN_4+vrgn^KNr1^2&V^zdl0^a1m`5;I9DhP@JaQ!`v_Hv{it9E9fIS9JM`T`zeL8%aR4%JV z(C0tfe!d#u8*sCwe3a8m((MxD0gxfXf0bsVP{H7mEQ3tgo65_nail0DNb|x`xIg>u zYBkK_B|Ic$(hTT5+26qFBLF7w;OgB2sqNvWbQgabL$d~j`xN3IDLzJM0wA>S$%f#3 zQQ*OQ4`@#F(yPKoE0#sv)O+x>>`Y7bQU+*dt*r4d0v;a#+BK<<#y%bnt|3Y^J(W_( z>HkI>RHLO=J^HJedJ#dhJ=Yy?z;zxE?*!%cMzq1yk1g)BSZt|^Mox`b^w=nnL3_XwlH%xCP#=3|HG z69HKg{j(?jo?j)QtGO-zI5qtPS;l~a^RqTY<8QM zFT7r%Acu@P_PlBhd(6uvx0ZHyU-QQwh2YCDgUIoU@MKt=IvpW1C7{)v9Yu;d1LtWu ze7+~}&=cB^2PW=;FZ@a_b_W+SUR=NgC}Rh#G*-40>WN%}!ebCEq|Jb=mrFdEp zq4J1Fp;ULzo`D~5ou-0;6jhR!_OM>PSh|6gK?fNqPpgGM=G)=ArdBP~42@*qpdP?i zA`jgqL5&yFl}U9UB9?*qw#-G)Sd*w2sHM1tO+v^#$r@O(Nb!EUWwTL3(7b(P>lr9E zf1m8m5}^<9nj=Ay(}!w(;ppzJ?=T=~qzDmDN*N4zkP@TVz$Qj?e<^5h*`O^ECM<`e ztzW67f3JH$)Ym{JQ4$NHO{S;90uC=nYw&~z#Tsx@V5H2;%|aklq&AMV63W+M)-ndaeM%Eg}wLull28$q)axGYiV zQfEQ*3i_z+Syu!SA%IHtoLCqUy2Z%K5_*Wbz@j(V`)DR0&4WE9nDlR%zOE%cv3G(8 zt>z9F-J8Ruz7J*@C}E(~>mViK_)oSY!}wbTLkuEH)(9>YN^xo#ya%(d8KQfmwd?W< z10(>-<%QS!2d*|~Ju*}V2yUqbE_K8G9-tGjE78=@P_Tc;M-caKsXM93JOKhIQVwLI zyAmng=FyE0Z!$LLfVy$|W@JZ3{{{si)cibW4%dVZz`r5$J{9Dla+47n2b}6=Dwf1e z8FVxbAU54>2F?Lgf=nQ#191cxK@6O$hPyf=_}#hdhbP4Fq=kUjrC$E-Uu4z|q#GL1Q%%KArjAgVk`*L4+20N#lYA~G*B8sA0{ z7$n8o%xe!T(NzY^AOJF$bt*-Nw}_x+E*i$>AMndQ!FgGp)?jFF8K(hvY&1^2vi~Wx zpNJwgakkFzoSY#*orAqc+Z(TVKqx6dmBA{%ogIV{fW4V6>j?iW{53)(BaOE3y4LIl zS{NW8e>Nl8b+CZ zpr7gIB`k0qO7}U=E+pFH_u^{^RrTWtYWttvz{32xgXF2JAgY^ILTwMgUcGdx`&_(9 zp>H5@qY9Fr56SOYhEk=0uqZ|azAxA z1vGyo>4jKMq%=Z34|M3MJYax=+d)mCzG>S=5Pk)q2UnZDBytnc?52G)Z+uc2vJ8ji zWNA5pnwLjt0Rgo&gIdoIR#$_g`^P{c5j2;fNo8UJtmk*l7oGfa)Jw|2T@;d0*XcZJ zu)XxR2qAuyyc9hd;^4#u$rS611@kmYLnt)>&kxK#YiQ-+eb8|L1+%YYi5}azg;P5n+e(&=oT0D8(AsWi`peni-30E+hy)0>;z zyD?v!5UBRq>IHN|!yuTTjw6MdZ|xo0ZWD(zw5;w+h15Z3Kzk{|s1>LGA!#pqF5NM>#}=*Skr>0<<%MwnIM zLwz5xUJUNwM7n<5B|}xg1GUVspyt_$U4fvqP9dfu0T9vg7-c+WyD*?NJ7!1-@ydYS z%hf(TPRhU|kk7$4L0@Y<7#A8W*W(1eiJx2)I|#Vrh5G*80`}w7WX`VJ)jObn*GB-B zzLxFWSoS+oraPU$!hV|H!SRFVH_EpkjmaZJaiR6_m-_P+AwN`Z{4Hn| z70fh~7Y(6Qb}%mjC`r5C2r4sqaz>e6c%P_UpcmX?J5~iZaiX>m(1aFH&;lrUtcGO(EjDn|1D-j> zJ_RSPV5S3@xh%Ng3CZ{ZcrUX7tUgGEHv@t0-5F?crZ&NXywg9DrUrnR&7uwjz2b!h zfmVx*uYBW!O*T>Jl_I>Z0=S|MJkjYs5ZL^d9SDS}Q<9<Mb}zI#Wd@Sbz0IQ=JO=av z)6w8mUU0`AfU!5>9WnwGO@8`Q*p>hW27s1UEo~_YV>1GHf(P4fh&_lTeT5(ij7#V^ zg2q6nb~*OP4(&03bdNl;8uVN(6Huf~N^R?)PeC@CnGg1=14R0Kat|^9nCrX#*$5B( z{uFSB2TK_@&+8^SKw$ErW1x9sLs!Z1x4{ zE2aJ5HX7eXRDiZb_%(PR>Y%l|!E?zZ7#@`hCQ#!7mZbx~LD0GikQ4xZoCx}Z>OBSe zyx{;FhH>RL0q~d{^hfPs8$q84Ff|6$-QXchM@I(&)a@Dx7-mErXt69Kf1ZpK#erT< zISHc-+uzp#A5`gaKAoAUO3G%g*9OvMEe?hm2oEeD6qtuTuo-HP_U5w%^%Kjj zU89Z_=doQmsO{yykBFMXL8m~0`?;>XZ|j@#FQBStd+K07IZ+ux+;JdBkqWFKvj(V2 z1!MT#D}P#jl>n;9t9Xq3IQh6HV$>EC(Q~duye6Ql{H(fErJ6iHXdN`XCvc%L&@}Me zGQ`nH0RB8A_&c-Sk8u%1`kE5NzZooQ#-_fiCr%WaHW{0w`0h{gm!=+AZi$Vs3Iber zFYOh@f=8Jk<)fGL?B?_VL=mtwhM%en9E4s@rJK`35AbkJ6=InJD48b!#DB1{*@9opay}p^UAR!+{g?O<_BK5t{%iKLy+gPVhw0K zLL*&M*O$Bb92mnnwLjsnhzigFJ@|6N#23gF103i@o&xd&MHTQVgojdq9kpAB2MSO0 zW?jY6@B@L={=4&Eas3nnIcs?Ae+vd@<}4LmkQZgFb=;QH@qr$L3e4FYBVVY3gqW;A z`}C>;P{hLJ-! zlI0LwwIBaLjq-r!7cck!2BDjHJWq3YO#@|)o;twEnckB=8#dxWShivs&$=(LzUK>5 zlBfINs@1R!g7$E>>3pjwHk>6^l2_4pf3k^F?kIBWB5O&6IHD{0DmdvnO#9SHq4d$j z#qa?K1dSb_9enrH8!r-kx9czR*8Cyj5U?B1sgpzDCd`I|3;GI#8anI1_~x(Ofr!Iz z(E(}zUoD{U$~|V3J{Jb6KqKp6=c~SN(C=ljVZNuBe=jv%R7o zHmLx>FBBK`aeVD{C_Z&;zcbu)I+`*y;XAnzaV&G0CE5*i58*0e`Z8NP&-no9Mb}*K z>FTiY#Ke@F)y*wO4syA>p-VqVr#p6nv@XxLOZ(iJyN5k$FJ_Q_t-xUA{&%|NFMqZ~ z`jlv?J+Q{+G27^jBZuq^rfDz0i02j}^HI+a(l1No;B5}@m}F#O{;0K$>NnEriJRez ztZqths%kmYenu|Z#PIe+=auozdAA#>V6Ee(m>u#dmdFF)8;1pJk`SDoca`J?yl%Tb^c~|M5Ltn3CqMy>iRzbWWGR zhzwY=8T9OIbyj=P^%o5lDqn8H-$sBN`y;k!Y2o)JjVfO>VQ9-#gRXHxA!dov_vm+V zlZRo=@KH`ktn{ie`|&$pZ12V3G}#B~lV5DDos1XvnogH|kK2vU&n_Ic ze2^J+{Zc67`)y>Ikvb0^$Wlt`@dqJ460L-gn3hEfoZZIVwKuE{e|X`C-1j9T;Wn&w zzf8>kI7mE_YAnR;mj3?j3^T(^S7<$=Zzz2I)EIPaqO5c#rPquzM$^S zW^Fb7ns~2hFR}eDMXwV7dPT-t+gF<%wkbYukHoV2CF*tul%}{(kmz??9yAz%#h&qb zhpH>mkAN)-L=O))#;wBMmbqMbR-Wu#AdlB>JSro!H+GLYJJ>6hQu3{FdCsO+H-45L zQN=T{=F`%6v9E?vIahG9Nw3u}S;yoIOgd~tU&a&qVi4PFwAIKl{__@tZ>pF0ut{Lq z(zP%)Piws1VB-4$$0HykaiyX^KJHbs7)6 zy@b)LM1N=(2zfv+9pfpjdgk<9=KOqnY9gijdItdrR!%03YVUlTBoN0Gk1 z~qvj_RgU@7h1*t~!BNQGSYeZp+@SMk@?Ww2zNQ`!UBjFZkeYHCmNC ze`;M=+W6}aN0SM!>sw^qnjr>Ni<>ayfkx&&JbX6aqsr-{hWTE9!jY^mO4lnxtJ{i~ z(83ygN2jc$Vz|PL=Vkw#^`ThO+sV>;V}oK>n*G0P&nY%KjuauDv9nVXDdYL6 z=>po>bK_M?8$!1F?aY<3h{>sKR|aHA(>ypc@7?E*6U`|Ft}9xkn%sPWWldW#xU`i_ zw_wJ2IoY_3s52G+icN&{X1v=o{7(P!n=wwk_gve|McKam6u?*KzUw#P?k0Fri?k`w z9g)iz>jhNEI|qoux8K#Uh)C`$Tur*MrT??4x#R&Bh`)rk#J9FK^W_HW|e~ zO%o?AhVLeS-4AnNKyt+=e0R|PJ?YLIIL;oG7&HAY#$n-C^kh69xt_$v{qfA_I0MwD zl6|h3cH6?LI!|=5e>d!iBXtzXzvlF$MHizPcyyfQsT8qZ?J^hjJk^zbk3<@Y6q|W} zk6WBW-*L$3P~~3V*e4{D9B3eD(nWsa1O8F^cY?OhEK&fl5V8_7L9qy}K zQ>QGAskmHe8wu)}94mx;_D|y5u6;gEN!IAVS)%z1mO0jGzl*!IQo6}OmN|lUaRBdZJ(E? zQ@8NgglqoBUMjgw0p<5psvHH+`N#cnS$s8CCm-hK6nnix!Nw6cQw|}MrtWusovkc(%5^SqF<7A<$OSV zv`I21mbSWBq7HC)1bY}7P&@bLy(tY4@R*pU{aDybBZ?Z7%#|WXrJ9E9^qdCJ>1rq2 zON_oEr`*V}#Ds?CkNrQ2r!Ry=Rx37&fa?)=Gk9ruGj~;l;QHlB6gL2YikMKbjT7~) zb%_QK%#I7!Zj@t2KGDdV=Me)U4|ldSvyGmQ7FU69M3kT|fw|W|?FjM_hDwBHn7fQs zg-V6AkoQw(Qr05h-rBXi7iDVtrOm_u-Pm1I|7kDPkKF;`nFn@=Q}&SRpMzRV$|Q{d z?v5972Ml<_fmkQrs^NtOv@D~Gc@~d>HL&-r9yrXUi()3>a zup?PJq{lGi=uhvW2WztV8W)CW z*MOU>`^oOdFy!sp(^2>UM@2m&+b*r)*wQE8vXj=x4{clA z9tj=Sx;)PwCXU+qHsji&ST>L#x%<&o*Z%bl!_ExMZ`FtlU2n?}7(d3jm2DmpOLNI> z`!@sDMiM6H@dT@IbGQGd15yCL`C|vQxvAD!s??4^;Z(0IhrrUQF*;{$$3dOb*7KZ! zO-6N+Kgc;I!$kW-Q~mig`h^;hCN z-H8Dirvyri=oN(sihyiWe#19_t)brFcmJ?SM4UxnI4toLNd!I(& zbV8;Sy~iePm=rnbac*7r07n_Xy{2qb zR!9DxE29H}qgKbCS4%U$8^@bN;_5TmMqCH#b`dYg8gDdk=(Rt~`u)wv#t1KE>S-VNI6 z!NmtVTEe|vVSkt)h;9-7e*u&!rTRPJIPFz>=o7&bBymfFxqY(HTYQ60V`$U2*v0pJ zO2s#6R*_o1gzqUC;=92=nKl6gfrszrZ{L*y_yvqcCou!a*y3=_Ta2wEC02s;^P`M2 zn%V2cd4{FK-$Qfh`Mv9>?UkMs?x0srb6?T=(c7htbxargJ8J)WdLa5Wqe=SI6|+=$ z;V#wsc~JK-Me^bx>`LBxJiG8y^^BGlvShT|p7)Zg($xCL@-YvJ9rVO0@5!3qx8Wc! zSG@AioL;j^G;qF6nR{f>dn0$+Z+K7Y|tOPfs><$y-AEvloatwIyst(Igemba(Pn1ndwz- zvNvvAHa^02bZxk<-hI2Q-s>FT$XM#)P2C)#6Mj!53eV>Cf?qSvD&6IcBx!7QX47{i z<7b_0(+Nei8#Rwg4SJ2S0^0zB)5$`#2!et!!6vq&TH8G#o;88IhEm6wU>$zFA*pB+Mp&# zT!p_RjLJ1EWVZcFOOHVwq3bXf#mv1AxP!pDiKry*i?M52LSv>{ipNsh>g9YQgq|vR zES=NrW3vVLxWx~Up+IZUMb5Bn9wSY&L}&Mrl!3RyM-r?3=buk(eMtIJ<`^6m9mE@!k0|sgvGHl8$G%PrbMDWGiDUg3foJb}9SbmQUU8rbYf1 z$>779Eq&Maz1Fdlg_9X`^$nmdo}@5-Qp$W7(T>aBw*&$n8{IU~tnq@MI|Je@;^S}s z+@qi`IZY(c6}l%m2BbDjoR%CNLJH4Gfr;9DY%ri&1%ZTSS?5vG;aRpTXlg!C%ugxn z|EHqy86%H3aJvo}-p5MH4A|M-6y>|XW0xCE?LDHsW8LUlfN_G_^(EGhl3%c5PL(NEdMta^Ih=<=RvU6>nfmp1S&{+ZT)p9`DiAS})4-j0Jy zzTJ}X(zQ=|wZbo{mVfrC|1atZ~V?a&Wla3{0@3Ot^ zRgrTBNbi!Pw|?D~GQEbX>fl|g;l3^EiYx4q?wOrtUf+@q%<5vJ7{|fRiEq4p{Hw;H z9EleeDf~S?Miuw%TfMJDkwS09lFo*T8lbGMb}|!w;LMRERLA%v=zl&sZ`E!V*Zxxa z!c9^arnenBD%@#QnoxD+Q~Rj*^UaatO=;?sHyG3u{aK9EYe%fxX7~q@wcS~)QbfkI zD&S?;!}{Fd6CuFJw?Qqa^yY6ZNbQ==AXj|9`{^*g!7joSew7khT?Mo#>!J~UKL3Fn z?ee8-V#2o1nO#J#Azj}-KinkVOyVE6rt;m#?+1d}F;N4t?F5X*nR>j^wHCC-{y|;s z7NXM$&32R^ZVOk{ADrqO@0##hEro14DJQ8r0Gj%4F=jK~ILa>i-u=!a@EwcAMxMPqZ$sPE}4R|I%l^=m;lA9|8DBS(k zQ62V8c8wS(X4-U2fJ3!``4uKkxYorv(Zdv-)$ zUc-zJ5YE9)cj+}~qe7@UjwWXTHPudM!fujj{Kxfy;sI@lr}5-%VN_evBd2u(!ejSD z+#EebzB>C{>2ZGXc5a#VRRUf;*5f&bM(=WYb-~Re568r1kQebt( zJ^k-D2wvf48nvz<`#m$wrfOIS?eiuUIX5*VSiP6n;@zf20x$nDZ@GyiBg?L{c^yP5 zo>SvhJRkp5N1E^w{Pd!-=xFp;mvNqOP!N#B# zk5%GWh0C_u?&C?emg^k)(}@O+!pG0wYJwIzgc7Bif8v)V?+EGgE8o*^rg-$`B~p;! zrN#o$pR#U?NJsq8^thjPS@*_Sh=tr@6_h5C;(4{_kkP5Z`x^|0izk6RG|*6H(MBy;^4 zZF#-F9Ax{-#O{ZknuBcqi-8IGWgI_C#-sohB?|(ikSOKdaou`CooRxNq*+C zoDlcj-B=80p}5$^7GI~m&Fgr+1bU4*`EK4{&kkNMWO)L-VH@{Ogda7vMpn6=n@v@w z{EXrmn%p{fEdn|pIXBaTC}i(B-MLT(s|MLFAJqD7{-I(MJg{CM|E_SrAze_+ zH(@@SkDcB=SgdZMA3s@XnOTF)n{o)0AqXfQuvCvD3TnOvzGIi_GuxAfR*tuq^cDOb z(N-Xmo2&WaTD!t=PUtr?`*J|8R+ z8NKYG@G{bB=i2aFWY0Uj#Bok;F5-wsCc7|-Ws*Q}A&*s_kZ{xAj?mowD56^NJ=!p` zsr$poV(~Rcs~MT`Z6)02^nV9S!jb6Mja>}`DDX*xxzPE5y6z+wO{iDZF>)LE#&~uN z^WC8!Ij7;)`t3MCHfA4<3(!rj=kwYx8dICML3+|jJlD4R37l_Ty$L<&?*zR_uYH64 zbFjaZuI34n&D^U5=EHwmptTKyioR#3`RZBX3{V71Ey!7CcX$36GHqNQ#}IR&ph|?fJXm@ZlJ@^jd_ev|m^v<-O|10wa+rweT zt4#?*iYA93$tkDs0!hkBD1iw%F%<{Nm#6cr%)quO_>2>euH0^ocs^Tz1uoL^DO*-m zC}m9Cw@gIEh%8$j{lw>*6iEL=H`=@tGPgtwqZdH7&^U3r4bZBbw={dZannG;b0^E- zea-Y|K2`92JW4sCG|+~?7}P(ZC)Ni^7>iO*L81|MI^Fj7h-P*YOUF#Fbl%N`Ku~a1 zE$fgoHW#=b&UVN4`rZ`CxT~npX-3xSEnz+ig2wD|uA7yGt{7Um=)?V!YW=CoiiHCX zHqIU;M*7AoDJl-OX+Ny%#y@I@!$8>1UNz4|7wcoVwi6>O*w)x%8(HQGmuhSntnps> zrJ2pOl2CFsWG^)RvToOxu&t~>0<Ny49~0j# zpwn}8x*y#P+DV0_KA;9?%70k^5{fQrn!7oND; z;e$OLj`&81Z^#=wv&iQ2+`lu$ykJ^6WJ`#szXHe|AeF~RCrq73ob`e*Y0uEWIlAxi zktizJDn3Ez?1l=)L=`-oNhH$x#8hsw`|bl9E@-Da7}sUv?wXyxIx-TXpR%;ilg7*G z8zh?T?>^~YY-q8!w9?-3Uc%fOBhR?pMK&i|g&80#rgeV5vNynbZSChJI_(P0l}~3ta>B}R z_pa}&Be8_lEG5IrKhJpOairob00w1;!Iwh7N%$Q`0GIb@Y=lr;OvQd#{;8I|2|3}BNit{@4lSu^+Sj=bT5VMy2HsDv(Blck#-U82i@+CV ze}?XgQ{x25M3Tf=$TB?l-n;<<3g{!p6cE;fJ|$@EJxX$kU6kSCxsKBFEen^@S8a3+Pga4q*Mfo=JSL`aWSB2 zzq6C|SOO>TUSQBa$A8!ZV_iVA+M?#cgm(j1PErPwTBR}-&>mo#hyhf(&Van9s5Xj<^=YgDAC8scgF{enGh^JJ~1?Dgm2vdYFEJX0SW` zC3dwAA$PoU$K3=jbUz-6)O8Hm+C$HQR{6o}7Js$_pZ$F-ehNNqRsOt6%faV0frmfz zy%XVrwXF3RkeUH2+Nz=NHR@Pq^cXv>_-F1>M+~ctv#!>sB0@s|f`|h$Xq`jbn%=mS zchuF>gF6le{7qQt&wndo#M8YbW2A6XZ6_%}n;*9@jxLwVV7n5YHF)=Q_qb}$g%wN` zOSBbah2PG67HZr(7qq81Zt*GjnU8IfueA9qk<^=V>}HFc*s{!vW=|D;Gb300 zi9N7cx54IvVUr;uq!DLoE=B)-Qc*vBTd<5p0E5hzKL*js%4Bz4+{B5q*WHHBKAJ15 zFP468bcomMF%=jV<*QL~?XfYA46W`zu`u@JxifGDSCRmYh32tZXegg1Gvc1Mx##Dm zX6#5CH-_AM63!*_xIVM7>V5@R!pAT7|DZd~9Cmv4ap!b`QnheizV7OS=xo`;g3K}R zyPg>NSr_;1%BQ~S{(=;|v+s*(z#p>lj7=$%>3%IjjDq0h&K^nY zZ1B9IuI;D7OyW27*Okp2B7`2hK4>Jd)DvwrBAl0l5BP(YM}#G2^c|Z|4Ve1Zf%9U$ zwNK$Vacv&(wG|jgaNfl$0<+D!Azo1-8mE^{%RBJF?67EAaMD~`%z-QstGJA-YC$qg z+Y&PenaE=%FO-H8>hsit>wm7l4FSojnX+)StHj_aRMO)4E)pNU);SzV)Yu`8!rPE>PPN%dD+{S)yP25leNBBQcl?S7VhFZ)go zTI)_qkYO&fn&Kkl@S~2_*hp1NSGDEHyI`cw+Pp0Z=(Wb%36LWiZ1A&1xg-HK*WS`7 zb%QN%GDRslWMR~MC~gdRlg~fx$> zaF-7db5-ku&?w(xMbv><)=SJJc>T!O5^0&SNkBaikDmt*mnP?zhpmYLAuG4O0yf** z;GTp+l)ErDh%MPYOoo#OJpRcHD^w+VNmeFLMZVWsAOW=f$IC}Y)%gh z!dgK9n_EAIz*p&BVw7LO?X_hqJybvLIutQC&;wU6C0t=GDkc?jSG_N-T0M@R*7od$ z@TxE6R`9IGcp^eSHJ=m7i0(KwHA~4B#@|BUW#$egozX>sg*SMH9Aw4vXA)#29#CV! zrPlu)XD4qr^EA0%BGM|DyB)8Pb0A}w9mji{i|u=Z{>Vv_SIcD59`d&0E8QS(={z)3#I_IM6^&^H|S6;MaQ%(T8(xUP$DU7Z}NouSc*(RAsO1 z?Q}O^82#|{zAy7u{OI!t2ZZOID96!K-%Qu!8p-v9ZxOjC{iejZ%;TVKTN~nXYvooK zt&8qE5IUEp#1$PQnr9Q@wm$!@)3k1OonM?zi_dt@(A}xfNME=3E?#U}hHw}g zBi0rohOBBG9@Nv7%4_*`D}1HKVDwa2`HTld3hhdReyGlxE80@1Q=atjJzJf4bFpTe zB4y1XSk}*<()>Q>P(<0Bu0}sUs{9kJ3r-fAm?cM6+*9ujS;`Wpr`~JraAQ2NdV{HN z+z6{$Uvd2FD%{iVBXl&RW9}Atl?x+sYmHoZl)oZprMON476h|msB1k*Pae&v-bdyj zRmF*D;GRU1ER^04ZT|7z21NLn+Muk2ml_U$3d?w>E!lO?zl}BFeN%ZX25>kyv}Uz9 z*!2@wqJB#sGWLhWdp2s3hY1JX=Bwz$c67g~Tu#}N$_hN%z^&^PwxybvNtu6|y%(-N zf-##8y-b+Y<8rdo8fBkMBTTqAUe>tX6diP=G(qp+BL-8n$r?J^S0?6>aYa=9(K}de zdT6_rMJ~3WZl<>>jVh64THE`#!&{otR=rjF> zJy9J4Nq*gl9auhs>yMBu&$dQEx=3H;k-}+ZGO|A1n5k|RC-{pM@NuE!our&K+4+&X zgiCMUb}g7ES|Y!$djET<;M^EgZ53CksFxFyGJVb#i(?s+(K{j2M|Yeld6)JmxqOB> z+Ra|7b>$o)Lvl!=F+o!W58S9eI1*Tt)sl6_A`6aN(l6T4b zR;E|XVol^NyXl!+e|Nijw!NoUM)Ry>PmzYr?SJ0oc=5-SSRGJV9 z1F0Kx{6yn&5#23yBxZuosPpt57E{^FlLW*V5YGbI#eTG1xtAnHlbZS9eX>h&8J;h} zDyrRiV)V{_$(Ttc{{dh?0w|k+b}#nwre!U@^ipMDSqz>m;EBzB<3h*$&V6gK{&0r4 zt%3C&$Ai~FNu#S&W$y~xglUXNYG2`yG0q8`+jzFf4ei4t*q zk-9%$BOChpHe#dC1%Zlx@gF416oLVRiOs}b9%1nSK^g&Uwt{rW=Rf`L1f(+lz|8)H zOTb7Pzxgkko4wtDq}&iCEs{!&TWj_NF>rusjCu-B+{0PB+}-i zROI-RqG$Hp_`j{Uud3UUNZaX%f5}LZ(fdiH!z3vQF(s$yzdep>N+wI|ldjt;cK9Wq zIIMpu^82m;HT^*DbGMpIQ%}jtp0jeu>-g&!{5jDox9s7mQ7*1wW- zbl>JZ!_6jx^S;yDA9&qAQ%{;`uL&K!UGHwSpM2rhg~s^Pi~+=A@TJCKZ^{4PFG<~7 z$@cyCOD@L$|EvE;&mgj}@BoSQb4}~2==6BAszup$Qu2Yp$L{=JlVmI%$w*#`o7G5O z0+Lz0jrC%z=UV`v!fFpgQ~i9-!i5qKiUlKIu*9#5EnHy3(L1}%{d0#eE<4`oTsl+iklkU`Ry7IYe%uaxTUrr@6BwTl2=*W>GvpXKE{rdxgBGl6| z@PT{^kBJWyJI!d+TmIv(S?g6Tt=F!Olhbs9f=#Bcl{puGZekG8l6(>p7pGy~N?tzs zV9(x%K0aC%91|6)UBsICBoNLdzN?b)ZZp^SE_W4%>Qoqh;~H+hti+L%^Nehh;o!B! z_NqfJkM{kp-|M_I+-Zd{ekt~wR-8n-9hGNdv}ofzC3V3*wXdn-&qlGzJ66=0d_xubkl!lgAd_O=V0uhq1cQhV-K+g)O_knQADE4t3Ux+IlntZ&3NFc1{W zOG#6Iz`FKVbz)j{bbk%~K;7}0cGdKZ%Mw%51N~Bq!^ao@o?++C=#x}YX-*6O6wMwZ z@UX1x`***LjASMKlUF?|alu=+PJI+r=`nn?Z>s4^->)N!i&OQSK|xbd@wBv4@3ynB zq^UNnEb3cwXO*+uNb=9hV%Os23G3EUFH;d&Q~MHIHF~`F7LL&*Hnh?`L0d2nm5zS!b%Xe65q}b&(OjbXh_!Cg_6g>*C_hzOk+b-F1#bhinG?g=RxS zLX{8Z<~;kV;5>GAxK)br?CvX9XlW~Sq-6%)Q9OJSCb}v$HI=%nSDHtAD~Y^`0&$$|6jjhD1s>cuXR-vYTW@JFSd;39RaIw$Cz_ zr0pI5{kgv0>EFxY>E!kwEo`xFijyhpjh?9@CUdube~xl=?$9>~5EE0@>U#Zfa^X(P z1<&=e9Cz2>mF~)_S7pvPOjzwXwY0?8o{=^uIZOy`6XIvHkop4`RnH=d9)=77h=w6{<>X8B`jL-_~If9%iFij$(qt+jq2qSFug|cnu)apuUHO*f<*e{`;ujp{GIhgWvo?+5 zA>!iio31NyAfH6mwT@j&{~pXHgP9nzsB zkr+ut-BPGnajUC8O`!%D%ZPgaQS~5`u*TY|^$izgg~KvowNciQ&78D%>_WEE^=EnR z<>kc($TK_t-s!wJU_P;z_J}}?p>aJWGlCr$!GdSF&Btus>?h6k>sPK-OuohOEk0bj zJk}LPE|FPgH=O6Sod+3cpM3~0`o`5!slDUDk3GCRVflQEg9jETuUv4R;`i+=2xgOE z<+|2t&LE_=vdYGjc`P=~st3?}YQN!xP6WTazQJXQ^b9;&)?H0$lCwYy;2&$eME%fmzE?pZOnr@70 z=8V5CvV3iACdq$BT4LL_{x0i*gm6~Du6&d4C$~~1&*=!nbQd4Vs^nnyyd|9_!Foij za^YRRrOENJ&WAd@X)1MTSt_3{hdw*vxn^6V_Uh?V4*x(V&ZAfAf2^rosM!7Nj7h%_ z4F`D^?a|b+e_#HN)tH84RR*QpkR1;73kj<)`ceNUHmcX&Hu&x)3$^u1x7C6j%sjm1 z3dGN@xGnyx_LrJ;ojLhAkB5bwJ=Z$ctW5pP9ow|HT*;$>BIccPGQq;G9CM9PCXuJc z`lXzQ6Z~gJRC%ko1Rb6i`tD3y3f)b6{P^`WwxgGHT(L{bnpbmU3AQFJbAZLV#Jz>7; z5+PhRCGCu2(WbhWE^dBYdwOY}=Yo3Q?}4S+)WE_1+O^e0OI6htgBL|B)3J$7YAPyI z-!zrA4lr`OeVaJuL&Jkg>m7^XE#Jr^0SZ3^v93WK5JG~&xzCjq{K!+v77Gb{rfB|=gu`J1){pfMnrR2 zd{fG)%2%2jKWiBtQrl%MV{ANN`&e>u@sGcwkN5cM@8tC66M3$x3WvAvQ*uu(*W%IP zvs@SGt`k3hAwuPNc|vkBiB9Ji=qxsnS-+7BPIdAq$EE-9p0v< zw%+kSu{EZ9XmbkAy00p+AN#;}h8|?mZ-b{Xnm4@*u`)DKJ!GpSb?sV>!pnW!*W{Vj zboBIUsvi`c+0S9Td~QESV8xQMeSE;7$lP4><3*<#Wve44-hZ2WWv@hMW;Qk3p7`gK zurTK_i>jKpZ}}dE`gIpyKUMgpQ{w^k*?@iy-tgJcw2asYvu)XYj0}83{2d)*9!tag zf$>O?ErC+qWTcC;N*veM*F_yeLzFg41ssqW{gyb^+UozODK#Woi&nC@tlik#z>-@d z1G)S;@?lyUpSfY@#L$V)k!>2PG*2Xte)~2x6b}l)XT~x;(m`L)4E^DJrE&=t2k zcL)gWP;4FXzrq_6&C2yDzrxwJ=AOQJfs=DYVMc~gOJbQF1vp?Vp?EINmRBTPqHJ-{ zd(}S}Sr~OLv~K}N-&oW*WJ5uiVywv?@-jyIhB1iVYh`v%c~`^ zv`~4GXLZ4{fy)d5aqTkB&NW+AR2&(%7TkXIn3P%65HxQaAZKajaRf#5wO6g^YBn_O^d-QBXcd zv7NZ8#KF!JmVCl_*%J8o_wO}p?b2=|#;nrINx{~Y&r)vG)JxB}NXdnHuFAY{Q)E1w zy71If997>Ko_jj4$eDfvu31>v*gy#Z z3hXf{S#It|-%qym8%<75O*I5PUx@mp>KGcqKKiXrhW8;MPTt(jbuZhz`D#ld3rkJS z-cj+jk@gd*9~#bsZYTxPLOi@=JaXjpO)oRS<5yJDlh4~N``?v~l2-T{Gcq%wd#ZZ= ztxr&d*__-2D1f*3H8VMB|8x!I#uiRmvv#@e9@#FL@cLiX^Wi`}sfVnr&$o135RlH& z0k8i3G3pybxm(E;-zNJ>pRYt3`U__=p>nrfQU%wN6SBKnw2 z|5a{H6|OkdMx~O?dcQw3r*~-cl)ETbF4gBV?Pl>@d~{y$kzaQ?yXcBS&Ej#n=f*XP zX#>x$T%$RF(|*3;EEUUsd@|MRnyY_*$Dv!D!BL#nmF(fXsv^_w>6D|RpP%rhjwr0IhP16}Oe7;EI881(wJUtpkLt!-mnC}*yH8h#refA2xP;KWs@1>qhZUU`R! zFuiJt_k0gBldpbDKb4?SH9rtO_1&Pak3}OxX!Uo(m2jq@_@09kaWIf*SA>gz{SaMt6I1jViVZ;!5`gl)GoAS18hK+}Y z+eUe4Q3+Tc8`D0uV_tQ|3@|7RQw;Y z39s_|o<42(^)QI(aIdx!2g-;>As-V5cPO`}VKZxlkUI3hhs2RB(lWB!{}~x7iMVja zlqgGQWzAhuIBmcBtJ+cOfHgb&sS2ITm!Vpri{*umP*VdEUcK7QXf81JR~@l)!B)~^ zabWz6CzAjxJp*vURU|Jxc*@I*P8rI<~3h3{V8Q0JsJSz&rR@e zXsExYr=Fm?3%-ZbhWoL9i_gk@mCcYs0hx+JAr$B0^xj~}p3tTf4PjDlnf8C#g>46gt78sGv}DO|J;cDtGQ1vs`*Q(f){6di0y4Xhv~yTyfJ0>+&N}=jysk znqT=0UoLS`hF>($V6^U$lXFUVKvlyfDc^M6qobmX<;~LKpR$>oe9~Ic5)xOlbf)II z`bIQPX}ZZhi5BGz=WU=7tzDe9`KvZy5y%w0v5rh_$8{%gjZ1N-dlz}r;B`N@O_B0k za7pzO%K1I=U3f=JHY;O*S=&3^;aNw9>e;6$N^vTxd}e$qg2t)6$un`?6P$4^Qg-=f z59?mDLQ!3CEqqY4k2e1LW64wd$K%ObTX|y+G%}BKvslZo$|s!@wkTsFkwWwd|L7!L z1C0-(xW4kkcY*wTN*ehmEt!SXYX0R@I$99*Uv2JM0#Y>@9A{?OKqD?ETcOY@G%l`l z9GaLI{DaJFxJLXS>`Ud{CL@soTn_g+kb zty%8V|q?AOjMhglN%8)gR{G>f}S={cKSFRA>b zprPh*gY{DXH&0%_{p;(VY5hOVZ~RQsj8_qEt-SoD@U~N}<7U#&yDT7(t;)Wdg3MN9 zT3y=RboMUK9O@!+cdy3CmvPxF7P;~zxCFdS=HXDaP-4u`Fvw7`Pzn%YvOJjo%|S!Z zgj4&BtA%UEh~9e3{!lPk-WH2=zVdzcO6oal9|p+duWvj3=#h;~gUn9J_oGN zFiM-;VKcCWX|*3j!l&&EA^^hkZ1_`}xL z*1V5AVSB=|baMtmO>}=>PKodQOx1d!^h@-GGn||aT4#?-T>JZ##=OVy*JeovNOU997T72HmS!TpvsAN2w19EsT~e&rbwC zew<$8@$zY2-gK08RmCI0f^Ji&*og^z!nRk+!rl$BD{N&4k26j&-xNCesHy z7^bReM2kyHBNL=fn4H{SXxVkneQ8Fsk!G#Fw|A|9w<`LaWu$td&?QSLSy}g`;iRKS zkM5OhoSU0_@#00G@SK{O+V`Jtee4C8bkPoO-8gmQ;FuUD28M{|&lgtbf9RGwHE9_Y zXpALaj~{G|ofsdt%8XPP{}6D1mX=n~;qSugtAGFg4K#!onKt$Pa-=vTjSm`(Fe$X^ zG0*f~TU*OBX{6q|b@+Qud`Y4|CF$ke!wB_@DSdr?_!}Or;(x6vH}2fIv$(i8m@)C^ zPm#e#Y8o1v>9G6akM?o9tj@OQ<>h&L)_(Xfh%1N?upgGTpllbA?zyR*O#1=rkeF7;!INWU)7>fEXmG}?~GpCCSPi%$dh{SN^Jjp(&_l| zV?F2Np+|mxLtkI{#K*^XjN$`g37g}#=VM8O>(`qe>^v|x-c#njJU9KPF+40x}KF$mQA1u2HWuwlGEzOR$#TZyyueYh{3QxYLyXK_S9vT*wsaxeS z(wb6JQ$rJ185k&!Q+VMrk}~=Gqo$^2*Z1#2e(0Pkv=iI9o#pTEPt7E-hncy`tR-=1 zXo%8XkcKAEb9Gdg?$|Y_ul(;;OFdRyBqSuRUHcRxZ*VN#rP`E_M?KdNNsKR=aUKtR z?J&|Hk^Y+nh!J#r!DrU&MYiddr6qHB0HXR4QRj>4;+vA&M_XE2Ai6&W9N>Q;>bX`Q z%DK(Lyr5IlXyW!0r0NxBcl<1?u}k4a$LFgf4(HCD+fL8p*7xxEAvsm2m)o{&t6Z6C zDC%`dOHcnxos`mMem~FXta23`kHIhklK(fBqSuV{5Q|fk7~g2UPnSg!sm!H zCN=(h=WT4RUakESBN!7C!)&MOMDhhl@z&kNul_m6 z$;q8D`SQ0VNj^y~CX(MeGn*0ZX(j@Ss`O6opK)1DxsfEYzA_zrT>g--%go^CDCupf zN*opzqe$7E`%k{K{!vLrMpjr@xP2ejb75D9&>JJgWo4cVzkKl{#(zU8Fb07jj6H26 zZEQSP5p8W^GC$j{D<5(Cenj?&ueZ1N;`E>O$w1F^o9Ce#8EZd%XpFx^JOBNjgGGz* z@Qfoejf{+>J$_iVCSQ*_XPJmdGOXRj%gbAdcKd&5aSgGksMw6Z0-WUPRX+g4->1mP z$UwS&FR*B*Ju10_k#A`3;rA@n!m|P9L6*xB;Mob zCRT%x;YJN%&Mqz@#hL$}3QvDJBNNWE>Q3sx(_%fA>bkm?+l7%py|@kJ6M`##rLy|L z&Zx5%VS#~xRaI3}=71M&Atf4;>ClXeyOdNNQUw-W5*=<<*mdrUZFe^|>|k%tBkw!+?TX%>)Z`d_n57M%;Z?CVda;l_5K#SV+`%QTZ#AK>w>D;}0 zmnbb+SrakxBB%@#y%nDBB29I5!!eG%5rU4HQ|JD9y-rGMd?CDi$fT-N`}XaBfQE>z zX(A;qvm^h0RnstwxGjG{)>gVN_x?(azY^#%({$xyAhW!*wBr7du8xkKhlHHoc#-*R z*=gR9%NDqgoHQbgdT_B?pO3Mjq2bJ#Gel_B*4Dm${kpXkKCm(e4$-P3cYrgieD}eF z-6ggrF>;Q)^g2}@?w$E&nnhL>%7)+4)tNn4au5(f#{Yiq5BPuwNCh8jyJ=$ugt4w% ze1KSt@S&s;neVm*0G7^LVH3c+2}ahvd-rNrx;f)Sm^~JL)de5lxy2_)d3%9IMpcz( ztcd$D`4`;@GV~~uDrpv4J4qxNg7ceRJbn7~IqTkX)229}zOkX<3EuB0Rfbcm6W5e18p zF*SP+iL}oT*rL$L5FlBh6Z`ym@y)m1zj5vtY$O&_z0C_;YM&m#H!}%3%uG*%8l|YG zEG#S_ZS2N6?caJ+geHEuo1mU=+JwS=-RGBTQ8(kgnrmvajevBM#uwZyh?b#m8Jase zqD9?H2BBB6a$K1QGboPc8c zzUM~ep&1#LH*fw#)?d1Gsruc!5c)mO?r*1m;OmRD?d59w=VfSUSiUrpc9y_fF)^{6 zoE)Io;K;UpEJu#$wIs?;luti-CxFfUsPbHIPLMG$FbMrL>mie-l7Sl906M$F4qW|8H7F9h%qu{h^S~4fg z(W3-3|HdJF@9gwg9xDQvoKscJK1dYwZ4Xh+2pV#$yZFxNw~UgK5@`=r)wH&;uA=$b zS@+?DaF@Bi!~Om5y|DY9%LGL|j*rXB&3(coI0t03{+|7+xLD0uR#mkfDM}n9lYkw< z=>C*Rl)(7#h=`Q(kc^D6 zclWm^U5kh--^1vK@}88K$fJ>Oifz?1-=CYBnwpu3236Q#opaE~rW?aep*mT-JUo?7 zlYOeX?t7V;J=azi)6==`pB)<;10J6T0C{B2svaf1 zlp{!1t5jWG9hTPxd|6vv4*jEIULbJ({CPe;yMI65UV5-2r>KZuCODarxWsGEU#?jE zRdsN1zy~r3Ic1k@ixazm)jm6VC5&5>V3zl{r~3Q(`hIMY7ZpYroU`oYGjFZsVj?H~ z^CC#l$m5`(An-cCIhRiP0)iHN_s01qP_a-SpX%qQ3_f7>SPY(bdN*09p@~WC`8#p- z_9PzNN+BG?2+zud=lX$NyZ$Y&a)j2mx3>f2qP64h)_wjg3|<_0)&fhtp{OV=BNM7L zJvn*D5hm6^cy)EPu#nKLTem*79Vd~DC5SNEgzo{smgC@&$6Cd=U!|vC(-Whl^wp_w z0j@4QyK-pj&Yfpvf=x~3VnxRO{88;``u_bpK?gs1d?oFrr^h(LNdbYSH+MIM^Jpuo zeXg!H0PzDbWB^B75(Cr)Hk00H5x2ar-jr`2J^c@Gm9fqOQ7{CQabE3G!;|~XwG^O8 z3pC{A8yU_R&mc5WvGLDYgKASm$ju`*wzk-j2Uyk41LuI_C*1PC_ViQ$kdI0}b^`xJ zphRrjMY?%}_@uBC{QQm$Vcd`Cd7t?Er%nxLEVq?APhXFhgkk{C1KZ%_rP_7#EqTrR z_n5z0ue|;19j$$cFrn#`Zd?sY$gd0M_!yU2N4Dg=v*2p+_;)E$k4z$Z~ zXF(b&(^TX|w#{nUw?TF^3vYEm_#otQmzM`9KB8V2);{g6a0LeHIG=^NzMX)sZy|`Y zkPtlPHcOUxgM5vp;t-%dIyg(sksplQz z=T~(WyK?0tf?EXa2tW*yTECs#@v_%_f#V_~9snThp|`*ye99bun^m>uqM)E~^X5ye zdCHqa>L$Y$ejWk(V#ggF9e`(za;G~Q#8+ex^Cg^NXJ@H;o^hkd@-0;3P2}XyW0+{@ z$o7pSgLnaEMer$LyjVPb98}F=taCPizxUt#e7kwUr>7Jor;Eh-(`enfGl_G+Gs+C> zf|8R@ag`g9)^ z`=$rBMoE3}>a}YtGcEErZrli^w{vuy2k-)nfHyte-68awVWx-+2S-LOfzD=Wl}z>3 zJYr{O-m##+syeG zajQ5kROPmYhBW)pZ=W*B8^pZsyRdU}k3o`Kd`n-%S{mx>_fXfGcNb4WIz0gJfRwAM zs#f}LBAGwN(qD!&nF@j2xDCSYOZo36 zRX9SW6BG+foAl@Yc0fWAcxi8cRyED5gZAdDBPULrxO(;K!g$#P_z0+P(!U?nsOsiT zaWyl;EzGWebBsSnrYLdP&Tb_o&l90DpOKtAMC8zugX)!Ti>O&4^mYyogeCz?)Nvgv zz%88Mr4rh_Ss5)#;Xze82LdGqGuA=g`d?;rB; z@E}cTn924r7FYYyRL%Fg!k-dyox7#39ucGnqXaVM0H5hsJRNGrIFp);G)uG=f677S z&@nMpKwn`u1AqQ-@(%U)^Fdo^@bfByNTN^%QTw%5CN?;wKT*VMR!+?#xfzOIJR zyHvmml+TXs+u=0?6NRMp05K_D4~^N8XCfbcKF6x36sfjv-#(5NJv{@17I5XKPoKgD zpkX+DjfDDJ)L^!^>#{NupDbtoH@k!{C%q9Tp6`ew!VQ8;-@+KM zGjYM!o}YY$Y(;TW(Ah~+NFoZz>+I}*-*XHg#eTTY_W%SROUA#8rG`)fnSf9N=LbPj zOlwOIeX@iZ;^gKGW)>Vlz@tY%cQm-LEVF<#L|dqI8xqKijp`4KA!^6SHl(TP z*VAXt(DUjXJaE7jcgm@nd4hLnY^(=i1!{<6kw|J`=cQ7EW%e@@)Q}&70}%*ygXCaK z;A0GcM(HZFT%So2wI6P-(E@Y%@4q@Q=4n?>y`5U|I$~x)eQ4l43VRV5j(rzggDakJXR&nVzYNlEJvO^DBHz-}q2>x!~zZE)^Nv3kJoPB-5aV5W#SA^0v2>5k91RJ`-f%*=#^yOo+61w;*>`x%SBf|%Hbq~K;_GXn7F zdMp|_I267!N3y{gbH^Z78GtnI@^&Iovk&5E6lnJD+ecJj&;o)Ld#n@(4a8cRLFeDR zc@y*tSTykaH$)|a4F!(I_*MHTL;|4nAJm1!<;(2RM;baiHPYG$cL4GY6m9O`zmux5 zB(F|FR?JFEN`62gpgAN|jOd-2u^XU(5wni#+X7DL>nkWI2;xL!p_el*aSSZtBeSQF z)4!Yg`f(deKXT*&1Z6S}w1dNVcL_9Pe}6w}aaedbXG)?=%dcIo2-{Fw-$$3^5Gfu!wDyXrT-Kx=Yg1R!$3IaQ?2f+kv69N4#S?wh7H>UW`e zn}4h+Y2z?2_JCa$p=c1Hg5lciYz4iuoSbQ5a0U*XO9veV$IZ{pJuMS_u>$m0Na6nd z`$*@Ky#|&&rOJ9|O-%kEN(tBJKE2Mrxw&&Pz9cW-hbT-VFLHBpLqb9z=kU9#Yap^3|_#?moK4u5rs+k2!s+yxmFMP>|U~c|8@<{E@9^&iUcwHQRzNBJdB?_ zn~9w>9XtrV)ecg1cN3+HlM~9=^BhfZgiE*y`?}9j{6uOZ1h5^}W5+nw4~-8Fp3{4G z4+k-anhF7LY_{99qy7M^RClSvnPjTRs#YxU{gKrl}c~p!`zo$QyF=%SaC; zB_%hv72rH1Rfv#CR+H)9zkgk3hG?Owth$T6yhs6(1|L+&{*xB_xP^sRAMsX#g**-j zP%h40;08(|G$vrTI5`yu2M14iU-UuLwPu3gynp{*LQ*nQqd?mEthMz7@`iATJ=clU zMCl=YdW2ix`hr7gX>JC^p84g=tW$jZ2&Nc+rFt_4eCX*-&eqmo=dp_y z$hlsAW7zQkdJ9#As4eTO^RT!H^4Hnv;_Uo6MsOY;r@f=2ql3dagCY`%4dw8SH_RUR zrXXp2@Dj1ydgi^LwoK=5|9mOtgGvP?&ezCLU)p>ad2qk3zP=NV9=Ltr!3#lQVTsuq zpbUiTC?DI4Dg}Z=WUzuac3>XSWC{>z`1DCDN52L&7LW>n3rXilZZk(ftgNiOzy$*N zN{frXcXj2Z9=_>-524@y5#ixkTlgIa&mk7&dUeU3t?eKa6Y_^3QbzTApcv2+Ac#n@ zE&&!%Q`6I+6NGJJ`{xVM4&fad9~Xgoz{&dFzYoqM?kq-X!~Jq~Km>dN*F~rR69DbV z243DQWW!_R4D<#yH8sJbZtLQJe(G^@b5}qHfpzWU*4TqCNNlX<^q?#og{7rsOmsAk z$hh$Z)2>}V`}*`@rDR%>DWRTayTPspXM}iIU-&4Bt!HYL#P!FD!T|>_M?^A-xH-Xb zuosA7(4-)BGoTg=DFN4((A9ubfhDSuph4S{8(2~c1T{HEvgwbsSgZ->gvzUhe$7XeJA!uS^a^~EQm&QPg(o7s8FRwLtAOw^Ez#IBf zCoAjD*#id-0OnEID%O@pAxm)}$Uh=8zP>@V^6Ee}JbvuhF;-SC%|b2_k;>PvC7eGW zlZ_OD;{+Rdc5cqW(NR@rmsbhO&#aV<%~TMZ43WvM^H%po-&)?fRSJAYh@t)z!kYuR zxVVYv$xEZBqf=rtfNUek5qvGA1$bKMo_w?wCnwF?Gkc;h*t)s9BeCjZZuoKQ;Y&c%Y5+ zQje(k%cx}Gk&&gqDv;;nY;5pE!b3yZ*}ubqLO~{?Z)IUpM@J`s@vOeG*qbSwGkDKWi*H*YR_dai@r z&kwiw?)4>mDL_0|9c&#(AIL0PiEl=y0O8H{J451qZ*L`%;D4C)^t7$Ly^*rm%R_Me z7>iN6%FE05a;iXQ{(?4(h=`C*9kwgQ0nCrKPk;d2c5paWNA4vJ#Cs{OqVf%u4}~XR zuX@XXr@~%ZR4E+UeMsf!C+|w}c)2_vZGVH&s}dMTD?irP!b3vxt$&EzZ;RwJ>zkNh zrlmb))qP%{i?je@K)Q~;HcE~ZvuYy_V&sPO-i6st){mBj3F6pYOgJ0 zVA$8MUkBcT@IofsPy=y=4_pC{1&njFr;NYBVAJdYd@lz)q4!YxD3ZXgXjLL_T@KgzBj3I z@zO;vil5Xwwp7CiYR}N5M++8(hPa<9>mfUV7&(5Ye?L*|VR)35m8B_hoN?Gr3IqMS zxJgk<3lgS`@L9oid&*RQwf<#^YZ)e7Tt-F$)jT~t^Z2&D%*1`(4un!bGVNw!V!}j0 zc1T5qJ30brhN5tyM zuzGtnJw3f!xBg;0h3M*{X*oclt))f83<89fwkc8ezyJkVs{xMY(7pWpd}JQCZlxPO zq@L0c>5pO&z;GrJ=Y@0P2Uk$wB$j^4rJ@oh;Mudd=>*L}t&C~>M*{wv1-Mm$p%fw@ zB4LA|W8;Z&9?&@POPA11|J=;swG@EV^|_&>WQSG~^5EmgkIaG&*M99#N5jp^$_niF zprAuKI*0fwS=#L73naOy9rWy34&V$MFD^bmP!j65u($~RlZM>IrL_**f%BN2Ut@Ni zXJ8(19(=T3I*}yX{#eqe^$Nw=i{gimkZobeCcAO%)c%j$TaM>EG!UFT)*=7pP;5`$ zvV8gRNvqux$KeMNp=0oCCJq-JA9=Yco z^J4OhWh~wkb{pY{jI`^@r28H_9AJKJZC8ZF#r0M|?TJg6uo4D>N{0lNF zDK2&blY#=0a(8$4^7%t{F}|sPV1OGP3PHiL?Chs{&&7u6j@VhhBW*uo_vb>)m$p7qj2r(SqWR4;0Z*P}o7HAMDI;=EVHdH$JrW10Kf*rjbs5b7cx*W@uV9p; zwvS8gX-rH7dV6r3-fU;Nr@%|x%G;Yrd?-s0I`r(fmJ>cNP)t)z?K~vFo3tbMz8)qX z%J<$--9aFRo<~a!rValOH(S`AgM)(?x1HV*-)0^h6y!0N7i(lpeD$daQoZUT+c@15 zyu6qRs)ka9@iAgkLeB6sp~)1-hZgO11%>R}zr^F4{5TD9=Nor;#|1+~!YI#EzqxJ5@Ht!;2%AVV!jAMKNrl$5*l5>&75Rugx%f{_d2q9E6m zRaN=Vo!g>j30DyCLM#dWLV`Tn`Rx+lbdPMG_|Tl{@?&Ct(e19%qlXU} zP$AKlc;T^R_T=|wvHj^tiy;AG^F2HsRqL8Ylt7_NM)#UE)PMh#x%J_U)SrUX&jQ z*M;Iw&B*vXF;8iuWO_ORZN69_0;tdTF^4cC${gi;yGHKg#7w_}k{%RsE6&f~=$t^t z|D-^-ACO7UrS|XLcHZx|3W;?1pD^#9otYteT<9}v6j^Ei+?2cjfjT5N%&jp8S8?%o z8<$bB5g*b)tg($np6hEwIzXpsYipB@bJX66#(*T^^-QA>9W!%mP>^?2&*6LCy9kIX z^J)Bp$XkL_0+U!lNvR(}o3f9I$uh5FA1{2B$-aB{Hg_LjJi@28aSf#qm2i59)<4WI zD{E_-Y{u%7Fd-2}VEIv)gpo@+5ONIncJ3{KPV*f|H?*?xDIkfoH`#;h_&in?aLT7( zu?Y&gDs*0=>S@?`_`%E9S)~LZRY1IcAPB*iorGRo+_qa>Eo>(ZjV_20VR3_@gM_LP zAwK3qL}6yXLmAvO{{LDn@Mb8B#lxCRAN%`9qIP3AM!%?w;lYu6JM@dFUb#{d8^1fX z=thW2_&%tycrc5Y^hJp4rXR_QIn zJF+_=sgS|zK+BG?xwk{qfaHx$Z}N|`v$w}|-FU@(Z&$wA4Q1s}u7F4~+^rm|Ci;4)Qii>+{;1nXrbk~>K(NPOFy71;wEqr_7soJ9`N$_-Eh4gvh zTQ?GWL>0X-H2U$NS=b6N)6V_#21|x9foVXsO1BGN=zunk1Zt0;#ZusI{=}RW%$?m% z1<(vcPXr|blp#K3i_Weic8&xB*qyz69d}IF!Z79tt`Z-A^o@6jqS&rOm;qv59lCrR@{+}xF!+_K-2@~iP9z`Elu97yoFiwUFo~_exG@iL80G1~^&x%>N@jJ-xfa)zK>q3^uauCmKi6r#9?(guup zx3#x>0y!~aX8bd4H_7WT6^2mJ(f%94egj@6a=QGOIMvQ8M1+1No#o>zpZ+2U|0gRo z)tmqpjIgyp9uU+jIyzd+jOGX**G;ecUwi6)Po9tYLQEY1bqfpUV78z-gr(6Ec4o&d zom|7ZmBndr0Q5TVFp%H-Donkx5%#vWw$GnGS1o?FhAZ}KdeKcp_i!7mHiBU&D4ax1 z&ro^vBbCLj9jWlD%%7_P1r6TJ`n2f!G*EtnyPS(6iqNMsjTpv))Fe{p-Z=HfCNeJI zxsb!(GPMa87oHO-Eg>NR#O*f5@KBr?1B?{}B&aBk5NC9tHuvwO6C$$LbA1*49>`z( z#1_S;di$XZ=;`PC9`PC*8NqI;H$1&lrHBeCO60^n@}}-?H&kUpis8ttin@MJcH6K& z(8Ih8bTxJ(h@b+`Kll`F6S)vQbTe+YQEBGe` zK--EaQdB$rL8WlnE2|TpKT7Q_ynehR_j-HNX}sjmJ|3;-&!6vSViG>V#PT0W+9?yn z>MZmE?ZvfUG@joPgD~m5@+dAmq1&wY;W0x)IIsM*Yu5-4Kzzi~M%0S++m!e}dZdag zM8(1oE@iFi-%+M;yEh)M1&-+}| zXR9LEh5DG%J1>uG*z(^!%Mu5woTdT*&P1E!jUw8YwVyvL7jeBOQ>WT#fxF@pT3Gc6 zZzzEEK^zGBy<|^{Snl0EXi}gN&ZRyDC$8((xoB=M9scbb!Q&no6$M|BC^7)9=4QpJ zAI!C{(rWbUK7ERY9Hf&MqGe#H%jL344)~f))Fm<5JvE4P@DH?Y+%UOxH{CJ?))=ZK zK$@tQm~Y>JqWNP4b`4SAF6)7L?D8kZQSOBh!$PZghKeA@2q5OTHS$j!J7%06DM8gk zhV}1xyyxtK*j#C?bowu^Ch6u&j5W4~f_3!^yXS;XrJu%=kq*x*-g*4cT)ZW(up zQJ6ggD4igC-{HA|Ek{L0l5-_fmqenn;ti0f*jVe+5l%0dLsV$RsZuuL<%k{JdjdQ# zpoK2-GiaPmngNn@^z{6264_+JAdpV&@WHb8+`|u;`XSeu;EceAhn6t6wA`7^n83%) z&CSVa0sfAO?XRP=KFzEEP>T(We*5zEYs1fxXHh@6IXI?VD#%pwy2eCThvk!Gql}BX z0wjMET#IoJ5j}i{>b*d6j0;w+&UJwhmG+F2wkt~GWPrN_IAGG{*EJ8IXV1p+4$(7=VqWgHtyo$vi8qc6l8oH00^ifQ;CB8>fx~l z5eOf8OM>vduiON-3BDh&AtrGk7gtBpvN)hVI?i3jn;#%ogoHueLoV)=4yO9wtlFjl zEVQ?`Ctf!Y1z~)XR`c2O3{>Rl#y@*qB zFf%n>Xo+1z-65JLZ&Xbvy+EjmA%8T|UI;nozP(9Rei)Z}apT$5mocpmpS5bC?-4qe z#TgmgZ_JMco1u*YRN_5x0%P9H1bg5oR1)YUE-$28wGIu zn19@YTP4B6aZ&J*XJ=>SlBNj;pcbYLA$M;p9Snw>MO~CxH|~vJCsI~{h~1@@Sd4#G zfW9IB-fV{o7Dg`;v;_CyQX%rs8{t0Ax&g+StPNA}gP>c8Stlq+vWo~`SR9ez;rz~1 z{qQ2}8ev7e8oj;;O-W-c-nwE|1@aeC#EX|9%m_3JuX7L?jJUyDY+8NWV4$#XJbip{ zdXbnTK<#T3T^D*&(97^ZZ$Bmr=Ltvrw9&TlCS)o$`>L`ow;Y!WLC%B`A2_i(S^RJC zR)Q5CjZ*&^Q@@`+8SXb$SR$fFY2)-=C6txh@P3XR(hx=grJDaA=dvD=|4PZ{=nH7l zQA_($^=v0j|McbS#CsO8qU&D-C(yJ#4)0kcmiJA&ABLGvoN$7>b;#-G-N%o2y!bo;DU`I=F|f{SAP2*axsN?1Z8QlqAg9vYkDvs5Ih-;}@pRZb9B}UXRvGD!7lSLb97QWC1B*38E7ym=A&J}h%*6s9D z(kR{@ixTzpfb*xL^8y<8eecF2vDnMIHjC}j!TSvO&fL<{rC@mx=h2KJR;khg;+2&H z-E+H2mv^Xpu`LRX4P5aZ$vWDaH2F~FE}PEevB9?75Q+WY6Q+%2U%36i(6pTfcS5VW za(}tI_W$ATE4$+8qAm*y5Fo)_g1fsD+}+(ZI0V-~69^LA-QC^YwUOWtwhkvc<6m{hCwyALw`|%Mia#@h zRBLthL0@m5EIYscSbtR6Bj}9lL*Oi$=*nl3*WUin=eyJAasGhvb0-h4f}r=$DXh-l z;tap>Hr{i651*N=r?9Hm?N|12UjAJfwEL}U{i*&rY)6TFo}|0t#o1`QYXz!M2|qge z*W#|YO?;)VC<4=Dv_t;E8s4Mu^SH7HnmAvXqVMxjaPAp2Y03FrcS~(mcXk&SIUl2Z zOZ@AX`Qq^R2SfA4gxoVSZH~-8jpy%z?DGaW?HS|DT1{T#dY!9NcMUv)1cpY_V3PeX zg`eQfpbgYE+WYraoTP$^+_Qgd8KOUDEC?ypPM-crHiN0}z2K72gD7cp`{pV7|5#V{ zC`Xfev_Rxd(XV9k({HOVDzC2`Od;*@lV3tmKce$RTP`=`lQn)WOubv;8`l#YW@=eo ze^q3hcjXxR`Ob#gR+|eU8~qK8T*&DvHBNt!MRj88NBvG?ZgTrlY*^7^S0<3Xj5;(jGu;>&jG&vuQh=0WXWcG-kBnSXRlUaN?K+nK-@ZVA zBM+~`H8u#-nsD+g{_Ku(V2I`zeBjni@m$8QWMBQ30|w6@l_g^#0z7n);rcrld!O86 z5DX;4|2xefC{a>B+4)|jDRgMo!=(A=Z?UwNt_4Y3hsw>M|JmsHN!nwz338vul@N(m zkIMKLI@((f)7#Fjtj%N_YzCA)!e%c1Qv|fY>7nqNk&*alc_>@FC}IdzE)bN5oIX^1 zScctipaBHGzJdn{gDmWrgBj5xG_5i(v|BL}5n7h=qcL)bwe|c}3fm?FZ5U;v}8lJpHycP=Vu1Y8&bu z?WUdMOYGuN`R6Ql{W>5u%)(*zZ&^MF>y;CPwN4@EPO`G~TCs`gRU(K3)(A@B6(T>R zF4siEeY9zmMF0G{4~UoQeLj0a5J?e?958|IU5@||I0y)i18EIo;0w`B9Xy~st zV>)W9UBJp7Zf1n!48-@MS+7tawoaU(u%hVb)Qe+<={rMohe$8B_kEeI{HmAr`4Pe& zR6F4OfG*e5Jb&fBm;MRvi4_)=yK4Tovu2CzPwr9(>)` zWX8KAxuQQ5a)=TA)ldB2JI=q~cr|-7s$IJ=RGa)&4&!j`t_R12Pu${aUl~T9^&%vZ zU+DaJj}@!RJ%j8yHyW{`?u>-rR+ic>Z=U!2-F)l^0c7vte^lzpwX?Xi_?EhL_l^i( zB2S1-qLviibxg%0h=K2Kg+-nQ+sYmxGq-CfP}sv4AA03wHo>Hn5(!wX!|S;sPJR>% zPJH=8&_Kv<1hI+JXEBEULmsmVN-wvQ0co|49^3ixPXFfdeVVFOwOQY_Q&(?^dlWeZ zIU|9MH=qz1c(BM;x`7Vtu~kT$**IoN@Z-2I9H^1Mt&nn)tCL1N?Zg*L4KC2Zh$A5r z8N-jUXL_8W_Wtmyxe4XnTVUdTWYc}(?(IXNL%5Rk;U}u;A_xkQYsGc_ry)#)#=6%# zQRv+}e`x!7G!O4ilqfd4T`B#Egwt+5o^Rvej(21Ao*=B*u7qE-KQJlCDNA*3IEDg_ z0&c~(?w%_E53jsX_XF_dt6U>;Q2M*$plS^wCcuFl$z|}m=~NZv!<))oUoc1eZkM_* zKW*P3NJ_}+8Ujdv$yr+>3-QB?_}I_u_{008=JLbn<{ z{ecep5XP++HQmffqF?_GzavN_BgqLC_%hj}f2+nWwSk|nFt5@KTdm>QZHrGFmH_*= z7vYXX3V|wV-Y3CgSf41xEbmLdle(29A|;SRlQR-gKk0!aCJ84|*@(EWA(DU{4n zk_ioUx6PkO3IKK z&v68hp+6ZV$f9UrOxxh^8h_H9PH*O9HV}bQg8+gy=i1MCTIMnk0K6Y(*TEk1% z5`8}CBA3TZj4*i2aaY+--ZNLblT6#!z=917(Oq0)Ze>p)k5@0w7%;pB)r?LLU3-53 zC{!+a3#$VHnx2gJ6|iRY9!r`3#8YX{*Vh$fJhr*t8`=4u^-kA7CwKN(PP3O6Q#1W~ zKH|m_Tb*`C@ZNjNrYKTueTeF+pS*t*PHbFSLkX9eB3D7&W)k`cr!;K;98(Wj+Ea)P z8jL}K3jB%Y-L189N21YOCkgXWs9(5;%=}y5{M#HoFoQ(uO=|9c_nDe<+Cb~&tn}%% z|DUyh6S9SrxH&V#lD4p>#r-lukglVlM+Z>9AnziO0y#LML)1bkm_kQCg|VIgHy5Bh z{v0QBb7Aw)B(;3|&_nDSV`#Sk2jQ zV@mL9w!2zA;vBg?=xRm7CO9*~asb{*4AFZ}^3_1k06K=8p)7g^I^i*9fZEw>n*?Uq zmfYHiVOJ3G;oSxh<8~>yJ{B*)eyvdMnHlqIOF#om53tmjo6@+x0&>P9_oiN)H_n@T z1TK1qxODmlmDBY~O@s1{xaBuq^=Z>6RLfJgXA`gXA zSbmLd^|!)x8^wz{dniIHkcs3j(N|C*}Rzn4{-* zs_ISwCM80q9~rX%@-rky&QtP0aQ(=-=yp=;C21H<%wAWRzeFIl4Q{>rQ@;Fhp3^dGpGK^ODSu zZiq9lEvl^O&X5}?n8z?UYuY=zUNX#G1#hgmZd4$_1RgDdQ4IE>J4?k(+$LZl20@HE zL{TANN8}b;A03o32!0(j8fXC+f%$xsTa#6ghA zOwp8Pb^B02r~7^C?k9*6I;ZvKQc^Q##r@Ifhe&S^I=d7gGTmcN|9pr0G>$%f^t5%4 z&wQ9+h@_Vghj+iv2~d{;Rv!Ny!0y3xVQ?t12ZTkL=?w^nQVluhzu?Q&7k$9=#I?nh#M z3^&-ns~%Al#md{XJ`!1Kef_Qec_pkZ^EjNuZZYjoITP*1%+4Y4og)>B6=9PbOuvdp za<^^3uyQj@0x4oE>6Q#1Fq6`946A+G=%5TB+;Di&do;p}J%K(9uA>?o95VC2ACA={ zTbNCZvP%h}*+jqr`9lI`JNMBGXM`i(O8q#L9JIdkH#dW}-i0(S8g`@Hh1r?*yt^0v zRt2>(7-{&tma<3C?VM4lW9)q}crlvINjJR7zs+Ddd#=K>z$j8r&&QqlTljp_oVT1- z_3O(wTfOfHv${|@;Dxy@Tg1OjpQ4og%+JwpZ!Ev;zjHrM)+Pz-Q6=pvZsTqPoRn`Kuyuw!Fk8O>( zp3gVQT`@b@68J$1#QU*ZTE&9r^A9vZirp@HOW|TPB3Z;LH)9}{ER)d@9kk&k&Ip** zC-TQG<#GdfAW!M8-Mo_b&u5rlLUt9rb22n&oi08K$|UWD>yB`ML{JlcGN+*&4PrPt znHmbGl!HUG6)NA=J(AUZBZjPa%ofs=?J;_M9dmyqe~pM4Zj1Yjh>t?aD_9^QZdj=#Fo zvbp$GdNP_lN-9a=Y11Z_7cia!VHYty>>OlQwF!yoxKCgLG&!D6Wgh^(jgsA)|C~0A z!Y*p@2LALXLUDF|@ibHWBA(luu6mxbu5zcg>r*hopje zb(MqJ6*z#%_-}JT!Q&HtB;4F$@~BO`&;;9@?THC@)fn^F!QHDsf){i*4(br- zz=EE(53JLD+Fl^ii+)%KyZZMVmKa5IxM;Tz+xi6rwzssET_(%CZA&A0svTXWe-E`m zl%y)bjO)r;0y%I{YE+?R-brDpWlG-^Q5$~C!v1`bZF!^LkPrxuj1uR(xS|` z8J?^gw!;Lp-g>x$O^TA?bt`B%--)qW%vOMX2C>N+7xB)c>g(*9tH0f-R7})+syCOQ z?TI@yL)Jn~LVieY0(4*=O$3>bM00mG!=5g_;K0F*@diSW3pklxPQNp!O(pO`!Vq3)|0WyLB9bvg;Nft4$h1ltq8$(Zn%4iN|=RYt@+2P}kst>N;bh z^G2Au#SQ}^sz6}&5Ymvlt}Y6ln}{=hVU<`bPJ#SGKiksG2g+=tw!?3t{fE3Dtz+rB z1B}jQWmve%e@u@?a)RANrL(LdK*14SQV$U>Rldc~AUJnWCi36-9@?ODuFruuG_&y~3BOWcO3; zCrj`3>}|Y(pTsshjq`rjP}tR0cu6JeW9ZWU%jZcBN5ZV*YMMDm)NT?VbUtLOb*$gB zTOd?hA;NhdUM7kUp2zO^3$d5RAmxUbgg+(xwopEkE?@e`k+6ja>Gi3IN1=k&d4*!6 zqov}ANw4glZXyFaO1<7k4`(nehz6-3NUxWPdp*jNpo(goK0ff=K1d0kt;Oh%VkOlr z&*Fv(RJv(-t%7)UQyj#V)^ul=`i@7{J+?!X@{^59F&}H~cwxlwAj0w5q&tz-XRQFg zqOB1H1q0*-siI{UPe~X+VSRrbKW3e!QDt{P$t3j`7=tTI-|IC?W7xKvh`=a?$b$sH z4f!1=DY(Fo=W2fQz#_&W*Xm@J;EgzZ5n77m9nieGZn&tP09iPVAQ>ewO|URd9$Bkp zSXo=%#LXSqSU?dL1N#MXV8+s;@0TI z#O@+ksVTL=*YU)WEJKH$FqDxMBbil6uJ(oP^jz~z$#BGG7K4iFN|@Q3+n2n@{8P~p zSt1CCv!P*l`PC%GQF1MtUs449wMIk5J~>+bT;$`k>}v@rZ9;AT$}$?UbH$6_Zr7ag zR8zNWo-Ot#Z&HSwtPbMaE`68GJV`}o<>NMaDoKGxDaO#QG`ec!B~Y3_eJ#3Cb04iw zH=UIzSayNcJifY3(C68?y1nsg9H@!iM*pZr?h2u5NBP?~w=J*Heu?Rd3nU%iZR&Ad zU4l6onVs7taB_EV_%;v#q0!Z&7Ud0X^%c*GoxWcB>S+c69= z9U#Tj0_tfhKngd7W^yn{?zIw219!+0_kf-@IF1q~?5(0Yty>tDRrj_o5ebnMW|*Rnw>CPYHT94=_G=br;&$$&tSt#F>R zUqi=!mn@u-L>77ea7~=Qj%J!dXHV`;ANp7p2hdUA!b%eOb~ta}xXU{Hh|_eu>S)ry z$~^mV&0N0>@#@4}DEn>66GC2%= zqdj)FJyx}ETBy^`thHi4r0v@@>}`xtde6Ng)ZJ)JtxQGtyh(7h5bl&U-rQE$=c)VW zOpCl|MHH+3)jx>272%Z7aKHg}B7Sm5zJ@;d9b9p*000}6m+cgTeX(9DCvxGUpx9YR zM?;HGHjeE#l8MzVNW;Oo$2L`N3xsF*g4ECm6j&+r_bFA~M5OdH6<)FU7)XEtP6rBQ zbOmoL%%hktI}ZN}t}xd?met;E8U{$jtw{-e8oP&zXxg&ImHBX6Yb=KSN*eN}q^X_u509wvESkr0`5V;u> zO4fEQDEHOUn~Y6=%kahO46QFbTwrN$9NTr5P4ror2Y!KPAQqdN>xTa@WML+x)=~_Y z`Dy3MarK2be2HBKE(!9zNx8n7nIlr3F$MTUJwLP!)jvN8fJUVI(>x}s|)rUv!d0V>c{!^&f&CBr3ddKMf8>PG_!tEhWdQj-=_Px_D`J z`f8GDQD`GhU=}^Af;|Mu_G0H=T5z)Kdbpj=qj@R&=vf&7h@;YtGzn&)bEj_OI}*@k zx0*&7_58Ay<_1#3Bo1`g<|TE@KjOV0DS=a$GN%9Jp%spF*L z$NCjr9y~t>@b~264*GPs0J ztL}`X+7K%a28-cU5*nfIeLk`5J*)Sgycjpn_BKHx1%pP{`ech?#iP#D1eOn^6ujT& z!5D9~Ee_{a!y6sn4~+c({Q%G5(C7I2?VUs5PjV1*V)`w2!Rhfd-OMwcR)}FT37>WE zI=&?b-ErXaI{bJmjp^H zyjM?VmF}|=u}T+~{}32MaF%$|C%iC&;yJx->fWnAzE6sA!i#Ar!|jw_kdK0O4mTSw zvANh~J95uBggc43wUF|$GPv4}4#Ssm zZ6ZBOtRb!V$rh7*gS2Xoh3oftcdeS39kMMg=n2qx^f#RI;Nlcj+Qh94UsUc!mP~qi z`_}!A;D+o)mG$lpk`$cjbR#uSO+oXf(wVNH`QGkul|DK+yY{ZI^q)XDmM1plwGn<@fY(<1Z*p)ti`w>vy`m{@{{NOL}K5dgG9i-nX%Bn;v zp_JW>gp}VxlI`T^(AFyy=M56D+JECTz;GUP@b(7ngs|9rz%MSW&TxUR)6)tO$qwI! z5>frDv|tGE%#vey$SqTS0E$4h0+dU5R`=!VTfI)2s((|>&Zw&2mp$LI!Ei_(tr{?L zE|c=0SVaVjx5LQ&mBx&JjW^Rex=A7`$!-;3tZMRiLEUt$zMHC|YBMGwM5O*d0nGPR z0-N_uey?aWUi^A?#^D7$c32x))B3MbXks}mk+0J#X)2O?D^he4)6@0N0hO1pdZ|)^ znuV}bAhzz&nVnP}lBp}oI zQB0z_M4cz|Hn~eX1AFL=S8iOz9fjf0+GuNi0^x26FKw0z^zLARAt#xh!U0oH6Y*?c zcz^2JWe4u(VSIE4QB8_K{q4|OUS#M>t%QJGRfmer2dc>)d1Qo$ zTNAYy8IN_4&(h!AGvaNm@K`6P4mz8Qk%4r{_oBZoZjv!5@;)5TzM+r+N+c-(BRvf& z=S{phf58f28|sU{{75Nt`g3{p=Ur-FVJ;3s`d?#@c}#shukHsLjV>&=EqfG9e>brm2*WGq3c6xk4y!{wZMJRODC<3u9*{ zIBvXtpA3ylPuIXnDoKCJ%iJnqpcAazSjpFt@=u`5-xuFwXh#`n3ds}YCH z)!M$zT}xbAO8L`=h1hBJ>d@Lg3MMdK9!@WQp~>1RDb{m)7Y;bBE$63B5VydmVvLEA zUNpFEnzBim@vP+4jZbl;UElEbH89IQzT6ik#>lEje!0qOwi6WmH*h{2onm_G*NG|{ z85_(h`crxq$8STs!vVLFfp8uIK=gB%%=)_e9nWbNO=7obzlL9VnA}3V7k7`HJ=?tn zGLbFBZet}$#WQy}NxhPwua3mJyPNzoIB&x*-%;%q)u$usx`)BE^yrl8DEu55LiCoV zU*{s%u?RlQIc@!X#B0*$bS}56e);#HcLhMScWFeD^>#)xn{AbtfSg~aocu@aYn7G; zJV1*37L|R8w^VIH`x|qcub|++<)@|H1X*L|XuUZ%B+w zV`w3oBE$98$!={D=IxcD)~^ETBQnzv)chgU-#qoh;M&uhVJ%A9BNPe|Q4SL%*DR9k zhd}QDZ}DdEsssYcf&>7JU)aSHw-e}> z+2tL2#e=|TqGXY*V0P^L587Kpe+pZfOA9e2&Mv=uLB?;j|3Igj!z}+a$Y#qBvr_>C zb|$8KzyGcnL0;=g{4uXRR+`D407e|LtIohpy8Q9{7SqN~TcX6MRGh}8>xPz~3}Ul1 zco56af;@j5-R-v^sDudSZ(^NCz17|rZ@sfgU@@FM#S*MzNMnw|tUt=%vtT~IbjzyP z^vKr>1VLq2+z`vQQMS-^*VxbiEU?u1z&bDyE0wpr;Qsmsuab?64AmZ8F$rEL87jMXNLM<<#$puv z7To4YrGq=jE56%mI;{~)*U8bU+TU{pdqy1|jKA<`QF1+k9E6Z%joXI~5eVOfRKYtM zT%79z-`t>$jl);W&u5D11<@xvg;X&-Y&=|(3pjkR;BuNDoq`}3c;6JBo-P5@93PNK z*)2f%0W)W6y1tOKggx3n?(#fJG*IM7(^MDeJ+8ydLn8Gn`$!YP=jh)SNvv;&r44xAR|SCSKss9 z(&yM+Qq*EHykWo=s%IN@yqjpos&5ANw8E$;gwjC3TNTsE<8gu4<4HMsi-t6(`HGw* z0u_0pIe>5fETCObQH;Nf$zd^%O&{M85=LWxmz+lZ;eFr-8XKx(zrUmWeyD}`cnDNpCBlTLG|n>39OU#tJovR z;q_f`uuZbO7LOXeRI>|mvw!+kC+_$6$rqCcg-DRQ?r*8~ohq>7EG<-wV2fX91@xeo z6TN%Nzm^h9m460I>*VhR393R-G>iiNuN59_=)B$R8$>h`WXdOr2chS&$R56pfsGY~RDM z87xfu^`z^Prt&d{=#9xsffWWD2{H^YTHV6;nn0?{E=LOmT_m0RxAYGP9KH8ZKi&>? z4bo{*Z26=`=Ez3nj--0kZvl&E%+9lu2I9~jM@*j!tvij-w+Z^=P(~WENZ@bdMENNS z9!y4Lx>Z>2YsgvGCZs3b{Y*2Y&B<^qf2cT6h&j;2OhrYvQ%wE+q8!W_rGNipK5<=9 z!KZ-5K8WwGtbe)A<=t+HNpX|pmrzD7GVn9*-PdQZN9${x#ptO=8Yv;r&>=)AaIAgW z3^+Zk-Hq+V!%7Ep3R0SK01p)BRafpujxu#_CEj|F(7`dg9T134#eXJLE`$z1lqsbJ z66NZ}QwL#Rhi8$MoRHCG;S@`P@~l(0#<$lClD0MbILP7Ga7_RGGV}8%EB@J0>GSMf z0UmjGaS_FORy1eWW{Csi;hh^0C_|8j9((I__qpOpIvUL~%D1EJcD}Mw%>gMqrlY~v z$EJUFV_a$RoL)MOwgx{4yt_>DN3Zqr$(^I(?5#lpx>y5}E!+9cXt!u3`lCdw0{%Em zYE0D6k)n_~WGx8llzg`m(^ANmkQ~OWL7ryqSUq3U=&CAs3)H$o{gQ7=C9h()cV!wu@_k|sDSBJ?gIQQCn2G4+nIj$w26Zb2&2R2*rN{!MIU49 z(7KuT$b#r@U@ohCn#VPNYSQ@v#L4JRN82ZI1`A%zl%%Eykp)YcB%tTi!`JQN7FX^g z5E;d+F6HC(QuVK`v$NjRZgp%dJ>tV3uVBv8@E4;JW^#L+6BGZzu{VTth{i;QJ0ws+0@v?1oQqIwBzBi=NsRr@6zl3gJT#d zVnt!KBukIgvc8cFDprs=Pv*r1m>zPIhP;Y$ywJ|NqKNw7A0=J?n+tHusxcmDAP0y* zd0wZj8sZLhrHou-Vg~9acRbXT_tBQSGGe&9SyDWE7fDW|r-NR;7g&nrcjsqI&3GQZ zIbMyttL&~W)3s3=BMM**SJoimf6#`G8FunnDe$PmgXTgN2vvuH0qUTARtq8XgqOw$ zT`KitxKU+|A(p#nBcOj45SBsjgA;{1TE9A<^1g4BA;#nRDExCjnexIG{Yo48-Xi|N z*>95s2EE}%iyW3wOh2x!P{+4;C}4w8Es&M;CZO0x^#&8@^SV++@9vc72rbNfDzF%V zWSrP~Q_|P$1;2NfbsTv@NB8;VPDF?c?Y5f*M`m& z80DB*lCmL(3<^WCUrTd(zr#iYrrLM0sMlmFLJ` zI|jf<8km8;NY^fPkT4v8N;@-bs)JlJbDO#LhvRfm{Pu#!&->44l%JADK5{sb88jqP z2|^E>cHb`UWX;IF{5-lSp82Ggd7C9hvgkhVMWF%(WTq0_D!1@eMxshH)HGzdk{B9n z8gcgaK*TB_r+w7N?KHH=rFcgRH_2R>FjYt}Qn}BG0)h*Zu~ljLKbowvSu;r5d1O(P z^@-jD1NeqMhB;Nnh%XrgIf8=nqakI)SKI)l7IajTPMhQp%Pik9$=l8}) zYWsI~5@wGqg{-+@yL5+RY+%#J?(B_JJTjxXEmU*m>rtrJx!No1eL;Oy~8fA0oKtbqhTXvNT7#9WexE_6Qvd)B0`k^@^Y$MANs zwB-iemO%g^9?WP_+YN_D! zB=PJCCv`J(jO$5WB>Rjc6R$K*?z%JaW_+Zk40ngO`>_FNBnz3L8x~I4c=5*voaF4g zb%hNO7)Igew?h!^w1Ipzri2a8Db4cQoXcV*X`NzmG-iQ*;?QC;t_O)eiOK0dx3)MBv1@u3<`>2vM9mU^1OG)l4 zDH-|hs;WVkGZL~I8PJyYFTC^yEmco&wymE+@{HWQh{ma2nTZ_duRw=~avST{)!eHD z07Ynw>U%{0s(YTlpikA?e(=*ggyAYA#J+v$ztP5 zHW=iREXL!?{|(e8de+Ni{4)nH}7y&j9lHu#)OY}_R`F}}?Y z;Pm_cZB&bC6?;{akT)6-JUE}91-UnJ!vsoXFDbXwSs0T5(sgbvR{L97nSiowwFX?p zmdNxtW6VTl$Sz70$>P9pzM!L^&x;2J4EV#V!Q`utqmlRdLSu7TuGO)fBR{t<2RON; zN0n);PtPjbtNk>zR@&vCL(kIIua@TOHs)z%0N|XW`o-j^x#gHbj|y8eC%IQ_O0D>z zunPHud}|&zRluJ3$!_eW)zUT;Em@z(emx*U`rrolJdndeINdAwJ5+MBY#$dIsz+P& z@vQY>ntvMUY-K;ue<|}}`h&xldYdQp?@?)d6Eco)CUw-&nu~t?Irzz`-?hE>1IUm?@R^WkcbsoRk{oC3IvBdb! z@TJvj*9xf>od^m@zp|kopEgM`d2_}+jvfjQo)X2tq_bnQLa!-XT9JQb00yA@!uLUs zBNNb?;7Yiu74xyJzoUN%-dC}33A<$@p>BviGqf!?p2b^WiYX)4UP$hzE(vVa9x`EW zbp4^OD)3EG>HEk!%01^3-XOctVyAv-R zm;U{}NoHi`R}r*HbWs7`3rSt_;cTM2JMs3<@Km8FA3(+hoE0DI0Apq_-nRxiV?<}K z3w7%Y^`EBUaT1mqJs*8SIzQh|<*qhF>wD&d^&vg_7-$XPUjp8%?_`SJs$X*a2Ji9) zo3TnDeLML-!YhJIgE(A8VM7^0D^h+dy{^}v$98Fd;r%T@g!(yr$**-qvkxlxsIe)& zx~+I6$iz}E&AQElbDW+_;ibK6t7`h&!<+l{xq4=Y-qYst!qd&Xen$$b|MiK{y?cj% zOy`{SncN3I)So-JKWs4zO^qkZ>A1@^kAnwDPQ1-*$>SKhz?WC#=Px3YJmavCA*Nm= zEk*tW5_3R=@X_OT7YXu*wz^F}LHmXy!Xq~3A+bxH2{Q@`L!VF7sJ$xnC5mxkRb{QC zBf5ZyN`e{;eA_fLsKmwgqKEw1->KvnZ;z>aBrPz zZ26;|}>svt;3r)ZBG z7`5-;(hck14VDhqs?u;|@VZf{MsWb+)j0u_f zUz?+fgnvqU8B#>&%|Hp*_0>H#w+pK z@e}_R6NQsBD=C(cM2~l$%9Kn?Awyw#lTma3LYmmAgc~(*y}qh$2e;UHVT=VdUuW}R zgUeW-;C87`Uw#ONzagU^fq&$sCqo5_8m9``I91_F7i3;;lw6&%@0V)f3)@CzE1+~! zV&{#0I=|<`U@Xu_u{(M`rT;jp+mKDJu8{}tS!>-? z8huwv@KpaK$ouzHp)19x(nEc3@37ynir&Zp4p7eVi}A=y%V%}ts`%hb3R@`0uopa< zM8z)pdqgv?VFlL)iN@+&I_XoUt6Y)UiF~9-#Pl+3H%uk zi%%Z@ixBX4_N}S8Gd0do&rmjPRh8juEzT~RHLdY4?38)8uwXY-ki6x76HGBfh_y_7fgJqb^$k@k zscXM%a6jI>IB$LikI|6lb}1^&1+L|}&bKEO*ndq3wTcmRD)AYf$6%Cx$vq>owIun9 zYHPe6T3_NB6|Fcma(e#YQ&g75N*bqdDi;+pP;T>s;%nKJ#Z>F}jb~oj&p;iSV8B08 zM~Y6!fYBo%PEV1A7L5u|yb_(;|kd_MHD&DtdQj@a&IO<#hp)VzA!O`NkLxgKEq=ELK z4Ya$5*Tza@@q!)Pxdncv*&r*>(C7I~iT%RQ>Uaq7KY+mG#N7FUhP$;Y@~yME>qX`T zv|o%eknPm$X)1~+4c+@BAggc^Aq_cN#ahe3c`gho6)0APvFw@L7{Gw}uG+BK^ygv- zPX8PaAiz}jnwHMB?XQUG4wW>jFxBW@*#}X@q~{JNGb5Wu|7F>a4stW z6D1nq$!K2I&y@(&>)t274Kynb7Ylv;`SE3)@zXUM@Fmdhss!EOlLL;NyY!?yY~X&_ zpg}%fD+RrS=|?yz~#Y3#|iS1QL~{P(3YcTLDzdGg?x&XvC}Yy^-g z@NZ;kPos5vi%q85h!L~9XYwkqSENsqJHJqQ4yK80|*jD-`~U z_o!4u+0*lgvVm5ZTuHUElH$*Id}#o0W=qna2%`}mD{i=?Bk|~FzwyW+dY$+C?az5- zAUe0YYhAgE=RHM5<2}ctOxbqg-%(QSm?;%E^J;BIJy|)QbEx#u8+fZ^A?e>r%9*J8 z3Otti?C3wC2l;B-Zl(*=!-i_EX=Ids-4uCw0QZNxZAIyRr~69ANr&nh)UgCxF_9x6 zwk4$*;0J#Btmux?jcOgd#o_a?EYP3?ORB!F>-#+CQ|TRs?{hoSMe+%*&1xMlZh_sV z$Y_HR^`|-*41Ae@udn{w)FEI~LHsjHfswd4_V+*A*RK)A4d3b*zW&tKZ&NfNM)@2A zqFxouBH%4T38XAMrp9VbkDwO#U0RMNR6;3TN3qX>U1*?y`si=uQ*=k}tK4`Y6&O*G znCAKz`j-W}3@IY-rT{6r-Epm67@AP)Zwu2tLYK%QevE()D;l`cM?jOA&6BH|ET+Q7U)jm|$O{W>gj{*ku|y;% zPD#7G4klfnO=&GlYdrkMv_{EZlKI%1S?XCBJ>n*e_m=Rv`^VQoyq%O9gvr#HcM<(P zN{RIYHhPn^s~jFds*j~_uO=#94xU$)9VLO-@fx|*n#-1`Bf(@G@a$)fj`Es~Txo%c zTx{UT^HH~1TRN%NxTFrvDr$ySWmS31xx%4dX(n`IX1oPjG^YeDUoe&086g&@LhUSv zhP?C~M*K6|Pd8GPSWNen+~sK23E?lV)WIf>SKg|wiJ6wvMr-&@JPS3ke_65%C*yk+ z%QY?vLMpJ_yP7R>Sb}ohtYkGIofhS( zHx?Yj%&BlD(9_RG3Cx4yG3}k0`7|!7BA0L%6%IAVpp^lRi~ng7hs6oy zZ(fFeUWT3FjUC^gm}hCd^yoN7lm3*sH}v-CP+|WCLn~3SRy(y~=R3O?ZxTL50!K(m z42<1FdE+pFLXOYbckfHz%&OHXbmp@Ao64&1Dp}W5js2O4vQveZfzDPLlqz~icQk>XaDxdSI8}0zs$kKNhZjNb z7$ZYM2Pyg*lGfkO`Cd@BqyJ5Hga;!DUX9!L>sPNy@(nvnf5RzT94hHBek+@^HpoVz&g=maiaGv_7-)eUK~@f6$eT=2o1V z#8xG!8ySJSm4+xB0e1D{Aq-9qb(0juSIzl|crN@{1gMFpolnKl!U{cb!Ya_fH|OZ% zlxd~di@L8$qVcH>Gc?(hRM7#~gP7hG94-Yze^P7a`6>fukoxmd%KWvhC}=~_>xHjy zCn^rs&h_dl0U+{IQOPU^tDn4M@$n+HS%7!UhdEG~d~iW5X^e_m`NL0+nYg!T-9a!h zVyoA};F@u<4mlioeb(OP?I0FjocoPDX4_v!_CZuhsjKEd)9^HRJS(SV#M%ZvSIyQ{ zjMhC@te+yljMohJLMlJYziHPAL`yJDvl@m9~|7>9R`QNg1fr~cL^@REfCz@-QC@tpuq|5?h**@u=D-x{?E$e zo_*P;IV0U&(^Y+|>Ld5!rgcOY@Q~EZBnxsR2o%Zdk)}WN^RSnXsv=Y%xhsS#a7vCR z2II%wjCsO_nxI5mgG=nXQR;-?h@_fx{y4@oojFvt^Fw!2JiHr+q?)w`I&UEaAnK7P(D@hcJmL*o|^eQeG}<-8{$f%VEmlpcVO zkHuXkMN^<0Q?3oHG$SD^GdZZXt!iEBz{S(4!cQ!b;mf+xQgXzPLY%@ma}Gv>HDP~R zmByl|+JXS^jqsQ<&>aazSNlW%k{>5~!R$MgbEtKtw~iWxP*Kq^qm4p7&{vO;wc*)JG(7gQY_~g>Mgnat8-bVNwbwt4H`{ZqAQLMSsY_GhPw6@Yiv46DS~XKj-C93S z3H9`>{8%JOc{P#C!JzPWbFWONgthqcJ|*GuHFhH3ur7+%#6FI}v;vvilzBlFnswHz zn%bpUPZuAuwX=Liv;H!vpq`yh4UqyiNnF<> zcBy8DeZ?AJ)!CAN>?oo+j1AqQb)^?USa8;iv=l#BAM_=wxkKh;N1pXnbONcG&hA<2l%snT{5xHWaXYL z+3le*RvgA6y$goxl2UdkUv~#DI1nVx2lsj`&S9f2w%*V|XR0Lzk!OKEKi9kzEi_tEzh2C@*-?vxGI9-1M zmw>7f#~b!{`{G2wRpqS=iNVNFJ0E*IP`HQ`rKxNXQ{oy3V*Ldn;fy4?avR<-G@gRU%=NVEVc4{@kl ze#iVr^=G#ZPhNgDybMcRG0UF&DFS@t!(D%ZmHjt~Bx9B%tOwM%6P#odOebhvD;jOc z9|YALy5FcF{L^+T`fmpubq8;(#8j}R>>X9XEA2u|M`-;V=W0KD9ykog+~B>ud4zkU z$auaFFK2gA*%*t)cuIf>toAqR&w8q!Kc$jT9GMa4H)GN-M|8%XSo^a8FT^AFL^YTq zf2oe^taKMKeTXRE&Eoac5YClhe`<90EXs5l!APS87ChJ@wmCxU?R~q>VHkM*`_M=Y z&BeH}3$tSf=XefC|AbZ2R#A5Cws&SO%<7NGntwXu4m}>oR*1ow}Hl}&h4G0ga9Nc9c8s=|ihg6VJb(oMxa`rV$n>`{&|21Hv41(Ge@8h(dUCOm_NWsY~FO9@tzM zpWX)&%iMG}?`XXJppVOoENXO(tjce2fCk}KEl?03yMAmdz!^q}O^ zS0%BtBX{2m*yYWtUR7geIDn)|VZwhDK+f& zfADydT_NG+-ft_!S0ENad&3ym&aa7aYj|M~;Tw2KQM{0VrB!;kAlSWeU4H9gbim#3 z!_jA#SrQCSP(k?;u{@JmMJx|qDgh)%+{39s=hnaQ&v~|6?vkV(k8N2P6d5Nrv z2$UgPM#v5|bka0c#L`23ot%oF`w{k5qt z0_6`GAD_}=c&Z??#>-&yaEk_7!g0d0z4VRkBYXM{<$`dHHe#+rAv1I$YdQ|Md1B1L z;$DNQt2t?Xab)%@OyCW)|7vMmP22idz)?z;gzo97N#N*t*g5b#c7V1dVjU_sZ#-#f zyL1?He`nd3q5#dVXKo&W%k3dbH@-o-abezhpT{g;sfGAYrQ%APoOROn5R!+z<(YAj z_hgr2(zE->)!XD~L^$3bXBR5>Up|Ae%6|ae+t)|b`xK&C_HwsiSmYMOmaXcyN(2pubTsFiMrR`E(p^rB zA)pNRz%D@pIL6G#GF@L2e=hC_so*}e_BEexu;>2U8N!hX)T}}`qyl=g;@_^`DFKY> zl%$DF2V8YJGmW&tBKO*0mJyv0e=OBmpikwZ9 z<`RS!55rvxF!2F&fHJYU@nl|~hS-w`i^Y?Br886WF}NEr74lxTFa4f`_AYskN_uqI z5Ul?z5nx=w3$T6}59B@N1%y`+PJx~{NL#ergJyayu)f4;Kr=!grdW`cF2o=>iDA9k1Z(iyA!3@H93dbhE0>Kai zzJmHQ>4cCBqKjt-vh+hxXaMoh&l`GMJ$+X>93#=Z3{t!(Dn@flktPwRWLEH)vlRm@ z4gNd!zen2B^8CmlY{7Yb>ooANB|R^nu3o-qxo3?_{OwrL+!PqrWqfsiXztTCsWLQd zKmdokWhONb5NP5Ft(K+FxYjtJv~)(Wirw* zJj0}ZNz6B+uVVb}y3s;%D3A+)sB~dcNfRvS=bjc|>+yRwVC*f2Jzqs(jx;->G1hT= zu8al;uMLHvs2UB=P)IjkbRwkNrVQ^1e_YJ+q8Pd^b+_R7!Q|?~lQ=K;-1qhDd4}WY zF9pY*BY{BMLyiZtkW@MLv}mZu-%^sictD6FK}8W6L~V0EV3LQlQmtIo_hNRp$5oOf zD3_MG^zfx%LAcz1)<4{3o)pZ#sP>JC_3mOUdIc6j_Pf^V&7dND>iz~oKO?WDOOv9> zoV|dhA0x#TiD8gCSlBJ(`@_?ZJ$!MEWr?VKKxdxw{m*`rwPa*q(C1GsU;D_UG}wS0 zmy}62`ndXa#1kX8sgnG08n_a3-fW}^mmlR4SaMe(66W@pD^xVC4J(N?{%(4rs@Lk+ zPiqxV*S|_~)xRcRpX@(NH7?00X#C+w)s?Y}zmqy7=+9M zOS^y}TjcK!+vkT(^$yBxLVE;II^BO3KHNvL44a}_uxXF+O+=mS-A))Zbz8=ROahsH;lcRw0z=q!{L_dsf7x^4`Q*YJ8g^x1K7HO)-I8U-1aCy; z;=ZV1QI3mjCAo~5JGHWAEUC*zJ!aMrKZ)Fx@ zsjI|0!z6S464q4gFC2?5~K`Nf|5lDq+=feds+#JnPQJQIm*DtSY?pgr=Wfd#t%=c1K z&MQ@N(&9B$vIau@-ex1!zf57|>uNhfsOTc|+nC#5>!f`%+&Qsqrw&Z)kG|g`rd3fW z%}TUef_${eWWRFx`1-;2ES7pyLK&(Y=##`3h{S=z$N^}0sd6bHBV_uf``Ln7=kxIE zV^*4B4VCnAm6PMI7IZ5YXNq zWA97pQ0n|($_?+Aps$uxcT|x6!N^-jcLvT@vNn^jE_OPJDwws;Ix{E<=iJF8I z{(Aa%c`w1u*FwYy)WkMX#aH0u{pu*`1BH7>?DqDV&0Y7XsxHjJ81YgT&df8RX;MRe z%%%%g!}p#GF5)_Z2$Ss8T}}*C_ewucm@zE}Z!r3reGm2)7?igGyH3# zptx=LZR{LfMoEYiUg_z%3ENeZtTrfBDD-W|jP9pKIGTKqbkN~MHFStfBgTDErl6P#nga=K3wf|oWPxLK zvNVAbJ%Q=F<6`kL4pUE7Mr{;v3Y%efq*MLX?ms}g_9%Fqndp!?DUE5)xv?3R8}zBH zhqU+kyG^?jgN8q0^wqn@T1)=(n}nH{d@{5j$WsTzp@pqGKHml?A8*JX)$B>Ey*j1;vsk@x&K7gaPcF%oOY$>_=@JKn%eJdBEKq%C(D>HHwmg) zXP_ImS30|tvcQPON69ZM`v}f^W)%HB{(j=vHrfacAg(de=+KeJ%nr_FTjas37%&lw zhB28BS^LJyU`o$4CWWOI(}VHL1nIhEt=bty0sBSQ&g)g5Kggb0Mv!PCl7$u$_m|7y zK3gamlYCtR1t8M@5pQZ(Y<+6tr`m`{)Z~zy-pxk`Bk=0J)blHb8NS>w(iA&pm0fXV z1M+YRw}7?13pI=(zAT~ue7{`?o_f}_LP4Dc&j$=>Em65*O;Sv=k!9_N8)?T-A~JAY zkVdi25aJhUohv!cj+z7Th+uxZOo#5SNUByL?P$}P#Hl7owXU)odH$fwr#-m0g8Y46 zDJf%89_A1XOo=c@s(ZmmzBX33s8M$!_mRWfyQ&<%e0TWT^!c8CyYj<@gZJTrqq8h~ z+BHh$S7FtyOpCCusME37{h)E<&^q2c=>XDE7GWFDB3bdrQGS=3yP8w(bT~s%JV#~E zn!RiBa=i>;3Ufobr*>m8bQt?li<5=T*k2gyKAt6$TB`urcjrh1o$zA|OlpDDuky@^ z$lshBJEo?r+NTq$h128LA13p`e{W1nDtIBK&$S|Cn$=~enhn&|6fXB@KMR?}iE}z4 zEvcjM$uGt>)W{#%%sB%kI<|Lxy52GDs7QUHRK7+xl|UWElp(OmOR3Q@E~VVUFzRS% zp%Uv@YuV~kr#ugl)?LRsuR%g#)lOj@P(vqoEcB-DDESYK!Z?HX_2$M_$ak?#jaTO; zqE}EifD0f~JmCF3^sQoejc2Xi=gb#e<7~yoSdb5$OTw;NLXJf)uoBLLS!gW1;qq+%)xs}aTu>T?<0pO?|SNm?!;v!m_ zf>QnLBQNBmF{MZagfQk1xLd2}qxypHYXBMhaJkgl+wrX{6`DJNb5XCi@%h-cs?DY@ z8v19;(2V&Zkyf&iG)4!#mISb|f+ItpKo&ao{xb8LvS-T$EMi(*$d;2H4BX?mM}+VP zmb-Db>GNN`Pd=MO25|QIomz5A-->TKC^XdoZ5LBvJn)n;q^fT5Kn$`pBVgGMn3KT>vKQNi?o5}LtZ>P`mGU+Jb$oUhWTEqO(Pu=-K-#BbR>*K@FbfKW_n{UaSVXo%+ zQ^7{wyxAu|d`mN(rrWG3iO;9zwAY3vi@Z^m%4}s9L!*N>kK&S{)Qt)fU<4~l1*ETQ zPb%5c!Q|qnU%VEae?j~uR98+@MB&e()x_P&OxOJOAoh}`*l9C(u&rp@ zPS5|-E!3a0wb@D3M6($X zFZ~{0Me*Fnb*L+iA{a7e#*8R;y{u^{wh^b`qaM!NWaG$ppFAArW z2N)#L8CvD`jTI<~#=1+#39=i6`^+=da*{D|9w_#%O?Gjy2x~;vKGydgJE8)E06Q14 zDh@`(0Q5lWE5>Srv|foF;y*f8S_U_%i^AxSXp(^w-!=u!J#mgxB*maXD`(Z(xe8*$)=@ux zx~Mglg7>=@vRg3=hIT9li8RCgn&Un@zfp)TnU15W0CbIoIO5H?#j|T5n2RNc1*J9( z7|aR^yU8Lu>Qm^h4EWf8MHP;ZkvL0>pXy=?9hGXx4LdYivT9$}E+@~6a#4u`+$8^F z?zy&eKxVBo$;pL)H4_M9wdR4Qjo0n)_+WpSR9vc#- zar-59sjj@8S*<%x_v7YeTRRAh+A{(HPQ@*t~_eqOcF{0i%?Ka z6J9XCJG@#JZN86pvGTcD$KyzrtMxHzKj&Vm3z?n^r2C=+pJ*atq%xeb^Uq{go<)RmR<%6T|>BL2XohhgRBS$ zNDQF*bimL`qX@TPKm>&Bn3_*s;hvwx1h2sd7*|ETI1N6TAJG2A(+!Z>{~@xLA$Q0) zkMY^{)kB)C#;(m@e7oG#uR%u3mYf(_C6mI;!b@tek#A}&VV~Ew?`n$fR}QKiWj8W_ zI6!kX@$ni>vB_6PC?4^q@(-4H`>+aw;f&t(UFrgVVnmdR7Zp zKsiBsmt;Oadey3jH7jnbiwO4W_tp3>VHnFuvXkD@w%M2dk(fe);7AYu)cFNoCFBx5 z^CZNo*8uRMmiT4tTqdgL{p^WF1M)m>*4+D4et*bQ7qy6!mvdwE=~chFlN3qeKS3Y% z6U$EGD?Bt`5ky7ja{mjR2@O-4DG8mKEeqpF0%x^*(C|oeq+xKAM~TkW|2(}p?^Peh zmjR&fIp0Rj>uAs+#v?bp1xcP?(sT2roAE<)=;!qvJc!xl6wS*SH?!Q=MrgG0(hdTGz+WT$Pkii0I+olJju8!(k)thqX;w znb`T5t&m>B+cZ#0x-=G3_kMRTvnml%e~7WUmotdWZ_#G`-l(=UjhWa{=`Qd8);;U(W*aneQn0vH; zM!^4i(E!&erL64z{V2$NIl+QxTm5h@?Ammr=8ehKeKA+im%YjO zsO4R2&%cvc|Ah&lRbsxTreR;>%}atY8Oz9I_Ee>^Ar=fh8~(|(y>Rkx)VG7$6eC^j zZdd?eq^7UcqLy#dx!!8p0sm}Y7=Lx2-8HRZHVz>BC~*p9oqMW_asV#KDX&_FN|ZM` zL^mA`0BySU8};LEVJ85@?UaCzf+pm*R}g1-uLxyIgRXL{t9q=v7u6~5)ECQjK!6mX zu5X>^vGFRK9DV|jM%>e7kF1fP70nr5leG@7^u4xBpI zN9V!PdKK19H2w+7z;EV8jelCG1&l7zOiPiQ`0h3~TNr+<&`F>2>h_gf4-%bk9V4KP zMXH-ssJ|}&{P9d@$ow4d-U5BF63k|a+>VK&z>=)(_G^!`c=iTOCL(MRYl0PzVoS@^ z&FRo%WdU`q`r-{kGytx_mH}g5v)x#k)L>8}5KP%M14fL!6QQs?Z9 zo(~TXvy|?xB9LYmHMrGz3GsE0qrC7VIavv6Dl%UmYpZ&6Vk)~lXQjE9wl8C%d7>pj zHLrvGpBd)a3%i#jU|^k7gPU9eUuR+o#>1hy&mhItt$Fqv=+F04ER(ki%D&N&U8Eog ze^ZFl8kKKVQLz4Al-K7po9}KHbam-x=7-z{1I~;M%nqU38`54_EmC_7{4GLp zd|hL%3{=C^baNOX^cdorI}IO0@)@Q!N59JAe%H>FE#RkqA-NuM_7PF%8)$^A9}=_i z67^F+ovbMC_sv_tNYKA{>P5RA=g{1E^`2|+=U}s#O8OdW);fh6F}^8XSoOUWQBahk zoC`f{iHM)_X5F+9(zx_%M=tn+nury9VjdQ8DckPUnk%E`n$As0HekOlW-{iN_QGWj;Cp-7?0y{K@YZT0bskdhu@63ffkj zIWT{|4|@0=vhX@K!VYsE{*Lpgj97m*!=}Pi5HS^YJc7>2jkf& z(}i87?&iSXQQUWr(i}O&pK`WuvFTHDh7?Jr5i$jKAQ$nPD3-pb;wGx^64xHAK#|&Q zJ6rineHXX>9AEz3NmWnZ6(TCIa1Kk&rVM(@T7aL*w?197q|S(G?)|4AxW!c{(2y&> zJei8#8P&h8IwD-bLHo(&N>2PF#JFFry1XAR1W>{61Kx4x1SyolB_itp_oT2@amFO}72G$5vX{0IOIIyhbwyeaY11L1pCZ z+$FO!uvYP&=ysC1)z{SUeMG=R4;nBDQ;lm=EHe&{#4ahzrOpQx6hAX+O+s)mMlVbp zKH56VmH)X)Pzpf+sza)$#ccV3LuURNK8@&s1D-TX@fYsP{ol`tI@c+;deeK<;Q-)n zfw_$yw4^sYern3eJZ&+yDt#*(`# z>2~bnh9JShdrD}=HawQjRUG0YrV!$>{ItI1RP)WT!8o)vc~`LD4IYsV_NFo}t+u_2 zj&+E!QS5v)BETS#oa{~BZ$^^NG9rWM$_qjs;-BPZ$%C~x3IsWhYD3k%4il+_DY!V+ zNCs^i(=)bsBb8{!WXZbLR#^|xZV*e0fXUu>J-m&aiff<0EXPEVON(38tIl1jBmWo> z68t(26E4^j1D&p1ev_6@8|5E;1LF)_DTZ#~Rb(m|oPSY|gC`{=neMZB4J@(jSBsp@ zYI!Uv{+;t54TorH20g00{N4wLN5WgJPf5rr-8*Y{N?C?j<|2v1?>T;c`;+@gLQi)M z+rcJVDJjcX&Yr+BO3+4v-U^5)86Pe zW0K|x0spd)^ImFc96R>!xfe{m`ymfc3itZgn0fKA(p3qu=)R4cQBJoj#+fWQwNPRJ z@=KSIz_p{&8Jf~T$3EId#~Tu}OU4U}^tt?ZPAsjH`&J>JySB_EUHQ-6_vgCWiY+JMAvsZ8M>#k{}8I_YTL zD{u7~P1dqG#5H+@Z#Z~`%ET|L6$L>$Tv7ee|Hj|Tp3S+&Gv-jo-6TA1+{x(}gzb;X z{$hQ!tEV+YVAp(m)-s5I!#&RgQ2{tIX{0}LV@9{_4qa6J9Dznw5%1mwNH_77GL_tgBicbhkamM$D^ULIGq0&`2YFErr^KGdAQ> z0?NM>_dVv6K5b^y->r!3Ei3ZfkFszm3w`_!nnPQAa$IsB1*1U^6u^EXxF(!>Y%soq zTdQaeGThHEMbw7CxU`LUe}v3o*Z{RET%O5O4k)i-&ClQp&!y4rhR3C`V+TUw;?y5= z&f%%~E{r@{Xfd+>?DeFvw~VmE>TXNT-hTEk_rCdYk&}G4M4IqXmGkLDSw@MWDAJSg z!}$71%NkVhcE0+9BI=_>$P{<%lI=R&Xih3WN|HGhY}-K&$*{YiWy9C%b!RXv7AI2u z(i|f-QJsX=Wu$&7MC|huxk@X2Lj0A~VPCT>QyBjqsdtMPb}hWy`>ui_lQPTRt)dPc z+j&VTHVWg%^G+Vzbhl8@-M)QPbT$%rC8J++#MP3swcihBtd3hXjRmMKKkOVPS-3Xh zyHys}Pi_uVD{L9Q{9DcVO$j-*o;(>55mr+BuCwR~=O3R%_BXr|GIdL8eZo}@2IQev z3>J=W(oW!$$TkcW7g5n1934yZZD-g=0a>p6TZindhKH*lvEFT2YqJNNzgiarj|bY>EMb>x^LIk-XsYA7S|G9&R~ zEf=HjhfsyMzIF-K(FFO!jQtsKT+A$HLa;34U`x(c%ze7tzDK93+>9@i3Sjg4(x)qI zoue%xaF-UKR(I5h3OIuFd_>ZY^se^Mil_;tnU8Z;!33`t1h-rSO^??$r>x12VCbFN ze})Zew>N(eN@z-iE;*u(Xhe_p1ba!G>(B4Sg5=;KE$xW^vMPR#(YLC1Bo12_~9r-*mAP$Hu9PM=-AC)P;5?MY+37OD9k0D^xeR*EtgXbx<<-? zJ`y+@A>!IRIDg|jLH0~9WpHV{9mV7ae;WV>taNmxfpQa?NjN&1W-4-E2MX=Wvcl=>-bWsUgwic#*XmzEBJXKTIGc~HCf%XLkTNYQ` zX}i{C1}uso*tKLe@_>6a;(abVKi<}`sVkw^6zoU@A^^89?YBHH9jt>sz=Z(eUe(tt zDq8O@jg43@DbX<$g9{@#5{?aW=h3d-KfsEKj!ARmVe25dWEjJ6Fm1iIetk1UE^Qdy z<9wq+VwY{yEVdZFD2PMdPjdG2@=1KN2)q#|VQA2ph)iDcQ;f%|%k$Nr!Otnh%rsk^ zXP{S2MkD>}Bd^Dl3jdRm@~kBP=iTIjyO`7VcI<}@>z|fV8zlL2T2v+&Gs9?sTcak`m$YhscW( zqn{tsx)spPtdU+eARW5SGx+nbOmk_HGc>^(urWgnQ2$fTt#6(}rv}J9z-T>OM?!l2 z4p-!7Sj(~tF9_Bqc>tM3B~-VFar~BZta|;!6Z=pR^$eObh3Odnr3C~ZE##(#{lwBb zRH+p2prz>B#VF&(&;p=7m&|bg?&Z$w>X$v0EzW^~5z!P;Cug9q!FZ1AiLflg?z2T5 zm1mL@gH;ye-AU^G8Qa$vTfR z6(xd=SWdBsSm;vy-4y$^py}KK7WF9D@s|yP0MzV`6^X&};3d>xL;5#&gi&_i`01Kp zBy`P663}GRs|3WCH%lIDKT^>UKK!P7a_ReON`6UKdP@)}TZ3WsE8u@=0cIvxhbGY6 zX+IXyw2f(m)ftFn5Afy$AYWk)!|dMT2*aHP=Mu)&Aw>hW%HQ^afv`n^b9hMvkRii& z7=BPr&tTI*UWM@`vpF)ANkp+M>d)I;_?DC!Xx2j@UiO^eZ)C35szDb88pfZF?XnStl9FSYU-7^H z@C~dJ$!Fo?phbm&bJ%n|OSZMUYDN}Dm<^M_U`t}`IUA=tcz!De3k=rg0wN)c3{;AO zFg!Ej!Urt}!$`^W-K7g=`>ASralT@QpvfDAy@ipH!N-*#fG|zKhiZXMPfE&~-cntK zl1N}^n0U9uwf88X;Hg*mKCCBVgy_c20uf_hG6-8Ifm#wXWe0xSg~#!x}~N&E4endRyI< z_#PT1HagY!zMdPCSJ#~8ge^~%CnYI~eURXiV951y$j6#=^5TSp@Ss?@rA!dt6AVls+GIwXW)VRXOa-Ci(Lr!W@u(a&R9 z05C3Q8jzmbmKrbIBMYy3Ze`CERp82B9S3#*_bz?@_SypS+t${E{FrMe@q)ZfRebtY z!y4jCwE_75+;R!{vNa9HgBA0PjOrJxna$}@0fpWtlmB*=W-6i<_b*tTmr4_>qN`Ji z?qy{q6TC5$sW85iS(8Q`d^r{fJF(h-8!!hWnu4~F0K@3V*c|??$A@ULW+MH282Ox1 zlf@Ys%>z2JNUFe|t)=G9k&=Vg_1v#PJK&w~`+P6iwaMhDuBN7aE5Qwd1ib1179r1C z7h~$E_Lrk+93y=#7k0o9=5Ai!^P;a2zvLhAs*sW7mLO6Mdl>H?`H62Dm8@gsRW)T> z`&fUH&1>o=TBTk+J4N7Z4NapUr?WTo zbx~KSdM_DPC?L{b&?S<@B4^l9q_Z5HOM=3Cf0`NHszR}$nuV`Z?w(Q_f~Pp z?b)>>_A8v8pMtNu3{TcG@gjcs`Ar1_R0S;rAQrB8c_T2@nun4YfxEMulS@t-s1vZ2 z{$^!l@DQzLmI zOG-G}ym~t+0_;S211B9iH#R%wC z-YNpf5uAZQl(tY8^9>;|IQV@dapsJEIvaTt{G8Nt?~+A7lFcaQTy}h8T-~RL5K(?N@M%Y4g#anC zNT|0fP^A0B!aC5UHweY#;v}AhL#=3G8PlIULk>BXi0OO_rs8F*94fIn(h-jdz+P=p zppH81Ot4oRbg7OX0}f-gWDL#X7URiL7uw75h4OYg^|qBI4^qrmRU{$-5>j67F2vj` zw#f|_-1mKeh# z$V}3P^hcTJP7ZHdK6p73`_K#1gSUkV>q6RhHXh^RBBB1lM`xDjn#$<@V+a&8Qm3sH za-dd##MyxsIj#mZpr++-!bu7C^E~1H{G-eBu)!B%$ADFUH62M>Zj|I_4@rj=11>sPncZ?pJRxb?M2?XXE9et4 zy`)UdGuftK8<~fa^XiS2v(JJ8cHg|yT2R2F=Aoj@RE+vdJyQ6k#%i$#CP8mYb}v_= zo3P>|!v^&m{~s?~rp6FR|L5EPK6Q}{f&u+sf5VDDiGzY$|9?M_Rf|LW*TDZe&Hw(L z{_GAzF#aU)`kA&z7#KiYU4R zpohoYzpj}}_HGFNHwGrV0ML#-NhS!;03WvJA0nOq>tiU1{5PAP{%L?edJ@>ZoYp0c zk4z&79yt0sZ?~Ba+OD2}KfAoo=WV@XQ4JHDl>hZyHg7$Kxcd;CO)`;@Zh1iP}m@+E6MZ! zc@U-tWeNzPzU8CK13~}*Am)!B9qhm;ym@3&hy{FjIQeus06--m7}9D>I};C*`~pD71NN4eSzcU#{cn8I%C_ff&^?_t@)bR>fVbIMEu|0Z%#o?=_sYzy zYAVtPYbcW3OeXC*SX#QpUo*V!T<0^q+?|F-Y$n>ixyHq?`%AQbds zI_@#8=u4IE02I=g{_gsfnhzK!3LvLLPf6bQJ$?RmT}E=MSIdq0sXFFNbvJxK)^d$N z(7XN1-c9vhDp6zyC)pAbHo~N2ivb77jg^^@zqHon!m9_vxNKf?+hqJNcmIk#6qQOp2&H9{ zR&{Libpp-c0q7>Gqe)hqf=jKolgoKhVRP%JA$mEX0#XSnIejOv{?E(&xSI##Re#h# z6gQ0y&@Lr`FrdjU(yXoL8QVUU1a9S+&P;e|B1EQ8F?mnZ*)v+S&$l1j z>u2XwqD&ye&9BXv010}GJ)fUzh6?LEkj?F`n_xu>R(L$lsm$ZFuV2>-u3{r2W9|Az z`(~*Jki+mgQiMvH2&}eDSv_MQL5U-K(V@G{TBz2z`Y*)>0CD&|tkdJW{Yr1chr5O= z6oABzu4TCaJM4cZl#X(Bf^bXCvtuGzugJ2%7%8qyePfz7oIhl|gg%2w(FdII|9TMD*u z)m)ZxEYU8edggVQ%;RW_*M)|nlReL6`thI&zcAPTO-%1ZPx4Ipxbi6~h6;Z2<%iO6 zBDVqn;P}@{;q77O@UVtGZnOPs$-X+D{pw}%a2w4jmIjW)W2iSKMun?)|55OQ2^7Y2 zPT_A{8zIgY%fP_Hj6;u-YA^DbZ=;K3RziRAdD*}gFQ?bzn@Iw~)UNN#2BH(xX12@1 zsR?aDAEPsRKW#UPGGk^In0weI^TDlo9qHk+Bg;#G_g^QcE-!yCf5jWxjkketc{njl7t+b}-*w7nN+$;q!+US0_mR}J zTtG8UVu@_*y8FZv+ui>lQolu5{h1feHpG}6dE>v-e^4=BN)bM=Yt__p&q+3?H%#m1 z@{sNp$}sOJAs`~7e%TEBBt(uQk+BR9H%~vz$ZEsARGF(1vV@ztxqiV`HkRognIMG# z>~sh$eo;F(?~_kn_g1YlB1Ik_v$1f2WT_uQFR@O~tN9~jxX0uc98oSz-nUL`FMHq_ zdPkg87N@JkVQ4IrP-H>?EToC!$Tqx2_TkdHkCU`%`h}h#NR?L~adj6Vp>AbNri9nn z44RoU%?SK8hef@mf`BWYK!yjJm1Yl#Ge?l~(l|ss=cUn`cz`jB&Vd5x+dgv-AZAjlX}1$Wp=7-5L$x`3YAa+-3)J$kIs%tt)%h;(z z>fp@?3NhD7G>iDAoiqO9HIbINsMlHXx@%T(@@lZ*Tmy&M_KZB9c}FDpjEuRo9H zkPhGf*eUJ6gbF1xXS00$WF2Ra#F3w2QMJ`69U%BnE%}TVocxkpZLt9AsI%T>217}E zo?M`D(x3G&JprXj?pj77s1uC}$P@JfYTbj*^Yc1^p&I8MD9RSDsr*4(tQefR`1;O2 z6PG}&pr(uIgHTGYJeO?I^N==euz{8rW)zKY%-JQ`rC z>GaiKgHMT(#PuXk&MZ}9?OVr}g1nYc@%@bg{7@Y?ze*v)!!xwhzD2$JHVB^QoY0lI~oQPPI^ood|0xvUjn+9jL^V8gcolQoSAHSnbKN5ll-q0l2?YW0r}wI0 zzuPr_N){9-wd&jejT_ZHTq*3abAZH~2M6A@hwtFbfR&D+@?itdUa8^EZq)%~ejUSh zvI!14t@&@hpC#M0Muz!vn(Pt_dnvu@yZk0SVA6cvSmr~!;)=!A?R<|nwLq}q%~r60 zW`;*tcrWFfi^_+0$mhRdsZg<}T?l}qU~{%p@LOWf{IcFLDZg#S+tgObI#$YJ;5EV8 zZj0|b3aM=t%LE8rMZZ(3!hlor;f&|-*Ezgft_P~HQ9U(X=D7}$_1h)DBQIPUH|QMg56s0o+IlD#H%~TB`oySyA3^L(R`AYG6qjpKJ711 zoMgy%OR-6Y^waMhdb~S})g!Lfd!rp%oyj^%-H`_G#%n8hr7UbCme$GpmkenRCv(JG zFj-hXaO5RgHLpf9bOzs)u2)#rl2KgUuEqLOhpgVys5`C)`y<=fY*1YgAVKZdA%~;f zKWp;$dA~h*8jYGhN=Y%z{YFYxRmebi!3HME+Mm_A{(wt9PC~Yp4Rt+iudP!^{9Tu< zx9P%#jf#meg9up{vD6dWAL_ycXa0=H)dd62IcNGqC`rdyN~yUK=I~PF;OgPaJkNG% z>TjnC!qjky3{*Wy^D|rwCN}2`!q9LrOp=DkSzMcozY!Z99H63aMYs!sHb_^0`?DDV z{@U1x`Y&E}3d5>DND5~##)?6noeeAs23B9sJ%NZ}#j&^3{v6ngR!jZ|&9 zZtbvv`@If-h}`d`mvXaI3sYB}A7ExaD)^&+!cWq}*BgJ_gltF?Z6%v$ghyvSO(9(p zdZwCor08&0foI%^UE{-W0#*5W?h0mDRr9~ng)LYAP-Pk=BtR25GF`556&425pQboVM9LXL&!eq{(N^_`{O->^)KHt$OPQkYf_Ut|U@w#ptB1*UkPy1z0ArG44m9X6z-W zZP2dcI#riSji}xnZ37WJn&_m$3HtcXR^i-%CQ3%k;{+zYc!Q(NVS7Vg;i@jDH^Xc^ zpLe(AFuNQy7c=!I5SWWYH=f%pr{W0!q#I;mwx>Ah2mYd}OyA{I9-IJ3BTOt@puAG) z%&_sr(zkoFh(Rf5VF8UA9?-(6V@G#*XIORCMpJB3pZgP?mPi?-wpbUC2md@VszauC zBLUE%_L`bcqfi(G9h%ESKLd%9et%N3gqTaW34_M7f0est(?2(c5U%kEm5_fis5-nb zCrHZQO*W1?%qX;rNZq&|q>r_{i%1A?;ac;?$rzv@__;KY9RxtKhlVWEP3SPU-OWvI zC&no|(vCG>u?m=#S=_X=>71#Z?g*iegCpzt_%C*}vfI2VHM|oYCVAosiHb3yHSlx)`-^%T^({y|&Z68`*o0-^ zRW(EcM_j@;!qBRVLuUF*a(-lUt;s3UvkDXl00{T#j^wnoYW3lxWmBfL(hfCmuhYXoqIWc}YqXIR0}z_dQ&xme)1b;q$gpS>rqWb#{5$ zr`_uV_S^N@)hp4TpaKAFhtDSWpVfbAI9)6PR9w^)>%vFzO1C{E1}X#uyC^>9^lR4D zfKb7U(+#ggh6H7FdG5yH!~k+!oU6u-N0#9XMg?80nW`1~QY{H=M46Vb>TxIUP@0OJ zIsMA)mIQ5^{IUI(8LNU&{N!q;6>W5Ty7T}T7or(Nemp_%^*w1%CF+Sr?h~7arDl|+ z6c6ItFd&xwWAzUUgUe|vre|W6%t^muB8p%geTkoiF)qQ7Yrl@2jUD(RkY?A%n zB|O(p<88|#949iGiA36y?7J@j@C4vWd|MN8W_i0{lS&2D6A==k%XJC<+#tCzdJB3N zW^DE-k$7)(^=925i%(jN4lS8Es`%g7d+WETqAp-`1W^$rB_st2>F!ceTDrTtyHvWR zrIoH>=pH(xyJG~T8JeM)dwk#T{TJ^2ez^1S@XVaE&pvyty?U>`7jlMxI*-TFu`u!- zwQP|DZ}lo);FsC;BtA+v<)y(Yg@&IYKmq2rbFb|cS8lx)zoovTo}@gg^z=#=BF}Dr zd=~Hev0ru5!H6jWadz~w7)EOwBMh-jTTPz|bc~3YA|&19VoSAQdqdKU{PXFf)AdA9 zgQu1N{n0OGwTW=bx6TqDzo5D4eG~PuTc;>2xcyRoep!PAA2X>T9!Uvt=t+EDL_J~{ z&^Nwbk&=uIo4GHb9YxhBEjoM}z=*(sES&L8 ze|JAhg6w+YqAu%x9Fmk<@$n}3iAw1oLwn=-jAlF;Zw<1vJd>1pirUb89vu45GRgKB zAdqR+TrXP(la4GzIQUo1yzdYK5woPeBE&s;hB5!4s(2`+ks~J}k#HB!&7(onX^A>m zcN{kXMt)T8Cc{)W?25_6KIuvIwCSq}I@O2+okN~%QVE%sdv4jjs0br8Bl&$O$=&#K zDKT91iYl6bcLQfkoQ);?uW)aIa{#v{-*C#ZymjV@Vt0%v2!JM0fhDsbj`_+PEOcRr z+`X_>byN|x#ecxVP0;B({Imgt5WQYPOd=zEQP2DW(jI)#0lD+J`<<8H)-n@81IO1@VN{fkqa~@D;1G^xxsh`zZ6#*L9w_CX6iF%mq+is~F z7~L#LRut_Vp3HrHzkvl}mvNB&6V~zUp(P+=b3w-56kSl^0@@E&WfobEu&?`u0b(({@ z`wB~wFfNBm5jDR~etb;%mGhyKl#W`duZWF@;k*O1P4HCPd2`~$ZMAY4f2?QQj!aFn zpWG4_<3Rc;noty_DuNPIexo^hJl^~YYe58c$VK}8o9yy)&=+DWy#6;sbLTNGHBoK# ztb4OZzrXh@qTjpSFh)mF<$aNqldVw65MFQpA}L8G!L-TWGZWp93Y>7daeW%3M#`KN zqq?Bm#!`GZ{vgKku~0o#$CzR?rmi;VLxppk z8r5kNi~dH0aFBA@Nxis2Hwx&7UpJMFcUUrmq6p&K;jBxhSb~U+5YgH`elQ-cje`IB z+$W2~?Ih2gzMuPNd?`XhVbo3;WrlY^Ap?u7#%E1me?em_QsAo4a)$fyNT=R|996L@T2l-3b5{NjiPP#K9de^;W{+zZ|LnN2|_j zudcG?+;`O>RY0Ilg29OzHt?jh-q_?;QisMS_9yqi_rf^eQ#iGiEif!3*0~T>A~fYX zLvz(I22EI68Bi-3Q%k$jS&no=fSS`86ZfY3j8ue5&-tG9zM9Eh24Jc;Jn}|5Kj*4O zoR))?67EgXBkIWVO=Sl-l+9l*CtU-^?+&XmK2QPTK=N~KBT@q2Q1{?}xd1a@REzYu zhrH397Xo)E2-cvC!4HzncB9drwDs9;-f*fotGd(fD3MZ(MtWPtB;*{TRZ^xHmI!%A zZ6Rwsf$u2DLF{nVnSuT6Wh3o-A%bm(h#j7lMXi=BktY@&f)Goc918)u`i0MJtKBE= z*H++QcvEC&Eb0@&-uJYQ8=X7z^-|~>==k3D7rg5?NGPtR|QI%?wl@PdySJPuGpl?qr zI^DWcyIbdX;3UpoLIIxCoF$5a^&Co>ziUwdi}BQ}6R>;js5C}}GdLzkijHTWqa^C@ zq(073`f|$m;SrEF5osMLVTCd2uS*iRDVKdOvb<09pQ13d*`SZBeui?E+ahi^vU1}3 zq4*Q!h0LnIt&{RD5%}K9RRcv{Fz!YSZNFn&gQtns?lWDUIS)P?yA6qEA0DoUceNT7 zsPnStY@}NcFFz-BaOsdCpnhPHv_!~Uk%<>af&@QkxK`ldRqBykn%sCX3oi}J1Q+Hj zZa*IBwIAG*55E_QtVL~VNygL zHSCb5p$=&K$$P@cQqFrK`S%dpS-S*_kMOBBj$Xx4PDMz!EL+mwDg{nlw4SekV{A1= z$2_|5yY`!*g>F{6qsy(}7N>IOP2eS^ov)mz+xZoJcDRMxm7xEeWI)+j)u^W3`Gtb> zgP#VQ*HY$@&S|7%z{{R0M#ChNv2phJqhh|@BX{mNU$8UaX-~XEy?pFU#H6M zCD`d&1U~^16{_B2bNk`D0mav+a!&dd>v`_L=mISpaKe;00&e|&PPKl{Bv;12X(Vx2 zKpdgv5MZrCWy5iCxrNXGFR>#5;y>tE<`7Io%G-J$;5 zG6$|+mE%yJ$?uk*2XGVU|JWb0i7k6pwQcf`zw{gL_-;Cc85*nvGp^&!e8yPTqU^-f zrsd<^zIja(fb#%2I!n(Fw5*(#lY@$tEGEihB{6Z)Bw^p@x3TycTb1jvdAToA;(g&i zi;ux)M(9~l5sa<*V*vWUFeIAanua=Ato)UK6gJV(sgRMJ`+46haGd|9n`^Pmo}848 zU6LE;yI56NAPo0bFSlgpM^Fi3>p>V@^ zNbNP2Tp`4BS;+s;yoZ2B%`Q?x0Q07YK4^Z@U{AkANI+B~Us;_&8H?Mue2vmtWb@=z zsGQ;6ewjNbrcP#loHk!Jv3`RPgP)=~aocG~z|E5t z0w3$PJ1|Y#>-YX4MjZI5*us&}-2kgY)(1|HEXs_(Jt(~t|G2`|Z+sS!(>kSf^DQU; z(kaJDta5`#m>x%kpUm}nm_LxE6scNL_i$1Wds1P{QNT3ddHf-|-j>nH!R_i061b&* zKoz$o!0LMby}^O|mwCvM=mF2ssyg8D%Ghrf>RSq9>ECHc`_SMN7@V{9MH3 z`17Y5v%E%6B0YY6-Vgz(Q-7QE<&7nKI)j}?mZ&J_%Qc^_JugL@7aB zd9V17hB{pp0K@*|F*tjx(itb81f)XMiSia$8Js<<7zN5`B@h!b`Lh`r)+YFSlBy z>&lM3(_sgD`6|#%ApgTS;TwMH#7M@h^(3|BARItVk^{%Z8 zofos3CCXvS#ST1&VvVe${doGH(N8t>0HHanRw4jtSNBEawDLeVf~;+`e9H!)AM&43 z0T1NApa0u-yIS@=IczWe}UvH!dA|HcDi%j9o06Ma-N;D#W{Png3) z*J3oCD?byzwS4z$@OuKniB>m3+IvwIaVUJZXscbt0HM9(!VHGJ#o;2R<6br(h8;fF zPG^w-{{G#hrcPhK9gW^F05jr>MLya7B2)Hwl~9Jv2D%4zu9(e1t>>Wp%TUl;>X)aw ztu7xoK8w(!S+%l(I9|!Wc*5$kr|PgB%4)D=@AVX55#q?L>=w+(^oL&`0s7MmyI4fs zHiZb9Gzg*K99Y8b2qBX@EB6!jP@zt3Lr5cJo^<0_E%_sIG3)I7mvg-C+Q0QV4-mI?YTGT$o}<+i;0zz zO_VFlfKxot&*SYM_atKN`CTKt8~}&7~s<2fSbn&5xU0N~yZpH-U; zU{MG+xo!>l9YfPhek>m00`&Z(hMA9>yY2DzAh5%zczV?f79b@hRlCaYWg(O{1SBc> z>+|kHwHa1;a0HDkBLjm9Q0p56Br2^1ZjZd7E-Np$b8^asAN@n%AJ^tMa-r?3yU5=M zm#N9g?*~BatWULpK3G^-3=9lJ|$)B@5IhJaWYeK_nGQc-~!YU+MW z0R(Os>g($@%RR15?->sf|AkMlWc>Q+TM}SE=CzCa z2M01DHjT^W<>gj||ArIJ&BOBw6BASH!WX(To+}dz*!e%Sot&KP><&ukTU%Omb#*QC zg+Oi~6y_ht;=d*m-pTZ9wu#dM!KNSTdV0%?wN^4BI%;aulam}w5C2%+#M*lIcfva} zBL8cDQT1+=h-ZKg=7rD9BlDk!KD@;tt_BRmOH(s$g%qGi;~&d#3XKQb zg3s^W@2_2AzJX#wfu+v+uCA_@mKJnYXMQps9-evd|A4)`x{CK3+Br{2OEcPe1m-Vm zVtSgZ0qAsfbrs(T#4bkF`Rzvjbze&(nd z`my3HB`X^n8-B8ON8kjZFAMXFi;J_fw6arA=ikdu<}03|{bYzRdsVa{~bG? zkNytyy#%b=hV6K^0<|f` zY@Q^UP{bGK<)HvA!~P-h{Zju9zBK@>qhq_L0RXJP$I?I^et!PG0|QnqSy^;OlP91L zT3Yi3vk>V-3t$X+5Xf-`;-xVb5Uo0oQ+?Q%v!i~7@-;CLPbU?k0s%&^^tsFkEx3!p zkWE(A!2v#l$_51Fs2DOcjrOwibH@R)2!p)^y#%P}*xkcJ5em#J7z}>(>XjDsKNOH9 zvWaI*}Ht*fg8Kru}DN7iJn zh{HuDa3BxfKP-%ebfpI3j;fXw&B22`jgAcLg$mw zfP^ZZ_R;t+i7&$|D=M-)f%ygGc})#oN|kYr1TaB;ot+;5F)`vqAqjvMBl~Zp;qRjW z0{r);#NjQ$fLreWyqyvdgMf_YGJ2pNb_L|Dlhd)r9ziGBKTeH)quD{ifb$|bHPw_r z5FlobBmlg@8hs<9`2PSO!aU4X0rUruHXGZ36V5+lp{s2I5XH9_d*usn0hR-eP!=oa zIyyOZFe(Dl?B_o;39A?x1+907mM<84c5D9Jie-e8NmHpY_ZhQg>$klK^PhN?O|5{70pc!!1@876b$Y z2AN9#bkg_K)YKn8_z^cB-U0-K1J}5@xe?5EJUqwjxj-PO0lTAV{Y`BD#>R$=vSJ(9 zAuzDL&$O908|6n2U?l;Dh-6A);(tK!8?vlb#4&b&wTl2eopJfkN-+-n_zIBC|NZ=5 zW6}U-+5bPJ|6<^6(P{1KlP`<(FU0HAFnjdJbN+L^^HsbF@%^(WO{y`>!?kDqRO6qg z{W>yJ8lMr%zV3?}in6vkKR@48aG9?a1DU;SS7kq~O1A4M$LCs6W4OCUf3*VXVV4IlI*YKd!KfE)Xj*~?+64*rq!GQk(+;j zy5+p}b@MwR1(X@+kMEBMP`Rq5oH_F;8i;scK*t6!45!y7*L**;di>YatF=hxQEZ$hZIBnfm{i^ToZr*Z)D&Tj@fA zUMJ*&DOhFe&C9m4ds#puJKh!1z~Q;NCN7MdGtL=*}J3!_`=sxV&5Pd zKV|bH#Jj5Nv3Tl{iTqHBtF+x;UNbOH+K2xyzSy~~#D|y_tf(XpSR0Q_v1#P4)j%s2 z4}Z}DbI-(i;|{CrG`@;X+8w=&puyLZUAqVc-NzdtSH7L}GdymRud_y&RnMTmZlAy= zi+*)vQ8rC%=G@{0mdRdj>D3U@*hcJrfIf66yDQ%&(w4SBjz{K7n?7p?uA7g44V!!? zc*WKz+)Ni5vGVm~9_D!D0&FTJ1${~9pta>&G5W4!PZbvNdj~5g5ZYeo|3_{)Qkm;8 z(6dmN={t(k@59jbSVs2}Kt|ItmPP zy3-;(iNhMi>bb3SrWVvxwOyAVpo($WMqv8%ya#XD5%$CDYfg!8(y4#Xj~jDfFu~gK zCw%|xB69hcn*RIiY(;by3jT}Vmrvojfv4gDrQ^rsSKm7PcF!A~nyna*iC>^88So39 zy-E4G1cg72i`=||&av;C<`6NT4yIoJ)rg*VG71{t3%XzFG^WG_Yd3jbHQW`Qd72gK zP7T|Rd0y5l1FO(0$Q8KWF?pah2R(8#NciAX(RI3}mp*7efo+fb7QOOje;OvL<*`3| zg>=4O`C4s-X4rI>`aETm-%J>g0ucdBT$sQ-TJd{R=M8Allg_MQ(EC-EWW&UC+Gc}Q|Aj2ZZLb`mVTFaN`KQ=J8j|10>jgWt@@(sS5%4T{}Hb6Qyr{n#7_@MwJ z1~lYkY)9QTkU(Hu{^^U!KQ(Rg>RhrbbZboh_Ryj+B`<2@Z}JCj0BJ7Xh6`1u2gsY= z^JTsjj(k=WQ17#7!_TgTCV~Wady0EnGr!9edJrh*Pl+xt(GKq3y<^g`yeu1;M5UT6 z7%1gIk&%4-+~jAS)w@IKX&GeUxBdH~3`Wkl=bYl+WP97z6|L4;$B1aRNbTsbx#jx^ zs4Mx;F5hlzlEqkc8vU(!hdCwkvu+w>!y-_ix$ePI|uH-jeK-9aF58aEU~=}TkNKVKYpj330I zA3oCye>^Mp3gT)&<@M{B=E^?JvZC;3oy?MyRBG&@yr8Eq*!Kvdzw$rpFns()oHO-B z43}KY>!bsD?bL(q6UUc{N3r-Yb8Dfe{*6(9>asN#IS4U)*mGLDhS*%-fZlpqqiO!p zrcN|(UZwcNTjq|^N-cq`C)W`ZUf@U}tQp;>T*)5i#Kc{M=4Dv9o6$+|=mx-6VTiM& zXl|5DOVt2-hoM2jVxuhUQ6XFcS{tzro?wfJh%wKmK(`{Vzl&{>qve!FHJm-2oHWDg z^T!YULM+8gS)Pg9fA zyPph)u!ATL-duwJI^2C@0@Hf#kG^4 z39Yu5Dt2TO*d2{%C3dx^Qpu+#Y%Ufsn>}VE=SbhpXth(`NL-deUjaDc8NfKq&NWDB zJ@7K+I zu^%{RkSUW{0Vqfk7c+<)ehx>v>y0&~L0!6*Y_Evu4lZO-I0lk!lo#PRQYM?IOlTKkRj{=GO zoy}=XvT@es9FaayxwV9@t0Niit5@FTah{HW-s?O^+X|7toV_0Y*k75-r8D%T|#Mz5kdyI~hcv*WSXZ=9c=p zf`(cr)o|tRd}@E1ibGQJw5T^Ps}Iu+ZMtCKa&BEqp7C8MoW~Y^yOn9R@D}vpaF^sI zg6>-3Rkt{S4Z78gPw~X4~DEx%G}c69cR8)R4^2xS*8tlqO5NyV!zN`cCIJ z2Y4W+9(1!OG85_Qw°Tn{?GejDT@e|LOK9sh1Zd&=)VMHkpWpi5uTY}bWJihbLQ z9cVCV=%7K7!Q7%ROwk(v-@jQOsqwS(| zsW3C*)1T0+nDjL*Aapv^L2i%iZomY0_8(jyACHNA7Hh$~dB1qNztdoeqw=1)Lv@Z# z7N14IyRZVe_o`HyM@BMtHPNNS{=UwS zil9jkd^EW#@wU@PJ@+;SGq)Wqr79=pE^QV~5hI(~IUXwITU zL!HaCpg)(J#pSbI_}eJEX16FNG;=D+ZF5F2C&FB|;mTK^7uE&S;7Pgg4J#64;&swE ziy{{o_OzrgcoXsa80%)WE72=c8M8ndC-)vNsgKCAzDfprsA@9WYVQJ%YXx{w#{D56V ziL=3eq}cpeRlwEHj*i*%M(Xqk?KqtPKSRGlk1&VsHXr~}Ni`qgPA9~Y7D3e_7@ZY< zWjJf?zQ?f0+{0)GGK-S?EY^0%K%Hpe1Dk{zb}VnbDRV4aXfkEOWntAenaQ*yHpWdD zKYkVY@v9aGrjX5~7oaX_U#HsLK>kUKlCC98Hg; zM5}>B*S_I+7#WZ#D?1Ar zoVsj*8bVB;J?gmr5O~lL;1W2E@n5$N8DC_Z=)}nmak~P_-Jm}Bvbd!f&)7z>%z)CU zVY{-e>F;nm3m0?JcgIhkxP%|?6=P`wo(HNe>TbUo4?C?DM zXok}e8V5u=sIJfA9J!CTiO~+l%M^lD*X{GM-}f_Ujqt zvu7F?C*+j1KawI!Y8&C5gI?Y1?6?mbq?1;KF(bF(0}RzTtsFFm-C-_f+3eN z)o5C`JSf_9G#;-=+h=s0v16xfISo3AHp_9Mxg&4iJ!jvotB_}YE5Ra;5UvlBz29{q zx~^_>o3Q1?7UMic`^X=o*lhl{Fei@UU7a}e+rBP}tBEgs%s>Jj`br+loA@BF;f2ue z%;RO3-)ib}S&yRTM+;fmk*msHfT94;VVJTDPaFx~=spb2@3WCvtI_$}DDLxkZHe8- zXKp0Y!48BoLJy`@&o(1|!%vQpQUbU)BEL2vGm%~Fxao-=a;w#ENYa&ji-osd{R<9P zrqmV05D>Z1h7TV(8;r7D49H<=!xLcGk=q3j;RoeR%~k3Xj=G2pi^Z53`_#>dl3&oG z(tJaowe2b_N{E3gzL2GSFH<*;*+lx&k8i1EQ;Q7IC_%=R{7c;Gt25@`l>C9*Uxa&3`?Zf;<0%tG^@Hy-QQz7aj@ z=>}@KGtH|n?bJxgJ$DSUMJI*kO}Dh3YmnqbtOP%n)ejS(@$8*HTCKYkEYl@%44?LEw2xPtfDq zpjgoHU&@YvjXnq^SZp}v^xD294!_PIur9N>+XdqtPSjWKr}ujOw` zqE`)fAclA2--#JMs{W|mg(26|V1Y+6q+0fB=p49aEF*d?4x_AL#MFYmh~V{|I|q?s zHZp8^6Kcj0y*8VzQ7#{%;I$^Z>Fj^mL+`@`eRZv-NI)MjYkbAG3@E5gBT@_ZYDe~6 z*vyD;FBENtXi6nwWS*{_=U&_G#p2|qOY_#|ho-oD% zz7tFyCWzSY$g*WUI4&bSEF-mNq2xbV9)bm4R)Lu~G4=h``uBy-=pDKKVk2+viVg4k zCyU&mfEz|W+whJ}qvI~Ou*WT0^KfXexv3yvJBqi6Z8fKlJ%%_ru1)=69*}7^F_=@= zB0zxVAh+Euue2`ypI)dH5~FnzJTDkwxJ4^hi+KMRJMG9Wp*t;gOr7lLGuD|_p*hHyb3rB7#WLgoo8Ou zUe$hFx(njh^5DeD8f7T8G;3QVR+dy6p9r@Im&qwBVY__p?+d0HGhS#3kUgl~`n8%`HR#ggBrs3kT50Y`BG;OSmu+{oQ{xYod_C-`_R|~Sbm-{j%6s~Ti&SP) zVrr5@7d;`?atR}!l7Q)lP(~KWB*p>a^?Q>=Zg$Mtzo`|;ZNI5U$4D{<;%@1kEr3Xz z!fG@8t5Bl|`w@dqYJ3{S{Y`G*%qon-M(7=eWo%+f>VR9mSL5XkRLtkpPXslavU#&~ z<}aoNVd5fj&~%xeqppX%MbC}V;}*RIkJYzdi;>kiJ|_Zkn~}RCq4@c7YT3=sZB{?? z-}>R=f(;rLe{w0k>zpd#jz4_7HuDPlwu46fGV)h&@s+@;mOlgq2($16tX&;EqcliS zki>>4+;(-v?XOLC=uznB6ex5s9(x9{*Ix!l8D$+d`^lObehZ5@(oQ}>VtHZuvNBQV z8&9&z&EcwOrv?SI6i;*9HYB=MgET)U_oyk40U9f0DuBgHw2_gc=QsKxJl9aAy<>C- zE3WN>-DiSIWsPmsdPCx-laI><4*R1Sp_$Zu_^k)eLQ3_Ad=uy>@!R5LpEN+Tx+Uz)a<3#iz^hUplllUkztrt z-gQt&v0==mfuAPtk+(R1o;0_JKCghmX_#LjpD5LSR6UiVA^8e>{6uvDI6>tVVr5HK zGFd0fSZPk6vQ52>%CL4nuB|mkuW;@R*rwV|d(8c6)O%U-hZ8W7^;5I+j~hlofpvdT z!`VFosQU6@2UC1R^VDBc^|2lezW55;N zQeIVjXo)s6`9dyrE1&kxDDWV(94QN!=^s8Mua(uUHjd=2>+p;Vw{Y&|A`A$PS>&gW z+ncce2+amxqH3`-PFP=(JGlP^E7Ru1@L#qtPnR$rda)>dnmL#J`$~@7Y^pq=?N=4C z^cOS`yW(ZBAD@UZ4Yga8sF#K6=;^Sfd?7PC+fvp?$r@(LTZ1iik`WzC4jSv^&4#Ea zRu`=j%E8d`z|WC^>bi!JgZ=NWc%{hMD}`ps32Ec3BH#1CMqEZlftQa9 z2=mepR%=$NSKHjw3NL}wie$Dw9xdS!5makDCkL8`9Cx3I4EA<*^Sr~#X-qlu9v|YLc z&z(?q+*J;{8SwE0AxpP^}BP-Nr%4EXjSU1 z@<-P|fOx`gB&OPR@7|Rs)}xdkN_qe663vo$GrJO&1#FPefUb$9D%DZ+R&33pltrU} z6sDWKGUpD*)NFjHb-k{>HDI6`?i9*uw;}@zRoeqfV9WEI+$qlhvz^UZk|wMhIx1mm zopT9!|hiPUQD}(<)xLRp0+f zhu~vCpI08aGK$xq3rUqaQLuHuQd6<` zSLeO<)W#s!u^r4fzbBnf|H-^;@byWf(|x0>{Y>W3g6}an^Jv@WBW;P8?|89&+}92Y zZ>d!JTU0L%_se?ZZX+@)SEp$wHQaI86*7n;18n_UZMiv$x~<_8^}f;dGS;@V9V?SM zNNF~Xb*Kkt$FBSUKMP+$q{fBOhB8H#y!Ud^v~`qmIv{{XGY^|Etk}T=;ZRsdz_mt! z7RcGG{P46*%g*RW#k)KQjEyl?v13?aqJ(}tft5hEgR+4Kq9ti{*wY+;@*7X-n?Cec zR=z1}Hle3OaxKoE1n)GHysYJ<#1#m$<$wgn*QuyEvYwIk@l65dEOHeO&VrYHA`(w% zJEuryw6?;2&Ydz3;Ne0x9DS>Hi=IbUisz@9X&3$3aHu=gXX}|*2p}dMM>JKmhhU=O zf)`TG*N~}q`dWlygNe+tHTmOrjYvkYz~q*cFWNNVc3KXtlU3NXu-~7Igl-;_1;TU1 zkeea=(Yl2;90R-xY)7K>9(7)e}KiQF7<}M`X;tN;v_u) z!7z@N`762iVkHJ`$ORBYjiTqlE^N~Wm_uJ_MSYfA3?TP#ugO$dJeBbeRzC3N_3+0p z^Kg$qZO?*=?UC67eqhVWT}P1J%}fz@Z08yCIb7&047FlFlb%g+8b5)J=HX)3J7+}tnu3ReK!9whEq-*<-Dqr@Xk zlJ5M9O}I@Ju(K11Af`6F(%jutgKK^kp@o{OIpt98kx3j#z{PUr094`iJIc|lym27z zbNcLCc75=>d0jb^!MQC*h66kPWk0C^RAMy1hz{UUBnVeJ_WLtOPaMXvzj*|#b6uiW zg=z3)At7mjC!0a{^@esd)WKs-zNh`D#dJDFUiB*tKI12XLl#oyX$0V$Yu{MiR=4TZ zV+x;uZxP_U_QM)K?q~m6abVK=MK$yKZ2^6f;Gp^K2(&}&S(u6Hr?*?r)*u7nR<7HrT*Q{!fky%` zxAO%_Sbe|7yN!n@a}EQJa%^ix8iufIhp^7PW1C{%(P;$n%V$3^hL*GsJ$>D8aj1HK z%8JYf1$L?&N6EgVWd9Y;7R4x{ujc)SCOWh6E8U#5lR#^q$I<}**Zei;ZHJ$dpx4wv zLV1)f7oH9tD$4flr3iiXu|OpKs?89P!x_lnxQ%96AzZVaPdLkfsv9cz%G!@N{L(1* zKELkFno-Q`j36NK&dZq+i@+QVYZ*p;NKGA@iC&@umu)?%i2dyd$kpS`crQuXqe#BgZ4Mnn9k?M`k!86!roVj#+i6dPS&#djYV-oR^|FT>v3}CXwtP=&qYa}V4W$YBeP38mFLHG{ zs{OhhRIWH*IBQ+F6V2*tuu+ zlyE6j3&E;~Ts5er#1a1_-eSL0f8Ks=CF9w-UbpiXp6l@labLoEpcQi(xmef*z+8sk zdiGiQ)p&8&p2iHOjsI|OK0Zx$;qtU{I*wpP`H)u6TTGYV6liLjOcQy2Cy6b`ZOF~e zOQ%2|^4a|KbWSbz$7gHLqxTh*Ij>nmcHcM8`@NC`tN;bFOOsM)?aH^*vECXCK! zVzTc}A1j^>VapZniy- zI?pOQD20ua3CwKRZnFOCzQVGBjd_@q%UxXG{Tq(y)NX06KQhiqLhCS?Ujea%n%x8Zt^9JRiP6371U`F6NR@9Xp@*cc^?am5c= zstNfF*qes7byC#a2CiuUO8s$EDJ#-IsLed4)_iRfHM<4o=lxo(tiSvHsDB%^f*oq< z9q$a)#1mgwarF_YcYWgiMx!sa8&yMMOqo#pf`TMy?eOF3v}p)VO+`Uax{lFwROv>a z&g`77l{;TPjqK@Q!n6D}8$00%?C2M#1d&AIKZYw5bETqe1)JUgsn}iK7q?691)7M4 zE>2AXG!LcBWnzmL=+l>PW?9TE)=ER|ViRd>_Q4XD&%ij{ng{xip3>*}{aK#lo#-Ml zD$imyGaiE^xHKtDXg|8M_owDV&9{z*`87@3WEu@+R|OsMa&f2`seR7`ru}siwGf^o z)Byp$uZYFY{9(7j0zS_(lp!HFQWiI2$Jz&eWJKBQ6-WX2niObvI!ID=c@`4P@*ZW#~c- zZvJS){3WphLkYHgWb8<=a+jEXd6}!}Aq42F_4X&b)My2GX8U5(5)x@R zY!IEjbtTfda6Y=pM$?}-c^Ag9^UKd9s^ZL(_3Yx-KFX3$veYOtu^=e$U``c54w*zie8TVRCpR`wRl_SD%*Ty_u2v=j z-+AZ;Z{*RD=}Sxx}31dj!f9raU?aj`z3?hzT(9)c2)PkAoRcu)8xj z*b#d=rK_kz^-oDM%(H^-svL2BsY0gTiB$`a+h1|F(1J>)A9G)hZfR15NWXg%;|t@F zG||-XkhL31!k`K{u`;BResD6(!ke#6kPBT^&0~Fp|30w}#_6`Ws<!flwmyNYUtdW%sG<&Q?wmoc(uChT_B+Xh3=k_Jt3>my3U4Ty zvez7&}0Tg%Sl()p7F%#4FT@? z!LVb8|Gr26L_Yp%hb}@T6Ix(t!0{jm3--<2Dt2Jfs~H}9$OJd|8fmeK9uFZOt|Lp& zUfW5dbS`%8C5SDk`hM)N4hnVE!8HPknhV9=1P7A3+9?vIu@RpYn~5Dl%Ib33!e%ha zG5U)oZy8NO!>x0hX<YBZ7*FEHdKQtSaZ_yke9yMBgIzaZi5a*UZ#;@K#)MnF&6|2Pkk_yjPX7ysk$4I1pk}_oPBIC4UUkq^;XpVk zuj;!?<0W|;FW<7Yc;4ZCwzE-@Zx?YzM(npoId&>#EFO_HN=y4Zvm$Fjw^eILxv8b2 ztAt2Arnw+~fR-)DDlNaOy9pZB8xJjrXO(P4Bn9xWXiw3U>HR=z%qP!i)iaa1Yp-7N z#O*ptQ%NGLSN&c^vJKfIrKrA|0fIixTqoyhOAHx^?5NWPe{|vpbfYCoMXQtd&zpSc zY3bvE1tmI_Fh%344F(snpSyhf&OG*Nz-BI^-4K(Vg7^zFZAn+tD8u4&0s(hFeHi4? z7hYuHa0@H~GBMO^U2(%U;dg;9e!A)$^Y*2SHGVw=(-0zYnqE3X-mQ#y!V$X;C6vxL ze?FwcKh>K#=S^OjrOZC8v5hL8+BKupnz;q8YV_dWv-H)EDL1C_)IS>kgomaIb&Lg` zFFgsy>j}Y$#J%;SySjcTpeXXy`dF{_0@rckA{v`(m%IJ$+)zp6jGG9YYguWJWyXQxS>{9Rq`Rhy)lF2(rvoT4jBnadjITSIVGr}JK| z%gA`6OOdTv+&<1ajFN$kgDe8-%>aj6imq*G9R}5gpNw>GC`mqM!s)L>8jZ9W zh$@i=AV6B|DB4bO8Pk_kOIqMQ z`)Ug4l~4t&WG3eUC6`A7&CvA|%eC?gswhP?49&oG#I<9CJc(=)aT+%uD}Oym7hWC~ z&+i53Es-}+@-g2YdpUV1JgJapYtn^Gqf@Oo&bP3LwXCv`V|;Ia@Gjx=Tqy9|BLii9 zM5O9^y{70;X*>Gf3?^iRRQpU}&o`r#rJASPXPzDCHr5Y%Gq7UYu@+B?eWDG*V*B&`_Diwz#QL11;m^u;SUt z6e0SC77tYCxkTh+U|XpV&p`VsS|)5_t{2qZ2dP(JHtVv-TUkJb=v<#^4pdjykz~_x zurPXfi|?O=OuT@Kc`tSR+HECjHSu(-cuCLq_P9 zhps&RmfXp)sd{sOb21H=Hjtzfq;(Q(yFBX|Pw*?>OdwYZ3fehT&`sKHSsHYU%h9e_ zXk_=rD#JPUchxT>^z=@B)D3ix%atLsc43Np@j`ro9tz<0`$4 z7~D}H=WtfAclTFN&(h2%5ch6#EMC^pPE7Oh9?xJI_JYHxndmzlaux*yj;yVuY-R~zst)(@8gPmZ+3sxng zCVGuNHw^BB>vbKMH_`8&$9pu9>2dOAb>o752D1o!z8vR4!=KJ0bM#qXiz?!6JvgwB z*NVfM)>ssVRIu3F);?IwrOgv$O*5(DnOb;y$O~3cmkSCi2-V0m;dF1D1U664ls!8A z24`PGvbmo3iMW~^2cnxy{%R@t48{>x37OrhZ{14N-ATP~@d{!XeP8M%Tc7aO!lROC zp0FfPE$x4~02RM0bGVv!LS{qk9IN7xf>#p7`8lGyEKAVk;>7>z_ zWx5(UMveaudtVt><=VXafC`9`5()x>w3O1VDBazuba#hJrywES(%mddy1QW!(%oI> zX7Bg?dOrWp`Tf_Yy>$uCbH~gz*IYAW+J>d+&t@oYtm(7Uf;@4%`KRPN6;;Ps=%}BO z4<>QUgxpH!oJQ$FCcQp)`V#?U2 zH>O2c&xXx19`Uha4`OYtaCs?a+FA`W)%6Cve>W&_ba_|xu60bnf8ceYwoYAL8SDWI z*?2Z##B*ZP(Khc5Z_GflO-v zT)qUMH|AfxD`{Igk|(5;{Fl~e;qqKCZWG<|VK8|5S-U(EG9f7PO|A z{42iypY`MH65$BCIApS$+foozo1#+0*(X0ZRS!X|Vn6b@VNY@m1}6l)qwPUy!~2k@ zwU_<70!v){O#}=yEfkse>$>j3P*v10+fe)O|Hxqv%VQ67gAxZXB^^{!s|4j?eIHGo ziBI+p!VshxOvWN5Sxxp_5gjrjf>F{^*_8^vvjcxsu~m+xLb^EgvCy@+tRJ0)7B<;% zrekyH|M;VeD;JEh$vT|(%H9Egl!C63JNcCiVZ1PG^M|#VrMQ`sq2nVC*-vMq{kz`+ zKiNsIJbP$TwvqB#S#%HUS^J6P0t3qZzj8HnTznXj#^jEHDS#5Ae#=n5+}Lv{d>rDk zan^Fe#Rsa;=qtX+Px*--c{&PC>pvSiQN(~!3>>n~;DW-@=5PB5=5PLNU2T+We1{}~ zJGW9u>Z)`L5=9ADlxd{T`wi|6wEnK!G-0N!_rzfUqcKv|EO_w|R6hEZNBlC0mbA4p zKQ7-*+|UvE{y@D)A)O_@@C(VrHOSgKIHdnQ?c!(%ibn?@b(Y!`XM1RC0T!cpHo5^O zW?;t+r93jB+ih!%oKDap^`82xRZ%~?7{Lvb_i_P8O#sC@d$N{);O_x({pzH9HQSPm z=9Vsp>bGAXInG1 zVOcWCE6x_>{G#It3s6>I3X7Tdu*H8Pz*tt#_I?BzY1K^C@WR@6k1y4EwDgDChh4bu z3-bD=95dM59rb0F#(U!=K$V*0tET3u{*~w$3)(yrCV0z|Vzl{hP)L>{TAKfowsf}# ztznotw>WFBP%qICdM^)_gd$$z6bZMe_heUb<_-8|EP>DyL)fg`R>Nz13+dM+*f5L< zgO|BG=L`r?t+xxzaM3qH&2+y2Jxg7yrcXg}%ghdxFP^TA5z*zx5cc9l;_9~~b=SQ! z%{oSv;Y6fM7@H+_p7>y^bCUPoAv9YItBj5e#dVJNHg$ySwqEO#|OX#DdXp48Cj?l;-JWj!hNV*}8^K;mO?4V%{%= zz%m8%!z9y~^5N8UD< zin@+T-KF9y*vM5&`#Z+_f6-w!scxU0eE=TY26d}S9+YNU1^3Wf^2*3-*&ezQ;>8!hs(SGr$BZ_I{GR5?WxtC<0p{Uo z3;xiY?>z~!ST`1u-zq^jM?le+Zn6^U?resL2%!-i7$@Zz(wn~6C* ztq$6UD`25QYRVE~ac?W*?`T5EDcbzng*LfsW4zQhxL^<7uc0s-A)kh#m~}BvU59-p zJ88N6Wbc#(Oj=WMdG_7)Nlv|t(76mPR{zSSbwR( z_GY=0eh$>5j--->whA|gy@5hdL0-6JK$xYe$-OBWIIC92*6r- z^+QAf|3;Wzc;Wg}TPNM6+ZYizf*ZwUuJu}B9j|+A_Mbn4YPh1L=@`j992txKg z_?=)H@&9L~61+Q>tT|pfz~C!37sO8WT7t4_@5plts006=xCoBq#4 zTSC&Q2qtHV5Xzen6cozLI3{Ls+Mj&;+2w4Ph>&orr;H2c*+lc#5g&q5GTj{O;%oN$ z`phAYmTI^K__1<8tsRKVPp9R!ETUzvpE9!0r!kmIeCj`sL*KwuyNhtXiUu{>zL z0+BSHM`tH{{TK9wVv&m02R}hxUS3nvoGl)7L@_ln=`|>8(>stP4F}U0$P=Xu znVyrqex06{1{yh}rKf+^)6@I>dFk(8@P{7-1h}q12Ue+Y(9I<;ucxca`St?8(rivc zUViDs1=d}UTC`uQ!4T9Yr=(PAI?*4j`Qog%#&EXUS|~kyfYMIzpH&vV2t1rNtIW^O z=XE{3?_|NwUR75&YsLopxJ;R`WsPhcIJun&BQomX2p-^egO_^zZsyTxd>ENB$-_U+r9i#Q0%>H!b4 z9a=T#VmdXPIqqVrEbT^zCw?itVOe+3z7%#RnKk0$1LmtKdzYczvmzYgpkauza+UQ` zds`6x-fYbg=s;vpHr4oRbi=a%gXbIEVjkwWH&^fa@#9C=lTB8m!4z@E`s2SrjJp#> zB%e#6_dZ~tEey`>xT6MhC>T?lFH{X97j3sn*UG9=p=Nm_^J=egzS3M>QZmHI-EJlR`J`3R?`gu7ncfY%LbZy`tYi-Y9;f}$9QnPPwWO~P zkWDJ4l}?bMLE>2pM@h-PuMc7wV)Ee9zp1enNv*9HSGyhfqh@yIsw|VczKBUlS)Bbu zFc*`%Xif%ZGizYSVQqQY?Vt@m+4I&}S9g&nxGI92hLVz!m9;{<(Zi+wcE++1En(%Y z&2s0#QV00*^2$n7baX9zcbr&T769saVFgz~#oY896}CWYM~CO>h2c*s>CoWdZLbjoa~~`~oh>|7R#m;&^SpBf zEns3}V@v6(Hn~2@;)q57>);NzpXmGb_VYs1S6-Ln$qLhnZ;zfJKF9~H!usRci*j>m z`T0GsPIr#h2IlLW%UTwVE^5d{OJ{a^qUmQU&1WvwlJ7cShXoUHM|TlHg8|^?_gU=y zvgLdk8p;_?hLhE!s;Swhf@jC+_6ArBLrT?X(AA6oV)^IUoNG~W@jgzd4hum?2%+Oz zqNA4mm|}Q%_$^EBkcwE*1Qo^oNAefbVv_6b6gacodv#@cZGqpueN##-2W^_b`+#$m z4DR7l7(bt0t3PNWBfriAEks^46IJ!lSE-Ah;LR->h5Zr@$BpR`^zvcw`{#nj;xTIR zSkBcQA0Nxd55`199L6+Wuf&-aih`}&S;i_*;&wS+_q^HC2Jh&4u@a+PsIg&Fqh^ok z*HU6Mlm=|zoK*{27~iFlot@nqZP5Fvyke&HL%o(I3M-4No*+usk^^_5R0L&{pME@G zJzogQMiOy5%vyI4l^G6bl^IB;Z$t^Di%LrFj2Eb<3;PEK#xWcA`=SxRl3T zHhvZt7t_f9?ggs7vH?Cq9w)2xv8m6WKMRKt=(7+I@(Ng3>;^G5aOihO4)EX28k8lf zu|rTUnW&tK$}g!bcJJo|7Xx5MoxoF4qkyt_X=s3fR0)BUt9FSFH|W>YeBt1 zgr);B3;WfyEi2T_mEtR8*?_g^3!i;$QI%E3{UrO*>tZh`kc?X+ZV+?m_Q?wP{&;%` z;oa?7W06*U?V@~OT5DSy+@^;fG|)R+`18H2tc=9-`T#UfOECvuJZmSk1lOc8F8ByJQ@T@lcxJUc=RHG`;$_+Ei*_VEQ#3 z;r8I?@*WR<1g?gc>oK$rSyas^Sa4l92#D+``#)JX0iZTjWoP$wTR+;1QxcDN`YQxk ziG+^u;9}jIr}eeswL+Uw5TuaV(BN@@a)+UxbDwG+Sigj8)|E(=e4x7Zkrxp9B+&m zHhVv=f;-HdOlaTrbMLtwc2OatzeM2@u(m#!zdfybfQ;Uo$X(@mce@i=fdEYtcHs=F zJyhYybIvm*+NzwvzgeF0XmZY$spbVkMMCKc)r#5NtmZp|Iy!peUUFJ{XDn%>LfMf$ zD=uKy=G@QVz8g`N6n_kp-A@DG6#54RJrhu&i&oZh)*tyT`5`{hb+-nzLR1qI6GOJ+ zASYi2SIdFprR`cjni()`E}J=7b6|kx=;$cG0sJ=`(%=H#KeTeb%A!pTVpXL61vnx7 z!2j>npCO?Uj3T%rLD0ILM)cA)@ZVy&8n7~=9?z279}H2-uCo>wlhfsan58lr6?hZT zaQm6lsD?|`Nq>Zc7;Q}V4QJnmuFLaZ{X5*yD;aRW!Ii!`=paGv?>u@-5CX1UPYVYB zY?Y;Uh|p_q8Jv}$(tOU~_ad@KlN+xOrjoer{{aw%D}M$H3+oAchh6<%7R%;AQ&;1~BqBR~%p?BO_orrem~RHcERKj_Th7 zNX+~k0k0oSOWNt~EM>UtswZu!;TA4Y(NATmT4VesrX9j^3zAATb!3ykJL7XOWLe*))M+!1gAw4GO?E-x>e z=zm5;+#ZB^K7H{nW9gFK8xsuA5l|cKmlhe5* zJA5=xxd;MH-0xW|v!R349l-Bg_s?$^NET1On}FDHxl?&zTBqu) z1xsHHxish$KoKm#i=0LkGgZDOBMUBJrfSo0(OO=XC9TJ1)lJNC*x-a7Nv4inb%MBmx2g z?y<$6@5qij(<`310M_JWC5cH&0#l#w*>eQUa=c}OGdO5`x93YKu@RuX8L(?>wgbG5 zz&ow~+DC`XKgmX>jG3_#NKO#%(mobcQnM#|n2n}wXSFKlP1QJhx+JugOTSxi1#cDH1J~c>s|V1uh^p$;cMQI2 zfM!#U#bhH*!QKZ@B^hy$SpE6-=#6sWQ!@~&0B6*&=u3!bTZlfME*wUc>}CV@4s^k5 zz!QxCD>Lu1RRFwPXJah6DDcdlcUSX%=tP(MEf^Ey<4AmpAaI!c9M;y}t_3!F)DGE; zZP5XyuZrGVoc1}*4}*mG#fukpIb_#klemIIA_QOxyQmzFU<7$8ifF_)HIUYn@y4WL z5&L`2Kp+~uvShhIMNGbq^HrE*F7~tG!Jb})s^jjYafwRg>hBZ?5Dq@fA%Cr0P$m0! zkhhs`f+yR&A-edv%`-O$zy8|b{V^0|CbSl(t=mXOvl6Wq_lA&N= z?D*mw_|7ro09%U*Mgshfy5MQ;B+zv9; z0~mMTu@5+RozE&Nlj&i6(?!~i4tob(>vpv>7BF*gQV7}1_Ss!{lGx|njuLG9MWy&s zH`A2z>X#$Lv9Yl&8gEXwx3`eI?7ZW6dv8YDAzZ|m|I!nM-)IIJ*N=DUpsN>&fVUs9OJnZ+Q^v6 zE%eN|O}watPigs;X^!N*55&|Gv>qQ-ESOceK0CvZxZ3#|wD-3Ds(}9WjA@Cz0wc80 zt1K^nG|_l#55S>C6?ZW&AK$GHzLwMZqTgpd0@XJTz&B`nT<9;Hxh6_EPG~v;^qUTM zoqY!au6qar`o-#ec5%4`W@paoGjM+%*XQ@fbh_O5!!x8OPoAvx#vXy2&CL4{n*MVj zN)%{wY^~#h`<&_#uZ0ucJYn^nIginjuP2g4K6M~ty~*mr2NF!-tQUxyFA?x+Y1?){ zHMc*EEyUbo;yOQTJC9=4Gz>mWJ-;%HDquoL-JqRPgU~*59=ynBFD0?j5Zp z-!8BzI>?2A_gg%00*3!=BP$uHZ)0%l1U&R{{n=dJ#1`Q$@CEn2AtEB8DH;SZ_dXKo zdn%k8uJ@Btvi6{z@Ilc>fY<=UR9BtqqyojU;IJmKTh3+6rhl6*D=j5<-7Wz^y2IXE zD8W50z>5G$^y^ny=Eb3$6*2mk!}i@B$fJM{(F{!M#EUl__|OA8>S3&Jbi3T!N^6MK|InH;kO)X7-8`wQ%CG2DCQOCI9^^*tR!Ds?f(|WfbWa^`FUhAVG*?x z+P_N#*->yiY&)G!8SXf^>Ht}_=k*dvJb^2Pcd-f`xGLc-*3Ig>>qF`H5Cu0HabvFj z3dCqvAcSdZw*=P;AV|rbcfg}gXnXP+?WU$t2jS7XThnfN!M~S!^wHOE|qq}pth1n z`EE*XZBd}8V@8*vP%7DSQJ`wfVy?32I7-^K(Aj8ybRO^Krv9?P6&__k>KKcU2qmWF z=Wj3ik)Y?Q5@TcAfN<^JsfFYldGvx11_VeiCb3_icV5dMa-oNjJv3kA19h^E}<=Y3pG{f>@dtt?DjTBgRDL0}#;LUUM^Ly{o)2KhU2gkCSMx**^UmWkkuPSFOo|u8-3a};!Xf@?w;KbRk z_JZ&T2@PJVLI+&Eo0OE)zZ-*wP1fc30M74O9J{&wHB4PGD7WGRE=8f0lI#XPM?xk} zo4US(1;5PIwrBV6c}@47mgpG%3Uh$Art8yQ?>;voYa#m`iaYIa_k6#Pp*%)WfkBed z>HOqoWVbu^#;VOwe4F#4G-S#LvWleZ3BqT*UHFditsw=2fMva6LQ7mqN+~WnJ|1SZ z*xXcKuC@b$sVQ*L4Ngr047l9Dgfr0V``$S__0G=DK6--3QWm3Cbk}F;VGAORM{Uk9 zhn-7s>15T_U2E?MAxHovl^VhFNYc`-xz_t{tEkUyR-9M`fki$`NlI!_{i4WB%IC|n z$_1atUl~LuriegFS%5l_n|q+rA%3evJ7I>oUOy^u_&{)KWsqj=)BM#|Z9>hioNY&f zoGeb&$OesVEq-BvRs=C06YF)|(AyY^(4==t`1pNv_K;!C@bECO->GS7WW}-(8KAN6 zUgKRu>=rTrDDU3&u0EUV1tenWzgTl*8*s7C&dwhup1J~ZVx;mX!3H3R=3EXW=vb{kB^idtpK&pVp@dPLi#rO-3-l8i z{Nj)!#7%PAii(;quozHNk#qzgJ30|B@6DF~>o)_(i_O_3A73-P#J4@j*tbP8eHy}8 z_6Ra07L*+x8EHKK8zj`2j_e~$&;NU7hi|8lRVsSrH1C&3H*X9%4LA1{pbb0$ZPwD< zJYDx0vig1K#DiwxO&!v|^bDcwT8eW3by_f5KSbymn4g%LbDke7f6mTb(1`W^5qNHE zoG{_ST-zP~ZIzm?N~3z}9GeMsTvei={TJm}?3%yD#V`dvX>;)DU0e06x+hi-=37cc zPv{kBH5NF07P^SnCiFcKuXb@66bZDfXHREJi2-S;uER6rQ+F@sU zgpuYE5GR>=EQPSQhY}Iu;*L$ZBX}_jKcT`#GN0|WCK#LU`rh|4D@w5r8Y68IfB{C@ z#F2!?!F<~E!lou6YOjFJ6;7PmjQUMY^1L9%6k9LsHhZYGKhEsZ>8rhPsLR}nKB+g| z4669{eB?Nt=!AVxNE{d2Zte!w8v2l9Sd73gO_YURSrwJ@)p*NVjl!m1eB|UAv9zmS z0W~heN}VW`HBq&4l|k1dl~qs?mh#ov1vr3(nsw&q&y^l>yf(K)qR0 zj39-JfHxgvW~*|0VSMA+cowbHRa(VND^?L%C_Uhx_Zzt(-S2dV$a6*Tg!>)E$qgY` z2>pthd^STZ>y-(9p{FE24u?t78R7<~ZVD9`CWofcpEGa1g6eg(Um=@jR z;ZE$w;5*luDAc@#vl8?H%8RjfJ*|>p0Cckl;h{D-FimnA&nP9TkNUZ1ik~V83bp|X zSW`h^*)kv~D4y96bQSCtJv(vY(FVLR@Fv@qZ{z#!qyBu=GJwdYbNwKz%5W(Oe<^wS zGIaHc%xAWF28XQnl3oZ>0heC-k55-b;pP|O`}b0qIsfqCx;PL z4f_h?Ij34a$|#F=st$&(CIyLbe8`A7Dk|z8jr18DRf$B{wc#rB0EP)*VJi52BW(aI zpVUDjVq%x@Jr8#C>2kL1Wx!>DnEm8mgb4^ub0^fGwo=oHLSR4J@6@&(uA06+0RO%E zQ)`Yo5MWUoK;(^&j-C^;gH(vgSS}zJOVGF+9?M*NYhRqM$GgFx+o5zF^X60%?Ys%AZ89-o3MF4}S4=f)EUrfY;j7zgPx4 z16VIRKqVou0p1;8$KuM$%AG4z$gtj*`TY8NDc8+fPKV+=1^)fiWP4M~ zWx{0;!YI(U?Fi)!QBdXHvP+;RvdvjpyvApXkebO0 z2@DLB=DQ$gN)IRB$jvJx;C3*35?1VS;}X<{J^2n$Y#>gr&}ZcC200ahkJ8nR5lKma z-cv8N6cOp5~J*+IN~ZY280PY2MLoR%(mZwyzBfg_01nUc3}^ zB6L@xI4&8ALu%=OQr^hnQ1J4)gW(}x@sZ##$Ht{lZac|3S>ywkdJt>K>jVjO{QjI7+m$+~mj#Xl(BNauuW|733=9pCD*;C1rhc#~KrR}`=kBtgAJDNh zRjm8*iDOt`U@d@pAo+L=Li&8Q3R;jF4B-a5{IWo4#%e?TE>lwe=<3_;Q`+ubOUv?- zA%1nIz$QhM_^I%xPc##Ai+YE~j9n?6#;)0n2Ym;UGR-T!6poLrvC{oeQisKk12N;y zsp(%ALkU=5la=ySu$&Yz@$eh~Ni8faT(ys)UTJ2{mH3q&j2{8HVe_e;P*&sNjLy!^ zrs%$S_9`p9RB}-elmgnxPA9$Vi&~wNwK|Z{^?!1?Px&J0^Yv*=vD9Xy7?~|A3|==x zZ%;5PiMR4)2J}&?|ZS<*+u(9lN{wX>%$X#cidGKaX>oDat7Rfxe}bXT%c0 z@K)(r?(i^)hfQ0z4kjpzeqSh7Ps~<{c->y(Y7$Ex%Y)2C=?qNm>6B!h~@wO%vV_p*(4^ zAIJ2xXb&J01Ge}WI#ulF{Kgg2_XLKnt}Z=~0N~*p+^-PTfgKbIeL0ocSV~1jb+$1= zwO^D8@L)T6HizZLBPBrAAKHh$Rl%B0- zVXFUKv$B-FkNw#lR-!vv*FAC^dic<$EXe z{)C5k09fS*YZamqEY^Qp!BUi8ziMl1qx{)*AIpF-DWamH=2JuHSr?wCyWD)av^ON@ zoK+IZqVb~Aue|J92Q$TE()?ecq68MIcxcOh$lof|vwTxn`esre%NP+c(CgJJT2vG< zS%DvMLWnsddp9?4x#ng!y1u+)cAI0=F6)W~oMxAAY|Q}gfbH|&>QxrQZ=U6iT>_$n zJMqt)l5E~sx=;v^Iqc$nz;xK2B&ClA!$RJ%#rJL4jfd&pU_lY|sW#z?a(7FRWnSiW z2Br(15!K0rt*A7q`2kP(n%C1z*_vYL)k74W5Atc=eeVKfpPz{iZ%~G%(CYuV!R0ij znLrC@_GE}O#5HbTO#+SaKZ9vC?%)=p`?bK+WT<`7iD=Pa55Z)d1CZ4;7SEDOELSt1 zG?spK{h=WPaxYWfFR$xFpuO$Y*lL+c?(c)L7GM;TX8f37*JenU!HJiD4PDwG9+tU?27FB+_9uO3R zn#`I}*Pd0kD?%-PaJ2ot&L{cW%yiwb_E7$60~PZ%X4ALdZ5dRy1d6r;0^b62J(Q`h zG>A8?HPZOpSM6m_7=5vuvnbzkN!m(3gi=Zz_U7nOPIfUtp1>PzMe2LYB8SIybvXqM zO^#qtiV2ZWBUll!#)>I3K*y7YfMbiV`hFjog}?b9WyC26(v zZsxXu6Q5TorNhdeiDT)5QQJ64JV(fyey@Wt^)y*DLqGE9J*~|SESAB|f_ZS5N|-g3 z`2OLw*PQv8t?DiKSTQ4>I>@sP!kjTNH9gy#XEcBN{3*x}pcwxEVKxqwd*ix09JZf&>Y+XV3(rk z-N2ZMJA!9YhsjjbMEnb{5PqWao_)-?eTI&p_aVWp_np&DX@-F_1r$cib5ypdu zZ(>?g-A9SkeJuq-$gpK&ze9LXYaP%RC@Cq4@qei@n|jB|Sx!XTpTzs-YA`uIo{&9x zOp@}a*~fMekxrRaE(k9;H^^s6(T-`0-mt~*fQ=%>{f-P(mpea3=xP?-{Uoq4VUaZR z=#ukik+36I>YaQiqPd5X6GAKI!{QXPKTYG9tOQ!oz|Z#@!bRmNCQH()b(+Wqc#eBmngaYN;+0CJ_AW%-Zl zsSt!|zU|{rK_9oD<9oLImOs$yVj)WJ8izoo21w;q5;p#8i9!R>mKpCvkX+`x;6nEOi>C zG)VBsA%%kDi7pxru{YOY=_XN$@2s858Xw3AoIfOri5u-b0&Da#zR%%sS#%@I+(%#t zc&;Bv0G5=Z?$Sne8?pEr2Fkw2Ya;U=9UBvkDR}gnlT)=4OIK913y6qXm_S)Yb&GXE zM*)sl7s*>1{J-qp%dsnKo`fF;5ZoU%))~-U#`#`hZi5OK2!YPXM#Gl|^|n7D7l9W? zbLL|23nP!_<+O0WTG^e&?=Iyd<31A3zu3pYYPi)T(0iP+DKn4=9LCF(i%m=<8h+&f zt4~Xt+d-~SBVt#_#1>GXjnXOtdCOmYt1`+uC3G`sf=`UaB_$<+G{)&S3WTYRgZik$ z`h@)fmZs?Qzsde#Px(|^yX)1&E+e-w2l^Y3sQBbiZWvE4KTp2$u<|m(d-U~@zoUkQ zi>>sBFHhBO<_oiU){0_Yjnds*Umu>V&U>8kC!{LJcz@viG~CP0P7^GekAwh56PP=| zG^1}~A|r7&|I+-c-!cy8S;!Ek=QVQt z^}dDzg*k=|Ze)=~DZ$S0Y13=@KwK5fEnp%kI}G9y`nVs6MY+Rhi%^QMyRCm`SS(3x zb(KDecevW?qFk4dZyy}&F7qad*VDN+{DcU7;w_t^>(OH-2uW>EGGmLUi%VCa&E(!~ z;|g8+qPPRJcx`%*?Gt)?C8lsg>0CgiLxU`tDCu=NjlW({!=;mEJ1&zsQ!A&q6cx&l zOgnzc+kYNJ|M??|iQp$nIldFpFM8sxDQ^POoVSQ)7MEH{qdltoRf%*=vzBFV?3L|a z^;M$;$(cxeQ9uD+%`7iBHzKn+R^s<14dGWHx{L3lyip-BM4o!)c zD;jb9$5&Og+L?mM=zVC<4LG@>_thZVFH-f2+?$+|5-AFmRJUyECAwd^&zf_z{-e|! z3uY(!R>JEIH~rt|8}qq}Z+rw6Z#6j+`@v)~pvxTQ;7SZ#bIu#vw8#PT3U93-2!)Z~ z(qT9&Lzcd12Z})fMypGsLln19$)r#vxn%bXDI?Y-> zT^S4p*}b(Nk#E0?#keV5Efwh|nC(9gRs0f1Ju&MX3_&44Qn_R|4tpj8Sd`1Hq8@@9 znA1U8ezZKu>)$o1eroG{ZF9GBJ~AjQ>4jmQ0ymnTlbmH^rw6vVzOg_wXTskI97| z=yH{vA}@He9rm!u*gn!S^jO!ueR~Kd1fwwKjnTsO5-<;ecE=55F-Xz=)?97?!5v8Z zV+`PY=U%#xz=1ANCsZ*<0jS>|vwDGEqY0e0Ak7HUQg4IW{#tQFGio=0@s&T2NWDA% zS`3ff%iCh8u`dvHjU!U7hCCI-@th)jqo4a8Y%iRc-eEBeNPL`9r+*(T04ydkg#Cw4;@it31UgYt16TlRs+k?s8~c4bDc-54D0MfJ1;hVgwKo?P2YuX4$TMh>%9yCo*A0uH7ss6 zlxG^!wZ7G$tCe`DcYCMaic1eS#F}awx_M`#~$}!{S%izak$h6_rek3hhQJC}3=5Zo}I=8He=pJl5p@ zn54J%tbAHwzcM|&PGE8IO2(>Q_70w*Qp%r~T2|DE!~E#~uBG!_I^-eb|A;n9?6k{c zFy#Y4L1;8Z1$A}T_o=TO`K(!bAZDxEDugvh8B%?up{J&HIvGHpd1Z>qG z4PvIJBftu252(>a18JrQxHlk>do3KgJ(3kRVZj5E|C}~AmnZz7#q0hE9|){KE+fOf z12CyS{2oAFBpzZi&gPDSk#St*-YMBwH$(r`0^qj3xPQ;*iN0f|qOz*3{UWTWJJqBT zX>*?JGm8RSj{MFcT37-J_$K{DQ*n0oo_CJwPrthuahDhJTG8oo)3ArXgZl084__U0K4Pq#v8c<2|*vwp-`F|&s6U0 zRL#$I>OT5#4#XsDeeueQiokM3P>6$+ZoS9N<%Jq~RPz0Y7peOZdcwPaOM%x*La-C+;(#r`bdtG#n;#Nb$rdA4&6YQ zW&aqDaso3;M##+Y4lAXJdbNU7lPH!)TjLSDD8)FHe$ZC!^vpBQp zzCMXgS-99PM@f7FikEZ7HkX%Our2_R118=6K$4}6a&fOuunua|V~cNLYV16uE0sc_ zp{EBd;%ejVNl|+d%})c>+AoHN>^2gRm$)yr<_fuMzwJ%rS{%((`b58$pUs(dqi`qt zi{tP~>YZL0f-cQ0C=L-(1@o~&SD7&lmP_06^SE3A5^iELGSYyoaes06IBP(jo;AH3J{U=A*wWJR9h{^ z8YVddxhdg`7B1V>;A8dBrQu;K?uXDTk;sU~G%2l*BBh@Mj17{@$?*>Szd38RtT>}O z%B2?R)}u}kFnAgGL3p1Ywpei*OMF69F%t^3*i^}tyWBIFa&IbiwPd<`_%e!>VlN*% z5#dmEbVrSVDuj#$+w!Sf>DLe=$+wW#?=%Hk5UFR-E9ISlTp5NjrjG!rxDOa&{B!kh z+t=>yZe(Jog?q6#fX6LD#ZzVg9t=kVC2wzUuT?KPv>^9N?1^Ysnn2P4jU2zha+Vcr z;AkvN&N)Q!LJf@S47~SC&=WFmadx3)){&ge3CW?ZwbNyWv_7q>3w1+dnF+SY;wadu zdT28G2&MXTRuQX#ykPX5Jh)5;&mxoz(gqFCtL)!hd8-gy)&mj-UsE*Ca~J$SGwUBN5U%Q z2_@Hh$bJZRQm#Lz0HG8n21h6uT>JN;QL751NPz_wC|F{6lc8TV)6>(l#HiVB8{_LQkj636q4 zDA+lyy-Ue!I|-#xClKOkHktIn{0o6INUGtGTh`Tbn^x**crvJkaHU##XEfu;a(;!W zkg^uzX~C_$*%(hY63Jyxw-|rAhVxiAI3SoH<|TMsFq~v8H%jVES*?6zgU4oBBs(bh zi?csS68FY3TVJTwXJ;Gj&eniTi$QkgZWu8yu(z^efO;z!GHT`pBek3;0$a7Q9E%k5 zW}Q8U9oXgg^;V{0odCCnzRM6SxXHK?k=QIgiuP*!mDeMz=I1~C)yB#h<7lN^;WCsm z_O<|Ct2WT+NakG{?fjX~^+b{BPLzpzXHoo)yIvGu_id!jZ*rj*I#Dmced+A$V}1T~ zI2w@L-fzwEaf=EyFj)Hzs3$v>6fPF6I6_}?>XoR> z(!cDeFrQJ%c`EY`8-iwyZU`5K{eRpcs_gO={`g6l(`eVDZ2hLF4StiX;DB0mgy7E! zXh3hK$6Wot1|xwrvW&`%XNt7Rzw;O;L04^<690I;TTXk z61m7B_&eb6K3qvKnkv;767oI%egY~m1`@gPhhM3xs+O8nH#awPoEOi50|K~ikXKN5 zSgI>6wE^hvUMKo}wxlFC_r72RsDF0x>b2%eJ_|>q?f-rZL2|=qxErwGq7}&`XSY)H zVMXOz(Iq7h^aG8V6%VpsWzZ*PVA=(!J8W{g%DZxr0~H2?342$6Bd;5jO}IDosM@?8 zJ)lX&uiAc#pY(W=*?Ieweh@Tb^wf9heDq860uc)I*ZYso`fN>Ec_yf)0(myT7$hXn z&G_$wGhtB1`Si$C>Dwz%OhONg70^s2jVaNr%R?YZ%pNcezb z?Z@E-tSoxGF?M`52hPW_*O!ORstDY1Rd+i4j=t11vJo8PvCryG_Xn6 zZJW=wuX?Pk70!|2cwwmRr)K=-d0NEUNXS169SW@b_4W16OchKW_y7O|--0~AE8&z# zhs{yZQ>;61UTcB4x|w^-U=$#C0LXF_azRG&Qyh_Tg<1@wwib|0f{R%WO6<1ugQc?K zL1l=X+%PDt(Na^(9Wny+Il-SA5P0D7!!TVeDA)56owk|Qo$;o$yi1GV!p^)oZq#2u z$I^S};U_Asi&HmZ@?@`=%$gSFD0i}pEn%o17TQfrbYnN@`&le9^>@x^28)^3qbe-rr^rE5+&X$059Z+V9ii*3@ zEq)mBeFlIex_!a^EK%wVWFI%|YC)wOV5ea-G@0@2mbadFdv_pZPtC|UVEQyj&IRNH z%ILU3=}$sJLS0=QiquQ!)#?y`ce?9io(oTMj~Jti!1s^8H8BOl+DHQEu32*tGRXn|~EyyJ1vltps{#eK&*!wH*u{$HxqEsy4ZRLKx za9>c=fuOhEYZpKPAf8toly)DXC-XSJJO2Pkmhx`I+_n)}qB@YmK%#K>e{N>mM zGC&U?!;BKkEKiiX1ZQLph@e3^-?8l&i$U)%?%nE-4xq}&TRHoHj9+jz{;wTWf&!?7 zmvJedTN1B?SW)4l)*2?GJKe%B+U=I86@wD?8Jg4X>FyQ|Fw8AdL|U2zXz0t^49eVr za+giLIABdEy+l05<&0TOT-+0sWL5XZ0=0KWj|z+ryYuAxMcpA-E!F_X9~A4evR{w!&`;F3On>l>jWtcVj`w=tZ66qqr~ zJSCOeN8ecEZX^BpZ6qvK??lf5C51R#wJeMtOkrbfMaXaMTTy zZQ%t`n8^o&<|7u)-svj zdZa!#<2LHO0I`u<{A?3%JVu^k)<8lNrO^XNG(-w->CuCndyns?_uK%~)`F6^XtrB$ zkATS5;RosSq&0ohY9Lwx3DhO-Z-7IklK2ItaNZPwh`qFw24qq1OEy5*ir3LI2tj0m zID&sXi$!q+Kb)tB(M?FR{a^uDYK^!S!!EPQ6`<(Nk8Te~KiyN|2;j(5v(fuJ9?>TH znLiRt^ht53As~XSvA#hWKioSD@kw%up+au)Qy@C@0b<7c(w7a;Red8@F;6Oi18W(@ z{pvJor>F{uYe2jNmW>vTnCBd*p@1~nr#xIv4HR~QvaLoSDnj>5uUSQcFb)3?Rqq{^ zb05Bs-zkKmNmANWS~R3BmG<5mqM=E9QAVXidnuLn-i0F35GdaWy@jd^0>~52 zd;$Vn;MCJwa}_U+)qkIws%_4R+xqvr8)A^XzZJ3$w7TBeMQPgT=h+;v$&mYLcf-Cz z0&i1J{~#73Ha0fy8V3lhGJo!o)f&pH44wOHdW6d-%F}&!)pbfP%FDiK@)DIB_XBMA zQ=NPE+???8uEy!TR(sC4K3aUEb1TtuPi9r7ZZ%o`PDwTe@`8p8Zr7fZd@-|&7Dv7QzRmF{f9^XY-R95 z;QGvQ`}+T3*7>9bPDY>acktAEgejhjdtS1)X;Z1URYXi-||$y-uOMdn1xlAMD!-FC-c3Kj*i5{=2wu>6KUJ5#!;??*#|x6{@2y z+8vizC>g&lb$L)>d*Z|?jRN7)k`ebPW5z^fWuD8bm-O!`QSKm6jrpXdLjg&Y7ycOk z;UWdx6d1%Erdz#!!7^CX|NbKOq_ceT?GPXxL>g|}m3(o3{}mBDkp(aqeZEh;6jDd? z*Qmsls4jH=_^byv;mj3=mh{EvVStdE+4IZ0ixbx2biI@YOXc@C?(4Ndwb-v$aHp28?9hNUF zcJ%-Fx!$OF+@;QnEb-CjvO_uTS?ec+`-+3VGggs@TQPi!Q}Ati!9gIr3c>-M;!T`1&4tAsVt5^kRF(8Ke7cyrp+ZMJW$n-+5-?;vhMx!kPZ(w?i+9I0#7RxTb$p zRNP1y`E`!GbN$D0{UO7^a!rr*9|Owj18JlN<44IqXhqwr)~}e-Ti9IGumtHZY2Ql|zEi7n9Fd6p3^nflM4k)-Ww<=HM_3s>W&8uL>qOFNtJBsKk6ws@XndAjt7$#?@WYw&2k2 zJ$R@)G@fssYcMj@cfT5^&4|rH<#}1=*_E&lg8LrZqhgGH^Q6t`RS$b&N@;okrPYq0 z=L%Idwo?b~>#_JdeLSe;Vi^Bl2 zl$YNZ-XQt80C44Ft-DR|=+3joRkmGN#x^ydAe|QU%~n}0nXcIL`1@DBp505|x9%*S zUwao~L28j!PuZb)JUn8LJa@1zA(O`8;@Rwq!#tFM3)cCz`hfzHq8HD9|GV#7$vDl~ zEC1dE-qQ9r`5UZJ-|KStM>9*7A!8Yf;ra_kyZ9U{I~tz^;bUU+$Ul>^dal@Zr!@jM zMi*NJi6o-1Gw6Bg9}ea$KZRfg%(mZ*r%#b)vd$hLwzKGQWW+A z`44sg+7ZcA;2ik)TDHircJI^r9qO;nm$F2^iqD>SW^_@d(^Q4Su-A?>P5#Y|(DWm+ zgp(v_Ti81}oXXM_`z#kt-jQY=CoQpa(ZsQI!{f+<{yAZ;>c#gJBc#nc7u!$e@?;&> z_)K{8w2Dfg{rN2Ek47YEr;QU*MeKWFabTTZyEZ@k8>iM#e}8#X&DC)tF5jC)cGeg! z6wb~i=~=fY58uj++ZE_Dc}@|Y`cQg4Jbg9I@I)XBQ5gs|)f&22pI`1Gu(FmtyxFU2 z&>JN4^(j@o6PdSG_uI3>D$-iiRQBp@7B};6{r9S3o*x#WJfq!yWbu*0ozN}grs1n& zYigX^4GUa{I%NKud60ctdN1_&{L7msl&5<{L#S+W!*qBUMS$KI$H&Djqonbi=~Wy7 zBRW$tJPmFVCYq1vIxDe3R5iC8o%wP+P#b}IQYXS8iq!5F&_9$o!opLpxeqXj3xRe3 zcLZ_9Y8l4=kUs~tGpU;PeC;dK4sjvr);0M%$db00qNu)(1iu%3>~Gvn682O)(dag7 z)cT%~|H;`!l=7@r>fT4v(n(9^`|Yau*Kw(6bh$)Zhql~KJgoX_xOv1Tp)qvwCV#?|PvI&DbklzEb;tZ% zY}q`%$L~#5gHq*e>Rflhj#mOmae9-;m}Bz~tZ*0V&0K9tP&q|5KO?TEyD=>G_5RNy z;hNMFXPW)??O86BGkN3FqU>p*ncwN7C?Cgvr0Nz2;4GwyP_u9UX_bxZ@H;#W4h>P} z4BhDGIa*(YP%v^iBxjL4SVAkqwZWG5{V!2I0=hI(wbc0nz+fL?n*ep?JFX+2NeMr- z{<&|+t{p;6MmHxIv&8t_?dmD+eL-jjd^)GILTdfWJ2Uh8_2TEZ8Sb(#QrYVl9i(7n zH2sHWw~b@S3fo!z#+vz$bKFv+%P9vsbfS4IpLU7+(xpH8+?>bG&oxz-VHd%7EF;eC zP*|H?+tnmef*HGbL<(AU0EwGDW^`w0GQh;fyO5HU^#4$9WpN@4V*hLy)8Gc&o`z=r z8N6_H<;OVAo)a{BSC2vT&>G3IMt=`#=2QvKS*T*QiF6~-j{?7j9p}!$ahAAqi$Hkp z&PDgPN};YyW-(9U>f!5YW1-n^6N>Yyo9dVIFS@jcW-4<8-Xf!NL1C4B(o|G~()omR z^xit2tlEa>bCIu->yo*SDC8-pd|7!|FzlcIZIo2y@~&O;4s|oLl~d^#_PyJ=EhA6g zz)lPP#WN3NClFx2bEpY`Qor}WI?{7uMDEj)m3AHx>1Ie!&GAEJioTexg~g)FM>us{ zxZ1e#idO5I8B+ii4Ve|R>NuLSDQ)?13|&G^&V2#cJ>7af`xR&JR-4@wqL?Vmp?_n!Q*M$in2P-YuMcwl zj2GJrVNS_9l2%uQ)GYXAnJTxg-xup+d6Lyoczq(`qH1l?Qe|w&Dwq2Eo)hxMCCR6c ziMiY+5GweEg@2>FFf&+^GSBe`?aHGt)c{!LTXI(B;`5t2SxPDwoWwwV2?wt$F*nsk z_>9N&dzc1XM{or{q3Y_v@Yh4}>LAOa3D~r~wL#tuaHGTb+jMR0M(FuZECrTj_mn%H zhaa5@vPd*jNnc9loOV?0b&XKRY8#$-$9msv+LA)JIAw+_ir*QR^@oD9L&fp z)ai4ixD{9S$w5%yz=!C8LcP2PQ!(ebZOfETm51!2Yu-%=JyCMuX#nJ#5NEP(@LA~U zy0tQUH!Sz6d3t(Qo}-~9x`eQq3@;Ja;ZgtM{QUfOJ0@46Gy=4C#xu&uz0;)que~58 zuyU37bNPF;hDmv|Ez^6le|o9ANE()XG-1fATlsJS%WBM<60)<;Pe{BX0pa3s`NKD# z*RI*<(TWUFWOO_?p@@jt`+M*Qheeb5y^(vJyiFhIpK-9&rKK)63LH`?Pm%uBzUThl z0ww|>8@rXL?Lm=a^CcdsGWhL%NcWe5_Z_mn>#_LpFLs5^a5L`#T~#D^#HtZJ4P|wS z+i|Kk6Q@^V|ON@(*5d0-u0VjWrfO4?pq#gNouWbwG))R||j;UrO4QP@>d(*HM}S)~08y05IE;ry1Isg;sJ=;GU?lV6f)2y#qRdtA#Lm+JPb zF>1OkoMtc4pAsGFp8LwTWcN{3>~VE)f8@2lrtONHj+NwW=xJOsXBrd;o^H)OCV3}3 z^^{azidce!K8gQc&u=3G7s6P@t`fp&OxHTE)@(#_Mob?nuWDMGs!L-odh%nR?K=^b zLvK%spo>S6Qw^&bl!%WIpa7iYSn)sx3M(Nb6vSMKS=z69qW}oqUF-pfm5WMCy}U~c z3W!b$rca!Fp;A#;x4ZHP-cI1A0{UsR5cKC26ub(zBz$Y!mg%zJCLCit>Yf)&Q?!72 zP0Tf6s%4cXf?0I5itJ$`way&9vgv5> z{SDA8IyF^;JR@%ZQ7Io-Fd#%VyuReR22-lf+neLtL=+4i-RLb6##gpg$VOKnZU#xv z1J*FWopaS6vUf&2LMaG06t8b@4|{X82u-|skRoEQD`awusrB{L7Lil*<(@%%rhczn zOs$HI@BeWD%A|LbF3NMy%^y{GvM=L%)#7y0vPrjneG?U#-RDl)o6{j$$KO*Jr-o># zP?7E~&!1S!jNyqS6V9E!Mw61*m6v==xx?sc$%k@|{3cDdq)c;))?YI`adxDuWQ1qg z9`hf5A#0ixUxejJtjk&MdzU;tR}iopLDNThx;8ryZetQ+h0@gX=jRuYv+Kw8*NlPg za5++X724q3yu8zW-PE@c3!#_zfdlP$5K>Aj^uBR%;=R20*TMsgPV4i&?-t6g zF`Oc2dn3B-M*obiqPWuL811VQ`O{RdOdW-`sf+F?bTRMjVI!{@ytqZnzj`sZi-*3j zSl_yYl;G3x?p**RPDFnbPEO9Yv`W(wVpI#-LwgkZEu;eCsqer$BZ^p&&Gfp&^~Rqt zBGMdi`aXCb1b@61-qum4C%9!Ij*9NQn!WuDjxC$2;cV#@zfHg}w6wHi#5M|S2#_{W zriy}J`qg<{j>miEM9<|E`QfZ;WBOk@#bZMz4Xbg3F5X5FiQW;(om@9VhymyB>ZcP4G`Flh%o@nGpz?aXnWap_0ZK{~jdb?*97-(cp}I^yt$7r=zf- zz#i)jZ!aY_mSbV&nz&(!>B@9gWSXRRsY>4LHE}?k?tqJTF(H>2L3LEt&|o&A%rl0K z_od~oO)3%1M`%~Q0CNSI_35lXqn^|R)=SreV?)pL^Okk5hbjGK8Jx>vv5^!qogXy{F%-E`;@1zNOI- zsm!4{#mF3E^g|&24cr(VC%SK-+XJ7Y<2*bnBQIt=TmU`bkQ%S^ESg(ly$?as*5B?x znU#J$pl}%$iVzdpuFelv))=|$zkB)b(iHx`7M&*nqoFj> zMb?#jEopl^cl?*hRX^Tq zF;M2%@wNGgQDgDp5k0H-<`RLad@a*%!o7Cm{Z71>`31fNGz^HoH_OvK5NI`9XXJcNmG(C@ zG)l8dI#K%UE5Hq+ma%#hYAnD@!Sgh)txv&Z<&KSs{RF-dz;;jhUjo6bk~^m~iuRXr zkm7Z+wCgpUe`e=pQmf4k37yPe+@5Z*FtO&kc1e@m^kcYVD4iKu>Az9uDe3U(&#TqG zGR?E069c7u8O55h*Sj9~o6xQpS!nwHizOqFA4&T@TI09|-EjbjIz*GqM9TmZ0|WZ& zoN9Ehk>taU@&+__Bi(UP-_J9;gH&?gbN9LChTMHiB1CuqIg!-%lSZL!InU4?rrMxE70okU+_X} z$u){okx=IpuCYnO8)`*=L%)Yf1X>3?+G zOgb9|fz#4f??hHYKh>}}=WkxTQ&s&^j3^sx6 zofq$$1GkS#`@!LL4VE2$v0&l%C$JIvBmFif7lFOiywW_L=YJZ z0`MJKeVsm_{>h5Fs(5gv$eu+-+ELpyX7mYXYNI;KeJ#{Tif03vNqGKYj^+L@?HXKj6Sac zS|=8OW0B*)WosLRZXZ)q#_r!;(q#mOkeS|`PH;EI;0>|1!P+83^n-PCtE@kg;{o^{ z#L5Tr>v?#Auq}yx^1VBP=g*H+K04R=*VzO65nL4~?{rxsHNSNn{Ff28NOsc@+CZJ}m5 zsgXH!$ADKujG4jp31eExH?`f&59gJI)XSg2K8TdUa zB?(%@OGY^c)Y+GI8SqpOQRq_6+HN_W?@H-(mSu5IE;;$@)LS9_=%grdmy09j zvDN0Ir+97LyCHiZXHzIK1Q=Eh=T+clyu7?4$h4p%Bc|Fwnr3GmAi^%C{Uud4GzU*c z2!qC9g9Wp%w~nWwU0~x4v6AqZ{)uzdd;UXDRUnl5i07yh)zie}%9 z7R!DXnSWTDu9nY{q<%qf{HXY~$1iTyJSPy&KGp{&!c}C%wPjLp&x#?huU+VV@$LAs zikxU3?~D^6Rv#A@dyUdsRP)#dE$?!r=CP8y>O|}mum^aeZpEEq{a%Bm=;)`sZ&@of zKLWmqd-YPkp7}_@M$vsda`9@zO7bh6O@^GzT01fV!HsCQr34Hb(oUTEKognpj3L#A z8VqD(ao;6t$Y*S9a=L8y*{i2&CPK}YnmPsm8%He&Bo#={Yinx*P94-ZrU%FiNbW~P zb)v%`XnUTEABPUqT})^g=pV6xvogPL%oA^uS(L0;NN@4lt!OUF@Z=JcEO2yDJn z3A?=eXZxNH)>H)6^^+8_Fs_S^K6&vu0fLpj3e=BvC;JDKp3oIyzrW)4>BY zzp#Ntpj+S}VSedSCX9Wxw7TED)6~+^QdRA}B4S!%SfGFEZ1w~A^}YpukE6V(xOh^$ z6i=#Y(4rRD6kr?TDGFDk0eK!`@5}}4JfjbtU#>wU>kj6H3uO#GmCLUwY33WKW1 zWB4*6l@nxCvh+(2UH4|OXY*PUuPn29!BY{S<7I!^-a~z`b?(pN3q^Tyf%B|y*lzBu zxVQ8O6YRHY{Rd)0hPJ#7#_}xB2pXPmG38SwKbN1YcVeQtqTs1TOI{9{40JY`6gm0@ zh;XX%%24j1R+8Fyrgl$=f;K^Nl&|xX&%^^T-w-cBtT`7#(cam)&j*e2EMkcQ{H*T6 z-hKOqN-hjxT|ftFP-IwQR=b2swt93SEtZd)`^vv+5`q9vn*UB3mA0^c%X?h=e0B;K zf9EJjFPd(S9GbB@Bp-SJOV}xksc3elg|o;0;n>0@we7(*&OEl5m84#xtLUz;>0gPTuYV z>)a}n8wTSB`ucxbD6{f3FGO;z?CJyk)AhEQ{Iwn40{ zU%?q>nx-!|^+YFj4K`Hey38Dc66M`7|AO40YkMt*O3sbU7pP=yaCl(WTGwq|KUmC^ zS~RXB9tPAMe((l~@i>-~k-2BQW?uM*Wu*M6-1p++iHqjzGuhI|JQ-hENZ6xkc<-@i zl!j7s1>Rtu{#8cXmbUI5)!ffw7!WrXD77o``U&x!;jh`*Lw8nC;Q44>PkHnz@NKUq zlj+J2t>Pozquoa2R{ZxB_gK+4@E(_**h-;orPThGeL40ll#WWEjzJhPiRZE4`!wBV z7$zZzd!OLV3-*T?1H}h*W&$f`TyNcosk^zkyH++eH?^XCa+$G^+ytJ2Yj`2uy+vld zgVHX4{jPSsr2p16zNh9O8`Bz-v3%Uag51&LNx2UU%@aodkidkLQ6;ZW1M*z#=tF`Q z9;bCxB|WBvTs}S{S|K9!=P7&#JYFK%wJ2XGbgGv08JefA5xhPt<)1oSnBS%}7x}FO zMp*7;vQ@id*?2hQ3uWD;N=vUxy=KaI1TWo}M<+1Aj$?Ut!13GLhr|rc+?=`lccQu1 zFnrVBM6y75TcppM;t$fs=U9I$C#TjnLNdb+<7;~!$Em2i|0J#}TI{`0sZkSdIC|ia z#JP{TQEWjvJP(HUYd$ffoNEfxiu_V>J;mZfv1K2f2du zcx%Qav&YWx*v}ILbRyl1fLf%&%^Amrv_n6)el3cRfQH-O&wO&JGD+1mieSl!yL=|z z)TU~LY5#e5Eh^SJJgY>8h^f&U_3KNTD=X(54hA}GO{&@bRm_WQilb63kZHcr(ce=b zTsA>dVTH}{il9)2n_=nxO_Ag2S<^eK&ra>EnKEW&#A{GGVBB^3?9F@#nayGt3L7$+ zw_i3U|GMM&$;@SJsWIyv`)F>IjfsJ+!_p-6jJJmFq^)*@b7?!C4qkzj>q4Pbjj{Q7 z-CS&F5Y<__ojnc}KlfVDDNfStc!qV8D4>+5bKpl7;TBmbz>zd$B3|E4}q5^8g9xHEcvoL}( z@%AMO^`~7JG8o@$)VjHMWojANsfygFx0dxNdg8y^u*`W8+zfo=8mP(6(kaN3x4M>$ zR`YOkmya&6Q^&@}T=-Ta0HoLAWF0 zKLPm2aW7N1z@hC3jAoZdOnJz|2b-;Oz=@XCm_As5;;n<1$vi=e9D> z7xB{K`3CtMTZRN(Q=d1q=*dEkC8!8QQ*#CUfzhEndhzUT-$gKB8vK+Wd z2b$O2uH3#klaMSv_w~1Da&%P=C)ga84`n6ijZd~Q$!pQMU{1eEIM^a&KQn`Zov$;* z+xlj1i20fS{m$7h;sQu}Wo0chw1d2@RSO0jTqT%zYfN)=i~1cBCd4CbOcEx1YD}{X z9ph9Dre248)`)(Q7G(=E;s&5)d+MS1{!SCtH~;UkX-CTADb>Ka)ZEbUpv_A&0o7{~ zo!yBhB?oawUcnXm4o1_eIlAsl-c8lnf97Y(1)JG}syjM?1+#Zn;ut2jApYluA0Jia zX>~<^ug>e=pX^th@-Lax+(s5&+iAwfKXR8y-5V@lpv~)(X2alazR>>ia$bP!;1^U9{ReJ{HkQNl}T3#1sm?eM#y{FhJAhX4n;6&Sr?f@jqWj zb(57Gs%f~^GVO<4y2fHJwL?i?NZM)sg*_b${PgY@}CQt&+^DwhBEV<0Pqh{Dq3e}Ch^|L-sUZ%3hX zFG^Pae?P=p`2VhuK+wV7|G&Qob@+cfhajgvk?g;NK*@P8v&**1n2(qNzjS44bydxY z`TqA?DqJN0`vg%#6%z|t6`+GvKt)7JBMK5vQJ}68!opR6Apz|8~f-{u|DseN0F~D4Fe8cB=+--3M973#0 zew=P&pa?-N$9M8%1(2V;!R#+#pn`RpBxgP}N~n;h3WC>BGq{4Vbz7ki(k&W5&I@Rp z=*`NL)0+q42w4@Q_lZ8tZy@!hf!grf zfn*USyV|rY{0$n;fWu9B`r}Wy8)7I#88eD~KfgM|qOQ(Pe^^vfz4`AQYUSVBSwWnv zg6taT6@&**%ckksUO9`x?}y|IvU9 zq93slUy_0>vDHJ^!=jAsTnO%)N_ot7f{hvI0<^$Jnn7)c% z`%GX{pbA2lHz7Wr-?HiBkT_Amf&V9GBCy5U(l$RLrVJRBv z=t|2ri4Z$CP?VVd4%j7eeYUKUWXGW);Evk?y}$GzTt?Hk|Ft@PM=`VTp`yiL(*aFY z0QBxV%gNdB?BHHZnFQKLPRPVF@WND#N>B#ZcZsw7_uIsXzm1!p-}CB=G+;Xsw4%|l zn8nZ4HXT&NAcTNlrusf;JCwdQp=eQmBz_WzJ>Fkw-YPtHiFEK8%>Mb>j@C=g_@yjs z;&)yT!BRjdR{dMQ6o>r0AJy1BrqO8QE?|5Cmg@vPJ~%1m0 z#>U3l+S+=0=g4)q>5j$nz;F%-0cDap{tjyj8~bnwI%=L+|K?ZGg(VQEk<7fJP%YS) z!@hdh^^H~b)oEiSA&7xhDa1Cx57Pie9%k8q21gxZOdElCYXij%wLH2%D9(u^I}L3=#Gu8Z00XqPWyIFsOBr{VA26O8meZ>pj3x%d(-){hUGn(ELDzJIuz(!EqT7 z8d~d3-$+- z>6;=BNx~-I!-lts>IJdL5D^3|apJ0;Y@-gbLOuuhuH3%wnB{-@?G+k!x%=WC(@{NF zJho@R?N0^SDPzB`fq^Jw3q#}*sV=|2bp=Qu=x;3cnPW#H&=nQ8piOUfh;Zi28RC`{ zg&P;vZ_ka-@Y$~Cf?;5q|L$`~tXWJ$4`FS@4rog0e!Ou2a3Amj zvNKo`Q5%xqW|f{rwS~zpiS?Bkg7|6}e%^Y0DLQo-e$(!2zG(X2=-S39>DZV1p#D3$ zC)Zbsi;9j&`IHx301OETYfNj;?Vr7Bf`3iUDv>{wxlsovPl+W&5MmDG_NZAhZf0f% z`}UeRlf`)-)OBOhU_rX0ae<1sLrLhNdQ*F^7ybWn0Rlv@9B&@G&1g&|EP<=7b+=o4 z3W46=?S(O4Grgg@(?3(Ag4(jxckJzW9D0z7#Fe1u_6~I>svsdww)TxyzaQ)Kom4w6?OR>jbmTJe zUuYZ)_|RT8b*;+&?8H< z&YdG|5t2H36+zG19WI7PBhQN+3R55s*7z~rJl^|72hM>+-l4M0d4WW=t>6pEbvp^~ z=|x3E+N@7KRA1e#f53>F&f0R4`sKza=I3{JlkiQeA~@xglxU1xs=%BZYj9nTYo*bJ zDKIw)hAGI?UUU_IL>%Jr_U-*KHh5tP3&&Oy9V5Ja9I*_NlasTVsi}1g4F|v6-A(w( z7Ts=*2(XFsq)qMk@jTF>bXShys-PL@YHznEF~ocx*F~l&q+W)p!xzR9oVgk zx#A}&vWkj`&g1Z8g{%;TNP&Jb25ccIdEfl=QiTr!>kx+NZO2sL?NwH?FW{$|0ygVr zezi?4;UD3EU)O~1W7YXmeO~y?4&h#eC|ai6#>U2Gl3(HY#UP<5(L0!?hQJVj6ZyY3 z>e@Kq{l>?SKVw6o4JUH)q&=fzVSfH&E1p|&pXcWv!H0Hx>qaHmn+^yf=yGFn7effj zTG41~j63hdc9DghQQg#x;pUY`a3HU*Qk>}>kQxv-Q}!RBrhcJWJN4s-rMbC= zEI$v=VVUdVfAf)H1DSG?kT)=hFDnz=cuqk<0YC1P)#9?Uyf0@mw3A|Dx%Fq@mZ}9KEuSEJ}{q@#ZMf&X{3=9nuS5Qx4jNYF-<61Yau`vLq zpIp6vkZ#c6&C7nKAyn_Ny?E9r69JBfrqXpnX|14Ugls zW<+h`=g$|{-$B(XfsU8b7`W$JjM(kpzI}TjVOH+~UuWpFT|bpmIyWz%(&;hl%}C@Cu1J2=FsU9_>G zr=eN0W1)V&4aT~MGzKp1r=;}s@^V=YfczIJBIcdY9y&DC6m4_L1Vdtw@edW7=$V?T ze(E0@NDo0eOY|cLz=l`1tQ77LrkI$VRLBzh_3M|0 z5p@h>C`HTi{IDLJ^Q;&isvl%wv9z%Glz+UjS%~5{4&J98Qv4-yPKHWKN-iz}_F4~5 zDZXxQM}Obm`Q!cj6!h_4heN2z$-rn@T3*)QRtAjDE-Ra!I-`}Ljmd3jYE<5^^uydz zoY19~&F=!fBMn82V!l=!NFJ^1fjp<7K`O)wITzX>)~ANkZ)iJX>M8TVgGxs458=N` zN>65N$$mDWUN(=^=3ZV~iwp}pgO(X$l8VHE%-q~>xNj_2qBU{RX{ichDXW)c`@`i} zlVk$}e0;<=<*~kCY5d0GK%0;{Vk#a++c|oSD#c+f)}?sK*;#|7@X(<{=@OoWGZTIU z!bLr9I^>^78=2t%hQ6lhf~?~pA86Y2%*0JmRoI;@s-|ds*NVZ}+1ZP77*V_;{U3^* zR*?ZeKR=1~i?5YPE#L&4VXzM*vy_09X4i>b_S187Kr|9Ib)LG61AhZerL!UFF9lx<=e(@r!zs16x-3P#Cf$~y6a*+GGz8+i% ztDUW^dS<^6mHSWTW@i~S(ilY@=$ua{ryE#UXdd6sz{nVJSU98_r_CmE&nhrq40}C; z-@SV`zkY|J1!>91@Nl#jcut@kFfQbqz}6Aw*pm-yF=`el*6dcJ-%6(Qsz-S)RC}!! zRR;)UoeaNRNy{{)kr=$R?xDaARK}iX-MLs@04^L0n*MM^3IcF#*M_726oUCg2*j=1y z_wL=Mfl<>#W#hPyJGXDQUBQD42nfIv2XC7h>04vtjVkXP6zi*65ojzUt`>=RApv{; zWR?pc*DM1#erahI>gp6NLRx83D$2?XB3Gi;Q}S|iLqbAgR>2I!%V*qtus{ReJfeN0 z`*+P+GZ~nz$jZuk#+>mwiq(qs!fd~L*Di}Xk1)OjKu!U0^_=B-O9*5D{k(JHnm7>I z?(Xh4Z){PSgI>r^TL!s43P^pj@*w#yX!L%ldWs`gL{tViCEl~gLhj_iins!aeA1LFbEy6a?~^!(zvvhwY95j<=yGBc?-D%V#!$G zh9_^RSXz$1c)@n^WVBThz6|jnsc}>!{QcxJiNbyCfm09P4i7)%w7wr1na6>H_Rk+5 zU8kV#?|mI1PU#R7f$|6VNQFYJKwk!al_<_Z1jsrcNgT_QthrHAP>?~w2a}fE-g$GE z;C%!Sd8Yk#QyuY~H{sWXG#Ub){H<@>pc%G(MQSM=7#Qf~@~RXhq+mneSvMdQGt4hu zzs{+wjL|;^!zUaTb3{li%jeg=kyUWjq)z1`hcuXMIuzWx;n!F;+df$*L@v2*43Z}0(`d`&J~7^zMvk@f}7ID!iN;|1HQ)}Td4;U1laTq^ev&W3r> zFuJ=fCKZ2<%S=;V4$rHFq8DeiJ}PUqlB9W!ZI?x zV4ntV{k2=t-AtEb&V2GDp|PQ~;D6T1CQ6W%l@)M1fVcPe_4y-B#~-QePPTA>Qsm8> zHz<}M$-uB{&KWu`nmt{en0n3aCBQ2N&ZNCPG3milBJMEpYd1B^V>+jRFydI3fqJzn zT(7#O27592;H+~(X{i7uCPOvsyCo-N(?NIYyuq&xkU0Iy3dUu{mO_Sf!n`-Kj%#YyvYc@ z7~as=Uy+hL@gId{f>w%{28Lgd9za$>+ValPLPw`Zr{&w^8=+jcxCtJAjjnnTZKT67+jty(4_ znP}lRSqL=les-%xjxGs-?b)-pbPMi3c+l0+!6<(1V$l(x$`NlbiV6!~Xu9ruVeJA& zr{V}{ZEf8KO%(BT^7u_{Zl;yyN2#f!>tprcZ$UeXYsImY{U|g(egLEl(B!9PXCcrY z>kUD_3B(PQSm)2TVu$5O)jEJNtEsFkj;O4oLv3z2^ZE1VsVPw$yfBUC=P&U-oX(F| z$-@&?jX1?iw|6%sBOE&z+$69l07L%%`BOVJp$VBkFw_ifVhO`=^7hAb>C*lOnVD~F z{qyzn1do;W$dMFqiq1$#JQ0agKUVL*R%*<5EYHc_zFkP&z+eERRWQL7%fgX9)z@!e zb?2h5`L*u(T{05BKkrdOdF_gg=vpM&5%sL!L45?I$Dk<1+SV3qshfQB&3-Gh;O|i* zB5Hp@kYN_phu~%A@_h`0G9)#|naXL$-y(#ajN`#FYrmO*Hx?b14Z;L&18=`aa1%i+ zH+&1#5guWgc|H6Lu$0=KUQ0gmdSt{8N!je99f_Uv|y8(m`Ald-OB{X|^;p z_)nCqaiJ)qaJ=?iX%ALluLa{7hcix@8`rNtxjO#I!Pjv0$=qNGhR|OWOzuSf@a|m` zygPtgL8w2f>luwQmr2S;yFed{H~8+|)BHB2O^8+tpBg36%gD&MwHe?>{G4h}t^`}v zyTJYB>d!Cd*0b!v0ikFC;Nk7PhQ<}31Mc_^BDMI!6QUIY?|=S`Xsb-R)q?PapoTR{ zEVRw*y=<(lqY96asg!sE!vbdUZ{cd7<7%P~C^ldMw{fK7>=!htoJ7gW#>Upu(=$)D zjU|W=Vjr@bjEoHCl`@i4SY`jrz?SqN36*0-eYlt(jjaZ_%3h=BFnG}b^#)2%A%H8Z zxx*Oi8~>0v3Gh5K4dMCSyzK0tCk9e!26vx6JxzHrI3xr=XR*Q&gh|e~-aTg&wpFi^ z&B23*UA)E!emTM!xMjx#QAD*`{JUglcb*a7IXpa!3|FLI)Vhtz(Q!^JHN3X=FW5t= z$;s>3cfu6JlNV#fXr8m5mPB2u&7G}lk4)_6D1l3`5At zQ>WNTo-Hl8#Sqc|$qyBmam#?9XOZ%3cqueu)nJ8ZOJDsYMM_HAyPurgxW8X?b-zpcRoKlUe(6TjH&Vble+ag(@=-s zy}SE{?^Fl9SA{#Olg{q$yglU%AsMvEBdsW3pJ4d=3~i__a^QOj?=P7OoN{z@90jSh zHzG2!yQ_;!O9ST%oP^#k&V2cDHf`65_zpnuoLpSdx<{|e1VWUH0@+!b8G|^Jm30dA zD+8;baZ_ididsb=pYFy1DI0@p;QyNp)H)#{H?vBaGjnGILMmQg*;WLKqGn{*Abl<+ zzK1R1IQlG$W5Ap6dGX>!wS2H{0g}>>#0rg?tHQVe)?=0A5v>zDckROA5fU5>@l||U zoP354A`VRA`epl{fE$mY=YoHQAyTUa_Jv2LfND@lDGk$b(0|JQ6bFZJW#tdZgzL8} z|NPkAy2|L|=I)*~M~3Y=UFQ=lU*R|;Ai5iXj4V0}%F5(n762`f0^bb|h8_;JcA`Lc zV&@drx$RJcgCR=X2fRyvult#!A^x&d@DbGF5QFC5=zVX)LsEAey94+Nqyw|SDBWrs za$EpH!fqjRyOB6KC*K`m8pTt49-b%WF=}r!!0kih{Lzz_g5)!_-CJJy z3<%7M_g=#Lfr|9!2N;Cp6uVIfTUuJ~zk5z%ZEi>q2a8TR>b#_gRkTuyKCJ*SnpTw- zNR))_1eUtUXjNUEAMg*6T_WhFgM)ATU)i*q0S^=?7sr93uC6XDjbUjl2jtLdeu#Ns z@kKu=EpFdkW(FFxO3&NNH3ymR=)aFO0MMU}s2VrLSP&0e#nmF2Sh%<^=8Ewn# zVw98*Fw>h)S{j2hVo0Xke9;v_4!O`W@e7TMfavD+k^B7cK`$)7*>%I{=JqC+>&BvzXYCZb?=GD))Wa(-c8Sb z8EklHusAHUa14MXi#6Np#Q!rYD(d}voNygN_fhRYoYXekkPE;cPR7QSbiZI{hh1sC zYY^e>h|M^T*HJ+0ZQXg0EFdaGtqlv)eZW2a+uS75Ep=<6aJ==*P+&>Vb4>p7AucTp zJNRENK=i;|7cg9;7QFmnFpg&Pk@|#lUh{bR7Sb=?S)NVM&^;7CKseg}QSrtN;*{|= zRp@f0q@|%JKZR4|mYiJkBgZROh+Q>+yqqj&&Lkl*txC*)YK_a6{rB@uRu)Hk_i<9U zS~DcN=(W99d4ZZwB+qJhj4~$#e>uL>$h=@4`&MbE9rnK8+M-6{7-DnGk%}=)+z#AW zINb}uiFek{Fk})L`#!;31gCueVLd#jDK}c$SfCcACRM~CJ01r0a;!g>mmz=J*(l(> z_>nDG+f+W_G_Gw9KpHY>jk0}>IUUxOZEeac-OP3Dlh1FL-s=9oFZd;UKrS6J8sFbM*~UVLF1ySDeWUU9Pm+v9#cS(k7YePg%TLj>8Hep!K1T~g%F8k=;zOC z>kCpMBFjKQpqF}DUd|eL7x)nsEv=rhu`&xk8Dihgods=dqNq+TU!DN)9}=>QalfOO zc_Q$F;9$k9tN#G_8S%y=QUDo1K~r5-wE_BdV?%>-HXkZ@^mBN5@Ac32_7FQYT3Ob0 zNcFHS(Ks;Vrh^OMFtQq4|MeR;pjwxESB+#I2?4r1s4fwA@aBN5d3t#0r^X#3Jl0TN zkfj+{frZqA2hOHccdU}|G-7%pt&;Ez3(^BN@JkTAI4lbv+`muE;(D|8qZCBmcZ`b* zl9UuHhG=CXyq9J@LVma9AvB9jIW107v8AaB2a?9rjp)bnHTmPV5xDy0Vi z=70583m3$VUneHqXL`9ptcbiBfGo+L6&jGDJ2~<3|Eafbk5Tf+Be+m$-44tF8-tUk z9bs78%q)NE`cVQkGBB^~YUy8w|R02R{ikrWsIFgl7{rfS^jN#W<4B&5h%he`P8S9YIaim0ja zgqN!Vy9&7aT3U$GoXxZ!HhKpJ%&Tl4042)mT3KGk8%aT*q{g zC^IjiP0^S?YCG6IW6zvvlx;$fkv$b5tw zFbB`3qb!O<`m@piW`SJMJV#Ln(`ILHLb$X|!Hkr+K;qoQL={K}G=^%*%2CRkvt;Ev zcI-g!&D6B~5)j6zDMgMX7=K+|PY)vAE3CZNhjN}hV<0I$z>q*CKXeg?H@bn~Jpmah zYHF#it0M|p5f?G@MniVWt#W&s(kN5%xxByFm=xqN znc3S23lme*kf0!>)dp0@mo8npedms|lhZV%CJx%OA9_yU%sg=50GdR(&F4^I z%@owsWJ?nWEkejcasykze~3*_AJ1<=z6^bjGGT0ZxK?AQ-OPQ{5G&+Krkmki0k+zP zhDt2Tr(b{nePLZq^TWtU@2~}u4c-t3meneVIFj|Sp@64Z=Nf~@Q6Ff60bMsVaW96_7Zq12d3=;F;;Npi`oDJ)<8<;mZFMYsa1oSdC!ys?#U?{5}(UvP2P zK@ZBw+GQw)U^bPC0mV3cV`7jg$j^o$>Dqrp3@FUoo}OPI7-;LHm~qnyfN}v;3|$bI z5_fHI-EG-JLBTnd19tm}K4&n1hw;Ge8_33ehjZye2?TRf)XW_0?D~m^iPP6vEfI3*5wF<1KcVKXZ0f@02HXGsb$sD zrGj%;Tnsc0AAWxR0ST^=x?dwbb`I|R#T)Yto~9k@$uF{1Q3c;%;$6d)Me^fD^= zPGAVmJn*N>AbCzqfGF7>B#P$;I0DrvC}FP#1`HHw-T*Ac;QH<5l@*{R_wL_+i-fSN zE5}iIVPOHLp5s7W5t8fc>XMU^M3}!oj6UI3JK5j1fX*zjWWaMJb}fbO>+_B^`g>ow z!d>5jlFQxQUBw@b8-D4ED+eWMUBI0&T@a+(i)%tyQG>ec)G+G)EA8P=(1*$jd``bN zc=oNv0=SyzM`^+)0X*|c$lh3w`?xPol}m$b&~RSe0{N%Y%(qiGodG&Vt%CZ8mpbxP z@(Jh(eO^c$fED2Y7&#r6mUfgfsVQ=9N9tb8j*9>J_d3y+^U$IH#5hM78QaDk;oAu2 z3MdHQe;ZiygW-AZT+7&4s*I90Em(}$i=Li067O7{dkNRB1Ei6yM}%!D>I?hpQB+&N zeoImeC-@^+p5kbpaywIdCu(iy4wA@LTHHtCw~Gu)=g-?An9VMuA&xhu9cX>y#tlHU zEG+5BmTS#4UEDE|mz4@DuFzss`3#ykl9HG;W_~QTVrUQQ3z_upiC>I1J8k;_IREY^ z5RzX{xuN)Eq^3UW&<>OrM5>;$7pPbPW^gRvJyzO%&A(F|bIjB8pgXY!qv{6Mh#|i=%Co0WFqAdqH-uin6;CJ>3}vVH7YvnowJnG zY89iV!$ejGDmqT&lyxbqB;|C8Cei_&OU?eh*sl4wKkSctee0^$TJQgT|Ic$j_kBOl z|I1OKT85KXZP-xTnh<+^UJkkU+(vIs=W|OAqfp@RsT`98FyCbTRVF{Z*`#{u6`iz% zfD;mLM*A`2+^_rZy3GxGFY>d^gQ}&XSzYI1KWr!L(T<}>uFGl@d}vLR(v-~u>vjcO zylI_UB808piZSFK@DNgoR!}FtM&`7RFIj49OT{+1B`8S2i)P)*~yxknzY{%f`b=`{-~o8g%g#BOV&&)LMShYF&BX(JUsM0tQIehn0CygPSfH5 z)_Ojlm)X(a;46St>#n0P&R8Y=DwAxKO1VIw*1=&3l$bQ^Jn{9mF%U=2$#s+oC;DjY z(2PS34jiZn%-J0PaD7|9czpEjva*rN$_{eL@S3LAubEVS32x10+o(&U&28QmEb6*3 z`kViFrSC@Yrb37L>gh&|V#CqEC8OEJCo4cErIwGkQ01XX(CE~k9AW*$esz*d)d-)H zB*4I~TGzH6?~!ALYZRl?bNFAL2SJ$XNi1GxrGC_6l3UJ$BYij@s#Yyppu*ywE@E*=FGcyXgQ}*mrP; zrG}i%XDyoaSMQ$`WOwdxwx(;+K(XsF$0EO|Tx24`s=R3mH0PETx}`?I&9<>6e(!sx zd!*UFU-w0XwdIM98S2>z6U~^b{_)$yYeuYT1!imSslrEF-_o)|_5=}9R#kOTy)Hc6&fRr%a8p&_J*N9rmy|r@c>*+~-sTW}l z-hCjsR||CnkBP~zY#HQ^iPxI56;Gc0oU5s+S?yF+tSJ>{b!FV!O|sKi>>%W-K|MT#n%pyX6!QzSjxsVr@uS z(6!dv0H(Za7#punSQ#!R{>RHth1EAVKgw{LUs-hIoa7li1&RzEhaYBR$?4_s*bWx z5C_1vORTO=5zE@!+n*NhsY)qAViVE=7DmbZz~WfRt&WZknzSk!+skA;?f3>$Urtn0 zqXNFbdoF34k4N(9AA_@Mqh$^I*oM;mL&|ouwC)`l3kIVAU$>U2tDo-nbd0zE+_z!2 z5d=1O&YbZ@y~hLJCq8~%h?xm^yG%Us@b!8o{xLhelQf^$zL!z|w6f2p*1;ERJnN=h z?n$2-@J||MsB);7(I={ZbI{V!skwjOSZI|MX7&7Q|NhFe8&O)JptnDLn-(vXQonB{ zalJFv(QyS&ffi6AcicnDdBc$zb~|^zVbl1w)K#YxZP~KL(#k551sKQ7fWC*qdMzn{ z?1E!nr+S*SceS*XGReRG+Q08P`4@|SbhMgS zhWxpwzf1r0i-y)#Txxy3v-hbIEkMcz5QDq6k}3u94onOTl1e?WOF$w!I7C}&e0k(L zTY`EA>qFD=r+4qZ!8IFK%#f!2?32DY5$^oFyvK!mA`3a)E>zsj2w8 z$gN0NnV8HV z@N1+VA0Hn^Bup_RCUPykVVj2!8^-1f9C+=tr8j2zlx|s&|>iDadFCR3;uwM}R zdZP73+@+|c4PcqLF2uxI=+*w1eT$g}*va(w5z5Ntw{C43n^Ii7QA=gIQq}5wKcA*< z2URt-%I0-Sr5t0PB0bRf`t`D*>tO@PL3j?f=Efx_|H#yKLLR;u$&Bmw`8bSE6#5Y{ ziKEDrkhH>v07;4R4WKLg=!7sDXv(m7j#M;o@%X2%s(d8_u?QGRJ2x%Cjg5`Zo=qMz zDy{{>Eq}||ZSTwFujGjb;F;k)-7B>P!VX)c8~UD7DXSaq zSXE|n@B?1OxN;nJBNlqNI+go)6*?!L;$m*ZN;910Mgg2VckVkmt4p%AtE0?vVjcksA|Qe@jjsKWwJ>3l;*Raxn_F84 z>Cou!>!V|9R>9YB-mVoBD(_cT)?qB;A1Fg^%Ve*1%h9yRqgh!SSR2$i_d)-jOiycV zW-JJ=p!8$}18muts(wEVl(>+cO<3CQvpddgV{w2aJltZniKpqe{{H?1XJB%enTtu; zmJ4`(guCwFb+oXwv0YzJkI&<3%td)cv<9`1e4&XV67p%^|@h{9D}z z74O^ul|z;;E-pzPZf@4Dj#(K;U~LbD4!o`TV$gE^!cX7M@dU+OXy|oBUGtrE@B7;_ zG;gTl_KEY(Fasoh!9Rx&)GAi)Q}-Wr`bB=pnGtJ8e0tOr;_W|Y7jWI58l(QJU)0&* zAh`K_y5L~#4Hzs?0zM_>^3^av-GJ^+W4~u!7#s=z9(Ay_|_-Z!gTsZ!
    CGpA;~{6k?)6Xzc&^3Q}_(`Jr(~_|f~%Oj`mjATfN?Ukyo5i-4=?gc7{2Mx6$94b! literal 0 HcmV?d00001 From 3743a339f5652165d8f61cd11be8bd68f8057641 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 29 Nov 2020 19:49:03 +0300 Subject: [PATCH 13/17] Added Examples. --- ...main-Driven-Design-Implementation-Guide.md | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) diff --git a/docs/en/Domain-Driven-Design-Implementation-Guide.md b/docs/en/Domain-Driven-Design-Implementation-Guide.md index 606347adcb..ab8fe8cdad 100644 --- a/docs/en/Domain-Driven-Design-Implementation-Guide.md +++ b/docs/en/Domain-Driven-Design-Implementation-Guide.md @@ -1799,3 +1799,124 @@ To be more clear about the implementation, you can create different projects (`. * `IssueTracker.Public.Application` & `IssueTracker.Public.Application.Contracts` projects for the Public Web Application. * `IssueTracker.Mobile.Application` & `IssueTracker.Mobile.Application.Contracts` projects for the Public Web Application. +### Examples + +This section contains some Application Service and Domain Service examples to discuss how to decide to place business logic inside these services. + +**Example: Creating a new `Organization` in a Domain Service** + +````csharp +public class OrganizationManager : DomainService +{ + private readonly IRepository _organizationRepository; + private readonly ICurrentUser _currentUser; + private readonly IAuthorizationService _authorizationService; + private readonly IEmailSender _emailSender; + + public OrganizationManager( + IRepository organizationRepository, + ICurrentUser currentUser, + IAuthorizationService authorizationService, + IEmailSender emailSender) + { + _organizationRepository = organizationRepository; + _currentUser = currentUser; + _authorizationService = authorizationService; + _emailSender = emailSender; + } + + public async Task CreateAsync(string name) + { + if (await _organizationRepository.AnyAsync(x => x.Name == name)) + { + throw new BusinessException("IssueTracking:DuplicateOrganizationName"); + } + + await _authorizationService.CheckAsync("OrganizationCreationPermission"); + + Logger.LogDebug($"Creating organization {name} by {_currentUser.UserName}"); + + var organization = new Organization(); + + await _emailSender.SendAsync( + "systemadmin@issuetracking.com", + "New Organization", + "A new organization created with name: " + name + ); + + return organization; + } +} +```` + +Let's see the `CreateAsync` method part by part to discuss if the code part should be in the Domain Service, or not; + +* **CORRECT**: It first checks for **duplicate organization name** and and throws exception in this case. This is something related to core domain rule and we never allow duplicated names. +* **WRONG**: Domain Services should not perform **authorization**. [Authorization](Authorization.md) should be done in the Application Layer. +* **WRONG**: It logs a message with including the [Current User](CurrentUser.md)'s `UserName`. Domain service should not be depend on the Current User. Domain Services should be usable even if there is no user in the system. Current User (Session) should be a Presentation/Application Layer related concept. +* **WRONG**: It sends an [email](Emailing.md) about this new organization creation. We think this is also a use case specific business logic. You may want to create different type of emails in different use cases or don't need to send emails in some cases. + +**Example: Creating a new `Organization` in an Application Service** + +````csharp +public class OrganizationAppService : ApplicationService +{ + private readonly OrganizationManager _organizationManager; + private readonly IPaymentService _paymentService; + private readonly IEmailSender _emailSender; + + public OrganizationAppService( + OrganizationManager organizationManager, + IPaymentService paymentService, + IEmailSender emailSender) + { + _organizationManager = organizationManager; + _paymentService = paymentService; + _emailSender = emailSender; + } + + [UnitOfWork] + [Authorize("OrganizationCreationPermission")] + public async Task CreateAsync(CreateOrganizationDto input) + { + await _paymentService.ChargeAsync( + CurrentUser.Id, + GetOrganizationPrice() + ); + + var organization = await _organizationManager.CreateAsync(input.Name); + + await _emailSender.SendAsync( + "systemadmin@issuetracking.com", + "New Organization", + "A new organization created with name: " + input.Name + ); + + return organization; // !!! + } + + private double GetOrganizationPrice() + { + return 42; //Gets from somewhere else... + } +} +```` + +Let's see the `CreateAsync` method part by part to discuss if the code part should be in the Application Service, or not; + +* **CORRECT**: Application Service methods should be unit of work (transactional). ABP's [Unit Of Work](Unit-Of-Work.md) system makes this automatic (even without need to add `[UnitOfWork]` attribute for the Application Services). +* **CORRECT**: [Authorization](Authorization.md) should be done in the application layer. Here, it is done by using the `[Authorize]` attribute. +* **CORRECT**: Payment (an infrastructure service) is called to charge money for this operation (Creating an Organization is a paid thing in our business). +* **CORRECT**: We can send [email](Emailing.md) as a notification to the system admin. +* **WRONG**: Do not return entities from the Application Services. Return a DTO instead. + +**Discussion: Why not moving the payment logic inside the domain service?** + +You may wonder why the payment code is not inside the `OrganizationManager`. It is an **important thing** and we never want to **miss the payment**. + +However, **being important is not sufficient** to consider a code as a Core Business Logic. We may have **other use cases** where we don't charge money to create a new Organization. Examples; + +* An admin user can use a Back Office Application to create a new organization without any payment. +* A background-working data import/integration/synchronization system may also need to create organizations without any payment operation. + +As you see, **payment is not a necessary operation to create a valid organization**. It is a use case specific application logic. \ No newline at end of file From 6171170a505afcc87f7f0ccf8f19dad5b1942564 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 29 Nov 2020 19:52:28 +0300 Subject: [PATCH 14/17] Update Domain-Driven-Design-Implementation-Guide.md --- docs/en/Domain-Driven-Design-Implementation-Guide.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/en/Domain-Driven-Design-Implementation-Guide.md b/docs/en/Domain-Driven-Design-Implementation-Guide.md index ab8fe8cdad..d405ceb0ac 100644 --- a/docs/en/Domain-Driven-Design-Implementation-Guide.md +++ b/docs/en/Domain-Driven-Design-Implementation-Guide.md @@ -1919,4 +1919,12 @@ However, **being important is not sufficient** to consider a code as a Core Busi * An admin user can use a Back Office Application to create a new organization without any payment. * A background-working data import/integration/synchronization system may also need to create organizations without any payment operation. -As you see, **payment is not a necessary operation to create a valid organization**. It is a use case specific application logic. \ No newline at end of file +As you see, **payment is not a necessary operation to create a valid organization**. It is a use case specific application logic. + +## Reference Books + +If you seriously interest in the Domain Driven Design and building large scale enterprise systems, the following books are suggested as reference books; + +* "*Domain Driven Design*" by Eric Evans +* "*Implementing Domain Driven Design*" by Vaughn Vernon +* "*Clean Architecture*" by Robert C. Martin \ No newline at end of file From 5c328c066f8f2011327400dbad7dd356f2d5c961 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 29 Nov 2020 20:20:29 +0300 Subject: [PATCH 15/17] Added Example: CRUD Operations --- ...main-Driven-Design-Implementation-Guide.md | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/docs/en/Domain-Driven-Design-Implementation-Guide.md b/docs/en/Domain-Driven-Design-Implementation-Guide.md index d405ceb0ac..87733c7bad 100644 --- a/docs/en/Domain-Driven-Design-Implementation-Guide.md +++ b/docs/en/Domain-Driven-Design-Implementation-Guide.md @@ -1885,6 +1885,8 @@ public class OrganizationAppService : ApplicationService ); var organization = await _organizationManager.CreateAsync(input.Name); + + await _organizationManager.InsertAsync(organization); await _emailSender.SendAsync( "systemadmin@issuetracking.com", @@ -1907,6 +1909,7 @@ Let's see the `CreateAsync` method part by part to discuss if the code part shou * **CORRECT**: Application Service methods should be unit of work (transactional). ABP's [Unit Of Work](Unit-Of-Work.md) system makes this automatic (even without need to add `[UnitOfWork]` attribute for the Application Services). * **CORRECT**: [Authorization](Authorization.md) should be done in the application layer. Here, it is done by using the `[Authorize]` attribute. * **CORRECT**: Payment (an infrastructure service) is called to charge money for this operation (Creating an Organization is a paid thing in our business). +* **CORRECT**: Application Service method is responsible to save changes to the database. * **CORRECT**: We can send [email](Emailing.md) as a notification to the system admin. * **WRONG**: Do not return entities from the Application Services. Return a DTO instead. @@ -1921,6 +1924,49 @@ However, **being important is not sufficient** to consider a code as a Core Busi As you see, **payment is not a necessary operation to create a valid organization**. It is a use case specific application logic. +**Example: CRUD Operations** + +````csharp +public class IssueAppService +{ + private readonly IssueManager _issueManager; + + public IssueAppService(IssueManager issueManager) + { + _issueManager = issueManager; + } + + public async Task GetAsync(Guid id) + { + return await _issueManager.GetAsync(id); + } + + public async Task CreateAsync(IssueCreationDto input) + { + await _issueManager.CreateAsync(input); + } + + public async Task UpdateAsync(UpdateIssueDto input) + { + await _issueManager.UpdateAsync(input); + } + + public async Task DeleteAsync(Guid id) + { + await _issueManager.DeleteAsync(id); + } +} +```` + +This Application Service **does nothing** itself and **delegates all the work** to the *Domain Service*. It even passes the DTOs to the `IssueManager`. + +* **Do not** create Domain Service methods just for simple **CRUD** operations **without any domain logic**. +* **Never** pass **DTOs** to or return **DTOs** from the Domain Services. + +Application Services can directly work with repositories to query, create, update or delete data unless there are some domain logics should be performed during these operations. In such cases, create Domain Service methods, but only for those really necessary. + +> Do not create such CRUD domain service methods just by thinking that they may be needed in the future ([YAGNI](https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it))! Do it when you need and refactor the existing code. Since the Application Layer gracefully abstracts the Domain Layer, the refactoring process doesn't affect the UI Layer and other clients. + ## Reference Books If you seriously interest in the Domain Driven Design and building large scale enterprise systems, the following books are suggested as reference books; From 2ec04eb981da52fd95ab4cf632ef5dc3882b956b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 29 Nov 2020 20:22:19 +0300 Subject: [PATCH 16/17] Update Domain-Driven-Design-Implementation-Guide.md --- docs/en/Domain-Driven-Design-Implementation-Guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Domain-Driven-Design-Implementation-Guide.md b/docs/en/Domain-Driven-Design-Implementation-Guide.md index 87733c7bad..7c0999e975 100644 --- a/docs/en/Domain-Driven-Design-Implementation-Guide.md +++ b/docs/en/Domain-Driven-Design-Implementation-Guide.md @@ -1797,7 +1797,7 @@ To be more clear about the implementation, you can create different projects (`. * `IssueTracker.Admin.Application` & `IssueTracker.Admin.Application.Contacts` projects for the Back Office (admin) Application. * `IssueTracker.Public.Application` & `IssueTracker.Public.Application.Contracts` projects for the Public Web Application. -* `IssueTracker.Mobile.Application` & `IssueTracker.Mobile.Application.Contracts` projects for the Public Web Application. +* `IssueTracker.Mobile.Application` & `IssueTracker.Mobile.Application.Contracts` projects for the Mobile Application. ### Examples From cb7408195b1d0935a90e083238f026c9f2bd2c66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Sun, 29 Nov 2020 20:34:09 +0300 Subject: [PATCH 17/17] Update Domain-Driven-Design-Implementation-Guide.md --- docs/en/Domain-Driven-Design-Implementation-Guide.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/en/Domain-Driven-Design-Implementation-Guide.md b/docs/en/Domain-Driven-Design-Implementation-Guide.md index 7c0999e975..0666b18e07 100644 --- a/docs/en/Domain-Driven-Design-Implementation-Guide.md +++ b/docs/en/Domain-Driven-Design-Implementation-Guide.md @@ -1104,6 +1104,8 @@ The only problem of this design is that `Issue.AssignedUserId` is now open to se While there is a tradeoff between two approaches, we prefer to create Domain Services when the business logic requires to work with external services. +> If you don't have a good reason, we think **there is no need to create interfaces** (like `IIssueManager` for the `IssueManager`) for Domain Services. + ### Application Services An [Application Service](Application-Services.md) is a stateless service that implements **use cases** of the application. An application service typically **gets and returns DTOs**. It is used by the Presentation Layer. It **uses and coordinates the domain objects** (entities, repositories, etc.) to implement use cases.