From 7c53881146ff063591d0da93c5582480ca056715 Mon Sep 17 00:00:00 2001 From: kMutagene Date: Thu, 20 Feb 2020 08:25:28 +0100 Subject: [PATCH 01/13] Fix logo paths in some paket.template files --- src/BioFSharp.Parallel/paket.template | 4 ++-- src/BioFSharp.Stats/paket.template | 4 ++-- src/BioFSharp.Vis/paket.template | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/BioFSharp.Parallel/paket.template b/src/BioFSharp.Parallel/paket.template index 31f79c89..258f9fea 100644 --- a/src/BioFSharp.Parallel/paket.template +++ b/src/BioFSharp.Parallel/paket.template @@ -9,9 +9,9 @@ authors projectUrl https://github.com/CSBiology/BioFSharp iconUrl - https://raw.githubusercontent.com/CSBiology/BioFSharp/master/docs/files/img/logo.png + https://raw.githubusercontent.com/CSBiology/BioFSharp/master/docsrc/files/img/logo.png licenseUrl - https://github.com/CSBiology/BioFSharp/blob/master/LICENSE.txt + https://github.com/CSBiology/BioFSharp/blob/master/LICENSE requireLicenseAcceptance false language diff --git a/src/BioFSharp.Stats/paket.template b/src/BioFSharp.Stats/paket.template index 95e85615..e69de5c2 100644 --- a/src/BioFSharp.Stats/paket.template +++ b/src/BioFSharp.Stats/paket.template @@ -9,9 +9,9 @@ authors projectUrl https://github.com/CSBiology/BioFSharp iconUrl - https://raw.githubusercontent.com/CSBiology/BioFSharp/master/docs/files/img/logo.png + https://raw.githubusercontent.com/CSBiology/BioFSharp/master/docsrc/files/img/logo.png licenseUrl - https://github.com/CSBiology/BioFSharp/blob/master/LICENSE.txt + https://github.com/CSBiology/BioFSharp/blob/master/LICENSE requireLicenseAcceptance false language diff --git a/src/BioFSharp.Vis/paket.template b/src/BioFSharp.Vis/paket.template index b9f4b3fe..2eb23bf6 100644 --- a/src/BioFSharp.Vis/paket.template +++ b/src/BioFSharp.Vis/paket.template @@ -9,9 +9,9 @@ authors projectUrl https://github.com/CSBiology/BioFSharp iconUrl - https://raw.githubusercontent.com/CSBiology/BioFSharp/master/docs/files/img/logo.png + https://raw.githubusercontent.com/CSBiology/BioFSharp/master/docsrc/files/img/logo.png licenseUrl - https://github.com/CSBiology/BioFSharp/blob/master/LICENSE.txt + https://github.com/CSBiology/BioFSharp/blob/master/LICENSE requireLicenseAcceptance false language From 1c9afe202583e90c7fe15e006444c458eff3eea6 Mon Sep 17 00:00:00 2001 From: kMutagene Date: Thu, 20 Feb 2020 08:27:40 +0100 Subject: [PATCH 02/13] Fix buid status table in readme --- README.md | 2 +- docsrc/content/release-notes.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0ec5fd85..ac1bbbbf 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ BioFSharp is an open source bioinformatics and computational biology toolbox wri |Branch|Linux Mono (Xenial)|Linux .Net Core only (Bionic Beaver)|Windows| -|---|---|---| +|---|---|---|---| | master | [![Build Status](https://travis-ci.com/CSBiology/BioFSharp.svg?branch=master)](https://travis-ci.com/CSBiology/BioFSharp) | [![Build status](https://ci.appveyor.com/api/projects/status/9a5r4aklmmbykobk/branch/master?svg=true)](https://ci.appveyor.com/project/kMutagene/biofsharp/branch/master) | [![Build status](https://ci.appveyor.com/api/projects/status/9a5r4aklmmbykobk/branch/master?svg=true)](https://ci.appveyor.com/project/kMutagene/biofsharp/branch/master) | | developer | [![Build Status](https://travis-ci.com/CSBiology/BioFSharp.svg?branch=developer)](https://travis-ci.com/CSBiology/BioFSharp) | [![Build status](https://ci.appveyor.com/api/projects/status/9a5r4aklmmbykobk/branch/developer?svg=true)](https://ci.appveyor.com/project/kMutagene/biofsharp/branch/developer) |[![Build status](https://ci.appveyor.com/api/projects/status/9a5r4aklmmbykobk/branch/developer?svg=true)](https://ci.appveyor.com/project/kMutagene/biofsharp/branch/developer) | diff --git a/docsrc/content/release-notes.md b/docsrc/content/release-notes.md index e364d81d..ba9cd24d 100644 --- a/docsrc/content/release-notes.md +++ b/docsrc/content/release-notes.md @@ -1,4 +1,4 @@ -#### 1.0.02 - Thursday, October 24, 2019 +#### 1.0.02 - Wednesday, February 19, 2020 * **BioFSharp.BioDB:** * Fix FaTool OData model URL * **BioFSharp.Vis** From cebb7ec8cacf7ffca5dfc1b1f46a028b8dc7e688 Mon Sep 17 00:00:00 2001 From: kMutagene Date: Thu, 20 Feb 2020 09:30:05 +0100 Subject: [PATCH 03/13] [Docs] update installation instructions --- docsrc/content/index.fsx | 42 +++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/docsrc/content/index.fsx b/docsrc/content/index.fsx index b4fa980b..2982c6eb 100644 --- a/docsrc/content/index.fsx +++ b/docsrc/content/index.fsx @@ -43,10 +43,21 @@ The core datamodel implements in ascending hierarchical order: Installation ------------ -BioFSharp is currently on the way to its 1.x release. When this process is done, we will provide a nuget package at [nuget.org](https://www.nuget.org/). However, currently the way to get BioFSharp running on -your machine is to either clone the repository and build the binaries yourself or download the prerelease packages from our [nuget branch](https://github.com/CSBiology/BioFSharp/tree/nuget). +**From Nuget.org:** -**Using prerelease packages from the nuget branch:** +You can get the stable versions of all BioFSharp packages from nuget: + +
+PM> Install-Package BioFSharp
+> paket add BioFSharp
+
+ +All associated packages can be found [here](https://www.nuget.org/profiles/CSBiology) + + +**Prerelease packages from the nuget branch:** + +Unstable/Experimental packages only. If you are using paket, add the following line to you `paket.dependencies` file: @@ -69,24 +80,29 @@ you can then access the individual packages: `nuget BioFSharp.Vis` - -**To build the binaries yourself:** +**Build the binaries yourself:** **Windows**: -- Install [.Net Core SDK](https://www.microsoft.com/net/download) -- Install the dotnet tool fake cli by `dotnet tool install fake-cli -g` for global installation or `dotnet tool install fake-cli --tool-path yourtoolpath` -- Install the dotnet tool paket by `dotnet tool install paket -g` for global installation or `dotnet tool install paket --tool-path yourtoolpath` +- Install [.Net Core SDK](https://www.microsoft.com/net/download) 3.0 + - go to the project folder -- use the console command `fake build` +- `.\build.cmd` + +**Linux(using Mono)**: + +- BioDB is excluded from this build. + +- Install [.Net Core SDK](https://www.microsoft.com/net/download/linux-package-manager/ubuntu14-04/sdk-current) +- go to the project folder +- ./build.sh -t Mono + +**Linux(Dotnet Core only)**: -**Linux(Ubuntu, using Mono)**: +- this does only build projects targeting netstandard2.0 (Core, BioContainers, IO, Stats, ML) - Install [.Net Core SDK](https://www.microsoft.com/net/download/linux-package-manager/ubuntu14-04/sdk-current) -- Install the dotnet tool fake cli by `dotnet tool install fake-cli -g` for global installation or `dotnet tool install fake-cli --tool-path yourtoolpath` -- Install the dotnet tool paket by `dotnet tool install paket -g` for global installation or `dotnet tool install paket --tool-path yourtoolpath` - go to the project folder -- use the console command `dotnet fake build --target Linux` +- ./build.sh -t Dotnet
From 2b32dc9866318bd5e9441aa15b13b4758461ea1d Mon Sep 17 00:00:00 2001 From: kMutagene Date: Thu, 20 Feb 2020 11:20:07 +0100 Subject: [PATCH 04/13] Add BioContainers design guide --- BioFSharp.sln | 1 + docsrc/content/BioContainersDesignGuide.fsx | 300 ++++++++++++++++++++ docsrc/content/index.fsx | 4 +- docsrc/files/img/MakeBlastDBParams.png | Bin 0 -> 267466 bytes docsrc/tools/templates/template.cshtml | 3 +- 5 files changed, 304 insertions(+), 4 deletions(-) create mode 100644 docsrc/content/BioContainersDesignGuide.fsx create mode 100644 docsrc/files/img/MakeBlastDBParams.png diff --git a/BioFSharp.sln b/BioFSharp.sln index be71ff14..75f0ce20 100644 --- a/BioFSharp.sln +++ b/BioFSharp.sln @@ -30,6 +30,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "content", "content", "{8E6D docsrc\content\AminoProperties.fsx = docsrc\content\AminoProperties.fsx docsrc\content\BioCollections.fsx = docsrc\content\BioCollections.fsx docsrc\content\BioContainers.fsx = docsrc\content\BioContainers.fsx + docsrc\content\BioContainersDesignGuide.fsx = docsrc\content\BioContainersDesignGuide.fsx docsrc\content\BioDB.fsx = docsrc\content\BioDB.fsx docsrc\content\BioID.fsx = docsrc\content\BioID.fsx docsrc\content\BioItem.fsx = docsrc\content\BioItem.fsx diff --git a/docsrc/content/BioContainersDesignGuide.fsx b/docsrc/content/BioContainersDesignGuide.fsx new file mode 100644 index 00000000..50667d3f --- /dev/null +++ b/docsrc/content/BioContainersDesignGuide.fsx @@ -0,0 +1,300 @@ +(*** hide ***) +#I @"../../bin/BioFSharp/net47/" +#I @"../../bin/BioFSharp.BioDB/net45/" +#I @"../../bin/BioFSharp.ImgP/net47" +#I @"../../bin/BioFSharp.IO/net47/" +#I @"../../bin/BioFSharp.Parallel/net47/" +#I @"../../bin/BioFSharp.Stats/net47/" +#I @"../../bin/BioFSharp.Vis/net47/" +#r @"../../lib/Formatting/FSharp.Plotly.dll" +#I @"../../bin/BioFSharp.BioContainers/net47/" +#r @"C:\Users\kevin\source\repos\CSBiology\BioFSharp\packages\Docker.DotNet\lib\netstandard2.0\Docker.DotNet.dll" +#r "BioFSharp.dll" +#r "BioFSharp.BioContainers.dll" + +open BioFSharp.BioContainers +open BioFSharp.BioContainers.BioContainer +(** + +Designing F# APIs for biocontainers +=================================== + +This page is a design suggestion for common coding practice for all biocontainer APIs used in this library. +Do not take it as ultima ratio, but as a guideline that is up for community discussion. + +Biocontainer targets +-------------------- + +If you want to create an F# API for a bioinformatic tool, make sure to check if the tool is already containerized +in the [BioConstainers registry](https://biocontainers.pro/#/registry) or [repository](https://github.com/BioContainers/containers). If not, make sure to create your own image according to the [BioConstainers standards](https://biocontainers-edu.biocontainers.pro/en/latest/what_is_biocontainers.html). + +Suggested BioContainer API design workflow +------------------------------------------ + +- **Pull or build the target container.** +- **Run the help command in the container** +That way you can check that the container is working and you get the full list of commands with additional information. +You can alternatively get the description of commands from the documentation of the containerized tool. +- **Create a DSL for the command line arguments as follows:** +- **Create functions to run commands in the container** + +Here is an example walkthrough for the `makeblastdb` tool. The documentation used to create the DSL can be found [here](https://www.ncbi.nlm.nih.gov/books/NBK279684/) + +The relevant arguments are: + +![MakeBlastDBParams](img/MakeBlastDBParams.png) + +###Use Discriminated Union types for all types in the domain. +The top level type should be named "[toolname]Params" +For arguments with various input ranges, choose a fitting type at will, e.g. `String` for a title, `int` for number of cores, etc. or use the type annotations from the tool's docs when provided +*) + +///DSL for command line arguments for the NCBI makeblastdb tool +type MakeBlastDbParams = +///Input file/database name +| Input of string + +(** +###For flag type arguments, use typeless union labels** +*) + +type MakeBlastDbParams = + ///Input file/database name + | Input of string + ///Parse bar delimited sequence identifiers (e.g., gi|129295) in FASTA input + | ParseSeqIds + +(** +###For arguments than can only have a defined set of values, use a dedicated discriminated union type** +*) + +///Input file type for makeblastdb +type MakeBlastDBInputType = + ///fasta: for FASTA file(s) + |Fasta + ///blastdb: for BLAST database(s) + |Blastdb + ///asn1_txt: for Seq-entries in text ASN.1 format + |Asn1Txt + ///asn1_bin: for Seq-entries in binary ASN.1 format + |ASN1Bin + +type MakeBlastDbParams = + ///Input file/database name + | Input of string + ///Input file type for makeblastdb + | InputType of MakeBlastDBInputType + ///Parse bar delimited sequence identifiers (e.g., gi|129295) in FASTA input + | ParseSeqIds + + +(** +###For each discriminated union type you have, create converter functions: + +Sub union types: + +- make: a function that returns the argument converted from DSL to string. This function can be used for creating commands usable in any local shell. +- make: a function that returns the argument converted from DSL to string, using the `MountInfo.containerPathOf` function. + This function creates commands that are usable in a container with mounted directories and ensures access for the tool to your mounted input/output files. You only need this function for types that contain paths. + +Top level union type: + +- makeCmd: a function that returns the argument converted from DSL to string, preceded with the option indicator (e.g. --, -). This function can be used for creating commands usable in any local shell. +- makeCmdWith: a function that returns the argument converted from DSL to string, preceded with the option indicator (e.g. --, -), using the `MountInfo.containerPathOf` function. + This function creates commands that are usable in a container with mounted directories and ensures access for the tool to your mounted input/output files. You only need this function for types that contain paths. + +When containing subunions, the converter for the top level union should call the converter for the subunion for argument string creation. +All return values of the top level union should be wrapped in a list. +*) + +///Input file type for makeblastdb +type MakeBlastDBInputType = + ///fasta: for FASTA file(s) + |Fasta + ///blastdb: for BLAST database(s) + |Blastdb + ///asn1_txt: for Seq-entries in text ASN.1 format + |Asn1Txt + ///asn1_bin: for Seq-entries in binary ASN.1 format + |ASN1Bin + static member make = function + |Fasta -> "fasta" + |Blastdb -> "blastdb" + |Asn1Txt -> "asn1_txt" + |ASN1Bin -> "asn1_bin" + +type MakeBlastDbParams = + ///Input file/database name + | Input of string + ///Input file type for makeblastdb + | InputType of MakeBlastDBInputType + ///Parse bar delimited sequence identifiers (e.g., gi|129295) in FASTA input + | ParseSeqIds + + static member makeCmd = function + | Input (path) -> ["-in" ; path] + | InputType it -> ["-input_type" ; MakeBlastDBInputType.make it] + | ParseSeqIds -> ["-parse_seqids"] + + ///returns the string form of command line argument DSL for makeblastdb with paths adjusted for container localization + static member makeCmdWith (m: MountInfo) = function + | Input (path) -> ["-in" ; MountInfo.containerPathOf m path] + | InputType it -> ["-input_type" ; MakeBlastDBInputType.make it] + | ParseSeqIds -> ["-parse_seqids"] + + +(** +###Create functions for in-container command execution +Always create a synchronous and asynchronous version: +*) + +open BioFSharp.BioContainers +open BioFSharp.BioContainers.BioContainer + +let runMakeBlastDBAsync (bcContext:BioContainer.BcContext) (opt:MakeBlastDbParams list) = + + //create correct command line strings from the input parameters + let cmds = (opt |> List.map (MakeBlastDbParams.makeCmdWith bcContext.Mount)) + + //append the commands after the running command, most time this is the tool name. + let tp = "makeblastdb"::(cmds |> List.concat) + + printfn "Starting process makeblastdb\r\nparameters:" + cmds |> List.iter (fun op -> printfn "\t%s" (String.concat " " op)) + + //await execution of the commands in the container. execAsync does not return the result, use execReturn for that. + async { + let! res = BioContainer.execAsync bcContext tp + return res + } + +//synchronous version +let runMakeBlastDB (bcContext:BioContainer.BcContext) (opt:MakeBlastDbParams list) = + + runMakeBlastDBAsync bcContext opt + |> Async.RunSynchronously + + +(** +Full example +------------ +Here is the full DSL for makeblastdb: +*) + + +open BioFSharp.BioContainers +open BioFSharp.BioContainers.BioContainer + +///Input file type for makeblastdb +type MakeBlastDBInputType = + ///fasta: for FASTA file(s) + |Fasta + ///blastdb: for BLAST database(s) + |Blastdb + ///asn1_txt: for Seq-entries in text ASN.1 format + |Asn1Txt + ///asn1_bin: for Seq-entries in binary ASN.1 format + |ASN1Bin + + static member make = function + |Fasta -> "fasta" + |Blastdb -> "blastdb" + |Asn1Txt -> "asn1_txt" + |ASN1Bin -> "asn1_bin" + +///Molecule type of input, values can be nucl or prot +type DbType = + | Protein + | Nucleotide + + static member make = function + | Protein -> "prot" + | Nucleotide -> "nucl" + +///DSL for command line arguments for the NCBI makeblastdb tool +type MakeBlastDbParams = + ///Input file/database name + | Input of string + ///Input file type for makeblastdb + | InputType of MakeBlastDBInputType + ///Molecule type of input, values can be nucl or prot + | DbType of DbType + ///Title for BLAST database. If not set, the input file name will be used + | Title of string + ///Parse bar delimited sequence identifiers (e.g., gi|129295) in FASTA input + | ParseSeqIds + ///Create index of sequence hash values + | HashIndex + ///Comma-separated list of input files containing masking data as produced by NCBI masking applications (e.g. dustmasker, segmasker, windowmasker + | MaskData of string list + ///Name of BLAST database to be created. Input file name is used if none provided. This field is required if input consists of multiple files + | Output of string + ///Maximum file size to use for BLAST database. 4GB is the maximum supported by the database structure + | MaxFileSize of string + ///Taxonomy ID to assign to all sequences. + | TaxId of int + ///File with two columns mapping sequence ID to the taxonomy ID. The first column is the sequence ID represented as one of: + /// + ///1 + ///fasta with accessions (e.g., emb|X17276.1|) + /// + ///2 + ///fasta with GI (e.g., gi|4) + /// + ///3 + ///GI as a bare number (e.g., 4) + /// + ///4 + ///A local ID. The local ID must be prefixed with "lcl" (e.g., lcl|4). + ///The second column should be the NCBI taxonomy ID (e.g., 9606 for human). + | TaxIdMapFile of string + ///Program log file (default is stderr). + | Logfile of string + + ///returns the string form of command line argument DSL for makeblastdb + static member makeCmd = function + | Input (path) -> ["-in" ; path] + | InputType it -> ["-input_type" ; MakeBlastDBInputType.make it] + | DbType (dbt) -> ["-dbtype" ; DbType.make dbt] + | Title t -> ["-title" ; t] + | ParseSeqIds -> ["-parse_seqids"] + | HashIndex -> ["-hash_index"] + | MaskData (paths) -> ["-mask_data" ; paths |> String.concat ","] + | Output (path) -> ["-out" ; path] + | MaxFileSize fs -> ["-max_file_size"; fs] + | TaxId tid -> ["-taxid" ; sprintf "%i" tid] + | TaxIdMapFile (path) -> ["-taxid_map" ; path] + | Logfile(path) -> ["-logfile" ; path] + + ///returns the string form of command line argument DSL for makeblastdb with paths adjusted for container localization + static member makeCmdWith (m: MountInfo) = function + | Input (path) -> ["-in" ; MountInfo.containerPathOf m path] + | InputType it -> ["-input_type" ; MakeBlastDBInputType.make it] + | DbType (dbt) -> ["-dbtype" ; DbType.make dbt] + | Title t -> ["-title" ; t] + | ParseSeqIds -> ["-parse_seqids"] + | HashIndex -> ["-hash_index"] + | MaskData (paths) -> ["-mask_data" ; paths |> List.map (MountInfo.containerPathOf m) |> String.concat ","] + | Output (path) -> ["-out" ; MountInfo.containerPathOf m path] + | MaxFileSize fs -> ["-max_file_size"; fs] + | TaxId tid -> ["-taxid" ; sprintf "%i" tid] + | TaxIdMapFile (path) -> ["-taxid_map" ; MountInfo.containerPathOf m path] + | Logfile(path) -> ["-logfile" ; MountInfo.containerPathOf m path] + +let runMakeBlastDBAsync (bcContext:BioContainer.BcContext) (opt:MakeBlastDbParams list) = + + let cmds = (opt |> List.map (MakeBlastDbParams.makeCmdWith bcContext.Mount)) + let tp = "makeblastdb"::(cmds |> List.concat) + + printfn "Starting process makeblastdb\r\nparameters:" + cmds |> List.iter (fun op -> printfn "\t%s" (String.concat " " op)) + + async { + let! res = BioContainer.execAsync bcContext tp + return res + } + +let runMakeBlastDB (bcContext:BioContainer.BcContext) (opt:MakeBlastDbParams list) = + + runMakeBlastDBAsync bcContext opt + |> Async.RunSynchronously \ No newline at end of file diff --git a/docsrc/content/index.fsx b/docsrc/content/index.fsx index 2982c6eb..83bd4fe7 100644 --- a/docsrc/content/index.fsx +++ b/docsrc/content/index.fsx @@ -48,8 +48,8 @@ Installation You can get the stable versions of all BioFSharp packages from nuget:
-PM> Install-Package BioFSharp
-> paket add BioFSharp
+Install-Package BioFSharp
+paket add BioFSharp
 
All associated packages can be found [here](https://www.nuget.org/profiles/CSBiology) diff --git a/docsrc/files/img/MakeBlastDBParams.png b/docsrc/files/img/MakeBlastDBParams.png new file mode 100644 index 0000000000000000000000000000000000000000..ad57d9fd6330725626ea56f5862a7f8be6e537aa GIT binary patch literal 267466 zcmdSBWl&pP*fv^9fl>+-C~hrnaRS9HxU@Kh;t-^`1h)Vw?ohnN-QAty#R+c3-QANM z+UI%RZ@%;I{5do4o=Gx+y|dR^w_n%2SFnp^H+J4Yh1ILg4Pe@8lE{I#G=_1raQ@=v+b52dz#rrxg8ptVrseQ3 za)0$M7=o_ie;x7#%kc-x-#%fwM`3rv`Sk^7X2-fb#$neo2c#2ublE*&ZG;*yqg?aFt^4xg*gSyxN2^+C(Dp5;M{u$C4imF8>E z{~V`NNO8nFn*WYW!EO;&y#Eg6RHO8S|2dU@esl!cUJCL8zf3Gd?9y!fksut9eZ)Rv4QTLdROe6j^J zTXB|xwc=I>Z6PKsNvI~3;MiFjNx!5&o6D*oAw=?rz>0b+WfmU-vS4qfPbgwCWqSc zT8Dq?QSTZRMY^Cpxh@9T=!H^iw)7e}!61$z#imZ+%5ZDsjrVJ20h-NhrX*Vp^YLICCux6=f)Q2@`dw1 z1p5v14Fb<`cFKYy$VB340?u^iWkOh~V5`mA*sKsAmFW%o%ygh7nbqAEkbc}S!C@Q( zXg4pBoYwi33(^kQ^^DNi+k+4NfojC(hE`yc+THEP>5%G2ld=EII#{nDBOVB^d7_ZMj zG@pVjD^4x#*b+x7Z+weTqmY zi)c7kfw%n*n44bhOi9oe9>qIcTs~3x8i$rC#1kIg#c~?N7;zl~s^3~VVVey)@frA+jkv-f*Glf5=!x1LD z9iCOg@6cw-bGR#v_xLdQh1TD6*mpX-F+TDxLlYP%guQ2``>XECdOu(yN4_gU$@ygw zKu@nB6V>Uu`ZY(}92nZC(lE{2OW_f+KEzuW};t%ZqpD z6JEOHx(bk0r_GD(82BZYd7919bL9R>`zR@|byBCIs(RW_5M)2P{vx+`&KJwpN;yp@ zEw&EFI$|S|2PwRhHcUlTn1%bZ;i_mi+l>Zf>{ccUvDQ0p@vI8LFSfyDtv zdYW8bzb-4<7`#a$cS}|julGEBa)}U`qRiYsyt$cNxTGuMYzQo+E;!@qe4S@DobKGf zuUmw=3cSw7rM$b+hn$lXr0IsY2)BKOFnIFjl~vK;$~HOjI_Uuvub{^ns7dN-YZ9Mi z^`tfT&vN1IRt?uvGFAy$i4faVf-STg#>E!g?h`~*v8hv0`Rt|~NF56|piw`vS$(2! zw{yfMsBRHq?9>C7zxR0WH-bU;iRxv-<@a9>a@z!UfPC2LdLebn&&f84Q^m0tz({Lf;dC2hclO|28=_7Q??A>W>BBPEnBi-0&txgG9cm#2|;hu3E3=?8ld49o7? z9wWmErWG?^H&73TOCR6eQRZKhA8f2bw|{OQjGJk^*7E=jHvRruvm5iDV*aO1;ab0B$}wP?w&s+u;LrBua(I)};1gBgeuDcNx0yfZmnzs=7RP@8WJ za>AP&8U-FCue0m9q%1C+2_m6sS>oPi9t_;H$PHM-G zBdlUsV~Rb2K}$T~_%i#eb9aGTDe$tyC!tSgHgD5%*GFd0s{u7-bI3J(p{OhaTyWMv z?X!W}gKlX_?CmDj+Ph0kD?}GwX^|z8<^2ny#(fF@3L;&!8s3uDs~#kA@4#Vug>v9$ zq@z?TQ)*(``WCCpvd@Q@Ww4~Kum`5;+?C;7<&dpjM2W${-p8S&!gxC^{tM|~(RJLJ57xN`F?s4$&CoGL5$Dn%RJM#Z^WvbB*(olxkq3pd$16(H#p{#ff3I5B_y`BoLRcgS;Z=cja#mme#IuX?`41 zHCkAxP?=naV1Ju16W%FB^if&iw871b;iA^pq8e9T4Rj0m+-a4&2hjP@T?NwC{5jt_ zCoLZqKvieOHNJu$$e6o)w9xuJnlog`It790Q{oN*OkCxH?_7cIK5Mn+% zUA|qWn7#kxC7MRS`z1)Vd zw!^#>1VDbkaO0&<)I~&Fx0w5Ibvr;kwFF4!Mg1dLZktG;D`3_tg}kj5C5gkvPbT{U zaWM0Sno(056p9VPjWj&DlK7z%88c_75=&sp*}}!)ZbQNEJx87VlzJSZ4qm=Qj?uE} zHF2wzE$($LPF)+l9VEWk>gg)sR{{5iGad}o`>`q=I<0i^X_{o&WMv6Wb&FmoT2!bF zQDn-27mt3f4iHRou4x-CB!4$)Tg1Afo17yiO^67p67~DFhKxV&u40?r`);+NrWn$E z##%YD#Klzc$)-ym_3XrDqQ;*`EnOW z`9=wsa2KE-+|Ola?UH9$!3&c~bn{epMU-~9baRS%3k!0yswjc^w7h{JWs_b6E_2TLXN%ENQWQmEH`Y z8?pV#+c?Y(m%b(S-pSYIgBpnoopeG6TX%)BfeOny+0h^E4R|}BNBg+G(tZ{oBp3la zU~g${L$NeoR<2n;%9O^6K-!7kG2FB*{XE)8pd{XP$>eVph-@qQdIqxCz}nFw-;csz zu+a&PgN=ZKL!bqn=ns)+@oVF0O#w^f8vGVzYD!(d@BVQyJec6}BDBJ_g|fzY4M50& zF&v&TK(`!}&Bd+1QMW2PWyq`vke)mjnux1MkP7lFHrX*ytYbIr{|uHx+w&;CaFA%9 zUcD0C_rKsx79RCE?*pal)F;$CZg=AF4)+mT=;8(I1+cVVBDrnkIo?N^U~1RZ6ZIxd z2)^xUt6|(3Xom#famPJKdtFCy@#o~_@!RDsNV&rj=|Y5~N|sRhX+Em^P4wRcF4tu4 zA^Scu=Uvsp7J}DglTVbfMp)*I1(xFWHc)yR{HWIrIlG9PIli*jaXNflO1sn`539Bj z<~BNz5cYrfiJJf74MYcvWqCIPC;6_*!}|pwnLqqMfIG+~0$fs`q3AjiQiGWWDdV`T zy82d!J6zm9f~i9mo#mi&Dn$4)JANs{x29#XNJ|w>IrM1Ym+wv}KjV6|D!Ef#}iC z-8oggMxtGL-R>Lt7JXL~yq-ocvv|7rj55C-^jOclxQUj+wn}O6CO0K3zqGX1Dm8&G z(2w1Qp{j2%MUhxgu(z*v+Z`y5IIVQlw|DLc@BjdoPoWKj08L{Y7FWbF`f#;VcSMRz zcCW-c%M!cKhPGT;>&H~LI~KKWpQJ1r3(;~>BWlF+Q*Bl#@B zMHLp-PQ{8lgigGtxCF7U{~`zd{nZ%m!laF_dO7=8aALFzbm|iaP}91G#Kb~-01MYK z6e+YEP4E-I%4PLpkcuADTm+freYg!qgkyhsf7(dKo)%ZFJR@5riR|i~OUo6W&97Ek zf;0DfRF{d@Co6_LhnvzS@_@Dhgpp0V?+>{cAMoe3`YWk=aDNQ)onI|=Nk;&Y{@E4v zRw;4rE|m>r!>nu7SOZ_EIBj|N=J=)jJ!;QH2J?#9N^Rm1)|BBEqU*f%D&t|nFR#@C z4C?GU1>|pp_}ByvOl}vx$4oC{FjrDC)j;`mR1X6|}hziIa?u`=u$+EB4~3>e(M>?Pn4W>B2TqnjR|xzD<` zA^KWWLT9(a`txAP`4Q6k?k%ch=HM5z%=quqYt;2I{Eq7%EsNGq$)n*;CYGDy>nH%q zA{^nLzYq!N$u_@f?}Brx#b`=me7%syEUko8n6FKm-7z30b7VJsh4kax#0&kCWP2>E_uz?YDX`h_#hkoJnhs zkZrKzqP3aJI{O|+%_y(y1082ZfZ-;v@!z%c9sZIqwkZO z&S_mu^Wfk451Cq4or3T zICL_IEMY0NeDT*95{u1o&%KIxSNLG{S6kUj>%f=e>-iQN{qGo91bgB}$MPNztZE-H z>-pGGlcoBTE_u0UGJBc)pcv>ew5sBMyPnsYHnF;1doaVcb9by{_(QY#*+2&ix%a!J z!cnR0h}L?HnvH^W&qg?OgJ?UYffI8@%mHn`EpEQbkdAxs2cn5M6ds@DFnG}3+O<4_ z1u6IR%w}V5ucZD3E5|wa{0@g{>6rBH$hP$cC-A(DZGaqX9pBm3v^`;3yKCu2OYW;+ z9oOW_+Ufxt7<&-2tupf_I$Asj%JFg-PA&}%|9F3%K|pwSyYA-p&e%K}>DTAvcQ z?H}bu_a3hFfYlsh0T;8|Zi?905Mbu_{-ZtJ=!y^P6P!t#QinhGUfPPG?tXY^S z5nnjsX>kF|gRpuoR(Jk^K%tz3V~&H^R%}`WfHO5-qhD$5^<}fAfv^t2bW5LMu}+$8 z^|IhpT<&M^(*&=@474z03l;Hin+zbhLA1IYOwTjc?ME!%Z$69 zTy|r9gx?L<{t)6J(zn*UPf!vSybh%Z4_ZQ2&V9UONG-ysKi<0z%-lIX|3Yn>5VPLw zLg<-*Z;`mekPyRJvqxe#ocOA3T~ATZ=S*6+VvQ5}p1XO>8>_8G5iH#Q7oy~Zd+WWl z5;+j=wMiV&X^9#gTe}RO!9|}wv=r%f6|QIo*ywGTX>4-~g`k%ZWlbecfOnwuN?>I} zp%(A?Rg?2}B@Bv`wd$^rHqn&+%Rn)bxGV{S)c`)BMf|?;t6@Hvz0l64fE8w~wx!X4 z>SrSej<9$uyzihZ{&OeKs#j(c5yaUlC@w1V8D}#U)ORTmsBK}ldI~(?pbD_POGbq> zFNt<1n|t!3R46)?b>&>U(IvOV8Y4&4Vajb7bk*u()(iD`({t8i<}{lT#M^fRs82S` zW^OpP?>phoWnD5CUlSFy{HwOH8ifvPIE zUs+40>PIKYRubg=YXL0)ZLO`&sjt>Vzn!Y}PnRz*5j$<*pC{L>dWTNIXTy4qx-kR7 z9$$-6AmvwLC`5{;<3RBTX(;0x$86DpJFfYvGWi5=$w+XUQ zn>_aB7ffSTW7<63d*xlJ6kQeY7!9q7&y*Pa)gB2BelO@W&+-ge&jn3x#veLiltB{ zj;qG|ceQf5I%+8|R2vx=vusA9!|BSeh3Vk*AZ+?>=^%s$il^y%{lr$oR}4FpjW}Zn zzSdNV^0*ZY-I36`GhoN+HECmDWGU@5#MIWDt+qWwSXZo9vCio1H5W+@$pE6=dz@Gy z%Ro0V`naaX%(d5h=p=A20aD@CpeL}2v=bO+uFC@8zXH&IRY+E+SepO3Yvc+0Iggr_ zpEeoQO~`vPZf$35gIS1d(r~%2X!3YmvnQE~xfS@%tiBOj8h;q=^#Vd=OenSKn{C9$ zw~J6j^#_06HokDI&XbIWFC4Zu$!uxNJ+&rwII+fA8%m)IbQSP6$Dep!w!gI|5T|}0 z%DTvmHiyG$pvCf51as<0%I&F%m5$SAs&p@zD@Fz^j94nE7YS|v6&Twb39Nl^&#y&> zf}-{fw{z$-NNJr=)eG6LaWsng8>iF&{WC;YqLlpE0W?qiqO8(#2Le8hE^f*Jg*wU% zmnqlTt&LxY6EJY>?3H)V9K-8b$tU?wA(?_Kv%U~*8kBpTy^j|e=@z=pr1O%9FfTj; z;N^o$CR@@<`4Sr^F~6+-7ZW$LlX=-p#br2 z+{<)#&koA(o0SBO?13Jy_xC!tg@wXPH+fd>g}dZ$fOaZZEeH7(TtVaqoCARcJT2HW z<8$v8+nywqIGN3;ht{mfw?4_U;aHve_S4ITb0t71??7?!lJ~Nf;5t8-`$S4_Zpzsx zTJb1P`d|c#aBwzWVdZ&%#K9eQ#kh5nRE6bpF#Y)eKh!R9~ zO0#Un?l_OI;AU+kVf1ty$ctcdf~-dDCD4sc0G-dnx%CftFFu_EPd{(R0C>qL4ex9M z$BSw!P@JG`%nZ8h4DP94D!pf9#`BuUsrNb1U#6>~4NjtgeK4*Mfp8FDz>! z@cML{QIZB2l?;j$?!Gqt0P-wKEg@QFn0BX?PE4$jQ8TQ20k&9sqcsFGXGV055~&)W z)G#11l!Qy4&c=Cn5O4zC*QXZNb4K5ji8@-acmnuXnAbp+(*$0v2ED+KxPaR9mB}^s0}Dyb z$}H}Ufq07DzE0xu%NlF?W9OA?RsmZnpm4DD?EMv2KBR@4Yw0hs@bFW28=09DUZp@Z z4zleb&BmnJX#(xN7ej=a7?gCP*ymG1W z6}(Y0`}}!U=M~)isR_H_GcEzXTYN1QVGmx6mEOa4^ zfaxG#?{!`{og+E1SJL&*RF1ZtPHS{%FctNGGf|G;{E&WypBx&mf45R}TH`nrd?4#M zO4<6B?gdaU6(A5)3N8IvXQ-3lGfMZ9%awSd6Dn=ei@qMjBs10DN@i6gp#-2ZaJ1%IVLb7Nt0Vqo<@ zeDVJ(50AJ`v0kgfC?)CXD@v`hq@5zq}aMg)#w##p1Rpi=ea%8hA}^&Cb?8qSWE_i zdZAoV_461X;3wPdg*+b~u(xTnMkpuD^q(Jkx;}P((@RT5W56Q8jn_kt2xuFk}AF& zQ0eFz_4YYX8=SX(2kVB-CyXq2J%sH}DA2p;_045*kkb>^yi{>%2z!$r+>hu#!i!Qb|PEw+`07slWJX5@3md_Wgb_PhQjnn6L^eSf-AfNIaU54%zcPyKi2?2-{| zQ*#&XV1;E@O|<^i$GH{>IL2j^(oPj*G^<0y^H+^8E(i?A!(S18@qQLGA_APc!%Dw@9zYYa{#D-dE`x_A z8Y+QMWGfN&37p4~O0<{j|H+%+ue|SHTK#mMm$?yhBJ5SX$T*rXw?ZnDrpBuf+;1>y zJy5(!S846m#ePOmuJ~V?4n1YyAnP~(TAIw?C5=}@bW*)_T()(jbJi=8>c;9z;m#MU zAJsv*0~>?unVb#9J%rmL2l1KjyeY8vL_j*w&i{-O@4<#)YdhfDjLVv91o=bZ*9i1v z`i((syJ@!YW`qcs(mHv>i3w-rqw$mKg-pynRJm=M5k-gXZpBRUMT;*0@a8`l;=coO zKV^GpFN!R9Y&BDX0mGqC+ZVmKV)p|hPalc$kvSut-wNSDsTV|+kj>fhp|14Eh&Mvt zinLBkp7G`Goay+?0j?g%ap7Wt4EaI*zAN(47fX%T3shE!Jc9c3qe|l=(1R(CQt4=E zj5wg+u0HMv9Vk>LzIv_RZMyBm&phk;I27sNfkDub$78$ZO`+~- z%|fx_0M23>ChgW+&PJMnDrDov);l3 zQhq{JQj70&K&Pyp+iLng-m{EIdU)ZdG*TQS; zAUt3L;(klGig}Pd_hzBnNcyh%S?#0|JQeg4XHfgOO0DuG2oN>Pw^!r z))*e9XT)Lo$$N2jjyJO*%-G=a{m>SGiu_+$s#dwR4VIGs6XyTC|8Hr68`4OhUi$2t z=_W~!{DJ$LFFeS^m->)6lN52_l;OykUQ)PqeMmlN{h<| zXQthgk-AJ9(*jB-y)`5Uzt#uc7tiQjV9|4SfApPi$x99RT`uz6b+u+oxcB&wE6iBpd5 zytQp6QXYnb*?uOUucaL1->nThZdbb1pP~kqr{RWNac99h8%Pcl<@GrIeG`5J=7ye@ zC}zKC23w0w9)+yfV(VWQJ#t^<{JAt4mPj0;e6<7_-^x*D)dDf}(yrNCdFBwd)UBWI z5S^xPrPyn5@2>lui>c2kn*us~!10-zAIj<EV{2>doj;A?B`-iMR3oCPtBAnCBl-@+$c`-afiT)wG+3aZXXU- z^|7C0-ef=OX#tYpoOc=k$c0&17+>ai<@&MNmQsEekfZ4}%{%@rvaDfu z+kv?MY2^b-U9)j#HmtXjmy}h3ertAfrs>*=e)MfsirA=wsg#&qe`@_TSt5F_7q#Y~ zZ1$)H{JFgu0YhK+JQ84g)thI9c+4mEcarC>4>8zm__*^T5&Phja0oq@Pab9pn9)lW z!)c`Ula3gc%)o`fZURViBH4z?8)u%(@9l$=|C+BE%|o0ULc@jIwtez1jG%*O=vD=p zE2v!jAa`miTz0pr8l@M^<2PVo^8BL97LLdu-4NJU*&qI=-*dZT>gF4;L$joXL%>#b@JY_7^uuRCa<=4Wa>E3$=E+9^Iv#t^Iv#kTSk+{tJ z4U>9>n#^4mO>Ub8r`eg+plhMUZ;&$422N zBN$q47LD|IlG#j2Ae?qegpQNvYL%Xgfmw1|M&#nIM1_2ejonvHbq|LLlP{qrdhLE<={*$h3(1oUR1M|-xzVyN-$PGx-fl0 zuORzdD#%g$wVPp(N9pnr{!P0^#MB4Uc@P-{lz66>`ASD%0}}4c$0CF~EKA?CwwYrE zeBSX!C`<4YVB&m6GjQt64l~-y@li`&F&im|pIeNuN-S3mfP{i|EyTDv)2r}(Fh6}| z+Y0+!qODa||B7c5g{7XENLlh>=|q1Tzr$P7z4{x#r3?Q3}4S&1-%y5+K&v)|D`YRlJV)shjyFaNF zZ+A-8xWyPUh9>3JF#yvB(1JJ9PX>HU zj`Nk<8>Mo#hQD*K6ya?&HYvZSjSFWhdsC{@mCeEfdQKnV6g9o8RNx48*4^=#%>14@ zEuAOOd@9Z!Cl8G@)Xq~6;R!jdd(W+i{1nMflMu$^F;+;@<*`N%lzG)GYb2AdeyG@y zu1=BA87fyaD|6;*v8Q^!u2=4E_4nbSVyri> zH^-HnoG#b9F(`1#a}25vG|;bwAMW-4Qr~@|Yy-rJD&1vw?{+j3k^9KCTFZDVcein* zR&3aGK2IS7%`Wy7%6AMoYp5+T{Gd=)A)50}$0jVK^Nl5mvJgf@Vojqo>uyEt0WN(C zJDlJw^d;Z0;p}jdy+BVu+~F_hVh4KPJ^|vi%@uy7yZf&8e9p^vlRhyT)4$Ag{^!mT9kZi>FnqKD=zS>_y@fwP|D`<{eB*jZ9*qX3uu!~vdLwyR4h`!_%t zOAX_1FKhNcp$4WCdjUV?{Jtpy?g|=f(bk*DYxt-Nrs_QFk}q%qw~Udtpx{6L9U`xH zoYzwDCh-j|GuE5c0HC-K6~h1BR{EL-s3jS!vWq*@!BhKYnm_I~+`YTJNt-nONJZ#j z;a0A?G2Gv*_M7;BE?6SR(kpyyll1&D7n3BI{LHr8u}0-14%YKF%PFC=CI#c=Gd$xj zU*3l5OB|XA3=u+2d0%Cf9fswAyS5B~iRINW-1>PAi z>u|VgptGHm)>`5ux~KCPo|<#G)=MPSWhvWDXmz&N9A|>U>3xsXdRo^tSmMJ+(h1gm zS6t-h?q_k%rNWXD{7xRX82N@6rRWtL$+ARQq-5rN{P^iuJ7J&pHx_W38@)Ri59=z*B)=CCdJ32KY4^u~KA2gAkcsb;^B#P~w~cW3kIS1^y& zLR@GCL2BAd*I`dxcGkQ;awBSP#&_nAS7HRze#lia_qlT>r$s-`f6z^09R_0qxt*n= z5-el2?vul>_}@@g*_0Ec#(ufiOWHMae7`ncRSGr48DUjU7UGkCmi*G#MONE_k~z29 zI%-c&h5K(ox*75ZGgG2&;eRPbRg@Y4;IDcS@2Q|#I@LGrv-n)LhI_YlV_GWc6qbUiR&XuY2L9f(D=(=x8Wyzy69p%!22aD8va3;&Tm81XKwa{7sXza`N$7KBopdet^R^MYCvSZ{A74Wc zXBwTsafvzLBWwR^6~BZ9M>tBr#oWwxg3;WE_~%OiLfJh7Mmc^d8rI^dtT&)9+X14@ zSqR+&vbTwf&U~=(N%~8%r;W?oA;2eqD<}UKjWh_Ivo|*uxywyzGx7bzW7(0PrDB+6 z8^vCNUt(Akh)!(SCw|e;Dhv;cczyDLP`@2C0LzohFXj@X1}zC$ip4e8S|Sax$v}*F zrdhl+*78M@c+~eU4@UIMH(p(b{h@2Q{@iBU}4Pz;phMVhZiHB(kT!W_gHc7tM;E5xqsz zr;%D|W4JSZdGt{e!a0i9l`h=t^)_$ZG501;fwyS_k3*&tC5RItgGhP&JCl+_ky3#j_Vv{~kJHcyZY{7= z_qz0RK4Q7{kYA)bw2|Fc|5S}ed|>`{?%!`gevA4nATp7IN?ehx?pC}m2dz`)5uEiM z6#jCpEsY_cwN&)e<4Kx4k2)M|!nyjR&J43}+*eM7=^`ZpjfF}VG6Kz*O(tJ2l-_;$ z{^|RDMZc7dalsRA#Yg?}bb~)|CK}SGaKRKUdRUU;6iBo=4GK@@?d00UFti+0P>+8_ znJWySwvI3;R$RX}7;62c=K3P+2>BPB+Qz&H`U5n-Pa(aaD_M0G3R?7hs5#1?ZeZws zM!{~fQdU|7Iu~+TtuP876!o4#0{SZ6>f@d>OXXK{C7H~S3iT~aC*GVLt!Mm_G zlD=q#m5G96w9%qpFj?+7zq`VX^5=N`P08&_jFOcKLy}bNNIAXrm2a$C`ncdN&LF|B zR!xK~_MZ;V+2Z@sb3O!y-F)eAiu-xVAze>cb>)gJgN0SG(_6CL5(khIm^I=Os1Dqo z`dPWel9!zr9DgK=)aQk>l#1L|2a%JhXr&SS@%=!zhv%;nMFT>(pX==fWQoCH1=NS| z&vQcv%QazL4*=t=iLWLl-z28usp1!~ZlE;0s4UQU?R;r}%dl}wkmUK%1EBVtExQLm z4a$16QY!ZqFU z_ibAZ19Etu_V%D@2?zJMKNmEThUz~G-=i|9!#0$e>EQ7db_goti6`S^SgT82dw4-T&weI zT6$UBsNKriF4EY?ppfP9#BE&xI}Qo62R8-udJ%lgP1cI>0-r z65N%9y6x3_`N0=OdHnlk0P$d@WEQSMg6VzUf-oMuWiu-KksJ2}2@ub&(an`v01lj_eA9@{x;fHf_vCmdb~G=RE?(nC4{+x(dpJ5gqIt=Q~dRwL@*C%Tbdz; z-b_~mU`>pac--*5ajV44Q+jW|-G$?oZ*2^(8b_B)KW2h^`cy*tIv&(Ty?imO$JYLC zRMkN8j(R+{TRCd@PD<&%*+c%1CY(P>x)C`dHYz}g4%ED?AtL!PtHvb3VYO__)NFq1 zKj{yRC=7ISS{R?-DpFDPJ(l(wh76#o%UF&*lB#4Tc>~JER5Y2rx&1oxV|!1Vs2c%tBacXw)CEmM!pZx+b!o`_Ly`*B_1NIq!;^6Fuk>#u-!O-+OT_81YFjtL-1>qd(TV)=WADf_cfu;(8V)xdmVz8 zdnDfirJ6R6v#zXGA?%)%F9au_-)RCFbrn>F-q1;H)RvAa)9IKu){lCMYyZ3#D>k+* z?X@seVV2c3Y{A5^cuEC++h$=-+&G36DX4_d{y{y#ZH`8(fji*k?F*PFrtit6=IL}& zvzourtB;t_SE)do1{M06+rZQP{yH_-e^sDe*g4axiKMbHRS|g{Vr1jI94`ksgl|nH z6Wh~@$EQn1s+z35Ug@4RM)_?#c=J2vKu3y#CPSFwR>Q+(jI4FYtg7j2UC<@4^GLl$@Ka3P6sH8@zMxaZyv)40o0^9B}9o7iNND$zD@;m#& zd_GCHC9i;&Fmx`sYrN%tkvdh`V&a8 zAIj|2h_z2yhQFEmyB~_Ldyky4`stS`dGVxsSF>7S9aW_sEneR?H0{kZ!xE zCQjO^rFsS3I&so#u_U6ni;Dh^F9XpdqyVOsjd%+uy){{r?)yUC2r6ku$n(9h5Y5=U zuJinv&neg?>$u#M1{}vq|KtvMLkya~Srua* zI!AFNz*EuacCSlajd-30`%3OKbF^1VILL8}O3xok<#^S7d=I3?A|jj8Bn%XgXOkj1 ztD%qEg6wnSr7-Pf@AMX&h+>+1)+pfgU!j`tX> zG{{;*kIGJx<7Lxt7eS_i9%(*M;3kf(rC^opiH(aBW!T|&mn`29Csq2uQx#X(XP}$n zIx|TIIJpZg61{Lt?pvt`B(G`dY11h!JuT*(o z0P3+SQ0EVfw!~Gw+UH_Iub`@7uG5K_-)1dkO0iE>3lPYvdS*4mzaBq1m4izFQJ7V^X^4Rp`?0O+My z1fEH}pOeNhZSkolL7%hdcs#>&46^5y`Xv|(IQ^Zayrhj_mqELB#obY+O! zf2EzN82w)tLFSJ?y9daN;0}0G%}k-RpAF?RY6iLa4^)_+<@#luH@Imy(0?tANzuB( zk*H!=mmXoL<6fK$Pu1QR`0JB{f>N3PkeFSmTv^=$J}Zmd6Gzk2>l040PTmyiOz(t#=;oY(|sJ--(V{mKt)vVgu_DG~55vXpaY5v-#UEc3f~J zK^E^n+sm2Oi@pMTth-a)@KG2RnuK+ zxg*Q~Mw;I}|E~=SCao4(tM<_U70E;Q&Ht878aRlyFI*IGkdk$0D{fj9!ft zU7uiWF=Hpp9G&>O*mOE{@_#5S8J@J-xjZ ztdV}{R^nOv-4v}Vyp#lI`cXjJv-B-_)O+2be76h|Cu9rp<(cS{5uOJwtX})*|4nW= zCTc>@vxTW*VcU`yvSIQXD$RsW!h3}3ft>1cS8ij_{)of_OC`f%AGmJ@A0cz{foIBq zc~tOGGG(g%i`2ULl@(&mhxxdf2Rv?ZCt)gP3xdYG4AMub1e*~F8c9srpq5Yg#9J%c z?lkQMI0aHRYB9-$R)4%@!8uR1?`T$y+-Q7kO*8cP4H+R?zs4gVm}G;~K=+ONVVEf1 z8QFB7xnjD00%5!-zlKXvdJ-$`;B==)I>uqA3Ca0DhIT7TM7aAl&s1llUKvaF7^#84 zR5$`aH&Ru#b+zk^bJ7*DVnB3)kQz|GR5 z{Au&+$Fjhk&ru2^zk>frN8O}&4_#c6JRr`%u}#&d_jU5Bz?dM1Fh}!|)ER~qp2T~V z5zGI>j49f%jbC}A0+g$#NbphLqwVd&95}ur#A&zJt4TXgQ}X{WevEneg_#$mGG{7q zSRC-A0zJSlY4^kSq-}P$`sAF_aQv(E7{bAurI@sH(+vqkYYY#SH{$Du$Sjj%OXdf&z3&RFFcx1Z zuW1$H@JzW~bkP@yAQ<|h2dTV%?|KMx(QZFYk}kiM*$#tx|%Y!`Mu`j z?4Tb5mWrvbe74rN-*lY9{jLYm<_A>hYp#5cf5AN3n}I^PxEp~CsdRZ-S3`x;Q29SQ zpm1uFY*UVi3on$ZW)vFTLcREI15IL&%FhbMvwyTVOI1Z~++m*l<=Q%gF}yypfg>Y# z#1;MM$`Ajvvh)*k5Nvz$hGd)pI6niVSK24$Q(%!mTgu{&(+*lUj+Y&yf6<2L!v7L% z1;QZQ-xsuiE4HU2QDm_~c|tWUF9zyDHxMMq!G-^axwq`9V_my-Cm}!x9^4ZMI&gOh z?(XjHKCs{pA-KD{`yhb;2?QCq6WrZ>7ny7A^X_xb57=M$Kx~XQK-w5f%7UP}rBb`DNaqNPq6=vK)$Pyv5$fKUP+rn|05Z&Sm zyll+f6X*S#Aw_uY@2<|ZN)F^$=G`W5qUM!st(p!dwh;wp2?wiN8SiI4tm@g|^dNiW&AZk;eDsH0 zzD~LGt)xiR$=R6rMl2B@U$#Ao<5QkQiC8(DdzQNn^+`Kis}e}JBR5Ca?B^>LhFODn zGrOKMVvTUhx+khn)NgXAN!_;cHNg>`B-In9?HUme*$ffRRrkiX6f7U78V5~D19JV&jpBo|Pvf)q201^_Oj${5hD;4iu;}!G3zV} zff7eC>~w$55tzutw#*Tc51uRY9|udRJ&w_Sy(}1P3=|SMes^U=G8VFJN97uHW_^+R zK8<&$Tukq`Bicl=qJQXJQ<~;6tBa$4Ijfd#RTHA_uV%jLzJXjf$20^;0*jdtl5i;X8vo!ri6geKPpTL&euk0wjTGb;^dDZ3Y{|>%ut(8dMRNE|Jiy&UWSx0%Wkye@EB1w8%&dU~%^X!#y zLs|?H%f1&@3Xlzk>UVYz<4WPz9WUcl*((jDXO`oa_*4L6zl~wv#HB=~?x#sYDo1`b zx2+1@KC(8!&s!6L660w?tO72<)U_@AIMl(-V(se~YFGr*b|42P=DSE4XSU~r!+rQU zGetMMfqj{qa;%2Spq{$F$eH-BX4>fqWgBKPpx@4q=4`J4ksFj@iY{MriME#y?O;#j z!7x+kO!ywXoB0Rfhto=`=OS!ZGuvfkX$D96WzIt?SA+A>;GU}$ zBlSwc;mAX|lC?!0d|rfbpHltJ;Okp2JHJPJ6SikUG!#nWQD(D~)MT7~*hdz$@Fwt7 zeGx-}2CYKB-G1t9wq+W6Z}!DDtlBf7v7Zk=NBqqLiNNzuw~xr;MRknB1l@S5nG2EF z`*kp0PZ;-q_M`nmjXXTK^y=Srg|gA2#_6VT38E3jY~VY|$B-=invt`fj|;EI85&xf z=TI>Q6ZH8w(fKiF`g$RkMCd~uFwJP3voLb5Q?!$s^JH^4zI!>p!kqF&JfAY@qF`q% z>7GWvRU-;pTcRHnGR+YnRplYymZ(zz#82m|`Z!(3y^`68hT-Xb-n*3iKAu>AGRs&MqlXwvSs9{!G`5aw_Z17UMQexZ9KDCqX z!rBNvG_Rf4erZYC%vC@A{38a2Qua@QWM;PsqMaB#rFM^@1n2aqbc`0Y>{|LrHwWK? zKxqp39S$$2uRaM_IwQqgsA`c>m`=<@ZB}w`I4D+pbFR7I92ufx7NS)CEenNSC2+3yV8>oA!aqV!laA-*7lY ze^;R`f<)!+dJw6u&@9^&GdTpq$%K5IZt0X5kbRqMWxvey-|cPsWGMT8!+}8Y+osDV zqmZ_P2^U8@ux)O9ckM0zqxmkBArCUDs=~C$ZN;&{AUmlLGMH3kNjt|9`OQ@NZh2%4 ze%mG={2Bh+Wx}@o6`-S<;d`;t6s-q-i5QB=uxjEfE*tF^uvL|IM!wjBJheIO1uVZw zn>L1&&6m%jUP}b=lz;C%+fvWbmZ#LYmQ%e7U17I6x8NNk{4kh(Wo8;GbmSSZ3><>% z7%utpl=rdd<&B#C{X{$lffxX`3Q<=Hs*Rob9tDy!e>b@VF_$kocAMMgpQu-%ztgR;9J8h+a#+t68)XZ)f|5)B|j9d z_4XpN^T5Y}NkkuKAvy7PKtg`Cd!8dtJ2{bf1q86&_?iwClFB#ZLQD z7S&G|bMb3`;W_{*32dY=+$BB|DS`FJ_XsL@t!&n=diMxW4FqF9PHt+?X>1cF?D+vZ zM<14qfMxu>0*$awK}2#QxLI0nh6Jc+HTE}bgdIYQv*Tkrf2@Im~a&>lF`GLciZ)BHN`#3{+q3cXT;cPUzoVdGuiN z`^5cOWDi+qhQMi}|FT|T2y>IDE3Gqm3(<)^I}wXT6X9Vc@c3vSGGh73%hUEBk(>|- zw!Z>45(9g9yOw+cvW!eqJd`=w%H%6d(%N06DDk5fsNEriin4tLX$GTWcH~!KKfz>o zh2FE+&<+C?xSgQM4PMXjhu%QQNXxfrCE7FDbT@jvAmzg~w4-Zp<-Hx(zbZVPiKlvs z>!ZbIqb?4PJ2T@**&=%u)rD2vs@SIdOVxIIBC%tH;o3-_Ogrn?Y%B4u`5J#a?B7n? zPI55O-o%!w6Jmu$hs2{7iO0V*t;HXYz7}?NVsD+Kf|zSU`7FKqLdNxq*>>NL#O-ee z99c^!wDWOmX=p2T8|bbclm=1wWWK|9=l;PT#*{M3Yjfy*S9p7<@yuJR!_N{Mf+dB5_8bUtT-sB_)R@*35yibY--bkN#v-i zk3hafaF_Y|5e$Oeuaj|`?l`Ecliu-|yaA8hvbseg_G3#WeVL6rOKDo4_Zy7*Qd;PW z=+;J(Z19?igC#V8Glpj2g_~JMa@srlwvK7nr$#@M;l_qL9ZFDn>%Lc}Zvg!a?-j6h z?`TQD_=5x`t5p(d1@Cpn*kXJq=Ng&Z;zw+VG1NYC+)KVtB|Yl->pZ+=%j#P4di}xi zUNvr)Mc+!0lW$cYN(iss{Qc|a#{<}p3XLVMWMNUAo@0S$Enn{jLI1-(z>AX7zM`4x zxQ?BCDif!4<1jenewv-wBmtW!jC?n+Z)0aaW@q)i_MOnP%&!mosXu)5Kfh|Cb63mT zOS&qA+#%PJMEd+n%mN0x={UV~0-@NG%&(ST&Sm!`Hvgx0K-A`HG>|4B@K^d?+mK>C zrQDM0tA%}NL0Ev`Aar1Fu_)+Ci~COF%ptJH68+sd?$3Cx_K;PVSOUJc6rz`+^IoqM z?RktwR6R%FfD`=>YtTW*RJ{J|iW~~o9Z%+tR{@LM7iPk>J4Om7M$~hU{V~P7m;r-< zTfZ5G=Fu2hkv-;YP6w2O_!xy2(%s7DJi%PUn^JBQ-!(+@r^3bk;&+;xxbM5}wO6H% zGOna~Gc5>}+RS?9<=*DE6tH*JB(EU{a64tyslks0I<&1rh|6zE zpP8mTd>?Af4K`9e(K{I>N&>EeEBeD|808jWM=N$oOw-lWN!P4yN@3!V8~cXwB-qm}+!<%?1GBEK{erCgJ6z}7&m6UQ~iyCkjHE*G0EeaFGg7(o~W+wAyHnTP*)OhBuo z&EuT9W=qWZus3CtwBh`R0m0T8)*dA5s7oErh*tdHUCk$R8Y35AokW@) zK#@2&c|IH@JIv&+OqE}Z(ge*R=o;7pNnyC_@nHwHE%{>d(!dKGC0fNXTwZ6Vrl)u)=I-b6d& zSXATpQ2_a(s_7KIeKlhQr>Jx$Mh0y5jKQ$) zKXF%7HqPA@d`Q5>ct!EzbdbXH>2YVx%@pP%G|cnF>qq&-_W7Ow!z<>@xG$*{VHJPumb~D4oaQa%)MZ$ z+tAZ#H_yrLJFq5)`2yK46lqBw?)D&)?0D8PHAyb72cBa^z^S&(&vriUL9Y7;uJYsQ8-yP_h!ZfYlMT8K{j*kPV7 zsoMgVXC*x}mNMtciaTQ_X{_QajF3=jqt-RB816T($C>E|s_baar_Ib+fcl9~_wJ>z z9jCik@(ZB2QfgjV8#FfM$UnIWy_xZy$Ccko8MsX%14`azhjmC7;z_$Db#CJYSpFts z(faJUh5CiWeHV>|Uh0etnCtfNJe_q&V(B>T+w_)v+|ltF{Enfp5Mj?{9L{7jxsy#5 zQ{yu1EZ-QWU2i27z`>^1c6!}q={Jmu7VVhnT)0c+!axvW@l1&au^JcyQ^EJuS?^M@}BQqnVwsPoA;Uu*fZlE zb_Af=D*p8e^&*GAbg>a#y~ez~z}m{?-;46DZ4@t1Sm(EOR`J_oM>s)7KJKg0)89`G zKF=yxa!>mg6CZX|QI8hYT;J9u$2}Qxd@yi=q^tIRo>MEGaZcRM^jJ%-o)9lI-3a}_ z^i>U)BmT~!{Oy*6Ms&QbdgfMV(SmZ>WuH%9#L@YlTiSHG$8g+~z0?KMu{84Q3WM>B zC$6yR^@;p{iXTZD4>`iYg>Tj4uO)iFpP@gL5Eu%Qp$fZEX={nNOTlKO&K9#;9GPI-b@-_+WxlvPv>QA z%cHA{g({?y&dzuN`nMC~QSOb~CqkudLK>8310ZwF$RI~s-Q3Fzi^_p-tnL>G@MEp^ z>c>QsQj4#N*-R#c(WLe48xN#?{wS$mh-=1One1p2(oPXp79t?TI1o%LBqSCe$uQm1 z8(1Wh+_79bpkEbKJGJW~_PG7XQu|DfJK=W}*{s-XC|Ab^=JSv{V8yK@v>AI!yc^TL z9OB{T*MX{c>2s|diYfZ0W;3QdnYv)M#e%d9=xWxDeQ`U`TE1nR&M@WM^N**ieOq}B zz%IsJ$m9JZeoaWZIx=xr)-QozuMc)NuLngQ_$jfE#A#GGK zteLPbB0>tcMCP@*yeT?#%%ahs7d348805oj2A?R}esPxpuXHl;BpkduT1aHev(xZOuhWwcCY~IZU)MLSc8&TRXYnN*}vzI#YN+K8#8b*}4JzvHx_ ztId&1kOxv1hx?%nw-IfL`k~(f{i0y2!kVHE0(4w>w<(li6DenLn{w~FIFJ_;eK(hg zgsyql`X$VZxE&^g~R9I~TAwg8+TPIDm30T%_2zj+uw!hVTNxx$b0)s;H5b|HBGFNN(lC$zpO`Y->v7$o5-A$ zni5$Am5|>CmZAH$p?6OW`>RjiE*&%t(~HYRHO%AhLDLVw8P4X7V0FbK^FE;wjZF92 zO<4WhRnxZLKdBu`h4jg28E-_;cS>MDxT9#+&OVqHk^rgajV44;X}Y5q?~EGL)gYKui}osdMhFj&jt8N6yV&etB0) zzAx`RA^2{`Xkv^Pj{$}3Be+AM67Z{W4{Z0zNYz$1__hJMR&=wtffA1#`jAN6E@pJx zZirzry_LMzADIb{(&r$Y#&BMuA;uqKCKn|>@T!M4iJY(W+0u}d8XI5^*H{4~kz+Tb zy=Y|An6j;e8cE~ZG!Q&$OR=4AA<{FS659D*tIl}kxpuPPDW*6?(#7Z@>47)k+jay9 zG0Ow6Tt)@n=2`9M*!PR-Jef%bF)@Ni(SA9}DQ;ZCcuf>dsrX%FPc38e>;>;PoLIhE z;%tQb&G>P-R8|+_qVsG*eiYSo(Oru^Q9o$l_nPH0CR1gJYUlE-cs6E41v1NR{zy|(R~Jn zl-L|dB7dXo$f;B}Bs_U;d=-e842%5*O&g;a|L8|9`gG+DWzLV_c#vP|~fhUc}e?exU7j%^hsroGy&L>d-c z4ql7gukFgzX?ee7d>j1nwxBfV_$ThFOVLk|1z)|bg2)mU&i$(&9(|mvxy75vv!Rq)9Ky$=24u5$=y^R~;&N&+l_6g(|c}xrk9{4-A=L>KRas;@<0c$O^nU_odQiEVkF# z(dC@){O*0_T{Ib-YY^@3II z@Utb+k4SNhzxTjV`+|-hUQC*4G~9O=6AGKNT;g}wP9|lgq;XR*($Cw@;Mwr;XY&XS zGzw{xmGDf47-ZTJdS|UJxn0zsyRP5qx`OzU3(KO@`jv{3=F@vQtWPj}J z)E#*bPe^m8FmrMm*2Fou??$|PHXo)B<5t(V&UksL)O96sC?>);erT6dJE@azMnqB_{yw=%pShc&Qq$A z*M9EXufd(W1cY85rR+(TrVf3pb6JU9NydshiH(E(;~z;d>?@R56&OX^6kVA$8j&7T zppo87>CJxWqRlh6qJ~dLDWyo!`<2oq272Pt7+@uFZ=gbcb`B(vsAKjg*Ebd6A!Eg2 zrVJ|yTF;9qQ+4?N^_4~3?aC`>Z97a1#_*^%QV{d9lUiTq@~rr%Cc<*-vEQ~k0D&B= z1%}6SYd;QJc;BLN4z}czw$K=yzAO0y)_zg1iDrqKRBOVde(eTh{xmauyte8_(byJE z$Qf>a_Lqh=lx|#|?#-^r>yN+vB{mee`3G0ZG*iT<6WGFif3wF8|84`J58Yd9L*@#Q zB?c#Pds$ZSum{3+M|8QfJ0Lqswx`E)WM^raNih*|685{86tOB7JZ4cU__Fg;bs2T_ z@!B;Ju17n&p?iosAq8!}Tti0ACoDy(DkWK&;8(Xo|YUls3b z9cSB;P`dY&FJl7LCra&+$#XcL1*4CO0ZSx9i@C$AnvOUt)P<12OZw9iQ2g!p}k z{l$^S*}|Rp^s`MWv*ivg4Z91x@?ivl=3RBgUQ+hPo`3$Wu>*Wun2h9UClfWtHOixVmqbWHP_>>bJ>Z8nLz*p!7*`uygzZu^IJ#up{eY;Iz_ofYhY;aCAf&i>E7Dtta?37K#6 z6exyK3u}U>3RMZ=@!Y)6y;AVQdlFXp+YzrvmzDqe@Em+{8LbpYVGudJPlMc_6y>Up z2$kSbH3q?>xv2)$5yjniZPrYsK+A*@A{(a!KUp35VKnPpOXKwe8_zGC4VXtR9GmI{ zZPl)%wf%efMdE$n_rr2->gH>U*fN+yjPOYTCO{Ofr3%N1?`}ZQZPW4SE%j0pnM3LJ z!b(+T8pn@B$FGd0zEe~f@yILeH0vg>+XGL-+zY5A1;y=mo02WCx-lW&M5%S zx&3tNRJKwsNRpxm}=y_{k;TLt?3CmPT4#!nF12=Dh@l0|swySADZQ{rH-moFS&M z$q|-aDO-?_{7rc;>VfAykjOLkV?4jLTC~f`js0aVIJK`MQ_M&Nq$5k?Fb9WIksp9> z;+HPuE8u=e*D+@u<5hT6$kc4$;Ny$V&j(0B$$GXud@Cqh2vHCDB~0EC*d3Ure3dn zyhCz&CX37aZwLHdR@s7EJ#|J)oSbGJM{j$Y8qn4BKKEe@T~}-IfIpxSAnPY0WOv#` z>V}Lg7;zbY6RL4r^Gmk!AzPV48D{dCg#~r==2HntF7~QrvF4r2DNV%2igy^kfeUlw z&vkppe5b|8gT~(beD)sRAj|ri30QGmh5$F(_HOTNw&-3$8mwjM@2Y3+{N2_6dJmO- z@4Ny~dGt(~a!m^mDcxq3BknwO44;oAkCtiyE{>&rPKWqt+p71{@At>S;?Mo<>7OfLO*o~%K|*Qj;tL%bCJ(8aloyp z^awd*ayU1q+MtdtK5b?#X$n6`LAPqNw@|{^r&gDX1Z0YCv)gxyuF^o zD6t@h5{i)57fhswV%HTEn9mpN8xr?uQHm2qklNfsbE--iFIHyE?9wM=!F{o%>MBb$ z#%Z-X<5YF5LELoa?$*zYPWk6qU_9Jk5fjnA7bALc53{vL-WSEd^sr{6CaBy2a;H7X|4=y~2FTv@JwN5$KsJmfmCVUwu01 z(nCGB>4Lfh8D$}cb|*8cqQSNbsD_sp&^sQ`W+yB?04xGI?E4+LHGVF%^C#;(T}u~Bz3c-dODH`zvGS$7rlWC=--LQED0VNrURM!0$vh86c*gx~Uxx2S41=7L z+4i1M30!%<75yu-`B!}vjN+RC_PT;Y?-}`}-YTA1qX9)ISCZ!M^>uhAxJ~;KqfMVv9fYKs zFkwX=9a(+?A_W`$S&0}Ul&H6!={|MK1vd`mU+1V2ZS()=_LX1xe|0CY9Vnp8+&Obg z=VXL=op0s+)CA5?zIaIuIkEtUVJetl!Wk=)Els192uS&hA6tCj&dKIWI~V<*K247S zLcrabSXV_ozbnn_ug!bIg!8%{)iY8xR-JgO8qN6^3N#yXeqR`M9D z=+Zdr>Y_9vbRm2JGYC?{t}J923JNa4+yZ8-ePVadK7)i8YznXBG*nP*k ziiv)la<_$R%w-VqT$w+4|7~N0LL$14gIeB$E%shH%A1nU)p*m_cThbYjOvnK+rfH}?#6h>E9eT&gsjYCk5quEyRE?M+Ev@9Q zA2w)0@>*P+>D`X-d9^WeR&DN1&9>2UPnBiTaoihUn(3y=S0&!)y?ZS2tJ;KgXZ*ou?%P^&(=2;% zxi1!H+?fqer#w>ow_u28Wu{hGfS~TSDD6Yd`L}O%s{Upy<*;9{b8Hnpq+EaAzOq4% zSZxS&yWDBR7kd7HNlC~#IPc4uE|^+J+OU1($Ebbn6>tfUxA8IN1CbB%;z20;3{Jwt zW|^_3pC*HWsd_H!w+nI3MF)8-UF7fg!XR*8>aisipEc5=t?yQ#TNiP*1+im}drx~E z9ykk?$Co*p*VghJdG)R%3IA0Cj%)V5_+#ulyh*eC-dEfPp4LW-uEZBB9N)o>5(g@8 z0`AZFtzIiMP;tDR zuM?E}bJC67D#+V7AYI$Jzuo=V{<8U?bY~_fx<^%9B^k%Q2=E&>y69&pxq7kNEwAwW zEk(ZLt~ZW!u0&k{KBCtd(8VO*fmh41;MP8a1p%GVe+p3h03m-dgXjvG?6WgoP7 zRTx-yMK3-YzH}ipS3>^|=;|0s{?7K^k5Gh+^_XS<=pG%Js#3E{;)qG`m zMDMt^_$BC@9)CHT5aJu>PDN`N*(4N6TaC)F&Edhqy_or(>=v{|0uA^Wf)TVierV(uUN=qmRWQs9SsDJEPONMhs1jf1?M3tUzc01Bz*K zfi_INVkEI<(r!5&%xAg68Q$M@=-6pIU91NzSGw+YhDfHSP~S@8c8i9)HB`PZk|@Xp{n!q*FcHf!Zw}| zP(VdnKg*{%yG=SPdDc^#7YGh>2K0x7g8xiOZ`%%6eeDAGjYHMHcWe-&#C6u4NWvlOtT%`}+t!*|n?vNb2rRNID45WRM zk65XesAy`s`X z%uYw#-bojoZ>4hB*=p`Cn;jgo#tBJ7l7TZ>yHQHP81c+M=207ccUbwBJwt z$r<)rn*^F6iXSt2P*)Fhk;wEpZ=)6gcPZc6)8)i2;VWwQ4A?!KF?&jqEG#WKd8NGs zV5qx?&FO;Zfv%tcg~@FW3Ra4qoX&GDd&u$&fJvU&H&hy6oQHZ-@Tr~U`TBzb8E3w? zYg3hA3w4i#URC!O`e{=o-`}bAF?HuRkxXf%^xnvNx@wm_zSXdEfQxO;H`73Lt=Dq-Y-Lf%s7IPvZA)ToF0{!@;(8R(IE^xhGZ->^ zq0QTwU_Z@+__ByKd}2F@zEmT$DMD_{*~zX$h}z|xF6iU`eAL?pI9J9$0)zAw4B80^w#25L4tK#`bLtLN{Qho)p6<&&E3+S={t#TD!dh9P*NNiV~ zls5i@v{BtEs1tP8MM0ff10T@AOtd4h-o8j$V&-+tBQ7p(Eb@ovE>3Om$%+-R=dpqE zPmFXb?k}nGDV*76%YyIZ!%_>`-&Oib`8ZxUVKNst@T*=O@I@hF)Pmzk&neDl(TIPS zz?NCV2sC{LmVz^sw09PVmV$x}(7{jfj8p@0BadVXQ~%TW1qHdg`cq%8CZjFQ<0bpE zo9Uyg~w{1k1g5iAx;@g8FX;d-yC>foE8AdiNY6fz~M zS<%Nrqo!G{bLo@J!mPl7V+!=a@+DCyzzOB5G2g8vGiT(5wDH@q6Au_V%(1FrXsB1uevn1h3uk`&6kVD|U-`;YpK$7s1vQ{{zhF%CsUqAC&& zsJR~-u42Qm-K6ZzRi`VZVwEm%SJ6bmhJL|aOG)cqHV zaQydQ;iht(!Su8ChrR{P9}^gQ*HFw~Th#};#q3;P78Fgt?z+Q#`hQRp*AO3-SZA$g z*$Kb5g7KfQ1gIoLSQqq!C@E^D$;Vyn19h@21>U`0W*q2YtCHBJpA9aSlx3Wa-l~?m zu&ubFCp?PHM~K%?H&(|R? zh-OJ{5H0uI%x@-Yl7sd*P`S!z7`VOgf(q=}9)v!0aL+;h&VoC2-+{m)#_)%NlY^Dl zy_|=5+Q&cs43jh-Fc)}2Uy1rnW+gAbUg&sy^BR8as+`~i?m-WQT2Cp-q+&#>+8@5m zchCA2-Y-h|t4b0neq=#q>!_V&dOJM%32io>#oa_bg?|9A#80g3OUP2DlYZ(l@<1BN ztm)TV1~fVE{jHaUIFIDfpl~kkClkj%VYWuZK0_hPQhuvUDy}PE&{XzMVso;cT%(+K zZbS|dzzT$S$3NVvoQ7gTFZ)XO29Lt=aE6Qi^I}NqoVSv2PRdfXsPw~*Sum?42fA4|b8)N>e}^sv-E8lY3)rQ}XK@u3AJ zRN9M@ew_TFwJDc)B-W|o@7M0&?Y8t-?9P~SF#n=%^X9QL3ovO zOP1kpPnbc%zfu{@LAW@~`_`#T<^jstqs-x<{VDXmerfG9y`Dic;#;Rnl19Hj!|fdbUvVQ{z<4X7pSF2ck*5p%W`0!ZT=Ej+SAo5+n|fJU=S-ZF(-mp% zG2EYP-(EFXY0n8<^fuKHwqvsh`gVvSp&|u6{jPGJXl|dz?gclh?LTcqk_I5dv3PE` z6M@8>LJ`pZGBcIT|NdVG_{0GR#8?3EDALCZ>g^{PYZJK5j~6a_KoT4A{IJ7c(M9Dt zi8y1i3Vq$~V2PA!AZeSX^WG#DwuLP32Ra||Da_>JbPdC?cLf#_4ujAt+ET(E?R)gZ z1r{Fo%Lz=ZR7Hw zJU4&Vw+0miz#obRU~G{NULs_S@#zoEvGosQ{-OlO%?|vy{VV^{y8<~)+BfxG%)8=5dtuF69C3ON1TDNdB=+*#(!BF1Zh{nCrM}kAa%gz$r++g zv#eIbg*F39A_OHR56vWvytU)riNapzsTkkYNWp)}^qcoVz4h?pb2!~gB&>9)rt6@2 z$Ub>;QFwl%bTdYZblxxV9nGuy_CKc6HD4FdNdOUon44QCfTYOJ&D5)4?Iijq{%L>W z_X2YPe8#tLiapwZIDv#Ey#KTaYOh5y!wi&NRfe|O&fm9?8dCA7;f zQjW-ju8G!8MC)K*gIxL<#>6%Yf86rmd|&#SaQ=SM$D98vw4W765qy>WLqLZ}C&NY& zKf?Cdv;G&R0Sd?tdQnep$C=PfW92v0G&za~NR1+{_wT|SZxfHB@SJp-Zl{){h2&+5 ziOIW+1ttr0pLOjM(s8WscI6^_GiVMc&q}Hm_T)9-Up9{6XA`#lEWlio{_#J1b4nf# z7!A5_8TO8zn}pr1)vibEHUQckP)aM{ry8|jS_l%yU-`i1*i7^YPupEeugl={HIAS^ z^8G7n7$6p+lmqw&XW~#d^`cE@T}7JhOPf#y>vP#Kc;&#Vv_6FJ31sXnn(vMAHcOG` z6b;Hmh|3J@w8<&jiBE}tOyA?A%9D)y*n=@`4MKC>`%Qceg&^c=bf1Ac3a5`h=G{|- zpE9`<6KXr!#j-L|ik2Zi#vCv&P%HCSAi73G>*3lZ53|g^;29qwWh5RLJzn?4|Du=u z^X4|*Zm@CK$qGMji)O%Hg-xN%tY;NcU5L^YdkF&6)+x{<{i@f@2Tk~JBh394gfO;q z+FR#DK$_}agl{8Fpm=k{1hz(TezDB~pF#$Z^uL1sEedEskDc@FWY7U9n6`r2o9qPn zn`!PySP?h4j*TX-3oX42ob$p6GIOE zbDI4Y!A}S`DK-GS%fPm=$?0>%1fJ*H1TrLa7*R?Ts0HRXCZRLWfO1F zB5WH1RBDt+(+&1RSF=disx$hZ{Qg$qvK3$EJ>ag7vYWo`T7L_yro7miufJyHOy?0- zyo|+6S~366-SYe`ZHbB|6b79ZiKn_8y02;>5nQL{<}e!k-9JGS|F14@{(U;YkAIQU zY)C+y&^50NAToQjqbI5~u-`cW5aZ>@d?~v7QUKHieFCT3p~0;_<|3+r-YPwPCts|9 zerQFTHcXg}eJPLrg~0BHJj-zBP{TIqa#WbzMiEK&Vrc0p(opde%T-r0YW&!u! zCswpTw9UWG8o;)HA0zAF|B({UeAQHdtE1H7f;o-lAht9LUQL-e7v7QP-TN)3c`~d_ z??_t`g%#j!fYJ<63>=r{)%EuY7A_rKEY&&|veZDjtAS&3u0qifA)#l|n?}w7YNLR| z@3zxx_4B!?NW2r~zX??cG7N|@eVi_ZNp=Po;o4it!Yaq~i74c`GJRA=>0=9s$kxA$ zxQjH7?Bg=CYbQ)~$9xC709(q(Lm7r%tZQCReWY9ltj+ol11$XKTZ*^o!g+CemN!Pc zI0x?eXA928%@Df)6B%@O8Q4W&c)pC-3(bG4P>Duiuy!Q~&^8VEp8@t+DD+hKP~TQj z`Cp`P6;+nI#QlbY&4h;BlcCu|S*0l|BoSZGgJg zV7EsHE`GNZ`D*iAxKZ_|)hCl_;3tfql^!GnBX8ZHQMc1!qeb;%w!| zkJhgr5u%;bb8AF19A2C3btWW@4gFGC6`Y8iR;h9{h{vqI90LSB8%0xl@joH(uJ;m5 zEG&TmvEbCFc3ihUq&mZ8K01F2?qH%%l9fY>tD-FqT%EF}txwfrkb%Hvo4Q?cav0s~ z#yr3E$!pE-I*hED(6KHZ`BarH$(IKeB{zFlPr7-`(Nmg$>2g^~jW95s+hGezuPHV7 z+ms%<{uyXSL6!~&$5a{qI@ej_CR#X_pQoTCJwaQ|oNB!p7q8YljL84B_-J#F9|pBv zdZX`XIZV$#p$ghcbX3FbVieRX7(6=q{V~aKm3ZZ<<|p>yL%GX`bg5*Q^F+^ z-)rZi2RUEPvcl^;w^ydvSv!JSXhYT_o@qa8PiVLeG|@TrN-(XOp>MaXI0?Fu-@jjB z_2R)A5vsc&w(4(meSI1}G!uRM8*V?ABsGqs2hXFDYV-eHK>hDP=?lDd{>XSc<_E;? z6;j~7k;^2Y!*?Az^TiEw=AK!CDpzs!XVF}Xj|K7!VaQNO=||-y2$xf#4TrTu$(_Iv zdZ)7}Mq#I#a3n~;&<&Qr-7GwHZ`jeb@jIP?I2`OZ4suFt3*W);v&%f9SK|#kFO+PB znPmRKGjWR%KG1JVDVt|tZeqP)MSlE!#;cEt9}=)5@~`(ZkdgqiPm z+8c?QQ#L$bzFss9Yj0*+n! zOP$=ndVM_|t;+w8A(A#vzl}^;Z+eW)#*N8d9_f)rx#HA!ArtXEk$2Y>dcm4TgOgbU zAF=V|O5gb}0b&>{RR;KFYFBFhduov&-w_4~*e?dTEo_E?=@gySF2?Om%M10In@Ru> zLM0&c*y$CbX za+Qj+9D;xQa5nh_CWT++)(<;t9j)Zv={LMXkpy`{u-(kwig<#wv?3%&Yo z&gNlOm-758I`m}pILPs_7Ar&F#fVzuv!($wd{AqlhD|)|kAP;79H_DL-LH(l=SCoEMb zg>zZZ2IG~fUB;x?6^|=lhgSWmamj@(z{BWxSTVFX;Q8G-Q9Y{rJ0Li3DH^?uNa*7K zPYsrv18}e@De#u=s8-)+MrtwkPtBYLL6ofs2@+&}{9q*fGC}sLi=&TvYqx?o$*65- zcG$kJS^i#jJx`bd=#mphfL&>$3O@SD4e*0!mSR>%zX!nBY5&NQ@5`4D14vioB^2i# zpy?uG!sZuml7%0Dhd#pCM`X;fUx1ai2;mrAYiDTwRk=fc97A|9WjA=qxIu;yU|+;? zM-uk6u}>@9z{5FG96)yOUDY(uWI-_OzDkw|rz9_rWhC|saO+|3Xk-GOngU4#yADzC zZCKKXb(c>SD!9){3+U?tHDQ1c(~y@nxxuZwPFo>PR!IbjyEdPD#P{qz@X-WBh%t^W`jCu#}@I(as=431XCvdBD$Rh z*vo#)7R%Ba^UrS=4UL)%{$Z~2!9%+MQs!1F5}om2(Hhlk*)n`eJ&1XyJVvO(0@l9; zUXsJQ&*T1*_65{Bs16SV#`nrVeK+&cE6#W#s?pPfDP7#e13od?5uZp<5SirbfQ!d< z;@RI$=tb$nnlF31gdhLzGBxA_mZ!w~I)}V54j>0`gERieI6Zc81f6|q4K4LNX5I#f$oMC~#L zHwe0Xwg!5Aztqyn9uoqMgTiDsIQEn7AP2F7Kf_`t8Tpg7u`G^H3SZez5CGgE+9czJ z9vB5~8d@UN#Dxq+b4n#jwRJeKSsKc5f`NPjJnGMXHXD;_(rQ%t8F;Y@USirbNMr_w zN%sxfmE`qG&_{{%&+fnfD6u~mNeL=Ruve1^3jVl~v(<3d`n%1pXUnKVc3%RZDGmFC zYL4xDMqqUTc>pgnv21_w+>_r0v6Q%Pv-KCS6*>jO=5ppKQc+2PMG6fjFrxded2ctV zU#-RY|I9fyqL;%Hk0>2Pj=}eZ zmpzbf);iwMK)5l~5W*+y%TfdSW_hBV|Ha#T2Q?LSfxapVN)eSNpdh`2Kme(sOYglZ zJxK2z1?jy*=rtfE0--nQ5PI(*UAlxCT5j6653W|e1FtB_rQo`(*h-F!y1KMlk6-O;E;;458+2E;`@ zV&e7T4ESu!r)NF&yBJGxOZ>G0o`Y|O{HX&1jk8ym*S@-%s$Frgg}Bze8A)Xa{Rvm~ zgi%WHdH*g8E!6$%!)(n-5U@3EYQntUOL&Odw$XHbn5% zY2umll?i4BPSGjH+cb)y_M85O=@ane~ zC8pK_HH3C7P1S!KJ5WdBsI{C?Pv<+jC?q>?)~GqYUZ-jIdm(a)G^5g}Rmf^-@Sy^) zl+$MCSMN2~oe25vm+Hv(9?lkZY;-zziO+-4v|<@uwl?H>@n--Jqn@UX_yncJhuP~w ztjv$TKc|x+&jR*7RoErAOHgL8E6d@G9RErF;pzOErd4UOluf5I;P0Eo$0z!&86sbP z+@yGSQ#=(+?$skx9{+Cc^hz3d{>$|zX7a5azxk^wR^tgh$l@7Ib2k>|tF~qtZkMBR zHNR6ox0v^=CAL8lLwsnr$&?knl@4aPkp;pn1zXIBl^Z9Y4 zvWwepdJmqm*5sZPYYxks|9913M>)f-!x2;*^qGpcWvfHwdHGxw-Y*5c_5fIUwx!n7 zTpPVScIHS-0SWxgKAIdi-%&3e9R84|_z(M8rzwx;{<`zz>z3s#RlP6dDH33P&m%QM zDKs8AtdEd-?o!IKdipOBVeDP0yD^KGv-J}}p7tDc0U<3rb1oKi2AJT~|FLLrtwNQH ztj=dhA(QK>VZJ}`Z};pe)?qeRUgb#0ovBu;WY4oKdwhG;f8yi1_5@1zK32?we~;0H z&qAy(OUE_EtRg1iA-VX@su=D??XTLx*Ntt_H-!AcODDvDALR`Bz!ZFRRt`~e3Qv2A z^J5Ff8skBbmXOj)#)SNVx^^_Cbd@!pl}_T$#c6eZL77}FJ8|PpYQx_q{6o{0_ich1 zwNEU}p4L;h_Zq>nu+wGpyU7~fy#V#|aj0nBXc>l*Xa3=^9 zUaOeQKHcaszv!NSrm@EPR(L8r_>=IidsG|mZ8YWwv$opS{H4EUGM(S>u^4Qobn`@B zC`XUbw-|{K;-K@2*b1K^m&_`e7za4!frDG*Nz(T# zsjq|nPgWQsedFTFkzTLe1;>CcZ*8Zn1D>o3Or}XWG&~Mk@#xz8$3y6&{yB=|;(@O} z(A`zI<@{i6`VIesRGQ@ok2?aZa4iQ0uXR6BSwm+Y+w;a2r^1KmG}9qB#7bfeNNOs2wU& z&HlJ|p;6QHTGvnUee??-227QD5x?I1MU-g7K(3(NFPldA`m?WLuw|g4)!jRZ;Sb~3 z7l!;IR4m~s@G;#_9_?=q0zErggV(Pnvoz8&z8)nKu)99llUL!2;_P$T{L-_RSV*s7 zHzvIVL>JDp0qd>iQdambjh4rfpB=nn`@o8O#XUp4T$iqn(a>n36H^<$NMmqJ6Px=1 z>&PI*w2(0??5^iNre&q|&p)bWkr>cgaTEjxNPqCt!Z$7Yq*SC;*|rz7ZOUKa_4@nv zjcD05Rt^5#h}RfPb{Wv2o@g21d%SyUEw3m%Sh_AAbb>QEjQjoJC5>1EhpQF9&1IsA3S#rWdJvOm92iolW>wC^Lyh1m^TWO!bPc3*cOBAe<{MdfC{(e8 zFxwnm6}p8(uFOBeAY``Zs`D(|JVJsr(r)*@G8ki>vTuxP<&TBqB1KMgeOtgGkJR=~ zHXqA0A9Xgc2)ET#6?fGWv)ifOnDmZXNP@I!0{WqLM@k^K7h+^t&E7mwgRLh^AGkybvxQJ)t zGY-puBigT)UFqJ(Uy7N2+ml0ipM^7d-3*1FI2kO5UNYyLHotWDL05=gl6ZK(p$zD? z7N+o$oP0S`^Q~6hO&PRH#8bb+6XQMebLDqn%O38$t&2W^?%3GiAD5=}lVy`_d^xzi z2kW!jGf5OYnYr2u_UA01bJnSC>XovHa_8|K%9klv9oO#=&;!NtNFsY14YDt$dtCpi zW}O(BhSGVwplX){JVbj=zmdA;dmtyi)zdKs_F*~Scy@6A;tL1zuCa#Fs2 z(eVD}TLO!5wHhQ;uhTqfAz9#0>H4@7*+1IBr8xfjLk>GsdoaW+aW8uSg9HBM18NV2 z+Q0P;Ro`C5y1Bz_#-};mlKdlLmO~B}`}}dYJ+A3f@Dh-I4NrRUlauuOKym;&8A{)Z zo7h@9d)ulfz=Cy_6laMbh%F3@?&Uo9%UXq-e7cv7vO@J~OjZP9R1bq5v(n}`2+!#4 z!LQ+awA}rdw~3lFWwd*nUdC-@W#(oTGUXky77+}Iwj^-j2k66PP_KvU#h)iu1iKyc z65xx9qLVGf_#j_93rar1fH#dx78Y%dUGdiK)iRu+>LNse>2pLJ&ifPn1BIfAopr1M zCbC;Vc#3>GSbo(cXTKq3E=C}2y*Q2($c$O((qubG)aPF-ZlY=<(Tn?WTL-qQs7s9B zm}aX0eav6@>BtkPzjY*kHR#h;Hn@pXinSE~d8@_Da%&0B*|+ezuDU^`+##BFpo66F zYeDp!op$i|-Qu(?xY@a;9rsW&hEUt{(DgNSsy61BLe@(I5lv`au)v;5x=WKM1%>NR z{wWw9cM9ARoNhD7fz_5UsDBxs>*FM~5mjvUbLk{+17YgAk~~f~FdoKuV(d;h5Cb^o zG80*~xJ$JTW1V@wq=(|lVI0cySwU>7KR*w@VtzvGdhMZ$hwxHY^VhFP2sky5)%=lg z<2nHXMx>N+-&X5;MnTnolpgxr_DQFCM{=YDZ2AalcIQN0)zI5wr}*t#vfq)mJY}8n z^{0Aq_(`5;t!6dC$9M!`x}`mU)5;L+Wbp4XaGlO^EM+f=?Iz3-cfg&$# z^n@rN=zS@VNq#lqxPCsM8uBJVU_QucQmbPHnBgUGC%&7}DZgHTt&XuCkfr72Qm(-~ z3>b(Xp|2teDceMH9ggALUvhLE7P18U$sxtf7r1#LZV$gYX0c0rN-vFAhd`&Sf? zTJFz#Aguhc_KQ)~vUA*Z$~0wr@oq_qh5hS(?*S@`7g+Zv+~R&Sy8r#v?{99B5dMDR z2Wy%Y?#ePle@Uw?b;_vav)D6RcYU zQ^6MR?2dJG@lV7(?EiUTL~hz*E7QD>WpF^b(cCqwC^z2(z;Q@%y6s)x{i#3W-i`j} zuG|4;A69AAOY00TM-_%gA`6yi?=bI$!^8N`#qPy;@Kq#4l;huD_di6lC2~mq*Q=Zn zs{dT;-+xB8(T~Redhd_()6@Hw{LgX9|Jdukss3|Zz4`CG{d?*A{Qt|>eXT8^7@R1P z$Oj0$7sbHn1bA763!#QXwO0+3>$&>}y5H-z#;7W>?h!SFaKkLELeG6j3leoON4eFg zz(7#$n5|lqfM_Qsj^a}2OFb>LL{^ypq$^x5Vs!cv%(`H~NKGtO_(rOAPJ*EAPyZ&4 z`i){d@yITtqh&HZaC)L7ds>h-F1M>?{N3pTyn|VZ1Y=LeOMU6*LKQxIQmrKLrrZgS zw~gz$k5L>BTr!-MFzv2GWp&1+ywN%e>|9)zo_yVTXZlGa6<|WnZ+A$a$?N33-Cw_6 z*zzfjPe#2fZ(jT2(BJAfvkV z1O{clm&42~@FvcgGi{O?*?SdmubZP!|J~Co{@M4k-giQh`O_e5A)HQxM9}8ux2Op5x~1t zA1D_Scai7fy2L)7^rRoN-@z+xt)I>*3e;6qlbqk@iKDpK7e7@ec{gD}hE$OtiwbrT zR5TOb+rF-o8D3gD$f>~C{K(fT>PXCh3VUh9kuI1uhZ|nq8uGaQ?Tx;nLjqxC&I#S-@D18ry2P3 zXs_R8URhqGw6Bv8Sw;Xj`8np=5?CPoi3%sX+Si)Sa3HAK+gEBoIl@PX)O`mozxmq^ zi%n#8^DHlJy42i|vPIJv-3V7t{wYHNO{a)3h)0hLT=3!-nFmo05;}jC>nu@8&W;^{ zjP@og{7u8T^2O+JpD&d(%sIU1`8M>dG>0c{Z|hN7SGG!d>E`y^%h zf5l>F<|*5rmT_FppIf7*{{E}ok}I^~82$LKr*xd3A$&m$F_)zY1>QpQZM!DFertw{ zo78SM%P>BKXjI(Y3e@TK`H2roq*bJ3yH9ab&MCX)_tfPF9w@U*-m%D5QE;;OLoE8- zp$&rl^jXZSs~ePOG@Xr(f^*%?0^Ix~5iH*7BH#}~5^=3KFNzpljR(bJrqD+2>s`RT z<@=@Qm7eo!n*iWgeNv~@cjKMRiUnzM77X?KDccyxkOIzcNI&xvugEntZR!%*XgS%0 z=x06oGr9Tn!&EJ-8(fNS@P&#<0X8^vre#LmTA zFW+&VPl265!sqGnL2)agwdnkzmkP%}IYhqS%Tbm#DM2~(Wh1feWQSu`dAvAPqB z;%)?LF*2Gigrwq&4BNn{k=O%nv8-sN=D*``xoY{CW+75(I+5i6h{m zz6*VKyQEPVnqB!IETK^HgWtUI4i;R$C>#i#f(nyBGj1f^DEJZg&7!@wXwr*mQkcKfv?2uIo|SFkCkQV;@gj#V!!y-zCG_}XAHe< zL#pD;l+y= zs4z~^3Ozyk3h^;RKW6182roausCmjt zn5R&A1!lk7qIjbijczO9*sS-&hUaK~YxI7)8pR}oVbGUZ3H3U36NEwOPG*qa$J1Og z!PQ23Hww?ri|mv}9|I3v?T*Rima0NeDK{H(Q+YQ|zAH1E(>lha^ok48>~^?|$xSjQ zH(16Y&VOrux4@U(^h`ZBCI-4I9+_($xyX{PvhoX6cRz1x`Wm7UvU&$Rb@N8P}` z_tfkc)Cn6j^(v4W`M1{Pt@k#Pc{*>!A7wcBuz5j+WSU~U*_~%Noi)OUhtn@_7crjkG`U1JH>p zwHgdWTFQ?XzUyyZhi?zI!cR3MIjp;DzqCOr=*Jnz6A+pM3M47m*Qvg(T?SZ*wtLa+ zKR0LKP9-+1*KY=!wT*?gPCh4ZE^uz3l8b2k{9K|meeFua_|5WWd3I%}J+oTEW$tK1wBt%H;fU@7QADtjB{`f|~^vEt1~LGEb& zG=Hf#PdI4gNs_K4^=P0ta9(X=66?h5jaSau@3}jtZ@h*E(?hwB;!Jeo$9v97y^OTh z588Y+q^8Uv9p$qp-kzn@VC>93swO%QN#&+B zitV235NpkVtcxoYZnzgm$)7ltObN`Xi702WzE7B?T)SSVA2#=F3>6|tu*(kgq~tTy zC-puwx8R3%t=!B;Y{p-(v{p^4KjkLzZ<%vaR}UFi&D~FcwSuqdQeLu6P&iZ;`m`|F z;uPE%^;=3uo&V-piDp!XpQ21q+q&f3F`AQe-?Qg>6bAjKhZZ5_-L8KHXbOuL>3s{D z4?pOYsRu`lA_1h+_Ra8th?94dPD#s?kT{;&lRxj(@HDL^(i}Zk9i^WP zstExc8RDJLxAg5J!g2`Ty&Cxb*V9qW=;hOdfTwalrC1q%Ga%Nd7&>>pD(d2+A`f7J zp7I!PWP#NY1XIE7L(y5yGoudVg%4xL0RvTq6M7c0k8(|98+yJi??b6yz?FZpoa8Y@ zoeQs;Yh_K(6GTjX%Zf+uOvdcM@-`ho=DYQ&V&sPPj-Czcd6eGU>Lo3l*6m0Mqx;r^^H$e4>iYDmS4}~`g=b^72F!jdld^tlbvGTXUp4VzT zjofB37c;t0$|9j_n)EZYQt?CgOTG?t9hTW(>XWbb)y1F}W~%l=wmAk;g(|M1s1a2} z)Fy#0G=08NMN|j*t~t}~Oj+xX%AAhNOz~oy*zrdtvDYfN% zpb2zHGP|SEv$zr~j7)i~T#AsK9Rm2FK3V-tEA zu_ssUAflqnwbQd?b1b_w|DzcD)XBVELBi8FiAikg4qcY_LG3OHfbKR(?ze_@Q{pX* zyVtYnhEDFPGKIefMrZu)@6BSVO?J;)8?mcAd83NHyM4kllkfb{VNUIw=CYzdPDh=YrAtTev1m$@Pc;b+uT;v|}`0jRZXgha2 zoeq+>Fc6(VCPJjI>TCdMV7en+4F8Ybn5bUaRU2^CNDEK4%StQm6Au0jZ%-~a`$bwba(@;mbFu5u9A&x&SXd3W;dBBz|RC%g2-x1X1?9?{}HKnNvS zzw0nu-l9-!ei%5@`q*WR-1C5yLYOi@3|nUk$aiv*J|LI_XABqZ>S zpr-&RYNP%w#H>#?xI@Ic_$N-16BYP+@ne2S6!T7DzF~Igo2K>LZV23_)K-i}f^w2c z{s^Dw{LASHztdm0QWY}Zs90ob{8mYC*wj*ZzT{#1n>qXF@h+pJ+xf-_X{q?fcC5+h z%mfLRAtOyY(2J%|^b2oWKi)g3p&`;oUX3bk5l;BN0RIum^T0yBk*V07P_?$O0D!OX zWLG%>!0gg1PK&~O6E-Zrn3i|Da0=U&$L|KWc1QkNAl+tLZtX9P7(Er!zx94_@oiAK zdL#C*)W;`4;V2^LiJJea+F@JyzttKk|ok`p4H%yo;6iNxVN5tUz#?0oK$w%RAWRs)6={Z+qIRZA2 zMsO)^Tj)zOvNsFLkd3cm;TDJACy#clmW^KlY!alEr&;7-2(!3FISjsB3*JD(1t3yDY@X9UT4ek9-TxjZt&x^p~ zw<{tx1kdFz9*Cf))?^oZhrUeM%NZ#r%Vkj2Bg`lms$lUa!UbPNhNpoQhJx0>gMwj5 z-s`rmHuGTYZ@Tj^-ND3Bo7JP(E=FxK^JNgEkT(C4D2e0lyULF$jei~ZFO;z-?)hnw zHf`idSG*G#<2izIlcA>Monm@0Xn+@IXfa%6x7?$%>9+(+Lj|MuzSQAks~OVkU5p&V z#IPV)VLtgC&_+&b3pq=hcqI-%UlBnB+0oe{3S`1IoRuiDH=)yRrDJsbcr_#Sd2?E; z2C^WRwQ+guRS@HoM<5n$A!Sv>oTHtAjZfkor!s!xqvH#dqerdYRG!spQ2%&b<|8|` z&X|dKxEQrWT)=p&qx2FXqOBaVwxRJT#T>K$Z+Dr~8BjS}bY5&CWC6E>Z?7a!I zZp~_RVDMgiYedmxSt6^ce9{4L=lr2?~EM@=ifkN(|KHHz29?WUZcGPR;K-ktg6 zN7Lv0LHW2WXf=6JGlRMuxaQpXAZn4AmI*0&#W&&7P>RUg9ZxzA|ILpdq$gaVNJbWCH&<1qfb$W%CaDPegr%axUcvo?e>b^X9`@-cQltcu4TVli*ngUrj!ZzwRCfUhNx=FGR z%BJvULdax+mPc+px^0|sH)J48hNez8F^CHB-&+>nP2dJAA{B|H(0#W>r@v4 zsL1B&Z^`q1L(27Oju#hxy&@T$7ymN~pB=eH{x4NtXQen&d&)z9*%=U-4oE^!IJb^F+@X0)mZ z3<5K{X(FugpR5N8t{?GT#3P4H0LLWmT}Ll z>kg>tnhElML!&Mn%~mR=R_yD=FSo5ab5{D=)ir$IHYCHm3;oprzJ*5bg{4{t9wOo5 zL)Rup>QvaMqCws-D*053Q6&zjjf)yM#&5NWjf#|QwXfH9{u;sJ;3db2MUEP0<_m}9 zEfm`wWA)g4z*>tcM#|Ri;z!<(aRVn)5B<@yg=|}0E8_FFoyT6lChMiGuD+MDTognt zImB6JN9;4>v$B%Wc8-;ZzdgC>G|m?ZVmkfOIWM=BP~&$t#`;zl`lPFq&GWWKX*9CA zS=q`JCck*`!Hr}7GNLuJ=x~v{8BdMULTHO>2>Afn#v5Ntei4k01%Ktb508q@bRRbM zGZ>bg_dkuAYze57X`E+K@znf7&z8nMoS-kV!{*<3A)Vm;LH+J;O*t=^;36IO#y3fO zf0HY5uSeP29o*lloQ7wJGg*(#BlZmWgkTOoQKYg>f_+5&cTlQ*pY)ZusN~0<&b8${ zcY3Qe1(h?3pJD0G5p6*6@xUO=vnI*+ERq!wyX~vB{?QzB*0iNE%1k4WqY{H-B(GR2 zx8L~wpBsse#?OBV2>3TSyb3}}=lV`4lb+hri&tBY7ocR2&Zc!w0s)O9B?fbMR>6Y| z!mzw#+P1-Q7d>UK+=##1Z!-tONil>hfWZ#vm%4tg?wv6F9UMF{P) z<#hTHjI;3f*D<0e+HREPLU+W?mW(2cRdIGTF}5rXN5{U)ty7oXVr#M*cQdCAx<0G5 z%O-^N8wn@wr~cB|+H~mgK-B#|1Nyd7@eRCb5Icw(nVrWBEE*EVR+AAq!B4pMuDNEi zwvq|wvQh*fNX*0bZ4-b!ibd(oBc>$&i%qhPej2X|B}EvKlOJ1eo;ABXIgK+Ha2?P+ z|I4$q>WRpR6(P;t;jqwz&XN;aPOL(Z=tKZXzd9(UIKfFx*#U?xp=tZLwstHT01G;>nH?iEEQi5r6 zersjq+4PWlCw9b;AKAFR)vokcaeR-4mc85(iB5ozt@rU~ZMt^W9l1T>5DTVLaoTVf z;I6(ppyfv?)YB`=F+4}{yM=-Tzy}=#cSqj+^~GLHrH=4R-8!Av1T};=juziAf}43l z3J`Z4fznlmue7a-d;kp+%HATGbSuI;sR0{JLbBec7J4F%;gLaoDiO9~)m(GCddoIn zk7TO~7hKVStCu~!Vd9^-9VZz4Nx42)A5DTn+TLr&KR z%z(OAf4O&R*$Du3L-JW@O^|&!bhPC3R$<9y6sGsqX7Xf-}Xs$N}<))YSZ;2OqplnPFUXCMeh2~ zm#cxm=chzL-rrA>&s<$)XWqJnvBaBhXx(N}pV}&Me?(y3*mh~Q+sx7BP53qAW zwB{%eQlt1s=2Lfyv-_Kp49td?ZfaVbS$|X=U%Jv6CXNWqt(_qFx}oV^djb|B2Nuze z1kSg5KFXKP2wf1@wKbh2-i|phUlyu4SrlQ?i;mw2y*=T&wqxVY zGF;==T1Ce@WP92ChX=PzG>@#%U^1<{Qg(CDQFw4|XN|(bn7z6?g5Jo_dOwhM)x5SG zd0U(c)7nxDz1VEoGT-~EwRtN?8WrKBux>=>zwqK>F15n?7G5B{W?snixyCiu4cT9H z2`p@c__%GHQp^7^Z>1d?xKOH$%2cX7Rb%Clss1Zv`q?lkK@9fLv%KaBUUOJ=kT@xC zbr8cQma1Oc;0z1=BAphU*RWj^*5Gg38fhV+4VnqifPvT~(p)WLdoomk`Gzj#!6hfl5yydqt@eC6gF zs7=Je{&bsAOxjWk&TIcYCF-S8bjsAy*ENZ&%Vq{4x!}#&q#JiRKPrv^%!drXqAx_| zR55klTB`I`+38X&@q*W8xudl|4vepihsBLzWNb@krBCG?7aD!twwgE0&M}&8pLZes z!VZqPtY?Q7(&D+6|L=j3p$)|=OTKEqf(*$$w}n(eTBZ3a)ve@5Z`3{w*BN}!Rl3?A zbenFs@s3i+20lzudK%N1igN7NwJLbc$eukoc-<`YQ-HhmNjR6@Q;TxyQ5IR? zIrq$%iD4{ann;HoU(3CKy*M%Zhm&pw^PaTxf(osK^Pq^`3o#p}rF|Rr74}4{MmDP) zz)u}sSx@!t*M(m{Escbq&7_!*m1=pSYABh$RWRqhNps&zbd|U54CAlWsQd;8unz=+ zdsU56G!`f|KX0iSW~&uxOv%cF;79i3y?c3pbj50qL5@0-Ac0L;NP6dUmSx2D|I!sMvbatgGLFm{FAesk$cym+p`A`{vPTKoR}}>|39(Y zKeYB>eYNSXu~f z>9Wk7+9a3>&(BH_{`J(r1Lt_L=Ksj>-}C-`20c~({|PGpzx=wdJW2WYkVdC&Vw8%q zuxq^N_GK>V`U^Z#2;-$V>mEHLu)>e<+7AR+KLi*95@n1osVk>~W& zosny%oA0Vze`uGg9}H0}NL?kgyW*e2#m-H=t*&EVeW#e^l}k>j-tbP%S=7%PREAh> z<$7?t80_Bxg4CF>efM%zpidZPe%hH+$bG98hRL^OEBR6ueAiiyr?AJF*56+c7V>pk zgAx}~Z#1FNvl}kc!S^?dLQ>Ur)QOjYZCTI8OK^}B)Z*L-Z#f7RxPFRJTYW=N1HC(9 z%?Vu&?L83pX+tea92-;yxOgYK;{uKc4vl~J3lhQ#0iF2c zjV8AZMO;YmMee)Csg}~MlQc*Aydypj=PA<%FS&u6S|sIxue;-UPo4CCE;~^njIqZC zho;*M;5S?n-qO(T2Gc}eilQKn z$bt>YaGz&YKxTyy`^K$+fKx*y(qBfoZXd*Z|GusptNOxhm<$ z2XZBXyju^;DF_?Vjer05lEK--g-TS4o zOaaV>`ed%RBizhZl5D~)R0xBO&f593-}L(-a6T1GD* z{g$`lcOT;?mu+s~yFt+(Gelob&6>98u-GHZn4I0SiVCvJCAMwmSuJv$O*UF+r`%;@ zi=ZLJb2tVxd~a#%2rc)`R9f^jC9c*f5Lp#dD!B2VkNh}C3Vi^M9>LT@)9G$km_tuV z-S=cV7k=JiC9wnwu7MH*V!DL-O!y24iBHf?-SVIGoIhU)3lAgaj83SP-F%h979517Q<`he-87UG^r4QY{cETGC3kIpKDh7v? z^}D$;Ex{&`I969^>s#t|T@KF}M(@~0elY?PYDHsR+!nf%Bi*Vu8Hbk`dgxwge0V=( z=x~>Wh=BQPLu&Civ)LEnTEQIy%W%CyjFYw7(U3RNt9<9jYH@rN0$<-Fr z=l(eW>MflSxoNd|h^rV1DZ)>`2h}lI77%fOKbpN5JD`vIY!>|FKN15n=bx+?!ICSPDU1$3HBwIvAD+WeB zfGt^(Jn<$T(vh$e!937D8Z8X)Z2uTX*8T26!E01Sb{Sy`76uFg1r@H5$ACf2@;KIy zNppP-s`IW^wH8<7s1N-O`h(j2edgBV^_jsN>*RR{J+k12CN(~f45ac`3uQg*O%JPH zKX4;a{$%wFV08bkk4^UiVUUOC&({T~vD3y7r5aU{SMKy6e5m^g@~US7%51-~#YnYT zk_3s+Nk*C{vyLCzEhtw9VX58I=^UG**cfZGx?=q9Q!=zoCN^Ra=MjlT22oC|NM`*t zoprWB`+L5CThC0};y-#z)>6{eCk0jPZv{sNOt}e*$Lw64{q?O&$v06QsE=j&CO>S* zDTWic&B(_h4#C{+Sl{zZ;<&-T2~2Ag(#Ma60i1fw-(zBbwvD`K`CZTaqnw61OOsG)|s z1C6s*iYAlc*$K6sD}t_H3JY$vuWn>3DbaAB@k$R4p?b*peuv#zo`Aq64e(0riMhfG63k40aH$G*~;Sp|mL4z&WVpwr4G8 z^-8c%&CVn(7_p8TL~>MSs1Gg7_y{%|5S}NM4XzAUJEAQmo1$fTmM#ZdWdUOZUdz_z z@z<=mieQ{gPPFING)uCi3IsOFfoff*`(SGxNipWgZQ@i#9!mX09kX-JEQ@dEs*oyH zQYWI_#AB1YcIQ$K%GDDS{{gskGTT2m4i(CfYtGtql^Gtnap@YlLs9WnQv%)_`sqf6 zNOk+exYtt?klK>`eF)#SV%S?Xq=S^)?&FlLqZv6@I^(PYKD!`+(A1D)?ZcN~S#moWw>kcv3~DoawV9Oy z*(>Vsn|(wF(oxUw?3N%+k{vh=S+Xf9383xs)EoCttkDhr!NocNj4WTO6=gio*PAof zR6GrmYZ&L6kXlX-?}UpOn^a)Pk?r22{|<=*Fe^vMo$|T=8y@cUkKI18SBaOlQdU4BhjOhs%F>S=J%mXeYR#}j4!52)L z$XGL@;~c>f5wu~0S)=M1rHc8U(wye=ywvG2{3vkJMB^juGWcP3TiK?;(!v#0e~%& z_cnDAQY@yAZo0fA{S4V`5z4X*7D6VbZcMSd2;?8SV}M6Fyi)igLR2A2R8k`9Q410> zMxH82Pn;Bb-IcJfsWe!Pa$>wzbldu1Z|P?gJRZ|B$XQhW@{=aRljzb%AUzsq1AM-x zm-K0<(Bw2fmAUbRCl;^vm^t*?^W$Jd!C8cx z3ByWVhe*V_>KtT$M2UCY`e&)WYiX9ax9O*zPPryJsMg&hNjac-`j2*q-M&4!t!p)s zV>_(*@Z}V*XwP1PY7H(xtRjMF&u_<)*E8K`zHZb&|JWV`$kcVk{ zantX5!`dQS3vklzC6Ho6F+ z0d@bNqrtN6QqBldQMwf^c*c=n$AC?Mzo<&`K$?wXv^qHjL zT-Ny|SY(^c+hOdtzx_++&tz|$6Oa;FE0ntZZ{^f(8XJ_n63K5OlD7Pm#>WfeM+(FN z-ZqKBr^Miv6qOdd{|y7P*)B=tH(SX+;v>en&h-9G%?&hK_axCp-f597)@Dlf+sm&_ z0~CR3HkL`{)q$>mw*qET}Uiizgd=LVa0nB@|Npb8?!2pLxnEi$FR@oEz1MZcE zsj2TcaNMrHbaRKVW5WJ8THW)HHvD6SAQ67RZqHrqm=<3;D$qYO4}>IU=5$(lUNX(I z<3_N1Ves{cza$WTEohWBe1<<>LB=&wR)?&M0<^w!S~1KzFw{87@+iREJE?JC0rB3@2l-e2-@{n3!RDE4p7%F(;F3MVW+ruI`0E(ILp z*WI1qdUSpu7v99VDTQ9i(_dYF$A7CxbDm|^r6E^dAZX;_ikKK&I zsV@R+kE?Mq6CE6FsUf614%h-!xB-#fQ0 z8rXv{!_5fR{@=5H0(6wD$`^uEXD(1}qvaW5gj4l=;1R5GEybJ}`sEH?)w=#;1A>Fd zZ63tb&*&#bC(8C+jYs|i+9e(Nmo+~fg!l`S<;unhrP~BxUCN%T`hioh$6=tqOF!QC(lK^FJj)DmBhKp%di=l-nUg!HBDG z$++I#Q-kg^5H_nxtvWMElmSD*&HBL={-*XBy&o8Y^yRIBdC~Ev)bCM^3^RdM8aguF z!2Rqfy{}EHRQ~2)8?qFIZetojOsdE7Um+CWH`S^+-KBM|A;N?oIO<*{{&Oh69;s&d z@U9Ly-*S0n8m#X9C7nI7gZ7~x#^2o*7jVmkVktzdia-s9=n3H;`+r7yew9I^vWXi| zX__iM@-g&Wpx;^Apj%h!=6;XQJ8CD@Le-xO?H7?HOA=MBJVN5wX~dH zc$R+t*Sp_X(oT!f>RgNgFoWHqh~}VMMKwg&seN$O5OJe+$)Qn6itI^Cd_npOgd)YW zL;aZKl!cy846M2BUL8E}6RIa~_^3IBQCmP5g?p9WeXNSi$Cf!r6tf%WRLFX<>o+mA3yh;-Pww33%opuY;2U+QMLROPillm6Y7!H z^j>V?EPvxFsLx{<9UngvLTeuIKbj|b$cL}ETNk^78F%29k?gBfbvQki+}PGN6ML7F zaHBj46X~(e6SBXclPjr{J7sJA}x0aRx3^i*k$yVB1J~DG)5wBjE#_zMb zXkfg|H{7>~>|jBDVK})Ez*GG@qXmWFs^@jbSmApyW-65`15=Z3Cu~-|>5kP3(jItG zGTsbcS$v21MZl!1P(LO6;};y!IkjVdqQjD*_4^>KnIbkTXt`ax61n0wbhjmMQI6{3 zm$Dt0dO&B7ynpdz442<(r{;?2HzE-)L4L7`?<^`NfT#6wsE?q2+YLx@;|dhFPfcUe zRsnNNs);U}d9)Fa(Zht$Ww6@XhTX`m%qEUN9@C{G#m%8^if}t;Czz9Id@#z4dW4=l zNGrMD`yb&RwKzr_;;(+e_i5KID`?u@L*IXr74fJplkP&$COO#UI`Nv0-LKrhos@q) zcU1Z+$Sn=Gu=|PndCVDH!FYnmzvJ3BG!KvF)Q!t;v7|Vj+MQ$mFSGv8w`WyhNNPM# zw=m;9h87ZKy2sFRvBeJd{e(e!Exm}GU;tQ8T|^O9u*7nkp0~qtc6gFTy|O8){_V`Q zcS6DQ!z`e|e!9N|om|kOzaH9k@Ii}$BUaPebduuJbVxiCov^gX7)gc45m>WsYKXDn z$AveECq?0gx8Bj!BCFlfc=&72VedYdtUA)OLp~e z&9r8h^|-@huM||%gcO1I%wNj|d*{R*xcN94S2Ttn2c9}xh2l{W?Y>z*Mpj}t6D z-i1;Fyc+~!OObujCo_q$zWcIOz(-3wbc|lc0@B=yQFX_$Rm3$DT6KjEn)cs|qQQNx zozk`FJvbjZU$kr}@%K5_A6wR7L9n&YFbg@bHPZuM46Rt-wKmXD?k%*bo&B3)VAn;K zu%zf#FU$c7H(GmhzkDOp7Gq$fYWqZe{p~PiX{(FTLAGHA`3Ds#)5e2#MrIxUwQh|w zgN7fGokfs%+)c|};xFw()mU+-$p69Idqy?Ywcp-&TToFEX(A#Zy-QJ~7o`RWy%(hi z2uSZBA|N2Wgx-q~inJhI1*C)?iV%wQ-V$0!fV1&_p7S5)e169}PChUO5R%2t+Iz2c zUB5Xeo664anA*4JLd=;c`+xh~Ws~0x66)`D?}GLA$vx}JJ6h9=QWJxW=ft|zu`1fz zSyg^e)$3Qa103;BrO5+lRg7N5jP$jo-*ru7pB7GLKWjY223r){noh$;Tp^~*y}uua z1RU)7)r}C8ETYKwmB75hnswl1r_KkmH2%B8d$}B#>E*8W7>;)q5!|P5(@@xE4sU(Eod~1nu@$(4>b9bo zL+G_eG2{BQyzvKn3$C8YMZ1um4cCOjt5si>sgLS`%lT{6w*7vosSic|(uA%+3t!vN zhll;y>4mv`Y#V0%>B6=Qs5!as{Lf$2Jg;~hlj%A%IwM+#jk%Az_;Ile9XpseyrObQ zC}WLEY+Zoq6sBIW+YM|OfSVPF2#EZSTue&WJ` z#1){SZ;CFtd3vSOK8!%S4GDKfZ1Ov&5$@CAB#08Q=UeO*Fi7Lcq$As;c{>nT*y+MZ zXSL&RjyDv;vUOsV4O+9Xp+9{dOR+Bduh%*_M5oqASUmBpDJ1M$B{;0-g+uDoCXH46 zk^7sQehGfff_^OQkhy%`WA3Mb~ zTM9**V*Os`=*+r)?@Z3pdr}|8Q>N_~yXwskKH)c8#GlDGkJmnP4IfO<9V~-UO}bQD zid8Oh`_1seG-igcBM64vd`T;t54Db3d<3596=2@iaQlSNC-mao6}%h3UUH_XsmBc` zitrOrhrGu+s)k%x)($*IS3|OzvDix$`ME2z&wILKGv|vUA1uYbUY}1Yt3hAx4Cza5 zL$cU;%p+c+B52y`|DuQ-uP)NFtlSJ{#OTxPkNkrY^QX0u&MId)&5Dtwi$7*H9 zD|j)X+{BO+x$L(x(T+~-MBxHt)9&=`a5;g0u3{@8spntQc`EiK87@u%<%R-PiixOh z9YR_2cPIb@7{swXx59Z8T4*?tK>n{32A{&;*=t9Wso400 zNz#-Qru(b@QPmkI58J<{*K@IK`w$vS_R?^*=_0>yn{6*(?ZDIo68fZbsB={RGcD74 z(hmk5t0V90sqT;?r#)@uaO2E;Yn&jnf#OG}$yB60Mv z42)dFk1&jq2!uE5o1Ti*k3MEBm6{#AxRGsQ+b6;DZFc%(*WHls$&U4@la;(x1%?b* zZ^>u+B1&BbHW!79Wq5t3zNJg!-;{-Q|SOAJn3(}5dPFE8F? z|Iw9p7-=j%7HOB9;LJDIrH)a z9xZo7fARQK@2P*TT`Mc>_fLosf9BFr;xUTz%JfPvXnQd(rcfr^Oso=%2EY!MLLRMO z6g#rCS!ZMYpZyvx1t;)-aLx#?DduBZ&6X6rPPq#J-F*3vZhIE@oaadlYH#oB3CW+C zkbm(T67Q=+dDN2C1n&?3ShDWA24-e2Uv<#Fg-MZzEJt2zI9_lp0p`-j^;s3SLfq@$8h;|R1g3ZRvO{u(z}M+kEQuundti} zVrN5|fo06);|n5r75P{4@$dKl4=T+6GqC@QJ!o*hbzmJpGE(L)cGu+7Czjg~9HHlL zzka!rNE-Wq;^hmKt7vYa3wE~TE7CyRhQz_}XXT4gYM@s&ot7I;_euz>&K*1(dwYLB zDn!2i?$Gz|M0aVqfhCSS&3?6L?Xtw`*zN0WVsd!ztP|5uR$m?8%?>rnrqN+El(~VK z^ghZ;^=eBAaqq1)sxzR~RHymyjpdU8Knm|`OKldgfoG7ayYe2<@+tQCMx`A1s@q0! zivG>7(E?-`6$K&xO2;|9$%@U-n)OG zzX_{UQx?C~@KV{uf3&I|k6$04H4GC12JPip2FcMATVdW^q{Prul3eR|6ziWc%`2q; zY<`QVcKhm8)yHFG(C4V>AhN3aZ|ER*EXB4N>iLvsQHE8q?C*L&<)M}4_0tshv9E8q zgp71NWV)DN@ImK_t>uN#w+opKOC1u^rSkC(Ed+a4hqDYZ0rF*!cWFXhP)k2EgMyjW zyv`;^0qEF>M}JPW`rRqa><{!ayp9ylj5E25`PqDPt~*W$YbJXOa66&SWpmyA5Q?*bcsKvd?MK6PqS&F&sJfEa@B{*to# zq@f3^bw*za^S&%i#SiWM(6XdMeUcK*^#EqUEd4@VV0rFbIhzMk4iJU%n&7C(f}7}S zPneZJ)KSf&W7Ydpn6YE0O$U>WhojY}*ig^GA!7C)GegHvS|TC`_LjqE2-WmX6<-0* zRmcYEKC!fv&!vX@9pA4gF8M6%TmFlCVzx|ZH3+L5b`GC@ehact?43r>AE!i6P5-1j zVgKFk^8ICo@!ytZubc|6)#_vk6S-ZRdI6MI_**E~OrmTgtFsS2NfDiDeDE`yx>e}) zmwL}EdJ--*XO;fh^33?7{jO@lsth@sV#7^bg?x|qlnl$nwRRubHnenv=5gni80i@; zk;7|SG;qB-cK9s4`?v4Rcp?5Ehp$Cd{SWq5+P84oW_~O7qw6g8@K}1XTcbFP8cMq)p>YtCc9>!-!NY+|N zWuEfN_6RQ=$}bIqhmIK6OEv&l#v$~dwj?uL(zo^rr>{eVS5<$eZTFS7sLuld+Qg63 z*ST7Inn_USu$88&wa-Z=O{yU~loXdJeQl0yP7e<{f+Wixo*vf&$ctwLcj((H$Me)n z{q>a_*LOo7mrrNr0zGagS{7uF0S4$qhdaF<+J(Gly@2tpy1(LA%@3)5sr7ADZ^z)H zpNs!}q^X?kQEct(+o?d2pY_bmhPgxKG--bhdCj6pX02_PgJP`9(2%tc`dIqqLx&4J zNy8GX)>fZZp&I)xY~%1rTJ!y!Br3fZl#_p=hj64uX$S zxrNfnYo006i$^MHY%WaDs(EtfZ#Pv!WjWnrLBOeS_nBel7)#C}$M zeXfew3ENO8MDdh{&fd2is;5=4hn0q^5NO{W?s8{ zL*zL-@M@s9{_d!}vD(e=zw2G(EgM)KypI`Ps`^xGDk+)r zXR&s~U7lAF&6V2Q>*$WxZ<<*f;uk9KY(0cVKOjY7C4mxyL4gYbD%CIPutF`N?9Bxw z(IT}bv9Mn!xNIb!?!S=mNUnS5Fk=VIdLq%Fy0zoEKx)@RD<)p+(FcNlD^|lW^GPhr zifE42i1qTipT0L^OrX4Xf9KC|IqNx|S-lrDDOfYeeo)??_rA}vXbsTkomD3gY$D4} zQ4xiexJ_VJBH2^zHPpGaC|`sObeu-U587`fjCUKymFa_Stv~$rxsOKQdR=(r12-tt zxUT~hqKN!V-R^hm0B*e@dvKf2w<*(MzoC0w7=n2GP9Rv@aU&_PN-^GKUx1h|(x+ki z(}Y=AD!h!_F!f?m02}bu`d3VZdmkkk*E|b!a`nwh3lOm#C_mL|JXotTh%9j~J4rkG z=pzw6hv;$txp(*!)Em};bW?u}o-DAcFk6ms({2%RY8qgLrQkoN(jZpMgaw_R0;@~q zsnUqW@C)13E{8WBX4<3BUnBgLzo{zGHn39EE`TCqHv@T-p$z>;ca^dYdT7^UU;)<1 z;(d+4euN0Ei@>&;aAa@bes%VRN`OR?sX}V{@$;#xyokg~UqDgbXsg+KqDyO}ui@lx zf5cMFU5R2Xk`nFui92llEU;^n7c;+k$d=f7y%IM0Q^TaQl>!O#P$?bkHCH;d(aV*j z+^pOSomkuyKU($_gmP&HPq2vY~^xE^zlar0iMYD*Vt(>()XLhYENcx4r?Sgv5JHom)g{Ca*x+ zv9qUxUi`ZxT~I(0ee!rWyS+I83F$%>n3ZQ%prR`)b`VpDJ(r$MXcgaz>E#Zv7jMMr zq?y_{fcGd5FP76RAfqR~Kyi-bnSVxWPSu&2rdLN`LkDWZnt8rm+C(+}JnECo3gs7e za&_zb3Zpmcu@B`^=FiTy6|-0V*Xmtay|NOOfTB^sWh987o{dSt$+9*OpbdO)C8{v#3LCw&JnoIm?Z?PU_?_>Y z*%{cN(QjTYD+~h2WHoZZGxgT4VGvXA>OIla&6m4NpyPF7{+r1~nIpFn2xQmkZ#JDU zj04JR8JQ!qd;1M>m>+@%NulmCk`3B7&XN``macB6Et~m&Wly4Ab{BKas7JE-uXp(| zAc=8S!MON828TVSX}B29%HeNOB5JUV$M1UHnp@-aRzJQGl$6JArN6HAA342Coxcou zFI`#2J%rR^_cL9hPW}Cp-1}|FOQYXi=#@>}gIV?=F13t04}`uZf^y{O^`8QHhGJ8* z_~w4(U~9-mfa;dTp(IPH*%T~up!!Y4mQ67xK+?bo_CzlD&l@F?a$bc)N%$7Xik@w8 zQz(3}q)xBS4L+wz?9jXFWwhF8Yc=pD!wM^duI5YT9LZTc+u7*VY;Sfb071Rc>rH9Z zljUy|l^&HWH>pfjM);(k4_9mr{^)h)l#(9~g^!0cZhPU^QFiFOt+pvi_QQ%K469T6 z1j*`P(mJ)ZnzMM}k8ejKj+7QLK2wrTYi_;|tsKc>pFgSM#}^iw6J-f^or0?}&pcMbH?|H+zaL_!l8V38n4`O_w8;G0KI zq-SjsTc>ey_QRO&N^;tgo7JOI^GoKA`;(7;T=TyF*5W+kUh6Z4sde>jLO!+J>R|B* zTxnsV@H@3s19c!w=`>ZxFI0_hzfM}pPM^Bt)_k`?5?6OMsL#7f7gx!z&)r<%A*)+@ z-ea9x@x{cd>lmrASTh{ycb~hZNY|Q#t&LES7ed~r`yBNWVPq58^&L!cZm`+$sv$yI zlBT@bMN567^&l$(aU;moz&i)VB~mgTP_Bt6Kp1UWf)e*@zH-%cS6j&) zoI!v?E3M6*O6tKKC^m>`NN~Jn;e9Zgu@AQh%rpI9p+flbbX)R{T<{x>^dO)(WS4}t zWt4v9JN7|!qj7AP3N0#_uGR2C`IZU?nwO5mt#Qr-YG9WFyX#)e<0R})`vlxlJ^3Zj z-lzvAR~j_JZFFj=M|Ul{zeh%ThB^rXqi-MoQV$)MGAJKJ3?tajGEViSOE*-o+n!Kd`n}7JnhizM?k|Hd17= zCb=PuqT)B=eHG5Ou;WaS&@sA@R%lvErH~`H6J9eS<{6vR6mR=wH+}2qZR|AWY~CYo z=ash-<;?7@)*DK(D}fO`uIgRmw_Gw-iuH{*(hV?@Nj4#Ou2-lH|Iwooc%ieT1+?1v z=2nNwD&xYMcebTc=S<(r_P_WZ^K@yR>mETOaBczvnMn0(Ak_ezG@L?ZJ*}7g`FGSO zVL!-RKE`*%gO*OR?~ShB0Hoh1t=DX2^;&kXUTv}!ZNndHVI(~}?C>V0gC1vvqR`q! zEg_a))SXq*#rPTC2Pv5ro-pnt}kN_e};2rg2kHNe=p27@hlU3RDfg<>1%b7&xk*$#RQ z7b3fSU_Om_7RdU6V%3}(bgIt8bQ7}OoSVL#3(yNp^Idve?4=k0` zw<->t_!I#sxcPX=zoK=pvxnn2A#=De00v7QzG{wmMz!{?4c%EiiXR=R4};dlo_$Qr z=Xbfd&rRaP8h}y9xYpR3ZFEa6LbrFS2z*|k9DpKrboCMdWQ+GWyS+(jirfzOSS zLvp%GDg5H3bDFcvV(NL3$Lv?r?YG2*4=Bpxv<|yj-aHi?ACx93fm%;pS!l*wSjpqma9aN)&g3yLQ@y0BZ2< zaxj){-R|WrDOv}CXYosHY zu)6c8;yw&6J=lf-9sN>2gT&K-ECTMFgZk;99Ni@8=r?6BhEx8^dN|=!!{toYQhb%M z_}f2j<+Za2MK{aVCxy%JBm0bS+2E@}P`bigsomTXBQ71i!HIZZu16)py;3~uLACbs zhu-a?h_Fn|3%$O@I$O`vTnWOvrjzG7k+b`M4{g!FTqEP|j?4Muda-*OQ{NuwiqNQ6 z@TL`c%4Kcey=+acYgstGL~f^2gA>_7_y{_{dY!mN-JFe}EPTEo^Vwb`cJ^5h)}lxkO>tGu4a`_Tx! zTl|Gm+Ja2|gFV#{+wsQC&vPAVw~we!YqNj$R_>>bh(RXee|oq3Aj0T0ZL|NO2xz`> zOtuC;`q~N2FDC|^FTX4XnU?DkUPq83+N0DEQ{O%?1TMFCvz;EP-6zqbmRrg`DSUF> zR&s@Tv(=-WpGG;-Imp|x=^^(Xd49`C8%J8}!eVi4T|u{}i29M>tKZ**j0%lJIyh)3 zq^<*KQ5OCz37^)2S~{P8ZS5anY>}?inw|MWW}dVN!a>8jxN5N zl5Kk-8HEU}h8G^TA#Zd!064?*X7|>m!c;h~q4;*rEe@|??(%4lWv6r?)2w)#(j(1Q zFJW_{na?Lf%rOmL=rOzcWMG8QR@lHef;=OdqYe8MO z{^43jeq^2`Exqt#`adZE;c#lvf}{gT3$&zwaYm9Drx#z#zH>$|vIyCb%zI_jnQ|7F z-h6EDB!)$aUw_Rswq3hfyMYaLcOL^+jeH>M{HM$y7|SHDl_`Rs~QC8(13 zG$2hyq4-m)!-9;IQ^_wP2f696VR>@j&M%RqEKy;dEqOaCLme~$=5UN)c899uGXM(M zC38^Z^Aqx|KUD!W4a#9*i5S{|sdtK#uTGQ(uQRE(NhzFfl29Z+IbfV=-%&~-Ol(>9 zQD2x2Yi2^Dtt(SA7MN=4dv~uJB<5JH2RIqBr5@*b2!j=p$vu`M;G^8CW(;Z72%n2_ zGJ!zesaZTHsr7>g;59FnJDWv zBf+h>yrfS;R1b4Yt}4HQW6vCqdo_1$S^QaM*wZrwUs{uq#$jXeL(Ho7P)m)w-2i>i z!xkf@a8bO(XaOHLJq505dygBRb2&O|nFEfY)T=!_#WLl@nn@^(kd|QyMSoVh4ylhM zHty^fL)0h#Eww54$SL5gs}EbQ4Wu&qR_URZn7ic4Z)E*Z1s4`GlU}rLWM`oS>3bp9 z)8@8t)2CRX%$=)XG{Qyav>V2{Y#vcm{-X+TJb+it0U!I!5Y9+=t2PeQ>JsMJ2xIHU zK+F8zq#NX}EfW07ohrv*MLQUo2?-tpf5&QFaXG{uwx+8yNOPeGymJ7jsNjvz*orGz zp`^Fk31!z6`Lgn$e#JK0X@~%3O9ch==3ff%PeNb*72spZV`;D4mbj_0RuNWo?=EVu zZd=G-f7_7eH~UZ6iViqK$dF?Wr!+Ybf8~S~63(m~PK~)UtVNG2y^*Op`{KP;OX-&$ zuJr^yq;Ncd(PA5JR@yh5Km3Z&w~2g^sEx~T7*Z^*h#(f3d50pjZyfZ`94Caewfh`u zdo#fIu;1VD2VUHa+bw1lbPbLLkDL^Y_uAk4eH)A~&PQ1y2Pg8XpIoB9OT<*2-Q_-3 zHXmf`|9Rbn!*A5JB^`cTZP||hcJ)oKLV_4z!Gr=zlZ(*PU}F zdlYhfbyXgM&ou~mkeZ{y`l@73b_wS~8f99(MI5Tg^+D@OYj%|^J}x&2FdFce;`xy1 z-pirqEx>KUFTu5wo!Tg(gg*4O#ZV5a9=HavB@z>LNv3cYq65(%?J0EoA(F;|Lui-?6 zjbv#j$|d=6#E`Vp>FH-VyQ^0DLhb^9ZvQ2{egX=%iv}|$5k1x$BSoZ2LTh<6rGO>+ zHj?S?-JW(5@+g9wf#w9hnb(x!ZB-abNYp%cvWZ`L?*(T9P;!mpn6gO82V#;t#=gq& z6wj0*?Ip@Hh22^ume7@)q;}dHH|R+@Cv<$fjeMNnyV2g`xS2T@^cqKfohhuihf}W< z@LllS0|BPga7%Shp1bGJMl| z2c=s??+S?Ctr~>ZfA#eR@brz0tY+~EbfsWK0JzoL0+O7R+@@6XWpLmQK>QOP!jiRn zLNh*l))HzAt;Knv?HvyF2@5)u{KAW`jN}#0dJ*=Dr+p#*V;Fxkm2TgTV-DnkOmXwQ zcJHc-BtV9OHWVMPR*o_16S6&6J-VMQ6v{G3?s#=vHrqn0T^aAF(Ckrvhg}4_U zoR#}m_>Fuxl1bJ9wKKCMT;fN)31)H$YX26Wl;Bt&M{|r>{}RmeabvVe$FArMQaON` zIEPR|Z-VPlk=z`Tx;)4{J(XVHI@XniE_m~Ez{-(Y5aQnF;cvjrMQKBVf1L(>F4)CF zEV%1hW!t}f04q8Tg@Hb2tLzIss}Y%Pg==8I$PC81kMj^he!hBZ_#N>xo$&;HOAl`` z@k%LdwQXxg+hwuvMuV|-vcG}B*}JcurFj|F^O3(~MM^RXTy*LtSn!(9p>_Oi%2Kgs zV}%Fck%BR#JMyazvP^2vCCN!|X^=J*S0h42rKGNVTqs~XDPPdu$8!36BfQwEpzi1I z@&K5eap&0rq&AkGWba}X4c;c>i-gw&W$t*Qc|e4lu*#%bxsh{({zTJQawV%jnkU^I zUq2xph0RVV@+VpLx8TB{Az!1{lFS23(Ka>%AT?{LH|EjO8OL=v|6%@i$Jt-7(a4iS z^Q^Q=9=)VR1gf|b!7?{UBWd(zUY5SAt5-_#?BQ;(V}1MwXGAyBW%)%?iH`}iaK^6J zUIPBoY0cI*MW20T`z4<*CB5n_f*LdK77{bp;UX80i=jAv^#mNXp6XE_uQo56W|w+S zR4FE&iLGu{eID+kBLe9%<|Y_6^Y7lJ5Bt12*N&g>ayMGA+pY}@2{3c0k)Jc8ALMd2 zc1dj>K&clvCp-DdC`;8HwS-i;qM`mRh^RdRBISM7rNM++6&r~8+~+Ynn7kQ%x0>5$ zj1#C`Cky>4*SL&4 zHwNRg)`cF~&JLtU^$#0Lg5_T16kA?l!n}FyRza6|TBRXJjkBJW_%_orC4OayJG|1vPr3lplfEREgoiLeG(vDW&6B)}CZ9 zdP{QuSikr_@K56_hvY3Id^dYp8v+tRpMLXUl_mUlkz@Iyi#Me1Tw3b4bE5M(Mf9N$V2cx}iL-7n(U!SuS?w zSk>=Z)k!JkO2?yQFG4zo9{iwo+?2@)GUs%vA9HKqF|#^F=)Q>5#tRz&^8)LU##jHO zzM8CBAkb)8gYo)PXpnqrru95Xc~WP}!ZY`tWuUttlUW7eyD^*OX8Y6t{*A4dk(7f#z$T1ZHWE@x-f||x+BpyMIn}dwpef68R3$gQ} z{@JPC*^xSmmoyV3A%0g=BKFASfOH<){P?j4zZ3ICq09B*S(*-NW6VR89*xS1T{Me{ zIJM!BEbt0*j?U>U%N?DAbfB1eYg1tf58h#Oqinq<=;DI_98zID@>A!CIIvIf95B4$ zLtJpNKTrnQ_sR$j3+psH<2rtm<_2@8xHnZA5UtDUj+A{hPPBi8gT*N_+uAsmF!0F=Ud?B&Hzbo+a|SVAg3Hwa zQ<2%G;AGaVzPEB`TgtH{u=*B}?1z84j?~xQr@v-IFU1F=CfM$v!6q8+}vOVq* z(NY4hE5j;_%?6_ulC_pv%zsi|E(eK-;9vIv5aJ=OEoP`UP36z*-mO9%&>q`xh zL_Tn@3$wh|5L6%Z@jyEBx0kvU(U^wi@m zDHKn7Ej>U3(se9+r!Kl=O({qg3G-?^1kj6AW~;$ zf9H^L17To$uCZB1l2iPDc!=0{!YOYDct#vyPv`AdvGDlZBtZTGS@NF%=%G8%Vu>zm zj*~lw6dOnaRl#Hy9X9cE&pjMFOR{W&z+d@2V8Jm=tAq)Xb_)Ey zztP3;sPo}ejEv&h3BW)3p#?v#$@%*Da$g&=(2oqbIP>JMf26cR$HofH>hAn$4iQ|q z!d62!Bv?)`kj!*iMiFJAQX7Y^54Q9*%WNtP7KsS;rLQHC4X@M-UUInl8XY?Njz=t= zKUoXf9d-l-1s!z^R?|KSUT8?voC^+Ak7Tb~A>L`T9d&-6=Etepv-cT4rK44y0`B%N z9c>)v9z+&*c5!_iga;yCx^uRm0QGSy;By>^V5iv^m;hD=_MHLH=g+XWgt78ot9jY?PH&fE1y3s~R zax7r@F7#|f_uh`TiNpZ-kyj&k*(W)Bo^;E|;z$`U4$@x3D2KGp!ar+XlI-Och)v2} zj<}Uz=U{#6xMYLCPt|U0>A7qqeH{}LfcyA;{j?B1Wh*7*XEW}vg-HeM7H?PD?6@)r zAT69y%Y*w9QBA2*RD4|7NU5b@U-644)UaZ}gXFQ{n|r2eV&o@Vhy376{W1PH`i2j7 zr0TjgPa=!P`P?UJF01^$y7Ux;0C@RNWiqVcI)a-@CdLqUUXUCmc4UuqZ8N6kYP&xm zKiyZGbbQs!cT#GzZ~|mXy4)<6E$xS~RQ8`%KeKnEZ#QoE!C%tlY~p#F>w0#v|6dxT4I@(Hq=60Od8P z7`9cCvSvDtx#DvE16k??#y1MC^h{@N4-NJcE7iAiugpQyGO5yDvY#_ZN(~?{Sodv0 z`dYlx0u+TB>z=ww388*2GIu(m75S(RqaXGMpqr#pP0mh~O!^zEpPVVF(n7cD8>^|B zmY>qo-`E;Ss^9$IC|tQ)fhkZ9nU!T5i;)r9a6<3KxcflvT;G00AkLwjAvwU1Z{sR; zonyX?1w6^2&z)`$P0V99=-$gcsbLAWJVCQB8-AhsH`By4HZr7#X$21py<@Z5)1s9I zj@t#c@7h>PLFo9W$zah^GEwLtoWXmbGZ8n+-9M{A`a&-H@&%3FaBm4vW&o=yJmC5$% zl~b}_2?uRpy;6q=bnpAuc0@SV_vI_V;brq0AGUPzy=5hB?l2)For6^FoN2{=k~zd* zjBP(5OdMZknH1dr`Um`q9cQuGUP1uwpIv6FjqCSj1xGscm=;K7>{(aij`$d9a8pVx zo_E2~PpP+r4iyQvHW^-(*q9^C#DM~yWo5K_9F7Fz-q-H{to6CK;tS4l7UuOwwxMUs0Zn`E^ zZ(Wvs)4zRiLgjpm5SDfoewrA!Iu_-p=|UTMm*Z8H6OW~2nBhM>UQ{_+VQfp;KaVpi zqO#TX#^v~6fLZT*$>B-qT@;b(`7XObE0Q##2;%nU{f#9^kr(Fd#VamSKOu`5wO7>2 zH`MzBT9r~SuGy~qeljIlP-bC!x#|SCIUgHuBD$pfzqieYy1n}^Ok2SN@w+?Xs(wt$ zZVAhh$K0~5B;?KFkye#}`b*Jp_t|#aV~%t2ld;<&j{QR&(Tr){?8(a|V=X}P3PYvd z)DyFbOGM9g%xDD?y8_Ux+`6#ueGZ(~^D3@`(ns&(Pc~$0~j5AG2e3PrV{OEG#{Hqk}O@d{D*3)Ppu1epM)$|=zKz;m@tSNB z1_OxO!b5L^w&!xbULudC_?3d9&G=LDIxP4>)+1w$3NF-^JNu$VnNN|w8P@Op?q=mv z9p0)pwexDJ9al`w?{!$3X5SVS0>u#|vbpNs9eU|m79jHVZvbnEVy$K;#a6OPc!^z& zT`eO`$>49frq(;kZ+&bLT_-} zJ4eL|ul40Bt|TQ3&SPIPmClA|d?`Hm4 zBp7b0NGy39351r-wJs+fg8*a6;ynLpzKQ1ncg7!)nwZEXu`tN zibvq2zG|!N;MC)dRNa7dJQ&P^?9+OB>52E~NtY!!A^x7b% zQlxUZZ`kSyx-l0smFHyyEt5bd^!Dvb|RF=LaWWPtVH^DBPrq$F^2^R~v&roz} zy?~@{>fxB^bolypP~n}EPb-h7VovtAdAwEaZ6f(Pi9wbYj@Bb~sp|{zFC|;Ia1UJR z)JL>E-GX@9bdx<U@K*PiC?^~@4TBj&}K0c6n zlMPI{7aY%HQY{FSk*ZB`UW?p2HB`u_*|pU93ukvJrm{}GW6vfzvYri2`1_Q|i&9{7 zfOafv@3c6b%EaQrEd*YsivlJ5h zqx*PxFBK*yhu5Au@7A(v+c&mzDp;%%*iG=ur?ffuqpe1F<|WaL<=kTq)-+i1_Uk|{ z;B+MSBdfcQV_@)Jo#fJ(xCziDM>=k!8u5zyAO0wo?`ISV14wtLR z7t|reuVVLKUkeWl9GmpsZsQyBP8WAh4Ihy>Yx>$gb``jY=w9S@!t$mi9;wDj_#wrgZsqI~+%byt0?n;!8ly{hVmVSWs{B5qCY zd_G%{p{~JJvqs^T29?~o%*?PzOoDP&L7)fauh7mjve~_}M$@J$>aJT?#$T<+2r%On^F2P#j&V(wrz2gv=JIj5+%$=d8LW?g2=8Ii~| zL9=lWjE~7F|7^hPK=x?QK0gQbmT_(pv&S3|PrK3Ulu^BA=;fN)%=pb5eek5^n}I+| z1>fs*TV1+Z!bbK;v{)C!9@xaNO-Y(Lwm%{U7M*>8wQ6!u^Y6NqajLT`Q5UV(lkUA3 zpgIa4bl`vZ*ce*_r4VKjf&x4f=R?TL(2?G5i z>u#v4(YivY^Mb1{tjtdMf2)b5)Zf4JCqBTMI(W3yk1U8`?7f51n--sUK**M30itv> zXja_xUecR9MU7rj^mEsS%)I(bsFe2^(boolRoBjIHQv$O%- zo5f|z%9p052MxnwFL1eZY#ugf)}gxx zm6d%z@kaUW<@XakX)>!Wnz3aY9TCL|i=t8*PE3E$!_rQzXK^3k<{Cdhv#?JB>XS~d zEBD9^Ah^j0)BFNcox`i{!Fqrna*5vnu124kBBs7EhO-#~7$gB^P#laduSI+KIK+~I z(BsEuTiLz8!RJr&s{7na)F!kZW{=afCyyr-O|{&%pBpTH`fYeYpB>NTL|O+#?Tr1h zoE(8T=b6!*KrSb^`{r#uubJ+x)ftB>Zd)?GCFet!Baq3OXH`V6EgJ-;N>MVkiL}ZG zS+uROXef{Zyy-X9^AB=rrx9=(Drc?HR^>TA5G?K}kfsw|=0KZy zlfAh4qQCb(=%La<{LRl0uHO1DMlO$Zul4<0l`|>X2rKj{aELsbO4$sHIFG3(!yzU- zAkhsKa!7PUl8Ce4m{~PK$8(b%G3=MAlg&|-%A-D(=G^-Njy}J^f3rdZXW!&UHN|mN z@QLmeAhRiGTypLHp^9?{LX$w7ue$Yzk2iibXqWoFUk-fCm%kPZ;aY(Wltox5e5-4yl zGxrZmm>>9M`dEin$xq)KF2-*0qdoFS9(RofHt15HkT zi1?BM(_uBi$zzV15@ZeKdYRxq&l%*s<(H|@8m)JnvVd# zDC&)ox57NL&Y1iKO-Yv-4oN$YeteaodrcCex!g75s7sbe9h&)1i^&1I>=Vhf+WPr{^>;-C4qh9@7gRU$h_S|ovuLhV^f*v72ySK1|uL~9ix z&g{|B6TW??>;0`F5jD&_nO_K}VNzEg%>zsU7dswOinW=P?MjaD`jI_~WGjSX) z;T>6*_EYnQa~Cp?5=YhsuBrO%s0wzV@(jX7(6 z8eJcDTBSRM@fdK{<)`}Ry&Wy@P`dK#<$L{Gi*#n|J*B<16{N;NQDBRwT~J!7Llup^ zzJN!w0xHQQtr6s?fLz9zd;G?y;KL;C!qC}G>H9uWR_1RdEuCKf$LwfE$o9rmscAd1 zPW-!@hCT~vZxOoiN5NRQ96^Wet&Zdn^^KM){k(m=o`qH?WG*MPHjqF5uq=Dw7N0@k zRoI8T>@~=OT0L#e;}Ac`2)eqs!Ubj3aO>=(48RjdubIM*MH>D*cDwfhOBP?8Z}Y>a z;OP|R#U5!-)Hm6M35K4x8^LHjvkDC9Auc^?r6X^QQ=Dl3#BThh><#CnhiAIQcZ8=e z$f^T(pE7~JbbBTUi3+_2Vj}>FXB`TCSb}P?lQf`R)4nW;nPexxVt+>|N<5!ODi<_B*l6Dr+J+ijP*j3PBw8 z_-g{8<}XZP7Ve|M%5%Y7 zzB4$|#Bi)2sF#;aC=;v?71LV>!qUu;W=%;?v)$whPvBfxK9D1UN(W)?TDj$j*r0x2 zTh_o2acPB93n$YC#8f;-7EqpH;2Tov~=inNs-CG=R1Wqo=@r1q!YG7XZ@ zO;!$4R{Ssa-YTH2s9W1@OIwPx6nA$o?pCz8yA+3F1&UiK1&TYt1I68;xVskjph1E| zfDi(I`t7~{voFrwxjnf|xMHm}*PLU#<9X^F)M7QUzCmPBbA<)rUnxv4#w6j z4Ruc;ZQ00~@ZT*vGx*EQ=m=?F!v_KqaqWwOJCCyeT#=S`o1u^C01HYpTal)djiiEI z+(Xd#Yi5A(3>0jgWHJ*1yXBYuzYwh}Q=fkdsQweT1%<_E_JD+{%j9e9iMwC(c$3ZP8n)XhzcD`94D=>;KY7szd8TijZXo8LoUEbBDV@T z5WE@ZsZni-XKD~`=;PHA(?lhm=kBL)yKip@>sQg(m>LhTp+UeibpjJt3-qWn_>b%k z#?fO;BQ-?@2ewV>4r_-(lg&WFLCIdH&*#2y0l65YrVE=UEV&V1r zg*+hZ{J6ft6(hEFCvm9;K;Xv%p%*p!V{4D^lgBA=LC$5*?Ee+h#rNoHa(h%2rYxWA z7d}*V$4u9Ve>vaYHrx~kXu?wF)gX8?seWz~e;m%@ayw`HE;6tV6<%wza;cNO)4+#Z zsT7fyquj^LUjHCA6C7AdE;}ZcRR{};l6bc8-KP9H36RJ-#6qDsi^c0#Jc4M67{AAB z8RTcxnF!`K~CqVO6_dLU9wtsNKhhXpv&(BW-?Ee5+OwIVre!nK} z=MGI9DG*s1t(JMWjoW!z{uQqElj5D{e~;G#C%FEBxe}3JE+);ZMU(bGW^Yq2~LiQqGv5kUyWMdOS73_nN+leSQ6~zIhGQ`@*HR8+qYa< ziFbQ-vEMw#0Y#Zb(jC@!8i)3(f0DywI9EWYHy-_h|ld@G8Qr7*FewR?$N`mTzQu+6$vc-d8Z+)MG@Q2)D9x25R zokzBmKZjILaD25q(^nIw?pxyZ_02!{ULT?vrk?&S@<{Y?+3%}h_rU{8e>LA{I+S>S zRUQw&6%Cd6kXmTJT@^0cUfEDCYTdd%LqbNb@Zy#~&+GERQ%(1F^zq z*BYl1`YdaeaGM<&dcW-+M~a_RTYbWUqiM63LE|W#DoR+W59JAR!tu?oT9`u5E`z*U z?P$!xR#$>H7)-02^Y|#2(VOuj#6Cs(Hbe>|_~p}M@G=uCq$L;~tl1jo6?ALkg1gkF zufoVW4kk8!IJ&3zrzog85@lwVP|X(-e$Te0wZjLFaWh>k-nz{Xy@eba*yWgJV#GA z?W|pGWfqTK3}&@2FX-&*E&&VlYxMd-Po$oki8#Uax*sE z>ATK>YOYt(+)o9?zy+jRO1#mn|~H;z{Biwe9~(X<}#`NX7dD813UW zl*brV6I?q)WS7qW1x~w87KbJ5|0deoj=ZlqbOY_GwF}L=e93$u;6-j$Xj@P@xUZ5f zdsKu*OEI~92Ui)+P*aovm{#9-T{jB-X%WLJr$#J!zl*6aFO!J-WC>NY#fi$Yd1Z|X znV6M=Q#smBL6HQex84QRg`YQ+ABz@--~)48lB?HhRcmA3mTWPij2ONE@I zXv<;M{{E{&@p~96FH=&bxCVG{b57^tSq!Ojh8~(6_!K_U2Qu$4Y-1~VyC8zZN?!FR zzj<#z;yS|ddav+~3ycf@q`78P6>BS%anB}|4@}O=X-A(qZlPMv5Ho;x%QWFyJZ|t# zfb>WYhyKGC6U7ZGQ=dtvTu!jhu-pEU>zMcOQr8P3Dx2ReTix(!ZV#=_pOlreIvqb! zd~&KhnL1MaTnaXOs?|OomZB5M&n4C4w=I_WdO*i(Ydi1>n+BvtZ-k&%$OHAa?>a>; zhSVJ73mz`{Y`l8Pe=z6g@ETANPw}67_yqfYxU-$o z<1~Lr_&j6IrHDOK-oEIN6ZJAuPhg>|*y2$f_<(z|RvbWn-_q-3LqVukgDVig_hN7_ zgA(H+Ky(N11l`5ue{@}ifm|}dq*_*gv1YS!7XQv5%0&W4FE0O|K&&dMdSQAijl_{Na;#ZD8s3J>W%Crb8Z8Ei+sBZVMMz3%3W=Ar9=HGf9ah%KPCM;740>K zDxx>Bh00bb&WF>{a<{n7+O`=LTJv+OXLIWY8J$BzzTyG~N}YBm4@(V**5z+T8YO)IFz>YgR)-DH33i(bcKtlZ}Kp&nVT3Ru@i* zELm)Yw)0|`@p5lyGo6*DVea>_v2LJESN&IBl_U1Avxw2JeuJBsIze)y&$_0a9_`9Q zDYB8idygtel9>SBXbsFTxp3f~rBGUR5Y_M!E;q@M(p4?BuJm+d<6ly6+=teAk~qcS zVuZ0;o%O9PX8aF84T*lD*4CjGDRPDP%^n{ATB`ova<3aB2iwO;lb9zv+XuR|E@$L) zJ68;{=3IZaz@49*Gy40tPC;oy7inSTmok?UZH=nEn+G2RZLFC9;f71+BqT*Yhp@{T zry7#>A8MA$IMm_7#2VPuWSk8|EpzD?(bh#G-VAU)65@nn!Tb-8d zmb(WZgT&Vj8Kfe!3!lo79r`hyp^Sj-lvNy`b(MnbGDoDVU>AZpVlA4Z3UFf0jIFop zo){1PwgshCU+~4J3sKbwPremG8Dkq+1XQJM*U}?f_Lg$?Pd*|5wG>C1ad52N-W2I1 zXYH=T#YZvDd`D-|F64tzm`68m9J+Wt?rWdG&Zrc7?vWK*&FW$HucR-~I6)6yFsj;3~ioo1i!{VDtePl#BaYE6eXq#O=qjr+9!VP8)};<`e8kQ?UhhzHvS<)EdW zH2~STu#L5Q7YC1vxXK+DspqQVsB;$k?rKk^4R{mCg$($XG(2$hN=+kh?!x|d|qwh%zoZ2X%B@q2X1PqVygC>nDxPw=ggAxFm6sSIk z2^TPo#{KePI<`gs5BHN{#jJGzxl4#q!Wk%K${`(!3hfkz<>ybU%{uEr1^-kbkF$T+ zD2tI(Vz^#UadtoC(zpryR?E6>fv;}&q|S>+AJFdYej@ncG;a3 z)<%9wht2C8V|k0E4n~AkYIbZQ3_6V!W_4+Kg7}AeE$E#9d`Lo{8SAobX?qEs_4@Vp zs3~COHgZuUBPb%&!Z7;k(%|Cnu9Kg6mR)Nvq(Xnv;?&~aS?3;e9}Sl$pa+6SDYAPj z-@Mwb47(_30Kqzy3IpQrn?4$7*k{(M9i2Ihc{JM_G+j3)Z}5Zl95~JH(_>sLcQv)y zO7b)?e``eN{e?i!14pSxqdmua+PSzEwk@|x;+n_)h0^tDLxn~8oywh?)>4~YV`mri z?K}|t-G*Nv{w*r&XxDBtxuARO>XP=057}URGv3!*R|DvV{5smBhCoj8ugNMq8x~ah z3Ss|JGE~B3fjF++li*gOpFg~mc!Evg8jS8_eBAlksj>$17r455lJwpErKxZQ*BV`+ z7Mjt0Jo=vK$WOjz6G%c__B~Lie|ej*QRH}L^LAc6_>z9^gnR0&bv-&TZm(9Nbv$G6B?1ioTw+`Z< zj47;CQ=7-DCX0^sFQ5Mz%_?;59m+byd^8X1XW|g!6KXTpFiC7s6|A4ks0@8`;gduP zw9KI<2tVnDb|W@sHT~+I#z4mzf$cvpRT?h*{i-@pB zkOA3hrZc2Jh&_4MN>X?$^+ky@LDhKuONp&DMko0pO!I3|o};Y|;C`{hjd+FjOwpkq|6$p=mch$1n&(YCi_qf1zkCVW!v6mz_O zG~9pd)*@DAYgoGWpXjhIYV(msIjhIY^HK@>d*tGhURZwfF&l7e^5x2Cxl7oorGc}Y zycjPwv`gZihq9b()1J92ycqQimn24KMxrgne+!tfS_71Qr)bagim|#3%6yX2CGgDB!d|T*jU^h%cMRKco z+4N`PJu;=y;E0S!3as@lJp;^9dFhOM;!zrQnW52tj{gNQ zeI<`5D2GHp{Ou*AMe@6lPW8c`NN6%|{O@x$@yDn4DnY`so$`D+!{gQzu!Ff;*}5zq z!W>^DUHMrJ2RC-clYa(5a~91RKJH<^1@g=9G3d7kuk2<;bO>`^9nNhbc%RfCD(912 zhvM&~6I6aO@oh7l@%_ufVu)a#sQuI3AyHUVEiZi@#g&u13M9rG&ij>`Dnl-nkUvb5 z{1e{!j)gO1L=`Yo7*in!0f;w@@}?2-qV%S?_DvZFa}&r|k{9PN5?PEKEK8*Un_Ww`H{@4E^ z;N3q9)PH~ezXWqXI{i~P3Cc(hGNX6CAInHl(%2ouI|12Ho0S9Chc&4)BM@;KE^3m&WR!jKD7`|LjZN zpVQbtLr6kjWo9$6VT*tgu1FZaoY0TdiXyiE4fhi(D{P&F^sN(T@Luk0TUG|=oiyw( zvAqKBG2MO*yTN?>H-|GM8RzWO&qWLG-ZRp_E21l}sudavhzpkPjM3uvT|j>|IiXcT zi78Y#2X^iduB| z#C_(yx8Kiux>sEmWhPLYz^ZYfhl1Q2AvRw)G%zBnoCCa1t!)~4IWmznpvCcHK)d7N zCqw_QC`#eWYqmBvYlg}wdNS<`al-32dWC8+(8gIc4;lN_t!?&cU!)57O1Eecd|Nm* zhTV|YQJ3~#3E8~0X&97sK*hebYAF4wBnPRUwKX`Ly5=?#EW-uz)l8{I?yOVoRQ^ku zyu0!bLT#Oxv{N@LaMQJY0008(hQYC8GS)R&v6ZYA-$8E#vJ zs+33pSFo6~MQk^V{BWV=IG^26@4ix8X=rIgK$Iz0YOw}uqB)p-LZGE$DSegD=3?;y z$}2%xx)gqpl5iQ|X#eH++nAR03kVWtYFf!RY5Uz-e@vg{MThz--g)LN%88V9K=XPqEYc;mA`0*QPajW zR>Tdbo`e%I-jpzk-B5t2OS5^*S8O?i;qDh5`KHQpk`URmqIkQ4C8}&!Ds65MPm2T5 zh8sivwM!q;79p2}?|&9jz2mKP4zPcJpdzO@#G>NgbLX4RPR0!TSZFar@wMKr@*(L( z-V6W_$rj_HzDbVDZwFp*bHpTZgy}&1Jgud~_tjT(u7ze(gimC8#~h7d`gagndO_qR zF|`3rNR;#OQ)t-&(&`tQZc9zByW=i?RXvLH(FL^h%|_;-$j5?hNcW}k$ zS$LLtqr#2H=?XvP^Ya5eUJ!WtXc^H;25i*T=$+iCv?zgcODfepy2me;?7VNRRBx&HXX z>JJH%tfuq*1RHDsquq(bn`TcNXV}8JWl3JLqTtOKrVCJ;mdQ_| z)UEpOeCL1}ACgsD$z+_pfDya_2n3r>q`+XDq8Wc^>d)xg$IJK}?>G|{jk6_Pgq!+% zBY2gnlVA26rRrS_^y%`r!%~;rG|`jkm)*X`E*Er{>WAO-|5p6WiDYRhNpUy2mg146 zm}Q`EO1^x*gxF%Ng;gMZw7cB=V^w8px; zMNX`h@(RnCv#@ma5}Q}YtIvH^YC%qOV5=a{x`fwGj;{WW78q*%y*B6V31d5_hGzE# z%a>TXdo*dt@JY;7PVZ8=F7f`pp{)vZ6`1Ie7I@IyZbIrHAotU>Hnmn8`LfQ1AWLa+ zZ7o&VQrySuoZyz^IEHsq>bqDMUbLD0U3_#DcT57#blG=pIpbnjDiWGtEr9I^TsuA7 zkk{(LKjSWsYbHVBOq51{y6aFbJ>U71@Tf)!*e-XFZ4?g`5g9Q1@eYkkS z+ca?1+BdDL^|K0LSbPPrvB0|Ms8A@f{`3%s^rDsnv%+Hv7B8p1G!%eri$me&ZYR1M zsYsfDs6|B@00{}!0%*w;pIAMrv$0JlK*yL#@{l9JTGqGKQ)`*UvRY}so3oL~&m`Tx z=F<73!}?d~vc^{Npp@S*_ngRmWu(yb1aIO}ML0IIeCQ9Qq5aVqwzV=sC&rIxA34Ru zqo4&e8WFUq$iSq07b&3YJ*6zV4Ox>GliN^w&P7>p2+1ot zYo=&9q&iHx;ql~dFJ@ycrbf78`KUPzfP9!06GQi-keTQQV~9(Ba(R7Ht&y`&7oC*p z#z&%eDSbrPt(d{4->Z}~jylsq`K%ZheXJFfu!=|gXXMfLs&y394<@N7MFnudD)CR0 z6x`&smpy-eV%?q5Y=Wkd-8@kyuusN-F1H0mE|6~cwh%#%Cj7i2=Q^Gju2&AB<*C*M zjopUyOBC53<)x~o$7s`jdo4yqXhe;;Rpqwp|DkzCJPhkFipH|U3(zDHp3o5dz>aD$ zA@c3Wr+rod*DYQ`@>B%oo0Nax;+rAiK-H-7?$mSUf!;dmnn^LDP9P>sGv^ek@2G`mytW>4FH>al!pub(eR=$(x1;IUK6C8coD>Ce4*{nld%it%D_dG@$84GEyhE2WT-;r$*34Ie&74j>^7QP(jPx>S-S7i^Tvz=?dYNQ zV=zWiDD>U`m_${k$E7cFxRJX!5$UAC6W+Q0zy{7@$04c{9?)cyMqO4GJ!su01xs3P5>sdd0tI*MXx#aiKV z_J3+Nh|xt=qx5tdvIr5(9%H|Er@EO`qO50M@1^Y>e#9u|O@H~y$5j7v@28ry$j$U_ z=(G8bO)mQRI157o9bJAra)atuBLR}c)-sdnBcA05bGhSSKv+hrlXTb*0b9ERB@ALz z4=W)KXSw))U1B2e901v?0tEG$3{i6OJ>e}M|PF7EHLf5T8&Lhq44(iwPV z`#LU^{XbCB`*TR|N6Y zS}K^H)kqzBX{-6&iOV>r+-S|X&X?}67s&G%I>W8APmCZpS}w4r(~AJ!3(?W$W`9wf z_#wZ$BOBG$PzR{kW10mTEi*(wD>YWbqLj!v{nM3oNVt9Om-O(1 zM!7X*!Ne20%~|mmz@8$k`(gu|Wp#J;fq^Hva(?cua}m1*e=-Z`H`!7WAw82DNVHNocwL9ft{ki(Dd5Ly9VS6J;_CJc`-PY8p+=@_eQ9TpzGT)%Z9Gm+r*PU zq2G`gV1?#~__a)isV_h7Oh)(Dq9XZ?zX)*dPh}727dCLZ@V?vfF}*i5pq$$#LTV-d z8CiADUiV()MlBD;C^I^@vxCweV81U5CLih^3NCjit)@9ZOs0Ow81r`FF>VktjvqC^ z=w_qWKHk$@2yn*atk!CM?xWxNJit{%7YsO~q_B4GH1_>r$KCY+b0kVjXnl<|NO2>JH0y)4JZK(=2 z!xs2E#jrdho8%S(B~g=3$?5#ET4r4or4-6oQn!c{5a{|^6e*O?IMM%4pnUO*_)B?F zgeFqfp{_YX+WDjbOpH4MI&pFO>R$=WI&V`8K`8{2tEFd9-sk+18M|x%09(fZNIa6A zM-!`>Wok~huT`+@z^v*l7nJeB&}Gr@r{tNP@I+y_y@Jz^JFP%NuRNy@B@4LpSYJ{+ z&^X&fARVSOV6aE-t~q+48ui8@*kQ$6`04}yM%i6I3hiBi*fyunA6aBYpT#MA>j6ip zOCz<2)_KolcJF#qI{^YioV>*0Vr#t;$A^4+>~_bOW6nJrF}d;ILtnBu=7wI0*@Bh1KQTxM z7tUQdh% z3imoCthM#-?X{-COjFyCCxd05Yz1=?-weU3%6 z2H0?B@}&tGCl8n}G^2qAAu=Zz1YlT`VVQ`%AFW}sY%Cb7#EGg|EZz3GY&frA)BFwp zaokZrhSySxFWVVUh9uh)%k*3I7BkXO0b89qEzWm7gAfg6 zeyFU0oNf-CfkL`^`6FUZvx;#wg&{{q?*vbNEiQAq}YvvK%SF5J?mhqrOp^DF5AU&$czNwV!%%hiuo9 zgN^Qn0GTjlkN3xRn}ef11)Bm<{-zNhe!t%F@wK7ZFDA-%#p`j58;Ye3BQPri@24gT zv^tp1FPp28rK9|N{6PNd_4u@YLsrt;tCgyKipDGSxQGDx7WM_md7?|D(`>4tQO;BC zvGiiY1!cSOVx#wvm=#@F9$^|2s^qqCEgeW8c&dR}GqWg5RWfnUl)C;~ znmPQd436yj>63n{1!bZ9j@Mh}}**CL@7%0H0Q1E+w01 z%);1!Wb$39mUcP!G099fX|@B*A#h6P-7vbqchCB`iN*1f(ur|HlVUPrHsUGMu5p{N zIXKrh&lxFV1>$*fEI~#Yb&D)sEu5v-LrseWkjzHKYYyWC#G$bc>0$KO37?eQkH_U6 zsWLzfc<$Hse$4LnpwVv2j#<~=dbvtuM3W?IY=2qrrM33Wy5T#;?Gm~|JoFvILz1X0^>lhbt@OVuf8LG-jMXxBMWg z{8tWw+F~O762Rmu!_^tZ0N#9_bx^I7Q!Xh!$qKXc&Q1CLfH`F*HX2rod~QRvTSW}4 zI!vF+)S&4hYaz#!-v~E-*Wfr!v^fFcxZQ8twbwa4t*o<(_RX_J@n$ZZYLF+1H8{ns z1Nj7!40kH~Gh?0a6>)3ok*t-+1HvMbQ+&YX?p@h;im*TO>yvxK?t?=#h5Z7Iq)9go zO>Co${WsO+XR&bJ@HxxR@3ckNAO$C+voZvQCp?ZJiPfLKIx?P^9L2o@i=SFcok+!R zVsW@|qkXAjw#A634+}6U)cCEJZx!`6a5mz&0Vlj9Fe{j26VV4cLa~w>dB^V~3Gxsr zWXSLLaKKUPy6R-I9`5r=-U@Q*v@Er*tO*XCk)N6 zNSOFh-h2S1U-ofG@mDQR^52`Infz|i@5C)c1fbtpHA!OVpR@Ng_4&dT zy8nXUkLuT?!hCOmmuCVfM9Z9KQd6;FM4N^m-#>lvgzk)sa!N8UYZig)jmOM6AMke$ ztlkSr#Liuq3x2Vg!vnUJ|SqFemqr8R^@f}n;SCM(b{^F zbKcm)sb^0bwgXl~P12@91V-<)fbzQ45~eR^1ctb_lYwq7r$gOv_h*X%J$E#zIFF;t zAu5QPcb6+5^DS=H=1*)Qujf*F73cRMt!kt}$00j3&1h@y4B}pL0Zj(S%?Cc_GBM!$ zq?Ov^TBq)oU8L~{3~~idg=`@jeXGy1gJ99k&TS zjN1AO$#BXgj~Kix5~%okepJ(L&k~?mY7x9=;!$~%G^Kl#&qWS-G+kbJ?WyRG*JhBE z(j2}eWL0^P6!1heSmUo5q^%i4Mk(^5Ax_`x2}@|4M~ZRmq%!41=F5B6}Jz-sPdotey!v86jP)EE0P4E|f4 z7!p;q-+=G+W+JNlA=Ptfh_BgidnXVJI5v#N7RL&z4|)MABMv>NE-IkfZr8c|wR-E} z(J7Y0f|JY{1%j51JDIy+{^$V5>DQ}SL_!>km@=kwi+ z!G@1>#`)%EF4>yVn$os)vxa0eytgm7=Y6fB$aAnV-*u~l7kMq*JoZU7bukZGvq$OQ z!;{Fi8tAe)pE4Qa5_^yCXm`CZH+&fSn2E;gr1(V7;lIJf1IrG`tvo-y&Qti zm<{m00Fq8{_E?qz_l^SH-9g&t4llI;PUlZ!sD2alEdL2f6^ zJk7p5Vm9#AFd&tU0GIj?sje1wDd}t)>1A&r&VzTwN(8IKJOCI~#Z+`or0~5y>nkGVdJ}T^KF>9I$S*>CV-=Xhs5$ts^+ZA5t-4co824Q?+uHgQZ=ii>tK$pKdVtNw!X`hQB-u_vZ3knT;~AZ-|p*OMNN%A(ZB+GM^D2+ ztea9HbD?3l8);3WFHJ}WVt*$Jiz-l$yKq0MIT??PT2C2NzQ&;kG6p0;@N3<^=AO!k zK#Pt`)#9w5nuTN}b{P3YYKlYA*xEiac51#tEE&=+wW8Ab@=`+1DWoaK#!-UuR%Pm{ zwd2Se5M|!)w}MOcT`eSm3e%QL0=nf8<=4<*>tuKbBvofjHD6HX+OX;=HtXY^sjPg+ zp8m7b#XU+DCh!&e!4Sn#X)&>oX8~H~+i(7d=8%b%a5*vaj+9~)bdZ|4C}sCGqa5e< z*K}AW*6dm*#yT|^Ab8HT_%{xNX}4dnP)iW{$gB*~3~~tcvJH8eCKn8^-5FL>wp>$J z_3;n%HJr3h=)KEBA%e3ESkAt1v%tI>EB@e{2(KD-nfTg1`w;nJEP;4Dh}z8kjxAOO zH+c3~Ul^p4&kBPq7 z$}9IbgKYd*_wS8HX?)g;+c9$!r5=({mYhjt|NPazDi0f5BHS6yxiBvn1w)1?CIbit zj0KL3#Dtyq#g?u-oj@NbDOgj)5IZxi^UN#Yh;7jtF_QdbL9;M>f7Q6sR%M|ELnTwU!s3;u%HB8{xhxU$W^%$UrpFO zO=JxJeBp$s^L-_H6Wv;=Ml?ibCYLQm>G)UKGSBUP@^>;9DC9>Yhq|%kHt48qekLPt z(XNC2S1X>o0thE*-&?)fR)0e`n`OsFr0XxO zCma{?YfBL7Y#MxixDqUtpU8_wWuNQEnmR-JtbFLfi^Ff!kSyJo+%WUkb^zgE3ir+T zSdS-?)dd_6oNt_I#x_!a$ExfWHXm6Dpxd5Rg`K<&~&<>MG|i61 z-0_8->+wgokiWil41q`!XSz*M`8&`SDmf7eGU@rWn7wYHGkt5S{2NeCreu<-t!;bh z={z)v)jNE8PUBXHz`|jz?e++G9(D2kUZ}6yHM$LT`e{%+dVPAzrfTA5`LKqR12p=cEj%0Y*`|X}@*p z&&0_gjiGD()$c`(N$EBxPF+Rg?vAdthVrJZNw-sq7BCSzk{A--Hco!(Nha`dZ|cR& zsN>x#*N21`H*jom2VQ+i$S;A8{n@KGfcs(IGIdYxqo3_0IGCkkhyv7egPa79yg~Z zA8{a09pqQV?Y+Pf67C}LlV-%x!4j6gM(gRT8Lj1Ii}0s#UU0Qqa?HmArO zkh)9S_pc`dsOByE>bXu4lwFiB5xVEeBsX|7VO?+e^IUhzB9kcyZ^uf z|4PBLzgE+gD)YcPAL60785mg6?xBr)I2sUks+)8=`NDX!+Wzc2*7x-Ho(b2L=Ni6-*Z#ct^GXyf}FL3s6doBkBQ#amP1dn|>Xuw@?%7g@! zwG9M!uOkmEyC0xxSiM+QR2q1|vuMl6@at2%UuSv(UB3F8odoiduKsSnTID~$EKQfS zq`4yc_4?Q`SL5X#j>xji*cLna@{Q^=CJfU0t}9IijW{_6%zB9$okOo!yWMSxqcpJ3 z^*{4&ORc8OU+mT`)7gmQeBw;_L)q6YLc7;YsR+E3kN2gPcKP#J!_r6$a3HfhGvsosZ(QJV za>yxysH{SJT*ZUaEeUox;<~S_NnY(KwbO7n4}J(tFHgwF{u$e>-dRJz2}}6b)(N@4RqtP;^R!+l74NRUP@Or=FVT#pjnXryP;m~7A~IEooJh#5vmDdo%Zdn zKbLV1+uWFEg*yMRRv_=P(Txqx6edlze4R3M6=jCbmsV2xYi{qbO5{foxdl_WwblM^ zarx~a_5wrs>L9tyg^M#;j|<7mCAIvt)UjB^O~WEf@y$=JXd#w4D85IRRQ4A@ zP}UZWknh8-X73G39o#dgt(Q61Z8?H>Igh?DHb8G2{=GHR*jK*3nN90l-ZaFz3oIlT zv4_uVT%vG=Th$kUC@;-I2@4>mbPn_)E4K4WQE3{TY}+0snRfNq0YN7&TW{wn8rKO} zMfXF_DZYKax}~jojPq8S`hoJqvi&_x5(?4XAUL6cREnyMP(AiATZ#YbZuY}hE0%5d zw@@a|UlQkf1p<*|L0rl5DQz}ePD7mVad#sGesoZ>>d9=n2Ufj{1R6y4`S(Ty6NC^M zJ?Vx_J(&^AyixnPm32;{{7{k~w`%1S`Pm=>7yhxPr$2L@3Ze6CEALsm zT%UUK!A`471+Tfw-IzWKqM>uTbFfr^!V_9>@UoWT!09&tm2~hFhBGtz?2;n-SZ{r| zcm2)a*+oi_;AaO{%^$iW>uDd`@0p3bke$Bb@8l<(W5&KP7kj)w9Fzki zC7uvZWpZ1M@pHj|Pab=TD^>;~WM9W>eYc;;dhVP;Y+ZwF-iwije43PW@R1MTDSnKu zY!48I`PR5#kumQ2&bo%M3?(~uu)hiY_yU`&Pt2=|jK7i3h~C}uCH%DQebi*Kc+ZSD z+zomxHTrr-MWDC2Aw4FBiN;3+b81==H=HMA3BWGs^rB-YHM3v4&z$y6%ylKz?~j0X z2ME(}i5j{Vz(Lw^mP5@RC+0f80yB*LD_MeNbOc((miSQ6TnDmUr$uRf`GPP8R~0J3F3@+`)SCLCmGWduo{#+B zi&VhY{zq!d)y^*x7zYjWm8))(C8JZ9Fk6sU>NmMr*Dcn;e*gd8$8q`ZOj?ERk2VOu zTnxdid;MFzZw!xXoi_*IrR?Qa;)X9G3{n@xc%Ngesx z@4uypbqBtT)`LqvZ4};Go}X1(*1{0HLEpRg&I*(w04K$^q;bvVbUuL1hy_Yi!K)Z4 zW!)I>;Xu1ABMgytkn9nl3%hHA`mzu=I1ZvlQ69f@!l;MpSy9a!Ai%s4LABHyMg0OX zM(w_B&D8gp-hCZI047aXdUQ^K1#{$$t6A`tW<9TN`%u&|@8?Ih)mEA6%U%M&8!>05 z=l%265*3O~d#kmZrA5rqHjf8u(w*})@y!#6(2Lw)@O8P^oa_E><^1#g_G1LZLBe=G zi4?&b{_}AnPQqPbO(hjS@%`P9dm7vTQLjt@Ywci;*zAhI%SA(cq)l(3WkZSVl)@_7 zy$fq`k*l3;#mWcdr?q8DZu1NDQXYpu&uQ8jV_uWE0Cx-R` z-rL&tWHPINzdsynVh-^{mp*AXnQraB3Z!q@7$mI`O9?QMWMt@EyWPOUQL|QwsBLnI zHgE6AOacp7DMH2+WVva)ywHm~4OvD$712m91Xt6kJKAArUz3t{r8bbalgl5&y#wfK zl38=rhp7S_(EFN3J&y}cR(~53c=^2-%xfyV>kqiQDigS9c{HBBS1>Q^{o+{wF`Pe) ztK;kQxgLSDcWic_(U}Xb`Xg#P8=I@j&IaN$K;M`|=t=sir$XM4h|R4tFe*{h^{gn` z)VW~2jx8-88ETAp6%)I1YEPEGFtOC?^DODMj8*VI#oK|Gole3j15e84KxpqlOTX<2=s<_Xs#J0sy{>rrS5WF^BvT$MJ^hX{UZNTSMZyy@iC zJqaOJeR(!T{cZX#asYLf2mvy$0=(_K#@-7I!W<}P$0QtrSCb6<`S97HP0b@6$WWQ1&SpF&0jG0L{qdk#34@eKac9k*f`>I}i=oAQf;YL#qu9 z#~xg_fcm!`j|Z~#rVelg?Jht3?D)pM*!U{-Nm|J0m7&jZv8{fccB-h+UGKzr&4;Px z(dE(IB(@KB9NEoowe^yUIhKv03Ac@lV>X&&jtw$|N5Rpkv$xwTqP*becNLFM61Yx0qPMM5<>}k6hT=P5jxsN2c1P z+Y#bWE{fl!aBn~1IGDk)2C7qStbHNp`GQr{;x~j;LqhPK_8hcP)&w+Mzl@u~mXQwq zRbol$j@4>#@JJIy#<5r%P#rGIeOUv4ZVGfWo45E+Th?Fb7%Ap_G=uv&LcAi%AiZhgqo|p5WbkWg({l zs4-hIf1+pA*+5`@(krlcQ2d^O5BJ!^gZ|a$@AN@>%_+k&L|FQYixv9gr*0CCXdKm) zLUWI!&^pf1lQcGIaq_ME)p0V)iG_okP*&?zTjERZuIUcc>~TUfu%`wq*5a5SEWn<> zyzt&mm9f<<4`tQROrVUnL90D`u5$#CM`ctZ?7jC_dAa#R{J;ZN;9v;0b=S$7e_>Dp z(Drfta;**F_?W&{RoiGNPSIB(!cLW$TqMtBS$jK+Re~yz%?0 z-ryGxi`7rx(UQ1Ij%{YT7fb%K(CI)0@8Yc4l*;GVJ3-WeIVoZfj^r-sbe$!rZF`+h zxOqetN7`@Z>Y@q_Ck0PnifaH-M#r!v7t2S=vLp7XGjjzBmzz3$St&hlvu_Lb@*7^9 z3;(tSpm>`){rT5mld?xV@un2`!Q;-JgVAe~aX*!PVDs|ETlfy80RbzFN0p%6%wTG4 zG20Co+TxA5DKfry83@Ci@YhVuwid6X!1HsYdJ1BzC!TQG7XAv>a8hZe7hxZyE~|F3 znT)D;yhv{^I@b~38&V8v*SU0!^XxZyD59`@R3RrC4#NcyWqLaVaehg#yLhp;(dNQrw|H@#3X; zu;P#um!QSnH8=zdkdr?BK0i6H&Wr!dIcJ8+WNtP)?45nvTA%A$mcdtAF74EdNc~{e zM`W0NqlZXHc;;BIAw9DCQ6u{sdA;uYSD^2}?V4_FMdc;$ZVh|pPkK+Mp4r0i^q_DS_wJZheaOtFdKV7_f@BAsE1 z$sBi-Vf(>m(#L)$VaH&9RQ)FF6yq)@+N@X6>e^nh zlsf04(W-ibji#+lDuFxf^=Y~X#SAd`m-w9ey4`cvTn+g}A?;&}qOZy7?%*JYiW9Ha zO+4i#it_B_?4jRPplKaTwoH=e3r-{h(+JJ_l!0+oVs z^$gE~<5$A?QPJG7UJfPcu;Tk8G2IrtE}1H0UM-FkMV<~N>r_-_tMRE);RxHRC=BKO z*thbIHL7;gWEXhiv7}n6fR2w-8c7=~WO|#inmFR2R5=7AK`rbM>VO!5gMnv-y&q16M3=bcBS8- z$>ENgI>olipJ!Cu&ZN*X4EB}suYxl<_0~GRD$pIhKMWrew(4v2DFu-_Cx=LGORbsX zzFRq$RSY-Gt~$P8_tARFtKoTE%|99{{eF)AM!wErJNC%0)6AiS?3}}UK)0&uQ^a&f zqd~ae;;A;w844SxINX0A6=m|E6&rst{!zB|H=t7nRc@e{x0!Z(!4ev!9bD6ihypKfNnCE0rvT^vaTf`g%Q( z=RhK9QpH!Q^e@G+_h>o=4Uhm4fspNeB$WR2*N%q&l77sIy!dY}Bp~zpluuD$PHz3f zV%--_{&N=ncBgyL%9u9$;llN-+@wU6AvTd4%(6JA!iAzQaVuTio9P#+j0A+y|I5OK zt3l-D1`1iwki48)4w&KT>nx3Y z7s`3BZqwQw!=}@NA_+*&370fC`qR^<`Nmrn?-H=AAspP?7Vyi%Gj0o4q44qJ_z+JX zOK|16qCgFog3)Yf(7B%#J*G!|E4mEi=WjA&Ds#d{0>(@ERRraGFQEUrhRkJ}tYwOG z+_V10c+)diwB?H@ek8et6>8I-+2Hy23;0jRxi+~8W#A?E%$R}nA-_ynEc|{Zq<^vB zjDP!_j5O?xU4MwV6J|`AW>n{fhzytN3pdxtShS_IHjQ#|AzJVTWs4+TKh`CFL8(Z+$9tRGxgyU0b{HHaKd1x`styv=!yLe+; z6BNp5u1oMXT+gaNNosb%H;%0rY}B8qvFKf=Vk$aLGH|@{<=rFDM+B4FBslSEwuz5> z@%>EYPw1JvF@xz^9y9r1t~0&GUOf`a`t{n59*icAWQ(EX-vW~ZiT-??G(MCZOMHg@ z(+V!#wPr$HdXK;lNecOOBg#zQ6xr{Z&tq}w9|WD(c6j8tA9pB^{O(S`*>mxZB$Gx< zgqR5zB;uR`UP$A2%Y7zn4^|&I#F)gx@s@h5p(>ruOzF^z(>b1AgiYH= z>sud7e8dTHry3Q8oPV`rVpi68-5EYN8t>#HYr%0Zf#jRxGs36R?lDIR;|4=?ccX{o z?Q9R9%(m5^=1|-72Taau%H)sP`F!wGMFc~OzVv?e#p`uChb;vRtziDDdAB4hV6zmj zcx(8xoXBEjXA=$U0M0qffzasZGC!?iNN*wi3_pyUkg}tig<;j>NaH)6+TfnzIg&p# zR%>y$f)(&3)?KJ9Y{*vI=GkdMkrz8%p8~`ql60D99z#qvX@jNekY$tm`cv?q$X5)0 zde&apx0TQ9GxOz%GlW-W2=wX;WiZd`=o3OB+=EtRx#iha#EYO`52+wdy2yB4h*xt= z)G}4Uu}fhYqgT1NB6?#0Mb8N(LnK6MVI5UXTq85Ik|Gno$ZFcxoZXW+Yx`|fGY0w&`zSE-_Q9Z9?=nyJ`&@YNTh)Oz=qzFIU&7eIpN-P}VR?u%IH zS^}p}O0uwmuo77+)vy)u538k#+Mk|&l=e3}%ojBQ|LJ@GJZZ>R8BY7>+!N&O|JCsK z4JDP*1@im*@8h0IJA7gtSN@+3$ga_mFT?%64#Mw7iy-_zcrqKJjec0FuCZ~d{r~=N z@MRbpoL9JJe3a#*mg`?qNmtmEa92ot*nyILqztCR_|H#?73YQ(MN80sHT?6&JmhVZ z@qZumr!5i(7uhracblN_*IlN6&-C{Uv#ak5(*FN*vWa9F=Tp09<5&!{b5c=X7aO>) z9WmVyqG2e`I1INRoD5L-gyd`dCp@qbVsQnF({9ls-$4`x=e|stUzAO6H+j&O=R@CR z37WO~lUtY+se4J+D!TViup$>83J@tw^GdemtZvXl05WEPE7DxK(`N3$U0UPBOX8m|{wF3qpgyIvKfyC2IS!T?)(jp#R`f4@_S;?}5TlMV7f#G}hQ z|3?fvg}VB6yLFgh#6P5{dL`kiRM(#<+`xl}_D}F)ox>B?5It%mFiGAIDhz&Sj~f1= zr!?*Ts$>|xcE^gLLS?WAOq&OfhD(zr&L=`pn8$lChjr0#mythTP3_^UaffBBf zARYg2hRZS2@A9mUWWL-KqX^!3z75FgVoMu)EW;_gNz+a6VEGlgbGX$KX#WVlOxtx4 zN6a^RGn#XLd0!pi+ZO%(IF=z1^5WE+Jj$3w#aN_OLuS9upZsPZ`n5pRmQ-!JgpKs} zHnAMSsi*XqZ4UnX^v!*DuccF*#RcN>mo;t2bzD(gDf*1d{olUU=HM)m0K^V?_YX=A9;^f%Z>8gSweVO*p1aL?5UDD%y zS7(1X@!_HJz!6W^7R`F4!Vyx}f#q3I@zq_UmzG{R#uAi}y)b#=dIA zK1dKJ1vY=>yo~bRM651=0Fd(!$a4m|XUA9?Vc*Eyt3rAAC?CtX{i0E} z+OKx5!mCTDO-CR=G1RV<<0Af53v11MG1s9+PKsuCU(m<<&PILOtb-3%c?|Esn(|hz z#WY}Me8dFSjMI%LLo}OA)yQdzK=63?JkC<>$iO0bPmZS?Pd#6(ZaB2p&1rT;AO*Hz z@6Q81484l+=D24i%=BBR9BK(nuKZ;GaadCRXaU;ihpZmRJ|c?8=<|!+Oy_r`A+dA9 zaZnL`&@wtaLyyB|hk#sQz_DAouO-EWXu8~fiF7mT@1t-*l^GjH=c9^- zZ|OJ8PiL}R<*8K=Ck&Tio`*>p)X8#Q^lURxIFKr=^uosDf5*JpygwtGk1B4nm}`pe z+cpea=gVcv2&m;xtc}fRGs@dl8V9D~Ea?LX&o}v{GtDUxl@*^Jq6f7Na)d6m{fr=Q zd?Kldg%CAW-{cyq<@DjEgzR@NFJ3v!&bU!$5ys7z|4tO$av^`Fh_>$+T`pX~{pv8I zu|**U^5!r4ODC9k>*)c*sPb5tgX>E?y%Pb~AdFvP-<_0AqUgr=vwFCxWf_6qDKAtW zp|{B&IAU8_ghNB!4#PoqF;9Ny;&lN6P)0-5{%e+MBd$;{XpAf}NGA6#Hpx);Z*{{S zH;J9#3^Uo`@pmOhaUPhP5rSD1TM#EVrg{lGhWZ?-JN8~SqVf2-J{vcfAit^bUNyS5 zqbUBiUvqCh)SufTo^_dv%CQt@{=1#%p6nw;^O`AWH;mxmAUCw75!Uj%e`)LLWcg78 zJFK1>(SmQ{G(!~C44MUI|s8^DB(1HS$Oaejz;bqJ7hG0d0dK&s{B;VZ9<=di7DFUxM-|)2`uZtr zs~jnS)Kx-hB|n|1ulnd+*Ympukc?BFTa4O7P_}Bk-fnoHX_BbN+n5Aze<^K-Ay-cW_H)Yf6e#ns8$NF}CnvPDx8q#<_vNmF zms(Wgb;bL!D~mrIlw>5-_AE;g*(l_#iE>9S!H`YcJ^eVShUdz>#wb_)i`Mchd(o0) zAgoef|41xw`%6ncwe_z31w9_lK=4cL zS@X$0LwMy-#ka;o zaFfU~SV@k~V)@wy-#;NX_H)B`wG|Z&exe#>Hjo-}DYuLimbxJ+)`d83AoR99b~y0m z;I8R|h+eo(XzFe7njp&w>tB^2iA%5wc$Em3vPPq^Onw^ImtiV zJv)xT<$Aka$nPLMs3s}VwaApg&VA%uw~se1f-L-A5F(SCbT_i_da!YKBj~Gi7@MQ% zdjyjgcy7rS9Pj?+N}46hn-O80VG~ff?1_GpVJw+hKRk#hsfX|r;f0*J`nHnqk3?UR z#ANjdBsyuX047%`U?u}+p2pkc7j?5qZRaT*S>W9dhbS|-;e2+l1qm#d-+EZ91N+jt z2(|* z;oy%qIm5YbJm<#TG2hQ?owSLUj!JDkts(|#Ashu?gN`R4F_v4;XVhA^YNi5+inZnr zqfHnFJGVLmL^Wy+%(JG!ar@s5{FU=HrCh9n!kUKIE}33HI^gd#E+mSm3|X`q1GCPO zzP*ROwkyPz^5`FE+X?3I>NP6UaT9Avxf*@`j_Z2;9ypTd9l&|w8qjWd6qCJJl@|mY zLXflWrBj&f;T>t3cn;KhW@+qd^g*h(|2OkFc+09Efxv15-QvKNRBRI9?c8e6*2zW@@A)==7@2TpT3cG zyzZwN<|%fK?SNfG5!0}y#y|My+zbH-ZMa43Q+AD-%r&9+h7#U_!c~Obk^VHK<xz6L2UkDlF#8zcse_!J{AfsTlcrCFA+ssQ2k_0|D@wJ2oB`U_*JRoHOgV2CV@ z?!MMaC(~TKxasBn$r&uo+OcrglC4UvrP^pP%7Xj+omUE@`GZ;L4cc%^9?0K+Mm^Ae zED)9b3T4RYvgT%GE1b|!d!%0m;>1eecEMq=}07*ZUf9{<+AwR>w^ zeX3Ec*(5Byr8cUHanQ`mq1XomYhn3kZ==g;pRs#*I)Jl5PLP+#E%rVTI>5c~;UbTJZK(N$(ExlDq%RQ_nduXZK$ubq&52-V6 z@WeVmZ-x&H6s3t?tNf&4z7V<|S@fbbbo-Px&nXB|$ zSezVHQaAth*d?B9E&cwl=)?Ja3AHcJuRE`A=rAAj0{`j2V@uYW1dR3GCsK+Iub(viX+9^s;7x5Hyz zO0U99bi03&Wob&!saugB>C!r4=LI> z`J9~GHMx_>rGnj9(=QPZsXrRKN~?6`i~@Dg85-thc{CHKSl0M06=7G6M}eTu880uytgMfnUD=iuyqL3AC}o1 zk@3u6rqoFKzoZk>p)(7uwFS=MyzugtvN4oajq8ACAm?i%YTBSWrK_mhhFr{F+|gZt z&sX{dy`H)_Jv-*LJ*bv6<$-CdS9>>OFA?weWCUY8Q3iF#;-eldl03vHtr&>$(#vgCLhS1b2 z-Mxdf5;tz7ctBh@%A&h~_E^Q>($p}<@M!a8FuC-~%3Y+)l2QRXU^*u8N)F$LJ@|wG zWhZl&;zvGysvhY%%RV}7#>z|iJcwlK#;)UB#e;#g2!1*4PZN*Z%Tz1!f8+qKFdX6( z%#H?WgjZf2IFfvKeo8?5>=(ao%J+F*>`~t40AGqzbk}>5eCL=PJo&g@iw84Bu@^#xRWcywtJ!23bhd#8{a)((7^Mc+}_=yLV}& zNqr^8Li1*Jx_=v}@3C-d|2xtodjru@-S=@U*TmCon*haEK$E7twa>qtQ_7{0>|8H= zi#-MJ`hw9lg>O8*?L+lkKk$6`Y~>P}ijMTdu(M1H$a;Grc$@|=pZ^{LKP1WCy@`kB z{Ee!hRLdpT0Oai6WNf@>E_#+s1ag+B{xsuwbnw_=1*w!ED^RG6bG}(;<)S-v226dl zV_Ai~IDh{k9vP?_tfs~x1>dG>k)$#_R-x8<kl%M|gc3MF7J{KL} zgT~=petfw)ZO&HB+u5)+WiJ6q_&5yy@*eEe$ex$fU%R zz3KA^n{h{C=KM&^`~-9n6IkUFn**Fn>3otTwB>_R(HgO(k8O8P*<0T2;YSf99YA~a zgZJaHJlKMGqLCksNE$$w)#jgM5|#2;cUnnhTEoNbImb` z^u>dCWb_^h=r|QJL`FI(@5k zob`Y3XigsDKfG&)7N=zX6x(sE9n7q2l&pL zrJG!8FMjthPWbfQP3O4Qu1d>2_b6_xP+h5?SfNn&Vm@|%m$XoxXVKbeFIr49cT+rX zRLkxvTx^~G@DhYdc(Qz5Y=yftNa(@|$3%hG6_5CLd7Ar1)9xHwI{xt<<>A^8Co zc%U2pUqtfum+Nn0IdGOlW1;0hXWhY{M7OX)1m~&q6Su2+cg-wuHM29Xr}4`BSp>}x zhIdJp-TQ2GE&;S0&aoDIOLU}7-y&4S%$6FOABr;#s4y0@gKXq+H4ztdcdya7da&1X zV=bOpHx<4B40Y)cVlB?BW3W1tZQ}zHOwan-YKz0o38SjQ4agg$?=NO=dTKkeWVVVER}+wdEi%hUq9S27h%U#6WER-7cPS3QF-0j zANHi>4BR2WwrL$7BH?6vrY-2_<~f7g!?Voi@e};%fl0DwEozGNYcs;V%k}1)KeWZl zYkCv|oL%etDoPJh=egoHyQT>pq2wm~ zfrm?=LB*$5_qX?hMW4i?oAJcaER3*3+g5;e(V(Bk`+tX&0!T%!Ocllj?*D*%IZ8ER z6jk1z9`e8I>@=H-A zi9fgpj{)NwCf!*WIn8UvfnIz^n=`xu94`aIPv$FOPtgioLgRI_Kw4$vR}JV7F~-8^ zLJR?uWo_y$1FnxIM)Bw_KVc^7_&Zpg%8kZhEYdfmZcv!-b$S%5E}htx5m1(^@m=* zITteZL~iAE@LG-ey8<{OZ;E7xSWWOwd|Sv9U8jQ_Qs-GBy6>5+DjA-!+upQ8>%ST; zdx&XmeclV~qxfl*d7QR9Ai8hxzj5Kik(;si#?w!*@Ln09)o|CH(C|I% z+e}?8gif=x8CIG=yw?DK11;l5)9(rzKM55KHN^fwVgZDqq9d)|te^Lk%iJ>kp0i}_ zFQD{cHa}=J-DPCIa9LWA@+T)xvIvz-4~1HiE2Gt@trfGy?o^h1i&kKK{gP#%h6-Z89z+3$bvFDRYrjL>F0!=?SAGs<&7+;vO!ez++M5{ZoZb{{qmo{YBySOU(~YS25(*M zjehZAu?S;8A~g6PV6;s2+v_&j3ol$Zsq#Q%jaN#vVCF4N4gPPfuNqa=l55&%tbF+c zzK;vL;ykH)_Hth-wwUzmK&eP9jYOE2)>xWy+KTmW@bht@-Hxx=q;4y*=EVS7Ic|Ag zPobdhL)IUXv*^$@SuZuwm)|^3FMIn7H6y=Gs3lnh!Ij93$Ays#EqL3o(1kI{vzsLG z`is=)wd+u}Ww{h*mo2X>ruz8&eswgr#x3UnoQ~_%8q|hU_+@j~C(AF&5vn=UYY&pWRZO82+X)mf^jPCxJ_*zqx2=>O(58 z6U=j`!g`2`SI4y6xeub#XWvmLF~zN>*p{|g@hL1uqWIn%V=sfa zw;BSpz}R!9DL1{BR>@b{2`FV$r=m1-Qn972%^FL@G%~y%)4Ksoi!2(;0kY%-_b6wE zPc-R8e!O}um#YGO?;&<(|7ao6!hVG<(YZsjXUSp0>b0bula?Mza)!ATAw zMR~#dcfy4|u}?-kT!CFHasN<;B9uhM+o}xbh%aekj5mxM(&;TL2Nrdso0oq;MGx23 zl;+W=dMB}2BJrWKon06kz~b7`Hps|9AH9Pf)wzt*3e<|f)T-eu!j(ByZIp+Gg9lQR zek&G6(%`qm1VPx-?Za} zcf}mUT(8-v_AWc^G|!O6c@4I1(V>it)~&;?N)t}=RB7z3Ml1qIeHrnHk$yc(_Aqms zpbuN^HamBN04g1_mr#{oP{-|RkBSVDk>Og0v@)mmiJ#o8n{(^+wTl@Eu5+(Sa-Yq$ zHS{O^{sSuN8)P6sMce-d6>R~d3$vh^F8b%*v-giSI+XUl-S)IWI;h|`uCtI}m;3r@ zDbA@IrPSdZg8RXtMH3y^c}qq0W@t9;hIt~3D-p{mJpE?k=62^g1e)?eVO&UQMbT2( zr-b0fz2y7ES3wbS({nXJk3PFfDceoGv!ob3CB8lDpj{4SE-O9B+#Lv?fkL=>gemkfCj9K7DsTK}QBt%_pFQA-E zmb-tYUM6fAP?I5_Qadp_ZKYS?p74jkD}5~5z+Ui`DyL+!{4@UxwluA}!rq1k`#@!aBHdj1+>UddndAt7v>#ODO5@&*ccESS1?OxshWCk$nnSy+Yk2-asE1i1% z$)oqxwZvwi7csTNZ82i8>cg0uj|Y*Io0$KR@<6Rcf3_qyo`8R!*RNV-+FxF}uXBI> z7K_kQrt2A{;S|dufvjPGU3Uc9R&@l5lEK?7@;7$wBJff<$#Bvu$~lyf9F`)8d3B*u9sl`T1c4rYIi{oukicKeC{q87dc5;V{fWrylA8%-j_w zk#cM5cnX$Wk;1ay$lu3x0ct*iLuqhpP(uoKXnS?@zE|NmXkiKb)G?|BP%n_E3KEzv zcX^ch%KRRKyonl&HYRGNpEvAJo!*W%jJg%{VSNwgE?54XRwgnKv*;|+x8(r#K=|1) z+6Q}BY8Fh^BvyU+h!6#6F)bWL>F&KiK5_kk&$1eNU7H@twF^vOImSf` z**awQq^#Ko)$fBCXpEZy{>-``yHeoN+p7zlZzW0fUd}j`pJ_BMf3Op9{X|3)k6 zFxHF0dv_fb2*TbJk0)Ilg4BRS+zikLZgDk>!Ncy^E0N}oC-49)K?s<*Hb(ajitz)8 zx*FiS(a#o#(i)K8@FJ2-`DmMMb~!72><$QpL{im#QVabL(-BFA6F1&!>_rh_1J!mo zw7j7MJ~en+v+YpRab-k0_u**=5tpz>B^`hz=&1>5ogV@!*u>3L^A*FXgz*mvWA-^c z)Nz9O0>W5D_weB1u#K#!G=TH(HMbFtQMNxFe=$imO;dLM7hL-Hcav|N|L?>NKIi{O zFck-Ls^(=v2n6C9_rKYfVB7A?!-Xw<=RMZ(R_!o`NEkLOtUhAj@BWSB+kc-YY5aO5 zcBk@I=)W8Ox#<5_fTI7SbkhIhla=o@G7a5BiE-QNF_W)08^~1F(nM66Jqr+Tl$>5f zT3g}=28s!`zlz;Mmu>!Yk7rrk9pK6VLp%j)TY?g!n(6Krg)6+_B8B&qah-(gWO6mf z*#QpoKQZr*54v`dt}Qu`djRYIgmL0nP4}i5<){shyo{XoSEBrn)y$4u2r{w?XF+yi z;fQRxN*#5XBV*#^&2k{O&+H5(1ZA8=n1r9q4~8whk4YnbNae z;X}g!3uHMm=}@MWtTYWo8>9QQAUj7^d`$*F&GxK48?=?$V_SIJBHuQN6EPBa>6?VA zDzB?85lLsPFWPW_!-%DI&C5mVO@Fngh^n;XAuHsSFxZ`Lla?h*Q^^{*O*_Jq;DPWB zagd(-sN!0nDADf9Q8&xW?iScSRL{o(?zfJ&6TNYEumo$HJpPf^ztxoMjjNxbH`hmY zrZs~n0fp+3ia2oK$&l^JsoZLGKh_hJTC>(Zf4Lttt6TADPHN4P^qq$Z1$;4|W9Ayb z-GFCV2-FZ!f*3oY$b6f|$mT3FrdU!7u*;FZcpEtl+l)HihozrS*u*f z;l8LYcoaczSc|!?WlGW@MQtfqG&+g-rTZ<>^6^lJq+n|z3M&mh+GTJ?IaFTpAv0s^ z1l!3c^8v)VZ7=l?o$MOu`9$GSYE~X73PkK zyl+er2T;h0U=n%(d&Ns;|ETrPHipHXhIrlK-!o|I)b~E5(hgVT-c2I&-NIy+Tt;Ve zen0E49kvEI&JVZy(jj=eI0GYft7fNp8F1Uaw+CptG= z;^B8AELM@+5lvFMF3t09y78wglZv`K6Z}I)O24x*;4!GF+$qKWtmE*4F^R`U+`Zo~ zEDK^r+$3qf3+cAJuDb2)ETU_Fp^lE^BTeS*vbIVv2%C);pjI`pi@Fha3G^=*F6i1t zWZHD6e|vcR)8q6}6|gwGtPXvxC6CniZMwiIi%i-~S^6h)YYS|_#@A(4G~7S937}sA zbmWKA^q`E4weisy1%KGC4I{#OM3RggEkEt8>qASR-%gdJR_UK zYvuag0%05WzK)@ss|FA%2a0RTF?s+7bc&8ztM$8eK&-Qf%b(k4K=OEfOhk}EX2vbi znxkvZ_&qh-ZvOSHKXPA`BObm_=G$5LhR%c30G|7)zt*4Q_>r79?|0gk4wAvIq9e8^po~Sv^Z{L2xKv&`KsSvYqm#w{esJcA z)Y;0*?nTTI&%VU|j5W9@+RBQGs~YvPyT!IOzQ>IXOC-75ZPGivQU8s%*T6($9y5Ee zp{!JcAltMLQkY*w{15VT`T9Yzf}bxk;GpPpjF-1JMc;Lwy44xOLbtG-M@d$enW%7l zX%|+1n@TbtJ|#wNcDQ(ar|+4pZp9PVgspw{(S57B6N8wJ=i_3=x+e6IIylkw7zGAR zBdDv|%iRMn_Gvmc+i_|0h$qr-ZK(#`ff2<#4Pdpo#ji`oD(@_{NoePnsZ;GmLXSBI zU}-2y7a%_3FAsj?z;gkHvzE~-3Bqzo_#bwM(;8lQ$oLv>yZs3>s=AskB;}VbICI3Nl>xA&uVmuP7 z%tvGssN8>e@5xI1<#vXR%B$F94!k51zRTT9Vss6_onVRJJ(*_SYRnS+mr=Ubi)A(c zGq4}-*9*13`n;B`8M&O<+i$}u+NV}Xt_{>evPHWE`K%l-0?dfvmedzuw@1YfDQ_CEsq@)F3JU8Lep$ju+FaR zsR|L0#`8<<=Y5|YM&D&IPZb+{L)J4f8E^zgd64WZ#iOKY-YF%mq<(4QjUwPuPS&tX zy{`LQ)T*x1f}Gug#n0Vd_^!9D``j7+L2y>jrM2X6`&VWXo5>W`(qyb81_be8F9sJB zz^s!OOjl z@)fZ2;~{(Y>VdJ~YJb;e+_Ku^1}-Wr>#x8}x@lIOh)Jktf@$#b(bSri?Vz3@!9 zVmAV_!g^ZK93k0tvDfWDTGD{b&g!PBMqE=RM5;8NL-89f^*Om{P_A4-JnKt$bGVN5 zsa<9xXIgV3_8|AFM^VMfR0B2qW&G}(X3>g`)7hD;NXGQ$#@*)%B9N_rnb!Os_=XFl(wTD zj#$nJfvdxdTUDqU%t0RFzo(|vFzA!U{q91!3$!e)r!0^dp#?XcZ`X#K%K3m%eeBW< z8kj_%NuAo;3%*Y*~ce!0aF476tH0Z*2F#rHmfxc_kzFAeUgOgu%IzZ3Y zTy=Cak7jUV41E>9Sil-o3Ll5+q|y(0&JG+DWn6c!_Oo+%j}K7w{YPzTPAX9|+IuGj z7XV(r@)U$mcs!_BJQ=WM zI{iCu#}AzTPOl-R<>cYaD^XU`l{aEK;#wnhgQS5R#yb0Df3;Vdak0R=6s&8#-;?f8ektZK|UBt(6JQE%PylIHX=-o^u5R!U6Ch zV?lO!W=@Lx7m;D>?KWZV;{@jkSkIuINUM4=yP@2-As>$Jq|8`x15<)Z+T#;}>N2y!n4$?D$GeY zh=4Djr@#erPFvP))uakf{_blo&j8ouAipIrd0j0Iiap1Qf2j_KZTGm2%*A{Tke7CLyl2fk+ zt*qprw70Sodw|_~qoeNB&1S<4*i|o7AnRFaGKJO^Sk?S@%5vZ1%q2eBY__?|LA^bQ z@|>#B+n+HZCI%}zUP~tdW%GW3QeZ^9U!iDCs*)H;p55IQGzA53H9tB(1L>OW2zXC5 z*eQnvnt!KFopYTuN_`GW_iq2_?$qaPBGOxB;o;ie3-~hI4V!=S;h05x?$y#$)B1)$ z*>RYlcZIq{y))K)y;1OpWixM!;$pxDK$!>4y*c88&J4TwcE;HKk^6m<{evdRq^eK< z4Xo?pFfT3HhbW7!0XRP*k*R)>p)s-~y^PW#ZJ%6&nWcGFH6$r$LJ;$nZO-;>`#6og z$a4c7qIQa{&&wU+MEo3j>aC0UDY&BXsCu^a-J};uNDdYYrxfl;f{Ui(SNq~lYVciB zQnJ3$jW=-e+N1EbDbo2_1!-QyU$%&ukiCso4Xo8i)v$Z+fx)z^0ns#?4r3Pt_`-(5 z;;2HxA4{Xd;L*sy@K5$YoNPRQ@EPAqs17gJO~hj2ma2>FYRPckaGL(xq@8fBrHC$? zZ81$%9*kO-qtKUq6#W=@Pl+vT^Fq_WpUQUb*MIpl_XAz z^e@F;D{nqW9rm%Qo*v%;w3?I~&@lFpvCsQ%$q%b<2CYotV|B9|ut@DBAL@yn@3++W zbJ7Q^TKMLr)@uY>>cyfjjBsNc3LSkHNpbyfRqi@xwDV-h&G2csm5m;4+d`Ad*LlT# z)glKiRd?4nG!|dJW=a+2U={mwe9DB%oSMd=H{iO>1s#J9H+4XxR^wyR#8ydLOT!Ba z+>zAt4?hIh%Eva!{AP}HpuMkCiRGIvugVoKJeC7dvsrvzk#Z@D@QhVaFW_e%!c?E8 z!xuRWQu%5+Lma?d{XofvfLg7*U9)({YyhMq)EL#vfyU3*Fop zndq2g=R&`%-ZxuT-a_vU4pZja-JU527RkYir_onDOZ0U=Mi12IXiOhWF$f2R(g$4>H5hpKh>RY)u z^U8R?1T^kGfVPi9>U^l(ngBpy%m+%3;+@WHTUd>YOH-z)0!;*OtSoXPI4l4cC_yNxe9cU zk3@=qMD+KA8t1F8i&yqRriHg;;UNFFABozxJW{N-T7WG89HMqZgk9gyDKJHW@&!$% zS&SB{-T-nlZ1|=5Cwh>W7ecozMK&%jbN6sy497ok?&XZiD(=$*!!n5Os_=of4tUUF zRD|2%b`EM>XKo4>g&W&y4glCD?GC@?dj02cXc zz3VmnYkO}&8aBbaELAy}%9ol?@F{}$nk}-siaA~72bo|_S*d%-KPJZQ1}tMp6Jz+`O)>{YFsxg?MlCkEikzIN1UQz)% zFGsS>h91g*PL{~6(oTobi#R*0u>dkvYK=o#RAd6YY4?M+rcEC~X$g3Ew&K;v0@9zh zR{N*tic~mn#Rq>1WoDMUh?fR^mY%Pv8>FI&%0_3V;|}c;*WF~_nw`4Dg$F}JO@QUZ z$Kk8@){hwA_C+LOm!_|m?eEI<0_5TXF2F@Vt7yTe;FA;3i&tHOl;S2sFX*Him2wm4 z@|S*=(oRbUbW)Q7l{W>WtolB;Xy}&SJ_Y^*8vf&4Jrh-xVJbn`?dS2FKVr(&bH&3N zUu4wk^qPmtVDkr||Ll!tM9ZxyRSj+ZxrY;6=N$_CyLYx+MWEhm%^m0+IQ|{TZe8=ITf1V)Ja9_(dHi}%O$k`;JUmj=((Y{3 zV0G;>EgNs_z3AmSXIN-pk|pl>9)-s*N?H2*3Jh&PtHl(T*hiDbIAC(&HXQQy$u?5_GPO$3UH zrLlE-xS-K2lchL~_%ke=@@#X>rz~|!MJyC_cfpxwW zxf$uT387Yz8$8UCw+%MGtf3Yy>iv57yRlhG{-e7omT1(tXzJGVoEvlODgmWR?Yv6s z5=H=7L}24}3_O(#1`0!U0*0ha-&_fp%Yi1H-6D-IPjpKf+72hs;msKI@>4B}*`6J4 zh58FqNxr`~FvpzY%y+g2U%V7_KI~K7A#Z&98Mcc}dUXD9>QTwzd zNy-{*MwEJzdpuoh(8NF7WtGQ=_*i|AhDXa2v3Cq(BOw}^=MBG2L091O>a|A`9Q>&z z8f-^get!ZphwFcLjw#6J@%AE5*0Okig@e|_&y8699{9{{Ai<(rgS|XU@UWwa8R+SH z=UK1o;ER15j1s(1irWznEw>xkgYBnZW_+A+w8XR1j-lgkibX}80Ws;5lUU|w3 zFQpuzxY;HC1LGkpT2U1^@dDjpTI}jppa`mH)nRa=9wMXB zo{Cpp+v-s?c}iM=B^ju)V+w671JP@RfY(ZmEnmCdFx@qwKr6@cc%j4OJM8yYs2g3i zl_L0i019l_7l~4X6*+tT&kju_s_l|^9uBDU0<8K<(3U_=Oy+wD)FGCY6jOo(x_$Ks zX`4vtwmh}1Jy0RIR6YX}z<%DJ+2~Oez07J_kHDLiS;hrCW|TjpvoYY3LYXrb__=$_ zR_syLl4G|dIr~0{e43sbG>krii< zFSyZ}d{KzI!nWivr}x$1{8apr-PhbS#-!!6vpyyEEJr&4-Sjk2uVMmstm(m&Ad^)$ z>L7GxDyk5>81Hgs;N-`k1sHAC%J8 zh1{RY+?>j?(nAd)_tt#?F+bc7DALH44C(!|2iPW9$RF zL|%#@$u>KRds%X!X7AmCOb&_jlX!H;$8Y2IFN0q6-^_aUE*-!grmm8@xPGr-RX_NT zg!wt-EWV3H#R*I3tFvMn$HqPCOufgllc?O`8muQ-Db3%QPCqKfdQ*<*P zrS3IDN)5e`QmBY1(BKBg)K-)C==%VncW1K|re%kdGaguLc4n5s#2M_Wpi2)CR6>hn zYkG>OH&5PPwN)VNaa^(78AiF2KGWHG-u>nnN^6)sGxCBR)iqo{#!3)>`|$K3ZDz8w zC`-Mz>P+f85Eq%DQRl(c+j`VfT<^J1OhR<)#2?)m&C77R_^N1g=BO>2!!aJ;ycyok za93?cQu!g1seBaAz+F~uMxzZ#EmAs^)Bk4=*jg3K94z2oOd*pjA^oe@jMCogl38?mCoM? zk;ba94bQw-_|yt6l!tatpvl)u5<%rRLI;n&-#$Yaz?b6~*zt1Ad=X)Y`ty_Ja=piB zYR*%P_#A5Ph*cak>+Q$~QTpu0Vhwv%XJ%8Ww?UT=+Rl1-lBX~g?Wc5hi*SdvBdMMk z<2p~D!uExqXUTYY10VkcbnymEWNjw6QX{;m!z&O(kaW08{<=+Ew4vsBQ)V*8%+g-SdS+}zz7{mcPiqXtq?GU-<6h}P)+%XkC+xS@M6M+} z0X#|C7%l@~k6&7WvBRZ5Vm^yk!0N|GS|A)`8`^oUs;&GZiQ(3b7ebA_I zw#3>4+UbN=kLe)5wG3JmP*Nl2Xpy&HcCkOkQBb>vwLg4wi^YVr_9{9ac-8Ndx{0K7 z-IPMwn3@z8l}lf6HhwjjrF}02aM#(E?B$RfJ3J|UlBDC$Q%S2-?VeQ5ntxWN=qz)N zR8bS&O2NJ1s4E4t{J9n(z}rPj;4&0Ex%j{f$d&uCs!L03YlgT9YOvtJ5!|b%R$%yz zWD&IR_7wB7-!LZOUYyjeVb|Ff5$ZIQP-|Cuhb>G3x8i^4rYWd`>(+ajdQN-4d^~?T z*l`Fn>*}fzLf)9Qe85jlEkgj8X)aD1tc=G=CbE6MchE*qLd&uz9n$Q|;s0FN{(cu$ z@1kVYMk=JD)43V5R?)5wSu(1 zs(<;>_+@x`zG#@Jz^)PIr(GzqJZ8$gBaxSvFslb%XwT5C>Q^1mrwWK60ZU|B{azEW_{A}6Oy zc#e3~6VmJHS1prb9@PPhCVLIO^3lo4(2T(bE*(kE)S;za}}9LCHy%~52~Lp1uX=0;@K z5ub2;rjgh;*@beE26N$Eok@sYce9gY5$Ms3n z?OUAYHBnrpnjhTg?Tm2s85_mR%FY>_2Bwr}1J3ERZwbS`&+W&UJ-X#EZH?ydPsp(5 zB{Cl}5sI%80^TLGX6M>ROT&aRAQ+oLeXsM`J{^?@Qel;RA#8g0G|%Pto>;f``zje; z?Ti{xT=?q~g}G(rPK2ip+gs;{(!}qxMZ(2DkwvOI*Q_bk+x+IW@<3i0ZEnLJ(GCXN zK#V6XXD07dlj8AvYLEmb?}r!jKPR8%6S$KDYEFdFa1o|DY@~)3RHk;_6HFD;f)jJg zfMQqa2ayRkP5LWu6*zVdID@figU3FMct8e6vr+qGEz=_nxC(*FZ5_`^*rOp+AE?uS zCNbPsI@h^tNP z^Nooj`(DT0NU)Bvkn6sH7^BBhJKqzF&)x!-6p;Kr+`=Kujh@`j(;EYwno36WGK2v74aaps>=*=W&P1 z8E-zJ$utiX;cOSqKVdlSWVNa*Sn&%ULRGbU-_b8)tlCB(zetWG3_9skujzJsw`d9dT7A)$@jJ-2&t0R)5vB zw3h$gm(Em9PRYi6WDV$M0BW8YAq6!_+-Lifq#Q!@$1zoo6cCoZ)m>j+YhX9n*70dU zUh(SPqTAQ~+WBL_ug;B~JS*F%h@M*4`bFiwegTV(6YBVoD^p1d84HA5&sM_zuASPk zY;m7FR}F_4-EW)*%O^`ny%w!tT;&neTTSL!7DVUm2Yh(M5vkq@E5i_oS>N*HU}U9h zC5m@fa*o=5Gumt$J#tm#>$t^X~Ytox(gcz^rj;1|~ulm!MD zM)@alB?|k+-Cw)Wcv&=9AtYEVMWN(t+Y@sU;^ zfbOP_f2K>wdmnA^^7zHunKE2s0_IiVCKc)R!sEr6s6Hl{zFt zmKka!uRiG2V)hJxoSe*jw!+FQxQ~a-d^N&ssU6bE3g^O^7# z_?#!>E(5dA95vyuV%`+*DQ7jwao$__xt~31~KPD@IuprYWp96`?ESKXx1((wl7@8z zF%B$9?SCECMEr;cN@xq=Fn<&+0f?|nuR>?7s?5y4xHQLR>U9HwNm2h+FtV(Pnx z@y}BoPf^u^0;9_xh`P)6!HdYssT?>gTqP-rcEvOzopPyoQf@P>E?1v76q!>bFKeR? zXD%R-5)agCgKT1=-%UJz3IMve$1$lMh5b=;!KPZXnabsN{>V|bHd3jn3jVclgA$$} zsaj@|MZsQZt3pK*;osFJZy`&-9#mt_3MT^dv{4-`XIo9)ew=nM)3y4fZ#W7k5`TmQ zj=mt{QfcX4>Pp>sUM3PYUu1kuyhuLPAZ`*+mSFgggBT)-MROpR87T^JZW|dqjuyBu ze@>A;sjK=*%-|@l6u&U6Qz1)B&wgnvvhr*me?FRJ$)TS3AQcHcR-d>j9!SR<%D9Ri z=f0!qU?_m0GqjOF0esM6NS2_hiW7)ssc>`gZ@6!u?bAIt{j4;9F=yG^1K^6dTqIu0 z+|&uQnTVNltkfM^ z0tCd5fM&Q)a2+4{c8jShTqK|+d((oCG0<;z-js?R{oqia5J9ks178kpla)GsN+UDX zIv)RMqqLIjvqW|eL5E}el4Q@!4#P)04(T=9Tq=(2A-<1RyvvG2Va2pl;*!0zN{L2cyx)KNJAuS$TQ}?X}-c6b8L+7p;-_&8B`z5wAK2bY$PW(VSa(}n~+T{!jRLcl`jGE;@=T2utklFzb0pxLJx z4R+jUh*EgO1ACuL5DizkVXe>5OgNp7XRa19J(C$V#h|al3^O;+tIaXzv3APsbB~_on4Eyc=0DfebewmL+8R*`^%UG$eFP{nhaoM z&ty`z@y0>m2erbr?kd^luP!Z&(7DCmqQ%z9r?fRK<2K($eTE%<>mKqvcBnM_GE)Rd zPwEub^5u$Wf=(v_kw)jFpYl>AX$?=5hvP^4w#`P%Vx{-i4r{6ssXw_u-7=O^ZX`9is}di*||%;6k^}w;hMX#3u#Rw0(2yYa4Lo zEbR_=Z93l)*`9cOa_3Wdgg#e2!w%YcL9;a#|5M<@+(B-yG4p^yYbw8*H2)X*2NfRv z1Po6|OZ*tTdg#T?+`*5la@2x`+@s!9bcXDoSj(G?#`2LkA z%@23w*XoCy!NFP=xa_-U^4l7h`gd)ksh2I=u9sS=%ArO1XzTNSz6$A>g=-BYHoXNf z@!t|tgJSX0%r)Mpbe=Qry}>@2rm?4trRMN&)LM0TYTc-g-m{Q+wkx*o*~e&8T>MF$ zVtAqYjX;0)xzy&x)U9|BxG>JDdW4CIh`4iLqOxm$C~=%;f7-VAM}K!=7#q3jH1fe& zoiiL-Wth;W8qBRYK>lsmb)Ftgq)-p#K&P`A(@wwsH(jM_=>zYwT-CvsEJ4^yDdG9Y zter*jmq=XG6HZY0nvPK^8WFqIp9J=JFYxhp@I`ID8LX4*v%ul-O^rDFfx&OvnQI1f zD9~+y{pgKY{0QJW{wOZ9NZ1`W*ot>$n0Jb7gr^LufW6!Vze0H~(Vb5NMA&x>zrd&dedVem( zD)B>cAXoiSi`*j`?HfH5ZS>?jlP`4rhIH54BC6RZCJtjC4;Ai35|xfM#309S)3xc+ zlHWAIw(|xxkn|H&NukKJf+Ul0R%@)$faC#x%~6NEr$z(8&v&{*kr5*C`VBZ*R`v!K zl*pQA9lpp%lWt|AArNdRr?E&V##OaM({e5TjNfs*?~y`dIAcM!b?>_M8%tW-x;tAf zRM=@j&__8GpqhvHnlTeW+`yC)DstCoefH?|A*>vIh;D!(i2A`iuQf`in9QW_*4WQs z4D!WPj<#8aRH*`=T*s;PI6e5I^ou9jK3@5F$;=rKg&(S{*V3q5B--6l>T6VZp~kav ziWxLDp$kYpp@ZUJ`rx=Lpe_20zw`rXwg^V3&rPWE+D{dOWS62tpfQ}5h984^EfgZa zE($Y6BP#1)Y101W%1$+d{N27NH#yu z8^9XpqpLGQ%WPf<)NuJpoK1T=!f#1bUm2shTQ~go=Yw+X%N!bG_yoD6r!?F1>N4>KJ9cYcRY0Me%s@#5d@ zRR@jQu;b&NygY9p{!$E4@IvYc+x(d>W+^u|A|P}2=S3)lM7|BO9BU)I@RwBKq_U;a z5fYo#w^L>Z{N98(a>C$C9ZrGYLNb<+^I7`^=6%4QF5|kH!4Gv=Us=;)z6;wjF*(}#*j>7l>IgENS?X^ z2L+&Srm6xp>?g}VG9=W5f~Y2%aQ?=&0&%))5k7{tt~+0Yy%V&F{P&aPNIj(puZtQL zIXBsp(Yjvnyj-oU$dazcz{{IKJGEv*;bWQ-T+Xm@`W{SERDVX!yI=w0Nt^|)Cu}gt7 z@^=Oh@EckC!BuW+i=D5>HD-S9b$>O6eF7k8)~$qyu7k$3Tt`WqL~Wtw@!?g ztNce5`0WLrV_tK`MEg9O;#MygU_wET`a@xYkOfFVVZg9Js(_B)(@2<<3vXG`Z}$Wgd|fWnjmGo&U{vpP6e=lX>aaq`fy(fUwG&OE;jixA%nSN=h~Ve3 zCPt3{`Ih$;v;X#8XD+>lG?-~$oUZ%bxWX%34O4(zUr#IBD1*f{&vcKx9%Ej=!?VFF z^iBc51h76l)!_A~?xb)3GHnN1{*$IaaaY{^4cU|p{3Dvh{3*{&2|hJG{tSG6dKP3bY`nZ#$wkNi){ zrw_j#Tk^Zyv0702;B`4o%o2NZLpK zg1CXMZ6&oWN&vsKEUX6sXHAchi6OYH=bsKW5~vNZHaS|gZI~qjG@gRf*OWIB_lwhQ zXb-Dt!jDFqgF`Eu7T3?M@|qzx*sr;XQzb1T+nBT|{!o*WmNDdhNYjUzks!&!xSYFY zO<0!rOhd)S6zfLjTC?JbkzX3lHOrT_9J`C`n~aLGjlkc0GqYG_eoM{6nQjy?+KL=A z0Ye(zAV-zM5c`7~16J&l*?YANFuw2Og-87lg%K(#Y6EHpba3a_yy-zvgvO%C&S_WI z^4(1?su!Ek=8V)TTFh@SyPs950C{J&8Z#1u4KvT`vyE|cmXwmm2cHBnw;1dNwTg5T zx7Ywdz%;g}!LN?bs=}gIf~mjhA6fl$bj+Ndq*m0o%}j$w3FsC|k2M@q8u7N>ow7@{ zj2n)~;QK$g7wymG-pK7mtuB~-W)5DCdvLpS{b84&4)p_V>E9WtrCSS8$pVVl(8P% zy`YiR5;czmb`3@~4eeh;1+rT~WD8sjRhRBNS*W$c$mqqq!Az%G*Dg092vU~x71lkY z<#S_(&Rn0L`>T5D0bI!B(Fg2d6sSA$gD@E40~R=vL^~*R_*WH))6DAkLY4qk{iq1Y z1tYF$WB%WHfX&geMt}wj%g~Uy;jAF6En@s_qU>;GGq3y@WVdIy{&4&^6o5<9OuxnV z?@&NO95eeX0r0K>z1CXsxz@A-FQmd?yWN1D zXWgJwu%x9!W5T@P<8@zP4=>f7yD=cLY@h?COV1-JqRw3X26Vd zn72i01z$8XCvqR-z{=7Dfc5Rq546MfCJ+loQ9NOdtV)ER%4B|vgOds^2|Lc=eq3xW z#a1OX*M>v*Qb8rsF0Z!i8MEnaIY&E2bz|gK+a+^VtL$Y{f9^L^f#p*bF z>8u0g2W%Ti?ctJQ3%@cZiF)1e(wvq}O6zLF7tX%p(ni&srRym(_j#}3x;$iMqRZwm zmr~>^rX8i5rGtJX!DjAa1Nv8y_2|5GtR@Mzi`S=KxWQ(Mzp<^NhQ>T6p_`HeO-6M-k2uN1x{qkI6bo%JlZcmQx8`JwV>i?J=cGZ-A52g z@()$H@t3`K8A0i&1}#QHWL3X2pxa<&fu4Zt9iqU#w!W$ z=D+63)jv+LV@{m#<2E)Qv^S$tuV2*Ux!sDBkl&GnPwx{jZ5He+R-l#BOnLkxPFO;w zABdxoXPK#-m0^CC?)>e&TCd_i@DC}aff>!N>Hw+b(?eAPihHr&R?BF#sRsj|$fHdA@zKq%c3auFu z&om=`s;=LAm6H?~Fvuv2qNMR6?iXKMZoGsWN^!}uLa$KN*S8f<+P<@M&uZE)o=${b zq<^RCOT@--%`fAi_u17KSUfh$F!L%TB`!NjbZI>O$mg4OVK&8`!B;x; zyBVTCP?VmZr=L*?o@Ba_l&F#28nU0obuFo3S#vD?U97ZLSB(ziVz(_OP{p>VKGR2Q zn|uKAM?0sc(#04sSvsZwu&OCeDP&Y@zc(DGn(x`iM}^Za)ax+`y$DTY80`!-0w(*} z9ZY%N7fLg;aLkp>PzJedH`g$ikij2|B179FcbnqR-)4HaWFs$uoR1Tfu66R5+myhO zhwjd4NLjCX4wTnCZw4;pY!k?qamt{+odg%2g+Jf03+R2XH5b=F}i@T6`w z>}mJF_qLvlsBDy_q$_VVdpnGDb?7<9q<+(1!>e=!h~Z-(9C{g`HLy$jQ=o$6y6!3c zJQ4T}KIVldxcd*{4h7z0_(6F|8mJs1-!WWLt3UU zbLQ49V?wGjCpx(smm?dt6Wj>>yh<yYHQ{|;92p`xo zw86Gt24UVLU7k1c7hHAU>@R7|z>=+uYr5RoS0`0Ir@@wLf?W=Mo?iUpWG&CN;nV{j zty>C?A`=+TPRbjT)CwazWb7n3wis;nK0~2>{nLl-w8}p2()0csfhd!8x6b%2?fhkF z?A$+`f3VB^BW43wj{px-vmDY_aV?H=xnM9ny%#l0#jmV}77}5mhE|H^(LleSe`GSO zDKAjwa8z3HnbZ1b+}L#7`*`6r#<;^`j+-Qc`Oo@bZ z$}=QxH&0zqr%3l=Lh$15wa8hHUlQ(#-UN(}n*JvU@Nv<$4uw)0U z0FNUM5!us4l?rGe3Zkt1oi(9!FP4Y#Gy>6K;NUKCdA1h~@2$w54EMi2D~*$JNm*-Y z!VHaeHAz|)dcl&l4JdYC#6)*X{+k-tGJ4erA4AIhg4=wVxIg>fFVcPs2u)c;x;vbe z|0S2HRT0?#fILaSwSf-7 zdRu=9ZINmSq5ahOm<8A4*6P>TPh_tyHOn64b#M;VL);6k==p(nv<3r>sIrJUQO$t`VE6vae9iy@{Tj@_LbxSe}ipq<=Lc+QT8WAekA7~ z#ZtVE>5@tmp3tPD1nmW69MNm{)G^^M_}M5sdEqZryfV2S3${v45IM1-aXk_i=@n0& zRmfyg0xxgqz)~VS*C{Syds$k4c}(R?uYsoJ$&yCV*>_|iTLd;_G*`W{hG9g%`tT9m zXW=J(MSlW?Tx9nRow*UzP)JfACwckZm`I(BGVYlh-1=?mhh(9I7V2nupes7W?5sg! zb6+(*dz>rn%2=vd_q+78()#Q7;r-UsB(i`Fiu%;QvbjT5p0=0BgYd$>D6#GB0&C}uGm}=_YmiB~)13soObkZU zI3ylI32c$w9Dzhp4NxH3^@68ceQfm+9X9Q;1wcdCJC8+GraAY z4E@6+@PVYME2JNNGXfg=--Px3Fs;wsJu2I;N6z4!-2&QldTbz&Ju=I zynxvej_2U5`LpnY5Z$BdpN<7m(ba`;ub|K6YY}G);U~p#7Yf^kd;C>&IHdlIh9O^` z2__TT4&IztW)LCKCYjBLbv)E#H}e+B;mX( zp}bNzx|mVp>u|gO)3F6*ae^#$Fl`{%t1Sfbu7C(MvO9`TaTZb*4cUaon;B`XH399q zyl+5Q-hUuw-xa7mPd&iQ(Q|6NCL#ebf#XC1E>xJ%1(zhRam2|m7%D37! z1@8)=R}V9|({7>MU7r$U$4KlnhF8;sHii^9&t{b%dQ5n#ERK(CtN87|qTQrk%a`PQ z7{33k?C1aVg3*{4(dZ2q?qgaqtQiI(kmnC0NjPt}-FhP$`}|q-&UK-&=e;g~a~)r; z2xf%HQLMB!h?`fCWw47kLuG{%H^XDFn&k4!VOP9?2j77Zq+sz?J_b2wg^m1w0@J-| zv8D+Q4S!x7upxD)AE+hJ@V|QSd#6Iw&828Z79K-k5U|B3bNg;1_&h zkF(1++DKVqeN4AM<2UL)=knu=d4m|+hxUyR6()(}TXA}B+PG0YMtr&_iHUcY%i9`i zM*A9$JALf3Y&O)|D@!B=7tAi6;?*T+YoeNd`X82C`d!kr+ZthqK$PFEbn}a0%0gy; zC=@T_cs~u*U5Q%U9`qsh{fB6NpFn)i`j=={cSY{2mX;LYXs=cb_ren_jLUYAyy~#w z_e#{m*rJbUzcj#sCVQ(Tyfcf{%W!GR2LY9x5Vp-iau#hqyGl_snpy1s0NIgxs;_fm z3T_!+ZuzsPeBF=;OIEYenxxbt}WkF9|x5%rmINi_m_?n`@~P zV*)xLaXEK(wos*PJVCoc1*VmK8LDv%)M3Brxaj4KU;U`-HDtY4jW%nMj63B2Kj3Ju z;SnapW)^R!7LL1@zIV4Z_1vqj^ubXiG2+<#h!fF4aKkGAz$tE$|MFQ#vO9|KQK>QS zwZ#k{L7xlpThp7}ISBBc9n@I@yMWhw5bCL(?l}j<}M%lT*a0Z{JV3j!#$yy=U4v-$})P4QMJEGz#X0o_5#Ki@9A^| zclVM=R6dx?`ERe%%&A1l$K0pQ4<38ILrFr~)>Yi4Nh<+chnoqz9p#=@u2E7u{;=V< zU5wJ*s1LEQlh?iWW}vmogJgZ)A8QMf-CWU=>S^>x6%G{CEb0z}gnBqr9Jtj>P^~YJ zt*p)G-yL$kb?;GLlt|~cZ+`1|Ny}(>ds38-v)b(XZJug|t2zHN5y0qvoFq1keXoWz z5dt2#I+(hhd&XEz*zQ>MIJZLDRK{t+9xHR@T7@*q==?9zIF!x!zewX1&4-kRl<{zq zC`ubybuXsQ@sA==7|R1d62487&-ePb`t%rTbj8V2Tfy{EN#=) zmccSU#R&(S-C1i>-i=pxV_6z~zgrWyoGcL#CZh_?1D-QUaDB;?P0?C*?< zES5ssxR}WM9+G(kEFX8$oSe>VFqF6&0AM8)IXR}&MeRc%{|puyUceJG5ue}QF?Uc? zU&!El&K=pN%LV&`%Yw!B34Ooa!D_Jcz7Jw$$rj35Z5+8xp#XL|bU4WY#r7bnVQL_l1d!`fjt=pRuT%acz&+4v7}(;q5i!3>HKaee2D&P;n^mkteer6uRw~O%De|i z?LWRx&p&PkZSYQr$sqF!l6sLSqy}euF*e==1Uof1UB@;RQ5i-6)3R_RnZl2VD3SW0 z9X%v7e-;waDXV}rrY`6Cy<{~#&2HG0{r!*_$u_JKSa`ROB!S(Pad{MKMp3WhH&G%d z&qCa#cO`Nw}w2WDMUq0tEkZ~`Ml=OG%HkBLGXmh$97oSi{#ya5eqGXgQ7 z+_1Gfd47XUubUIY3=M)KIuH8dsFxMOH(;UXCEuf}@375I9B(j@@xfX&4l9D;E7CvT zYxt$1iStK!Qf|``Ke=a8+dvQJnEKd6>3;xhm$bg}tISx%#2y?LD1Qu4S}-=|tj`Gt z6a@tPPFvO=BK_hDpV&iF;$mEbI9`q(7;hBcNjAKL_d}el%VjjT)j97jSd`_lBL8kR zNA)>AQoP_4&n$Dys{RyLy`%fH$FzeK__z7!n3gBn-H%>O)t~ZwETzc_iA& zLKLA-vpTC7Hmg?7d~5J}M=i(m9u^e65wYJK432u_4h_v$c(u>0$$ZWRP=$Nm`?BeA zvFAd_f}<+)o*j<6^Ae;kZQw<^I)5WdT8}4|m?+>@1C}nk23-6lWd6}#D!>!FK>TL= zL}qc zajwv^K$K%&Fk1|2^y|M8N(8E*1lq`@aKW ziVP$(nU`Hb@l-;njcS;GX}7}&wJiQsq6^xwh%p*~<3TeF;Bg&(uu!rDJw_Q_?wSMJ zQlURNHwaZ$4jUqcxa-yFfeX+(KjU_8&%^au6Vv-&3gd7%n`D zXgz5Gw^Y6(8PcVgwtc6ebqYG9FQ~3a@nIlqq5L( z*jsGox~~^&>6N3e111wCez-jPF{D<7)i3S0eA!s4?*+}O`J=^pCH*SsuZ>bKM3K14 zTCNC9%V=Wu0kO=2-L-Mqs=RBI_Zw{LCG##l$7PyL>`fv>(f{%@PyKiIXZNg=-KX!d zR-nWMf$hrlQ|0EPf86KcCSs0oP5`Xv-Gz1CR!RPyS0;KP7QOKp{y8B{ zPG6zg!&TX*VUjVLtx3V%2ytJCB*^m|{gswGOI1nwN zi8ydho{_#FX4vFnusxnT@MRz#P${FssbC&^492@pqG-7&T#f~2ipS5!B(E6|8wPw} zG?Q(PMq*NK>8|i#YElh7{QW60A=;W989ZO?;VM~Nz76@7BM!1p#sQ`qoI%OZnFEVA z8$S=|pLt3>r_;_KKD)e%TGhM(o zVhDNPwVm0FkC!=dcXL3ESwT?2j~Sne#$D=_ysy$fRqx!nWt|dY(rBy!C#K*2Qnma$ z3#XCxWEhH=J%t3?`^Gs(WWo<~(pm?YJPaIG5%^1HH?O94)a#zQpc_6ks_Sd><*vFA zeU(Tu$pKgTB3Sof&(0n^*O^vgj0^>IK9%okGa!?i_a(V+yvux>(fq%( z=tY(SpHX$IBzu8$M>c1^Rm;e%0$O0OsYLfw)(atirS2}cRPgt`r zh2{)`=Df4apbCk{2*=iVRV}UFSIsow{rSPS|8&?FvtbLbrM({wfir<`WRkq>&t`di zNzp~xSJ!#pR!y9O+_5lun{pi8xt04i^pXu9rGtT7$Ta9*uqbj|rfPS1!nVVP0g&8d-I%tLD#L|oh?w|eL_iz(#25sXyM8B5 zRPVh|#LgEU|B*R8YezGU^O+0I;0d^P&y_F_&9tvXK7OIPR8BAAB+mvY>vdiI0JHNc z&rH5xxKLGjtkJP&7+0rz5poU`T|V%{ogudZypzr(3+f8wq$yYAw6 zh@EtX@TV*t`jZ$4<~~TA-OOA5ry(f4FHu&G{qo)_Y&#@^!-xZk;L{0Cik zTusdWhJXUu1Z|I{(i^ze`fv#CcpwrFem`LWX*OS3-(TH|D%!Te%X&bw)&kPRDC|G@ z?n|o|$Z|&9G1^+--Rz3^oO=gZ{-{S21IKWqMStoZ8Z2Y-ZDa0w=;0)DhSLrEXC^9W zP6*`aTYnmS_rOEf?0C%?)~()UJ&sV-opkwPbowHc+?^!c`IQnU zI;d-G@pY0Jed6LC`EhsxKmzdl<(rS>$_2~UZiwZi}gGF#*fbl-!kK?;HhabJP z-n{u$8kI4REcpCFDg9`c;_YY#ph;}P&8~37G`>rL66o;*ZGNN}SpzB@#F|;8CzDTZD>w;*g)pRe$~x7czAuhE`qf9{LV+G^jZ9rYv}x4Ks`{ zQPDD|nxDh!-5b8;EX;IiN`ymXlUAGc<>D+@R2&|g1Va&RNyd+n$0Pjr0n};1^1T~* z?aKI->^5x5O+W$Z$m3Im*saU>s*uloMp>&R2WHowPsXPDOXc801j0uq1|8{{^+?N| z`94hDCB9!^c<8SszpwZ@zz{I-EaA%x403J@8}^L%{J=0-UA-(u0y6A()O`abJAWlF z5IWH>U`R#(!hT#aaZ;H}EL)Jqtlxl@em|w;M)cv$m#9W28HG0Fm=~65nl~( z|Km5P!^^SsH@h@TkV~e+N-u0(Ny1ob)B#Cd_2#ykRnSz zb`?0Pdla9xv${0l^n}!fXPPY3Rhiev$%N+g8Sv|^MC8|y1r^MP-f}ui&K7zlSD5aJ zX>=i=hqr`ZED4_EZC$o^+hXv9AfT4Qbh-_gHci`)Mmp8qVL1j7}C{?C9+A?;N@<9|o_Lr=!2|2rB( z-r1!1?`YHG`r+08j=ZF<`Cs|(sC9v%cYsh@RaMn5_1~3b(_ermLj3V4h^m z4+nprzRGkneO=KD=VnMW{6=s07n)BzFROQN|5%dUclbX^w}-# zz`3`4Am{zS19pj2_UmBoNKK$Fu#WFoL@ULnx@qyDT(@J*DV?Ir2r;}&jr*sG%^_x| zK9iq)%Xkm+6+&h7yz(J&w*&7zDN200JvT>7>gKnfzk>e3`n;(^y@6^ucJh6$e3y!c zNs=j(s7)c1|JLMRLCY{dsqN<5lPArpmaTuMYa{D^j<_s`?Q%fKNw-uYOU318T zTWKv@qQ^?*S6`o+QJn2J$=7VJHw`pC$8c)tS?L%^;K%#Lb5+oTI(vRd)cV&hLmcZ@ zheH;&`&zKERfxmjg|tdI_1nzLWLi^NEu*wJ6-6cqHP4WWW&cmK$$btN%84RE>!_gz zIcJd-dZ+`{uf2~77n(U#DzfUud;;TXeWuQJzpUhq=&c`Ti|m(QGj~i$X7-h>hF#d7fRhwq*|T_x@7&5bWBKT~=O` zJGyum^ZUwtA9}79!r{^+G*-y+k7A{*}R3RtUUq9+#pMMtRG<7unqxP&H{jG5`4sa3gNd{?(F=H?^-b~II z*P_Z&-9Xk27tDzP2}?b&54N$8d(NIEzj~)P7uMN&XBYY;Y*&Y4?ft)1!5H0EcVtKF z{utdxip~rur3MM6y|N};!(q5>GouG6bf5h(572-GI>!nOC>gMF&%%T;=67+*&qk&v z#mpjM&*AZ^L2(1UP=GBm>i&t8d3FN>T#1W2OWjt+RKlocme48y%S)!t#0Q2_ybj{s zj*5Dc`o_jYBFlzvfPx|2YtR3+Iyn`!Y;xXRR?74c4cO8CBQtX?zP$0$(9wobzqv22 zAc?l$_ud0Mch(^Wxk*hQKo&yH(+PNQV{iiK!>QC4hn73il%yNPijy|Zl>wRyqCXM4 zDK?Pa9j2Fi61aMbR4`IT5tRD#7lJJ*E(M+lg%Fp>ME5%m;Fkcl`i$2>Ba`YK-_w5D zznwfZ{dll) z%!`^vXM1-zAa+FiBnp2zSg-^6ZJ&2~rj>Q^KQ|$p(O+z>;Q*&H=7ZOsD6Ubf`&T*@ z)H?Lz?&+`Pz-^bPmF9k^tD<~D6t?o2-ZAP8-_E$6oSWRW<~kTYl4N3&X0P`3U<<9Jk!eX;w?_uYSc4m{ZM!d0spc>N_zBK1R))GNH|Y?7%Cyi8cty%*el>%0kRH1}V=J#z9Td4~J&;n_c@C z(@WeJJnyv5B|RSoM+Rtr9w{B9llvg&XFTGW@i-9M2YZjpS7i+HYK3%ixS||W-pyzuvEJ>wOiRpsN#}@r8-$H8xJk4 zvx=)Rq7L2}8K*w|bAoBa85K-w)k_g&^w_g|h$^T&F-H~bmNDw7Ie+8zvKt-Tx959O~<&PLq5 zxeB5mtF|oWA&y^Jayb9yCHTRaEy{s{}4YRG8p{6{X=qL#C04Kd2A0x@^@JR) z)wD7kT!f{ZEsN2x<@oimJ*6Te8*6Q(Ika7+mj$R%E$!&#oz6FB-G<62b;%%eDqxK( zt=i!+dGO9&?nS*;JviaCx?3zjMev2BF{uZ9o+HfxJvvo}Cg0|ABv`Kco%T#B1Ve61F|ZmGUq;z=!;;zA5`awtx& zH;H75K`34Plv20$vGi#mCR73`Z+3<|Y%eNqGom*zv)6^(8tY|%ojkan^A%9HgqogY zDgw;zzHxhW6w6x9w%a>L#}e*lC{i6OE)gH$3QD zq?Lm5ZY5RsX>?;NB;)g8VwylVcA@jUoZjQej9V0!Qg5i_D=dyPVnG8fu6;HN14Shl z`pa424$*MhE!2TGxub;~Kbl8e`@u#J!*fCev2KnHg$H>Psw!w6V%_XFI$UMVTw}0l6o$1 zTL0=|h*e`Bu!23$@%-YW38LJwRh#46(G1U`<9b_T|Jlo3$#Dk#nI8NZ0GW3;h@xW| zP{u0+1iFQ)sNTdi$U-ZV0iFOfZuq+9rSnGxipJ{cV*%0T(kP_ny5zo>=Q%f;l*lOK z^@FaGDg+3q> zX~~kP;kZeBux_kWjrE&rlhC3%L7gr=D*1>MI?9Z0c^IQPT~XMnE3Q1<7#=fNIOT(Y zYgx=Ivk_7rW2X@fwr-?S7C_1R#FUnhh*iCb`T;UeK3Z{MVZ_{EnW(Kd?Uu0Lr-4aM zi88q>3x91-nD=dmezb_|G2Bb@%U#0SP}3qg0&?xJ9p3kWp5g?jqM}MyJ&T?NJAO`6rDJ|j zCydb964#5NqNvceodyg@jZWMJ$=W1E5WsKcC*I;Gp}oRtVO#x%v%kX)ZRfk=F7tQA zld=S4Q}fhEghy2a2&jV_5}w7$BP9bc^JOF1Dc<`!x%zyT5b!&#T$|v-L2e||LVAaC z?(DbBjuxng2B|jI(2zLmMu}W>^}!Xo9^5YgV~SL2TJ0=nTPBqT)SMoWWD~_`0V^0n zIX=8D43E!g89mLoY^e9j1<7!X6x$Cu2TZ}`%Bs{Z7$Igt4`g#rNV3+rThHN0<9$_B ziBDWQLH~`39d3%KdbY?P&(8v6=b1O^&`OE{1y|wUK*Xr~B|J6RdV8w_jr{Y@vzSzj z19jd|u{}yT#CiRwZwWZS64`N%C^twR=lZJufh-_(8YqK-(V3f0hfFZZM^`IZvAGa` zRP_kp}0sc*-?;FKybxCTIOzvKq*p z`?I>ZB|@qbLgHU#fBr$dG7;qCnjDa7I@AZhcC@=Rb99p`ai#^C*qh{%%3BIpj&0x0 za<|Y|r=$HnfFn9eW~870wyFh><*DE*w!O+B=ZE*D{fXJ6Yf>5s4%X)bmNeCF$;YJT zyat3GzlFZH6imS%fT@6xRID@OAY0@t0V=dd9GxW9^SKq}KtQ{Hp?H1HFW)@b^U{Ep zdboa;f>~QTD0B1JB1igMAyc>AB7t!-3U=8MV&dzFV1QKi*~~i_oGO&St4gR^_I+Gp zn`4gZI&3QB$5I{i3}niJ-<5Tp2wbMa5eM%xr;!aInDnlu$+rMcHi1TTBWu&l=6h!r zUUf_^+wiOLJVu0P-7h(THOPHyp={1V+zGfD8QLNI^veescKB*2p z|5s4J@1g30*6^02ETkRi63rO0hSm?}0lGOCtsqv>0x_CD`_%alGyHcn(`u*Jr~72j zLFc=~QvFLL$*+#ClMnGJs6Jdl;pnw}lX8whla6wwSh{C=7>RQ8b78#}AJ+Wo40k&x zj4gN5oR$U9g>%)~b!jAJTEO(-H0kV2Sh~=$QLY<2sX}j$tAC{A*L!IMitPJnOnSgH z*E8I_&}Tnpx;78}9FbTquSS~cH@`Gtwl!&~)UigDjZ3`1gP z1|=o%-XVjGpDm5uXog;<8g0sIGkI&J{CZHFYyd$b)1{w@!oLw`FZN@KLQ0eS)qMwJ?Y1ohVa;f! z4^Tw;_0Z7xZ+R>2hl3P6OXl|EI-RUb^ibUi)b!ZcE2LAr|IGX}z;c;2vr;gmP)@4Y z6(Vw3>D>?^MR?qvXx}y!!V#;=AF_6Mbza?WkB zJR!GbJyK8IN^JTCZ6#B-k>cM?>N<%D&O}L(Zks$}p3+~u$ET<_V7t0#&094K#qF-j z+C3L3Hr3c}0E#)*bUqO8+md29H2})&%lDhKjI>)y;8Gy$zfx?d=l2b!opN?*-MxDy z9D!pzow(C*RG#6WaT~}$GdScl1dd&5PdS^>I!!+Ps@x@rjM74SiVp^9;`=nd`&@0$ zG>Dc#xJn|HZDqWJIn;(teV|ii>9tBoycl0CnQ0&)t-q~9G zs>h^f$;W638A40%p5?ctztoc)`DaFk7W0N|1f=Px0+wl^^@(adThtk^l>JWmseQ7D z+lv8T#UQXZ5%wCV-M7)yUMg45oKGz~L<&hHnQEn6UP};V^Gs^)DYH2yg4(j9-j2rS zJ#xE)-*vx-y*4p;pUPp>q?9G7gz&6=s;u4KW9*L-w~3dwjRcFw*f$ZzQvIIM=tRl$ z?NN!_ruGUZx>oXHztv@r>+=ea11g%Eo7>CAeZTHLpgCj!?r`)y1V|lkZ{JVKdBi8UWko(Z+VjG_Jqf_9sJ%Y`x~+6Qkwd(ZsfX|{3Bs25?qaL% z*nAQ5u!>y8gL^sg9r6kixtkl3{(KW-8XLY-EerL7Y&TqrT;_Q%5zkv5`u@==Y{7`iVLe}Q1JM#kISo@>abwI3*jrdM zIrtU;W@X_B_Xzmxu|X%FOVwkZ%{4-iX@+{HG1puHD3~Y(><2or7LN-RB|l*Xaj2T6 zH>8vxGyUmH=SCx-+!z}~!z1sc`R@L)!?fWNbu7Zt)Y!7{S6|Zv`NVFx!@`m_d6RqQ zC2$BJf{DLH0k}WP_G9dXdt}=`C_G1bDG6r-6WhBT+&rKhbf5drhnZdR?2suC&ZB6r48n6gQ&i&6NfrBtbEkhkAb-VqlPp;A7&naxRuJg7)|QeNh~}0GB88 z*|KgxR^czHCG8-$bZ3uXHGlhKGYRjb-D{z)&53Us*Lgg~i)2-PBl$-mk?^YZmcIrE zmK)!*Y+V~WhG!<4C;NopDy$xCm9P@qx*RWF5IoTSQ*$fl@S%e)oXdVSHY$wP@R-Mc z>Cw7)TzqlFM~&QLk|l@o3hggh;!oR9!+E?BZxLs^*h%a>bK!}Hi5X)5B3{SNSZ0K=UnFLD z-EWx>B~##IDIiNHC9ha9m^XzxUBtg7lvm^&@-Ad>HE+`8GI1YYY@d#?pGJCgh?A_m z62AM>QygQPg>WvbamzPuF24Dp<++OBKMP-)v8;niY9~++_N!EITm@{MWtP;copi|` zWH;>za|#6d%&x)9$+{IOndo>TD0$4-30YlEvn)jB+GTz?bDD z4uZJ&j#FtSSDGuC3908c0p8svqMPYOQ*v`9>)48U|5}cWg4f@j?SFj6j~{Jcv$y(H z8+UYGEq$)p=U2o$E}ReZ?bDXJJt`z2=bBP5GqGTKn^q1V+C`%)3W zQKG6-*2U9Hfo_@SB5yRzng<@{EMY{96N0G{_4JsJL-9h)&Rk9qQv)8b{c~NVd*NtyXzT}HQ9}3?6c>1>oLrX&X;`M zXt&=_9l6tGCZ$oMQ>mR)a58-T z(pSxQ*?e(IQlm#MC_cfVi4t__n!Q2TqQ0#6TGl&nz(%K{i+b=}5ZtLM>=E)?yCxag z<)P|pMg52RR1=i9Ow+t)oW`gecMCIvQm=%7^FwHxkmE}Nm+W4XrjxD3jkw7G`>?cn zQl(5Fh*w#4T7KvG{WC^Hw4l6jhAKFwOcvUpiv_M5N%~UT0DpM50;b-KI;ml__4>jb zzOQyv%e|66*i8$rD#(SuUPAQ+T19X0?M6AuBl+6;g3((^MVr2KgK6BcPpC&9Qkp{j zHcRYn7Un8Q*pf@rTezePBb&_jm*MZMBvY`w6*zKH$B!D6ie;k6Z87Lw@IR74zKSL| zNj_V1Uw!!Cu7`}vw097TOLGurs>J0u0m#Bad&sp`(3^4uq>AKzno)Jq``}&uW@8d6 zz@1Y)jNOiu12_UR)!@lWXdr1Yx4~y;&HAKTpvz9xVmGoPLMh|==a|dk^Y7(_wO3Td zA1Ad)zvMvivGz}XJ0c77Wf6PA_S(=zpoVo&XWPiVmxbQX`0kzROz3vXkT)kUgKKt( z2Dz!qGu0cIsC02%@$2g$nm9|UmQIsmBw~AdmYqjhz;DcHPZO6ac5I~5gQ`1N>k z$jPU?W83w_X+1V)DYaP7gZC@?4?<6K2wYRIKne4F^m7{>gKUM}1R=t{JGX$4|wK1x-m^1ViryFcy7GSO~ zih@IbT8m3BvN={Ae+z$E=I8d9uHZ%hz-3unLl3^140^Ks<2FBbI8poX;Vx{VyfN<7 zxk#LqVMh6s{vQ3gDQqwGxATJogqNjq+nm3}@)a5W50kMg$1}aLm2oW@4ktm)6Fyu* z!+NjTpdD<5glNPbV`yV_A;zgl5c7czRKM+)Z*;!(k^_2mfzuA3_WFvm$cD9N@`?Cs zdE`xD%ZME2g07B^R&C$qa(kmXa=KmVJW3|VI>*a4f zLC=v8_=9Mzn5a%}d1~X-T$|-3z#EiEk_KM~4)^gW!asb(;MK zB$z2XnvUggf|y}272r)yQ;i9($GGg)o@59ei**Wq4#3;>#2ilefZVhDp)3fYkVDML zerLSXinmU8nL{%v=5F}6ymEF$^37LO4U5I=iT85Kgl4RKi7OgRe{Bm|4TdtjSM>( z9$cgs_Y4UlQ>`-0aBAlqUq&VY=eqzUX4?VtN`KVDZt)?RmO7NB)-R*mi}F+ zf@=1)|M81{zM4CH7f)Zj8W&QrKknjHt5L@mz4B@0*(*x(ea9~5@9~ACs~-VGOdfL6 z(R1<;nSHe zyTPIumwi;P(VCMNr(D3aRMHnN6(-hc#3$ecjkHsoSr)E`DWg0*=wLYy@FJzW> zgE~ixZ+jO3ddvjFSHv$$dU|a*^rlCXCG)%?>f3{F4;QY8bjm9ZVNZCw(7!ThF=9Wg z%}6B#GkXx|BFmeLLkA*QBl3<69!(kFB$sw@499N4>B=Jkc@4dtNR=BW&yLT6?LH~j zI62g|9-3&ivp-o*8*{BGt-*d{u(ryHXff&EPdHU4^~-qNqofGBSMXO;vL&_wP-EYS zF*C53C&dEpkMAo$KygrEnPJ_-wBG6OXE{NX#~1b}M8KyQ%`?@H((J*Jo_1e0hFqZ? z`*_yu#{joGkH{Y$&#4 zIko6UguC-TmejQLAMMKGwZeE0AF>&DGz284?4B`qywF1_dQe0L3nN~0_nMzd&BNcS zi8<3Qeh5HwrnN6g)7sg?Nx7mW9tel0q^*PO+LO4hSFDE`Dt!ZG=jIsQZ-wF$&wXUZ zKa$N}ywWo4`;bVRmw&y7iJ~=kC^*#4JyY7_Q>iPB?%&f}QbVjiCQGRlJ!oPkh)%0r zNvqVPz8{T|MlP)mI&Ec+R7ahz0c|0)y*-@|mvSwtMeP}Y*YwvrebRj}d`niG2kL8z zt;n&Ckrd9NL(JZO7Hoc$%g*7*KL@{vgj{NmNQTlb&_)J}in&)T$st7PiR@M2CnP_j z(>Gj}8GbH?^Tf=*l;u~IlXvNCVY8w^pAprG;>vw;s+Fh+xJ4Tu+h2|;&^v1*Q_@Rc zVyXFsTNyd3NbJF_Nm#@|IIISubsSFW3$pQw^`=0XgW^(FJMn$8rm3doq9Z$+7a$-g zG@gAxEpDk|F~+Jht9-h-Tk@zQ#hHk_03TD&_@HNVZsu+`Rl<}Q^&Cvzy3E5#|;Xa+)N{vGxP|0 z)?J^$yTn%UcJM^unfXyM%HLe<9X-^TW21Se=d)IK01bKKBs4!AZy#3$=-~@$602CGcLbKoUof?83}HZ*{jJK@UWBgH7zx^DCDt)6|fVF1;*W z;gY0`&W}IsRmh`4V5rkAux_%h<&UJZH|Xw4)98ujwZ6;Xqt%c%94Iax`@=hecR!s! z)g%{Zi?{uw(L{HU3xTWHuWS6-%gw5&WW9;eVbf_~0Cl2R+8)8bh0C?rUq}`W%4tp7 z)g7F`8nE%Q;lAheClwcD3wujbLN}A0WL<+D94X2~hqnJN9YnNOVI>B^=_i0_NLz7uw6Tb7Mq)3X~l#xk&q?z zAwGJw$TY~MsdPd`Wf#+Z@?WRlEV9LkO-)7w&~@zBooR3Prby10Uvy3Xu7Kme7%c0G z6X<9J&!+Mzoes>Z57!Q2=v@i@T{4MsX4FD>aK3AgtHkaH-O7=?5#X&S57`HspoF%*UMhpuc|pRrr*3+AqYPCmlRH zV!piv*DMC<4|+V42lbo&PLt@gq_d^Rb6$YU;qzZq@{$(o((~q2Q(pZ_u2O7LqUvwE z`RsnL6F$+7MN_x27;biXTZc~d?7?ClcvJ_rUUO5p!@3K$B} zo|z<32FA2wC(Un7N7i}L)b|y4#AwVOH5`JK@;b|X@_GZEzd-BcVuHcxr<7rY*6u;D zvKwsjWFNeJ=_skGZ@IEO03GcUuZfyZQ&waO^89q0s2+HQdxGy}myq(-F9pKBiPmX< zH5Vxr>6u=7X$1b%vV1R4-J_!p45lv~|LoEbgm|p^FuH(g9BlFj?o34Y+n%{mS_^2t zCg`^Pu75EM+z>}v3JrG%QJpbaQchcr$&R908}0zA89xgO0E;IK&TCi+rdz+SFCAG_ z-=8Ws)QGdK8FM~l&GkV-Ac_`s-*I%Ppx6WMW4jaZpN4426diBmLNXSV{A{CJYuhWh zTo*sfrF;R2VO>I~2dUxRxTBzd3k!U3+x1M|XR-2)u2LTguFMHL$_4okTnKd%4_+_G zyG8%L{~4{32)FQ9`nUs+Ha%7mxDY8G_HGv6HMeP-8<9YiqqBO^UyHj0cy!^m_F>0q zkCs6LZ;OIW>PMlO>1Gr|5$<@aA(^*>;MJNIp_FI1S7$CjX74S>)BZ|lyEaOvakgOM z6V&!V{U1)5HPul+S=_^a)BE$e|P{VBKn|UeFeWee1E0<2TFZPoe2Ex{;cKu1rSS zd^SoRJma@x99m98B4#T)dS%v}_iN1sZG!hj+lW`ci7Imt_# zwT29;7BjeyM|*+%oA@hc@xazo=1F?=hHfCE@D;%Z}4=K ze)x`08HIfR24ry#%`j0i#Rvahg5PU7Lb{15fPoyJ7lAHLCalNX_4%_?iKo6u z8ym&w$IN%|#Em(o_!7;#%Z)+hRr8=}ujakZ${9&@!7tQo>O}9Z9u!T zN2#A+kA7;{7ekdO2kucxBP(Ym-)KUgy0c<&{ie}3Pk}UeQfJu^Fz~yPk)%=@RkHQ0 zwcTz#cmsg>K>n%_qBn0?3q17uydT@tnhob2ncO~e;kGqig--})9T{if=||T*^t{no z#d-Tz(pt504XxOqSVYFT^-}CUIHxXKd*j^DHZS@+zpZfago8{<5#_SYTk2n2c>&So20`bejv3d5yt6O3P`EgD{+ zQyuJWcHi*=KO|k*SXvHb<#P}XDj8wztXT$%?_0O!BX3lM%Ey$~TgdRidAa4~uNSYM zeI*ePHHHpYhZG zXz0{5u)Vq;VE%6DeBPe`4r=-}abKp%qeLv#!@R;i9Av@b53F>1hW4}ohGOf{Hvx7B z-Gsgy626JSH3xz8`}jyW5|tvqHb%nVniLu|YpntVCL+oJZr$R1Mmq=MxqSq};iEMS zK`5od;+6krP{T$3gwKQIA1LS!>*UhfJI~{1GZy=&Fvv7|^Mi>amiS@rrMr}NHy!H+ z$~)e(f4~-OVs*vk5|r^{*Z2M?iL@TE%54I!qVz2I_kEgw3Q-10ybVJimB}F3zDqWZ zuaeKuqKx@D;X}tl`!O%%bB#LPkhdDrjHZ!Xww*tIrLqnM-3hWBKNg<*9@iXm$lLhD zYBk7Ae&ZktjD2DW59&R$ns*|~rp0h>J3JSp2RTJFi_UjE#7Ch`dw%NKS1y`QOPE2> z=<&W94d`f-4lEBEs01CXjqo;PePsglfP@Qdp4HgQ$Fvv>*7uCQ1~=fObp*c`xMqKL zYR1r+)~F-4IB;>*r8ySW8&(xLwaT9@4UXVXB>Psyl?qS@F1xu zuot#NJQp@mP!(=RaoOl1y|>zce$@@ zZCFa>w2PR% z^!Tp)SUf@$i^@qEiZUSgQ_4AgsWDhPrH6VE!)0^l4;8a$S9;gQloXbRn~|E=CAd}W zO?CPp8qiLOm_B#}Fzh@C{g`W`cY~pI^}V2Q{^U~Gp$U;cxyq=ngmSB9rXI6OZrI^w znyV{aw@SpdDy%ycf!~6Hy3bxKR)beVX7vJF$~^^{ZV7HrNzNg_c<~Oc@mNBm5dHvK zBtTikZamVgmqIfk%sz$BHYx zTtRbQnqjkvU9mMvOYq_%QCN@${0Mi&dC`mE%Gl&>PzN5%=$$OxYhqk8n^Z;=FOij+ z)tD$xlpHI+SUFEM4w2Aci|5IT^fs!n#P6RfXVVI>MNxY?=EN12sq=rFuPM!WLA82* zp#E+4sdg5fEaXq)<4{&?z~E>EQOf$z#wvx<<&$h_Sf9D51;{@V?rmt1Y8U{1HUS4q z>&UWg{kWd{P3&k$*c)^BcJSTsn&H`y_;HDdh4ciQ;}3|r^rmf1J@j1OSS`5v;>N>k z8_bRzkY2&P)(w7uq5J2|rnndqmvK0N^XUb`>{_kq2`Y0&Yqeh!l-F|SQ6@Q#GjQEu zJRhiOA0*&du(&fNVOE27;wgQy3|^H0+SLjHD|2cVQ39#n;nZ*~TJDpVn^ z(`!dzwn~;PT||;>`jsVwSv(R^Sr0S)WYj}71Bd?o^S|X&3?)e-Vb9|k^krc=b6_5( z7sB?Gx78`#`DFgy|87F|Zt*cm96|Ge=jc`ZB|wetlBw+P;sLk)HgcEJVP}zoN#1U6 zD(F8OlNpPWmi+)SvV7AgO4O3Sw~5~JKG3)Trr)P8 zNy-hTfNm|(eg5j#8~vVx$}{j(-cvpO3|;LAf8TkB9mh<=j^lXma3YNBE}%2CiRd81 z@**!;Jy8sQj3LPqo>Q<5DE&L)tQfyLm{fs=bF3cpxJWG*pn$k+2n~bStdq`O$A-r* zJC3CpKe_4M^6j@+s}nOsy^KdNjjXCsAUX-B*_AYXMgPB&pZ{C|eY4Shk(&Q+1tkAh z+Kd0}fpks&f7Pq}f9`H}LF8@b`MY#VUzY*_vnHKR@ATeIP2F9S>{92TDLdw}ehz|V zJNFPh;rIc|lDLLq5qt&dmr#Tx=@o3TBE%MVZmx@f91H24Vp^!|FCc$!)19^tL@ zo^4(t)!CA)LJ{ya51wCX#rMpCdepk!SEfNS^i~f zysvBIxI`{Hmx?csdF7+mwnRKXGzN6XZT)^Eu#m}_WGI{a3uZ=C>8x61olUIof2e8ecP~vdFLR!1OA(rNWItQK z8Y(nD;5@I{4ynM3HuNdW7x^={E>rT+qHPS2@5#3ov85SUM&2pc^C#XN0w$V>pZ+l; zSS|F|m3^OQa#zUy-sdFm(CjvdCVQ3~iifLZatnSpif;-+D(`Qzn-|PRE2Fq11}23$ zFUKY=dTatiEpvND<}(1ims1ugZR3#5p)d=f_W)}c_hdaD+L<}}+cx30bh7LZ38Q$< z^k7K8HQGz*JgjeW?Vhex^;5x9Nk4f+AhICil!N)G^DB6I$bQ){7z}TcrzHD?|H?$OCNI!%v) zElCMsoCSwU1{I0@*Vh)IPpOAMNfGYgPeLIx%8_64emZoQ?eZD1-lPX$OZSa9Pa;ll zlaX28`;UfhW+>!&OwNOX$E-!mAW~%V!v3pr4ZFK!>Lbq1M_hd^KZ*aoQ!_XJ?cU)- z4b5b#fZ2)I8#<4VRPm}O?f^=B*xd-#V_d~R; z+xt%~HMxHrjzYSpghmvXU6}~%BjL%Emh1Ke!}!wdwhHYuMzxy_f!2}Ajkp%4_%J|v z>E9R=CIWPzYb%F0gYndUy|tBRXD4as#7p)~&%*wPj6!&+{ra$cW-CXU!O9u`(LnF9 zNsVu_OLD0zKQo(kl1FDKiJ>QNXw$C2vB@r9WS2q%+r=pc7icO`3c-QWEqQhhJ8TCJ zPNbywc3%uHU!VA+(u)dMQ?)s3Aj#JQLFhS@o{9Kn9NJ zHY`ypWnB1}r!7G>I%PD+sUE6XGMAB?%KOn5zenOH^nGqe5frj+ZD;tSI;X8&$^^d? zZ)xX^)^O# z)bfG|1wf8}C>%!KTFl=lJ};(p%ES(~ykyGrLb7`YCEqpO9(m5z7f#7>%1V^0H10V*uzXuJn+sn~bi z_CSxr>52UOvFhto(vt_Rsa64|qMJEGRrU{{Jlj8n8f2f$3+FNhn;8tvem-hS!6ANP zoYmCv3gI|;GBRh41Iu>JZt`-ne;<7aK@5T$i#cS+bzZZlC;zldtI9vT08zw*_U=M1LgW6mtwWLKV0ZI2lf6yPN|w zwmbF)_Ew&2lLTEKKD7w;8Jq6vN<4hGd%kT4D|_jzWKlJ_`B@ai(DrU^>m6zO|NAj^ z=FGX#Yie{srMkyU(*K9I@KbB0tE4GP_7Wd{*NW z>NY8{Zc|{>GW?Il{!y7HId`&ekTya*c;tx@6Fv)7YC6yt3~c?)FcNu~h$!!;nnRQX zm8;dG0y`o7R9l)&BG?^f@C5$4|7iO?n4QzXvAS z)T#=!--<Sj>AFuN3dW?YI~am zxO+st*{~T=bcwA|WDwr;=pAdW1bL6Y;-jM0+mo!hrKDE%kcQ3sWl22YQ>E>`kgpS+k`yvXDDwrR>Lx&0YqSc8QxbtinV zt-)5B^@h1vn_*nYy+_&-GEc+Rh~ZLXV11 z{AvsSYJ1?P6@;5rF58gI*vku*xJQ8|-=$}>=7z2x&MzGcUj`3_Tky_t0JA=sdxyLF&FscnJ;E8^Y_9Va8#Gjqz2e$;U!@_Mub9^fr zb)J%c{aQx4sBya`=VLQeJ^rbnY4WH6tuj)tk7hzB7%{{zP6_EfaNcid4L&RgC&;gp zy9vLc@lPMtXIel7?+aHBbTd?b;akOtJpW;I?dH0bBBf+iAfQqmb2CfkX|tL4Bbsd{ zaE)MeKJ@V{YX}R){Q%y~s^*bKXW%I<#ae zxSa;nYBOxKTY#3VVU?K5iy<7+A5<0WSe+nU|30l%K6j&LGFLa= z_)U0vo3hSxch%ww#nwF{Y7t=yy5pU+F9m$NJ@=hxh=qF9)uiFWw$3S*TJ^^UA1 z?3iy>eV5(y-^yP`N;2P9*4TX>ZA*P6^9FLM=1mE5m?{C`r@<8&0=ZLkN-lrT{1qq zMT+t-8GkPe>Zs+o?7WTd%~2fOVJX|En?_^gL|zI?Er0LmoRPiv>>Cx9nE8EvG`HDe zeTnzdUhRJ%(DubwP1LtV+(@_u9oSR@GPWRGOUrvRJ1hSrp!-9BW{{IAEe5PEkmKe1 z7t<&;(M-(EPPt0`L^SRF`^>sCjI5aFyPht>6GTo zcd@$oHS&^cjjs2-9VfS4i{egw2IiV&#XRSgxh(38V_T;V|9ZdrUg*lRv8?}@pK+tV zvDs*tN_Lp^%`*guN3EzXOlK* zX)!`@_ZRddWc)SR{YUy5xVkhpjZ3%`1v7KO$3NEvZGr;Q!%}?M|3gn}FIrZ{gr&4R z5NJO5t7BQ_l2-3j;A2)e8s)GpCq0U*%J5IdO}{FAC4Vy*t3P43!1O!VV!d;tN;Lpc z?B8bwWOi8`+9bVreyM*Z)m~6g7oqQbxN@nLvgld;0#Bo-6T~qdqCtJ^9g@0##V*B% z>KO#D%XY~PT2k!JQ{gEAxc}o;XIzURaszoNkQVjix4Fl0E^{h$^XT{I4|w<2?TbHDrS<2M6x|A*Y{DEmil)_Un~ zN5~GWvPP_ma#K0@dP5J9mEKjDDWw)3ijfGiZz0a9-^Y@z5L^#-j(4A5SDL17b@IU! z1<9-jzNIx;Vip455IGyF%MOt80E9ZIB^UYnFke$9bmUqVi>XhpI#6G#-@ojFEKN>X z)!fw(Cy}ipzy6V}t3w&jf*RVNUGWCK(ck=ksC&<-rq;J#*9s~iOGOcoq9{d5q)QhO zRC@14dIzORAb^N~fHdj7_Y!K57F2pDp(8a&hX8?u009!t#I@FY{`=kM!`Wl(ea1NX z1Pn-+DbJkGeP6%p1}l&9H(wX$lgGVBIB?=PnMF?@pV~e@Lob#7K`-n7K`#Y!H9d&A zSNi>VB70?;P-?W=8+2ky77CXWvy0I~*AK|Od-9wPRIw<2UrWE21I|K4lRoua>ny`{ zgX?$qQWlr@T*l(-)_*;X=mqhAtxrt7j;N6HX}-n53M0W}%@aws>BzAxhoU7j|9Ml8EPb|di$ zCudD5v=`xk_E7(w$k87bHFz%B;ZouE@7F0NBM}6YCP?U4>=Dny)s*-=y>GirsbsaF z4`1WH)gQ6eHj602?`NR@12$9{*TdYP4pK=5kKO%mY~ojT{GgBhnIn+DSb|X#PVF9k2Vj z{KzqX`q+9^yBF`#pPq}KA60^637oo?dUkeT^PLK6k%iW&A`aMVYT`ZsTwgwKjZbHS7 z-7(D%*qfC-I@_BWsGl@gd|2qG%*Za?+kO{)aC{pvXUNjZ{})1SulL53@7u7iXyGfP z+d}mD-JtZ=QMQ?YQoMn6bF^Na|?Q^5~+(Z>Qjbi+6cg#?_EIV2?TKDmI)KHOSvpINfO@%m5d8o$)?O zcRIwa_V9^v6&KT^d9IJOix|qmZoH17A&BZ8USrK9LFa*=(0pp>aIKrjq?9V`-V0+7 z<5uk^k7r@S{SY$`wHZ;mapjTq7TDI7fxfa~J>P%4wpW=Y?$MlD+b(ES4yf{-aZ@wD zeXu{g*JnBX7QQ`S|9n!sl72PC<@bH1Qq9H#^TP$o4hIt}&8$P(8s+QQT1cN+ORRx3Ao=Z;~PM8Drd^_o82Uo$UA zkImU`hv;iye!bzHm6~_R=wjF|Om%e8X8v8`C=`Q_%e<4AXuF-KvBT+gfAA=gFU*9W z8LMV1s!V~+$T^FLIMsMN*H?&aP3bm|$t@*z>LLuUZ*iIM&GNV+8=+*cY)0M8_yI#& zOr5REgbag|aem@7^8C3Eb-<+~u!#3riks=$bX+VLctMG|mDGqJ&k^Sa;SnHPnTQ|J zUSAJ3VKpdsf&GhqTZ4542jDfUzMR`W>X(TP@wT!Fkm{j|9 z!Pa6EGbKSqIA}3gmu$tMQ(Vb1L8ex#;HYrsGTd=1xW9ZtPSRzvyPUUxaQbQEQby7eFOQ^_R;aCQew%|>gtI{j0u&HsV)nY*NM}ItSutZ; z_KuaVPmib4IJ=Fx7>jX)5@XdoDOflaPGr^3{VIc z&Rl5WN^L+?gdSIGUsCPsV(aG0+`M;s@&r#s3CM2D!sfy>_BtgZm@$PUsOLy~sB@Fw z>Z8GYr*9q4?1`lj8hC#dhqtCpzdH2WvR*@9r@g#2c>v>YAK5;hu$9)1C)C<>%Z+r6 z68gr}rzGEgkZ--B@nWee6;inmy(swBF?5Fc7i9&nmbOW}gXlVIJ%397;GT4d-I4$D zMfi-%RRvqzmPt>1uP)UOio_Ed!7D%aNODw?lPG#yB1KG!w2a6|HyyNjm{&z}Uur{I zN(Cq4)wo+r;V-Vzc9AG3@I;1np%C?xq+!s76kXe4mr<|>7e;5V(OL-lDw2%zqm*1F ze><2d+`*|vCO{)b+Ew+zj(D8Ktar%(a?7wH+@lk(YK$xli)<2upIoH(!_E zgZanXmoIY8>AH^Tey1OsmRQwZ0$X?tTt>2YxItqZg=Gck9(27oaovojxE%Z1MCfk8 zcdFT~i>|#iC+;5~s9FucyU-UsDvG=)f=w0A<43hK4wfLw;+sow7Ub{rtMs)y)!a;b z@xAK2HA?CkUDSFuwg<^K8eDRu=yLU!6%2B~ZQd2nhE4}?i|>XVtxUAG3Fa(y&p5|oZ3c0GC)Pt%ADtDF-m&r-uF@}D>I@{ z;)*_OFFr7ILs_XH_B`xsB51wLh_j{ZomG%FJbx1pO*k~*%Dd24r|H{b&o8Ra@(6Vh zW?L!&_!dlpCC%7!u4M|= z{D+2-pe#bqVyxZXWdJkN!fSd&R|IbeWL~Sf?V+wYe2RY}bxyOs4y6m{;bg$yL0O14 zbyvHl%1z$IQ6-OhXesNggzFY+Pl~C6D&0H8aDZF~x2Qg0W`6PI8OMT@U?)r35&*f~ zo^Y{-SvU*df+7fG8PLiGi>cLnj@uc2t%rP{m)XQ|a$cfeLCeg%PcVKaQXvrTeJ$hh z!9}^1#mpg?Kx|oy3zrP-Vw(^oieyZI5pirUa;Af%~+p9v3GunI7b)Q+$_E@K$=l6mXA>~j432ipfLdAeGq?h%$&`cHT z)4x=F40Q!o>xXuQl~glw%4-Qy#+Yo9O71vWa@^N z!f_(&7eQ9BftQ)W>ek5kZpUK5l5;WC%8ha7qp?gko+MLNJ!(^*T^Tn3zp8omZpU0g zJKv)P`T6{-K%4>PsJ6<~e31WKKY3Y(=EesdpV?+q2gEG!nLp1_K+%t-D`9G~6yQxT zP_^?E=<=&MV&bdx^AG0H=?Jt3281Z5pJ6vsKgtx|s!{C^yr?7cbD>T3oVPzaBs5r@ z7bJ)vduvQJKi|bd|PVyz$u0IE;t@ zn$w>z9evq5XwymB4FR!`Y9GPDX2QA?#XG9P-Xt~_4G~;c^$elmFV2l1jbty{SE?WQ zy;D*4N$aEiQsu5$6(LV(PzOWZj8YnxeLOq@)%v<5P;AaX8|y|g?*rz~Ac;7vx?(~H zZvr-gLz)j<(cv9`!UA6^LZAVAR+*nl9J%VZ_??``jAL7+Wej05_OfTSQ*@+i97Tx1 z9WH5|8eWGAl?dbcF8729;|DwCE!KMeLKV~_G9qs2_$L!TG{8E&MNvVNA5EW2iRLD} zuIeAj*4Tk+dbF5$$4nIS>K9@|T}IgU`*$c(#u7u0>`cWa<6&9WU=A05Z14FM(Y*0V z1>f%@^8F7W#FN9c*zZ;;SpeM4Shddm*vny@VBjRLb z6?Albyli?7$_wfE^}EKEOP zR>xBGt(>$o={XnufA>a`bF$LP)B}pWr_zbjM|OLSMla0hXX_$hj>!*rVASV8i5k?W z|Jl-SPP?wT6JvAo}AK6PU76C<0=3&U<&xU`5jYY7GMXR$W=fAiA1<~XG z+&KUDPX3R0CI3HpxHp|+#46;^5U=$6 zJy8m5f^lGGtMj8gr{(Q7I{BBEeD;9uysKdw4J41ZcP1sD&!-hjfQ!7eJ+dLPyV0Bi zynwU0DGi99W*Nf_D?v|J=Vy{dMGbA1e}P>5=h^#k4Zu%+(OhdKw>vpJPk&GB8SCoD z+OqcNnlyxNd6=6zVsES9{4G;gw-ou{PEPC#f}Z-y%H7HLjBKbHvuh`a&wTO(pBl?v z%;+0Z9^j&5XF~eo2obFqMh4}RK4}8?>ygvD z4^^u}9AAd?0FC&A4mmTrhrBqJ=NA6V*=we=g8n{17}bnnby}xZNkt1`3dTbTlNsiJ z|7{+n7Xk*A)z#05L?RaSL6`PyIcMv46Op%TvdBP+c6&@I39nufJ=iY+S^pHYrYo4F z^cPAh7`z(WnD$i=C}AzW4{ffeBg`d)H}ut+ZMX#!(xS}!6m>kRa&|_ZIvpPiX4b?w z48N{8FtQxedChr^2~!w@hU~{>TK7o`9%iR|f<_RtWh_q&50S1Ajitb@6i!n?YgT2JtamzV$fEM!f2M<%|L1CXJ|Exy*G6F`BH zq!F$AG%w6nas?$fw!IuRlBSpt1 zU21AEWxU;7j*MA90`1?5fI-Hd4xdNsuBLoj%=sP00v*JyuuR4^JXHQ<@vY=v=_(C? z34Lc9dpXVZ5%xl|b_?kWQvywbpnoZXzWPKNX+4rl4x5%7ydF#0=xVs!DpoM@zPG^% zi*og4ql@$VI&#@j;O}DMP?oFdT-fUwYQ3{+;+Nkof&U!h{8%8cU;Pm9GxuRoN8rd@ zYK$V~o?~taAVkmSc;tMLHS_p+i|*V0bszS4;}?|wytGj6vjRxiwYUZ$MT>pEDIyfC zfN|HH|EdUwskrJZa0!gnhyDB6FS>jtnEn0#80)Lqb)p?t!gy|IT3?`PE$#dFZv@YF z(cf#HDl>{c)2t`seCr#W<|F1W8@!U-?XGr`njNYrGc3(tVHEt)^wYbje+9N`XUi5x1CNUr1Px1pVIB?I2njnuc*=)uHp>Hpr{PTeBtiS=i zaRbLB3Q*)&p!F%pb8lk3o$}ud9dsbcMy9Z6TX<)1&^* zAlRKuKS3pO$o)qOA?-=2%Rffk54uce&H2zJjw6c~10ev$6{hC==S0wYBimL!eXDM& zr~HK*tDtags=QQs!Mf_pweQlhwZ!f#RF5&&VpqFas8m*L-$WgXzue8d6Q}#x9Ma-y zl|lfLYOV$gTGcL>#^%9sB*qf|R zzrENy&=u72maB&GDYkYR*I=itrnx&<=AP|Ua_=AJq)^jGt|3Ame{yr># z>-%r^<>{YKMNx6_@wY{Ry7Rv`{2p-74RvEWS?^msufJiH)z|ZXg^QqACHwm~{$8}u z|9l7h?7!dZ{}!k7|Cw`dMPOgKKE1fqE21H6FoEY^dX3flP9diuGky{{xxIqxV|w`I zNRsj)@2NBg*YH$ae?xO9%w*H$2Fh{jVdgi)tme8$xAG^cgYDiX+S1nl3+z>>d*1=t zE5dTDF8f0ORp;3D%;Z;}{r>W~4GxL0k(0uZ;#03^e%DF)ug8)<(dKY}!vX+h{K1ts zq~~r-!{NsMN^@X#^gUBUrNAI_K!1Jnk)D?j`*5ku*K<+_!MNG2o!qB6Hew@hMKEJ6E@ym1n>-0+I z#xPALVOo{S+9LKwty#A=bZtZUSp)oI#5m%aG`-k5!PQOcSDTh-CE zfm;8ZIH_b$pQ4gs{gQITEhtFJjqjLAb2lw9z9Hfq*euq5F!9($$9GyROc?yW=dJv;nR7Xd|m8|bZM%X_V~?2$3BMJ5!MUq=jwU?{&(_}>~2hEVPwMn`6@=dI5Jx_Uwq3|n)W}qi~$$LWW$cG(i6wfFp z_2!$cjrA?eChti%M3&8(9$R@icffKO$*r)mS^W%pH#&3SvTI>r|HJ9c!S?}xaaq{q zs6K85ku|8kVOg*7!zNL0-ok^$MQX(&07xT+1?0scD=J_7Lf-2DS#*0L!8RDp4F77eFW~~Gnf4MtUlfTJnExJ<$3)2qeU%llEQgF zy1!i&N$l~Q9*)P1XHl61;lJcBFts==|4kA;tI7Cex34*)XgB7~V>#_oFgJHz3=&7Z znu2F}#X4@5(uxdeK=BOET&;m*2bWvB8eJcpxu2uO#zPAWfOdiH5{wYc?^2Q|)fAFZ zd6A9Xb-I0)w)<$ck*<^@vjl4%&+6V*JFX#NQHoiXe*njXrFyBb9j_RPmxEsWfft^TW%$!OM_OY!xqxCo@#iFwn!i<1eXY(BfVM ze)zi&j^?S;SAPfoxB|0k`2ADI*VOu_e6ND2rWnz-baP=kqkmzjRnl1L#iw5|-}LP& zSaR+gJ`^C3pL1_ieF1nXUI*v6-pLZ>yymx104C6uiDZygC1_~g+e-_+ zB*jvRZOB>Ei>|VI!w@%qN6J()#^QkMjG4aoUr_d}t1tPDeB5&62eY5wSNYL<6`Qd? zm}PWnmQ6M}bBVi|1~A_*k!XJG7dYj>)0WfCL=&?K;=Qi$gaNYCYxU2UkWYI!r@!^B z%7jU%ucCValT96;(u9+RPxs0_cA>a(zL>?b*!n@IBS7zb&`Y4YWaTCK(C+9{W*=%G z*5Mg%$yMOMB(8itzWC+sIbn)gIR<9n>W<+@I8Bf=eRfP~s%T?<)v{j_Ta=Rjgijj} z)pehJ@tzhT#dIH%cfd8!(k5Ho@u!ex#AQ9Ylq0deQ&ZFJ6$#}%LbuST(x`J&F@H;% zzsKSO_(9`1jWL?b@T44HT8Q8&JaH85yb9>?-6oj!_liz~K}gMJ6V|2)`L@&(1Y_K9 zyjs>FSR`n(MsOF_2l2?l{Q5+0Mla5nL)Laa3!TlgaoyqO8jnPn=FZ8Lt!+SZ%j%)O zGR_?_d2H94z%zQV0wiL~T*h7h>`VP>RKYDMDU~0n2=VNO;~W0~@al6-R*KA9u!!N& zh-GXrb|4PYVlKv{b@7@uG;zPqm+l%2Nl|m$8y0r z5XLqgA*XuB^}-*E7J@#dZRP7VR@X9_c?x{auzL6vERmU0oUJ3)D$FD`=Z2pYmuasN zL&EW-?LsCo^Ca53C9*E}9~RYjPUuw|vy$cxK<7euOS_KE=!xQ{B$x8W(beQ)^G60= zS@B#Ao3GOfqQdd}Bfmil`I$1~ul>CNG~ZAr#r15;f@?pb;Wk=(WbX`$tiX*tuA^j1 zz|bxe&P8NUkGQUSmw;r#o|_^OZ*o)b$+jSjaKKQPK9zF65~DDU`sFe^(-42*rt|n6 z8A73s2dOdhf`>m-dLAJh*H4`TV3=`Zw}r6lxhzz)y(xZQt@`HiIve8ZB!Tyq;E^dN z{U}DA4UIWJ(L&CO*6N5vv<9JsH)LenVxDz($I`5;uA zAby(#ACAXw72GgE)oRQr;z=yfS*=?-4gT@RdLojk9Z~9|O~M)52x0rZTPfcSqBW(9O@BksNmT(%WRuXinOln2L zhiw$utHHGnU2AV}DF+o6mAEa5HYW4WZHHgTuWgiBIh{d5<{xeZ83P*)mDP(?fHY~~ zhNvgZH{Aif9Sj!x*6q=*Bq`e_STO?&;c#`%$f2Shc>&AapdMMjE=}%2rTc|>k9&!z z1mgtBT8SlAl5a6bRbHnH};P8Xhi6p19xE)2#-NrviVxFXS+?P#QlW zp_}9QXPbW_rChs=X`VXdcbd&@W5k8;g~K3lM1Doo@cB8vK6{Uq1{tBu&&AdLITH)N zKJlx=GaC<|@zBdE;(~%81oS7KokQ zBQs?UUG9c*AKM}-uBF<$O5?UjvKglEjEk7ak&_4(Wk}w(1$&foX{lT5Wjmwk0$VQl zXN}Hz#S{%CWoON_LQt(2rL^kl-NJbnd}Je@WJL68Q{6kQ9nLIsq?Jn@E;=u`8<0JG~v`_Q4)%_dyIditG@Q8uF?zLQHW-l;kmvY&+IbGUmo0uH-&ISXdj&yZCc z;Bs%Jbv-tv1^KBXoGzQT_d<omw3N6t-c<}eMy_W*jZJdduhuo~n_ycf&sF9b`tF1v{d)2QO9gyA*sq{aDX#S)*l z!rfe2Zyk?_@6V(PX}yPhJo#mGR%;$MrhUifcliBL%-+J3}D8XEeEjGEb- z11snsQGY+cr+Q{tky`2o_1^0>E(#O2Te_o=@`Bbxp2r?v;xsY`cr$b|y|@#vdZ5Mi z=OXnK(YKEuBerfZxTWuxZl#ZtZQ>tO(;?W2%~Z9Ip+2a3+TP}M%c7H~ctV0~R&V3Bx281)SS=WrZE+-l3#Dj8ZV<6HFGL$ylf z3HVpeZ`po#>K7$$&E-ASK?h*JBgd*FRbafxvhe4IpZyYFG*7>C^6g6XUX?a<D z1i5P%z7+Tkf#_enL}9xXne-T`D)qxUPQu&@UZg}m$JD{wQ*Hg^y1iboq0{LlUnbq7 zPa8+Q>|8jK-n)va$F$PvX5f(`l=#b8gjf z;|Sq!4`;$^9QiXp7qxxEO{5T`i`w;yP?DuMal&(Im@LeL^K|CxuxTuMNc91=R$kCJ zh`qWh*>ssAe(COzSc6^}D}z2@mi7=FEbTd6<7E5d;2PP17$Cz`+Fkw~m)Wm0Q27Zy z?gwwTzFrJ9pZaV`7!BxbLYp`?_c_&$_E~9-wyrx;X(sanxi}+oB z;j0m9GE5_n;g@bA1w4LXq;5Ge`fK-eU8V+djK`(1@E5Z?A4&vLS%SH;MiyETF3@*y zn^~zRk)~ImucFzxxI_fK>M-kBN~SF#NsX9@1pi7~`_QBN>BI@@nCK;Dv~ol+m7NP|pk?dsBKX3s)7c1LwllPt~vVM(Myn5MS31`YkT_-nWKZ zrhHL`$y=X7E`O~)WrJVR#^xS1AY4%cB$v6yL%Oee1<_3}uwoZMWQSXR=dCiGQc0F%R*t!~? z9&hCcP3(s(Yj&DH(uZX^)#NDKmO5T*1byT=sp)9@%j(&sh+Y^J_w}e?3w8i1ba`x{ zNCwuJG+CB{`8wv`O;{|8YM8r48`&*Dc=}@{4x}t(D(Yn|UW;zz0PFWjHy{h7!b+Gc>ee_PjS@Tj0NKC=hTMIIogLDffzLy!L z^?*x=RA&Ut2{m}g{@W99kBQIhzxf|sfmH4zRN0@tfP{X-QcLajO~_eSK{e=1a@_ik zFZrOSfqS{s&v;aJe59sb;5uzV%q?Ib9_F>N+mNkwV^8KvSq!6ZKaq0s*?(c^8!Z^H zTeKHz$0NH3_eO}#d6Gdk3!#;q2Ht87YyzTl2MBO_W0%mYK&*|=Bf#zUd!?(*Mp@+= zWcl&&i8qtOOUd4tudcntB}D!|CTyRcc!c&B@8FXqufW7gNfqqNky_Udb%mP7b(Es- zR5%;CvXT2&tB{jaf&X$~t5%;muvMRW5y~LKL4?68yDI00kbYrvnEbi9xkTNHsc4_! z1-CE^73Ze@dK&lT&>$ zqRZRS^AC5;U;u2%hF zY01`M;i&?rC6~4(F)=k*e@1{k`<(sGZC4rekAiXZkv+Dl_ z_vz2T{Yl!Z{!QNvYdfzY+hy5q#+67602=9|?)j^d#&i3(F+zm7E0Z2u9~JiUAsfDR z0su*8rKU4oyCt+p4~^f$>@~QkL_VM$3whFzMkd|5a=hMP)76hn^;He^BE$(016#yJV&O=YhA;IgfJ4%*5}Fy@`dO`H4%s+C zDcuPgND_BLf^VNfN*F|_32x3#SKTXP4NGnU7a+3KcA#rrX< z41nAmL1F+hYZ=V66+UAjGrO*sCKK-+74hTNm|ph{X$!#`u4g3HPJB#^^3eOT5$C!Y zGS8nX;$W5dgCOrYDemLYA7Oqk!!7`#HPYOZ$r6OgSzy8G(fXODTV&E4@5tr+x5b)s z`c^f`LazmRIBPZK*IoLhL&4il&1cOD(!gyBGZsd@9p1AltnOa|1EYR$WUD}aTV-Hm zJ_78T;ACneyRYm}f3`*#WPSYRGy^Rz5zAY3qHPFwQg*Xv2I|jS8mk(YDG06acB|?g zL*DCkbYr=CyRl_@sD84a8!i0p#CptgUMkK>ndCRD8|{=#AB}z15UR zkfxo*3O^qJ}_4kCbA@j-@$r`y$DD3;OBl5V=@&&QMi2|)o|18HP+u{W>tAE zDSwlll?;#UtQ4lUnEr7~W#FsKlis}}XHlCIwREZ2zUQj0jW4zy9RsrFbvai|On6Bi zhs7QZiirXYz1+>oFDM87=}#EgmDl;&)HO=ewRLYtOh;*nHNd;gN{{<^J=vjwrOpXq9SRbg1R`>bkd8ZXLX9O1=4~ zu12ItUt6Z`3`Jp=JRF93B%&0O>h#Os=U`gEP_EL- zsmYs+nbcl|*rl5h#*3?Nx2eAMJT#P@yQ5R@Rbajvb*A9f+_*RHzX0I^VgX}SLa<`0 zVY^ZphS?_L;)xfjYQNr03KDP<(14$U=EAmIu+7}7<@QIMZKw%7q{D;e`*0wYOAueq ze3FTcsR{DA?|cFS$;Om!w6HN=6!MmDo)tR@(9vnL3XG{6R5*HnG$XRC{%NIEN8^j< z#9hY&O2z`dM?L(49+LKujC&!v+Fdk^R6C8TsLmbX$1N|yWioHxGlq*P9K*u1Y<&*+ z947%ZZFP8w;FXsH1#&%$i}pKedA(z=Mvg7$|KQ72T#(8FYdK!I->TG_tyXa>6HQxv za-45fC@UB(xti?rEmMCyeN{D~9BwDim1vL36-u$=sfVFRSAA<|S(x{mCFK_ZjCIM$ zc&8+Sh$^x&IM#T-zejI+GGgW1r2-33p0>Wn@WkkdLnS8l1chrnCT+02JJna-f|#0x z6ziGNB^bvhlP#C2f5|-n*;9vZ-$7iEE#*utu)xt|&@`~h{)jRX+`N~aA9Vq8GVA9o zhtgWhX1Y-cmwL|1+^^Zp9i9s0Q7CdeBPXkoZ#JFo9~ANuy0|<1Vr#7Shok~QcFJ9y z;Rh|CF=YA%vW~&UHutnK1y-vs5p}oYX&-x654-B#Ca8DgOHSfFV1^Q00e={G%QsEY zcS)*b-Q?&{tKoXSwKgQ2@sgf($=H#ioOIC_Dhm8rnj<_nx>?GC4cG41IQM}f;> zM8SfHM7>2%}*x_AUYH`qV5jEC{uw>(kd^10tMi_uJ|W>V~G^Mjy=)`x^}N z__W6_dJrluAwrp?bm@cs?nf3h3Aj3{=;flcWe-C)C&knfvd!iQeqe&{r^M%g$x+R( zisfTYpx_R&^6SC4#zv<^KZddJMj)5>t6HCsrIUIbjr}8#)88Dvrkz1^QB&g@36T31 zw|44*f=qKDdc2g;;CLswU9$#^m~BpI^{+Ucsn!%PZ{|3eY=+_~LP01I6>W6{Ea1{A z9Htuv2Ago_efVMuEFgX7^MuU;swYVX&XM_?J;k+Dmcc0nLE7 zZBCDA!`Mf7@td;<&az_LVQU9e_Gs;Ut2L*qKhez#+R^DCK89`6F|eVaVv4CTAf5~# zyOkf9icclL`kw26FN+gRhB~*-1dCN6H&PA@PD=!%hhx86CwzzRsq6#PU4>GX=N^|!` zMRJ56W(stsWpiwYsm|FK#Vm{|`|}Sp&e;?tenTb$r0=JTWV2f)t@PM_q1$% zA{hE5gJ@!)#EU3h{2yXVGi$mF4$Be4JQ4<0Ohw=FfAnr6>xTTdUKvioyiNJ{z7kCr zHxlhk*Pt8ATXV~oz^daUxnB7}*#`R*>F{=ius`e$QKBfy)YRWNK+gWybCG>ml}oisKA-;bo1O2A@sVgUNBZR1XSyG zvX>1=o^eN~=7ofE-Y{N}`g~bznTw-KNjX2PaUYtUyTF^9B7ES_nz*jha?Q6ZvOXYP zlTyn#Vgkx4{7E~Z|12Bx^-*SX`m-fdRzZ)#RI(U`q@DsJ#!Qti+ii;*JIm!qe*$2Z z#{Tzn_%OBt?nQV$6Hk9qn{Zh}iayS5w+8iKB+fx1EE!RTl*%MyIZLw0Njy z>CSkabe~UY6nYha7FgnL67{xN`0c=Y(8=-khb+9*4G|xjT*@lwSH~dB+04QvP3YO7 z)CK9KXV24`J(BfQ0VPuxAG|V*K1hnlOm-od_~!fE3Y(vo5VfCMUAJNa-ZWw4l#tf5 zfLF49hjMF^4CcpGtiL6D*Rx=VEcW+bI@BE`F`4k@0Hc0lj!6YmweOSCxvo@2zm44a zURzslw4{WY8=B5FMwJvN;>Y()Gtsy9?UXDl5AmTqB-`dc?b)J&IWvW-4gO7u&8C;T zS+RlNpvN6gO>t!Ly_ybD=*cpLgZC7sX~nnFXamM4$H{}HkR3pZONDUrL%k^N1sCt8bnG=XWU z^`-iV>pAVy&9ei1E~`CK>lLRRE>ZDDnfAI5`bSQvg@$+ZKi!P*)30h%Va4&?y2yr1ZNapxMIQGArlGj3lgi;_8YlmRJyZFnytQFPA0YLbR8`j$ZL z@rDFgI<@cv)+qd`GGM*@PW!<9H|U*mvvOnYtKQauVyni5^Kp+H-a2-azG19&$*QZW z)saq}n=Bu{h#t-?EyR=1_EW=Sz3MuhZL=*)>MA3g*rHWXcIWpbN zRFqddfJg{EbJ$Z_q(T7WQJdnu^-mVe7bJ$hjf_u?H6!{@##mDNhs}eR@Lv^Acj_h_ z5w|xUNOP!)!C_U1l68+{aX8}rCv>g7$Y+z>MAp3a0fXU1;sQbs*&pIhkq;wUKi5(iL=+X z=21I}dG|p0&!v&_(5#K{S#0e)>p!uz=FR&uU(Kbv_5JqA$i)V2ffUe*0MC5+;}aSd z|4!Kqw(a|NVqzxEB_a=a>7Q&yzO>snz?s7I51*A^d^sKml)E1KD=Fhnua02^;$~68 zuYZTz8$UVpPZ*zSFwhwxjm77Da?LLZ?2NLrX>1{yLivrm%NM^n-#TCvpCj{}QehCa zV&v|`-4ZFKznk-KE)ewY)3=i9o`chi#I_0VZci1dr+S zsY|ZLv{+>H)tq7?{1v9Xs-@^g&WYsf`@5Lp8`TV*4fa980=4&OyWV8)vfA_177!Z> zYUli&T6wlUJpX7ea@gtvOuVg>msAH1Pi3)ibLn_ou7cHpgr6!YSI*LH5Rk_RVH7l;%su2XK{%Y?UVLX*D^Fn16!0~nqOj@@uxBn49yZuLgFXN7S z*j!TK?jmvYbZi?K&u4u5EDe^vX|i#vRAjOTE8_7we{&>EReLTKFjSX3sw>lx`gsJb zZyme?^eg2ib9y^8EXO9s?;T6^9z5j8Cu%K8G4JVW585GwCslOvTX&2|)6b6H5#+Dc zLlE({fMi_jNl~SU1RNOwKflR{)tqm2&Tr$bIAlI4+?_X9{+wyG`{N5j#m(j(13EnX zdQW(>=AzLa)4SW5Op1kU-TD0!8o0DhPFKa#B`rTGuG;|pzpQEwhQ-68vaZKY2%Xj(dPI6o3x zXUZ^kp9c2?S=wkQxtzdxxPD141My<%Vo5bK9W0u}D1D$ogr_CTvn`L{Fyp@_jv*hA z?Sx!p>qAP}LA5m;j{lsT7^Pc+5xr)Tdp5o?`}h3O?){aV{6@AI z(2DG&jwbK5F_jMaSB4pvdWhps^t^xxUETumsSh)rnYoa_AQ80#xk>U&3no9Zvwo99 zFb$DZ*j4{!U{~iD=I!&z+Virl32G(GhuwcGk+^=`nHLdq`eDvG!b>O~~+z+U=*R`h{Z!2^NLU3}g-vbi;M(ovT={yc2;v<=* zDC(l=Ovk#@sQ_4QHoZmXQY*XdV~aMy-Rk zvwU0rk_i@G)7%yl*r6V8Vs-0bva#Rzo)ikUU9*l!@7U5+0Z>e9@$SMi z=(3yx$2j_pRJ`LJdRZl9$xrN;QgsOpog&W@6kpAeXlz6SFQ_uVw&K%D4R=d(_k~y$ z;jACP7FUoa_ zGo3tj$fT%)^YOWi7LE6v@qryD#Vq%iqmJ0 zR>g7=FJH;Rr5hp?+HvGErWv+{;r-g1?}^wuv0YrSo(WTZU;|0hyXa@C4empwa>1P3 z9V5%*9=%Qp3IiJ^{K!6UJq1lb|H?Z_dlkakEOoVaDtID4hoo*IzGM>`Hj;%ZSbylE z$fY8?-zC;%sGGp!oA2O8HO>R{wJJ98BNSF1anJJzYMjOh_6*Ync>*FSB^XdcfA2lD zAT$8ZEJ!EX+ytamQMwOzNrSm8hZ+0L_1$Y`UKX{sft$K_{Xk3A_tlJ3U*yhS?&-RE z=WwuO53tnRSpbnXHTza2pBFx6R@U%Sx87!@Ua8=uKH2Llq{juL`Q-)vK({()5BRF-O6jsRDj54BOI_w7SM3EmF+QF7Xx>zuKnWLI^$NiSENyCQb2`ziR4Ci0 z51G|9NrV+^NeflMc{jz!8P1rQjc(ljP@ZGRL?{NFd?0CZr}l0D9Aqgd+^`kv!Hvvq zo`r7GmR&OL<2Hq+#leFirUE+fTNZ}+ntjD)-mksd&2Y|wL>WMxwO9!RSEmZ6Ia8aF zd0%Qm8`{WLwWTu_3Edv~&2tc7pv(T$apH)`@;ZxDTW=(&TFX%!*Q`Rb%R2HG2xmpC z6OIBLZsDtXOQ$syj&g<=%{f1gEjB39nIUcU8}yrs6J^e}HT1%?9&2MZ9(sQVFVzMdimVf;O?S5?!yYVUpD*Y&$Tj9sP5n=FUibs_qC$bFZ9BgM0l4~wCCGP;ARGEi8q_br4; zcVv@C=edui#U8N+(66oP&sJAhlh@n*GD6s?;Q%qohvFX-H-SObe}$(;U}ZGTv3TE0@>qV)GH-m?EAVdjc0YsT(`!rlFEU(~8UJv{Iajw}s}BSX zYNrhn2CXl5)<|T6cLppL*tAq1yjIk#$N>GuS(sMi5ej<31=+u@>n@b`_{OcLk50If zjH|<&R}tk!>(NSKqOZbCdW5ALAGaoTi$89+54LB(?WiM}&WZCV?b_)(9|>OBT0o2u z_bYN0ywo^Dy?6$YGEKK8lrf<@eG4NGQRv7r^Lm1`%WT6q#e}BIUr`g9 zgi29Mq8Vl(>4l@90XY_XJBTOKC9dB6cZFMN^oka-D5!Se@Hl*fnHBB7O zfw%Fa-cqGVT3x7k3y8H)>O;(NT^sK;iMw!@Jk6y%;{~@Ux5`%I-0_(|I_hp&h3Weg zU$&$96sA;09lxXR+h=R36x#l!niU2c?O(8o?XR!-bvZ=1d8%^jAlpyGE_*?xdDH<1 zRdf0li_-6y9vK!k54UDthnr`a8iK@af=l~Z z`UX`}0IA($-+)ACNbL24*95DG@J7-9UiN3HtxuMObEKl$y`5#0O1ncWFje=dV?e=i zLIP=&3Py%|_J~ihBBCWxPa2nfJ>Jen0K+q_iGMN);rCGWSqOsroj;CgmbgytbISCE zWG=Zj4o3YoPH&Piob?jGRnkH^!)180AcZhh`&x)Ub_+@2jh9o2TSp{4E+0BPRV(8T za^;PVOlhsf&Gq-5PCy>m1#1w=sb@BYh%EW@)kH`Lq(K8PRTx!yBoZc}4@7*ju_5-s z3&U*`$mc9A1^*W}KZE;6Mbm8lbB<@vre_>lBRnqtwb{W>?8x)Sm-wHf`Trf0(*OPC zERh2x?Otb*P+XOk8^Zis*ejETM;UBgYpzprhE`s5`4`3^gOeU_`x zX0oDC7mUgFMntnst(YV(gNp>Z#mr(Bc&4a_SBwO_Loda+LT&G2Vs>!ze4fh|E~8#{ zz5CZRW`X+0f9VQ@qo-YreGPPhn|_fcrhsr0a=L`3AFYu&ihnMA zLi-1s^K3@>EZnSH^Yz75Ds-`L<{H8=3#QUfYoAG#P91rv!hS}E25?bul) z4WS!cAAFBilIgznsM%7)9zRCPzFp?eIT*5U z^BUhwqVe<&aJ~)&UrnyIC}CG7Mjcx2f6XYq(+55Z&RY=`p4xO{^Rr2GN}dV0C+^Z- z?cU&zESqnLaa12pT`KVEkrd7G?X5Ukf3r@O-!?w-P{^6ed@subbBiCc7m}Z>8jx;z zGx>CV|5SWIU`z{cJUzdK{NXXzM^QRhB=tpMD0X<-2(2_$`$*E9e{RoJSWbBe3xc+C z%9{04E~e6YSPdnum7afdeOsIpN405p;+P@GI4UVb@<=`^oh3&F{>PVG&hWqB;s4+R z%=Z?1ykywNcI)67I0+g2=@#zfwNyiX%7$AKvsFl7hLm6*# z((=?V6OLt{O<~GXP3EG*F{sS!k&*PYJk7m7fGa&ceW?q-T73GX2&w}#X2N^fQ+yTQE5b4&3s0W{`dwbA0z_qr@36~oS5-7f~q z2_rnRj6-vR=jz_;imw7QtxB?4xU)g9Qsjm$EPid-;d8^w(1E9&SYH+CNfB65!w3PA zI|n&n03vk3yb}DOp=(n5m9G^gn}Zh<_=i7#>tD4Z?O3|W2h6dh{fbeg#y0!RM7NgC z8FTrG$JoMj%O{q_u1435h zn%ROZO&w`w*%>2(6;4`r1Lu+186F;PQns2NgZ5qWsF1dM>Lxhf4kC?lYi_Cu*WaC^ zNC|votSNSivRM@K=%b)4C zN!o=iZa!r}mRyv%E=e#-k2e(M)0%Rv7^Qq2$bas<*HkY6_Smijv{`G&uxS8|00esB zCK@dOv*TO>4Sh2W&kpC+nk&1@@vBl{4h8UnA-lIsru?!FC4=SiXoI^B)`tz|$PD~H zvYCDpLFmVAT_{-s@R)qBw`ll5 zo?Vu{?Mv2E*_+bJ3Vq&tIG~l!r~U7gqIdY=4{K#?-gq$m(KJ zNK@WI9Jmi+oovVB(P+mhD1oP%+i5duR(uYMgHKKeWQ=LC;Topo`yy_I=aJt>f`d3} z8U9EluvGJxQwtR=;4WkdvnvzO`;+9ngg8XOFoKNq8aN$crMoX}`wzSM|5nPae(^#83x3Fq=w5hc#kBi?NJ@ie#H2z zfRZ}MWzXet#QLsq1BpI=7lyajLA0!q0iRyshnfQ%CGkucviBgJ&FjD+SJ*P*4Bzmy z=@P-G!N&ZlCp^9p8z%)vx6l`+nMPiQd{*(tKeVIrw%^3SE>SeR`{hGDP}$FOGZCFF zHG6rTqQY9v%;y(pRIug*GxB?b&BC-#sYO)b3zbtBM0glLgzc3z)ujvqwYO^OZiGq0 z!^CAs_%EDTUEXwQ$goD{zjvkd_pYwz^%copC#JrCn&wsA5d6~x>r-{RIvP95B`o?; z(|M=+c9*OosdK1(4VVP^;k{seWSnc*5Yuk)LvTpmTv7%WtDZ0*jE0Y z7VSqH{XC`Bp?RTuhh6qjq!LZC+f9m%=45C1B%+3EEY83i7yyERZkLOa?LQq1 zBkZw1{UHyyC}lgi#6}Mu)q_sAP2+Bu)fauO^rYHiwjSWD?DUesQgdgH7GoWv_*2k{ zLyd%r}sNxE!KnakZ_kwZEeDIwsxo4t`dk$h?dSE%sgzbf$00G$8wsnU44;Axi}m{_vWW&^#grrN{av^^8+ z_3(fL*O|Ol2_yYwvRaU2SPje80>C>-hP2@XUY%C)V>D3_)D%dSL!1r!n{e0_JTt-T ztdY78uhN5?Q@x_&-Q*Xf_Lu)4?>>WWv67{-S;*|!j>VZA$g0`oT>}~9Ku)o#>emaY z@KqUCZ-rJhp02~mp=;DB#0L{#3NJ8I!qP&~GftSF#4#M+@XQS}!4u46Dks^0Lv{^( z6Pg9DY<=B=rogE|{PZ!yti~4nkys*JwP}{a=PMv=GaF47Xp_vax4tifKvI8#d~G1u zRpaDvCt4}?H8VsGSP2^3q$d%@(pYj9+%u*$)}%D?01veupE_K(#ogh1w5ox0H}%-~ zMz{Y|)30Vz4s#MyVeMdsZFSxq>UI-Sd**9ZmaG~@xJNB~;a7@tv)aJwti?9E z@*^Hut@-}ycAxWDUpb%bFl^-AkPsTPq#YclaAOP`T_$N-(tFjUx6~0aP z&{lhKYb5h0Rt&z6s;@Ame+hSabLP^Q3l+fnrVoIFRHi8o(O*%d=H!EC!;qPKy`awv z);INhgEfS~dZoypjD67I8Gb}WF`Y)|-gxJM$x^-zNt<(0J%7P&w%=ZPP>EWG0%TsD z%lwOXQ>SMcGQi8UzcVorfSQK0Mx{LUf-OCPe~L&+bbi_7Ri5*euS$Cb!S{I!8}JCZ z_qs}x^f?FqF>k_G8<0V_>gD7o3|Gb!to{7W7jH$r9^#|bS69p;@SSHku>~VLhk?zq zy?lyX50q=9>DhM;IAbw-?wrgP!e$yXO+$zFV3^O{F@NHjZ!w**Ym zr003c)Mr9q>t_Oq8a%r4@D!hRqgfh1Xd;aG&;N9Fx-P3af??gKbz`{>jyu^qK2G*| z-rD?sWRorC|FaAE^TGcIBfkEe?$7c60WHNEbz{?0Nkv6v^Y6F+=ekpqD=SRfGb)T#On2rqKN~-{;ZktN2eQ9sEQ8zbkM2^F^KsC;zX6nF^7dM&VSx zf9%$ON*#qGpa;_2IgB?-K1A7GbARK@N;=!|{)^0VQg6*yn!E!Scm5|`4Oor}ck?Pf zC3zD*@(xP(KV`RdJh$7^coG@|j0r`Ik%^rMBWnEEqRqfW_*l$LAP1D`A;Uk_8fNxG zA+1U!9g_*YnaLk928H1RHOq|O92awyGq^oi$Da;21}7_ zWBd(xCn*&0A#8cHA%*6hkc_yd{bf{oHsLDA$OevelEwb(0I}t zZASyu<5%zOi9{0KFEp~KQ+bH6`_>P_GoZ;K=IUXtsr$A_cg` zNUK?ukhUwihDr#w1b-+_YR6tt;66_ETDC+MdR>i~xRs&{cXi~RSHvPK<))3ec39`sBCgYWO46cp^cRST*}eB6cN!6}v46kGJ8@1m(=3@?^Mi z!`n0F{zC4dL55eSw{eE2(wtjOXS9@#p10AcDyan(LsH$_}t%b<_X9c_i`Wr24O9{r& zB6xLSKkCh>Hi~@Lut!(X_)6rOs<8pNpgv76mCQ@$t#)28tIxno6)Ee`5p5@y{Zmc@ z%4q*#rHICZDrQI^v!+_fDa?NXJj7_C09qQj#b}xPZuxN+eXhOvhh^rGeQp+|nHTC| z4az|;WznHp-|HRo9984gk?h#OC6Ovlx4Fer;J)lq9TS)>n*1Jn$0~efV_3+@sP6+t z`od3%d}VR%X6X7GztA}V1x;1c=XtiMMO-fpXJlGDqI5TMjE~KqCu?9{p(DCAiMp@O zde3%=HE*?#0R8q+3}UUrc^QUAQGj^*MiFc?hrKKF-Covk-5ORp7wW-LOfk$#JUsg0 zvk#3<_R>_AXqxdxzHOxyvt#WC0R62v&WbYMpWFId%rk;__T;}U`67mIckk!hRy8V2 zJrieFtwQRB-B|QDYhdGAcUF7ff2QIPXfFJgWn5R>bbol+#&blcZlvLu^qebQdPtP- z1D0tg>J=wn6GQDL&YGlV3RjxKz8@4V9cy=S&0tM#GCs@j=sEMoDM3;KQ?-2wf%S3I zf!4g9AjzDdm#ZcXf&EZJT=OsJT*1Yonu&BMO`$c`cHI=?q+#YkuZdASk~>iJmTbx*{Y^1{5Cd?odz^18%rxP@N_1GR5!&hs)( zZC)*Eh)&qTSP6DDd*{Enh+S_A2=oh~GfliOpxM;x^L-`_T5)f+z6yK)J!y8hQ`V@% zRg^bpzbxtSy6?((NY~Gi?d`XN;c6B?)CzvXIE2b_*|fy1{==+l79@Z^8AYF~jKbxp(Dw_g2}cvj3697IMWVhjF7i$=##* zdmZ{AxnR%gr{ZaQrG4j(Q@w4b0@XR4R;hC1`ya}bh6}erT5|~n%pM;YAuYWsdP>_U z)hz1h>R!s!@12)|v*i2M@N2p>+R#$QK1P3`p(aBQG>T%c3ivyUSMpz90}} zC0-tBJtCnmN@ZU^x&eA`&HZCK z*dkAp&-zPiyc;r&oC?d8<{of6FQ|y-aEsoyzL25ZVmZ$x*>XW+#z$jD=U#o{j9RtJ zcc1mQ8}^2D?kpnKuGH~GAw8k0>Zd6lme`AWBitp+nfGtHimnf;&N|>0fRM)`YYV9lK_|veAii|*Z4NK+ z`||!?saL+~1s3UkjZJ{ll8e)hRPmdV=J}BO2jn8jzO_X>Y+!$-Qv>S@0xr zc8^4`Q9X+}p!bLKi+s^LmRl4TcW<3ZSXF3H%If{V%U<+BIfFB2EGqR~*f{Dn%ic%} ztBNGk>ub}smLXNas;)fiQojQn5#$zAD7qv6S*MSK)r*&haZksef}(GJ6y1%C)*|;s z@nF6a$yGLfu;d%ulTt6PxnqkQFr&)gQqksC?R$gQ8jOAx{AOWfF{`Ys&0;;J2(yJi zS#^Z+K_{8d`74d4nDdR~a#i9+hOfo8||(o4t^|2%d zX0U5xXqz=A>FvoB*Rk4F_`OcDTvdNj(tk|cb5im(;7Fz$mddUUdqo+2)ZHGP|4r8L z)o5clgsk#GYYj|qpc|#H<}flIj`?Zf2b<|Je3@F5wbHWvwy#}g>Z?!7C+6IO7WWeO zD7+77st4J>SXbRRR?1t($_{K|z&^M!-fz1C{K-5N+N2&Oj{-tj=iQLwF+h}*Pal1b zd z5aa<=w+o*?PPTjD1{be%Z|ROW={ONq7=wMs0>FA=BB;$AXzj!N;aZhJ z(wIcCwnOKk`i+yMV8wubT(p;4llr^-7n{*f8?TuTyPGIghK%z~W?UBJ}j;HmB~#}=JcRZD@O4?m`zEn=_ozF(j0NBdxj>>Q-D zzj4~(a_ouHZ<6~}HU}=kG|QO`ywiWh9JTggga|cjrbpK5@w5<2V9!7s;zi&l8)JCc zAVc>O*@B8f^9w?X?C7RyH9m=@Nwu>^m_&TFao(P#A4qTfYzj)HZ(Q`nE()r6XxTGJ zha2>qDcytd`aUT>#@}62ME}p z)oJ3xQB7lmGQra)rZV0YZ)PjC?z(}zY|po67lRXFB_|$n2yd?0Ak*AK1BbxxRSDoC zEPWoeYgSEUx0DBAADE6oO>97i!Hgs^1|2N+Ze}DRZ&9gtioRCHu1L}<%XmwDwIEa7 zRj>^5ONms9H!{(2i>Ds<(Bc#CU zQt@l3?0v(kwN2NXKB(0)vw0n(JRTlL!dfdVWj&c6+GgHjjaMs^U7K_cFKk0!y<=fo zVLVe+O469gJ^D5@K46)=C2gkR4KHWd8{kc%SUqHK)T|mfk2pqK$E3g4QrWx$ijlMRt|RAd*m_|6J6@xteB!*>;Nkx=nS z5>%|BNmH2}s38`4OcWZm99A$Ox*6x32Gsk* z5FJ>VW9?F%d-JTY3Q@y{W+kxm0p0$GJ+@s_v##r^#B?>$5Od--eXehjg*r(0GSbo{`ZOF1k^ zUV(HIw-g>1K^WH^ixx89dn$R4?75e{)JO|xPoUB}ve{RjHO~CuTJbJzQgqs-*)}?>E=m#Jb5|chGG+&cZqd#|twG zZ_#4gbdw}Fo=FSf=s@rJVz}?2?A_2;&cd5Q+^y)Z>KjhNt@thLFl=jcrcKU4&|b6k z-J5-|hFo7mv+r^nt_dHm-uZ6cI`T_BCRKi3kkZQP*L={mGI&adx43y?z^-?F;gWc! z@ae>1-ce0$d~GaqS`q!-PH~&1%*adlW|JSBv@5$^x(h`d<3s>9s4?0O}Nhf7T zO#<)zlT$Bg3*%xZ=r9P%$14tc%i|}WP2qo%ZI5V5*_Mf+;Mg`Lw^k>Zj(v_^K~uWr z%?s9f<2;wT9}$coEn@q|2D`b?LG@#|tdSG!16L_8+pkh%3X(!|q`>V)gAga$`$B-# z9*+-3)eT_pptevckw7zY_}r@^fx+iE7N!nuwO6kJU3iQ(0rLm0QMNPo{p`NTcYNn% zjp{nmaTexZYqLq*lx+=}fKXXmG(A*0 zQ4{Sup9Usdi?Wc=b1a%$c>^nJNnKdD08DkApiO9=Raxord?BiP?p7+dDi-o&es0@d zjI9H!4%S1`1}m=+cKFO)lhe6eE17^f+r?6yx$_w~5$Ckt0lMr(%0~ zwsW0KgU2t%ZJFV?m${rNWjDf3S2&or0shJ&7l@w#19Mqm+apjz6y#bJle3U*?9_`aRZh@K0LuUY^nf#{ct09hF$x}|K3x3wtY zD=;?bu7c`;{=^E(mS7aNP-I?KJd6vVlh*3P0GV3QaOdVBzPT{wlwuYw45fuF)PcO!%Q;aS~Kn@8HZ zEL2U>tnZirTD$z58fmV9AYN{e8iU$ZNHlYEP!?x~7G8sR$HuPAU$j*S+040ApEp$8 zv0gho#jw1W{oPjUo*R2;Arv$odZ+>(A2bvfEW0r4g+F3H&ZT!G!z%Ke7pDonK@;p4qGODA|#FFs(D9}gU@3P`Ad16ZEO7+?D#2@Wq? z)Pw6$9*$F8HK)RsOZ6QhioEO@f{hOwUo)K#oCxjqI*w4G6=8Cd1K2z*HJtVFcDGkw;{rjoJ=6R=TV19D(kXW+auHO1VQ;&Oax`4m^X;3F8C zGrEmyVA&hmM#{~RErxd_-|1!ecJw7bplq%h!+((+g?we$Ob~F~Ir9`-CUo)JeelgB z5#j|Is-9qNKq{tP#f#Slzn}Vd)4*pQk4Jtjx3!j?S2_=NA>6QI$~8+a+%Eqk4#DufTUPH+oGbh{~~CEz8iY?{L%02?jLd>k|5}Y&jC<{9Dma zlOn~u;oH&Ad$LMv!MH+aUsf*c+H7~_dZubkzoiljM?BvQ?-_!Q)h2F7{MpjnDX?nd|A_&P_Bj2G#gMZNTf9fa1l z!=IS&&}{lPu^{YwLZ z7u(e+1vf0a>5LI3ZkaA}J~G?&0KT&joh#}M<7Q$`nqb1^y5A0iWu6n+ZEJns14%7= zXVy`CNP_mi`1HaAe8~E$;*M$P2`x`lMtZEO)L6>Pd#lwhOA2kWs>p4bDLhRtP!q=41XqV z<{Ev#vHI#lDKGF;D_hw+&W8Q-fh5bPg#@{WRjql{i?F@;e_I(Ub)OD(+e%-$`gxr_=RaS{w?tYd16~`iP@Gwk z@tY3sxQRwSXE5GcBUz1`KXmt<{EC*3wV>@vgQ&aSkP8C5JKN>eHp5Xl;&Kc_8D%TA z38lY2Z!f#b`OY)ysl_v1zjo-Y2K!p%f<~=jfP)3tn6AGcD)RqWFWJ^?jbpUwWa#v= zEyzmwbDjaO;F}Km^xfd_Jt-x$DsAl-8;D(Pn%1QsBFmi*R=9u;!%qc_^DOu3(@h=% zDmOy)17r*_(Wg>k)D0vvVH(B5Gq}X>UxMQ`WNbYTR1;&ln%9MB=;(_0Tf7puHcKS~ zung%W)++7M6op35UZ-=V$4p)sw97EjTc2!-z;fuCwBW~yur^Ho2W$ul)fQx*{m+XUmG zi1luM!Q(KjHA`B~|8U7IciU*tw;AhAjvBZvBJ1?M^rYrXQGH;t_*;oL!t;X=^UCGwk?cj` zDGYlTE>@2kQGITIqhJ0DsnL*dj_tP^|Mt^B2hK$ju}y2Wa^;WJ$DkPV50Jn#+yH{g zb8~KbcW1)tz3M=+5pvr`jVD4wZtg&eq|W=nTSMHW{S5L*f1sv^k(HwhVQi^H34RBk z!@SNZ`49240_F%&AAnU%#o`q*XoHtLT~e;HGQ|28c=#LI7UV8?lK;vC_*(2yo%HEj z%K@Ke-N$M~s3N5k-|x2Xqida|HB9;O&2PN&XLe++xZZ0g7Ee#~9!=={om4Y|Iu|F} z9OoV6yR|wNs{rc}F!#d+mHAdW!?H(#i@h%8sY60i+3xE|oX(-k`v~RLNY2ZjcUU9f zRmoqKazhu6-?pwkx{L72CGR7MP_abFS-ODJ^R_Ta(E6A)IaY#p1IVH#T>FTKs*|w=^fZvoI697M@%B-p~S@w2!%>{1Rf-1PE!v zog+e4^IT>?VAa1V(5&7lp{orsPZWl*43IylEiOc@IvA@(BZfDQqU~QYcRwWRx=AP8 z*kk**waq>O%*3*t^=8h#_Sg(vB3>LT-?2W|FVHFG5@4Dz|G4v6t9X$%*>=~e?s<{G z#O%}eg?$a_<8+N{U$U}Z$L& zpKkbxwPL0-Y5^UEqT)*#Mtm*7_W2@&x0w)s;C?L7K_EBHxK}TKkx@hM-b@^O|8U zGz?I*C+DawYsWf!eRxv8D&!J>G&Hc^&x_!$I^jz5-a|KY&<@gJ5<9mhaT4|@sqtcR z04*-M`-H9==_G8mRSBKdd(p`GfcC7Te*We##=Xr~CB&C2Cjm@O*L)a$bc@BDS?-L+ zI>3+VbIzMRSecRaoM}txJmpq+m_JkeV8wuQ(Q1c}H&l$z#$dD9c!c@BP;JDHZCs?v zq&DtJd294|sI@?|-&5_1vI(o)(h@a`@jc}up+FUe+43pWp@#lKuwpqSg~9xo#lTQc zkdx7)!Tbf!BD7STeEifZVEt5|?)361g=Z1O9jeS4{S;l$WbmN+d4a^p9hNO>;ocmYnpcd$>lm~` zJptt3t?}J&wuS-A#3{>evzB0sY~ke@UhUevmyz?iR&y&q9d)ys%ft6&B-`z!@%5lq zoFWN#pDCno$o+)p5g^r~wzS>%BL)q#S#&*bALnOglJNlK7P$+b@je%O{@zw_+VQRL z8F)|vYIGF4;_mX!nZ_BjWw4VyauiQ?DEcj%!BgC8=b>5cK2aP8kdQZMM zzNQ)0b)q4et+_VExufI_k$L=ua&7&rqtkW_q2u5?tB1bIJkDtzKg#jxZJYBckm&aM=KJU) zNev3Lmcx@}jn7Ae#4o}&;=~V78C#L2SRUpLtDR+%7$;YHxlHmtsNU1Fx^n~sxay3D zwCo4%+t$0|y~JPhB`|`@uZQ9L)*xw@~q>gualSrUYUU6bh zg>d{{(22+&Kw9{|H&Sd)!7`A9@m0t5nG{{v_=cdE?ic6{gYRIpmliGk$;zo}l#lW) zJ9kJ=Y2@XU@$y_Dw~Rj@t**n{{T@x{CZR;mSsS-trcxgxx6?bCV!fpig=OfoP^?g5p#ggc5J)_6L zyH;elZf>7|V2;aN^oNDUJs&CEu4fB&PV~U3#Hw4j+=+A-GA;6-r%C9eVZv3!?t4ED zQxaa&#TD~9E?hYRGg|hyos)I)&6NzU->nNsKtiyEa&2Oxyz-NFzF%=sYR4B(kM&*_ zVd(-VV*{qGBM53{A2V;=lEJV( z3%K_jZ5<*Y^;^~PErAb!Y;@u5ktjEE(a=}4&o@9j^?@<^KGQ7X`gVV=Zc3wP+7m?t!X{ z)iPXMjES=cSk3yd1a*FUrPNPL6=e~`nv`*N84Dk7J0nD7YmunpETu0xg*fozYf#(s z1hpFk_}o>u=_+w<;4ipApLUYpQ_+`)`fHt^ik|3vrV7>GWE`){K8zV#Mc?DxNJOfq z9-z)={j!Qwi{-CKW2_W9yaO>z81`1NW+>xgapet!FSnxb5udpy`mTxxJZ0|Q427$P zDNkBGha7{0SngDgFB@5N+^wdJ;FF_2f5H|bf8M`K|%lmgy#IR%w~KAwx! z*O(l|yC_XGYce78hU%9uI*0!RK*gS&hoh$ORK8+=+l-w6S;4n5nhZfAjb-=F-UWD` zJa{x5iM4bUH?#|(b_XJNWozgkoT)7yPB|?l$3mhnQ7&-fLc+nQSGQ~YV`);*W27~# z_=WpSqO^(k5ZPabW06P?Db^1BU0E&_)a}<3nGfpHNQM9$MLTN~;D@%=fck~@Z-aKL zW*z(y_vRR8Kj74$~$mQKTtF^Kpsu+DB!pIE98|-z zt}Q1>!v-0(Qy#v8t2YJL=ZG6=&Rn!*W?jDR4dg%byC&o!q}yuUndLJ7++Sl8@HGma zI4=$O-B`bcxCbt>YNgJGS6& zF0lj>$a;P6l(uf!gfMHohRwXxsL&H!Q>9{R#}rlUXD%R@3{x-z_rbyOysE zQRP+-@EJRmd;PVi{T-ci1lfM2&BT(s$e0LPzUV^cjX}*!GTTMBld%SRhLF_9{6!B0 z@9t~_N7;box~`H`j6&zUeR3Kx#^40}nbnnH?Sr2a>VMl<4{A%oOn4@3SrsKrUMT|_ zt52Yh9u_;_wzcl@#Sct@j5loIvky(BvoCUm!FeH%1& zdpj^8-b<@Qh;%N328>>+f|w0oqXC&|`t=5v@p~&DAMhXe19l$p4P1aPZvYQFWa>Zf zzGuo)vH_c;%+{oyeaI9JU1Kueom;NBrmS#oC7EOqx(EGUpn2uE5?2Us)jxO5x{X#= z9`zaMkR7}x3~B-@XmYIEf8`p@f;yD>=$VfCRr;hb@I)@TlYIR|NHb1d%$d_dIZ^_=t{lz ziE^_43jo>zK{k*8p;G$zxStuYYQeX>9edjqdfLTaB=~Ei3Ufc;`PHPa;!TOyvU4imtChCK z(wOMrbc9QS^7{FyJ^XF?3MMOQ$H#QO&X+Ho(!YY7B19}*sK~UN@N!1Z#jlsY@+6a; znR>F&b+PsE>;zl|d0-3Y7)-DYDlN}8b*B?1-z#?~h75{t?v*MYO{cpjXz2gs>wE}Y zPw}QzuS`ER5TSL_AslZ>>_-O0*PPn(?7@>YfW*jh#+vZ=y0#mw!V}g^;vA`*pnpUj zl?0k5@320JP#%L&BZ|NTZlb>%LXQ~uGpy{(2FrP=C01i_<&b^Ape1s?$8GhKZanf5 zj^J19T(D$y$4XRS{B*-NvU59vlhs=m7+7ECv60mYmL2y^clvvAE!)Z$k#lv&2hy*H zAaACKGeJyi2gO3xVZ+lcZqIA`2`X#LeL8mrX{l}`0Y(@8uPeyYh*XX{8Z9LQv^#k@ z%IY{U^##iP)~rLgEQesEz%rMr+m`g#_b|oxHwuUiDjlr@Opt~WO&Y#HO2aI{HD}q% zh908NVXxBgdgMisr(0dESS!uMTYexkYbUq9+svFll3e}Gxp@vNr3ml6TReK|e%V@9 zzl~5JxPmd+P_gr1ny-_gY^!c=q};pNOKQA6XC|{!*}OOO$^_7h-BHLHHO4Klg+Ymv zP3^>^#?~Qnd&N!(BO%FsMoiLPUcxsehPM}Jz5sDU%a>hvsEJ}~%v^9hz0M(cP-Njd zBhnFLp6|d}Xn3>dsJ4T4j*@)=fw`k%9R|7G)+N1v!U9Kcp9Qa@Isk7ORZ4Yfe^rN* z%s6RZk?2UPrQe?oG1*rL4wcZDtURY=v>`;Pf?d=s#_FHL)9#wOM~f8g)02eYBC`;8 z(%;c;8S#AF9iuEqvn6*C55snpzh9UV54&52QIH`K;Jq}?wrdPjmwPoA$Gr_)6kIi7 z3#Dkd54NXBk{)43>PXrZQxm9s)$t_ahLI%!HpZwWyQnpyDUr535)GHh=I-m#A}85i z9Bx?XY&9(}^y*vU+`6rEeK1aHH8Ir+gb8BR>SmcrchK?8o}IgG30ZE!da^~WHA#}@ z?u#Y7ef~%gxu!qjnLd87EB71?>+QM^Ev>mr6zUeX>!8+@1tzXSu_r{&5#!IxkTd-l3ZKLUAK9AsOjH{&$s>4;ID;c> z*0$68M-@xi9{75TzKT~w@OZpOVy1 zLtk6?#ElO?OMKX3bD&pJYPw|~Ij3SPJo6t1X(jtxGID~qK0n_g+%vr@`S&1EU#-^Lpdo zP^}wUkN^gvTFu^1W1Y&vdrZ!@Jr;)*4+0x++PjhUTl77)K3A{&&Cu{b3nL(oz2%Y7 zxD7L$drpeG3O&HLuPO;frB}N+bS2P4)KccvDA*~U`q~Z9?<1le_T-`A+8GPww-dM#p`Tl4a5?o-w+k!OMn5mVX-U0il|QcbHhGvT8whO%_mqFM z=1ioflW%E{{c`u>dW|ls}Wd`v|>R zaeP!pzH!c02cU2Lyu>fiCivN8H48LBH&@HM{GDQ1d(5dVkFe@geukUsX>`OuzcaYNmwz>7gPgGAbEwc7b13wq!O zb#>pjN-Id3Z$XJ0N_&k;rlvX7&@pI{zG90!}J-v4907| zfCBdBF%CR!18nXQ3FI7vsw$e5O$%_%>#M_(T?00=>gj!1WNsdG@Y8H;0?XO04eUlu zKFNAy_n`Rvx1^_^Fasa@$pA+&f8?_)qK;)OquTZ;BHu^rw&<{+wJYBeg|x>UO(|Y) zywD)joe%YWc}9sBxoVFGKAty}tU?5Q)Z;WV>T2WEtXp3d6<1E^4nXodagL1eU>QGo ztadJ^fTb~*Wu2O=LcQ;EVU0lzax)u&--U5+-<3IN36wENuuE{`msMX7K_98}P6RZb z6Uj7{H0uoaD`iwTWper0Ki-A=fl&Mj>6lw>?4e_OXr45gXTYtaW`z|9O zH_4`Jz~%paPlDx)`5a|NIU@X}^A<3=XXf3Ifo9_e`;gv<&niEqk|1nEK%N;vTlsp} zhe;Ckx@*=_ubqC2_u`C_=qSuK5G$zTd;nXSy(bT{lz=Oz8i}gfpXz^P&F==#Hh89Mlm;&3mvs$MQ${K<=kV=ZGW=X>aMk(2-D~^_=wsYQ} z3{DV@qH5ml1pOru6>t{BO5lwnhMK9tSOTXmp_8q^ymZ>xyr}yIl86PEv#Z^1an)$g*_@(K=-D!w_d9r^Y=?eWA~S zD==%+_aG7pgY8qc-TDHv2=_yK)Bt{N^;_ok`C#Q>@Ves`}a+XA>m zn2bUKKhC7(b93k{BpK3N z&inZJH2o{R-dgAI0h(9f9nz}J2Yxdm71l`5nN14UcJFjO;=oFAwn9BBCf`oL+yvlTYBcY z1~#AC0IH5Hqu0x^;vwqmQxgFq<1SsvtyGfNL8OGrQ)T%NSq9B00`GSGO+I?+Jbeat6CIH;DpG>{Ey8V_+nK4 zKX>4xR{qL*!|~q^!tZ7ZderhCXWgHWN{Q@%|9#*8Wf$u%R(*3Ofk70hzb#5GsbS0b zU&gSN^fkD*j27d#izn$#pI9=R(uFO%?LO^MHGW!)ZUuk`JqL^HqMOHhOxwEp9k}b? za}A{bwpfY(PB0D63KM|{gMhWxc(N!&>T{fnfYM4@xBnpz>FQ-aX56*(Kej!2_4h45 zf1BKjd)I$Dy^UnF>zCU}J$a|+XbdmEZqR<&&FN8#?z=6rX)+~`-HIX#ee>_@({y#T0(EPipLl=Lu_xUer zYo7(TpOOMKAAM_vK72csZpDh6cSqL zKtxi5xB&9{f9E^^OG~jw8hklwXaH1GCHB}e2-lo$ELR%G~>C7hdV4*#kqkC*DP#HQT>q9dkaK>hxj$-CThnDSVJ0WqOu*q`gcHE! zAoySeljSM`h?v0W1>Al%r1{5y63tb|fm*tM{OJf<1G{%5)6@g72zeGj^>s^7h$VUj z_e=m8@kl?_6M5Fx^k*j!sjrIq$;Q9Z78x&0d=-(YU{gWQAu{hfIY4{n_6_gB<1-pg zckiMt>{5^#;-zo8=_|2c0!q{ee?#WGS&EB`w3MAOTL`xAcG96?i9K>bMMgjfXP`@$C^1q2tA-?qIx#Cz@7o%3eC?7=_n z-Stn=Us87eCVYbn)_227% z2_sC_EyqC5QPvYIXnPDTH&B;l{b{N*9=OJ$o0^~F!MO)wwBxB&I*c{qIqMhP9fha= zHS0Z*`0MRCnDG8mhE4QOW8dn$*$nW;;Pr4Ij9J-;qPHV8YT}JR_6uvuu#xz(5@ouO z3#wZeBrb~5<6VHnXyzuT7L;C($T;=kDXkpSHZL{Xwy5Kv?;j5+wZsYJI6WG+U=2PA zj4+s$AF1QdJyf9c?!~L4WT^ix>8*cdbH6P7vpG`z)8WH->47yRq!FAiSqM;%J_qXd zbI`*>@WxgEpHAM(M7rrdk8Ib(OkX9#-hM{HJOAmnq)~bmXRJ>nTIwpG>X8Tz-Q;k^ z6Q4(5pt}67JPlJ7@kJZ7J$vWSlKiBD1tmUY1UIYB2Pqhr!f&E^yFbj@8+Dd-G|zq! zStMA&4%gyxR#!qhS9~ymXX)_s3rD!NxBvPsX{l2qEWbJ-Z-QJ~N}R0s_M91i3Ui>~ zDBS3}>1}XY-7cJ-o%Zz7JGs_I`beDOH2HqP`DdG@ykFKM7gH$EcZ;cUd-mN#>iTwf zgABwtU>b+uCD1O3&O4LCNNl1NT$95hrsP>3j4ei|`he{|#Haac8pNFozSoU6Yuiy! z$!o&S9D8itAg(j@?8!Y|dvAPXDa&^vaWm^X?`{^*N2rMOH1!iCek~E#$A30M&G3or zbn$)~#D3bYQ&3Py{I*S<>h3&}2oa@3uhDEs7dC4i^a;^OqEj^!uN!a0MPQU0tqMq3Ir`$_6iD??XueP+T#_@k&hIYSAF7l)VYnP zG3a>|08w=Fd>ke+#D(#Ga2bQ)1NQR2UBX)RuP>vN9my?SuEP1YMFf0HJR$2*2>^3S za&+TA>6(T5)EeFO#4l!k9chd>%KUA0J=4QBTUCRXvo_%qfFa{z+mo0>$M_B%-hOTI z^aP9xr?@=zmdh~@BI@XqsJ|_id83HFlpM-Vd+9~0#>@sx{$@}=>{hY2g|A2K-NJS) zc4tnr7^0u-oz^}0PMu?pn#I$l;PP~}P$R*;f1!_`Myj{kUyU&yE6>*QYZ3%RQ{tnOf~U@yb(of!1shhtsPhRQOxs1px{O*c%5t(!gU5B8CbZC)lTahl+`Gg?q=!u zN)pb+DxUex<&EvSmRR~*vy>Ar1Fh~O2V*a?6gyEss#|;5r6VrbC)jJZ>Y6jS{XM(r z9nPo8R=gHn1n0FI_MA9GP--C=@4|?W+~}tN@t!V_VN4JWYf-Z+xs7TRbeDR-{8#4< z=GUHjW48-?pXV~{ZbF{YL8vQvkxM2D)U_fVwTdl4MVbz5=m2$LDk@;8d|$!f%7HyX zz@vbMf}IB_SsZb5NHuGE*xRPF+Q=Q$-|&dL?UzZgqVk9?KQ;|pV9lWC5}HYb{l4$X zF=rrzgVfn*Mi>p=Oy}d^j?IMR`EwEJc6ZL;lJ+DKW$p)E`Y=bkzQnUkTA@#FzP$48 zn&A1}j-B!rHW| z{}XAV%f?9Uwl9R{+Y1#ZsN9$pYhaDS_7c0MaPQY!Jip)|sR~W(mW^*WA2BSP%yn~H zPrjAzn)&TY{Qb3#R>}D;{~ZJ%KpnHWk3X1P$6UY1ryyt8-=a)E*FvP$t*QC=jdnR& zlUFlOc^A%6D23O}@n|YYZQlCJsIG{ph`#%K#n%%a=k&3M?;CCq!l)X8n{kywwk1f49x>qW@ z;CC4kQ`ym=$@7?&R9lez62mZBySbU2(p_8$>c}xkZZ#yMEf+wXRqPk3Ro{Kac&2&5 z6V-#bHb91XT4sMpL>o$Nti3op+EFi`xYy)gIGEl>BQUdxzV{p6Zjnlor0d~@ULiIA z>6owcD9`T04cf3FcQM~zIf#m*^}=`7$;1IdKgn$cj48 zagpb6zF`?3W1f+oAD*y;S}@x1jo1s|EU}KVnB0mGFyic928m%BRdyt2U1rihJF9?* z_$(E^OcioFrS~^#XamM@XI1;G`2x*wrkoPo+wcjU96$F!`|?=5T*ysi(Z`r4rp?JV zPd_}h(06-LXz>)PS&GzOP^-c-_To(lF%L-l+8B9-${8~8nBo!BtW*4@SM|GBE~2wm z0S+KNpQlo#7Iq^dgofBAD^2Uc1KqNemf9hC+g9-wb)MfRip4)lR&wMpHkB{l!SLw~ zg`76D657VHhhI3gBlS4>tJkH)A_1(Tp)ab&W(rxWG1=E42!S%qC)&9eH@((gkn4Ev z!VRM%_SfRd+Y6ea^JVA@H9JGUuM+Bi!6pZslp3fFbqaMgBWgD!@^XZN5Jc6P@i(R? zgE^Uf(Zl)iS52;X3-sR@O#ZwN|Yd1cz$IN#*uN>AEmqnEnZfEO%R-d23 z8#^{4ZE}@=PkD5I6Vwj7&uPnUrL)Eosq+3up^!ul?J$Yc%z;%IV)7U`s z7!HbAu~z6jiXw(i6lsg zqA}nmbTCYMdw?(%G1?j4R5s}Trg~)C%t4i1UIdv(2AGllI1_B6&g!*i_D9~mIf(;C zCPI2YC7Q)?E2XU)%DM#PB3iM#bc_VVFM(N!PPxN?90$gxw?P9hU+oBPQm+Y-YDWtV zjf7pw3)!?h)pX+F8F|EfFj$r2N|kX7C&Z$j+15F&;o}{EJ==O|F37ka9W%#11m4voU3PT1cGx9<||hN zTd3HHl}b_tgxIEV+~ZAC7S2@i4nSXLP!1n@r;T;^DTfABcX#$QlOI>-E|wn4Mlym* zpr!jkNkiZ(89LFNMa_7Nu|v)50bI02*5p`5=5jJ%$rbHx+7Xy>9_P}ejamCE`1?sk z<`4-)qNGlb+Kf01?OY1M}0qohELc@=0Um#kT z8}@(kl0^lj@Spdxz1<&TsgGkpce!HvGj-?rrXkDnO<6UDmD8@F^o6dqaLw6wD&G<3= z`fAJo1{O$<{oY;Q<~{P+{&AiOs!>zTWVR|~bT5H_ zUrb`1K)l;=X6=r}$~+ejEDyLe0W{%nIqStdw9V{vx3EZ@CeDz~Jll|nX{gEC4r`Ph4$2JHL9X2HNW%hk{^(O`4+0Gi?ST${m^VB02U!(v?jRFJj_% zA#ueQUcN(Voa#GHf;YW%w%`&#?iBnzaFK=wIG6l#nsM!-JHA-JW|sfYOu^4VRhK0E z>EJ%m6Xmn?%2(#x-dU|`{Zi}dyimxkYT^00+a?zw2LF2AGg zbEk?koLY0tD3{G2qg9SytWf+`?2}7utu5NR7HwZ^+e9X4*|EH(#^hxSEA!-h7^;(1%OIN1MD@Ojtk( z^oRAH{crV9TE_8r2 zHR}Y2#^{@?KkYuo1J^<8#B0x&S~VUcEBG zgyZ$aTb#f!4>BuLv93-@5G1VPN&Su5cwbT|3A;^!@<3Z;>r4JxoCTTtl|lC=fDNUk zgqKVg1-oUNX3cgKmk1lJLD6`gtFU|{sj{>@!ENHvNRqc!_mvHET4tUKeq3uhx%8$S z{<1GMq(TRKyG$5Gg*Zz&4FfPldZ%Tc{o{cDwRrR%>KH-9hH~LsdvlI`bCfUpQ!fI> z&=B@ce9)ii9oXX-8Rv8-9h{|h1B#696?^(6jaPrvxyt=&E-1SNo9KhvnzivR$miUfYigN9)etZ1xJoeS0+DFDfPimvDRErETxX*RjJp2uuHJ#_hKp^F>!`nVx5k-i3m$WCx%K#6lRNlmQQA&SFL{hsJl1T}7OImyipyJv?-j2OJs4JY>O0Ln zFuC$gZx9t>hod#&M4vPg8Q@xz^iT3lb_Bb5;m24xF$H_@;zW@mVEv@~Jw^|BlOr!z z#a~Pl9;f4JVDpU^DQ&f-`pbsf-1!pmM_d=e+kw4!Ao{OJ<#W$KWB0ku4Nb#U{Q;%mTkq5H5f*Wq!%M_#Pv&l&C%(G#9*G2*8(U(| zyR+XVO{w<@cEz`M-e&gxy^S}) z+)aTm#_RINgmcRn*2zz$-rKd(a*$Uvk|Hl zq6mumSDHG@R9BSz$z53=+*W$>>3+?S6(_W{!`e$pXWHQD0l(g-YNBPVQRH8JV2CDb=Y4u+gvRN$|onC%+tZt{mnkf3DuGL@tw`mOyS zk@?aWYA0h$bNuQ)A?r!eC-h%*OJ_L?Cz3TU#GxD#rLS6MHFEGyDI{^+V&1^n?>y{P zA}KT*g6&1Za(!6PoT2Z;V{~S!YZl+UQhkySh*7Yr;R)+rdT}S5MHZ!74ad!KtTWe6 zKfymBrQY>ck;#h?@gnHi*IaAZpFNFiEc%|2^_Dw2rlUZLMdo@j9G6k|IFw>)d)$~4ky%q9{^ z?5>(8)YYGl4Z_`}JfWAJJdSj6nYwyh(kbWl zXMBv4J1Rw`uRHHJ&&o5|;<@1*STY%o(cds70O4|stMKkf>R}I!f5D_-k!wYYHMzB5 zYBnGuwiY`}zDSyqX4Vsia)+Bx$aJsG;D(w#-w63Q9*m&Doq38gN{0?9a>P;a2o`vL z3YD+^$UBXhu!gF9_r*xgwm59NIYUAMX{{T z!-jCxYL?fx^8qC9Sy(fjKX2lZ;d$E8N7C0A<2 zumzIeRgmSk%}*u>V}%|R2Q_3zYSBy&=94h5d#>ObVsVe#%*OV4&zG;&J-N8KQzdE?oh9X7Os9z)iJP$rkN7U1@LQ z73?lU-beN09<|~3zHo^Ibfl)mT`gEovD2g3d!+Z&h@i*=_)J46?qIyiEk8cj}gW(Wunu=X&NN^YgpU= zNPVfO;%hG9gX#`1*BcL4P^02q1o%#x+4&T&^Nu0uC#?E7vfs-}ZVx)@ogOD$n=5bC z{r&3cH5xs1NZVH3P*}lm z{O3(t)Sc_`ua~h(xc-s^_G=8eS*<+J99w^VqOb^C+P( zmih0rWLc+2E!rJ9q<+%6j-wB)1l%b=#+Q!Bjz8+t9d`T|I@X@_2OZM@-1^D=t*wmQ zQ+R`UVMc)H4ADntine40c3RirhhX6aovODbZ>^veu|npnm*i8bR=a9n$YKJhy=JrP ze#XMd%D(uBMkz2wrbJ1#C&_Oe*kd2szcT6j3tw;ytHFbdVRi8FhRzAx1TPXwFgCO> zc5hhy0d#$Oqkhk1-x(3p^}UuHnPiyH;w`7MYwk@Iv_@(=P%FpgY(Fxi{JO%gAN$SN zABN9#^f9m!8~sACz@`G336f^MI8xC3g!VQO57un2D!fByM@fV4Q+=$DX^&HeJ~J`G z!1j1(8fAUhD{tgD2QRhlH8;(o=I+qk%fJKZlRA{-t4i;mdB>j!C+-r&4Rnz)sGmrf zgB0y8fdbW@T?t7M_vQSQK869T(}S(>OwRN7Hv}-7=>?N}e}dT7?W;i3i8sj<(=HS; zknbkEMwyh%Vom~cZ=#Ttv?Z!dVA}HbCCc=04u%bBk1EKf{ds% zmT9$ssaKiLF5f;vQ9u{P;4tH4?pshyOD_`^t1t>89WcU7DZI+o+iu@)IV%N@80sGz z0K0nkg8EOqYa%(RI^p2A7~%#}6%&F)jf0kR@OyH@(MabPI=|zB>46Zune^WKPfM+I z#dj3%J(cbpy*m->41mom)Bq0NlGn$j*Qg8fpdRC3xQ_H=&mH;fyEh<0Of%9>=O{+u zcjv4Ng8YR;kXLQ`E>EU^<;LP(=IL70SkU5yvoIU-cyR{&7#C(iCS`GNsophlpV6?y zK$TPs{Cd#<%s23xt=O;Vv{%uOxSqgV(Wm-#!xJ$&$BFInbCo;GMB}1Xnat2P~Z#e6$JjFj{Hx zWxXz*g+HZFdK=2|`a-~=5BAnE&Uqv2MyStU|LDC3B9A5x&#`$!d=K3|!VVn5bF_0g z;%1rwo_aDpUclMuE`@s?m+pUr)k5MUxw(|=HNm>)uQc8VgTr(%dH<*e-R~yj6cknJ zqmN$y{DX>jTMh4`y073L#?gj2o;c(d(E0z2$XTcyFkrrv?k4O}rdO}4Jbn?H49At` zc(N6Tw5bL1rFYl^h;8kw(ZyVMUt2I1_p!1ma(8((kED~{(yQ-$KH+7gA(>g&iFt!B zv>lNGrg+cx;Re%fM{UhjyU(B(|4NAxuoi&_!sdO>X|yN3GG;%xyei}(9@sCiPI`FM z^|1|4NfA`t=_S6uMYQdfGdi7|b1%!Ps?%Moe!G1@(|aL605PZ(t|k?q4{Eh)`aN;5 zGqq-3b1?cL11i$=1MTkk#n-RPUpSRbFqR*(CS54# zS(^n#jB591^5;pA!q<4oH+2PCBp72to{6T;nA-)zGb3NX4>W z8x&$(lzOrbi>Mk>cK&#a)2S_%RswydlOvm z?Ie>I(nIMHAq!c?zg3Iyp1kuSnK+^yW#yPJ^jY|`LIsDsFEoGtTNsG3F3^z4I>Fp4 zpD7|*6uAOIPvSalYS7LY`MyZlC71TS$M}Q9M1sUH(%sR3?Z3}AZno)?sGGF%2Eo3~ zIyn-?$XaZ`+)RBUjn39@NSk%sKuY79^@O80(9vU(nvBYpk{db3uzrNsY@-be8VA3{ z%wMtn?T-14Bt!2QD;%v1a|4Ft`eyt7p5`sRL1+3wZezn&?e*(r`(3yc4w+cUB!?8$ zUQf;Bx!M}jIgkm{s`Z1b0p4;f6;j?iJBA#rt^pwbos9lAHJogVX|x{^7-$HCAS2Mgu#Y@qj>Rk_l{U zP_=b%5aE?z3aPiIj^83*Vl924Lco6B<0ZU5=rGr{kAA~i6mydo9d=?C*z6547NOqI zEPU<&&hjYLQb5r#6Kzi-qUI+mc^51v)UPKD9|=IlC@tL5I=OYPqQ0GMMpUhM=F6E= zjEanC#ukW-v^vQnOpOjzVj;IGbz7C*|nXyixi1=Y^)L(ZmLOKnWr$8WJf%1*l#dTEys!N!?ub%sooYr*1SLvQY` zeL43_Ztku`@+W$gl!L6%v8h6zE-xuz#1n%g-~xA~KnKuz8V}xn;B)2}3E}Ny+e*~p z=I+sZtIA)`hP^#kKzuLvvEb%Hq&$Fy&nDkxZ3d>tD>De41W7u(-H{P1gMZqK%6YR{ z7l$<1TCgHuKXhtQZ29A~jKPc^{9TlbvOM-}rPb*-|kefPMh1!BqYkeaiD=-AmKX!4HkpE6f6a)?JkiJB2NabR|UF5Y~eH zWD^0GQrE5p=Rg4_-j0YxyoXLSF2)MY9}Fy$*l7=VAN#97oYbW$XX0F-h~=pZGWxMknxY~ zF(j2nJ#`}`bl1gIeO82^487*-H-TiFLaJlfUvc>34o^0}uncK*`=~ehLuRSD*udYG z`ZvVhHgL~8f10TVr_NWk*S{>S7#9O`{zaz7=RO)jQ%T!Rp}r%ZAJ#KdLSGjO`_y+J zXVYGtV3B6r7jpo&%w6{%m8{RS&3=`fHFDtJD+^s4R;1AOrqL6w=A)4@dS`2Q2Oz8W z939MHk*9q#O!|zoy_Ei|_h^@2UecSPUEk?FOi^S^73W}DFqFeyVP4`xouP)8sm+zs zgf5_ts*^cdV(8+rQS}XLa$!yr3;d;&yH1={cT?@>-Q92%kmT8FONlp z_KlX~oXyzgA_i(@7{T16cE)E`LaoGqAk);?zeFhZK{SgjPDl3ZFKGz+cybMn@ktKvBYldy z#95I-2gYt()YTh`Xdms;=TG{to4;5;mkC83>hk;{ihxmQliwe#lZrm1=r>k`!)yTP4#P7CxLp=sU*%q})A`&G85e3{S zbvp0|cDTpYS-7Q0UhllN_K9ozhv%ckbI-v7iE4MZ5mit9tx5R_Gt`XzN0eeWGl-A8 zYKaUonFj8`T)-a?ny6>Luj>n=-f=|o2GZ=^Yb`IIU#$F6Q&LzS$zDdM3LxQ9cNS9U43I2Ktz~^uz`Dr@Q#X4DT zqvC10@0S0wL;(_lCK9zo_|aFRARH3`Wa`8kZ;AWEaAB3&u7TYbtW2{?N=9OQvJ%TP zDFQ>so~aT{1X90qsiv2}@A`#|>AKF_0DCF-St*8Sdus-mFUaiPER*V zLj>)26<1E*oBQ;5_D{8uzk_kw?ZSe+1q0tUd*il5FJSm>b5qPF4RO!|?VlnV4C?@3 zV))@))YwSQySCg~7q3E_DuZS;UxVe*Mp1C;u--#u>6lpE)R-0!|8VUoP3OgsG_W>g zs4EQBZzb0kDK+t$Deflfeg#ExGY;`F3kqBE8oAV0G763^IIp6-ICayGZOl@avTj?s zNABd>A+Y@yxGh$_Ke~cOl|Pb8?d2X`;)9VPB4c8%Crkt-GLMKFPi@@@I0~x-f}GB$ zSX-JZ?vQf9i+H>V0TZoj#pO+P+RS$N4wA0A-?lF#59_ z${SO{Y8Tc1a!FS1yQSpY7G1q=nDuAFGi}tIqstGk`2#Nd$Tp})eyh+0&MD(&9o@O% zPE4Ma`_41%f&Z5ruUXb+fG^A+bJnPDa#e#dgH|J^juL|>5MsEFK^edB`W6*seW4@? zqCnVz#|C}Dc6!k8M;F!0)iP(}9CU>k5V>P{m^32KliVbZle8#_UuG=!J80^&|0x4W zsok##)G;U4<4_?N!EX)9e5VIrNgPI!5*lZP+pU&Ni~yoZ-~IHdAKA{C5%cu3S?wP5 zkmidy8LimSg$tgU%os|6;P}KaX#7xk$D{Kp&P_XX9a~w#?g6BA*tYy{*%)AD1+1y) z&B@AJ71u#B;xuRkuYd7fv^@-;KhJWpq6rj_qC*sj6kt6yFstvV=ydR+#!8_CHmq@@ zgGA6Whb?MhjOkJrRp}mzuPCOI*m61Ttw|kZ`+m=kjM+tF{VTPHxZN@`IV9!kw`7?J%rl_{eC~mFdU)Xa5^2CG za5zar!Ti<hS>kuuyJR*m+Q7_|wkx z9Yw)R&Oysd>jym((_vFsa9~I3t$*(ey5L&c7CMX&%riW+N`+mOx3|N*y-l0Rb#hOt zN!EbrNDRgmFpA2l*lW-*Er^WybQ5~NxWUgHHonj@?|5FkM;>?8i&varh|*Y`i3az< zmlApI*J4~KN3&lb`L0A*Q)*M20~cAlk+xvxD^UxFKyjDh8*VO^83AHblwg@s)gJ;8 zqkXp43JFLu+mjs}iO)NNzkRKOt|bbQ!VWLXvNEZMAz`-R;<4iQi;C=r+2&X9XP3V& zQD_zopSvoKqkWv=lTw)9MmFXVqtM@+Iy;#vWHPWLNstPxAe-4Ii1gr?dZBQoVk73@ zqQrmdoAraS@I!R>I|T;dJmwb8RlGl~P9QvxHrPxg?9+ZSQ5GK`ky~ynY2b~>Q2f1I z5l2hxuqJ6d`X*Hf?va1hLAVhqAZuF-RjOO(2sTnfrZI@wr zMuVe1ynSv?9d>@%LWyL!R{9EUkPtMy4!!YkPuPPW3i@;1Ql^M++?Ib($<)s+NS+q2 z4)#Kh$HF~4aN{H-AFYfBu8Sm{;{Iyh{Zp)_6!uc>)*_xpI9vjv19hMNps=XD!LGn| znb~s^G^(k9H4-$+4DrBe6%Ww@#NgZfVef_OTunk}f1R#R{>4F47%&NQS948#vz;B6 z6tUO~F@_e_vnPd&@QE^d>q_l!qNeF3_F(5f+urGtr$ekYTBZoZa`?V7ktQQ(tfI*w zVW2SUjJO`D9Po?<&_dtl){P*u$c*4zC2ULt1HCBO6Sc?qmlXGQRWzaSf_DL;i=W*Z zYfarQ)#py=%jRKBrMzvY=5$HWGkX8k?_S?;{E(q(#O}7;6+bAGwJVw37Fp3ntnGur z&zE7(HUc8%g1l&C0d7*iJ)4p@jr?2Fqxa?m>@<7%O9f0E?c07_ksgS>*O+YqE|m`M z-`=81;%R7b0g%;(_P1%THd+v_%aLAlpN(UYs^Zh(5c;LWjOk7JvCI#nF`4AT!vLw- z7ppu^&tG!0!6nnGVfaYNP~x6{v3sFQ6j7Y`?(@cI>ChQPliF6`_uRWI5uOnbW{?$} zrY@kd{F#4bnCGU&i(fTsnNvxtogs2mzL zXJlutC$|v!9XW~$mtQsWIaw#%8Db`d3CEG&tnb{SgTOR^m`wopwfBjE{wRokj+6sE zLVW3shQ^`G$6AR{XLhLCjq2P}?=EMSeP)P|8G$^nvR;#uzLSUQP!K+0M0e45GpF=r z*Ou5?IEZ0xCRTPW%xK@kh4O=&TsIvckmFgE!8&+4CdN!moD%>rYFc8l|#C zj>Q1yo4|j{GLlCh^VnOokE{XJQjj@%EKOuuSAa$t_hF|^!iQ!&p$_4L_AEKJ@kk!E z$ueC|GgI=-RqSF8_ub1C+n?Nayj>sz(-by;kwNbth7C!;!+`loj6^s0vg_qUyl4Bfep6t}RmB-De z%mae*g+H^g{w>P`JBp&z4R%cc7RM9`xmP!nno=8R^i*k{VKo%JU_r+c*ZtHHwLjR{ z#9DXj-~3M0>s=VPK-DcBOEqr7IhpcsWtxZ@c$_VXo+nXxOH0Nr7r^cUb$dn302BYH zwDT$gswa>+`!}od5=J$;&(k=UHtEC`+DaBN=xkviMzfM%`8c15$J%!#6dKS!#@++Z2L!FCR zrgNI_9s@)H$OJ%(K`H`u!$(-woBknWc!)XA6K^oG45HqU%X)MLXm^wFo-w)bb-;n! z`ZiY4i=SP9C#*)fSN_{2q;>P5cWM&yM=yv0+JYL;6rg%obz?oeF!P3ev$JtAKE+~DUM{SH0j(9he*PGGF!OXoCk7X>*S zWs|f86o|KsK@c$@HR&9?Evbw?6WnTLuWQehj=^FN*0*`m>h-8!h)z4X@Y8EYkHl2>Kh28ZVCt07}}^}K31V;^j#A7;y>J}G6} zMWj}2Ju_<`S@FKv7A`}as{~s&xsAQEYk3M{6?mBBF@~n%<=EhovXHn}ES{ZPcV&>i zorES`9@xy<{327nePB4SH*brb`uA5*(9dlcbz+t2SB^gS)rt{Hf zO4oT6jEwsXIC)#uzRA;6ajFwc^D;Z23>tMvt>kmUvK%{U}!}oaGqs-P_>8 z!_qs0Hr86}I-P=u=0Nfdtd8K4&kpsrXqiu)0{47A$e`7GTiG!|6-$(ltK74ic9_ndv6sLSJQs`hCm1|!975L;10nPG{L=bcMslZf+qw? zaCdk2?%+=2?gV$I8{19Z_xtZ}kFm$OI(O&P1vhk$wW?Nit!LGmbN=d+y?dai(|A+n zefRZLH%$W~uq3GiBKr%Iw9GR0ckAiVumyKBTBu#6lrV{w`>5i!iuEb{ayH7V7lsSX5OoiP*3BQV8v~p-vj5~3X7XZQ zBqIxt=@I3Y?vogGpO(cJg|L5Y{Nr={^LFV87W3|`sdw@78s=+ziJ1EVLJA`4XU`rl zK1qI1C+n$Rv?1dl^(Fqy2}wE|#Dt4QnMpSFC>Rp>VR7HB9W(P08ZY1#^VSL?%Y$v? zrn72fvphU0i0E^X^%~?!;VP6CAm5lf!Mmwi`@$$JnzfB&xa=i^nRa4KU4+4L_q_GxdYaQ4Y+E2bzcsp# z25h3X8Wd9w`ZG9LL^h;B7?7~cutnOpgB*@whMS_QxvJ;RW7#ZcXXB}FNtFk9qttKV zNW8r%R8oCc!xQe_CV~1loB8W6LPwgIPs?Pt_vUB}uuCA0aOLSD3(kbA(@kK4VO9Eg zzY85P$>{LgtQAS))BnS&lQ<;!rp=M-%(^+?5K##~mtCi+Y zC>6S$>|SEi0RPyu0!)-jW^$>yJ`eTpFVji}B3n%pU%$8KKAKzB?d`fZ=xzc|nGjd5 z%Q`OqcJH%e{D2KiNxOYcQ)tCYXt-6Uol*ZQzqz!IeQ`EDVLrIoxum~k&jm0{WbmOh z_r)~VXp3x274PrS@CWL25g~aF;y--fta~$?e;M{vH*0PwpbHxgkmxxIt=+K%2PC%c zO}^y<1e{<^rfiOVF^JJCqYfWsFu{2H1XGQ*sAZ{ILf(Gq+-Cca37x;p$;asHDJE3+ zB$8lcV{h-^_;yvqdP^yDts=0JDMLFq+OPc3!9o1d`wsPo=7r{F$ylvY`KFCU<*~1v zs9W>1^E{HqD^gE10Y_q^2P48UIoU|WC?Aw%+Zv^Z{gFXot~(_!&N8Uo`);1~5P*%@I!XF)S5ebCZm9_D<1%xAF)Ww9e#YzUMB3mk|sM)1=A?i zxeRULwjHSS1iA>=#R)RtTy6gXq-9-&kf~kQ(ajsD6PhFnQgp0xmM8*~Dvw1z^N$>A z4~b|140&6}$ejg-e<{-36x9ke^HgsuXa(Q#QG71iz+O&~&V|MB8~DEyC76+?c4F2v zMSLv^fjdyv_WI!=gpOnfmF+Is)ek$+Tk6@^Ivm25cU6)Q1cshCFY8xXEmN04Bv%uA z`j(Frt*r}7nX0g0GVG5x}y5>!DK8j5* zd#iItdIK^+yM0^>@b!>l>^zGy?$%rzqp7F3U~-cpK}235(*)p!Yiy4Fw~iM-JZVtK zqZnEP7xHQY_M6LQb$n96SeY|O zUcJh374(VAYBOi-CBjM(Y!>wkoZjuoF|jG>4R$9hSe;q9!MfMQr+o=zMnzlUX%jPGUZ;72QEFT;6a&b#zr&$(4d9=V}`=kM9lzGv`b}D%JmEhrAP*l+WO#iMm zvarMuj)8JnIEO3EpB9v3ecrh2#SXF9yf$vI#4nzSo{ls%^RJC)KtRg!jKx+tbrR%pv=yPdK3ZDWpMTji~CPZnS$_!z)0@w*~@* zR>De6ev~GA#yS-Linf^D**E!7=p?enCSAcO4d*5u4BM9!k(3UO>husVojQfSGqK8D z>{X;#sP?-cb(3@37>#FNNV-2lgO>sd2iu{PTEI4obbg%DY|+6mD4{O!`8C(Xm!>V9Nyk!OiBrbh?S7Gks{ZUa>5}sj(ND# zL14R*!gmCFe13nG*8NdMP2T;$A)2J=iRH^oq6Hf&WpIb*lcJht$^D?X5M|&3gQ6o* z)zpmhvykT6YMd2=5)~cCpd$&?5_rdR2nUOBQkh;}y2sSS5y35<$~w!Oou92qzmn=s zzR;uvry#jBIB1YH&OyXAVn*R~6<*AR&uIy0OD4AVhcu%r&8nm?T^g=FhJSA0d!7E^ zK$tXfH6HZ(A0CkXVPH|DXfjq`f?SvhtVJ^)r=Ql{Tl|!@)Z5i3gpymhgMZDfaNAJ| zJ>f}&?Ht(#j?8Gchi0jLH(uQ&{~$lZ;hJ>VqZ(*ZVt^CJzbL!Lo_3%2dysayQhCOP z!)~TZhqRzMpnTd5nK<0sp!X#cvc+jgBoA3VqcyIe_NeHh0l%X%CyRbjg-ey)81iH_ zWU)f+c#iX-Dt1vO?(62Ok}X{l*FAnV>{b?6Xaqmy=EkL6*(H@M#q;988_eAgQ736q z+u;*68XHc@tIfHveJ1TUN7B$0)M0X@WT_tsMU*JQgTHn{rc9dXcEK2P)Yv=1YmIAL!8%30Jw98CRK;)yw_ z|7xW_@}-4Z+NvycGuWVQ0`tPIqFm%i@(K{Pwu+yShOwoj37%xkVFydkR!FTU5GwQB2U*G;1cr@mTKzqy z6wll03S)?WbohzVG)&60lBB9H^U>opwPAy>S?fkT!r`IhK(#L}W`Km)0^U8rb^Uyv zzWXPn&`Uf1PA|#wN4+J9Agiz^dG#1=AX#5c=x9S3cIP2nz--L%yH-Y!L2L?SKRJGD zQ9#<{2Um>qG>G1F5V@@>78_I6iu0wZGY{ibC{G!??y(uHxq|r;M-6@Erld3(z}`k8 z#UnbY_w*r+(`uf$A6|<@X1+p64}K(5;7~>4IBMn;u7$ehQRa76dz|YZty+`43r4bV z#GtvULqRIw@Z-(4?mH9Qvtic@Wv1v=r&(+*2bO>@0{G%=@*HGo-DJw^WktU=rhdu6 zz4tb+coy_iC)~i5Y`FixMt>&rTAH6xvHlc90U{h|q_hZ!1xW19jg6d_*E!auEoc<6 zhwp~)zQbU>=Hq^1A?-4z{Wl9~ukNIACG$@W)n|$n-Ks@Zvf390?2zwj%iR5|_oOE@ zWw7T&>oDsHmNipmTLH6-H&c8c$?T-T)CsKMK91zumeFNdYD(*J&Yp)4(C3`NW>q;I z&7+_LkF<5klt-s5>u_bC_N!pn3;X}*>49s_Z01$tUQNsBgASE5FCIUs1gPAA%6*_2 z4-TXgFWo@vIsmjj^8wAi(;2}Jt-~Fp^T$UMioVUS`iT6}w7~D#J*w3Pe$@IBw?;q1 z^5pc^1fAN3p++kC?BQS~hU}|uFLl0^+`sw?Apx&ET5$T0VBJ=1)(- zKZ+Q$ns)ZiVs&aQYPmOrZCfsDGn9ySRBqs^8XKs7YTY}y%cMT@OBeqKjCA+kr%{}n z+Nyw#uuoZIhuzI{a}L1@P&>}=yF!~G5?6}PcCq!G@IyVI7KFyuVrbW$t!o>FP>j-( z>bR3oi^Q+r%Tq2_d;6|7otNfpCfY~b=BOM1a&af6OYIT_HMZwfj z-Rezcn|HeRl=)?}VsNdU3DPo7jsnbJM zUn!Nc*KR3uSTMFbq&%VN5mxb;_v1rTJ)pv~C@si?7red~CY5{Cuc2kk>sY&L>0MfM zZ}38=TnT^#Avp^+B%7ui)x7}{=G-qB-6A_J>2`?sq4$14UC`NGyx{u!4LhLH;7V3v zFKB-YEv;P$T`Fm1@s2PMVk3S$Cxv04Xu>G?;=0|B_@O|KY9C~}Xhbl%^}BKb>$r^W zPx=sbCQm@q=|ccN54Qa4x+I(Izr39en;#|@jo4#ET&G|<4rmoNXZgnNnK}&)s?*Rna^72gAa`yRH%5{|*<}>Ws$x~aouSWLu#VQWT_Z+&0|c+rql7lGJqm@AGjV%Hu{bSf>>3*v_iQ zLRqhJHr%t!NUF;kn-&EOBaCJEP{~@#ng6eH_hz2del$1>-G>?PI&B+r>bgu3d~S!Y ztxXSo8AB{YwNXD1)d$t_wfp{G6e1qwCeR{f?hS5JYs^~Z?UuMYjB9}z1OHur4Q zYzmh@I?1&S;NM3IeP*ejwYHsrVz%nPg36YYwNmAiuHq(xLE_}#>@TLnYJz6Kqkx469xk1$|A zc54S5OnK84|M})wMDhEk=l1))3PyXjJf-XJ<}5F=21xS!@l5INhpxRVu3=i3xg=&bvBE6FL_%{)>Fx{d zP6J&T({CV~HW zWY=3>N)@O(^%?!z7e92D#Zl`)*`ItQo#EB6x?~>;84$2!OPtPAR=#Li|gi1ckr!xV*q|9&}KFaTNGpZibT7 z(Q1-`Kehl5YR_Tx|Ffm+9O7_p6U`2>%9VMBy_$bQaC z<+Fw&$O2}B_F>cB6luita+zD9&uv3&NDUqls&Ux7KauA^uxSByawkk=2Ak!}}nB2Rda zTJ0@PXKh1ulL&~z^us5Cc&XAlbH;(UCj(1$aL&sfM&6x+iTlP}hHGl1&+`~dmz@fs zcA7D!lH?UQyQRDl=VRmQ_{HKVazGl@{nj9&*$q+{l(G_ADk0}swHSErcR|s{5$SXn<7su7~N}&ehcWlPX z>pi8N7{6cY5A*XjeI#)9S~H<{`G!6|Vpz&oOv9NxoF;NrpT>4@lF)dYSH?RFq77MJ zRN9!h7^Ve+Q(@^`!2-^9Pm*#V*P;!=+UTJSqJv`5DHIu`l zSz~bYD$k$|^+!f!`y=Kx0{<*PZ#RXq(XsGq*qQqIBSKp8DdhQ?Lf|!7SY7Rke!)}a zYR6-kSg>O+kP8uM)6%6(+IEh!N|{2vaJEz-z!*Mgg9AIPUu?LSI!lA@XiUDDcsNb5 zvI&2up_kLU=y4JykvK_pKjXzC2Ux5T@_Vla7DQIY7gE;b@mL8aT>j%$D0(lf(BIpA zdDLe9QOsWSP_6f_?_7T2d=0{4a=lS4{H~+PlThk{;nMP(5NEEdsJ7BdY6m_$;;p}@ zX>#*ggTmce?GZXk;2AUxx4td;bU&ZAT(o4~dY@W9l8NlzB zUOT&v)>?tR=AmzWX>*ZMn5=$@O~IC;$1QbFtL?quET5Kn+t|Q)>f9*7k`QM`q3|LW z2p(r{AZ2T5Px-*-WH71`?89LU{!uXJV3d=deOoKW%cVWL_0%rthXX;ueu`H(u)kABo-XJ-^JTuuR#Wtj1jX61_jtB8$8<@ISki54VwU|M=YA`BLA9e z2F|Ntlm3}cmc?gKspOegB?t{^@a@KCi?Eb>xMaZWCmT$^D!U$mKESC40GvC%G=Z6=Sq#hiFpGd|G;aIJg5s#O2yt4>LXQy=iq~f= z^)sF5GRZP|?xgC}>OBVAP!(uJJ@XFbeB4pm?mLMe={pYD8`?cAIQ?p|eP?)J*YOk^ zM3X+l%T6X@Gc#JB``&UwdWS#XkY3F1$%7l&ou-+|icsZey~cX&Z&}!7evbT)Z>3@! zd#CT1^NPNFauo4>0wqL?g=j`O4Bw$7|ovm6i1kfxf{t zr)OifkpqHNFG#1{L?lcTH3ebMYMSdq2X7l{?zXVxGi)}xZ3f-+L8qQA8nBuAgNFA} zK80s;JP$+swd~S(Vax1FK@5Fox83IT#at=U7v;jzt?F>4l|H`(Grb|+Mu?)J3ao(U z;`1T;H-b2+&?`HsOXtrWs*bcY;-C;+xZkLqt>zh}c zODP~`;27;e%Y>Wu%!`9-zeyl|j52n^dXD+}__7*mxOqhbfBU#vS>$-P?{c1uqM3#CgleSOh4YThdhP=BJCo{Po(0+^!w)AFyvk+E- zjLR8;t#}}oshCTuN=ExXOdPpwVh`QKP0481{s}JX7O%+J-V6^mR`#1-F5O>HhqcYh zY)d~W>tb|>IS9LPPTu4j>tmL~NS;MvU_#uteaR|veA3-vDgi$Kc2y?k+qyS{{reg* z;Xsm#Kd~D_+gr?0w%OQC@Z|rPZBnH(Z`+aKMd#Qf!?r}^(jl)e>Qh!{Jod=neq*h53IiX@mKxuceT!x|N2CNw+ot!hS1K`bNT)H2RsSN z(+%rTmP)FCWU=vk$PO#AS5fRe8{90~_Az8*L+OBn>&hll6}{oREw`W1Wo-!YvARsF zZW*I;fZQrx`$BN4Iml2!ETI=$lEU1yT=(ol-DPMx%fl-B6u5`m#m)XB>)Bja(|;LZ zQnUx{9@JC{nzghl?EEpgiNKN2Y6muJEsK6;zDsR5yl2~8s%?pD(8;jff`@bFGWcqc zd3awo0z;EU$TNB3>>X>e3kwzUAlI$!uNPvqZ`~{-Se%&#eru}GZGV(wFxsJKdZSp z-m8Dr>Z31Ie9TVN)>?WtHi*t1r7LGwln9~yFa;PN&+hqnkaQgDw~uBVP6s0Dj;r0$;nI$FCA7a3AtGcSXWlK?WhUO9&ls4 zevAzWQ?n5{d$jPB?jw=TaZqj@=9wfz&xZ`xfdhxoAroDJc5C$+Yx|P)2iB_0O4I>A zvJ@{pw_|s6Fsj^){h1G5%{gC&Wzhbb#AgV33iBKS?Y`KSF~S3RB=yS_ug2d2QnwwO z%Ur9f$0@qXha`#wN}AFUk?%fZ!WhEC!LD9EJ$k&091BU3NjY^=fgT7EbKaJ~UerNN zFmykn#}XIHr@<;VRXPgCH2d)v&^Wr8a0i5dyrmWjmd_guGo~95SSv$7PUrPWCraO& z*-X(S?uYu!_4U{d&c+%=gbqv$jv7!k;V-dNT0jDg6c%n>IB z!x+>is^@#6=^y9~`eQMMxhmcUAY#uD&-I_O85K^zGTqjb0ob-?hqpPq2HH-Z+qP z;sxmzaLLDJg7QBW913Rx!f8A|!s((!KzadF67ftMZn&$wq*OiBwZeD~AMt}5(b4Zd ziT$zCJJN+2SxsiJ3of9aa)yR9deOMBgt%;AkW0?Mt2_I!M8H=boWSjf}nzGFWG zPmLF$5lwXwb$v7Yu@Jse{D|O>{sW=^Lm8^QnyUabpc@uq8S-;3UW`6KTK-m~Dd zPM8w(k7U(&nO7U;(wMRO%P)Y2U!o&E!4M^`$S?yiC}ZAssJw@K+3%V3P4HGcx?2u1 zpG%%H`@2~%;1T=wk?%}wZ?D2@NpVk5gmmBY-V$(D`!zzvJeB{1y~HbLz$p`dRBubM zCC-tb;-b<>iX+=cY3u~e@a+tG&ywa=GmZti8)Z4(N^usZ?U@hjoLE+8x3php_qd7a z&uz%Rw4hJy-(k71(dIvstt|a$GrQ72?QsCzad6w#=7pAsRtnsLGGFeeL1Pz{G3YvW zwKL$7aEEni&@K3>uOQ<^38Jn>X)9$(g<5xBmfaMK@Y29w03+d#vesesit>^-y@WIf z5q{sCt4q#izN74C0cPAJ9+BYmJc&l7k$qK_2XVfF+OxCU=ja2zHr_N^%`zdkjP!5{ z;&YaAB#z?E_w#O_mMlwttq6%g+w`u}hxcTr#Ox1DcXN>But#bswA8H?#P;(` zym0N45L<;uhEJ~KPrHGLe%sdo6D}H#xg;)Lxs-J9;=7Ff?QebPtgLg#7Cct|;Zh3z z8$45xz&&?tu;Rj{H6qz4TFDW5L)M@M-yrotw!F+;Kqa76Q67J@{u{aL0s8ISjQ%gM zbg6l!NBB(?L*@Ur6s4pc3>#kv(yTtmFre4ixYjGKZ^&KG>W$D2j zUI-@!9+~_Z?EY9OO0-FuHcke?1vt2PR`+g%O}6!MQAEuH(b#fu63v?k?SoQnVQ8U6SlpV6%T|J7%dRe468_BXOZixEOYEP@kwSS_e&qg3>;H7I0J_plXy znD~-=#;3BCg@>HzCtOTy^*aY8pL@eeH9FySm|MUT_=Jbfd*S6ZKfRVtQr?9&T2)$S zrRognlUGH{vN|l)!*ts0Yf~`l*KusqS+_3PHdD9|Sdb=aX9nRSy?*dpJN)?5luz;B zV?iwIE8pg{O;7G^$+KiGEfa^t(2Ni61u!xi9B-6Fp9I9~aSUWKH`0WS+nqbT)VY2! z3nftQsL5f@AIoGR*M0OQ?dOA=+Dq_{PDghHej=Z*K@XJaT?(Ev9^5Gas^}mfpyk>|n z&E4ak)w^DvS7!~M8wgsMicidQkIjuiZH_D zH@KDtc0uY6t_EWIeYC?A3A+o_UH)Ozr|L^Kq?H|Z^~N_Ditms$uT7QE=pFt>KYP+y zt!~drkOW0dm2C4hI>sr{dcjjmQ$BYc(M4cTkgG|*l&*$+eQamUzuovgOuA?APJVS-@_if{rzYu6+r0l@JhYMc`d?8UCRg6PoBd@PLkweiqd7b=?oDcWq{yNb3SpSLr zo<^Z%p=C?F5xeCj8-kyKapiAc-XG9~uXSMl(*a{)LS$2nrb!HP>8789jT`%Koc%c} zb+L$7oL>(`8H4FLd1x#1t;63;(4rmke; z|3n)Dr^w2oLNPE2ZoA{)Pvx(=WH}EgLe9hP5I~|PA#0e>nm%{#kf_;B?DCiQ_Z*}= zq@$)^PAfFujRaT4CIxyt>s!tUa(P-9@*k2?lAn@_oA?kJFF;c9_T0a~LYOOvMouys z&^FWFp$&|9ho(_>{(roLJb{1FP+iO)|FvUi;vv>w4rpAMqIG z7y(9I!hy_(N@OrJ=385ploppWkKDJu1q-h{s#rd65<~weRycWo7ZpQHxP2%b)W4U- z*x0I=LCUrpY=fSUJHeWcbs$YP19>Db@v#7k6-?%dlKF3C)a^oOPrEs;+JqttTMfFX zFC*DIr#3F#X~L(rQGB=fUe6VOQSYosXe^q_>H%i|Hn)LIQd@_rr;$C<2aL{Dh1A!x zX;bTxl1;Us!--7qcRr*c;a7h=oXO|OD<+Y%q4z!m3@o+ofQ)t^>`@hi^NT*&B{}KX76Nb5TQGki} z@5Q*!Y-H3$8gUYC2i{a@5hJ(S9YL#`*Z!*4lk!GR-GG#4?wg|Sgg$Hy)zNruSXEL(@<*Y++5I4Y){Ww zGDhOcyZ!Wy)|7yvC$>;LXI<2vn*W6Bb_>IJ`va(odrd>bgD3X3xP*@@S`z!MOdn=n z={`s}C_p%mqg6z0r`q5Mv!=DC0>5fsHso{hSi>ISNaf}^&1W@+(iuJ zOkLD{xD)40^V3vP<)&^Cmaeedk7gUN*{~)0iwF&iyJUvYK%gQ91K4h#E1jy8b%(+? zCo#^+x2p@CtdIT|_-SVo}^)*oPYu@7{^oA7866|eOAJ@J2T9vHSHgHP-) zSCoH2eAZ=l&MZFJil)5$y^C(7&2o=b4Kt1Q0;9I(N9b@tDK5D_6K``wLNOu|38AQi zS$&0@_%kJoM1>}cz)VGgCdVbW@xuHpLE^WhxA44LL4+_mJ{RRS54SIH8Y2W3A+>ll zF@S!U_nHZr&J9ue=_#(&(5;DuA<6%DpYY1evg1=$?o|@=L<|~7P4&_MIaQv+bO z4G+qJYwHHmOWvox!Vy!z?7kn)3UD_?EZK{++=>^PtfS1A;vyB7&yqa}FUk4O^_-a5 zpE*atL#)kMURDYAh3j=`G?zdA3IyhKC%l9wQOC7wm=`IQNLz?ra6E??7r^U!q8(P`dpE@D-PbOC zJX(z+=H-NF{sFSgj_aB~g&R07y zF$8QICtc#&1 z{A(M%lDq_b|KlW%B6O6!MtW2QHjUTGcQG*Kz5~s$cV>-D&w6&C*Mr$Yfzk!H{g-b6 z7=Xra8J&1hAD}$VYp43Uy_$_ksNFps3-b{uth2j)~!7|zdV>C3|Yo= zaA)W4JVKTqp9ugrJvxpPbQmTkIX<~a@QruH)WOzcr)J)S3B_cBu6&8y67?iG$tGWD zPll^yULBa!`Odg*pcNYPXZ9S2PraKts$c0|Qm!)mhFK~(z3fnJp>q(g&-zNKu5WeE z{Y6VRvPEu}SsqEEy@LGS;`xq%s+>)c?%pHU3ijn_RAjo?w!pTq%(zn22;yTEn`FBE zSNjOiPOKo0pB&^TpTXx7#JHSdScHI`VX~kFExC-3lS3&WiY|~MvJGapGa)+yW1LFx zC;bUnO5!{A>c`x#HI3dLaPeBvh=9Q}WMkqiyhU9qvtE^3`kQ~yg_^ZYjd)!pPaMVqb~E-xztFnubI^V`qe;WR4>Zty#vpM zygNCh!+PT90cGdM#i{MuQ|8b=hT9FK1%m5H5y(yuT8U0wgN+M~jPq_(A!A3h#Z7 zUcKROt!&@;$8l2&m$#4V#1E!AU#1XJ@+JjTK*z~r()=MC&+!Tl&oEe6Q{Ntp?M+*K z(4HeYvhIC9M%rkJV@4J@EZG3A$@CCdWI_l((Ok1*1)gyYoL7K0#n5^9MaT-a+Q5K29g>P8&!8wTSzVuDI)UI=6 zl~<>Pt{G9UPv5gfGvJa9BT7GUC0=-mvZhY88D%it(e#(DFqG4sY+w` zLhWb(A|TthQ6gwm9R$^V>#;!$sNt{+Xc~VuUrJcQ!eTX_Wx-Bh@KvNlh%=}b+$$ry zP3wquq#{t9zmhn3MWk@Knep)Uhp0V4;vljVk>pi=(k;b~DnBZ-1+X4_nUxDL0~@vA z?Xa?yFdR$JhzpYrsA>2qGi){B2gE6>R#2!Jz4yeY&6;yDiC;+n@Cu?+>zMyj$n5gIn7PAEkXp68l>Tq7}eU^U_BP*a)C{ zZo&tY;K|+AbwOW>8uTmt#h!W=Qt$~dZwT)$?lA7(Yi}|sw)$a(r{1ioOP%PC-0Y4+~~zH4^1c> zg0D|!KZYp8tFxJt752A0ke=3{8sp4_urSS3*yX%ZH3JTns#r$bbnsW^sRs^E>Z#65 zKQ;=%sql|;%s(c=TF3cA->ZtqF9_n0N0}-|Fp~;!eW?`u19RK+stgys@Y51qPXkQ{ zf{txnkcsOpe&O60xgG&H^66D}dArnZ**4*3^B7BXq#1t@(V8|wtTOm*~i%1($+s|QxlbG z#Cs3P8y85fTG9G)$ey}4C^qx*b&!*5{GG`A?rr;nR`mLN#6mGj@smo-5Sw18Z`ZSZ zQL2#M-cc|>h|xS<3C6sKsGw9|*d!VxmfV)$EY@b7Zs^Y9D&`PiUXbj|{bNiUyB%|( zf$&V29==E2IX-7zn-!ats! zRUU#kdX`DsaX`XZ?BbRS!z1w-sH#0}MBg{Xu8h9v9{7|?KN@WI0m*^;W7<(4$>!hH zqFaN^RmwNta8QnQm=d}k6`JMl3GdrGIZRkeKx(u1oxd@&QFYm_&(G#^34IjLl~M;DvFj zZ8DY&E5n+qKoHpu9q`G*=}hF)tZYZ@orX>i!e`@U<)P|=1orcULGp{Ts-c_FkWQ@G zEiV-8@sGn$G9mbodnIy=%1KJfRdl^eqAh^Q8W?M2kktQvcH4s{^LF^Y)E}uzD2Zg% zkNE5Lcd;M{m*U27BdLrUprJdMlGnm~J&lhiIc4lh_L&5r6U7iKbGv1j{~jV9;-7dn-O64);t7 zzB-qE5T#oK45iuKL1r8JR+T9+7KA4aK^IZm029WTr#HcH5l^;Xj@KH~)vkWLdS-eW zu=>LqKqS1^^XX?oL#LI)hwY~5p`4-ZJOtMxhxeUi5j*oSMD;AVt4u|OqAcFct3#4n zuTb8ljQTh|TT^=VF;6v2A3Mv^gO;3s$qLf)%3TqfqJh@0*F$JDw4h5}>u4`N!z;kP z@a6dIS*i;NstL{Lf>f}CaHyK}eZ8ndxG;!ybE(C4s5`VCc<5RRnx>_6n(Cw&;`+JSl?#t*0?qX97otcY{eh+F?p`5?&#kbK9!93Z=!I#g@e5ri$ zKziDilY!|AEF6GWqp|lox3+s0{@Xq~%%{QXFj?g*apZS~DSHd9)doy^LMCC`zFGC~ zo6}Of`-OSAS$vy$fBoD2yCsA<{InhBrs0Fe_UfU*h;~1QplQd_p7|+-oreb>A!7J+ zfsNy7zz%94ljLKa5!)T(rb!ig1XBvmTAqC3R_r3PJGh-0C9cEvU?;2Hl%;GjE^2!4 zXiUtQ-x|;R#H$zGLFwvWQOCdvhn8&;uBm%Ck@g0hf<+?yjPxUd7u$dSykowO)0Tmn zh~He3PM*7udFQNZCuQNTE&cKZc~+x2=2}5Xx)8lYOCi_cKNEG1!*hv6Ht>-XgZ9Nw zaT&V%KBf4SPl7hxBct#s!+B22b+zPJY-iUAXs`cN74|NN=}N+%)sH09?aN=4Atl7F=!C`7;B-%5LLqT1CP8vNKO zkvQpY#}4b(T3geUuFqQAm|g^tJI3}YY1WzJo+^rfm+4?RpEL|(nw&WfF2mv0Lot@t zl$r(iFoPxo0X&2Rrode_iv^pe9|9L-8uo_iE}b&0d%*CMR>RoiKZPgex1@o(NE=N0 zN$+d{`^iBY(Mqld)#%4Ez)J%+-Bg@Fh|(16v~IAR!;Hry>w%JB@OCuob?Vxu7AK1I zwiR*_kvfqHzJ`<3Gn8wrmYwMB3#TJte$;)7B#$ZZ?l$U9`WB_v#h!`sYT#V=D)`JNslHnaY;ZkaTVg1W&x!+H9l4CVnm8j@ z-X%ewjj~*fIW!6diF9IB5QEC56U@1MR4G&3%YP&+Tih*S8TTJ~*XZ#-x~cSoG|lMe zAb7aADu>zwTFCGs!llc_c(-Z@P(HV3!Nj4(V=h*^e1(238nrWPiC52Xj`)LZ4Ksqk z?_-6eowBPPcfWmNkeguz@f2S)CR$u#?R(4i(A_)h1Vj8TM^H4?vY`uluZ8{X88A?L z7W?A+TJ~#*-8w>p6U8A;c^RMa$P2W(J1?mdX((-EsCTe;0xuB`&#_bZvJ*6o!4WCg zBT5_F%j#>ES|?39YS=LTPTWxh>LYavhzj^)Wa9&8{__Ib-c7%2&tS1%m;?BqBEPME zo>AAgxt*GZh?NExW7n~lpe35m%V)l=R4e^;H=J$vP#qHwA&IQ=96*}5b_-knT}jN0 zdri%>Yex*{0>|ik6#j9;i@5T&m_b} zBZd5H>kli#0qd{3mu$GDXW?(*ON$OkJXd^`?5z?gt8lif3yGAJbdokZln4@>*UM$t zq{UzNHsDA@Vdt02a@ZHknsiz9={ko}_~S2zbWrme$y1?;J8Z=$#_sat>4D>)mQC9G zp8fB?p8lvrm_F5FJJboSy+Td!i3M*{g2-Oq!on!Ui;km=B!@%Ah(GLo^?I*95QyI) z@!|4ySUWQ#uhLT?C&~Qcsg9MzCOD+GE2+HFO(Rxi9K##dx^*cTbr#K14a=8QEbS=H z&<)?hQ;B;eb=@#yGF427bX54}@7d_MV_dw##T8L6JwZWGF+n@xEHn?x*NTdFU>8SP z^HFF0dlbpRzg5uxQwPHSX@xzUPxtPBoBGDnQ^kK;@#nwC`rAc#C*S?;jr2%O)d_w ziJ;B4b;o--z$;D`zIXA8)tn^|0RIJ#jmt{nyc-J$sl%Lo=y=w_{P3!sC;P0^Y;aSv z*7kz|Ytb^s%$zY&25)EOau`gWChoG3pzK!ux7SNA4=wfe19_pg9e)ob-&^(PtcZxE zEqWaN{*n9#g{@aMLuEMg^%q=yE%FyGzW5IkOvcN6tE(-L4etuE;HzE@)oFGg3K2(< zsQvEtPlFD6RCf);i(&*k_hl=#J*)n(2D;~&*iQU{KPDchLklu)aSFhX+;O6Tf8K!r zpP~V<`v`FPmaA9`)Nt(Ke(_B$G`S5>h$8AYQ3z*u=`l-`1kb)RiZ&;+|2@6;{{CD(+l#VHY1_;B8sVv z>9Ud%D_dkUn`Bq7YyCiE>g)xHn)KurWlu z&L8L`lJ$#F}x6AGn!vjK1W~8@OiOM%9nE(g}r)6Vb~5(uO^(ln=(xDQs2QX z)n&-Ig;rz^dq1;GuUiEG#In;vj9cN3%D3U;A2Xeb)Q4F1YW!ale4F(Yx!I*$Ft9x<9VzS}t;hZI9r3 z4Bh*_ZZy`iKhgBEANQFTZi(@fyZm5Jgc7+v+fp2d@5h5dB%(SuVdpoZlR6Gyvq<3p zJ~kpG{Mr6!_NCT{a4TV1Q$#B2@)`Th-+24;sPxV=`JJwT1>4pJ{qsVt+()AIA%x&# zne$XpbIGeFeL;kQ@Kz9FWXD{X*c~S@jt*TkQ{Sm8PFrl{Hhh`Q^Wi&!fPIV`dTA*s z&WyGA{yCycy-NqMznt!t*gEjU+r0Z1=kZSrT`TCuWE(A*qxK2c7}mb(byv$&R4t@v zaZ|x|c|U!2bUp0GoSYhbZ7k$yEjrD%>X)GJxtx3+Aq6JZw<^!5&oWqDSnOyyf0=R- zy?$_5)$g`d%XVI3G4gEostvx%+k9rM{03xV5~{!Rz@ z7^%fR>3LB?co32VPiXR4YN;{US4i(%np23KOi$?}+!xb)+A?I_RaQ9m=;mp~(fZ=~ zN{g8FT-j3J6!84Up+j6{3qS)?jw@TSY8mui1B<|IOcEB~ZHiqc2t}1~j-o^3@7v%% zgs?U4!Sw%y`d`hkFOwLCFV2FUNZu&Tf+H!u5X- zQ|5M&$(%QxtV%sdhPyI&C!9E24=xK0E(Hxw{ndQ0Rt*`SrpAlE2C86qZ;4t`**E z9guhx7hvpblSfcDkG1C>IgWl6g#33YNNz}m=NNPG&*&kF;b?Y9d;YLmiRFjI$h6|m zI(QkLVD4uTQ|pw2)s56Z^`w3N zBQE9CueOx}P}v6)(zFJb@+!M!)HAf{@8XqcPc!FACj!2Sv3Q8EDyNP81v5^d4Ku7L zTWeqU@e22%;wa4=qDI!JGeNu>=tbf3c{N|=s%}w{b@HDSl2v&3F%#XC6mRB-8HhDy zNtrma;6R^ym2mC6i~E51VX0Qh^hENv^M&gyQ0MksOIuZ*$Zz56r=sVCAFlVxGtTtw z{xl}J;G)B-2)<}**);zmzbVdET#POfp)V!It3F$p+`)?i^TpLAPAeQNrF+rRBK=Zs z0$}KmYKCL8nO$aLsM3_t>j0--lX$Bq|n4zlO^PB=5s4{K=r`Lj5Z?EcnGn;lfJV8LMz13Z&; z>!L3G_r5D9sDcQvA4-H!#ky+SnpNpcpe2LkLK;RU@qKsa@MNfw%FA_`<~?FQKh-*n zY~@wz(=BK0XnWm+K@vyC&PmO9PKxbz%E(?RkLlkt1G3OIgJ=__>TJ*K_Sz0sowA7F zIuB-w6U0R<0n@!f2|7mm{BO?HLS`(u2r4Ax1%2XqwtgT>03t>807d+Jr_*`Noj6Pl?==H_Tjt0+6 z6sg={$__1u))7QsK>GAY&MfJI;A!Z&T%*X&4XT+Agh&)61v~2t>&CW_X8K*a%#jntQWE)$UJuz35fihO z<%FA{wNM_Zf2GVG<`~fK4@(1HH=j*RJyJaO^z zdnpC&V;dT_X){KHUwdT&Wzn>o_jO@2oiDlRt_4+T!X7vt;Ay>|pckTj8dNRmFSUd1 z>F4hJ6wn5JXeg>o@8njcKRNd9Vn<3e?#a$d+AOTA{k`3xZmkYP;JoMu?8}?)KcBV% znbTixnJGaON@R=kWc(S7k+T5o5nm6*^g{k*dl3X#vksBY_FXHuzb^VWR}carp!Q}DBDv|H^*9CPnGVHhS;2bJ4O49#ZkV; z1*KKCANZ&?m1^sYk5Mf-YiRlUo zDTK{0l26q;5!n|Dma4{v51`;NrrHAzlx(=@7hF=AFhV4u%^Z3?oV2JYNvJdn(*~#K z$9UD>D^3B~El?Z;?TP;ur+*3hc`oZ^zZUMse3i1taNs`Xo>rORqo;YLHzs18GtG^T z|8KO=>QRvGb9Am$an@1E6Hd^6&y1?C4-Akar z>zbP0i!?Kw-t?78t{)B>Jdquaadr_P?7g9Tv=FdgeQgGMgv!TbLyWByJ9h=t4~=;U zzB|?Y4$gO0un7|82DF}+^vO!dD)4j*Q5bNOkIXyU zW&@&!D%&ENLQ#5^ETGp;wqMph#W$DTd~ttTvAm*h9Du;8^2m@`fLDuz&n1mtE($Cv9$jo1vTD04 z9z*kELojv(*_hej#`10oTQwwahp|w3iJH24$>tuJ0P0HWb?FUaJgO_3#HrsAOOLH7@eq=NfjgemiS>UrIlERr>+0*z+LDdW zM%wYJnNe<&u-WhM08*pb%)5&Lu`q)mGqWWKqJ*#d>zZUwdR5EpBmE2v2yFCVqWkFY z7orY3#Hyc_E_vOXs1NMT4fl7~n@a;(-Mo>tfy7s^KEIr^DE@sYOKX{}P0Bac`JcPj z{3#cEQHzO@JLeH&%q362o){hJ_hzgq_jzM^R?W`8Uc)Srh>dg6^v+(CCAVzLVc7X} z8P8&YS$Zef>lDBZ?`lU8ppbABJ9o=9{^5yCI-XR#70y$1P+Gl{jD}J)7azmuY%dKs zLIGPcZVt1w$!ZPJ4H7WmBBL zc7=@oD)k>MAw`Zv)Mu>4ywiA0z)-rn^!+8^Z#YQcIfBJsEt+rK;-DH=cdDnaXrh5v z>$_@cRUS2lgz<9HsXJOo68^q5{#A?iU*y7ba;4f%JhM_#oq9cM%>&t#WPYV`6#7v8F`J-9RZO%cfE5;UV@WVRQmNMDceh zOid5dQLx#Ayz=D6am(&LgRDZ)l$3Nz>WS4@Je}gNJfQZkKPJ+1Qhn96Bzn%iCqSN3 zcweU|k|5Amw7o%Jk>L;-MJaGT?zYxtEVGNfay|lf!xT)WQOAwF^u%v*#yErUcii-s z6;}7m-t^*n1?#u(c_|Z4l3j9%ptN~s_E|Vr=N8!z>aIcoF1$4RK`3?1^o^=sSxC(` zASdMMPs=#8!e`iVm-#=C20j^>jp_L&JNLUp14>N|s4f!yALxMtz4s>x#jL6R29)Ml z8>Ep$YlHI}d-#v*_kF2EUKR4^+&+u<-QcTOyStC+?585)*up%qma{%H5kY^=QS}Ds z#l~=ab9_2BzsPj@?MuHZGn!&3p%YkaNu|)U3hegVR(}v@cC|QGy4^e;#8*TtsZDtq z>YJf?BKVGI*6e5Fvybu6`&P7eAI>gto)C^cP`yP6u=#0uvn{ekC?m-9QUw8cai~UI z|1oQK$D$~T67II*9%CWC5#CnG(K5xVFtit6J!ou%14EadOyjI@N?~m>4S66{=XCyH z9<=Rxz*L5E6w2NeC-dC%+z3OefXlyv0$cD=1fWxA?xgfDpGnb`2i^5mcm3@9T{}*% z3s@@(a$g~~$zA&y>O1tuJUsgtf(oHfuu)YUOTVTzI;#ILZ&b&FY7RszW@>lxBac3z zQn22ZBqH!34|UW%ZDDeOERd0ouZ6m(q#fo`KmL6pu?-EDq;N?dTGl3IU}xbhs+ezj zun;Tz$sCT(Kp@^oaLQ5kCKgl5f(2Zs=9w_HxCWN5@gBi*q%Q->^U{}_f?K6XN*(e# zW8W+5G7%?<3hb@-v>D5poWq1F`Ac{=@a^T`g;8WKr{=CSOle$W$z3#bX+o#GJM^;- z_4~$0zNcOqRJ*)w-&~#=({WHu6H%rI4z61J9#Hmg2#JaS1tKXn#3cK=aEwnsc2>sQ zsTnUFiZ;F-hlR7+3*`}-5x=8NHr4qT7nfjTq-X!CxL8e!T@N1yiejdfC(7uY=%Ww70Sq2|z(B6__MeXx26>Xh z7E$*=Ed@H>b&o~$+v4$a^-+12@@dn(yxUl4-9+x6bu9Etl;VA|JKOg9y@^=da4aEv zTRy`bRsdxDKamPAl7Ax=YQ#>72&9>*&kB|>Iq$yO7eYx3^`m+7F^tyaoefqTOetcI zew>L&%a5eJYytZfrU}hM0S9?N^4OEXt0w9-=OP(Gtb<_YK^X>e4(9@ET<56#g@hJ< zrKPdfsSI;+F3rEIMhB2B!}-k*`=(Dw#6*M* zl5nzNQ#dodL!o{-^($g%UZUqOSH}YaM8&-eeWqTS{y6@q%LJcIP0_%pX@k1iz;On# zPx<(Hr6(CT8X9T(dj6494jt~SX`OGIUmp4M^|&~L&h_rWk)36WCE$3#bKtUmhI+)? zutu<-*;RAPS22NW*2{_WD)2e8i^z=?bIt?NXI(!;FCHO*NG_G7ATXB??e+D<&^3zH zm3p6JIUX$0kNkUow_wUh|6*&@`_S3(4=iiCFajhmE`DrpblWm8FGY(6)5C#2yn6oZ zZpVvSv0F8i;kpU$y*}OWG$bYCv$Z07xpuzrn=}^B#mF@#)dJQqrVh;TFxpns{WfOS z{B>_IJyxS(j_r|aB!)a#A2;Td-M9;s@N*@dw}Bgt0v!swWxeYyW$rYcw?bxRluk9GdS_R<9~4@ z1k`A5#6F-Oe*6n0!&V~OPTNnT=ZvN=eEi~%{-EA5^h6D$)Z9B!R1&u4xEO5i@aggg z$Q7M%edC7;JQ(?5_*?Wluq}&lCPTA$MO*gui<+y0&%1X0dVUwxMFunQ2jKHV+iS_8 z?~s-TV?pE`N-P~U1xDFzkn4m}hTq`R0?!$)x6^qS3!1)Fn;mDP0z2kuR|p$WSZVpT z8hWdC`%CGlr~2+&69>sA*!-wRprhoLUvT7xRKj_Pi1zpdm_VVpx)}_u_)88)_bCW5 zZp8!hRnPB|g~Pr0@n4RA65eNfe^!kZC(WSY`e37;NBD`!^CJ8NiE*>e+$r&u0n+ld8Nj9MNIT76Qd|z7k#idoR=hi#QXLxt$Xd6{1QNlP z(&59K=rUt782>>`!@*?G4T>Tj^b5|B)J=K5*n;to!uE^8#J34W;;Hvd7Ei_OW*?5^ zW`{cgDp6c%Z%Y@d282rYCW;q+b0;2nqG-gx2WN@ZMimOjf)L>o>fUNYCeZ0f4h=$s zL~0uYIB-};942yzi%z^Bb>2o{wz8=%At=emWOv^2QrnMbH91kIT_nsnF-ffH@UW%! zA{^xv9H~(gGs}|W6FUE~vTP~&lUV%AG0N(w-iMR?YXK@WLrOgEu1hE$?^b8tvH}NG zY1UMe1RD`X73Xv0Ex913glOMA+qJVPa_dKpFq27FQ%7NL%0bC~N zS#OxZhUHS~6^VKWx#CnCM#;7jc|$Rq@dpHPo*p3No>mDu900o9=mS)k12=MLsx_#{ z1qUB%^DVRW{sAh@wQp$wl33X`>YqxmzMS~{=N+2rFty@%7FE601F;Rm6K*`d_$_E- z&cmO*6YJfVSG>}D|JbXRVolfBUNjz{(X!{a=M`eG`Ytkc!7qb@I2b+Lg967aRudxh0n3 z7WGjMd0i=6VzzA6E%%EiN+m}^mYZ^kMK<40@YXxI%&trK4+6U8qiwqD9(56vY&7a! zxU744RZv>GRK&RJ1~<b=2BJn*;8znT{}`C)weFd z=Um8*{eZ$Q#7z*mcsJ7fjGli#?_6TrtI*ewvfB7OyQSl_)HDHk0INHT&e|N1(*Ysa zu6y@TPtuZ>l*SbTVF%rC)H4X`l(p7Q8+v~?9>g}nL6A<}rB4>$p)<&W&@UZpFhmzy3z=GkYZ zfbEX0?Asgj2(Jz52a=cwXgPKEx0xIuTvuEU z5Z~36`%9L}*!pHM{GxDVtRYc3o>$*Nohv}rd0%~UmM>1m!0%pU0}PFi&v z&m^~ikYAsSqv?w1XvCKma<#noY8TD+vd6XqGm#(0mB0DGe@(B1U2p?c*Dh=-?OwgR zVX`|#08>)%J#UP%%uoJatzP+co0r)aPo#729EL1eQ}><Idm-i3O`f6UPy5F#X3BSBXm>t=v`s{ms;w z|JB)OB{nLI9FbOZmbUtlbQvR7%EXCL{C7}UQOh>kInZA$A!P!LP!|5ZXxn9)0# zTTY2mC=@VBhnQWO*oh0XzVsA{_k^Nb_ga!N6ukx+@#c~LQbSeU=fZKyF1__FnJ?&e z(;j_{x$oMF`vnURuMFD z{V2ML_~|@Q4XDc|Pzz_dc5nNmw7jIZG;gSOU$MRg18T%c`I~t)td1Pi&qkFjcloWr zIn)oF^dq{mFS5s^*7QgPbm7*@rXwZjZ&k#mJnxaX2_tG!bi+64ZTSsg*GfEpJedcn zpJ%3;M%n?WjZecOpG2$KO}*c({+#NF*1}!3!tf`>QF5^=@}wu3HS0g3A+n282VEP- zjvRci-t|0GJ7Ox@2gTI7Of`QYge3n(Ze#1Tv(J>CF`TI6Fbg#&&WK+)z8MMXQ#yP5 zhJ)dLy8T{~CHxLuvC;V5+o>4#0Gi(7DTzgtry!h@<(&=Ia+oUEROr+%kl;4eX*Qoy z0$ux@i`8%U`DkvIp~B9g7Bd|Dsia~k@1YQoSyPl0)1wL)bYo4be|jrZ{y@u=#ly&G zj!@F%goO8EVtyXt$NS6m<;NOpEC57cu%+Uq7JpK)E@xV5>!Qd`(3Z@i+C3ZCeYhr5 zc){rC;Nt>vN#o0VMVsPJGi$xb-Hh&a^KYw$^FQlotre`ev?dymw%b23v1js*v->^x zdQ^^WQ-;x})t12s8%rozRmtb+$E%5~RR`=qyGsM@pUD*H{;sO+e{nY+uf}Y4z4yM~ z7b^?MjlzYJ+Xf6mc=4}Zo0(pZG+cU&n&rV*%WW!57_ZVEAGZu)A#R*P4uZ|>h5cJS z0NaGh-{Ut%o;2Q&AIT9j<=`9c*)1JVtO@zJ8pT_=rPWvo^=`9i8^CE|T6NKWISKFoHDg zEYJ{?O*%JG*Z_jO3n9i__jVbF!sdqX!?Z~Mcep`#u1#^DDF5+CNtKXOzXFG2{K zTgAx#<^*Y>S?L|ut3|W#=wjm4Ek)2z{6D}Zag`$_#be=#pax^8y>Nv9UG}8sj`@u| zE&W!-(r3zN5nCU+UKpuADNi{xUi@AYTH#LXK$U$aQ+iAat&mCGK>osN?hsN(->%8Z zzi+o-{()--KyC$tye>{D1h2OmeTG*zE`HjMw^b2ok?3OvFNtKM1aaX$?U|)0h39{s zbD-O#!A)a+8!NgScXye8uWaLG5(Sk4$8`ocdM|_dwB*FA)<78lH?y|F534zi8bNP=4*}QL z{tMe5HdfHc((U4?zP_`$yi|G0s%s*iT|zJy-?hrkl1P?s?R(Zt0$t+z9gVJE<0Q{@ zm>|j48}+4R*~7cyi=qGw5rWJcXufoc?zR$Oy15FM%!;L9Ad2I?y)D@$W>);e!TJ^o zxhSh0Ww|K+Om{HT=4aI8@Inh zSng5;Kt?gr`48q%ifw>1aW`db%&%9+G)^4lHkwoW@OCK{o1VvC(T5Ci%U^ur5*VVD zGldY(M$43Fp!a-;C_t>2g0T36`G={Yw{tum;|2U6kUF*&qBM*{>zaW`@(_>{E)McD zSEx4x8{%-?QcdXBr1Q^f`Yw6w449^u+kY6yMW#TX7;bEx4=C-wd=hf@&Jb*2zN$;% z>WTxDqHi71+IW?Y8_8`Pynx?cgQ>11i5@=QkX0V{r}CZPeY)NrXoZf7P-vRE47H(f zcmP&QYjsf#f9BAX-z1+XW0&9lc13#(EwrpC$RZnq8o69w}YlJ5YJ*INx62mVEzg3_q`=hMy8QQ>$>JZ69`Mie?T#b z^Ne@jT^!LJ6?0x~u-Q1nb@+o!ysFJQUkV7lzh+~5tWV*?Pq_`O!oy&(Cii!8!o;uy zP0gaU@Ei_ToY&3;gsCzh30Hg{v!uZ+0+x#2sHH0T1R6z!Si|WlJQRhXJ$GcCG|QJ3 zGD%*%6|FwDK1vCAnwtNa$I^WMPjid8M;Qq6LC|RC6H_B!#4o~4=lAzCX zk1~M@EDvOW!LC7rj+_}$q)>Q3+)3hS~-*ZoiIT>=c7oDU-jx+wtGThgvt(iYGT_S_#Cy=xfj0{KlxCqt8vj}Cm)Zt_F%l6;5bhWGUS?p)d5VENm8=q zMp=H7bFZt2>XhzOkM>gKpw4x=kjAL38jf*A&oee^q8YE%{FujZJnS>=3nCDdnr+I3 z2W=*PUJLkf5@QvAG&k?n|5B7tiM)lmcW?@4Mb;)i{5VLjj)DC=N~@?jY5Hr0iS2Lx zV=Wv-VKjM+4%?sag!EpH*io3^+-m!&WofYvkD8mm_jhHXjINE@RVkeuTw?ztMK;C8 z?pYU&;u3NmcTNXwun5IB;~i|Ed9CK4$2X5J%$J1(5qXSDbpp9|cIeZANYB+Qvnfv_Z;YDi){RD>ol^))kq2qrc(PjGsNy zSacUnj3@l8y%r{Lef1Y|dTNYDBXm5deEitV=Z(aws_=ZG@Q$+Pc&r52IURIfQqd~H znDVmg*#Hf^{-<-PIN%E0QmA|a0T(`W_>s0M|6v&2VVcWWv1yK1ea2^ljV2NQfYom+ zeQjnXRLygt``NbmUYvBj)=v(~S=9IXIn>>a%h8)Nc*Zx^&$zt#ZQ(@Q`iHtLUk6V~ zQghW2Zn_)kjZPJ3&@j2^LI{~Bi8VycDV4TNB+B)p{Z3fs5rKMVhuc%PQC96}r@5&8 zN0e46w-1}<@!evqlmS1Lq-EWwar#;sTtrd8`B0Din0=I*#@{th zbIg+(Ut0*Ld5#XAiPqZfwMz+A8GYjgcyN4HgJ>zu*bYNV2(>y!cY+LQ-F9 zRhd#NFRH)A$Fr#(+w*SgQG|+%svSK(Dp@OL_8}rLE3mpNFs?8DVQXs+&TwVsSXsA_ zj?ht$f^fK_xphVD^w3ouZ8NpRRZ-}NG|@{Pfp>bHq-(c-yEvZToh4DN;LKw%_Bd-V zXAAaQ2Sip^vqWlp*%LM4@lw%EVkgPNe8N&vL16IkkjUs_DB~SvQ~eV0e>8?KV{=2| zF~}Q|6IF+C^f&x~WzekyTNa2GZFjxK=4ik#!d0$|3(h8Y{!djjv>%jmJ;^q5EjGVa z`Zh>EchIDC$r7~dTWji`^!09jZqK5qS$-fd879svG5e?$$QhD$M56(?Vs3l+^YTS_YY3k} zWI=KrX;E$ViZ98jM$je;jjL<0d_KWR772h?(m zrKe%gWuqI=ut^DZu_y~ zx!cDZjRD&}-mS-bck6LAbI#fV^&Fyq00+wU#V(`EFLY8nH|U+aLTpfkjUm+&Ra-RY zZ+$FDG_N~t*Jq4FZ6y&s6ujnlKYU>VJv=q`Dt%0nQj5Q*CBzn!-K-2fh1p>sDi@Gq z56TlJc^{tkn7;TyTgBN!B5>OeT%s~BQ*?_}(_$mL$@_#=t*krHMUK;Qg@~hOI|A>= z@2?UoZ&WhoAHwK_UkL5n9;nV*giD-o5NyNQ6mQrKK~MHB2A$db)s#buvRA)4nYM6l z_UL|?b4a7pxy|ae694(gh{P7LXt(4EN4>uD-*n%b?z1u!#jY!rHDF!zaje3%GOK@A zj{J-*1YrE$^cF{-aWVP*`Is7y?T%!1=)HNJGf{3lDvpf_mB&q_qhOjc-G0w(Rl<9A zknF1GL{t(RybL;mWM5y*zx;ykVx-NEl@8T*9OA_3-!wexDFfMf%>{M-oiv{+%NAObhU^RK<-l z4{H+qHkW!U*E+r?xf0#0JZ<-C&Gc0d@L4=4`fzOH*xpQ~UN@k4Ygyb;#d3j?%)7>Y zJ)WW%yQ!@3Wlrn;4m!Wfz+RG(zI8tzQu>x~bvXB7pFO5jYnga-1h-HxODexP z;eiBoaUvm(hPL_Y1uuJ|3>C_c%K?_5*p=#C3Iwslv&wBDkon-6TaEx7n+yK&$9^I_ zjNBt^ud0{*ex`O$I6kyp8Ev9v8-az;k%(M$f@*ykH_%lr#f;mAKk|HIn z8v=PZ>ddHI>pb0k2_5^@h?Znp99v-l%ro1W;qZk91AP0G(`>Q1Pi)6ZfCr?JV~yr% z<B$fUBh`i!^uEWv54*PuvsYFaDZM{U*M8pI#+otCQ(|YedT8;J$lP7DB;v zfq>UxjQn1KR=25LpgcwfIA;^?Fp#-?^BbRL*d0tw&`Ueg8CWsxzsWzc=wiA0ucK)j!QAH2A1)r?wt1J>8Wf zi>(nDBD8QHiDu!wPf3Jn1hx!ovkoc+iVS6d|ivUYkB2bT)C^`sUO<)C9=lT zV^~qldw+Uo40&oZj&yLAiYlpfp1oh+eaO=^6kIBN!5jD99E_n>rW=t<@*~TulXG8( z<$=}KSFwU!Dj9GKc7JY-#tlI|NHIg`RF5esqR3!&FtiylX6?Fr@%oF+1zeq({R+>f z%bN`GGu-s9)>ZkWvRMTeQFcUg&i_(O`nCAaBm?Y%KA3X|R>@!a(if>$@Q!gB(4**pB78GrPbg~ z1oROygfK9J}p^ipnX>1SWUD>7r03gC#g zYuvyIm&4Muy9)43mvY*!!cErVXe{ODQ6u_0kQ9Epb;X$waP#Gh>|ZSIqIqy^b*r)A zJ&trToV3^8>djP8;+jugzsQ08ulpY2bVR>tp%Wezc4#_o@VHQK*kMNdXwCEW%aZ$Z zeQlnl#aLXu6Sp(a2nXtUwSHS#P)!J0F7Tot>&7}2G$jmYgo*FhSrt;3)IORxc+v(B z|IFnu%!tp43!}^)nf4p+qFQ|byFfo}-`X+hBn?gydp_$;BEO4Gt<*FKUi57GjknCC zA<=x)s4{7S45$YZf6Wn0#xZY#nAgwxEG3Ifj^}^9 zyOj;L)pe7|p<8cbwJ-VU`Ctp1&#r4AC!E-iB@0WnwnZbTG<&>{;ACqHp;*S)L83MZ znS2v%oKA?Gm5^2f!v8#^f>|aM}n=G-Ql3%^N%xm`G(?0Z0OuJ6rfZ>D#&B-gUY1?GwYVUgXUZgol=DTA-fKbcbq$Sy8T; z=^y^7_UZm-x&HP6iStmS<>cGH=I&os=>M^<-ahsJe;IS*B(|dIj)iNf35pufnsBuP z@a+~$z`>F3Mtzb}ltsfg|Hu=%lrMz0sz$!)KZz6b$<6H?j*lIMsv0#t!CiaR*?X1| z;!lTh#W}jK_v|D`RNK`-T zBE+tCO|9S9NnIt21s6DJB{uV%IP?43nlWXmalC_!7X1#IM6(3PwCCmDuCT7(zufGz zr>bK3W-a)R<6!$X^C^6JSNs1ANwo{O(6-sACs%CC!t7c=h&A^6jvukS&B)NjnhY_G zCQjCS);?XLcP^UbPxLX}7C#de!1#-!Ci5U(-FOVnn|bA;R2pmIedMdN8}>pHF0jhb zxhM|iNt}|jS71MpDFaneLIHtXUR}9L<}a_5MknrUo$XGQv;#1eX|bKW^YXox<(Lsh4M}$d@;PRCpn|dcpQQ7k)vb$5q{cHqvy%z<6T9K zk#0(+YiNYCv*0gjMrbs1oj{JxPGOIffvFyPh5t=iC5#kOBJ3?ytIiLae7(*u(xgt7 z)R*`(>zQKJiLbCKB^$WBS&FR|pB!iVC#qPMntLO1VD3U(%HWRMAD^Ok% z`Jr@4E*H+)55)P(HG?iA*wGVlf`pIUaF#ZtDVv`MwsOmvzXf2pTyS}f_5E(AonRxegj z-!PdVPyT8qp1QP!@ql+_tNVu4o9v;9-o|^Uq3{Kc8gNqxvV(tcKS*Ba2%NsE&5{F3 zCZXvdnvTS5y{fwXEK98axlBH+m`lfxl22yd9;bI_m&oIBVQZHNK==(m!q9`L1y^dhoD;~R1~&ocS|xqDqZU@wDPqnyY{TWfT~}dkfJXz zB;EB78l}*Iqs!HLp#|7Rs7ya1@+>0+ZXNQT$!m{^u_m0l8|eSSiy=X`VdfXYC0Ce> zwQ}SL%%|rfn~PRUYh{eDmH4NN2`&%OU69p!8cg<+%#+n%t=u;S3PFQsI(SJm@ZFhU zG0>I>oN&4wJ(h{3!=oZOsr=I!yzPe;p*<+3l!RMzD5>MdVEGW z4>hzUOxgNDNqnx2n@HZvoVtyU0_BAB>c@5WXA4!?aAp>t<3_Hz+`-p!@4ob7O6af0-P`J*kjWU>#3e%b_aSI->JeZx07ERNhm z3OvA0Hqq_92J`>2T@wgH&>f>^;PLad2_Yt%DuL$fpGt-MYjyL8My6+6$t*pO&Z_nZ zm-k^Uks~M%jOMIiX62wRySJ+gm<y<#e6CYOPej`4v!P?MM9>%4Pi_^M0al}G0%NE3P<4RYOt!m_v2HN-$xA+7sw zoj!Un46b9YUiD|1Y-@Et2f;uln|28A-djIyd{C*H3Yt7Rx%?5$pY^1wIpL|X8MS5O z<0Uv%ku07Q4(xFeXTeE%FURuPSI-$kl2S2|CBZGS)03_G2pTR2g;LU3oAu9DYwqy- z?z7AafzS_{4ialx`p;}G*!Y%kBMMvuUoRWlmCjAeM{d|KiLiQMQ?)1c=ec-sxr^+M zZ3!luqO;WM05d)Zof1cbFEM|HVq`_Xl9f(KitDJlzuAIQr(5WM8Q0-u6t_rJ+wv1!UXtNbv?`) zC1DeLyQ7&xVk+>_rSMwtza|;o(qp(>Pxc>4F(w$3mQDmp=wPv_`*#}-{lM$`ieZ6g zLgO?4H^biSNad+@A68BEVw!aC7X+G^#b_n56D<7Gk-u* z@MprtP}&Z%2y+D{VCFJlGTp5{JJ z@1+fZiGYg~GR%3CCxL90sdLJ` zvAkn?dA{d4za{L;K1{-6a8`SSHcS*RuU|7Ab%yG|=w~!C3;4bY^V0w9{*{s&-|g$U zFGl?CIP|<@sge1Ex@yMRsY>H()u`L7P-R}J>y3aD23nnD+sRwkw|XC4g_qfUtyzv^PG@LiOH=dju;corkd|VY4{6XA1 z4jsxhIkGxOcF0J1x`WIX*frcrW8-SG0v^^b3Z6n;7NBO`hd ze7I@-x)V8+19Pw%rncOriyqghwX5Rz?VevEM6l7r*hNNCAaVniU|imj83AMt5Gg6` z%(Qh*ToT_ZzqGP+i69s-E8+Y*abV0>T?l+UJA(sjjX+ zEl1E;T0dCnd`Uj*O!*i2#!=BJKr(mQeE0lgu+7GMm}GsawI{ltN<`>spd0O8*(8pi zJ#jLX3k$!L#oa7|+P94OkC(i(9fN>Kl2l@Y1_;z9nZ&uAq-lS3K!#E-1Uvoz!_lRq zFA9|<)7owacg;lIup^;6@hUx3LdR zAJFcp8e1Mw^&(g2+IEI0i^C&BH~yj*-5y?;pA&bxWs+&}W|sth%jsVnfYF0id+p_f zt2xz={V~`$2sBU3{y6N>-H&!8udeWgkjG}iamvJA{AO&_&sxe z5rUja=PNx%!{wM|rbz>gCHS|P^K4TI25y-DJjBy-(dd0h4+sTSm7z8J02S#UXyYM! zox#Wdn`HmWlDFzO_0`8|f~vF~)z^6a_Yi8TY4Jv@7&f>Ccp7V+OhTk^IN=Ob6Y*HRrR@kzj0pf{1oEAn!qlwN=Ei)4zt}7(u8Tm|AzN5 zYUjztYxJbn4VE9yj0xQ8;utFxiKX}XvOticpX-P`{=qYtXcsq!;6CLD1Jd!V8-Jbt zcEzx<+-Z;Q!bZMFPP96S*xWZdUau1kRYmP4@PRxh+{aV0SW~i`rOH)!JO546KTh|L zH<})c8lwE*=4zoX*+ukjJd`n;xE~vXyrqmoxt`~V`qiMV-TM_+Y$E-=KvcD!XP9AE z#_Inx&XmSkVpHcgiHCvhWjUcrfyGIzv}xeu#H(_eu-B32ayxdG_m9x#nYW&%>`o#= z&ZG@b8Z(2^34*A~*&KwBw&&00o3D(ohpI%ZXGMT$hU^Gt+1=8{&0KN=ZBe$k+t|YX zX;Rb$Gw~m&lOXO6>Hx`w$JvKp_Lil=Z@l@Av?k&AOIb+B@!S??t=p$H z122og!}s96C}3<~9`xkC2N_1P1Cuj2DRk?JLInw9f69lhaScNL2>R2ZL~M^h5STJ1=_1)o-*m z82(-oYxWeKOi+wYws3bpRwnKml)_VA$u+wn7qRqPa-h_T!l%m|C>yPzsiwulNQUB2 zS8c9PPGrIG!;msqw{?6H<=xxF%7;zM^8E4Xg1y1*Ewz;qysQ+H*4gtvOHBj?LdE~n zI`fAAMUmQ#hs~=X+}}Z?3PWYihKtfz>WT|d8J<$y4P|_7;0nM1Q#|8nG_+^@u=*{3 zsqKHx87%BEPegMF^#hivs19on-7?ZM8l5G_UJANo+|Q*aog`n=wxC;=AYrE z_l?NI?ge77PtvM>zM%Q_L+el@{(j^Lx&vFGA;#fM_hm@~8urqoJILE*X=#K^gE^vl z7B^#k_;^3jFc|>MV@Jp5dep z+f7d#%k}y`Oxa3 zlvI(1gbhE}EPPg+>g7LQDSfp9;OF^mhzk1R@(%2YzX+aRH@h&RPyN^+e!(g@HQzOA zJ#x9N&VKtHR1e?D0AYI{9{iA@!`J1wIog=KV0W5x%G?VEdStB2tGxwea6U@$Iw77DIiK&@XeoLs$^@WH@A$Ct~k{5 zuZn(m5h;ROjFjA9LEx$;>Md>04k&Alx6-ylUFz5%Q4&vS?pgaF?6RXLhK7XyTLHFi zJc0c~FZ(zgcI>i1Jm1uUs1EY_5*n|}n|R4%=zg^!xipqM_m;JNs**8v@1^aGf#i{^ zCs7@1@6{I31GJVmwcR@D<1)z{@qe-RmQhi@{kyk{giH^c`@htJ&xmZ zunHI0H7&VSy|J_O*KZag=A(Siq2@yuma#8375AM_&EV_OK>ylLAtpyd7`l>2>)FzrL zVHo64(*wv0?m?Ym0!dGMroSFgLb1n)B1x{bnY3Sdw!X2w;b55p${7wi$7YY&3Ug3k8(GP`xw1UfZswra2;m6 z9CQTDO)~Hw)@p->YBhN9QMY)G>64?75mF0E2X+B-!bz{|UMScD&|F6P`YLio&x|#U z4ol*celV3_q-?smp2q{HwEPI?6fHM7u)jx;j*~yl&jb57Nq`?&t>Z?W#1zt#a^3&i zBzi zxZ1~}vGKe^?7DTZ62=bf-ZjgiS^_=DACyXc#xfznwfTbteOV%p%bSMtyOAByGcdKV zqVLf)>`GmnUR4{j3UasN3cNYHLM+(=&O&Fj2c=Jr1l=W4oSUMzKoM%phcBwE!FO_6m3@Co|rz|k`#c^)W12L z8o(hr@qp3+%Mz5?b?{x52k*>Z_(=w@or^rW{v^Mct<&9XQY70m;+!n+k;)+&s}xx! zUt(tgs26!QH!EYO5X+#c_L-|J;2WUF*^N!O{J~8qv$*>NR-tL@pnS%@ZbVG(TUp57 zj3D0gq7WRiXx?pD99CBmN$Ig~*__U!tX=u&C47Ev|9GBu407k7Fp3^cCdG~d(riwYwg}oO9h>UI*CUpVOQ%+%5%Zz>W6B;2K0aWiyszadO{_;pA?Bj7Zr31ZkP!>Wy) zjo-_~ZVaev&_1YHG}r;4(MH~?I!Fb8MzU7tB7m{-K%QUo&rfp)aI#W0zv_6!onfm)+zzF*N9oYozr%`eB^4Gs1U}JREJZwvhw-Sncr;Y-1C=|B z+*(a@x$sRl;NJa5)=3oXZnPWynrbGxy!8l!h!3+>o#%m_>=4k5G455Q_ehzd;7k?J3IYzLvHWR z*RS+{W|)6p`WIXE?<@bKG|k)93|#*|P4EAF%>T0lm%n%Oe=F%Ahk_bS#T`^WU44T#C$>s0M#aXx4n9&0fbAPOW}iJYP%@Z zm=$09S%hv;TP4po8N{mlH8}n+@UVaMP}W3g!*BbG7pum@DUV^#R|5O^BbCxRW*37r zfJb(dPZ;FrTT~C%^)85aE}QVE|7eLHjAVM9k-`Op9xf3kH3CxsFrHWqwx-pnAZkFYZi`BU*fo3E+D=dsKyyN)7g^=M zTNCSUGiwCo8=eg`&W#+q159~}^lv}k7al|F)&QOMq=tA)u$ct*Sn^Op7@FTs;%3hO z9D41M+QRdqk2P@EQS@t(ifZ&v6~WCK)k#;l6nNo+C#`kSfPp@}?4*gAkDsTkP5e4<223Fy(O0_J zq#tl9PP(nKoiNkZLaFWVk~IQ*T4_=4)uG#+w8CQ|`72SNoTZYOR#P=wD#Pm}DVf^6 z?w@d$rI7Pmly?wocLFuybr0#MV1~u-Btll-z%IedaC&o4^vgPV7Bs*rYz{G^KxN#{ zZGpg`_3Z9rzgpUf7^UbD&`LKmbzifO0CO}rRF-DdfN__2QHKT+CNd2=3a$LEsdx7$ z8s1$$S*KKTBE#R`KhRW_#xw z+Hd`Q3s5C2pPY;_)Zb8Px&!IaKY_IxPvFe$o|nH-X3&ua@INOV1V8(t*IQ&!NW>(U zenfWr03PK9rf-z5-ZDBYUYn)4bL4s(0<)z;OxCR5574%eM8(D2Kbkro0CR|+K>`)M zs)V;wh^5|^Q8QTBfi{`HZ3eE1sNnWa^_XUfsR3ua%d{TbzJ!{6JbOI|^K2n2I%I zf(YrLsIi&$hlb+stH_S1xffA*w;DlcGthdTRVvzXo|7a(>7qY$Saz-;+^Cs_&^iz)S+n`wC~mo$K98bf*e7q|{Ag z%OkL@@~q3=W_=uZK2<>0J0+MS#4R~n-lVxwhRm`ZlCpRqZTxsJ6y1ur63JWxW1nku z`L{L-2F*yq`Wd~CmeyrGsmW2F^&IHQ~9r79@uX@Tr%{=*-cs5j*WW*#G9PR2Aj9TZL&#y z`^aJ(a|`EoMV8Euea|$B=gZ~7?RnJV+h^n29F6RLROg@LH!J(qFrY0R6+)kgO!-oX zQ531$;`sX6u#(l2D1Km^W_eoh9558wwbay5Q<(ZSaD{^DH&JFe*Xw74vaC#}>$CNl zWw`OQ>~zr&@@S8Fi|c!LKI{jrT-i`QY1FLrYL?0&d>N81D3mye`@>lEV|BsOhJP2U zKa{%Z6a9$dAMks;_6FKm0Akalr{Rl_s;1_yCqB^WvNWPoe1ftkEA-A^Z6U)uKLURDE7_2F`08b;mNTC$?Xe4vzZx{V})19ye|#$ zU5DOVhl$TpYECKSlO5Dh%#?)V3l_{+d?{Q!>o<5D@uc^1!lpYYj=Ia*E88D>Gc`n; zwVVG5&J-u>a!zozLe;LDr+pWTFU1K)6#tNC;(;A*6Q;znd)I9QO7(3vRx{WAscNP} z(QsTQ%!%%*ghtkir?v(JkMGOXWP$x2CpBJ?-bVUJeJ!i+s{o2`oI1;q{noP5Eo=ND zWyEZJuc+i-Dl#WglZL6^>gVLHJ8e;MWLAKr9PLf(UfNH(n}+4dE}A0cKk`RNR&xd{ z8k*@lqHdK%Z~oFzE4iLRgZtR}Rf~d)z08&t`~&;l52s6*%zOmHexgC%!OSl-&{qRZ zYSOUuoAL~DfifDWV(`p)Sy;cOoW>UaEO?QAs0F~|Z<;5u*X$S@04~dPd}M9>d$IVL z69;QJ06Q;YtX4YZJWk!vbZvDkR+U9?!(od-Msr$uc)AZ>95rxp1ZZxIJ(`6v&8_Ur z*r^jIJIpb{_&oyHy%JQ3X1R<~#?DKV219}HqBLa8;-bvyUKH{il_)4=J-^Nc(OC^d z00bydmE2fu)p33V%I3acBjosb#Z_FkE|GHbk~aA>0B|nw(HFnq-K3hn7!mjEWfFGBdXGVwkQm#0l|^I%ge%#AXwxQcQV$Y1LlwUK_iJ z4knjiI;Hm8wkAS5n?#Sq+9Dw^QBvmKM(3Bz>eg{AKYfD!8MZ)%?3NY)PGnZJHcfQK z$$Gq{kO!;U_fWmu8GHi6{NS@0!2j#ZjTwa4bUf>~mgcbVt(~sO_C}1u6|h_ruIlUu zJN+~8DQdE*Y5b7#aR0mK91Gdod0e;GA7ML07=DsCrnc0c0CrMkv6AJ@hGV1`qO2nJVBwC^VDaP}RFU$`s4Ct+5S&~+`tZ7ypv$#9XL z{bkd{9`&yQ{`d!MXH7cO_-_9D%0YHQg?nb!cA>396Nlg$sNUSK$F24%tGB>O#d2;E zt3!dJJ)x=JpXqaSyfu2qWF;Wy+*lVq`j6F8(whVsoA{4BlTVIAD?QxZeLW1beKJ0h zxVUv3Aa+A$7wV3WakSPd;pMI#3bsQS`3Fm>nnGtyDnm;qvMn^^T~s`P0gr zK9MQ{m1Cnn1R>AIB3hslMv0s>vDoA2%7j!_&lobo8e#K6CB!=`tpGrL2(W-wfLO+$ zD#Os?*cKZZNKpUkWe>f;e!?cAX1#XWpOz!Y$P@Ye`MUX}kDj5+}}yyr3&B zk4JG%2XHgaB}=8aX{8arj`Z1Z$wHLxdX&$JtZ1|7#u#o_avZy>i%_!61%b+$A2T`& zJrNZ9Z+7D1(S{@}o`Ax$0iS{U?zCbzTv&aDm-rSRAJ6B*$tyyyQ|Q5XChmsiUJ8>! zcCnY=NRZh14;j_vBZ|1M8a|>hw6unPyR=GzKYCZp6`q(Lgv_f#@J%(7Pkfp8Wt&ab z>dqBFG>K3}v}R2^kglYhBhLLn8zEm%&?e6Uiv&_W#Dlu6`qL7~UQbXdKM;>ifT@Cy zE)c(vZ}v@Je#lV$TMQ|c3-;La;dJ7k?7O%`rN!uPjJ&zr^Dyy*hQE9qi?lte5tkR% zR1T~@dd$EzoWh?`Qz-N8yMNCq|2QAl3g04vu(^u`&aUWWV;#Xgf2ziwDCXhz}LvN;c zrXu;5;D?vplcp-=r015E&~!w9O=$>VKR^7H;%?oS4?$Xs-?fn)r)8XBPnw)$z(1PB za|_sCXe))o?D~D0b)LRWTb(%Vc~*_?PW++lCL=eD=#o=m(t{>bE4x`HwQ^_9qnB1f zNIt|!@mMm{D(_V3meZ@|HKO(oW;;ANl4oAt<%oM^p?fdU|6-v{?WX8nGq`*y_nbdF zsOR5ahj4k!;cHFm%X|x@T<@0U-6I`nd$SVm)VELg7of=J(l%H+rtL`B%9PVBxHTMi z^PNX4Ebc#hQWq9@FmBkaoAK&g32$&l@6UnMHuB^1tWDM=Zi>0vn#3svZXvhyJ^zm8 z6+bv`N#%yFgct>0fr%MW>&=}Z2>zp)AGD|(;bJ~7C_2=5(=O4-${WienG6MN)| z5((dg@4I_;ywa()>>1>=$0r$XT{^57y5|-w^ZT##JO(+vzQ)@^f8;~n`r)R?C~0vD zj=Y-tewWK|B%Oj&KPFjrQS0oj)yQ~x8eeUZ!YKq|Q6}V=u6c|n5e464M&wtF*1zH+ zcP56WN%ot~7M&7|r2O9Yrq`-%Fj`85Q6}7UvAPu3?aJDb9TcDfpbyARZwqOseCRJf z2r_zjk~D3KY-~Qc>&7CtK*Hbx!`7M7Hk;wQ3hHnsP0q}CcI%L!-^rPJ_Vy}=1~%yH zyXumt%wOg)&U{MluQVaO8LMjp?p3}D&$J1}kLWUz725J=A?y07A!*WxoxXJMn3c#C zg}$vPIF7k*VlCu9DY)>pH|^(O<8b^Y9TK?<{4WIbMT@wrAoMiMwEDw-4O7XTY6}=W zO^rZtB#gqFT3O-b`4xtO!$t#s>l0CWahBuO@3<}BDd1}pD9>@9zTgP*04;XGh3utw zOl%>)72EY0ed~{Uq-lNCl_%E5@}8X!1o+^FfljtWOS-+Q&nOJ@tV`XSy*5S9#@tb` z566;yuYvv&?7Od^4J*l9s%7X*`BsO7%CJD2Z~H6C+nzrcEhP6>z0X|w4J{9k`L)Vc zBD*HY9y4+Mk#2u40K)73on+8{L90EOlMW|s>;0tyre^5geVy7|^fc0A)XzTOfR>dh z2-O+8p_t8=!hSc`ywdGP82 zD+|xsexztx^AD@%AttP6B2Hw`q%toI)X|BQuyl6^YX}f%a1Li8Co=@2P*{Ym9OvM< zb#s+$C!1&HB~vr;T3x&peK0Qs=6vYakSrby)jyNSN!BX8CSrfCoYYrUB=mttXW=>1 zE>O`_M&v{s-lGiwa^-3C>W0JAwSGae_X=H{_D113lwqPb&tKhE`C1L_HL>|3X{<|D z`yED0#hhDh&0{(Q1nZCmXlXNSv*nR`m+?Yc1?Y3qi*;u9NUg_UJomwiW4&Vtb6tkH zNb!mIF6rxgRms4DnYubK?j(Tbd~BAGQ!2_R{?Xs6J(F*8@%@**$e8~9q3M-*=-1Z% zh9_|2LLu*u1EumHzL*cHhn)tkx@byY7nJ$qkGZY{hP-OB8kKAzoi^BIV#{i72$gxZX7Q^ zPnPDAJEr|z=z*!t9XJn>A|2#)QewlGpL%R?bcp3}8VNhZ&Qpxk-LjLe&h%O`IV589 zA|>ise453HqB8oT!BE%MDiZH-3lZC9rk zbwjWC%)k68+nJsg@ zXP;xXTtseXE>asuf9$awRC4B_jK(2{S%GU{}7%i|bzxnf=0pR#(O^!*6FALx^RU%m&b78cOJy zJcthnslpFtn9V3P_?f_{!IbAGmTIP3ff2Ybnm!XVecxAmQpVYKR+lVWoF?3TJy8}{ zIO-RBsZg+B54$VdMg2n+A0uLO3TG<*X=jc;Cw`50^<`W(W#G8w@g%qq=E|lHg_;EZeslI(mhX$NYx45q&d(Eg%{$$v zFzgwsI0GygAv#m8J);RtXtJ};Acq9<4 z-@e4jQ1s;raoT=1)f#K^xo&9sPh9SD%D-^AuklYzcE=^0;vEdBE*|$Zx;t)7>#66P zFjVfM2BfGR+R$4Brr6tUU%3yTYiF*hgd?{-n8TR{iEBy8?QF+PFjx=LpZ{Eq-sL{o zzN@zrG1&I5f-5zuH6T8FC4mCZ5fPIR;)$3pGBK@qQ|`O7&U*mE zt=W9aG;<41#)hmxb<*=3rc&f37krLgYzL}#of&sj+mDPwlXpbVa%S4;_VT%n?@3`O zoxrPZ3Amy*Ww!v_4cq@B?V3?~D!a={QJ(|UlX?NV2 z2X6W>+E-K9eV-tT>arqDY)9g)Q^xCjB@!osPB!U$W{U4a^frfgs0i zd-Q&v!co@eh0Na~WZzw3Z7o&R)szca#J2wIr0=pDnO{(8QfznBU4P=e#!`(A0(Y$% z0c%wR6X`1{pksOKT`sfl4+g54ZNL>*2V?QW4OcbTnMYG10K_;rQVfleKYZ{T_VAOjYg?%y#?Y&ca9E8MC6ZZu<_AS=ka!G z!=B%b6iP_o7)1FVSs>P)zI=4L4OSBP<}sB{>YW#z#m?9X;k*u@{e<}AI#h*WntzX9 zjjp`VKa=ko`E6hsOse~I#AYz2x#-k^7(;3v;lT`mYL6;0a?_FG-0?lZ`ZA=*k!4@Q z;&YMRby> z@KO4n`OmGWM*Paus9%?#g#qXmy>RiH_b*=$K@2s$H1w;-kGOG?kVSA5^Of8l2JNM7 zoyop%y#HMq&U6PxHZS#v8X1O(mOmt3Pw~@#NW5Eyy$fMhY(H7u#VzfsS{CB0ZGotD z!EXl^X!dcpLeFnM!+qe#XHd~OvwU8DfnfDq#W@}rm0A>6)}czpHYB7`+`3x(?`_}R zd{NoaYA7d6t90D-kXfpN!`>XCSGCi|vUOGRBW-&(JO+cJu28z0>zH4(M!*0?p711~ zZ!}3Xqv`v$KD6M)M#r~DNf1rIny>8scjfG+!WghQ$w0ev^I#|^c0-XG+h9v2Q`a<%(LD+KGIoTB{iN5 zWLCM@v+w2i*~0#Wbja~BeGF`0-kJMq@abF^`Y zL0Nz{$P6+!t zEG!>S`2|~AcW=K=4d1}rHx~I?^C(~cjOFfR%;FcXNn6ME;wv)k5Hid6t9umwWnD&d z(p0}clAvLxj2vkKMysb&GWSK*@@+EnKXx0E_IR6lWv;UZX7vU18OikdyjJ|MVUUi^ zYO)RFwraVuc9K)Mr&k&U?!XPtl?eM5?aW%A=_@!t?hQX#onwrQZfSttt`y}K`&wu&C3QxEivpxiu^RTN$_G->yO?ayp};jR|cur062 zUY{^qA%1Y^YQhv{>E%YS&_XkucLA+^K!Nh0;@Z8d&1WV*l^FeX-3guop&V z&hl~bt5hFB%W}U!LQ+Iz!MHeA5&-^>{AQbvjw821DIfCjSQ#Ai^4cco8|6C(6hvsB zI47ex-!z(x=uor;w%CcsMxwUG8)I-(qtiW9%r5M*g4?Cyy(ZKS(&q-crgznY1vW~# zt=X~WdZOB#vxTk_A?D40dZFN-b*6Q3LLSs->^9^LsOl#;M`^iEUJmK8Gh^UuInH&O zM3OWKUVVrjS=8pgtDSu-be@jKBzxGi5uIS~GsnQfT50(18NMt`Pp7%%=AJYe>@is? z$}}PR84QCq!{Zl<_kdBGkj1AyEr0k`_IeEUd+!%h8Qk56j25CmQ}j2=U*qQiG5Y1Y zG6n1OhaLW#OL0278&{o2P4Z1Us)#oFdEZY_m+$4}B>+UM1~ez9J-3gS>rF;RuU2c# z;_EL!FkeCuhk~^LpaL}Ii=N3jW5J2?H?PcO&Z@y2i2=^l(r48>s^4ysUgcc1nRl1j zJ{o+h)Rlll6>JV5(2^XP()%rQbi0vup6X|j{L0PU?BEfW&Z54M=%>_O)o?$NI+mwt zGU(P_^cP>U(`1O^C2t1W9L*1@_s4me`$nM?G$lKb)%Yt(kZ#y9*NPk9Z0jEALW__| zK1O-7JyDvAL6HdNKs;tnwcl9S$5aU`7+d^9NMQFE zKOz2xP~b0LVj62RymitY>I#@&xrunBgbQFg?pR(GTM=&$(;9nhE-@h0EmAbE*0%B6 zeoF+O#Bv5*5;b*NorJ6?mb0K=Rp#3zon;=F!Ph21Y?{*?>;MDVxl}fgY3$-x(M9@g zcNet>sLwckTvyFAD7B5Tb|36w;Wb7SWY@x`2peLCo3vE)9W&)isJzb_QJO`)yhzai zg(4#t>|L@CAfJ+f`tG5WzxCbGb%PFi2(p*q6u>`qgkuIqo`Zw zoi1#jp0(ZMYY&xctIKYcpo-PxsS<&~0jlX#23;xmT0OZ`CyXou#Qe4gMx%VVNJqCM zY!n|?eiz-^v~|(%@kGRb>&nvXe^*{dD{N;;c{ycyx2EIVEtcg5&HH-o(e<1~lmY5) z^pi0e+syn$R$|%4%dvaZJ)|Nl{CdP2R(clADm-{V_4X6r5zkq703dwa+Wo5JqN(lX z(^jMr6#&>EL|3rUE7plsfnSYN}4X#cd;w5inN9w~#~k4@X`6}MnAl0fF3HtS$5 zQp{jm(2Kufj8yz3s^+PFMCtIrl8ZGL{edz6!@=j{5uqzn^KE6b$~42s+04Xl{87^d zQi5wym*%uy#2mgXy7Vd)!mpX=&Pi~T)sMX7OX4KJ8-j3+NAmgf-oJnHx5hi=b*8fF z%+;24j%WJuD$|@x$Y948M}YEwwQO(LHXcAk*(Iv>^=`|Gh_|reL`8y^a@db|=eV2buekjsCLa8IzK#HH#cdS23<1 zmQ0|CgaPT96ZH*0G69<14#)v=XfDziR^Vx|Af?r@;UWBswnX%UT6 z53jA*j~wqqIkC_;Ohf#|0{dZCi6ojul>>%YyZaas$L;1H))(+!2CH+>+$7wl)Ny~D z#y>;r0ZkW^@bG)(669GjeWg?pWiELaMNqt~MOnTXXfY9--BtAIC<8Lvwi0eZ@|4oeWfaH9Gd=hFh)AtwYX*WN-ZpQ# z(+4}L`1RyHf;|<7N5qk?>Bwvqi=35dt?>5%jNZRG_8(hVyvl+q%lob!0B+2Bnv$sU z#=a7J&yhx*TiGsnuk=k@WbF^tE%9>vCnS6u5^h?;eBO|E?*q|66tccg!nq}qwc2;q9nqlQHs>fi4K^OFB2P#ZRjQ!1o9+PU*TdKkvP zUmI|#@$?{gjzDZSk|}BB5z>)&d?w=2u@;Lt!MIV1gSCAxJI?ZQean?pn{zclRiQG# z>{5try)<(_6hf#2?^5&B^AtkKY9l0eFsLVcPewGh8Va$_L1rS=kjHbnn_89D!mCOs z5u5)oiZaF}z0*5A@^0A@yI&oE{*pGYJYW7Tddb)aZG8RZTrLesT%{d>MgNVfv`v0W zkzJTJFfv|XF={!BLZZ*H2tNZHwP06%_rajY350c=#l1R7`2PVvk^EJ3;+_2fH>rv%dt@?@0tJF>e{jkb4h4 zeEWPKSADpx9^RiCB{900z{DSq^o}#{qz>nB+(>;3_cY;v$K=%1$~W0^+uF*0I?Cs~ zKhq(OvV3dd@!_Hb0?O=HI7+*FDC|07 zq9WJK+IZzgBpseP5l`mndZWY#?>5aV5OGnCdhS@bSUrjPX%-oSo=pdh9;$8yyG%Z*lhw@3PzZD0^BA z4w3UGaZq76WOUGE2;xZk)(5RRw%UI_<;6O*Yq3bXA>V7Pr7W~Pc@lZK8$dpgFKwki z+r!8{@b&4&!}4xoQVru7+hz;FoYaSvaVquGV%OeZ!I*^CGejGyIF({FLsRkIs~Ocz zKTMVg;bir=T_|`@f=aOl)J}Dh(DMnrB&1wxpgPXzD@tB{&4aPu3$iVUfjSa!q&sZ< zdF>7Cu9wzA?_e;k#}!?g3%7L7X$8)AA>D*x45IpMOs0gTYx;hX^XwSE>~9|Gc>fG_ zD*bxs2{E`it8Us;bCT{-oe|_z;2gZ}^u3D0T<`VvL`1lOF*8V#iP==+S`B3or?Loh zI5?dZ($UjENNaFy7;=5u_Z-{i-q6^tDsesKNrXH2=ejkU^>dYK85f3f!4MPhC_*Ce zRPWRDsf~p7?19PG)+0=G1P09M-1oLPjUN_NB~{|wcfUJ{Wvq{+8mKMX@C7Z_vG3dw zz>7m`&hwp9iRWQ?PI4$8Z=6LCzKE|SwRL8L=yc}V9p`JtI)chHyHSspFx+e2nOlUE zrsxTA?%Srlv$f#Uqv)1Bhg^9?`GU+}@6uyx_H>Sw#SI#NL7^_Zgu8`hOZ*o!Sy#UW zi6`IBITSuKe$oF*P|AE_lPnev?xb0odZU+Sifvjm^zyI*NY&2gd2)PS?to4ifXwN9 z98j;he5ACG9__0n0>`mE^x!=2_4WO4Z30VWY-q0aaV%s4xEJ6nrL-?iSM)n~NrhcG zWR{jx)z{Dv&GBPMt3nM$p$IeI8)_t{h!LXA8Qa-ZsN-Ij7{zke&E>tmveTDiV_1%% zmo)iHx&pO&QgyTMRN8W}QIrMixc@I5z`LFFE8(yY5`-`LkOQRSvR zGi%!87iyH^u!CXjAJOZ^8{n@L zN_SQm;@&fBJ7sc1p07MX4z1rISR-_<{*|?yJ8AQ^dmc|oCXN3C(U>l+x>

?@KqP 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 gf%^a9bxtoY6%vi7IxPeptide Properties

  • Introduction
  • -
  • Container API Design Guide
  • -
  • Blast Container
  • +
  • Container API Design Guide
  • Alignment
  • Clustal Omega
  • From d85b408967adad90d7e60b5b1a57a9b65d53c753 Mon Sep 17 00:00:00 2001 From: kMutagene Date: Thu, 20 Feb 2020 11:25:35 +0100 Subject: [PATCH 05/13] Add dependency constraints --- paket.dependencies | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/paket.dependencies b/paket.dependencies index 9a77b8f1..8e8f3cc3 100644 --- a/paket.dependencies +++ b/paket.dependencies @@ -5,7 +5,7 @@ framework: net45, net47, netstandard2.0, netstandard2.1 strategy: max nuget FSharp.Core >= 4.7.0 -nuget Alea +nuget Alea >= 3.0.4 nuget FSharpAux >= 1.0.0 nuget FSharpAux.IO >= 1.0.0 nuget FSharp.Stats >= 0.2.1-beta @@ -15,7 +15,7 @@ nuget docker.dotnet >= 3.125.2 nuget SharpZipLib >= 1.2.0 nuget CNTK.CPUOnly >= 2.7.0 nuget Microsoft.Xaml >= 4.0.0.1 -nuget Argu +nuget Argu nuget Expecto nuget Expecto.BenchmarkDotNet nuget Expecto.FsCheck @@ -23,8 +23,8 @@ nuget Expecto.FsCheck group BioDB source https://www.nuget.org/api/v2 nuget SwaggerProvider >= 0.10 - nuget YamlDotNet - nuget FSharp.Data.TypeProviders + nuget YamlDotNet >= 8.1.0 + nuget FSharp.Data.TypeProviders >= 5.0.0.6 group Formatting From 8e463f8cbc87797261520519b876b836d0b55bde Mon Sep 17 00:00:00 2001 From: kMutagene Date: Thu, 20 Feb 2020 11:26:25 +0100 Subject: [PATCH 06/13] Improve DSL for Blast biocontainer API --- src/BioFSharp.BioContainers/Blast.fs | 120 +++++++++++++++++++++++---- 1 file changed, 105 insertions(+), 15 deletions(-) diff --git a/src/BioFSharp.BioContainers/Blast.fs b/src/BioFSharp.BioContainers/Blast.fs index be1cd6f2..fc271a46 100644 --- a/src/BioFSharp.BioContainers/Blast.fs +++ b/src/BioFSharp.BioContainers/Blast.fs @@ -7,7 +7,25 @@ module Blast = open FSharpAux.IO.SchemaReader.Attribute open BioContainer open BioContainerIO - + + ///Input file type for makeblastdb + type MakeBlastDBInputType = + ///fasta: for FASTA file(s) + |Fasta + ///blastdb: for BLAST database(s) + |Blastdb + ///asn1_txt: for Seq-entries in text ASN.1 format + |Asn1Txt + ///asn1_bin: for Seq-entries in binary ASN.1 format + |ASN1Bin + + static member make = function + |Fasta -> "fasta" + |Blastdb -> "blastdb" + |Asn1Txt -> "asn1_txt" + |ASN1Bin -> "asn1_bin" + + ///Molecule type of input, values can be nucl or prot type DbType = | Protein | Nucleotide @@ -16,20 +34,75 @@ module Blast = | Protein -> "prot" | Nucleotide -> "nucl" - - type MakeDbParams = - | Input of string - | Output of string - | DbType of DbType - | MaskData of string + ///DSL for command line arguments for the NCBI makeblastdb tool + type MakeBlastDbParams = + ///Input file/database name + | Input of string + ///Input file type for makeblastdb + | InputType of MakeBlastDBInputType + ///Molecule type of input, values can be nucl or prot + | DbType of DbType + ///Title for BLAST database. If not set, the input file name will be used + | Title of string + ///Parse bar delimited sequence identifiers (e.g., gi|129295) in FASTA input | ParseSeqIds + ///Create index of sequence hash values + | HashIndex + ///Comma-separated list of input files containing masking data as produced by NCBI masking applications (e.g. dustmasker, segmasker, windowmasker + | MaskData of string list + ///Name of BLAST database to be created. Input file name is used if none provided. This field is required if input consists of multiple files + | Output of string + ///Maximum file size to use for BLAST database. 4GB is the maximum supported by the database structure + | MaxFileSize of string + ///Taxonomy ID to assign to all sequences. + | TaxId of int + ///File with two columns mapping sequence ID to the taxonomy ID. The first column is the sequence ID represented as one of: + /// + ///1 + ///fasta with accessions (e.g., emb|X17276.1|) + /// + ///2 + ///fasta with GI (e.g., gi|4) + /// + ///3 + ///GI as a bare number (e.g., 4) + /// + ///4 + ///A local ID. The local ID must be prefixed with "lcl" (e.g., lcl|4). + ///The second column should be the NCBI taxonomy ID (e.g., 9606 for human). + | TaxIdMapFile of string + ///Program log file (default is stderr). + | Logfile of string + ///returns the string form of command line argument DSL for makeblastdb + static member makeCmd = function + | Input (path) -> ["-in" ; path] + | InputType it -> ["-input_type" ; MakeBlastDBInputType.make it] + | DbType (dbt) -> ["-dbtype" ; DbType.make dbt] + | Title t -> ["-title" ; t] + | ParseSeqIds -> ["-parse_seqids"] + | HashIndex -> ["-hash_index"] + | MaskData (paths) -> ["-mask_data" ; paths |> String.concat ","] + | Output (path) -> ["-out" ; path] + | MaxFileSize fs -> ["-max_file_size"; fs] + | TaxId tid -> ["-taxid" ; sprintf "%i" tid] + | TaxIdMapFile (path) -> ["-taxid_map" ; path] + | Logfile(path) -> ["-logfile" ; path] + + ///returns the string form of command line argument DSL for makeblastdb with paths adjusted for container localization static member makeCmdWith (m: MountInfo) = function - | Input (path) -> ["-in" ;(MountInfo.containerPathOf m path)] - | Output (path) -> ["-out" ;(MountInfo.containerPathOf m path)] - | DbType (dbt) -> ["-dbtype"; (DbType.make dbt)] - | MaskData (path) -> ["-mask_data"; (sprintf "%s.asnb") (MountInfo.containerPathOf m path)] - | ParseSeqIds -> ["-parse_seqids"] + | Input (path) -> ["-in" ; MountInfo.containerPathOf m path] + | InputType it -> ["-input_type" ; MakeBlastDBInputType.make it] + | DbType (dbt) -> ["-dbtype" ; DbType.make dbt] + | Title t -> ["-title" ; t] + | ParseSeqIds -> ["-parse_seqids"] + | HashIndex -> ["-hash_index"] + | MaskData (paths) -> ["-mask_data" ; paths |> List.map (MountInfo.containerPathOf m) |> String.concat ","] + | Output (path) -> ["-out" ; MountInfo.containerPathOf m path] + | MaxFileSize fs -> ["-max_file_size"; fs] + | TaxId tid -> ["-taxid" ; sprintf "%i" tid] + | TaxIdMapFile (path) -> ["-taxid_map" ; MountInfo.containerPathOf m path] + | Logfile(path) -> ["-logfile" ; MountInfo.containerPathOf m path] type OutputType = @@ -175,6 +248,23 @@ module Blast = | Num_threads of int | Max_Hits of int + static member makeCmd = function + | SearchDB (path) -> ["-db" ; path] + | Query (path) -> ["-query" ; path] + | Output (path) -> ["-out" ; path] + | OutputType(format) -> ["-outfmt"; string (format |> OutputType.make)] + | OutputTypeCustom(t,p) -> let tmp = + p + |> Seq.map OutputCustom.make + |> String.concat " " + match t with + | OutputType.Tabular -> ["-outfmt"; sprintf "%s %s" (string (t |> OutputType.make)) tmp] + | OutputType.TabularWithComments -> ["-outfmt"; sprintf "%s %s" (string (t |> OutputType.make)) tmp] + | OutputType.CSV -> ["-outfmt"; sprintf "%s %s" (string (t |> OutputType.make)) tmp] + | _ -> failwithf "Output format %A does not support custom columns." t + | Num_threads(i) -> ["-num_threads"; string i] + | Max_Hits (i) -> ["-max_target_seqs"; string i] + static member makeCmdWith (m: MountInfo) = function | SearchDB (path) -> ["-db" ; (MountInfo.containerPathOf m path)] | Query (path) -> ["-query" ; (MountInfo.containerPathOf m path)] @@ -193,9 +283,9 @@ module Blast = | Max_Hits (i) -> ["-max_target_seqs"; string i] - let runMakeBlastDBAsync (bcContext:BioContainer.BcContext) (opt:MakeDbParams list) = + let runMakeBlastDBAsync (bcContext:BioContainer.BcContext) (opt:MakeBlastDbParams list) = - let cmds = (opt |> List.map (MakeDbParams.makeCmdWith bcContext.Mount)) + let cmds = (opt |> List.map (MakeBlastDbParams.makeCmdWith bcContext.Mount)) let tp = "makeblastdb"::(cmds |> List.concat) printfn "Starting process makeblastdb\r\nparameters:" @@ -206,7 +296,7 @@ module Blast = return res } - let runMakeBlastDB (bcContext:BioContainer.BcContext) (opt:MakeDbParams list) = + let runMakeBlastDB (bcContext:BioContainer.BcContext) (opt:MakeBlastDbParams list) = runMakeBlastDBAsync bcContext opt |> Async.RunSynchronously From ea101a7f8d73bcf1fc19d993f3eda43ec81d34de Mon Sep 17 00:00:00 2001 From: kMutagene Date: Thu, 20 Feb 2020 11:43:07 +0100 Subject: [PATCH 07/13] Add Release Notes to docs page --- docsrc/tools/templates/template.cshtml | 1 + 1 file changed, 1 insertion(+) diff --git a/docsrc/tools/templates/template.cshtml b/docsrc/tools/templates/template.cshtml index 0432e8fc..08d7796a 100644 --- a/docsrc/tools/templates/template.cshtml +++ b/docsrc/tools/templates/template.cshtml @@ -41,6 +41,7 @@
  • Home page
  • +
  • Release Notes
  • Getting started
  • @*
  • From 36cc63a6565bd98d961a7df32323efc7fadb6b3f Mon Sep 17 00:00:00 2001 From: Lukas Weil Date: Sun, 23 Feb 2020 16:28:08 +0100 Subject: [PATCH 08/13] improve Sailent.compute characterization speed (#82) * improve Sailent.compute characterization speed * fix Sailent.compute negativeBinSum Negative bins should not be assigned positive binSums, making the abs function erroneous Co-Authored-By: Kevin Schneider * fix Sailent.compute positive binSum Unnecessary abs function might decrease speed Co-Authored-By: Kevin Schneider Co-authored-by: Kevin Schneider --- ...rprisalAnalysisEmpiricalPermutationTest.fs | 92 +++++++------------ 1 file changed, 35 insertions(+), 57 deletions(-) diff --git a/src/BioFSharp.Stats/SurprisalAnalysisEmpiricalPermutationTest.fs b/src/BioFSharp.Stats/SurprisalAnalysisEmpiricalPermutationTest.fs index 371509b2..3f15292d 100644 --- a/src/BioFSharp.Stats/SurprisalAnalysisEmpiricalPermutationTest.fs +++ b/src/BioFSharp.Stats/SurprisalAnalysisEmpiricalPermutationTest.fs @@ -27,10 +27,6 @@ module Sailent = let private createSailentResult raw abs pos neg iter = {RawData=raw; AbsoluteDescriptor=abs; PositiveDescriptor=pos; NegativeDescriptor=neg; BootstrapIterations=iter} - let private getDistinctGroups (cons:OntologyItem array) = - [for ann in cons do yield ann.OntologyTerm] - |> List.distinct - //create distribution of iter weight sums for a bin of size binSize let private bootstrapBin (binSize: int) (weightArray:float[]) (iter: int) = let steps = iter / 10 @@ -51,30 +47,15 @@ module Sailent = loop 1 [] - let private getBins (term:string) (cons:OntologyItem array) = - [for ann in cons do - if ann.OntologyTerm = term then yield ann - ] - - let private getNegativeBins (term:string) (cons:OntologyItem array) = - [for ann in cons do - if ann.OntologyTerm = term && ann.Item<0. then yield ann - ] - - let private getPositiveBins (term:string) (cons:OntologyItem array) = - [for ann in cons do - if ann.OntologyTerm = term && ann.Item>0. then yield ann - ] - let private getEmpiricalPvalue (testDistributions: Map>) (weightSum:float) (binSize:int) = match Map.tryFind binSize testDistributions with |Some dist -> let testDist = dist float (testDist |> Map.fold (fun acc key value -> if abs key > abs weightSum then acc + value else acc) 0) / (float (testDist |> Map.fold (fun acc key value -> acc + value) 0)) |_ -> 10000000. - let private assignPValues (testDistributions:Map>) (testTargets:(string*int*float)list)= + let private assignPValues (testDistributions:Map>) (testTargets:(string*int*float)[])= testTargets - |> List.map (fun (name,binSize,weightSum) -> createSailentCharacterization name (getEmpiricalPvalue testDistributions weightSum binSize) binSize weightSum) + |> Array.map (fun (name,binSize,weightSum) -> createSailentCharacterization name (getEmpiricalPvalue testDistributions weightSum binSize) binSize weightSum) ///utility function to prepare a dataset column for SAILENT characterization. The ontology map can be created by using the BioFSharp.BioDB module. /// @@ -125,34 +106,31 @@ module Sailent = if verbose then printfn "starting SAILENT characterization" - // get distinct ontology terms in the dataset - let distinctGroups = getDistinctGroups data - - // allocate test targets from the dataset + let groups = data |> Array.groupBy (fun x -> x.OntologyTerm) + let absoluteTestTargets = - distinctGroups - |> List.map (fun (termName) - -> let tmp = getBins termName data - termName,tmp.Length,tmp |> List.sumBy (fun x -> abs x.Item)) - |> List.filter (fun (termName,binSize,weightSum) -> binSize>0) - - let positiveTestTargets = - distinctGroups - |> List.map (fun (termName) - -> let tmp = getPositiveBins termName data - termName,tmp.Length,tmp |> List.sumBy (fun x -> x.Item)) - |> List.filter (fun (termName,binSize,weightSum) -> binSize>0) - - let negativeTestTargets = - distinctGroups - |> List.map (fun (termName) - -> let tmp = getNegativeBins termName data - termName,tmp.Length,tmp |> List.sumBy (fun x -> x.Item)) - |> List.filter (fun (termName,binSize,weightSum) -> binSize>0) - - let absoluteBinsizes = absoluteTestTargets |> List.map (fun (_,binSize,_) -> binSize) |> List.distinct - let positiveBinsizes = positiveTestTargets |> List.map (fun (_,binSize,_) -> binSize) |> List.distinct - let negativeBinsizes = negativeTestTargets |> List.map (fun (_,binSize,_) -> binSize) |> List.distinct + groups + |> Array.map (fun (termName,tmp) -> + termName,tmp.Length,tmp |> Array.sumBy (fun x -> abs x.Item)) + |> Array.filter (fun (termName,binSize,weightSum) -> binSize>0) + + let positiveTestTargets = + groups + |> Array.map (fun (termName,tmp) -> + let tmp = tmp |> Array.filter (fun ann -> ann.Item > 0.) + termName,tmp.Length,tmp |> Array.sumBy (fun x -> x.Item)) + |> Array.filter (fun (termName,binSize,weightSum) -> binSize>0) + + let negativeTestTargets = + groups + |> Array.map (fun (termName,tmp) -> + let tmp = tmp |> Array.filter (fun ann -> ann.Item < 0.) + termName,tmp.Length,tmp |> Array.sumBy (fun x -> x.Item)) + |> Array.filter (fun (termName,binSize,weightSum) -> binSize>0) + + let absoluteBinsizes = absoluteTestTargets |> Array.map (fun (_,binSize,_) -> binSize) |> Array.distinct + let positiveBinsizes = positiveTestTargets |> Array.map (fun (_,binSize,_) -> binSize) |> Array.distinct + let negativeBinsizes = negativeTestTargets |> Array.map (fun (_,binSize,_) -> binSize) |> Array.distinct let weightArr = data |> Array.map (fun ann -> ann.Item) let absWeightArr = weightArr |> Array.map abs @@ -167,7 +145,7 @@ module Sailent = let startTime = System.DateTime.Now absoluteBinsizes - |> List.mapi + |> Array.mapi (fun i binSize -> if verbose && (i % (absoluteBinsizes.Length / 10) = 0 ) then @@ -177,7 +155,7 @@ module Sailent = let tmp = bootstrapBin binSize absWeightArr bootstrapIterations (binSize,Distributions.Frequency.create (Distributions.Bandwidth.nrd0 tmp) tmp) ) - |> Map.ofList + |> Map.ofArray if verbose then printfn "bootstrapping positive test distributions for %i bins" positiveBinsizes.Length let positiveTestDistributions = @@ -185,7 +163,7 @@ module Sailent = let startTime = System.DateTime.Now positiveBinsizes - |> List.mapi + |> Array.mapi (fun i binSize -> if verbose && (i % (positiveBinsizes.Length / 10) = 0 ) then @@ -195,7 +173,7 @@ module Sailent = let tmp = bootstrapBin binSize posWeightArr bootstrapIterations (binSize,Distributions.Frequency.create (Distributions.Bandwidth.nrd0 tmp) tmp) ) - |> Map.ofList + |> Map.ofArray if verbose then printfn "bootstrapping negative test distributions for %i bins" negativeBinsizes.Length let negativeTestDistributions = @@ -203,7 +181,7 @@ module Sailent = let startTime = System.DateTime.Now negativeBinsizes - |> List.mapi + |> Array.mapi (fun i binSize -> if verbose && (i % (negativeBinsizes.Length / 10) = 0 ) then @@ -213,14 +191,14 @@ module Sailent = let tmp = bootstrapBin binSize negWeightArr bootstrapIterations (binSize,Distributions.Frequency.create (Distributions.Bandwidth.nrd0 tmp) tmp) ) - |> Map.ofList + |> Map.ofArray if verbose then printfn "assigning empirical pValues for all bins..." //assign Pvalues for all test targets - let absResults = assignPValues absoluteTestDistributions absoluteTestTargets - let posResults = assignPValues positiveTestDistributions positiveTestTargets - let negResults = assignPValues negativeTestDistributions negativeTestTargets + let absResults = assignPValues absoluteTestDistributions absoluteTestTargets |> Array.toList + let posResults = assignPValues positiveTestDistributions positiveTestTargets |> Array.toList + let negResults = assignPValues negativeTestDistributions negativeTestTargets |> Array.toList createSailentResult data absResults posResults negResults bootstrapIterations From 410b2392f3fc349862b9b0c401615c162cfe0523 Mon Sep 17 00:00:00 2001 From: kMutagene Date: Wed, 26 Feb 2020 14:03:29 +0100 Subject: [PATCH 09/13] Fix GitReleaseNuget build target --- .gitignore | 1 + build.fsx | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index c900db57..e13934f5 100644 --- a/.gitignore +++ b/.gitignore @@ -186,3 +186,4 @@ docsrc/tools/FSharp.Formatting.svclog docs /temp /pkg +.ionide \ No newline at end of file diff --git a/build.fsx b/build.fsx index d97649d6..86ae784b 100644 --- a/build.fsx +++ b/build.fsx @@ -594,7 +594,7 @@ Target.create "GitReleaseNuget" (fun _ -> let tempNugetDir = "temp/nuget" Shell.cleanDir tempNugetDir |> ignore Git.Repository.cloneSingleBranch "" (gitHome + "/" + gitName + ".git") "nuget" tempNugetDir - let files = Directory.EnumerateFiles bin + let files = Directory.EnumerateFiles pkgDir Shell.copy tempNugetDir files Git.Staging.stageAll tempNugetDir Git.Commit.exec tempNugetDir (sprintf "Update git nuget packages for version %s" release.NugetVersion) From da0ba0cfa8807fad2032be66054125bd12f732c2 Mon Sep 17 00:00:00 2001 From: kMutagene Date: Wed, 26 Feb 2020 16:39:08 +0100 Subject: [PATCH 10/13] Refactor SOFT Parser --- src/BioFSharp.IO/BioFSharp.IO.fsproj | 1 + src/BioFSharp.IO/FSIPrinters.fs | 158 +++ src/BioFSharp.IO/GenerateSOFTTypes.fsx | 326 +++++ src/BioFSharp.IO/SOFT.fs | 1801 +++++++++++++++++++----- 4 files changed, 1965 insertions(+), 321 deletions(-) create mode 100644 src/BioFSharp.IO/GenerateSOFTTypes.fsx diff --git a/src/BioFSharp.IO/BioFSharp.IO.fsproj b/src/BioFSharp.IO/BioFSharp.IO.fsproj index 3d44103f..57655c44 100644 --- a/src/BioFSharp.IO/BioFSharp.IO.fsproj +++ b/src/BioFSharp.IO/BioFSharp.IO.fsproj @@ -23,6 +23,7 @@ Debug;Release;Mono;DotnetCore + diff --git a/src/BioFSharp.IO/FSIPrinters.fs b/src/BioFSharp.IO/FSIPrinters.fs index 3c917476..4634932c 100644 --- a/src/BioFSharp.IO/FSIPrinters.fs +++ b/src/BioFSharp.IO/FSIPrinters.fs @@ -107,3 +107,161 @@ module FSIPrinters = let prettyPrintGFF3 (input : seq>>) = toString id input |> Seq.iter (fun x -> printfn "%s" x) + + + let prettyPrintGSE (gse:GSE) = + + let formatSingleEntry rootIdent (s: string) = + let ident = [for i in [1 .. (4*rootIdent)] do yield " "] |> String.concat "" + s + |> String.split ' ' + |> Array.chunkBySize 15 + |> Array.map (String.concat " ") + |> Array.mapi (fun i s -> if i = 0 then s else sprintf "%s%s" ident s) + |> String.concat "\r\n" + + + let formatMultiEntries rootIdent (l: string list) = + let ident = [for i in [1 .. (4*rootIdent)] do yield " "] |> String.concat "" + l + |> List.map + (fun summary -> + summary + |> String.split ' ' + |> Array.chunkBySize 15 + |> Array.map (String.concat " ") + ) + |> Array.concat + |> Array.mapi (fun i s -> if i = 0 then s else sprintf "%s%s" ident s) + |> String.concat "\r\n" + + let formatSamples rootIdent (sm : Map) = + let ident = [for i in [1 .. (4*rootIdent)] do yield " "] |> String.concat "" + sm + |> Map.toList + |> List.map + (fun (k,v) -> + sprintf "%s => %s" k v.Title + ) + |> List.mapi (fun i s -> if i = 0 then s else sprintf "%s%s" ident s) + |> String.concat "\r\n" + + + let formatPlatforms rootIdent (sm : Map) = + let ident = [for i in [1 .. (4*rootIdent)] do yield " "] |> String.concat "" + sm + |> Map.toList + |> List.map + (fun (k,v) -> + sprintf "%s => %s" k v.Title + ) + |> List.mapi (fun i s -> if i = 0 then s else sprintf "%s%s" ident s) + |> String.concat "\r\n" + + sprintf + """ +GEO SERIES RECORD %s +==================%s + +Type(s): %s + +Platform(s): %s + +Title: %s + +Contributor(s): %s + +Design: %s + +Summary: %s + +Samples %s + """ + gse.SeriesMetadata.Accession + (gse.SeriesMetadata.Accession |> String.map (fun c -> '=')) + (gse.SeriesMetadata.Type |> formatMultiEntries 4) + (gse.PlatformMetadata |> formatPlatforms 4) + (gse.SeriesMetadata.Title |> formatSingleEntry 4) + (gse.SeriesMetadata.Contributor |> formatMultiEntries 4) + (gse.SeriesMetadata.OverallDesign |> formatMultiEntries 4) + (gse.SeriesMetadata.Summary |> formatMultiEntries 4) + (gse.SampleMetadata |> formatSamples 4) + + let prettyPrintGPL (gpl:GPL) = + + let formatSingleEntry rootIdent (s: string) = + let ident = [for i in [1 .. (4*rootIdent)] do yield " "] |> String.concat "" + s + |> String.split ' ' + |> Array.chunkBySize 15 + |> Array.map (String.concat " ") + |> Array.mapi (fun i s -> if i = 0 then s else sprintf "%s%s" ident s) + |> String.concat "\r\n" + + + let formatMultiEntries rootIdent (l: string list) = + let ident = [for i in [1 .. (4*rootIdent)] do yield " "] |> String.concat "" + l + |> List.map + (fun summary -> + summary + |> String.split ' ' + |> Array.chunkBySize 15 + |> Array.map (String.concat " ") + ) + |> Array.concat + |> Array.mapi (fun i s -> if i = 0 then s else sprintf "%s%s" ident s) + |> String.concat "\r\n" + + let formatSamples rootIdent (sm : Map) = + let ident = [for i in [1 .. (4*rootIdent)] do yield " "] |> String.concat "" + sm + |> Map.toList + |> List.map + (fun (k,v) -> + sprintf "%s => %s" k v.Title + ) + |> List.mapi (fun i s -> if i = 0 then s else sprintf "%s%s" ident s) + |> String.concat "\r\n" + + + let formatSeries rootIdent (sm : Map) = + let ident = [for i in [1 .. (4*rootIdent)] do yield " "] |> String.concat "" + sm + |> Map.toList + |> List.map + (fun (k,v) -> + sprintf "%s => %s" k v.Title + ) + |> List.mapi (fun i s -> if i = 0 then s else sprintf "%s%s" ident s) + |> String.concat "\r\n" + + sprintf + """ +GEO PLATFORM RECORD %s +====================%s + +Title: %s + +Organism(s): %s + +Description: %s + +Technology: %s + +Contributor(s): %s + +Series(s): %s + +Samples %s + """ + gpl.PlatformMetadata.Accession + (gpl.PlatformMetadata.Accession |> String.map (fun c -> '=')) + (gpl.PlatformMetadata.Title |> formatSingleEntry 4) + (gpl.PlatformMetadata.Organism |> formatMultiEntries 4) + (gpl.PlatformMetadata.Description |> formatMultiEntries 4) + (gpl.PlatformMetadata.Technology |> formatSingleEntry 4) + (gpl.PlatformMetadata.Contributor |> formatMultiEntries 4) + (gpl.SeriesMetadata |> formatSeries 4) + (gpl.SampleMetadata |> formatSamples 4) + diff --git a/src/BioFSharp.IO/GenerateSOFTTypes.fsx b/src/BioFSharp.IO/GenerateSOFTTypes.fsx new file mode 100644 index 00000000..895b1993 --- /dev/null +++ b/src/BioFSharp.IO/GenerateSOFTTypes.fsx @@ -0,0 +1,326 @@ +#I @"../../bin/BioFSharp.IO/net47/" +#r "FSharpAux.IO.dll" +#r "FSharpAux.dll" + +open FSharpAux +open FSharpAux.IO +open FSharpAux.IO.SchemaReader +open FSharpAux.IO.SchemaReader.Attribute + + +type UnionFormat = { + Description: string + Name: string + NameSource : string + Type: string option + Amount: string +} + +type Union = { + Name : string + Unions: UnionFormat [] +} + +let generateUnionTypeString (rootIdent:int) (format : Union) = + let binding = sprintf "type %s = " format.Name + let ident = [for i in [1 .. (4*rootIdent)] do yield " "] |> String.concat "" + let body = + format.Unions + |> Array.map (fun union -> match union.Type with + | Some t -> sprintf "///%s \r\n%s| %s of %s" union.Description ident union.Name t + | _ -> sprintf "///%s \r\n%s| %s" union.Description ident union.Name + ) + let additional = + sprintf "///Custom Attributes Used in the SOFT file\r\n%s|AdditionalAttribute of string*string" ident + Array.concat [[|binding|];body;[|additional|]] + |> Array.map (fun x -> sprintf "%s%s" ident x) + |> String.concat "\r\n" + + +type SOFTSpecification = { + [] + FieldName : string + [] + Amount : string + [] + Type: string + [] + Description: string +} + +let softSpecificationReader = Csv.CsvReader(SchemaMode = Csv.SchemaModes.Fill) + +let seriesSpecPath = @"C:\Users\kevin\Downloads\CsbScaffold-master\MetaIndexing_New\data\SOFTSeriesSpecifications.txt" +let sampleSpecPath = @"C:\Users\kevin\Downloads\CsbScaffold-master\MetaIndexing_New\data\SOFTSampleSpecifications.txt" +let platformSpecPath = @"C:\Users\kevin\Downloads\CsbScaffold-master\MetaIndexing_New\data\SOFTPlatformSpecifications.txt" + +let seriesSpec = + softSpecificationReader.ReadFile(seriesSpecPath, '\t', false) + |> Array.ofSeq +let sampleSpec = + softSpecificationReader.ReadFile(sampleSpecPath, '\t', false) + |> Array.ofSeq +let platformSpec = + softSpecificationReader.ReadFile(platformSpecPath, '\t', false) + |> Array.ofSeq + + +let generateUnionType (typeName:string) specs = + specs + |> Array.map (fun spec -> let t = + if (spec.FieldName).Contains("[n]") && (spec.FieldName).Contains("list") then + "int * (string list)" + elif (spec.FieldName).Contains("[n]") then + "int * string" + else + "string" + + + { + Description = spec.Description + Name = + spec.FieldName + .Remove(0,1) + .Replace("_[n]", "") + .Replace("_ch[n]", "") + .Replace((typeName.ToUpper()), "Accession") + .Replace((sprintf "%s_" typeName),"") + .Split('_') + |> fun x -> + printfn "%A" x + x + |> Array.map + (fun splits -> + printfn "%A" splits + let first = splits.[0].ToString().ToUpper() + sprintf "%s%s" first (splits.Substring(1)) + ) + |> Array.reduce (sprintf "%s%s") + NameSource = spec.FieldName + Type = Some t + Amount = spec.Amount + }) + |> (fun unions -> {Name = (sprintf "SOFT%sSpecifications" typeName); Unions = unions}) + +let (|IsMultiSpec|_|) (ident:string,name:string,u:UnionFormat) = + match u.Type with + | Some t when t = "int * string" -> + Some + (sprintf + """ +%s if k.Contains("%s") then +%s let index = +%s k +%s .Replace("%s","") +%s .Replace("%s","") +%s |> int +%s Some (%s.%s(index,v)) + """ + ident + (u.NameSource + .Replace("ch[n]","") + .Replace("[n]","")) + ident + ident + ident + (u.NameSource + .Replace("[n]","") + ) + ident + (u.NameSource + .Replace("ch[n]","")) + ident + ident + name + u.Name) + | _ -> None + +let (|IsMultiSpecList|_|) (ident:string,name:string,u:UnionFormat) = + match u.Type with + | Some t when t = "int * (string list)" -> + Some + (sprintf + """ +%s if k.Contains("%s") then +%s let index = +%s k +%s .Replace("%s","") +%s .Replace("%s","") +%s |> int +%s let keyList = +%s v.Split(',') |> Array.toList +%s Some (%s.%s(index,keyList)) +%s """ + ident + (u.NameSource + .Replace("ch[n]","") + .Replace("[n]","")) + ident + ident + ident + (u.NameSource + .Replace("[n]","") + ) + ident + (u.NameSource + .Replace("ch[n]","")) + ident + ident + ident + ident + name + u.Name + ident + ) + | _ -> None + +let generateActivePatterns (rootIdent:int) (union:Union) = + let ident = [for i in [1 .. (4*rootIdent)] do yield " "] |> String.concat "" + union.Unions + |> Array.map + (fun u -> + let name = sprintf "let (|%s|_|) ((k:string),(v:string)) =" u.Name + let body1 = + match (ident,union.Name,u) with + |IsMultiSpec res -> res + |IsMultiSpecList res -> res + |_ -> sprintf " if k=\"%s\" then\r\n %sSome(%s.%s v)" u.NameSource ident union.Name u.Name + let body3 = sprintf " else" + let body4 = " None" + [name;body1;body3;body4] + |> List.map (fun x -> sprintf "%s%s" ident x) + |> String.concat "\r\n" + ) + +let generateRecordType recordName (rootIdent:int) (union:Union) = + let ident = [for i in [1 .. (4*rootIdent)] do yield " "] |> String.concat "" + + let verificationOfUnionFormat ident (u:UnionFormat) = + match u.Amount with + |"1" -> + sprintf + """ +%s |> listMustContainExactlyOne "%s must be exactly one value" + """ + ident + u.Name + |"1 or more" -> + sprintf + """ +%s |> listMustContainOneOrMore "%s must be one or more values" + """ + ident + u.Name + | _ -> "" + + let recordBinding = + sprintf "%stype %s = {" ident recordName + + let recordFields = + union.Unions + |> Array.map + (fun u -> + sprintf + "%s %s : %s;" + ident + u.Name + (match u.Amount with + |"1" -> u.Type.Value + |_ -> sprintf "(%s) list" u.Type.Value) + ) + + let extractors = + union.Unions + |> Array.map + (fun u -> + sprintf + """ +%s %s = +%s specList +%s |> List.choose +%s (fun spec -> +%s match spec with +%s | %s.%s v -> Some v +%s | _ -> None +%s ) + %s + """ + ident + u.Name + ident + ident + ident + ident + ident + union.Name + u.Name + ident + ident + (verificationOfUnionFormat ident u) + ) + [| + [|recordBinding|] + recordFields + [|sprintf "%s}" ident|] + [|sprintf "%slet create%s =" ident recordName|] + [|sprintf "%s {" ident|] + extractors + [|sprintf "%s}" ident|] + |] + |> Array.concat + |> Array.filter (fun x -> not (x = "")) + |> String.concat "\r\n" + + + +let platformUnion = generateUnionType "Platform" platformSpec +let platformUnionString = platformUnion |> generateUnionTypeString 2 +let platformActivePatterns = platformUnion |> generateActivePatterns 3 +let platformRecord = platformUnion |> generateRecordType "PlatformRecord" 1 + +let seriesUnion = generateUnionType "Series" seriesSpec +let seriesUnionString = seriesUnion |> generateUnionTypeString 2 +let seriesActivePatterns = seriesUnion |> generateActivePatterns 3 +let seriesRecord = seriesUnion |> generateRecordType "SeriesRecord" 1 + +let sampleUnion = generateUnionType "Sample" sampleSpec +let sampleUnionString = sampleUnion |> generateUnionTypeString 2 +let sampleActivePatterns = sampleUnion |> generateActivePatterns 3 +let sampleRecord = sampleUnion |> generateRecordType "SampleRecord" 1 + + +let generatorBody = + sprintf + """ +module Generated = + + module Specifications = + +%s + +%s + +%s + + module Lexing = + + open Specifications + + [] + module Platform = + +%s + [] + module Series = +%s + [] + module Sample = +%s + """ + platformUnionString + seriesUnionString + sampleUnionString + + (platformActivePatterns |> String.concat "\r\n") + (seriesActivePatterns |> String.concat "\r\n") + (sampleActivePatterns |> String.concat "\r\n") diff --git a/src/BioFSharp.IO/SOFT.fs b/src/BioFSharp.IO/SOFT.fs index d3d0d7b6..59205996 100644 --- a/src/BioFSharp.IO/SOFT.fs +++ b/src/BioFSharp.IO/SOFT.fs @@ -1,349 +1,1508 @@ namespace BioFSharp.IO +[] module SOFT = + + module Generated = + + module Specifications = + + type SOFTPlatformSpecifications = + ///Provide an identifier for this entity. This identifier is used only as an internal reference within a given file. The identifier will not appear on final GEO records. + | Accession of string + ///"Provide a unique title that describes your Platform. We suggest that you use the system [institution/lab]-[species]-[number of features]-[version], e.g. ""FHCRC Mouse 15K v1.0""." + | Title of string + ///"Microarrays are 'commercial', 'non-commercial', or 'custom-commercial' in accordance with how the array was manufactured. Use 'virtual' only if creating a virtual definition for MPSS, SARST, or RT-PCR data." + | Distribution of string + ///Select the category that best describes the Platform technology. + | Technology of string + ///Identify the organism(s) from which the features on the Platform were designed or derived. + | Organism of string + ///"Provide the name of the company, facility or laboratory where the array was manufactured or produced." + | Manufacturer of string + ///"Describe the array manufacture protocol. Include as much detail as possible, e.g., clone/primer set identification and preparation, strandedness/length, arrayer hardware/software, spotting protocols. You can include as much text as you need to thoroughly describe the protocol; it is strongly recommended that complete protocol descriptions are provided within your submission." + | ManufactureProtocol of string + ///Provide the manufacturer catalog number for commercially-available arrays. + | CatalogNumber of string + ///Specify a Web link that directs users to supplementary information about the array. Please restrict to Web sites that you know are stable. + | WebLink of string + ///"Provide the surface type of the array, e.g., glass, nitrocellulose, nylon, silicon, unknown." + | Support of string + ///"Provide the coating of the array, e.g., aminosilane, quartz, polysine, unknown." + | Coating of string + ///"Provide any additional descriptive information not captured in another field, e.g., array and/or feature physical dimensions, element grid system." + | Description of string + ///List all people associated with this array design. + | Contributor of string + ///Specify a valid PubMed identifier (PMID) that references a published article that describes the array. + | PubmedId of string + ///Only use for performing�updates�to existing GEO records. + | GeoAccession of string + ///Indicates the start of the data table. + | TableBegin of string + ///Indicates the end of the data table. + | TableEnd of string + ///Custom Attributes Used in the SOFT file + |AdditionalAttribute of string*string + + type SOFTSeriesSpecifications = + ///Provide an identifier for this entity. This identifier is used only as an internal reference within a given file. The identifier will not appear on final GEO records. + | Accession of string + ///Provide a unique title that describes the overall study. + | Title of string + ///Summarize the goals and objectives of this study. The abstract from the associated publication may be suitable. You can include as much text as you need to thoroughly describe the study. + | Summary of string + ///"Provide a description of the experimental design. Indicate how many Samples are analyzed, if replicates are included, are there control and/or reference Samples, dye-swaps, etc." + | OverallDesign of string + ///"Specify a valid PubMed identifier (PMID) that references a published article describing this study. Most commonly, this information is not available at the time of submission - it can be added later once the data are published." + | PubmedId of string + ///Specify a Web link that directs users to supplementary information about the study. Please restrict to Web sites that you know are stable. + | WebLink of string + ///List all people associated with this study. + | Contributor of string + ///"Indicate the variable type(s) investigated in this study, e.g.,"!Series_variable_1 = age!Series_variable_2 = age"NOTE - this information is optional and does not appear in Series records or downloads, but will be used to assemble corresponding GEO DataSet records." + | Variable of int * string + ///"Describe each variable, e.g.,"!Series_variable_description_1 = 2 months!Series_variable_description_2 = 12 months"NOTE - this information is optional and does not appear in Series records or downloads, but will be used to assemble corresponding GEO DataSet records." + | VariableDescription of int * string + ///"List which Samples belong to each group, e.g.,""!Series_variable_sample_list_1 = samA, samB""!Series_variable_sample_list_2 = samC, samD""NOTE - this information is optional and does not appear in Series records or downloads, but will be used to assemble corresponding GEO DataSet records." + | VariableSampleList of int * (string list) + ///"Indicate the repeat type(s), e.g.,"!Series_repeats_1 = biological replicate!Series_repeats_2 = biological replicate"NOTE - this information is optional and does not appear in Series records or downloads, but will be used to assemble corresponding GEO DataSet records." + | Repeats of int * string + ///"List which Samples belong to each group, e.g.,""!Series_repeats_sample_list_1 = samA, samB""!Series_repeats_sample_list_2 = samC, samD""NOTE - this information is optional and does not appear in Series records or downloads, but will be used to assemble corresponding GEO DataSet records." + | RepeatsSampleList of int * (string list) + ///"Reference the Samples that make up this experiment. Reference the Sample accession numbers (GSMxxx) if the Samples already exists in GEO, or reference the ^Sample identifiers if they are being submitted in the same file." + | SampleId of string + ///Only use for performing�updates�to existing GEO records. + | GeoAccession of string + ///"Indicates the type(s) of experiment conducted in the Series" + | Type of string + ///"Time of submission to GEO" + | SubmissionDate of string + ///Custom Attributes Used in the SOFT file + |AdditionalAttribute of string*string + + type SOFTSampleSpecifications = + ///Provide an identifier for this entity. This identifier is used only as an internal reference within a given file. The identifier will not appear on final GEO records. + | Accession of string + ///"Provide a unique title that describes this Sample. We suggest that you use the system [biomaterial]-[condition(s)]-[replicate number], e.g., Muscle_exercised_60min_rep2." + | Title of string + ///"Examples of supplementary file types include original Affymetrix CEL and EXP files, GenePix GPR files, and TIFF image files. Supplementary files should be zipped or tarred together with the SOFT file at time of submission (do not include any sub-directories or sub-folders in your zip/tar archive). Provision of supplementary raw data files facilitates the unambiguous interpretation of data and potential verification of conclusions as set forth in the MIAME guidelines." + | SupplementaryFile of int * string + ///- Affymetrix CHP file name:"If your processed data are CHP files, you can reference the CHP file name in this field. If your manuscript discusses data processed by RMA or another algorithm, we recommend providing those values in the�table section. There is no need to specify the !Sample_platform_id when CHP files are supplied. All external files should be zipped or tarred together with the SOFT file at time of submission."- Tab-delimited table file name:"If it is convenient for you to generate, you can reference the name of an external tab-delimited table file (see format) in this field, rather than include the table in the !Sample_table_begin section. All external files should be zipped or tarred together with the SOFT file at time of submission." + | Table of string + ///"Briefly identify the biological material and the experimental variable(s), e.g., vastus lateralis muscle, exercised, 60 min." + | SourceName of int * string + ///Identify the organism(s) from which the biological material was derived. + | Organism of int * string + ///"Describe all available characteristics of the biological source, including factors not necessarily under investigation. Provide in 'Tag: Value' format, where 'Tag' is a type of characteristic (e.g. ""gender"", ""strain"", ""tissue"", ""developmental stage"", ""tumor stage"", etc), and 'Value' is the value for each tag (e.g. ""female"", ""129SV"", ""brain"", ""embryo"", etc). Include as many characteristics fields as necessary to thoroughly describe your Samples." + | Characteristics of int * string + ///"Specify the name of the company, laboratory or person that provided the biological material." + | BiomaterialProvider of int * string + ///Describe any treatments applied to the biological material prior to extract preparation. You can include as much text as you need to thoroughly describe the protocol; it is strongly recommended that complete protocol descriptions are provided within your submission. + | TreatmentProtocol of int * string + ///Describe the conditions that were used to grow or maintain organisms or cells prior to extract preparation. You can include as much text as you need to thoroughly describe the protocol; it is strongly recommended that complete protocol descriptions are provided within your submission. + | GrowthProtocol of int * string + ///Specify the type of molecule that was extracted from the biological material. + | Molecule of int * string + ///Describe the protocol used to isolate the extract material. You can include as much text as you need to thoroughly describe the protocol; it is strongly recommended that complete protocol descriptions are provided within your submission. + | ExtractProtocol of int * string + ///"Specify the compound used to label the extract e.g., biotin, Cy3, Cy5, 33P." + | Label of int * string + ///Describe the protocol used to label the extract. You can include as much text as you need to thoroughly describe the protocol; it is strongly recommended that complete protocol descriptions are provided within your submission. + | LabelProtocol of int * string + ///"Describe the protocols used for hybridization, blocking and washing, and any post-processing steps such as staining. You can include as much text as you need to thoroughly describe the protocol; it is strongly recommended that complete protocol descriptions are provided within your submission." + | HybProtocol of string + ///"Describe the scanning and image acquisition protocols, hardware, and software. You can include as much text as you need to thoroughly describe the protocol; it is strongly recommended that complete protocol descriptions are provided within your submission." + | ScanProtocol of string + ///"Provide details of how data in the VALUE column of your table were generated and calculated, i.e., normalization method, data selection procedures and parameters, transformation algorithm (e.g., MAS5.0), and scaling parameters. You can include as much text as you need to thoroughly describe the processing procedures." + | DataProcessing of string + ///"Include any additional information not provided in the other fields, or paste in broad descriptions that cannot be easily dissected into the other fields." + | Description of string + ///"Reference the Platform upon which this hybridization was performed. Reference the Platform accession number (GPLxxx) if the Platform already exists in GEO, or reference the ^Platform identifier if the Platform record is being batch submitted within the same SOFT file. To identify the accession number of an existing commercial Platform in GEO, use the�FIND PLATFORM�tool." + | PlatformId of string + ///Only use for performing�updates�to existing GEO records. + | GeoAccession of string + ///Use for SAGE submissions only. + | Anchor of string + ///Use for SAGE submissions only. + | Type of string + ///Use for SAGE submissions only. + | TagCount of string + ///Use for SAGE submissions only. + | TagLength of string + ///Indicates the start of the data table. + | TableBegin of string + ///Indicates the end of the data table. + | TableEnd of string + ///"Sample relation, e.g. SRA accession or BioSample id" + | Relation of string + ///Custom Attributes Used in the SOFT file + |AdditionalAttribute of string*string + + module internal Lexing = + + open Specifications + + [] + module Platform = + + let (|Accession|_|) ((k:string),(v:string)) = + if k="^PLATFORM" then + Some(SOFTPlatformSpecifications.Accession v) + else + None + let (|Title|_|) ((k:string),(v:string)) = + if k="!Platform_title" then + Some(SOFTPlatformSpecifications.Title v) + else + None + let (|Distribution|_|) ((k:string),(v:string)) = + if k="!Platform_distribution" then + Some(SOFTPlatformSpecifications.Distribution v) + else + None + let (|Technology|_|) ((k:string),(v:string)) = + if k="!Platform_technology" then + Some(SOFTPlatformSpecifications.Technology v) + else + None + let (|Organism|_|) ((k:string),(v:string)) = + if k="!Platform_organism" then + Some(SOFTPlatformSpecifications.Organism v) + else + None + let (|Manufacturer|_|) ((k:string),(v:string)) = + if k="!Platform_manufacturer" then + Some(SOFTPlatformSpecifications.Manufacturer v) + else + None + let (|ManufactureProtocol|_|) ((k:string),(v:string)) = + if k="!Platform_manufacture_protocol" then + Some(SOFTPlatformSpecifications.ManufactureProtocol v) + else + None + let (|CatalogNumber|_|) ((k:string),(v:string)) = + if k="!Platform_catalog_number" then + Some(SOFTPlatformSpecifications.CatalogNumber v) + else + None + let (|WebLink|_|) ((k:string),(v:string)) = + if k="!Platform_web_link" then + Some(SOFTPlatformSpecifications.WebLink v) + else + None + let (|Support|_|) ((k:string),(v:string)) = + if k="!Platform_support" then + Some(SOFTPlatformSpecifications.Support v) + else + None + let (|Coating|_|) ((k:string),(v:string)) = + if k="!Platform_coating" then + Some(SOFTPlatformSpecifications.Coating v) + else + None + let (|Description|_|) ((k:string),(v:string)) = + if k="!Platform_description" then + Some(SOFTPlatformSpecifications.Description v) + else + None + let (|Contributor|_|) ((k:string),(v:string)) = + if k="!Platform_contributor" then + Some(SOFTPlatformSpecifications.Contributor v) + else + None + let (|PubmedId|_|) ((k:string),(v:string)) = + if k="!Platform_pubmed_id" then + Some(SOFTPlatformSpecifications.PubmedId v) + else + None + let (|GeoAccession|_|) ((k:string),(v:string)) = + if k="!Platform_geo_accession" then + Some(SOFTPlatformSpecifications.GeoAccession v) + else + None + let (|TableBegin|_|) ((k:string),(v:string)) = + if k="!Platform_table_begin" then + Some(SOFTPlatformSpecifications.TableBegin v) + else + None + let (|TableEnd|_|) ((k:string),(v:string)) = + if k="!Platform_table_end" then + Some(SOFTPlatformSpecifications.TableEnd v) + else + None + [] + module Series = + let (|Accession|_|) ((k:string),(v:string)) = + if k="^SERIES" then + Some(SOFTSeriesSpecifications.Accession v) + else + None + let (|Title|_|) ((k:string),(v:string)) = + if k="!Series_title" then + Some(SOFTSeriesSpecifications.Title v) + else + None + let (|Summary|_|) ((k:string),(v:string)) = + if k="!Series_summary" then + Some(SOFTSeriesSpecifications.Summary v) + else + None + let (|OverallDesign|_|) ((k:string),(v:string)) = + if k="!Series_overall_design" then + Some(SOFTSeriesSpecifications.OverallDesign v) + else + None + let (|PubmedId|_|) ((k:string),(v:string)) = + if k="!Series_pubmed_id" then + Some(SOFTSeriesSpecifications.PubmedId v) + else + None + let (|WebLink|_|) ((k:string),(v:string)) = + if k="!Series_web_link" then + Some(SOFTSeriesSpecifications.WebLink v) + else + None + let (|Contributor|_|) ((k:string),(v:string)) = + if k="!Series_contributor" then + Some(SOFTSeriesSpecifications.Contributor v) + else + None + let (|Variable|_|) ((k:string),(v:string)) = + + if k.Contains("!Series_variable_") then + let index = + k + .Replace("!Series_variable_","") + .Replace("!Series_variable_[n]","") + |> int + Some (SOFTSeriesSpecifications.Variable(index,v)) + + else + None + let (|VariableDescription|_|) ((k:string),(v:string)) = + + if k.Contains("!Series_variable_description_") then + let index = + k + .Replace("!Series_variable_description_","") + .Replace("!Series_variable_description_[n]","") + |> int + Some (SOFTSeriesSpecifications.VariableDescription(index,v)) + + else + None + let (|VariableSampleList|_|) ((k:string),(v:string)) = + + if k.Contains("!Series_variable_sample_list_") then + let index = + k + .Replace("!Series_variable_sample_list_","") + .Replace("!Series_variable_sample_list_[n]","") + |> int + let keyList = + v.Split(',') |> Array.toList + Some (SOFTSeriesSpecifications.VariableSampleList(index,keyList)) + + else + None + let (|Repeats|_|) ((k:string),(v:string)) = + + if k.Contains("!Series_repeats_") then + let index = + k + .Replace("!Series_repeats_","") + .Replace("!Series_repeats_[n]","") + |> int + Some (SOFTSeriesSpecifications.Repeats(index,v)) + + else + None + let (|RepeatsSampleList|_|) ((k:string),(v:string)) = + + if k.Contains("!Series_repeats_sample_list_") then + let index = + k + .Replace("!Series_repeats_sample_list_","") + .Replace("!Series_repeats_sample_list_[n]","") + |> int + let keyList = + v.Split(',') |> Array.toList + Some (SOFTSeriesSpecifications.RepeatsSampleList(index,keyList)) + + else + None + let (|SampleId|_|) ((k:string),(v:string)) = + if k="!Series_sample_id" then + Some(SOFTSeriesSpecifications.SampleId v) + else + None + let (|GeoAccession|_|) ((k:string),(v:string)) = + if k="!Series_geo_accession" then + Some(SOFTSeriesSpecifications.GeoAccession v) + else + None + let (|Type|_|) ((k:string),(v:string)) = + if k="!Series_type" then + Some(SOFTSeriesSpecifications.Type v) + else + None + let (|SubmissionDate|_|) ((k:string),(v:string)) = + if k="!Series_submission_date" then + Some(SOFTSeriesSpecifications.SubmissionDate v) + else + None + [] + module Sample = + let (|Accession|_|) ((k:string),(v:string)) = + if k="^SAMPLE" then + Some(SOFTSampleSpecifications.Accession v) + else + None + let (|Title|_|) ((k:string),(v:string)) = + if k="!Sample_title" then + Some(SOFTSampleSpecifications.Title v) + else + None + let (|SupplementaryFile|_|) ((k:string),(v:string)) = + + if k.Contains("!Sample_supplementary_file_") then + let index = + k + .Replace("!Sample_supplementary_file_","") + .Replace("!Sample_supplementary_file_[n]","") + |> int + Some (SOFTSampleSpecifications.SupplementaryFile(index,v)) + + else + None + let (|Table|_|) ((k:string),(v:string)) = + if k="!Sample_table" then + Some(SOFTSampleSpecifications.Table v) + else + None + let (|SourceName|_|) ((k:string),(v:string)) = + + if k.Contains("!Sample_source_name_") then + let index = + k + .Replace("!Sample_source_name_ch","") + .Replace("!Sample_source_name_","") + |> int + Some (SOFTSampleSpecifications.SourceName(index,v)) + + else + None + let (|Organism|_|) ((k:string),(v:string)) = + + if k.Contains("!Sample_organism_") then + let index = + k + .Replace("!Sample_organism_ch","") + .Replace("!Sample_organism_","") + |> int + Some (SOFTSampleSpecifications.Organism(index,v)) + + else + None + let (|Characteristics|_|) ((k:string),(v:string)) = + + if k.Contains("!Sample_characteristics_") then + let index = + k + .Replace("!Sample_characteristics_ch","") + .Replace("!Sample_characteristics_","") + |> int + Some (SOFTSampleSpecifications.Characteristics(index,v)) + + else + None + let (|BiomaterialProvider|_|) ((k:string),(v:string)) = + + if k.Contains("!Sample_biomaterial_provider_") then + let index = + k + .Replace("!Sample_biomaterial_provider_ch","") + .Replace("!Sample_biomaterial_provider_","") + |> int + Some (SOFTSampleSpecifications.BiomaterialProvider(index,v)) + + else + None + let (|TreatmentProtocol|_|) ((k:string),(v:string)) = + + if k.Contains("!Sample_treatment_protocol_") then + let index = + k + .Replace("!Sample_treatment_protocol_ch","") + .Replace("!Sample_treatment_protocol_","") + |> int + Some (SOFTSampleSpecifications.TreatmentProtocol(index,v)) + + else + None + let (|GrowthProtocol|_|) ((k:string),(v:string)) = + + if k.Contains("!Sample_growth_protocol_") then + let index = + k + .Replace("!Sample_growth_protocol_ch","") + .Replace("!Sample_growth_protocol_","") + |> int + Some (SOFTSampleSpecifications.GrowthProtocol(index,v)) + + else + None + let (|Molecule|_|) ((k:string),(v:string)) = + + if k.Contains("!Sample_molecule_") then + let index = + k + .Replace("!Sample_molecule_ch","") + .Replace("!Sample_molecule_","") + |> int + Some (SOFTSampleSpecifications.Molecule(index,v)) + + else + None + let (|ExtractProtocol|_|) ((k:string),(v:string)) = + + if k.Contains("!Sample_extract_protocol_") then + let index = + k + .Replace("!Sample_extract_protocol_ch","") + .Replace("!Sample_extract_protocol_","") + |> int + Some (SOFTSampleSpecifications.ExtractProtocol(index,v)) + + else + None + let (|Label|_|) ((k:string),(v:string)) = + + if k.Contains("!Sample_label_") then + let index = + k + .Replace("!Sample_label_ch","") + .Replace("!Sample_label_","") + |> int + Some (SOFTSampleSpecifications.Label(index,v)) + + else + None + let (|LabelProtocol|_|) ((k:string),(v:string)) = + + if k.Contains("!Sample_label_protocol_") then + let index = + k + .Replace("!Sample_label_protocol_ch","") + .Replace("!Sample_label_protocol_","") + |> int + Some (SOFTSampleSpecifications.LabelProtocol(index,v)) + + else + None + let (|HybProtocol|_|) ((k:string),(v:string)) = + if k="!Sample_hyb_protocol" then + Some(SOFTSampleSpecifications.HybProtocol v) + else + None + let (|ScanProtocol|_|) ((k:string),(v:string)) = + if k="!Sample_scan_protocol" then + Some(SOFTSampleSpecifications.ScanProtocol v) + else + None + let (|DataProcessing|_|) ((k:string),(v:string)) = + if k="!Sample_data_processing" then + Some(SOFTSampleSpecifications.DataProcessing v) + else + None + let (|Description|_|) ((k:string),(v:string)) = + if k="!Sample_description" then + Some(SOFTSampleSpecifications.Description v) + else + None + let (|PlatformId|_|) ((k:string),(v:string)) = + if k="!Sample_platform_id" then + Some(SOFTSampleSpecifications.PlatformId v) + else + None + let (|GeoAccession|_|) ((k:string),(v:string)) = + if k="!Sample_geo_accession" then + Some(SOFTSampleSpecifications.GeoAccession v) + else + None + let (|Anchor|_|) ((k:string),(v:string)) = + if k="!Sample_anchor" then + Some(SOFTSampleSpecifications.Anchor v) + else + None + let (|Type|_|) ((k:string),(v:string)) = + if k="!Sample_type" then + Some(SOFTSampleSpecifications.Type v) + else + None + let (|TagCount|_|) ((k:string),(v:string)) = + if k="!Sample_tag_count" then + Some(SOFTSampleSpecifications.TagCount v) + else + None + let (|TagLength|_|) ((k:string),(v:string)) = + if k="!Sample_tag_length" then + Some(SOFTSampleSpecifications.TagLength v) + else + None + let (|TableBegin|_|) ((k:string),(v:string)) = + if k="!Sample_table_begin" then + Some(SOFTSampleSpecifications.TableBegin v) + else + None + let (|TableEnd|_|) ((k:string),(v:string)) = + if k="!Sample_table_end" then + Some(SOFTSampleSpecifications.TableEnd v) + else + None + let (|Relation|_|) ((k:string),(v:string)) = + if k="!Sample_relation" then + Some(SOFTSampleSpecifications.Relation v) + else + None + + open Generated + open Generated.Specifications + + let listMustContainExactlyOne failmessage l = + match List.tryExactlyOne l with + | Some v -> v + | _ -> failwith failmessage + + let listMustContainOneOrMore failmessage (l: 'a list) = + if l.Length >= 1 then + l + else failwith failmessage + + type SampleRecord = { + Accession : string; + Title : string; + Type : string; + PlatformId : string; + SupplementaryFile : (int * string) list; + Table : (string) list; + SourceName : (int * string) list; + Organism : (int * string) list; + Characteristics : (int * string) list; + BiomaterialProvider : (int * string) list; + TreatmentProtocol : (int * string) list; + GrowthProtocol : (int * string) list; + Molecule : (int * string) list; + ExtractProtocol : (int * string) list; + Label : (int * string) list; + LabelProtocol : (int * string) list; + HybProtocol : (string) list; + ScanProtocol : (string) list; + DataProcessing : (string) list; + Description : (string) list; + GeoAccession : (string) list; + Anchor : (string) list; + TagCount : (string) list; + TagLength : (string) list; + Relation : (string) list; + SpecificationTokens : SOFTSampleSpecifications list + } + let private createSampleRecord accession (specList:SOFTSampleSpecifications list) = + { + + Accession = accession + + Title = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSampleSpecifications.Title v -> Some v + | _ -> None + ) + |> listMustContainExactlyOne "Title must be exactly one value" + + SupplementaryFile = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSampleSpecifications.SupplementaryFile (k,v) -> Some (k,v) + | _ -> None + ) + Table = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSampleSpecifications.Table v -> Some v + | _ -> None + ) + + SourceName = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSampleSpecifications.SourceName (k,v) -> Some (k,v) + | _ -> None + ) + Organism = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSampleSpecifications.Organism (k,v) -> Some (k,v) + | _ -> None + ) + + |> listMustContainOneOrMore "Organism must be one or more values" - open System.Collections.Generic - open FSharpAux.IO - - //TODO : Full parsing, get rid of the "not interesting" cases and just parse everything. Remodel parser to return these types instead of string maps and such. - - type SOFTSeriesSpecifications = - ///Provide an identifier for this entity. This identifier is used only as an internal reference within a given file. The identifier will not appear on final GEO records. - | SERIES of string - ///Provide a unique title that describes the overall study. - | Series_title of string - ///Summarize the goals and objectives of this study. The abstract from the associated publication may be suitable. You can include as much text as you need to thoroughly describe the study. - | Series_summary of string - ///"Provide a description of the experimental design. Indicate how many Samples are analyzed, if replicates are included, are there control and/or reference Samples, dye-swaps, etc." - | Series_overall_design of string - ///"Specify a valid PubMed identifier (PMID) that references a published article describing this study. Most commonly, this information is not available at the time of submission - it can be added later once the data are published." - | Series_pubmed_id of string - ///Specify a Web link that directs users to supplementary information about the study. Please restrict to Web sites that you know are stable. - | Series_web_link of string - ///"List all people associated with this study. - | Series_contributor of string - ///"Indicate the variable type(s) investigated in this study, e.g. !Series_variable_1 = age�!Series_variable_2 = age�"NOTE - this information is optional and does not appear in Series records or downloads, but will be used to assemble corresponding GEO DataSet records." - | Series_variable of int * string - ///"Describe each variable, e.g.,"!Series_variable_description_1 = 2 months !Series_variable_description_2 = 12 months"NOTE - this information is optional and does not appear in Series records or downloads, but will be used to assemble corresponding GEO DataSet records." - | Series_variable_description of int * string - ///"List which Samples belong to each group, e.g.,""!Series_variable_sample_list_1 = samA, samB�""!Series_variable_sample_list_2 = samC, samD�""NOTE - this information is optional and does not appear in Series records or downloads, but will be used to assemble corresponding GEO DataSet records." - | Series_variable_sample_list of int * string - ///"Indicate the repeat type(s), e.g.,"!Series_repeats_1 = biological replicate�!Series_repeats_2 = biological replicate"NOTE - this information is optional and does not appear in Series records or downloads, but will be used to assemble corresponding GEO DataSet records." - | Series_repeats of int * string - ///"List which Samples belong to each group, e.g.,�""!Series_repeats_sample_list_1 = samA, samB""!Series_repeats_sample_list_2 = samC, samD""NOTE - this information is optional and does not appear in Series - ///records or downloads, but will be used to assemble corresponding GEO - ////DataSet records." - | Series_repeats_sample_list of int * string - ///"Reference the Samples that make up this experiment. Reference the Sample accession numbers (GSMxxx) if the Samples already exists in GEO, or reference the ^Sample identifiers if they are being submitted - ///in the same file." - | Series_sample_id of string - ///Only use for performing�updates�to existing GEO records. - | Series_geo_accession of string - - - - type SOFTSampleSpecifications = - ///Provide an identifier for this entity. This identifier is used only as an internal reference within a given file. The identifier will not appear on final GEO records. - | SAMPLE of string - ///"Provide a unique title that describes this Sample. We suggest that you use the system [biomaterial]-[condition(s)]-[replicate number], e.g., Muscle_exercised_60min_rep2." - | Sample_title of string - ///"Examples of supplementary file types include original Affymetrix - ///CEL and EXP files, GenePix GPR files, and TIFF image files. Supplementary files should be zipped or tarred together with the SOFT file at - ///time of submission (do not include any sub-directories or sub-folders in your zip/tar archive). Provision of supplementary raw data files - ///facilitates the unambiguous interpretation of data and potential verification of conclusions as set forth in the MIAME guidelines." - | Sample_supplementary_file of string - ///- Affymetrix CHP file name:"If your processed data are CHP files, - ///you can reference the CHP file name in this field. If your manuscript discusses data processed by RMA or another algorithm, we recommend providing those values in the�table section. There is no need to specify the !Sample_platform_id when CHP files are supplied. All external - ///files should be zipped or tarred together with the SOFT file at time - ///of submission."- Tab-delimited table file name: "If it is convenient - ///for you to generate, you can reference the name of an external tab-delimited table file (see format) in this field, rather than include the table in the !Sample_table_begin section. All external files should be zipped or tarred together with the SOFT file at time of submission." - | Sample_table of string - ///"Briefly identify the biological material and the experimental variable(s), e.g., vastus lateralis muscle, exercised, 60 min." - | Sample_source_name_ch of int * string - ///Identify the organism(s) from which the biological material was derived. - | Sample_organism_ch of int * string - ///"Describe all available characteristics of the biological source, - ///including factors not necessarily under investigation. Provide in 'Tag: Value' format, where 'Tag' is a type of characteristic (e.g. ""gender"", ""strain"", ""tissue"", ""developmental stage"", ""tumor stage"", etc), and 'Value' is the value for each tag (e.g. ""female"", ""129SV"", ""brain"", ""embryo"", etc). Include as many characteristics - ///fields as necessary to thoroughly describe your Samples." - | Sample_characteristics_ch of int * string - ///"Specify the name of the company, laboratory or person that provided the biological material." - | Sample_biomaterial_provider_ch of int * string - ///Describe any treatments applied to the biological material prior to extract preparation. You can include as much text as you need to thoroughly describe the protocol; it is strongly recommended that complete protocol descriptions are provided within your submission. - | Sample_treatment_protocol_ch of int * string - ///Describe the conditions that were used to grow or maintain organisms or cells prior to extract preparation. You can include as much text as you need to thoroughly describe the protocol; it is strongly recommended that complete protocol descriptions are provided within your submission. - | Sample_growth_protocol_ch of int * string - ///Specify the type of molecule that was extracted from the biological material. - | Sample_molecule_ch of int * string - ///Describe the protocol used to isolate the extract material. You can include as much text as you need to thoroughly describe the protocol; it is strongly recommended that complete protocol descriptions are provided within your submission. - | Sample_extract_protocol_ch of int * string - ///"Specify the compound used to label the extract e.g., biotin, Cy3, Cy5, 33P." - | Sample_label_ch of int * string - ///Describe the protocol used to label the extract. You can include as much text as you need to thoroughly describe the protocol; it is strongly recommended that complete protocol descriptions are provided within your submission. - | Sample_label_protocol_ch of int * string - ///"Describe the protocols used for hybridization, blocking and washing, and any post-processing steps such as staining. You can include as much text as you need to thoroughly describe the protocol; it is strongly recommended that complete protocol descriptions are provided within your submission." - | Sample_hyb_protocol of string - ///"Describe the scanning and image acquisition protocols, hardware, - ///and software. You can include as much text as you need to thoroughly - ///describe the protocol; it is strongly recommended that complete protocol descriptions are provided within your submission." - | Sample_scan_protocol of string - ///"Provide details of how data in the VALUE column of your table were generated and calculated, i.e., normalization method, data selection procedures and parameters, transformation algorithm (e.g., MAS5.0), and scaling parameters. You can include as much text as you need to - ///thoroughly describe the processing procedures." - | Sample_data_processing of string - ///"Include any additional information not provided in the other fields, or paste in broad descriptions that cannot be easily dissected into the other fields." - | Sample_description of string - ///"Reference the Platform upon which this hybridization was performed. Reference the Platform accession number (GPLxxx) if the Platform already exists in GEO, or reference the ^Platform identifier if the Platform record is being batch submitted within the same SOFT file. To - ///identify the accession number of an existing commercial Platform in GEO, use the�FIND PLATFORM�tool." - | Sample_platform_id of string - ///Only use for performing�updates�to existing GEO records. - | Sample_geo_accession of string - ///Use for SAGE submissions only. - | Sample_anchor of string - ///Use for SAGE submissions only. - | Sample_type of string - ///Use for SAGE submissions only. - | Sample_tag_count of string - ///Use for SAGE submissions only. - | Sample_tag_length of string - ///Indicates the start of the data table. - | Sample_table_begin of string - ///Indicates the end of the data table. - | Sample_table_end of string - - ///Type Representation of SOFT `^Platforms` Entities - type PlatformInfos = { - Accession: string - Name: string - Organism:string + Characteristics = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSampleSpecifications.Characteristics (k,v) -> Some (k,v) + | _ -> None + ) + |> listMustContainOneOrMore "Characteristics must be one or more values" + + BiomaterialProvider = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSampleSpecifications.BiomaterialProvider (k,v) -> Some (k,v) + | _ -> None + ) + TreatmentProtocol = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSampleSpecifications.TreatmentProtocol (k,v) -> Some (k,v) + | _ -> None + ) + GrowthProtocol = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSampleSpecifications.GrowthProtocol (k,v) -> Some (k,v) + | _ -> None + ) + Molecule = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSampleSpecifications.Molecule (k,v) -> Some (k,v) + | _ -> None + ) + ExtractProtocol = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSampleSpecifications.ExtractProtocol (k,v) -> Some (k,v) + | _ -> None + ) + + |> listMustContainOneOrMore "ExtractProtocol must be one or more values" + + Label = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSampleSpecifications.Label (k,v) -> Some (k,v) + | _ -> None + ) + LabelProtocol = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSampleSpecifications.LabelProtocol (k,v) -> Some (k,v) + | _ -> None + ) + + + HybProtocol = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSampleSpecifications.HybProtocol v -> Some v + | _ -> None + ) + + + ScanProtocol = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSampleSpecifications.ScanProtocol v -> Some v + | _ -> None + ) + DataProcessing = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSampleSpecifications.DataProcessing v -> Some v + | _ -> None + ) + Description = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSampleSpecifications.Description v -> Some v + | _ -> None + ) + PlatformId = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSampleSpecifications.PlatformId v -> Some v + | _ -> None + ) + + |> listMustContainExactlyOne "PlatformId must be exactly one value" + GeoAccession = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSampleSpecifications.GeoAccession v -> Some v + | _ -> None + ) + Anchor = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSampleSpecifications.Anchor v -> Some v + | _ -> None + ) + Type = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSampleSpecifications.Type v -> Some v + | _ -> None + ) + |> listMustContainExactlyOne "Type must be exactly one value" + + TagCount = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSampleSpecifications.TagCount v -> Some v + | _ -> None + ) + + TagLength = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSampleSpecifications.TagLength v -> Some v + | _ -> None + ) + + Relation = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSampleSpecifications.Relation v -> Some v + | _ -> None + ) + + SpecificationTokens = specList } - let private createPlatformInfos acc name org = {Accession = acc; Name = name; Organism= org} - - type SampleInfos = { - Accession: string - Title : string - Channels: int - Organism: Map - Source:Map - Characteristics: Map - Molecules: Map - SRAAccession: string + type PlatformRecord = { + Accession : string; + Title : string; + Distribution : string; + Technology : string; + Organism : string list; + Manufacturer : string list; + ManufactureProtocol : string list; + CatalogNumber : string list; + WebLink : string list; + Support : string list; + Coating : string list; + Description : string list; + Contributor : string list; + PubmedId : string list; + GeoAccession : string list; + AdditionalAttributes : Map + SpecificationTokens : SOFTPlatformSpecifications list } + let private createPlatformRecord accession (specList: SOFTPlatformSpecifications list)= + { + Accession = accession + Title = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTPlatformSpecifications.Title v -> Some v + | _ -> None + ) + |> listMustContainExactlyOne "Title must be exactly one value" + + Distribution = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTPlatformSpecifications.Distribution v -> Some v + | _ -> None + ) + |> listMustContainExactlyOne "Distribution must be exactly one value" + + Technology = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTPlatformSpecifications.Technology v -> Some v + | _ -> None + ) + |> listMustContainExactlyOne "Technology must be exactly one value" + + Organism = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTPlatformSpecifications.Organism v -> Some v + | _ -> None + ) + |> listMustContainOneOrMore "Organism must be one or more values" + + Manufacturer = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTPlatformSpecifications.Manufacturer v -> Some v + | _ -> None + ) - let private createSampleInfos acc t ch org src char mol sra = + ManufactureProtocol = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTPlatformSpecifications.ManufactureProtocol v -> Some v + | _ -> None + ) + + CatalogNumber = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTPlatformSpecifications.CatalogNumber v -> Some v + | _ -> None + ) + WebLink = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTPlatformSpecifications.WebLink v -> Some v + | _ -> None + ) + Support = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTPlatformSpecifications.Support v -> Some v + | _ -> None + ) + Coating = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTPlatformSpecifications.Coating v -> Some v + | _ -> None + ) + Description = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTPlatformSpecifications.Description v -> Some v + | _ -> None + ) + Contributor = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTPlatformSpecifications.Contributor v -> Some v + | _ -> None + ) + PubmedId = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTPlatformSpecifications.PubmedId v -> Some v + | _ -> None + ) + GeoAccession = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTPlatformSpecifications.GeoAccession v -> Some v + | _ -> None + ) + AdditionalAttributes = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTPlatformSpecifications.AdditionalAttribute (k,v) -> Some (k,v) + | _ -> None + ) + |> Map.ofList + SpecificationTokens = specList + } + + type SeriesRecord = { + Accession : string; + Title : string; + Summary : (string) list; + OverallDesign : string list; + PubmedId : (string) list; + WebLink : (string) list; + Contributor : (string) list; + Variable : (int * string) list; + VariableDescription : (int * string) list; + VariableSampleList : (int * (string list)) list; + Repeats : (int * string) list; + RepeatsSampleList : (int * (string list)) list; + SampleId : (string) list; + GeoAccession : (string) list; + Type : (string) list; + SubmissionDate : (string) list; + SpecificationTokens : SOFTSeriesSpecifications list + } + let private createSeriesRecord accession (specList : SOFTSeriesSpecifications list) = { - Accession = acc - Title = t - Channels = ch - Organism = org - Source = src - Characteristics = char - Molecules = mol - SRAAccession = sra + + Accession =accession + + Title = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSeriesSpecifications.Title v -> Some v + | _ -> None + ) + + |> listMustContainExactlyOne "Title must be exactly one value" + + + + Summary = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSeriesSpecifications.Summary v -> Some v + | _ -> None + ) + + |> listMustContainOneOrMore "Summary must be one or more values" + + + + OverallDesign = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSeriesSpecifications.OverallDesign v -> Some v + | _ -> None + ) + + + + + PubmedId = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSeriesSpecifications.PubmedId v -> Some v + | _ -> None + ) + + + + WebLink = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSeriesSpecifications.WebLink v -> Some v + | _ -> None + ) + + + + Contributor = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSeriesSpecifications.Contributor v -> Some v + | _ -> None + ) + + + + Variable = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSeriesSpecifications.Variable (k,v) -> Some (k,v) + | _ -> None + ) + + + + VariableDescription = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSeriesSpecifications.VariableDescription (k,v) -> Some (k,v) + | _ -> None + ) + + + + VariableSampleList = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSeriesSpecifications.VariableSampleList (k,v) -> Some (k,v) + | _ -> None + ) + + + + Repeats = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSeriesSpecifications.Repeats (k,v) -> Some (k,v) + | _ -> None + ) + + + + RepeatsSampleList = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSeriesSpecifications.RepeatsSampleList (k,v) -> Some (k,v) + | _ -> None + ) + + + + SampleId = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSeriesSpecifications.SampleId v -> Some v + | _ -> None + ) + + |> listMustContainOneOrMore "SampleId must be one or more values" + + + + GeoAccession = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSeriesSpecifications.GeoAccession v -> Some v + | _ -> None + ) + + + + Type = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSeriesSpecifications.Type v -> Some v + | _ -> None + ) + + + + SubmissionDate = + specList + |> List.choose + (fun spec -> + match spec with + | SOFTSeriesSpecifications.SubmissionDate v -> Some v + | _ -> None + ) + + SpecificationTokens = specList + } + + [] + type GSE = { + SeriesMetadata : SeriesRecord + SampleMetadata : Map + PlatformMetadata : Map + } + + let private createGSE (seriesRecords: Map, sampleRecords: Map, platformRecords: Map) : GSE = + { + SeriesMetadata = + seriesRecords + |> Map.toList + |> List.exactlyOne + |> snd + + SampleMetadata = sampleRecords + PlatformMetadata = platformRecords } - type SeriesInfos = { - Accession : string - Title: string - Design: string - Type : string list - SampleIds: string list - Date: string - Publications: string list - Platform : Map - SampleAnnotations: Map + [] + type GPL = { + PlatformMetadata : PlatformRecord + SeriesMetadata : Map + SampleMetadata : Map } - let private createSeriesInfo acc t des typ sIds d pub pI sI = + let private createGPL (seriesRecords: Map, sampleRecords: Map, platformRecords: Map) : GPL = { - Accession = acc - Title = t - Design = des - Type = typ - SampleIds = sIds - Date = d - Publications = pub - Platform = pI - SampleAnnotations = sI + PlatformMetadata = + platformRecords + |> Map.toList + |> List.exactlyOne + |> snd + + SeriesMetadata = seriesRecords + SampleMetadata = sampleRecords + } - type SOFTToken = - |Entity of (string * string) - |Attribute of (string * string) - |DataTable - |Broken of string [] - - let private tokenizeSOFTLine (line: string) = - let token = - line.Split([|'='|]) - |> Array.map (fun s -> s.Trim()) - match token.Length with - | 1 -> DataTable - | 2 -> if token.[0].StartsWith("^") then - Entity (token.[0], token.[1]) - elif (token.[0].StartsWith("!")) then - Attribute (token.[0], token.[1]) - else - Broken token - | _ -> if token.[0].StartsWith("^") then - Entity (token.[0], token.[1..(token.Length-1)] |> String.concat "=") - elif (token.[0].StartsWith("!")) then - Attribute (token.[0], token.[1..(token.Length-1)] |> String.concat "=") - else - Broken token - let private reduceMaps (input: (string*string) list) = - input - |> List.groupBy (fun (k,v) -> k) - |> List.map (fun (k,v) -> k, v |> List.map (fun (k',v') -> v')) + module internal Tokenization = + type SOFTToken = + |Entity of (string * string) + |Attribute of (string * string) + |DataTable + |Broken of string [] - let private parseSample (token:SOFTToken) (en: IEnumerator) (accession: string) = - let rec loop (token:SOFTToken) (acc: string) (t : string) (ch: int) (org: (string*string) list) (src:(string*string) list) (char: (string*string) list) (mol: (string*string) list) (sra:string) = - if en.MoveNext() then - let nextToken = en.Current - match token,nextToken with - //gather sample infos - |Attribute (a,v),Attribute (nextA,nextV) -> match a with - | "!Sample_title" -> loop nextToken acc v ch org src char mol sra - | "!Sample_channel_count" -> loop nextToken acc t (int v) org src char mol sra - | a when a.Contains("!Sample_source_name_ch") -> loop nextToken acc t ch org ((a,v)::src) char mol sra - | a when a.Contains("!Sample_organism_ch") -> loop nextToken acc t ch ((a,v)::org) src char mol sra - | a when a.Contains("!Sample_characteristics_ch") -> loop nextToken acc t ch org src ((a,v)::char) mol sra - | a when a.Contains("!Sample_molecule_ch") -> loop nextToken acc t ch org src char ((a,v)::mol) sra - | "!Sample_relation" when (v.Contains("SRA")) -> loop nextToken acc t ch org src char mol (if v.Contains("SRA") then v else sra) - | _ -> loop nextToken acc t ch org src char mol sra - - //return finished sample when new entity starts - |Attribute (a,v),Entity (e,ev) -> match a with - | "!Sample_title" -> nextToken,acc,(createSampleInfos acc v ch (Map.ofList (reduceMaps org)) (Map.ofList (reduceMaps src)) (Map.ofList (reduceMaps char)) (Map.ofList (reduceMaps mol)) sra) - | "!Sample_channel_count" -> nextToken,acc,(createSampleInfos acc t (int v) (Map.ofList (reduceMaps org)) (Map.ofList (reduceMaps src)) (Map.ofList (reduceMaps char)) (Map.ofList (reduceMaps mol)) sra) - | a when a.Contains("!Sample_source_name_ch") -> nextToken,acc,(createSampleInfos acc t ch (Map.ofList (reduceMaps org)) (Map.ofList (reduceMaps ((a,v)::src))) (Map.ofList (reduceMaps char)) (Map.ofList (reduceMaps mol)) sra) - | a when a.Contains("!Sample_organism_ch") -> nextToken,acc,(createSampleInfos acc t ch (Map.ofList (reduceMaps ((a,v)::org))) (Map.ofList (reduceMaps src)) (Map.ofList (reduceMaps char)) (Map.ofList (reduceMaps mol)) sra) - | a when a.Contains("!Sample_characteristics_ch") -> nextToken,acc,(createSampleInfos acc t ch (Map.ofList (reduceMaps org)) (Map.ofList (reduceMaps src)) (Map.ofList (reduceMaps ((a,v)::char))) (Map.ofList (reduceMaps mol)) sra) - | a when a.Contains("!Sample_molecule_ch") -> nextToken,acc,(createSampleInfos acc t ch (Map.ofList (reduceMaps org)) (Map.ofList (reduceMaps src)) (Map.ofList (reduceMaps char)) (Map.ofList (reduceMaps ((a,v)::mol))) sra) - | "!Sample_relation" -> nextToken,acc,(createSampleInfos acc t ch (Map.ofList (reduceMaps org)) (Map.ofList (reduceMaps src)) (Map.ofList (reduceMaps char)) (Map.ofList (reduceMaps mol)) (if v.Contains("SRA") then v else sra)) - | _ -> nextToken,acc,(createSampleInfos acc t ch (Map.ofList (reduceMaps org)) (Map.ofList (reduceMaps src)) (Map.ofList (reduceMaps char)) (Map.ofList (reduceMaps mol)) sra) - //not interesting - |_ -> loop nextToken acc t ch org src char mol sra - else - token,acc,(createSampleInfos acc t ch (Map.ofList (reduceMaps org)) (Map.ofList (reduceMaps src)) (Map.ofList (reduceMaps char)) (Map.ofList (reduceMaps mol)) sra) - loop token accession "" -1 [] [] [] [] "" + let tokenizeSOFTLine (line: string) = + let token = + line.Split([|'='|]) + |> Array.map (fun s -> s.Trim()) + match token.Length with + | 1 -> DataTable + | 2 -> if token.[0].StartsWith("^") then + Entity (token.[0], token.[1]) + elif (token.[0].StartsWith("!")) then + Attribute (token.[0], token.[1]) + else + Broken token + | _ -> if token.[0].StartsWith("^") then + Entity (token.[0], token.[1..(token.Length-1)] |> String.concat "=") + elif (token.[0].StartsWith("!")) then + Attribute (token.[0], token.[1..(token.Length-1)] |> String.concat "=") + else + Broken token - let private parsePlatformInfos (token:SOFTToken) (en: IEnumerator) (accession: string) = - let rec loop (token:SOFTToken) acc name org = - if en.MoveNext() then - let nextToken = en.Current - match token,nextToken with - //gather platform infos - | Attribute (a,v),Attribute (nextA,nextV) -> match a with - | "!Platform_title" -> loop nextToken acc v org - | "!Platform_organism" -> loop nextToken acc name v - | _ -> loop nextToken acc name org - //return finished platform when new entity starts - | Attribute (a,v),Entity (e,ev) -> match a with - | "!Platform_title" -> token,acc,createPlatformInfos acc v org - | "!Platform_organism" -> token,acc,createPlatformInfos acc name org - | _ -> nextToken,acc,createPlatformInfos acc name org - //not interesting - | _ -> loop nextToken acc name org - else - token,acc,createPlatformInfos acc name org - loop token accession "" "" + module Parsing = - let private parseSOFT (soft: seq) = - let en = soft.GetEnumerator() + open Tokenization + open Generated.Lexing + open System.Collections.Generic - let rec loop (token: SOFTToken) (seriesAccession: string) (seriesTitle: string) (seriesDesign: string) (seriesType:string list) (seriesSamples:string list) (date: string) (publications: string list) (samples: (string*SampleInfos) list) (platform: (string*PlatformInfos) list) = + let private parseSampleEntity (token:SOFTToken) (en: IEnumerator) (accession: string) = + let rec loop (token:SOFTToken) (lexedSample:SOFTSampleSpecifications list) = + if en.MoveNext() then + let nextToken = en.Current + match token,nextToken with + //gather sample infos + |Attribute (a,v),Attribute (nextA,nextV) -> + let lexedValue = + match (a,v) with + | Sample.Accession lv -> lv + | Sample.Relation lv -> lv + | Sample.Title lv -> lv + | Sample.SupplementaryFile lv -> lv + | Sample.Table lv -> lv + | Sample.SourceName lv -> lv + | Sample.Organism lv -> lv + | Sample.Characteristics lv -> lv + | Sample.BiomaterialProvider lv -> lv + | Sample.TreatmentProtocol lv -> lv + | Sample.GrowthProtocol lv -> lv + | Sample.Molecule lv -> lv + | Sample.ExtractProtocol lv -> lv + | Sample.Label lv -> lv + | Sample.LabelProtocol lv -> lv + | Sample.HybProtocol lv -> lv + | Sample.ScanProtocol lv -> lv + | Sample.DataProcessing lv -> lv + | Sample.Description lv -> lv + | Sample.PlatformId lv -> lv + | Sample.Anchor lv -> lv + | Sample.Type lv -> lv + | Sample.TagCount lv -> lv + | Sample.TagLength lv -> lv + | _ -> SOFTSampleSpecifications.AdditionalAttribute (a,v) + + loop nextToken (lexedValue::lexedSample) + + //return finished sample when new entity starts + |Attribute (a,v),Entity (e,ev) -> + let lexedValue = + match (a,v) with + | Sample.Accession lv -> lv + | Sample.Relation lv -> lv + | Sample.Title lv -> lv + | Sample.SupplementaryFile lv -> lv + | Sample.Table lv -> lv + | Sample.SourceName lv -> lv + | Sample.Organism lv -> lv + | Sample.Characteristics lv -> lv + | Sample.BiomaterialProvider lv -> lv + | Sample.TreatmentProtocol lv -> lv + | Sample.GrowthProtocol lv -> lv + | Sample.Molecule lv -> lv + | Sample.ExtractProtocol lv -> lv + | Sample.Label lv -> lv + | Sample.LabelProtocol lv -> lv + | Sample.HybProtocol lv -> lv + | Sample.ScanProtocol lv -> lv + | Sample.DataProcessing lv -> lv + | Sample.Description lv -> lv + | Sample.PlatformId lv -> lv + | Sample.Anchor lv -> lv + | Sample.Type lv -> lv + | Sample.TagCount lv -> lv + | Sample.TagLength lv -> lv + | _ -> SOFTSampleSpecifications.AdditionalAttribute (a,v) + + nextToken , accession, createSampleRecord accession (lexedValue::lexedSample) + + |_ -> loop nextToken lexedSample + else + token,accession, createSampleRecord accession lexedSample + loop token [] - match token with - |Entity (e,v) -> - match e with - //gather Series Info - | "^SERIES" -> + let private parsePlatformEntity (token:SOFTToken) (en: IEnumerator) (accession: string) = + let rec loop (token:SOFTToken) (lexedPlatform:SOFTPlatformSpecifications list) = + if en.MoveNext() then + let nextToken = en.Current + match token,nextToken with + //gather platform infos + | Attribute (a,v),Attribute (nextA,nextV) -> + let lexedValue = + match (a,v) with + | Platform.Accession lv -> lv + | Platform.Title lv -> lv + | Platform.Distribution lv -> lv + | Platform.Technology lv -> lv + | Platform.Organism lv -> lv + | Platform.Manufacturer lv -> lv + | Platform.ManufactureProtocol lv -> lv + | Platform.CatalogNumber lv -> lv + | Platform.WebLink lv -> lv + | Platform.Support lv -> lv + | Platform.Coating lv -> lv + | Platform.Description lv -> lv + | Platform.Contributor lv -> lv + | Platform.PubmedId lv -> lv + | _ -> SOFTPlatformSpecifications.AdditionalAttribute (a,v) + + loop nextToken (lexedValue::lexedPlatform) + //return finished platform when new entity starts + | Attribute (a,v),Entity (e,ev) -> + let lexedValue = + match (a,v) with + | Platform.Accession lv -> lv + | Platform.Title lv -> lv + | Platform.Distribution lv -> lv + | Platform.Technology lv -> lv + | Platform.Organism lv -> lv + | Platform.Manufacturer lv -> lv + | Platform.ManufactureProtocol lv -> lv + | Platform.CatalogNumber lv -> lv + | Platform.WebLink lv -> lv + | Platform.Support lv -> lv + | Platform.Coating lv -> lv + | Platform.Description lv -> lv + | Platform.Contributor lv -> lv + | Platform.PubmedId lv -> lv + | _ -> SOFTPlatformSpecifications.AdditionalAttribute (a,v) + + nextToken,accession,createPlatformRecord accession (lexedValue::lexedPlatform) + //not interesting + | _ -> loop nextToken lexedPlatform + else + token,accession,createPlatformRecord accession lexedPlatform + loop token [] + + let private parseSeriesEntity (token:SOFTToken) (en: IEnumerator) (accession: string) = + let rec loop (token:SOFTToken) (lexedSeries:SOFTSeriesSpecifications list) = if en.MoveNext() then let nextToken = en.Current - loop nextToken (v) seriesTitle seriesDesign seriesType seriesSamples date publications samples platform + match token,nextToken with + //gather platform infos + | Attribute (a,v),Attribute (nextA,nextV) -> + let lexedValue = + match (a,v) with + | Series.Title lv -> lv + | Series.Summary lv -> lv + | Series.OverallDesign lv -> lv + | Series.Type lv -> lv + | Series.SubmissionDate lv -> lv + | Series.PubmedId lv -> lv + | Series.WebLink lv -> lv + | Series.Contributor lv -> lv + | Series.Variable lv -> lv + | Series.VariableDescription lv -> lv + | Series.VariableSampleList lv -> lv + | Series.Repeats lv -> lv + | Series.RepeatsSampleList lv -> lv + | Series.SampleId lv -> lv + | _ -> SOFTSeriesSpecifications.AdditionalAttribute (a,v) + + loop nextToken (lexedValue::lexedSeries) + //return finished platform when new entity starts + | Attribute (a,v),Entity (e,ev) -> + let lexedValue = + match (a,v) with + | Series.Title lv -> lv + | Series.Summary lv -> lv + | Series.OverallDesign lv -> lv + | Series.Type lv -> lv + | Series.SubmissionDate lv -> lv + | Series.PubmedId lv -> lv + | Series.WebLink lv -> lv + | Series.Contributor lv -> lv + | Series.Variable lv -> lv + | Series.VariableDescription lv -> lv + | Series.VariableSampleList lv -> lv + | Series.Repeats lv -> lv + | Series.RepeatsSampleList lv -> lv + | Series.SampleId lv -> lv + | _ -> SOFTSeriesSpecifications.AdditionalAttribute (a,v) + + nextToken,accession,createSeriesRecord accession (lexedValue::lexedSeries) + //not interesting + | _ -> loop nextToken lexedSeries else - createSeriesInfo seriesAccession seriesTitle seriesDesign seriesType seriesSamples date publications (Map.ofList platform) ( Map.ofList samples) - //call sample parser - | "^SAMPLE" -> //printfn "SAMPLE??? %s" v - let token', smplAcc, smpl = parseSample token en v - loop (token') seriesAccession seriesTitle seriesDesign seriesType seriesSamples date publications ((smplAcc,smpl)::samples) platform - //call platform parser - | "^PLATFORM" -> let token', pltfrmlAcc, pltfrm = parsePlatformInfos token en v - loop (token') seriesAccession seriesTitle seriesDesign seriesType seriesSamples date publications samples ((pltfrmlAcc,pltfrm)::platform) - //ignore unexpected/uninteresting entities - | _ -> + token,accession,createSeriesRecord accession lexedSeries + loop token [] + + let private parseSOFTEntities (soft: seq) : (Map)*(Map)*(Map) = + + let en = soft.GetEnumerator() + let rec loop (token: SOFTToken) (seriesRecords: (string*SeriesRecord) list) (sampleRecords: (string*SampleRecord) list) (platformRecords: (string*PlatformRecord) list) = + + match token with + |Entity (e,v) -> + match (e,v) with + //gather Series Info + | Series.Accession lv -> + let token', seriesAccession, seriesRecord = parseSeriesEntity token en v + loop (token') ((seriesAccession,seriesRecord)::seriesRecords) sampleRecords platformRecords + //call sample parser + | Sample.Accession lv -> //printfn "SAMPLE??? %s" v + let token', sampleAccession, sampleRecord = parseSampleEntity token en v + loop (token') seriesRecords ((sampleAccession,sampleRecord)::sampleRecords) platformRecords + //call platform parser + | Platform.Accession lv -> + let token', platformAccession, PlatformRecord = parsePlatformEntity token en v + loop (token') seriesRecords sampleRecords ((platformAccession,PlatformRecord)::platformRecords) + //ignore unexpected/uninteresting entities + | _ -> + if en.MoveNext() then + let nextToken = en.Current + loop nextToken seriesRecords sampleRecords platformRecords + else + (Map.ofList seriesRecords),(Map.ofList sampleRecords),( Map.ofList platformRecords) + //not interesting + |_ -> if en.MoveNext() then let nextToken = en.Current - loop nextToken seriesAccession seriesTitle seriesDesign seriesType seriesSamples date publications samples platform - else - createSeriesInfo seriesAccession seriesTitle seriesDesign seriesType seriesSamples date publications (Map.ofList platform) ( Map.ofList samples) - //Attributes are only found here when on series level or uninteresting - |Attribute (a,v) -> match a with - | "!Series_title" -> - if en.MoveNext() then - let nextToken = en.Current - loop nextToken seriesAccession (v) seriesDesign seriesType seriesSamples date publications samples platform - else - createSeriesInfo seriesAccession seriesTitle seriesDesign seriesType seriesSamples date publications (Map.ofList platform) ( Map.ofList samples) - | "!Series_submission_date" -> - if en.MoveNext() then - let nextToken = en.Current - loop nextToken seriesAccession seriesTitle seriesDesign seriesType seriesSamples (v) publications samples platform - else - createSeriesInfo seriesAccession seriesTitle seriesDesign seriesType seriesSamples date publications (Map.ofList platform) ( Map.ofList samples) - | "!Series_pubmed_id" | "!Series_web_link" -> - if en.MoveNext() then - let nextToken = en.Current - loop nextToken seriesAccession seriesTitle seriesDesign seriesType seriesSamples date ((sprintf "%s = %s" a v)::publications) samples platform - else - createSeriesInfo seriesAccession seriesTitle seriesDesign seriesType seriesSamples date publications (Map.ofList platform) ( Map.ofList samples) - | "!Series_overall_design" -> - if en.MoveNext() then - let nextToken = en.Current - loop nextToken seriesAccession seriesTitle v seriesType seriesSamples date publications samples platform - else - createSeriesInfo seriesAccession seriesTitle seriesDesign seriesType seriesSamples date publications (Map.ofList platform) ( Map.ofList samples) - | "!Series_type" -> - if en.MoveNext() then - let nextToken = en.Current - loop nextToken seriesAccession seriesTitle seriesDesign (v::seriesType) seriesSamples date publications samples platform - else - createSeriesInfo seriesAccession seriesTitle seriesDesign seriesType seriesSamples date publications (Map.ofList platform) ( Map.ofList samples) - | "!Series_sample_id" -> - if en.MoveNext() then - let nextToken = en.Current - loop nextToken seriesAccession seriesTitle seriesDesign seriesType (v::seriesSamples) date publications samples platform - else - createSeriesInfo seriesAccession seriesTitle seriesDesign seriesType seriesSamples date publications (Map.ofList platform) ( Map.ofList samples) - //attributes of uninteresting entities - | _ -> - if en.MoveNext() then - let nextToken = en.Current - loop nextToken seriesAccession seriesTitle seriesDesign seriesType seriesSamples date publications samples platform - else - createSeriesInfo seriesAccession seriesTitle seriesDesign seriesType seriesSamples date publications (Map.ofList platform) ( Map.ofList samples) - //not interesting - |_ -> - if en.MoveNext() then - let nextToken = en.Current - loop nextToken seriesAccession seriesTitle seriesDesign seriesType seriesSamples date publications samples platform - else - createSeriesInfo seriesAccession seriesTitle seriesDesign seriesType seriesSamples date publications (Map.ofList platform) ( Map.ofList samples) - - if en.MoveNext() then - loop en.Current "" "" "" [] [] "" [] [] [] - else failwith "empty input" - - ///Read SOFT SeriesInfo from a SOFT series file - let fromSeriesFile (path:string) = - Seq.fromFile path - |> Seq.map tokenizeSOFTLine - |> parseSOFT - - ///Read SOFT SeriesInfo from a string representing a SOFT Series file - let fromSeriesFileEnumerator (fileEnumerator:seq) = - fileEnumerator - |> Seq.map tokenizeSOFTLine - |> parseSOFT \ No newline at end of file + loop nextToken seriesRecords sampleRecords platformRecords + + else + (Map.ofList seriesRecords),(Map.ofList sampleRecords),( Map.ofList platformRecords) + + if en.MoveNext() then + loop en.Current [] [] [] + else failwith "empty input" + + + open FSharpAux.IO + + ///Read SOFT SeriesInfo from a SOFT series file + let fromSeriesFile (path:string) = + Seq.fromFile path + |> Seq.map Tokenization.tokenizeSOFTLine + |> parseSOFTEntities + |> createGSE + + ///Read SOFT SeriesInfo from a string representing a SOFT Series file + let fromSeriesFileEnumerator (fileEnumerator:seq) = + fileEnumerator + |> Seq.map Tokenization.tokenizeSOFTLine + |> parseSOFTEntities + |> createGSE + + ///Read SOFT SeriesInfo from a SOFT series file + let fromPlatformFile (path:string) = + Seq.fromFile path + |> Seq.map Tokenization.tokenizeSOFTLine + |> parseSOFTEntities + |> createGPL + + ///Read SOFT SeriesInfo from a string representing a SOFT Series file + let fromPlatformFileEnumerator (fileEnumerator:seq) = + fileEnumerator + |> Seq.map Tokenization.tokenizeSOFTLine + |> parseSOFTEntities + |> createGPL From eb389a908e7cee66f01616e62ef65df20fc88c6c Mon Sep 17 00:00:00 2001 From: kMutagene Date: Wed, 26 Feb 2020 18:41:40 +0100 Subject: [PATCH 11/13] Improve module namespace for SOFT add convenience functions --- src/BioFSharp.IO/SOFT.fs | 175 ++++++++++++++++++++++++++------------- 1 file changed, 116 insertions(+), 59 deletions(-) diff --git a/src/BioFSharp.IO/SOFT.fs b/src/BioFSharp.IO/SOFT.fs index 59205996..38346d62 100644 --- a/src/BioFSharp.IO/SOFT.fs +++ b/src/BioFSharp.IO/SOFT.fs @@ -570,12 +570,12 @@ module SOFT = open Generated open Generated.Specifications - let listMustContainExactlyOne failmessage l = + let private listMustContainExactlyOne failmessage l = match List.tryExactlyOne l with | Some v -> v | _ -> failwith failmessage - let listMustContainOneOrMore failmessage (l: 'a list) = + let private listMustContainOneOrMore failmessage (l: 'a list) = if l.Length >= 1 then l else failwith failmessage @@ -1183,46 +1183,6 @@ module SOFT = SpecificationTokens = specList } - [] - type GSE = { - SeriesMetadata : SeriesRecord - SampleMetadata : Map - PlatformMetadata : Map - } - - let private createGSE (seriesRecords: Map, sampleRecords: Map, platformRecords: Map) : GSE = - { - SeriesMetadata = - seriesRecords - |> Map.toList - |> List.exactlyOne - |> snd - - SampleMetadata = sampleRecords - PlatformMetadata = platformRecords - } - - [] - type GPL = { - PlatformMetadata : PlatformRecord - SeriesMetadata : Map - SampleMetadata : Map - } - - let private createGPL (seriesRecords: Map, sampleRecords: Map, platformRecords: Map) : GPL = - { - PlatformMetadata = - platformRecords - |> Map.toList - |> List.exactlyOne - |> snd - - SeriesMetadata = seriesRecords - SampleMetadata = sampleRecords - - } - - module internal Tokenization = type SOFTToken = @@ -1250,13 +1210,13 @@ module SOFT = else Broken token - module Parsing = + module internal Parsing = open Tokenization open Generated.Lexing open System.Collections.Generic - let private parseSampleEntity (token:SOFTToken) (en: IEnumerator) (accession: string) = + let parseSampleEntity (token:SOFTToken) (en: IEnumerator) (accession: string) = let rec loop (token:SOFTToken) (lexedSample:SOFTSampleSpecifications list) = if en.MoveNext() then let nextToken = en.Current @@ -1330,7 +1290,7 @@ module SOFT = token,accession, createSampleRecord accession lexedSample loop token [] - let private parsePlatformEntity (token:SOFTToken) (en: IEnumerator) (accession: string) = + let parsePlatformEntity (token:SOFTToken) (en: IEnumerator) (accession: string) = let rec loop (token:SOFTToken) (lexedPlatform:SOFTPlatformSpecifications list) = if en.MoveNext() then let nextToken = en.Current @@ -1383,7 +1343,7 @@ module SOFT = token,accession,createPlatformRecord accession lexedPlatform loop token [] - let private parseSeriesEntity (token:SOFTToken) (en: IEnumerator) (accession: string) = + let parseSeriesEntity (token:SOFTToken) (en: IEnumerator) (accession: string) = let rec loop (token:SOFTToken) (lexedSeries:SOFTSeriesSpecifications list) = if en.MoveNext() then let nextToken = en.Current @@ -1436,7 +1396,7 @@ module SOFT = token,accession,createSeriesRecord accession lexedSeries loop token [] - let private parseSOFTEntities (soft: seq) : (Map)*(Map)*(Map) = + let parseSOFTEntities (soft: seq) : (Map)*(Map)*(Map) = let en = soft.GetEnumerator() let rec loop (token: SOFTToken) (seriesRecords: (string*SeriesRecord) list) (sampleRecords: (string*SampleRecord) list) (platformRecords: (string*PlatformRecord) list) = @@ -1476,33 +1436,130 @@ module SOFT = loop en.Current [] [] [] else failwith "empty input" + [] + module Series = open FSharpAux.IO - ///Read SOFT SeriesInfo from a SOFT series file - let fromSeriesFile (path:string) = + type GSE = { + SeriesMetadata : SeriesRecord + SampleMetadata : Map + PlatformMetadata : Map + } + + let private createGSE (seriesRecords: Map, sampleRecords: Map, platformRecords: Map) : GSE = + { + SeriesMetadata = + seriesRecords + |> Map.toList + |> List.exactlyOne + |> snd + + SampleMetadata = sampleRecords + PlatformMetadata = platformRecords + } + + ///Read GEO series metadata and associated sample/platform metadata from a SOFT formatted series file (GPLXXXXX_family.soft) + let fromFile (path:string) = Seq.fromFile path |> Seq.map Tokenization.tokenizeSOFTLine - |> parseSOFTEntities + |> Parsing.parseSOFTEntities |> createGSE - ///Read SOFT SeriesInfo from a string representing a SOFT Series file - let fromSeriesFileEnumerator (fileEnumerator:seq) = + ///Read GEO series metadata and associated sample/platform metadata from a sequence of strings representing a SOFT formatted series + let fromFileEnumerator (fileEnumerator:seq) = fileEnumerator |> Seq.map Tokenization.tokenizeSOFTLine - |> parseSOFTEntities + |> Parsing.parseSOFTEntities |> createGSE - ///Read SOFT SeriesInfo from a SOFT series file - let fromPlatformFile (path:string) = + ///returns platform metadata associated with the input series GSE representation + let getAssociatedPlatforms (gse:GSE) = + gse.PlatformMetadata + |> Map.toList + |> List.map snd + + ///returns platform accessions associated with the input series GSE representation + let getAssociatedPlatformAccessions (gse:GSE) = + gse.PlatformMetadata + |> Map.toList + |> List.map snd + |> List.map (fun record -> record.Accession) + + ///returns sample metadata associated with the input series GSE representation + let getAssociatedSamples (gse:GSE) = + gse.SampleMetadata + |> Map.toList + |> List.map fst + + ///returns sample accessions associated with the input series GSE representation + let getAssociatedSampleAccessions (gse:GSE) = + gse.SampleMetadata + |> Map.toList + |> List.map fst + + + [] + module Platform = + + open FSharpAux.IO + + type GPL = { + PlatformMetadata : PlatformRecord + SeriesMetadata : Map + SampleMetadata : Map + } + + let private createGPL (seriesRecords: Map, sampleRecords: Map, platformRecords: Map) : GPL = + { + PlatformMetadata = + platformRecords + |> Map.toList + |> List.exactlyOne + |> snd + + SeriesMetadata = seriesRecords + SampleMetadata = sampleRecords + + } + + //Readers + + ///Read GEO platform metadata and associated sample/series Metadata from a SOFT formatted platform file (GPLXXXXX_family.soft) + let fromFile (path:string) = Seq.fromFile path |> Seq.map Tokenization.tokenizeSOFTLine - |> parseSOFTEntities + |> Parsing.parseSOFTEntities |> createGPL - ///Read SOFT SeriesInfo from a string representing a SOFT Series file - let fromPlatformFileEnumerator (fileEnumerator:seq) = + ///Read GEO platform metadata and associated sample/series Metadata from a sequence of strings representing a SOFT formatted platform + let fromFileEnumerator (fileEnumerator:seq) = fileEnumerator |> Seq.map Tokenization.tokenizeSOFTLine - |> parseSOFTEntities + |> Parsing.parseSOFTEntities |> createGPL + + ///returns series metadata associated with the input platform GPL representation + let getAssociatedSeries (gpl:GPL) = + gpl.SeriesMetadata + |> Map.toList + |> List.map snd + + ///returns series accessions associated with the input platform GPL representation + let getAssociatedSeriesAccessions (gpl:GPL) = + gpl.SeriesMetadata + |> Map.toList + |> List.map snd + |> List.map (fun record -> record.Accession) + + ///returns sample metadata associated with the input platform GPL representation + let getAssociatedSamples (gpl:GPL) = + gpl.SampleMetadata + |> Map.toList + |> List.map fst + + ///returns sample accessions associated with the input platform GPL representation + let getAssociatedSampleAccessions (gpl:GPL) = + gpl.SampleMetadata + |> Map.toList + |> List.map fst From 615dcbfd30632d6fdf7a70edae9f5227ce250937 Mon Sep 17 00:00:00 2001 From: Kevin Schneider Date: Wed, 26 Feb 2020 21:11:54 +0100 Subject: [PATCH 12/13] Fix GPL/GSE pretty printer (whoopsie) --- src/BioFSharp.IO/FSIPrinters.fs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/BioFSharp.IO/FSIPrinters.fs b/src/BioFSharp.IO/FSIPrinters.fs index 4634932c..ebb32a17 100644 --- a/src/BioFSharp.IO/FSIPrinters.fs +++ b/src/BioFSharp.IO/FSIPrinters.fs @@ -109,7 +109,7 @@ module FSIPrinters = |> Seq.iter (fun x -> printfn "%s" x) - let prettyPrintGSE (gse:GSE) = + let prettyPrintGSE (gse:SOFT.Series.GSE) = let formatSingleEntry rootIdent (s: string) = let ident = [for i in [1 .. (4*rootIdent)] do yield " "] |> String.concat "" @@ -187,7 +187,7 @@ Samples %s (gse.SeriesMetadata.Summary |> formatMultiEntries 4) (gse.SampleMetadata |> formatSamples 4) - let prettyPrintGPL (gpl:GPL) = + let prettyPrintGPL (gpl:SOFT.Platform.GPL) = let formatSingleEntry rootIdent (s: string) = let ident = [for i in [1 .. (4*rootIdent)] do yield " "] |> String.concat "" From 670f49dd384bce1b4c7053b99a88400e783ad555 Mon Sep 17 00:00:00 2001 From: Kevin Schneider Date: Wed, 26 Feb 2020 23:37:33 +0100 Subject: [PATCH 13/13] Bump version to 1.0.03 --- RELEASE_NOTES.md | 10 ++++++++++ docsrc/content/release-notes.md | 10 ++++++++++ src/BioFSharp.BioContainers/AssemblyInfo.fs | 8 ++++---- src/BioFSharp.BioDB/AssemblyInfo.fs | 8 ++++---- src/BioFSharp.IO/AssemblyInfo.fs | 8 ++++---- src/BioFSharp.ImgP/AssemblyInfo.fs | 8 ++++---- src/BioFSharp.ML/AssemblyInfo.fs | 8 ++++---- src/BioFSharp.Parallel/AssemblyInfo.fs | 8 ++++---- src/BioFSharp.Stats/AssemblyInfo.fs | 8 ++++---- src/BioFSharp.Vis/AssemblyInfo.fs | 8 ++++---- src/BioFSharp/AssemblyInfo.fs | 8 ++++---- 11 files changed, 56 insertions(+), 36 deletions(-) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index ba9cd24d..14b86e6f 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,3 +1,13 @@ +#### 1.0.03 - Wednesday, February 26, 2020 + * **BioFSharp.Stats:** + * Massively improved SAILENT characterization speed for [preprocessing of large datasets](https://github.com/CSBiology/BioFSharp/pull/82) + * **BioFSharp.BioContainers:** + * [Improved DSL for Blast biocontainer API](https://github.com/CSBiology/BioFSharp/pull/83/commits/8e463f8cbc87797261520519b876b836d0b55bde) + * **BioFSharp.IO:** + * [Refactored SOFT Parser](https://github.com/CSBiology/BioFSharp/pull/83/commits/da0ba0cfa8807fad2032be66054125bd12f732c2) and [improved its namespace encapsulation](https://github.com/CSBiology/BioFSharp/pull/83/commits/eb389a908e7cee66f01616e62ef65df20fc88c6c). + * add prettyPrinters for the SOFT GSE/GPL type](https://github.com/CSBiology/BioFSharp/pull/83/commits/615dcbfd30632d6fdf7a70edae9f5227ce250937) + + #### 1.0.02 - Wednesday, February 19, 2020 * **BioFSharp.BioDB:** * Fix FaTool OData model URL diff --git a/docsrc/content/release-notes.md b/docsrc/content/release-notes.md index ba9cd24d..14b86e6f 100644 --- a/docsrc/content/release-notes.md +++ b/docsrc/content/release-notes.md @@ -1,3 +1,13 @@ +#### 1.0.03 - Wednesday, February 26, 2020 + * **BioFSharp.Stats:** + * Massively improved SAILENT characterization speed for [preprocessing of large datasets](https://github.com/CSBiology/BioFSharp/pull/82) + * **BioFSharp.BioContainers:** + * [Improved DSL for Blast biocontainer API](https://github.com/CSBiology/BioFSharp/pull/83/commits/8e463f8cbc87797261520519b876b836d0b55bde) + * **BioFSharp.IO:** + * [Refactored SOFT Parser](https://github.com/CSBiology/BioFSharp/pull/83/commits/da0ba0cfa8807fad2032be66054125bd12f732c2) and [improved its namespace encapsulation](https://github.com/CSBiology/BioFSharp/pull/83/commits/eb389a908e7cee66f01616e62ef65df20fc88c6c). + * add prettyPrinters for the SOFT GSE/GPL type](https://github.com/CSBiology/BioFSharp/pull/83/commits/615dcbfd30632d6fdf7a70edae9f5227ce250937) + + #### 1.0.02 - Wednesday, February 19, 2020 * **BioFSharp.BioDB:** * Fix FaTool OData model URL diff --git a/src/BioFSharp.BioContainers/AssemblyInfo.fs b/src/BioFSharp.BioContainers/AssemblyInfo.fs index 4632ce9e..4b6309de 100644 --- a/src/BioFSharp.BioContainers/AssemblyInfo.fs +++ b/src/BioFSharp.BioContainers/AssemblyInfo.fs @@ -5,8 +5,8 @@ open System.Reflection [] [] [")>] -[] -[] +[] +[] [] do () @@ -14,6 +14,6 @@ module internal AssemblyVersionInformation = let [] AssemblyTitle = "BioFSharp.BioContainers" let [] AssemblyProduct = "BioFSharp" let [] AssemblyDescription = "An open source bioinformatics toolbox written in F#. " - let [] AssemblyVersion = "1.0.02" - let [] AssemblyFileVersion = "1.0.02" + let [] AssemblyVersion = "1.0.03" + let [] AssemblyFileVersion = "1.0.03" let [] AssemblyConfiguration = "Release" diff --git a/src/BioFSharp.BioDB/AssemblyInfo.fs b/src/BioFSharp.BioDB/AssemblyInfo.fs index 1a771ca1..c0777269 100644 --- a/src/BioFSharp.BioDB/AssemblyInfo.fs +++ b/src/BioFSharp.BioDB/AssemblyInfo.fs @@ -5,8 +5,8 @@ open System.Reflection [] [] [")>] -[] -[] +[] +[] [] do () @@ -14,6 +14,6 @@ module internal AssemblyVersionInformation = let [] AssemblyTitle = "BioFSharp.BioDB" let [] AssemblyProduct = "BioFSharp" let [] AssemblyDescription = "An open source bioinformatics toolbox written in F#. " - let [] AssemblyVersion = "1.0.02" - let [] AssemblyFileVersion = "1.0.02" + let [] AssemblyVersion = "1.0.03" + let [] AssemblyFileVersion = "1.0.03" let [] AssemblyConfiguration = "Release" diff --git a/src/BioFSharp.IO/AssemblyInfo.fs b/src/BioFSharp.IO/AssemblyInfo.fs index 14900b62..aa17b5a4 100644 --- a/src/BioFSharp.IO/AssemblyInfo.fs +++ b/src/BioFSharp.IO/AssemblyInfo.fs @@ -5,8 +5,8 @@ open System.Reflection [] [] [")>] -[] -[] +[] +[] [] do () @@ -14,6 +14,6 @@ module internal AssemblyVersionInformation = let [] AssemblyTitle = "BioFSharp.IO" let [] AssemblyProduct = "BioFSharp" let [] AssemblyDescription = "An open source bioinformatics toolbox written in F#. " - let [] AssemblyVersion = "1.0.02" - let [] AssemblyFileVersion = "1.0.02" + let [] AssemblyVersion = "1.0.03" + let [] AssemblyFileVersion = "1.0.03" let [] AssemblyConfiguration = "Release" diff --git a/src/BioFSharp.ImgP/AssemblyInfo.fs b/src/BioFSharp.ImgP/AssemblyInfo.fs index 906b9f57..368d703b 100644 --- a/src/BioFSharp.ImgP/AssemblyInfo.fs +++ b/src/BioFSharp.ImgP/AssemblyInfo.fs @@ -5,8 +5,8 @@ open System.Reflection [] [] [")>] -[] -[] +[] +[] [] do () @@ -14,6 +14,6 @@ module internal AssemblyVersionInformation = let [] AssemblyTitle = "BioFSharp.ImgP" let [] AssemblyProduct = "BioFSharp" let [] AssemblyDescription = "An open source bioinformatics toolbox written in F#. " - let [] AssemblyVersion = "1.0.02" - let [] AssemblyFileVersion = "1.0.02" + let [] AssemblyVersion = "1.0.03" + let [] AssemblyFileVersion = "1.0.03" let [] AssemblyConfiguration = "Release" diff --git a/src/BioFSharp.ML/AssemblyInfo.fs b/src/BioFSharp.ML/AssemblyInfo.fs index 4ce65738..0c35b8b7 100644 --- a/src/BioFSharp.ML/AssemblyInfo.fs +++ b/src/BioFSharp.ML/AssemblyInfo.fs @@ -5,8 +5,8 @@ open System.Reflection [] [] [")>] -[] -[] +[] +[] [] do () @@ -14,6 +14,6 @@ module internal AssemblyVersionInformation = let [] AssemblyTitle = "BioFSharp.ML" let [] AssemblyProduct = "BioFSharp" let [] AssemblyDescription = "An open source bioinformatics toolbox written in F#. " - let [] AssemblyVersion = "1.0.02" - let [] AssemblyFileVersion = "1.0.02" + let [] AssemblyVersion = "1.0.03" + let [] AssemblyFileVersion = "1.0.03" let [] AssemblyConfiguration = "Release" diff --git a/src/BioFSharp.Parallel/AssemblyInfo.fs b/src/BioFSharp.Parallel/AssemblyInfo.fs index 68dce98c..b13d51d4 100644 --- a/src/BioFSharp.Parallel/AssemblyInfo.fs +++ b/src/BioFSharp.Parallel/AssemblyInfo.fs @@ -5,8 +5,8 @@ open System.Reflection [] [] [")>] -[] -[] +[] +[] [] do () @@ -14,6 +14,6 @@ module internal AssemblyVersionInformation = let [] AssemblyTitle = "BioFSharp.Parallel" let [] AssemblyProduct = "BioFSharp" let [] AssemblyDescription = "An open source bioinformatics toolbox written in F#. " - let [] AssemblyVersion = "1.0.02" - let [] AssemblyFileVersion = "1.0.02" + let [] AssemblyVersion = "1.0.03" + let [] AssemblyFileVersion = "1.0.03" let [] AssemblyConfiguration = "Release" diff --git a/src/BioFSharp.Stats/AssemblyInfo.fs b/src/BioFSharp.Stats/AssemblyInfo.fs index 0988e585..fe0b5d1a 100644 --- a/src/BioFSharp.Stats/AssemblyInfo.fs +++ b/src/BioFSharp.Stats/AssemblyInfo.fs @@ -5,8 +5,8 @@ open System.Reflection [] [] [")>] -[] -[] +[] +[] [] do () @@ -14,6 +14,6 @@ module internal AssemblyVersionInformation = let [] AssemblyTitle = "BioFSharp.Stats" let [] AssemblyProduct = "BioFSharp" let [] AssemblyDescription = "An open source bioinformatics toolbox written in F#. " - let [] AssemblyVersion = "1.0.02" - let [] AssemblyFileVersion = "1.0.02" + let [] AssemblyVersion = "1.0.03" + let [] AssemblyFileVersion = "1.0.03" let [] AssemblyConfiguration = "Release" diff --git a/src/BioFSharp.Vis/AssemblyInfo.fs b/src/BioFSharp.Vis/AssemblyInfo.fs index 737ec5ba..7fe8b05f 100644 --- a/src/BioFSharp.Vis/AssemblyInfo.fs +++ b/src/BioFSharp.Vis/AssemblyInfo.fs @@ -5,8 +5,8 @@ open System.Reflection [] [] [")>] -[] -[] +[] +[] [] do () @@ -14,6 +14,6 @@ module internal AssemblyVersionInformation = let [] AssemblyTitle = "BioFSharp.Vis" let [] AssemblyProduct = "BioFSharp" let [] AssemblyDescription = "An open source bioinformatics toolbox written in F#. " - let [] AssemblyVersion = "1.0.02" - let [] AssemblyFileVersion = "1.0.02" + let [] AssemblyVersion = "1.0.03" + let [] AssemblyFileVersion = "1.0.03" let [] AssemblyConfiguration = "Release" diff --git a/src/BioFSharp/AssemblyInfo.fs b/src/BioFSharp/AssemblyInfo.fs index 5c6d616c..1ae7d87b 100644 --- a/src/BioFSharp/AssemblyInfo.fs +++ b/src/BioFSharp/AssemblyInfo.fs @@ -5,8 +5,8 @@ open System.Reflection [] [] [")>] -[] -[] +[] +[] [] do () @@ -14,6 +14,6 @@ module internal AssemblyVersionInformation = let [] AssemblyTitle = "BioFSharp" let [] AssemblyProduct = "BioFSharp" let [] AssemblyDescription = "An open source bioinformatics toolbox written in F#. " - let [] AssemblyVersion = "1.0.02" - let [] AssemblyFileVersion = "1.0.02" + let [] AssemblyVersion = "1.0.03" + let [] AssemblyFileVersion = "1.0.03" let [] AssemblyConfiguration = "Release"