From 31022b60f033cfa030b9af16544e326d29a46a8b Mon Sep 17 00:00:00 2001 From: Daniel Oliveira Date: Sun, 19 May 2024 15:35:33 -0300 Subject: [PATCH] Releases/1.0.0 preview1 (#1) - add apply rule & rules - add open rule & rules - add CI workflow - add readme - add logos --- .github/workflows/blank.yml | 36 --- .github/workflows/ci.yml | 58 +++++ .gitignore | 57 +++++ LICENSE | 21 ++ README.md | 158 +++++++++++- assets/br-logo-ascii.png | Bin 0 -> 87769 bytes assets/br-logo.png | Bin 0 -> 31503 bytes docs/.gitkeep | 0 nupkgs/GetBuildVersion.psm1 | 34 +++ samples/.gitkeep | 0 src/.editorconfig | 228 ++++++++++++++++++ .../Analyzers/AnalyzerAndFixerTest.cs | 95 ++++++++ .../Analyzers/AnalyzerRunnerTest.cs | 127 ++++++++++ src/ByReplace.Test/Analyzers/AnalyzerTest.cs | 70 ++++++ .../Analyzers/DocumentFixTest.cs | 109 +++++++++ .../Builders/BrConfigurationBuilderTest.cs | 67 +++++ src/ByReplace.Test/ByReplace.Test.csproj | 47 ++++ .../Apply/Parameters/ApplyParameterTest.cs | 64 +++++ .../Apply/Rule/ApplyRuleCommandTest.cs | 68 ++++++ .../Apply/Rule/ApplyRuleParameterTest.cs | 80 ++++++ .../Apply/Rules/ApplyRulesCommandTest.cs | 62 +++++ .../Commands/Command/CompositeCommandTest.cs | 39 +++ .../Commands/Logo/PrintLogoCommandTest.cs | 55 +++++ .../Rule/ListRules/ListRulesCommandTest.cs | 65 +++++ .../Rule/ListRules/ListRulesParameterTest.cs | 47 ++++ .../Commands/Rule/ListRules/RulesBoxTest.cs | 101 ++++++++ .../Rule/OpenRule/OpenRuleCommandTest.cs | 87 +++++++ .../Rule/OpenRule/OpenRuleParameterTest.cs | 6 + .../Commands/Rule/OpenRule/RuleBoxTest.cs | 105 ++++++++ .../TimerFinish/TimerFinishCommandTest.cs | 29 +++ .../Commands/Version/NugetVersionTest.cs | 32 +++ .../Commands/Version/VersionCommandTest.cs | 6 + src/ByReplace.Test/Common/Asserts/AssertBr.cs | 16 ++ .../Common/ConfigMock/BrContentFactory.cs | 58 +++++ .../Common/ConfigMock/ContentSyntax.cs | 33 +++ .../Common/ConfigMock/ReplacementSyntax.cs | 18 ++ .../Common/ConfigMock/RuleSyntax.cs | 76 ++++++ .../Common/FolderMock/FileSyntax.cs | 30 +++ .../Common/FolderMock/FolderSyntax.cs | 63 +++++ .../FolderMock/PathCompilationSyntax.cs | 103 ++++++++ .../Common/FolderMock/PathFactory.cs | 7 + .../Common/Helpers/FileInspect.cs | 34 +++ .../Mappers/DirectoryThreeTest.cs | 96 ++++++++ .../Matches/ExtensionMatchTest.cs | 39 +++ src/ByReplace.Test/Matches/SkipMatchTest.cs | 53 ++++ .../Models/BrConfigurationTest.cs | 117 +++++++++ src/ByReplace.Test/Usings.cs | 0 src/ByReplace.sln | 39 +++ src/ByReplace/Analyzers/Analises.cs | 7 + src/ByReplace/Analyzers/Analyzer.cs | 28 +++ src/ByReplace/Analyzers/AnalyzerAndFixer.cs | 61 +++++ src/ByReplace/Analyzers/AnalyzerRunner.cs | 29 +++ src/ByReplace/Analyzers/DocumentFix.cs | 58 +++++ .../Builders/BrConfigurationBuilder.cs | 70 ++++++ src/ByReplace/ByReplace.csproj | 70 ++++++ .../Apply/Parameters/ApplyParameter.cs | 12 + .../Commands/Apply/Rule/ApplyRuleCommand.cs | 32 +++ .../Commands/Apply/Rule/ApplyRuleParameter.cs | 9 + .../Commands/Apply/Rules/ApplyRulesCommand.cs | 27 +++ .../Commands/Command/CompositeCommand.cs | 21 ++ src/ByReplace/Commands/Command/ICommand.cs | 9 + .../Commands/Logo/PrintLogoCommand.cs | 44 ++++ .../Rule/ListRules/ListRulesCommand.cs | 22 ++ .../Rule/ListRules/ListRulesParameter.cs | 7 + .../Commands/Rule/ListRules/RulesBox.cs | 60 +++++ .../Commands/Rule/OpenRule/OpenRuleCommand.cs | 37 +++ .../Rule/OpenRule/OpenRuleParameter.cs | 10 + .../Commands/Rule/OpenRule/RuleBox.cs | 64 +++++ .../TimerFinish/TimerFinishCommand.cs | 18 ++ .../Commands/Version/NugetVersion.cs | 70 ++++++ .../Commands/Version/VersionCommand.cs | 18 ++ src/ByReplace/Common/PathFixer.cs | 49 ++++ .../Exceptions/GlobalHandleException.cs | 38 +++ src/ByReplace/Exceptions/NotFoundException.cs | 15 ++ .../Exceptions/RuleNotFoundException.cs | 27 +++ src/ByReplace/GlobalUsings.cs | 25 ++ src/ByReplace/Mappers/DirectoryThree.cs | 59 +++++ src/ByReplace/Mappers/FileMapper.cs | 4 + src/ByReplace/Matches/ExtensionMatch.cs | 16 ++ src/ByReplace/Matches/Match.cs | 6 + src/ByReplace/Matches/SkipMatch.cs | 68 ++++++ src/ByReplace/Models/BrConfiguration.cs | 55 +++++ src/ByReplace/Models/Replacement.cs | 4 + src/ByReplace/Models/Rule.cs | 8 + src/ByReplace/Printers/IBox.cs | 10 + src/ByReplace/Printers/IPrint.cs | 12 + src/ByReplace/Printers/IPrintBox.cs | 6 + src/ByReplace/Printers/PrintBox.cs | 34 +++ src/ByReplace/Printers/PrintConsole.cs | 54 +++++ src/ByReplace/Printers/PrinterKonsole.cs | 84 +++++++ src/ByReplace/Program.cs | 134 ++++++++++ src/ByReplace/brconfig.json | 16 ++ src/Dockerfile | 12 + src/makefile | 29 +++ 94 files changed, 4246 insertions(+), 37 deletions(-) delete mode 100644 .github/workflows/blank.yml create mode 100644 .github/workflows/ci.yml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 assets/br-logo-ascii.png create mode 100644 assets/br-logo.png create mode 100644 docs/.gitkeep create mode 100644 nupkgs/GetBuildVersion.psm1 create mode 100644 samples/.gitkeep create mode 100644 src/.editorconfig create mode 100644 src/ByReplace.Test/Analyzers/AnalyzerAndFixerTest.cs create mode 100644 src/ByReplace.Test/Analyzers/AnalyzerRunnerTest.cs create mode 100644 src/ByReplace.Test/Analyzers/AnalyzerTest.cs create mode 100644 src/ByReplace.Test/Analyzers/DocumentFixTest.cs create mode 100644 src/ByReplace.Test/Builders/BrConfigurationBuilderTest.cs create mode 100644 src/ByReplace.Test/ByReplace.Test.csproj create mode 100644 src/ByReplace.Test/Commands/Apply/Parameters/ApplyParameterTest.cs create mode 100644 src/ByReplace.Test/Commands/Apply/Rule/ApplyRuleCommandTest.cs create mode 100644 src/ByReplace.Test/Commands/Apply/Rule/ApplyRuleParameterTest.cs create mode 100644 src/ByReplace.Test/Commands/Apply/Rules/ApplyRulesCommandTest.cs create mode 100644 src/ByReplace.Test/Commands/Command/CompositeCommandTest.cs create mode 100644 src/ByReplace.Test/Commands/Logo/PrintLogoCommandTest.cs create mode 100644 src/ByReplace.Test/Commands/Rule/ListRules/ListRulesCommandTest.cs create mode 100644 src/ByReplace.Test/Commands/Rule/ListRules/ListRulesParameterTest.cs create mode 100644 src/ByReplace.Test/Commands/Rule/ListRules/RulesBoxTest.cs create mode 100644 src/ByReplace.Test/Commands/Rule/OpenRule/OpenRuleCommandTest.cs create mode 100644 src/ByReplace.Test/Commands/Rule/OpenRule/OpenRuleParameterTest.cs create mode 100644 src/ByReplace.Test/Commands/Rule/OpenRule/RuleBoxTest.cs create mode 100644 src/ByReplace.Test/Commands/TimerFinish/TimerFinishCommandTest.cs create mode 100644 src/ByReplace.Test/Commands/Version/NugetVersionTest.cs create mode 100644 src/ByReplace.Test/Commands/Version/VersionCommandTest.cs create mode 100644 src/ByReplace.Test/Common/Asserts/AssertBr.cs create mode 100644 src/ByReplace.Test/Common/ConfigMock/BrContentFactory.cs create mode 100644 src/ByReplace.Test/Common/ConfigMock/ContentSyntax.cs create mode 100644 src/ByReplace.Test/Common/ConfigMock/ReplacementSyntax.cs create mode 100644 src/ByReplace.Test/Common/ConfigMock/RuleSyntax.cs create mode 100644 src/ByReplace.Test/Common/FolderMock/FileSyntax.cs create mode 100644 src/ByReplace.Test/Common/FolderMock/FolderSyntax.cs create mode 100644 src/ByReplace.Test/Common/FolderMock/PathCompilationSyntax.cs create mode 100644 src/ByReplace.Test/Common/FolderMock/PathFactory.cs create mode 100644 src/ByReplace.Test/Common/Helpers/FileInspect.cs create mode 100644 src/ByReplace.Test/Mappers/DirectoryThreeTest.cs create mode 100644 src/ByReplace.Test/Matches/ExtensionMatchTest.cs create mode 100644 src/ByReplace.Test/Matches/SkipMatchTest.cs create mode 100644 src/ByReplace.Test/Models/BrConfigurationTest.cs create mode 100644 src/ByReplace.Test/Usings.cs create mode 100644 src/ByReplace.sln create mode 100644 src/ByReplace/Analyzers/Analises.cs create mode 100644 src/ByReplace/Analyzers/Analyzer.cs create mode 100644 src/ByReplace/Analyzers/AnalyzerAndFixer.cs create mode 100644 src/ByReplace/Analyzers/AnalyzerRunner.cs create mode 100644 src/ByReplace/Analyzers/DocumentFix.cs create mode 100644 src/ByReplace/Builders/BrConfigurationBuilder.cs create mode 100644 src/ByReplace/ByReplace.csproj create mode 100644 src/ByReplace/Commands/Apply/Parameters/ApplyParameter.cs create mode 100644 src/ByReplace/Commands/Apply/Rule/ApplyRuleCommand.cs create mode 100644 src/ByReplace/Commands/Apply/Rule/ApplyRuleParameter.cs create mode 100644 src/ByReplace/Commands/Apply/Rules/ApplyRulesCommand.cs create mode 100644 src/ByReplace/Commands/Command/CompositeCommand.cs create mode 100644 src/ByReplace/Commands/Command/ICommand.cs create mode 100644 src/ByReplace/Commands/Logo/PrintLogoCommand.cs create mode 100644 src/ByReplace/Commands/Rule/ListRules/ListRulesCommand.cs create mode 100644 src/ByReplace/Commands/Rule/ListRules/ListRulesParameter.cs create mode 100644 src/ByReplace/Commands/Rule/ListRules/RulesBox.cs create mode 100644 src/ByReplace/Commands/Rule/OpenRule/OpenRuleCommand.cs create mode 100644 src/ByReplace/Commands/Rule/OpenRule/OpenRuleParameter.cs create mode 100644 src/ByReplace/Commands/Rule/OpenRule/RuleBox.cs create mode 100644 src/ByReplace/Commands/TimerFinish/TimerFinishCommand.cs create mode 100644 src/ByReplace/Commands/Version/NugetVersion.cs create mode 100644 src/ByReplace/Commands/Version/VersionCommand.cs create mode 100644 src/ByReplace/Common/PathFixer.cs create mode 100644 src/ByReplace/Exceptions/GlobalHandleException.cs create mode 100644 src/ByReplace/Exceptions/NotFoundException.cs create mode 100644 src/ByReplace/Exceptions/RuleNotFoundException.cs create mode 100644 src/ByReplace/GlobalUsings.cs create mode 100644 src/ByReplace/Mappers/DirectoryThree.cs create mode 100644 src/ByReplace/Mappers/FileMapper.cs create mode 100644 src/ByReplace/Matches/ExtensionMatch.cs create mode 100644 src/ByReplace/Matches/Match.cs create mode 100644 src/ByReplace/Matches/SkipMatch.cs create mode 100644 src/ByReplace/Models/BrConfiguration.cs create mode 100644 src/ByReplace/Models/Replacement.cs create mode 100644 src/ByReplace/Models/Rule.cs create mode 100644 src/ByReplace/Printers/IBox.cs create mode 100644 src/ByReplace/Printers/IPrint.cs create mode 100644 src/ByReplace/Printers/IPrintBox.cs create mode 100644 src/ByReplace/Printers/PrintBox.cs create mode 100644 src/ByReplace/Printers/PrintConsole.cs create mode 100644 src/ByReplace/Printers/PrinterKonsole.cs create mode 100644 src/ByReplace/Program.cs create mode 100644 src/ByReplace/brconfig.json create mode 100644 src/Dockerfile create mode 100644 src/makefile diff --git a/.github/workflows/blank.yml b/.github/workflows/blank.yml deleted file mode 100644 index 18a6a3e..0000000 --- a/.github/workflows/blank.yml +++ /dev/null @@ -1,36 +0,0 @@ -# This is a basic workflow to help you get started with Actions - -name: CI - -# Controls when the workflow will run -on: - # Triggers the workflow on push or pull request events but only for the "main" branch - push: - branches: [ "main" ] - pull_request: - branches: [ "main" ] - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -# A workflow run is made up of one or more jobs that can run sequentially or in parallel -jobs: - # This workflow contains a single job called "build" - build: - # The type of runner that the job will run on - runs-on: ubuntu-latest - - # Steps represent a sequence of tasks that will be executed as part of the job - steps: - # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v3 - - # Runs a single command using the runners shell - - name: Run a one-line script - run: echo Hello, world! - - # Runs a set of commands using the runners shell - - name: Run a multi-line script - run: | - echo Add other actions to build, - echo test, and deploy your project. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..34e2e58 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,58 @@ +name: ci + +on: + push: + tags: + - v* + branches: [main, releases/*] + pull_request: + branches: [main, feature/*, releases/*] + +jobs: + build: + env: + APP: "${{ github.workspace }}/src" + PROJECT_TEST: "${{ github.workspace }}/src/ByReplace.Test" + PROJECT_SLN: "./src/ByReplace.sln" + + runs-on: ubuntu-latest + strategy: + matrix: + dotnet-version: ["8.0.*"] + + steps: + - uses: actions/checkout@v2 + + - name: Get Build Version 🏷️ + run: | + Import-Module .\nupkgs\GetBuildVersion.psm1 + Write-Host $Env:GITHUB_REF + $version = GetBuildVersion -VersionString $Env:GITHUB_REF + echo "BUILD_VERSION=$version" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf-8 -Append + shell: pwsh + + - name: Setup NuGet πŸ”§ + uses: NuGet/setup-nuget@v1.0.5 + + - name: Setup .NET Core SDK ${{ matrix.dotnet-version }} πŸ”§ + uses: actions/setup-dotnet@v1 + with: + dotnet-version: ${{ matrix.dotnet-version }} + + - name: Install dotnet-format tool πŸ”§ + run: dotnet tool install -g dotnet-format + + - name: Clean Dependencies πŸ“¦ + run: dotnet clean ${{env.PROJECT_SLN }} + + - name: Restore Dependencies πŸ“¦ + run: dotnet restore ${{env.PROJECT_SLN }} + + - name: Build βš™οΈ + run: dotnet build ${{env.PROJECT_SLN }} -c Release -p:Version=$BUILD_VERSION --no-restore + + - name: Format ♻️ + run: dotnet format ${{env.APP }} -v diag --severity error --no-restore + + - name: Test πŸ§ͺ + run: dotnet test ${{env.PROJECT_SLN }} --configuration Release --no-build --verbosity normal /p:CollectCoverage=true /p:CoverletOutputFormat=opencover diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..926eac4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,57 @@ +.vs +*/.vs +*/.vs/ +*/.vs/* + +.vscode +*/.vscode +*/.vscode/ +*/.vscode/* + +codeium_api_key +*/.easyTdd +.config +.idea + +bin +*/bin* +*/bin/* +*/bin/ + +obj +*/obj* +*/obj/* +*/obj/ + +StrykerOutput +*/StrykerOutput* +*/StrykerOutput/* +*/StrykerOutput/ + +src/**/nupkg/* +*/src/*/nupkg/* +.user +*.user* + +node_modules +*/node_modules + +*.lock +*.lock* + +BenchmarkDotNet.Artifacts +BenchmarkDotNet.Artifacts/* +*/BenchmarkDotNet.Artifacts/* + +.sarif +.sarif/* +*/.sarif +*/.sarif/* + +infer-out/* +*/infer-out + +diagram.html + +.cr +.cr/* diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..6ef3a0e --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 SpinnerAlloc + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index ce27483..c8f0041 100644 --- a/README.md +++ b/README.md @@ -1 +1,157 @@ -# ByReplace \ No newline at end of file +
+ ByReplace Logo +
+ +# + +[![Contributors](https://img.shields.io/github/contributors/Daniel-iel/ByReplace)](https://www.nuget.org/packages/ByReplace/) +[![Activity](https://img.shields.io/github/commit-activity/m/Daniel-iel/ByReplace)](https://www.nuget.org/packages/ByReplace/) +[![CI](https://github.com/Daniel-iel/ByReplace/actions/workflows/ci.yml/badge.svg)](https://github.com/Daniel-iel/ByReplace/actions/workflows/ci.yml/badge.svg/) +[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE.md) +[![Downloads](https://img.shields.io/nuget/dt/ByReplace)](https://www.nuget.org/packages/ByReplace/) +[![Release](https://img.shields.io/nuget/v/ByReplace)](https://www.nuget.org/packages/ByReplace/) +[![Repo Size](https://img.shields.io/github/repo-size/Daniel-iel/ByReplace)](https://www.nuget.org/packages/ByReplace/) + +# About + +**ByReplace** is a powerful command-line interface (CLI) tool designed for efficiently executing find-and-replace operations within source files. This versatile utility enables users to seamlessly modify text within their codebase, enhancing productivity and streamlining development processes. Whether you're updating variable names, correcting typos, or implementing sweeping changes across multiple files, ByReplace has you covered. + +# Get Started + +To run ByReplace, you need [Dotnet 8](https://dotnet.microsoft.com/en-us/download). After installing the NuGet package, navigate to your terminal and execute the command `br -v`. If the installation was successful, the following text will be displayed in your terminal: + +```shell +br + +Commands: + apply Apply commands + rule Rule commands + +Options: + -h, --help Show help message + --version Show version +``` + +# Installation + +ByReplace is delivered via NuGet. + +```shell +dotnet install -g ByReplace +``` + +# Creating the Configuration File + +Create a configuration file with the following structure: + +```shell +{ + "Path": "", + "SkipDirectories": [""], + "Rules": [ + { + "Name": "", + "Description": "", + "Skip": ["", ""], + "Extensions": ["", ""], + "Replacement": { + "Old": ["", ""], + "New": "" + } + } + ] +} +``` + +# JSON Configuration Documentation + +This document provides a detailed explanation of the structure and purpose of each field within the provided JSON configuration file. + +## Path +- Type: String +- Purpose: Specifies the path where the operation should be performed. This can be a directory path or a file path depending on the context of the operation. +- Example: "C:\Users\User\Documents" + +## SkipDirectories +- Type: Array of Strings +- Purpose: Lists directories that should be skipped during the operation. Each entry in the array represents a directory path. +- Example: ["Temp", "Logs"] + +## Rules +- Type: Array of Objects +- Purpose: Defines a set of rules to apply during the operation. Each rule object contains specific configurations for how files or directories should be handled. + +## Name +- Type: String +- Purpose: A descriptive name for the rule. Used for identification purposes. +- Example: "BackupRule" + +## Description +- Type: String +- Purpose: Provides a brief description of what the rule does. +- Example: "Moves all .txt files to the backup folder." + +## Skip +- Type: Array of Strings +- Purpose: Lists specific files or patterns of files to skip when applying this rule. Useful for excluding certain types of files from being processed. +- Example: [".tmp", "~"] + +## Extensions +- Type: Array of Strings +- Purpose: Specifies the file extensions that this rule applies to. Only files with these extensions will be considered for processing according to this rule. +- Example: [".docx", ".pdf"] + +## Replacement +- Type: Object +- Purpose: Contains configurations for replacing parts of the file paths or names as per the rule's requirements. + +### Old +- Type: Array of Strings +- Purpose: Lists the old strings or patterns that should be replaced in the file paths or names. +- Example: ["temp", "backup"] + +### New +- Type: String +- Purpose: The new string or pattern that replaces the old ones specified in the Old array. +- Example: "archive" + +# Commands + +## Apply + +`apply rule`: Executes a specific rule from the configuration file. + +- `-r`: Rule's name. +- `-p`: Path of files to execute the apply. +- `-f`: Folder's path that contains the configuration file. + +```bash +br apply rule -r "Rule" -p "C:/three_files" -f "C:/" +``` + +`apply rules`: Executes all rules from the configuration file. +- `-p`: Path of files to execute the apply. +- `-f`: Folder's path that contains the configuration file. + +```bash +br apply rules -p "C:/three_files" -f "C:/" +``` + +## Rule + +`rule list-rules`: Lists all rules from the configuration file. + +- `-f`: Folder's path that contains the configuration file. + +```bash +br rule list-rules -f "C:/" +``` + +`rule open-rule`: Gets a rule by its name. + +- `-n`: Rule's name. +- `-f`: Folder's path that contains the configuration file. + +```bash +br rule open-rule -n "rule name" -f "C:/" +``` \ No newline at end of file diff --git a/assets/br-logo-ascii.png b/assets/br-logo-ascii.png new file mode 100644 index 0000000000000000000000000000000000000000..29bcaaa042848ab02a18835b9aad677f29a4ab03 GIT binary patch literal 87769 zcmcdyQFz`-$ce*3VL<@^ z0KiI0h$sO704Dr*K7#=J&obNr0RDFYVJR%EASouh;0BdYn;17NCuBs9juN>12C%`_ z!C5*1;m&+tavBN-Yzaq@W=LTMVdP-$0Q7-hMBZm=I~Vt~-w-`|f43k`u|rwq_F zlS_yXv4rV_p%h4z2jdAd0plf*h8PSOOc;y_P`1j?FK)B1@V}@?iU_KB=w1JScbC4Y z?neLZ_I_C^lStbMFo3kP3p{oZLjDO5AP6zGPw6(Tu=LqkFa8ceC>I&I#5?bv_#=kImBWhyqSmRY*!d0$O$n6K$;Tk~FN z&M}#NXyFB(AZq+S7>)_z{hZ@BZNIJ~7NBU)%j401^=udSb0^lGAZg+To*;6M5H#2c z$vpde7dKoV^VV4GF|t_q?c0o@y5lj%VPx*ON5{R6O~WOAHayk>Jjv#P6OWw_pQy%R ztYg}2WaSGvbp9zPh#bk{{rt&&+fz4PFR_q*eluIWnCd^Nf(Xw~EUcPo9b^vOdB#BL z0mUpX-jT`Rj;#02Fw!%ST#EFVa%2O=`5hO#_-EW>^lf)N-=69JdzfAxaf6M3T(YP2 znd5s2<}x@nbv1mK?-7S1X`FE|A*1Fw228{Q4~$q&I`i*NJvW)F&JtGHN|w0{mU*dW zG7H{>cCb44%c|w$zcl{Q|GbRv$K(N;0y{>LxwYAS@kIs{9nmw;IgHtkjU;nICUdr2 zb0H3jQ?hv6X3iztSC!BxbO|ROW<2umxB#c@J0m+~JKh~|(6GWHhmt|zPaG?4Vw@;J zCM(~+qU}3*gurP-Bv=D?vCauQYTS>uW{d|$r)ayiKt@^9!Sh~{Yk&53)W4MH-gVyr zhW?n(bqTs|_dQpiho;3&KxWtgPqw3dDGCYA&%f~i?ioq+QHYGaYRcNtWTprwyYe0- zE;m$S18!G7b)9aw4KLx(DZFss>Q|3^Ag&2dI>Ef!nz2rMxpJ3d$_B4~pbL4oe|NP;pS-_^ZHiB{a zvVHi=bNGhjpW^_u(f+?I$#VvQJ8|S>jH}MUqf69gGUQ?KbeM;sDs(gfL3=(9{%B~D zV3_TcGJ7(ta-G5NVdMYMZrz0R^4ey9+(ns-#hd%Of%+JTyGVDKT8G|r&g7hm?ELXL zpU&!DG?{4PPZq$Acf~$xdWpTd*PO1-Y3Smyo#XxAM{(50nQ=kT?KqyOj+2)=Vl`_Er+k?Q^wme zO)G7{dLL@frv45s)c28pvNNm!L{PgaHJ=t%|0#2h(71q=U51xPam+8#fIdD3bn)bo z5gWyZ{l@+rG@PwGlAc|4NT9BI7_^W2yT7y3NBm66B#lKnvF6=%7KL#N9zGWjKfluq zSsnU)ZB2al`Ni_D@XQMLd^?%+3NF@nKb^+#u$BPD{ZS7US@;<)GWafACs5uTrfGUq*0 zaKDMU8AtEovJ3~gc7eW0HCaQe+sOHkEA zU1{=U&QJqMs;`mdxp-EWd%sP&6Q3~J%(GhQafUzXX*fIG+hX>!vR8}K`RjRX?p@P-_Ph`^8zd~ILYsb%HFTwHkS!&0|8wE@cP@zAD1 zmz$B1%Fq<`%4#0u3f0BAoP&%vHz)ZyXdN$XDLCfPV$KFp70z<9{KuwwO&&~gS`wWh#KS{A<~FVi?~ zR&Dm2u4dTxno@}w+OIEV^^F9PsM;?Id45>Y;&o*jCBNt2ClEl!h{Yr(1QO;X(A)cr zlO_u;)j-QThf==XNB4S60um)S9Emqd2+hKl2@1i(8N!*u3>-Na;3#UHusdXHn^_rf z2o%g9M25|nIOm=;dja(@^-@;70tHFCg#ntT$fFp9AjLw=*S}oWryMd82|1$#V__jD zz7$!Eo}P;-hEDLk@{nFdA9uB?NRJA~6qA9Ba|LGY%%aS#h(0|FWV&j&GvzI~h-=FVia{H7go0$sP-Zu+d>^8VQ>X<57Jd{~Y- z`{p2-v(4>RU9?R_Rg&PL^+$Cnf18{%Eb8hc!-Px4k2`vT3|om(*3sdy&tZ+v0Mrk{ zx*A+9tnk2c6r?UrRg+~N+xmnCei3^#HTD` zpEho>S(d1uIa{oqia%=n*9ia+=Lpa#!?(o}V%lsse)PYvUvKtDpQYRCy3@bu^2i{E z`+ASozNohVVv=PtOMsPXRc;60i=1)>Hzn%N6y2}sH9t(X?YMktAG_N0UQF&~u;xZm z*YA9O!Fj|u0p^`GT0AzaU8xm0acJo1USD}G{e{)_ZP{39@E^1BdzKqq%i=z>$CA{h+vgkjldiyPk1Cg-TyP;jDj5{!ahev zlh%*4DQ#lrowFk}RGE{pM#1iTmuF*w6E$&MRy$91X$_u;B}zNQeI}V!Yg~E9G-mny z!MLMmQH<0zH)M5Uk}Rs2dGFl=+kZTjrQddbn#sQ;A5tgPoXo3l`Psdf#QUKhdzjYt zt4!wrn&G?Rq=IkxTUi zZ~;2TDISPDDI`@m-qCo-yV|Eg>~(Hvwm(isP~0-WNP;l;+0~C}qR1qpBDcK-h0;Kc zPe#6Wsfx@&zCAECEx?f=y>M73-!sD>qjPTFEzq9{wEbZ+LCQ1tjH;0q?6~F*h4LYr zn{Lbc=Tl@9HdF|Mp}i{`E_n!}S+6&K^{5jQ#KulW!YG20csqoPrPJ_{v`7B-Xw`-j z#$konN>>M>$czUwsMRz3s;{H?R&3Aq^#0f8`P8{mH?(HDlWu*&G(8D%WH`ZMzWEZx zKoGrC#;ja#m79 ziK~JUFACr5A^`L@Q>w>sk?jgPz9&Qxqd_%@qG?p_#M~2o z5K>xCOvq1RS~h3Q!~|u%Zmvf!{kP=)h{B|F?jH*BdPz7$a_B+AkHh+BW@r!85R&Yw zZ2VmMz6u=JyM=(mQYn=IfEbx1O3eL5PK^=O(1zdDi|28D6mYZEz@52b!Y}G>tv0t@ z!gyvYr~dd`WVkLl3>E$4&`E*Imn3`CH8MP zQDAXTT{AP=gH&Fdk%k)<&X^mbWk*Sr#{-cGAx#UVhg!9H3mUH46OuZiK$%s?O_T}ge7Y0!MT|4lrchm&3&-IsK zoADu)fejA@xB1z>3cj@~nU7&AO(?7Y?Bf(EO=|4rrzm`**(zY7DybeK0IYtmbJwj} zRMfS(O#Ji@&ZCM!^ANy`vqs>N@@-OBT?Of%7URy;q{?TF;aQ@wogq(Z1e2!zLEn&s z=b)Y~z8>SJIOzfiIH48&X^-SJn~ev(y^tGWvTU1K4`uY--jBaf*3`LjS&G1)mGI&L zDYzL)G$JrU(?HL%EkcMfi<*o)#$Y{gKSK*H1qa_4kqplrzJ|0*ZWoLc9yVY|7tu~m z00D)%fZ8V9FJ5JHX;Gg+vv7MMmj%PXq|{L?gjIRD{gXG@@(m_J5%DfePyaS0W=vNi zG$SOYs|1F#asv(N7geH@4V&@zjK;!o3t4o)(4JUlyvGG7@>CPMR# z*{iya>#!?3mG(X#-Z6;j6Jd@j$(EnfYJSfxRqt8jlZL1iQ0M6ncKe@o_QzGy0Pcqb z8w`Onhcnx?ZQrLfYF>%K9D#{(~C7H`=RT_WRU3m7M(uN%dE?bgSr|S&``^G;D<{Tc74I zVZtx~Y8)Ks#Lew|wAh^Z5Ss9Q!bfwTV7lQA8VE+dIL>wJ)zfK*sGURr;#39zGp6TM zrs>Zz{TrChyaNe+44BF5R;cQ|C$;72LcJ{&&mPZ1gbtN4SvvzJU*>2ip3Vp0mBCi+E1pFo$(&^j)u$zOI)^-aZ$E zPNG>8fE;d<^5K8X1#(y1?G^O-zTYOhl|R$7@W1IDQBT18zmnxkkZSB@Sx-+-u=QxD z&=_m_9YE=!g?q~1Mk^W|lk_ogGZ`aT!58XRtV^T=usWb|`3lQp)-ei*GpJ36 zWlY_+nc$+JH2Zjp5Dl>yl9H9YJnz_R{P(_65Wi2>yE{==g_Ipeg-0r+z)R#{QPLvB zHXo^Wn8J(fx;mvLSXq~omfc?6Oi4J<@jPb9i>V271789ktbB;_`u+XyEoaS10F(uc z*=-8<1nPI1W$zmNFB|QE#pTvICLA`W3gzGD2?^nvBoFbP0DFSQ`-Uz;mM$Xz>Nj{I zKmveZ0!QUJF+4K`T4vw8%>OcAe_e)vU(`8w9j;!f_xz`BwfTP^HC@Tyl7Desk?i+; zC-T{_2j0j@*)LtYBspW09R3&x=@C<<%^0FIH2pCbs~g7CRcUly%3w`)N5lE2#6Vs3dyjQ%x-x z?K#Yk4YOB={qFD8Y_Ze6ouj|$JoKT>+^@XoEq=ehz;|aslzh)>)A=6XgFw2!o=(q8 zcR|b2r!x*RYWH)(IHY*R2u2l)WEhe~wksFeiykT`C!=xBL`H6wgm@Xzj)1G zO_^0C^S+X|`Mr8m`uJ=NX_<`k%b=Z(QaNP!AdLMQ5geSpJV4|F>YNS*9(qk1Yxpg%TIijA1nO1g!MApd;i zY2v2$v8IBBdpRmms!sN}Wv%cYelvigUzyIYhqA$TJNI1X)3t&v6=uIq7A(njg#?Dp#%9;u(&T=dMf3a1ySq#rmR|BbX63!a(*E z(CpS1*@HA~uNR^L%SU9v>l#ZJ-SEIMM&%1Aq=8S9wRJcfuC9_mfKoT*IT11Qj1;M{+3@rR%Vsh6pw>eEec@M=D2^3Q+nPp(ay}EE{I|BUr zXR=AvIzlO}Z3|;)a!M&jeq$ROfg?shg}`87+A9=E%6F8CRtfuI9bnp?Ac({YzLy2_ z=%K3c)!J_+W*qS&WxxVP8B^PrZSTc=#x|Wembbt0U5}T^cHdIj(9GB!f_v&vE_$0} zURRYd6ksc?_7A!$P1hNI4U?U?LM8^eCkH%^2CvzrRuVV z4^8e*$2{l&qRccBK7g&IG^`9gRd$tZC_ba(QBYUw_sOoSd+$$FINP6H2)>#Y1`B`Z z?=OBHn;bLyP6HfG`OkV-SOiX#Ui@`%6K$gNW+eN}G38}N zQ(9Ml!AAfE{65=)ppIaEX2-l$!kYbimx25a{uJUMfd@`Nk=K~xmPagP*Xsm00&M^L z(szgmhEtIUz``$q)!e%9t;ovrJLPRF%)CeB`t`>-R`3rKn$s@NzDgN(eehfIN&oqM zb|lITJzYjh42X=o8;F-Zhvk6JnvdI0o_e~Zr#yA}KpCBLyZQ%J*Iw(FExXTSRyf?O z(4tl;?*^lO_x^4Ej?Z4$9JulVjH^c3wd(Zm+wO0*HecsOwF!NsM$zvN`pwUms@fT6 znOnpXHVfp4`LnSpdbj%r@nDbqputde*F z-cz{~9$tLJOE?Cw28IWp2RJ6iH0B8OB^#m|dDNRpf-1>4d6dRw%1Vi24rt=NZC?8q z)rEl)cN$$(fdr$cK=Kh*%f1%*bGP_o&;?FJ^s{T&SQ>>f5#{0ji)2E9>^?5FhFk(o zmO8%fbNrNk=eL))Ps%A&_6&%T8zYOb4Bl51CSF5!KEm--3CQyyCKskJA-@Dqumm*e zVC=vUQS6C(4EB%CkN?z+@39a2^kr=ECd`v#OMH?h|mBECRCM)3NIG`JZf3yc42qNJq%;U#*8n5EFmw$ zkK;~`FUcJ{{`4j?*t2i+TWahC)f3muR+(GbKL|Us{*y=28rLWUXIeyY*9=i=6l=(6 zt>%~ZBRgVTRSam7dY68;ZG;eVHZbBagVpZIy#~(!U7L8UyL9N#?*#VxxItd&1{_eO zNRTo{p(K#8k)IPo7bbxfg*an*aU|aj(N_D2utE}l2#@2FLuj z#$0$7?+UVkd4TkJrbu!k`uJstERzV?w(j@+m45p@&w7_vIUgYDQkVyFCeEAP=lfUM z{%>sv?;dTJAFg!cJ25uD=Lp!_f5Ci@{Q_LECfzyADC>V92j!FW(}w0WuuP*ecqOIT{8cb>5SiWCf3)y$Fj&+F}87cq1s- z+m(y0q(Z#7m=ev6>hd4x{n*6e zp+GZyL#Si%aUNb13)V;&x7HuSCaSz>phRrfX-zj*NfY2E{y{)A1yQ8Er&cKl?ki1r z4v4d(%3Zm9h`0qb2T6dbH6>2_O>iK3)4a*Jl)*sP+}=|?o3GIpdSt-m$uV&!ja6&ie!brrL{U zXjLi3bvu5u`j3XmuVNAf=$eve6irr5`ahd-fef@fYbiU)^){+4SB2qu@F*+co(?{g z-~uePY@PvVRM#Ybc}^TWk2cUXBw+ClnS^3HLB)QRxu0ly+m0vw8WEh6O!1{mZ+MdU zN&3Cs(?0r?rZw#uK)Efzt9E$#ieO1xs$LvlU+YO%w%E1X_i{MvQI&>7yB|-J1(B-# z`{q$yYk!mV8+q-PstREem|fMr_zj=QKpMu+C|{F&;uvR{<%V|DKhH@j>RaTm3DdZL zbUt~@x!G;66%iUyKTx$>esq~EJ*`$TRl}!5u@O~zkHAaniPs`C*M4hxPi{UoQ{)vq zP+X|1h##?YJzsJ8yRU_`@VGUd^#cnm$QdQvyUttLbsh#k>EBixBbbd=kkkReUo)+N zo%V0pG0>WX(jfC#YPUt<2P<#tK5#PD{KbJkBjTp;I@Wp2h)o#feiwQrN&FygFoaRPY=O-yN4bzmRk}a!`EI5aOlsg6LI0wR9 z>^FQ%zIth111OGw*(EYH3USpu{-L5m_Y(Hk$HS3vl%@u-*+R=)|dW59` z#%#kZk3=Mt?_hRhOwzmNz<<1fAm1BU388LdnKi2Uej>cSk9w)!{Cg6k zs@9uQ+dQ#aZ!kxO;4a6{acSO+<8wGz*f|z{;!7rLk+<0N^9$QFysFw3&p6!9V_0>@ zdCkvqb8OnhUvaS-*ScETTqYa*O8IiB0w6T8m!{0}CW>Tt3?xDu?+>y0JMO=`ZT8>C zsrl+6)L9>=;B9`lr_uIaci?#2uimCknZg8RFZf&UrM~F5{#zsX`d_6sLA=A74-EHK zC#tH<@*zgNbYSVurXe)<$_lvW$wPxn?a+tRZ1xYz`I>CXqZ@IFc>H(?3k2F&Pv_iK zL`gXm0L~9cpMI0Tv?(!r!W^W-1Pe#x5XNUTW?S_F#y0R^pPrGOX5zB*ph z%!G#o@=}kp#csQGNHR}>U#3XQuH){sp<A?Gukz0=Usk)OLL;yYu9|GbO- zf|8ZkgUHb`x8}NDY_IrRf1}|D8#0V^i4X<=xYmW?KG`6JJzZc0QIE|=(_g5>`(nP3 z_|gF}`NdzzZdzMp2J!-tQrzW9pU1^u0|7^}sCZ;y!%vP;xD8tbp`_|Zh|_o&y*J~p zX@cT>#6R?*K1AIy7WiD1AeGe#Sh!kL1Pkz@nZDuh*tx`50f4T6*}8I_ik1FJRhwV_ z`>3LZx7lpHaD^8SUK^$s6<%pUA2Kih}}!h-->2@Hh~A9+e*!o`FS$rN)R7faZGPKn`(Dh7ulutSYbgow&UE#9+OqTBdj)Ux0WwsQ zgIqZIrihJoNmeW+M=fcVxRqOx-5Vtu#7(f@Tg zG&SO3p(z)IGr39oclB)O_0g{n@K)AMH%w11nXMKWDs+%IbkHwFUNH;o25h=Nf`V4a zxI`}xV1G=hB18+9tIVcAgXVMaf+E(B*W}h?ae#7F?$8#UzuJg#138~<%qGofGYK~C zfr1beBii`x(j0#C?)SA06xD$3@6+5DEZYp&k`by;PI6KA{a!}D=k}ZTmQHFJ)Kur8 zwj^gl#+W}Vw8j!qtsV~hbw@Rv^-v2IY~$nI`W5%n^&49PT))6xT@0z0yku2qd|7E< zHa;!#ZA*a>C5M5Fc06eix6KKQ+$#^v^X-5fQA7Iz_mA&AHHE+L0@77vFmsM-1O z6Pmu|gq9mQ&885gRR0P)d7|V$wX*f*dIX5#Wn9HY((>nu@>k{K1RA z{^ZBlcAOQF*L5I_&F8-q%ASv}7EtCvc(V0hyiVnJJO_H);3h^QQ&q|S2&lSMJ5Oz0 z`(AAxG*1pt`Jw19&RKus#&+4=z{VW1b>~;-Cn<2BB)DZkdqn3Ny)9TEylP&1Ikcjh z`mri}*pI!B77rUZ6A@xBQ?(@TT3nuAHsmhAu@wL+R9MFTcDU_(X8!j7Vf$r+tZfL8 zAiltBQjcTf($j%^U@bfMdrHh-%n`L|O(qAlFyV2lV(eFGd{WZ5Y$ik!hW6%AqcW_+>^4qeHmuZ089Vg=NEQu1P>e7S;Vsc+d zQ#LJRj~hoaVrjW7HRx3_B;I-L)!J`AROaSSWb-l$n*?D_ED_h@zI9;4E&tdHMMDkHnf zVYs9fL*>tJxl6!%xJ3Kds|qyKujy-Oyn~lE_*|>`ZXS1k`}KJ2l=j7z#By_A$Sji^ zk`H()BUzPn*!x#4b_Ezmhx*uL#^c76V$#8hS@-6%NgV+z=lx<-``<1se$v8?mFpY{ z&kI={weea7jN+R@HXX}Grz+Tlk*?3&Vp=>HrJV15FZ10#6-7z4C=A0%Z*U+tOzJe$ zZtb~makKf{R_$qAN85sNrYE@mjePAk-4s^y`64vc3p4p;ec5}T-M-cO8|1Yr7S4@+uO1;6Q!P%ie&@9&v=dwtw;fE z@yuNSktkVS<%?~k(Gvoq!m1(E@12cyHgOCilnp6v?|1*+r?vhYy(9SnI~<0s?-n>_ zCCGnbhMJaJTk)BM8Bg|{>$(s7kKKJfblbk$cH7BKpGlwQ?CJM~jpXc0EjdZ?f_?~8 z32`>@Gek{Q;v>+ZYMvhgO5HzeH zt~Z=`Xb>}e#(Kng_VM0ZDpTx>hm*3MEY;ccc!>RF^Gn-l_iB8263d?pPbGmwXymq# zwO-xr`kex&|=I{QnUiKUIrtf_qSId4ZzPA}R4gx+!q(`}o2vXCZr1ZL05AuVF z#&aZ!c_v)qHQy1h`<)XeMKe8g%vXY5p?p(}>0*s>bBIP6cmE+6!x7=4sc}lLdbAZh zUZClF`~qb-`j8_17x@HYtGEZpkP}ux0`IQlt%?wA5f(>#$9%_zts7Wg+0d& z;(bRBufxV|(26T9N3j|++9@EF2Zh5kW9X-6YzY1LoHbUnV6H1J?_8DF3wkZ?9S6$M z>us4Elh&7~JWhp%|8nuc*;Vr1l|w5E{aQc{NN2oxc9!+E>SKCW3cl+)QqJa^#vEv2 zY{7=B@m9*cw*6Ap=4jqz#e%ewce%EhUZTA5>>MTGjepImLf75`nO!1UVEnui(pjCA_ESz5xE>%@LH1u1TQBK^M z@8TvxhAJ((POfZ3NZSQ45M>L(z;_Y_EPea=PF0X;q|T=sXE||?1FIQlCu0o&^)?Jd zgHs2pCUwrU3Crfyn5~R|cutlKQcTBsw0wrm1Y9*O8V+GeO*Lm2zWqC}wcGrftlb9| znl6*=sFr-f|r8Tp}3^OKC*#GPM9XV<>UyRdF0fb2ls8_5( zFU7XiGyVkfa!v-Xt0)LR!yevvF2tQj2=25Wq`lX1QmpPL=B2KSr%)8|c+1M(_tFWk z`_t&O)13NTMZW8OaC6snXpGHQ%?9aP@zZ(`3$J)bs?r#l7eRqzEO zj{1@Huo;ePK^ueMOlhh;bAZ@wFo%Pgq*y0Ky}gMjN=JOE_Mo;{yX1~@F(DY6S4_d| z5K-n)D=C_vE4V&;=$xgJI6p>Gk=gJ?A<*+>n{M+fFZa#<$ErBjjlc1uPMy`FgY#xp{(TTphsFHURVM3cS9{gRyV0tOs{F1W z12NSl=MRJYqO^zf0?gBm4Ss}lXdM$xbuulWT9;VZ-g0F#ce4cxbZ5@lM$W=zbAsBK z&ZkP*N}&JjxsZNtEZ+Aw4BUTz^Qz77vCi7w*IckfWd<4-K7ZB!pq*|v`P=BKe&=;V zm)lKeo~Z7#(l^}=E=dh{Dw3k31}Ag1CKZ0+p3#mkhS(c}e?%jOuN`-Dumf|p5Q3a6 z=h*C7*;-#r01n-HMa`djF90w5X9p@JUajMG@VsG3tCh?IWn&9?)eBf^Q<|gEfi4BV zh5uiDjeWt7s>BY>>|9fNbg-vQ$TyTNfQk{3T&StIQlp?rTuFUxn0=8R0TunWuku{? zE^hkv>uW6j?(08I9*%+avuX3a^|p&weebOw>|da$KFY>;4f5zNx-IVq(l_0Q4yJ@O zoNhNErXEFBXH3(EBneRZrHpf!Mi=84m!LuS9{L4O$-MR4f`g^avj;wg?A)$}gw4kJW=~>7kQ95G#y?Pv@~S3q&qlHE{30gd zp=0kb;1ue=xAa?&b8*WZZ>^R{z5_%EWks!;l6roPi83vLRf&f!K=nDOYLCn=wGDlR zBou2|um!Q%a@9uEm1d5V5=7Nw78XaXtSIy6eno~#HD9eJ4^p5BQhkejDtPmjjVN2y zetIV?AGAh<7cSCk)Dlrd)JsE&FsnH#;xVFE6??%{`%wQ=8U`64OMNsEh-hO7{q6Mo zQxE11kwI4x8!h=>KTK!yt4LR}S|s+&b{bimT$>)rQwq z*gw0}D_%(V4++eGYAE&`A_kRmL=e8f^lx1e3e$?g3B&u^f^2!!jV@o3Q;OLJTpt^u zHNBA2{s_Dqc?BENIZJjN*M3J917z|=c~y24Ol#~_Yvx$Cv|9WIWEBysv~dFZe-#?D znQM6d{y85xOtYN0l{sPq`m&tECOTB@O(;{$=TPCZ#q;dm&7N&6OOAg*yOewQ?{-Xk z_AB71A>5eg%Ow}}{|T6ocx^xqez>MbxB3rX|AXpc6WR6eal{s)VL;!gC({ezKu#_V zjuEbCUuA&h{ewQE0a-L=vc2ZkJ={go<^!wtF5E54l@g1(9WaxMR+9YCz(o1~#hbpH z9H8uw(7b;Npxzp3pvIwlPX{%%CWqH19Wp0g$AP7+cHZZB*|D)oyl?vb^?&y8qbYqf zp0vjH^#Qqt{pbGnzl&D?Z3a8*AKC2R9jd(>ZrwKjzfoX*kyny#i@j6+0b_PU`l~9S zGWm^mE6Q?QR7f=Oh|*JysFv0WD}#2&2JNsk9aL0kq7Ez8+GQs}aK7yqmCFqz98*0M z#TLw**${Yd1@mnPAar?+7a}a;T*%dShgHa?mAA3`iVRH$-}tfN#rwlzQp}&g7WxF! z1r0Tcrnb{f98}~psjweT-!8s{(8O`x2Hl`M6S)ZUk~rHZgiv|>FWAAgfL_q? z`Fs?+cON|QqBEtb>9GgWtU^A@V`3U3a=wjqM-}W;!f+Vg zuT}yX;vxop*dkuto%|X~p(AMQ}Cde%5hqNN@h9xn>V~%FRw@Bq>AjPbolrhQ`TX~Ua>T|!q z?A12v&8m$bg=m_hoA|ua6$IS{ddA!rR^tZl$?A|9pV#9a(loLp}%HK>fyynDwm>qPWD zwIWKGJ%EUlRTh&f@USy|TTdgOZ(Ia3AX| z%&Xn_J2sTA>T>aWroWiNW5Qm8HBi;31lsyX^__4pHu|0KX;t_w2_`1 z;`t>FsS@L#hp6CfjUEY2`kdM={bE2s@{Ti=OX-dZ8L{BH{7@oXGnj0+7?|gAKSq*f z7Y1Dw8bFCiI=Vq3@4L%G%8p#?m;7AVHhfEp{Y-3FW^udss8sijfKPB-NJ(ZL%CZU` zhCwioXlG>BUcuJbYJ&vg&m7tCxtLvcxFOHhfl`mzdhIy`TQgdUA^$82b5|`!1TmAO zO}9m##@t#1(s39m%2>8XSC#kCl~ix|syl{$&zJZ6U(E@Jk}bTr2}z!8xdkhiPHA zaFwE_j{WQX>+Jb+no`yFJ8I3g|N3X!Rrk3m%Wda#RO0MY6x8@Ie^vvsQv6QFpm`(8 z2IWOrU3EEFuwu@6+W!t$&)#h^g_;ivUfI~36uYM9ZwLpH6afDzpebKT>apqOD@C-5 z^=)KV!#^pzh{byt`?k~bN?)dUYxNG{)&{W${-MwBG85=OC_Gz1VX`jl4N!aX#MXP} z?`lX&_M^8N?zff?I5ehK_0B3{$d;y&e`sWD%XH9b?39t9Gb@@JgWY9 z0m&*(b+p~-dsL3M?t7=*YNPXa0e{zZhFiSm0p{YB6cg_I6?s_DR(+;%^zh8e<&}ep z3IFw z8=vz10t;&ww;^FrgZIdC&$d;5crU&hkkI8BedwF@d`V_Gxd5j5KiD)umX#1&6q3!v z6ao6EW`H_l3GH-#fG>+{3*?Eis~{kM^pg+EQIy_Fobuaox)7Jy`+6#dJt?4JAuI`< zz&=CIlMP)Ntij4%8--fc=IeMOvuer4^{V#Qhc}2%2MD=tt!#SG=FB^UcW^c%p-&+6 z)vDA>ez*kZD=SvnfJblKU5H`9agd?!YSs6yNUps5q-rJ~iKGy%_t=rG!C7I8czlx#L4 zdQgIecJkuCRU*D~nArbT%i8}%lSXi77-dy@vJ&k;82IosC{stBLcRf7!<@} zmEhQnkh#9Eht6)tewQ!;Jzf`UfuK)hIdCzI#^7u+LavZ&woi7BS}-zkZ|M) zc+dT9;q-~)wZXPqp0!fnvnJ09G0QB}0aoW^v!r@%sGuHS?KiN(+dz5dV+rgGpU%tr zH*<8@9qB}}vKmE4{JyD_O=utqc)~!pYVZpJ7xRq1rx)|19-NzbyKWuZAnuXd$X(*e zAX8bdC!I2gnu?y1&s~5F- zUsPSW`ITf3$JVmn_$Z9{Qzc+2*Fe*j5FIwe|_X9pGJ1+r$B(eh{5)&ootHq0?dRjwZ;x{R5DU4+NvTO2SeB~EkcT|oGUif z1MwL7Z1d#Ij=&8i#FCzZ!x5z}b}b#Bb3-|9P$r*cU90|USMk=h3GcMl=R%<%dU}4e~MU3WAkx47>(wayG?+pO#csuE!F2x z9dg|!O4zbrcYfQvsuzz8+%)KX9|_;GxU1%|yl#(SC||%V6j@L*_;z8je@-c#w`1XY zb;o>kT>qshW}8jr*$RkDq+`T~icsu4-mKvKNjb=^Sis0k;KAcMp@}8$x$IX3SWHfZ zhf|fA?|CZY_S4#5>(%xCYdlQ2N5%1t8N={Q9iUyi^Q_OXPVrr2-l}aO_3!CCpDY{R z$GC2GPzAh0)A>{!RCv>NHex>KdX5@W5-$?x6@apquOY6!gk}a^Dt!L0-#BB;c&XeJ zAG`7Oy>~|%U`d+51HIx~Lz{?F7x|Ws*TT?jyr`gn8&?(oj{?ArUv(~1jSuXMn~|(^ zm!2L_FBg!HEx+yh?Vqb-u;Z5VF6FlGI0E8y7{FAqeljA561I~kC1PH`G^|=8vVTJ- zyVM)8ewFmhp&TnjUT>jvh63L>pCP&n-!`>Gf@VL4bpuj9D~ z%d(<#kU7DCq)b29A$#|Yph1UmH+*Sz=*hsBsII?H_+59cYAo>g);a_y4s~-tt7w(>51Hpk!h&%7^Qin5}q1Nc!_D*)hy+I!ZYL-`};pGN%oCU~LL6~x>R`6>N z3NcXMW+*Ien~ZQB;CwoQul2I+f1^szWW4wpZnU0gC&bEz1W5!HBv{F|W4N-eQ$PmA zU!>lXYNq?)Q{!AKl3o)aq2Te|M&s9yAlJBd3ZueqC=U%1$bQiI;Td#dGmhfV+N8?^W||0>_Uy>f?&}=3y+oeF-pEJaJ{k!_=JT|`tq?DUB=A7 zW06rNI*VT8W+Fsp9!oG;cn0VJ;Z4Ek6xsl6F&)SVE>yS(?jhBiw!5r3a{C z^-9l(16n6ShyQlhgRwxvRh_&@kmJvE95gHjw4ti>-0AL?MC}m@sfHE^LA8hwFf^># zsmC-V(r{^OeX~jFtNLDuDtJ(Gp&T!VH03{>d|08p+#{R4{!l06Y?>6h*g?KusyrM5Yf zP3&L`C8dsk3?lwN08&7$zlR`Hzxc(DX;3XT*XvP65Je9si$D6_-B`tVRrzcdE#FnyJidJw$jqwD@ALJ9M5+9r>n z{>xAhVUj2@lrCZ{GzF4l1?TG$jZ|hPu`f^w8F+48WxGDbkIj* zt+WjNKA#mddJK#m3Ts&ktbg1Ex~$TwbVUV9qeQA{=Zp6hG0y`kY&o@x9mD+MSrjn6 z7jF;Z(ntm`D)^2PR|sZZ6-L4HQGp$zdAyJ);n zkOwf7n3c3L&D(`+i8N#qywbQ0%tZb~LW$y~hcybEV24<}9t&9%7*aCQ*|GXc+B;e{ zHrgl-og#=SHjKLLS&}?8q}6i6l<9d<;QOwiJsS-BJODlcdj$0yfe7;!nfEi+*bgwuhfRm_i{2zc9>Kxq!LQZdIUADy=YcMBYPc*C#5|X3%O`nfjP>9<&Ci z-fB|Yb#D)_@nL2i0A@jvBe@TBlk6GRA3dx?9guW{BkuDC2^B)wNjDyv=9g?h)T86t zt9PGYB6|TQ7e?Krd*4O3y#0!YHvMLE0WC?S7N`|4554EEf3f+ao4&lz&nG7-)%*4H z_q=8Xu`}URZIVF?@M_-sz{dZ5Xpnk61|?Cwr|>~6xmI&ohlpSf%V;3?F=m&HTCNrY zKaz5gSb`25>)8@k;sI-ZN=N$UKkfMRt7{MyX<-h}MR^S(5z0C$j>Sw`ufVl`T)#4* zn`WrFkoSKOWnVnmJnsOB95U(TI}Tj_&4V-q>fsfm4ao_p`exBiigQl~o=vLTFut$} z^nADNerrT3GAJ>T3_U@t$K6NqAhBv1XI3%cctRv;A~{8=E{lgoZXIWffANiNdo|+b zOwN(L^m81Y%LI(mbwnK;K&d=oa!?JR#F+l*CF;z-a@8k)XqEA1ah_yiT!j4MQkG;D z4`_Y)dO;%)I#GHs>zF^f>9bSJnXTNA%!|ml@NnECC@HilYnU;WgB|j#|KhIq{Y{T# zdm(G0fLy{ZxI;w}P@b?wS?D-b!1@Zw$y2$oLLD433t6&{qzI+Film16RNSr>_mu{3oj&OmvIo%Jtlct zTVXw|5m-2Kz6$H2`-}0{Z??yVbeJeYn`BB6=4;Mmv~9^#AE=CdQv!rjJHF-XrH(*5 z?)tS*QbVfllNyXFK&))I3p=Z%E^)d^reB6Zf^=5#$U-n`)jB!=N6wdCCjkQUh!*?e z)$_1YgRs9d;4_;iSA16FkpxO9HQQ^p(Y%5vjGzY{aXMQ?-EZnf3IZlI-? zl}6Gjs$}m{XtVz2tN!CK%-&G#5C7)69k=|f@=&&guk44`z4*LK@VpMN(IKb$907_r z1X3kVAsZ=&tUc5R-Em8G+fT&iA9#!@<&H!(s)Cqs9IH4&zPi3C@GOb zH*7P>Hpt|F3jM&3TfKg*UM`WCS-xKE2#k#fZHdc2bJL}Nd$<&@w8DsZ%54zh4n@5l zuw)FTo3iMuNHfIrs@7)FycMJe-Q;m;Kj;sMWniIJY&|g#k1fR?KdZ`pCK2E}JN~>t zI@H@mXN>n;BAMQUQ{FZM$|-}M*a#p;%?mofr%*lWi=U!yL-70Jb!q3`)=+Mnd_UPv;7 zZiAMMXzR{xzOV3lHJ=5b;+k?}!gQW|+|*XCvW28pAy|$XPC?jc5RsEoN18#MJ9!`a zj}--vStoYf>N9n|UdnfSw&#xhmKXcF6e5Rnd$!#C4||=iO+Ap$2-kmn%kSO(fxYi8 zssAu^T_yWA-M8_xdoJGn!IT4_4X^!M09OZBc;*q>M?D_(O}pW%BbT9I$CPMY33!On z9i0UlP213DBn`ko>)+#+k)CLcN}!LTzo(Eo73z~u>CRFgjk(;id;8a@Ikz(Zx^3Ea zv-SvDRob_qQ7dB}}ZPD2%Gn56%Nvx^esF-(kIbrE(cL+M>Ej5ym)jvz-F0JbrOgK7*#71&fif)IJpKYpa^^ zVr}0K{A6XBtXLz4N>uDnvZu?}aUB6C3{(q;NpOcZt-tvnd6hD*P^v2b!dV&YhN&UMI#bs^4+WFZ;GVIom)4z`nEJPH%{ z5-!=yqA^N}0HBW~6=_fw?Je)W?bp`dzy8xA2-+qs-1c6&_uZTBT=(%1J6V!MF|mMj zEF*3uE6a-hJ$4iX%=VVB2g*pA-I`_942)_-RFx^fJQZdr#ygMqs1FzrY1p0<+8Sa* zj9S(b zLd{PJHfTV^Nnu)1`vHENF;5m|k;A1LpRvWai4bcxipOI7a~qx)wL&y(x0}k&aR@WZ zOTX{3n>YOjak(ztzTy9F=Y!YwfK|_w!BkP<dJk>_0IWwI`M>#))4ojK0%r_tg5KH$Ujp zRW)$cP0=PWggx4(YhoeV>JPidb+gPwbbzIVk*hC@&>H1RF#fj8K^aD%TpuH%dK9&; zb38u*o|pWL%kzpr<^*0ZakJU-m+JOgxBoxzoTqi_i#>JO18cr=;F5dZuBJ5NKkM3Z z|CZ0(v;LlUbUJi7Q1eu9ZS{hXp|H#w{nR)Xq!MnUa9UoKZRLrU8UK#(tP)@kVSw^P zMMrVUzG+cw;ELK-hS_7a<24BiGf22&y#qYizT`?ccoJH&k&Z-$APWVtpg&}-Hr1wQ zl(OpyTsPnGrHf#^pySFZ;Pfh#Nyma@BYwNh6S5BEbcj(`PD2^GEMt!|T|d>uq^xlW6&c4y9PJ@cD12hEyJx0Mq!&8@d={O^di zqC205-EP~INswD7+k#wAoj0K?THl%U`8dPWJWM~;Mpwn3i5zOpKXB&gjLo)Qz4fCy zIVCHt=ZP-N4_^t~Nykp~on?A2rt;ir- zeV7|B*>&lr2ey1cIS-piWzdvFjqyYW93VqBf$~T;D6-|}YzQ@yKxRZjVlFLhVHjB5 z8Nx!#vmP)BB#of9kpiS3M_;B#;~bhLU{@r2tcr0J^YHp?8W({&8hN$$?%eYW*KFJN z>HW9d`G3)mJPFRAo)X`E%1`_wtP+#$RbMy+MX8^n$PrUW+!R|YJyH@FHI*t_326uL z3J6x~Cd^)&sf*(Q+rhT)@h~P<)g;TicU^tQKe^$CYaiITW5>TnSvDyrWW0AfhIv2oO^o}SXKx?Zl$%Ij+s7+dPlK&jE7jU>j8d8yq zLU!g%7^l(rHkm zInB0DZ2jCF7u^1?j78q-aKNM8v-5$SAG`U&-5-!o8o(s+2+f2n6}^*nQ^C_w9JdHV zDEgxqN2Q8Vq_k}$)y5NpliS<|k5^?4JIOCaOb7{Aj6@l%T#rq-*`CZ)gMwd?(5C`7 zh+-s42DjgQ+gnAmgVjQ(Gm~QkX$2xrZ~1zuBcN?Td4X*frIy6vyBEcvI`EFZI@0*o zU$S@FVyZ&I-#%7{AoHbp6jT#TO~B-SQoK83 z=1`t%KkJrjwOZH8QEEKcORzq0Jc~lYVoZxMv#cvEW_#CYpmEr&jENvGLBEsJidD?w z+`=dVIrUA6Ug~-~ouA*!daz9s1Owc;d#}0cwMcc$X*MLQGz7{m8ch|^w4Jk2@NL_7 zYc9tWUh5d}C`BT23heLdtq8MD1-bmjx=?dF{IAq6S0Z(}$mN8b$nkke21J<%Jp9Lq z4;HiTuvsyFmu5`n*7xpu_tyJ1K144IGcz%5`y$_R;okSGyBii32e~l3E)1*+`Y;F) zTV11~6`iPT;}Mi%B|0*qekw_Xl}#lTP$#*rYGzx}EEl(sJh2USq_b6xOiy^b`8L<^IWe^R=uoyhq-EnZvOK#_-t@G26u zDMZ_TSU!Ou7k-YbrI+rPr^TK8E(bw55U!~A6R1n zlA?lIwDOCH!tM#Nfkp`aQv1je{5$%aeVo1N+(fB?C}mVo>s)=+_AhO}a_d)d-t)B^ z*Z!tWDW1UVB_)l^us06po%6&nc;LnZ|BA%47ai^$+Ou!#zK?9U>lZKCzvhoB5Cuy> zQCIKZ@{td%z2~hLerntAFU-!GnH3YJf4FO=3CVR8o+?ITwEeBZF?o-S+E_SmX4vdw zFKBNnT`T%Q4-hD`;h!KfY5k}G2WZ0@3k*#anrG*ULr7uQC==w77@$c8`oq`W^OK4^ zn(fw9sT86Pko~d*P8K`u%0#sW-DmlF=_4RA1s*ZC)KcS^5}Vvrb#!sE33Ac=3CdIy zS}4RS*EK%>i>0smtieL*&Ub+@W%{Xw0M4AI4*kH!+kZl$5&eFjcUVW6CwFL8b>3~PkKZNKN|^hGYeW!-PB z49xth#;cOqL(P>zP#gH|VPENw*mKm@L&RlU$r0sFhae(}d$}J~{r{0Q%BA)c=rw6^Ss;eI&p|OtckETnw^m%k1c3A`p0UJj&0i^QO1*@{eu!qlF<6h#o0M zXQgV82e6VUo);O4c}#>z;%6?u{~vJ3%vU&ekZBkawDTAwkV>WNw$FZOjG z$p=&a8&M9)*iYE0x#T;t!X^n)UctTF;oQaC6yh&j^bO_r0L8YoOD_Az4 ze)qora{|b!MEg3W~d=rzjYdI8)-zm}nLZlEQgxbFgeYUewBe-cO?UolOj?RCAow)su_X z#v^W#H4@qYV?~;yFJBlJ0r}co4w_lSmczR7sFF&uDsr6U+i(gbqkQHW4~+vFyXp?a zmviNC(S*W@hCr|bPKbmX9T_cSr)Xzj`wxzqbjdFo`Gtz$*dHYiGeJBkCyIlITiCB) zc;O~GkyA8ETE0%+2#^zrEdxswb!DtD8lf6{p^{wWfJf)qG0{d*wlkV4!Ib)y2&M3$ zfxmb)N)0_;M-KVOIUW`JoWQSk!VJg@`OHeIBC1~9de=37c*wNBZ!znc31r`U6xs+A zS0eRrdmb7t%p25PTO`W^B<5^CXSJkN!<=f!rYc*ON&qu!ajs{s_}G4v4SHMSk7 zyevUA>-TT^Z)atdCmfQ%L>`Ojk#6^)J3jnRdE^E0qxo0|E z#^Z+`onNNdtR96=&i7w4QK^t?q+ir>?&DNUt$ojzL=zl23ghg!nu^7cls#5@tFb0w!_r!4zV9OnQ6;APJ$&Fktd)8SLW|aFFJz)&{>R`-}YM4(E zlAAy@j!3f&#(y~Oouh*m>5>zc$2(Q?+%dgsxMCtdgp8uT?=1ZYy$1cTagI`oDb;6Q z#j%lH>rWdn4W*bUV+xLnbTPu@P)s+3${spZGE-u8opIxKs^;s3zOUTkG0ZqN1m9^g zo_;VNQ#Et0afhk z&ecaX*Mak{=4#3l1{jF6&EHt_>U3u)L@dL=vKm3aSY1I{+$Xrp>(Hi?Q^$wB)23KT zo2_1|pyNkcW%)YpBhbnFkP*{r;`+ z_GyytV1o#Xk%WngLOT>r#aYJkh$M1z+`rSQenIig#CXm*@N%89*B3kXYFK#>`hlxY;?-olU~DQQ-5P$cM^ zL_YmNNHnQrKY^ta)7M3h&rZ zJj*At50w;+I_F`FR%F!$cbGdRx3=i@5*i`V0iftjeMVi{3yX`3G_N7`4IJB`b7Lp& zTJi|eI~KAH)U8uFLRFe;1fI(t041tfQI*$74z|ToB$F~AWEc9ke4UCB&~#a+%C20F zdYdPFmW?ouQ;vz&pZWTZ7r-cDw z?Zeg_R53KA)L*VUH1GT~gIYOn1c*zwZrKh31Ig zof@Dw>XsE(7Kd5E7}1QvsuBfNg>NGvxq{L=dfz3lOx+1ZaO5=vQuS=x;YGShE=)R= z7L~pIk`u%y1LJ*RBXWEmEmAJgo!__Z&-e{BB~SfuBx6GB0!1H`-tuOJfTE4;td6^a zYuVJou37`lexi>N?R9t#4rvw-MeHIjKgt9;KA(E|Ri5t%XvM2Bl%_!SPgcpvPFOK_ z+8cJS=%<*7OLIEDPk#Twnkq03?lr}5S zDB&@nEr!wf>VQts)QKI+SKh00z){?pM2|bo>Kvd*Mh%WZhioV&I-;7E3M5GrC3V#V z31=V};q^nZyfPBY54P!BXgX{>^_n`z;u;-+}V4WxG+SJlO=0y8NT7YVYVWHnqgsI{| z8W4}`MRZOkP}@Jd>COYda9yI^$!xxTDC!MtrI?5Vo#^2lxxBdkxDog|Ls;>OZ3P zxTnMSd?kJcRCtHq&bvhssEs(JoT#}y22tdG`zQV*W3p7+qXDzo;&IWa)(1KT%qGfO zt#Xz!@CmG2F+_%N zL&`B_+&L3Zzw^Ua{0$^ulf!{`)P)2qozN!LdS>wBr>VIuw+H467v21$t4#IDDJqzO zK9)Dlaac+HEGCIv^jd~52WWz5JM11oh#ic!>NXSs79qL*Q+T=xJaqamL0WiS)t+a* ze!=~(n?bFKZD9Rp{3$Y89^MnLXF8aXdJ~hBo$XW?j>E@4?O!78cf3P{&s9W5+p41( zb?g}PX>0&Df(13GQej}>+xu)Sjg^Vf!BRvbLJBJ+0Y7)yo!>uA$LI!7vHBYZ4rHw5 z>!gpsAWi&(hTf7k(h!PLe1s(ww*Xs;fI}jqqsDkkY!e${starZY^ilIQ3t;zRG}Yr zuw*=_o1-1miLC=UEeuGVUh@li>e0P}1Ie}<lAm4v=BatUjFj3adDoq^;iSogTN9dy6EL%mT4u42{&}isbvK10@@Z6d8VoO@NUj%lyG$P^p%KmgiWx{u6qg76wG$5TTOjeFwJu z#beRp_oj6v&>3d1J`dyxHUXOn*op%wR}=XR~Sy z+o_?+ZG+s$uuPv4s?@2<${k+k6?GsT&(%ZaLFE^({ouD}{dgj@Em9HiN3JY`avdQv z)1o$^q-J46B>j%6q#@dlm+**EQbZ=jY1n~8^h+OE^GJ2*$DQFYEHja-y6#_o@|yd8 z^4goO-go=eyD#ge-Mr#eUJ=lhhK6eXXcpW`gpj$_-O+)6329=*s5_>?dF zp{GqIjl-$-nAiH=LsOY~n6?~`P7cl7xxSg@_N|G&c^K9BBh#6gby}uJRHlmD1V)wz zCtkhMvp!0^SnKxOyiKylKq>Ftd&ys2aKjaU`@wCOe_gV3kl>fY_7}cJ>@(85r@n&T zVw6mDSE5Z;Pt7dVHT@FemMrcrH0qK%K{79Wb-z=Etc}md3tzas!tbMdV@OQ-SkN_( z)cWC(soXRtIVM+BUez;M>H4d8t-tcRt+&6DjK>ulH-7Bu>#zNUQlu^9z9Yy4OBLng zd9#IsMIAvgmLrI8sltEs``GA=T1d-t^_|M{`hSt@|D`?+9rt|8_N|}Zb;~WEg_vDF z(p)gXM5D0xPnnehcNs_MMG@G~a)X)9ho_|^xkT%drAH2I-gY|#RXvWPB%DQUP!GNm!ng&+dKmDdDO%PiE#q05E zdn%%?n(9cvFQQUcTJTZ5YVO*3&p!>T{b6<-1xUu5`}ewuz&1By&kr( zIi8t4^!Q4MR#Y#TbnkVyZlcoN?ZoX9PDgw(<8r*8v+wrXFKG3L@xwU z*li)Q6*v7pzS)kzqlBxqETTv&<8Gr7eutSz$51&}CmhZ=-s5qmz1}UmZ+XvLb72L1 zy0kVuiSR28rJnvJmv~cS58$YQ8AqZz+jJ92x2t~lB0t&&(#9OPec$eWmbm<$PgEus zPxKg`76zniIsv}cfY!BOSEN%%y7wr?0Zpl6A%;QH#%f>7h7dH;Z_lawFNc=Ycab{L zp`-@%JWk!(XwlBkp;>qH+TYoG&E7Y9P9Omx^$!MDS-zg{2sHDqUk@AYbz3go4sbXS zOcD})D-kQIp-V#>TX!SXT*wUSUtoK1L!n;k%RS<;7r?#_HVlWo(F24HkfGdDslcE^ z<7}c{Uqok_{&_ChtTaV2HmioUR|IZ993~W&(*gu@A$bY_S8E*(oi6=# zY@my}nj*ovbd5j^rC7&#_vbtB%a1$$BM>KXNEcLb(sQdI&iOVr3QG{>cY0ejUR$E` z@<5&5f-rHsY?W1NVJlN|{j7w;cl^J>GhgwvFd*n)VLr1oKm$DF-~p?}P>6G-f3P7) zv#RTZ&!+PEyJ!2LtJsX6oK-_58u5a=JSX5F5`rmCmRp)1f* zd*?CsZ7a@Ye))$A2xZKD_JJ*vRSg06OPRr{GuUv2pV}9Ay35z8AAy=5_Q+XaE3&L4 z$5_py6itX@YAHf8E&Q}jz$nK-L@6D(l>L=yUUk#o<*4Z)?4=ehENnAqFE}YiHEi|YwC-&}L`z>kxiS7ZjKhRx(fS(@hBYb? z<7qnV9~Ip&{zK-3yvnGe*^pI<*fu$s#sL{ zT_XOBn{|*86?N4bx(}@Bluen^TGIm!pbkiS1E=CEo)!@Zdb=sByWcvv$e^LylT*(z za7`H&N=Oy0WW0U;-PZv_rFk?ljgw0}0fdsFh2=nbv>Hnon2fNnwJ>kaZLBo+U3BL^ zIM+mv(+7Q6F{K`OyS%V2k{BtpFZMl;lXXHS`b{oV9_r-cD& zpepuc9`_Hd+5Jxso8C$(yi#9@UzGxQ1U<%)_#*KT#6lD+Z=C<&MSnhzC+3z>W0IhT z@Ic@!HQb?(BRLe>cxDk^m*2-QrTMU<%sIJ5#rEUL{vJ+S8ff4s_+4oX0j z5>HgH^0a13CtMfl6*65f=xgFP!7(&G=URQ|^|zg;GmT2Mset;8xHE@vDESQ0ven;6 zIY4VNB;KTGgyTvCq8d8XoNN90wps1e%|jdS{b5u#S|mM)=OL-^_=X8i$^4!c21GL= zo(`Q0Tzal4bx1e(A!xe-JJ4H3Qily>T_{yZSd(OTDJIMyL-#fM@`&-YB;_uguoP5` z$94*!tVS+`z0f;ggf5 z+~H^h#8S>LV?!|2#?0!Y9U)3w;hcOX$qPCWj`M?i{e>#4Hh=GpYyN6ja#wqctw;9l z+W*rYg|PMj8D%ML)=vV8BWi)tfATpU)_V$FeMpXQ5jQJRv;y!e|CR0^T}By$T#Cz% zh``I&$sPfT>C=$AiW%@0%wPrQ7}>3?GTUv@a=XUdsV>TjR@N9Uu79xk~y&gAk$hsuYjufCrUaG+cvGaKu?x-d2PK7IsVoBI99A zyfm+1Sj8~10x=OeUx$6Qi15-Sd$#`9 z*^2vW3(V5frBj0VfE*L7EUTVT)b5D9UGOAq95OZsf{bBem4Sq{uQIh$W9o4V&>2tF zN2y1P3q(@JZ4FQES3Tt{tS#4W|M>cww|=#Wwr+bmSp8@%sXUIX#kcT*ADtMQM;ftt zxZbZET;-G>tqr_I;FJX)5pfl=2`(Y>kmS1z4M?zU`6jGC3~ z^+zUBZ+6<4gY|(qSQ(gk^p8bU2sOsIy8@jCgxcsJ+l4QwHXp$yU=mAYkU78#G3V6aY4+4h-K?3m7tjgsqfB6-*n;cyp7Wg;;M=L9z#sHR6ibQ3F6|cec?*YNq=G zn0~)RtLX2x2A2PR{6;{E)p|8%gRswW4!g})KQY-e-)tBd582x5FHj#W!NnCgQ*5XNdB@Xs*(e2lVWFltMrfFti??fSP=_tZU3mmKPs`D%d z!V)7$YhDJU7=K0^C`ENR>e;Qf!uu|}>%5H*tp8H1EQh-3nRt>Xl0*U7PXtje3H+Rt z?|C}DNuDMgGFDetKixq#uoYrH5npjhsTJy`>SQq94z(Vt5wT5(_}wBGaz3>W)L@O@ zWAKa)+SXlfs25q@0w;OmDK!W>c^9SXENGiF>JrJ%g+0>(AYPyqOBdC3MT)sPtO|;h zfQF4NM>kt>E-hX)5kn#fP+vv2EplRgjL9(c&bjRR4PPgZ7`*?=OaB~Yj@3MZTI-Cy zdi|4XL{7N@kvH4*vJz!!9-3HIzbdT3f0ty5hT_;pE80#)tF?l{XqgLuEVd%O=uS8~ z&qfl*%Uz_NYwsM%du1xjONaAr?U3o56;4zbQfRfr(Pg}!vXn|N0us@ecO=76bcE6Y zM#4|ldDJ+HB~54!q=h1{rJbskFmf|j+`Hz>w_kY2d1V@WDFnay{u_Ujy!@kKC^zhmv6)90MnJFc`vNU&A?c%R%Pm?ya&9VD50GwR=}vK`C* zXe7s@Y5RmwO~d4=QRFLph)>$rZ;``$A|IA#&2Z|lNv7vaHaSn!ZB|rGvkMtT&7W|t z$jahuK^5YE3Hv3*A-1MNRBh(X8WI(fa(^O-GAu)0shFS)VFJgZ35g{M0{{TmD~08L z9w+RufDkkza4ntGJ#|Wx=>0r(nhM|8KpGNt6g)^@3ERz1m6!6g$YK;lnMI|tu0qmb zlw=%J8tpbIutQg(ia;&}tNJPZyiVF;I-TF>Et@|0)ipP4oCKSqziC|WPXx6?FhXK* z^g45pqPy24l86YUGh#Sf^=!`}xk?(QurTndT!%e!QoYfWGGM3in-C2K7hiw* zzcG#I`!V^Io*UO@gMoWEg0Z-A2G|`)n0;l752&S5`)#QUXmZ7{6KtiZ!@^l35R4)# z%a$1QVpA_onAV|zSshNK`?ufu)0?i|@Zdc+?f=QmJ2w1#Vt*PbkX$***C~xav@cXo zUdr7z==s2^>Dt7FAS#9FBdBWB#xu7p6x;9D<~*#<$+)NrEZ&h0HapB`A}lt{YkC7Gdx9taZ%7V(Y;x@A^Mh*K6NY-;Q*iVM2*o+Hlf-bBMHyHmEvW^85H>t<{3+ezXYxe1v(8ggq6M&fWoM?FchBlMgGS${0WoBtutp7) zT5U6r0fYz3V${)Q_>LuUoKSRbLog?d}?D-VC zo1{q>JV8?muNld}r8Az@hgH-;GItaqIv97&OTxkyo5Zan$NtzMw6Ug4y;?`-2Nu@d zo4#=O75BVl>wzu5*J~=c`jr2M_k! z+a6l~N3$hz9eAiR)>f#M!B(&>T`Y~e`l{GqM1_Si;8t`|Q6NSglT*cAh~US+qP?dR zU^vDv`K0Nry5y!!|7q55zP?YF;Ea9M1GZfd4-VsjqS&Vxu$7si6J&S8sY z(8&EbK*l~gR}d*M^MZ%o6MfSxCwUu%xiq`? z_PgI$Iz{zUr`&*Cb^TTQgR0Y21VSW2WhJa<;kN@YLgBlJ^4XI9G4`u}ENKB15r=e_ zNF|vHp02v9)Yv%H*n0%ozBq7BZc^z4uGts-(vbebW-UASv2ve093Bt!+DtY1;@?6O zRU)s%*r5|++*)W7@=pq}Rm4V98tViNmB`iMrSde4MIEM~EI`pNs=#Y?fCU(l$a|H^ z7kJIYNgmjI$B$ES-rI27hJRa0-9g1`Ji(S3;EOFsA)}epvC*Z%=5Q2GLZhbBW(NF6 zM3|~4qt>}NA^?daUrA3Z@_{x9XdP4AJBLeMIb~!5<|l-RGX=U*@0y3D*ZP7N&hit! z>j-$JGMM%HuNUoomRuE;7*_1n?k{SkatwQlxT_N50d;E#y3)6sLfkT?(zeHuB6;;V z!YN}%L^x<(-#0aW7X+_p(&l`5zQ^mu6pT)y=&&;LzX=%JZkSqA$YsT|Ee}o^P5TrZ zkj&h2?M-WtZm6~xRxCHf5yC%QE_qoF9+)62Yszid&XL8Ks-{+tvm9Lpx-xXl?_d0( zA6{YnS&RlzM}&l&k3ge09FVAIa$b>n5JGFO=MgqzLx&k~ltpY=$SU?0Yf2FWCsBYg z5!=Hh?<6Lc6$w@1L*X-#i(9Io!IPMBdtm;}m7o556UJX)s}N8}s!Lbxv%^@kh~*!1 zfHCeMy^{AcU)yr;4;5Vx9OlCvAX{_F7W;QS6;AR46j)0KP9vyBQ3}O}(48F)qhfK( zgDP}Z>GojPyp=K0U##6IBrg;px)^tl*_cAr`=N{P{jqaQ>G4Subk*)_`8xh1z`pTg zg80B zV>pNaO{Tsd;Dyh2jhpLa@{p~6ETLluFgc*S-&5*Q0Al`1G9L58#oAB>eJtUIiMn%0 zOzOa~Cy@1A^+W$2QK03z$l0+cQt_CjYYd%(--!z*H5gxE48Q~>%I35S$AogUd1 z4TmP_$3DG>0%^IbS3K#=kmG+`oUm6cz(M9iWChDKv?6+%i;?jd`A<*z1bPg2=wWK) zrJfN|p^i{yCGtiCZrGnN)rFN#O+68ouM;o=>WZWMUy46ujfZki$FBcz)HvExa$%q8 zIjI4w#7+?R8OYeUD8~7?0n)b$zM&}vx~Y@BE34<3`%U@il2^@Qd`)k?** zo}4#lIV+I-E~y&PUM-Tmc(L?p^Ah?|ykhpl3z>%(^H?&2FxOE`mfVtdjSR$?+@Kc# zl|X90RKCh?rQ+bSh|2hltPdx7ei2jng_7FEtY_Z$i4Fgw(nX#j^^qPAQ+KX6dnj-J zXv6rO(rF6CpHhZ~KoYtM)q4PWvuVpq%bsZqYEfYzVW6m_Mfm>IDYoIe^^gH+nv1Zu z=m9d}nJ21w)R`&&Am)cDdF4PQ^eul@KrJ>qTTSu3UOHkfMOD?2%;us|ZB$qXTaBMuV6$F&FK= z{7qr7f+JI=@vX2sm8`0+hD`6DuEs-O>697}9aYUE{$ut4di7)7uLOh;;*3PldZedrsA%PVG-E1$yZ$ zvdf|PdvS=#h=j1PG~N#4`Xw;jOd+=*6J9S?L$55UVd@$A*uDLRn{PU82IuATL6%TP zePl~49DVkuJ5JB`l_E690w|$FDA!cAn_fsHIaynM*-hJipEhjKWxF^1NnCPY(MEDm8r=3z=wa z+E~YYgMzYHTmvGIkTQRo4VwfB@sy-G{&O1ap!LlN$rwi&<3U{VVn;8pi#}ku={6{B+9?*9d?rA!Ud*J}OjXCup`dj4&NhCljmj=opO) z$hE!fu{GXz$3R<8$92WD>UM}gfZ{7qcqdS<9;#Usw3G?A)Ps0(T1Sqj)PQK{W-x{x));iW&nF=rwxPXHB4zI2e>%cR*QSuO39-a!k*wIaA99 zt~Y}K5mI~@Ik zx4L*l;D0g6bmc}Q%GZaXAVQU+JYb?mQHnAce4>qv2qj^=v>EZ7p3oE@z#Daa4%ag- z2Xf7}Yp)z{tT^kXTW-Db*Eip~`8QRBq2=p&UXoC|(Js5@+opTYw@vFc3FD@8y5qDl zG2C3ie0r5a)5@j+5qML}>`(@qMp9G^@>r=HQ;Mj1bR~I}nqo=U&~2JB-U58|W(~?T zRMA$|DW%KCs4dNhS?A)$-E=MC=n)Cu?3Y z?tyYsat(;!Yq-6Wsq+n}yrjMcDRl0|N+GQ~XRv82Z>(57ta{1pZ>{wa(PsN~eT?*6Dqn zGRLGnY!jPh!*b@&cDjQZg%c$zG@CH5@TyIf{@Vk2SD5KC|L#e!4>^FyC$Gfa6{I*k z`f&|9J!*0yim*!b=E}|L(j-kEZ3Cu^0&f^z6%9K4ELBT*Q}i038COI? zPwcl4tE9hsSeppXmVPy+-XY8e`UP>1)nqtwU%6HO$7@?th8BA2=7?vzcxaIh52`n# zRWk=n4pE_ivY0;=6pHjYlrNjYj|-so>|gzWpy3%Kg`;svcMU#UM?3*}yNKv%(x)JYxRU^}qH=b)u0! zGMIEQDKj9opq3~7cyB@lWfmaDi-C++=hmI3B27_QfqB9q(^w7X-dx^y9;ba*m);*Kt>H@)(yDcNuY({ZroL3FnZBH;QSQpt z7pke$=zl)OBt>(fv( zZHOi@!^%v_M>WJe*?+`TR@clTWS+%^^o zl`t&kOZg8EfVWQ69uP-Fz`teJ9iC;TlGc2`JTY_Dp!Gy2(q1ePO|CMPzmXmUrJye> z^3N$VAezoTq_w+t?)$Yl#&;G4(s$f@{{M7{-+DdrAz-=E5-pV7Bh&AqVrdBd`UCUe zMIZl%$TZASa!B=gLWA255`NQ%;9?Cp`UYq&A?2rOJ#(%-yKcN!-{$drhyU_8QW=41qL7+} zua3(OMg)UoK7PfA{$U*mgnQ7^t#l_P#co^REnmlD1VlHdOJhlOI-!IvF&=$-VEaTM z5%Mu@dd!QwVEeA%;Y#<)RaZzJUod`{i~G7BgAKNIo(9uR!gb62itV{dd?A0 zo}mL=+oba;@UMkx7t=*kD#JJg((NLG=v7KMV07y2E!ZxReIRu8C=U>OmBZ!Wd|Be0 zT1{AOaT)nS+){FiS!-ZEx#r_PLNVZ?z$&SgN!bU1A@CM8fl})(($w_p?bk6S4HnW#@@JdyF6j4|POGLOUhm0E6 z$a9kB5-ewoMd9esSJ@I2bSPQz7Z$eFQY|%I(}3t zjBCsk5{e*C)Ic?9=w-me1E3M%<@qQtV%gCnik$r+mZF^}`wR8ZL>*Fal`@$ycZ`3{ zgwQ|FEco`s%pqnO7L?LWF^U(Z3YjAnFT>~zi2i)ca0`QOrPnd$0Yn|jq3o_4D%r{$ zc)(SOS{x`clyb7niJ}=9dj1^&D?$iDB-Uj=2f|QrZoPD+DT9d(h#PHU*GxOBPup|q zJB|G*F(9*fJ9_&am;dp@@e^;TVc}^)Z@T38a?%?qsq-?_+-9$7y#i56>7Q-tmAXmk z%H@~K=E4Uq{4XWK!?FX{gbA#5y(d4j?!Z5qFwsF~GC!+atr^rk67F!hRPebcZqh_+`Xn}_`DU~*x zml)Qh+!mQtt!LE*KQH(D$Ujjd$xBf1J2 zuw7xgiulye;NrV3`mYt>!jQ4fS@xxt`_13I?Xy3qEp%cw^ef|47xQL$!_8O!=HK<7 z_-FB|+&|KqGZU|#HVa7jNDACCfWT`d#wWj4VZ^wTvpu$CU^ImyDPlw-A{HglwH}lQ z>6mW4;mkbt${5X;@+~tbRe@}yVwyzj%46u9Nzi^%9xx`d^D)dZxxs+^YmYpkN7a){ z)ULu!_4UXle#u9WDz)?tDY4~s3gQX7$4JkfEofJ)Bbg3W8bri`Jec`s#& zorvc)sc4P7aM<++D<01mUo&4%zHc^9{m1e_wKbWY+nh1xugyWT_-fz$ukvE)(G_6j ztNZ4gbXfkY>JjtsRL4Bo=$nJ}zB#hWn7?)BT_h09e8BO7k;%l+2_lFHD1BPC4qBdy zI0(z_*)OAPV-cpG%@D9DVqn8~(8FUQyhh_E!=QJF2-`l!oiXoYoYGo;c8`dum$$+} z-t~#_PP?%^5%YDtUsHnJbA#p^$}=@z>%B%TN1OFs7z65>Y%6D2S2#ySg|oa{VeI2u zL9bRVlusX)d89BF6XMng_!4I&O!LD+*Y1%+oSf$PeERxiAOVP)jEyA zS@U6QWn3GagKK+6CAfDI+fQc(?1}%Po8kb3nh%%H1akPPOv%0i$ z3_0X-9@7GY9I(gGGd7D9@w7PHvW9Ptq@DlsvRgKP9gx1V=H_j`=T4TV1^XOT7CNy@ z@%g;^V%~9}4SM*Q5ywTj=?-c+8aN#lndR6pGSxKe^<`6X|`n-uZfG*9=@6o)9 z-e_kWb^7_t>kEC1puh~toz@T{I}xBxRasNJlP5A|1( z&RCUmN58k53$_iBB7PqOA7bbw>r+T7S>USZ?=gx*il3@TM>UIcP5pOTlqSUNqh8vF z&t)g_Wq+L#15!fM-tF`)XT8Q5AI8WTcSs~6M=eoyO`L_V)H|4cAQ)ySuUVY;fYiB= zMAEt;hoBD&Md5x_57RzP?7JqbkXl~Vchd>Y(5NBgDVwM(c5J*(Z+^BRSAqX!gM`ImCTAlB626fZ>5zL z6OB-iNaIdu)KE$nNxrusFD{y_Mo%@yI;DSJQtpumUbA!k7x3SF1pNFBo7a5!lnwaH z;Eh?a9xNVNc?*ZwLkr`PvhH<==~6;g2a<)Z_`7cUeS8(ETeWS0{;ore!z{&^gjVJU z&)O^-^YK`1*s=B#`u9TKtRBf*jYSjJn`TgJo4C;-GKaCoUc+eu-jy1%*1uJ1U@ZHJ zGJtoL7Zg#UL?=NNZz@_*&r=&6S_M*>1pQP>T*5w@A7u{<$T=QxzCq)abJxc%vE$AN z19D1oAS#WjhNWKFOUgqmx}rW*Tsb50YrzjaHkLYgr3w{Q#3qkG^f_rVF-e+4iIrH( z&pd?~nAYLB>_b~V@-sX3ZvWU#+phn`t8TjbYfR~quGz^vR~CDnC@PgW4l?3|!EHNl zyt%Yy*ZMzR7`9($s`xS0z&X;HZ3L6_y(R{x5)}cG4(C9ad3@pogNPs^wHbJq!etvk zQQ)#YItGSt$A!;oOj4p1`99HT@uz(tC}FgO)EYkz)`*O+YCNr)6mIKB&FE>-zJ*@%qMDj}GViej_X`=Dm3F zz)g4keBVnZ74Z@B4Jblfc{0cQ<@R2zf6{c7Ufb(7)W@UU#{;f2lgz1{CpiRTCn{Cc zsA@x-^e7HB#TEr6TXi5s{et#Jz`SXnNa4X&mcD|oX3{DJ>+7;&#Hc;v5QCy@Nh`h4V*{miCPx-WXU=#eX`FhPM6&gO8yX zq$p;}sFRD$H7epC&5qh?(^}0lGyWvB1_UG8Sz7Wd$&?%Yt!1s80oN%pAfSp~H%-bd z4#Wl`h@vhkeD?{zU_cpZrvCAXp5+ zC`*^%T_t##(?T&oS#{1l0Lp1+;$>5eb|TKvz>CstyLbHCp_5iny6ErRa_!sa{NC%H z9Cl}%Nt~=1p9-9wS(t4SQwz3&1Ijs6!8sM2*diJ)vuAYmsM8@cVrvC0d&IJ=7;DJ% zq2@;>T)~Hi-!id;dyrcMAt}?u`NNm(f5VIk<|#9v@wOU8c{E@{65yJxPDg0{75?=iWpI)LIH6eZp?q$dP}SLa`?Vk4x#_wKg<6xPsorq=uGQCUy7nFN z4d+dJb+gE#-kqPbxuUd*5w6zElTSQh8Y?EDgNjW;F`z2S`%2`gUpAXycFy9t83tm2 zOuoD<(HDmprv{I8NcuG~Jc{f}X!!~v^Pn-tY^rHC()_|a2CYKo1}FeyCQnyTOdRKv z3#LEw*WGXb(=~T*{eR1`GhdnT;}2Ya`5(^avp=uiYJy|b<`z(`UpY-1MRxDX{Ka4rO? z5V^ZlKot<^30?CiYph=A`)s{t`$ulMarX!NIRLg+bdovOU325lvA@U~reV|crh-)! zvq0{&IaIe(hKU|qiY5l^gTi?t@lDj>s80umLlANRgq1^;&dJZF6l=;-xT*zVkBW_D z`?%OB5jRk<`$)3g10JrR;!rbQ3)gRj zM7PU-}&0 ztC(beDQr#+yX~n8aM!1={lriHotgXLwYP5iNxvmPx!bLJiKx*U=FqF zO4BZ;7iMUs;*}@qCOF92$XuYlprS&eNaep&k?wG)$#`TV-EdVp+w+Mv#UnBJI9E}F z{w%~GWk^9q+J+>5L`{V@cpw!`@untS-1P zI&p-CMEgT3(fV=IG^TK7TOA9B_gUv93UH-kl|f1oN+I`q)f8-T(|ZYUNiXtwC_DfZgq9q z%=P9>NC{n!gDqquRYujJ`aMzZgCu)`#Kv@e#$vV-vxb}cNr#33$t!oz$;N`!L>>lRl(29}60 zem=Q}#R1O?%YuT;k)Ul#Vx6(5i(r@>zzWC9>&ye10G*GellSu|<8RN+gw=gGkRH*k@`h z>0H0-ga48F>fUZAraVO z-p!{<^}jwG!|VyO)p55~udD!$l`|l@4Cc-UN^!`0IaWqM$@HSOz}64i%5-U7BLCe% zWxZ~S1V(+Yf8g(aZjMI!xNyhrq`21M#&S!pjRBCmxNL@iaM**6su-~EMwc};nW zvxhx^VF)oKzDf+F9F9Y$#tF9Dr)1sfo1@%_M+t5f`06aT{4jtSjd{+@_S&b!fUI!B z!QW+%{8H!$A@rmK6h3U`&$;x&8~(p1TStg2sM$oMqrGs%CeiB%l_V6hWzC^^jkn6& z`;I$){559k+i2x;TxTkQOQ%h#9UY@MS`DHB^xqR5$|Hj&!zKm?@*#Nqb!t|Wd{d%d zpM3zPZ7aFe=!%2bGR-hBZ6X1c9XWl4zcJ4PjsnWC5(p%?2N;hjuVLIr2j;i7-1Gfs znfl|H6k9$yWaopo7dg*uC<@q@M(?WWT%{bZ0(1?r)okZ6FgO@o2Kbcy!o#4 zAKkO=z?-l8(8f>j^y(_7n(cqjzW?J~Gs*Y`WJ3xzkNn)2DjTuEU{!^WnfX_*y<@|_ zJ+SfiH@$D)`@c@EuoN{g4xqt33`>Px2muCfp1g=U8%7jkDZ#jir?z5>rbaMYZh7zS zHJ5*M?H8&*U+%z#AC~a#qqOYS&Nxr(`C6AA5SFy6cI~|3U37o+4x7X0eBj>8|Jz^B z6KOU|^jrb9Qg=Z@^pNPoHo3KIA0^NQ{3@Xb>yCd+_Z{mPho#e^bkLvk1TJ|rHm z%s=1Hb0$0vs88$Z&hdAd2$9U?sv_at&Et2oo`VGxb}N2(_|^~Zde?jJ{lLE~PX~UJ zz1eB?iLxi*h2l`*0CfeSCnfWRD?a+qFTMGq-z4~MyuSXr)`!>JhI~@(Ag-OwcEBW6 zd9AI?u?h`VLqk-TB4dRsr|NS~trVpUzsK2hMy~l&LgUrsHk>l@VqHKTfmJCgujO_u z7LjmBV4nfdP6>fO6%@w&TlYoc$pdHAO{q(gS0Vz~`yt4$q>U-s(ZFPc;Mpwzc3^+h&w$V698Iu8R?;<7Lh3FLY^98wnPez z0ZC$SLUreHT-vbv^3Oc9;lY2Q@3F{dRD@Lla>CBrtP_Bzd+l3fm>ATFh>I@1g@S^a)r~wfGJTm(Hs=21Ab3AR_cEjYYS34^X zBd>qPCeS6nPD|OzgZbjb6a1tQcZy!(_TNviFCWRf^}ov(W^~_U`NGt!X-&L#O%3FeeQKm{mAQ_+U%>H(&B0-?96b^ zovFq{Yw<*T=+D@zC|U*-$_2l4`#b)}5x@Of-zfvzrXfOrG+@PWh}|R9$!?MnA6osUdR6o~o?*1~a|d6Th|L^WQ(?K-Ze zs@w2sQCcfanl4h%RdOA_+W7+g zsa=->+{%0Qf8bBM)#NpJn{J517OU`*p|K*k8X*fMS$c=vk;)zUhH z{*%k^Tlb|$>$9(l%jAsa$vLvWGR_k@MxAcc%%Dd78<&0NM=!hf1E25K;_pw`S7$}9 z>iaRBJEYv#8@emAiNE;J_4oYLHDvDh-FnvzXV{QG@2_)Gy}%7uUbS!c9eZx0S9kea z$>G;FS7heNS}QzKZJSmEIHC?A>OO31X%z_;1v%qt+!V^I3{9I<#}Uq+CmUUJsNOO2 zmEPG!)%o$iuD)j5uIqMR`%upet4F-WH_X<1)gzPL=@|2JcwoA&$5$Cc-x? zDuzeA@S`U~(MfT1i4>rl42iwz`TW#lBwskdIJIf?_YMC^GyAI4JW_3%$Gk;_9A@o( zSA72dHTS%QYUH#@)ZUs*%o9lN9GUFG25QHzg^P(?4aOM5KmI$Qs24>b@ zFtgJg^Jsm}JUKxEX`*SKm~1&uOtiemC)(lRdejg*wWT#{nv8J=#kPSG;PMupa>=_mdMm^-o_e32H^&?wuJ@); zV15H2D!A#(=b9bPRgV3%t+ctMWI(Nk+sR}9iTvQ%SKPAYkFL0N(|-h#UG+q*`MPga zj=1xy2Ik@DkU2QfHisHbyM_3k zaUV8kruC{40^nuIC8-~aNGuoMbkWy7a{YsE62g$eMHrM#>2TJfqd~9UFQwH%n7$V7 zTqNVMe&dF1FP~9AzMu4@8jyXr-n^kTJ3B3WzCo@)9SCiEHQxH0EZiii1|Q6D)9+%-q=d*)zSU2quT%RxamWjUVWW{zL?YE(-E^OzJn_y$ zsJm8{1k{xxG!pHZx%1My&->urYrfj`Pz-|-dIb2aFUlcF`h-wi4WtA)-LroGyVl-u z@t0wP@WLbsDN@X&Y7E<_c;7-7OU6$TRB>(<_uaewLvLMs=cdo70Fq<5lM(^yn zI%VC#g8h68+3e(OJ~!q0fe##97c6`*Z%+1IxAsKdnK+#Ht1)SWi>_V!l`HmN``h0z z&3`!S4!{5M`?vnvF3WF7@zDTSFBIKe#l#RqRJ5mCF+!XT{M%JUI2%dHajF4rozp#Q z_y6jadp3Srin}@Muxw#*ScXhQ)v`Wu=zzCAdi95X_55qk|1BSgwoAl608XB$(#)9z zd&2834wAF9uXWvd$G$x;dC*^`FK}EI+za{cQ8|S3kRTL`8R1q?5=El6es@8674##r zqZY$RQo!y!3CQVj_BkV6AU(D)BQNA*yr9SOnN%l~)+TG&p`=3utBP;35>$eZ589&B z_){<2TYU7%^w*-5tVHmh{&A0bp9Q1i=<8TrD#k~Kz-lA$KLtI?JFNZCx-ad&;+}VH z_|%oZ@yNkhbJomi888#$`!>9w33@p{*cK#9@KO<{w8{#o%B~Z|95y1=8b5mf`0o~?895#p5|%~g z_42k;c3wP5;Yc!H*SlYL<8_}G{gr?I3SccRUg~wTZq0KmtU{VqQR~EPt8X-XBO7nq zoEty2%tu@?Tc!$_BvmzEjRw5K`Mk6F)~kP)el-*Qcv$g0!00f9(>yGrp1`6)y>pl~ z@7{68Ki+fwZSQ;1^j>$#{>%R#7@64(m+buDyFP#MZ>KO7HEd!!YW-UFlh*9gzB&5u zB9}yZo4qgu=3RGS?U(OZbLX4S`_%b=$}&cu3K~5H$+1KgalW+ALJUa}fqdkbf9bZj z|5x?Y3E)vVQf|Gkf9aj4_rcCB-D4*p|_Mjv5pt<0Y}6m#vBZt8dKW?X+9wflKax z`=#ZfT`S5BANg-66@^65rgl{`R+Cc;|(`0p1=Yh`CiLW>k$q zjpY82h{PH;Xu8&5ivw)=B>LRsSvK!`*QIxS;H%Y{z|28OiJ&bcYJJP`!2y8L0LoJS zM(tEB*#V&+Nnf{`=HAOb^o}*3-th#_w|bFZKcgk%?U38(qgeX|RaZY1`4vB{n7du*qnzN=eip{&7^KUB zo-fUjs(H1}HM_R{_U`L$c{39*yym)_Cf|SUn*RvAd`?7E?%nNH#AL@6tpV8wcDz*Fl1eKp^m=5z{m4lf&i8+#+rDm@+ zb;pjoeoSk5=WW}66Y~&lxoN{!9-E2(nMc8%2kYYcd#?PbGo@l<@^fm0h6NZxWiGOh z#i$h(;RRz&S3>S1(z?TVxJ19Vt-0mhYwo}7%PA_}3B}-20EqcpfNFzkrW7srTCutB z>igbw#jeY~TArR@ul3AiQ0_Y2nBcxfs4PZ%^${4DFRSi>C&DP5jPv&?pWBTBo7@!) zlMUyV#N(_GlNFF->u@NGM?KE*+Z+LlLKIhpAL3aTqJ#3-iiGls#6GB#fU)GJ9@)8C zP_#y-}0#8&>a%&8rg}_MlZw=iUUGd(aB7Q$taF`nnaE*OjO?w zJgFh|9Qw`@kgP;?v++agzi{Uz``^9wBUgP{&3*5^;{JcI!bFFtAV8!cC4-Si7u<5u z-)=gv`HKhE-~XTwGKN`uhsGEc|NMh(eI!;44-_ zVG8v7I35}QEG9>fLtK;-lLLITe$_JCcU<;ZtzI*C zt-bl55v7K2{KSQS<>R;rI#uj4ash*mXP;4>yXG~rCs?skq-IIo6%zkBD_yWaSYJKpe^b5~9%QlMRMduX z!^5=fFrV<>R_9O$a_2>NoPYjB!`Gt znP;(@H0Nn(Bq0I*{1&rxJ$>FuaYz!F5wU=ev8dbdNsuO`9an{L?tzt3wXdO_Lw3W48-5lAsV?hJDm&0+ORcm0sXy;8bZaxF`~RUo~+X zO)CTys~$voX^SCb{PF8P_H!5RxcIk9Rr=~+P>@J!@z>5OXVnQ|dcIs2`bjk)95U{X z8?R=$ds$-`#A&;S`m_?!>ga_ufTYP~JhTo3a_HYA2!##joZkxN)lpTVi;*70j59poxXY*WLr3fYm2YFHX@m?<{Hm3M6T=sg?n{guo2T>g7! zMXTm(ChAT&Q)$+1;ds^iEqbO;o5mySuV3@oPhI<|fBpXZFZnuI3~4x!t3ckJTt$u% zC`8~SQz_U)Ac8P?#+b)#zJ23|@7Z+UTQ9zQ?Y|FI;K+vULVlRwvka))DFfv#Hg!0# z#UL2Obkz$ms&k9;=KcH5|MekkvH3%f0U^i`qTR$G9U=lc@1}SDjSqg1Ln}VqnKl1; z@4LTVqAc^RThIH8uio;-?>SQqh*s%1!n5|`n8iD$ds}zI8uemLj~$L<9S_~FW=0hn zrB=b`OGCA>4dbfw;k&QGatU;i~nHCROcp~uunY| zl0#{<`PQxf_jP-({R1H3)afRN9^7%~kAsF~2iD&D3mSyPGB)&K8+? zF#M(fF-dx7{?~T49_P z2Wl~^C9D)a)j3XTp6d5Nvd|{N)juFpZx4(Gx*j&U7g0E2@*=)hGmp~NJo zO%?eN#>Q``t8(++wYUAVimA3Qy=}wS&+;cbNJt)H+t>6qc2fU~gI#UPTJ^dVSdL4IsWzXA|HLlgz{r_U_+u??0-WXkpE@Ykp_S zugxO|Kh@!TPGCH}9&<%0sL%I28@MV5Up_K>#Dr7gdO=O4LtX`FfaW>&J4!-A(j2KO z_8E(I2(=d&qzew6&rlMI=yt4X;Lx8G%^N0Av+7KoQF#z0qP12fL@7Cp7VIAv>Oh8< zE>Bs}$4ITjMj(nljs>H}{XoVshR-^hpsh%?8+J>v_b>&bJ(?Gx&VfSU^St6=#|eW% zGph@H)$-$+0V>TMlx+q+BoQFboaLlQLP8Ig+>#@4gSMNLq*LqQany@)FaF(aYa;AdjBl2a2_ow3)Z&3Izs& z9gg;><$q(!_s&w3VWC~R|AoL<%3~;emfl=yJL>@C4&6bPCsDmT-5wt4q#xRJ?~fC| zx7O`m|J$p=+I${nm2xYIB;4wg+bg?`VREqB{lYDu{UMZdTNiA+;6F&_qT~ceFqffMPtKVz^FICIi$2y7eYPnaX;^pRWFwqZ%Zt4K=kzU{q#p2&q~hX}6>p_}$N zh@v_Y1BA=+*i=|oO)KWp>pt<*AGrOJuQls&y@5&kqjkSEwbFt7eVngO+;*#BEknP^ z>rl<_e@8JA7{VX!ENt-has-?Ol7%Th@PK^OqL$SyMrhqxtBpt+XHL)pbma zqRJvckD(gUTn9R&0~>6C3U^&I!GxJ?`sOR!KK(iloc3#+*UcX1={%(`M-_GBU+(^u z*_*cS{=g;s*FL1fHwg-uM+U@3tD{e-qw&}VQo4KGU~2p&8n`vTv*9b>k0AU4H~eHu z{hi7S${%q+v!(}_F;^YgYd^K?7r)h~K7K$JEdcGO?Sl32>55^YWeXwmA*FDj{ix_# z66VrMkO8qh+~w$5Rv*c3)d|sWTq5Qx&~>Y~O6E)3KJ&c@`m`oYV^;OxGC{nO<;3bd zAm6A?2m`50U~F)^0wSvkJ2d|zf9#w#joDc5`UHS@R$&fTgd>E#gw_I0Wc{>irVq2% z7z;u)q3gqwVSL>mv*P_CF@I<~)E84m_>Dec! zNcog5$m8(lCoKY*O_YKouyCatlXBpZa>GASTT~VcT#1B(OFB?2RgO+2YHeFjb;ncD zf!auN>;=FoHNR{wzVU;f{`fT?`{lRZfBqkiSWG7*yp-|KI48r{uLdO~2zvlEVQ19P zSQ#1?VVT3V&w*R%s3)=vNRB^K5MnbB+YDcA2!dRv&_P`Xb&RI?JSA#iZOz0O_!3Bm z&z6`K&UY3Y?DslOscbh@rwebt;!G?tLXI^a_TcFz-sl{K?w&~RzC zZd-mC1Khyo1A;c?d2Er|>re*gq^qZ9vaS0!KY07vTi$;8=Pv)e)RN_i_V5bD5-yUe z1&EhhHXW+ONZD%?l3vS9Qo}MJB3fJo3Ja&qg6XYj5OF=6KaRdrD81Qs1hK5)O}(sH zFRiRK$r|=I-m~tZ``6y{j7(Iedc%!va)^%bRHXxyJAwe$RqX%mz zQ1mfq*>0^(HBib?{sGSV*fk%0)8%)p`MiTd?8&$Qg>6#zlARkqy65`cZ`*j)x-ad! zdEZ+x4*uG0Yrl42&w*dqc;))f?7#J{cOXm=T(x8SCwA@H^}cP_Z2iQoH|~8G8G>x* z%{xDL{Z%)-W7l;zd~DBkH@_3{wru;(tM1x;!_DjT+VsapnE3gLu9eD1rMizb9?v!w z^(s#03%I67#;ZX{f6b0<+iu*o#}-Nv4VjB~uls{u6u%a2MOgTQ+OXVr7kZ24!y6y^ zTQ4TQEa=!Jud%yUG7w{EM%ZE<5_4y$>{`YLX`@NSQSo>Le$-^Rg@gG%g z2cyG*DIv@l`a-!s%u|nsVA|K;b%~-S^Hbx32sA{kJ~wCXLC~?b~kS=aw07(!#yZWjw~SvdY1t zE?>_%0we=a6opDZ*sCUgZz1fJ+ETcgDVZb5BHjpEN(eEu2%QspX?PVF zCbWDNh8mKrQ?>Kdsui|J@qjAqi+5k~x&0gOeV0P&rDWtunCM}rH=|0FvR~rU4-pVa zLslBLsRb8IP^kUcXQO zPEgo8318uPzeT&d=*xKQ*tPu{RAhnb;<7X4&$LRts9TL2aRm@YG66(~YxiC8l@DKb z_gmTZ_Voo_EHp9v$`RRK(W9G%IAl7CPAxu$ra{h&E{=x76-Oa3Pxg+OZhdIxk+_+o zlYDO?M>ay3*US5|t!7;}y7bOVkf6Em*Q`qOb6jJ(#rWs5JxuV?x|`Pi0fxLGKuMAP zMe8p9L)Vw~{&&Cd+!HgG%s;f{!JmZPbXZ+uLeaa~b5JF9-ZDS1^|S{^w<0-S)LSGY z=xVH*P`u+<5l;UWrr<%eC`3_v$fKt?7mvh;Op}25P@{wF2=X@NS)_H4Bmsez49VO~ z*F0W6fsALZo%`7|0O2X9o=5VR&E;N$x33q<7jkHTU z8omyN@0!~vPmrZ4gPt|oISm21ZrQzO%Y~cQeCWH6&hjIk&j_5f18YdT)?U&8<$b$TBr$O0`{8-&A3_TIPs z!|zzLcipFt`I0BaQz(a#bnsl{))6AboJh-^p{9K#}k2xJNp3Gn7-B zX4;bJL{yQ4Djwl|8}5G7ntfM%PQ6fu5FHdnR;e2qi((dDsxWdv9!1^47(?#>PKwb96nN#YN9Y#))~M1rey6zu3H#%KY?cW_qC z%x5StaE{Q^lN}}wCn0h&oEGp#1Vhb{5cJ}DVDEv8pU?O#KjyoSz)3S8(BMdN;Il+P zm!xr9v^t7e1QJkmnE2*k5$Py}u6$@E-|%X6lO~o##wV$sR)J4KZ!zdkX5(!eKD~eQ z{`Z{N62fN=ApG|^l8!LPac)0kMi+|((4fnnk2+l?pR(b`+-=e5NAd6_i`l-S*5xGac zwRE(II&>I{rKSibA`naId7n^gqmqz-C`XRO#%&uv8U>sXT$^vY_Wo{8_2kRw62?zK zTX4}G7k&A`%^&$?7>P@tehd$d?-(7)-|^e&;D)5&#$L+l2>g_^tMtmPkXZ`aS?jxk zV^mQ1Pq?j>Z`$+TKWmpV;(?^DmdBD`TQzky3_yKiFk&d*nm0Rl%6G_XQtx%;wrsJi zZc;J;6|&vTbSokiIyl)LIHG=($z7_CvRcOWs6Xlhys3?B4~IjwC0z;x)yCPEqzE-n zWtd%H4``?HSh@v@HZLiiIvQ9!fi9)Enk=??+BlajTuStTOizhc32Sy-@y8VWHB}g2 zbHXPBr}n&}vX{|vIxRlxN%P`>KRlA+6d|`Is8O7rQX@d7ps5zM2ou`+2T^h{7|Maz znh(((`+`E`yQ+Ot!2-E+%l`8&z4h|1q)-m6P!;_wPR5At*|q!K^z}|?8Txa!$P3mI z5CTg&QWIHW(WL%EQo^d@9YTEMJHYNBY0g&iRqhqvwfoLrQ1UNuj`k~QG>Fwt^NS7H zb!N?xM!miQat`MSvhHwqA|i^9Y`yPSFTLmTFV9hm<`7NhUFHjJ*BH_&Sk}4~^EZ~^ z=#nFmD#3u1ykt^zkScFdp{ban5)pJ#TI`AmgMq1a^HglKbnT9HuYn(=L-GZ&j!xwe z+iC?=EFakTk+)p5@8YkjaL|0E>Nf1J$o1?Isy}F5YdvlIXhZS@z}s~4(D?p z-}TWSB0ofr&Y`*U<~!ed_wM_@+gL3B{Y8wxNjY@&x#(FNrz-5B5J_b@KJ^R(JWO_! zt!foVT+XUIQ%Pj#a7IqYHfRF#VIzr3sC)-uGDpZIw_f}kcU^h^d2jmg`~EQE_ZW6Y zme2kF+j|f2IIifKLOS0rR&P}`N&B=9K70b3N)!2Ij2@)U)k^l&>0W4te zq(oAbWYsvX@o)Rab`q!fCUzX#k}Qd$*wD64pE>{g&60}bB8vqQNbcxafdF~VrwpN56#Eif~9Vs=V`A(Z12g8@pl?b`lC@Bu6R*Nr8w) zm1D3+;2qmQ2l4kH4*68b;Vll(e6M*xL(T-B+=p6spt|>jSFJK*`vIsx#e(lu3%n02H!r z&I1Vv1F_yxHY#O`Bxi%sr%i>7#t1P5pa5P|&L+{NIol(Fg+Tf0M`bVoF3YJ#v~ffU z$NxYI=(~GJ&nO|8bxV$*#>-56#{|MGc22SMQeDBy z`~2((ydxV(KIkQDB*iTC#6mI1#p7W*jk-4JFwvAEEt_%;xa^J>)zHgx1Pcl*V6#Ow zZ1_mrR0ughtD}<1{IzrTKDy-KNA6oc^}7lnpGg+a2}123yLvWRvc_Jm(4XtAqEMxQykwu?y-YQ9{%|K zT@QX0a0CEH5KJM$&j4IO~)dJUw*fc{uOOn1kJEH81-jM!jRKZpr}yk zdAtJ)%{#Jzq@>yqIyOO!Yd=Ahb4;-dRlU9aw~S0@T#kxFq{RgCX}O3+(I)Z`lAlGQ z?1YY}X=&!42FJ7zvMMP(aJ2d8?-TQT&XW3PlalIIsflCgGgKzbJ1}8>_D^V#eAuvb z{a+K|Z(PfSuh(e_9;QU02c$qMGiZoh!5P6-1tc3Q$2k)%2@6X(8l|NLkvM~f3bqfd zS6Gq&2I9U#s>>1@uL;5U2^#o56n$Tb)*L7}a^JV0qxLJwa__>B{M?^(>_E_T@^Tct zN0uJ^b(57+6PHf@VqH9G0{j%CDiI1j1gSy?jTT%1BtDC!5XDp3FX)5z7zj@uiZTXD zzoaWBLia%L7frk;Jh!m}ojpK&eZ432R-4DU=YvNED1<B9f;qErPK@XGOy zjKD9xa)bD%-7t%)hQLi0>VO_%y`btZ1tk$Ihw_hTA0eNy^7IM;Ru3Z?4Qv|FCD0tG z)>s-KTbPSN2{H`8UKk@-ss|2vmrXP}h(r9YyfuU}sV;@(uY~L2K|=zT5cmN~O+<8~ zDt6Sxg4Go2)YJ|pi>ZLT;vze-b0X$ch9p?T+0KawsXj3HW2H12qH#eF@-|9lisovP z0OL6DDwLn|f_+!c|Ly)!lUwL6I8c34Vf5>0Ct1%m<2oPue?VpZ(L<}p{e2;m&zOLz zg2c&oOx$+c^saHw!5R$Vk;?WrKJo!<$z}|KAm|)mOV%xbH!Q8Z30#r`JuU$3$pDHZ zZd@{g!u3=b>5dV-tPTy>FGcXvBZU8{v|SP~}bD zI0ElT2GY+hOf0&-J~Md<3xW!OCnC%UkV`+0%wW#pH;5qsa7Q_bB~4y5=%^Edcn4y1 zc+m3=@%8#de-~sH#oPTi51&AXr)%6roVvCyl#EYzEhqK-m(>21a=% zX>Q^7^exn&JTf*$&Oy3F<@J!#QL5;ea8bvi1nbiQ;CDO@hEM_vor$1=s$*}fVf?NR z&Kv$X7UdL>dW4HLO;$v~-be3TmKJt49Nyo!=l|TX?T&v*qW58*DYA*36AwSUVBbgP zt()~F8WPfP%CI;YhZFyr%nZtF^d&rGpM&6({zVPw0-T{l-6&^$1K{Lf;SLSqeb;F{n)z5#8`XW)gr2O@b&!Y{9 zw67rkWs(zP0UKXrkPYxKDX$a@B`zi7l|INNoE|^-R)fBQK*J_}=i<+PwIr8Dhmxbl zG{y2lTh4iQTGF9q12hKqi?W1bB&0)HY@`oOi9L3j(A6}Ex)H%F1|A5{v*P1zkN@Uz ze!7U}Ss^7PN|F<0FK?@HIGBT3dGGQFfMp;1bj!WpFB*28h^DH5<%DcbAi4*gUu+^G zurz|HkaL~nsZ??SXeZE6&6EgbM~!tt9C=jA0e}J;Mkue4bsTV4h;L&khon8@#V6N3 z{(E@skQQ8o9W1InKEh)ONK-TMv9+Igen813G{|}c0DapGQ~I$xpeW81#u+-@Rh41)s!=B{)|VldE7H=(d;Kyu3mXB^|@v@O?}GZh0jiFnEK4R zbzS%0(|q4IagH~T!8nMC=wlbb6+dH;6euolL;$93gTys`qNNhv@+=>yOe&3b7kV01 z?#_MxOTR|%gRn!u+|U5XLyrlZ5{p&yYU}Z3k6$w~o*B|}<4RaB27LoTl$Eq%=6myU zewc@NAqOc%kmnfjxE&ui56ZU`myj7u8MQ${RT-&42XR^j+0h+LG zL}tbiQw{L*GUtH`nBWWm;%fu87by_{r9_hO8r9YTq;QJ-y@)(hh&=l*#shq?#|&GZ z(%8K4bAc*k7Bnv$Uq}@aR@!D~+<^$buHsx(00pM5oq1^c!fp3I@bClQq8Psf|Cfmy zraZoH-p)IxZl3z(0iJ^!Ae5=&02Lspw<7KZ8%1(DmvRFEFd{7S!tCX(%eS>GYne=& z2g+_z{o?xCJTJx;E}cId_ba$hMctR2S`*SeVn$B^6P9$0a1=_8i2zvKATX0W?y(%a zC+WTyK@6pPn-+b-OO|~*h>&V~3-GU^Jgv$t1SCqOsKrBP3YtaZUEgmSma`Um}$;Cs2DZK}d{^zEUL|y3OQqgnySG zWD<4mL4{Nz9g@IWWO|PZy61CnjtQ%PXlPJMvDpQ zFH=&96_4r`L`jQ^S&>K|s^Affo2+pO>PscB^7A5dE;Mn~2*HJ>J6<2)eM3a#D13lL zC=z*dNFTtJc@We5EPP-fnND~qA_jUaPEBVL2?P|^0}*b=!h?6rTEF0cX_J^}*^_U_ zyj}N9+%WlZ8b1eJ2y*b0ao_kL($N@7bWfZ`U|q^VNC-)%Yx(*Ki0jYxA)$CCgebRh zrNph#C1zJssmPUh6)E|cmOBzxR4m!Vf+tl0WCLmfrw6qHz#M5 z6yboOieSR!9tk!?f_0yjf1?w7~Sl6=lzA{L#atx&rpr$Jzwvm$pMay(;%cjJ%I6}{eWdF!b1wSWuM?z=e zI!4P#`TElqgfqhRr&5hmf{X=m4)6>rWqN?G;(f{mk0E|20tCGP{162V#8U+g0%(On z8;ayPk_NaPM5M)e&ssn2iSGK14`SzF8K9U*^JYf()JJ#C+i?$>ekH)m=gXuj*9may`?PdLf?VwiZc3ds_nuF%=a zvN)QAXlvkN7b15yk|{ao8%|M0G||qIh#X?(l6?~v4H3`PKxU$)r{r6Rb_6za(cFhI zv}1?n@Lrvt3WWsMhZ6(Wu#ixjoM77ck6@crYot~eDY??&lcjFt;#iJE&y_LB-iH(c zIZ9Wg)GH(ND1vBbq~Q9l5Tq4zfZ4Is>;2WCJJv2zXqhF7D8N}h)-Q?djo@fu!P++g zxeyU%X&dXir_Nsg(BVv4WZ9k`^m#ID$J|Z#Pg(ciQ6Na7@kxMdL8%#KU`1>s@et0O z($ihycoz;Hf+x{0_jCkEQG5>hDB_1f=dwIj^tb};GhJSoUS<(E@WglB*7x0noV}f z4VxPNub7ju$-%5Pko|b59?$dszlaGMwB;+ur5b@j-9S=84S$ut0tlAuz!N}I;@AMN z7?{AgOL52|kmW0|RTM^^ZJ6!PSu~OKk_R7STbee1YJThd zXLqjI@t2#|Y!QgmcBuxX@;(r=Y0QDzx+N6TPd`UjB;=^%_<8OVzb zCQ3R{C&#rvOFxXtUbJ9Zm@_&gZG8N$P%1(&FO6*{(i|J|2g*)xP9sh|)I_m)qK$`0 z7@P`xc%LL&a89!~O*^oue*NUhJE#6Fi3MWiW%IYr-oK||`-77HDuTtIM`5C zG~GpHA@W)O@pp0nKt7})f0O=L(e3qW)VgAh58Mb{xEM*@poD}oG;2Px=HvfO?M%u< zsbm>a8Imq}G$+nN@Gfu*Bx`7aBvoh}@unUWycKM)D$0ZXc26pZG;EMAiWC!Fl90h?ufdm1mvI;N^B3m4K1fq^!2(}2a zLPhsAdf?wSE_@Lz^qT6CKw`y_9?K;t-aaaOvN*S~{!nG}IFAeR4m>pnVQ$(0TriiZ z5gz$}kfaF(1ORR;c<5+)#vmjfgTG4*s#-B@5)jHjp96U+%A79NDF<<`1C)(PzS=sX zc6hOyD33^ytOr0C;E24_YRu<5d{*F5*8(jY2i+hW)hB@!^1V?;ts@Qh(9_ef*{++j zapu%*GoL2J74-`#Ti-Zi!-R30A9@-EVDvxIK%lviM7{~dSr2wzWO{t5VZ7&ie)Rl= zS{s>HrG=`(2w}wOI7^>4STakRyyRpakW>pfjS`R!R1jAM69)Rh)E|p9tuP-hwSt7T%Zi@B93mTjqq?jb|B1zj7^mdG)X zYB<;ope2=um9GpX+;lRI=y-rl+&1CKR076JSa3-X4gVPF?@xgdtgP)^I5>H&jStsL33yY5j-%Q z4K&?J+8HJs@Cb+>gV%A-FrhX_&m9P@C@(cj1tAts4(Y|@YMElVk*(o8{c8Tqz%{B6 zJ8K+8Xe^W(A_aC5(~DHlB8YDJnp3nuv3gmazr3lCv^b^$Mc$OPIM{rW@J}D`Syhla zjaD*RwS%5SU*u&ArG-uPPbsI*&OejUU@LTp=-;{(mSqLp&^hkYJL#Q@*Lu%DYF%Sb#jAJ3@obSl}G=p@x z!cM=G*Ll#xmp*QSN$in3A25L);)BSs3}OwgMsCLRJ<43vJ3qUO5Jn^VH!8yvtAt<( zIEWz#XCVVIA1~@Gk%PPi49Wh-PvcS!O69#SegsbQ&il*h%N z`J3MXR;n2X&3+W_+#Ji+JhbzHAFY_O;=u(679J$O6XML$8LfM;WBihXjr&5_Ig|Tl zN~vaT_q9JbXWy)YF_i9tg2J{=-TB7~&Ku`!Vv}}g3#k+8hBR63IPa@PUnGHC$tTr; zbK5;Z=;&LLvpFY?LgLNQogd8!!e{xIGt@O9bT^5&Q;0!r^Js2F&n{rmE(d&V9+-Z`c!9l zZ_0#UM>z(iR8|D0#slC_Lq)qpHf2~S=;DJo5VaP|G6?0x103Z@2TO@en&K>#M?6+Q zz4fw^u(+VBbD6)W$a63xwPJvJCd%An0&dFWY#MDIbn`>g2{$$AG1Fo}(yr&$m@?Ch z77r{U=!68A2V}|>gMgrd#YjMLBwj=WZpDPRWuEkok0wD#A8fn(2SLmmBU}2b9ZNfI ze`xyyKd__{+d6ssZS_0mK4$~n3j;DJT%}H}pV9fi^!*Qg1-Up%e-Qj(Mt0-G)ekM& zx9Az-g>+5Y_?JnRI)i)Q3`)3k4-h-=vN=i!CeM}}MFYBKP|$^|Nf@Bnp3H%O2oP=( z;+)XiLh8VZ2?Uo27+jJTMu1_^b$7}-TC`rcB%?-bAp-M~_EuCjgS$*rETzq)Eci~` zcNrZw#G&|}NUnq}CaW`g&1jLkVNl$DGt$J-l$K`mj~fhC$^QJ>W^?b#E~ zYaf6<9LPqcn4)OKgqX~Fjw=L;l|U+rT%INXf&vcBtEk^fra@jj2;79Bt3fGSk`gT8 z*6E}FedE&2AI0faHjuY>jo-Crk-)_4rQ@HmH1k#$22frI4?Z6X;?&xb{78o#ya0kB zq1xbS_&?p;XW8hKlYo2%4ul8-sYhPvDCJNYQ-CaAg2j&SZ$J3kDE9azUV`SU;vo|m zaw@EW8q`|c(c=;%r6X_OkZqd0actwx#=RH|^q2{^&e-}H>+fH-W7#$lostq{77a9n z*FCsyV*S>6dx-DhVM(puHRo$JVs+j-=Ku8Z)~89v<+3`kIG+Q}1q&7|SPcc;Mmhm2 z><^|cpY$(oQW)XExiAKZvo3pnU;eZl#?dpObR{&(R>)E6LhLVGYU-mPw;+%P_08x| z&sr!FbfF9h2l@*!2{GR3dk3Q3^p#-6GJYOYj3BV#cH*U8+SC5<`|*Ox267&=YS1>2 z1uGV8T+qIty1BWr{zP!>*SuP*)>MlyzK0xM80ZDTsFhHdB6wfKHKJ-L@dYTcCCFzK zfP$S&yg`@|kax0M@Ko-pzkx`ig2y|Li~Mdq75r(#)k-%wMxoA>itubO(aZ9+NX`Nb zu*lc?DIbN2gvELNof>mRb5nMITV zy!+V;OBXvL8J+!Fo*h_dFqwS#64WM!Mcfd<72wxtm!VsgV@Quc)aMYn>XZ04Bn3%2 z&{m-0L_&JR2S9WXpc+9%hY$|(kwYN`ll?S9LV{Vix2ZphglfLr=rcnKQ`o!q(UTj-Ns_(n+Fb zBEBP$J+ka1@dwNR-9@*98!V${m|L4++=iH-l0?Y^lFUAY!%yc< zTz{6k?iq?v0NF5sh58-o>;0;+r+UB1>||&-!=|qu|F5#{r_k$>oV?4LcQo(ZIAzWF z$cQ;GL4xzxobHCbt&>(wPp8omM2FBWSgdK^lFeNcx~Cd3^h2OTRd9NlkOrJNut)&t zipauMBSj@mp_t3Fsstdnm=_!YW5l>e)xjghT_TeboaU^|f4R*L9WBhAvZs2v>+!P> zQgo&V9p@Ad==s!AkJ|BMCIMkiUc%ZW>+o4YbaVDt(A>DE1dCvVHtOQ$re}ZE^}bqv zKWG~WBsw|lJFzv;O+sKRu+S;v0GyAqQ4x5o$QXhYb!Z0RpTt=v2@{z->hQY=nnm_Q z^c&Q|B@{qGait#)+ULGnC&FNyHx&tReW|a7x2IY)Ntl$iuOioOx{Q=nVj>V5`}GI* zfOG#=K&o@WLJyFANSF{F$^T=XP*0?8_^>{jI%QKL_#WzLgbHT?eS>jA=kcC|D5B3M z!ontwc^}#L0VohtG<*Hjb@wgWxnQ5`n-PIdhxlOk>@D{;Z(p{}g-{|bi0J3AjpMuT zo4cP2)=utZqOFu0?!Gmt^zG1^0*Nz(QWM( zAc_Z1k0fA;gpnZI7Y(&;HHbxD71Fecl#;0LK`d2VZKSXcA}*>;(9}YzN!0bq zF~mmz-ErKhC_~{PMqeXg&1ktN&ky>ZN>sp2MEwtbwzNe{Zxl~r@i0`BJR#pf`e>+E zBVvS^7{sBVLcpB74do+_;#Op4C3+srMFNl{hQN^$V!jTTtzJwX+qPiO&9bLwan3jq zSD&(V+!M>DEMClFkli5uf~m2k+ZOHbnASQyM4+XM3FK}XTe5A*wyo2)-$z+m0zG)Q z2&@q{8{ZaY`{p0~EjL%T_oe<1fi$rj zNArcgl7kQjxPS<%G{1R@U5%3>iq|8HH>mSc+(z|pPDV7O;EM0D1a*`z1{rQzIixV0I8lmYZJ$%R`BaULm4aLeg!x z*Ig~@xRSba8uIw*WCHJx zJ{r zT1M3&=Z`?G7)tRV^Fv~yU)*U|Uj0st0AXY#TX;?5s)#F>LL)RGBkLqyvF__|h7vqn zXsDWm5}>_GBux={N0c9Qkk*maXF=NtG%sWyBAmw*S7(NsJeFjclbBy7JVSZZqrvuj^*vn6lck~N>k_9#zVKjrC~gINgjq8uQJb~UPbRgRw=5G=kNl}FVvKLutYsPV9kK*NLv8r1G<(}OrVNH7+q_6ym6e$Y#<-k9{eAQ zNP)dV+=vo~ZcDxnO_J(Ed>GFA<2k&DF#(64 z1e_zq0)j)6%zqK45LBj&!HrS{DmM~_r@m;+!Gjny#44JxcE-2XEbO>@-ln-n!?-h| zsP^%huuH2vK;i{<0! z(G)COOd9att{iU~fkDead~OT*u)hXn43Z20e!|w_-;7NF?rf3tK*aI@#wPM6!*eJ( zjjH02Mh+oXC>*5~i10fGWF1gbu3W&&WC9oXsVa}*zC;{Am1)`pX!AH*$RZPCEQSGs z2Ff(4YR$>N@EjnIa*s&PrffMxI4w}snSr=cDygAtE6UI+RsEvN0v)W_?2S{tGEnTl zWrT6{^apo3F`ub(w&>;Y`AOYwkh8bD8I$_y?A|7_s05-pPq4K;@1fA4Ir@BzG1~vMK4=rh{=IX z3wHh%ULTvaa>}=0wOFmY@nczj;zJ?JdwJfAVwV8dZ3X&SsY*r?t<8gQSiGQ&TYCSO zTcC6fZM++Xp(|NC)0d1lAt z&wY^K&vQ22|1~=-UK3|EFP-2o-d11*y{Wt5@x0%2b4tv-fX(So6GBz~5?;2;;;leB zOf;`v{Ahb)=ck)iH9XnFk4>Gre%x0|N@27JC46qdsU6*rf>2O5&e`yZIXkC6%HqCY zVlRq`aX3G2yl-CD{JjOe$bb$-USq|~urJfGu;u=hTh|;wHb}iCnH$#VqLz~jyyuny zcI*Q)HqQK8RZwFYH}lgi4Lg6=^NRzDoVe;YkwIyqo2-=Z4QB*4k6-swcD0=-NOrOy z^|IGuc<6q0iTQO!mQ_!P#bh5Vrg~(2O%#*;RrzFpbvDzJ!9&YtPRnehCHIRbN83{N zMnq(KK16AR^V*pY=2^CONT2*5eK^WSq2D{a#0tY~!MuUE8a@8;Tk>*m zazN-wKsLuPrJR}>lVWpr&pzBTWknOw0F0Co^+@J#Sg>!?{4HZ^&6d40i0fS^Ia9fcOQ`FWt5zsxaiA?oYJeWuLXl|- zn7E>jp1b0uMBHPQV@Qtxl`5r#D3lQQK`xV|?@*a0Uwd3z6ru!|By2Q%PhdI{O{53O znNUT$48V*u(NM)A#)IiXyEzh71Y133pz+}Yr!@5YV59>eQM~Fft zpne`H#G6Ryv(Za0RS&BAr5@6_&p$%ME1Nnn|nbm+fD+g*FNgTp}4P z#3J3%D#2dxWI-6$7H4 zGHGUb2nQP5CI>?DI2WOXXlRLO^C%k&mB~I-?WPB5 zCE})uV81jOh<@%mKAMaX=Cg7P@e!bno~}DBibVK|NMDg)CN>Ck0O)%G5KJtv5h9DA zm~{P#4pzSE_#Hw#;(`z?6CSt`l)}PBLO}&U;1-(BmjRU9hhC_{muzo13I_@_ZA6cV za0En?1sPz}GH?Vu8JPCrX27acEz|+|BZjVTX-ZOu>`#EEvFf6kTkvd0C-G6@#FTw8 zuD%1=0a(QG7cs|5+!39Xook*5P0SX+GUyQ(GmM)cC_k1^*cW+7mB5RYYwV3T0A5#gYk%rD%q;PZf-V+B%63dqlBqyy1K z6f{mSY7OF`qK!V6$$OI}K9B@;A!4yFS-xWLxhu0|>7rd%@>Lp?9ti34YpUqM4;qeg zz-8m|kgEr&{FA+lhj@zW;Dn5mNhA$1r;h~!_gJKpL@J514Ag;MjEpn2RAl5njFM#PqoJR#~5!V(Gqee?6et*`QlpN-ez#=*% zXeOjRFdtOlm;hysVje_*Qk-RmJPHZXu^|*}R$G;JgCL$o-hm7v&tzm$P8h>tL%3yt zbfxS*vFKn;?6`d>gzGTh19tE}U^+uI`x9HfzD2d3$M#(0GDruqA7s z)i!a#hB=Rd8vw#4nK=TNp^)^m7I>}%(_m;jqFm_lBGhEaUtNOelHfQ{Ku`?uM$p3p z6G^vNA=9+B{tK3H`n@uA>hrc!CAd|u^mF%p9c^odyWEykc%F!gKg@CSf~H=XP4_`r zk%^FlT|W{Sh#0gYidtlNFQP@|7eMI2B2a=z9+9KUA_Qf9v`FRxu>i^*D#&IUN%Ins z40J?DR6s`Ws=Q||yG4QwdJtb@i=ccWq6C%+g!qrHF#0kI5Kz!TqMPLFfK(N#2GGJnY$!q$1R01O;>I812g0K;W7NLZF?HP^ploZBPqT*N zo8^|69Ftuy@-%{S6B0ENniO$<=#*#}C6X%<>Hfe91{Q>Zm^u)glBtId?uV#$|2mC- zh>ybHeLP)ASTGpt+1j-8{av#+-L$oS_jNlK?|tvuSzW)6QXpHjXW`baiR-2if5^@u zXGMOosC(ffYv!$*=z>!dNts}-`nH^2zODTkw*@%W!-Zi*R;ntvMSO<{iVvtEcT$QHd0btQ$Do`T zVQApvY*Rl_f^VD;R6AA!lpat=M0^!G1y%=d>qw55`XH!{Q!FMzHBLdq3GH6!W8r~% z1=T4)1OStn3L;cMt{g*s1keLfxbMjd7JdoWRH96j3`f!9Qcziz2(TRqX95{g1LaN`LW(x@ut=d6w=GDg5P3#eA^Ww`upv*R^Rdx+R`N6)x_guH z+SgFG&juI+n(ru;0Cg6E{uXGW9`j)1%}N+6Y@480yK;???A1#s-IaQgkL7ilc|u%; zV;)Sk4281siXI%@2XP@8z?m^u!!pNUaXe5h)Pmoi?AOd#aqGlw_cZTX-X(y6W=Js> zkH^{S*{dha*f8y=WRMOUg|BJwJVyQJ+UcFYZ;0BDb(mhk2A9W#;m@mV*vmoD=vP?s z4E)dFQG(C~-X(N>C;;;Oz{r)5A*%^iC>2@0l%=A*AgZ?B+`j0`OIJ31#q`X~iq$KQ z4)uHXLOrhz^U|Cx7Ejb1K!zjb_ zNd%BGNT|%x<`I=BNh1$s8tX5PEP#nrGDsk%L?H)S zQY2dOPMpWZ{*7uO<@WQ!Z4N6W)-}g5}@#I$ILjWlZqIF#j8Y?tpJxOK?vhjxHOUu?VtpI7kkd{*6U+nuj6k=K?Qnb zrfw#VwQX9{v0=`ZyXS76_azA(cMg2jlI~^Ow#?h{z_=~lUs4#O6g?)r63AvONFS2w3G!OZWVV!^|objCBE93zjh(TTvF-qXPE2DT3W(hDBt? z)K4LqMs)aPA=}!t{8L!dAQX=v2-m8$sq@_$nnC@$gR+5OhnA}AM!k62JORO7S1~j( z?w}-?%G4mD%(A3X#T*Xv}tfEqd#z)jlCo@9CXWS1oGD^S_gJ!$p*`lEN#%my0 zp-ooVI|g+|T!J?TD8f}Bw~-QRZiIZlh?q?9Ac+QK74{NrBgj0Uu8V&FTcx?sL50Cs ze?PL0I2xc>DlMYYB@yw}y55;3jO1Cw;?@zX)sN%ZC3@EhMQ|6ZLEI{FF3W ze(!(ePGxT%CfEI_npK@49FX4YpH2!o6u*+MLb1t&v#UR;^NtsMUzNl#1_R%kegUX6 zk!N0&xo3zz@7K^&zXX@+ihK)0$XFo#{Q)-as#z;%ekm0jo(F2L&^D{%FVK-wmUlNl zK3sYalLn-L8di0J#Py8Wugzs!N7vGL*XlZUoA!x-e|uiX7aZIjKwDRPcDO4AM@u$?~;maK%s$FV=6I z^Og3wEz=h4o%OgQS`2+O85*ZXl1x3=1q} zbh>0jYq6Xz)Ks9nLu_^yc}@p1#en8Awg3oGuv25uj6`}tssrUN2vsTZuSmLv5J-sn zv}x+a>F8v#P1AS$rNU}K0+LbSv@txjSKKQ zy$p{Y{?bUBnMqI&av`wnr0#_}u7r9oI)jE;C)|80&wD^Q&!I+FtRc~Hk;S1-TYDOr z2)rG8Ytab;94ncNOVt%p?Jt=F{dS+BY1C(OlF0O+K_UV)PDMe2a<~S#H8n5=uu@?D zBMY=dArpESckoJJtgCo2VNB`VTbFpR-p|h505CAjl%YF=IZj1(2=80SKjOHKhK;6r z0)%IYr3wa1<~1SxCYhZ+-Up*%F@SXaWjSwu*{ycTGZ3`NV{_I{{<|>UdvhT9XVy&I z{R!DuoR%F+H>{hwX6)SEGoMbS>Yxims;e@p!36O2p^sGV3X&F9*<7kDqXY>(v{)Gm zAk+!r1PGF58AiJ!xq&l?>F zn)mdupZ=~Iq)%?2@cCO%x~0r3%D&KKzvRK+1y6t>_`+(vCMsuT!-0|^By#Xs5t1_8 zC2$mZ0R<_gJ^eK8IocH!2X!2yCnh)?E2tq>HKMEFD-w+(G z3;sx#d;_sSvXPQvGVAA4kZg~ltGJ{UTBf$ooV#u2!+Km}C37Izuxa*p6G~OD7nnf$ zdrIVm%|rCcBe6x=rICVY0B$B>10pG2sUX+H(s^ExdVszDBmD~7$uIZ{4uKbf>KC&` zAW}3xjXV)IP;PkRrnyf;qo$67^@Vj3p5SE<7l0s1+8^x?1vtGRE@*+aen!`W4c!a& z0?3LAvdb3lX#6|hPLa&Hs|QY~*~U+HFMH-Uhrp@6?T>)XqiXTG`Y%F~sm4V;1uy&q zdhwF(hQpRNa0^aVv>iv`Du6nQB*K3pf{W^&S_IJGcS^< zrO4#f1Hw@yU98ISt41IrLXxd~M78h6<&6grtWH?b(ek;b#d9Vu+uQghM=4$BVvQkm zh66c$4KV8%2L;{r0#(*r)3Th!QZrdX8Eh?((d`sT5|S%&>0_a_`t7eLe&*x$$iN;5El^_Y7B|h zGxmLW$@a$GWcm~0>MUN11f`+=9*F>#vG&!(E1~JrPC9&SKW-!DV zAzui=&mdk!0};t(NwR8@yhC-fl)zjV@>)p0YI0vGzc&zxiN!>zWoql~9Xne0D9qMe z;kEY&GP;&jy28>Jz}JQD8sepg0+4vJ8+o5=(41|6w#246TkfCLJ>x47Sp_%5Vw`j{ z15vf$i;EZpV@xA0o4ge7)AARr$XCtY!W)SPi?qnRiWB>qFfJsC_R9e)1_xyE> zcG|Yh1c-X8NbVhB0GFYN2eh%!Iq}p2a*-mIpFBW{S#XW>(eGTL$c!}1gg~i+jz46< z;i^+PhRg_1?<%Gm=u-ej#RJ(xjakx>up6NK;d**fi8&&!Exvk6fw@W^j{$sNU}!$F zwR1XWHEe0vOI#u1eGn?k3Qdp>3FwMI0AoO$zXG8KJTxu?=K23z65@D3M@cV10S+2h zV7~Jgh=(5+ z;!bVzyr!8j?#26ATFEb77HG7gGEqHVP{mjPo7z&18kfi>AQ?ywq`+}yFejllhHbkT zJwhdm^(eOu4^>Z<&ZR`mOvPJYtn3KYMH*Dyf zmB4m2)99+lY|M4&lf%-=7opNIoWs{_c@0ELAB6WISq$Q#7LvLz+3)kGP=1JvB;D-jU|M`l*m2DuOm3|W;` zkXUc``VQ*zmbNaOLw~@De86(C<-6y6+Y20czbSSos-g+^w@7va*O$m|M395A2h$-d z0W=i=tZ`P%TdZ|YYv;O|UE}Pc17se+k9fdvib=Tc22TUVD}-bNFsLVU$=@6^Tl7RR zjzB520QMxPdZOqR#305qIKOJ<=aG4UP)q!%x+Iigi#e9Y<~cHBfOJ^Q1X{7S>EN_~ z6q31-5(P~q&sej5<*wFw&6B_b(ct2J$?xAwJ`6+X4VSE3`UF%FjK!Tx|39oc>17+1 zKCOVG^g8bhiWe&J)sS@v0({aD;F5uri=QD^wgV-oT6TEm*KF<72y8-WjDFn3^)mqP zfxHTH3gA0IFU$6kFNYN5!ju(xHnMKng(M@4#mF~NHexBq;sY||PvS-1n<(+Vq|JNd z7Ml2tt<(2k4D^YUcI!DVqalO|q>L%cQDshj^+c z0(1h4M)C_^-qpOnW&Y~B-`yE-`TX^qIRLP&{8^G9Az%Z-QpBpZvUK;%e^R+V#vyM^ z%u5+F4$_GLZ8=~tQE;nBo}&#Q4002OTsn~-NM=$s2!@h5UP$#;C9kRFmW7~4%Bza4 zxNZ-;cO%sWpw_7cPfHnyj7b2AL3FoKHp@FF{iU6Y_muqn`z2Y3puf5TKe<&9=`v`W_&5it$Jejh-O` zVuviWa=dFJ(7d{FpJkbG+;II}E4ruAR?n^U>E^kux3ApNdYD}G^t1*nQ9tBK2wz8m z0j@D^BKS%Nh0f$h4Q+1LxMj(gz~{cZY;M~_^VcqVYSqFucVG*yAhF)&U678Io9S5ffr1L<&?uSicDN*w;fIIBCB%;=Z%#_#wi=`=i2wAp2 zkB%R0TAEtFc*!?X@l+2socN-S`Y$e9yzJ9JbAdNS8rHg<5Nd}^1?G}(AZcM#$>Q0u zV1xSo{Nz0%Sm}-SxASy{HKzt=`g=F(c@xhltX%k1e!v_7oi_5_|!Wm z9R^PeNMUk?s#r;U~R{m4*}%`8QEgOW7!NIwT+t^pSDZ(wMnJ! zCl){PN6-?rtV!gPK*>A^0}%N^B9HQcLcSt`RAIQknX3oyXDAS-G0BO+q5uGqb1uw|_lTfC@Hq6=aI|6F@v)4@h ze8Q+Z;aUP^oq1#*mo;M-{SHfWGB0=q%xq76ML*BJ9lX+i(Y&Yo>au|{53y-`Q6Hy9 zNS6u_XM@s0F`^s%f&;B|6MzphVWeUz*U$-vvmr~tz%cQeF4h?cC(veRl7X_N0~2-) z9u*K87eF@@MOW(qv)$C>*vkg+@AUS0-p3l(HGBm`Mq_P5>y%~NR(#R3@}nWqlFI0# z-gYo@Q78T@Ui^+kc?Eu2x7mqnJ<$FYmZ0brm`uq9j7~S1m4t9R40A@jM(lHworZ?M z!0;4G7*N6Ns}^p3%`f?)90!1*a$FW8&;w-2vh8;~-#Bf`;>G(GZ}vntE3C*weP(5>8#G1hHVl$up1~?}-CLg*;945>jon5Rg1c>*nUCmADwU zd(_jb7j^wLnp0By`qrmRC0}DmnHM(9IQkKK?#vDMd;{Y+CMXCe*EDSSbNX3j^LTfr z3g>5p61?5Wzyk`UZ`s7Qc^_^H9y3vX;&45;O19p%V|7dW)UNv%A8dGv;E)O=wU=yK zx?|0pt~={@jr(V~5JDtd!iG^x*~Y+tlM|}6q1i0FkSl_q8jca@^l2q9X_5Z$d1>(uFrHKpQrMg3m*Y+ z&~TlKfT+uE$v>llp^oaxK)h|&^sjqj>Ae~o{!;zKhTF(;V#k5)dr^NvJw@xAJGtef zz+XWh&eEu;>9bslkg9-`NS&KjANG~}jZkLjZ=SL4PoV#Y>u>2f{z8q<`pApDN;E8W z-uf9&tgc@ z4)F^}$>7LY1vzcJ^msb0c8#A14>AAOHE1Y>iTc*fEzM`PFlWe!QKFsNhq8k3pM3gOCQ{| zdF8>$>pI((Se&uA#wRxQ~!;Ydk1^}e`Lb1ctK{vU9pyhXe2{<5Q?0v!f0QZtZnuOykxoy$jB7hq$1QK{OpnGTl#wSkq@qfKrW|sTY}3+pF?D?Tr1c*u2|Z(6(W!ys zCVXMCH4C~Xf5#C{zefb_i@VM4Wofu=Kj*rC8hUJu( zhMTe1Mmff*-)z`E`5&7$&;5GamSvB~BB4$z$6$>BZ5}P{t2fa5m*7E!AXxXp0${tv z8d(PuG&%$hsS|zH-LvKrNwCE7q@L`MQ7m8J=EQ z#WdX~-&P_b4%WG!&--4I4Wxb9#)i=LYZIvD`9Vn!I7nnh9QJ_R34iWsrBI zXLCLScqKlU@TU$)Z@rdRWg}F!C7!_dzqEu^;62z}T)E`rQxZ5&Ij0w!gU8yZFQ2?} z_wwxlysC*%m@<-V?aZzRmTzv`f@UGJZHS^`P7Dn64?{mp(sg9{m-*39-_R;>_;EsQ z*be=;kNhH6BJn*DoM)7z&@VLsWtNgD7!i>I9O;9BIYa;94k0l~xB&yfM&%B~oQB4V z4*KQ@rL>ruUNLLgIA~`XK=)MoDT6#$mM>|H03ra|N}W49J_o~f5`K;QAU)aKgrb|L z%6bg+W*OBIDbztZ5Lm3VXiDoR=RMSP$NUEtOoW_#M$aITgnFMXg6e_QZNM6!hAxRR z;39HKQYECHUfdG`HS3r#!$mtion(0vewEx{t0s3(S-P!lodDKQsc4hX2f6SKiR*vK zZdgf@Q1-)s!UG46X^;S*T6kGLIr5|v6}4r5`{Mwoq5dnuoYd9Q@tD%_Nc$lKq1Zf# zSQR2;m(wfvwIAl3>)6f74O^v_6OK?-Dox12yk}b1&0e=)u_-biu|vL-_$vHn2Iq{Y)D z0CP#<)UjOF*tukH>#U9m#QKE?cx>7F*5|6yHGPnL0B&ABGnnW1PQ16FRslk&7wPWC zeSm=wSTdc0DHK@}AQm#gb%xS#Xu*e&*D}?u24NOXi*Bm?@Dli%K`2&@!d4ad&uNy{ zM?fY6MRn{u9Xs3iESxcaY7&s?cjA01e z6+4%Hk@-%Bh^Mjwk&aXnYQLz(fZeVbF%th_joVjj?3ljx9uFlgBdtglG98!YQRDAR zWcfgndNBcfn3|W*d;Hw>TG6^7%AN-MxMXQi$phH~_;j+Z))Q5NHNYW$UuFpAy?he> z*3cl+Ih3&?gCSyhLMK`EKqjn9j66Zn8TbMyi^p9R+er}WFg&3CA{X#l+CeJW#~{vz zrq)S&<}H{q2QWo{N!N;J!PwB^dc0(k?NjK15gQ6Qeo9}q`@ydUdjCy`#iY5tdRL9ok6{(;)GSGNBALT-*T2x|7MIVV3NHB$Q2R4MjEqZMT=KZCKI1 zaNUY`=8UfHzhVI7v25eyJ+kVJf*5Ry2YNvhpk>MI1g@itU>UG-UT*KA{2Mt4HS@)E@aLd$xjq~9p0UC{vrB$E@d1k|+wZDhucUXyAVq7r7 zQ1z|}d9Nr6wSyXHT(S*BP|L^yA8{nrx-+_AW4Dgdth5p@xmnL?o!kD$9a}bRhcFqO z=E8y@rF&YZt@(@AuFjnamMRehMF}%!8XlVWsa0FLcLVW&KovaAXb1pGsT_kg0w|jd z1GE|i7YG0IF@3pUm9i-nOj)#X>DEAD#W5VM|0dMqt4i406$PSz+<=h|4D!(6lN7^) zE*3+qfE!6+i+3*B(>|qr?&1RrA9Eq)Aj@&qyk*(`6|>r=%s%kYzbK-PZn5?{uOXw? z4eDecw88tCH^$bAtx~gW$J68lxWin7lQ|CqCy+X(Zn_(NJq`K`Aj!(K^hC=J$j}7L z!a$RQBRoP_nYc`5MLsLU!D(k5JKCOWoU~-ZY9J088`|%}2J%jw(pCR=7SCzD9oL9T zt_X@XPlrAggb>N{&TO8r?9*#@b?>5Nox~G&9@w$p^iJHsMHiY|y18UR%ZE8jAcv$N z*@i)yXk*@ckmAZMoU-Jz>kqDb81P=)Qph*(TU>r-x**}A?nTyPOSUcBwQk1hhZ?rc z{k({}j({?!8zSp);GQTLm{|q^G7x`*TME`<9;)T*)-_X#O3cN`SZlD3OSXZavxBNP z#z)l3a)?kc0m3GdEfxY>tYuZlQ!ITf5!Cz?JrU@T!r9q0;2~UdCc#GiScJqt5IO+K z)toTch?fLAc2cF3A0;g8)))(dI985JIRYzMnij2CzG@Ah zT2e(v3zHgBW!UgVU``>A359Xe3XtL8?V?2p&q28A1t?gF0YrafDET97P*^OMV9ob6 z&RD!>@iu6dV-i5x1gyekGg~Gv-rBrJ#KsiZ;EmFabcG#gmlI7{5>NsRafamphzq)o zRv+NX=X<&)??q-(O8AA?$yJ*+ZiR5A*|u)kHoOlp)how4FamnnQPOnak4~FB{YjLt zY|S%XM!)MAES8U#9ad$}hZZ&Zzqs+vLUYRw5}Ns_D=cX8Vwj*Kl8X#B-luaynX(LkAk=EteC%cT>FA8&_~ij*iC-I!N#+C!MeYR znCU2MDS{C|-E7cz)4?0&A^Ogu^g0}HMdRALJeEVG%h}4c%btYDA0&H7i&|g_B?agx zP}+3U@OYr}D%RVVV^xVN7M4T_x7#3VzFs#P8t#=}jW*zgl{uRj6BOqx~3Q+EM zL3Dua1uQJkDK7bZ!`{tnJEwJxZQR=MHMBtlShPY42=fVi^$>NRw5sDX$>jg=6}@@Wvc{z= znpd`*J7q%vp%xa>^nFv?jMqYzv1GscH3M?ikRN#k(js;#I1yKXF^$KK&@Jgkf>*UK84Wxu&SCmvu{rnmGu~EW^pt?Wq)g6~bA&!8uAGPX>TIl0K6}|pf3jbY2Q+P<6 zssimle2|FXX>*IPb42>gqL5EKQV6>zN&r?-@cVk8ln^69M|dBY_RAocAVmL8GpM9x5Fk3KRtRLytHA^==ynS`+c+(b}m z6btYHcj99D9Sh1Xx-sqWSFp9(sJF%86XgK(nFT_im`Opkl1NXQa9uRG9`D1R2?Rr# zbqw3moPZw4n{FzQ35BxAJNhPQJh@>OO`w3ZvcM(L1MJ%G*uV^l+4(Mfh?CYCZKN>_ zhBs$`ohnt?tdNGrPcb9he40K^j{n0XTN5he}&8&7sH`tE3C4qw1uD zTTapQOZ*4JQL#m3Y*bH57!lQDi~L3SxOs6%TU#07hAUFr3Cw&W&(4evPL4nxeClS2@@hgm|lx^RId*D+1$$VIp z;A`^>_1qj@AWo1@pdri!6)Y(%dp1y~rZK>Ju7yS%?k$2nDv*3KN@U81(icq0IJ^@T zWc=|WvYteO8PMAjkcjw@a7<&<(qIiByNZx}$8_W_Y6F4ts?f0EzHg(^npB0FpUxk* zU^=M!b!elaNo3@)sX+It8ecg`1SjiA6DW?Jhm2^d$WK(6(8h|fSW#mtyyz_Q3YHxV z2Fg}$t#B=L`>_DI$J3f(lw<+y{>pLQBT&R*1SSXEx4lSAEFyK{AYvOFSM2!N1sw9> z2wQw~HjEM}Dil8NYqTL0`M+IHDSL>lgK+N=?gUaBSnx;^(>8<~ z-{e(a;LoEhW>}gq=Bio@9sU|H=lvOr}^EW8E|anBi59%VGrJTQ4{~Z@~No*VY0# z7a$Z|TWlO?850sUBtsYc4l5qmKlnXL$}*}{WPL>a5@;^t`EXqBZ4wa8M02&%tR%Q~_F~tjfB_UOxpgDt57A$matfxWvw>?op%jOzk_bD^lI7Ss01LX|r+@13SN{qNe>iXJ#4nV>(wG|k zy8r0q&p!wc?qK!i6_1(HsrSLL?HK;dF!UTa%D*QcuDr?D_p?LNGB{h8huZ(FOO^$Be@P6zz*PXmMc){ZZWOP)P;pC6pebt1b}U=2OD6kFtFPJ@vuROP znCm88>=6Ml^hQz~_I&G%oxee(!iLW2-xL)0`Vq#6A2m!~@==t1wDsH89WHq%Z?4j6 zUjmE%4;3*Pl=x|EV4i|%4+1*b)lgx*m|?uA4TQ*F+>?3R)Rmv;+}*WR1kK+Gd&WqD z0-B@_J?kNrlx+K$OZio`6E0g}UH_Qn#=E23Y8w5(?Y_8&QjmEO}+JZ=oH zy1s<|2lb%PM0e%(wXH`@S3QaECtb|RUTv=h${&j6w!w7dMd4yjM1Q#{ed%_w%1t0gM$0wazF@C?=hL z^?fDCFVMzs8l~&=?yF-m={oN5Q>yZYD7nP>@T+Oum#%GIwW4#u^(z}@&hS+`V=HGy zm_mUihK*)cu78w)24_-K%~|&?eQ?A6jY~);E@z*(MXf4at0YkTb^B2)2ct?(F&0Na ziXumkeP%>Dsk5aACw>=^3^CBRmpMkMZWfK`xnjfje z15rhfC=|^kDMvzJESX5c<<>cgT3s=(!M_L%P1Va$fudhPX8EihFfrw zWKI3%mNiQsMQ#6eB;M6<-LPs{+yR;$bDuEJ5;{#J&!D0bjm!>`(k}dMz3P^OP0xTk zhAiDx9nUsMYLN(J9LoV}jCj5P0ZJDPXLJSK0yBW^0id0=?`v;q7&m`9*&$pF<9WHA zV_X_laKQ3IW)2RJ6Lf5CeFBopBHf081($T(Ntz0!4bR7_hprZB+hs3|-fbt=ZeYp=r+YY3Rw3-CI<`TG%%4NP(Y906ddgwx;1p=nuXg2)@-d zxX2O~K4gGq45qSOVPuM|(9p8+i(pb7$r@}l^M zr)nmlQOM>|hb%y@kd3E|IDCVBusCH(=VdHd^j0*Y?-;t^a+zd{daW5TJr{Bruo*CJ0&u{FC|{w|*t$0Rbf`TpM1!;%@zHDH;}ZR{-Qh=74h zgmb}%3MX3WC{Ce$&STKi6hZ~|&jD>Hf)x0+Er~F?lqsXNa?B7x-$k<>D6ANWz1~2v zPfdvrRYwE(4(U1F618ZJVI!BAQ^hu(n$q$Uw_%!B~Ptexb+XBc`JLv1iX)p z>?P#ZHHbOiRu*zm8wijgPTU*y!lFsjr*~{x@f1-kLl1PqSe*Gb6un_ei_Zaqq!2iz z5K>_t%25usJrNE$ir``=4bUh=2@HFu3K>e~*VKYQlMnD56?aSw1gaAO^k)sg~UBjx)-fjFlAL&2XLQ~0dA@fG8=LZ!`wJ`-yb3BH6)e-+0TUw^NH)5 z57htjK(JuZx&=V zz@~)M8KoGTly>zPFkPAIES~fFf_AlS9?=M)q!+lTNU;$;3ny;>2;xfIh@`XYAR7nI z7&!(+6wfr=J!^dDz75+AHvIIW2iAWqq05LOi7Y?{z$9uxz7GKg9=A2F8~I~zI=K3a z^Ba20bvW|6$NO-C#MQQ z3=nyeK=A=c0t}v@@W@q(UPyt0OnS{_hcPhCJyuA%?97P9y)*wIj-D7VA(MgN0fIno zyOx?xrKH0f%{U<%IP>l_v zZ^^3p5RP{ZsH9t=&(XUMsYLoKdu$iAfdFqDF5fu!zwv>4z?OX;tn#dYU9sevEU9xO z;7$@b1i7B`M8aU9E91r@82}6(=g8awu$=WgqSgWprU+P;4Mi+SeOpMwTo*970z00J zCv-o=zeNF?^HqF+jSQ%thx(=~fk)skZkd1U+U09LfrZJlSfSdJt@x6)%f1kL5|61G zl46MHLc%I8-TZo^EYH6m*FvL|j3twJi-@~{T$L-TAYh|L!B7LlP=fhK=&73I7aa#o zLIM5*y(o8Cl5Lur76WqK*C6Bup-Ti#kjZppZWs=>C{epg6V8eeZ*mXZaRotpF>VAE}K(_m?BXS=VfC?<-QDX{DK50EYdz4}u>1FDAT?PNyEbfiJfAHo zF(u}%Y-@i4KZa7sTOSv-fzVqw&RIT{cGafY8~-NDUb$I9YA!$@FR%vcHa*$;Sp8>a z%;QqgFwIk__YFrwHAF+lQ=lxTCK53gf;B)QiXfIDLenHDT`~{b3VUe~$eF;qx-OuF{<9z=nkKy=e1nWaKfh6I&s7eLbVflr50m5&Y; zM31rm!`RD8qhkVngn}VMk>4{5XoBQZggr;i1(M68cBZ)^Buo%J2}+nQ_@$Bo#nHaF zFzl+{E#&hd=N3 z899w7Uq%{6(ht32kUAk)wR!jp|Cpq&p_xUpeL+%Bn(J1zZu*sHa|J%ZVY%TQTbF!c z<&GuK&7VGTReYE^%F#~T(0O$E-v41J3? z4hhB{dxhp0tnOvihP{%xXBZfC8()+2neVGC(+jnM0hQPNK=EpS6qqsMi(J*m%C^-TFlXOVF#$q) zs6oTP4#0#r4wf67iI9gsd$?9UYM8^;IRHDoqzS|DsB9ir+eAwXb%3U(vMg&HPx)g! zv6x1%sH3-G*hxO(HQCIdo18vvu$o?ydW`v1$K9S7j_E@ivaP)hKzZ_X+u{F*pb&@o`ND%*Pxnj@|}%yQMQ4`Eo$^69*6YL^&wb1{HkK4+x#cPT6Z>nXYQ1FliGJTZ!0M;-6A4;5d92W zdjE>~ZHJn>R9MCWb!)Diyytyscx(LZ^@3e2`XVlDggwZ#CoxF~dVyvc&>LW#N6c~f zc;ii68AU9l$%>bRkATbbVm{~_m5`EW^s}4;Gw9KwFB6{oo?dG~rUr8Wk{yPLP3tNz zVZHTT=fhJ4{frd6B;wFp^-{u3(e=vn|GXKJ?U?(qq5w1_IowfniCzdwjB$wZjiKvS zIVvMSvQWCsOf(@=dGuRIB^c}J%cFt(LXAIJR9OPzrvk87ga#z)goL`z@E#F918*EY zkCz1HERoRSz;b|!krt}YOD+1MH;@hcru?0%d&4|S8kjbI{#cJerk<6m4;)>+ciP<( z=I=Ooux^nMIIBP6epBM`__)X1ty^e zh_{}()Q_;J(-(ak_f5$Gww0UC=yqtIv5;SLrvkvUd2gNvAIKF^^MSwdDp z8w1oxFx=S4W1IG_c|z2^YTs4+=Z@?C1ArKmO^?j{mr&@x&iC~G`f*GC2G=Oqd~ow& zD2Qjoz&J5`eCx-lB#8nqK9Psgg#sO|m?H_luzzw9pStqWp)>-V_tN|!UNzl|Ijfb!6K6J>9xqVDXo++huT**n1Cc?woYr*tT7d zcW;>T;M9hd2WI@E4Nag}TrvaOR6`K)!!TyMBz-T!g$1{4A?!3dARztU~V zt9_|)>JHTP*=y%c%Hsv>nh_uIT{{r1gVqyDF=51;8l7+F1L3vkLztxe60~fZ|9K&P z>RO1aCE)5C0M#kjK`Ew*$>PEdcm81c+*U}e52R#Ov=>fZ`oM}E4M!RDC&@QO1Ae3N z?nU)04zAiL0yZ6LIj!aKiT?@eLC&)sC7scOLf#D)-M{88Cwb-;QSy?=TWU@A^830U z?%K!M$?MSjrq+s!DTO4DfYu5GJ@Eru^V4kf_pkg5Q*}|n$82$k20h82AB6IgV546C39xx9c@!wu~a>O?6i*V{dClnw*sKUfe?4Fejwl!WFllC z&?dJTbT3iJ2~f{L;DIHWmQ_OM!Bqr+FZ?XpD#9wx8UU?*7JvRs}M<;nv8ZH+y2^-fed}K-I{QspI&W%*=Y1>@? zt)x2Kf(<1yD)ay(>$zrp-M*!N zug3k+MRa~@M~q~>112oPk%%F_DCHp)!tD$VhXp={5l z3ieG22y|jgt3m>s7d``dfI%}$Qrsk%(<6|Ni~!nPHSJTQBvv9>lFA11HYQJ`oEqu1 zlNkXS*aAPJ8;~av_?!otU~AiVO`Ij5?*=A1@b?QQE&mK-g&QC_0qDDm&?7lky z1S~rS6wTqtN@^sv6mtRu7`Q$n3Z3zcf_FzeSvjtl5%7H%B$7Z^H6T)vO#loP2||&e zJ4b{`X#_!Kh@wGV4hhP2$V4JNU!q%=rM9V~OqNo#wGb1Dq@}O{(O3MOzLHmNq|PmB zsHMd5z;@yXxck8hKab<0G7$QxBp9K6zHd_JivlnfTz0j?Twg zHpi1y>`d>gEMA4ogDP|yR356)`6v~bh7+Jyp>Y^}Y*M#}7%6^6_QSB0PhtlxSST4m z2`Jk)Oi7f*{|fLFc7JmVxnPAbv`JX{!6U(=P%ay?L z8&FY*h(2_=gc4*aVvqs|nbi=mGow~-YyPH(m~h$bGOhR}eoAqmts?%Tf64EwIx zy?fuoSRh6yu(k%e0rU#nZ>pbnFQBlsJCAgIITSQD?VcG6+qSnp9Z%G;-s9K{5%t3a zndS2XtU6hX(TJ5T_^>!`X@CW!9!>kUtg&ns z&Sr@kxY>f-Nw_))0d#Kf-UB80ptY;x2~pIQj!kP0;MpI(kTJj7UPC|xO-?&%d=xaU zUX2z2QAwLXD!#OS@22j$8aa{e?aRcJ5hrInIP2cE+dH>ukg(P@FJW6kZr=FLzwF$x z@nH@zMnNw?e{5iwLUJe$(Eli3Dn^1?{XkN`9&TN2BYb6^ugIld*dO$BUo+dfJNFwk z)scivh)e@sQCRvw7ZDMPNB*Exq(ZH=6fz&}pkcp=diIC&@WkXl;Or(+z zZ75}+AgEwiH|TXxZv!D1Yv8Zsqr7qCFM0!!Wz|C6oJlcStU`*WQiqN_+C1*Tne`hF zuh}_s?9y2sN7}b1l}yaZp|yb+Sa9Uf_4;&>&!ChThoT~I$C5;;I2XgvrKSjUS}4j^ zN|xuh&2Ig4+nUZTZOt41V(GdW|A2;baG{$AojfcfZ*+ODvT{vJqG?gnr`pyp`oCNp z7=!c;4QIJ;kvFRVp96l>aCpzs?&z&`KCVq zp?OpBRM9|N2MO7*(9e%T1fcRz>tmwjuHWDE1qA=q4y2`IHP+v?chhz>M+;#-!xL;I zib#fCGP8-Al#(pv^N=ZsS;!u+nOSMT3jBqW=FD1kVDVlX+nEkhrhp7%!M#fwTOVof zvN5mX#u!Wyz2NkEo(@BL_+~>ZL+t?@y>DP(K%!{$zq|uph3$Ax&a2X#}cO-rnlZEu?#FZ$)PzJDNKC*5#_W_#@h8H-LEKUsaLJ8Rv4UQ$&C8Eg7S;nK!5~6-zM2V?Nbw) zH$A+04I!u~q`l|f`&R9Fe9O*hW9K$>AKJXK@xHDPkwOrWU?}M#Cc4B-pnV9MVj!}Y zNbv>XaEKF@9FlSFmJvjHFN!BRx|P z>cr9r+v^*xp)dvwFJ?NBT!zGu?G&)tAg9vc$HHUw@|i0?v1-?n@0#WSTQ+yiZSV~T z+R2Y~?OpRU!I51D*M-6Zyy=1|i~eN8-qm|&O_)5B&J!IFeaqpkUxit*H*ehHKPN{& zbR3W`#tLu}b4!5G0fdll+I!!B!3Gt7JD()YF#HY6G|lwdeXI61jbF5I`Jq`)nU>8o zOp*47SFUe(pmFuu!(AI`eQFrn0dEfj*20S81DS!W4af@FuT2a;Ic4m)`?~khY^uYV$BxsjRyg&t8Pw4Jo+(8dD+&)4dPQ!A;lS5dr8ZrihUhcCQx zlNR$5Vo=pH``$&Lf}s$c=TzJyE@p`VZ-m;b3f6uem*BE|D!4wO?d05qHr$44uhKka z?f=I7iPlC!@?mAbszoVBw1bdbBIXvQ9z^UFv7QoQi}DZ!I}VWyQL2bsLa|+tZX`9~ZTOz$MUKwQbJJDjWSzNoCXvh^}mW z&|vfK?k#gBO$WE&`kL2fxjQy`F$I-qZlR57%pZL9=c*$_{VAn6DS zFkLfzE+l@QosTEfDpU@mKks0pOU1{)s#F7DKSf&1CD+oO&aHcPE}XISt}O>wf7uJe z{G4%1Z_D=R$Kxp(=c&0CoW&BX_M{H`$&kY%2v#wWcuvQ_65yf@Aael|Bv%bWpBIlO zijCtJOj@?9;Q&MSL4TUUkEIVZt!O#4e3Qyz2r_g)*=o+HYy|4+611dgB3a0&978U} zUe#Ik3z}W~?`h$N?AdXPL=P*+;Ee!W7-@5OT|L3)r*Siz30+bP1xKn1eAShBybrBR z7i3~v)05eJ(NPpdEu#79kwm2yOJ@tYEK3>JKJT(IAc7hTLm!6+WTFnIH@Mp6JvkX{NxsgNZz6B_{5G?e3MjUWyk>1iP-2Yi?G z&yks6eNcpi2R=#MVJ}IAJ`)uTmBmFF8x)<#_KS<=&Hwm{&Sl?jTF~^D zOV=;>i4wDFO}meczV;f{KQMrDPad^q+E6H`0>U`Z?BcoN700e3%+r3 z@sy2!wtoB8XB(!?`$Xr~&CfN=Sou4YA&M-Erbf1U&l8=`OuS<%G>b;Qf|3?C#eva# z9y_>s!d)vMOQC?XZ<8>y(7kWd_6g%ZyS8cX*dKHuS_!FP${2qhtTtotiUhpm}Qdtx4h9$h-X95%SZRP?4Q2 zHZB9ccol2lw|{$F`e$-}3cRO$4c+8aP^66ljh$Ci(@nRBsnVn?h?F2z1wl~|4G@Y_ z6a@udiqch(4iQ36KzR}AB7%TKREp9;dI?1Ygb<1lq&GteDbyq+^F6Uy_ z+OuZwnZ4JZ=Xb+lcVzpKa%Rzn=BW*R+s9Q2mPa6%BThdp!%kw9{j`LUb;?ifRHxWd{WTfw( zP3c??c*^5d`9*U5k%ctYm>;AWpd+{=@-{#R!#a*M3i**-IW@wFv+L4sbD3#fmyQ>c zvL0VC9W{NvzQ*&eFkI7Vk1e~Pet_;)@>rRoHxleJDt%OMfiyw!jTqH~r6y`5(J9>x|9DvtFDt`X}-2*;@@K*I)nq)r=7S zaEHD1Ov#f&22Qwq-u!~+6T)qC(_+O6dFl(79!u>!viW(Arvl8?F9;)zr!S??z;8Ct zcIsT7ceAc#ekB@Z03$eO`taLg$ljqG&;n_o!u zL{^XVT8x22KJ6UAhjw>9XzYduIQDTp0&BnL2|M!@v=re^`83AtS#>_$LjQvKD8|gR zXk^UmRngaG{97236jF3h7qCMWoV%SWotg}I)ob zEeg`(H5#P{Ze!8b623BpvYBT8Aw^WMX zHkH!b$Uqs}Gfd2?-~`{UdfOfDo#9F)8B75~`5_ z@eig^AdRd2{g8{atHj@dkLG}$W7~T1@YUs95Q?rm+3GjHOVyoMA^RT&#=z+o6Vh$; zh%lxgy#An%eST>9@Kxf@eCK9_GeTqN^ z8tXfNKVn?0iM=S8E-`VW(ZkD^dH*DlhabK7ioS4CTYN6T%Fz8G;?-qKMA2GY9FlLv zcdpbB&GKD-vt;*i2K%*bfsiwEe;Q+d6)Fmij{&mWI4fJIP)Ma)z(1 z6ECRINBliIuAU6iH{p|y-rUO4W4%#Vz1pt{2QSuU5N%$hw_`9RV9@X8sHsD%oU4%b z;Jp=a@s)az=YiM>*3p`>X$>k6tC99%N9DmY3;dgt;0KiNmgOOc++&vn<+6UAQv7;q zvR8-8U({lf)|awpMMTc+lWQY#N%UN^jF^sU7-+7=modqeB^?^+Jn$j{H=E+tP(x49 zmChh$Pqyv#{iu+j487;jGxr-~mOt=F%GHIA6;z-v6La-Y?*82n&%hq;#^SDczVbKv zWa$Tcs^eDFHIQoFE2 za_I`c`1PVptm7p2w_sKK(bmSc_fBn3YexmW$Yax}e%zVgu(GHo6Ek7yE+>*@7x zGb^Vbj5URn5vd{W%Uvjk7QekLNy*bdp4RJ>@zSG;B{m?!+~S!3iJNU{)lCZNOi7?h zDJ%w0nd262dN!gHCYm$UooVNq^m;>L`J8%cNM@EX=adTe#TM2}moVNe2Vd8%h}>4v zv}x{qtV`lw@sU0?9Q;v6pe0T8Iwj}PV69`wrkL*7hgZEexz(!by$t|E}FU46h#qlX}HyIRp+%AsCdQcR?u?js9WX5 zF-XspVA*7?&#f^ZYhhbpy01Cd3Y)5*O(ohT>fLvp zYdoNb$jsG84@FryT!mDJpz^CXf)-On+{Sq{F-UAJ(Lyt0kH=;9!}Ny0^BR@{K>8HA@j& zM9Apvw8hZ!WA`P3+tX4LT%y5FVw%z91vP3wRSE7*9_@6ZqAzZH%zQK`EsGF^`jamc zMKU2dQ9Fu3CB?@S!xRWQtr3K8ElutkWsh5L0)TKHy%03KNcof;geI$N0nsVnuKDF&@+GiJKW z-62qtA=@v4ZVe1GiJ7TgNiUWmO2M$tGfa>4CZX~F%!N(Qa#0}AfT?d0PcU+eiEXKy zvs%8JFK|SYiSnG_-j&&+EcXO2Zb$9j?3|$N^v<(8s-CZ0Fx+C?(Kl3s7B4La+AAuX z>!-!Y^sLICw5xj6Q6N~R5P(bLOxm6)jaLWSBlZgRlxyo}@DyG_*krGZ#>OF6=s_)OOlSYG;1?H@j%WZeo2 zq%WfPOwm0X8(zom2w1K~VuKy$0yA<2- z#C;%!Pxsnr2NyKYDB}g=#k(ST3-YatGdq49OhwvSR=#66^-D4MVCpid+n?n?X8 zWv1KWPxuj0zMHQxhlC7@9{J0;+aWqZRqW9#hZ#hqMi}N3_#bo&99JN1LCoWf`N`cQ zebC_;Q|xx#-qcagRM_@(rSERvd4sRKEACsJGTcIMSwMBj%|NOe>X)(W<(u7fGcC1pYG(KI*QPq!j9F1f7^l!}S!&>&0xpw=X3p5N zj@@>uollNBgFFtYoGL=@YbB)ED86Tre@c=%!jf1NG)|amzP~5*r6sM@uEh_XRXq`? z-se=)^sGNZ_Og=J3}?MUDAx*bh#TdR|mZscD|Vd28Z`3!E7F|Mhn zsX-rJ*(m204Tf_oox5@U1}x^wu~LGgp8r7D@!x>X$p+VyFdOw#8yDRAH_bx*%!Q)b zKsuRhV!vhxpeCqSQZmC|KdDJH{}%<)3@2=Itqu|OzCG^#Mt^c=p6uDns_tFr0__>= zUzC;F|9*S2Qar^szd4AsQSNp6;qjMKX9QXAYSHxuBwtFJCB!|6IsSY@;E)i5i}#Cg zS#9?aP?dtw%ebn9&T^$}&R=HEZ6$N%&(uC)I70RKn|KKeqFfG2b6fho?HFl0oj=TL zFa)QX-)xI_?=PMVaJ_DGdoWIyuc#a{+Eg$JI(}PGBZwsq&Ob`gy0KTaeQ|8ap!UTK zVM*(CQkH17B($V-ATHl>;`4?rTd4fiA-{iDC{-PQJoG;DmW0}*zUW2MM%|2+ZQMzedrQdu6PB*1JOSA}M9_6s>rsghF?S{O zIeT=Xb)2GGbM&pi1lD(k$(y&MoDdtQL%%yR<%Uhwt=VUT%6oxDL6}bPe5x-qd7e$< z{6;Oc)gp)nw0xlt&jJhN%0n~C2pz@yY)n&Z*gW(&y9oa9CbJObHAPo0EOJEBm=ern z!J{`RKC)B(DmfVwDe`j_Gc-s31>mMpcckh`nk|IilQ{VvlM;25W3)w3#;n>2 zTcDJxqYR)Hzm^1N)7YfcgYucdsQ|w68Ux?p58oI90IGgCEN3;HMD|q=8l1k6yhFap|V?O8B-FOK21` zrW_MRebJvSxD(vv#5}dBCH*mD4D^JS z!RO2DX_00c1volMamw@~NfF^2C>N^(a;L{Ce3sQ-SkhoT#V7+My-i|l4VmB~Idj=P z`{z-QcVfQGZ&P7#*qHnnQx5}oxG9xGFjFvqkJbmvZ2;B>N<(ItG(+m)V2g%lCd5JF=xTU4E^q0ogj(EYKb>egpH! zJSclX|HXwqcCL$v@x(_02}Nz}wN7?ZU+-o7T)pX1R*)fn?p6q77 z$xwceF(8bG2RvxPk2ak2kbRI=u*cc-)~Vb@eEz$Ab+;P_Z`C0)aiONQ)aX8K`TsUJ zh(k?6h8hG~)s2`SacU?{w1*9i>34qjVY-bE#ZSwqY>RteC3^mb5*Z-``)Gv)z^27J zVqlpU&$(W$TpMh$QyZA3fUR)eA~&u2PByOWoP{V-i1^6C?G&34j4p}_U7oFb+H?0! z{dw$S5K=!A<17(V8o*KUGp^KqZ|VKBaxk`G^EwP|Gsd%DtS7Onw6C`D zLf!Nv8{bm3Cta2v4kioB*2(qLyba$<3wWShAD-=K*LqNV8h3X0)(NmqenQWwMtouO z>v5=jYs4W78I68`WnTE)nmNRO8>vl!tq$eumV0+Mqiq*wO7nvLx=O&i)DD{jb!>2B z(vlE|-Gw~e$m}fo;N>fs=N8JIH^?CNNl%CCzl!{kVvJe{#0R*Y;`YlNn4!G<%D0lC zd3;Iq{CBnm4^Mu+xXoaxirA{_yLYC|jr7y|zp~X{P>G9C<9$`QIL{;W-5CTkL#)fX zUsl@*v!+r16N+rK*)o+5ekZm+u^Rid>O?%ppxW5A x`?Sgbh91km%Uc_N_^$(>m;e7vRpba$0oGE)gfUoLg5~cpyLtCUg`rFA{{Z){k2nAT literal 0 HcmV?d00001 diff --git a/assets/br-logo.png b/assets/br-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0c35771f631283d964cc128919ec8c7033cc576f GIT binary patch literal 31503 zcmbSRWm6nnv&1F%;uhQ`kPukh7I$|D?(S}jEbi_O!QI`1JHg#GxW3Q*3-`l0b!tAH znwgrO>TZalyad`8qAyTTP-s$;AY~{hXqx}tt)5={6%$5C*0OKAjjo!;QaGzE~9E$otb}cWlQMlzqcE&Hx!K&f>y6q&4nO z&6hxpCw8zfn2qwgsEiq2g9E9-v+TZ^gH*&)}^MqM;K8ItBtnFMZ}SV-loun5s}yUosu_Gq`JhSPiQY18W%P+#)U>?R_MI z6$I95-i$^>-Akweg^aSu=KaDG7QDd6A1@_*nCZ3JL}L{|+=%Miv1Slqb6sNLbZF|AHU! z7qM9LZ`MC4-qG1B@{V3t`EURvmc|*UBusQ9l6#=lF?dsy_vL8YLISx99x#VJ*P&uN z;&_#EQ1G#pS+8A1qf<|#Bj0Hl-}E;-+w*t{)Dj3nayfh4))b!<>_5iF1KQm1}`k zV?m=BcUkq0S6L^+x2&4lTFZBK0-;G{=IlO*CMaln?62a87?O6Cx`k3LlXS?oOaIn& zuE-8T)0`MtoPMI4D0EMUF01gW5q2dDOVI2tpjz(h^UmFbqkq)s=xS1OlA~nd60jdG z%&TJ-B`{B9yOl;7P42L4y!~`xE+e8_Y?0<2BMBdMOEH0W$6RGrs*3zvIRXw286t`d zCsvN5%g!T=oSQ|@u)_(HxR$j}PDGmfD3nw}h( z_S!4TLhdo8d7MOH6u;wKVnEWgQMU~)W+!ShZzyJH@B2$&UC%MR)RcyO#(W5u*u~Jk zIY*#kY#qhW^0O$NBt9#pm@S)tlHjApS+1v3aM038A_o!F&f`R zV?U@1J+1(kt=#S(gXdPt(%R)+Ic3QN4j}*s#t18CTPGz~OLhIR_&#qLj97iOPV>`< z;oI`8G;$4*aHLmMmug+{=se}$@DeuQyjcsl(og`q4cXeDigc2XqvY-5?W=ByS)XMC za)mhYMWMDBkga%wVLk5q?cN#Pw5O}?XM85ih5OZepfHpp@}R4+p0lWkt+TI@nvAcL zn2Ma2ql)PkjI(DCsocTd@`~($=kG72u?HcQY+Fs#dU1PXpVgN2$ei10@z5i3n6w5C zK$3psmsb8C^Wv2x8EIYKlG2~H?Wby6LHy!Z!bwoUpaN>KR-vtOks`Q) zqB3g$1VC8=1%i+>ghQ68QJ;60ES(Jq68Sq*f$-wi+8cV-)v>?r%A_hd7K@TIE9N3) z53~@^A`w5dysz)F)ty80V5abaM#aJsha34W%ItapZE+<3HN;0*7Okt zZ=j7X6EM+5)ZG#AL?KZH)z!O&9qQw0)$?C(PLp(-30bLEYZsg0)Fuj@^pAM+DOG%5 zq&`q1C9Q8cpGgyxZpnTrFW(mFK29cgV`rpZAtHu{2BOucJwr#PlYj5y`ss><%~UA5I5-UgHL6g?VOg3dKvZ5Zi- z0*uKC5hox)$s37~e>O9Kf^9`5JAxrsdqndn?e}5VSQ3Se@Ds=1<0ceOziXKou)vQy zfh%&?Fx|=p$HRu_)3Tzw?be~$&pSyU#;K1AlY9#*wB;jMH0whTsYlT(N}c|5(_)#^ zFWq%6w1~|pZeO}*#!ULqMFb2V9O!1(*4s%z-wh;jj`z6(5DdNXx*~jdgs`R{35_h= zeLHY}&R&Z^0EB?iGRry?_1|iW+NAsZWy>NaaP<>%Mazr~Uc&OT))5#zvM-Cc0Xk0wv$o?JHy039JjK3akq6;_tDveG|*e zDXJ$_la+K0a*{Q4vKq=?W>)NFLypKPj+{lV!Gu(UlR>`jwL?=}_(ou;m9-|JN{1hF zwdU!DqTQ=5DfE`a7a}sw4S5zN&1gPkbkZgtV%q!VwB)y6dF>>Lo>$*)j(WIRz4x`* z5+vOYuQP9I>7>;=BU1q8iU=u&+*PZ^Zsd?8>VvFKc(YXhMLa#`Y=x45g5SOt0 zTsLu!C(6s?Mh7NBfM7M(tprCRE4XsO>q72Y&goSXxYlynv_$8jU?F8ir-e5c^LMJHr*R5BmSB@(>nHXaV^ z9cM+j2Gn+xz0=P!SW$x)t5S2&V*ZtE>QQyLOKGi9B!Ab@BIoX=`cl6(Y*7ESZ>Zuo zZ|PzP!8epjQvBA~^0d8jFX1l#ndh*9*7k6SbE4YLjh-Hq0WntQr=*hxJuE@Jz$n#2 zqbF{}q;K+e>Jr{cK@zxb{*;~=?9y&mVfe&zLq8+W20pGrGlZCFTCjbE563X6qnPWb zpp*8vh)7x3x7eblu!-Pznw?s&1?g9{*uNn1xBes{;f(2ChvBlA~Drcg!2EK}u0v40#GH zDGc9ETZ%^X;N+4-&(O%Wd~K)KrDwsB32zGf!vjiS-tR>r$)kleX6ogjJF!}e!>_jt zZG*E;K%ayYR9;ZcX!;u8rQ#>pxO0xr)XYpC8GYuXc_cH7eL*QrQ9JUpBn zlyY8%%6j`~K)Uf6d8E+!Om-7r_j4yS;NrftsG4t&%)k3?6=Twr?qwjvX-E)&;%b}t z3%;O8m0c7pEb1!M%N{=#82MX}V)i z+#2s$g5Y=H0;nU2AOLodB4r-bR3awsWqqHkv;YsQD=EbwMmW*VD5I?EY;-lnC_7=3 z5z5y~a#CvPGA5d=dVmAL%Wv3%g{UPU3XNa5y~zgs$>YO~)}ZRGL`q({xBE+##srD; z+;nz!!!N$A15kNg@mTG}XimA{g^us6bI94Juq&EYkM?ixKVa1;&klOPQx z#oaJt{7POApkA;JpDzhMApkuRAkcNE*~O5)^fl0Jcr^$ULw}d^AXD#9^L(Ad7w~GZ z+rqUHPk#1TYjT2s#-zg&g1CDMp2S@oy?zdSt2i!6VR8w-w+qCrYDG1X*L;=S$Fx_< zQdj#KzDt^(3a0Px)4ta|l3=EggttTyLLGb6^cMQQmW3MAz}j5iZZl)Qz!Df4iG2f& z3M}FmS9K)y2zRYtI`HX0nL&n}sRU2^JRHs+^22w_Z?ro)igWH0c$G2xkJi7RO%p%f zM5AD=R@H$@2PO_oC~3fuIR+5H3xkG$TT#O;=V%dorG-7>VUM$=jPzJBZ+=!U#$)-kf-se7MMft6*K9 zgonw@uL_&)tae&heyxQ0Js6o}c9)OaR(}aPN3vjq69tc8;^P&4qo)Q6!dNLOe}3tO z7n@qd#=`kKca{uu+zC&Ei6gIBd~GGcyUi{F?t4e{?{HUH?XDYAD_#x&hI!1fNJv5w zhRkN|#@E>2_p${IQvYpqrQTwF59ZcHgc5dehv6i^Cs{2UrG+uV^OMjK&^IC`aFRz& z1cCbnXFMnQ*X)21qY+DZ-}opNm87b0zTe3C3_r??16fznp(e-ZR?&vgQZ1N**y=hB zKnIMcF+#@T2JlAN{m|nIPuTC~GllD~J2;o$^zM7-V68bP$GLAh$X%FCBb?2gMR0pBxoK4PpqTI+7>S}~YQi;pV%?`yPRIv=dHr zPBeFBa}sPDzbhwU;=TxDkf=mr-4$}O$y@aCggtKGk#CLxX}Q@pmO#zydvJwyur3l` zuCuKm@Qzb3yY%6WmeQiDr9wm$KbfeLr`rx=u zq1<*mMbPaBhp&%if2+{tD*HX-QfjvMwE49OK2q- zOw>FmuCq8(I!Req?G^u}h{o6~q+10#o{PP%B0-ZGlS;QY^cQ7b`XxPW{HPLmOw_|I z5eUh02(&6p&akv1NA|}6)tTG=RXQ7w_ftv$@$n#R;N#NBpQW#VIh*h<>TH-b z_8~3fbg2zhsI72PD_ffxM=#`AB<-+lze(&hXqTF3rEAwTgx9=P!Tit%c3!ROlML|Vn-~>2Pn-Kj%l=K9Gq>haBh=DzIeB11M?VAdJQU`5g ztglY;Qe!|GgMU-pw9tGL$aG`H`tAa-x5rBi?g~VS0?f?D2UFgACB<8r7}?d~5G*)j zI2sY5q*1%6_t}5|#mg`|&Vu;@e0iw~_gzqM+KiH6GzghnwnXx<=MNe&7{$nAoSQ~8 zQVcl1dh}>`qZO7=2w((I8Z+&pva8Kv4HFr|*(ej)Hpu_BhL#vIV-weGWQ>Mi0Lb?W zBKq`8?V|tsbS=A(4;#L0v?k|DokjI*m1T)`G>umC{WnPi>&AhD>fgd(UtKm~=BM(c zheE>P7-&(;76b9D_#vMjr^s+bCrUDPAj3`5Nwx^9l@Z>a`_0QtT7Ed-Jv;9QH2+^q z`SJOBey*%ENj(LffU`zVT4S(KfHbt_{<*qPz{TjK_RpKn50vSb z!%&Ts{SUv5t$+R=>@&^45wJP|N1!nj!`C#YkbtP@^F7!eeGG$v1o}y0-=$K)D!(%q z2{HaU9-^5~#D5x6W+BdV7hxz$*))Rmb;6XPcTwq!H?VJikw(DRBAq7c+(>KX{8Y3@ zrTLEOuP;O@wS{S$^sY~#}niu>rxg*sz>}cj}DUHW*FoY#V&f7ZFe;a6A*02BL0lZ z#Y!^9f*=*QY z%qoU~VLD0+kC75j@;OVIDGRVpsAf`ia=>^vOBDBg88^k4My&p}pU*&gnDo)$I%Z2} z>wS+)0*71ki@q!s1QwD!OnhZVEZv@ zr4c4_!%OdB>D%oUPyIRjUz#sm^?TT249}wHEbP>I;iyUnWlH_m2)lga0jDCngUyAm zLu>4L+~?uSBC47xS(txZrPqn1FB9#1 z!fPC!MT{TnnZ$GMw{{4FxgO;BZj|p}1G{1PGbQn_KO!jdai#T}K$}~b z-py_3r+}aP<{V;DoPm^l5(rUfot%I~FOOWEl0B#@?A&95kq&`%pzG*VImO@kaNejS zWQts+Ha8?`u#T?V^`cr=#~EQZ+VUdFIO3;=gX|@L3`0B3*Nwq{*(YoV@2@w5Ye!Q= zzT>Id(duUZFdih^OZZnhIevfP%6{AqoX**@DxY5B07CAu{y7?^pr%Ss1i#0eWG0@HYn9BlBqx**tIkgo1SlMlV2tL{`ze51<8VD|6oSwBrD+ymGRJAdWd&4Do?M_torr?8og`&cT&7 zK@O*XcdfqylQ1;K4l&J#Q*CYJr}Q0N$^=L}uM>bo6p*m*h%_B(9Dc*yZG*#+cX8y@ zg^h=}^D=jpRJ7b$qZBqVFspPQa~-jfBOMuR0({lC(-cSG=Y~yxOVoPFOQ`s`ssVl?F}d>NE)1ge;JxnZ-d|rtJeO`c7BR; zax+fwH9l+{Ww1<=V}u+ch12^gcber0Zft*$cznyyWLHQ0_xZG&_GYQ#H+_U%W8m<4 zu5&3HAysxh`j7uP9mUzqM;MP`FLYFMWor~mDVJ1;Z$E~b?oncg1lx(oqpH4`lO=11 zz0qK*I_xEvl~MD61Un}2>WNa<2laTTPJ=mulYqkT^~TX;#FWJ6bMW=syUs)}S)4It z+mKd{JvwxEd{ct159VVJbJGAP>EF%vQ-wI8Q!XVKZsmr4b>4*T)KkB~70R#wXoiWD z6f}4TH{*&wGvJ#Hi$@U85-G*CA286u|J z{PCGpG_j?-{fF8~mSCs%uD1#)Aq*IHHjO>~(QuGS9K4~hnX?5##?fj1ke2KH;LEz+ z&MPLtuKvm(vA79UEX3nGJmV>u-7Bokvt+wGqD%jAws{wQ-tjRF|)$pNJL=!QQ#X%0yYE_Cud=PpM_hW}ZH z8G&oF>-CIP7r!xq(mqS!yOVES>_d1IUaaOul(}^h3FPv_rtx{EaikIu&c%Nmv*kw%+6m%>Gmt%cW3gnFUfPg7jo(dTO<%|(fUn`I2iYJ~0(fsV?Vqop3Om)EeY zT(FJ&D1;6ge8*XkT!;`s!g{ecJjdb9UhjuI2BZ_HH~ez34A?-r+7lA%lgyA>@O9EF z`f_JnO_aD@X^lg9j_DSNf=(f1G_a0NYmUlyQ+oZ?)WSRUYqs{?Lt5tHYJd*F2uhqF z60y#|OcTy?xGFM{p;M~b1CHv2Me5D9nRJz(28SO#oPKgVO}3Jpls|4IPam0^ws9&R zq~+J%>nvglM^=0XZlof;7^u6=QZKK^B+WjjCj7#!t994mGf{9K4e_kwF_vo`Fg2ZR z#^z%dE;zoDp9=-yRXO1?i-vFz;o}4J-B1YL4RF@}0 zdR%)pDFWxkPL(6F1ot+H^k_zF3cd%v2a2&>wlSJN5G(ycvyU0Bn8FMNC!j1Gl z&K`qYqx6LQZGRp6CCW1^>i2lK%pVN# z9+5?HDLE}c%bxgwLprArWmsfwygtIn3^l|o*+^3NPtTu&;ptp|Sv|G6|S-Whbq1I}ma zv3BxjTopq`@_BM$wpxG`GH$#v;VY1w#o8e6if`#sP}kR_j4~)?154E9+Mf2RFeIAE z7nyGeHB9&FXfrZYNK)QRWO&CRRLSptwojT=2A$@L{&X^cuK%ufU&tR=`7#TqW?Cqm zPYfL@wz61?O4P!WHL|kk%lp%I?s4kPK6m7i5nBihs}fcpf9gy+DlCI>cr$tPXDnep zKcuC#jt|8S&8h?v00BJwq-*=Mdjhu1&f&lZL-k1hq-IxHtwPU47ong;Ig3E_O?^B% zh*hubUL>w9c4E-dJg2R8?&oM#E})h(&HPHd+2N%@zMN9ePv?Z8gO@ICILhB&VXmy{tpLG7<_Sfx5a_i6AYlsZ{iv zpg36&Dq)zJwaUj^e({|upltGO6-i?<4OYO#Qe43)+TKej>GmuV0g)I)N-5om9nTZY zH-qcS@1Z`>wzJkH!)1{6`VnSSYT7g}#fYX$7M+KZht4@z_ovvbEo$|UZt+?$l`XRR$u|6B&u!e%2rVFIA!pG{t-Hy6jKu<(!eQr{Vo{a8@|qftyD^FF zEGx-6A?7hAi+kFlkAXAGP*GJSA$retZTAlzUNCGdb+6Bx#RUHkOI1xAEmSVx$cZsy z+c>yVZbApWw5vQ`-5{_hnVJgmG-G{r38J@dHel=RL{{F%Ei)!YSufB+ z$>@vj)KA0j?tBPhkG$2%>r4+dyjLB=LGy4(4iAsyaAPc0blj3lR#Ww&?S7h3jVLnc?p)gNL1ywQmGm3n5zxtRNdygeFFv2mL3xMV9Ofp(#a zqgu8O3mCBIUkL8Di(?25 zvb6T!MxUU%PXY6I6+Knzo&J0j$Tn%#>MS9m7at7x7nG_P_zbl#1SQ&O1&oAsh_g(2 z5NE+mLnD36pb(DBh7y16z=jNLP;o>a915KXJ|>@cTE(j=6{l&E zF8O-;5hn9WX8UxzgtqiI|KmYIx^~KM@gBF{tr0I*w1H5SKZUjd9g8R{@(~t`vo?uI;+3ChD|P% z!?~1NU@s4e4K6&ym0!-;aS9RA`A|5v38TBpIs4i=gc`u))>O0z7 zbdLhN3i;p1Z5{Unfb8D4bBgy|X%~3QDQ3^Sb_Q43guF&#Y_BfNO=^p}nGt*Wm%yZd zH`_^RgFz(NV_id)dp>fz4Gis?E}zJ!SWX2d&MS>`feD-c-XxhZFb_Y5=AnsL`8Jk# ztkgvEqM`{~f0R*OK}QRtGY$Rtv*~dxgZeR$-tk&`Inzu)wkiO_FxmWrw;uv*bl}(vJ zf0{^CAsB|-gRxSv75ej#LN-7LHrhA%D;lPgn0v$IoLzN}y5CQmvG5K7sC<9fE!N*N zgscQ_Ck8The$6Hag5ie>CF|&ou}FVf!VKJL2HQx{?p80`{oM}&>#}{_1&wRwi@p(j zXmz{}s`ohZC7NdMw{<}tx#(NkViNjuAf@wX4N? z+@$+%0=#VDv&Cj|?%pcaT^mYjyzYJ)fdB(`n(7GZc3Ik>^?)R%#B6$#jLr z9dY#Q_eOJW8Z`Lj$3GnuOr^d5F3~-U93!6|Q$5PI`B5aLrif{~Edr3<_>)U2idY`J zX!R9=qg`*Fzjy7wKSe2v;SNd+s>6Rg7=J?E7d_)RrqNVHM)`dbwFk2HsO&=58J7_m zWf6(BDUOn4Q$jT%S6|P1bc_2=TOlUtf_>aH$#E8Z0?hVde^3yz-}gv+eqxfbR&t_t z08ZB>0~qdo@FB^AO!X}Ak86on8JPshGlh8Oj(S?ORYzgO4RkEUUf+RFDU4__`%?wi z>*r7GTSieDwfK{DGn;d}u1DU-XGOEvpqpsV)-(gaOVjgqgP1*uoNX!7zV~i_e7_v^hk($< zAYtlmI@cUUXpH3uyuXzH@RyL#{f$uKZ!q$Q{)T4a6KJwsosh2+GU@}H#CyKmWq!}g zKrKcf!rHB-Q?^<+IZ(xO>$L_3Q|PQ&7nFXYv+KWCzg=`+X{<4d1GR=FFHL3mtRTHx ze!~itX5&}h%&x;I_~?RXg*ix>>!+fHI?q}+=NWUF((P93bbjVfNra@Eo(1jJ`YHI; zg0Uvv@SLjJ{z~g`m>Y3oxXxMLBOOZr`8WX+q)r8@o63o_%31~_ScYvnD4ryeu)E)5 zPtv$V;!-w0-x;kBEZY1A&DS+}34HbLMyIc`+P8Odj6PB^%smg5PP#)Se+|B`0x$DC zmymmd_y&>>=c`=IjLHf9v( zm)p+n)>q#A3gkoOU8Qr%?{%ODlWhPT>>r((pKp30a2H*rwe9q;95n=e z?tTDc>hj@PeVw;Qt@cJVg*6N^ZZ=$sOuRM@w8cNXeyG502(ha~|= zJ9BVZorX^|pXkXu)cX;a8`I2=edF(k7edcFhWPJ}SJRmn z_vs6TOC1uNb-j*Q#iXa~%D8H`4`UdgXgF&>cR&^}Co-14o(35kz0pX4PEr1mU*D)w z3cl=jjl6WJ9iA3pr))hiaz#i^N@c})Z>LWX(e)!%=d%6!UWXpGi^NcB(xlVWvnoyJ zG5VH98#q>BCm*0}r4&Y9t{>EnQ`<@ET-??|w!wchao}#dYEm->s&VZXcG3eZr`IX~ zGN~a_yK4M=C+#AmOBTdEe9t%Y^?(;VFpO4v#pHkNDXhoT*PO7(GKi)heRU9yT70;I zvORLEz0=%v+%a$a7leF|>9sY%uA{sLh71p@0Z3bdMK`rcs)rXqGAxq8G2KHJnP5o4 zC_eaK$T_zHEkUro>z*+>gA$B;0I+Qce59}&eCWv4?c-2lf!#brWOORRF14|ESRr~g z4YXYBBL0`f66c;o`rTKONe26aRYr>P!XIapbxT%@!`ERvZ~c-;qju9fkJcY7XzTg3 zI_hKhGV*XHr$Gt5oAK5o@13_B+W}&gsvb!0Q}9VTJEeY{CUx%P{g_aYxI$)7s<34r zQel)WXCD6qGX*Fh-8i2mU4Kon7&j(|DpT1NzXv+I=_KAfH`~_;KG%r#aMnuq?sn<& zi2|WCz`E4mI2g2r1Bka5r5REow_W6*{x+Y##`EH(u`6>*Af(bGPPMBHNjFp6?eP5~ zUF;5Y*Yn!bdX$Q9|IU=Lz7@9gf`P^4=#OoNBfAQD>X@*&Pu=;9===@r*iebel6vC0 zshUg}Mw_kGQj8~Wyhjyb-vM(dqL6R-G}0;U)SgEN`fXpc67ajEf6;=a02+!K++-AIlj5~lK6`+lVuRc^TKQ7MOg3a4rN9fKVmv<5%dadD z^YnpAA6SAC!wdmgJ7PC(K~NWF$xtJsm22s`G_y3QPTC^L3N=~8#yF_p@t zn9Da~>o~0hkCX4XNh}n@oIgv3)MoFv9BTMzPbOzuCS@YzQQQ2uia`Gg04N*r<;`6W$oW@Q$!FX@HJ)?RX9JWISf8rP0nzc zsN}n=ww{Xl; z&pKX`h~>|h?GK6Zk5-kb_wXw-5b1B^J)VVHtARK7SzIVqT~hwrHD`&57v_cc;RjLa zq!@L4b7Zr~W8Pf^1TjXyMhGwIk{4AsfLWrp=*2`?)hPD-s{djnimLMiv%Ts<=Uh`5UV`mJ zH@N7FfQ%`Tb{eN1J-M>;5N(^wks`%>UrTYi@h^6a3-*8yq z;q{MW;{e5aXr2RQQCDsjiB!Zp3EPyL61oizH#Rr)#4W=&3S zNsb7Y*=OpX?b^|%JHrqUOF89cqfjEgb$W~kFW*Dt8PNE>T;7SD&M;zk@wB%PHFa$KvT{h&*_GVT|^ z%d}Hs9l(+PIUxH zJ6u`A&+GD&Zn`CWn+*1|FyfDfMeVgz55gbjL_GSTn6}^r%)dhqj1yW^0LQ1DnEk{p zUzfvd_hAsIMJFo%m3-!g%eXuTySwL z%lr`O3p#aHztg(88VY4N!T2RAL7@kQyK6i!B0#~fWO=*mi(M>T{%2azzm+aG@_rrZ;AsR!lEEHKSP%?s-i(;@A zd-nNpy?B4CI7Lc68mOyJ;ILYtBj5diJgV|_X^84Q-Pz!A0UEVs#d?TDILFPO#ow;(tevg^ZoEgM+u(Jlo zTq$tOMK%1&E;M@fx9Kaiy2B9ZCWQ&ZJ=#rZ>(^x7iiRKcg%;C;t3B(t&t~4P{vsBj zzoN^eD@!X(owIoDOKfWRWK=|#DwFGZ`NHi6%mY$ox~eHkQA6L^fLAWTp6ifyv}Ge5WjVx{;DrW>A|Z37Ms)V(G~L9g z#79y2Jn?elFQ3k*d-$=FL`~%lz8A>TsSBxQhS`F}2(7YhX*)+yW)iU#ymiULWL>;hWTaj;MfaFdKw-2N*B*cH3rq}?g&VhLuK9aCt-7DKOsM^!$;!k?kfN1UcEn#QSt})}UT^Sz4o93K z$QAI)7JNq<;{PwDLx=S?{yef1t&A+LX#dIMN0b1{fj`jIeMX$DOuD{15NkURrsY+f zzU2s))O-^1n6V3Ms^RDO1PMDw^bPX;u@5Y>NJQQH8Q1x0FX(#P<|o(z(9wa#d zn+aZ`dHa4)hhmPFdvj6MALKybm3j~D;yf;#o5M>i9KyrR3#u{JBzBTDX)q$ECaVI{ z4HE|B>S(J_GmE)3|aOjD9J zRA3bA;>#azl{v+w$JqX#&Lx$d4{g3vv@BBew7jj0VONKPBcWjvwcZ;k6g+kYFM!UR zubCZ&(>_0Lt0Sj~_?)H8UkEGBMMaV_Dkno*?WagZiRccY+S4`` zvH9>@{xfTr(bJCOIlXR=Ry!{xz|3FP{(ca_8nj1A(ckdDaBaDkT1wc+aPmv4-}ayf zl=XhXR@pp}&VM!J;B*qVa23^{x#gPWR|?_!kmq96?n`l2wxY-OIf^LV+;Fg%-za=R z-!hsZBntjHyR#`DQvN-9LQs_O7O_E>5`=6%?j-FP4WY{ySyw_r4mB=4MRSOZ_*qOm zo$)>pgwM5zho0XGy1{&}#-f$(rArm+0wrPghGw;X8Hm3o!}gtJl;YcjxS~bd;>5NE z8J;{zO!Js-LwZ6{V!;1d>Uf2Ml8pW(0O>#HL|MCUUR3Oi7P;yb{4`*Y^$3=}t^&{c z4eZfK`>{gRzZ_ zvywbbz-jeNhUXR}d)teM-!iy$NbZ-Wl|%X73b+$ER;udTK){0qkViq(jJ{H>)FTPbEjO3_xaex$NF{OrIWTB3mC7|FxQSKT9a)oRf}=mQcRC-iuq{{^ zfbCEB>^BPQl1OY%(s>d2%e5@?Z@Eo{^!wEgO^d?H&GaiKY8t#Ev_}x#LGOu|vZ1_f zf8gFzI(5*KR4aXiJ1TP!De2}73^|@3IoD6A?9R^(%h+5&wl@Ejkp2Jat@d-d2y!Dc z>gJr-c04=LhN!?Q8Uc|C1;?fL3xiZH8CQQi@A+=6bJ(pmX#j@uY#zmS$;A~Uj>ifx zt1P1SoMT0b_;zCst+}W!pp-G6Fh#;GP8;FF3hP^4TH!i&z37PG z%x6DHE&TH>xBldXi>Z!{8esU~#Kr1Zu&>3Ud0q%-$6=6=`Fq!P`^a>*u-n({)E6Zo zDqlf#4(lldOrQKS#Y@!N!Q0Q z4vvSn_#uLR*1hmAr^j~pK31eSvzFzO2vDGE!AdxqY-93hJrYX0I8UBeYBB#HZbcPL zGK-g!+Du4MTc#kG7Dq2DG?LHSikYbcK64CJGl_xuZEZKX`q}tt%6>{ zT?QT2FDQz;sSD*^_aB=vPo3cbmsQtOyRo_6HMd7P8hF(mH$_nlJuWT9^*=z>)pe|O zE3@>-GPgF9Rn`T|@eX^P^b{k=A-Ewj(k9E{Z`p)Q{&?Z>ezs!cQEG$sHV9=Gnn6B@-5rx=Jc zvypvyF{~P)l?T$gNSOjI1tYy5J18h?_RDV9Bm~>wn-hDolK_Y=goC)*M|NGrnG&`X zj+cxsW(6MY<$U}7TD}RzNd?vs?owpbdEuc8=sv5^l04}Jf9Iiaw~$sN?W|T2q!oTF z@~`_G*<4OO01K0b&dV3JwA}18Fz1)2D7&rc&0iF=nl8UteF;}uvTs;t3`BrB9B$Dd znSCMoxC7$g9@Wue*vlET$*wj=s831nr~wfs;)0X%m-FQ5?7MBWoif2&&Us-vX$xht zyZ2RdF9{~H(c#)Ss=a`+33;Y1a#qRr#p)}&tlIO_<#6Bu%6yj#RX!7J*n8&>eEhLA> zC#mGy_t|)Rkhh3rle6QJVOOQ~&mIK8L%mQYpG&&1Lx}P>+3mDF-|>Eht>104L<6F>!e)ZrKhtey?MD z@)Yo5+L`w0o}0#H_O0I7922emTSr>1o-Q$^`BXUe?5iY@yg5QOKmv)ZG_s^hOj}%0 zW}n_tv`86KKeWc!h0r@Er~N;4Zy2fRR%xYa#m3uR3X=a1`K+;FFB(SEYh9CUBu`ao zA~4*1y{-^lnGO?eQdHND@;@oC!#k?N``<7)+w^f3vW$iGLL(12+$>MfL$7v75>zFq z!-6HVy69J*rX=4|)9j$@V$Kt0$TCa=%)TlXVBiW1c##hAcRO#!J>HJQHmRDekUZe$ zS30E@eM58UK6oUnm?mR9c+>vTl;!k~ZsV4;ALodguHthu=3&6bGU~5RlfSOrWFUn1 z>@k|xieY-woPpF>)#?l(!0*ReoF9;i@?NrnqL^(cP8BI-XAbCVqn5-vUZg%31t*^d zw}M(IJz@HOD+^DxtYOb>`jqj<4%2%by_9t$smt*mI6X=TD45_>GT75ga~)Dymdkn6 zjiM;&E@V5II{Gg`6&V%t8~`$!cCTYhJ)@Zf?;GqOla>SmI(;}!cFJy*ODHBQuB^hK z_FrYM!nx!N{|llzUB%rXo#BNFI8hQU7$T9N9p#?Itk;Bik)53U47;-x(rbWk5tOtQ zv|6p;&>?ZcuSg&q%uj?8LauP6?b3rgk&-5fuEE^5W2aDAfkzt2?fs!6oiEf4C{y0CY;++4SN0_y5~9@4ZD1b}Xah?~Cq zc7VHvY!7ii9{%;38Gl~>NV(G-&3Q}S6|+N#C~dAzTiv{SCc>K=xx^GZaO3P1^Y`i% znwAmE&mGqY`abCq$l@Znz}E*d-~>78IGtF{7RIbbk8RwfK)H#V6L;t(`N!axVHmyq z-U+upIJV#D^>+%lwgJ%a{wWZ+`8AS?rpmtDM@jyG)LMnVQC8ILkHf7F@e!SK2T0Jw zR&b7ka2UuG;kzWVIKge+2bqVtr@y&-6ygrXJg}WWn8;YQ8Zr(ftYnPfF)Ovi@fPIQ z(4o!SuE;qes_&#(EC~WKk&^VC5HrdN%JmEQ%$qeo-DTfpS6l4X`*dn;*b=5jOH*Xd zl3C-u!NDJdBjOIgB_%2)Antli;f6ELUwz$&1rA8e*9oC-x2(UgHfSFzJa`ZQ&qY9WN&Mh8559A9Mux`|AvHtm zm&yW!4sQky33W`U3n5$G1&Va!eo0&&8_WOI{PIuLE~Ufju->m#g=enwn#P)B?y2lA(zdz}K${eq z=(nf)XM4Z8W!|0#UZeBH^fL%+4tE)m!ug{jHNAnx-s4ICDKS#N4W+fe6`wK7aci?E8XFlnyrJ1ytXR4~STu zV5UbIa&~;u$x#k54&0%rSteFzKm;Orzkx6josfh8aZb(KD@i65qUd&Gsr3FtrNJ>T z{es1l`%d^hJ1%QaLPUHSVk;0pwcTmcf{wvxvNXiiwbUgYH5Cuctv@j4_qz3S@*UO0 zNlr?X72z! z#+CbnHecp`yWqYfufIm;l^(u6d3&OcPomnAa`^td*PnZ&mRWK?Lp%Aqu;(|Y&3XN* z(Q{wPO3XZTM-NkEw+D-$5+$rgG5OoGXAldNw?nQ#<^ip!u!Z}9WC)qs^iHSX%!wYj z+0kNk>i|d|BRC<=s$Q=HqC`Ei(I!XOf2gNMl+`jM6^FnT~r#0 z!;*&n6`|34skVtO;Q|JRn&9L+_@CGwxJ=w$Xet`CrzUsO*JZz4v$`dBy7(UE-^6!H zDd9ptDHpsS`>k$f&Vx+J!I75hI^^D}FE)JmWV$-F0NVSsJ%s4$-^&`xv*f8>0_g*e z9X+69BVuaXdv0IF{*mXbyY6ipS6(uXmHVfu8QRKo>2kR8OpPuU*vjXJc-|v%6P4L* zDahLECHf&z!wFYApoLKnxa)$Nc9$of_QCw2m%o&gJZSer!oBS`)&uVdDp4}EnBuA& zW}lw9a`BDB3$Np1vw;#fH6rCmXW=+Jb=byqTXgY$ds#YZ8*l_UC1Y%i5FH&&h!P%1 zln8NR0k*z~68gnV(F|H~S;{$YPf8xYG*%x|)6qUcWe6l#n6eem4-eKJ9{FqO^2^_> z`R+b0zDbD^zK81$FuL1fu@I%V)e6DG;G)1`M;3*ccgWL^1@F0G%fp}KmhRg#G;PR^ zj`lqi&lQ_W2KvGaU+ zoG1|;A`m4qp9~?@P$cq(J{P_^XVAIt4Ne@i>nY)pP)tSGv>8;QRMS|Sq?RQ(Yip!j zHdlh_MIRX{SX<0OiZQvbHe?H|l%Ho`s{;t?ZFIHM>K*hTt_6%&7E{VF z_!4JLsrA;2SmjLw4V2i5ePI)?0`C3xe)AqZC+E!n_KnNPTPXaiGobD<&jyt!fjdB- zKt|3d63yy_2ACR9f*xtB*8gj2DlgXzg(if59 zi#|OnEx*0jf$l1m`>i2S^F}a4Wi=sK-l0gueNorf`mOYLPV`#)$F za~GeGHTCC&$oNWso;jB82`W)42mOFA%bPc#aei9?o~pop6Yu4?AZ7 zQ7)}8ySVU!2M<;p`g~CGz&+hGMDewa*2bt)R?Hcs)w+b(SiMjWgozMU<{ZfLaEad~ zRxv8lQo@mJNNm@yt;OCFiK-;}1aqo|zoc#{G!GHN*%LAvc~Wp5q(*L|@n@pi90`{6 z@c<;bt5Pm_{pM5)AFnjMHGgGjwESN|I-2zQ{}7+rJ?q*=Kx`*7x=#pNG7P9kL_HfdZ)B%hGXze>KE zh}oKOR-T=BbK83lflI^X-5o6s&Wp($U(lrjIi`jNDp^YVE#+XOBjI+Fctb+F+;ybZ z&_I3HBqbeWK3;O%<+?m6T)kOtIrr*qs{Ik+?(ToXLJ-kDN{&u0St#7y0gO4e9tkQ@ z+FyTQq?irR4>*BODv{L{3N2Y=!;Cpw{dnxSxCMwaD#V}o-{CJ?o-h6P^CW1OBsN2T zE*2BVG@)Yh6D~Gz2r=Ipt~udc!7sIcUN*mE@5^x8U)>4JnwFYWk}HaJLZ^kO|L7<} zn4|x+sK8`6aBDP(3fW*keGPKfR^4wXl1AN$1K!^4%XvBAeqxE7bq!l)Np&9n z{!Q{>!_m)>aUkFqAL9>PHsF#M{*`*;eezvg`n^5w)I$%&;PvJHB{z0A=&G8lGejB>;Qh#Zsj@HTeBDY7#rqJ3*B&>zKT8dD3UbMvYtrdP7-Yi1$$qNEoo^)e+C1rBmr#JVz1doHz{SToUh3pt$Yt{Xf+F zHh1w~uf76=N!Oio5l-(8nog zH_cf)cQacqvHD#^t4$w8uG4)`JqUrl%vAkt{`d32dGwu7_+R-mjrq+5Lvak; zPl-g8VK>=WRFE1*pAaLM>uOp5aUe7Xj4pbWFfcMZpoD-^`%d|_)Kr?iwBYy4KPvfT zVVzKK$e&*BK4(p8<9+hhLG{;~b{e6Zs`4?n;El||CQw$iz@0SW27+nRSy zfvk_{TjqB#Yp{T9ciL5FtUQ0RKkcFZhh#~Bn|Znp`kYHh??8RPwCJ=W@bJ@+o%F?{ z^+yL3))fu`%khB1`lEx&o69pQEtP!=Ek(mjE;GpxNeI0}W6cc){JNaelWxBLSl_Un z@2Y;BXIf>7uWPEmI@Zv>j?5pp_0)TUMwAN8g@aK)(AFX5>}EHiRRs@?(=H5;7``rC zBiX}gaxcue;NR~aeDD4SM}wa0mAD7EJlCXX3B_9S>>uZr$dU&57u4jB=nkR;p5^gQ z!J?x$!#O+dD(&Xo?u3aMg~ z{22o&3;>)G>X`7vzq!>7`yJQG+*@spJ;|6CYIY_v~%S9e2a38#e7L-#4K<<|Q2785E+_0=27lH|>~$J99@)^a9T?WMG&@@8Jgo zPR%~`ORSNGwe_SYx4!Xf+zN-4W$@(n!=#_Nb$iGA@yejzQrA+Oirz-#M7uZUK{WOvp8%E;3pl-DP^n8G~m0?~_wM zA9P~$$-j8xKE1)Xqj1GEKKJgtbIE5rK3xc*QbAL*bhJNR`CL#2TiICIhi6mtrr2|* z9`@8Zad{i_UnfQ+b~-yiR|2j(--Xt)|8Dv3=da}-93@r2qAwC2q6aeTBu2y2d7d=JdP}kwXww1RuhZyI>;2TWqg&TKyzPM{bsSX6c)TU|sRb&q zM&XH-K=35>!H}C^;TM>X2TxJ_0geeRba&?5%kqN}@lGpRe!qZ3mn8kL`@NG!ou)eR_VUJJQJpl8wp5kDvI|#n<#* z@PsrTPim?2cb?k2&*ZF&y?x7ql|StJ{zi;7?PS-(_VG@OZ-CI6bACMe6rSy{Eu9iV z!CTaHPSmh1VGE%!?HE*iY1Tp>Dimd$@_awcpGJP!fhkXj2esz``OEzZ(+CzQnyt-| z7c4(HK2is&Ea;D&>B4BHcInY}gg}zEb45#oH69S>u&mKTYw}lZdt&dxukA1|2i)1eVf*2en`+Q=SLj@w^&cbeMPK+GE?9uor!+oSe!KNSCkZM#~EOO9ghuP8)%ekb^a1`;n@X|w`n0@k+ zH>du0WTt-50cmU<0=ALub7_5PR+mj&7rm&{M5)4D0ag^|U*hK{ z?#m=Y0J}fMKq_tY9sxiAxefI1!c&cU7L0P2!=L*Bu}=+r;t9p3$jSX^pdw3C0I%-! ztzb!t#W+a~aBfIh@e@z3Z*=?jw2fCW+SstGb(S69fA@?`Ltc|^A+k)la?EUIr$BI8wr*%q&rh?(zM~OL|cmyvJ)|LCA zuvjhXoL{Z0ca*R+$wyh#uFcdy!Q z$pbOE@MFV63G`sJy}xE}tC%%u^t!+A7#%l$jlcH>>pqjME`|FXkv?~@;YdwXeFq=y zvd2!yn*Pn<>Vp%W-g*DmRraC*p?EQ_H-zJ=h957_+qi#XL2dp;S#jCzmYoVkUxLwQ zr^Gjltwq1TY5jCxK1%#L&nT#ZEgS#FPktKIku_1;t`#4G0l4mLquJUNxz_yCrPOE! z`U;4g$5Vy=N6Zh2`XkYdlRUF0&*Z2Ah6GOqAaeh>LEF1}EOoY;bncanpJ=(oKJtEX zU#j*#4H`q()URs`h654??RakTTPKW;p8B&IGhGIF#zg9c*r*60+87}iqx3>lq)v#? zLo6V$6#T^R1~_Y!`GX$VbN%MEMJq4s>Uj;;`#MFGs+&l*Nw6q;T6M5dC3`xSH2Xe-bgBWNcFOOzPWymzsupWXy;>D@hcf8XCJqLgpi zKUN;6J24_WymI{oSa;v|N8t}Q@EA9h8e-eX2|i!o_RIA& zm}inyFX2^Bqahj#zA>p2mOVB0qj7ySIeXiy{v*$mr2$yclg5s^^JlT@HNcA$KEUq>(Lu4>yzVq91(&wf9tXwmjq5EI;P(`in2!$n zwd()wX)nf#H`tb5FUv6Uuk3`b7oA(|%~39eQ`AHH;;7r>o}#sJVdpsM_e8QA`^IGM zdu03@r;Ie7_MLoA`FEb5Tn;C1oN{|G`>x{kMT>Vm@@;ifmEXCn0v%H@?(Z;Bs&A=F zthX0stAI7alUPw$o*Qlz61QZ&H50!YdMZGlfcN#f1Nb+M$YFeW^!-JIqd@Oql9d6o zFVd5G$g>lgR7u=4aFXeXdI;3?IfaY*U;T1-h;GfcrfBZbPqdD*%n@YQ$E=!gy6e}` zzom=LsEMic4|3ssS8POF<-f)}cG=8?c`r~uGSAZq`Rj3g;e1Q2*u;_zr-IeWL(3}a z>G0%MR`HW@$_Rli{Z`s=I?-`dn=gu1*&b8 zf1R_ZX~kS$dOB~7_}V%3Dr3#WzEitgbi+P2+kq&xSIgQDh!|8+J=#G~Iz*jXZ@Ff~ zt#@D1_raUwbH@F-q};EZ6P80gK6IPkA;?XKnss%Jwk z5jkHdH%_Dx(8K}U_*%njB&R6A$LWGd3H%$f8%v97Isrcjd>QyS6n`jt^{E4uBZgJHn z%XdBLyQph`N=)!3-94o{YlJGc;*SK>6 zAq>W)Otv)zQEjBk>ppRz!^_$^MDfIEQd$|2yxGj)>_tr^6OoQw+B@@hU6a znuOm~u-nT|4UUVP2m?Ir0+inF(wyR5i9=a&19v?<_MH=R^d~GO85G#KNp?}9hx4pV zgZ@f*^51zTPm;|Ou4_p~1~>kocNd;Iu!7_1bkxMZmV3jmpYMGCX{=1tm1Fhxt_~3; zv&9rwVapvQ-?^n8rqZ3wm+mQ9Pb!u69zGzjqw=q_f2n-oMY)BuEuD-nD-J%B9x-am zDFe>}ZOS<4s#uBRR*%@6{-~HV0H!!z>{(sqBui&&`<>H}|dftZJN-lya0E zvCjQiy7;~)*59_GsIG8uSC3cvz7FY>DjG{O!Hru~R}z_)od_7|cl;auW%wZtz>L=? zcDTA}cLJ>|-d$)qJo=4;*M6(U7&g!sIT40val?E_P6|(qU85{M)6Edqd5kNhIt3@( zM|61PyCBRTcIRD?cDPFuy2)YHY%|BBWeuIVm1wmEeFu7``#f++=*NUsId&83Dz!>Y zw~nJLZ~(GOHbOd*TYf3XII^<#ji-@=;K?;O#PB;=bEv~*YmeXro}ho?WzI>|g$&N_ zips!a!_PP`M;q5qdho9~xvLKUe$@%tGd@LU&#oA2r-@Rj`REY&ZY=_aD7fXP_so0I z+GE448|+B~_zwQ}ft!{&TrC<7XHM+-yQJ5p@8|b%?v&&!0>$U_q^n;Uojzeju=^Tl zdrfw893iO8+g}=@xeKHgPz`RVn|b$7-2Bvumn6L=*NJdcGHAm;A5K@I zeVMsv&|CX&|I_R|nkkR?Z%dCP=bGd?i0g(w{&#TF3yXwkEsjQ`e5aSfnD?Du^QKQ@ z*ScJ+=t^Ah_O5|(Bi7$A@SPLlwL`aigAa#QAQo_GJKo+|YtQfZ?2fBee6j2Q9%uCd zLk@<3iIS}@fye0Zd%4#tn033wS0?08?Z69;*5!?S zb=QLRb(Xv=mjmjXVeA^fkZ?=<N*V*@_ULsAXZ5-Lq0xON{@H;ph2)VI zTLW0%z?J1S3A*<5bshj4zPqeAsJfFXmm~fZ&$s! zd)`N+wt<`4d={D=^|4|`Nv3M$xs-5(Bri~_{9N4D?)4 z|G*nNs#cs^W-7WRH9CVhc?RqN_(Yo-2Qp1(wQ!h{r z!OU-Nx$nKg=H+LQNO{5yQ8x<0`H&bk)C^(vNYJeS0wD*b1f_}!?&UfFr0Fia?w$}b z8P^PX{k#E*L$-Itq6qXIR(ov>snUzy$(StyT?5dChKv|2Z@}fbb5P1#=Uk*qusT{I z1AX_gdjFufF{>&Yi^qSF|G*b@w%sKB3lGBeFs_qw)D!|F9~a?BnLiuLyQRf>fD>}b z63GU(MZ%5q1E29YoQ=Bw9lGPA9hK)_P|;9wSF$lU2^$0Al&TubvaGI}1Yg!P`J~G! zH!ePjd}{+1JfQa<3rMx6e9Md%w_LgTNYio>YsB?L2rH@12stLsHQ8)7@;9E+dpJC# z9LM=tPu?)0?@8T~0l=U6u{vvG+R`Jng+tQcz_lRSpZ6Uv_asH8=grS~^|b8B**&97DAX{qtj?Kbi7*yg?IWS8Jf9EYmSDHnLbvfmAJpRoX_{?~QA={)e&U1u*DkXPl~7{HJ#@E! zh^L>312`srQb`xNBAQo-?u5uoF>V8{&Fpj6gEI!6kNSnMJSdxQSL2RLbz&TM=#ETq z201@DPLUkcXgOjQIr!FMZ;TDgL3U%OBDK+VmkxN~?-Sy0c~DARL{|ZpPm9AJ(Fkkq z$>UNH&T9Bk^ozrsT{vgR)#64L?qsqU zS}7uZ&xG7#R|Jp}o!^cRqLg2=f9xw;Z~Sw8)msm6Ncq~4)|7 z(0R{*_!GANI}R5TB~RTL|1QTXIgZJ{H(0APx^ex7?W@%)jcr!HtDihO?fHw9g4Ql> zV3IW}_4b!?>NqI5bxw+}a?Z;e5DuAtIq%uOX7By;;CBnG_KxLh3P`84uX@F~n9Ie1 zl}%BUK^dhXioFT?d6&azk0ym^3 z_E<(fDP-su9i-9};(9e{IMgg4xbe5&+dkuH);d?I;u8jJRaBlo?% zrQ)Z#M`{lKGc$hB&OkuoH&LpC8gGl%oHQDd1(S@Sb%>;5mC2;im%A(c(9S|`X6esr zhx6Dp>tg=$y=7ZwJh$PBH|lNs1}l|d$Va4TV`ii=ORcFqig7F>8vKZaNvqWoLO(R} z;-}BfyzUXTQcW{_h4sM{)hzA}sSYPToFGX*rGFEmE+IET2*Sn4b1HRdRPZRV{`h{4TR7u75c-MU%J^aL0hJZ} z0iyJtqPqN{?{9nXkpreBm$`tDkP5ZT_Xsm-(}QQ^^sjXy`(th#L?gRJa9F_y8VLNj zglirPfsN+gsMKFJR5 z>tMYT#~@Nta>WH%6+`9~+TOr}{d={!BK^;TuWx>J$JqLNxbcW)B9fWY)>IbWV|jHRxtseJa<)Pye`#|5kzJ#67t{peHqooBP@bKoM<-5Mm|JSFmOOkcZ)df=Ma2ONa5_40L2z>O`Rz!&} zbjEbB2Bq^==h!y>wQUz}1_|PfVX5O+wlyPu6Qv64&S`NGE1soIR{zdt- z{X@3=D8W@YoVKt_THgLxJnsNv)Mr)R_t!tUcKV}AEktjlD?eRLaDogEA3#c|_{PLn zUO8CeEbH~PT(rT86~tu#wRrG(R=+21I4S$Qcf(n!?QK8+0T5)tISu08&>xA~a_B)l ziFw6WPsA710EAbhcjHmtQk4cDy+p}Rq@9p4Yh!8B$E3?^57MwRlx1TT)>^+z$71b6D*--fFRg2b4zYoePvpQzfOBT(g zlC>i$7u_6zKZM*9io~!03;B|qw=Ni;amsi8!Z@7nBSIVHlt{N)TM^}Ok+IrL*TKhB z*HYdO{{AbR#u)B>=@&O>XG2Tf3Ev!eX>md0_g6{#>*nmKKOAQzMCCXmQ1UT)v+&8= zbsKRk>d$sR{*KLII|<6JdsY7UMU=oN#OQRIVz8rH@H2{wa0oi+aV>@FlzBqvHlRHxzy zi8T_%S2o>#IY9;noii|b#KxWkGihHzYIA^YjOb5^o(%0e#41a@je%Tw z6>#x)O2s^JxTd9eU{8fbclO(;kFBvgY}c$lGHmPm@+V&w`-0x|gd?K7D6q8Ty92>b z3|uUeDa|wIK16o|@AHIfL+a8|ZCy8QfBClQ(7>PG;NTZgLbh9KvPSCR!se_Jvp2{AM7%R3INVtP;u_dfv37Q+h!P}ew@{B;Fmzy6LstuAofL%BC_FVn zen}JQr-MWrz%M??i*5FZ%GZk$2x=)W_6@ z7o-C3jaIF1d2an!o5E?+6OVQ_Ow2k#(SqufTF^C!`P< zoIGJ!bz|xHZx1Ybud-$BOoE4Kfg|iJ0vhnvMuWt05A{Zzze1d zU{!PBz&*i-GzUeSPUn(b-Z;%y2z4Itnv8MU@c}f&sy5H`%nwf<~f63xnxwv zv|j~bUU%Ya(BGY)ACzmhZ=FKm#hoXKcQ;YYk@q3LO%a^UCsuxiuNXr>531V$XFqMT z)f^F_jp|Jn*vXmFX(CYEd2mnJ+Vx8d@BPf-syDjV2FwFY3g%LWN*0izfu_|#d?vHO z=1snD^Xnu>7GDeOrbPY7O@gr2Yp?y{l<>(k!<6ND4Z8?YYHcHdGRk0;GXk59RylHy zY@vC1yDK^(zB~|Eg0q}<%h5kBdve9>r)zYl(=dC3xaOQT%oZ17fEw7lgMuN0gEbIotEi^d<6W zHx27nLL}q^hK|-XQ=}99al8Y}8m*73@)wr%EfwiM9KQ3NTIHP@nNN;S-0CKG#HDP%NV1S)!bQMxF1g_Q@t%Rw-}Mv7eF>3$3V;Eav+3v$3pSKJ z@P?}<)|`aq58GyNN1ee$1EiW;(6QOTqv zAFZJujnQZXVaX{pH#bW-lGZFqf^PDfC_k0AwaulOzZBf~bCcunFr?OriHW4``bN(A zv<-482SXM@8|onrT*@(7iT8B7T%UwXBG3D1U)~Ppvq1%-P8hiV{6UXjo0BpY_}S|M z!Ji&?Z%S15Zf~B%9UO=&LK9Wj!Do9PYXbr-eCOXK^@msep8w1%HI_9q`0dh60*Jph z#tHdqPKx(9_tVlIygw}_^N_Fm{Z3ty6q$J-Rx{~OQnQQK;o_gL^Id@QRd)r7fO)1zCY|MzQc62(u{TAoI`Z&GPWzEz8U-Xj2R=s+*@XMV z8-+xJAVjztp>5RZxbq6RMJaS+{TY z3WXYWXk0VE8?oGIm>-Q-nGy3cF%_(w7$HGQH=OmusRJ)v+}2qACQ8`IkoZfz)-~rZ z;7Ef$OffMrB(t5bV_@RAmHte^o{FEYG26DBjQ2_hiPSnNDM^TgG#>389(ttqZkGLy z98-ITKbARZ|FQ3p>R~%B82Iri=MBB%zDQkkeS7aXmVO_eaLND4b#Uzwd~d&xO1|Lz zV+k(dIu?yeXPMmh{P*XL_%&x>%->&yeu}aH&-IOc_qGnC^OmGPaqZ=!7R}RZ3~j0> zN=zctS-72ucP4c{vTirabax2||N|gO6*MLWc;hZJcPFZ|Wdy@b)!lJ+1 zKl6yo)e?(?b3#HPI&kUR5CZVz=96|K_1JF0{_EVz#CGk+}p5*L{DaB?Db8WQ{FWI@WfgAh+{)?cjE z4u^eo%Ki6E&b;Vty(aRwtb142RG$9H-ct?($Vu{lRVyu}s5%wrk;V?Xr!`4`){;3x zpS>6YlH2#yXb;hPe-8)(M{9G(tuOlEp3#5>9&=bdk&!k6P{Ndb@zYUu{aNdi@D?vh7 z#2QkHM<(36NY26f3sh4>3$+sG;L7(M1e%*UgETt@g@zqknCm>LBW=V9|eVzJN)hbeOuhL*FkUOy||(5E*$Kt}){#AlE=L33LhT51** z*6y5k)U@ryQq$(?4c3CevAQuE2gINH-LRCCzKM%WDGubd0f}$CVJNkv{;TM{hmJJ7 zfk~spHhd8!2Pmi!snm)yKR$2JLpS=Hfo|!+n|?A|SDnq@%h`8#mDEfM3KEd6h^X84XteQtYjaLUx*Fn4kw6LUP=TiaBU`OBf3e{QkwC!X1@ zkWogI)XI#aS^Zx>J1u6=uHykd$Lkn7M3l(Fh1{BX)oae(RsPJYHs{ey?*QampV~Yq z{+|0sq|SKUn{X_2bLWiqDj5~7^Bi;g)J{_!n6~^8n@vEw>BOH@eN$VA&ZxZU1 zBGoh{16m33P-1;G+<`?$PbSTZVIcH7Cx#?i8V~R>LLE~B`d1Pc02)SO(9)7M2F0kY z6Vq>eJSS!9uNd#;?|6^L`x;uRlQ$H;`FM%>lLg|e%CaXwUI9mX)aCC??0fCwF%ik7 z$0MAMr!jY!C~+WJ?adLz_1jM>GjBPywq^U2X8Zn;_?u3Zc_2nNa$|Dj*fr@f<5x!M z5-I})?6-SI)&c($!=Lj-lt_UdATGcMF(RTAYHDgAV3R7gUEmgvL@7!`2@oer;JqNr zb<{plq6&A)F_ly|5I-hTEC{ami#hv;3F%k8+CO3Z%3jVWu-Ps*9U5_@ZsV+S^QKeH zmR%EIHZ?}gh>ginlU8KLPyHn|x|cf&45B^v?oJb>P!4@X-aQ}JTYkKv^*cQE^E|+n z2mQG~T*RZIu1;ubY9bDbgeZYIj5>ZX4vyu9roK#Yh&wcIUk)DnoP#O59T4bNT~+VQ zj{fJfqcYC=EG=%}?p~cyC^4e9?c)IgVNH}O8upD|Uo>YuOa#?ji-#vsLJo@iND$L8 z8kvFk*x^JSlgVWAN|ex8Ndsdkr_&x$;!++EC0C4Y#dP6fIj z3`a3HwGbVX6?9I-$%{2ivT7>gniCDD{gfIt`Y$9v2~qv_$AFU`=9232S?PUYF9eQb z2=pkTB%P;5OI=)Tu|!Yf)ySwWy!nSr-S{CKK(Bl74ulZvDDi6v3G_zI&wu{25_U)f85j^mZkJM>-%^g^H)0=*FE zg+MO^dLhsYfnEsoLZBA{y%6YyKraLWfx!O*@L%;>2naRb00000NkvXXu0mjfB=VSe literal 0 HcmV?d00001 diff --git a/docs/.gitkeep b/docs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/nupkgs/GetBuildVersion.psm1 b/nupkgs/GetBuildVersion.psm1 new file mode 100644 index 0000000..11ea5d0 --- /dev/null +++ b/nupkgs/GetBuildVersion.psm1 @@ -0,0 +1,34 @@ +Function GetBuildVersion { + Param ( + [string]$VersionString + ) + + # Process through regex + $VersionString -match "(?\d+)(\.(?\d+))?(\.(?\d+))?(\-(?
[0-9A-Za-z\-\.]+))?(\+(?\d+))?" | Out-Null
+
+    if ($matches -eq $null) {
+        return "1.0.0-build"
+    }
+
+    # Extract the build metadata
+    $BuildRevision = [uint64]$matches['build']
+    # Extract the pre-release tag
+    $PreReleaseTag = [string]$matches['pre']
+    # Extract the patch
+    $Patch = [uint64]$matches['patch']
+    # Extract the minor
+    $Minor = [uint64]$matches['minor']
+    # Extract the major
+    $Major = [uint64]$matches['major']
+
+    $Version = [string]$Major + '.' + [string]$Minor + '.' + [string]$Patch;
+    if ($PreReleaseTag -ne [string]::Empty) {
+        $Version = $Version + '-' + $PreReleaseTag
+    }
+
+    if ($BuildRevision -ne 0) {
+        $Version = $Version + '.' + [string]$BuildRevision
+    }
+
+    return $Version
+}
\ No newline at end of file
diff --git a/samples/.gitkeep b/samples/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/src/.editorconfig b/src/.editorconfig
new file mode 100644
index 0000000..319349a
--- /dev/null
+++ b/src/.editorconfig
@@ -0,0 +1,228 @@
+# Remove the line below if you want to inherit .editorconfig settings from higher directories
+root = true
+
+# C# files
+[*.cs]
+
+#### Core EditorConfig Options ####
+
+# Indentation and spacing
+indent_size = 4
+indent_style = space
+tab_width = 4
+
+# New line preferences
+end_of_line = crlf
+insert_final_newline = false
+
+#### .NET Coding Conventions ####
+
+# Organize usings
+dotnet_separate_import_directive_groups = false
+dotnet_sort_system_directives_first = false
+file_header_template = unset
+
+# this. and Me. preferences
+dotnet_style_qualification_for_event = false
+dotnet_style_qualification_for_field = false
+dotnet_style_qualification_for_method = false
+dotnet_style_qualification_for_property = false
+
+# Language keywords vs BCL types preferences
+dotnet_style_predefined_type_for_locals_parameters_members = true
+dotnet_style_predefined_type_for_member_access = true
+
+# Parentheses preferences
+dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:warning
+dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:warning
+dotnet_style_parentheses_in_other_operators = never_if_unnecessary
+dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:warning
+
+# Modifier preferences
+dotnet_style_require_accessibility_modifiers = for_non_interface_members
+
+# Expression-level preferences
+dotnet_style_coalesce_expression = true:warning
+dotnet_style_collection_initializer = true:silent
+dotnet_style_explicit_tuple_names = true:error
+dotnet_style_namespace_match_folder = true
+dotnet_style_null_propagation = true:warning
+dotnet_style_object_initializer = true:silent
+dotnet_style_operator_placement_when_wrapping = beginning_of_line
+dotnet_style_prefer_auto_properties = true:warning
+dotnet_style_prefer_compound_assignment = true:silent
+dotnet_style_prefer_conditional_expression_over_assignment = true:error
+dotnet_style_prefer_conditional_expression_over_return = true:error
+dotnet_style_prefer_inferred_anonymous_type_member_names = true:warning
+dotnet_style_prefer_inferred_tuple_names = true:warning
+dotnet_style_prefer_is_null_check_over_reference_equality_method = true:error
+dotnet_style_prefer_simplified_boolean_expressions = true
+dotnet_style_prefer_simplified_interpolation = true
+
+# Field preferences
+dotnet_style_readonly_field = true:warning
+
+# Parameter preferences
+dotnet_code_quality_unused_parameters = all
+
+# Suppression preferences
+dotnet_remove_unnecessary_suppression_exclusions = none
+
+# New line preferences
+dotnet_style_allow_multiple_blank_lines_experimental = false:warning
+dotnet_style_allow_statement_immediately_after_block_experimental = false:warning
+
+#### C# Coding Conventions ####
+
+# var preferences
+csharp_style_var_elsewhere = false
+csharp_style_var_for_built_in_types = false
+csharp_style_var_when_type_is_apparent = false
+
+# Expression-bodied members
+csharp_style_expression_bodied_accessors = true
+csharp_style_expression_bodied_constructors = false
+csharp_style_expression_bodied_indexers = true
+csharp_style_expression_bodied_lambdas = true
+csharp_style_expression_bodied_local_functions = false
+csharp_style_expression_bodied_methods = false
+csharp_style_expression_bodied_operators = false
+csharp_style_expression_bodied_properties = true
+
+# Pattern matching preferences
+csharp_style_pattern_matching_over_as_with_null_check = true:warning
+csharp_style_pattern_matching_over_is_with_cast_check = true:warning
+csharp_style_prefer_not_pattern = true:warning
+csharp_style_prefer_pattern_matching = true:suggestion
+csharp_style_prefer_switch_expression = true:silent
+
+# Null-checking preferences
+csharp_style_conditional_delegate_call = true
+
+# Modifier preferences
+csharp_prefer_static_local_function = true
+csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async
+
+# Code-block preferences
+csharp_prefer_braces = true:warning
+csharp_prefer_simple_using_statement = true:warning
+csharp_style_namespace_declarations = block_scoped:suggestion
+
+# Expression-level preferences
+csharp_prefer_simple_default_expression = true:warning
+csharp_style_deconstructed_variable_declaration = true:error
+csharp_style_implicit_object_creation_when_type_is_apparent = true:silent
+csharp_style_inlined_variable_declaration = true:warning
+csharp_style_pattern_local_over_anonymous_function = true:warning
+csharp_style_prefer_index_operator = true:warning
+csharp_style_prefer_null_check_over_type_check = true:error
+csharp_style_prefer_range_operator = true:warning
+csharp_style_throw_expression = true:silent
+csharp_style_unused_value_assignment_preference = discard_variable:silent
+csharp_style_unused_value_expression_statement_preference = discard_variable
+
+# 'using' directive preferences
+csharp_using_directive_placement = outside_namespace
+
+# New line preferences
+csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = false:warning
+csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true:warning
+csharp_style_allow_embedded_statements_on_same_line_experimental = false:warning
+
+#### C# Formatting Rules ####
+
+# New line preferences
+csharp_new_line_before_catch = true
+csharp_new_line_before_else = true
+csharp_new_line_before_finally = true
+csharp_new_line_before_members_in_anonymous_types = true
+csharp_new_line_before_members_in_object_initializers = true
+csharp_new_line_before_open_brace = all
+csharp_new_line_between_query_expression_clauses = true
+
+# Indentation preferences
+csharp_indent_block_contents = true
+csharp_indent_braces = false
+csharp_indent_case_contents = true
+csharp_indent_case_contents_when_block = true
+csharp_indent_labels = one_less_than_current
+csharp_indent_switch_labels = true
+
+# Space preferences
+csharp_space_after_cast = false
+csharp_space_after_colon_in_inheritance_clause = true
+csharp_space_after_comma = true
+csharp_space_after_dot = false
+csharp_space_after_keywords_in_control_flow_statements = true
+csharp_space_after_semicolon_in_for_statement = true
+csharp_space_around_binary_operators = before_and_after
+csharp_space_around_declaration_statements = false
+csharp_space_before_colon_in_inheritance_clause = true
+csharp_space_before_comma = false
+csharp_space_before_dot = false
+csharp_space_before_open_square_brackets = false
+csharp_space_before_semicolon_in_for_statement = false
+csharp_space_between_empty_square_brackets = false
+csharp_space_between_method_call_empty_parameter_list_parentheses = false
+csharp_space_between_method_call_name_and_opening_parenthesis = false
+csharp_space_between_method_call_parameter_list_parentheses = false
+csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
+csharp_space_between_method_declaration_name_and_open_parenthesis = false
+csharp_space_between_method_declaration_parameter_list_parentheses = false
+csharp_space_between_parentheses = false
+csharp_space_between_square_brackets = false
+
+# Wrapping preferences
+csharp_preserve_single_line_blocks = true
+csharp_preserve_single_line_statements = true
+
+#### Naming styles ####
+
+# Naming rules
+
+dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
+dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
+dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
+
+dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.types_should_be_pascal_case.symbols = types
+dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
+
+dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
+dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
+
+# Symbol specifications
+
+dotnet_naming_symbols.interface.applicable_kinds = interface
+dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.interface.required_modifiers = 
+
+dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
+dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.types.required_modifiers = 
+
+dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
+dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.non_field_members.required_modifiers = 
+
+# Naming styles
+
+dotnet_naming_style.pascal_case.required_prefix = 
+dotnet_naming_style.pascal_case.required_suffix = 
+dotnet_naming_style.pascal_case.word_separator = 
+dotnet_naming_style.pascal_case.capitalization = pascal_case
+
+dotnet_naming_style.begins_with_i.required_prefix = I
+dotnet_naming_style.begins_with_i.required_suffix = 
+dotnet_naming_style.begins_with_i.word_separator = 
+dotnet_naming_style.begins_with_i.capitalization = pascal_case
+
+# HAA0101: Array allocation for params parameter
+dotnet_diagnostic.HAA0101.severity = none
+
+# HLQ005: Avoid Single() and SingleOrDefault()
+dotnet_diagnostic.HLQ005.severity = none
+
+# CC0021: Use nameof
+dotnet_diagnostic.CC0021.severity = none
\ No newline at end of file
diff --git a/src/ByReplace.Test/Analyzers/AnalyzerAndFixerTest.cs b/src/ByReplace.Test/Analyzers/AnalyzerAndFixerTest.cs
new file mode 100644
index 0000000..27d78a6
--- /dev/null
+++ b/src/ByReplace.Test/Analyzers/AnalyzerAndFixerTest.cs
@@ -0,0 +1,95 @@
+ο»Ώusing ByReplace.Analyzers;
+using ByReplace.Builders;
+using ByReplace.Models;
+using ByReplace.Printers;
+using ByReplace.Test.Common.ConfigMock;
+using ByReplace.Test.Common.FolderMock;
+using Moq;
+using Xunit;
+
+namespace ByReplace.Test.Analyzers;
+
+public class AnalyzerAndFixerTest
+{
+    private readonly PathCompilationSyntax _pathCompilationSyntax;
+    private readonly BrConfiguration _brConfiguration;
+    private readonly Mock _printMock;
+
+    public AnalyzerAndFixerTest()
+    {
+        var configContent = BrContentFactory
+          .CreateDefault()
+          .AddConfig(BrContentFactory.ConfigNoPathDeclaration("obj", ".bin"))
+          .AddRules(BrContentFactory
+                   .Rule("RuleTest")
+                   .WithExtensions(".cs", ".txt")
+                   .WithSkips("**\\Controllers\\*", "bin\\bin1.txt", "obj\\obj2.txt")
+                   .WithReplacement(BrContentFactory.Replacement("Test", "Test2")))
+          .Compile();
+
+        var rootFolder = FolderSyntax
+            .FolderDeclaration("RootFolder")
+            .AddMembers(
+                FileSyntax.FileDeclaration("RootFile1.cs", "ITest = new Test()"),
+                FileSyntax.FileDeclaration("RootFile2.cs", "ITest = new Test()"));
+
+        _pathCompilationSyntax = PathFactory
+            .Compile(nameof(AnalyzerAndFixerTest))
+            .AddMembers(rootFolder)
+            .AddBrConfiguration(configContent)
+            .Create();
+
+        _brConfiguration = BrConfigurationBuilder
+            .Create()
+            .SetPath($"./{_pathCompilationSyntax.InternalIdentifier}")
+            .SetConfigPath($"./{_pathCompilationSyntax.InternalIdentifier}")
+            .Build();
+
+        _printMock = new Mock();
+    }
+
+    [Fact]
+    public void TryMatchRule_MapTheFilesThatMatchToRule_ShouldReturnFilesThatMatch()
+    {
+        // Arrange
+        var analyzer = new Analyzer(_brConfiguration, _printMock.Object);
+        var analyzerAndFixer = new AnalyzerAndFixer(_printMock.Object);
+
+        // Act
+        var directoryNode = analyzer.LoadThreeFiles().Last();
+        analyzerAndFixer.TryMatchRule(directoryNode, _brConfiguration.Rules);
+
+        // Assert
+        Assert.Equal(2, analyzerAndFixer.Count);
+
+        Assert.Collection(analyzerAndFixer,
+         entry =>
+         {
+             Assert.Equal("RootFile1.cs", entry.Key.Name);
+             Assert.Equal(".cs", entry.Key.Extension);
+             Assert.Collection(entry.Value, rule => Assert.Equal("RuleTest", rule.Name));
+         },
+         entry =>
+         {
+             Assert.Equal("RootFile2.cs", entry.Key.Name);
+             Assert.Equal(".cs", entry.Key.Extension);
+             Assert.Collection(entry.Value, rule => Assert.Equal("RuleTest", rule.Name));
+         });
+    }
+
+    [Fact]
+    public void TryMatchRule_WhenMapTheFilesThatMatchToRule_ShouldValidateLogWasCalled()
+    {
+        // Arrange
+        var analyzer = new Analyzer(_brConfiguration, _printMock.Object);
+        var analyzerAndFixer = new AnalyzerAndFixer(_printMock.Object);
+
+        // Act
+        var directoryNode = analyzer.LoadThreeFiles().Last();
+        analyzerAndFixer.TryMatchRule(directoryNode, _brConfiguration.Rules);
+
+        // Assert
+        _printMock.Verify(x => x.Information("[Cyan]1 rules in total match the file [Cyan]RootFile1.cs."), Times.Once);
+        _printMock.Verify(x => x.Information("[Cyan]1 rules in total match the file [Cyan]RootFile2.cs."), Times.Once);
+    }
+}
diff --git a/src/ByReplace.Test/Analyzers/AnalyzerRunnerTest.cs b/src/ByReplace.Test/Analyzers/AnalyzerRunnerTest.cs
new file mode 100644
index 0000000..55c70f3
--- /dev/null
+++ b/src/ByReplace.Test/Analyzers/AnalyzerRunnerTest.cs
@@ -0,0 +1,127 @@
+ο»Ώusing ByReplace.Analyzers;
+using ByReplace.Builders;
+using ByReplace.Models;
+using ByReplace.Printers;
+using ByReplace.Test.Common.ConfigMock;
+using ByReplace.Test.Common.FolderMock;
+using Moq;
+using Xunit;
+
+namespace ByReplace.Test.Analyzers;
+
+public class AnalyzerRunnerTest
+{
+    private readonly PathCompilationSyntax _pathCompilationSyntax;
+    private readonly BrConfiguration _brConfiguration;
+    private readonly Mock _printMock;
+
+    public AnalyzerRunnerTest()
+    {
+        var configContent = BrContentFactory
+           .CreateDefault()
+           .AddConfig(BrContentFactory.ConfigNoPathDeclaration("obj", ".bin"))
+           .AddRules(BrContentFactory
+                    .Rule("RuleTest")
+                    .WithExtensions(".cs", ".txt")
+                    .WithSkips("**\\Controllers\\*", "bin\\bin1.txt", "obj\\obj2.txt")
+                    .WithReplacement(BrContentFactory.Replacement("Test", "Test2")))
+           .Compile();
+
+        var rootFolder = FolderSyntax
+            .FolderDeclaration("RootFolder")
+            .AddMembers(
+                FileSyntax.FileDeclaration("RootFile1.cs", "ITest = new Test()"),
+                FileSyntax.FileDeclaration("RootFile2.cs", "ITest = new Test()"));
+
+        var controllerFolder = FolderSyntax.FolderDeclaration("Controllers")
+            .AddParent(rootFolder)
+            .AddMembers(
+               FileSyntax.FileDeclaration("Controller1.cs", "ITest2 = new Test()"),
+               FileSyntax.FileDeclaration("Controller2.cs", "ITest2 = new Test()"));
+
+        var binFolder = FolderSyntax.FolderDeclaration("bin")
+            .AddParent(rootFolder)
+            .AddMembers(
+                FileSyntax.FileDeclaration("bin1.txt", "ITest = new Test()"),
+                FileSyntax.FileDeclaration("bin2.txt", "ITest = new Test()"));
+
+        var objFolder = FolderSyntax.FolderDeclaration("obj")
+            .AddParent(rootFolder)
+            .AddMembers(
+                FileSyntax.FileDeclaration("obj1.txt", "ITest = new Test()"),
+                FileSyntax.FileDeclaration("obj2.txt", "ITest = new Test()"));
+
+        _pathCompilationSyntax = PathFactory
+            .Compile(nameof(AnalyzerRunnerTest))
+            .AddMembers(controllerFolder, binFolder, objFolder)
+            .AddBrConfiguration(configContent)
+            .Create();
+
+        _brConfiguration = BrConfigurationBuilder
+            .Create()
+            .SetPath($"./{_pathCompilationSyntax.InternalIdentifier}")
+            .SetConfigPath($"./{_pathCompilationSyntax.InternalIdentifier}")
+            .Build();
+
+        _printMock = new Mock();
+    }
+
+    [Fact]
+    public void RunAnalysis_MapAllRulesThatMatchToFileInSourceTree_ShouldReturnRulesThatMatch()
+    {
+        // Arrange
+        var analyzer = new Analyzer(_brConfiguration, _printMock.Object);
+        var analyzerRunner = new AnalyzerRunner(_brConfiguration, _printMock.Object);
+
+        // Act
+        var directoryNodes = analyzer.LoadThreeFiles();
+        var analyzersAndFixers = analyzerRunner.RunAnalysis(directoryNodes, Analyses.Fix);
+
+        // Assert
+        var files = analyzersAndFixers.Keys.ToList();
+        var rules = analyzersAndFixers.Values.ToList();
+
+        Assert.Equal(4, analyzersAndFixers.Count);
+
+        Assert.Collection(analyzersAndFixers,
+        entry =>
+        {
+            Assert.Equal("RootFile1.cs", entry.Key.Name);
+            Assert.Equal(".cs", entry.Key.Extension);
+            Assert.Collection(entry.Value, rule => Assert.Equal("RuleTest", rule.Name));
+        },
+        entry =>
+        {
+            Assert.Equal("RootFile2.cs", entry.Key.Name);
+            Assert.Equal(".cs", entry.Key.Extension);
+            Assert.Collection(entry.Value, rule => Assert.Equal("RuleTest", rule.Name));
+        },
+        entry =>
+        {
+            Assert.Equal("bin2.txt", entry.Key.Name);
+            Assert.Equal(".txt", entry.Key.Extension);
+            Assert.Collection(entry.Value, rule => Assert.Equal("RuleTest", rule.Name));
+        },
+        entry =>
+        {
+            Assert.Equal("obj1.txt", entry.Key.Name);
+            Assert.Equal(".txt", entry.Key.Extension);
+            Assert.Collection(entry.Value, rule => Assert.Equal("RuleTest", rule.Name));
+        });
+    }
+
+    [Fact]
+    public void RunAnalysis_WhenPrintLogInformation_ShouldValidateLogWasCalled()
+    {
+        // Arrange
+        var analyzer = new Analyzer(_brConfiguration, _printMock.Object);
+        var analyzerRunner = new AnalyzerRunner(_brConfiguration, _printMock.Object);
+
+        // Act
+        var directoryNodes = analyzer.LoadThreeFiles();
+        analyzerRunner.RunAnalysis(directoryNodes, Analyses.Fix);
+
+        // Assert
+        _printMock.Verify(x => x.Information("Identifying rules that has matches."), Times.Once);
+    }
+}
diff --git a/src/ByReplace.Test/Analyzers/AnalyzerTest.cs b/src/ByReplace.Test/Analyzers/AnalyzerTest.cs
new file mode 100644
index 0000000..e20d2a9
--- /dev/null
+++ b/src/ByReplace.Test/Analyzers/AnalyzerTest.cs
@@ -0,0 +1,70 @@
+ο»Ώusing ByReplace.Analyzers;
+using ByReplace.Builders;
+using ByReplace.Models;
+using ByReplace.Printers;
+using ByReplace.Test.Common.FolderMock;
+using Moq;
+using Xunit;
+
+namespace ByReplace.Test.Analyzers;
+
+public class AnalyzerTest
+{
+    private readonly PathCompilationSyntax _pathCompilationSyntax;
+    private readonly BrConfiguration _brConfiguration;
+    private readonly Mock _printMock;
+
+    public AnalyzerTest()
+    {
+        var rootFolder = FolderSyntax
+           .FolderDeclaration("RootFolder")
+           .AddMembers(FileSyntax.FileDeclaration("FileOne.cs", "ITest = new Test()"));
+
+        var firstLevel = FolderSyntax.FolderDeclaration("FirstLevel")
+           .AddParent(rootFolder)
+           .AddMembers(FileSyntax.FileDeclaration("FileSecond.cs", "ITest2 = new Test()"));
+
+        _pathCompilationSyntax = PathFactory
+           .Compile(nameof(AnalyzerTest))
+           .AddMembers(firstLevel)
+           .Create();
+
+        _brConfiguration = BrConfigurationBuilder
+           .Create()
+           .SetPath($"./{_pathCompilationSyntax.InternalIdentifier}")
+           .SetConfigPath($"./{_pathCompilationSyntax.InternalIdentifier}")
+           .Build();
+
+        _printMock = new Mock();
+    }
+
+    [Fact]
+    public void LoadThreeFiles_MapAllSourceThreeOfDirectory_ShouldReturnSourceFileThree()
+    {
+        // Arrange
+        var analyzer = new Analyzer(_brConfiguration, _printMock.Object);
+
+        // Act
+        var directoryNodes = analyzer.LoadThreeFiles();
+
+        // Assert
+        Assert.Equal(3, directoryNodes.Count);
+        Assert.Collection(directoryNodes,
+              node => Assert.Single(node.Files),
+              node => Assert.Single(node.Files),
+              node => Assert.Single(node.Files));
+    }
+
+    [Fact]
+    public void LoadThreeFiles_WhenPrintLogInformation_ShouldValidateLogWasCalled()
+    {
+        // Arrange
+        var analyzer = new Analyzer(_brConfiguration, _printMock.Object);
+
+        // Act
+        var directoryNodes = analyzer.LoadThreeFiles();
+
+        // Assert
+        _printMock.Verify(x => x.Information("Identifying folder three files."), Times.Once);
+    }
+}
diff --git a/src/ByReplace.Test/Analyzers/DocumentFixTest.cs b/src/ByReplace.Test/Analyzers/DocumentFixTest.cs
new file mode 100644
index 0000000..e279868
--- /dev/null
+++ b/src/ByReplace.Test/Analyzers/DocumentFixTest.cs
@@ -0,0 +1,109 @@
+ο»Ώusing ByReplace.Analyzers;
+using ByReplace.Builders;
+using ByReplace.Models;
+using ByReplace.Printers;
+using ByReplace.Test.Common.ConfigMock;
+using ByReplace.Test.Common.FolderMock;
+using Moq;
+using Xunit;
+
+namespace ByReplace.Test.Analyzers;
+
+public class DocumentFixTest
+{
+    private readonly PathCompilationSyntax _pathCompilationSyntax;
+    private readonly BrConfiguration _brConfiguration;
+    private readonly Mock _printMock;
+
+    public DocumentFixTest()
+    {
+        var configContent = BrContentFactory
+          .CreateDefault()
+          .AddConfig(BrContentFactory.ConfigNoPathDeclaration("obj", ".bin"))
+          .AddRules(BrContentFactory
+                   .Rule("RuleTest")
+                   .WithExtensions(".cs")
+                   .WithSkips("teste.cs")
+                   .WithReplacement(BrContentFactory.Replacement("Test", "Test2")),
+                   BrContentFactory
+                   .Rule("RuleTest2")
+                   .WithExtensions(".txt")
+                   .WithSkips("teste.txt")
+                   .WithReplacement(BrContentFactory.Replacement("Test", "Test2")))
+          .Compile();
+
+        var rootFolder = FolderSyntax
+            .FolderDeclaration("RootFolder")
+            .AddMembers(
+            FileSyntax.FileDeclaration("RootFile1.cs", "var test = new Test2()"),
+            FileSyntax.FileDeclaration("RootFile1.txt", "var test = new Test2()"));
+
+        _pathCompilationSyntax = PathFactory
+            .Compile(nameof(DocumentFixTest))
+            .AddMembers(rootFolder)
+            .AddBrConfiguration(configContent)
+        .Create();
+
+        _brConfiguration = BrConfigurationBuilder
+        .Create()
+            .SetPath($"./{_pathCompilationSyntax.InternalIdentifier}")
+            .SetConfigPath($"./{_pathCompilationSyntax.InternalIdentifier}")
+            .Build();
+
+        _printMock = new Mock();
+    }
+
+    [Fact]
+    public async Task ApplyAsync_WhenPassAllRules_ShouldApplyTheRulesInAllFilesAsync()
+    {
+        // Arrange
+        var analyzer = new Analyzer(_brConfiguration, _printMock.Object);
+        var analyzerAndFixer = new AnalyzerAndFixer(_printMock.Object);
+        var directoryNode = analyzer.LoadThreeFiles().Last();
+        analyzerAndFixer.TryMatchRule(directoryNode, _brConfiguration.Rules);
+        var documentFix = new DocumentFix(analyzerAndFixer, _printMock.Object);
+
+        // Act
+        await documentFix.ApplyAsync(It.IsAny());
+
+        // Assert
+        var fileFixedPath = directoryNode.Files[0].FullName;
+        var fileContents = await File.ReadAllTextAsync(fileFixedPath, It.IsAny());
+
+        Assert.Contains("var test = new Test()", fileContents);
+        _printMock.Verify(x => x.Information("Initializing fixing."), Times.Once);
+        _printMock.Verify(x => x.Information("Processing file [Cyan]RootFile1.cs"), Times.Once);
+        _printMock.Verify(x => x.Information("Applying rule [Cyan]RuleTest 1/1 on file [Cyan]RootFile1.cs."), Times.Once);
+    }
+
+    [Fact]
+    public async Task ApplyAsync_WhenPassOnlyOneRule_ShouldApplyTheRuleInAllFiles()
+    {
+        // Arrange
+        var analyzer = new Analyzer(_brConfiguration, _printMock.Object);
+        var analyzerAndFixer = new AnalyzerAndFixer(_printMock.Object);
+        var directoryNode = analyzer.LoadThreeFiles().Last();
+        analyzerAndFixer.TryMatchRule(directoryNode, _brConfiguration.Rules);
+        var documentFix = new DocumentFix(analyzerAndFixer, _printMock.Object);
+
+        // Act
+        await documentFix.ApplyAsync("RuleTest", It.IsAny());
+
+        // Assert
+
+        // File with .cs extension
+        var fileCsFixedPath = directoryNode.Files[0].FullName;
+        var fileCsContents = await File.ReadAllTextAsync(fileCsFixedPath, It.IsAny());
+
+        // File with .txt extension
+        var fileTextFixedPath = directoryNode.Files.Last().FullName;
+        var fileTextContents = await File.ReadAllTextAsync(fileTextFixedPath, It.IsAny());
+
+        Assert.Contains("var test = new Test()", fileCsContents);
+        Assert.Contains("var test = new Test2()", fileTextContents);
+
+        _printMock.Verify(x => x.Information("Initializing fixing."), Times.Once);
+        _printMock.Verify(x => x.Information("Processing file [Cyan]RootFile1.cs"), Times.Once);
+        _printMock.Verify(x => x.Information("Applying rule [Cyan]RuleTest 1/1 on file [Cyan]RootFile1.cs."), Times.Once);
+    }
+}
diff --git a/src/ByReplace.Test/Builders/BrConfigurationBuilderTest.cs b/src/ByReplace.Test/Builders/BrConfigurationBuilderTest.cs
new file mode 100644
index 0000000..4521165
--- /dev/null
+++ b/src/ByReplace.Test/Builders/BrConfigurationBuilderTest.cs
@@ -0,0 +1,67 @@
+ο»Ώusing ByReplace.Builders;
+using ByReplace.Test.Common.ConfigMock;
+using ByReplace.Test.Common.FolderMock;
+using Xunit;
+
+namespace ByReplace.Test.Builders;
+
+public class BrConfigurationBuilderTest
+{
+    private readonly PathCompilationSyntax _pathCompilationSyntax;
+
+    public BrConfigurationBuilderTest()
+    {
+        var rootFolder = FolderSyntax.FolderDeclaration("RootFolder");
+
+        var configContent = BrContentFactory
+         .CreateDefault()
+         .AddConfig(BrContentFactory.ConfigNoPathDeclaration("obj", ".bin"))
+         .AddRules(BrContentFactory
+                  .Rule("RuleTest")
+                  .WithExtensions(".cs")
+                  .WithSkips("**\\Controllers\\*")
+                  .WithReplacement(BrContentFactory.Replacement("Test", "Test2")))
+         .Compile();
+
+        _pathCompilationSyntax = PathFactory
+          .Compile(nameof(BrConfigurationBuilderTest))
+          .AddMember(rootFolder)
+          .AddBrConfiguration(configContent)
+          .Create();
+    }
+
+    [Fact]
+    public void Build_ReturnsCorrectConfiguration()
+    {
+        // Arrange
+        var configFile = $"./{_pathCompilationSyntax.InternalIdentifier}";
+        var path = $"./{_pathCompilationSyntax.InternalIdentifier}";
+        const string rule = "RuleTest";
+
+        var builder = BrConfigurationBuilder
+            .Create()
+            .SetConfigPath(configFile + " ")
+            .SetPath(path + " ")
+            .SetRule(rule + " ");
+
+        // Act
+        var brConfiguration = builder.Build();
+
+        // Assert
+        Assert.Equal(configFile, brConfiguration.Path);
+        Assert.Collection(brConfiguration.SkipDirectories,
+        entry => Assert.Equal("obj", entry),
+        entry => Assert.Equal(".bin", entry));
+        Assert.Collection(brConfiguration.Rules,
+        entry =>
+        {
+            Assert.Equal("RuleTest", entry.Name);
+            Assert.Null(entry.Description);
+            Assert.Collection(entry.Skip, entrySkip => Assert.Equal("**\\Controllers\\*", entrySkip));
+            Assert.Collection(entry.Extensions, entrySkip => Assert.Equal(".cs", entrySkip));
+            Assert.Equal("Test", entry.Replacement.New);
+            Assert.Single(entry.Replacement.Old);
+            Assert.Collection(entry.Replacement.Old, entry => Assert.Equal("Test2", entry));
+        });
+    }
+}
diff --git a/src/ByReplace.Test/ByReplace.Test.csproj b/src/ByReplace.Test/ByReplace.Test.csproj
new file mode 100644
index 0000000..8a62a07
--- /dev/null
+++ b/src/ByReplace.Test/ByReplace.Test.csproj
@@ -0,0 +1,47 @@
+ο»Ώ
+
+  
+    net8.0
+    enable
+    enable
+    false
+    Linux
+    .
+  
+
+  
+    
+      all
+      runtime; build; native; contentfiles; analyzers; buildtransitive
+    
+    
+    
+    
+    
+    
+    
+      runtime; build; native; contentfiles; analyzers; buildtransitive
+      all
+    
+    
+      runtime; build; native; contentfiles; analyzers; buildtransitive
+      all
+    
+  
+
+  
+    
+    
+  
+
+  
+    
+  
+
+  
+    
+      Always
+    
+  
+
+
diff --git a/src/ByReplace.Test/Commands/Apply/Parameters/ApplyParameterTest.cs b/src/ByReplace.Test/Commands/Apply/Parameters/ApplyParameterTest.cs
new file mode 100644
index 0000000..ff9eea9
--- /dev/null
+++ b/src/ByReplace.Test/Commands/Apply/Parameters/ApplyParameterTest.cs
@@ -0,0 +1,64 @@
+ο»Ώusing ByReplace.Commands.Apply.Parameters;
+using ByReplace.Test.Common.Helpers;
+using Cocona;
+using Xunit;
+
+namespace ByReplace.Test.Commands.Apply.Parameters;
+
+public class ApplyParameterTest
+{
+    [Fact]
+    public void ApplyParameter_ShouldValidateTheInterfacesImplementation()
+    {
+        // Arrange & Act
+        var metadata = FileInspect.GetInterfaces();
+
+        // Assert
+        Assert.Equal(2, metadata.Length);
+        Assert.Equal(typeof(ICommandParameterSet), metadata[0]);
+        Assert.Equal(typeof(IEquatable), metadata[1]);
+    }
+
+    [Fact]
+    public void ApplyParameter_ShouldValidateThePropertiesConfiguration()
+    {
+        // Arrange & Act
+        var metadata = FileInspect.GetProperties();
+
+        // Assert
+        Assert.Equal(2, metadata.Length);
+        Assert.Collection(metadata,
+        entry =>
+        {
+            var attributes = entry.GetCustomAttributes(false);
+
+            Assert.Equal(typeof(string), entry.Name.GetType());
+            Assert.Equal("Path", entry.Name);
+            Assert.Single(attributes);
+            var attribute = Assert.Single(attributes);
+            var option = (OptionAttribute)attribute;
+
+            Assert.Equal(typeof(OptionAttribute), attribute.GetType());
+            Assert.Null(option.Name);
+            Assert.Equal("Path of the files to be applied to the rule.", option.Description);
+            Assert.Collection(option.ShortNames,
+            entry => Assert.Equal('p', entry));
+        },
+        entry =>
+        {
+            var attributes = entry.GetCustomAttributes(false);
+
+            Assert.Equal(typeof(string), entry.Name.GetType());
+            Assert.Equal("ConfigFile", entry.Name);
+            Assert.Single(attributes);
+            var attribute = Assert.Single(attributes);
+            var option = (OptionAttribute)attribute;
+
+            Assert.Equal(typeof(OptionAttribute), attribute.GetType());
+            Assert.Null(option.Name);
+            Assert.Equal("Path of the brconfig file.", option.Description);
+            Assert.Collection(option.ShortNames,
+            entry => Assert.Equal('f', entry));
+        });
+    }
+}
diff --git a/src/ByReplace.Test/Commands/Apply/Rule/ApplyRuleCommandTest.cs b/src/ByReplace.Test/Commands/Apply/Rule/ApplyRuleCommandTest.cs
new file mode 100644
index 0000000..374af07
--- /dev/null
+++ b/src/ByReplace.Test/Commands/Apply/Rule/ApplyRuleCommandTest.cs
@@ -0,0 +1,68 @@
+ο»Ώusing ByReplace.Builders;
+using ByReplace.Commands.Apply.Rule;
+using ByReplace.Models;
+using ByReplace.Printers;
+using ByReplace.Test.Common.ConfigMock;
+using ByReplace.Test.Common.FolderMock;
+using Moq;
+using Xunit;
+
+namespace ByReplace.Test.Commands.Apply.Rule;
+
+public class ApplyRuleCommandTest
+{
+    private readonly PathCompilationSyntax _pathCompilationSyntax;
+    private readonly BrConfiguration _brConfiguration;
+    private readonly Mock _printMock;
+
+    public ApplyRuleCommandTest()
+    {
+        _printMock = new Mock();
+
+        var configContent = BrContentFactory
+          .CreateDefault()
+          .AddConfig(BrContentFactory.ConfigNoPathDeclaration("obj", ".bin"))
+          .AddRules(BrContentFactory
+                   .Rule("RuleTest")
+                   .WithExtensions(".cs", ".txt")
+                   .WithSkips("**\\Controllers\\*", "bin\\bin1.txt", "obj\\obj2.txt")
+                   .WithReplacement(BrContentFactory.Replacement("Test", "Test2")))
+          .Compile();
+
+        var rootFolder = FolderSyntax
+            .FolderDeclaration("RootFolder")
+            .AddMembers(
+                FileSyntax.FileDeclaration("RootFile1.cs", "ITest = new Test()"),
+                FileSyntax.FileDeclaration("RootFile2.cs", "ITest = new Test()"));
+
+        _pathCompilationSyntax = PathFactory
+            .Compile(nameof(ApplyRuleCommandTest))
+            .AddMembers(rootFolder)
+            .AddBrConfiguration(configContent)
+            .Create();
+
+        _brConfiguration = BrConfigurationBuilder
+            .Create()
+            .SetPath($"./{_pathCompilationSyntax.InternalIdentifier}")
+            .SetConfigPath($"./{_pathCompilationSyntax.InternalIdentifier}")
+            .Build();
+    }
+
+    [Fact]
+    public void Execute_ApplyIndividualRuleToFileThree_DoesNotThrowException()
+    {
+        // Arrange
+        var applyRuleParameter = new ApplyRuleParameter
+        {
+            Rule = "RuleTest"
+        };
+
+        var command = new ApplyRuleCommand(_brConfiguration, applyRuleParameter, _printMock.Object);
+
+        // Act
+        var executionResult = Record.Exception(() => command.ExecuteAsync());
+
+        // Assert
+        Assert.Null(executionResult);
+    }
+}
diff --git a/src/ByReplace.Test/Commands/Apply/Rule/ApplyRuleParameterTest.cs b/src/ByReplace.Test/Commands/Apply/Rule/ApplyRuleParameterTest.cs
new file mode 100644
index 0000000..20d1be3
--- /dev/null
+++ b/src/ByReplace.Test/Commands/Apply/Rule/ApplyRuleParameterTest.cs
@@ -0,0 +1,80 @@
+ο»Ώusing ByReplace.Commands.Apply.Parameters;
+using ByReplace.Commands.Apply.Rule;
+using ByReplace.Test.Common.Helpers;
+using Cocona;
+using Xunit;
+
+namespace ByReplace.Test.Commands.Apply.Rule;
+
+public class ApplyRuleParameterTest
+{
+    [Fact]
+    public void ApplyRuleParameter_ShouldValidateTheApplyRuleParameterHasInheritancesFromApplyParameter()
+    {
+        // Arrange & Act
+        var metadata = FileInspect.GetBaseType();
+
+        // Assert
+        Assert.NotNull(metadata);
+        Assert.Equal(typeof(ApplyParameter), metadata);
+    }
+
+    [Fact]
+    public void ApplyRuleParameter_ShouldValidateThePropertiesConfiguration()
+    {
+        // Arrange & Act
+        var metadata = FileInspect.GetProperties();
+
+        // Assert
+        Assert.Equal(3, metadata.Length);
+        Assert.Collection(metadata,
+        entry =>
+        {
+            var attributes = entry.GetCustomAttributes(false);
+
+            Assert.Equal(typeof(string), entry.Name.GetType());
+            Assert.Equal("Rule", entry.Name);
+            Assert.Single(attributes);
+            var attribute = Assert.Single(attributes);
+            var option = (OptionAttribute)attribute;
+
+            Assert.Equal(typeof(OptionAttribute), attribute.GetType());
+            Assert.Null(option.Name);
+            Assert.Equal("Rule name to be applied.", option.Description);
+            Assert.Collection(option.ShortNames,
+            entry => Assert.Equal('r', entry));
+        },
+        entry =>
+        {
+            var attributes = entry.GetCustomAttributes(false);
+
+            Assert.Equal(typeof(string), entry.Name.GetType());
+            Assert.Equal("Path", entry.Name);
+            Assert.Single(attributes);
+            var attribute = Assert.Single(attributes);
+            var option = (OptionAttribute)attribute;
+
+            Assert.Equal(typeof(OptionAttribute), attribute.GetType());
+            Assert.Null(option.Name);
+            Assert.Equal("Path of the files to be applied to the rule.", option.Description);
+            Assert.Collection(option.ShortNames,
+            entry => Assert.Equal('p', entry));
+        },
+        entry =>
+        {
+            var attributes = entry.GetCustomAttributes(false);
+
+            Assert.Equal(typeof(string), entry.Name.GetType());
+            Assert.Equal("ConfigFile", entry.Name);
+            Assert.Single(attributes);
+            var attribute = Assert.Single(attributes);
+            var option = (OptionAttribute)attribute;
+
+            Assert.Equal(typeof(OptionAttribute), attribute.GetType());
+            Assert.Null(option.Name);
+            Assert.Equal("Path of the brconfig file.", option.Description);
+            Assert.Collection(option.ShortNames,
+            entry => Assert.Equal('f', entry));
+        });
+    }
+}
diff --git a/src/ByReplace.Test/Commands/Apply/Rules/ApplyRulesCommandTest.cs b/src/ByReplace.Test/Commands/Apply/Rules/ApplyRulesCommandTest.cs
new file mode 100644
index 0000000..bd77f01
--- /dev/null
+++ b/src/ByReplace.Test/Commands/Apply/Rules/ApplyRulesCommandTest.cs
@@ -0,0 +1,62 @@
+ο»Ώusing ByReplace.Builders;
+using ByReplace.Commands.Apply.Rules;
+using ByReplace.Models;
+using ByReplace.Printers;
+using ByReplace.Test.Common.ConfigMock;
+using ByReplace.Test.Common.FolderMock;
+using Moq;
+using Xunit;
+
+namespace ByReplace.Test.Commands.Apply.Rules;
+
+public class ApplyRulesCommandTEst
+{
+    private readonly PathCompilationSyntax _pathCompilationSyntax;
+    private readonly BrConfiguration _brConfiguration;
+    private readonly Mock _printMock;
+
+    public ApplyRulesCommandTEst()
+    {
+        _printMock = new Mock();
+
+        var configContent = BrContentFactory
+          .CreateDefault()
+          .AddConfig(BrContentFactory.ConfigNoPathDeclaration("obj", ".bin"))
+          .AddRules(BrContentFactory
+                   .Rule("RuleTest")
+                   .WithExtensions(".cs", ".txt")
+                   .WithSkips("**\\Controllers\\*", "bin\\bin1.txt", "obj\\obj2.txt")
+                   .WithReplacement(BrContentFactory.Replacement("Test", "Test2")))
+          .Compile();
+
+        var rootFolder = FolderSyntax
+            .FolderDeclaration("RootFolder")
+        .AddMembers(
+                FileSyntax.FileDeclaration("RootFile1.cs", "ITest = new Test()"),
+                FileSyntax.FileDeclaration("RootFile2.cs", "ITest = new Test()"));
+        _pathCompilationSyntax = PathFactory
+            .Compile(nameof(ApplyRulesCommandTEst))
+        .AddMembers(rootFolder)
+            .AddBrConfiguration(configContent)
+        .Create();
+
+        _brConfiguration = BrConfigurationBuilder
+            .Create()
+            .SetPath($"./{_pathCompilationSyntax.InternalIdentifier}")
+            .SetConfigPath($"./{_pathCompilationSyntax.InternalIdentifier}")
+            .Build();
+    }
+
+    [Fact]
+    public void Execute_ApplyRulesToFileThree_DoesNotThrowException()
+    {
+        // Arrange
+        var command = new ApplyRulesCommand(_brConfiguration, _printMock.Object);
+
+        // Act
+        var executionResult = Record.Exception(() => command.ExecuteAsync(It.IsAny()));
+
+        // Assert
+        Assert.Null(executionResult);
+    }
+}
diff --git a/src/ByReplace.Test/Commands/Command/CompositeCommandTest.cs b/src/ByReplace.Test/Commands/Command/CompositeCommandTest.cs
new file mode 100644
index 0000000..a6f5240
--- /dev/null
+++ b/src/ByReplace.Test/Commands/Command/CompositeCommandTest.cs
@@ -0,0 +1,39 @@
+ο»Ώusing ByReplace.Commands.Command;
+using Moq;
+using Xunit;
+
+namespace ByReplace.Test.Commands.Command;
+
+public class CompositeCommandTest
+{
+    private readonly Mock _firstCommand;
+    private readonly Mock _secondCommand;
+
+    public CompositeCommandTest()
+    {
+        _firstCommand = new Mock();
+        _secondCommand = new Mock();
+    }
+
+    [Fact]
+    public async Task Execute_ExecuteCompositeCommands_ShouldValidateHowManyTimeCommandsIsExecuted()
+    {
+        // Arrange
+        _firstCommand
+            .Setup(x => x.ExecuteAsync(It.IsAny()))
+            .Returns(ValueTask.CompletedTask);
+
+        _secondCommand
+            .Setup(x => x.ExecuteAsync(It.IsAny()))
+            .Returns(ValueTask.CompletedTask);
+
+        var command = new CompositeCommand(_firstCommand.Object, _secondCommand.Object);
+
+        // Act
+        await command.ExecuteAsync();
+
+        // Assert
+        _firstCommand.Verify(c => c.ExecuteAsync(It.IsAny()), Times.Once);
+        _secondCommand.Verify(c => c.ExecuteAsync(It.IsAny()), Times.Once);
+    }
+}
diff --git a/src/ByReplace.Test/Commands/Logo/PrintLogoCommandTest.cs b/src/ByReplace.Test/Commands/Logo/PrintLogoCommandTest.cs
new file mode 100644
index 0000000..97015aa
--- /dev/null
+++ b/src/ByReplace.Test/Commands/Logo/PrintLogoCommandTest.cs
@@ -0,0 +1,55 @@
+ο»Ώusing ByReplace.Commands.Logo;
+using ByReplace.Printers;
+using Moq;
+using Xunit;
+
+namespace ByReplace.Test.Commands.Logo;
+
+public class PrintLogoCommandTest
+{
+    private readonly Mock _print;
+
+    public PrintLogoCommandTest()
+    {
+        _print = new Mock();
+    }
+
+    [Fact]
+    public async Task Execute_WhenPrintByReplaceLogoInTerminal_ShouldValidateTheAsciiLogoWasPrintedOnce()
+    {
+        // Arrange
+        const string expectedText = @"
+
+                ,ΒΏqβ–„β–„β–Œβ–ˆβ–ˆβ–“β–“β–“β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œβ–„,              ,,,,,ΒΏqβ–„β–„β–„β–„β–Œβ–Œβ–Œβ–Œβ–Œβ–Œβ–Œβ–Œβ–„β–„Β΅
+          ΒΏβ–„β–Œβ–ˆβ–“β–“β–“β–“β–“β–“β–ˆβ–ˆβ–ˆβ–ˆβ–’β–€β–€β–€β–€β–€β–€β–ˆβ–ˆβ–“β–“β–“β–ˆβ–ŒΒ΅          β•’β–ˆβ–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–ˆβ–’β–’β–’β–ˆβ–ˆβ–“β–“β–“β–“β–“β–ˆβ–„
+       ΒΏβ–Œβ–“β–“β–“β–“β–“β–“β–“β–“β–€β–€β•™             Β²β–“β–“β–“β–“β–ˆ           β–€β–“β–“β–“β–“β–“β•œ             `β–€β–“β–“β–“β–“β–“Β΅
+       Γ‘β–’β–’β–ˆβ–“β–“β–“β–“β–“M                 β–ˆβ–“β–“β–“β–“M          ]β–“β–“β–“β–“                  Γ‘β–“β–“β–“β–“Β΅
+           β–ˆβ–ˆβ–“β–“β–Œ                 β–„β–“β–“β–“β–“β–€           β–ˆβ–“β–“β–“β–Œ                   β–“β–“β–“β–“&
+           β–ˆβ–ˆβ–“β–“&               ΒΏβ–ˆβ–“β–“β–“β–ˆ`           ]β–“β–“β–“β–“                   ]β–“β–“β–“β–“`
+          ]β–ˆβ–ˆβ–“β–“              β–„β–ˆβ–“β–“β–“β–’β•œ             Γ‘β–“β–“β–“β–Œ                  β–„β–ˆβ–“β–“β–“M
+          β–β–“β–“β–“β–Œ          ,qβ–Œβ–“β–“β–“β–“β–€`               β–“β–“β–“β–“M               ,β–„β–“β–“β–“β–“β–€
+          β–ˆβ–“β–“β–ˆM     ,ΒΏβ–„β–Œβ–ˆβ–ˆβ–ˆβ–“β–“β–“β–“β–ˆβ–„Β΅              ▐▓▓▓▓            ,ΒΏβ–„β–“β–“β–“β–“β–“β–€
+         ]β–ˆβ–“β–“β–ˆ    ]β–ˆβ–“β–“β–“β–“β–“β–ˆβ–’β–€β–’β–ˆβ–ˆβ–’β–“β–“β–’β–Œw           β–ˆβ–“β–“β–“β–Œ   Γ§β–„β–„β–„β–„Γ¦g#β–ˆβ–ˆβ–ˆβ–’β–“β–’β–€`
+         β–β–ˆβ–“β–“β–’     β•™β•¨β•¨β•œ`       `β–€β–’β–“β–“β–“β–ˆΒ΅         β–’β–“β–“β–“M  Γ‘β–“β–“β–“β–“β–“β–ˆβ–ˆβ–ˆβ–ˆβ–€β•œ`
+         β–ˆβ–ˆβ–ˆβ–ˆ&                    β–ˆβ–ˆβ–ˆβ–ˆβ–ˆ        ]β–ˆβ–’β–’β–ˆ    `β•™β•™β–€β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„
+        ]β–ˆβ–ˆβ–ˆβ–ˆ                     β–β–ˆβ–ˆβ–ˆβ–ˆΞ©       Γ‘β–’β–’β–’β–Œ         `β–€β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ŒΒ΅
+        β–β–ˆβ–ˆβ–ˆβ–Œ                     β–ˆβ–ˆβ–ˆβ–ˆβ–Œ        Γ‘β–Œβ–Œβ–Œβ–Œ            β•™β–€β–’β–’Γ…Γ‘β–Œβ–„Β΅
+        Γ‘β–’β–ˆβ–ˆβ–€                   ΒΏΓ‘β–ˆβ–ˆβ–’β–€         β–Œβ–€β–€Γ‘&               β•¨β–€β–€Γ‘β–€β–Œβ–Œβ–„Β΅
+       ]β–ŒΓ‘Γ‘Γ‘[                ,qβ–Œβ–„β–β–’β–’β•œ         ]β–Œβ–€β–€β–€&                 `╝ÑΓ₯β–€Γ‘β–ˆβ–’β–„Β΅
+       Γ‘β–Œβ–Œβ–Œβ–Œ[             ΒΏqβ–€β–Œβ–Œβ–Œβ–Œβ–Œβ”˜           ]β–€Γ‘β–€β–€&                    β•™β–€β–€β–€β–€β–Œβ–Œβ–Œ&Β΅
+       Γ‘β–‘β–€β–€β–€M   β•“β–„β–„#β•—Γ¦#β–€β–Œβ–’β–’β–€Γ‘β–€β–€β•¨               β–€Γ₯Γ₯Γ₯β–€                       β•™β–€β–€β–€β–€β–€β–Œ
+        ╨▀▀╨   β–€Γ‰β–‘β–€β–’@β–‘β–‘β–‘β–‘β–€β–Œβ–€β•™                  └▀▀╝`                          `β•™`
+
+";
+
+        _print.Setup(c => c.PureText(expectedText));
+
+        var command = new PrintLogoCommand(_print.Object);
+
+        // Act
+        await command.ExecuteAsync(It.IsAny());
+
+        // Assert
+        _print.Verify(c => c.PureText(expectedText), Times.Once);
+    }
+}
diff --git a/src/ByReplace.Test/Commands/Rule/ListRules/ListRulesCommandTest.cs b/src/ByReplace.Test/Commands/Rule/ListRules/ListRulesCommandTest.cs
new file mode 100644
index 0000000..3e51f1d
--- /dev/null
+++ b/src/ByReplace.Test/Commands/Rule/ListRules/ListRulesCommandTest.cs
@@ -0,0 +1,65 @@
+ο»Ώusing ByReplace.Builders;
+using ByReplace.Commands.Rule.ListRules;
+using ByReplace.Models;
+using ByReplace.Printers;
+using ByReplace.Test.Common.ConfigMock;
+using ByReplace.Test.Common.FolderMock;
+using Moq;
+using Xunit;
+
+namespace ByReplace.Test.Commands.Rule.ListRules;
+
+public class ListRulesCommandTest
+{
+    private readonly PathCompilationSyntax _pathCompilationSyntax;
+    private readonly BrConfiguration _brConfiguration;
+    private readonly Mock _printBoxMock;
+
+    public ListRulesCommandTest()
+    {
+        _printBoxMock = new Mock();
+
+        var configContent = BrContentFactory
+            .CreateDefault()
+            .AddConfig(BrContentFactory.ConfigNoPathDeclaration("obj", ".bin"))
+            .AddRules(BrContentFactory
+                     .Rule("RuleTest")
+                     .WithExtensions(".cs", ".txt")
+                     .WithSkips("**\\Controllers\\*", "bin\\bin1.txt", "obj\\obj2.txt")
+                     .WithReplacement(BrContentFactory.Replacement("Test", "Test2")))
+            .Compile();
+
+        var rootFolder = FolderSyntax
+            .FolderDeclaration("RootFolder")
+            .AddMembers(
+                FileSyntax.FileDeclaration("RootFile1.cs", "ITest = new Test()"),
+                FileSyntax.FileDeclaration("RootFile2.cs", "ITest = new Test()"));
+
+        _pathCompilationSyntax = PathFactory
+            .Compile(nameof(ListRulesCommandTest))
+            .AddMembers(rootFolder)
+            .AddBrConfiguration(configContent)
+            .Create();
+
+        _brConfiguration = BrConfigurationBuilder
+            .Create()
+            .SetPath($"./{_pathCompilationSyntax.InternalIdentifier}")
+            .SetConfigPath($"./{_pathCompilationSyntax.InternalIdentifier}")
+            .Build();
+    }
+
+    [Fact]
+    public async Task Execute_WhenPrintTheBoxWithTheRules_ShouldValidateIfBoxWasPrintedOnce()
+    {
+        // Arrange
+        var builder = new RulesBox(_brConfiguration.Rules);
+
+        var command = new ListRulesCommand(_brConfiguration, _printBoxMock.Object);
+
+        // Act
+        await command.ExecuteAsync(It.IsAny());
+
+        // Assert
+        _printBoxMock.Verify(c => c.CreateBoxAndPrint(builder), Times.Once);
+    }
+}
diff --git a/src/ByReplace.Test/Commands/Rule/ListRules/ListRulesParameterTest.cs b/src/ByReplace.Test/Commands/Rule/ListRules/ListRulesParameterTest.cs
new file mode 100644
index 0000000..f27a322
--- /dev/null
+++ b/src/ByReplace.Test/Commands/Rule/ListRules/ListRulesParameterTest.cs
@@ -0,0 +1,47 @@
+ο»Ώusing ByReplace.Commands.Rule.ListRules;
+using ByReplace.Test.Common.Helpers;
+using Cocona;
+using Xunit;
+
+namespace ByReplace.Test.Commands.Rule.ListRules;
+
+public class ListRulesParameterTest
+{
+    [Fact]
+    public void ListRulesParameter_ShouldValidateTheListRulesParameterHasInheritancesFromICommandParameterSet()
+    {
+        // Arrange & Act
+        var metadata = FileInspect.GetInterfaces();
+
+        // Assert
+        Assert.NotNull(metadata);
+        Assert.Equal(typeof(ICommandParameterSet), metadata[0]);
+    }
+
+    [Fact]
+    public void ListRulesParameter_ShouldValidateThePropertiesConfiguration()
+    {
+        // Arrange & Act
+        var metadata = FileInspect.GetProperties();
+
+        // Assert
+        Assert.Single(metadata);
+        var entry = Assert.Single(metadata);
+        var attributes = entry.GetCustomAttributes(false);
+
+        Assert.Equal(typeof(string), entry.Name.GetType());
+        Assert.Equal("ConfigFile", entry.Name);
+        Assert.Single(attributes);
+        Assert.Collection(attributes,
+        attribute =>
+        {
+            var option = (OptionAttribute)attribute;
+
+            Assert.Equal(typeof(OptionAttribute), attribute.GetType());
+            Assert.Null(option.Name);
+            Assert.Equal("Path of the brconfig file.", option.Description);
+            Assert.Collection(option.ShortNames,
+            entry => Assert.Equal('f', entry));
+        });
+    }
+}
diff --git a/src/ByReplace.Test/Commands/Rule/ListRules/RulesBoxTest.cs b/src/ByReplace.Test/Commands/Rule/ListRules/RulesBoxTest.cs
new file mode 100644
index 0000000..df71894
--- /dev/null
+++ b/src/ByReplace.Test/Commands/Rule/ListRules/RulesBoxTest.cs
@@ -0,0 +1,101 @@
+ο»Ώusing Xunit;
+using ByReplace.Commands.Rule.ListRules;
+using ByReplace.Builders;
+using ByReplace.Models;
+using ByReplace.Printers;
+using ByReplace.Test.Common.ConfigMock;
+using ByReplace.Test.Common.FolderMock;
+using Moq;
+using System.Collections.Immutable;
+
+namespace ByReplace.Test.Commands.Rule.ListRules;
+
+public class RulesBoxTest
+{
+    private readonly PathCompilationSyntax _pathCompilationSyntax;
+    private readonly BrConfiguration _brConfiguration;
+    private readonly Mock _printMock;
+
+    public RulesBoxTest()
+    {
+        _printMock = new Mock();
+
+        var configContent = BrContentFactory
+          .CreateDefault()
+          .AddConfig(BrContentFactory.ConfigNoPathDeclaration("obj", ".bin"))
+          .AddRules(BrContentFactory
+                   .Rule("RuleTest")
+                   .WithExtensions(".cs", ".txt")
+                   .WithSkips("**\\Controllers\\*", "bin\\bin1.txt", "obj\\obj2.txt")
+                   .WithReplacement(BrContentFactory.Replacement("Test", "Test2")))
+          .Compile();
+
+        var rootFolder = FolderSyntax
+            .FolderDeclaration("RootFolder")
+            .AddMembers(
+                FileSyntax.FileDeclaration("RootFile1.cs", "ITest = new Test()"),
+                FileSyntax.FileDeclaration("RootFile2.cs", "ITest = new Test()"));
+
+        _pathCompilationSyntax = PathFactory
+            .Compile(nameof(RulesBoxTest))
+            .AddMembers(rootFolder)
+            .AddBrConfiguration(configContent)
+            .Create();
+
+        _brConfiguration = BrConfigurationBuilder
+            .Create()
+            .SetPath($"./{_pathCompilationSyntax.InternalIdentifier}")
+            .SetConfigPath($"./{_pathCompilationSyntax.InternalIdentifier}")
+            .Build();
+    }
+
+    [Fact]
+    public void RulesBox_WhenInstantiate_ShouldValidateTheBoxConfiguration()
+    {
+        // Arrange & Act
+        var rulesBox = new RulesBox(_brConfiguration.Rules);
+
+        // Assert
+        Assert.Equal(100, rulesBox.Width);
+        Assert.Equal(_brConfiguration.Rules.Count * 2, rulesBox.Height);
+        Assert.Equal("Rules", rulesBox.BoxName);
+    }
+
+    [Fact]
+    public void RulesBox_WhenInstantiate_ShouldValidateIfTwoObjectWithTheSameParametersAreEquals()
+    {
+        // Arrange
+        var rulesBoxFirst = new RulesBox(_brConfiguration.Rules);
+        var rulesBoxSecond = new RulesBox(_brConfiguration.Rules);
+
+        // Act
+        var isEquals = rulesBoxFirst.Equals(rulesBoxSecond);
+        var isEqualsLikeObject = rulesBoxFirst.Equals((object)rulesBoxSecond);
+        var hasTheSameHashcode = rulesBoxFirst.GetHashCode() == rulesBoxSecond.GetHashCode();
+
+        // Assert
+        Assert.Equal(rulesBoxSecond, rulesBoxFirst);
+        Assert.True(isEquals);
+        Assert.True(isEqualsLikeObject);
+        Assert.True(hasTheSameHashcode);
+    }
+
+    [Fact]
+    public void RulesBox_WhenInstantiate_ShouldValidateIfTwoObjectWithTheSameParametersAreNotEquals()
+    {
+        // Arrange
+        var rulesBoxFirst = new RulesBox(_brConfiguration.Rules);
+        var rulesBoxSecond = new RulesBox([]);
+
+        // Act
+        var isEquals = rulesBoxFirst.Equals(rulesBoxSecond);
+        var isEqualsLikeObject = rulesBoxFirst.Equals((object)rulesBoxSecond);
+        var hasTheSameHashcode = rulesBoxFirst.GetHashCode() == rulesBoxSecond.GetHashCode();
+
+        // Assert
+        Assert.NotEqual(rulesBoxSecond, rulesBoxFirst);
+        Assert.False(isEquals);
+        Assert.False(isEqualsLikeObject);
+        Assert.False(hasTheSameHashcode);
+    }
+}
diff --git a/src/ByReplace.Test/Commands/Rule/OpenRule/OpenRuleCommandTest.cs b/src/ByReplace.Test/Commands/Rule/OpenRule/OpenRuleCommandTest.cs
new file mode 100644
index 0000000..ecc6380
--- /dev/null
+++ b/src/ByReplace.Test/Commands/Rule/OpenRule/OpenRuleCommandTest.cs
@@ -0,0 +1,87 @@
+ο»Ώusing ByReplace.Builders;
+using ByReplace.Commands.Rule.OpenRule;
+using ByReplace.Models;
+using ByReplace.Printers;
+using ByReplace.Test.Common.ConfigMock;
+using ByReplace.Test.Common.FolderMock;
+using Moq;
+using Xunit;
+
+namespace ByReplace.Test.Commands.Rule.OpenRule;
+
+public class OpenRuleCommandTest
+{
+    private readonly PathCompilationSyntax _pathCompilationSyntax;
+    private readonly BrConfiguration _brConfiguration;
+    private readonly Mock _printMock;
+    private readonly Mock _printBoxMock;
+
+    public OpenRuleCommandTest()
+    {
+        _printMock = new Mock();
+        _printBoxMock = new Mock();
+
+        var configContent = BrContentFactory
+            .CreateDefault()
+            .AddConfig(BrContentFactory.ConfigNoPathDeclaration("obj", ".bin"))
+            .AddRules(
+                BrContentFactory
+                .Rule("RuleOne")
+                .WithExtensions(".cs", ".txt")
+                .WithSkips("**\\Controllers\\*", "bin\\bin1.txt", "obj\\obj2.txt")
+                .WithReplacement(BrContentFactory.Replacement("OldText", "NewText")),
+                BrContentFactory
+                .Rule("RuleTwo")
+                .WithExtensions(".cs")
+                .WithSkips("**\\Controllers\\*", "bin\\bin1.txt", "obj\\obj2.txt")
+                .WithReplacement(BrContentFactory.Replacement("MyOldText", "MyNewText"))
+              )
+            .Compile();
+
+        var rootFolder = FolderSyntax
+            .FolderDeclaration("RootFolder")
+            .AddMembers(
+                FileSyntax.FileDeclaration("RootFile1.cs", "ITest = new Test()"),
+                FileSyntax.FileDeclaration("RootFile2.cs", "ITest = new Test()"));
+
+        _pathCompilationSyntax = PathFactory
+            .Compile(nameof(OpenRuleCommandTest))
+            .AddMembers(rootFolder)
+            .AddBrConfiguration(configContent)
+            .Create();
+
+        _brConfiguration = BrConfigurationBuilder
+        .Create()
+            .SetPath($"./{_pathCompilationSyntax.InternalIdentifier}")
+            .SetConfigPath($"./{_pathCompilationSyntax.InternalIdentifier}")
+            .Build();
+    }
+
+    [Fact]
+    public async Task Execute_WhenNotFindTheRuleOnRulesConfiguration_ShouldValidateTheLogThatShowRuleWasNotFind()
+    {
+        // Arrange
+        var command = new OpenRuleCommand(_brConfiguration, "NotConfiguratedRule", _printMock.Object, _printBoxMock.Object);
+
+        // Act
+        await command.ExecuteAsync(It.IsAny());
+
+        // Assert
+        _printMock.Verify(c => c.Warning("Rule named NotConfiguratedRule was not found on brconfig file"));
+    }
+
+    [Fact]
+    public async Task Execute_WhenFindTheRuleOnRulesConfiguration_ShouldValidateIfThePrintBoxWasCalled()
+    {
+        // Arrange
+        var expectedRule = _brConfiguration.Rules.Last();
+        var expectedPrintBox = new RuleBox(expectedRule);
+        var command = new OpenRuleCommand(_brConfiguration, "RuleTwo", _printMock.Object, _printBoxMock.Object);
+
+        // Act
+        await command.ExecuteAsync(It.IsAny());
+
+        // Assert
+        _printBoxMock.Verify(c => c.CreateBoxAndPrint(expectedPrintBox), Times.Once);
+    }
+}
diff --git a/src/ByReplace.Test/Commands/Rule/OpenRule/OpenRuleParameterTest.cs b/src/ByReplace.Test/Commands/Rule/OpenRule/OpenRuleParameterTest.cs
new file mode 100644
index 0000000..c4b4637
--- /dev/null
+++ b/src/ByReplace.Test/Commands/Rule/OpenRule/OpenRuleParameterTest.cs
@@ -0,0 +1,6 @@
+ο»Ώnamespace ByReplace.Test.Commands.Rule.OpenRule
+{
+    internal sealed class OpenRuleParameterTest
+    {
+    }
+}
diff --git a/src/ByReplace.Test/Commands/Rule/OpenRule/RuleBoxTest.cs b/src/ByReplace.Test/Commands/Rule/OpenRule/RuleBoxTest.cs
new file mode 100644
index 0000000..d252350
--- /dev/null
+++ b/src/ByReplace.Test/Commands/Rule/OpenRule/RuleBoxTest.cs
@@ -0,0 +1,105 @@
+ο»Ώusing ByReplace.Builders;
+using ByReplace.Commands.Rule.OpenRule;
+using ByReplace.Models;
+using ByReplace.Printers;
+using ByReplace.Test.Common.ConfigMock;
+using ByReplace.Test.Common.FolderMock;
+using Moq;
+using Xunit;
+
+namespace ByReplace.Test.Commands.Rule.OpenRule;
+
+public class RuleBoxTest
+{
+    private readonly PathCompilationSyntax _pathCompilationSyntax;
+    private readonly BrConfiguration _brConfiguration;
+    private readonly Mock _printMock;
+
+    public RuleBoxTest()
+    {
+        _printMock = new Mock();
+
+        var configContent = BrContentFactory
+          .CreateDefault()
+          .AddConfig(BrContentFactory.ConfigNoPathDeclaration("obj", ".bin"))
+          .AddRules(BrContentFactory
+                .Rule("RuleOne")
+                .WithExtensions(".cs", ".txt")
+                .WithSkips("**\\Controllers\\*", "bin\\bin1.txt", "obj\\obj2.txt")
+                .WithReplacement(BrContentFactory.Replacement("OldText", "NewText")),
+                BrContentFactory
+                .Rule("RuleTwo")
+                .WithExtensions(".cs")
+                .WithSkips("**\\Controllers\\*", "bin\\bin1.txt", "obj\\obj2.txt")
+                .WithReplacement(BrContentFactory.Replacement("MyOldText", "MyNewText")))
+          .Compile();
+
+        var rootFolder = FolderSyntax
+            .FolderDeclaration("RootFolder")
+            .AddMembers(
+                FileSyntax.FileDeclaration("RootFile1.cs", "ITest = new Test()"),
+                FileSyntax.FileDeclaration("RootFile2.cs", "ITest = new Test()"));
+
+        _pathCompilationSyntax = PathFactory
+            .Compile(nameof(RuleBoxTest))
+            .AddMembers(rootFolder)
+            .AddBrConfiguration(configContent)
+            .Create();
+
+        _brConfiguration = BrConfigurationBuilder
+            .Create()
+            .SetPath($"./{_pathCompilationSyntax.InternalIdentifier}")
+            .SetConfigPath($"./{_pathCompilationSyntax.InternalIdentifier}")
+            .Build();
+    }
+
+    [Fact]
+    public void RuleBox_WhenInstantiate_ShouldValidateTheBoxConfiguration()
+    {
+        // Arrange & Act
+        var ruleBox = new RuleBox(_brConfiguration.Rules[0]);
+
+        // Assert
+        Assert.Equal(100, ruleBox.Width);
+        Assert.Equal(5 * 2, ruleBox.Height);
+        Assert.Equal("Rule", ruleBox.BoxName);
+    }
+
+    [Fact]
+    public void RuleBox_WhenInstantiate_ShouldValidateIfTwoObjectWithTheSameParametersAreEquals()
+    {
+        // Arrange
+        var ruleBoxFirst = new RuleBox(_brConfiguration.Rules[0]);
+        var ruleBoxSecond = new RuleBox(_brConfiguration.Rules[0]);
+
+        // Act
+        var isEquals = ruleBoxFirst.Equals(ruleBoxSecond);
+        var isEqualsLikeObject = ruleBoxFirst.Equals((object)ruleBoxSecond);
+        var hasTheSameHashcode = ruleBoxFirst.GetHashCode() == ruleBoxSecond.GetHashCode();
+
+        // Assert
+        Assert.Equal(ruleBoxSecond, ruleBoxFirst);
+        Assert.True(isEquals);
+        Assert.True(isEqualsLikeObject);
+        Assert.True(hasTheSameHashcode);
+    }
+
+    [Fact]
+    public void RuleBox_WhenInstantiate_ShouldValidateIfTwoObjectWithTheSameParametersAreNotEquals()
+    {
+        // Arrange
+        var ruleBoxFirst = new RuleBox(_brConfiguration.Rules[0]);
+        var ruleBoxSecond = new RuleBox(_brConfiguration.Rules.Last());
+
+        // Act
+        var isEquals = ruleBoxFirst.Equals(ruleBoxSecond);
+        var isEqualsLikeObject = ruleBoxFirst.Equals((object)ruleBoxSecond);
+        var hasTheSameHashcode = ruleBoxFirst.GetHashCode() == ruleBoxSecond.GetHashCode();
+
+        // Assert
+        Assert.NotEqual(ruleBoxSecond, ruleBoxFirst);
+        Assert.False(isEquals);
+        Assert.False(isEqualsLikeObject);
+        Assert.False(hasTheSameHashcode);
+    }
+}
diff --git a/src/ByReplace.Test/Commands/TimerFinish/TimerFinishCommandTest.cs b/src/ByReplace.Test/Commands/TimerFinish/TimerFinishCommandTest.cs
new file mode 100644
index 0000000..37365b7
--- /dev/null
+++ b/src/ByReplace.Test/Commands/TimerFinish/TimerFinishCommandTest.cs
@@ -0,0 +1,29 @@
+ο»Ώusing ByReplace.Commands.TimerFinish;
+using ByReplace.Printers;
+using Moq;
+using Xunit;
+
+namespace ByReplace.Test.Commands.TimerFinish;
+
+public class TimerFinishCommandTest
+{
+    private readonly Mock _printMock;
+
+    public TimerFinishCommandTest()
+    {
+        _printMock = new Mock();
+    }
+
+    [Fact]
+    public async Task ExecuteAsync_ShouldCallPrintTimerOnce_WhenExecutionFinishes()
+    {
+        // Arrange
+        var command = new TimerFinishCommand(_printMock.Object);
+
+        // Act
+        await command.ExecuteAsync();
+
+        // Assert
+        _printMock.Verify(c => c.Timer(), Times.Once);
+    }
+}
diff --git a/src/ByReplace.Test/Commands/Version/NugetVersionTest.cs b/src/ByReplace.Test/Commands/Version/NugetVersionTest.cs
new file mode 100644
index 0000000..76a3cf3
--- /dev/null
+++ b/src/ByReplace.Test/Commands/Version/NugetVersionTest.cs
@@ -0,0 +1,32 @@
+ο»Ώ// Ignore Spelling: Nuget
+
+using ByReplace.Commands.TimerFinish;
+using ByReplace.Printers;
+using Moq;
+using Xunit;
+
+namespace ByReplace.Test.Commands.Version
+{
+    public class NugetVersionTest
+    {
+        public readonly Mock _printMock;
+
+        public NugetVersionTest()
+        {
+            _printMock = new Mock();
+        }
+
+        [Fact]
+        public async Task Execute_WhenCalledTimerToPrintTimeOfExecution_ShouldVerifyIfTimerWasCalledOnce()
+        {
+            // Arrange
+            var command = new TimerFinishCommand(_printMock.Object);
+
+            // Act
+            await command.ExecuteAsync(It.IsAny());
+
+            // Assert
+            _printMock.Verify(c => c.Timer(), Times.Once);
+        }
+    }
+}
diff --git a/src/ByReplace.Test/Commands/Version/VersionCommandTest.cs b/src/ByReplace.Test/Commands/Version/VersionCommandTest.cs
new file mode 100644
index 0000000..d0fd70f
--- /dev/null
+++ b/src/ByReplace.Test/Commands/Version/VersionCommandTest.cs
@@ -0,0 +1,6 @@
+ο»Ώnamespace ByReplace.Test.Commands.Version
+{
+    internal sealed class VersionCommandTest
+    {
+    }
+}
diff --git a/src/ByReplace.Test/Common/Asserts/AssertBr.cs b/src/ByReplace.Test/Common/Asserts/AssertBr.cs
new file mode 100644
index 0000000..6f83723
--- /dev/null
+++ b/src/ByReplace.Test/Common/Asserts/AssertBr.cs
@@ -0,0 +1,16 @@
+ο»Ώnamespace ByReplace.Test.Common.Asserts;
+
+public static class AssertBr
+{
+    public static void Single(IEnumerable collection, Action action)
+    {
+        if (collection is null || collection == Enumerable.Empty())
+        {
+            throw new ArgumentNullException("The collection is empty");
+        }
+
+        var first = collection.FirstOrDefault();
+
+        action.Invoke(first!);
+    }
+}
\ No newline at end of file
diff --git a/src/ByReplace.Test/Common/ConfigMock/BrContentFactory.cs b/src/ByReplace.Test/Common/ConfigMock/BrContentFactory.cs
new file mode 100644
index 0000000..85e28b9
--- /dev/null
+++ b/src/ByReplace.Test/Common/ConfigMock/BrContentFactory.cs
@@ -0,0 +1,58 @@
+ο»Ώnamespace ByReplace.Test.Common.ConfigMock;
+
+internal sealed class BrContentFactory
+{
+    private ContentSyntax _configSyntax;
+    private readonly List _rulesSyntax = new List();
+
+    public static BrContentFactory CreateDefault() => new BrContentFactory();
+
+    public BrContentFactory AddConfig(ContentSyntax configSyntax)
+    {
+        _configSyntax = configSyntax;
+
+        return this;
+    }
+
+    public BrContentFactory AddRule(RuleSyntax ruleSyntax)
+    {
+        _rulesSyntax.Add(ruleSyntax);
+        return this;
+    }
+
+    public BrContentFactory AddRules(params RuleSyntax[] rulesSyntax)
+    {
+        _rulesSyntax.AddRange(rulesSyntax);
+        return this;
+    }
+
+    public static ContentSyntax ConfigDeclaration(string path, params string[] skipDirectories)
+    {
+        return ContentSyntax.Create(path, [.. skipDirectories]);
+    }
+    public static ContentSyntax ConfigNoPathDeclaration(params string[] skipDirectories)
+    {
+        return ContentSyntax.Create("", [.. skipDirectories]);
+    }
+
+    public static RuleSyntax Rule(string name, string description)
+    {
+        return RuleSyntax.Create(name, description);
+    }
+    public static RuleSyntax Rule(string name)
+    {
+        return RuleSyntax.Create(name);
+    }
+
+    public static ReplacementSyntax Replacement(string @new, params string[] Old)
+    {
+        return ReplacementSyntax.Create(@new, [.. Old]);
+    }
+
+    public ContentSyntax Compile()
+    {
+        _configSyntax.Rules = _rulesSyntax;
+
+        return _configSyntax;
+    }
+}
diff --git a/src/ByReplace.Test/Common/ConfigMock/ContentSyntax.cs b/src/ByReplace.Test/Common/ConfigMock/ContentSyntax.cs
new file mode 100644
index 0000000..4797473
--- /dev/null
+++ b/src/ByReplace.Test/Common/ConfigMock/ContentSyntax.cs
@@ -0,0 +1,33 @@
+ο»Ώnamespace ByReplace.Test.Common.ConfigMock;
+
+public class ContentSyntax
+{
+    public ContentSyntax()
+    {
+    }
+
+    private ContentSyntax(string path, List skipDirectories)
+    {
+        Path = path;
+        SkipDirectories = skipDirectories;
+    }
+
+    public string Path { get; set; }
+    public List SkipDirectories { get; set; }
+    public List Rules { get; set; }
+
+    public static ContentSyntax Create(string path, List skipDirectories)
+    {
+        return new ContentSyntax(path, skipDirectories);
+    }
+
+    public void AddRule(RuleSyntax ruleSyntax)
+    {
+        Rules.Add(ruleSyntax);
+    }
+
+    public void AddRules(List rulesSyntax)
+    {
+        Rules.AddRange(rulesSyntax);
+    }
+}
diff --git a/src/ByReplace.Test/Common/ConfigMock/ReplacementSyntax.cs b/src/ByReplace.Test/Common/ConfigMock/ReplacementSyntax.cs
new file mode 100644
index 0000000..38a0302
--- /dev/null
+++ b/src/ByReplace.Test/Common/ConfigMock/ReplacementSyntax.cs
@@ -0,0 +1,18 @@
+ο»Ώnamespace ByReplace.Test.Common.ConfigMock;
+
+public class ReplacementSyntax
+{
+    public ReplacementSyntax(string @new, List Old)
+    {
+        this.Old = Old;
+        New = @new;
+    }
+
+    public List Old { get; set; }
+    public string New { get; set; }
+
+    public static ReplacementSyntax Create(string @new, List Old)
+    {
+        return new ReplacementSyntax(@new, Old);
+    }
+}
diff --git a/src/ByReplace.Test/Common/ConfigMock/RuleSyntax.cs b/src/ByReplace.Test/Common/ConfigMock/RuleSyntax.cs
new file mode 100644
index 0000000..54c6420
--- /dev/null
+++ b/src/ByReplace.Test/Common/ConfigMock/RuleSyntax.cs
@@ -0,0 +1,76 @@
+ο»Ώnamespace ByReplace.Test.Common.ConfigMock;
+
+public sealed class RuleSyntax
+{
+    private RuleSyntax(
+        string name,
+        string description,
+        List skip,
+        List extensions,
+        ReplacementSyntax replacement)
+    {
+        Name = name;
+        Description = description;
+        Skip = skip;
+        Extensions = extensions;
+        Replacement = replacement;
+    }
+
+    private RuleSyntax(string name, string description)
+    {
+        Name = name;
+        Description = description;
+    }
+
+    private RuleSyntax(string name)
+    {
+        Name = name;
+    }
+
+    public string Name { get; set; }
+    public string Description { get; set; }
+    public List Skip { get; set; }
+    public List Extensions { get; set; }
+    public ReplacementSyntax Replacement { get; set; }
+
+    public static RuleSyntax Create(
+        string name,
+        string description,
+        List skips,
+        List extensions,
+        ReplacementSyntax replacement)
+    {
+        return new RuleSyntax(name, description, skips, extensions, replacement);
+    }
+
+    public static RuleSyntax Create(string name, string description)
+    {
+        return new RuleSyntax(name, description);
+    }
+
+    public static RuleSyntax Create(string name)
+    {
+        return new RuleSyntax(name);
+    }
+
+    public RuleSyntax WithReplacement(ReplacementSyntax replacementSyntax)
+    {
+        Replacement = replacementSyntax;
+
+        return this;
+    }
+
+    public RuleSyntax WithSkips(params string[] skip)
+    {
+        Skip = skip.ToList();
+
+        return this;
+    }
+
+    public RuleSyntax WithExtensions(params string[] extensions)
+    {
+        Extensions = [.. extensions];
+
+        return this;
+    }
+}
diff --git a/src/ByReplace.Test/Common/FolderMock/FileSyntax.cs b/src/ByReplace.Test/Common/FolderMock/FileSyntax.cs
new file mode 100644
index 0000000..cead8e9
--- /dev/null
+++ b/src/ByReplace.Test/Common/FolderMock/FileSyntax.cs
@@ -0,0 +1,30 @@
+ο»Ώnamespace ByReplace.Test.Common.FolderMock;
+
+internal sealed class FileSyntax
+{
+    public FileSyntax(string name)
+    {
+        Name = name;
+    }
+
+    public FileSyntax(string name, string content)
+    {
+        Name = name;
+        Content = content;
+    }
+
+    public string Name { get; }
+    public string Content { get; }
+
+    public string Extension => System.IO.Path.GetExtension(Name);
+
+    public static FileSyntax FileDeclaration(string name)
+    {
+        return new FileSyntax(name);
+    }
+
+    public static FileSyntax FileDeclaration(string name, string content)
+    {
+        return new FileSyntax(name, content);
+    }
+}
diff --git a/src/ByReplace.Test/Common/FolderMock/FolderSyntax.cs b/src/ByReplace.Test/Common/FolderMock/FolderSyntax.cs
new file mode 100644
index 0000000..7b8cc5c
--- /dev/null
+++ b/src/ByReplace.Test/Common/FolderMock/FolderSyntax.cs
@@ -0,0 +1,63 @@
+ο»Ώnamespace ByReplace.Test.Common.FolderMock;
+
+internal sealed class FolderSyntax
+{
+    public FolderSyntax(string name)
+    {
+        Name = name;
+        Files = new List();
+    }
+
+    public FolderSyntax(string name, FolderSyntax parent)
+    {
+        Name = name;
+        Parent = parent;
+        Files = new List();
+    }
+
+    public FolderSyntax(string name, FolderSyntax parent, List files)
+    {
+        Name = name;
+        Parent = parent;
+        Files = files;
+    }
+
+    public FolderSyntax Parent { get; private set; }
+
+    public string Name { get; }
+
+    public List Files { get; }
+
+    public static FolderSyntax FolderDeclaration(string name)
+    {
+        return new FolderSyntax(name);
+    }
+
+    public static FolderSyntax FolderDeclaration(string name, FolderSyntax parent)
+    {
+        return new FolderSyntax(name, parent);
+    }
+
+    public static FolderSyntax FolderDeclaration(string name, FolderSyntax parent, List files)
+    {
+        return new FolderSyntax(name, parent, files);
+    }
+
+    public FolderSyntax AddMembers(FileSyntax fileSyntax)
+    {
+        this.Files.Add(fileSyntax);
+        return this;
+    }
+
+    public FolderSyntax AddMembers(params FileSyntax[] filesSyntax)
+    {
+        this.Files.AddRange(filesSyntax);
+        return this;
+    }
+
+    public FolderSyntax AddParent(FolderSyntax parent)
+    {
+        this.Parent = parent;
+        return this;
+    }
+}
diff --git a/src/ByReplace.Test/Common/FolderMock/PathCompilationSyntax.cs b/src/ByReplace.Test/Common/FolderMock/PathCompilationSyntax.cs
new file mode 100644
index 0000000..4e24639
--- /dev/null
+++ b/src/ByReplace.Test/Common/FolderMock/PathCompilationSyntax.cs
@@ -0,0 +1,103 @@
+ο»Ώusing ByReplace.Test.Common.ConfigMock;
+using System.Runtime.InteropServices;
+using System.Text.Json;
+namespace ByReplace.Test.Common.FolderMock;
+
+internal sealed class PathCompilationSyntax
+{
+    private readonly List _folders;
+    private ContentSyntax _brConfiguration;
+
+    public string InternalIdentifier { get; }
+
+    public PathCompilationSyntax()
+    {
+        InternalIdentifier = Guid.NewGuid().ToString();
+        _folders = new List();
+        _brConfiguration = new ContentSyntax();
+    }
+
+    public PathCompilationSyntax(string testCase)
+    {
+        InternalIdentifier = $"{testCase}_{Guid.NewGuid()}";
+        _folders = new List();
+        _brConfiguration = new ContentSyntax();
+    }
+
+    public PathCompilationSyntax AddMembers(params FolderSyntax[] foldersSyntax)
+    {
+        this._folders.AddRange(foldersSyntax);
+
+        return this;
+    }
+
+    public PathCompilationSyntax AddMember(FolderSyntax folderSyntax)
+    {
+        _folders.Add(folderSyntax);
+
+        return this;
+    }
+
+    public PathCompilationSyntax AddBrConfiguration(ContentSyntax configSyntax)
+    {
+        _brConfiguration = configSyntax;
+
+        return this;
+    }
+
+    public PathCompilationSyntax AddFolder(string name)
+    {
+        _folders.Add(new FolderSyntax(name));
+
+        return this;
+    }
+
+    public PathCompilationSyntax Create()
+    {
+        foreach (ref var folder in CollectionsMarshal.AsSpan(_folders))
+        {
+            CreateThreeFolder(folder);
+        }
+
+        if (_brConfiguration is not null)
+        {
+            var brConfig = JsonSerializer.Serialize(_brConfiguration, new JsonSerializerOptions
+            {
+                WriteIndented = true
+            });
+
+            File.WriteAllText($"./{InternalIdentifier}/brconfig.json", brConfig);
+        }
+
+        return this;
+    }
+
+    public PathCompilationSyntax CreateThreeFolder(FolderSyntax folderSyntax)
+    {
+        if (folderSyntax is null)
+        {
+            return this;
+        }
+
+        if (folderSyntax.Parent is not null)
+        {
+            CreateThreeFolder(folderSyntax.Parent);
+        }
+
+        var dirPath = folderSyntax.Parent is not null
+                ? $"./{InternalIdentifier}/{folderSyntax.Parent.Name}/{folderSyntax.Name}"
+                : $"./{InternalIdentifier}/{folderSyntax.Name}";
+
+        if (!Directory.Exists(dirPath))
+        {
+            Directory.CreateDirectory(dirPath);
+        }
+
+        foreach (ref var file in CollectionsMarshal.AsSpan(folderSyntax.Files))
+        {
+            File.WriteAllText($"{dirPath}/{file.Name}", file.Content);
+        }
+
+        return this;
+    }
+}
diff --git a/src/ByReplace.Test/Common/FolderMock/PathFactory.cs b/src/ByReplace.Test/Common/FolderMock/PathFactory.cs
new file mode 100644
index 0000000..39c8349
--- /dev/null
+++ b/src/ByReplace.Test/Common/FolderMock/PathFactory.cs
@@ -0,0 +1,7 @@
+ο»Ώnamespace ByReplace.Test.Common.FolderMock;
+
+internal sealed class PathFactory
+{
+    public static PathCompilationSyntax Compile() => new PathCompilationSyntax();
+    public static PathCompilationSyntax Compile(string testCase) => new PathCompilationSyntax(testCase);
+}
diff --git a/src/ByReplace.Test/Common/Helpers/FileInspect.cs b/src/ByReplace.Test/Common/Helpers/FileInspect.cs
new file mode 100644
index 0000000..4ffdb80
--- /dev/null
+++ b/src/ByReplace.Test/Common/Helpers/FileInspect.cs
@@ -0,0 +1,34 @@
+ο»Ώusing System.Reflection;
+
+namespace ByReplace.Test.Common.Helpers
+{
+    internal static class FileInspect
+    {
+        public static Type Type => typeof(T);
+
+        public static object[] GetAttributes(bool inherit = false)
+        {
+            return Type.GetCustomAttributes(inherit);
+        }
+
+        public static ConstructorInfo[] GetConstructors()
+        {
+            return Type.GetConstructors();
+        }
+
+        public static PropertyInfo[] GetProperties()
+        {
+            return Type.GetProperties();
+        }
+
+        public static Type[] GetInterfaces()
+        {
+            return Type.GetInterfaces();
+        }
+
+        public static Type? GetBaseType()
+        {
+            return Type.BaseType;
+        }
+    }
+}
diff --git a/src/ByReplace.Test/Mappers/DirectoryThreeTest.cs b/src/ByReplace.Test/Mappers/DirectoryThreeTest.cs
new file mode 100644
index 0000000..8c828a6
--- /dev/null
+++ b/src/ByReplace.Test/Mappers/DirectoryThreeTest.cs
@@ -0,0 +1,96 @@
+ο»Ώusing ByReplace.Builders;
+using ByReplace.Mappers;
+using ByReplace.Models;
+using ByReplace.Printers;
+using ByReplace.Test.Common.ConfigMock;
+using ByReplace.Test.Common.FolderMock;
+using Moq;
+using Xunit;
+
+namespace ByReplace.Test.Mappers;
+
+public class DirectoryThreeTest
+{
+    private readonly PathCompilationSyntax _pathCompilationSyntax;
+    private readonly BrConfiguration _brConfiguration;
+    private readonly Mock _printMock;
+
+    public DirectoryThreeTest()
+    {
+        _printMock = new Mock();
+
+        var configContent = BrContentFactory
+            .CreateDefault()
+            .AddConfig(BrContentFactory.ConfigNoPathDeclaration("obj", ".bin"))
+            .AddRules(BrContentFactory
+                     .Rule("RuleTest")
+                     .WithExtensions(".cs", ".txt")
+                     .WithSkips("**\\Controllers\\*", "bin\\bin1.txt", "obj\\obj2.txt")
+                     .WithReplacement(BrContentFactory.Replacement("Test", "Test2")))
+            .Compile();
+
+        var rootFolder = FolderSyntax
+            .FolderDeclaration("RootFolder")
+            .AddMembers(
+                FileSyntax.FileDeclaration("RootFile1.cs", "ITest = new Test()"),
+                FileSyntax.FileDeclaration("RootFile2.cs", "ITest = new Test()"));
+
+        _pathCompilationSyntax = PathFactory
+            .Compile(nameof(DirectoryThreeTest))
+            .AddMembers(rootFolder)
+            .AddBrConfiguration(configContent)
+            .Create();
+
+        _brConfiguration = BrConfigurationBuilder
+            .Create()
+            .SetPath($"./{_pathCompilationSyntax.InternalIdentifier}")
+            .SetConfigPath($"./{_pathCompilationSyntax.InternalIdentifier}")
+            .Build();
+    }
+
+    [Fact]
+    public void MapThreeSources_WhenStartTheSourceMap_ShouldReturnTheThreeFile()
+    {
+        // Arrange
+        var dirThree = new DirectoryThree(_printMock.Object);
+
+        // Act
+        var nodes = dirThree.MapThreeSources(_brConfiguration.Path);
+
+        // Assert
+        Assert.Equal(2, nodes.Count);
+        Assert.Collection(nodes,
+        entry =>
+        {
+            Assert.Single(entry.Files);
+            Assert.NotEmpty(entry.Parent);
+            Assert.NotEmpty(entry.Path);
+            Assert.Collection(entry.Files,
+            entry =>
+            {
+                Assert.Equal(".json", entry.Extension);
+                Assert.EndsWith("brconfig.json", entry.FullName);
+                Assert.Equal("brconfig.json", entry.Name);
+            });
+        },
+        entry =>
+        {
+            Assert.Equal(2, entry.Files.Count);
+            Assert.NotEmpty(entry.Parent);
+            Assert.NotEmpty(entry.Path);
+            Assert.Collection(entry.Files,
+            entry =>
+            {
+                Assert.Equal(".cs", entry.Extension);
+                Assert.EndsWith("RootFile1.cs", entry.FullName);
+                Assert.Equal("RootFile1.cs", entry.Name);
+            },
+            entry =>
+            {
+                Assert.Equal(".cs", entry.Extension);
+                Assert.EndsWith("RootFile2.cs", entry.FullName);
+                Assert.Equal("RootFile2.cs", entry.Name);
+            });
+        });
+    }
+}
diff --git a/src/ByReplace.Test/Matches/ExtensionMatchTest.cs b/src/ByReplace.Test/Matches/ExtensionMatchTest.cs
new file mode 100644
index 0000000..11756a2
--- /dev/null
+++ b/src/ByReplace.Test/Matches/ExtensionMatchTest.cs
@@ -0,0 +1,39 @@
+ο»Ώusing ByReplace.Matches;
+using Xunit;
+
+namespace ByReplace.Test.Matches;
+
+public class ExtensionMatchTest
+{
+    [Theory]
+    [InlineData(".cs", ".cs", ".text", ".py")]
+    [InlineData(".text", ".cs", ".text", ".py")]
+    [InlineData(".py", ".cs", ".text", ".py")]
+    public void HasMatch_WhenTryMatchTheAllowExtensionFromFile_ShouldMatch(string extension, params string[] extensions)
+    {
+        // Arrange
+        var match = new ExtensionMatch(extension, extensions);
+
+        // Act
+        var hasMatch = match.HasMatch;
+
+        // Assert
+        Assert.True(hasMatch);
+    }
+
+    [Theory]
+    [InlineData(".cs", ".text", ".py")]
+    [InlineData(".text", ".cs", ".py")]
+    [InlineData(".py", ".cs", ".text")]
+    public void HasMatch_WhenTryMatchTheDenyExtensionFromFile_ShouldNotMatch(string extension, params string[] extensions)
+    {
+        // Arrange
+        var match = new ExtensionMatch(extension, extensions);
+
+        // Act
+        var hasMatch = match.HasMatch;
+
+        // Assert
+        Assert.False(hasMatch);
+    }
+}
diff --git a/src/ByReplace.Test/Matches/SkipMatchTest.cs b/src/ByReplace.Test/Matches/SkipMatchTest.cs
new file mode 100644
index 0000000..b291b6c
--- /dev/null
+++ b/src/ByReplace.Test/Matches/SkipMatchTest.cs
@@ -0,0 +1,53 @@
+ο»Ώusing ByReplace.Mappers;
+using ByReplace.Matches;
+using Xunit;
+
+namespace ByReplace.Test.Matches;
+
+public class SkipMatchTest
+{
+    [Fact]
+    public void HasMatch_WhenTryMatchTheFileAndItNotMatchToAnyRuleToSkip_ShouldReturnFalse()
+    {
+        // Arrange
+        var fileMapperMock = new FileMapper(Guid.NewGuid(), "testFile.txt", "c://byreplace//testFile.txt", ".txt");
+
+        var match = new SkipMatch("c://byreplace//", fileMapperMock, new string[] { "Startup.cs", "Program.cs", "**/Controllers/*" });
+
+        // Act
+        var hasMatch = match.HasMatch;
+
+        // Assert
+        Assert.False(hasMatch);
+    }
+
+    [Fact]
+    public void HasMatch_WhenTryMatchSomeFileByDirectoryPath_ShouldReturnTrue()
+    {
+        // Arrange
+        var fileMapperMock = new FileMapper(Guid.NewGuid(), "testFile.txt", "c://byreplace//testFile.txt", ".txt");
+
+        var match = new SkipMatch("c://byreplace//", fileMapperMock, new string[] { "**/byreplace/*" });
+
+        // Act
+        var hasMatch = match.HasMatch;
+
+        // Assert
+        Assert.True(hasMatch);
+    }
+
+    [Fact]
+    public void HasMatch_WhenTryMatchSomeFileByDirectoryWithFileNamePath_ShouldReturnTrue()
+    {
+        // Arrange
+        var fileMapperMock = new FileMapper(Guid.NewGuid(), "testFile.txt", "c://byreplace//testFile.txt", ".txt");
+
+        var match = new SkipMatch("c://byreplace//", fileMapperMock, ["//byreplace//testFile.txt"]);
+
+        // Act
+        var hasMatch = match.HasMatch;
+
+        // Assert
+        Assert.True(hasMatch);
+    }
+}
diff --git a/src/ByReplace.Test/Models/BrConfigurationTest.cs b/src/ByReplace.Test/Models/BrConfigurationTest.cs
new file mode 100644
index 0000000..5f3451e
--- /dev/null
+++ b/src/ByReplace.Test/Models/BrConfigurationTest.cs
@@ -0,0 +1,117 @@
+ο»Ώusing ByReplace.Builders;
+using ByReplace.Models;
+using ByReplace.Test.Analyzers;
+using ByReplace.Test.Common.ConfigMock;
+using ByReplace.Test.Common.FolderMock;
+using System.Collections.Immutable;
+using Xunit;
+
+namespace ByReplace.Test.Models;
+
+public class BrConfigurationTest
+{
+    private readonly PathCompilationSyntax _pathCompilationSyntax;
+    private readonly BrConfiguration _brConfiguration;
+
+    public BrConfigurationTest()
+    {
+        var configContent = BrContentFactory
+            .CreateDefault()
+            .AddConfig(BrContentFactory.ConfigNoPathDeclaration("obj", ".bin"))
+            .AddRules(BrContentFactory
+                     .Rule("RuleTest")
+                     .WithExtensions(".cs", ".txt")
+                     .WithSkips("**\\Controllers\\*", "bin\\bin1.txt", "obj\\obj2.txt")
+                     .WithReplacement(BrContentFactory.Replacement("Test", "Test2")))
+            .Compile();
+
+        var rootFolder = FolderSyntax
+            .FolderDeclaration("RootFolder")
+            .AddMembers(
+                FileSyntax.FileDeclaration("RootFile1.cs", "ITest = new Test()"),
+                FileSyntax.FileDeclaration("RootFile2.cs", "ITest = new Test()"));
+
+        _pathCompilationSyntax = PathFactory
+            .Compile(nameof(BrConfigurationTest))
+            .AddMembers(rootFolder)
+            .AddBrConfiguration(configContent)
+            .Create();
+
+        _brConfiguration = BrConfigurationBuilder
+            .Create()
+            .SetPath($"./{_pathCompilationSyntax.InternalIdentifier}")
+            .SetConfigPath($"./{_pathCompilationSyntax.InternalIdentifier}")
+            .Build();
+    }
+
+    [Fact]
+    public void BrConfiguration_WhenInstantiate_ShouldValidateThePropertiesValues()
+    {
+        // Arrange && Act
+        var config = new BrConfiguration("C://ByReplace", ["**//Controllers/*"], []);
+
+        // Assert
+        Assert.Equal("C://ByReplace", config.Path);
+        Assert.Empty(config.Rules);
+        Assert.Single(config.SkipDirectories);
+        Assert.Collection(config.SkipDirectories, entry => Assert.Equal("**//Controllers/*", entry));
+    }
+
+    [Fact]
+    public void SetOnlyOneRule_WhenSetNewRule_ShouldReplaceOldRulesWithTheNewOne()
+    {
+        // Arrange
+        var replacement = new Replacement(["private readonly Test _test;"], "private readonly Test test;");
+        var newRule = new ByReplace.Models.Rule("name", "description", ["**//Controller/*"], [".cs", ".py"], replacement);
+        var config = new BrConfiguration("C://ByReplace", ["**//Controllers/*"], []);
+
+        // Act
+        config.SetOnlyOneRule(newRule);
+
+        // Assert
+        Assert.Single(config.SkipDirectories);
+    }
+
+    [Fact]
+    public void ChangeDefaultPath_WhenChangePathToAPathThatExists_ShouldReplaceTheValueOfPath()
+    {
+        // Arrange
+        var config = new BrConfiguration("./ByReplace", ["**//Controllers/*"], []);
+
+        // Act
+        config.ChangeDefaultPath("./");
+
+        // Assert
+        Assert.Equal("./", config.Path);
+    }
+
+    [Fact]
+    public void ChangeDefaultPath_WhenChangePathToAPathThatDoesNotExists_ShouldReceiveAnException()
+    {
+        // Arrange
+        var config = new BrConfiguration("C://ByReplace", ["**//Controllers/*"], []);
+
+        // Act && Assert
+        Assert.Throws(() => config.ChangeDefaultPath("//FakeFolder"));
+    }
+
+    [Fact]
+    public void GetConfiguration_WhenGetConfigurationThatExistsOnPath_ShouldReturnBrConfiguration()
+    {
+        // Arrange && Act
+        var config = BrConfiguration.GetConfiguration(_pathCompilationSyntax.InternalIdentifier);
+
+        // Assert
+        Assert.NotNull(config);
+    }
+
+    [Fact]
+    public void GetConfiguration_WhenGetConfigurationThatDoesNotExistsOnPath_ShouldReceiveAnException()
+    {
+        // Arrange
+        var config = new BrConfiguration("C://ByReplace", ["**//Controllers/*"], []);
+
+        // Act && Assert
+        Assert.Throws(() => BrConfiguration.GetConfiguration("//FakeFolder"));
+    }
+}
diff --git a/src/ByReplace.Test/Usings.cs b/src/ByReplace.Test/Usings.cs
new file mode 100644
index 0000000..e69de29
diff --git a/src/ByReplace.sln b/src/ByReplace.sln
new file mode 100644
index 0000000..6794d19
--- /dev/null
+++ b/src/ByReplace.sln
@@ -0,0 +1,39 @@
+ο»Ώ
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.5.33326.253
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ByReplace", "ByReplace\ByReplace.csproj", "{0059B6E7-C93F-46F2-9A32-7CC763723B49}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ByReplace.Test", "ByReplace.Test\ByReplace.Test.csproj", "{B12EE373-770F-4330-9548-CAB58DDFC3D0}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{7FE1BE7E-A352-4A0E-89CC-4EACB3E93A5A}"
+	ProjectSection(SolutionItems) = preProject
+		.editorconfig = .editorconfig
+		..\.gitignore = ..\.gitignore
+		Dockerfile = Dockerfile
+		makefile = makefile
+	EndProjectSection
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{0059B6E7-C93F-46F2-9A32-7CC763723B49}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0059B6E7-C93F-46F2-9A32-7CC763723B49}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0059B6E7-C93F-46F2-9A32-7CC763723B49}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0059B6E7-C93F-46F2-9A32-7CC763723B49}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B12EE373-770F-4330-9548-CAB58DDFC3D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B12EE373-770F-4330-9548-CAB58DDFC3D0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B12EE373-770F-4330-9548-CAB58DDFC3D0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B12EE373-770F-4330-9548-CAB58DDFC3D0}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {694D235E-760E-45A9-9B98-546C05F2F081}
+	EndGlobalSection
+EndGlobal
diff --git a/src/ByReplace/Analyzers/Analises.cs b/src/ByReplace/Analyzers/Analises.cs
new file mode 100644
index 0000000..5208a98
--- /dev/null
+++ b/src/ByReplace/Analyzers/Analises.cs
@@ -0,0 +1,7 @@
+ο»Ώnamespace ByReplace.Analyzers;
+
+internal enum Analyses
+{
+    Diagnostic,
+    Fix
+}
\ No newline at end of file
diff --git a/src/ByReplace/Analyzers/Analyzer.cs b/src/ByReplace/Analyzers/Analyzer.cs
new file mode 100644
index 0000000..c857d5c
--- /dev/null
+++ b/src/ByReplace/Analyzers/Analyzer.cs
@@ -0,0 +1,28 @@
+ο»Ώ[assembly: InternalsVisibleTo("ByReplace.Test")]
+
+namespace ByReplace.Analyzers;
+
+internal sealed class Analyzer
+{
+    private readonly BrConfiguration brConfiguration;
+    private readonly IPrint print;
+
+    public Analyzer(BrConfiguration brConfiguration, IPrint print)
+    {
+        this.brConfiguration = brConfiguration;
+        this.print = print;
+    }
+
+    internal ImmutableList LoadThreeFiles()
+    {
+        print.Information("Identifying folder three files.");
+
+        DirectoryThree directoryThree = new DirectoryThree(print);
+        directoryThree.MapThreeSources(brConfiguration.Path);
+
+        return directoryThree
+            .Nodes
+            .OrderBy(c => c.Directory)
+            .ToImmutableList();
+    }
+}
diff --git a/src/ByReplace/Analyzers/AnalyzerAndFixer.cs b/src/ByReplace/Analyzers/AnalyzerAndFixer.cs
new file mode 100644
index 0000000..1c071d3
--- /dev/null
+++ b/src/ByReplace/Analyzers/AnalyzerAndFixer.cs
@@ -0,0 +1,61 @@
+ο»Ώ[assembly: InternalsVisibleTo("ByReplace.Test")]
+
+namespace ByReplace.Analyzers;
+
+internal sealed class AnalyzerAndFixer : Dictionary>
+{
+    private readonly IPrint print;
+
+    public AnalyzerAndFixer(IPrint print) : this([], print)
+    {
+    }
+
+    public AnalyzerAndFixer(IEnumerable>> values, IPrint print) : base(values)
+    {
+        this.print = print;
+    }
+
+    public bool TryMatchRule(DirectoryNode directoryNode, ImmutableList rules)
+    {
+        foreach (FileMapper file in directoryNode.Files)
+        {
+            foreach (Rule rule in rules)
+            {
+                var skipDirMatch = new SkipMatch(directoryNode.Directory, file, rule.Skip);
+                var extensionMatch = new ExtensionMatch(file.Extension, rule.Extensions);
+
+                if (skipDirMatch.HasMatch || !extensionMatch.HasMatch)
+                {
+                    continue;
+                }
+
+                if (!this.ContainsKey(file))
+                {
+                    this.Add(file, new List());
+                }
+
+                this[file].Add(rule);
+            }
+        }
+
+        foreach (KeyValuePair> item in this)
+        {
+            print.Information($"[Cyan]{item.Value.Count} rules in total match the file [Cyan]{item.Key.Name}.");
+        }
+
+        return false;
+    }
+
+    public AnalyzerAndFixer FindByKey(string rule)
+    {
+        return new AnalyzerAndFixer(this.Where(c => c.Key.Name == rule), this.print);
+    }
+
+    public AnalyzerAndFixer FindByRule(string rule)
+    {
+        var filteredDictionary = this.Where(entry => entry.Value.Any(r => r.Name == rule))
+                                     .ToDictionary(entry => entry.Key, entry => entry.Value);
+
+        return new AnalyzerAndFixer(filteredDictionary, print);
+    }
+}
diff --git a/src/ByReplace/Analyzers/AnalyzerRunner.cs b/src/ByReplace/Analyzers/AnalyzerRunner.cs
new file mode 100644
index 0000000..1fda79b
--- /dev/null
+++ b/src/ByReplace/Analyzers/AnalyzerRunner.cs
@@ -0,0 +1,29 @@
+ο»Ώ[assembly: InternalsVisibleTo("ByReplace.Test")]
+
+namespace ByReplace.Analyzers;
+
+internal sealed class AnalyzerRunner
+{
+    private readonly BrConfiguration brConfiguration;
+    private readonly IPrint print;
+
+    internal AnalyzerRunner(BrConfiguration brConfiguration, IPrint print)
+    {
+        this.brConfiguration = brConfiguration;
+        this.print = print;
+    }
+
+    internal AnalyzerAndFixer RunAnalysis(ImmutableList directoryThree, Analyses diagnostic)
+    {
+        print.Information("Identifying rules that has matches.");
+
+        AnalyzerAndFixer analyzersAndFixers = new AnalyzerAndFixer(this.print);
+
+        foreach (DirectoryNode dir in directoryThree)
+        {
+            analyzersAndFixers.TryMatchRule(dir, brConfiguration.Rules);
+        }
+
+        return analyzersAndFixers;
+    }
+}
diff --git a/src/ByReplace/Analyzers/DocumentFix.cs b/src/ByReplace/Analyzers/DocumentFix.cs
new file mode 100644
index 0000000..222e1fa
--- /dev/null
+++ b/src/ByReplace/Analyzers/DocumentFix.cs
@@ -0,0 +1,58 @@
+ο»Ώ[assembly: InternalsVisibleTo("ByReplace.Test")]
+
+namespace ByReplace.Analyzers;
+
+internal sealed class DocumentFix
+{
+    private readonly AnalyzerAndFixer codeFixes;
+    private readonly IPrint print;
+
+    public DocumentFix(AnalyzerAndFixer codeFixes, IPrint print)
+    {
+        this.codeFixes = codeFixes;
+        this.print = print;
+    }
+
+    public ValueTask ApplyAsync(CancellationToken cancellationToken)
+    {
+        print.Information("Initializing fixing.");
+
+        return FindAndReplaceAsync(this.codeFixes, cancellationToken);
+    }
+
+    public ValueTask ApplyAsync(string rule, CancellationToken cancellationToken)
+    {
+        print.Information("Initializing fixing.");
+
+        AnalyzerAndFixer codeFixersFiltered = this.codeFixes.FindByRule(rule);
+
+        return FindAndReplaceAsync(codeFixersFiltered, cancellationToken);
+    }
+
+    private async ValueTask FindAndReplaceAsync(AnalyzerAndFixer codeFixes, CancellationToken cancellationToken)
+    {
+        foreach (KeyValuePair> codeFixe in codeFixes)
+        {
+            FileMapper file = codeFixe.Key;
+            List rules = codeFixe.Value;
+
+            print.Information($"Processing file [Cyan]{file.Name}");
+
+            int counter = 1;
+
+            foreach (var rule in rules)
+            {
+                print.Information($"Applying rule [Cyan]{rule.Name} {counter}/{rules.Count} on file [Cyan]{file.Name}.");
+
+                foreach (string removeTerm in rule.Replacement.Old)
+                {
+                    string fileContents = await File.ReadAllTextAsync(file.FullName, cancellationToken);
+                    fileContents = fileContents.Replace(removeTerm, rule.Replacement.New);
+                    await File.WriteAllTextAsync(file.FullName, fileContents, cancellationToken);
+                }
+
+                counter++;
+            }
+        }
+    }
+}
diff --git a/src/ByReplace/Builders/BrConfigurationBuilder.cs b/src/ByReplace/Builders/BrConfigurationBuilder.cs
new file mode 100644
index 0000000..406d642
--- /dev/null
+++ b/src/ByReplace/Builders/BrConfigurationBuilder.cs
@@ -0,0 +1,70 @@
+ο»Ώ[assembly: InternalsVisibleTo("ByReplace.Test")]
+
+namespace ByReplace.Builders;
+
+internal sealed class BrConfigurationBuilder
+{
+    private string _path;
+    private string _configFile;
+    private string _rule;
+
+    internal static BrConfigurationBuilder Create()
+    {
+        return new BrConfigurationBuilder();
+    }
+
+    internal BrConfigurationBuilder SetConfigPath(string configFile)
+    {
+        ArgumentNullException.ThrowIfNull(configFile);
+
+        _configFile = Sanitizer(configFile);
+
+        return this;
+    }
+
+    internal BrConfigurationBuilder SetPath(string path)
+    {
+        ArgumentNullException.ThrowIfNull(path);
+
+        _path = Sanitizer(path);
+
+        return this;
+    }
+
+    internal BrConfigurationBuilder SetRule(string rule)
+    {
+        ArgumentNullException.ThrowIfNull(rule);
+
+        _rule = Sanitizer(rule);
+
+        return this;
+    }
+
+    public BrConfiguration Build()
+    {
+        BrConfiguration configuration = BrConfiguration.GetConfiguration(_configFile);
+
+        if (!string.IsNullOrEmpty(_rule))
+        {
+            Rule rule = configuration
+                        .Rules
+                        .FirstOrDefault(r => r.Name.Equals(_rule, StringComparison.InvariantCultureIgnoreCase));
+
+            // dado um arquivo com vΓ‘rias regras, esse cΓ³digo vai fazer o usuΓ‘rio escolher apenas uma
+            // regra para ser aplicada individualmente.
+            configuration.SetOnlyOneRule(rule);
+        }
+
+        if (!string.IsNullOrEmpty(_path))
+        {
+            configuration.ChangeDefaultPath(_path);
+        }
+
+        return configuration;
+    }
+
+    private static string Sanitizer(string param)
+    {
+        return param.Trim();
+    }
+}
diff --git a/src/ByReplace/ByReplace.csproj b/src/ByReplace/ByReplace.csproj
new file mode 100644
index 0000000..bf9e274
--- /dev/null
+++ b/src/ByReplace/ByReplace.csproj
@@ -0,0 +1,70 @@
+ο»Ώ
+
+  
+    Exe
+    net8.0
+    enable
+    ByReplace
+    https://github.com/Daniel-iel/ByReplace
+    README.md
+    https://github.com/Daniel-iel/ByReplace
+    git
+    replace;automate;replace ci;replace cli;replace tool;bulk replace
+    True
+    False
+    LICENSE
+    $(MSBuildProjectName)
+    CLI to help developer to do bulk replace using shared configuration.
+    Daniel Oliveira
+    Daniel Oliveira
+    br
+    ./nupkg
+    true
+  
+
+  
+    7
+  
+
+  
+    7
+  
+
+  
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+      all
+      runtime; build; native; contentfiles; analyzers; buildtransitive
+    
+    
+    
+    
+    
+  
+
+  
+    
+      True
+      \
+    
+    
+      True
+      \
+    
+  
+
+  
+    
+      Always
+    
+  
+
+
diff --git a/src/ByReplace/Commands/Apply/Parameters/ApplyParameter.cs b/src/ByReplace/Commands/Apply/Parameters/ApplyParameter.cs
new file mode 100644
index 0000000..1b263a6
--- /dev/null
+++ b/src/ByReplace/Commands/Apply/Parameters/ApplyParameter.cs
@@ -0,0 +1,12 @@
+ο»Ώ[assembly: InternalsVisibleTo("ByReplace.Test")]
+
+namespace ByReplace.Commands.Apply.Parameters;
+
+internal record class ApplyParameter : ICommandParameterSet
+{
+    [Option(shortName: 'p', Description = "Path of the files to be applied to the rule.")]
+    public string Path { get; set; }
+
+    [Option(shortName: 'f', Description = "Path of the brconfig file.")]
+    public string ConfigFile { get; set; }
+}
diff --git a/src/ByReplace/Commands/Apply/Rule/ApplyRuleCommand.cs b/src/ByReplace/Commands/Apply/Rule/ApplyRuleCommand.cs
new file mode 100644
index 0000000..d4fe9fa
--- /dev/null
+++ b/src/ByReplace/Commands/Apply/Rule/ApplyRuleCommand.cs
@@ -0,0 +1,32 @@
+ο»Ώ[assembly: InternalsVisibleTo("ByReplace.Test")]
+
+namespace ByReplace.Commands.Apply.Rule;
+
+internal sealed class ApplyRuleCommand : ICommand
+{
+    private readonly BrConfiguration configuration;
+    private readonly ApplyRuleParameter applyRuleParameter;
+    private readonly IPrint print;
+
+    public ApplyRuleCommand(
+        BrConfiguration configuration,
+        ApplyRuleParameter applyRuleParameter,
+        IPrint print)
+    {
+        this.configuration = configuration;
+        this.applyRuleParameter = applyRuleParameter;
+        this.print = print;
+    }
+
+    public ValueTask ExecuteAsync(CancellationToken cancellationToken = default)
+    {
+        Analyzer analyser = new Analyzer(configuration, print);
+        ImmutableList three = analyser.LoadThreeFiles();
+
+        AnalyzerRunner analyzerRunner = new AnalyzerRunner(configuration, print);
+        AnalyzerAndFixer fixers = analyzerRunner.RunAnalysis(three, Analyses.Fix);
+
+        DocumentFix analyzerFix = new DocumentFix(fixers, print);
+        return analyzerFix.ApplyAsync(applyRuleParameter.Rule, cancellationToken);
+    }
+}
diff --git a/src/ByReplace/Commands/Apply/Rule/ApplyRuleParameter.cs b/src/ByReplace/Commands/Apply/Rule/ApplyRuleParameter.cs
new file mode 100644
index 0000000..61c7cc7
--- /dev/null
+++ b/src/ByReplace/Commands/Apply/Rule/ApplyRuleParameter.cs
@@ -0,0 +1,9 @@
+ο»Ώ[assembly: InternalsVisibleTo("ByReplace.Test")]
+
+namespace ByReplace.Commands.Apply.Rule;
+
+internal record class ApplyRuleParameter : ApplyParameter
+{
+    [Option(shortName: 'r', Description = "Rule name to be applied.")]
+    public string Rule { get; set; }
+}
diff --git a/src/ByReplace/Commands/Apply/Rules/ApplyRulesCommand.cs b/src/ByReplace/Commands/Apply/Rules/ApplyRulesCommand.cs
new file mode 100644
index 0000000..460a997
--- /dev/null
+++ b/src/ByReplace/Commands/Apply/Rules/ApplyRulesCommand.cs
@@ -0,0 +1,27 @@
+ο»Ώ[assembly: InternalsVisibleTo("ByReplace.Test")]
+
+namespace ByReplace.Commands.Apply.Rules;
+
+internal sealed class ApplyRulesCommand : ICommand
+{
+    private readonly BrConfiguration configuration;
+    private readonly IPrint print;
+
+    public ApplyRulesCommand(BrConfiguration configuration, IPrint print)
+    {
+        this.configuration = configuration;
+        this.print = print;
+    }
+
+    public ValueTask ExecuteAsync(CancellationToken cancellationToken = default)
+    {
+        Analyzer analyser = new Analyzer(configuration, print);
+        ImmutableList three = analyser.LoadThreeFiles();
+
+        AnalyzerRunner analyzerRunner = new AnalyzerRunner(configuration, print);
+        AnalyzerAndFixer fixers = analyzerRunner.RunAnalysis(three, Analyses.Fix);
+
+        DocumentFix analyzerFix = new DocumentFix(fixers, print);
+        return analyzerFix.ApplyAsync(cancellationToken);
+    }
+}
diff --git a/src/ByReplace/Commands/Command/CompositeCommand.cs b/src/ByReplace/Commands/Command/CompositeCommand.cs
new file mode 100644
index 0000000..ffa97c2
--- /dev/null
+++ b/src/ByReplace/Commands/Command/CompositeCommand.cs
@@ -0,0 +1,21 @@
+ο»Ώ[assembly: InternalsVisibleTo("ByReplace.Test")]
+
+namespace ByReplace.Commands.Command;
+
+internal sealed class CompositeCommand : ICommand
+{
+    private readonly ICommand[] commands;
+
+    public CompositeCommand(params ICommand[] commands)
+    {
+        this.commands = commands;
+    }
+
+    public async ValueTask ExecuteAsync(CancellationToken cancellationToken = default)
+    {
+        foreach (ICommand command in commands)
+        {
+            await command.ExecuteAsync(cancellationToken);
+        }
+    }
+}
diff --git a/src/ByReplace/Commands/Command/ICommand.cs b/src/ByReplace/Commands/Command/ICommand.cs
new file mode 100644
index 0000000..57c0609
--- /dev/null
+++ b/src/ByReplace/Commands/Command/ICommand.cs
@@ -0,0 +1,9 @@
+ο»Ώ[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
+[assembly: InternalsVisibleTo("ByReplace.Test")]
+
+namespace ByReplace.Commands.Command;
+
+internal interface ICommand
+{
+    public ValueTask ExecuteAsync(CancellationToken cancellationToken = default);
+}
diff --git a/src/ByReplace/Commands/Logo/PrintLogoCommand.cs b/src/ByReplace/Commands/Logo/PrintLogoCommand.cs
new file mode 100644
index 0000000..3fdb308
--- /dev/null
+++ b/src/ByReplace/Commands/Logo/PrintLogoCommand.cs
@@ -0,0 +1,44 @@
+ο»Ώ[assembly: InternalsVisibleTo("ByReplace.Test")]
+
+namespace ByReplace.Commands.Logo;
+
+internal sealed class PrintLogoCommand : ICommand
+{
+    private readonly IPrint _print;
+
+    public PrintLogoCommand(IPrint print)
+    {
+        _print = print;
+    }
+
+    public ValueTask ExecuteAsync(CancellationToken cancellationToken = default)
+    {
+        const string logoAscii = @"
+
+                ,ΒΏqβ–„β–„β–Œβ–ˆβ–ˆβ–“β–“β–“β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œβ–„,              ,,,,,ΒΏqβ–„β–„β–„β–„β–Œβ–Œβ–Œβ–Œβ–Œβ–Œβ–Œβ–Œβ–„β–„Β΅
+          ΒΏβ–„β–Œβ–ˆβ–“β–“β–“β–“β–“β–“β–ˆβ–ˆβ–ˆβ–ˆβ–’β–€β–€β–€β–€β–€β–€β–ˆβ–ˆβ–“β–“β–“β–ˆβ–ŒΒ΅          β•’β–ˆβ–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–“β–ˆβ–’β–’β–’β–ˆβ–ˆβ–“β–“β–“β–“β–“β–ˆβ–„
+       ΒΏβ–Œβ–“β–“β–“β–“β–“β–“β–“β–“β–€β–€β•™             Β²β–“β–“β–“β–“β–ˆ           β–€β–“β–“β–“β–“β–“β•œ             `β–€β–“β–“β–“β–“β–“Β΅
+       Γ‘β–’β–’β–ˆβ–“β–“β–“β–“β–“M                 β–ˆβ–“β–“β–“β–“M          ]β–“β–“β–“β–“                  Γ‘β–“β–“β–“β–“Β΅
+           β–ˆβ–ˆβ–“β–“β–Œ                 β–„β–“β–“β–“β–“β–€           β–ˆβ–“β–“β–“β–Œ                   β–“β–“β–“β–“&
+           β–ˆβ–ˆβ–“β–“&               ΒΏβ–ˆβ–“β–“β–“β–ˆ`           ]β–“β–“β–“β–“                   ]β–“β–“β–“β–“`
+          ]β–ˆβ–ˆβ–“β–“              β–„β–ˆβ–“β–“β–“β–’β•œ             Γ‘β–“β–“β–“β–Œ                  β–„β–ˆβ–“β–“β–“M
+          β–β–“β–“β–“β–Œ          ,qβ–Œβ–“β–“β–“β–“β–€`               β–“β–“β–“β–“M               ,β–„β–“β–“β–“β–“β–€
+          β–ˆβ–“β–“β–ˆM     ,ΒΏβ–„β–Œβ–ˆβ–ˆβ–ˆβ–“β–“β–“β–“β–ˆβ–„Β΅              ▐▓▓▓▓            ,ΒΏβ–„β–“β–“β–“β–“β–“β–€
+         ]β–ˆβ–“β–“β–ˆ    ]β–ˆβ–“β–“β–“β–“β–“β–ˆβ–’β–€β–’β–ˆβ–ˆβ–’β–“β–“β–’β–Œw           β–ˆβ–“β–“β–“β–Œ   Γ§β–„β–„β–„β–„Γ¦g#β–ˆβ–ˆβ–ˆβ–’β–“β–’β–€`
+         β–β–ˆβ–“β–“β–’     β•™β•¨β•¨β•œ`       `β–€β–’β–“β–“β–“β–ˆΒ΅         β–’β–“β–“β–“M  Γ‘β–“β–“β–“β–“β–“β–ˆβ–ˆβ–ˆβ–ˆβ–€β•œ`
+         β–ˆβ–ˆβ–ˆβ–ˆ&                    β–ˆβ–ˆβ–ˆβ–ˆβ–ˆ        ]β–ˆβ–’β–’β–ˆ    `β•™β•™β–€β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„
+        ]β–ˆβ–ˆβ–ˆβ–ˆ                     β–β–ˆβ–ˆβ–ˆβ–ˆΞ©       Γ‘β–’β–’β–’β–Œ         `β–€β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ŒΒ΅
+        β–β–ˆβ–ˆβ–ˆβ–Œ                     β–ˆβ–ˆβ–ˆβ–ˆβ–Œ        Γ‘β–Œβ–Œβ–Œβ–Œ            β•™β–€β–’β–’Γ…Γ‘β–Œβ–„Β΅
+        Γ‘β–’β–ˆβ–ˆβ–€                   ΒΏΓ‘β–ˆβ–ˆβ–’β–€         β–Œβ–€β–€Γ‘&               β•¨β–€β–€Γ‘β–€β–Œβ–Œβ–„Β΅
+       ]β–ŒΓ‘Γ‘Γ‘[                ,qβ–Œβ–„β–β–’β–’β•œ         ]β–Œβ–€β–€β–€&                 `╝ÑΓ₯β–€Γ‘β–ˆβ–’β–„Β΅
+       Γ‘β–Œβ–Œβ–Œβ–Œ[             ΒΏqβ–€β–Œβ–Œβ–Œβ–Œβ–Œβ”˜           ]β–€Γ‘β–€β–€&                    β•™β–€β–€β–€β–€β–Œβ–Œβ–Œ&Β΅
+       Γ‘β–‘β–€β–€β–€M   β•“β–„β–„#β•—Γ¦#β–€β–Œβ–’β–’β–€Γ‘β–€β–€β•¨               β–€Γ₯Γ₯Γ₯β–€                       β•™β–€β–€β–€β–€β–€β–Œ
+        ╨▀▀╨   β–€Γ‰β–‘β–€β–’@β–‘β–‘β–‘β–‘β–€β–Œβ–€β•™                  └▀▀╝`                          `β•™`
+
+";
+        _print.PureText(logoAscii);
+        //Console.WriteLine(logoAscii);
+
+        return ValueTask.CompletedTask;
+    }
+}
diff --git a/src/ByReplace/Commands/Rule/ListRules/ListRulesCommand.cs b/src/ByReplace/Commands/Rule/ListRules/ListRulesCommand.cs
new file mode 100644
index 0000000..a4e11cf
--- /dev/null
+++ b/src/ByReplace/Commands/Rule/ListRules/ListRulesCommand.cs
@@ -0,0 +1,22 @@
+ο»Ώnamespace ByReplace.Commands.Rule.ListRules;
+
+internal sealed class ListRulesCommand : ICommand
+{
+    private readonly BrConfiguration configuration;
+    private readonly IPrintBox printBox;
+
+    public ListRulesCommand(BrConfiguration configuration, IPrintBox printBox)
+    {
+        this.configuration = configuration;
+        this.printBox = printBox;
+    }
+
+    public ValueTask ExecuteAsync(CancellationToken cancellationToken = default)
+    {
+        RulesBox rulesBox = new RulesBox(configuration.Rules);
+
+        printBox.CreateBoxAndPrint(rulesBox);
+
+        return ValueTask.CompletedTask;
+    }
+}
diff --git a/src/ByReplace/Commands/Rule/ListRules/ListRulesParameter.cs b/src/ByReplace/Commands/Rule/ListRules/ListRulesParameter.cs
new file mode 100644
index 0000000..29a18ef
--- /dev/null
+++ b/src/ByReplace/Commands/Rule/ListRules/ListRulesParameter.cs
@@ -0,0 +1,7 @@
+ο»Ώnamespace ByReplace.Commands.Rule.ListRules;
+
+internal sealed class ListRulesParameter : ICommandParameterSet
+{
+    [Option(shortName: 'f', Description = "Path of the brconfig file.")]
+    public string ConfigFile { get; set; }
+}
diff --git a/src/ByReplace/Commands/Rule/ListRules/RulesBox.cs b/src/ByReplace/Commands/Rule/ListRules/RulesBox.cs
new file mode 100644
index 0000000..c715ae0
--- /dev/null
+++ b/src/ByReplace/Commands/Rule/ListRules/RulesBox.cs
@@ -0,0 +1,60 @@
+ο»Ώnamespace ByReplace.Commands.Rule.ListRules;
+
+internal sealed class RulesBox : IBox, IEquatable, IEqualityComparer
+{
+    private readonly ImmutableList _rules;
+
+    public RulesBox(ImmutableList rules)
+    {
+        this.Width = 100;
+        this.Height = rules.Count * 2;
+
+        _rules = rules;
+    }
+
+    public int Width { get; }
+    public int Height { get; }
+
+    public string BoxName => "Rules";
+
+    public string GetValuesToPrint()
+    {
+        StringBuilder rules = new StringBuilder(_rules.Count);
+
+        foreach (Models.Rule rule in _rules)
+        {
+            rules.AppendLine($"{rule.Name}: {rule.Description}");
+        }
+
+        return rules.ToString();
+    }
+
+    public bool Equals(RulesBox other)
+    {
+        return Width == other.Width &&
+               Height == other.Height &&
+               BoxName == other.BoxName;
+    }
+
+    public override bool Equals(object obj)
+    {
+        RulesBox other = (RulesBox)obj;
+
+        return other.Equals(this);
+    }
+
+    public bool Equals(RulesBox x, RulesBox y)
+    {
+        return x.Equals(y);
+    }
+
+    public override int GetHashCode()
+    {
+        return HashCode.Combine(Width, Height, BoxName);
+    }
+
+    public int GetHashCode([DisallowNull] RulesBox obj)
+    {
+        return HashCode.Combine(obj.Width, obj.Height, obj.BoxName);
+    }
+}
\ No newline at end of file
diff --git a/src/ByReplace/Commands/Rule/OpenRule/OpenRuleCommand.cs b/src/ByReplace/Commands/Rule/OpenRule/OpenRuleCommand.cs
new file mode 100644
index 0000000..4520bf0
--- /dev/null
+++ b/src/ByReplace/Commands/Rule/OpenRule/OpenRuleCommand.cs
@@ -0,0 +1,37 @@
+ο»Ώnamespace ByReplace.Commands.Rule.OpenRule;
+
+internal sealed class OpenRuleCommand : ICommand
+{
+    private readonly BrConfiguration configuration;
+    private readonly string ruleName;
+    private readonly IPrint print;
+    private readonly IPrintBox printBox;
+
+    public OpenRuleCommand(BrConfiguration configuration, string ruleName, IPrint print, IPrintBox printBox)
+    {
+        this.configuration = configuration;
+        this.ruleName = ruleName;
+        this.print = print;
+        this.printBox = printBox;
+    }
+
+    public ValueTask ExecuteAsync(CancellationToken cancellationToken = default)
+    {
+        Models.Rule rule = configuration
+            .Rules
+            .FirstOrDefault(c => c.Name.Equals(ruleName.Trim(), StringComparison.CurrentCultureIgnoreCase));
+
+        if (rule is null)
+        {
+            print.Warning($"Rule named {ruleName} was not found on brconfig file");
+
+            return ValueTask.CompletedTask;
+        }
+
+        RuleBox builder = new RuleBox(rule);
+
+        printBox.CreateBoxAndPrint(builder);
+
+        return ValueTask.CompletedTask;
+    }
+}
diff --git a/src/ByReplace/Commands/Rule/OpenRule/OpenRuleParameter.cs b/src/ByReplace/Commands/Rule/OpenRule/OpenRuleParameter.cs
new file mode 100644
index 0000000..7bc5e0e
--- /dev/null
+++ b/src/ByReplace/Commands/Rule/OpenRule/OpenRuleParameter.cs
@@ -0,0 +1,10 @@
+ο»Ώnamespace ByReplace.Commands.Rule.OpenRule;
+
+internal sealed class OpenRuleParameter : ICommandParameterSet
+{
+    [Option(shortName: 'n', Description = "Rule's name")]
+    public string Name { get; set; }
+
+    [Option(shortName: 'f', Description = "Path of the brconfig file.")]
+    public string ConfigFile { get; set; }
+}
diff --git a/src/ByReplace/Commands/Rule/OpenRule/RuleBox.cs b/src/ByReplace/Commands/Rule/OpenRule/RuleBox.cs
new file mode 100644
index 0000000..7cae351
--- /dev/null
+++ b/src/ByReplace/Commands/Rule/OpenRule/RuleBox.cs
@@ -0,0 +1,64 @@
+ο»Ώnamespace ByReplace.Commands.Rule.OpenRule;
+
+internal sealed class RuleBox : IBox, IEquatable, IEqualityComparer
+{
+    private readonly Models.Rule _rule;
+
+    public RuleBox(Models.Rule rule)
+    {
+        _rule = rule;
+
+        BoxName = "Rule";
+        Width = 100;
+        Height = 5 * 2;
+    }
+
+    public string BoxName { get; }
+
+    public int Width { get; }
+
+    public int Height { get; }
+
+    public string GetValuesToPrint()
+    {
+        StringBuilder sb = new StringBuilder(5);
+
+        sb.AppendLine($"Name: {_rule.Name}");
+        sb.AppendLine($"Description: {_rule.Description}");
+        sb.AppendLine($"Skip: [ {_rule.Skip.Aggregate((a, b) => $"{a}, {b}")} ]");
+        sb.AppendLine($"Extensions: [ {_rule.Extensions.Aggregate((a, b) => $"{a}, {b}")} ]");
+        sb.AppendLine($"Replacement: FROM [ {_rule.Replacement.Old.Aggregate((a, b) => $"{a}, {b}")} ] To [ {_rule.Replacement.New} ]");
+
+        return sb.ToString();
+    }
+
+    public bool Equals(RuleBox other)
+    {
+        return Width == other.Width &&
+               Height == other.Height &&
+               BoxName == other.BoxName &&
+               _rule == other._rule;
+    }
+
+    public override bool Equals(object obj)
+    {
+        RuleBox other = (RuleBox)obj;
+
+        return other.Equals(this);
+    }
+
+    public bool Equals(RuleBox x, RuleBox y)
+    {
+        return x.Equals(y);
+    }
+
+    public override int GetHashCode()
+    {
+        return HashCode.Combine(Width, Height, BoxName, _rule);
+    }
+
+    public int GetHashCode([DisallowNull] RuleBox obj)
+    {
+        return HashCode.Combine(obj.Width, obj.Height, obj.BoxName, obj._rule);
+    }
+}
\ No newline at end of file
diff --git a/src/ByReplace/Commands/TimerFinish/TimerFinishCommand.cs b/src/ByReplace/Commands/TimerFinish/TimerFinishCommand.cs
new file mode 100644
index 0000000..4275928
--- /dev/null
+++ b/src/ByReplace/Commands/TimerFinish/TimerFinishCommand.cs
@@ -0,0 +1,18 @@
+ο»Ώnamespace ByReplace.Commands.TimerFinish;
+
+internal sealed class TimerFinishCommand : ICommand
+{
+    private readonly IPrint print;
+
+    public TimerFinishCommand(IPrint print)
+    {
+        this.print = print;
+    }
+
+    public ValueTask ExecuteAsync(CancellationToken cancellationToken = default)
+    {
+        print.Timer();
+
+        return ValueTask.CompletedTask;
+    }
+}
diff --git a/src/ByReplace/Commands/Version/NugetVersion.cs b/src/ByReplace/Commands/Version/NugetVersion.cs
new file mode 100644
index 0000000..14f9b52
--- /dev/null
+++ b/src/ByReplace/Commands/Version/NugetVersion.cs
@@ -0,0 +1,70 @@
+ο»Ώ// Ignore Spelling: Nuget
+
+using NuGet.Configuration;
+using System.Reflection;
+namespace ByReplace.Commands.Version;
+
+internal interface INugetVersion
+{
+    Task GetByReplaceNugetVersionAsync(CancellationToken cancellationToken);
+}
+
+internal sealed class NugetVersion : INugetVersion
+{
+    private readonly SourceRepository _sourceRepository;
+    private readonly SourceCacheContext _sourceCacheContext;
+    private readonly IPrint _printConsole;
+
+    public NugetVersion(IPrint print)
+    {
+        _printConsole = print;
+        _sourceRepository = Repository.Factory.GetCoreV3(new PackageSource(NuGetConstants.V3FeedUrl));
+        _sourceCacheContext = new SourceCacheContext();
+    }
+
+    public async Task GetByReplaceNugetVersionAsync(CancellationToken cancellationToken)
+    {
+        Assembly assembly = Assembly.GetExecutingAssembly();
+        string version = assembly.GetCustomAttribute()?.InformationalVersion;
+
+        SemanticVersion.TryParse(version, out SemanticVersion currentVersion);
+
+        _printConsole.Information($"Version: [Green]{currentVersion}.");
+
+        SemanticVersion latestVersion = await GetVersionAsync(preRelease: false, cancellationToken);
+        if (latestVersion > currentVersion)
+        {
+            _printConsole.Information($"A new version of ByReplace [Yellow]({latestVersion}) is available. Please consider upgrading using the command `dotnet tool update -g ByReplace`");
+        }
+        else
+        {
+            SemanticVersion previewVersion = await GetVersionAsync(preRelease: true, cancellationToken);
+            if (previewVersion > currentVersion)
+            {
+                _printConsole.Information($@"A preview version of ByReplace [Yellow]({previewVersion}) is available on nuget.
+If you would like to try out this preview version you can install it with `dotnet tool update -g ByReplace --version {previewVersion}`
+Since this is a preview feature things might not work as expected! Please report any findings on GitHub![/]");
+            }
+        }
+
+        return currentVersion.ToString();
+    }
+
+    private async Task GetVersionAsync(bool preRelease, CancellationToken cancellationToken)
+    {
+        try
+        {
+            MetadataResource metadataResource = await _sourceRepository.GetResourceAsync(cancellationToken);
+            IEnumerable versionsFound = await metadataResource
+                 .GetVersions("ByReplace", includePrerelease: true, includeUnlisted: false, _sourceCacheContext, null, cancellationToken);
+
+            return versionsFound
+                 .OrderBy(x => x)
+                 .Last(x => preRelease ? x.IsPrerelease : !x.IsPrerelease);
+        }
+        catch (Exception)
+        {
+            return new SemanticVersion(0, 0, 0);
+        }
+    }
+}
diff --git a/src/ByReplace/Commands/Version/VersionCommand.cs b/src/ByReplace/Commands/Version/VersionCommand.cs
new file mode 100644
index 0000000..fa850ab
--- /dev/null
+++ b/src/ByReplace/Commands/Version/VersionCommand.cs
@@ -0,0 +1,18 @@
+ο»Ώ// Ignore Spelling: nuget
+
+namespace ByReplace.Commands.Version;
+
+internal sealed class VersionCommand : ICommand
+{
+    private readonly INugetVersion _nugetVersion;
+
+    public VersionCommand(INugetVersion nugetVersion)
+    {
+        _nugetVersion = nugetVersion;
+    }
+
+    public async ValueTask ExecuteAsync(CancellationToken cancellationToken)
+    {
+        await _nugetVersion.GetByReplaceNugetVersionAsync(cancellationToken);
+    }
+}
diff --git a/src/ByReplace/Common/PathFixer.cs b/src/ByReplace/Common/PathFixer.cs
new file mode 100644
index 0000000..14c44d7
--- /dev/null
+++ b/src/ByReplace/Common/PathFixer.cs
@@ -0,0 +1,49 @@
+ο»Ώusing System.Runtime.InteropServices;
+
+namespace ByReplace.Common;
+
+internal class PathFixer
+{
+    public string OS
+    {
+        get
+        {
+            return Environment.OSVersion.ToString();
+        }
+    }
+
+    public string GetFixedPath(params string[] parts)
+    {
+        IPathFixer linux = new PathFixerLinux();
+        IPathFixer windows = new PathFixerLinux();
+
+        return RuntimeInformation.IsOSPlatform(OSPlatform.Linux)
+            ? linux.PathFixed(parts)
+            : windows.PathFixed(parts);
+    }
+}
+
+internal interface IPathFixer
+{
+    string PathFixed(params string[] parts);
+}
+
+internal class PathFixerWindowns : IPathFixer
+{
+    public string PathFixed(params string[] parts)
+    {
+        return string
+            .Join('\\', parts)
+            .Trim();
+    }
+}
+
+internal class PathFixerLinux : IPathFixer
+{
+    public string PathFixed(params string[] parts)
+    {
+        return string
+            .Join('/', parts)
+            .Trim();
+    }
+}
\ No newline at end of file
diff --git a/src/ByReplace/Exceptions/GlobalHandleException.cs b/src/ByReplace/Exceptions/GlobalHandleException.cs
new file mode 100644
index 0000000..1e4d1b3
--- /dev/null
+++ b/src/ByReplace/Exceptions/GlobalHandleException.cs
@@ -0,0 +1,38 @@
+ο»Ώusing Cocona.Filters;
+
+namespace ByReplace.Exceptions;
+
+[ExcludeFromCodeCoverage]
+internal sealed class GlobalHandleExceptionAttribute : CommandFilterAttribute
+{
+    readonly IPrint print = new PrintConsole();
+
+    private readonly Dictionary> handles;
+
+    public GlobalHandleExceptionAttribute()
+    {
+        handles = new Dictionary>
+        {
+            { typeof(NotFoundException), NotFoundHandle }
+        };
+    }
+
+    private void NotFoundHandle(Exception ex)
+    {
+        print.Warning(ex.Message);
+    }
+
+    public override async ValueTask OnCommandExecutionAsync(CoconaCommandExecutingContext ctx, CommandExecutionDelegate next)
+    {
+        try
+        {
+            return await next(ctx);
+        }
+        catch (Exception ex)
+        {
+            handles[typeof(NotFoundException)].Invoke(ex);
+
+            return 1;
+        }
+    }
+}
diff --git a/src/ByReplace/Exceptions/NotFoundException.cs b/src/ByReplace/Exceptions/NotFoundException.cs
new file mode 100644
index 0000000..5c82bcc
--- /dev/null
+++ b/src/ByReplace/Exceptions/NotFoundException.cs
@@ -0,0 +1,15 @@
+ο»Ώnamespace ByReplace.Exceptions;
+
+[ExcludeFromCodeCoverage]
+internal abstract class NotFoundException : Exception
+{
+    protected NotFoundException() { }
+
+    protected NotFoundException(string message) : base(message)
+    {
+    }
+
+    protected NotFoundException(string message, Exception innerException) : base(message, innerException)
+    {
+    }
+}
diff --git a/src/ByReplace/Exceptions/RuleNotFoundException.cs b/src/ByReplace/Exceptions/RuleNotFoundException.cs
new file mode 100644
index 0000000..d65069b
--- /dev/null
+++ b/src/ByReplace/Exceptions/RuleNotFoundException.cs
@@ -0,0 +1,27 @@
+ο»Ώnamespace ByReplace.Exceptions;
+
+[ExcludeFromCodeCoverage]
+internal sealed class RuleNotFoundException : NotFoundException
+{
+    public RuleNotFoundException() : base() { }
+
+    public RuleNotFoundException(string message) : base(message)
+    {
+    }
+
+    public RuleNotFoundException(string message, Exception innerException) : base(message, innerException)
+    {
+    }
+
+    public static void ThrowIfNull([NotNull] object argument, [CallerArgumentExpression("argument")] string paramName = null)
+    {
+        if (argument is null)
+        {
+            Throw(paramName);
+        }
+    }
+
+    [DoesNotReturn]
+    private static void Throw(string paramName)
+        => throw new RuleNotFoundException(paramName);
+}
diff --git a/src/ByReplace/GlobalUsings.cs b/src/ByReplace/GlobalUsings.cs
new file mode 100644
index 0000000..7667cce
--- /dev/null
+++ b/src/ByReplace/GlobalUsings.cs
@@ -0,0 +1,25 @@
+global using ByReplace.Analyzers;
+global using ByReplace.Commands.Apply.Parameters;
+global using ByReplace.Commands.Apply.Rule;
+global using ByReplace.Commands.Command;
+global using ByReplace.Commands.Logo;
+global using ByReplace.Commands.Version;
+global using ByReplace.Exceptions;
+global using ByReplace.Mappers;
+global using ByReplace.Matches;
+global using ByReplace.Models;
+global using ByReplace.Printers;
+global using Cocona;
+global using Konsole;
+global using Microsoft.Extensions.DependencyInjection;
+global using MoreLinq.Extensions;
+global using NuGet.Protocol;
+global using NuGet.Protocol.Core.Types;
+global using NuGet.Versioning;
+global using System.Collections.Immutable;
+global using System.Diagnostics;
+global using System.Diagnostics.CodeAnalysis;
+global using System.Runtime.CompilerServices;
+global using System.Text;
+global using System.Text.Json;
+global using static ByReplace.Mappers.DirectoryThree;
diff --git a/src/ByReplace/Mappers/DirectoryThree.cs b/src/ByReplace/Mappers/DirectoryThree.cs
new file mode 100644
index 0000000..a62350c
--- /dev/null
+++ b/src/ByReplace/Mappers/DirectoryThree.cs
@@ -0,0 +1,59 @@
+ο»Ώnamespace ByReplace.Mappers;
+
+public class DirectoryThree
+{
+    private readonly IPrint _printer;
+
+    public DirectoryThree(IPrint print)
+    {
+        _printer = print;
+    }
+
+    public record struct DirectoryNode(
+        string Directory,
+        string Path,
+        string Parent,
+        ImmutableList Files
+    );
+
+    public ImmutableList Nodes { get; private set; }
+
+    public ImmutableList MapThreeSources(string path)
+    {
+        List nodes = new List();
+
+        MapThreeSubFolders(path, ref nodes);
+
+        Nodes = nodes
+            .OrderBy(c => c.Directory)
+            .ToImmutableList();
+
+        return Nodes;
+    }
+
+    private void MapThreeSubFolders(string dir, ref List nodes)
+    {
+        DirectoryInfo directoryInfo = new DirectoryInfo(dir);
+
+        DirectoryNode node = new DirectoryNode(
+            Directory: directoryInfo.FullName,
+            Path: directoryInfo.Name,
+            Parent: directoryInfo!.Parent!.Name,
+            Files: directoryInfo
+                  .GetFiles()
+                  .Select(file => new FileMapper(Guid.NewGuid(), file.Name, file.FullName, file.Extension))
+                  .OrderBy(file => file.Name)
+                  .ToImmutableList()
+           );
+
+        _printer.Information($"Found [Cyan]{node.Files.Count} files on folder [Cyan]{node.Directory}.");
+
+        nodes.Add(node);
+
+        // SubFolders
+        foreach (string subDirectory in Directory.GetDirectories(dir))
+        {
+            MapThreeSubFolders(subDirectory, ref nodes);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/ByReplace/Mappers/FileMapper.cs b/src/ByReplace/Mappers/FileMapper.cs
new file mode 100644
index 0000000..bfb4d78
--- /dev/null
+++ b/src/ByReplace/Mappers/FileMapper.cs
@@ -0,0 +1,4 @@
+ο»Ώnamespace ByReplace.Mappers;
+
+[ExcludeFromCodeCoverage]
+public record struct FileMapper(Guid id, string Name, string FullName, string Extension);
\ No newline at end of file
diff --git a/src/ByReplace/Matches/ExtensionMatch.cs b/src/ByReplace/Matches/ExtensionMatch.cs
new file mode 100644
index 0000000..1604bcb
--- /dev/null
+++ b/src/ByReplace/Matches/ExtensionMatch.cs
@@ -0,0 +1,16 @@
+ο»Ώ
+namespace ByReplace.Matches;
+
+internal sealed class ExtensionMatch : Match
+{
+    private readonly string extension;
+    private readonly string[] param;
+
+    public ExtensionMatch(string extension, string[] param)
+    {
+        this.extension = extension;
+        this.param = param;
+    }
+    public override bool HasMatch
+        => param.Contains(extension);
+}
diff --git a/src/ByReplace/Matches/Match.cs b/src/ByReplace/Matches/Match.cs
new file mode 100644
index 0000000..721781e
--- /dev/null
+++ b/src/ByReplace/Matches/Match.cs
@@ -0,0 +1,6 @@
+ο»Ώnamespace ByReplace.Matches;
+
+internal abstract class Match
+{
+    public abstract bool HasMatch { get; }
+}
diff --git a/src/ByReplace/Matches/SkipMatch.cs b/src/ByReplace/Matches/SkipMatch.cs
new file mode 100644
index 0000000..d03da20
--- /dev/null
+++ b/src/ByReplace/Matches/SkipMatch.cs
@@ -0,0 +1,68 @@
+ο»Ώnamespace ByReplace.Matches;
+
+internal sealed class SkipMatch : Match
+{
+    private readonly string dir;
+    private readonly FileMapper file;
+    private readonly string[] param;
+
+    public SkipMatch(string dir, FileMapper file, string[] param)
+    {
+        this.dir = dir;
+        this.file = file;
+        this.param = param;
+    }
+
+    public override bool HasMatch
+    {
+        get
+        {
+            return SkipFile() || (SkipDir() || SkipDirWithFile());
+        }
+    }
+
+    private bool SkipFile()
+    {
+        return param.Any(c => c.EndsWith(file.Name, StringComparison.InvariantCultureIgnoreCase));
+    }
+
+    private bool SkipDirWithFile()
+    {
+        return param.Any(c => file.FullName.EndsWith(c, StringComparison.InvariantCultureIgnoreCase));
+    }
+
+    private bool SkipDir()
+    {
+        return param.Any(c =>
+                c.StartsWith("**", StringComparison.Ordinal) &&
+                c.EndsWith("*", StringComparison.Ordinal) &&
+                 dir.Contains(SanitizePattern(c), StringComparison.InvariantCultureIgnoreCase));
+    }
+
+    [MethodImpl(MethodImplOptions.AggressiveOptimization)]
+    private static unsafe string SanitizePattern(string pattern)
+    {
+        int maxBufferSize = pattern.Length;
+        char* buffer = stackalloc char[maxBufferSize];
+        int index = 0;
+
+        foreach (char c in pattern)
+        {
+            if (c is not '*' and not '\\' and not '/')
+            {
+                if (index < maxBufferSize - 1)
+                {
+                    buffer[index++] = c;
+                }
+                else
+                {
+                    break;
+                }
+            }
+        }
+
+        buffer[index] = '\0';
+
+        return new string(buffer);
+    }
+}
diff --git a/src/ByReplace/Models/BrConfiguration.cs b/src/ByReplace/Models/BrConfiguration.cs
new file mode 100644
index 0000000..0dbcdaa
--- /dev/null
+++ b/src/ByReplace/Models/BrConfiguration.cs
@@ -0,0 +1,55 @@
+ο»Ώusing ByReplace.Common;
+
+[assembly: InternalsVisibleTo("ByReplace.Test")]
+
+namespace ByReplace.Models;
+
+internal sealed class BrConfiguration
+{
+    public BrConfiguration(string path, string[] skipDirectories, ImmutableList rules)
+    {
+        this.Path = path;
+        this.SkipDirectories = skipDirectories;
+        this.Rules = rules;
+    }
+
+    public string Path { get; private set; }
+    public string[] SkipDirectories { get; }
+    public ImmutableList Rules { get; private set; }
+
+    public void SetOnlyOneRule(Rule rule)
+    {
+        Rules = ImmutableList.Create(rule);
+    }
+
+    public void ChangeDefaultPath(string path)
+    {
+        string sanitizedPath = Sanitizer(path);
+
+        if (!Directory.Exists(sanitizedPath))
+        {
+            throw new DirectoryNotFoundException($"Path {sanitizedPath} does not exists.");
+        }
+
+        Path = Sanitizer(sanitizedPath);
+    }
+
+    public static BrConfiguration GetConfiguration(string pathConfig)
+    {
+        PathFixer path = new PathFixer();
+
+        string configurationFilePath = path.GetFixedPath(pathConfig, "brconfig.json");
+
+        if (!File.Exists(configurationFilePath))
+        {
+            throw new FileNotFoundException($"BR Configuration not found on {pathConfig} path.");
+        }
+
+        return JsonSerializer.Deserialize(File.ReadAllText(configurationFilePath, Encoding.UTF8));
+    }
+
+    private static string Sanitizer(string param)
+    {
+        return param.Trim();
+    }
+}
diff --git a/src/ByReplace/Models/Replacement.cs b/src/ByReplace/Models/Replacement.cs
new file mode 100644
index 0000000..6cdbe7a
--- /dev/null
+++ b/src/ByReplace/Models/Replacement.cs
@@ -0,0 +1,4 @@
+ο»Ώnamespace ByReplace.Models;
+
+[ExcludeFromCodeCoverage]
+internal record class Replacement(string[] Old, string New);
diff --git a/src/ByReplace/Models/Rule.cs b/src/ByReplace/Models/Rule.cs
new file mode 100644
index 0000000..264d9cb
--- /dev/null
+++ b/src/ByReplace/Models/Rule.cs
@@ -0,0 +1,8 @@
+ο»Ώnamespace ByReplace.Models;
+
+internal record class Rule(
+    string Name,
+    string Description,
+    string[] Skip,
+    string[] Extensions,
+    Replacement Replacement);
diff --git a/src/ByReplace/Printers/IBox.cs b/src/ByReplace/Printers/IBox.cs
new file mode 100644
index 0000000..1c5d160
--- /dev/null
+++ b/src/ByReplace/Printers/IBox.cs
@@ -0,0 +1,10 @@
+ο»Ώnamespace ByReplace.Printers;
+
+internal interface IBox
+{
+    string BoxName { get; }
+    int Width { get; }
+    int Height { get; }
+
+    string GetValuesToPrint();
+}
diff --git a/src/ByReplace/Printers/IPrint.cs b/src/ByReplace/Printers/IPrint.cs
new file mode 100644
index 0000000..85a772f
--- /dev/null
+++ b/src/ByReplace/Printers/IPrint.cs
@@ -0,0 +1,12 @@
+ο»Ώnamespace ByReplace.Printers;
+
+public interface IPrint
+{
+    void PureText(string text);
+    void Information(string text);
+    void Timer();
+    void Warning(string text);
+    void Error(string text);
+    public void DrawBox(string boxName);
+    public void Box(string text);
+}
diff --git a/src/ByReplace/Printers/IPrintBox.cs b/src/ByReplace/Printers/IPrintBox.cs
new file mode 100644
index 0000000..1b08096
--- /dev/null
+++ b/src/ByReplace/Printers/IPrintBox.cs
@@ -0,0 +1,6 @@
+ο»Ώnamespace ByReplace.Printers;
+
+interface IPrintBox
+{
+    void CreateBoxAndPrint(IBox printBoxBuilder);
+}
\ No newline at end of file
diff --git a/src/ByReplace/Printers/PrintBox.cs b/src/ByReplace/Printers/PrintBox.cs
new file mode 100644
index 0000000..9a94d6e
--- /dev/null
+++ b/src/ByReplace/Printers/PrintBox.cs
@@ -0,0 +1,34 @@
+ο»Ώnamespace ByReplace.Printers;
+
+[ExcludeFromCodeCoverage]
+internal sealed class PrintBox : IPrintBox
+{
+    private IConsole consoleBox;
+
+    public void CreateBox(string boxName)
+    {
+        CreateBox(boxName, 100, 15);
+    }
+
+    public void CreateBox(string boxName, int with)
+    {
+        CreateBox(boxName, with, 15);
+    }
+
+    public void CreateBox(string boxName, int with, int height)
+    {
+        consoleBox = Window.OpenBox(boxName, with, height);
+    }
+
+    public void Print(string text)
+    {
+        consoleBox.WriteLine(text);
+    }
+
+    public void CreateBoxAndPrint(IBox printBoxBuilder)
+    {
+        PrintBox printer = new PrintBox();
+        printer.CreateBox(printBoxBuilder.BoxName, printBoxBuilder.Width, printBoxBuilder.Height);
+        printer.Print(printBoxBuilder.GetValuesToPrint());
+    }
+}
diff --git a/src/ByReplace/Printers/PrintConsole.cs b/src/ByReplace/Printers/PrintConsole.cs
new file mode 100644
index 0000000..feed24a
--- /dev/null
+++ b/src/ByReplace/Printers/PrintConsole.cs
@@ -0,0 +1,54 @@
+ο»Ώnamespace ByReplace.Printers;
+
+[ExcludeFromCodeCoverage]
+internal sealed class PrintConsole : IPrint
+{
+    readonly Stopwatch timer;
+    readonly PrinterKonsole printerKonsole;
+
+    public PrintConsole()
+    {
+        printerKonsole = new PrinterKonsole();
+        timer = new Stopwatch();
+        timer.Start();
+    }
+    public void PureText(string text)
+    {
+        printerKonsole.PrintColorText($"{text}");
+    }
+
+    public void Information(string text)
+    {
+        printerKonsole.PrintColorText($"[{GetTimeElapsedText()} INF] {text}");
+    }
+
+    public void Timer()
+    {
+        printerKonsole.PrintColorText($"[{GetTimeElapsedText()} INF] [Green]{timer.Elapsed.Duration().ToString()}");
+    }
+
+    public void Warning(string text)
+    {
+        printerKonsole.PrintColorText($"[{GetTimeElapsedText()} [Yellow]WRN] {text}");
+    }
+
+    public void Error(string text)
+    {
+        printerKonsole.PrintColorText($"[{GetTimeElapsedText()} [Red]ERR] {text}");
+    }
+
+    public void DrawBox(string boxName)
+    {
+        printerKonsole.DrawBox(boxName);
+    }
+
+    public void Box(string text)
+    {
+        printerKonsole.PrintToBox(text);
+    }
+
+    private string GetTimeElapsedText()
+    {
+        return $"{timer.Elapsed.ToString(@"mm\:ss\.fff")}";
+    }
+}
\ No newline at end of file
diff --git a/src/ByReplace/Printers/PrinterKonsole.cs b/src/ByReplace/Printers/PrinterKonsole.cs
new file mode 100644
index 0000000..aab7663
--- /dev/null
+++ b/src/ByReplace/Printers/PrinterKonsole.cs
@@ -0,0 +1,84 @@
+ο»Ώ// Ignore Spelling: Konsole
+
+using NoAlloq;
+
+namespace ByReplace.Printers;
+
+[ExcludeFromCodeCoverage]
+internal sealed class PrinterKonsole
+{
+    readonly ConcurrentWriter console;
+    IConsole consoleBox;
+
+    public PrinterKonsole()
+    {
+        console = new ConcurrentWriter();
+    }
+
+    public void PrintColorText(string text)
+    {
+        ReadOnlySpan textParts = new ReadOnlySpan(text.Split(" "));
+
+        bool shouldPrintColourText = textParts.Any(ShouldColourPredicate);
+        if (!shouldPrintColourText)
+        {
+            Print(text);
+            return;
+        }
+
+        foreach (ref readonly string textPart in textParts)
+        {
+            if (textPart.StartsWith("[Green]"))
+            {
+                console.Write(ConsoleColor.Green, $" {textPart.Replace("[Green]", "")}");
+                continue;
+            }
+
+            if (textPart.StartsWith("[Yellow]"))
+            {
+                console.Write(ConsoleColor.Yellow, $" {textPart.Replace("[Yellow]", "")}");
+                continue;
+            }
+
+            if (textPart.StartsWith("[Red]"))
+            {
+                console.Write(ConsoleColor.Red, $" {textPart.Replace("[Red]", "")}");
+                continue;
+            }
+
+            if (textPart.StartsWith("[Cyan]"))
+            {
+                console.Write(ConsoleColor.Cyan, $" {textPart.Replace("[Cyan]", "")}");
+                continue;
+            }
+
+            console.Write($" {textPart}");
+        }
+
+        console.WriteLine("");
+    }
+
+    public void Print(string text)
+    {
+        console.Write($" {text}");
+        console.WriteLine("");
+    }
+
+    public void DrawBox(string boxName)
+    {
+        consoleBox = console.SplitLeft(boxName);
+    }
+
+    public void PrintToBox(string text)
+    {
+        consoleBox.WriteLine(text);
+    }
+
+    private bool ShouldColourPredicate(string text)
+    {
+        return text.StartsWith("[Green]", StringComparison.InvariantCultureIgnoreCase) ||
+               text.StartsWith("[Yellow]", StringComparison.InvariantCultureIgnoreCase) ||
+               text.StartsWith("[Red]", StringComparison.InvariantCultureIgnoreCase) ||
+               text.StartsWith("[Cyan]", StringComparison.InvariantCultureIgnoreCase);
+    }
+}
\ No newline at end of file
diff --git a/src/ByReplace/Program.cs b/src/ByReplace/Program.cs
new file mode 100644
index 0000000..11ae69c
--- /dev/null
+++ b/src/ByReplace/Program.cs
@@ -0,0 +1,134 @@
+ο»Ώusing ByReplace.Builders;
+using ByReplace.Commands.Apply.Rules;
+using ByReplace.Commands.Rule.ListRules;
+using ByReplace.Commands.Rule.OpenRule;
+using ByReplace.Commands.TimerFinish;
+using Cocona.Builder;
+
+#if DEBUG
+CoconaAppBuilder builder = CoconaApp.CreateBuilder(
+    new[]
+    {
+            "apply",
+            "rules",
+            @"-p C:\Projetos\Daniel-iel\ByReplace\samples",
+            @"-f C:\Projetos\Daniel-iel\ByReplace\src\ByReplace"
+    });
+#else
+    CoconaAppBuilder builder = CoconaApp.CreateBuilder();
+#endif
+
+builder.Services.AddScoped();
+builder.Services.AddScoped();
+builder.Services.AddScoped();
+
+CoconaApp app = builder.Build();
+
+app.UseFilter(new GlobalHandleExceptionAttribute());
+
+#region .: Apply :.
+app
+    .AddSubCommand("apply", apply =>
+    {
+        apply.AddCommand("rule", async (ApplyRuleParameter applyRuleParameters, IPrint print, INugetVersion nugetVersion) =>
+        {
+            CancellationTokenSource source = new CancellationTokenSource();
+            CancellationToken token = source.Token;
+
+            BrConfiguration configuration = BrConfigurationBuilder
+                .Create()
+                .SetRule(applyRuleParameters.Rule)
+                .SetPath(applyRuleParameters.Path)
+                .SetConfigPath(applyRuleParameters.ConfigFile)
+                .Build();
+
+            CompositeCommand compositeCommand = new CompositeCommand(new ICommand[]
+            {
+                new PrintLogoCommand(print),
+                new VersionCommand(nugetVersion),
+                new ApplyRuleCommand(configuration, applyRuleParameters, print),
+                new TimerFinishCommand(print)
+            });
+
+            await compositeCommand.ExecuteAsync(token);
+        });
+
+        apply.AddCommand("rules", async (ApplyParameter applyParameters, IPrint print, INugetVersion nugetVersion) =>
+        {
+            CancellationTokenSource source = new CancellationTokenSource();
+            CancellationToken token = source.Token;
+
+            BrConfiguration configuration = BrConfigurationBuilder
+               .Create()
+               .SetPath(applyParameters.Path)
+               .SetConfigPath(applyParameters.ConfigFile)
+               .Build();
+
+            CompositeCommand compositeCommand = new CompositeCommand(new ICommand[]
+            {
+                new PrintLogoCommand(print),
+                new VersionCommand(nugetVersion),
+                new ApplyRulesCommand(configuration, print),
+                new TimerFinishCommand(print)
+            });
+
+            await compositeCommand.ExecuteAsync(token);
+        });
+    })
+    .WithDescription("apply commands");
+#endregion
+
+#region .: Rule :.
+app
+    .AddSubCommand("rule", rule =>
+    {
+        rule.AddCommand("list-rules", async (ListRulesParameter listRulesParameter, IPrint print, IPrintBox printBox, INugetVersion nugetVersion) =>
+        {
+            //Print all rule's names from config file
+            CancellationTokenSource source = new CancellationTokenSource();
+            CancellationToken token = source.Token;
+
+            BrConfiguration configuration = BrConfigurationBuilder
+             .Create()
+             .SetConfigPath(listRulesParameter.ConfigFile)
+             .Build();
+
+            CompositeCommand compositeCommand = new CompositeCommand(new ICommand[]
+            {
+                new PrintLogoCommand(print),
+                new VersionCommand(nugetVersion),
+                new ListRulesCommand(configuration, printBox),
+                new TimerFinishCommand(print)
+            });
+
+            await compositeCommand.ExecuteAsync(token);
+        });
+
+        rule.AddCommand("open-rule", async (OpenRuleParameter openRuleParameter, IPrint print, IPrintBox printBox, INugetVersion nugetVersion) =>
+        {
+            //Print rule in config file
+            CancellationTokenSource source = new CancellationTokenSource();
+            CancellationToken token = source.Token;
+
+            BrConfiguration configuration = BrConfigurationBuilder
+             .Create()
+             .SetConfigPath(openRuleParameter.ConfigFile)
+             .Build();
+
+            CompositeCommand compositeCommand = new CompositeCommand(new ICommand[]
+            {
+                new PrintLogoCommand(print),
+                new VersionCommand(nugetVersion),
+                new OpenRuleCommand(configuration, openRuleParameter.Name, print, printBox),
+                new TimerFinishCommand(print)
+            });
+
+            await compositeCommand.ExecuteAsync(token);
+        });
+    })
+    .WithDescription("rule commands");
+#endregion
+
+await app
+    .RunAsync()
+    .ConfigureAwait(false);
\ No newline at end of file
diff --git a/src/ByReplace/brconfig.json b/src/ByReplace/brconfig.json
new file mode 100644
index 0000000..e3d9a00
--- /dev/null
+++ b/src/ByReplace/brconfig.json
@@ -0,0 +1,16 @@
+{
+  "Path": "C:\\Users\\iel_1\\Documents\\TestLieu",
+  "SkipDirectories": [ "bin", ".vs", "object", "git" ],
+  "Rules": [
+    {
+      "Name": "RemoveServiceBus",
+      "Description": "Substitui a implementação da mensageria para AwsEventBroker",
+      "Skip": [ "Startup.cs", "Program.cs", "**/Controllers/*" ],
+      "Extensions": [ ".cs", ".json" ],
+      "Replacement": {
+        "Old": [ "this._eventBus", "this.eventBus" ],
+        "New": "this._awsEventBroker"
+      }
+    }
+  ]
+}
diff --git a/src/Dockerfile b/src/Dockerfile
new file mode 100644
index 0000000..d7d827f
--- /dev/null
+++ b/src/Dockerfile
@@ -0,0 +1,12 @@
+FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
+WORKDIR /src
+COPY . .
+RUN dotnet restore ByReplace.sln
+RUN dotnet build ByReplace.sln -c Release -o /app
+RUN dotnet test ByReplace.sln
+
+# Build runtime image
+# FROM mcr.microsoft.com/dotnet/runtime:8.0 AS runtime
+# WORKDIR /app
+# COPY --from=build /app .
+# ENTRYPOINT ["dotnet", "ByReplace.dll"]
diff --git a/src/makefile b/src/makefile
new file mode 100644
index 0000000..ae5710a
--- /dev/null
+++ b/src/makefile
@@ -0,0 +1,29 @@
+restore:
+	dotnet restore
+
+build:
+	dotnet build -c Release
+
+test:
+	dotnet test --no-build --verbosity normal /p:CollectCoverage=true /p:CoverletOutputFormat=opencover
+
+test-nocoverage:
+	dotnet test --no-build --verbosity normal /p:CollectCoverage=false
+
+test-mutant:
+	cd ByReplace.Test && dotnet stryker --reporter "html"
+
+test-docker:
+	docker build -t byreplace-docker-test . && docker run byreplace-docker-test
+
+format:
+	dotnet format '.\' -v diag --severity error --verbosity --no-restore
+
+dependense-diagram:
+	dependensee -S "src"  -O  "src/diagram.html"
+
+analyze-package-usage:
+	snitch
+
+run-ci:
+	act "on: pull_request"  -C ../
\ No newline at end of file