From 5403111e2ec410904f7531d2bd1f42972b489db2 Mon Sep 17 00:00:00 2001 From: Mike Hume Date: Thu, 1 Aug 2024 09:34:52 +0100 Subject: [PATCH 1/7] apigw-v1 --- .../Readme.md | 95 ++++++++++++++ .../api.yaml | 41 ++++++ .../example-pattern.json | 62 +++++++++ .../statemachine/stateMachine.asl.json | 50 +++++++ .../template.yml | 124 ++++++++++++++++++ 5 files changed, 372 insertions(+) create mode 100644 apigw-rest-stepfunctions-express-sync-bedrock-sam/Readme.md create mode 100644 apigw-rest-stepfunctions-express-sync-bedrock-sam/api.yaml create mode 100644 apigw-rest-stepfunctions-express-sync-bedrock-sam/example-pattern.json create mode 100644 apigw-rest-stepfunctions-express-sync-bedrock-sam/statemachine/stateMachine.asl.json create mode 100644 apigw-rest-stepfunctions-express-sync-bedrock-sam/template.yml diff --git a/apigw-rest-stepfunctions-express-sync-bedrock-sam/Readme.md b/apigw-rest-stepfunctions-express-sync-bedrock-sam/Readme.md new file mode 100644 index 000000000..19c9a8c5a --- /dev/null +++ b/apigw-rest-stepfunctions-express-sync-bedrock-sam/Readme.md @@ -0,0 +1,95 @@ +# Amazon API Gateway HTTP API, AWS StepFunctions (Synchronous Express Workflow), Intrinsic Functions, and Prompt Chaining with Amazon Bedrock. + +The AWS Serverless Application Model (SAM) template deploys an Amazon API Gateway HTTP API endpoint connected to an AWS Step Functions state machine. This example demonstrates how to invoke an Express state machine synchronously and utilize AWS Step Functions intrinsic functions to chain two prompts, which are then used to invoke the Amazon Bedrock language model. The output from the state machine execution is returned to the client within 29 seconds, using the HTTP API. This no-code example showcases how the results from the first prompt can be used to provide context for the second prompt, allowing the language model to deliver a highly-curated response. By chaining these prompts, the system can leverage the capabilities of the language model to generate more meaningful and contextual outputs. + +Learn more about this pattern at [Serverless Land Patterns](https://serverlessland.com/patterns/apigw-rest-stepfunctions-express-sync-bedrock-sam) + +Important: this application uses various AWS services and there are costs associated with these services after the Free Tier usage - please see the [AWS Pricing page](https://aws.amazon.com/pricing/) for details. You are responsible for any AWS costs incurred. No warranty is implied in this example. + +## Requirements + +* [Create an AWS account](https://portal.aws.amazon.com/gp/aws/developer/registration/index.html) if you do not already have one and log in. The IAM user that you use must have sufficient permissions to make necessary AWS service calls and manage AWS resources. +* [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html) installed and configured +* [Git Installed](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) +* [AWS Serverless Application Model](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html) (AWS SAM) installed +* [NOTE! Manage Access to Amazon Bedrock Foundation Models](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access.html) at the time of writing, this example uses Amazon Bedrock foundation model cohere.command-text-v14 + + +## Deployment Instructions + +1. Create a new directory, navigate to that directory in a terminal and clone the GitHub repository: + ``` + git clone https://github.com/aws-samples/serverless-patterns + ``` +2. Change directory to the pattern directory: + ``` + cd apigw-rest-stepfunctions-express-sync-bedrock-sam + ``` +3. From the command line, use AWS SAM build to prepare an application for subsequent steps in the developer workflow, such as local testing or deploying to the AWS Cloud: + ``` + sam build + ``` +4. From the command line, use AWS SAM to deploy the AWS resources for the pattern as specified in the template.yml file: + ``` + sam deploy --guided + ``` +5. During the prompts: + * Enter a stack name + * Select the desired AWS Region + * Allow SAM to create roles with the required permissions if needed. + +6. Note the outputs from the SAM deployment process. These contain the resource names and/or ARNs which are used for testing. + +## How it Works +In this example, the state machine is invoked with a JSON payload +```asl +{ + "prompt_one": "Write a 500 word blog post on The Beatles" +} +``` +During execution, the Task state calls the Bedrock API and the response goes into the task result_one. +```asl +{ + "result_one.$": "$.Body.generations[0].text" +} +``` +A Pass state is then used to pass the data to the next state using an Intrinsic Function (States.). +```asl +{ + "convo_one.$": "States.Format('{}',$.result_one.result_one)" +} +``` +The second prompt is then executed with new instructions and the results from the first execution. This provides the prompt with more context +```asl +{ + "prompt.$": "States.Format('{}\n{}','Human: Now write a short story based on the following. Assistant:', $.convo_one.convo_one)", + "max_tokens": 1000 +} +``` +By default, the state then sends the task result as output. + + +## Testing + +The stack will output the **api endpoint**. You can use *Postman* or *curl* to send a POST request to the API Gateway endpoint. + +``` +curl -H "Content-type: application/json" -X POST -d '{"prompt_one": "Write a 500 word blog post on The Beatles"}' + +``` +After runnning the above command, API Gateway will invoke the State machine and return the complete results back to the client instead of just the State machine's execution Id. + +## Cleanup + +1. Delete the stack + ```bash + sam delete + ``` +2. Confirm the stack has been deleted + ```bash + aws cloudformation list-stacks --query "StackSummaries[?contains(StackName,'STACK_NAME')].StackStatus" + ``` +---- +Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. + +SPDX-License-Identifier: MIT-0 \ No newline at end of file diff --git a/apigw-rest-stepfunctions-express-sync-bedrock-sam/api.yaml b/apigw-rest-stepfunctions-express-sync-bedrock-sam/api.yaml new file mode 100644 index 000000000..74a7a3956 --- /dev/null +++ b/apigw-rest-stepfunctions-express-sync-bedrock-sam/api.yaml @@ -0,0 +1,41 @@ +openapi: "3.0.1" +info: + title: "step-function-integration" + version: "2022-06-20T05:39:09Z" +servers: + variables: + basePath: + default: "/dev" +paths: + /: + post: + responses: + "200": + description: "200 response" + content: + application/json: + schema: + $ref: "#/components/schemas/Empty" + x-amazon-apigateway-integration: + type: "aws" + credentials: + Fn::Sub: "${RestApiRole.Arn}" + httpMethod: "POST" + uri: + "arn:aws:apigateway:${AWS::Region}:states:action/StartSyncExecution" + responses: + default: + statusCode: "200" + responseTemplates: + application/json: "#set ($parsedPayload = $util.parseJson($input.json('$.output')))\n\ + $parsedPayload" + requestTemplates: + application/json: "#set($data = $util.escapeJavaScript($input.json('$')))\n\ + \ {\n \"input\": \"$data\",\n \"stateMachineArn\": \"\ + arn:aws:states:${AWS::Region}:${AWS::AccountId}:stateMachine:StateMachineExpressSync\"\n }" + passthroughBehavior: "when_no_templates" +components: + schemas: + Empty: + title: "Empty Schema" + type: "object" diff --git a/apigw-rest-stepfunctions-express-sync-bedrock-sam/example-pattern.json b/apigw-rest-stepfunctions-express-sync-bedrock-sam/example-pattern.json new file mode 100644 index 000000000..49ed60a44 --- /dev/null +++ b/apigw-rest-stepfunctions-express-sync-bedrock-sam/example-pattern.json @@ -0,0 +1,62 @@ +{ + "title": "Amazon API Gateway, AWS StepFunctions Synchronous Express Workflow, Prompt Chain, Amazon Bedrock", + "description": "Amazon API Gateway HTTP API, AWS StepFunctions (Synchronous Express Workflow), Intrinsic Functions, and Prompt Chaining with Amazon Bedrock.", + "language": "", + "level": "200", + "framework": "SAM", + "introBox": { + "headline": "How it works", + "text": [ + "The AWS Serverless Application Model (SAM) template deploys an Amazon API Gateway HTTP API endpoint connected to an AWS Step Functions state machine." + "This example demonstrates how to invoke an Express state machine synchronously and utilize AWS Step Functions intrinsic functions to chain two prompts," + "which are then used to invoke the Amazon Bedrock language model. The output from the state machine execution is returned to the client within 29 seconds," + "using the HTTP API. This no-code example showcases how the results from the first prompt can be used to provide context for the second prompt, allowing" + "the language model to deliver a highly-curated response. By chaining these prompts, the system can leverage the capabilities of the language model to " + "generate more meaningful and contextual outputs." + ] + }, + "gitHub": { + "template": { + "repoURL": "https://github.com/aws-samples/serverless-patterns/tree/main/apigw-rest-stepfunctions-express-sync-bedrock-sam", + "templateURL": "serverless-patterns/apigw-rest-stepfunctions-express-sync-bedrock-sam", + "projectFolder": "apigw-rest-stepfunctions-express-sync-bedrock-sam", + "templateFile": "template.yml" + } + }, + "resources": { + "bullets": [ + { + "text": "AWS Step Functions Intrinsic functions", + "link": "https://docs.aws.amazon.com/step-functions/latest/dg/amazon-states-language-intrinsic-functions.html" + }, + { + "text": "Synchronous and Asynchronous Express Workflows", + "link": "https://docs.aws.amazon.com/step-functions/latest/dg/concepts-express-synchronous.html" + } + ] + }, + "deploy": { + "text": [ + "sam deploy" + ] + }, + "testing": { + "text": [ + "See the GitHub repo for detailed testing instructions." + ] + }, + "cleanup": { + "text": [ + "sam delete" + ] + }, + "authors": [ + { + "name": "Mike Hume", + "image": "https://media.licdn.com/dms/image/D4E03AQEiUfmBiUOw_A/profile-displayphoto-shrink_200_200/0/1718324029612?e=1727308800&v=beta&t=ybhm76l-CP5xcUsHbdq2IaJOlfyycvQ6gNwuCSd3Z0w", + "bio": "AWS Senior Solutions Architect & UKPS Serverless Lead.", + "linkedin": "michael-hume-4663bb64", + "twitter": "" + } + ] +} diff --git a/apigw-rest-stepfunctions-express-sync-bedrock-sam/statemachine/stateMachine.asl.json b/apigw-rest-stepfunctions-express-sync-bedrock-sam/statemachine/stateMachine.asl.json new file mode 100644 index 000000000..0c7ad7f68 --- /dev/null +++ b/apigw-rest-stepfunctions-express-sync-bedrock-sam/statemachine/stateMachine.asl.json @@ -0,0 +1,50 @@ +{ + "Comment": "An example of using Bedrock to chain prompts and their responses together.", + "StartAt": "Invoke model with first prompt", + "States": { + "Invoke model with first prompt": { + "Type": "Task", + "Resource": "arn:aws:states:::bedrock:invokeModel", + "Parameters": { + "ModelId": "cohere.command-text-v14", + "Body": { + "prompt.$": "$.prompt_one", + "max_tokens": 2000 + }, + "ContentType": "application/json", + "Accept": "*/*" + }, + "Next": "Add first result to conversation history", + "ResultPath": "$.result_one", + "ResultSelector": { + "result_one.$": "$.Body.generations[0].text" + } + }, + "Add first result to conversation history": { + "Type": "Pass", + "Next": "Invoke model with second prompt", + "Parameters": { + "convo_one.$": "States.Format('{}',$.result_one.result_one)" + }, + "ResultPath": "$.convo_one" + }, + "Invoke model with second prompt": { + "Type": "Task", + "Resource": "arn:aws:states:::bedrock:invokeModel", + "Parameters": { + "ModelId": "cohere.command-text-v14", + "Body": { + "prompt.$": "States.Format('{}\n{}','Human: Now write a short story based on the following. Assistant:', $.convo_one.convo_one)", + "max_tokens": 1000 + }, + "ContentType": "application/json", + "Accept": "*/*" + }, + "ResultSelector": { + "result_two.$": "$.Body.generations[0].text" + }, + "ResultPath": "$.result_two", + "End": true + } + } +} diff --git a/apigw-rest-stepfunctions-express-sync-bedrock-sam/template.yml b/apigw-rest-stepfunctions-express-sync-bedrock-sam/template.yml new file mode 100644 index 000000000..31dc8ddbb --- /dev/null +++ b/apigw-rest-stepfunctions-express-sync-bedrock-sam/template.yml @@ -0,0 +1,124 @@ +AWSTemplateFormatVersion: '2010-09-09' +Transform: AWS::Serverless-2016-10-31 +Description: Amazon API Gateway HTTP API, AWS StepFunctions (Synchronous Express Workflow), Intrinsic Functions, and Prompt Chaining with Amazon Bedrock. + +Resources: + +########################################################################## +# STEP FUNCTION # +########################################################################## + StateMachineExpressSync: + Type: AWS::Serverless::StateMachine + Properties: + Name: StateMachineExpressSync + #Name: APIGWStepFunctionExpressSync + DefinitionUri: statemachine/stateMachine.asl.json + DefinitionSubstitutions: + ModelId: !Sub arn:aws:bedrock:${AWS::Region}::foundation-model/cohere.command-text-v14 + Role: + Fn::GetAtt: [ StatesMachineExecutionRole, Arn ] + Type: EXPRESS + Logging: + Destinations: + - CloudWatchLogsLogGroup: + LogGroupArn: !GetAtt StateMachineLogGroup.Arn + IncludeExecutionData: false + Level: 'ALL' + +########################################################################## +# STEP FUNCTION LOG GROUP # +########################################################################## + StateMachineLogGroup: + Type: AWS::Logs::LogGroup + Properties: + LogGroupName: !Join [ "/", [ "stepfunctions", StateMachineExpressSync]] + +########################################################################## +# REST API # +########################################################################## + RestApiforSyncWF: + Type: AWS::Serverless::Api + Properties: + StageName: dev + DefinitionBody: # an OpenApi definition + 'Fn::Transform': + Name: 'AWS::Include' + Parameters: + Location: './api.yaml' + OpenApiVersion: 3.0.3 + EndpointConfiguration: + Type: REGIONAL + +########################################################################## +# Roles # +########################################################################## + RestApiRole: + Type: 'AWS::IAM::Role' + Properties: + AssumeRolePolicyDocument: + Version: 2012-10-17 + Statement: + - Effect: Allow + Principal: + Service: + - apigateway.amazonaws.com + Action: + - 'sts:AssumeRole' + Policies: + - PolicyName: AllowSFNExec + PolicyDocument: + Version: 2012-10-17 + Statement: + - Effect: Allow + Action: "states:StartSyncExecution" + Resource: !GetAtt StateMachineExpressSync.Arn + + + StatesMachineExecutionRole: + Type: "AWS::IAM::Role" + Properties: + AssumeRolePolicyDocument: + Version: "2012-10-17" + Statement: + - Effect: "Allow" + Principal: + Service: + - !Sub states.${AWS::Region}.amazonaws.com + Action: "sts:AssumeRole" + Path: "/" + Policies: + - PolicyName: CWLogs + PolicyDocument: + Version: "2012-10-17" + Statement: + - Effect: Allow + Action: + - "logs:CreateLogDelivery" + - "logs:CreateLogStream" + - "logs:GetLogDelivery" + - "logs:UpdateLogDelivery" + - "logs:DeleteLogDelivery" + - "logs:ListLogDeliveries" + - "logs:PutLogEvents" + - "logs:PutResourcePolicy" + - "logs:DescribeResourcePolicies" + - "logs:DescribeLogGroups" + Resource: "*" + - PolicyName: BedrockAccess + PolicyDocument: + Version: "2012-10-17" + Statement: + - Effect: Allow + Action: + - "bedrock:InvokeModel" + Resource: !Sub arn:aws:bedrock:${AWS::Region}::foundation-model/cohere.command-text-v14 + +########################################################################## +# Outputs # +########################################################################## +Outputs: + PromptChainApi: + Description: "Sync WF API endpoint" + Value: !Sub "https://${RestApiforSyncWF}.execute-api.${AWS::Region}.amazonaws.com/dev" + + From 3495f8f8bf721f11bc69ed0c96fe97ad0064cb6d Mon Sep 17 00:00:00 2001 From: Mike Hume Date: Thu, 1 Aug 2024 10:03:42 +0100 Subject: [PATCH 2/7] apigw-v2 --- .../Readme.md | 3 +++ .../images/apigw.png | Bin 0 -> 91059 bytes 2 files changed, 3 insertions(+) create mode 100644 apigw-rest-stepfunctions-express-sync-bedrock-sam/images/apigw.png diff --git a/apigw-rest-stepfunctions-express-sync-bedrock-sam/Readme.md b/apigw-rest-stepfunctions-express-sync-bedrock-sam/Readme.md index 19c9a8c5a..3f23b8688 100644 --- a/apigw-rest-stepfunctions-express-sync-bedrock-sam/Readme.md +++ b/apigw-rest-stepfunctions-express-sync-bedrock-sam/Readme.md @@ -40,6 +40,9 @@ Important: this application uses various AWS services and there are costs associ 6. Note the outputs from the SAM deployment process. These contain the resource names and/or ARNs which are used for testing. +## Architecture +![apigw-1](images/apigw.png) + ## How it Works In this example, the state machine is invoked with a JSON payload ```asl diff --git a/apigw-rest-stepfunctions-express-sync-bedrock-sam/images/apigw.png b/apigw-rest-stepfunctions-express-sync-bedrock-sam/images/apigw.png new file mode 100644 index 0000000000000000000000000000000000000000..6ad09e25fd0ebb562789ec4d3ea127792ea9ea29 GIT binary patch literal 91059 zcmd43Wmp^0);5fLk>W)Q1zKE+Lx56>OQD5Akl;mvyGw!M?%G0emjK1x3B@6}d+^}A z^qlj&=RD`VzW?8kTr-*M*?Z5LnYGut?|UUwO-1$@&I=qQB&28Za_`lVkWj9WkdPa& zFrJQZ$HhN?`l4weEv+UmElscHU~6V!ZHk0Mk!TD88OgD~?l&|9f%-?--rzX6s(=3; zp$_uxXzysp>ORFQ4ISt~k3vQUNHXDZzaaH$!uW)Xmh3EL_F3QAZ2G$dW!u{3FUm7! zvDTm>T6DW#d1Nf8yAqP6vASxXI@{X|QA{usl1cn#C5P$N(VR$P7Lkn#q-Px^4_;w; zqJB}9i{Xp$M(Zb&8?P(mLI`=hVe&|y=$d|usx?8 zGz{vF36{>p{*uWj4Uk5bW|Ah7W|kI_#*oHVOJ-Ed^LrWclC=NQq~BQ1Y|MBJxjK>p z&uD6vXY_)!tqj_zI)eDw!2E@Cx%=iVhbl>Z2z{Fiik@s7&bbn8{tQ zdWM-bnxUhuIS7<_`S`ePhk@auj1k;6^Z5AKa{u_)HsrU3y1v;ih$PEm6!F|QkoL*Y zLZ)Bj&6JgqSfBQ>kdQ+xkkFp?ke@y;o<2|aBnRbxj-XuSp#IN3a>L&rA)*HzNJx@M z^6#ZSxgj6uq5J9eOaZi^W=uyo@>s~vUrEw;Nc*jE%ILiA2}@x3)l=5_3nGZG+qz^&hkN$B^_9gkwk&5gA2#AOF`B)t*M2;rWkV|1ril zB9s>^A+daQZ2x=6u%{74F#cw3nJ4Ep}pl%IMd{P1+?bRR}1 z%m43%{A-LCEBh4x+kR?jomfwo-qoKv|Nj^l)r$u8za}S1@iGV5heBAR>F2+#^p7@A z#y0+cZqEPjjV+n*?(dC}kU$B9=wF>t{UG~?$;L2I^xkA&#+GRRHK)Q~b1E#U0Wsd9 z6oL7e7>r^%=p6_RFbC+HKOBocu20={l?(_D`17g=Yv77xIOMbX$WZ7liu}G%tBALC zN{3Fi=PL(#P2B6}U5`k}>sm();6F@_O|t*__~$t>4P}P)(hMUPfKy;BBxhlCRK>!= zBC#WIJwP4RHg#!kiYf3TltX#sD;x8Np9~($UI*{o=Xua>W|Kh{w(yuFh(J7f#wcQh zgX1|R5z`+|*bn@hG!%&EJkADFH-Sq@{Iupgr)EalcMYf7_cGdc#kO(Z&?;IX5PXY6 zze9VM42+H$p0VAen-8=2?8CFzg9qR2BS$zEh0sk`IAD7_2bJ?nW3%i$Jb#WIZDFWF zM2Ig0N12D2U4&PI(Y>Eh!D@=1CPF0DKb>ZP9e7)9z+uAlTD~eX_*Ubu!R8 zXKmY^vRb!!$#bjl$Z}Bo-S+d-Ymt*pKXzMTBEh3G@(Hbz2pIzz&*(MH9UHsem2t$| z)@|SBG+#IVYi41!-Z$o!QXv|npL!}(a!Y`+^|X7=r;#>isV`=0En;kcFNbezkf*aF zDoQin6&05|vru_X@H*txiPGb6w$nR;U3~1+p|@+}3IiOkcdx1Mn2Evs0&g){QW0SA zVO&}k+u`BjC1zq_iEYezX>(43v+Y^Mo=HSpz;`+__iF9+)gz^E+RKx8^{I6r~`pn$?x`Oqhv(D9jTVWn=Q( z+6wr&&N)tNr!EsG)SzyvFY|)|Re*c_BtO4`nadB#cSp^gYrJeK?8%|_ebj8wl=LU*2?XM{3ctgxcPRRLw-QQb@v2C-D z2ZLTe2RCZzD${BP<^HsL^m~Se-R4XIn$xU7Mb=GL)eo`gYgyZ?-P8{?7in7)5h;W= zWp%6sRog=}3<{YllHI^At` zrn69z_4ibS zxMSnxGZCd1aE#+fd4f+n-HPwETuoagQF?w)pvZ64V-L>Rxe5bgIszbmV;_xi?^60! zM#xOKp=96rGS{?1+#kTt-nAU5RDxn=Q9N0iY`t6Ri-nv~Ix^3S5LVfcCP=Fg|LypU zR+a(q+`{1g^z2tQV1BLuFf(1S;v)=Sta!MYO%iM{_r4s0_Ibl>W@IycE^c1%`8eN< zn|qBXKWfi0cpI*U7^0!Ng>y1rPw}_|F0Tv6O`g_eEabmyE;36Yb{G;7cS($!9{C2Q z-7dGqFoBls5R;A_UK)XSg;!rFT}HT=ESH=nZlmD5 zzm9^oPAPTkXf22z4XaW7l{Q6Y24m)_eNc^QE9WT4 zio}UOdR#dj$7rI0P-*G^gY-+yO+%k-;#@n;O=^Q{u|AZy95Kkq09<=<0U zvuw8jb^d6g@6CPt6vq!h7KZ)Iv@z6qbBCq=GMZbC6JZhlHesYWaPv9u%S2?Bn+Xo< zlHrhm+9U|@tDvx%(3>0%o7MMCv$Aw7xIP^c73iLlOH53anNSWpMJh1Ys@o|_&w%-} z-e%>9Xb#9k-zES8JO7&Y6s>;4Kv9UNeBqi|yq(A34`@ILO-;|02g%MM+1Vz~kuHbFDd*qoy3le?Jr>-BrK zKOc5?&V{<5IPWb3T4891zy38q-S9Azg^)mVBJg=UOVy#y$Fd^@*tw8lT3^%NzgM!= z1U|bkg@)<6GE}3~CNKKsyc^L_G}#y_7%1F+`1)Klyd>|&w&J36>tn$(xM>ND=7jN8 zsD;gckz+6X-%cr3e<)J@VvL@+P(RCayi-aT0>52P%12P!+taixA;UF0 zqT%!vs?mi(7Ao8uL`u6C$xFO}P$E;p&1W}%E)G@`4?28TZ@7b$YxMou*2N!=k1??B_xtEf8;DZgTf){fEnX@c;Xy|HIi!`APW{F!c*Anny&EUKD=p zGC3X6Qe1CR{Dm8`Mlmaj+={AU?zj?TG>+|w9!D{m{)o&(6lna)GFw>P^L%7n`-s~F z?exnJmVSfejl!h{Eyo$qdNE%AcsfU32-_Tt0QRc}_KJ1Iui47BC9j_Qa zwy^a_zo2FbWFWd=oD~SM>~MyDzN&6(W2GUjTP!(63WV7Z&N|90mu@+JZrjFmzRr3) zej&`O{eixHoAzPJnrffH!!@Q&K-9oYDRW24`(mD&lAm4sLnQS)8y8=N zLdv9sSCfb_Tw6IAWzvI`SGOa}@-8VfV~VW9{JX-{7sDK{M8Xh~-3h*jfl$-Uc|3U) zxflc5-@dBuTlE1iS(rG0z0ovGxgX9UEi|rzngylu)TE9&DFJZ$6 z@{UVh=NIbN%LN8Ql|MpN;@p{f!?)oK#Jy2Tv5aw^nL%XDkNr3R9K zwXlm##@ilKZa?%!pRPhTp2=AD8Ddr?I5Dv(mDg(M&2wU6n$pp+pz+>0zWlT*s*Kcl zt%yd;WTnivoKJqs06kkNQ%EzoyYFIUOpQndiwR?6vke!IaIKDUfC=-*ezz8o2O@%S| z(k5Jp!yuE>u|5?)`vQ`wq+#+UO(sJ(F4KUWr$Ix|XSiQqm|As6vkaX~gGoRjUrV2u zB5=Ig!E|)mx&-0J%E^)Z!AsVfXD&e0TPz8Jpv}&_0_X%;N&QVtZ^%(T-Vf>4X%b-> zpk2wr4x;<$Oj-J)X|i6`EH!*&2*yN@_`bqOc&Fld8!TxzI;Dg2KxhtkE^-Rkp8rNT zX8z50y$Qp4A3x82vu#r%Tal%ZV9o{})Afn_b70^dPdU9%j;={(3Q-n)pu4ZEo$t&# zmz*nM7>`fg)0dS69BvaaNBH z-*xQoT8Ub#H-d5}Qv>$Q^nz2?kMTbXnVkFV)bzJ~FR_t*!gKRJneM zHR_rnuCa8rgWI@0K<+VE19ilg`228l>u6fCtD%&+Vi236rkusCv-Z;yQ3e)Q# zVcSZK88yFbrTYj$U0+qD58GXrZ)cc>_8lR$0++w94y4$5f^!0U83^mwz73G{MUc8i zV5e8iF38oAZl-A%dYpDIa5aJkmK#qv`1UysC+ z?dF4Nn@$PVw`VB+Zq4c9AuVgmtA%ou2^3s&ZOtWpdu;sOc*rb92v=E}-@0))}HiV+1vJ%ckyE z^Tml)HG)$#?L4~ezN6WE?7H2NYe;i~d8nQXV0|-$!t${CqH!z;w2d>!sev6@dZbM@kA`%-W7~?n6JKk zrSokN+1LN!Y;C8Rc^0PN(QxOQ$_EtD^ghtebls~o=nxVHS3_$TtCr;p=qS1ImGRR+ zBB^f9>$C}`+)5uLE#lE;^kP?deZbe(-<*X%+%dEGtV6h9w}Xmum8#=kLk@L7A{D~* z(Wxq-T^oTC0=u{@2!$q%WoX}UbdAz@hKEnXga@o{WpYC6Z%nR?=E1cPlpkrC$iPic z2$D2kv%+xQsk%0Nkylr|gmzU18nEagW&xHQzt_5}W!$kXX}991E${Y_k}%nn7qL-I zJs%P0UF`yz++o)DH!%4o+QT1ZdYfHqB7ES?ltJ0C@TJ#`53YfDo{t|WFWab0)f~L) zX^Zicgbu8Hdf)C>%mD5_6<31Sk`zaII*!{O?k!b?ZOV$kU)!fs+2bz-0&euGEPclMB+J-99c*^O(^g2Cw(Wc{eSi#5j$$k1pFK-kH96Cr%)mAjRktjiVs zu>I_8a%Lay`>B^*?9&=#S=L4PQb{{36w`Dr%_+4R`tcN2VjJ7-emgYj9i7xf>p8js zKB%zbt`gp?-uEoFzwlmLl1*XxUY*H7PREjLi0*S$j;S!-+~ctI+4s<$;ZSy&Jy9=O zR0G4dtzuZ>LFpRWM3+`ZVXo)dG>NRbryZO2G9DpbyuDiw_dO}2zHVYO>BkROdT3F7 zXet0-o{R(GeBj>ExxSqZf!Bk9&=!VVa%%P}$IB#(@Tk}V9&L?(#Sc3YSUWgAk0*&b zFSfAIvOrX`=5$ymL?Fh(9v_<2hwPG9S43ICZ|F*4SXC6uNX))e;h2`vkCV;HI~IoR&4_^J2qHG=RCBFyC$NN9fT#` zhy1Fn9Tsb;K~v>0eX%({p_&i~ZB^=pJEt7fo#9tM9-VEFdmeGJtmFGDPisAdw&^oz z5H&1$>00wPTas&`G#w zd!2N#HXi3UnQl!EI2pOwc*|5=hKZ&J$gJ@Xb`hx*2zKeo_6 zMYL9qEbD=N56quurQtj4Sr^2dtuF*PV^p&n4fKJhsk&}_%$~WjsRJa4eTnn65{Ko_ zzAk@Bm#j(KfB@(bn#Z&^ddL&V;V3K%@z}V-^P?@hpa2PUm@aLZ!*U} zMv{U_Hj@I%w=_#PW>OK%L>EQ2g!qefGm})23mVYsJD%J9rv0=_irL)H)|;{u{)xBB z*r${^ZD(^crwcSQQnCFNQDSmOUU$Oohk>e_{r3o7i`zp1RY2F?g?tEmQiWz|Qd4ZX@GB8g%~1IqXGQ&HH1R^@|3E2KLb3x`YGSQZN94daknj*!2YX?3F0zUBHNqQ zdSU+VZv9$oBM~8S`Rv%8g~5&B;b3<{$xn50KVFopO>%2Ajnng}S$vdI40Jg~o~W53 zUE=z<`_56;1V#z$hwv51i$d@ssrXTV4h$n5>lMirM;{-%eV2O&ec~6Q<->)WkYEO# z#S--@CpOrd3&hcJ@%VbyOOHm-#aC3@ObtDZIItK%2b%RhNB&@4o2Xv-)#1R41*(Me z=1=<>sT>;zwVYQ{l2;`^%%EdJ~soZV`xI6#mJpDGWWJgfTYs5lncV8ser(E)27M zn#2%D>z6w|N^e4Ch;BPga%!Jm_w{{70WLQuVk8i|J^hVD2XiWKf)lwT&MHj5zWa%N zROCsdxg}xn`?X62SDf8uufx`{gX0&-0L!|PEgSh6Lt=ln=u;qz9 zGrf)Nw$I5|Y);=ETUGu|D@&>kE}^@NTYG@ggx#geV0X94La z3Y2!{ZlUydSAmz9TPkHs6((3W4s!~Dij_1OS6*$bWd)UvoB`OOCnvKQQ=AKkd$?zL zvc&SesxTU6I_A10!Xkw3m8+oxk-6~QpwGz)4@+c6XKNkm^4HltvYYQtsu0w?^q;og zV0&wwKF)*horb{r!`ftu`OAxX3bzI0i!nZUgDs`6`}CCXY@WuustPFU;ok_U$3RhDBH18K+(Ry zra&)L^gy#aRq-_)i?Tv(*M73lJJEyE-o5}T-xu{Kpv|crd%O3N*>)>pp{bL~yXKSV zP9m$=`S=la?|)Oi75bBd&(h$kKT(5gvPBk8JtAIVL3y2{O3i8vLfwodUydOr(0`Tu zxMiZoyA^P1m(hH&o9uA7Oq+C`;e}RAY+6qPNu;L6_r8ooD5=5GxG~umWRBc6+>6R9 z5}O{}{QvYxnsvyV8z(-#n==k+48DGajTv1bw*9t-)C{bWHN50dT#A;s>;hDlrLQZ$ zn`5DVIo06V5m?xG-^zSk5^BPZZKO=rYe$t^`o69PKJtx!2wupBkH4jjwYBj$p;}sM}_FxxqO;)*7QT8^BNy6k3wnTFdl} z=%&?&r52x-6;E*#cv?kD6EdvEYfNy*szgG*XNJ{s@$<<-QsvWzmpZt;GYHu0VV1ZB zZcr;T6@NTTsz^tc-hq`@##3o{sZl(KfMEr?_y@;6dJnAveNMQ;O4NXfnmY!rF5U~M zm?KRC!Q}Ykkmj$U=EfSacaac9!C6oydixt3?@T1t8PJc`#1cLefg44UIgmx~ zbZJ5aweIt(CqI&W~oNNf`wgv8OTV! zmPZ7C|UE|bdvbr83v+Ulx=7Az<~U!k zt*bXDPlBss-RXSK0`t~$wuD)zEg*T+)o_&5`bGA}l?`JiGIoxQ_5$mm`+Yv5?v}fy zK8Kagc7SI-mwsh<>0p1t&v6CfE51m!u@HFu(^{~*!JOIbS&y`;_)DQYoA|3_ zV^2JIgpk8+E;Kc?GrpqL^m34{dIp81WShS+owAVS$L+JgOOE`AWQ&vouXd1Kf0Kq@*nrNNF=A1EjjJMr45g1#_QuKhge}=ZC(}v3+83(CymH04Fn>8;Hl$Qe6@=Lv4XG>3leVnyL zxN7p!bYEYWeZf~nG20I2bxA&v7u%l~I;*NLlpI!Mn`&antgKxz5$yfj;!4yrp4BU_ zQ}7o;m^~@0+`NYmmRPqFrv4H5d!sp_OPqV>k>L}fH9TXfG{B%S(;Z0ks_b)`<{uc| ze(3&&^!#d_)_>}9G+*<>sekow2l!gW`a<$+G(DYZ%uL3|*Bq%b%x)$~o$Y=SULei) z)B&iauN~Q9usLJt<}#sg6x9@)2--IC{$90$M%%6&*G z&j_{0rgX&X4(cV9>yjh)e(uXk!K2e=;4zD}bdi*#?}&Rrddm@upGQ2*#mu<+_&Cxx zVF2r0_^};54je@ZBT$8R=bdfq6}vD=Jb8W0y9rgfKKEW8Ok=t`OkQ}(vK*e~fU2-p z6+7zLv+ElgZ2VTrJo{5#s+7C^o1x90>F`7#t;dV_T=^}@W49FX_p_Cd$&B0f9-NCGPIV5iZ0VsF>0q;th` zvbrr5A+gQnqqhl?$&$Jc=Kft;;q@6@_R283i8#eE9A~2cVZC2#NORzhcr@;mYl%BV z$DJ@mYA%|Hch>In9M|iMi4hJS8BT+BY}!6cx?R#uI_Tp2MK@3G z$SY&%eT&B9_kPPCpNRTk^X*!#Fi8rA9JVXNoll4AkMG-u>nK&zmErz=G=F~Au3FSY z)KHr6t=R1QjHwJ?#hNiKW8bBkUye)5(5Db6VSP!)xe~#0MgPK#quLuuzbw9l2|dw9 zeV=aBsWrX+4CT{Xp!4y`HrYI{b7#Xd0b}pYK=^aDH>gJ|D@%)G6hki9uBp$i#ipwl zO{MpEBnbc%`;)8Ry2uvzvYqcBT|yV&ic&%FPw()^vgZ6Z|5TZL!~Y9uM{!NYAxHTc z{$9O*i!ohJzbx!FbTNZpI_?@EW8SN%r9-seImm_z#0hjgdaRQ-m#=erM_zyK^hi*8 zg^7Oc#b9IN8e==bLpa_WL5(jmz&Mh1?>}a6nEOxcT=G#?vVP~>m(G%)6A5|g;lbdK zUCrR={mB+xz3m24cgM&EvIF&?IJQ|Hy%Q^JeC8aHqfN(!LpE3vUY_Nuy}y zlWxI~^`@bGo~SF%RV>W8zq)Ity8>QGD_2@!OL9~MIV>qJvr72(GEh83r13uYN0s(- z;x+LlMqD{eW@Z~QQnIIZyq*t>BtaSdlP{wWL~LG0nrkRhLC)RI((JGjVU7zB(VMl9 zZudg!R4t%^t+>)$=KwjOBi!GNhSn{z!^Z>Gx|cRDLQQf(i^k;5oa*|#2|ka8h!px0 z4H4g(O#W7bGWs4`BzsBiu+9RsGXl~ahr?W^%TQ}n*e?x%;E?E04y9eD1%d8u%2#&F z&1~@vd?WK@y~NO0XxTD3Mp3CZ7!j1SN0x(Xbpl<`yc;LnKFUKEx>0AZ3?#aydQSAy z7kI%o-nE%CDPT|1K6AVylt#*+;S}Uxs{M6lrHyMEkW~p8K&3sfZvleowE!9oYXIAJ zkkz_G_`h6?(C)bQzD}93KjjQ}4p-p@-RKiNu?`1{o-b``(+aS@F`|f>gbR(Keb@ag z_?Qwr$}7qJm;yy?h3t;1(o66Pe}s5p5eUq?=i@E82P@sq^aT5dh~yME>E{4QG0&a& z;Aqc1#;;=iA?}u(01{G6{Pf>dP!9G)%j4muAY^TULK=C;T{88H%>d6OW>dEYEkk=h zz<6dh@Dr=@2o}EHcyL$0_DUGbV?B^!Wpj(XDSl-8otoP8q&wKWt)>H`n|_{S0|p&@ zIz`si>BAzUe^k&+=Ghq9+1k0HBiOZY=#u^33@~3) zkaM^dR{&?Tt+`)2UtI}twN2{vcyYeV-m{N+n#m3enLtKF^jX-#=i%+RQ`RvZP50BC zHZSV#a@+H@?tOMXD&yWYV?eGy03we)U(`DhE&k5CQ6^=!*0VazPfy?uDzK>jS&z*$ zXRuZt|FtrBJsvRH;avJx*mRGJtk(fIcu=?MB0(-+Y0DIRTWJLS?8g4lW>NuQXGkc# z8@C>W`Sq;acig%@)oG+?{G&FDjB5+YSfs-TuEFZ&nocXthm*#N#JdwVy4ly~k60K< z;VPmk4a?2g{-8bKk4$F(yY0y$1QWQItt z(0Hyd&!~CcYWsLkc1$;`DQ-+eX1m|(T{C5+?Pu7pbVt9n*IKb?Z{1SRD8Ez zS!BDCXyood<|5`0dW6C+Ni_TViP3xb(D5sX)IS>^xn^yPy_BIJPEB%tJ_oqmV5}8< zY(%3L1eYd=ePbDLuoZXu)OuVMA##?}ZmC}%mDTdFsAm`hh21O^FIxn7mChTVKuKgN zl~9K}V3E7mLvWv01{^?efM<2nflH_DNW8%|bn(Mp`im#5T8D zaFN)u+tIhFYMwa{NA&{qT#mzz1SfNIgVAYUZJm2#WHF8zpm+gd5n-ZqZx3V(=)Ax0 zqR^4`wnkz=C9*#pC<#=wJ$`&SbJvS;^~4c0dNnyj^0!N@u37y;W1G1hUjC@xQA2)J z8k|co3-dpfZHb~3Rw{4aHh79b4$X~x5**4(|8i>W%um9<2WFIlDH8vYNJ%Ki1s&0b zVEJg`p8~qqBU*q?CU44fGEe*Pkm|&<+?j`<$kMM+&?k z97a*d@`Ze;Lbc(YYS!(=Kv{AITOVx${3h&r3o*q7%rcM&rM%r63&Rkc)iQW~GFGAo zN$1G+sn^XwdMt}>OQ11_Ccw1{R#`r~%$t!xhHBG7S1A|ck!0IOdY=tA4wjA#pw~ab zHw61=S+|$%3gQ>`>na31NS(Ze5P7*Kd#!!_1aGWH0{e95Za)6iQTS)0BQM4NB|7~H zCFv_M+dO^65ld$w$cfm{!135#r?Y6bLoeIGFcQFN{#;niNF2=cG7jdZpczK%$)>hc z)K|Sz@hAN4k)UgUUirpZi@fohX4lI*+t=^^f*)^*@zmweCMRJojaw1=KB9aK&8FTqd4)QgcGv zuCp|h8aRw+)<+XMU~smxXo(3W>WpDQz#X;!%%6UkELnydWHrE?R_l9o$A-~qt1PAW z9J-7dus^n~>0R(ar5y8-_qREbwVk=mS-#CD>^7dm(D)$3TS;``RBBZ-4%hZ~-;Vse zh3{YZ_*pdIth|HRJW|Ho;5=xv!xm_H zd3&{NU|MVk8v+z$*#fwL@tpApVFe%03ywG;Ti?JQy=d{7T#tfW)no%b`}kJ}4RZM6 zx4gs+#OXY^1c^eRULP)*6=lN}@6MhXIWart54fr#vg&+}%1i%(mGP|qg(@3(_T@GC za&!`hNT6awHQ(=QIqa=s4!H2uC)5LO#$TP46To#2+Cb)KsW4}2pC5XB1VSBGv6p9W zS~{vN!AZk6J)sT*9KM2^Zli0bFuItt@;1hXl+>}s>)D!j>}y*`jH2tvCI(yvk)i#( zskP8pb$>q6gubelkadO=1b@0Y{9Ery{T=7?9NbGJevK@jh zxqpA;R-MO+ofiYMiq-D$-+R!et@it*q#&dSB~pb z(Hc5WjI91amcgwxyEWhC$L_ZsU0JGk2%0=NYvPpi=|Vbus2m1nGyot}=V)&CpdXHH z@gGP@hE})r472ubE^rA308Iz4% zjA-l4ysj<~rxaPWx2g+OS4ePZqX6N1%{9AM1dAe_T^Z;?$MP_)mV3bQTy#Q$U{)N9 zO{2mSP;-%WnQ_`t0c~r1U*4!`5VPnt z91>HK)CBRKoWvsr=u{*=KKS`16Voa1KuVj>M=>4X*}k@#kjGH^YYen2LEU4j>$_A; z{~>PS^M#=fm&tEA_r9H^2&U*|w&m6YCc7%s{qr-Uv9sm&$PN*#fWgLv`X~$7}!;e03dkSTQn^Jec;P z@m7_5AnObwcyZ0f#0b2+okFiZg8+v(k~0|LVqOK^0h_zUj;dYI3Xj2)kum~_$o4zK zYtqYGU$lte^_ZIubG-l-Ox5_}G!b`1jjhu4Oyzw@EAVs^v32IVbSt-I!=Gy&!S#U- z0Q|kMvCH)jIQ|{-6U-~!fomDafP^L@O5yW(MW0O^(A#WeF~}jnwmoU7xm9#4i*{{N zS%p0(#!7@I{Pb!-lqe;p(WX)){+LQA<@@-~V>=u<*AE>=i?IRgq2}3^H_i_O zef`rw6{01>RkxgsK%Y$a1w#iRJ8z2k6dJRU?$r(9oR8G(!I#y_v-^WMEOuT!Y)meun+?H#XGZQ=9{Ejj*CzI_8Z}K`7lllqV zrgwiRr^?&VDAincj4zcs_C>5C2d5a&UEmTc**hbaAAtcJ1h}3;GlAI)X=qEf3bN)Q zc_v%^PD&L0%z^nPcGjgCUb99u3{c+qzR1<^_n`FWLw5Tij1#}JgB1byaLuyV#+rOZ zvFrJ!pblD8wzKyJdFZehJSvJxd$=3h&P(!xhD;6REqLWK$Xn-tkzazOFROBBqVDbo z!%e4a2e1a=F`=F`Z^#!NDooa+z5%c9kO%pUw8;x0JWiAIg?u+g{$dWBvK;y#`^IsK2RrE<`i7FBWRUB-6~Va5<< z`8Qq;8$O-`a1{|9TCY{px!n}L%9fo^PlOrt6|&a_!oZscQcg1P@<~FnekrE(M9X|6 zcKcwY^xk-LfhdcA)@u83lTXPK(ESaReeGXEUK>qJYh(D7@>3O?m#?;rkr%3a1}YdfD}*`F|y3h4i4u zEnL$5NqiX)(n~_DEh(&y+gl1nYDzwb!Z~8)BwE_mOfmZiT?|b!j02KwWJz6q6$Lycyo}$ve||-D z6mtf4Pwi^AXiB%~rLw}nbwTchWJAKgud*)Bkd=u)M6bybE2RluB_?HBeU)Tk7&EIR z@hYcx3+Mnn_*-$thE*&jY#%k_OIZnzVyu8_6`%j68|}#%;dl~OrHA59a5eARr1Bc# zT|UkXMG}Z{PH>-u9^nr*koFQ`v^v&j;logHXsA;pY|iDlsW@V)xt88a$YeJ&t1kPL zQU8XbRK9jz!|!TUkEn%axwl*Au2N##^rRy7rkhrXF>Ax`ft(WSCXJ7C$(xy~t-W2T zMnT4mUmBeE*-EEQzE}XlQ9`w=zj+oi@9JfR^8FD-Dd)IGNbAAZY?cvcD!| zZ&EPbUFXg6OWh8!ud4NY9+N$l8>=Yl&r^Xr6DP(W`cEg%vr6&A6#XeqM>{K`MC8KS zr+f(t#Slx*p4t(P$V{Y(r(6rWU%stm$5Y7)ExpNLM=KD$w$27r$vpTOfcN39r3%9v8C8F0vvir%G4K5}Lkwa?qn0lm| z{mW(B-Y2T4>3SD`i)fJVYhTrjq#eAOAu`0`NnL4fw1Rd`g>xTOQ{TDgrJ{QB#C@4u zaz5Uu3J$O=b4p7lzN|NdpT%*tCQDcHhjb#{Z*<{vV}i`VJn}9W>w`BN?LkeH>9$@g zJZ~zBlRUHBq#mw2eMekEFQ%T2Zfnxpur$61F;YefY1xs;%NuAtbH(A@a+jbgX;}a` z_2oiw2%JwrTe*+!8kh5?<%X%Nw6}20UuoEw1e?_vjAFwcy@|g31Tt%j0VYb4)~ZL& zgB6`<-!Q`#CGfsycWWj+NgDgDQycHA&o+87=}?JBSPP059(Ej4>=N4{f)SY^2X#3t zTvsDclt#i#k{5;^T}u1Cs_Q*!$d|{6mb)@D(aDEdO&LhKFi<&pH=em4B=)TCN0EF~ z?LS^>yFMWo2hT21M{(%d`kXh$Oea$4-PeZ<$GiTO9W^*x3!aCVOMcz| znlY6U2o|Zxy(5|(Ct)v2af|3f3x#^A{X>01PeM3$Yx83Ty-tb<2}M^%wtJA}<0@*y zZWTv+slKQMb9P(h3rc@b2G`wJR)?VRW^C&bkoW11>x2<+e>B!0-M2xSF`@z1#m@t- zP^31XI5YCA)ec8%$}0^h2F@f$KCRYczu?1UnU+81J>BftUDBU-M`vw!tMz8E zsNAHCBUiu8AWYi8AQ$0x-XyJ~S%4`udwr*~7Kb5e)$}e1!jSI1-_Q;8MJ+Syx0FQ` z?G{f;6J5z}@}f)jpDvCUGa0TP1bxlQ?Rb$Nm;02&R9v zp43e6z}VKb%GtOxxjszmphBkKj@qNrdhX%A2Psju$0(2QU{1(L0gdufhhd6;{QWr{ zap!z(t0Dk%RY9`)h?#XNLUnsV_xmI|IR4>0mp}manJmkxd~WZpr5o?%%@cZX_5zGj)-SYM zp5wV!>1TMVZ4VM%^tD?f=Jqs(qKaxEG`bZ4_>9n7y)gN~&t_JnES$CvXHi*_nelkM zk3#XWGATKwaznfXLpZf0S1lwYsiLdwLI13M{1M;>7!dd*_QM75D_ZC7n^-S}oe0#Z zt{?Mkn;@}a)-Mg?Dgvo1;)f~^S8V0~|WGf*Io;St8kxn1YD6!yN2p3%Z*-xq5` z*E83|D}2D{=NCLKML#@y#AmsD*5i9_t%nMMf@WW`)^^sB_gAE+hik5fChf1Uo|ISt zA#Pyf08d%EA@uNFuIB-LJ-@vs*M3nug>(#@P4wLX`dCPGF0S)LZ;pEiolJ!_(JJ*2 z^2<-OhNQ0~XwhKv0aP|$i1m#JcbOm)z>a-)w zDE>(g{ft6(jvYiMv;{ibW)93ARzc$RPfRE`)u zW0HPGu99{(_)vO!!UNvUq?Oe)8XC>?6uhCD_7vQxKXy%!uoe@3tppYR102}9%9H`7uoC(Nlr(0zatv0HmT}*Op3_y4+YG007biVA%%V`-_(R+wBZ;*qK*H41NWf%%+ z8+l)_>sFO^t;+5>Ry^>mSXfwHlrB~K=;`HlcYmN1NC0``;qA3+XM^VVT090 z&({M>QV_~=ELPE;zfw}I!$U+Dfy%R*9Pg~H~U5R%O47x84jE;8|R{O0Ecs4qY_?xqJ{>|AsM?X$r;G_I*b6&a9@hrwV zmqj}lEtc?52GjOqo$E7D_RD=;ek!p1&*Ex-Zppv(;C4S<{=2^2?x_ZSS?Zm^|K|xW z#Ryk^Xs5sB_tZB2QcfJQ+wavSZD+IkqiY%>;97lcjlZI^rxtBMOOOOvX)jRj?>9CU zFw~at&gY=Ms*$I{_q?g=d6=gF&C<}y)nXHv3tZPu&5xUzF4y{QWa-DCDrGlNoHsJB!Oa-u^kBz6!^Jili(OemX9;hoewoN`jN zNWF7GlYPl^c-3u&3R`;#Os^g513(b`fO|WfS(`RZ!TRVqvc3dmA+ztHK$P`~DD*x& z=lO46?3(Ag32=eh${K%3@4p5bI}X(Of#qj8t`aXVA_k*7O}h~pBMf-=CqR#AhZr~f zkRE=F5xUL2pwnC|z)R zI^%GbA>)6@QWX})ae}j_YH3K4Y>H5o&2$8r3Phs`%!^Ae$0bhX%S$Gte$1{sYo9PQTY5T`CV)fD&SJH1jYMx5ji+Mt#b`W?e)C3(%={w+ms0s z%S|uGRF3QL$qzN99-*2!m8S1aU?a(cagb;}=}|u32X}zePpdyk;LeHf4`VElfmcOp z@;@x&Gwv9QFi3v^=T~I+tZJ3;c8xEGnB9+U{|{^L7#~;IcMHdjlQwA@qixjKwrw=F z+1Pet+qNdQZQHgddMADE`@H9z&*!(lB{O?w_P+jFYh7!9CKF%lR^{O0&^EIvZwzp* z>~%11i4fx%wzZ6X*_PiDnC0~CcP?M{b)f&2pGCE@TUS;i{Ai$`8Z{lK-$_-+H5X(w zuc`b`6n99NMaiDMgHUe(_JcPtbbKz;xd;Xh&JThGIy-h;MLi?ddgNwiK_$KYIxVZO zl4|~Lq&ELyPFdT9N2r6j(8DGV&cTvhVC{a)lEBXsruX$LLI>UJ`w|Vzx>bq#ve4Dd zw;6Kg)rCSDy?cD|SkuWFZP0cmUfxWD6`q$oWn?fY3orYnvv4V=tmQaYPY33?2&t(B z6?Kn2%X0v812^k5FmAFPSXb-V*fAi1b&DQkgyxc%>Vy*gZK9; z7f=9t-E0=Aq5BYo^J;qJDv9_6RQo}TX{yL88zRp(QOwWJNjQ`zj`{7ucU9@<_WZyj zxN%+_2krdBwIE<7r>cwr3e&70qTGHJ$P6Ejwv6|-?I$r1ys|`iB|ghmH?iw zdVg6i0c!~zbFAr^yvIPuC%l1o#|$;obyKRxd#JfKBXWz9x(;hCqof?T&OfY`3PxM0 zg&X)AZW-8Et39qeve|4=+C4Bpoc~oBM8bCM>f$jMW zoa;vjq}ot2`TXvuiilLFVvHMi{baso& zYu#zUd^;Uhw~FTzBcJdDj7U;Zop9VfPwY*<{{mg)$qvv}>hOA!C`ZzVvhV?KQP&zG zTwk%BmQltE6}d1Kk{4S({8^m;h0jtXC=tFkw{~q()6rQU25OE9*6h@W!Y|550<2G` z0Jlq!l#Fz3dVPH#2X=vl`3Xigt*&m#B53OLn;&ySlz5a+tJLu^cG=6(tU?4k^RVo` zQYR_%mO*yK6i(Dij_n-NMCjH_NGzu1P3ln<&T`>*%3L12y3ECAdO%#^-G zo*R$$buQx9$DTia-i};gV#lnS5UM5Y|v!v$B#sKslb#;K@l)tz{V;Sm;%8s7Z982y6NMA9Ix#-LC z40qvwTdeXgkJbNnIXAdTW{mK(G~CBfHH9_3NvUU32FfgFB$!%LbQCELLhNG5OBV2F zhR?^ilup;IDUBLW|6C?x3=vY6_Nk{*)<{k;G~_Dwx5Qe4o(G7=ikb2oOk0>T*o0+goK25*AjyAC4PMDJQpHnQW35j?Fx)MoMHG-0S4*hc+`m z`LncraFFkCK{h1#@}7;FSy>oK1^|dpOCqeM(|Z2?dbd|pmK8uWc>(2Nmb&}Rf*8SZ?W>3OK?7(@+ZU{(Gn%{b?na$<_236l z9UN%M)h{@B0ar(UZt}kNF3Ggv@blH-$wf&fSX_Fbh7CU?Je=9lnLdh^lkM~C?R}Uh zE)vi3GW=iCmdIG$7TcOqI$)A&?{AwN>wyUT^ODbxn330?1*p>b9ltDJ-_Q-{%_ntI(n7L94K4Q@4BL)KrWRE%`~LOYkbJW^Gk@ zq79FCViHp-dc$s1NwdH~LTN2bF}wEN-Y92nxhd~Y#7yF1LV15NxilRY9p{azc$NGa zAb@yZ$JgiD1AaiP=a<@?=HH9`BiCt#yw#=JHG$#wfW5)&XBqf1YK|3#DC5}AJ=?Yi z#9Dx!^t97adzZ6v#U;D0_L#Id6N(Dc|CF#-MDPobInQ};CY66D^9coOfOvh5KQMS} z<*Rv?MiXkRAA&n)fkKxAE0D$y4Cx|!x=&@X70xmeFf+ya&&Cu~5m5a@b&3M%lRkWL zkbLInFJ4x_vXFh?Ty=nZ~OCo9P#+-eYP#~$c z0a#hNu1&YJhL;9kX;ZbCaMiY~S4#>sfm~8~)JLNqTeLA=nh(FFTY10SS=hZ4DEM^0 zu!6n1$jE9o4$#jl*mk3BP`oXXvf!|c5G3c}Nx7OGNV@79`a7XDmWtwYWlHePW3L*I zXBE_i0s7E+GVP}aJa^h?2-Fwz7RP}W4{d;~iArrxK@& zW$|4}(Je+I18JerBlEL@>=7Vi4au>lA=<1=O-vx>3<^LQZydTj+gknTx4g>6X0eDF zuRcc+(HcMYs8TT&DDSZ`G{_E9-sYX*;Y~JRSTeaB(~-UC8kT_kW%8IthiGnh=}>?4 z<(5-nyk&6TH>(cwnJ3jSkDxiX-5!tBI8W^obo{vhpi?|?oYC^N1CP(N(EpZh>Mw6& z!1(tL2?vPt*jg+a5wbz|W%1u_3%-`pQK!&yuTC$n{u)u3S0k0ZwT15wl$z!nFsp4t z@&VS&nS%azTHFtZJ`gKKe-qZpZ_otT>|m<$SqN2krlQnrns+TvNKkrS&QMqN@0r9< zlR!+!FP$!L1QqKM`rRcGgS19NKeKs~TU(*{g@H8mGD)!pr71?x0)*9tiW4IBPtPqt z!i5@?odRtCkiB;~q8NI&%w5-?oLpb0rsGo#Le|qrK8J7jrDCEzSKFkgE`QU!4y7jVn*TMT)@E z8dAC|E-Hc>AOtVKvl5b->Kbbq?X@b*GN=;_7*GWn9D%2`p8Oh1f_geSIXty=Qxi_; z6{(00**UGtm)`IkHU9*>dQ+jQao!LTMta3WT9#lrA2rD6n%6x#vRZtED(&`cykWd7 z_&X7PSACJ>lU~lfz%SELw!=UR4p?e$a$iN#omh)LGy&Cs>dTIZz$-_%`%doy)wYQ;x+9d+4ON*eK6I&x?9VO^g&3Vb1bzY&^7v z-Tj6!SS(`kIs@|n1-&A5ziNjdrk*;zK`8I`pUKi2^r7sC|9r|0Nns5P3PdH#oLc&2 z^th8;zW3F-*7Iwur}o9OJ#U&>AReb zUE~2UJ}EXmurqhL7R}@mGAmb+uf&cjz4Q`k%FCAVwSU8v`X5ZX?!&sJ?lpHFi4aQ7 z26l#|-XR=dUisYF$TfaY<{2x4gY2+Hg5(9KJq%JnTi)stZ9s+CHpmrVw0wH> z2e53()=3?wrfe}-t5d40t6P^&j|{N65ZCneLdi7o+4>niuTjUmw?EZ$Uafv{*}JRE zE3Q`Rm*G~1=_}_59)axpveX77@WBE@7Pk9tvnBK}0{PGp@sRfQHX&pO&9Ltn-7m9v zgJZ@0`%Dy)6R>!FVxY5V$k@FGc_2uAG>MMe@xZ$zmfNZ(vJl3v<)IbAl6k>5pNe#1 zKTm`Kn$WocWGT7aeyAT`3%WJ3|mHWrljcQZ{Is3s# z(}Gk*W#INwnr-RWsK6Rtrr%0uNLrXCAmvys%w#xhObw{5yN~ZYf9cjU*J37v$N5~< z6yRg$DqJyl9~cND7K8`Fu71UvN!YA`r;Of?a+=mbY2o3eXSI$3ieqbPeo>SYK~|@& ze&-~gm$(uWB0pkN=22dl6<7B38KS5xi4uct1YtGM`CqTQ6;uX0GMo6NU+?&8db-2% z8*`Mm1M!0i0lx#KIK{RH2xtm39Z<;qb}x6VVvbhQ$tQRoLRQ}o)&IQhy~i<3bXc!J zWwk^{3+&_&VaWvgc<e;R6S^P+iLnh+&b2K?BrLNb=E`-|%o7k9u-g=YMsw(hydzGN0=`{(kCWr$AX zl*IVuPqd(L%e=c@&hENbc>;px^NE(!aga}tx2FgaXQp}NGYdq8_08KFR=w80j>1M* zXOeJ4#nCtj*S7auKI*2GQlqLq&1L=d%Qpgj)(4>++XFC)cl8Vs1^_ow+U=rwq|z>3 zZqP7b#hQ4kS}st83kLTgnl4)Fu(idp)sXQ&)`o<;s8uf@WdhC|;lFGF!wCTg7cyT? z;VV$%w02WtusKw^@g7C2P#D3Ca`20?JVr@E!C>xKgKc|LbI+$`y#ER2V!liaO=Pf8 zyDXuOk#lRd4TWF@ARH-*f4N8j_Ae#fvVc<3g*CpyM?TZx{Z8w?XhTkReeU-y?HeY8 zYZB*e@AIGgqp-d6RGGxQ-mdHWu!X^A0;)s-&+6FG6gsg`iITmo=kWn}&qR%fgIFPU zi09P{{wKTx>BQ-4Y?KNmC8?Ms#?jb{kK6bGDrARypLd~Hz85(_LV>Ssu=C=+{%9T& zNP2&p`0;0zNPVe3is(~UyVB?|C%P)Ki`s}2X@#o7_mCdP*y7lMJ0-~*7%)()$OM*F zrin=Lv5BW_wK)A~0#;E)UD9|f9;5*xRr zJUk%#3+?-&zk@|wH7-MP(`|LbkG$kt^HQ+CTzS{_2*2$Q_0`oaen7e~llMJR`em;1 z6C8A@007NdG+ZO&*h&b2C9U1^4eU3`tV)UtYB%(>FqXG+9kYXISSQh_Xsy@Eni~3YXha<+A{=z?kKASy`)2d4C$ULmj7ZJj{f@Y& zbz+L>wwL!IhPlxL&CDSY)hpk`(sIrgYs!N~E8Ah~WIX&R9RB_%Mn0{C=T`|`M2bWBNvj`-=6=V%_@NV~ z9t>R_erY5IWh=s!Dwr!Rl9>MmUV&gBM;)SZ#rDss4G5;eWZ-UdPG+xm^k{VkUekd} zNgACcjtnI}4vyviZz~>=%}x6{X!T=K>CenI(V)_prb;t^fE@~j5uJAW`{%O8v)1bG z*$ZHG(bUh6rtCA6eVBAGEB_egBJAPWh0obL(is+N)@%&?fq`29viZT9fI!uhkI z5WW4W`;y*u?_J#NsgL(Z9)Y4UC+L9#f41jJb1nKGPd7qI)XkDJ=31xN?e7;D(PK+} z$QIf|6p>S#o_4+^&HoyVN3V|!^6w&5_2mE4Ku|*1H7u!d17V(PKA*n-^gY9qXeWz; zyyw~^m8%s0Plw{^3JUS}Bf5EveHq zyjA~?{i%=V$K3KdZE0rD`hC;xUW)yd9?UnKDRA*pwm_Q;rzOy@Fq3=#c~34gQ@VrQ z<3vE6+hd*4qqDoab$fAhChn-xtK;<3*XQ2u%53f`2a8?vs-L|BL)0z!WR)GUTTb|F zjgK%L6GO!@^TAm3`pdgo4#6!v7+NrRg*Dpg?Kan?0_mP_#vt(Ybp3i^!AafcWaLQy zvUH>IOhQ}R1*UKl#&`Ysu7Sp*75U}zY-PX`76vQN8uX(H^F9n{^H#I_5e=Y1#Yf85 z-aTDPqKqb}@>QGIdxxJ$gH0W1G z*z04d@qBT_t6Fov6{^tNTQF@t=w%FYCto1vvz$m#;+ zXlke;P#SDTD^z2t^JpCqJS5XB_+5v^5zav#XFhZ@v%8jI-22WoV$xdCyI+?o%R%;0 z{2h$}3lIZ;q2cY$^0G3d{vd?r!!l;#`{Wo>EWj5FtWA5ry;QNU0o!ENl)+aKJ`kgA zEz|lo3FU3}|2oyx9NyA+71!&Af?@qiNocoT!;q6x`T-IOxw(#KCGg3}Z=<3({Pase zh60DX^5eQIxf08oBW$TCJp<_b=DYY+`IbsjDIcs4VhWj+- z%&S;7;s~>gh#iC&!ZMrIWl0zLip|VO4)TvG6cyA-1-9voMA@)^A`YJ5V3%1&qqG+n_bn@@cX46I zrMFE`vVKr=kh5hc*a*9GTTPH!1a_lQ+zznkIgNc211J5618&x#QotmhR+6>u5M-M4 zF57hgYc%1x6}FVL_pvSBiu?4!V;;dLef5NAwJa&4)(IX_5P9a1T9o;**abhv071N5 zBP2?wIA1HBr{}^$Dgxa5r*9Gl3rzxsFG)m6Ha;@zl4ZVr9#Dy}Z>j3bbUvnC;@0K8 zq*Ae5`xmzgNqOu&u;8x|@E?ZIFi;Tpg;9vX73QS>G6*aIRDm=ug+c_|ltsN7z_s4M zFkfe{UYR6ZB1*1DKfkQzx7i6tUK`hudN5q+?Ce;?K#A zO|Cs3`PqYo%DehLcaUkLOhP(AH>IA3=S z{l$_{?|00!?c(%GI}{-xz{y;U`nF-74e8)s86eeo{x{O20!^>3dcii6JJ6#YaKnDz zGxWgG6Omp38Vx%qB0;H^rvqgcLa38aRzoklM_~M6WPvc{!BY$5ms|miEsTuji!^i9IeLCF1AZf6P=`!ykNq!25QCHm^%869aaf7b-+CVG&j=WG! zzy z>~qg!OjS1>w$5+zh|EqYdGhxI-SfZ|C)IZ+OH1*(aIgU-JK!J z0pJ1N6`LqzPXE@~|3*D`IR+Vb!J^Y1nv2%^nH z)xFHe(D1)lY|xShtz7Rv4UWulpR4Eqlj|=zUrLt@3dtcTV6d20@qZz_g03#v5kq}d`s|EG7zZHwBpqOV_m|d20G(CZ8UGnl8X2wX{Gb*nuB{elK zQTcgUjiZx_%}7Mj0mNTFD1$O0q;M^auk=CaAZj2d&gDtSP}zft=}unhtS?H59ZaS3AE zXQ?dwK+HgVXWO!`TV!OH@E*o~wC)fIu2(xZjPwVZVTS3~8qo$o=oNP&w7#RBupRYKf~z;;5+39bzY`S2Nw6f!c>CS5YmN9a^H_2D$iYX5*h|FhKsZ3}*l{WI2VhR z5ya?E&XVC(%}{CLX&$PeE&n+Pu7fP>C%J&~Cr(vYN0oH7G{z^TN}oKzfbqJ!yU!|x zZngm2z}1Fl(O6hpJC!nIo?!My4@?u|kxg(j@Y+j&xp<2sV^NyhvqIz7g2kXkY2wzF8L6(*0h-s55 zi0~l@>y){|yVJLv27>0e%}7vGJnQGOh4OX?^ZGq|o^dn%n}$CY_M*WD%4Kj^m-Byd z!l8~0RDxPkJN{iu~eWm#jlU?@QimOvfA11q&5xwg>L`ux0Brp{x6_K zko7Z^9#?W|!Gv2CdBGZ9wf-V&~tc@3Ti8irISP$MD`hc z^FHbu+3&d$%Un#-Kh)ngh+Tb=r${FofWKo>Px4#t@{bMWOr5lfkV`cq z=q3>|q6WhwG0eh)ZfkIOIKVe5iFR=~5DgEH3e?<{J8bLa@kW!dw)w+afn(!9b# zd4~v0D(5A-kh1^chZ*QsUBRYjmDbBS1&|_!B=UV;ckmAm=BxTKUP6O>MvGZLgu00T z^=NJYvJb9`tGk;C3wmXVCKWLvEWXGD0mJ0GcWeWdBPkuxdV%!zW>184%h}bTHRFpO z8jr`+RCElOyCrT)b>~pz&k$9?Tx|mP`}pL%I$x6Oa3>zd!&8u3iFq65-$GDJ1^4AF ze1LVw`9?hPJt@Td?6$gZu*;Ti`iO&jOXM#~10w%2>R-~-vYw$-91s(ZzULfTwYUIk zytr4u9bsnuJ`G41#4QY1e23#Ea@ZqWz}!o^Y{76I6H==nz=B#Gd+>E~7lv>G7{(@H z{>4H7P>x)DNjx}UZ#^561gj`m;Hh6HHbgLw6(My7ni5%#v(f-?2LC%?c;D8-?dV;o6J^qpn$D_ zPDTCLJ5475yJT(kPr5c54^3|7+x$qE4><&C3W#5S4k}0onK7c?!=iiF*ls^|I)-kJ zdtR-HFL|sxX0*+KjKE_QWGPoBGLCfdhK4Bm32vm5nGN}?e%-vK6382j&(Cx{eqN!7 zjEfpkpf?DzG!~VVwC<1lGkFqSVSPVZ+;)7~6B=ia1)_)l5-`-L;FEsYpq7b0GqMDC zOyE^VqW^#t!1iuV_<($1$J0u(HB6z=Ziy2(}~&@t%#q#&@LYJTVtm zao(#lkET#oXd}y&d-A^6g4{_KO8qj;0SAZ54o7@TLa53s#0OQaBLIc-9Rof3S1A0i zMKFY5Q8_t5zAKfo;Av<+URRppyqI;gYcK2j`|bYNy|!YhZ8dX3}o zF9l^am*;T@%sywWerII${NH_vN(E(g3U}!v*RG$uym+vgUc|ckd*jkl8_o-;@shek zD}C%@vTCJ7xqaN|yKRunO(ipjMp^EpCZO9RnJrfY&eWKRtZBbs5tEW8I-c|Jr_)w5 z)PC;6mC4bNofT#*Gp79Bt?q=EQ+Wn>c;dRn;ncq2FSOll|GLv9&x)YR*}HXuepX410FHSHQb;cQ(PvOQJA zGs}4Q#tCwg#wQHUEt&SN;8B38!WHw@%lA6!hL9(5i?f2053FF@oj7Z;_gh5$HKKPf zk1PT`R}ondVwx7z_W>^;B9|eL5==gLGR&9Q7}IlKAx6(#h8lw))*Fu;QnM@fT~_i< z%u;&8d|NDxrJG&FyC%S)II-J8$n~*+DX(ePwz+q>hWNjqQUznc({DVp#!wL{S0gxF zGLe=5VdLd65D}yHQ;suJhqpTk%4;ZeO&m&caHE)vC-1?%`89(Wu!-AP;l-aozvjX>;udnz$X4Pl{aK&yo~I|kN{se=or z#%ZsdB0|w)%1N|If6o}l@!NtT(z&fQp<)i207H;ra)7{0HiyxM8Jp~)-jms~s74&} zV@1yS;Q2mbCE$RZO#i<2Moz-a8ynBH63{YDjeoPJdP2OGz}(%T@@7UiGO#swO^aH<$*B4FDWzI#1fgMp7f?wZ+g&jhTb5s_gp0gPv zUk8LC5BFpb7TXC4ksgH{^iNH0>6=cg&ybU|^^r%?eP?Hm&`P;YpgWG!#pkHt;NqI0 zzeup;I0RLrDoGxt?!#}S@yUBVOE*FUw~`zWr?~?`k!<H&<^iktDGr7aDKCG-Yd2DeZZE$!;m@T$-nR=2 z^1ZZT(`5VaN^d_1zNU&o2M9@j#Xv`wv(WI}->?!l)QN)q#gp9IUntteqaTSW>xCh{ z95c6rKG1%78sis=xoe)aVvxGzlNvtvRBbY?r__}c+}jkIKdO;zPf75eF%H3 zW6rvu0tMgG9ov`EM_}4rxM6fg*I%Ey~8wzeRlI!356S$SQhyE3f^xAG^ASWlp$BoDv zW9CP*&s5Nfp>TqL$aivv(pzkD%3s~Ag=mnyhekhbJd_z)*lph*{8n^moAmD3IRcJCW*L|3-7?pX-(G99LrCLSWiq_W zp4@6pB2SFAxUCjj1K_W3hI)i+T^~(;zFsY04-XH6yG7%;_w>$_oc99@1l6!w75FaCs#daZ#e8;@!8zCRzS9Iu=RgJ%rLxW=lnSWC-< zcG`v-8cGbh~Rvj*>cSw>1sl|v($>h6;;U08o*)LSi8h)1e94YJs^@(x+r#UqL9r!SZ%!qk_GpUU=o) z;V_4tl(^Kw0(I^=*>&v7b*l~{q-uq?R__ToMYTO&@!H;}a6>~lq}|(FvoU1olU#38 z^LeH@Ck5w=HPI~F59=;`uW+gFXcg)K*5nlQ$a6v#?h6QI2xfot zUu-x>R_&|%yyyXr)nOA&ml%Dm&ON!P-Zo^a`biPmJb`-)-2r>3lncpK3HKc*j?Dl& zk=gEMyX-39oykj)vFV8y$I-C#+0ijI-ccx^oc!Dw!g9GeT+2iE=i20*ndG>cUd|q$ zwtIb2fs9K$1jLK!ZdJDZm{NM0n}5je$Ta~1Sh4xQSTaL_l1tm{Y#e7j`xsMm*Vf<$Wa0rn4! zh0|Z(kdbpJ)B=BafrEMOl+2mxugU>A?rG=z;^vntZ(hh$wq9~l0qrrA5Gus278NO&xqaj}jk+-0F)~c5Xhqmt`ggn1iMffyPH|69 zb|9TnOopM!sJ&C6F9Mef93)cc?*!xmHFe77l`!vA{BK%wC&ucWkLW|gxujL<%mdmR z;TpnOZ$(aP;3v-`8kNUVrW3V2B;KkvYmozanEbij4;)-=cWrD(&)PW8U7C*q&5QY7 zoApw<)3>e$MK+$0czNT&uDvPHAs;y#@$;AG|2{rCLtZu%ENEd%ZBQmj;bT%%n_wU0 z3;wr=znFEtz9?6ksen2SS?nlt?{Aybz>Pny$6GB&E!xVU8^3-SCC96ms*dbuiIVg~ zL#A1t?j_kL{c4C{@nyI#{JTO-5uYs6pP&;-I1R@?2;kRT;sn-+-X7rmq!n+;3G2CM z(j2!Bl|zsYHYrxw1{v-uisM$#&Q6 zzhw}>sAQ5u9BxdWsWmz&WxG?Zr+GVS`#5;sw?f;mP;nh4%hAAv*><$I$t5yZU-$Ix zRDb#u?Apksr7-oppL!TwnDK2U0WLR4p*C1}_uxdrFDN`vdX=n|&m)D_jFszl*3Oxt z3OV5&LXGj_hqxFU--xFs->X%N&}E)c!nz(omgUYVKF-XPlMZmdc)iGzVu$y8w0%-)xu zSk{F2*4r6RBl~tQ_K<>6SYRLb83v7IN4*fQ5x`y^5V1>L7Fcgbf!^O5fzLoyW7_=7 zZsm=cLF-?h%Rw(j-rp{+^|kk7xtQAR>19xGvGL)iZROXSs)wgukjJ>C*lnUKgK0H_t5t+JmePPq#+PG(x4KYIXDT@(_M$xETp}pTw>Wv`T;fMZ#BS zI!Nt%l(i!%9bJ1!yA%JHKi0ax+Yb*ZqHE$w6dA8&7T02lkWE(EXg?Pa-T^U z+2m8HawesSjzpdk(X_(oyjI8O_I}*}4ORmLE8T{U#d4s5g&OosQTi6StA-~}sxFWG z$}!poVv=O{r&MU$?_;-;s7r$CVfV)?|VRk&qZ-eh%RV{(=QKdbbZIY%o~I)Ct%@p01) ztj^mF|CIfrLUX(pvidTtOPn&wJ@?LvLwqRHq|k`2);-n zHYVoqVb4o-pNZtq5_5-IxH0E;M=!0#OaXKmK?ne7+zjOrE(sEcOe}^0s{o(I+Qi}G z_OoG8-NOk~EL78(8tTsB_foy%c{N6A0}edg-a*Pt#rVj?f=p;qe5q`sXD#p1kC~0( zHCYa*nmyN7?B_^h$$JMf=Q$ZeePsvc7xlNLz@K*!q9$q)t`5pvVH`cITKppL!tA9v z!!a|`40gsKXEd}#hq|SkprKoHx_-ll!IM!u-!kWgMucQT*lgeU8(!+mEK+ z>gm6sD%eGY*g7g`SR6yij+LiC%&7DX?ct`1iLF+f^H#9vHFMQoJwgAC=NnQpty<Ca~x5 zl$pT8ALz-p{1)@QXz=?BP5}(<&I~%)2u_o>&0E%UDfRXctLGGNYGOx6N4LN{6%!7} zVyOwy!XSLy;0E|UM%`|T+x@tOqgap=aK08FQcsU*w*(EUHB|mcmw<@L{Hct|@Cn*c zWqheg*EelA>SwW7t%6DHd~;mxG`6r~orYy=44UkIDQtzr@${q8%Jzc(aO`PwlhnP` zzKv-oi4Kt_S?u?2%o3$i66Q?t+;7^R@qenYlhHv&JT$tnMsQQ}#AyehLwi>&h&a8P#a5?Db2NG3mOlAuN9TgjAOiTm?*2)COQ3Y2 zEc^L+LxPUZw$Aa@)zxH@w|VEj{r2fVd)t)=c(<@ojA8#izbiJmM05MlkHqLY>U=!4 zBivlNfd>E^9um$z3ARax>;_Loqd zJl<3fi9U!8eF^Rq%0JppS{2Ub%U4W*ZUob*)~&*4D}d|+k%;`s$>Up~!Q(CDDh>3c zR=q3JD{$pc3j8MfUibo^LK1%@l83y7cb|jd!T#jknstu)^X+H-r^`*E+x1(gB5KD7 zJO;0z`tapO5^|r*fwVLn@0;WJM+;<2USGOq- zNSKg6cpTbDv?n69JQ*S3jqs=k-$_W(z<`OK4@k^e;@M)AQW!7q$Vl6pKQ)rLdjtuI znc|IfeCeFljrmpV_Q$`*#>woD=6iepvfn{kD|RejW<-t+2P*WEt=5*=w{+ZbO-VZ z@ObOvcYRKGI_i1Y$Q>LcYlUl68u5dJl4)LdIg!E!J;hJ4QcDx415|Xq-0J%Nnz-Rv z7=QRY>$IM8SVZRP_$b=^e9i&#Ac^GRPHNWOsZxNeyjZMrK&hZHW=`?XLtk#Xh^hste zypr|Dl=t@~#e#G3x>h%KksOtvt7Ca8i?7o3RLL+FWLN9f1||+uGG#@Ya*I*$8cj-M z_;iUWD{oAHkk#LZ`|G^%o!m)X8<9pOoX?G_DXiMk=>^$}PJN*ORd!xw&<<@V(u`OeNB2!|m@E7}Fdc z!V<$Q8jGM6?cA;>lgP`<%WS?Ci|gqT_4@81pV?Bqr;iwfw5khxJgDr;nUEdm@Sf}xzmP}sJCE{gh1;_^{zQR2xxl@eX}ok z!QlIL?lo7!$J$Xco8`$>qEvfJCA7v~e^l#|8C=$|>dvs{aq)V4s~|I-B=>`iAg++J zx4ghZTXgd zJ?pmpj#(~&l)GWApy?Ir(PfJ3kRh?2L2--T-DZ+d?!3+PV)AQxvrZ0UMp`z+f4u-8 z+3gE2t7vWUk<+7bX&uZ@Fv6kiV%gaI?{vCy6e^V+j#fATt04R?sfnu0$LOLPKPxAIXM>6@&o`-1O`28_iaOuwGv11@D{6KhPId#~IU|`6b{eC{M^a zo-iuNJ54PuJ^aVipC%+-Oo@dTQ1$U)kk-LI(QgsBP-Iyt1)k`38WSVtz;AN*bXQOs zeU8H4gs;MRyR|8e_I6KN5~72deIfA!w*fEf_k6VDf&<|7mUGrbHcxn{G-k|Rp=51* zip&w1kRhV+PJVcM^IO+^|HM25k;UTka$R#6*Us041G6I5%IcX`WlzBFE+`3>(A}L8 zQ)X!thY;45Y5Ab$h}DdraLlqrGJTMc+9#MT*AobqFA?I@ba!)8JEsclJ19ZO%+#dy zB=X@yht8@*u-53?j2U45c2`}cl)fQbr7j+He>OF-qzGHeEh9fqf7o!uSLp}tW@H58 z!D>h1arI=J6r~|z-Nq44(!nh@@x5I}k6+L6!qyofhhiW*Zr&?nBsoClY!7Znm+C^~ zM+SkEsk0yLW3@(Q$&wurA6s1e-_!V<$YM45gb= z{_vO5NpmjiTywJpv~zaENi6pk$W@r07#s)|Jiz07l`&5KuE9*y1y8Q7rd1wlqdWQy zze-(SXT&?Epq;vM&eK6I&noGg_hlh+`}6&gl(l3s|HJB>OkUgTJPsq$`S%?ySLjhX zmFdN)TtUtW8Ka35zH&9@Lh1$kT(|Qk1n&KyO(O>B$5gLso9MwpFHB8NK>{Q++;bYp zZ4gizF8mjtRMi3>msJ+M?YN}0_~Pt!lbgZk&36R#Bwr>|{V;PZm9EJ-ao+>Twi@D@ zcX>&>++aiR^E^{IWK6f!~Z3OPrwR326|^2YFsd-~|lP^4gKY=G=ulo|70+ z@NGZJX&4)DO(KOyL3B+L?$RtVo=`U#-dzy7r*>9ga2;ixeG1dk@Sym|d?{igb>`3A z`PKK9Ui^8fZL{1nJsM_6(DbE(3I!3Gms2d7H0G#_#(1iEQS`AEeL6*#hKNCKLuLal z;mBQQ^m)ZTkIjjT|0EY#p>SDu*0mpM7`zm5VXr?-#uDQK0&Jo2vo*G>BKF@;efsrL zW^pRs^@w0cr-9wxQ65XBDhsRD+dF8z-({^=)c-1~W;IxD@P&8x6mzf2W3uA&c;a$D zFT)624WJbXn;>ni*VsK+J=Q<#`(*=jtlA8XqT%4+FsuYumE(UY`R}EyX)osccR35g z%p1KlXi~x=p&$e~V7hkeXMDT9hRTKk4q%u9HfxF9M&{o)Nfa`VI~@Wx8foi^X|#}F z$<~~ySXfl5P82JZkxp3tkmE@He^h;CP#jU0HWDDg3GO5Wg1gHAL4y+r?k>Sy1`Y1+ z?(XjHE`vJ^?yleD-QC*#s{c$?*GzTQ^gZ|7#}4m2y0Ko$Yuhb3h5HGO3jb zJ0wvE(K%BI5y?Wg(Zh?+9rfz8urPy&W;KF<9TE2_TzI1?jiK#Lk9LCdYYy{j7(tNf z*>}bvqu_p*gEN7_$iYy!k^5Ux5m@+}K>}|#)h6V9%2aoG0A*+(gt2S6Jqm)G&ViX7 z%xf%|9W@Y7(x(M)?OlbHq~+$im9uS@K|6z~uyY~!5(HrqVuP9*Grs!VwDJ){W1Oeu zcx<-=L)oPE#UV$T7 zU;1HMgEmotKvQM0l2Dev3M;l-YjAq|&zyt|A=SMzqt?N&l{8NixQ)kjZj||2+PP^5 zPZS}PXz*=^?(7WUs~|>{1SnAf39^d^{*9|x()DuE!n<+y6KGLzVZnf&vP>X@IwEY< zIY%E4l^*Yjg?=+&4tQ)TfEK)dJmz7_@S>t*Fy8tU#=uuSwbtxlGim0bt)jCgI!W0f z{G()hwUnn1TUWuFc^!rg&LBb|Y%^o0RLJBh6@fpqIur6-Y{sPe!;_PkXJ(LQ5(6U2 zmn%@OqtXh@8Z5Pju*MMHI3x=i?t-?5stE88o3k!hKmlaxN)B8 zc|&cV8|-Y~_ApI%vN8^6Nr|*GqtS4+-|QR3 za0(`Cwcd1e?lgqzCdzdAA*nSS?2abdLvz?RjWPS31=|<{@8?)d1Pbu0!Or;f_JfTf zQ96`Sp&Fhk5g(C%!vu^=_2C-)72Kv+IzcPyHuop8%y&(05;D)-NFBx8;7Nr_?%Bih zBni8EdS63C83smgzMelzHhKV$I0Fzt#%d7Tt{#o--7sVHLAOW5QIo!@_nMbE-nv!V zsP<(l_UmbX^1>)+F$30v^g3)>;nxHE2 zLz&NBolI5k1x0gn;HIU%6sfn7Sr)C)Y+dBR=y>pnbJnoIY+b&p?7;TP*+w3_1jbxA znW;S^^&-+)+Q@toCu=uOjg;7aB$91e${UNg2d*gH!$|(W)$rek4x4^`iDXr1!?&$Hfn-y&8Z7PFqZ7$qZhSV?=>s#fD?1htQM*xT z$MK;NFqGB6hS3{HEx|adH8>V){o&DyOQ2!bf=p*;IPjQ%6BY1{ER(bM7X(eMVAFNn zU`BV2Z`!wQRleseRGS~XFDd*>s#A()sWzr=RKcwo(0|mNm0u$FpA}m4@0qrXiU8D* z4Up+-q3qr!7vrO5<``5S5;*{{D5eGz+lKVK%PJYD3SqM(KP$^XUtx&3uEn4|x7SkW zKzn4%-Toub{!*6SquV8=9CkC}!T>vvPv92dXq1kZFWnR??E{O1LcCuqWhh-BXNO||Na z*=&-{v&>=#ZnjPyZ*HOj^WTPA)K{yZ8qmjx!>dC}0#gV4(5`t?!Ar=H(IvDnFfccv zOfielLUN5@6Wot4%#-a2@F2?lR`6;LgETy{qq$?VJhWfDErYV$!OC8%eZHFoEC!Y zfc+b&ix0Do4M^-64KTX#dd38QD`d82cNo^a_j7LeRFe~Tv`=sZ=toW09`iqc;Jx!L zLeE+uj<|;TOQ>$3j8TB%C=T3b8QbsWEoPx8Pz#w#xbRunKwe}yxNWv2bqsU^T zAK2CdKQ$36w-Mq2$9i53+DBeW%Bg<2N{4js8{~ht5?)Xi(u>Zb-|MhHcRmU2`#R#b zt=UYP^4_rHYO7I3o6P9+@4Z`Se zDk7`P&dXF5vK_))Yd@IA-|FEMwC#@1vjF@LiKg6AFWF^YT{v0fT#88Kx zj>m+#w>`}R8A8V&#=sR3@$fXI@M&JzG{?zBp0p@Rb||~Xey!>-7mtJWV(d^J;(YK= z!(UHCQiQsFpefOhek?U}!|0Aey?uIlP$}LKWA-qmeL7%MSKTJJVZ?MKY7nau%32}cWaUWnk3 zod&+OVBzBz#@Vkw;0wfa^owj&`3;;fjOAmKl74KV9C79Mldq%k7LVLGJg6eimlGe& z;i%YcN?<`?gmWcQIVU__e@RNiY1?3|5Bub58q&gxb4Ym84-fwh$d) zcKP(M$?!oPW+Z=u?EyxcfN1EKlQbe`Ar@GVipa`PvW`aSduIEiObMw%^KKtmgP6ov zIahzUU*4Gs(bNuB@DF_4KSeeEOQx3y9|!l}G*1b1J<1COPZjoV9p2`o$FotfV}q}Q zf@7|)g&=<}%>z{N88u20+oov`D@BR$f4Y!=oyh-Q|ECK7BUt|bE3Oz)4M&wCC6)d| zf&3Q{^51lb=0B<4Kdz}9a$NuaFTrF2c{(1BTM>3E3lnOLR;}f2_5s+bMALT+i;pV@ z=xlbFy@mAJCh%C)>NT*XKIx7yW(3LU+U@kLsQpg-Zc8(=i^+H*F{in4={~MKQgU5@ zP~kk1aeSf?J13E*N)0pGq7H^S_@rsk0h$^|kf-^^*B?v;c+YVO89%E(QP1W4gbh3n zx$Yy9``p^KP_EUhD)QI)gqsRaw@s!l!Bv-^8;T=wzi6_J9Z0k2n50)2{r9)whK~f| zr-~o*$%lhv(ydMI@66^iRTZ<_6Mv@M#e6XeMMaXb|Kfy2NI}7wX2*3KzHdoXwJ9N_ zhLVqyf;YT^ipdChm~%ez6U!AOjQ6B3^T0dd2?&sWmlQJovt)nqk^PT+;tP0zak1_%GdexO<@R@~ zig8_`Y;!&{k{zvQG{ssmyw(!soWYm3$#Km&qcoFc4uL+0l@2``BzSLzrs=Uf0zwuYPQNG#An-F%PUJ zG`*>{c?ysZA+0ZyT^Ld zj0&|*Z>EaF{nOr^pX!dKHRLBMv^PD^8lVdxKZ*`eD+_Ya; zaNX?e9X}MfsfS0E=vTtNs=hA_;DKUAv=|s6xsPdJ)~%?8DXVF!=`YbT=eO^1j6H2ZMm+-gfh4~Q}-}!zj6}#4i>d5{)Nij z+23|P>{(O?3{^dhwfk5y`$im_;4O!F)+0WuTjUZY91rP$c(_hYm55sIY|Va#cIiL- zdKfwlOd3~?)4p5_Zx)a_E%ccQD;H*=CQ^XVhnZef$K&WU@y}vv4ZDey_&xbcrzmmC z;|U(qY%{vUjd0v$;w!yhdq_&bN*n+5RsZ*jmxgE|R}jjukO`~L_7JX45f%QoEdSRh zAIX31C^5W@j|YNd5$yjd+yCzSNESlwS_&&4rP;aqy+}I4>HHw(=%8oGP}bASzMLZ2 z7hN8^`x+a2fmAD5TM~Ip{h>B!t$b9Tc~EU$MM)`$CEqzJ8*c=Q5bacNVnUjNMb8+= zm^k{=phmsXZ&Glh-IvP}q{e?-($jrg?s zKzFobTQ?_)f2*d&YINH^)<9Q*f0p`Nqp)Q1sIBbCfLLv}lkvbsk7(A>9A3<5oh35d7Ap2!1*|d~>&?`j3Sg8~sXO;MQq)1}{5fJ2`A1hdHm zHs{&o161x@I9MUogF?Af(OT}2^4i)yiior5XRFRZAtC8L&IG0}5h4Rz@moQ!fw|Po z+~d^YK2sIIz~Dp9@tD-q&<;{|@z5Q-o7ay;C`L8!y5E>zbJP$8W1ErK{<2Jw-+UO6 zN+t>p$^G_o1Apq|!>fUEgS`fy&@yU?LUJGFH$}r6+rn=hg~=H#dm=501mb^Su}fY% zICmxB9rrq52Okc%zm*j>eVEFYG<-hu^Zh)V)F<_J%{0&|SUDs(Nk{#iEI45Fz$ zhnCT|3$fp5Ch0In{1z*}u-4H#n0L!8V{GV<#%9Slz=iP2CS_$sazKD4<>TQdhGR+} znH(Bq04T(gZ%gs7j9+_3`?<1RNBq2NF!mY|BEzKeeZcxXT7t*td4{g+I|=3z-uHBg zUOe#>$hQ_|FTa7oFz<0Eee6k$&5c)rvBOv?0~@sMcAf)66>_p0utzE#@MAqdV;ZIZ zk@$v)4svLV6E-v`9+<9jre)2_F2{DC^GyH$;W$cU3~~*itoaD1a^_*k^^SaD3@U_Ok}NUnGo6u zi(Xc{QLJ!eAq6sVZV(6bm3oiDk5>CLgGK1`U|oPQkMy*&w>0Z_uKU2}iPanJ&%`XM z&bHM@?mh>8YPc;KhPT+c=g8^&-`FCRfndNs7@X@Bp?N|ynXnd%Cxy>W70DdCE_pj) z@P|t$T{Q3*qa{k-FQk#YpW><`7vLO5t|&zyI?FqN0rEezgX!8mp3ONAGGX<1?S!jX zIZEN)!`pF-2^Ww9B*84KI+vHvk{X<**!r)hpO^c>q-IEK-v23?J~J4`Gaz~-h>u{_ z$vkLHzSp@SHrS?azL#REX6VvjPiE*_LB>kp$3>LSq#amXO{j1_Z&)ifJm;}e9~PbS z)}QWP%Tsk2afIWEJxC~B%ufuaHzYsEE2HK4KyE z!P+?X0cG&$Bz-9}hUIW-P1^)p`{>{XHW_HPFs#);MJE!c=N_*WE78 zyE2D(GoBZhyxUQRbsESvD$ub1qu4ni2ns|(g9S984}SlK80vbO!ru2Sza}&Fs1wq$ zb~S?pLGa@TwY2WPexos}zOR-(wSkJDIx6(Zt2hHhpO)0F)~X2i zem+Eon1^SkJd#>}&^7A&v$Rl_#C>g{(2!QO*qhcp8AyfT+5IsylGs|*??3LE&6ugK zFxSw7&UE*F!Z4G84xtVgPr9dFt>@ak7_Og=pa1O$CY3%}=5=NEj4k!bT>bmT)BBj8 zZX9wO*vf2qC5I>T;W(-~Q@a5MxD?ph|MrZ4A}q~JUa5|aThOmAR=F4p5d+DNM<<#P zIi?o%J?a(h3w9|_(Lc=A3gzZ#9UCbf z4N-8C0nbvMBmOBTvGqs10)!CWoSE?s{4Qe(3a4Z{r)#s*UTXKDd~L*0l2$!9+mVCq zNtw;nqc;_az1wE|!WanPX-lWH)V4J{-1^K%h!i<0bs;V1D47%;!d-mYOHDTd0Y*xT z*tD*PL8Xj7=P5doghl&k8}bm7PL#&z{;n^aX+`(%(^~Cv#NNX4U+|A~11(E#m7!Ad zWX)ZJv+Q4eJqp@Ig*F(!o@a3W3hw57DqC{A8JN3=0|^3f4u-$c_a?{tU0>?Yjg=9p zVRR?N(CUqBjg4{jFc2DV)l(cMt8IrzbBC{tj104ihZ>y0GKR4s>9pb($qnpx$9W_t zUv;pi%HgcL4F6q;Q9xudK+8dPI$y<2R-GS2vQK80P$q38H&EDmYCh*106Cd4;w0G-)t2(jz00oP*@xxYXpAY5 z$0CPe7p96H3~#4w!KEvMOsp7g45x7txv8_g_O7d2j1iHdjoAm9tc>Uc$`k>NOYL1? zBX-K1b3Bt|L%p(HgD?w9Ezj{F=KaQ+&w9ja;mr4P3(mHTy3&R{lS!JI2rL)|VWRCU zTWl1G8SqwSb1C{y{4%lX+M>}*_`8=o-wA9?Y$jo(-c;NqIA?=w+@}>> zwQ17oRVJ7~50}JK5n{E)n_927`QLThEuM3=Vz4cUrygs2IBu;{*8FNf9YGYT6zS9& zH2-?6%EG=cn#O(k7SA?_7RigX@C&ZaC3Y5!P1}4zR=3B&{#33~UU@f5*F{t`DZXL= zDbGj&Nor@5te3Utzh3RinGbdKW*=8x&X&GsijJ20^QUrT(`C*O^+g|WI#)%dsEDCjKPGhk+VbT% z=GQop(tHpo5yd+VhU`TRE)Bb*IO|8ZHI4;bfM}LNX^KYI%-HiR=v~i^wcT6Db)%#U!+#EEPh*@9KFBw1@+3J2oL2SCf49zZaLy|e{@)p)G^sHYN9}9SYAh-;XrkY#+THA zi6Bu8<_ggBQ8Qos(1$4&G*VngW>DTZY3srj=lGD zu$`ZWBIc32S=Uck9nadhBT%WZAHp3jR+ub4G9;?)rCd7N=VQH3OgVI0HZ43IS7HYj!~0l{l&#` z{01C*o|o9J_nm=lBqSo*jFE+!O(#uP+W=|61HyVfvQ)>;UUozrd>VU|6+{&2c#g%~ z>>%qH_Op+D_-*X_7T7gAAFnctzv`2UZafWc%ON62TNnEn&KA3(wnP{U@1s;vB_qz0 z@%GbigF=Sj&@5=mbEpUmuRTkW$;ZOR@;o?|b!q(j@GKajK$pjBbwi6Od_Rvb$XB;6{B&RIT-JHobVoTP-Rya~_!;3v+RDA@Q>iQs(WYZAi(he# zPV_YN+)3!?Jq-?DXJ$m_O)GDPNN^kzr+z-H?vG{2eQ!MfP&A07vs$#L<5D_b2^d}I zdN8X!w2AZ3GhCve^)mmG#4#2sLHn*&%nDI#s}fucX22z@O@xAIl^K6qm$At&d67$! zctjWItPLLB(Cu_~{a7u1QL59Q*(F#G`v&d zwWPu<n1*Y#eO5Ncf3CYZ2Gw@{g_@VyA_tX2V!$6E8-A4Jv;b zv=V@jcaY@L>k+ilE5Uj@vY?li3KY{DHK-iS5QQ7b zhIUq^Op3W2H5x7cz2V~kV%;%2K6~AxGD{aVk+mD^KBnsm%zO6cru0q!-QgQo+nN>0 zq6cDDnLDJjp~ZBk;Q|daGvHWqgL3u%@-TKC~1)!L3V8JVrm&19VzRp2$`-FiICqw>(JxE-#z9Efi%{r zUuRBYE3u~`gVF3K_4Wa}LW=_ub&H6%YO2h;Pft{=D+ z-E+6?2F5YRnmIV%qr0pjpLQXrQ=`SPATh%wslsZb#bbnZw}jx^HMVnhP(YSWyo7fr z<7K9FiT{V;98t~Os+Jixxj#7zMMA`8DFVw|ok;XymP~)ant<0ULLP`)czu1HZM*o( zt{+?xgjt}8gTK&3Lq&ybPT(IqHjls)f8x;cv&)j-u=H}wWuEkA1n&)h=Mx2R^WeTk zzr5f~x?F0`dm+tP{}uU-OL0^v%*!CzS~7iI`VW?RnulicJBJjvnJ?Ax`cOHuW+5Wv zL!hbP`}9UVl_pK-3+_B;Xi%BKY{0XYSk377 zT_3-%!Ouhb771XeZO1aqAyAE3=8&c@;Aj?|Hp-e#AN%a`z`oA-+Uc?j@TsaaPYJdy z8`ZicZ})_)>wdGdI+@LL>5KZKw0P53u2z(E86*T$;_QH}+hUngoSQ|~+=G6F$zP$y z7+Cn&!j9&kug=b=r{Z517Uznz$JgT?lQ6fpF^inW<)cl8YI7mx&hJHPBILFn7ef$& zfJyqVK*}?>tL{eF7c_pd2v?AXbCvpmWv~Q<1h)BPD)=gji1A(!sRh1m(MH{%#$7M#@JMm@K{}(X2pDDI#_yDVcveB5%f88vf6I; zSR~CXJgB=j}1lcA8P&DLTmhnoNG0yZusLAK4swyXV>Do3G7 zi<;S{_4tGCJ47O|)#DiB`SvPD0B~Sp_lN6rjy%I6B$cb(r^}j}GM}rEkwS#Y@-o~6 z-rNk~9x68-Tz=RL?cbpGwgwd;Y9d0KSqwwx=hlNxjI3gh($`!4`{l1~wi~IozQ&GC z(HWLA86?YXX&mAf8PMA;!t0MJw*}%*7m>P(B_Omv^=(8OyiMUOh}ZP9+}h*l~GV4r%weOIt~Y2Zg!i_+UQsXl1r{M@fz0@WvSBc(!SfB%xcj5nQylo2Yd+XVD2PgC?$2v7`YlxD2Dj8vq(4{a!Z7K zbg^l&1~Z9;<@oQ=_jY%E{Z<2w+n#yKHET0Sh zGAB}GOF`Co2qc7JNZ<){N$1|wZyD%JL0(2DA4mLK)6tQGXxHDWuzKxqHo@ZcP%k#|jfhJ(g6!W36%snqXD%pT zp;eCrOr81Rdee3eTZkYL$GL{WYb(aCKRT z2DKh&zs>^n5@c!7WyxsbX@3+N(nLit6c8!38m4rUY|a zZHQ!K*u#Esod2FXuHihD zNeeohFNTQtTH*2jk`59?J>+5Dak)cHo~OH`1~*FHacPhxp6>tyr81ubkb{e8Svb1U z6$w_I$v$H$nsg0xlD6KH(vKJYfE+C!AHu0rdeeqyQybO+e>+ZAL$|MLiq=Sx4%e|a z(7W9x1t_KNtg{I=#qWTU?q@QcU1d^SVc70p4ahLHGFs2KCMSuVnT-DPj*U7h19j%z3v@hsw?|zN ztl*gSSxh*u`Z+}H#p87d$$OD5n)&j=sPd;f8gcHv3}MXo^!3#AADT_B{sYCO3%;Ic zA>^8c_>cX|?ZyY*l?auun@F!WMn{BcDY&zgl-PV&`6 z4640bB)vQNU&B8c9I7g@-L{_MVBFv3C7$d|Uk_Nh5Jr)&I&)ROYc+-nv|qg5uL_xM zQdEB0tQ0ZpDued)VD*!=nWx$RcIjdLaex-6Z#K5+&nb;UIM?tVfj^s6OgpvJn8#Kx zlrDeO#VSatjLcipMsv1pK}J`^Q;$|66brqn^OrCp%bV4?lq^#F3C!vCNmt-8A@IOO zo1^~iQSobErnPI$E&Gi^;8~nj5q`>9DWMQKtgz{F!#ue4aJ0k|tn)Z}bR#9Vfa;C0 zho0c=;ZDs*HI9{X;oIE{;$Yvb!Z0E)Q#4g>zDE@TCO=*BJ@;s20@|BwN7U*Ad;|DG zL>sB&Zr9Mlh8{a5b_m!pP=c4W$^<(yelz-bz;I<3VGnU)D+J=o!=5~S!K9^;*0wo0 zJ0qusVPbgC-XDX0yJGRMe9*{q)xBhWPnY^RMxQfLS&_pZe(KpkAvc>3ayGB$N||J`=>qo5g*qH*HN zl|=~4b#iPWLqB4Tj@4vBPaSOzHEGciS+1#7W@_Q871!DCXmT62bqAzB172!+kEX}u3Uo1vg^G-MNr_d2dulvTM5G5DQom>ca_B@A}ySPf%o?z$Y?l-r+ z=A?Ca{~&SX-v~$7x#l3yzVxJ?GJxd8*!3ZIHNAWnAG?baISaN5)Xg+wX|raPyz>>N zHB@kkEVH&MZkbAo%5cnn7ma5u_UF&I%Xxj8iJ@{Ys_2x&2}8fA2!Vd-eXH$oWxK-+&xxT*uYhXJ*#Sq)TjwOJ6ewd z91wo7^gLw__sKRYhZ+Iy@hFl&SoUezBX(!P*B2WNo4rKsoq{k3K#}#?VsmU={`WSf zvX%gdz+3LMEP`_eGkp1DsB7bofwy@@S^R-0-nFWS!1#kbhs%Y{fkNo;d=#N4f z%5#YFo4M%vGlIZR(Tm)D@g@jFziF@|=_>FFQOJBgClH(mkA2hm&e)#&;KYTyTU)bB7*doq)8#q~#mKRSn<+DEg`C^t`}H}$oO4Lo z=8{8N^O)in$qNHUcbz_l=ePfee*dYCxXg4_W1Z@DO8~p)TR-iga{~Vi^r$t=5yIg( zlD46s-gqNX3b^2l#|b}Kzr=suT(EE1hNd|-0k{7g10)JPxE z34nBJjnv|*hwO-i+<0Pu=)v7je-LJyxbn$#Q~+nm-W}~9ngo)QMQvfXd}GrJ*5rnE z>}g%3ruNnrAwsNBHfs;}d22HY|!SfC#3Tj4-BT(81n8*Q+wjYo2Z$vySbP1s2 zsuNiPxIcL%3%mYwEJC^h%*0<+}lya)(oJkw%%@xsLTtrP>PEPEv0o3-BWRGjd!wD*#uO7)9mHRTJ z8}nl`gX_P`XmC{;^8&6!v9U}mgN&LnKYu<9W$d(*Ou1P$l!R#wR)7pwKHLkgoQ>_x z$i@2eD>3dQ$!g3!yQfwlS?b*fLIvlTvvSUrifZ#g>gp547PhU(-CXxz6d` z(X>UfjJR>H%XGF{?TOF-c8+L{jV^85PMYnkcWXkKaZRDvSdp_*jk9@ZtQ|8xjaqWojybyd41B5B)FnWA7f!K7V2I05(;fV=#QPckFGY zwz*5)c}&t8d*hG#;p0ewOul!b1w8>8rS&dodyJ?P;e&ngU;fHu5P$|q6G}6V(0DQ66Ohql%vk|iv&j`s^Nb33 zMcwy$YW8%I?R+FKQ6ClgC*hqu<9^IUhlFz&z3NVLsa>U^5XtgXn7Wrmj!*BI^%G$22$mT_4FQ&d4K*wDbjeL^`c;iv29d!9aD z80$WL)$cAHF{p^Da4m6@=`E$))(CC+!KbfUqu&IxFM7f1(L(pbpwXgpq)MM<_8)oS zPNuWcN5MUD&d`gzLZspbTP^kF#kec=5oFGvunW)@g6gUzN<)5re@~~S?is&w>omp! z=wSozp1&M&+i0}mB^I-dJ9%m=r6NPcJ?@8_v~}IBoWF}}RUS*8dp&$Z?*x9)ahv~=wc=`0fRgWty2JDci;g>WawEefa0^#|2~q}fMby0=jzC4V8p`P8s| z`Qp>lLojtze_TW`quyXD^jvLmrlLci(~Tw|vZX404jTc)*&jzM#*q$0CCz@iJ^BUZ zwET)RrY>65c6Z_$I}{rqFWkwfBind)NKYk)M$9KEQ{~Puy59a=?0Q|0bME#okn;Lz z&Gp$53lC2Og)ku4Z?W4vI-)QsqM*h-CS*#Yh-Pbp<;i2154P7E#gk5{ zvJA%Sj$Eg_gbkCHy(6wI5!~|BlP->WrzfoIlZ!$jZABLF88yg>pP#=PL71e!pBUFt zM0{{+gODTSx`Y7huRTB#Wjd0W*I6NSe;iu(`Va*1YV%Gx8+&s*(S3IR^e2y&*D3Gg z$|FPHw=(T?p1JB?Y&PK0N|j5ZdXd-D9_NXpJRGo9{f3@}1<^n?b751a1mPv3@@Qts z#r%f}3CUR<>fzg)=Uj!BhR5@4iNJdm`1#FCUl;>0P0LM-2B*bemI)34<2|$4oazi2pbiXyME4Kn#&hG( zM#*84i%sU6BNP`zMMo#4);#ARbuH0i|EtE)fwF!V&(6t?J99<4Ty+KsRcH?_NKWVX zOAT$3C>`~`J_s84}yLij`>>d2!U=#H%x@luhOi@?uu zGrm)41pmgLu#Q(&1}dMX(R9dqf5-0hVzmq&g$Z&V8(%au`GGU8=^6(hUQDo)!RKms zEMjz(5DYVrSrFIhc{N@bLp!+hbVfpVm8wiN+dE>1xcwuiqq-xfR$Vh=aEqALcpRH? z$jUkDE!W_!iB^edw3;p~ctSq$M(V6y?$ljX#?PHX@P}rTj2zmE6PPIN%nX7jE+C6D z;I<|IJ6#UN%}_7eOzW&|$^mYM*G)^6Tl-xa8>00J!f} zqt%mteFAHG2%L#InM|+II4wZ=dXsTk(k?T9!gX_K-gjo!Sbya{#A1 zPklSkAByU}p}7hd>(p^`{p#41LwtK=PdlFc%52%c5}21KqJB3!*=O~OFxelO=XG}n zA8Wb|+wpiAMfu{}$Z&>;SNVfX-Dv>ax>l=}R3`8ZPR1Qff3((`_)5fIg?9-H8Lr`O zVSV6+!~ec&&-OtCVa@#}r*CH(Yk|o(!$Y5nMpSC zrM|-`xCeiAN7*sBVIm8_P?#5E-i3S?UZ|j)LcbwJU%{3@#p>bZS1`9%_z0zD=UmHz zRNBY706~4l=Aj=F5O#TSs0nvhuD8Vtu{15nGSz;(v|1=<5UGyiH5~Ij=DSXRkDG@q z8X(Nd_05kDeMktqJ33Yh${x#h_I!De-a`2YkQyb;8Rf!A?QdiQ`)k_rHn%0ls!NHk zaK)YD3v|-NDH^O_S9;aw+I;tes4qRB4CuGNpD@jKhcIqVX60r&UJ*7~o!y*B82j{S8H-(vAukmNT?h{(CXIbD3Qh$EfRX8S#^*Ziyt@6hNmZfWDT(jyiF;eK=rlvGG3hhmly+8wQ}%beRs`$QY$V|Lr^%= z<8#6vMm;za^cUo(VE}jlh?bhOE5*{ujyLrVm=@py%%xHa{=2a}5 zJ#Ac*JeP47FY7PTu0@qW=n{8^4EkVCU2d=t&-CIEC#rm~k00W+o*2{@W`yrtu4rdq z+v>+y#e+OW$bRNT!*1ZQSdeop^7Uv2F{fhixu=2|*>ofI zuHpbwqo?_DBE2$iBAv$^2nn$v=CX-$(i_|omBN`_RbxF&?Uy=u#F$h#R;D+d?bH|= z9}j<9dm_CfyC{6L7r^oElzk28v&L~TD01F#jZNXO`~e9-E)-BHcY=EO^Xg^wz?2;+ z-IQaVbWs3(V5@d(*uXYSvheehOEp;!s5|1=zoPKxLdvYW~B zI-hsDxXygHH=agWYYFN2yG1`0Lm|cNV-YeeiLlMd3*m7l0^wVfE2TP#SNxDbhCUX50#W=UdcR?|i#mX8I*5jBd|d>d!fNm_B^p1X*)0eRvT3I)S=1Ng`{75v7=Nf3k%({ zdePe-6NM+|*&yS4wUs-`DWRRQf7QLYF8M&B&or)o0|b~=sg~=shER3@l9wCKB?R6s z_(?urEkAI_p>g6Ql$HJI7}sl;>(ju;eKOq-w9zsX3+;H)RK1Lii8bxN(wUOFy!mWo zNb2!?{K{HjpGJ}iJ+eMUupG%*DR*&qRiN1f^QfOKfaIr=izE&xoBQqOD@p)s;)#lb zjT^jS4OF1)6xUaYCagFYi{yJsf?5hEU@stGFF^|R;y5zg9Jgjm(W~i4Q?Ls3UyJTQ zeof18c`_Rr87nyN)Cp^ZKc4e| z0xM;eaW`(wsmYAb6nX|aJFAeH2|IkgKgj}%NA~tvf9oG0@;M9XzwLFMnJ%ah0Ne$P z{^l5n6n)?CXlK!b0k*p^-yHu`++dbD6S4ZoJUJ0?1&o(A=v^K??57_zKw?#GX3y*R z?}CK$Wh^+dGP{j7h8UxqjK9sM7`PM9j3bK8jM0^BphK_L+PyOFteTFWRv$fxSw5*YaPlImc-!!kiC7pxM(6H{P5gWg3%XRJxq;xm020zT;C{p?3V&)Z9ON+%lmH zFzR(Uy`qlH1CVG$i0NCeUFcLENP`k51q*@Ue15N_FSA)oXBa_k+WiiY9xK`TRNBt) z6hBtMMN~<8d}wkt?(H-jLveG;xgig;%J6x|pa}TvbkmQkGrbeZFLvJf{>5WmWp$^#qk(nu8s$A))yT_cd z^IN5N5^5*zh)iU)rq?;WlpS z>+pC~@2)H7%G4A?!gwS%Jn#86-PQ*^;r;tgRfp4EdZ(`w06q1A*Eju7KIa`8lH&@I zotc?c4uq4y*A2qI04cCVi*yd_b>CtC(xfVf zfdZe@#uup#`d8BNB<@fcJ+ewXK}bRGxONcInb)lAP8DX+tPl0lJ$3}lK-qo`#hH^tT5k1_n( z?XHCU?A3F7$1(iVAvXF@Qz|b^f$%;0+AAxWZ^xHV^c{zQuYbOYG8wm_nvVh7N%F{4 zFWk$t)j665eOKW)S7lb*0AzU1Z_+_Lr>q{3z^W+O-@;~qbt(}({R;?|dSg1uP^gti zBk%doH!v5E+QE%F=|UTIu9|lM>xTzNJ2-z6C|k zz1M@`PRad2)6e7ff&+OBAHLR(t+c$^#X~=YTapN@2d)20vW1Nv^Q|2}IfY^_?F%#Y z?~yn~B_-)k5(cEUwN>oA?DV}vGU2^PA^jnz>S7;hixmTAgLDaR&UT5O1l&Q;c%sw( zIuibW*WJ(CofYUl=IHiDP>Bjw-}}P#Gu-_@uD&v;&9LpVP>NFu6nCe%OVE~5+}+)a zOOW7J+=>-Vb6!ZshanNL%x{-f!m{BhREpa$$eFa)n401?`q@nC`Ze zGSLcg$JPi2=3Ubkl6g@}#ZQPl$r;|uQ%eqQD5W$XoD1#-2H+3jOg?m&T}mh!TNlqd zzdqPjjfN4gWcxkHvvz`h{SMtK%(RNr>1E=upUP|Iww?Y?XzgB4==2JCVkQI~eaej( z;L$WJB^a+U9UR_Kl#6ShByTKnJJFc_YyAE;F*L_-JnO@cdtE}O8LjYjg38rUkr>in zf)~w->)ueiQmvXc6)2&gJ4sZP>_}H6tD2{ww|PQ^PP-1_Q^&(&xyz7H&KEV)ynwdQr5KjZ$?ay%giLTx}u+!OaWwASh*n^i6vwl&H* z5bL+-ukDv%2}dkZHzJX-nJvk!vzyV;-#}lxb+=pjmQ+;u_;Pq3*7Y|fKK^jwNmZn8 ze9)M^Pd_P_6Gy4#4cYbFfe@Jf3~K>!o<8Od$32wUhROg-&L)-8ZboMmhbxx;aqxD^ zwDMM}@edxXHE#S~$WeSl+QwtOltLABKlTq%*G{U|sQfd%YVxT5OA5xhSC|ZppH8(K zY;ry*(yY$1*}CjMFqD1^2+EnCF?=)*3kYo=6>kmC$RK$zJAT^@!W4;fFzOPvop&gk zZBPm-L#!tgybXkjp)MkQ|L*Zq=+vphmf77}E;FJ(JjQ*qImg8o{N!j=Jndghn(Hh~ z!6ZUDCamq+(lecMiwsE}-nzaA;kAGslQeXX;eOM-Wx&|3dG%nX1F0ZfOU3x#YszkV zefA4)!tf6g#Yc`?k@}%wF=DYB+C>lg?C_3VCf>{V8Lz+PYw~1F>+353zmUoudWrFE zaCb3`N0rtqcMQ zx@FIVc3!kVcKK*OXR$Oip0Ik1c=uE)D$*U^QFr0fsaVfZDT+~wK6Lq>)_>td+F&92 z_UCqIFl5v^VF?S_W?i=7?IB35@^tBSG;$N?Y(K7Xh@dki)uR+&b3`C2BSDG(6hS0T}0;3 zMPf*zhfhGz)+%n(XCylb1)qVGs=xTny<}g0PR{`JhpgA0K$*pTBozXL26B^as@9ZX z$<(#hn51Z1>d2Z2AcnSZ8t7@d6k^L37(NllG6pEC%^yFfPBMVVofdR!N+UL$%BnH2 z@%TP!;QAR&pVUHcflCCX&jU0l_S0I)Dpf95PT*>FMyz41Oq+ z)tsLS{p!e;jp;y7En>jJ*U>7cf@wa|a&NYDZ)RAk#L2%Q>{jQN3PKD>40#9aA@lNR z0}0)V7bbizAq5qyRq81Bu5xL{)!8j+rDvYoul;A)>RI1jCxqKUXQE{kDz6)oEPrx< zhIV5*-cu-Z$OYukqXt-=?Q7+-@36$tQ*n*5}e^9Y_DR&UOn@=i}O z$K%t9>yzFq$+nTTJiYa@!bGZN^`A*ju@}EoeE+2;PN-=TaG4g}{RS?dzowmaW<|R8 zqr)TCoVBMCrL(KI752*vO8YbkamCOolqC<=$ z;M-8`{I@v}O>%GiQ@Xfq4`sw3ijJuogX7qFuk(%3lWbJEfn^Uq4OH%2^-e4c@-rKK zFk)bQS66$rW2|=tgHZ8a+S>!kUZWxSr4_=OOHHkUley-_I~`HEJE$Gz zfG}`U-q+yGz3bvNxE^g6%i|PWxu=~Ti76KI!GD|ICPx=ztLxrir+- z#R_grIM3!(pVq8Y6)nX}tg)#yt1v(kh)Nl<+Ue`lpXdyHSDk=K)r|l5El5!<57{I7 z7m@Hcj$;FR{ZeBsR&HS*vHZ3K5T-1Ql+S%~#%!gSZ`A}+xu5C~)CK zVgT9bGj~RUV2+pYQdT@&ww-o#SnK-vX{x60A3Q4p&_>q^!4rHchzZU4^LC#urpq^x zWh!#6=q@33ii`T~c6IPg0gAzfcO~Zm?soLHPFE(lk@35Uq8G@7GPmk1o0o25c>B(d zY~6k+_0lx@onrZ1i3izgpdvbXRbh;kCeRuKz3bEm>j*o zM%blqy&`(WG{i4d0UdtW_oh!xz0UTEebcB2{K8nPPd$lu8h%%nRZ8GMQy7D{RDIo3 z!Nj?@egZQ0K2di1bJBKtJe)44uc|*tHDSK)(7(P@Oy5qwdNGr{!AL*Zc(C=-GWvR` zel%06pHo10E=s*gSox+GRqb!8pH*$-V*H66nM4&K;;r4rPcy@K9e2>xous@6@mWZH zUGD+vXL{aCWkxj%lG0r0PQx=_I}?skZ7P5Vw-OkW3T{mQr?ppN)9&`f^^le9m3MXYFcDgc+^JZuWQc^;!H#(m$ietC zLcbMin^+Y9M0?V!#U}M{ZI!=F&ZTadlwGaS#iu3a?eBhjr0nDmtqf~K&pZ)snU9oS zJRjRx`T$|-LLfjuhaW_T6S)AM$%iuOy|@^^3~2F7UU$Y~Zi^TonQE+Yneq+G_=mBO z+AaTihyUl5KCw0{@Nx@@s|kX?th)mA+^hvKfo$j zDh*Mu%}OXp)gfVFPf3IR5gy|NfU!?qaGKdSq*THT(QN*#VGEh=dyFIIZ{u+Q!#3tz z(GE7_Zdx2~|e?O#2sWp6pU4d+}GHxG%BIWV*evx04R%$9mZ zv4|zlMevK;tEY;ym?#RPp@QRMgyjkbije%ZUWsj$9tq$f3omUVF+dEQ@QClZ7eOG2 z5fT#8+_D_m^QFlC`+%6FYnbK~ZOpppy=2Q%@)QKd%PS>7qN4UGBs6SzdHQ6or#7c< z5Re7kG`K$x!+AB;cdcQJg?c@9i(?;=cACuH&-|?+sYY*7BXb5zR6+TSOLrl9o85Xz z_ooX=1tVOc(jzGg8xtUyQm5g23l4M{C=rj(l;vOaG)zq1(xc$@Oiv^Z=j`zq3mS+`Wde6&$Q#$s7ka$IfO|OFB>sE zndm=uLlS_m`NE{$BQv}vFF4#CNjxlW`x=k0IT}R4zM_gxaJwYT8pl;Wn~ckE?LH~W zMT3W=gZusDBhKFjl!b!KF?(tJpGd2e**LWx^H#5yO+NVmb%iiwJmq#_KE zReSSQvFY-}HZwh*5q<((NFODe)rZCRQ}1 zF555ZCS*j2Q2@EPD~tRCS*SV3vw<6_1(zAj0sqH`{U=nEhIi$*uk4*>i~N3#Yw8S3 zw0%2tDLp>KF4=MYa~+NRy!C|T3JIIHWz8pUfc)6ArtM;o)frEv+F7}Q^)dc%zNep! z(SE7^b;hmR36bk^l7zV}-e0ky;NlQ!pC$6~@%Z;|%*pTHSd%xeaA<2?ytBv?@L9$l3GovfX4(*jStl^$aLZArLHQ}Vxqv%`f0rk zD}-9(D6BjVM`2e6w3epV0au|b9zj7};)AQ;AV^N^2~DzOkWO(l@`8u9hf>(LMnjfQ zc7y_!+7?zNexBOe0@$BPf*TIbG_o=UGSZXwRH<40@>@xZ zA(OC5*(?y_uQ}_s5wErrbL?f+W0_-9wh3satnpOa!qd~TfMcTZ>S5IUfAOmeIH#j==)uCfI*Q< zR2Z7<8#UMdL0Y+F#HHIO>R*QH=(EU&PpK%G4?2_8eg$iU5UJ~`>4u-?gc}8!LNz1_ zK&hufv)_6cMXv*1EW4*=ZfdbW61fz~1%J=5#thK!G)hJ0M`6Rb2PbE&OFyoR)w_(g z<%hd>@!-ZG;yhokyzWtNcr1(7A2}=p$3F!UP=ENXh${|1-U*wVo}4>dt+<=L*|H$>5oMLuGWpL0J@E~TAfT}O%IfC!OHB14$Z0+W+Y?R zqk>WKv|8siyvi^VqH_CiX-5m?&IL(_B;nSV==!0IDxJ;`Zd(#tIdxG%wPbdU7CFLR zy4xR@uv4rsA^HxhBy3+w2|G6CKj?$1ELOVz3WoDnu6^D?*XT6G#x{p$nRW7WI>Ac( zBsF<`vu%y4xsznNuflBe2MXNPTAcdn4KzdRKJ1TklMtTtI@31G3%Jb!pl1_{b;@56 z(n>MUaSl51%$S-@0+*i|bx3y9WB@8(*P26`(!&KPKT%r-~IRo8kf z`#?svcOq#NCN_5Qo^4(|^!Qx($?W}rmZVd-bggNlWaknL{8fkAT|ZZosoaG6?4)WRCcD5fH&A8c7ZR=~(WaDH-nz>4T?ah0uC!D~%qfhOdBM z2??2VD`@o=v`1+xlandD*7O!3w;acAt=YCk6LnMF|{(AV%p#0rf zeZKy>8RP6Z@1$yMv3^!S(i~nLN znDN~r{;H)VHB7~=IGDTo>{Rm=8&_ee3tU)*O&eIRa*5tRs^V4Lr#~0Mzm|&7leriw zR#vrgv>7OQuoXOtOM4Gk^E|gOy6AQrUmQ&R(cmD&XCQt1WsR-0JCL7r;7f9gfXgSr zFv>VNLE3YX)va0>F|W$|E{P*bcFdNC(gA`}*H(&veYuoO3Q*zf*-+K!;uz3!5;<}I$1f_t<_g7I$+Z>4FaCV@ zcS6CL*i>=jNqojOA=iCu8e<+_}AFmV|7bjKi5;AjkL+9IZjpFK+ws)!+VNn<~@{)NkerQ5N zRB{&Jh^m%Cj912r4-5)$T;Mp;=yV+w-Wg&zPL&uqB9IGBTpdW=Ih<#UCHf^_yY)rJ z=a|6q2kcGB{nPCbYib>f>~c$TtUR%TopB3%!ztxIYxbI$lZH4y~8HQLD}PSzBSoXMeqNwUlAZE zxFDbhImo|b*1|}5e{B_d zG!#3z+a0M)_CWbpqze(|$*+NYdnfKL*WOG|*L4dm$(E7Szh{66x>4~R<;E7*b+6R0 zqqTulx8`V$k$>f{HO$yGrk*Vv`yl7uOqWpp<6j0=H*Q$KmuH%DdppagI@8n4>=xd? zc72+Xs6hFZ@PL(PGl778bPO-IzJ}JVU0zH60dB`REDq;PuGApFDq%8WkOApcvlz84 zDHd8|!;IKs9PA90+CITjK49DLo2-RmfkeZ$qKneGWqrq#14$3<>ZQMPY^iWyNAV_W z+qPuFH#3uklB`gFk0l{AgU{_`(69 zDWiQwsUDU*$H3{BHMkQQ`D??=I4qskFB&80w8aI(KQ;^U`J1rUQcf>g63~*}tON;l z>Eoq!cDCJJkXA$JenNqYGDWs7Kl4r(nv~2QY!5>}O_0%_Nv^=IEx+AH8n7c&m~Bl5 zFqpb8L1;v?U@WrN#TA=)ccvKc(NsOF%ze3nq*o6k5xQJY*L5Dv`rMD@v@C zVjo|JR;7TG@O(gjE#VM8_&ghX6*}f5XEFr4zzjc-3HZ|1yLFTrsvw*@F1MkLxh?y; zSgtKilNI$&&BeX@*TGa`d}#w8)=)y8>&ix*6A6bBC#*mGIy%LoHp)_#L|<|OJGQNv zk)`|~-}x4uKH39kLv!z*LGhI<0VGJVzx-c2`JW`!|7%VYr4a$>;@6%IeMr{6oUc=Q zS5f=_V=CzI5C82CVD|2=bg`%Wf8X_E!?`3>0vB5f38?c-1cK!AF<||iZ-g(kvIT28q2xa5a!g6#~$GJuwcd`ecfIW1#5Xt2;2h_EcYQ z7rj>GrYu#>l#Z2BDbUSM%cI}W?fole8wWV_`W`Sr*^G^ojeyDYYT$WTLyxyE@A_Sl zJpA%gKJ|Q|3$b)H-)YKtCGA>N%Ur$Bfqmsd;?I)P{yw{z76UWV8%zsEA)Rz1)bCSteBUDgnLy0Zt$;fsWe2?|W!W z`^HXESo}wm6>Q+6cbGBfcCl?Mgajw0;P$6Dewq`?V*?H~sX_(QN0&eL+?joUSqN~> z2#U#EZ-;w5M;=aSymq!Sz(Tu*_&X+(Y@}z4^^)#q(sz+mcp2GWi15pzb~2_shouMF zclMQk5i|?qYh|6U1A<>a(T{y9uXVTDrx)zynBVH-y%yp9PpR>l4d%rR+XhDJ?mqv> z`Hu2(Mxa8qxHAQwg63>epkT1(`otsUR~Yr3Fz^%XeRx<b-exR zs#^0lyXY{hG|p|ek|A_O47lSyUzq*%7K>o+dU(HJ|IdxVXrjr!qI^z~}x zdW$KsQ=LHLJvYm!dZ+NhU-Z$De2Dk3e|>%<2~%cSSIPz_`p1|J>OEEGUG_XhiEa2Y z{Smr^_+-ZN`6^M|R;{0peNS#+NYZr4S06&pm$|aFHoyDg&cT-pmhyiA=jx68Ywb2{ zv1nh{y%bD5Lth2qQC5J%@7dZ}_C|guYm#^DbmD6T%idq6XYa;7L|)hb{gE_0ooB4y zT(_Z(tzKr<(M0`n_0$=;o9|#bj0Rn!QfJcOpFRzdd4o@f+@&SOcL=&ky9y_xYBeIZ4bwhigITB54pk zy_tW%_KbgczFxj+SbIbZMHp`fig~h8?(~3|Bc0@WL%yL9F6FfAEw{OJ@&1tt>Z zG}Mnj%;eC1!DNrAXMY~-J%<;4^3YQed2c63%go$&(cHySt$xBQJM+UW39ddVYlHAI zxz5S9tX`p5=s1W=%UhS!Q*K(t7MpZ9{AdAIc7-Z z$EHu~$EI7Fn#(Is45mHEr1SwaE|{YbG!S~k_EBvC*g{q z^WPSiELO=N9tj&wDDt1$+S)3i)TfVNBg2xjB10>7;^Ym#jqWvg-4be$m(va zIv962IZ2bO<&1w;r7nWms;~oHMY~Fb2|o7nQVHBI&L_-;69z6AMk5C?0x?=u?1XDH zvnQU#b$D$)#dRNae|?c$r**++OOY`;*Wt5fK%y-5yePletG6~B_MxsyD!w4nw~F)4 zxNg*QKk2RAAG8kbX5+SbV=YF(w2$Qb zCS5KpO(Jr0w7jV1A1Jk8b5geuXW1OR{jhh2XRhp}l(2!5nEz-;=2l}PW$o2Sz z*JuE&aK|jNpZy&7J{)ZNtcw-Nze((~>d@Jx^CUA-zBI~q`aND7J|G3Qv!H|@`>ef1 zopauwu9s1&cDyPl{1vRoPp={WLAIjysl5n z>(u&ub%Bk${uX7=c{xh$(o7uj;mA&$O%we!;&!TxaKGfWkX(p?RF^lAn5|u` zrx$|P!?BXE+q&`gdv9o=S=|L3XcsTx3itfHtGJtSp1E7x{5I@Ma?0oGD5|cI)4}1V zpb+!?ya1opZd7WvK_}BS8mj8FEE+Ktj^vX{J0vY zdpGeVWQ8o*Gj3TF2qkDf2`vYWDot0daqiw-LD0!ae(wV9*Lo^bL0iP8+cc^!@YWsQ z_rtz!5>UJ&Y}wuHJ~HjoE{XFyM-A=22PltV+$ zQxm>Q7)~$PH9P92O>tcXEt#b&_u8D=oJ|cxv`|`D@RrMqm{I%}r&Y7qhgJ~kp@3bD z#7x!G^ZqUxqv;_We~;8iufg@VTF{>(n1-wxT8W||XmvrvAg-GDdhwd^EOWt7dpFIy z;h~A^-b~~ztowMXqdqFIwSnnek1G4+Mo`1@y>@5b#8vuAxcu>4Je$RMf-o5DY!J)J z-p8+sSD}@Un02+F=aE&{3y#9GTg0Z{7<*K`ACq3J^28yG#{Dvf@~Yo~ddw(WS@6*D z5 z);P zUXf`ty5gk8J(;Rc#5IFWj*5BU!Ha2c`%nRAgNgATAml^bUsb-BOty|e!KY&obh7FN zhJs5;#I3%595fthqNhgz&Mv&&gmae~N*X+Gay36SFPJYaW2n^VX;bd3RaxYG1bJUQbn(d>>w5Bf5S#ulp*x!1=qc*19wu#GB(96Gk9_jWtqwnHP4 zN`U+$FE@i5pJVwT5VXCyuyZ9|+KsoX6!eZgIM3s=*xj_&fuX-hSv_BU!a%o)4y}$i zKDF=d>T!4|UI+4WbP7>zEVqSbNlP4_D8lJo{6^+d#CnaRIG@{3(iTF{GIXn3M>V3MK{QSd^`hn!}B-B_T5*`jddQi&9#SQMMs zF)^90{v67}-qn?yd<#8_+Aw=APsH63@`DlK?(fBlq*RIj0HbMPuo<))konlv))Bh4 zkEUM7Mi@pA|0?e>(1aoBvi!v7UT#`v3f?c*;OZLN!}e_qU5rI(Q4VC<|JI?(@ktja zRx$mj=E(U$N?KYrWlYOhl>bOy$d$JY;K8-Q zxkZa>Vb`x5ZN;oH^2V%7`=LJI4!JK24P8(k1oeZQde0Q-9ZlaEx#&k><#0HDO#R9E zKqf6R>o#=5G(bKo(0>{?z$8LqtVa==f}AWxVDIFebo7x+bVijB30x`h{+~($c_065 z?>DujCJUd6mFSN2t4Pqp875@xCVLlh;(*=qQYV#U{&MMC9cXa2{_^CLt3l-ZPeD+- zb7p$Rd?{k?j-m5J+M$hJyJ3xcT{mEejJ(sXmD%vfbA9RB%+h`(%9^2Iu6#Tg7$G@3WYS7SvVz>61m*kn7?m94dNQnVwI# z=du3N$p+droGTv9N;1W@UbWHLDp@A3%S7;6JJJG6$RCILVO;YEKJsD736X-~MGVuk zx%38^TgIeI1BDSyRzJDm^QWgpX#(I_A?Nw>NboTenr4-1&kWl5X)Yeojg$-5wlvrN zb9u)D$2+nq=57Wc#j=>46?EOqux&-6J_0xCT@9-{4TDsazs}K(w%Wb{yMXa}F%yszclip}X zi$~rKIbAdLG4L7K5R$WKyKdv|Q3#L#id_F`gEI(53)t>i{dYE~A1F%rXlU$#Wyo_$ zk{fds_i9;+(m=r0t1y{g`wO6oGY}mYHuzC>`UapCpn#|MQ@GWmmuSgg+A=qv9Xxc1lHUEr9Ol;|EW3ImU_Hwi`tdjotvzOfWM~8nrb7N%6(1t!-rIh}!?A{GBHo{Jq0S*LV>ue%J-3@C-8hSCyw231Ih{!y zWF{~gkZ{=+i^Cnf3=I!oUEB0B6io!Ywv00*JKbZhTG{-`c2+X@+bbJGFTqL{5jOXp z&F|v`8>dq;S(|XysEH%HoDn64C{f;P`!SlwxY4gm7YY}k>H_$k>Uy&UXH&Tn6;tsPwPo+AXCgYHExciH|f7VYOVeBokyrNJuIR#%ll*L!>QQkbAa)^UL9i z*;9=EFizhLTYIQC6YTW2v5(f;BcuF|J(p@+8aabSI{UOC;FJw%JrI1so9^B|) zE5YI~^wvAnqxsSxxtC|#hm(sBDu@kez}S2m2F*KTK#^O>1j<(3**ZU<@b43rJK_(Af_zG*7msij zpM{?xt(@;#t`o_c)FqT}LlirU7772VZd8%tZVY%t+Gte%)GxcJUA!6r%MarhJ#pMN zOM-qh!1`bkUr$r%vj#tYb)Y3NyVqXuUhcDvOxRimn#u`f?Oi^rF?FU77h%}wf$9WC;ajJqO^2|)NJLEh ztT|QBFyrFVKVS2FlM>Gf+(S?y_cE2$bc>fGtZJAf3SL#rrF7zt_aTzz-S`(w`|0bZ z8V<{Ot|bHqdd<#Ew#YOSvulr!N#Pz0p$xdcnc2G(R{=f6_Prs!Vs$)NY_>A>EG>I~ zWI^_+O(7C_BVweaV42K^uvHENfF3~a#VJtLMjt0jS;Wse@b`>|`qZ4X4?pK+_YKn_ zEzwADy?|=ZO2*!k?eZHVuIx_YLw0+9!_a-#K}6aBZNYCfOw}siMG;gTb3O+xMWU_! z$33=K?rpxqm#M`R5eHaXp-5(%*YxvGw(+AWX~M40v!TSS=WNoc;@rGcJ^`5|%OCVE zk^)P*R1Zyw^>iPx2pU3^RA;Voyf<5%XHkG}8s^e%uFyLP=;dt#6MyIOAmM8mNnJh(|w@$-E`bSFLM9_8k zKr^4veVud1)k6V_h(Q3O2u<0@@)v?03m;}O>eyaOErX~4Kw7aU&3?BtQRb0tg2ky zdGz+Atcqgq+6fL?wLY3wH03?}=+WM*cD@lN?*4tgSrAous))q>I4^#xdKlL3c)?GO zBWn@Ya*ZcpJXxw^0-UlkYz{R|KR5yw2j=QgIK};N!L?aKxU++L^yxd!v`4`0H$?Vx zyWmROY&$M_ifBx`noHOMBb!Lgu{0}bWRLAbbT=exRV=f@fl&#F^+HT%B`SpltT({) z*=h`^r589#J@%#5b_H*k8uQ7FaL*aZ=sDH6!;HJ9=GQTcT4Juw=ehJDZloPVYHc<< zrpjA+T#^J>dFF(Fd&W}j^Gs`>iY^7g2WzhZWRg(#a-2gv{rhKQ|GmXuQwryp3q5Hn z5m$x4P5Q8P6wX#ONr0X2#ZEE!OpB@J%Ch(-KrcZzRhGrP9ocu0GMAcTqNH<``ug}4 zJuM9mxzYItq>W879zzgCNxLh~2gTrYJ~TN5OQFKl&*-`dpb`FtpWmgm-A)je+>Nr! zjw970%|<%(A-zR&wZzwaXIc0Kz7G)zzkS7yzbB<2wL%lGt}TXy^~d9hb==}hZShQ< z4?GvZ62dkq?`GEJk+N}>Wj3HuS)5zVDSI0dvS##c%Aa`n7HKd-SF38!NF3I7V_!@gs-HNKnJ)9g5T$f<2@Qp zF-`2H`sGCstG*C1>RGIa+Sf;5fLfKBa76ME{5>Ivhd z%fl0$V;XGN;cRVGb2VBNS81#5E|Q+WVQ%Xvk$S7;?|94xjKq8n$qkFB2jFry+qndB zrJ9u}(!rI%7_}G6wcmFt3D4kz4aOSd>MDJ;v_W;}0vmoek+SVmwAZ5&<8~n)IBy}R zi}{*D;UVDIT6z`fjnlGa6rbf_Lzci1(~x(!cdhD5+nT#&+XE>9-0@H%-MWCxX=ovO zd9-(&$_q3H$@i_~guwOt&2`(u@yp9yK6EI=$Gfaet#!+L4N~xZkQ84$yPe9Tf_%ew zyf~t#Z*@y)9@C-+&vkg;W)Yz&Q} z$G$IHf`#Z=J_Y|;-Bhx?JAx~>cB=g-@V~CL;i~=5vJl(IwxPmP*0*@4W`8(sh1WLc z$f>PX10r-g(!I9sHiXmGKYJQRRozR`_t4H?c)xEm^$fzQUU2cRcblc-^R{AwOL z%9G|+Mjw~w7--MFT`JR~|IXYl60^1CV;bnPvFdZXXL&-I>fZjd%lPkkkMYx$6lUsB z0~lF>X`$~L0J6EG*ek|^?RAj8`+O}l?NHt|;OOwQeR5$$sqwXkLcc7!UkJZ7yW7Vu z{|81PprO5)pal8oO*mHQ%Y>o_!Jcq_!KDVF{e~+BaF8W`_XyuGam2|3J3CeFHm7A= zsAL$%)T)3&WusPI6ilzyNQjcZs7UG5c{GrlP-iOHk+2gWU5*oLpr>PBJB}@QvV}~Azqw&n=W7mUhA38kDquLK- zP1`s)NeJ4-s0r07*S!>usMKBFuFE&sxItxtk^9GJ69Hahwh$3Dzu3_3VnNC2R`&Tq zrC7w;*v_i}m5@Sv0ov;q$+bc?;5iYml5bk0(%L_~-Cfdia<}MO#Z#X#t;0P-#@Vyt z&<|C(y@=}p|$4iye`&+M-hrk{^Dg#kzWIt+F#=}+s;Zg&EC&CE%VwTm}+=T z2EdZ-P{YFGcFVrG;l=w?V*3zacH|cOE?Wtl_blof(U0iRz{ekUfsLCOzm8XcdZOQ( zX?^Zq6xB8)KQ=3gyd7a0Ud=wIKF_{PpADy*Ee0umL)#XvWRf=wrE+vyB>>4-E;vN@ zHca&oqb{#&l6gpwJ~fIytq*Rl?4Y$2iO%9K{>h6hhGv7hQl4`)*OeDQ0n_X|)4Jp; zi1gV)ZzY^GSyvO2t91P1u$G}`S2GsVW@85I;pYj(#x^CP*=%%dV`@}<}<}U&@mbkr+ zmU8P`zLp$F7DbdB*e5yxH`npkm0H&DjlPOA$`Pl=L=wP^9M!rUB2oU?_}$1h1~@^)TOU z*eK3(z(z1-E-ruAPd`|`RvvcIjLV2=YtDAFsoRtK^PQUSP}CdxfDkQ@`kbl52#+|c zM#AIuV-_3_#RThc{i1dbLc3d}h4Wcb%5byg9h?gpGjtX3Bl)Xc34PQUV#bOlHbnse zsQY0W2TIlceA(>L%cI%lGSR70-5?1Nx{--(L@po0*c>~BL?X%1-$09qs}dzflFI>J zVr-3E1cAqkQw3!cCB(w(HRoh}KVA*~A`6npZrPP&y7tdXqhz|lyJ9)p2qq&t5@lu;}c~-1~-WZuohnx)MbDvjG=IJCLwqoPU1> z12aI&e=w=zdu37YC<0@r7UyEGP#KTBR-_%eG4@}mtAfJ*{PcwL-K}mr;keB@pKmAx zv0qW{mBx&7NVPQZkIcLjr4U6PnuWAHL%VqxFokKA8Kg1A^2t0E1OUba>fT2RnL2O< zx<)sxXy*W$Klj zkFPlzk%8{{K=k%+nd&#&Vc9lk?CO*fyVS^ReeWRU`3|(go0C%W&gHwzM?F)}GP_)X zH*XB2&mh!LpTxe20p98qFFgUG@=0{$vfA^xl=bby3-dUEYPRR{T`=2|6Ue?vLAJ!y4$Xt#9kBUFGngg~mW~(jnD}omo*}ii77nYX+vzrv{2&WfQtK^%f z_vNK01ow>mIq`T=<{8shbT>M$>Mnkecx@o0Mf88u*Ba6F^*Rc*g=4-Ae{fJW(9maq znQvTVy^aqelcJoZn{{kv>cT1o!~E9QF>mSf7SH|`%)0?mt|R&8x0o76tNFJ6=~i3s zw3tlNESTVf1^PI`EqS}T$&Bh}Rf6L+mK{Fz_xGEj&-$!Z^Ew8^piH$a4}A3D-U9A| z>t29s%9W))4F;VsgYJ1M!;S@r>KeyXEsLR~Y_#*rw;9q3t~EK}Rp%wOs`cQ^zWFc) z{Q4;>NV5Krjt|J+yAE=(`@~;`+$Ox|$4P|NyZya*nX8Q7*icEg8BOMZO6YdgmtXDc z!|B!MePy0zM4`*YxxzE+80anQshHze<4n*=MeK_iv9+UZqkwCX%PXtg27^bDs88A5 zA^LizIbPVtphTb|DbwS>;;F*D`5_cUeSpfvNjsab|9KnN{Pl`}|7;CrXp(5JVcP|s zXH<*QWrny766ri8Mn%D7B7!;}%2%%Vm3RMdCieiL!Bh_UK;0d0wNGIZg;to|`=tw6r zz(HZ9{r(}J3I%8>I&!uuY1=2R6DQPYgH`+rV@=FC|MzlgPAa8X=x-6o8(KX6mbMsu z;%V{q@p88>Z=k_zJS?4bXUr;hS*5v`1iX_>7x^ejFDa1>A^c4uFTjl||G&6;%c!`T zXj?Rb1`F;Gg1fszaDuyQaCZ;xjk~*RaCdiicc;-tUnk#r_ucat{i6rF*IXOkJ zk2nWy_o3?Ad_m1mouEVrQh zHc)p#*XVe*Yth;a7C72KoT0oZxzgoX+oR)6?6yTc2)6rQlB}mtz=k$O>8D%pPsg1X zV$z%#I4sVq6Ci!!3V7BsNtYFrX`YE0=`U@6U)z=SbNq9Vf|;ez8gb8;Y5`X3ga~x! zZhzl6<+IyI`&dbc1<2OTTaeWUu^EAZBgtcy6`1;bU6t=z!umA&b^BEXI4 z4)wG*s5@`gLvFFkAom<)jOWtvBOTtmGC#jdTh-}3^@uPleAZlMf>1&|5r~+lf2F86 z+g+R_R{8?}rf)eNyBs}|+Ol<;Dcu1u9YX(N1M%GrzJo5q0*eC%XOh}qm4P{tBn#y+ zT%$fI*!xL{Y~oeqDDWVVliB$BQFT8|b|apCp(?;)EY{WoR-Fgy>8>@-NM8uv`LSA3 zfYT`AXu43lensI6ROP5MiEE@4vUP^5)L9b>6L>?E1dNeBCKc;>Hdyhm)}6B{2P2c2WLvCCrp08vil*n%-fYP>)yK8mtRlI3 za*|}3q7C^!@D6n-N#G+|27^1q#)FOpn;%8pmNMftThmEhocJ+~4@Z(t6Gzs4JgG^y za}!{P_wvNi2Q3HVI51?)POi(Nj8SnL@g*#*@g&mLp0+T&+n$T4bxRDJk3CPA(0r?b zwz@-LQlMBv0y6@i66-r#Nl_%6BjKs@R=E(41tOvW-eJhB^}vWBcx4rANf7?qoe*RF zASE$l0!F$Q)^&E%RVC5uIR`l4P-&u5m!Y5;yLf;byN3Sm5eJL(Qed#4-i>l?P7p&rXxjj<5TEr;J~Af{ z8H9e2Ehp_gHv$f?&wc=_qb_DTG!PiB)fF&;^o$9yX>}{KXy|vr_9*qI)JXF3IotN# z!SoVSd4?oM*EJ}&eY7aIdmPOtqYp-MaScp2Cz|``q&|`oIOT?ddW@h<|MjNSEAmnj zE5COa1t=c(mB53rzF`vuwHTjnzM8p$y3ypDW_R5))zC~#_(ndvZ8Em6s1 zOCCcrn{Oaa7DbxneVZoV8z~DOvFV(QO;vMrJYG=L=<@C|n5+2Wo;j^L!2cF+pk=X8 zO3&;55TkL2lf$d>1zED6(yL0n$k*{?MSG?G^85UCtHYvo&r5#4RH9_UNqvFGEn`mLF;m`ThAkobgHrptTgeT+_P2jvw)Z9<^#uWdPXjP!&KLFeoQ&fH=P0|glIsSHs!xocIGPxa~ zLTq4QP~bk^GLvnmxV0$E<#vAQZ1{onrgyc0hNzz9F{v2 zFh9*Tc$t*=GPave6?EnL$CoH6=jJtv-yYC@NdsG-NVNhoj3HJ)`>LBm#nXm+t2Ui6 zwFxW(G%CGgjsMNhiNEuc|L1 z)kVT#V=HbrjvrYqGL#fkhu@HxB*_qCai&WerO#YKr8yo9n#)xA(Ssm3MtC)yi}1Uw z!LD{pw?-E?$uFL3^->=G+m&~(4;zUjSl4W(OLB>Hx^#x3nUd=E@VpT%V>Bv*kEWx4 zPrI+F`t@azI4{?zzgC3FWZ_co&oXscB7MyMXrj25R=Onnud@m!{hr;}udN~)^`?{$ zYtO%9r!IZ-J)avm)LY$~uN<#tI0S)V)K!A&;mWISkMX3w_sSvR2S3v!muvTpp6@f5 z9;)~YykFfpYFx6$9?c5ZTzeVjy-S(EUX2+F1(M2c&ykD!QJdZ>B1%;%+6~q^^tg*v zF&O(2{LHaMh|d`{-e$kV0{eom(u_m?Wyn)Pz2w|l0v-2zGG zJ>3m)n9cJ`s~88`E|y5vQDL$Dx?$NF7r($!3EH8&wSf{k4`rL;fo__yN_!()+F2L$?+q z;4aOeUSSc*cu^|S0ZB)WIyLPO?L~_aCTER(! zNPvx638m}kVla>S?e;_Lg#<)}H}=SeHBVI~pfk`vGfe(x!t=#ir9Q~9VqLsNXvIr) z@@DVOcTwC+{C#wG7E${=8;|K8l3R z^w1>^4St{oKKZ7W15379f(A}_47kq&hZmp(^<3KIFu|=UQJJ*Uw@kp>QU(;( z7ngR)=6Pi&VuWpg;6O)lQZ5@2*78%vIUMwQSS!F%UEwKy!SZ*#{Yj{)^Q647zj1G8E~)EpIrNf!&>Hn5h>p7rckNH z$(l%-jiW+fC`c82DZIRV!Ue$*Z9ZQPNiUltcfA}u`@_z>7H)v5X4jw2s)2%x8 zieRH%*2l(b4W;TXMEH()W6-iQ?*2?-pqcFHu;*au2VVS9;IhL6Kwey(t3Cpufe2` zal1w{$>i`>)ap!rN#1DcR6VC;v-FaX@!w_x4{nT%B}HCCB4AQpP*_R>H}QZ^nbe%p z-U!!xzevf&n63x?D`&desQSM3N5LQ_Y;ShZGdEhtGcaV+mMX=83<+b1D!58c+&h@% z4Uo=)4dtS?E9b?K;PxhAK=soYdi4b=6*zj*tHUAkhVgxgtzSv)C>CEpa7J5QAA#fS zo5T2xQN4bYnkNgsVF+07GTQD#J)oO>c&z({3eC|!s98$VO}N5C+R%hB?85 z^qmsz?oLKe5B%bB1CjZfixc*SNSj|`ClKO-H^ajt~!mU?Guggr>FRoqX+onU4> zxe?kgaE{jx@k-z+U1tl&_cophdt`+2UHJA`1Ej6oHBzZYGj(0GD>Rfr=SkR-ChswW zWJ8a^gumJIzk%LX>3!iawU*`7-4zbTpKoY67|$8Pht znu8i%fJ3NV%b^ffCY&G#je=N#U7`rq)q*_9$p0(kxpi^BKJhoJ5ZsCv$gUfes{3_E z6(;EHTuVYyNWi}|ffd7KoSSVgzrz2Ch_zH1>|x|{db3q#&QX|7MJki)sN%wbIICQu zwUHpG?^!irHLuU}S&w188gPIn#31fyCUF2j@yKXFB%Myk9T~dQej375jf%xb-3T}t zCn~7?j0kr|umG)=9UoN3_6dGM2Fsu}eRP}NXJ-wY3B1QK7M5813ovB^Y@Ebw8FGg_ zs}_`adp8Lb2QzKglD3zyOZDH7Ghd;B@KM;J^F%8sTKtv)5%|oKEdqWU`4WaD3KfYn;XXFNVBnad+_bNx zg7DF6TY4{(6Cdm(ikUe>;Q~)=TP^-6GIe0kp5rXTG1m&~ zp+53{;u&TGOToR27~$))j5OtLPB++;cD4!vO3`@K6C+T)x1zjHK+wHv)mK&8-tB8M ztyxqT7ng;@;Xbca6=ieL-n6SjH=nB#1r>E-n;EB3B6!r8hHQv05?A)A#L;Qs3Ep?P z-5jR1V1qF;w9Y85XlTlf(EQykiumkJWM!Kn>+7qpp|>H)KcN_M$Jn_@Dj)Y3ppg`b zN!ov8VkJ&Jx@SMZH#BEAyPCcj`tv;N2CC=p0Q=IFc zQN-KESf2uCrV=ZKRcSPf!&UUHy=tB%3afNUjeCeqRpH2V^KVvVM`sV=V*@^W>@hdZ!v~tflJ0bW9U&0)Ly6yW zXzU?QUSz+Z5Y8Cm4Yy-@fPbbR9KjX7%>~8?bJW9#%!ezJRO+} zly5IUxxG6cnfcj2HsV48{(OLdf=^rW&R_jp6On+I zN57GWvelV1pA!&!9Ek}eg@T&jZP+->d#FX>G@=^oYr{+aoGq1!IKa!p@uOse0YByC zi{4RI+B0hYo!&wB(Ci|g3zU8Ko-7$Zv~-94q#F;%%WhC2<)ir5V#U@58f_lkvJrcd z{iB(MGEK}Ab!JC-vax>+T)HE8Fg`QET`XPSwgi9s8Ko8aAz?gOEFSkW`=)*QFi$YV zdP)*9N4to92uVdRhu6Mp8flVJ!VvH>q6siK;C;GvCd=aDCa5=;ZJl)hOMp^z^Ng|~ zKa1SQ93Q&{Z8(`Om@t?Q=GMK87+g|?|A>$`5|y+VYY^nUmJ3ks}a4NJM5mwu=~PHm;d`S=)3*mhZKZ z`T%l~U{@pYl2K3Du2dmm-V-d%nDcrd=Y7N?Tn_&MM_Jpy067|!q8yu{=U=hmx z<@7q7q|MzhBe_PENKL%IMXgP~UZq;rLT#V1!Zuqr9?7t_m-a3@7h(|yt& zVItn1zD6qvet$)4Hzb!!^V0GKjVROx^w-BC(H7>Bg( z*}L6}5DClw5ythx@WEqkzhRc?O2y&s!D#Ey&stDU&P}Ba#P;{;5qtuRyxa{9G>pDd z+{5674r26g?Ostu)iPor#~&!x%1l5lN;(N@8$!x`I=0P7gA>gIswxXE17O2vrU^`@3OY2zrY|SNC{&i>s_&7(e63G_H`XAj0{yvpn zV;qaG6a+AiW}7NHUM6AbvqhLZD@{^2W>}gv-RK&*eFVK43W#=!hu1UD-vN zPO{EhUHO}Hb;}LcM0gIjX;MikUCMJKQFW5@-YmT@)rOR7sW*D(89|$puj&nbyV6D8 zT9cAq%Q@42vrs4N{MTN?1pMYaqWa23Hu25Y?<)s7Qp_?AF8OnuB2TO{J04Mhi=v?Y zC<@0~p{-#BHN~D7S(JH{k9DS8nM}zY9n*{AV{kF>#XpK`&oyySWCqU0`&(l~6OK&q zmJ>_`#F^L+Um!#ncdlexXq1zi*lf^l%-{*8Y_|1ElfD3Y+OGV&5ABVTr|7Gyw6wRs zfV^mz_*FRYD7hg+1qP4DRs8$+7g?P3KkvV%vKJ(RYir}#)0qm06O>j6Wa&9s6e9z+ z%j52I+G>q+U$Efa*EzuAc4I6t`Q}JO{E^r(;bjG`(tO%EhZN6m%00ckw)Pfp4U1Kp zVvLWLS&E%WnVd7WVbrVJ`7EwC!@k7NO!9B!ZMBsO4Bs8;z8p!I`bd_>i@C+eu7q02 zilyw2BsM^ooyO0><9$G<*#@BMlpOT7d?%Iyfz`-#S|b(%0Zp^aNUKNrpDB-v$NK5&QSI~d$06m58rLf-0SH?7to9o#<@%MWsR9O07jSmCJNh`4zH%D(WlM9wnoJKYn>~?UH_|= z-V7?79j;;Kf$dZeK?W0r^x^TpWhgs@IQkt{qYu|2)#NKj0+`0zlWneLb;eB=eNV2d z1GAWmsWQKUDId;c6L~#iUzv$W*z~!vIDPQ-n0gqmC1O8AbxRnr98JiIg-W!}^>ks2 z1<|k(NjN?Yq^Jigt!B7AdQ4`%)*2>tR6@*&1T9J|UquoIx7cSpT#_&u*~x`ZO#{|F z_PTr>J1OWG3>r!G=9uK2@3_z~1NGZS8*%w3U4Mt{WxYw1Ob!Gk4kYK=$ukIHNADNvVDmwk(uRi24 zDSNKRA%<|&>*JwacqEn zULG%&cYUhtBTyLz%(wT4hCKAk!dEruzATxLJ4}9ewu`7~vPU^Jcy@eH!MLbMemtL` zIeE~DFG$OZP%=y(2u$*?){E>-XZ#zWu1jXGJ%USSAZ!dzQ|-%d_wZ#c2O)FjV&CAI*zq2LT={GU2z`wpr+p_`O{l zgl0`64q#h?weN5c$H^W+t@Tye9QY2pa+!G*qqJF?kJAmi$w^|7ZU~<*%?SDL9LH9X z^>pxlYJ&&C%bV&c7Dq0pJ=oHQs+r_n^R*ZOvY&C|pWDmrR|YCB@R=~u;r~4A{%;2y zu}HB0O%x7S-1I-7@_!6Nz#cK+zk>Ik#zmd|4vysie0Toma+f?Y*p47CXu^mE22T?r zcKfHW*sa1&y~G&i&!mV@?%R!D_m{H1jV$+gMz$ose0@)eq6GIuHIP{aSO5|QG<*9w8!+Y=;}1R_9`dV?^%&1mvTLXfISqaC$W&|C#I>RxK zZbt>O`P*~>t3DV?3rq`iVJ%}s+A&lxz-)aZdrxB3A0D|k zamLF0T*b!qYY-LM1{+6IyT69V=M7OXI3ZlR)_fwt=c}RiN>WDL?h2q+FP=rYEF`uB}tIbv@Vtg#hzKB0BK2HAMp$NwI zjsjrE#G+n`G`_$7nE#h?O*$C1K)u&to6pMs?+Est{Rnn^&O*$yd{Qe%&ITJuHxHVg zUn((*>1K8`{N6wQgSLdY_(ovtX8pA#@XuS`$)bGYByXNYgvF1KRxY2}1zZJaKJCGw zp=X0Cmp?V^Qhb5e+L%T=TDk4I8Rkv1knU<|J+P1BSlDk~G&1;WAcE=(o@cTUBZY|m z0z_YJ9Yh-ShRrJ;&|7e{YJTMb$F^zs*!Uz24C2zePabymPXp-KGUDwR6tP^6qB|D> z>$c?0`iAMu;ZN=6+I3UPg>gq#zrc!v;?d1{5^cpwHPrL5TyLAmbutU~0n=TTs?G0U z!;9CQqgcD^use;#Xh+Rv%WMtYWtfWL*L7#5#*R zO8e>Jr4+H^Hk_>c_(i36q8XNNlOLx#&aardCSFHHY-6=HEowDcR@m~K|Dfk`^lyUT zn9hrebH3=oviT=^7+tWOX^|*6{GOOpVrSv@VYklUoXpBC%~zhKdJ*|%$|*nYs5HSa z*WrEGLw}#kOZ$|)-xNF?Wt!31<|!k*!#KdweKNv#B@xe-A*Q8e3$sJ%M^k(@p)hXE`LUkmcVgm~lkdXGDUj(bPBE~EuyjN@ zfQC4ADJgCWPcCH*(5|!My8?Ryaa2o`f7?8*O2BrM zY=Tru0zt;8>CVtoZD%o@b^X&nw58=4ei_q1;vXK+XX+50Bcjxu@CSn@fF zadh_u4(VYq!wLzhA1jz^kOLE}2srl|gEYj@(m6Tcw)@h96=X4x{GdW|QSsjBQrI17 zyy(SG^1=FNZCbm%yJcj4jc6RUMBcn4jd5MPsA6ioF?Hn+x-t~<1daryGucv4DIgK0 za!0;Gf<2JZPN|@jA{2kwe#bQqPb#%$Pc5@xdE5&c7DelW_133PBo1##kp#dE2SL_u zGv2T7hEb`mm+KCbuNfZQHw1R?SBrLmil*K|iOhZL0Bswbc#%mlo#?!6RRV@XBocv7 z*JNFv_%}fMjz5Kdqd5MIJrd&?yL{bJ_G;;%*L^1Jr0#qSOd^R99}3TU!oDOsLJsb~ zz={5_nTNw*2H#u)dlg=p%JquJ0~_5XLU#4kmEHDoSS2F-ao!${A!~wCqY5^_7UZqFPzX;9N~Mh_pf$fMeC#VJ@m#+#6t`Kj!6m8|L;e|x3GNU z2#t81{rF=)z(#+7WnuF@%=Bu!y}J|j?>d}&f1`iZGDHfQj{A4@MI1tH>s>tA6&bee z4x;*cj!6}vz#SoT$Uw2kc!?p@Z=#lWJvsbmK;6TTNhX*YW3yxU+U^*ida-I?ygV3d##ICuYnWQ zlENA&VcZ(OgGjJ3Yezr9ijNKyni#J}%k>S)K{;uuFhZ!0Z--)!W{my9Anokf&hXF5 zxjq(`7~~E8WG29=-q2J_bsSjk@`cmS^I+wv&;=11N{Dk~DYj;~F2&GRD3i98n+cR{ z`VxY1FR`xmoFePV!UfeVQwF20h)A?NE+0vh^k684jO3#-t+uq0SW{Amo@s=UL|So1 zE1Y(&txJX~LS}EUP9hk~%#!u%ptiO_{}8L@5-X7X%W1a&;E;KQ*P?2kF(F%PHoX~Y z<8yD^L6YL0@_>`4Mu9R|M8UaVSC{ItE^@O?uux-19B~Z~7)zdMkt(woSx;L30ln2& zX`fd~bRToA{=lFMj;y})56X@PncspI@gTD0>=+(_pVfPJ^F#&Xq@NykC~%0#k4HFi zt#0?!C!6hKIf9EEVdt?O3#juPOpc{qyBCE)vlEDQ8Q85Dk;TsCOY)X#gRk&- zs?_&Cc8CTGY6y=JRa9HPUguy1we1Sq%`^$u>~f3&lT^H35)w$&$E%LlC`T7NudP5m zQiQ50vjhqAXVKt8Lfsa*GecHX-=Qz4yg-_^77kofd|K+_ccpKLQD>g`zKY)lld~4u z1T4j%Q^gEv=T6E{JS_S;xKv&=XR|W-=j!$D0(lIQYBP2-{ z8_ZOk_nWdZ9=hV~4{jqypXeeXZ~{KSy+BEz^|mcRPzbuz+&oi=21i9oPmT>!^FIRG z4z;y`z9u$OnpG#)7V6R9SjoFi_sjG_q&%$N3 zZEngs?%Q!Wqps-?0hjXW5F}G-5HFpxtST=NiGTA(YHC+w=d;g#wX4|M0Nmx24cqH< zxQBp+h15_m{~SG`$Gh*#bfeGWi>0?>@BWqqIMZYc!d7?LO!YBZ{!LAf8Sk$@L36>1 zz&%v2r)~>P`9meiC*;i0c6{Itxy{h~OGedk&@%HAXFaiwz$b7HCAlhwsqXSo%3nr; zO&7|p{$rw3Q(b33Kwqjc06cN8Q=e+rv#=1$CNNZYcAHoF?rSgY%xNOIFG$9SDfe4l z-WYJM&3#{herJM~N%0-I)i{KEN!5BiUbs(GvJc>+EqpeLlV^Nd>RM~jhsYnY9;?$w zCdE)^S(d$qfR1iysij;WAC32mVlc#twCfn@?eTqRveQ-@WuZ`!x@i_*mh;}|b5H38 z+P864rK5(Eszl$_&`=L&%WsLy&O{5tk68G8;~?T-xo)IKKtz5t%POu>x#wAcrv<(L zU235Y#be@(nyV2nlQ}KbWK@L}DlKkENZ=aA0@|UMsXUNYnDxsdoqolMsNP~1BIh+_ zD4Me~q{9YN`L5hq&YdA>n-QGuUBBx25=QYbd_iG=`>Cg{NpC8@``?%mJU*fhx+@gE>T%x06Rt7-#>c+=Vj97 zrhMClqp{|^Q#>j!*cKlTKRG}_f&dsJmA;S*#P_VOh2}y>qZ)(H?hYs|*qaM!-kSbz z6tTNJbF8O03wGX$`*e{L_ez;;j?5j%{nizMl7MyZ$5aUMZyOLz!)*UkuW^@BNv01O zq|wS#Qut$vvRZH?I8O#hyT~6S)3`-t zK9NiXK)l^7c96;Pd+pLvU-+`bm?y-<5FX9yJmbozfz5`c|Asb#2)M=w7le0%YcLD5 z?-?-cW#(|RgfI`tpK4dBb*spr>v}EG>~MJJ;3Q@8cPD5uj+%llumUYE12FB;h24E{K&nn9+LKJLK%2PM>y!Le25$dLStth#*0 zIkBCQi0u%=6kK@Nr4X?{cBHWZ0B>-Tf4Z2$9{R~WBQ}JW}8g?=;YguDhaR2Br1#N z>Mk$vsaZrZ?~|Ab%@)*T8*u-nuPgA{Zwgg;OUG%pDqSf3J1kP zpJQsVZbDPsxFv|ECyP`&%pqAek?7t{TeniM?w2JMEeN5Le(zvn>JipB*W5$gC^y4c z4Q{B_;>beJv`2}}Z;o`p$+Y-riQzhP&|VZp+(u=`F- zJohL2Z$Hgb7vdRsXi7d+I%XBGmj3i;;ZkmzN)y*^YE z^GNf?j@8z>Kfa!rKr9j|$ZT^i5Q~NFtcv%3`COy9;8mi?g=mGLT32owO&TRIkvi@ZD{8ZJWV0>>bH@&jyXYS&wSZhNo+CHJiEx+69FBPli@|E*VP`eMUs?B>o0oBOdRh{Q)>t`m;g!%Nw5!JW; zr2K-spB=!2cLIq5g3?nuC!h%XO!T!>Nug&oJ>A6$d zk17wALD5(2j9$;$X7YV^-6&4}8jMP)0}~sU#(|4T^0Aw;lSv)8p&DM37AGtHwaSmg z_G{|xC0x!QC$u}=)mK63)eTb<;7qEbom5$0hc|p@p&B39i4hyBg0EWj$Q$ZN6|6M! z0R4_t)el>vi%_o2PS-*95hVoa`YyTX54cYE(V()nWIBNarBu_yJuwK-z3`RoF8xea~e2PI4nx98O5&r$>D z-yh3nyr09FfbZVgneK~Ly?F#Pxaqp@^u0ifPT<4Y4bKV-#3R8xOUZ!%J}%5*AJdZEiWddFE`CUgvHu<80pEbj7{(m7N{^EAHe0 z(0q46Ia2(wLd4+i<0FbG%_mR4O*N1~9r(UKC9@kFWoygg>~DfzIX%&?WINh*z2BtX zMFEaC7C!IFpvd>DvL_PV&TEzP)C_nEU$~xi7rOmL-6Pz( zurAX!7;E7d@&Ou9RbPIXaZcy$arOPD_r;$}uEd{*VlJpfOn_K_v1crb@+aoE{<|hJ zJ=9sZWlm3xOt+KaE<7~K({u@(G@0!;@pl8g!)v)-`39)96^DU)Xqn_I+KWdgtt*#? z4xyVH1|id^Q%g?1sYmdsziVn1aD;=BC%>FVN1jAXCDvUpH2NfvR^AZv5XKHTjg#H) z-8gZ)`<;dt!B2saR8JX!5g|c8rmLT<+H`1JzprW&mz5t1;drEbT7p-V@)Kaz_s2mx z>0&YFx^ih>gv-b2#WID@1Qvh8av z6%G~XE+=Il-GmJ{H`Z@bl_!=tGk?;Ly!g?_!IJl)GRLx$aN5OP5AY7HyK9SRi4iwz zzVDSwh6=gQvzCK=1+@qJb3LeVCcCDL96z6D_IZpctz>2m+0k7}4eS&;F;shNy?g%r zMDmpo9L|JUS`4vdWWUKD3tBgsvtltG9+Yurk|=m)blVE-)mN0hPqFeK4-o%6g(VED ziT9RS^-w6f6RD}Aw<=+~9HwHa&-l#N3Yv%Me^833{r_#dGD;o!9eIbQVnqYOpm2o?15uSfq4&OMZhqM9uLn~rXX_TXLh8nst_ zs!u)4K9=ktk+FK@YoxCSa82=4N80*ra=)Gr|82o#aW7ETM@Ev%1m$UEUuoEGI5TSm z_GT*9xE$m7;3dKy{(@Z0w-f4jPCvd~JS#b+VdZuZynXD2Zg?(d2-|{26Mxo9gj4Vm zft z{H87c&HGH4=J{@s`hngws z^Ip#r{(KW4srxrCT)}`_4xfPPW%R$)#+=mF4SmNqemu2V`W!A0a*X>cpJ`QAq=d;A zU^8aN)z(*^zxnlF)}pz>rPlqg)!8e`d`f<~njg~?`rg<;9hX9Ie0=OK^)gHO_omTZ znzFwk-!vzad850ce&|&lQLkp}Td%7&blF*k^_tXP+kIJdR>scPEB4=NVO0io4e%}6 z(o~sq%8lD1cv<0`ur^s6I!IMZ%rO;Ts(I<(?6(Y9FHcNVmc;v8Fm9Ycjqh63Y-81E z(v+qHbah|dq?GN$pj;jW&!&SmPx>F;Aqg4k;1v=RKf%9PS)V6+b<0|hPcSwaj8(q& zoomj_K70giXY_~76?k-G>)N0zt(%q#^S!qtU4rIG>wkiB@Y`a3sU~K*{)F>^Lx#QT%&|^aHEzlsiN4B_X ziVLuy@*7pjr5qGmV`+*@J;>2mX^}1p#=mM{!iZg^1M3`;?6=S|(~x%VmaUbGjVuNN zEU#9ufeWu(zyv*=1@ev$F;%=i6P#3O;w~mn;JS9g&1fspkE%aXZp&-8;nZmN(Wh&w z`>2cA3xA^T_TO!_b;5`D=LK}BIcZ&A(qJio0S24X-(l_4pg=#+K$ZA-c*E(n)z(_s zWbq3Qi4|6ssS3$*JHvEU=63s1OhU27Dg}a(Xj0%F#vz^gW^;9xdbNOjZ^Kq5zhdH& zMu{{>+F9!DD#6O_ttx}&f^h;eLG=esrM`}z;&L)`w6@4u;=b}5vx#`w&Pv2YcrM0S zWsYs8qT5KA(A@B!rX1~|6;7R*=DGrrW{c#*kanfp=hE~)ulo+T2ME||H0A)JkEb|j zzYpr^E%0}tNdDj*N!h%NrIDP&IeaY@s!SLmQMuA6phf;h~Bip|IhZj6k%pm+a`((k&Gu_!Nc~7XdHn&F_s|`yp z0RM77FBeQCr(>H+n#SS8D&f-?_4+F6B#%AJw*&goQ-2p@=K}<{YgC)0%1lIL9_3CS zRNEeChHXt5Wz^RM!iiCt8rioKF`f90%nQ_{3|BizKv@l*jUhg_cgMoycEdJa@JpbV zS@{2qb(f(sIBNTabBY)|DmQRnJ7%2H{z@vJ>zlg+VlE^aLcUMN`SxUxeGy~c22Jb0?0=G!U`{oZ(ub5}Vg9IGSW%&^t}#zP#RUKIHQYiTFrQUm`57I5 z3}I9yVcI^MzOH5u2btU6K*C-~hG}jwmWp2egh3wQG@<6Tjdu`d4CY^0`?-DqDmuE% zs3M&rBFo9GqzYK4Cz$p)NDwr*2TOAeZy^gRzdlF;yy}S_VJir!e-VIDX9)C1zV0Y7 z0xU?_;<;>kH)t9Pf%5j>6poTP4kxE_1t6L~BrtaPCm+#3iTEX!Mid>j1GdGuY_zM3 zLLDMs2ZwF6MW*EtZy~Wq6n;bI^ROy(QuEeT0e>gvsQJsZ7?Ylty$<={&XLLEmWd0! zKYv{J84~&Ky-2k?pWantBK9jLbQEy=R4bXPfh&T9I671MZh~!ZIp=a!?C^{K`;m1C z4-eOr(E34L)!O+IBR`Sm$>CnMC}4DCNX{-I$dA*?Zm`BHLACx&t{K{)Tp>1iz*C6q ze)MGWLts66s_Zk>aB3f!@t}qVLy?nKiwe&yAA^gq8x3}C{T1>!X&(KRsHdnbS9baP{XGOLi3bboUiTLb!vA!MsI#lVWIUDWWvyvD2Ff8%9EK^a4Io zN`Br-Yn2+q7~Ge~s|LL6_Kl^llDPBo@EJ;8=6t}$%AB&1yL) zvbtww;j>$<2Hi21eogv{Vc>ZGM-PWrztx-(2iV>4GMVKv+y?zVwW!&K=<{` zvCv~=ivf@btUI{ACZ!sd>G_lFZWSLaMW?5z%D{cZ9$ADQkPe+(U(ao0Y9=suQ)k5)7|yTZan&OuKNeq%d^?r*S@Pr0{-Yj3m2jbO#BN#!s!Yh^W+WE0NQc2eht{ z#aJG9)HWJK?J3ram`-T5%pLC|i);c0^!ouI2v`wM+)4{>E)#_kw%1FNB6f#}4w(ia z{SddM5{L2n5rl&nd*Gzi<%Kzbn`Mw3|NFgmyL#K){v=$Vjsonsj3M9lz_*mSr8x3K zk9oo!hi9QStUt{SwhrYv%@%Mp3|ZBPV<5D#Ye5n>vjZ%qKVKF`7_IqQBk@!n4EC{@ znxLt6L+J$^5N_}dB_S7tCWHU27_R;L*J&vJ#mT8yLGxPRb$~@J(1EE$_B6~DZ|OAC zfNNSt*RUAQxQzcU`Tv=k;5WWdxn-Tf_8lhXTOmw4f@EmMzfFXj3~O4 z*f>^d3=MxZRppi-DsbO3klz~GRXxJpk=C~FmbK}#?c|aFoVF_mOG>4F(4m z6(W~t(W!3rOHQ{q4h}oOvMqQ#p!$LASu4q^rUj4s$j$*<&jCM zAi1W9VtC^ct^1v&C8{CIfyBkMboF@8jil5cjGSDY78p5l_SjjH92IjJqhw{Yz%5#jR%G^>W584zd z`U-zx8hQQM%J7Hb$|s6U)%^C(!5CNLQ2t6&RS9~#9jYEF!U*?9ZYc|7 zU@HNpSm1Wdk=VogsC;bC1Cy#at)#$?ruevK0o~~OHRWNIMFx|+4#~GjsD&O^fgK07 zxCDg#Bb+aGkAJL%?R*OhO-DR->BnCpb6R(4VUKh3bxbf_#HmINy5 zZ=wF~snMAea|9|>wD?L0Qn~FUPjxtXsRhK&_?&%{;djVav+!CzM(2XBWnMY_s+lN< za`2=|_OmB&B1%HW4>Df}R1CzBt%hNDhO3U=$??^NZ_z0) zk4%A;+rur#vWA0-aSY^peLj^aBd|aiJR*#t8YjeS-wIr=|EIm{erl@e_X>#8q)Q7( z2kBh`NC_Pj5J9@p5PDA(1f+=+5dwrNAQ*~B3nX-DqDTl$iZn%vG^H0o>Gz<|`@A}H z|AIR=bAHI|?ChM`v%B9<%L(G#>f=Wt*nyGjA9~rnqP3%^F$T{d=>CkHj{7p4CqM0<}YGi#`0jlY>Wuy>XU9aJCPpP|_tn!X2ZOT(t@S zm~i{1DbJG(-~SY-rt$Qu-<@@Nineq>gJ%_r!pPH}Ht3T##)3^5oV89Yx3*I0c}Kx1 zwN+PwqBz%* zJOXX9Y!Zgsdn0I=RY@(AZG&mP+nD-+Ux5}|=0$E#yB!fMHl{8Ws%EG_w}1%f#YYFK z4>Q$M60IYVjTd`yo&1p84>CVx>(x4Nla!zu5?pvrkAAL-HIm$)vgf@pA*{Kt-Bk0< z{fFS;xUVlDiRT%??FaYDfT~t*4c1xaq3G$6on^Jfm^!eTWkF<$QtmC6o5!AA8kNzD zjGR@<194ik%LDCDrr_S-=`TuGs+25ZzH#7#PSB%M*!uYJo(&)DkN>#AVGG>sfo#cldnpEs;#wxhs# z+68WbA|vT`IC}z(sgVGOxDDA4JTxIs?>#(Co)9ehwJJ)nY%#qiF7vSg3U}e4St>gs zG z#=6K++y!TVS;c9GiYUdUNa_S?P?%u8JQPfQ%L~LkLf5Xd@F#+F2I;044_@fYpEdYn zmGx1duyM^)u+AT)Ane5nrgJgv3Hwc4elI;aQec(#BsicF$xw{zKP zL&f#fdjr|CYt>#vpI|^P0ib6*T4A3zjGZjif;xr0Oolv?&~wwooh{QKGe(%In4R<; zeHS_5g&DTrBB~V!K$aUpXJq_ue2bkkYA+nbyXyHv%;C=N?a6(Qx~IOvt;MVoulg3~ zK#|2tUqpk{?+C;+EgP1G4tCV-IE*ga4#zf?2GcbZRFK}w2;{o~z$=I6=H@9I_2KW@ zx*Lm{NpwjyJ8)1_NSQ#o{aiB5OVZDr*-}XAr&``3B{DH?33gXSX}fgVow`SPj44C* zMQ(hv*4UC$m3Qhjmdc3tWiya*1DSdFQw>j?_1v#D7+iG-|^F3 zilCVh!VYX}dwM;En{|M`Bq0%&oh=dKEzVo(H4#l2o_Zn3r&~$+s+{eA>9;_l3%gNv6}Z3c10=JIx3PC2$0<&8?Yp-8w) zwtH86EOh_`P0@OiGlMncM9Y1At$Q3-GEju88~*r_Vb@Ubp!uWn$JzF3(T{BxEudcU zM2aJ?Te@6_K!7J9>5;Tkv0G~#ZF%|5B|q8t6i^{r2by8uE!2e-{*iifT^Wo8(3g_C zktJc+y6M9Zc1gMl)zGsYjrIC5S%oak;u@6q+#VYIEbz=B@chJw4c~8pF>dQy>GL_i zQL1p#*gq&$;H!i)3@pY_#|`)@_cR!YcjRbJA4?kzQa>XV_zOlo(FGK}cU_lswf@{Y zZ6|xjXA^w)&%N_+*ALIh#D=J--b1FPt6ugmFKEwhm@A>@0Vx>zdyqYv8m8ZGyV{w~j zVsUKOW)u)|;UjkoenZP@eZhya+pmptQ8bw`|58=^v}l`4NXw2=4Q$~gH}I1I@OCH1 zrSO7$33gWUx(}R8=C-Mc4RJl_5CUp z{xUg1K7N8N>=Ey*R#`56)&=v_L44Sqx#k5!48)ZITocotg-Cw}tr#apw>M`@uJ^Xm z9)zX2+1NC&@0XScve_w=o5l?ypLiyHmEZd~wuPhycfFLH5riWR3rzac?hIzk97Mk7 zyquUWtK6Vn&fJTU>~fS}t&f$AhzWx=?rw{hvnhV=&$9HlwX!Ss-n4$4zfhSm)96Qz zoLh}EpVi^MV>^Qk|@asx`Bw(b&#% zGVS@Rk2~!=lFW))lj)Ty{q z`woI1jr;KIxjCRmkPDrX! zj6lS4q;6_}VPD&C?Mj5FMn?ro04Hg4iG7XYbkSN^c5R(K@ET8rp338^&VdWTD07*u zx)fU4e5Se4g}t50k4$I$eF`q&x8Pp4Z%C!<-Kff!8hMq zAzxhZn`OmkstP?b?kwuEBvd192X@EVA3&u>q!nF2X|EoveqA!z8t~NX;Uy$g-5Vi6 zu=o6+4c0+LLc!UvBOpFOXMaMKvOtl;DkoG)rG8#d|2aJcK$Yk#+tV|jh8`=vco%b#c!Ph+Ots-*~_O@oRLv*X@_15aqP>$6u6eowdX3(9t`30vK z-+8{oa7W50q_P)_DMs~VPmlJey{A}#fHjuig@SltwE9f28>J4TOpoIVQdgE7XHB0= z{-pBJJraMSz;_lA8&`!H)!d@+f0Hgw`h!lWn@yC^p{=;HZvE2xhk3Bn`)S(DE^(^u zh*3>9D!0>HJ$MrotsEgR3E^gUSl=Bw4mfZm6{tquv)Q@=GnnoxK}d!h+nyXvq8OxE_d! zFVfXlW0+(hbY>9g$P+~ZM>w{|UTMfms_GQBR!F*)yu#Vytko*7An(=*_jFli9IRQM zf7tmL%Yh4TO*cT~Mk8pJbqF5%Ivo)b61xK_!mk_`@c8DrE;^Do>#VazpR={NHz=BK z;+m^o2^#uCvzcz`5C&hUTuP1&P94THY0Jv+=z1>eu)@LUv=hwLs6MS}s@2ol zzSjLZGK*rn0310G?&yf4uf~`{RI*Djp zjR^P_Q}^YO*Di3_aJMwSN}_$&h3boj*-SyLQ2mr}TTK*wgS-<$33{OtT&w>*0On|< zP+QZ4ypBpy{!KbfvY@0=xtPm7q@_O&4_`Mos&>c04pAN|&u{lpPJarOV?=ow)E zk#OvgA?W?F@cQIV*66iju*shl$B`RAYi#&#>A%n#4ePI$Ak@9-aNZnCy9ZF6nLyQGIzzj(K}dM;Kp`FQNoQ^eLEPxW|BO4lm|Be9YC; z?m5XUyJdHeB=H5N;-Q-;c*jb;>D+@dP&ngWrTYUVkNG-FG3_idX3n;n+rp<>kE`Z= z22FCq?h4e|Y{uMX0m5-&Mqk~0J^PdOBVx|aCou<3A6cshj>sr^Nr%{lX9*yvw}nR% z>`TvdrONF%*g+@8hd_miGY=P zVX&t9$~#(arVKh9-_L}I&)4&9JIOwhY`LoYAjP)2YSf3DfXEN`_P(ux0Y#zscFcGS zun!`cjlw{+A~uKb@o*8BdHN%U&NrQEqY*H&PYFj4AV`P3!Pn^P56<&n$-ZB4;oxhY z3a<%4UFb3K&a<~!6s3%_`P%zi=z?Inv-33$9>ipY6O9~%A^e=wAhGyMD)_o^WiPGbA?L8`)$SDoUOW2XYafFw>AU=nd@ zvO44AWCyw`Jw4%he``&VK%~6|Gf4QA?fkD2%nvL?A^-JX-o-y87NERxKr78NRq~L; zb1y9;TvFL}w%_!D>+ojaK8d@a1;~->v+$OL_mz88)l}Pz?^sAI?QIM9lr@bYsy-@H zt5?UT#b%|MG|Nuuc-JoL3C^cdAsdikIz;ra>380TCjNc8%%cPoQ0CP@4{z=~ z+}V9o|4vA28g_hAl9+%hu~l7v03k=h5yQ$T(uB`d@N?5nmWRx~eoej!vyGRPzHt&x zcUXy_;KQJm*PYso@QHg6KuNO zeqK$}e$Wxxaom@F#c5vFPy>8j&ka^q7fG@^v7Y>t(1_*K8?jC$N|cP3@kA6O=O#Mf ziUcJIx8Bm1rHi)hsSTXZ(&Yv0r=8%icFOpZL_F;3>*0VWKCh|c$RtEg=nK+0e)1It z?N=NG1kZFE#$Qbo>K-D~B>k4`b&eHnReYB+s*08|ZWJlQfu+aA28X)~O3I(+bVTj%`p^f^{R%*?+#pOp!jFCqd zN07{89gKzfc~|^Hg0odn7C}u{_F96e6{A2Fv(_7n*TTo=W)78dcprCOj-L_oUK#OC zwHpN0vW=Usm>$|$5O3r#=1W{`ae4o=S(IIwT{#lMxh;kr{WKND2R3CX%OvwF+-NbpKnJlIDFK|Fun+jXL5F$0w9*Q2^Ng|66AgH67w@ z;r|W`j1P=_;pa93Jn)Y~24D_)pjFy{Tob?_zk?UQET#ZJ2rEzH{`9vH77IwZ@z-To zDgVN29}EFx)}*!k<$==e_1V={FlxVtp0l3IzTJo|ECyWqW^cM_#kBRT+hXoxE|V5z(-%(NDB+O{qTPPtWcv- literal 0 HcmV?d00001 From deb0ebf04cb22e9ddd8bddb742077b7bffde5ec9 Mon Sep 17 00:00:00 2001 From: Mike Hume Date: Wed, 21 Aug 2024 10:25:05 +0100 Subject: [PATCH 3/7] updated readme --- .../Readme.md | 12 ++++----- .../example-pattern.json | 26 ++++++++++++------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/apigw-rest-stepfunctions-express-sync-bedrock-sam/Readme.md b/apigw-rest-stepfunctions-express-sync-bedrock-sam/Readme.md index 3f23b8688..38743d130 100644 --- a/apigw-rest-stepfunctions-express-sync-bedrock-sam/Readme.md +++ b/apigw-rest-stepfunctions-express-sync-bedrock-sam/Readme.md @@ -1,4 +1,4 @@ -# Amazon API Gateway HTTP API, AWS StepFunctions (Synchronous Express Workflow), Intrinsic Functions, and Prompt Chaining with Amazon Bedrock. +# Prompt Chaining with Amazon API Gateway, AWS StepFunctions & Amazon Bedrock. The AWS Serverless Application Model (SAM) template deploys an Amazon API Gateway HTTP API endpoint connected to an AWS Step Functions state machine. This example demonstrates how to invoke an Express state machine synchronously and utilize AWS Step Functions intrinsic functions to chain two prompts, which are then used to invoke the Amazon Bedrock language model. The output from the state machine execution is returned to the client within 29 seconds, using the HTTP API. This no-code example showcases how the results from the first prompt can be used to provide context for the second prompt, allowing the language model to deliver a highly-curated response. By chaining these prompts, the system can leverage the capabilities of the language model to generate more meaningful and contextual outputs. @@ -50,13 +50,13 @@ In this example, the state machine is invoked with a JSON payload "prompt_one": "Write a 500 word blog post on The Beatles" } ``` -During execution, the Task state calls the Bedrock API and the response goes into the task result_one. +During execution, the Task state calls the Bedrock API and the response is passed to the task 'result_one'. ```asl { "result_one.$": "$.Body.generations[0].text" } ``` -A Pass state is then used to pass the data to the next state using an Intrinsic Function (States.). +A Pass state is then used to format the data using an Intrinsic Function (States.) which is passed to the next state. ```asl { "convo_one.$": "States.Format('{}',$.result_one.result_one)" @@ -77,10 +77,10 @@ By default, the state then sends the task result as output. The stack will output the **api endpoint**. You can use *Postman* or *curl* to send a POST request to the API Gateway endpoint. ``` -curl -H "Content-type: application/json" -X POST -d '{"prompt_one": "Write a 500 word blog post on The Beatles"}' +curl -H "Content-type: application/json" -X POST -d '{"prompt_one": "Write a 500 word blog post on The Beatles"}' ``` -After runnning the above command, API Gateway will invoke the State machine and return the complete results back to the client instead of just the State machine's execution Id. +After runnning the above command, API Gateway will invoke the State machine and return the results back to the client instead of just the State machine's execution Id. ## Cleanup @@ -93,6 +93,6 @@ After runnning the above command, API Gateway will invoke the State machine and aws cloudformation list-stacks --query "StackSummaries[?contains(StackName,'STACK_NAME')].StackStatus" ``` ---- -Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. +Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: MIT-0 \ No newline at end of file diff --git a/apigw-rest-stepfunctions-express-sync-bedrock-sam/example-pattern.json b/apigw-rest-stepfunctions-express-sync-bedrock-sam/example-pattern.json index 49ed60a44..9ddf6081b 100644 --- a/apigw-rest-stepfunctions-express-sync-bedrock-sam/example-pattern.json +++ b/apigw-rest-stepfunctions-express-sync-bedrock-sam/example-pattern.json @@ -1,18 +1,18 @@ { - "title": "Amazon API Gateway, AWS StepFunctions Synchronous Express Workflow, Prompt Chain, Amazon Bedrock", - "description": "Amazon API Gateway HTTP API, AWS StepFunctions (Synchronous Express Workflow), Intrinsic Functions, and Prompt Chaining with Amazon Bedrock.", + "title": "Prompt Chaining with Amazon API Gateway, AWS StepFunctions & Amazon Bedrock.", + "description": "Prompt Chaining with Amazon API Gateway HTTP API, AWS StepFunctions(Sync/Express) & Amazon Bedrock.", "language": "", "level": "200", "framework": "SAM", "introBox": { "headline": "How it works", "text": [ - "The AWS Serverless Application Model (SAM) template deploys an Amazon API Gateway HTTP API endpoint connected to an AWS Step Functions state machine." - "This example demonstrates how to invoke an Express state machine synchronously and utilize AWS Step Functions intrinsic functions to chain two prompts," - "which are then used to invoke the Amazon Bedrock language model. The output from the state machine execution is returned to the client within 29 seconds," - "using the HTTP API. This no-code example showcases how the results from the first prompt can be used to provide context for the second prompt, allowing" - "the language model to deliver a highly-curated response. By chaining these prompts, the system can leverage the capabilities of the language model to " - "generate more meaningful and contextual outputs." + "The provided example demonstrates the deployment of a serverless application using the AWS Serverless Application Model (SAM) template. This serverless application" + "includes an Amazon API Gateway HTTP API endpoint that is connected to an AWS Step Functions state machine. The state machine is designed to invoke an" + "Express workflow synchronously. It utilizes AWS Step Functions' intrinsic functions to chain two prompts, which are then used to invoke the Amazon Bedrock" + "language model. The output from the state machine execution is returned to the client within 29sec through the HTTP API. This no-code example showcases how" + "the results from the first prompt can be used to provide context for the second prompt, allowing the language model to deliver a highly-curated response. By chaining" + "these prompts, the system can leverage the capabilities of the language model to generate more meaningful and contextual outputs." ] }, "gitHub": { @@ -25,6 +25,14 @@ }, "resources": { "bullets": [ + { + "text": "Amazon API Gateway", + "link": "https://aws.amazon.com/api-gateway/" + }, + { + "text": "Amazon Bedrock", + "link": "https://aws.amazon.com/bedrock/" + }, { "text": "AWS Step Functions Intrinsic functions", "link": "https://docs.aws.amazon.com/step-functions/latest/dg/amazon-states-language-intrinsic-functions.html" @@ -47,7 +55,7 @@ }, "cleanup": { "text": [ - "sam delete" + "sam delete" ] }, "authors": [ From 04c7ac34951dcc3a67d630b266d83467b1f15bef Mon Sep 17 00:00:00 2001 From: Mike Hume Date: Wed, 21 Aug 2024 11:02:37 +0100 Subject: [PATCH 4/7] apigw-v3 --- .../Readme.md | 2 +- .../example-pattern.json | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/apigw-rest-stepfunctions-express-sync-bedrock-sam/Readme.md b/apigw-rest-stepfunctions-express-sync-bedrock-sam/Readme.md index 38743d130..c984145a0 100644 --- a/apigw-rest-stepfunctions-express-sync-bedrock-sam/Readme.md +++ b/apigw-rest-stepfunctions-express-sync-bedrock-sam/Readme.md @@ -1,4 +1,4 @@ -# Prompt Chaining with Amazon API Gateway, AWS StepFunctions & Amazon Bedrock. +# Prompt Chaining with Amazon API Gateway, AWS StepFunctions and Amazon Bedrock. The AWS Serverless Application Model (SAM) template deploys an Amazon API Gateway HTTP API endpoint connected to an AWS Step Functions state machine. This example demonstrates how to invoke an Express state machine synchronously and utilize AWS Step Functions intrinsic functions to chain two prompts, which are then used to invoke the Amazon Bedrock language model. The output from the state machine execution is returned to the client within 29 seconds, using the HTTP API. This no-code example showcases how the results from the first prompt can be used to provide context for the second prompt, allowing the language model to deliver a highly-curated response. By chaining these prompts, the system can leverage the capabilities of the language model to generate more meaningful and contextual outputs. diff --git a/apigw-rest-stepfunctions-express-sync-bedrock-sam/example-pattern.json b/apigw-rest-stepfunctions-express-sync-bedrock-sam/example-pattern.json index 9ddf6081b..7a4f772dd 100644 --- a/apigw-rest-stepfunctions-express-sync-bedrock-sam/example-pattern.json +++ b/apigw-rest-stepfunctions-express-sync-bedrock-sam/example-pattern.json @@ -1,18 +1,19 @@ { - "title": "Prompt Chaining with Amazon API Gateway, AWS StepFunctions & Amazon Bedrock.", - "description": "Prompt Chaining with Amazon API Gateway HTTP API, AWS StepFunctions(Sync/Express) & Amazon Bedrock.", + "title": "Prompt Chaining with Amazon API Gateway, AWS StepFunctions and Amazon Bedrock.", + "description": "Prompt Chaining with Amazon API Gateway HTTP API, AWS StepFunctions and Amazon Bedrock.", "language": "", "level": "200", "framework": "SAM", "introBox": { "headline": "How it works", "text": [ - "The provided example demonstrates the deployment of a serverless application using the AWS Serverless Application Model (SAM) template. This serverless application" - "includes an Amazon API Gateway HTTP API endpoint that is connected to an AWS Step Functions state machine. The state machine is designed to invoke an" - "Express workflow synchronously. It utilizes AWS Step Functions' intrinsic functions to chain two prompts, which are then used to invoke the Amazon Bedrock" - "language model. The output from the state machine execution is returned to the client within 29sec through the HTTP API. This no-code example showcases how" - "the results from the first prompt can be used to provide context for the second prompt, allowing the language model to deliver a highly-curated response. By chaining" - "these prompts, the system can leverage the capabilities of the language model to generate more meaningful and contextual outputs." + "The provided example demonstrates the deployment of a serverless application using the AWS Serverless Application Model (SAM) template.", + "This serverless application includes an Amazon API Gateway HTTP API endpoint that is connected to an AWS Step Functions state machine.", + "The state machine is designed to invoke an Express workflow synchronously.", + "It utilizes AWS Step Functions' intrinsic functions to chain two prompts, which are then used to invoke the Amazon Bedrock language model.", + "The output from the state machine execution is returned to the client within 29sec through the HTTP API.", + "This no-code example showcases how the results from the first prompt can be used to provide context for the second prompt, allowing the language model to deliver a highly-curated response.", + "By chaining these prompts, the system can leverage the capabilities of the language model to generate more meaningful and contextual outputs." ] }, "gitHub": { From deff1ad776ead118ae8eb12be660b10b30b69177 Mon Sep 17 00:00:00 2001 From: Mike Hume Date: Wed, 21 Aug 2024 11:08:44 +0100 Subject: [PATCH 5/7] apigw-v4 --- apigw-rest-stepfunctions-express-sync-bedrock-sam/template.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apigw-rest-stepfunctions-express-sync-bedrock-sam/template.yml b/apigw-rest-stepfunctions-express-sync-bedrock-sam/template.yml index 31dc8ddbb..f37b37af4 100644 --- a/apigw-rest-stepfunctions-express-sync-bedrock-sam/template.yml +++ b/apigw-rest-stepfunctions-express-sync-bedrock-sam/template.yml @@ -1,6 +1,6 @@ AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 -Description: Amazon API Gateway HTTP API, AWS StepFunctions (Synchronous Express Workflow), Intrinsic Functions, and Prompt Chaining with Amazon Bedrock. +Description: Prompt Chaining with Amazon API Gateway HTTP API, AWS StepFunctions and Amazon Bedrock. Resources: From af22ddc43b3bbca05749b020ec89754088f73966 Mon Sep 17 00:00:00 2001 From: Mike Hume Date: Fri, 23 Aug 2024 10:18:59 +0100 Subject: [PATCH 6/7] apigw-v5 --- apigw-rest-stepfunctions-express-sync-bedrock-sam/Readme.md | 2 +- .../example-pattern.json | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apigw-rest-stepfunctions-express-sync-bedrock-sam/Readme.md b/apigw-rest-stepfunctions-express-sync-bedrock-sam/Readme.md index c984145a0..7bf1f1476 100644 --- a/apigw-rest-stepfunctions-express-sync-bedrock-sam/Readme.md +++ b/apigw-rest-stepfunctions-express-sync-bedrock-sam/Readme.md @@ -1,4 +1,4 @@ -# Prompt Chaining with Amazon API Gateway, AWS StepFunctions and Amazon Bedrock. +# Prompt Chaining with Amazon API Gateway, AWS Step Functions and Amazon Bedrock. The AWS Serverless Application Model (SAM) template deploys an Amazon API Gateway HTTP API endpoint connected to an AWS Step Functions state machine. This example demonstrates how to invoke an Express state machine synchronously and utilize AWS Step Functions intrinsic functions to chain two prompts, which are then used to invoke the Amazon Bedrock language model. The output from the state machine execution is returned to the client within 29 seconds, using the HTTP API. This no-code example showcases how the results from the first prompt can be used to provide context for the second prompt, allowing the language model to deliver a highly-curated response. By chaining these prompts, the system can leverage the capabilities of the language model to generate more meaningful and contextual outputs. diff --git a/apigw-rest-stepfunctions-express-sync-bedrock-sam/example-pattern.json b/apigw-rest-stepfunctions-express-sync-bedrock-sam/example-pattern.json index 7a4f772dd..2605c949e 100644 --- a/apigw-rest-stepfunctions-express-sync-bedrock-sam/example-pattern.json +++ b/apigw-rest-stepfunctions-express-sync-bedrock-sam/example-pattern.json @@ -1,6 +1,6 @@ { - "title": "Prompt Chaining with Amazon API Gateway, AWS StepFunctions and Amazon Bedrock.", - "description": "Prompt Chaining with Amazon API Gateway HTTP API, AWS StepFunctions and Amazon Bedrock.", + "title": "Prompt Chaining with Amazon API Gateway and AWS Step Functions.", + "description": "Prompt Chaining no-code example with Amazon API Gateway HTTP API, AWS Step Functions and Amazon Bedrock.", "language": "", "level": "200", "framework": "SAM", @@ -11,7 +11,7 @@ "This serverless application includes an Amazon API Gateway HTTP API endpoint that is connected to an AWS Step Functions state machine.", "The state machine is designed to invoke an Express workflow synchronously.", "It utilizes AWS Step Functions' intrinsic functions to chain two prompts, which are then used to invoke the Amazon Bedrock language model.", - "The output from the state machine execution is returned to the client within 29sec through the HTTP API.", + "The output from the state machine execution is returned to the client within 29 seconds through the HTTP API.", "This no-code example showcases how the results from the first prompt can be used to provide context for the second prompt, allowing the language model to deliver a highly-curated response.", "By chaining these prompts, the system can leverage the capabilities of the language model to generate more meaningful and contextual outputs." ] From a474658093bb7dcfdb310e3676f9d67984fe6ef7 Mon Sep 17 00:00:00 2001 From: Ben <9841563+bfreiberg@users.noreply.github.com> Date: Fri, 23 Aug 2024 11:32:20 +0200 Subject: [PATCH 7/7] Add final pattern file --- ...tepfunctions-express-sync-bedrock-sam.json | 101 ++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 apigw-rest-stepfunctions-express-sync-bedrock-sam/apigw-rest-stepfunctions-express-sync-bedrock-sam.json diff --git a/apigw-rest-stepfunctions-express-sync-bedrock-sam/apigw-rest-stepfunctions-express-sync-bedrock-sam.json b/apigw-rest-stepfunctions-express-sync-bedrock-sam/apigw-rest-stepfunctions-express-sync-bedrock-sam.json new file mode 100644 index 000000000..ccf58fc88 --- /dev/null +++ b/apigw-rest-stepfunctions-express-sync-bedrock-sam/apigw-rest-stepfunctions-express-sync-bedrock-sam.json @@ -0,0 +1,101 @@ +{ + "title": "Prompt Chaining with Amazon API Gateway and AWS Step Functions", + "description": "Prompt Chaining no-code example with Amazon API Gateway HTTP API, AWS Step Functions and Amazon Bedrock.", + "language": "", + "level": "200", + "framework": "SAM", + "introBox": { + "headline": "How it works", + "text": [ + "The provided example demonstrates the deployment of a serverless application using the AWS Serverless Application Model (SAM) template.", + "This serverless application includes an Amazon API Gateway HTTP API endpoint that is connected to an AWS Step Functions state machine.", + "The state machine is designed to invoke an Express workflow synchronously.", + "It utilizes AWS Step Functions' intrinsic functions to chain two prompts, which are then used to invoke the Amazon Bedrock language model.", + "The output from the state machine execution is returned to the client within 29 seconds through the HTTP API.", + "This no-code example showcases how the results from the first prompt can be used to provide context for the second prompt, allowing the language model to deliver a highly-curated response.", + "By chaining these prompts, the system can leverage the capabilities of the language model to generate more meaningful and contextual outputs." + ] + }, + "gitHub": { + "template": { + "repoURL": "https://github.com/aws-samples/serverless-patterns/tree/main/apigw-rest-stepfunctions-express-sync-bedrock-sam", + "templateURL": "serverless-patterns/apigw-rest-stepfunctions-express-sync-bedrock-sam", + "projectFolder": "apigw-rest-stepfunctions-express-sync-bedrock-sam", + "templateFile": "template.yml" + } + }, + "resources": { + "bullets": [ + { + "text": "Amazon API Gateway", + "link": "https://aws.amazon.com/api-gateway/" + }, + { + "text": "Amazon Bedrock", + "link": "https://aws.amazon.com/bedrock/" + }, + { + "text": "AWS Step Functions Intrinsic functions", + "link": "https://docs.aws.amazon.com/step-functions/latest/dg/amazon-states-language-intrinsic-functions.html" + }, + { + "text": "Synchronous and Asynchronous Express Workflows", + "link": "https://docs.aws.amazon.com/step-functions/latest/dg/concepts-express-synchronous.html" + } + ] + }, + "deploy": { + "text": [ + "sam deploy" + ] + }, + "testing": { + "text": [ + "See the GitHub repo for detailed testing instructions." + ] + }, + "cleanup": { + "text": [ + "sam delete" + ] + }, + "authors": [ + { + "name": "Mike Hume", + "image": "https://media.licdn.com/dms/image/D4E03AQEiUfmBiUOw_A/profile-displayphoto-shrink_200_200/0/1718324029612?e=1727308800&v=beta&t=ybhm76l-CP5xcUsHbdq2IaJOlfyycvQ6gNwuCSd3Z0w", + "bio": "AWS Senior Solutions Architect & UKPS Serverless Lead.", + "linkedin": "michael-hume-4663bb64", + "twitter": "" + } + ], + "patternArch": { + "icon1": { + "x": 20, + "y": 50, + "service": "apigw", + "label": "API Gateway HTTP API" + }, + "icon2": { + "x": 50, + "y": 50, + "service": "sfn", + "label": "AWS Step Functions" + }, + "icon3": { + "x": 80, + "y": 50, + "service": "bedrock", + "label": "Amazon Bedrock" + }, + "line1": { + "from": "icon1", + "to": "icon2", + "label": "" + }, + "line2": { + "from": "icon2", + "to": "icon3", + "label": "" + } + } +}