From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ed1-x52e.google.com (mail-ed1-x52e.google.com [IPv6:2a00:1450:4864:20::52e]) by sourceware.org (Postfix) with ESMTPS id A5EB9395562F for ; Thu, 2 Jun 2022 09:09:12 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org A5EB9395562F Received: by mail-ed1-x52e.google.com with SMTP id x5so342013edi.2 for ; Thu, 02 Jun 2022 02:09:12 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:from:to:cc:subject:message-id:mime-version :content-disposition; bh=jXT0Bz+waOdeiqTvDbCFidjx3vYHKA1Dz4Hgq3iZRIg=; b=fQXDieFosbpB+EcIAUgmC+k3wHwfhWxNld9PcfkV022WU5IbUnfMbhN/98xjhnE3DC ytyUWcb7U9PxlRNpes9hTbxdC7xWV23GSm2HYqeZ9ucNqGqplXIe2r9JSZXzFgh46pQt 0WyLU8OHjMQoKWRd/2X3uhSTrLQEvQ5coejcKHkUyllJktIP8/2k9O85HMyUUQyvs+eF zdBz4KkZdpjy0WL5v7pfDRF2l367J3iOVNswNoT9r/+zypq4+iP8RYpNF7ewrxXoYNot fAHCAp6ZyY9pXUIgPDHWYRoDuGkzyyEl9uNLvIUSrc0O0QvxSjcsbpDQgIVMGKW+7GDI O35g== X-Gm-Message-State: AOAM533AWUbTUhHESR6F58Shx6i42IXIte2hrOdqHxpgZLaqJ6zg8tK1 GgwQNVNQBcC2Oq8HiFG1VCng0pVwk+8XJg== X-Google-Smtp-Source: ABdhPJyfZIWj0rjDpCgh146vYV6VfaZIFH+FDhBbNRw4ZlmpIEU2oa5gb9ytSWJGmv+QyurhHHUxsg== X-Received: by 2002:a05:6402:249e:b0:42d:bb88:865b with SMTP id q30-20020a056402249e00b0042dbb88865bmr4190098eda.141.1654160951132; Thu, 02 Jun 2022 02:09:11 -0700 (PDT) Received: from adacore.com ([45.147.211.82]) by smtp.gmail.com with ESMTPSA id qw8-20020a170906fca800b006fed40e5564sm1523266ejb.83.2022.06.02.02.09.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Jun 2022 02:09:10 -0700 (PDT) Date: Thu, 2 Jun 2022 09:09:09 +0000 From: Pierre-Marie de Rodat To: gcc-patches@gcc.gnu.org Cc: Eric Botcazou Subject: [Ada] Get rid of secondary stack for most calls returning tagged types Message-ID: <20220602090909.GA1010923@adacore.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="2fHTh5uZTiUOsy+g" Content-Disposition: inline X-Spam-Status: No, score=-7.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 02 Jun 2022 09:09:14 -0000 --2fHTh5uZTiUOsy+g Content-Type: text/plain; charset=us-ascii Content-Disposition: inline This eliminates the use of the secondary stack to return specific tagged types from functions in calls that are not dispatching on result, which comprises returning controlled types, by introducing thunks whose only purpose is to move the result from the primary to the secondary stack for primitive functions that are controlling on result, and referencing them in the dispatch table in lieu of the primitive functions. The implementation reuses the existing machinery of interface thunks and thus creates another kind of thunks, secondary stack thunks, which only perform a call to the primitive function and return the result. Tested on x86_64-pc-linux-gnu, committed on trunk gcc/ada/ * einfo.ads (Has_Controlling_Result): Document new usage. (Is_Thunk): Document secondary stack thunks. (Returns_By_Ref): Adjust. * exp_ch6.adb (Caller_Known_Size): Return true for tagged types. (Expand_N_Extended_Return_Statement): Do not call Set_By_Ref. (Expand_Simple_Function_Return): For a BIP return with an Alloc_Form parameter, mark the node as returning on the secondary stack. Replace call to Is_Limited_Interface with Is_Limited_View. Deal wit secondary stack thunks. Do not call Set_By_Ref. Optimize the case of a call to a function whose type also needs finalization. (Needs_BIP_Task_Actuals): Replace Thunk_Entity with Thunk_Target. (Needs_BIP_Finalization_Master): Cosmetic fixes. (Needs_BIP_Alloc_Form): Check No_Secondary_Stack restriction and return true for tagged types. * exp_ch7.adb (Transient Scope Management): Update description. * exp_disp.adb (Expand_Dispatching_Call): Always set Returns_By_Ref on designated type if the call is dispatching on result. Tidy up. (Expand_Interface_Thunk): Change type of Thunk_Code from Node_Id to List_Id. Change type of local variables from Node_Id to Entity_Id. Propagate Aliased_Present flag to create the formals and explicitly set Has_Controlling_Result to False. Build a secondary stack thunk if necessary in the function case. (Expand_Secondary_Stack_Thunk): New function. (Make_Secondary_DT): Build secondary stack thunks if necessary. (Make_DT): Likewise. (Register_Predefined_Primitive): Likewise. (Register_Primitive): Likewise. * exp_util.ads (Is_Secondary_Stack_Thunk): Declare. (Thunk_Target): Likewise. * exp_util.adb (Is_Secondary_Stack_Thunk): New function. (Thunk_Target): Likewise. * fe.h (Is_Secondary_Stack_Thunk): Declare. (Thunk_Target): Likewise. * gen_il-fields.ads (Opt_Field_Enum): Remove By_Ref. * gen_il-gen-gen_nodes.adb (N_Simple_Return_Statement): Likewise. (N_Extended_Return_Statement): Likewise. * sem_ch6.adb (Analyze_Subprogram_Specification): Skip check for abstract return type in the thunk case. (Create_Extra_Formals): Replace Thunk_Entity with Thunk_Target. * sem_disp.adb (Check_Controlling_Formals): Skip in the thunk case. * sem_util.adb: Add use and with clauses for Exp_Ch6. (Compute_Returns_By_Ref): Do not process procedures and only set the flag for direct return by reference. (Needs_Secondary_Stack): Do not return true for specific tagged types and adjust comments accordingly. * sinfo.ads (By_Ref): Delete. (N_Simple_Return_Statement): Remove By_Ref. (N_Extended_Return_Statement): Likewise. * gcc-interface/ada-tree.h (TYPE_RETURN_UNCONSTRAINED_P): Delete. * gcc-interface/decl.cc (gnat_to_gnu_subprog_type): Do not use it. Return by direct reference if the return type needs the secondary stack as well as for secondary stack thunks. * gcc-interface/gigi.h (fntype_same_flags_p): Remove parameter. * gcc-interface/misc.cc (gnat_type_hash_eq): Adjust to above change. * gcc-interface/trans.cc (finalize_nrv): Replace test on TYPE_RETURN_UNCONSTRAINED_P with TYPE_RETURN_BY_DIRECT_REF_P. (Subprogram_Body_to_gnu): Do not call maybe_make_gnu_thunk for secondary stack thunks. (Call_to_gnu): Do not test TYPE_RETURN_UNCONSTRAINED_P. (gnat_to_gnu) : In the return by direct reference case, test for the presence of Storage_Pool on the node to build an allocator. (maybe_make_gnu_thunk): Deal with Thunk_Entity and Thunk_Target. * gcc-interface/utils.cc (fntype_same_flags_p): Remove parameter. --2fHTh5uZTiUOsy+g Content-Type: application/gzip Content-Disposition: attachment; filename="patch.diff.gz" Content-Transfer-Encoding: base64 H4sICKR9mGIAA3BhdGNoLTAyMy5kaWZmAO19a3fbSHLoZ/lXdHLPyVArUiNSbztOIkuyV1lZ 8pXknexNcnAgEpKwJgEuAErW7O5/v/XoNxogKHuSzWZ5ZiyJ6C50V1fXu6sn6d2dGAzu00rE P96Pxz/Gk/jHJM3u8s14Uorb+nevBoNBqO2rjY2NYPt/+RcxGO7u7/X3xQb9PBDw1Twef4nv E3GK7URavhKvYBwCPr+Oy+g4z6oin07T7D66SsrFtFJP4XOS3KVZMhFpJk6j94tsXKV5JpKs Sqs0KTfFdVKJ9E5UD4m4U0/TUsRiXqQzaPOY0Bz4o1vkd9Ciiu/vAXL1PE/E00M6fhDjOBOT tJzHFfwBzQoazearjW+FII6mZS5KGGueWdDKZJxnk7h4FmUFKIJZLLIvsBCLdFqJu7wQ5QLA WHPR79+sofARcZJn0acivp/FYQzG06mHOnxJLPH5TH/xPGLxGE/TCbyZoOGybm+PRv0hrCv8 st0fHYYXVr/2aD6fwmtElXuvvSkWCb2pissvhDtYrmwCc72lP8zMzsroBjFirWDjZDRUADMv 8vsinsG7H2Ig9SKRiH3NX6SlBbCcIRy7E2P/9ploKvk6h7ElhRywXm4Je5w/JoUFLc2qpLiL xwk3gnUvAUdFheSC4IoFDHiWAJnASxEzmenSl6O06OObZtvXs9140Wxx3Ol4MY3didu74eYh gdfRK59yoPu7O/g7q8SXNAN+QnOGkby20YJf8HIr2reHZ3bBpjhzO5X0HrM1mhZj47stRvJs kTNu6ikPJhHznBpiJ/wzv/19Mq5ET32dxTMY2d9XD2n597h22OZ4Y8OCBq1maZZP8/vndXFX 5DPYcIYZaAZSxbfTRL0FmYD91AZH7eKyzMdpXMG7n9IK9/A9sIzMxtQbxSt5HYhRKpZiw0N0 Fkm1KDLcm2qCksUhmksHW8wBAW5mgAdwV7Ygj5AQmqZGgrXNsF0junw0YGN3pMT6LHBA/adE +ZGmOWY8RKiLEiCZJseSWh7gjylumaqILVjxuFrE07K+GGOYf5neplNktNPkMZnaO+lbZ/Rq wwJ2HRYry/bPJBdZXokswa9zC95tIokBHuSZN1Z+xe2iAow8JgFRVTLdWPCahOQZwgaaHMcl bEDVAtQC2qKlmMUTtRvKxIIXemcGGC6g4RSwrqYkZ9EwBwsgLnts9ggjDfrPgPSZddCI60TL yAB9Jm9cW9VEDcaB4Ql5ZLDibhrfW9DCGhMOk9WLZqWiouV1FBCPMZcuHd1wz1n8jCQwfoi1 MBIlvBoo8yl+fu1xAkIadqF97hJSHB5cX3IW6lEqxgCiL55KeFVc3CfVpqsaFOljGk+jay3N uio98KUtAp9IiiWws5ArwZtv88kzqTw7o50haLAbO6PdHdBoWxSeK2aW0btnWJC78EDMO5lf qkERuWnK1SptkDP3WF9jbjKo8oFWSBHkumHaikSBcRUJiWUUajxJm/Ul4xgYnEgB75IgaWwk GW6fB7rvgL6Gt6setsZtAQQVYpqO02r6jIyzDBH/psNaDLRCUzJvOEAZiY0+vhYHqEZmj8ui iSvc8mUSvUur6LJANebfb+NSCqc8mz7/ZzOBFDDEYuKui14JqR0/xIgUDf3Vq1eToEH1dR6N H/bAHLq1TSTzrW9UWU88s8p6QobV3g7ZVXseMSK9oniKjh/2iCaFZaigvEqK6DdZ/pRF1+nP yStJSWhMsTQT4rW4yCdJdDZ5I58KZiu4uSp4ekoYgOeKwsS7PJ8mcfbmFSIUsUoqKSBLrqLU 5nG5JojqtOJ1ZCSWMA4ldIBIkC8VyR8WaQFsvTO8TuCEBOcznkWJmOulm6ANZDlYO0UaA7ti /bAAJWc2z7ME2dHTQy6JSAObJPOENFySY2Nk3Bn0LtdJhhnFuS9AxbTlLIlvJEUNineyC0ZJ YjmHwNhh0Bc5YOApEbNFWTF1bO3u9ocjoA/5yxIK+V4kQM3RpuJex1UxheYwYhgsYFRCxTe8 FbbgOiruFzO0Fsww1vW7PwO+bCj67QjlM9oo02cEcoM00bNGiiBeMWe5TzM1KDni3kUuejjA deK5pLCCJDmRBEUACCC+fn1d9RZIEckUqABX5QKUiTLSOlZ0TWvCXd4Q+ZoXLmuvmgszHuzS Q/FGdCMn6DX2PrrvJ9gshNFleF6XmAYqrjMIhcFB+EPEtru7c9gfbokN+mVvOa15Hz3Sz9kf QF+O3p19is5I8VY+HhpouLP59OA9BerVsBN7l0V6jzpDhCSHRAGM+vb3sLpjnDDP2Syp2oBX Uuo9sHI8GaTZgC29gAR9NXABgICQIp/eB4BgeWdIhANr6EA6wMhgTXGWOD9aLYllZzDn+RjU fFbwZyxIFYcArgJmJRpOAXNArsnBnlyTg9Fqa4J4OppO83H0Pi9m8dTe72/8gTo7yxn+uxAC S2JRjhHRhtLOWHWWsEiTx2V4mwPi+OXYbkxk789N4WJsMPGWkLu/PQTkbouN/e2tg/7woBW7 r6zBnSQAhNaJp4/mDEkbtOymSXaPEoFsYFYEx3LrKplhaBahAdcngwh0ZBASQFVP7H8xsF2F Dw09NKlSloqxDUsa7bEWNGBCzBOgrCnYIjmZqwCvl2aTdEzUJjEH27Sifjaw1IISizEKhsVc lON8Lp19ASMI7bz1TcXWVp+eQY3cXkh+YMNHn6Y2JxG9axwGiq46R4du52h3JZbxT2wFOa9u T/t1Y7V3OZ3k/IDtoZ9WqrvjaTyLlTc5aFU/S+tlPM1xMTxot7BhvzDVTPN8jk4HQBh0iEv5 himtm9IF34gc1f+nlBVuD5pkd0/5Yjrh3QrjS2dkOeciiUHiknmoOwEiWLYhWzPcowUFcm+f qvmgVGR5GF0pCW1kqGD5lN69Ma/VrFQt2m/T5Am4BMlJ+T7zsmwxnb5xtyNoADC6Z3IJIGqI NMnMNTTm+bXU7oQRjxPJDLa3UROHn1vLVfHGsZzdaU6EGxSZBBnXxklK3jRtj015zuIR5kwO SnsD3sIIEF1PKVIMUhnIVbDCyoT5YpZnAxuAojnpPnIBiZdD0jPUS8WuNIsqbN3rLENVewoM Wqo6auv5a8nL80biH+xyxv9Bv50Vm3kdKaUM9laVkEbEntdMpPdZXsBsPoCqXxnTSRsT0kK1 oflblQ3zZ95hoOIjY9PsiVHRogxK+nWpvNe9g/o4WuRZrV9tKdYNgi2GeMboiAgdESsCNhOV PbwFQqx8XLDHks1pae8oaTeQ0s6yrZC3s6XDmoFc3YMt9Lrsb+8f9A+77S626+UCX2XZZuzs NkXaCzDu5hXQ7s+J3HplIv0/rgfCOF9keMASdxJYjCE9ZCMlu6rSn2N22tluTB/stEhimEOe ecC4mSLPMe9+sEvvFgURlCWQ01JJ2smmx8JXHhJ7YmG10F9z60uEGHk6SZBcOfa9UeaGg6Fi 6ozZA9Y0A3uNgOiNYUAmT5C4eU+8t2aomhP57OwcUJwSftnvD4edNDU5yMsXEwfh3oOmnHFh f3MXQvGopMH53olWPFDJ13EyJ6c2uo0RqtS40d2MXydZuSikfngPhpXhhnEF7HNe2w4Zx0LE IssSfD+OD0XtpugdjaUIwe6/R2vAbgS70oP1VOQkhs0yULjdU437cnHc0X0BO9YD95A/SY0y 5hGte7T5LXitUTCSFzDRZjvWo+Mab9fKp+lCrLbR8ryoW0ZsFlG8okzBGk7u7kiH0dGGxBjO gDBR5rzSLL7Qg1XWAcrdrqPE0k1FcR+KrsSwI59p95C9Ae9FAZAvKvomAJC3G21huXcPDkiw 7xwM+8Pd7rzfIo2eNFMe06JaEOXARMFA5A17kTuMY115oD14RFPKaJJBWFj/OfqdNF8EMwdM ysETIljGxm0HA0vx45+iyyJqZFkhK+Hdt4mp/1qZsMqmqVkcWozZOn8XtDmKj+s7C+6/JteZ WCJW1F60X+jpPQL9wUAJRVJzJZznY/Wr5cu8zhcFmIyfqgKdmdeAT97Cfm90QsC7vd6OJ/Rj /AX0ZuDGeYEr0IMX9sUPRz+sv5Eu4S0QgRgygF8OOlkquC535PkoLc7mKPLkRtTWnaF3DMTJ cVFLrTmqDrZlV2t8QyE+u7FjKx3nsxlROW5VNbnDYX+0R7M7HPVHS9kFwDEGq73O0ce4RA/R YNDm+HScoLzR9e5rhStxpKbW6kzf6Ay1GzxaPe2c53QucVSWScFu5kY/hlqH9TeqM31zs4pf /pS96RYoSQDfCsXy8G98y8w2XAORCR/TZsgJpYLQihvMGO9paXsPXKexs42sBAgMIUn+SrOp M2QKcpZuUuGmDY4DAlaagOeutnMfkolKHZRT8qScNDmeidnfSgWeHHxxLe+iTxwSdDvQCAk8 BvdVeM1yQDiTQbeByjUq8lzOGpW07IcK8xpgqjOgT3JUPf+AWWSoP1vgbAcNzzzLsw6TZ5c4 9bDBSV90n704jB3TyUXDYxoHIuy+67TsS9GBaysBUK4QqAokjPVg8a25pJ5SqUuO7yZRzmmZ LUnDa5pi36IBwA4IvU3jROftb7gyisQro/9EoIpjv56vB9napZaIvZBIVGxgvea354/lSHBi WLqfYQPfQDY2MTjeqw50oQMTWjcSaWVThjO+lYgkSBnO+NqJhHgOb1lmEdDOpw4b3MqEojUt K0LZiT7qkcogdZDrrokE5OojFHQwtoq3JVFIFYgcbg2HBxT14t9G28u1gBahjg0C4tf2bneQ un/dEteNqTcYsXq3v/lWCW1Re0hCS4OE5HMCW27SLp+DO7sun9NS+ySbDJ28sIHVRPeK8rq2 qX3RvZq8tsGFBk8upqf4uWRuhIiy4AzybKCtwSlaAha4Bia8Eue14blMOC5fJJvt6b5ANvts 14FX58C/KNv1tlIL561tupcxX8PclvNcm1u25r/tB/Pf9hvz3/Yb89/2df7b/h76hDb4R5jL 71u23k0BNJqiM5lCF2AsZ9CaAj8dDT1p5THrqTQ4jmqj66RIOA2DMt+1Ga7D+aDWqibslNLg MAaSTpOCUnxxcwc7L3O2aHA6VlgfI+y4ORBlik4s3OZS31LsU6f2S1OeoM3R1VVgiglBlpFg 1WWWzHIYQSzD2On9A/yWzhJOV9Yz0eDsGd0nWVKQK9i8vLTmif7oKnf9XOj71cC0cDbhWtje 8CVKtoIzlDEUpxjOYzxdwMhMnlCpQeFOl8kGsMGfCpi2Sm/28diz2RGmouu3a2i1IdgDKNfJ asI3xAW+Yts6LYO+SzCvVJ68AgiKBOFjO3iwxhsg+WRxeq91AmWQYqVgJIIdgxyO0yWEq8Gp tJlvJFwNT3sLf0QeiezftgT6HUlag2sk7bKFhP20C39wTOH2dtB0/uyRc4iULXABku5Kysa1 reHViXoVYjaUqAFSqKVIkkaq1NTYRotmvj5NKrEC/wzJ84w5uxj2t4LxPXIVTzDoJNUYmNp9 hs/6YnNzc127rA0wIYz7OkWsLfQJUIMClNkWEihrBnO7OZfj8BDPMm4cNmcx2jKFPuzuZZ1T kamvYE0SSzHFpOU8S2REy4HFQQWT4sO4o+GJn2AKkZZilMioXksKWwLbd6qDDjJ/Cuj1FiMu hmMZ8rJzkV9jyhamT98mwAtgSumEiVZLAdYPdbADRp4WOvYQlEd9NuAx5HP/IMMnBt5tmU8X VQKbZQZYiyvcgU/6zJh1lBYlq7UHLAXYyE+OOGOwT54xwFiJOtinNXcWbrxGC4SKuU32jDRA d17OeZ5NcZTJeClZ+LlOqdOjd3xE2g1RymMVCrI8zRCXmiCIa7mKcpo90P6aGgGqkm0sA6Wk rkeTWIy2tnblzsAzkHR0SnF2xhJ57DQwVGSZrU0myD10aNXwHIm1Ui4M+eXVMT1O5QuJYz4q PdCP3j17JGRRoHLANJERDmiB7CG/0/CIXyA34B2AjAiz7PkEDcqcxxxJ+LU1BPiXk6x4uVxb yYmc9bVwW1RuSh6emBhYG1bTmIrBzfOStSvMLuFkpq8mzgpbEQOwm6FR1UxOE0/s4+6Eb1xp EGfPgFAb1nsOs4E04yOr8oQv8BJCboI4AuYxfpZsPC09MUT8VEFDLlBKhoUWijREb9N74md6 Jy7jLWbPy/yeGPceBXBwGxQx9B4zuuOCtb4QSJnBa/Mk1zveOVxT0+t9C+GdSaV0/Fmr2wyr GUpIkAFLSX0dMJX0o7qtpB+hXDugDEX6NyTWTqCtkmtG8IaPwarjIp+AK0pT1M0P5w/H8fio B9K93WRgNznGzABuos+cbDQ0OE/Lyn4JHRKojUHataT2Sp4oekdng9HucP21+AnZtFutQTOT EuVShRRp0j4xi1bDYxWvIn6ZIk3E7gH6HqePrtfS8pMYjzRqHzXpGjugZGzAv6NwVpK9KNKp RNk57KDgc08YSJ/gibS7FBMN7ePcSL0WArmbBjbG79RsJjopm7uiSp2QDwKzfAUtR40sgtmE cuUaicNZ2DBxNK29JA7pQsQ5yJWsH5Wt1+MIHzLWvjHlGPP0DjsZscHo7mNSuqGKTIOzCEQP i6ljXQlnNB2VfuFNQB/l0Ep0PEvMcXJYWsrmsTQKPGYcTiwjF12lV0eSEtJ3xkoeebQWFSvH BGKa67oIgcFJxVUBc8+nkwctVqGKNHvMv7DpMU2TRTNQ2/ionfXelBKykKuij3BrxGva7ZsU GnZPSkIzm+d0Nq+eN8WlTn4PtLE3mBnZKhutYYNZ1FbfaBtuwAHPdp/ckKuu/dAlc23yp59l U9ANRI/7WoxQHkkGy4cPUjpU65cY8CoCYLiAXW6jfc7HajpQZLMs+FwkT5RwE10g9YZOFWKL TzGxTsksJIvHSMRFHuFfujE1FOZjgZMS5SopVZJMo2CiXJNPVWGyaRraWICCAs56T60Nydz9 XWTtGwcHYFRudcGXYGcsHt/Qr1GHHpyDPx9surc9Etapcl1ZA8+qbqzWd5Kgsc2OC+quAGjE 4PFN8glFZxweOrWO3pOPuS946WGJTNjnOJ+jvCgWt9FHOpenAPYJtGmIGY2mjpGwG1pf07fr dnYQplzygOiReEvr5OUmKTLBSfyEvzm5SHgmhUDoj/3yn9w4luzgnvi3O+DJZZPOhb748EDs UXcfjt1rhUGFnqyvN9Ocsx9WXfpB16W3X6Y2aOBlR2QIdHpnO/Ik9t3mqyPN6mxTrFhKtDpL Vzpr0rtnTjUl/YBlkLMP62ar0Sj1DsBx4DFm2Sq6QZZuzm3IEcmcwEM8JLqDDq9DPM/YnUcR eeg/PfZ0LA/x4PjHRTpXOpnNksCmzcbTBbkpyV2DNTSKmfL3ljY8dWSUvCTsF5GVajAPlw/R 5ViFYZDfDZJpfJtrf1wOFnCaONBAw0Asb67KFO3Rk9Cf4LkWbJRW1lbRJNezCbnvkLXF574D sW/4bw582gdjkc6JTPaNTjTtyZBhAEJt9/hkbtrXnsgIpOx8Hj+Dks9v8ofbLBXaptj0wo3g C1tA+cmn6qCeOVUvYnWqnjYoOeRJR0TgYIJu3sT3QtZqkfalDdCcMPRSyDm+yxVZdBa2pbr2 ldHCyS/7+1uU3rt/MPrfYeerfFbZ6kiaR7KdTm9RKqUg2YUqJ6uVjLSD3f4Q04b3D/fxlw4s EF3v0VDRSl2ppeej5ucYqTG0Vtdi5Vnz+vON8PP6oryvbOX0dWBNZHkFCan+Dv95/R2Ix6Pi vnGWl3d3YE1FNzn8Nw885xTvlhIDnF+kWltk9pZtuCB96WcB0pLPlFHhHQRmi0yGRFPfTtWx kWRKhVkwGCozzw/2t9GRMzwASlq+7cznRBqYMCttWL79p1riP2X1h9r2+LAAI3C9H6iOcfwQ FyXAlL+optDWPQFxNE3jEvi8Om4HPfyvemB8cdkQDcN9FyZume7WX0t7XgIbtrrafy7t+0nV c2BGDt2RLC/H40VBRQGiS1DUcDf08fgFdMcVG23tjUjrGW2BiTZcsmbqjXiaFSTzKUY6wSiX 9AgqOH+BbHLdFaXmkIRq7UqyhuJtFuz3wM4SF6gt1kxD+9vASDi95yS5XQAFYa0yq2vgGe1M D4R7iMN0l43fSDdhbcsZduuk13+ywrtl4tpvEsMMGCy408i09iw5510WVR/NsSYTcB41VGzi Eg/tK0uveocrT2dm/J10jXUw7lIZvg1sUYalBxm5HRgmEx4eZCPC6yxsnIGo8HipKB0xK3rh wjjeoEhjvDYB9tBM1Yf8NeHNxMuittMg3N9syyPpB6dgDvIVltFcgKfhHFan3r5W9t4E8Gx6 ouQ3L9k0QGCqt3PwSh3kciYpq0sBQw5Ibv5o3TwkWGtNRHMr610tra6vI0cJq/vSvXZS0TIC 2ZqzI3T9scrqN6PhCB2AG6PhzlZ/GD6TH6RijndqB+d70buEcdxoj+ZNrboQ+Ut8MukQgLA/ mmQtRPVdbNipxfpjnz+3uobqmEgEt7BJG0CQ8B0sBzcG7WfnIKPcxA3bSDpd/Q/wr8bzj4H9 7iCNN/2Lt21w4mFWXV8fr5spBuMDtHfo2wCHC0zyGO2u6Cewu9ycdxalPO83Ut8bDbepoP1o uLe/kr7HH6tGGa4FjJbzT2SdMmPX+2dAa045/jRJwEbM+qPqLgd9Seh8QmLRp9lGuTjk2gyA 0/2D/nA7nM/biNVfU/HliRFuwBr+sMDFbRuV7iXbAiFEloBtkY+NYrhBGjKGKcgc6Qpmjhy2 3DltgnFVQA4JsZtO/649ePh72AOgdLpOaQ0qsNXGnLHFChD/suLO1MCcWl/V2eDY7it3s86O Lz09TkzLOeoT6mnO/FjRB9VVh2ssNaWufth+jHYvRWgt8F1B618+t5UfGzo9d077Bn0Dzfa/ d4zoRaa/hsBn4U/1E4lDX0dQ9apa30z3LChyL4WTDYipCLbjX+cw+NXQbHPUtZ3McOwCpk1G KAFQXV4ymzSY1KbLVXuBRV0fTDq8zSmVb3m5l8+hczlU+mXg/d4xNEmFv+xwmkrQu4NrO+bT NCjZ3y+cVz99Fzoc5EzpZIGVNFWIRBaF0IkQnBZq9gyGRyjrlQMqzCsNQGfvvxXv06LUnkCP fz09pNPEKOJWz3UKlFuzJn4kuSdFG28wid2pCqv8STaYdU/7N6U+bTG8zA1nQ/RVZN8P57zd fbmls0lR0a8Pw2jaIY3KfXfYyygn+S2OQGcSPqDl3sDW7l1cgq0AOvkFLaGnVy5o4lgUBJDw L3/ZSPPhGlkyh3+mOfWdzfHKTRBsXOiGjg9imrIHp0jmeUH50eV8UaT5ohRJUeRFWSu46bPL wIRC1qpFY1KLqdl0n7PxQzL+AutOnsWiotbvgBJaXhWwDEPeWKY8QnQIjcA7VeHZmcm3VdWB ZCIVShIaul8sKFk61aVjai05SnP66jIrhQCH33ISj+6ndZTGOj03P/gsF89vvKY6kuOHOLtP 9GGD8nl2m0/pZiGnMMA4z4uJ0lAMHIqYf7g4uqHLegCjfU7nxySDPMfrDuhuLszso+w3mej2 bMNQt8ZQ8Q+M25McmHFqe0laqFDgBVX+KlObYBu957brzfKNf7vvXCbehCPHS1znVqfVXOcB AE0eIV/XdtwWWobpcvayLH1Nirl7KOxF6uI5avQWhfYLvjjAKjt5gIKauTfWsDvCelO7I8Jh ActdEB7X0hLzM+A7svAC89DL53dqEMmlkbV1JltfWfMi88xFsXXsq6wvlYlvOp3aHSR1bHVy jXiTaXSK1GTCy9whlpsi6AFQnsAWhwI/Zovn0ydkB3xGEETr8vMcfOvhwd4BOap2tkbbGMnp 5qfiBO5HdWouYV6A51xSKtMHHPP+vkjuAQluAclgBOLiNvoU4Q4snZs1gJsj31jMboEIYcFA YZrwtTaycc/J1pFki+KLMsQAVlwUMew1hFSQvBmKzU3rdeuoy9RTCQxhyl+b4iJNUYpGf2ZD wMNCgBAvwoEDzsIBgVsVDQ4wCw2iOWRzav/RJWTz0tCO08oC1QrNAiWslOylgSJC5OUclFKg Zt7+tXyb7YODfYwZwQ7a2e2PVvef16paH8mMKktoKO9Fp/41302HbipdMLo+PjsPu32d9q75 SrTW5CwOfnqfzzCR5gxBnNxEn/IytRWW9YbbYOwxNEZt6kPr8LoAoHohTP2R5c7ZtSLvkfMC +bVRdR4Mag8tuCT71Xcq1D+nVPpoWqUzXNaunVYLROpP73TlYKT+rByVdKdodWmZmHAsJ9ZF lofk9CdkNXmf1RZYnNYiw+Zl07Jea9VMui23MfiRyq1lSFhRSUqLW28ejHAXyFudti0fwHc3 ZJu+xKcbAbT0X3W7tYEyYqbllYpA6FrFrR2+SXpntHXQ/aAMfC6vT5pEjbc+QT1KdFZ/yJfe ovtISPLXZt1GvZHZy/J2p9NZRfDgZ7CVpUe0QjvOF7Cesp3UkrYCL821TUHN6lTXXVcK4CwE rGECwfcy2jo1ZcwJB3l+w65KmIu/FtzktkXW0KirRic65uuIoCYmXNJ+K3pUyr3UNmKAH9iU 6UfRQohgEqozQoN/7dmnv4iBUHQAdMREmbB2ITL7E3L7Ixjp9GfGsbfHxthoe7epCFirKkkk 0Cz3w31wmbFPC5tkOIEr5vTHFhI28wU468uEhRe88btj0M838+wPXz0UFicYZcobR/Q3PeiF elATFbSrLrWFbdeD3LE6spGzbHaGuwd0JejO9vZwqfPCzhypDbNJnqJbRTL/kHOCHi9mLf4I 4bHl5TJScV3Jb1sk/Mryyofl2MVNTg7h2dntcsXGV1eEfYMcczD2XyLjv4e88xt29WOIjq4M 8WIZytvqEC+mgl21v910FWS7FGr8fC7Rcz2d8r126H7GmMb3Mr7bbeG/mcDfyQRuBK83Y7tF 1aRoGJPWXqr1NtHvSBT59vUVFrux//c2z2lfjYZ0rd/O9uFq56q+HYEtIrYNC4aq/jINfe/c dventrm+u7c35HuFD3YaLxavaREeFfx1xTWarPC/BS26tVvxPEqXMMPu3gFV19o92N96gWnY Ik7bHMXhHp691ha2OPUTYpw3v0TUvljOvlDIriBhXyxel8nWF/iWm1/Chz529w93yHbaPTw4 /Guxnbq31P60Fl/kL22N/SXYTis07eSC/J9pj30/22n3YHcP2fTe1u4K6RT2x2GujarPEjYg /vGtxp91kNn7/I3/ys9/A//dHyKBjPAaaHRidRHoPXVm5rV1SsbUkpO7OVRYTzoJVHURVaHG jC14bid4bKe1jxux4o/Jw2+8oOd9Cqt2Ys6CyIxcn3pbWJv8jmt84LJURYhNLecVzSxCzqbZ U1Ov3SFCqucSB47De6T3WqZEI4YUFRqsrstroYcHXMoQjcsV9MPW4PBVMrXKJfF5ThvHNduy a6jY2qnnbdaibx7WGvsKPVATTshX9NuO8K3K0FbjY8vZl4uLVoZlWEgzBJ/1sJsM83Y9Mwws juhIFkk3J1f3R8MtWRJzb1UnhYTG6brhg6rhNPyrm1P455SHhXTVcE6VEi2PqqpIbxcV5lrS XQ3jRI6/qXZDAbP+qv9cKQF4ZTinCkgYhjCj1yUp4Gf0OVO3OANqeL8Hjrva8mO0I68L2sHa L528tOfLebZqqngof0Kcsis3Dsglr4Uuw9iFoze34Ait4flq1bwg9uc0q76nQIjvHfCBemLx vVV5dUnFMb/FLyBUAtZ7w1VdtkjGBGYKAMuyubuo5e7voBHZVcvVptRbUdecbEpXONXhdkQh lmDMM5YsjFFPsw0y/+/H+Vdg+0t4fleGH9JK+YyUxcntNdJZCKG8T+vetIbutuvH6krz41WX t9fvDlf2X/9NNPwCoqFei+YKNjpd4jzGkzaqNrkq88l1vH+g4qRzlbuiLim5uT7hVd4eDXmV G69UbzNgOyy0+Na1Fi9d7q4r1WHFu4JatujiW1QCEQpy2LENMi4PcDEPdvtLdAQLRDiI1SGR VLNlswAyWosOYsAJXhWmbAiuJs28vN8UGrZXUmd/ezYGcc4GVq35tLOQtZT7lwzNgKt712sl eKl6fpbgKuIRSeeojFWdF8ZMF7fVobnn6b369vkdSb4fSqeIK51oxbOSkhb26c6U/b2t1SII dhKlJ7qNiufTpaUXNYnxJooRtLV+OQOxS1L8X7nF+HI1QqysSRDt7WyNiA/tbb+kxNT/MKGC Q2wLmAfEhI2xlSXPdxM9K+scFAziBd7e4QXe+1+hNay6vkGe8xesYoSVjJabvhZVOg3c9KW+ Dtz0pR/Vb/rSj6ii/0jeK4U/G2rbfoYOFm1JtzcVmzU1wc5qtWbofmi6jR3N227VwWSTEDSW Dp0qgkkRoStHNkLroYum+a4cVb/LKR8lm8jSBNjJrghqyE1rQaY2gaMo6edNtQl0DYMG9HY8 xxw40swFfDDSYlUy5F1PVUtWua2Oi1rvbO0eUlXrna39rf4ofDWER0d+VblrvH2Q1OJ7WYgF K2U0042iFZbPXLWzmT58mnB6sSIbJAUTSzHF3GSv126gRa9HjWQC9ZOsYhVOEgcfZLBayKqz Xu0iNQKVRabrRajyyhsGx15pEVU8lVoaArPx0UJUioRoeT7Gc6ys8dBCMB24WhnmT2UzVyub uVop7y/cR2rEH0PntjyfDKlUFdZhmOE9WE8PCcaduTLUJAHzBa8H5cpUgzQbUBEw69Y1uhWT 8Wndu2dfsha8Yk1S9DezpzdqBwSmcDaxJuDfL1xxDFp3/+no6uLs4sNrvJu6kNfG6IJEx86V xfLWT/uikzQTd8nmg38f2RImo8Kul7e/j5ZNs3ml5M2yEkjtglK61W9Q5QNzUwbzq+HhFrGr 4aGflBiiEC47Ya5IBbGOmESU0h3RyLDkxYHAx2O+aDGu8N5raHktblO+SVwD1PfD3oNyn2GM 6D7Fy49vn0ENK2sEsjKvMpRhDV3WkVhIZWn6zFf8TtTt7EQVfS70k1KNoDJ+lqA1PHJm2SxH TmWKM50lmJSoyJ7gYS2iNNv8pYlNsqNnYEePSfQurVAVROQak1gH+jtdkOeQW4kmHXajweLN s2ij60tXYr4LG30BKRVF6gHL/YLTmeRP7N0djoZ7/R0guNFoX16GV6SPsAqvLPmgbuMDqQfK 5yneCxNbVca9Vh+SChnwHObIcwk3g214nt5i5ajoPHlMpnbpPikn6j2C7Cjc2qZNHIEsvEJ7 qFGnxSW0+DetqMvteZEdLk9f8RUaI7x9aoN+ksqafIWVMmobzOAMi/FgLcu1tZ5ZatK9f/yV UALjtfjVj7jZ/g/b2ZwrYTnm4vu1NdU2iu7wqb59J8KLdITqCa9EJxbe9UVLYmHZgpCW0R21 KrgVV3iMqLalDUqnBuSsQPMudgEVsk2VR7gNIrlRBy+ey4Y1gCABuO/XQiUioRJJoaKA2HSx Zr+Z2kVcAhJxL9fOqFKhgZs17LsX99ZXvnEZeks6NiDd6Tb4ptFu1F8aRrT70jqKHIGwFiTx aXorqbthD8LPgSYA/GZQFYm7L5uaeHu1sZm7fxubkR3KFb0PJXec5OKPa/wR//GKzSW6nZmz GSk9EDkvS5o7dIBuCpqupr/ffTqNPn4+vzmLjq6ujn4XfepdXJ6crvOD86OLD9H786MP0VD0 +Dl9f/zr0+PfCG65jn5TwCSwY/H+88XxzdnlBbUi0+3j6c2vL0/o777I8uznpMhRTFiX2vMV qjFn53iXsfM0Cmg1zgt5JTlNYOBM4Or05vPVRQRvv7y4vrk6Ors4PdEz+Q8EXJ8OjjW6vIrk CN0pDYg4cEpXp8eXV2oCny/U5Po0u//7+eg8sr+0ZkgiWSqXvDTi94uSaoXiPcOTBchvFo29 J/TC5xmoGrcJ3yV75755PbRq//r5+ubs/RnM9OPlyefzoytrxp2IGXWIzfG4kfbk81YyVm3a aFi14dzULUoRo59Ew3gbHnLn+2wRSQ0mkvf06Y1MbeTDPljK+VReJEz3GiJ26bs53shyN43v xVtyDGPh0J7dl2X/LZdnpBppt88RXwEHguEumkPHO+2w8dql2WNapn67gdvOod8QvDQby3sc IxjRHZixXivAm8gWM50jfzAaMcJGw++HsDV40T/8g/g7IqSz6+jk88ePsPdBT7k6PeXd20P4 CFdXJvqjckngEzlfejGY14FuOnGkETUte9eBIxw49SWz4bz7XXRyBlvnBr54vwyOt6Q0i6OT k6vT6+ujd+en9c5/lmuyfdDfPsBF2d6TNw59HzImZwQdblirI9l+haIdfgU9sRrbwSzgY2eS G9WY7i0aLtL/3Afz4ktiVZZWCj+pXYM1aTMqb7W+r5N6xRjE5NsZQc+XLJrfD6yw51/y6uxJ 7ezrOlIUCE33xuNoXm2sNUxj5TlsdJwDvlL86U9N1cRr66PaN/s0PBSJtT/Srq1TBbldIj0p TRELnyDWWnYQCh1s8uc63SQOArnYfEhK8/WzVnu6sBMJh8QbSDYwo+lSlqbS7HjHfTP5Sa/F HZiR9p2xDq1RSBAXi3byMQjDOibE27fCZTZGsQHBD3geBPEsmcz706vTi2NgdpchJA/WWtgd I3kASB5YSL5BepeTKzEwEkIuXr8FHGNRkWYQi8liNntum//ywdJY6QOCQMmB90c30afLs4ub 0yuSBsvBrP934ozLVidK0aXbi5fU/w/jq+u+bZts143Yeb7C34gfEyxZnZYznDvzIcW7Ey6T 7jLPRZkQXeHeZ0vyB+SkAxZ7t9NkYHjhTMHuS4ftDMgOM1NuEwWCqDMGBnCbY3Jmsnm/iW6c WXr/QM3mcVmSSy9Ds7GI4QtZvlfqryQ7D3cOMUi7eziSCXzfRZ/5s3PZYY+iTm+dO+gAqZiA bnDYc4GGlwR6oXGFH2DXYf4JzLwLZL+XCEO2dRKrzT87Cy5e459YytrTTA73WFs8VDkO300v uU5nKZgs0+e+ungjYMN5zEvLhIxpiD4mMIByQQmFmuRoEhLKQUzV00tyzpIXFihxHGeSYo+v T39IJn1BPmiCQn1v8RXjaZzOkolmBEgvv708Y0tLaYyOxDDr41EHqS6r9PdoQCrWtt2iDIFX vPPP83wusAI8Z1GqDcU149GtwcWPY1kZHHD+4fhYkMdAiJ8oSjYBacl3We+Ndulcxd5otPsd bQmlJMPoUZGKMjqjA+N8yJGp/bPtBADCdZwERisPmRCk9DrINM0R2UdXH6jLdb0PoYq+iaZ0 rGBg9VtqcwCQ8Iq7719qcxg43sq70w7bHE5nmy04W35vRDfmwaLufE8DcU1K74+AnOi3R1dn Rxc3PLZb0EUsnRLHgT/ZMXQGWld0fnZ9U1+RcTrO1VqsfY+FWPseq7D24iXQcz66uLw4Oz46 r0+ZKZZXCU+4b+My4VGZ4Xc05IFLfLj4zFsHhTYwufIhxls9QBqDqECG8BCXD4m+KwWjZ9gC eSZwr7SSC0nxGVAu0zsSM1VtTfHyLGBTpXRHrTHz+7u7jPYZ6gfExkrY9RoXfXfx+0aihhe2 b4ReeNGCDey1IXMJH/9RzUtYLAqz0i3dzKHk1an4+7CUAKAXU/M3MBW5mzs5D+/T+7TFC86P W12Hskmb51A2Ic1mh/2GO1Kvkc5+9JbxPkLSjtC3Fleo2iIJohgU1bAv+JeRFdCgnUQdQUme YtofkfDYZPdw7wSvJVLBAhUlRg8thjr7sFn+qMRZn6Xcn6Un+CGWJh1fXIF37JidM7BHEdw9 RCERDoFHz3vf/teKeLwMjJ7WcZGgAkZqu76S6ekhB9uINbFU3muDRRD+7dMVa4SMqopvXKL9 hBPfxHNgiSXMZeCbnQGdKGuWluM2t7R83kpbqk0bcak2xJ4PdkiGUn0bzZoRn8g5o+QPNiqJ pOw/R8BwyDkKL4himb7kxReUclgN18ngNg4K/ObtW+ebkTxiIfXh4NLiIGrcCnoyg+3Amait CLatMR+/bY2/yCF3ZB7A+7KybY1Vg9ZF1o3aVlk3onsS9sno3JA/4SsQpfE0/RmU1uJRbvm7 DAMWfUxHmcVzAQ/64jEZ/yPvn8c4uh//k/gVuRz66hCkUJ4CXLVJXMWbMrvmrTg5PT4HNF5/ Pof1Ydi8uNRM9VPu3SKpzENkzrjB3ooseSIZHoHqRQP5pzfKdGldY0uplq9e1zZL64IHO2rz De0UC3ERBdZp3KYyT6hdIa+rONyiq87pJy2DdzWR1Ir4uL9Gb0ZHbJRldMMnWMaSeQFLy+LB XTpRGTVoID3gP0CHbECxd3GWTibTZJBk0gKUHgOTS+g5dpniMVjS0VmrNHvoAurYbRKRUUQC uN6atSPLz2vUGh0BGu2OuDbcaHe7TxfD000+jTiS8u5XbDrRjUfEP+byAQ2Fb2+3fMq6XT2c gzb2eqN7eLkbQIdxb/HQECosVtiBPMR4H+wjXcU2SSz/vDk4WAspLFW6bI2anZ1ghi/VsJxe tchEYLKhKTXMR8UlnClthKfUZXBseePiaO/jIkPazEE8nF2Y/sCmPp+fR7iqUhuXC2q7zAxV qOMy24f9XSwOQ78ceBZLeG9a6jYgKAKpr6jp8tPp1dHFifaO4LO+2OJRrL0EyVI4xgqfxqEt d7rtTZL0s/YyXKNIBepxQj80Y+NFd6fsrwbKyoh0J38pZB/0C0tYgIdLFC5PKfr8yT5bsrVs gjNY0J61mMSH0mtz5wZhZJAST2llI8kPJXTcaBzZalqFPqxViZ7nZxHfYQRHjhG9xur1Gy9c I0N96KBfc9eDGbFreMmKX/VFWIMVOAK8YPIXXVau0mgrGXaI0dM4SSeIXAxB4DmWibQOsD+M 4beS6ICiy7yv8lcMitdwgvm8SmcgG2UfEjLqu2iCFyDaT4KmaQ35BNic9KtyvDsy+oQWgk23 iK01iSpaLBQMBl8WUiROJGVeV0U6F9JmEsZcAqQU+YLPagQ3nl7VdqNLrcS66iJEEyNxmEhg jNk8nkwoHtFxZJYGroaBivnx5cdPlxenF0R6pFxbAbNPsLPPLj5En5TWbWtOjeNd/6b5XeRP eF53KvORycXdzPH09KTZTw+j/EsElEtKGbAniyeZBdjgri/cSBuqf9NmSqulW2lDoahtO+F9 rmyeAhOcpCWdRaadenH1WwuE3FixPJOQwD/JD3SzMOyV4pHOKj8k6uwyWOuI5dICAANOMG19 WoqHPC0r1UPxMAA7ybNE3CbQVfEyjX291zeYgPyNrr7ussvFms3p1tgHF+HFtRO9ApIeva9h Bd+d3Xw8+hR9+HAcHZ2fXx6LHsUk19bY3kELI7rF7Gyva58tmc9nJ9YufWMPQBkw5t2+dYO8 5w1NtY3fEOms6Y3cmclsyKF05TAbNMpO288bUkfeogbUibFsrGlWX2cuG9r07sxfXjK7VTiL mtwL2AoJHjWlMPWaCXekYNVhGRVTQ24apGdvWIam7RE10zVHQ2TDPxsuaBG4YSlKT5QcBEs/ eJaXGpgetq09q+8CffLb35s+mN+fTDDGiKeM6J5iownoVk2qgvVqZV+qbyhWSYYhz7uud3Wf 30Avi4st70njXJ1WS2bstG2etzckbV2raQMW+G70tbXgAr/MDBCaeCzDqNEgAMtIZ3PYxpFt dtJhkK29fYr94i97XIaF/BLj/DEu0jirlHfCiz2p407acUBnXF5hQL1Kx+RIftXg5+gI6Y9o 1pM+IfwenLnvn9400PisDeDnpwR1UuvYlUz6RwdRPpsvZH4B1jhJioruZb8zp6+0Jd5lFOp8 mTMK5ZQ6xtoA8hJ4lXGPeg3eaq/eyP1lxhdlfdv1UkCD0H4pbyASjqpkwhdgq4Gok0W82Pvb B7zY+zu77DL6piWSClAmo0353V1JGOn9+vL6Jvrp7ATE1cXNOhgeMnfs+uz/nYofkVODFIO/ P1+c3ZhMFXIiea4oL781cdaanVX2ntF7kND+bkHa370qdhNTWoiSXQ71pFlg3b2xsFMmPKBG UgwOT9HFmb/2yBCnOjVG+Svl89mirKQ9r5ICkUSSr6oW820yjpHex/dFPH8gtvT6dcLlYuR5 wjhj2gKiecLzlzIJBvcsnzWkuXfy1uOBpFZvvWrQ6q3Xjdq89boR32q8M6TjLvzLlvZAdQjZ fd94HSwjMbrBkiCbqOTmMeHuttMBfW0EthxJ6LedQwC15BuHVAuub4SH5L6Vw11SKaxHoUi9 1S9Ej5LSahuDUdSlIQdP1PrXA1R2/3qmnQ65uUErr5MXDm8OZiVZlE4HQCXTSekdza898zdF 7bm3H2rP6aQ+sXP4d88+hP0B2p6db76ntlbJCAqhXCV/WAASJn3nWyobjkdSra+/RtJfpKvP sKNTNzl+iPFKENik8TQiU9x5VFp/gfhTBX35bPGM4LYjEn7g/8THSq+AS1OTMFrrzYLYrTdj sbl7yFKTqnTAV1SeAg85S0zDD/yfSgSpanXHYzB0ousUD/XIw5AYHKoSmrm4MH9EpMVFNw9x FhkNFdVTUzandw1S5VSH4XWAEazv5C7GEA1X+rcKBV3PRE8umHgPDMAuwoPPjvNZUkbvi3wW nX6tkmwCe6o+zlDPmhqth+O39OFJAWm3l1rogVJCO2FY47dl5C/BsIRySXURohNzmL7sq7q1 zhShy69BuE5hAOZl17DDWNv+9kX6rqh22tv2jWmEpm7DpiyTWTR+2PP2ofWtt/XsJ+5us59w dvLBIWcn00+/+M01ND9+2HPrc+myg1ZxA0xB53t+BOhZ+SafB5jkoNZj/q/0YOTA2cH2x+RX F9zEWe4nqq+gAFKVCfTyZ/A1Bt/5oCdWedAD8MDB2NGgUMrnhPyYAC2Boeb6Tl6VVg+qG+xH PbQSfYyDALxNq4yN9S1aOjhnUX5J5+ywJJODT0LgNYSbTuEs7HqW0fkRNEB0xdXSThnGkgwG pVob43TBwFrwK3EZANOoKuGJcDDuS1AzjrJ4+vxzYl3AZG+v9U1JCIcHdJEU/uxICPS5CN3w ZL9ANfxTvSfbS0sBBHpaLa/kutldWqt6ygyBkwSrmKAPpL1mJxdF1GPkSw9OOV3RgrEevkzr tCjyIvpY3kcXfFx8i2/7g5+jTnjGFT5H00SQV+B2mlhFWSUCaUyhAuGflEkqhF/0yb34uqGh CkjjIIC9FRVTbI4l4dA0RhrnXDUUB0UsoZQyT+Jwa7RNeRLwy440F5aTlc614E/tcmEczEUu soQT3bSJySdc2CRHdmFvG74OlDPopEVpQTNVj9HmyHIXlN73nV8ceJ0D2QYou/FRMrCY0Uxk Q/Mplw6KGduH8NaemRJSNR2hWN80qGFaVeVI1w3p430hzgr5ZvPpunf79eqglBvGgOqwpkwm 23Q7EvzcD5QjtonESo+A0V2CmTnNQa7R5Sf2IHW4VRZWPK0PSZP8a999Y/qYcmTkVQz2lRup NjNni9Zfctou7rGSb0Deq68DAl8/qkt8/QixPTokZOOPwK2WiGyvJOdxVYRYjH2HgEXPIA0b BaGp5eZQFzLzWtVbRTEbLl43luGVgOnl4Kp0mhq4kSxKZ0jBmuFbaTHZdQ0dli9B9IV8Ucsa Bopf2l8H1rCh+KXziPwwQ0rWG7IEIWXhFO368o2eEzqj5HevZAsQRYvKa8HfOS3Gb+otxrrJ 1zlsxm23ifzu1YbVZC/QZM+FMhy+qTWB76w2VIvJa8P1mbjNe4wkmRlRG/5O5hAfDPvDQ8wi Phj1R/Xi1kjtbs20lnqRQlapkmaBOGY3trR/zDF0PN/o1ukyl2vRjR9NF14pCoP+hvP8BqP0 9R789VtVzdPt0/wWUX+PvY8dMXKOQhHMKypvTvcKOnuUpWFF1c8wqy6nja7R4252Gi5IxlNj BIo/wV9UDD0dm28NB1D1pHvUFw+OWkrfjaoTQNwe5/sWFRQqbBf9Nk9lmTAFzeMt2WI6tQpL 4kwwRd4rlwjvqvJxPlUHmEVsFypQQVjM2TKgYMSMPL5f6QyMXoSlz7xKrPuyCA+rhsho3VN7 sPyNqQgoj1cTGug3ac/AorCSIjN9WYvGZtZ9nAhuycHsfvi0p0muMHRNRhylWnCg+q4A/olM uy/QBFF109klo5Ahp+zoV2dcLelwty+mTH9qlkVixmvXnjAYYuQ3HBxH+jVmnSad45+iyyLi Pu9tdPU+ZxPQLp6NALihW9UGdYrSi960Y7ottATmFZcNcxnmb6PtHWRw2yDN4beD0J07PocT NRNHEncD2o6nOXp8YetVBgk+Vcr1VBsFOYJ02o8FV4qTi4iH4fQdBZRNyvcxlrkNjw/Q6sXW J16WVavoiwRrUXI8yaFMPp+XkNFNBjvFc9AhUGGBqIkpUq8zXa3yD0/xc98Gp2I9MZXGxiqd Oj2Wp4k6PKXAYi1N3I59VUgDg2Do/rCgUbQk41fSsG4TYQ5NOZvj2N/6+e1jmi/K6TObDJSL +iXLnzKBt7lsEr/wVsKGR0Aofi3Dc2b9cC8r6wM9ORaGrHXDk982PHT6qKIkaG13YTCZRoy4 z5PShQe6x/0DVkMlTZGPPGEMbZY/Jk7NVGA4MxlQTmf4AuA/hHIbXu31aiU5zQw3mlW/MyEk etm5qTNAmTubkPHGVaS+mqGA3lTCWm36HIoLzKryfgHRqptZBWj9prUNfMMFY2y/gVstppzm lZrNLW5uZC/mgD5TM7rX1KIUieIyhwf9Q2Qyu1t7HLtexmN4Bgj5HR7KOM2MmxhHYYzJAOPt MEdr+3zOJIfRm7xkXsUiw94NXKMkG08Xk4S4iQ0nmZLvFonj3wHCf8qDuTdx+cWHJNkMYZJ3 nsNs0nKM/oQMNC8AcJ2jVS/HT6XnBWK2zwosbrPk6ziZ49Rf26R1UpsOb/H2GVnTqG10NZka nPp83EkQf7agdZ+PRYvvqUoOMYdp+iVxngl5WlH0zrEaL90PvSjYutta95xh9Pk3vO22KpAd 9ehaaOy4rqTi7pCutIFfRsMGJ1uQXmHHKbS7Es++3ASRuHw3nqMzJPoYfwWl52f4ZVHJG1rd e21Y5dGk2zN4BzG3DtxcErdMr2UFu0rGSi9yVadGOI3dRQ0BV9TUnqBzsYvsvRwBuPcxapIU 0W+Q0hgPDF2hocl2TrO73Avi6u98q1l/75nM+nu+LGKfblU+1EWMJT1cYzO7YjYWhVSFgmfz HD2ehTgzXjdyr6PMVFXUyY+f5UxZDqA51mCuKnbbkVZ7sI3QWL/VbjtszEqd/lNojwV0bIxk Ehdti8NZ8LgKEdYzwarUScXp1kY4wCCtk8aka4FyBDOydS4HXrAMDBeAccQl1SDyVHZRxChe HHigu4zzOYYu4kwWj0pnIDt14X7QfpI4W8zpKso8szFtYesWhvuF0moIB6U8jcghIDp5mmJL alb2VdlzZ/0nEyrlAOxnzG/E8mekno3josAR0uFFLeYN1BJmkMh4yu7+HgXWdve3WkhOvtWE lzFkQ0ly5Fbka9LspZnzVNft3nY80f6+FsG0uY4kOat5l6i0q19gov9r0RD+ZA2YCgHFaPjX QDGaDoeMJnXOuw1NzQHfENqq74+s7zb5TSpv/P8B14cDNpsUAQA= --2fHTh5uZTiUOsy+g--