From aafdf29cd803b2b5d6fb29bd6df98594f25fd3ba Mon Sep 17 00:00:00 2001 From: lafirest Date: Fri, 6 Aug 2021 19:08:20 +0800 Subject: [PATCH] refactor(emqx_gateway): refactor the emqx_coap --- apps/emqx_gateway/etc/emqx_gateway.conf | 30 +- .../src/bhvrs/emqx_gateway_channel.erl | 1 - apps/emqx_gateway/src/coap/README.md | 505 +++++++++++++----- apps/emqx_gateway/src/coap/doc/flow.png | Bin 0 -> 111145 bytes .../src/coap/doc/shared_state.png | Bin 0 -> 31330 bytes apps/emqx_gateway/src/coap/doc/transport.png | Bin 0 -> 151279 bytes .../src/coap/emqx_coap_channel.erl | 275 ++++++---- .../emqx_gateway/src/coap/emqx_coap_frame.erl | 2 - apps/emqx_gateway/src/coap/emqx_coap_impl.erl | 25 +- .../src/coap/emqx_coap_message.erl | 36 +- .../src/coap/emqx_coap_observe_res.erl | 20 +- .../src/coap/emqx_coap_session.erl | 247 ++++++--- apps/emqx_gateway/src/coap/emqx_coap_tm.erl | 40 +- .../src/coap/emqx_coap_transport.erl | 59 +- .../coap/handler/emqx_coap_mqtt_handler.erl | 40 ++ .../coap/handler/emqx_coap_pubsub_handler.erl | 155 ++++++ .../src/coap/include/emqx_coap.hrl | 7 +- .../resources/emqx_coap_mqtt_resource.erl | 153 ------ .../resources/emqx_coap_pubsub_resource.erl | 219 -------- .../resources/emqx_coap_pubsub_topics.erl | 185 ------- apps/emqx_gateway/src/emqx_gateway_cm.erl | 29 +- apps/emqx_gateway/src/emqx_gateway_ctx.erl | 14 +- apps/emqx_gateway/src/emqx_gateway_schema.erl | 3 +- 23 files changed, 1044 insertions(+), 1001 deletions(-) create mode 100644 apps/emqx_gateway/src/coap/doc/flow.png create mode 100644 apps/emqx_gateway/src/coap/doc/shared_state.png create mode 100644 apps/emqx_gateway/src/coap/doc/transport.png create mode 100644 apps/emqx_gateway/src/coap/handler/emqx_coap_mqtt_handler.erl create mode 100644 apps/emqx_gateway/src/coap/handler/emqx_coap_pubsub_handler.erl delete mode 100644 apps/emqx_gateway/src/coap/resources/emqx_coap_mqtt_resource.erl delete mode 100644 apps/emqx_gateway/src/coap/resources/emqx_coap_pubsub_resource.erl delete mode 100644 apps/emqx_gateway/src/coap/resources/emqx_coap_pubsub_topics.erl diff --git a/apps/emqx_gateway/etc/emqx_gateway.conf b/apps/emqx_gateway/etc/emqx_gateway.conf index 16315b012..6c7928174 100644 --- a/apps/emqx_gateway/etc/emqx_gateway.conf +++ b/apps/emqx_gateway/etc/emqx_gateway.conf @@ -39,9 +39,22 @@ gateway: { coap.1: { enable_stats: false - authentication.enable: false + + authentication: { + enable: true + authenticators: [ + { + name: "authenticator1" + mechanism: password-based + server_type: built-in-database + user_id_type: clientid + } + ] + } + + #authentication.enable: false + heartbeat: 30s - resource: mqtt notify_type: qos subscribe_qos: qos0 publish_qos: qos1 @@ -50,19 +63,6 @@ gateway: { } } - coap.2: { - enable_stats: false - authentication.enable:false - heartbeat: 30s - resource: pubsub - notify_type: non - subscribe_qos: qos2 - publish_qos: coap - listener.udp.1: { - bind: 5687 - } - } - mqttsn.1: { ## The MQTT-SN Gateway ID in ADVERTISE message. gateway_id: 1 diff --git a/apps/emqx_gateway/src/bhvrs/emqx_gateway_channel.erl b/apps/emqx_gateway/src/bhvrs/emqx_gateway_channel.erl index 1a032a017..abd7391bd 100644 --- a/apps/emqx_gateway/src/bhvrs/emqx_gateway_channel.erl +++ b/apps/emqx_gateway/src/bhvrs/emqx_gateway_channel.erl @@ -94,4 +94,3 @@ %% @doc The callback for process terminated -callback terminate(any(), channel()) -> ok. - diff --git a/apps/emqx_gateway/src/coap/README.md b/apps/emqx_gateway/src/coap/README.md index f71938c92..c451d6533 100644 --- a/apps/emqx_gateway/src/coap/README.md +++ b/apps/emqx_gateway/src/coap/README.md @@ -1,190 +1,401 @@ # Table of Contents -1. [EMQX 5.0 CoAP Gateway](#org6feb6de) -2. [CoAP Message Processing Flow](#org8458c1a) - 1. [Request Timing Diagram](#orgeaa4f53) - 1. [Transport && Transport Manager](#org88207b8) - 2. [Resource](#orgb32ce94) -3. [Resource](#org8956f90) - 1. [MQTT Resource](#orge8c21b1) - 2. [PubSub Resource](#org68ddce7) -4. [Heartbeat](#orgffdfecd) -5. [Command](#org43004c2) -6. [MQTT QOS <=> CoAP non/con](#org0157b5c) +1. [EMQX 5.0 CoAP Gateway](#org61e5bb8) + 1. [Features](#orgeddbc94) + 1. [PubSub Handler](#orgfc7be2d) + 2. [MQTT Handler](#org55be508) + 3. [Heartbeat](#org3d1a32e) + 4. [Query String](#org9a6b996) + 2. [Implementation](#org9985dfe) + 1. [Request/Response flow](#orge94210c) - + # EMQX 5.0 CoAP Gateway -emqx-coap is a CoAP Gateway for EMQ X Broker. -It translates CoAP messages into MQTT messages and make it possible to communiate between CoAP clients and MQTT clients. +emqx-coap is a CoAP Gateway for EMQ X Broker. It translates CoAP messages into MQTT messages and make it possible to communiate between CoAP clients and MQTT clients. - + -# CoAP Message Processing Flow +## Features + +- Partially achieves [Publish-Subscribe Broker for the Constrained Application Protocol (CoAP)](https://datatracker.ietf.org/doc/html/draft-ietf-core-coap-pubsub-09) + we called this as ps handler, include following functions: + - Publish + - Subscribe + - UnSubscribe +- Long connection and authorization verification called as MQTT handler - + -## Request Timing Diagram +### PubSub Handler +1. Publish - ,------. ,------------. ,-----------------. ,---------. ,--------. - |client| |coap_gateway| |transport_manager| |transport| |resource| - `--+---' `-----+------' `--------+--------' `----+----' `---+----' - | | | | | - | -------------------> | | | - | | | | | - | | | | | - | | ------------------------>| | | - | | | | | - | | | | | - | | |----------------------->| | - | | | | | - | | | | | - | | | |------------------>| - | | | | | - | | | | | - | | | |<------------------| - | | | | | - | | | | | - | | |<-----------------------| | - | | | | | - | | | | | - | | <------------------------| | | - | | | | | - | | | | | - | <------------------- | | | - ,--+---. ,-----+------. ,--------+--------. ,----+----. ,---+----. - |client| |coap_gateway| |transport_manager| |transport| |resource| - `------' `------------' `-----------------' `---------' `--------' + Method: POST\ + URI Schema: ps/{+topic}{?q\*}\ + q\*: [Shared Options](#orgc50043b)\ + Response: + - 2.04 "Changed" when success + - 4.00 "Bad Request" when error + - 4.01 "Unauthorized" when with wrong auth uri query - +2. Subscribe -### Transport && Transport Manager + Method: GET + Options: -Transport is a module that manages the life cycle and behaviour of CoAP messages\ -And the transport manager is to manage all transport which in this gateway + - Observer = 0 + URI Schema: ps/{+topic}{?q\*}\ + q\*: see [Shared Options](#orgc50043b)\ + Response: - + - 2.05 "Content" when success + - 4.00 "Bad Request" when error + - 4.01 "Unauthorized" when with wrong auth uri query -### Resource - -The Resource is a behaviour that must implement GET/PUT/POST/DELETE method\ -Different Resources can have different implementations of this four method\ -Each gateway can only use one Resource module to process CoAP Request Message - - - - -# Resource - - - - -## MQTT Resource - -The MQTT Resource is a simple CoAP to MQTT adapter, the implementation of each method is as follows: - -- use uri path as topic -- GET: subscribe the topic -- PUT: publish message to this topic -- POST: like PUT -- DELETE: unsubscribe the topic - - - - -## PubSub Resource - -The PubSub Resource like the MQTT Resource, but has a retained topic's message database\ -This Resource is shared, only can has one instance. The implementation: - -- use uri path as topic -- GET: - - GET with observe = 0: subscribe the topic - - GET with observe = 1: unsubscribe the topic - - GET without observe: read lastest message from the message database, key is the topic -- PUT: - insert message into the message database, key is the topic -- POST: - like PUT, but will publish the message -- DELETE: - delete message from the database, key is topic - - - - -# Heartbeat - -At present, the CoAP gateway only supports UDP/DTLS connection, don't support UDP over TCP and UDP over WebSocket. -Because UDP is connectionless, so the client needs to send heartbeat ping to the server interval. Otherwise, the server will close related resources -Use ****POST with empty uri path**** as a heartbeat ping - -example: ``` -coap-client -m post coap://127.0.0.1 + Client1 Client2 Broker + | | Subscribe | + | | ----- GET /ps/topic1 Observe:0 Token:XX ----> | + | | | + | | <---------- 2.05 Content Observe:10---------- | + | | | + | | | + | | Publish | + | ---------|----------- PUT /ps/topic1 "1033.3" --------> | + | | Notify | + | | <---------- 2.05 Content Observe:11 --------- | + | | | ``` - +3. UnSubscribe -# Command + Method : GET + Options: -Command is means the operation which outside the CoAP protocol, like authorization -The Command format: + - Observe = 1 -1. use ****POST**** method -2. uri path is empty -3. query string is like ****action=comandX&argX=valuex&argY=valueY**** + URI Schema: ps/{+topic}{?q\*}\ + q\*: see [Shared Options](#orgc50043b)\ + Response: -example: -1. connect: -``` -coap-client -m post coap://127.0.0.1?action=connect&clientid=XXX&username=XXX&password=XXX -``` -2. disconnect: -``` -coap-client -m post coap://127.0.0.1?action=disconnect -``` + - 2.07 "No Content" when success + - 4.00 "Bad Request" when error + - 4.01 "Unauthorized" when with wrong auth uri query - -# MQTT QOS <=> CoAP non/con + -CoAP gateway uses some options to control the conversion between MQTT qos and coap non/con: +### MQTT Handler -1.notify_type -Control the type of notify messages when the observed object has changed.Can be: + Establishing a connection is optional. If the CoAP client needs to use connection-based operations, it must first establish a connection. +At the same time, the connectionless mode and the connected mode cannot be mixed. +In connection mode, the Publish/Subscribe/UnSubscribe sent by the client must be has Token and ClientId in query string. +If the Token and Clientid is wrong/miss, EMQ X will reset the request. +The communication token is the data carried in the response payload after the client successfully establishes a connection. +After obtaining the token, the client's subsequent request must attach "token=Token" to the Query String +ClientId is necessary when there is a connection, and is a unique identifier defined by the client. +The server manages the client through the ClientId. If the ClientId is wrong, EMQ X will reset the request. -- non -- con -- qos - in this value, MQTT QOS0 -> non, QOS1/QOS2 -> con +1. Create a Connection -2.subscribe_qos -Control the qos of subscribe.Can be: + Method: POST + URI Schema: mqtt/{+topic}{?q\*} + q\*: -- qos0 -- qos1 -- qos2 -- coap - in this value, CoAP non -> qos0, con -> qos1 + - clientId := client uid + - username + - password -3.publish_qos -like subscribe_qos, but control the qos of the publish MQTT message + Response: -License -------- + - 2.01 "Created" when success + - 4.00 "Bad Request" when error + - 4.01 "Unauthorized" wrong username or password -Apache License Version 2.0 + Payload: Token if success -Author ------- +2. Close a Connection -EMQ X Team. + Method : DELETE + URI Schema: mqtt/{+topic}{?q\*} + q\*: + + - clientId := client uid + - token + + Resonse: + + - 2.01 "Deleted" when success + - 4.00 "Bad Request" when error + - 4.01 "Unauthorized" wrong clientid or token + + + + +### Heartbeat + +The Coap client can maintain the "connection" with the server through the heartbeat (regardless of whether it is authenticated or not), so that the server will not release related resources +Method : PUT +URI Schema: mqtt/{+topic}{?q\*} +q\*: + +- clientId if authenticated +- token if authenticated + +Response: + +- 2.01 "Changed" when success +- 4.00 "Bad Request" when error +- 4.01 "Unauthorized" wrong clientid or token + + + + +### Query String + +CoAP gateway uses some options in query string to conversion between MQTT CoAP. + +1. Shared Options + + - clientId + - token + +2. Connect Options + + - username + - password + +3. Publish + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
optionvalue typedefault
retainbooleanfalse
qosMQTT QOSSee here
expiryMessage Expiry Interval0(Never expiry)
+ +4. Subscribe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
optionvalue typedefault
qosMQTT QOSSee here
nlMQTT Subscribe No Local0
rhMQTT Subscribe Retain Handing0
+ +5. MQTT QOS <=> CoAP non/con + + 1.notif_type + Control the type of notify messages when the observed object has changed.Can be: + + - non + - con + - qos + in this value, MQTT QOS0 -> non, QOS1/QOS2 -> con + + 2.subscribe_qos + Control the qos of subscribe.Can be: + + - qos0 + - qos1 + - qos2 + - coap + in this value, CoAP non -> qos0, con -> qos1 + + 3.publish_qos + like subscribe_qos, but control the qos of the publish MQTT message + + + + +## Implementation + + + + +### Request/Response flow + +![img](./doc/flow.png) + +1. Authorization check + + Check whether the clientid and token in the query string match the current connection + +2. Session + + Manager the "Transport Mnager" "Observe Resouces Manger" and next message id + +3. Transport Mnager + + Manager "Transport" create/close/dispatch + +4. Observe resources Mnager + + Mnager observe topic and token + +5. Transport + + ![img](./doc/transport.png) + + 1. Shared State + + ![img](./doc/shared_state.png) + +6. Handler + + 1. pubsub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodObserveAction
GET0subscribe and reply result
GET1unsubscribe and reply result
POSTXpublish and reply result
+ + 2. mqtt + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodAction
PUTreply result
POSTreturn create connection action
DELETEreturn close connection action
diff --git a/apps/emqx_gateway/src/coap/doc/flow.png b/apps/emqx_gateway/src/coap/doc/flow.png new file mode 100644 index 0000000000000000000000000000000000000000..5c72883487b21f467864698eaeca248bfbefd839 GIT binary patch literal 111145 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 z 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

#L>xcc87a}!?W z8Muw#CVv0n;dlo&&u5s#hldVKz!ez6o5R;Jzukb~?gd1VhX(@DluifBzCnwo3u}+JykWM*A&PS7V1*`FG;wYpwiLE)e{nu{8 z2efi=L4C4DEtcPp4+_7c67W)XYjN8mQE(oZDVbpTNLYH&njQw>NVoa*9i0w$jM?*( z2UcvD9dUE}oFa^peTqDzNq}6gQ6NS3yz&dUV*h3ejzNP!l|cXhv;zMhnU3T8%F0T1 zX!xp-!UM`QlIM4W4jVE5!SwjQ%|ROf(j|72kxCFVdoU^+BkUK-ZIh~yJvCJBx{bmM zfB2`bc`-6EkOPm!TZGIP`KHjK5Ye!3c{?X?(ziZrGYM#El3Vl zxRZ&9indOg0cuWLTf3{PYx@!Yn_~Vy81^X~bbp72*`FG2CAWa20Wjd9SP9xf;DddA zFMKD)69z~0+cH7=LH&o@W!p2)pEhu>_3k%uBL-}q_Kmmrba=k->EFCA+;yD*7995Q zf)J?Jl$Mr8Mnw$|4HXf%C0#40+{t7i-CnRqV_>2g=eLW~CXVvM> zj3^Hej|+;>_=WQJ?ZIaVyh6u6y!VBlpV|6<-gH(qwXjerdYy4W@jHMriVkaj#OtK} z!w= zu`V=gB4_Qa2ZA`C5Apw~0I`RNJBujbbyEECodTJ)OQ{HQa4izN8A7gMVMqYAii(P= zs@|Z}KJ?Q0k3R)y2jVd1&iduamOimgg2&KdBTIqyzkYtFz;su*`R#D=mEvbD3Fl#u zl|@!KIn?0)xO^E4A@Df=be>dqhL{GVC9-I8@q5%8_pq%7#OG2OS{qLQ9WWjp-Q1iI zeI|QfcoCRl`63DvE7rTxhabv6`osQ+p&IV4OY+(xl1b)VAN3B|i3I}I3^L|DSI|OQ zE8WQCF7Od%H?)XTOwHz|nC2*?tc#E>2{&NC{7}c{63ycboigLtjluu(^Kaj#q8;80 zy?N3hkvWY11@-|2K+mkWG5~s*Q0S0j*qhcpP(&Ah!*GT>(0+qs?<}QmN9ri7v9YWIVD0-iP;0Vagq5* z79h(9@?Pc|^d&0gGlsEsmaZ=j8wdY+Yr3jd6?xejKWhDUS0uN<9S9okju+rk)ZM*0 zjE|(@7(QpsMEA`TU2Z7zbiN38CXDTZgaFmJxF5M+be@K(FJoW(8#&Hd7jK^Opx)F-Z+c?`^R`AUS!Jj4Z^{({rDo$BpO9@`oK^%sVM-5WLH2 zBsh@vg3uiGynM{RY$%o%dp?7Ws`zY2^qmsW;^f+0AGTe6b_<{lNV}Dbh2G_mw)Oi5&_C%nz_B9{54tK*Gc$Z~fD^y@vGWg`^b*r|6++HS#r zi2l=wfJ)G$Cl4AgiCMXWY@xXLO>C2F+vJmd1>a_DLz)7y8Ao5HMor?2gi`0Tj!jX5 zgjO%V)ybVHNb#6pecNA%EYB%)ws*k&Jh>}?_we$;FcuKq4=kG-UVnIEK{h`&a$p(-$v%>;5EaUl11Xh<*?cmkEN&b-0x!=84gvvo)(5x}rWn)p zl^GD`w194Zc3U27*TR7^j49Lw`IDG^-J+s}pV#Jz6oWtg19LS~FgBIy@ThjQ@kR+Vg`%;D5OEvG0 z5h$d;e0xDUJ&WJ|gQIXv!sJ4gZc8uDf{wwhDY*-pqu6rGoEP)P*K4P*@zI2j&KAzWTrSy^6Q zURaRRFMW4%?&~RH>GT-pfCT`JoH%iUkT91r-E#yreyiZ9Ggse0u+k+@B|KlqS^aj> zLkHZUQtOqm0N!v*vS*m-w?eK4VI`Gm5qD-zd*w;*F1xof?LGS!I|lBW9nh|A?Bvo1 z{?Z$#6{hwthM$021WmRAMdZlko{m(N$C5a!oa!o1JA`-p;MIlf0jAOMi8FTfT=78o z6Fc$kxgfvb>a+;aE_wL~+GB=Vy=%)=9{^_oi7S9nLIw+zfOvU%p*fqOp&>mzJutrm zSsSs-Ol|9%o6Q$)!0i!r4wxHYh!hkN>2Doxv2l*KBH!{6*tE>`wQJ9;^f_;^;C+of zu=d>yOs+MGs<}Cr#pcZ(y;q^KUt>{MU(&tP<+!3_ty^KgCL}BzS@q@@e+BqBkU0hJ z)?f4$NTdQ+XzcVd{f;OLcot>{m?CCJ&>)t8=yG~R06}vL_OeI4a@`zlCXfidvo+UY z6i*J0qKVNJ@a8$@S48F+;DDPw+^~-)CKyFH%tnPf6%$-W&v2b9R*{f;_uQDG{J>;XETZ%?NWgu~g1-nOpXjUEdQC*U1CLxjp@`tJmS)(vQ9!Sj86qgy5+ zHJYuU52|Ev>^zBz=sLV3!Yc(q=;6Anof#K%gsDg7f(x&5E>U4m>9luC53Xe)0#H(p7lUj)n z_nI4CNbx^EI^OQp0=yq_JDTV&n*i3ipCtGXpC35yvxb=V=U3~BgyFsIY>(86?>JX7 zS32gv{>ep0mF>fvrWDs1^MrV<6F4_*t+rb6W2y1>(G0(B6B#3vS4dziI`2)$Y43%& zdmS%-b{MfM_PF&gOeik@*f_dMMMZnlehdkvg=Z1uG}kU2#%n+Lsxc_y4hynVRt3Dp z0o>$uCNn;Kw*t!68n@c&k!AGhYPk~1olWB+)?IM6D4+N^LW2LM?SRQBSfK?BEW~?r zskiT4B1~hSC;vuop#%xDlgS-YpE`((vy26wV%Fk^XJ^=M?<|?yGvLV`I&flM1SHi1 z2glgCW#Su!Zc$+y8 zXMq;C4y4_OJ-nWl!YLsXvUxNB-(o zd0!fT&^~v!C;&M&k@|Q>dYO;d#HltpPrC+&L6E%HzG2?8UjC;Xhs;Bi7tq{oCf1fS zbIq>=S?v&G^R61Xy{8#ToquqCb^E%S?A2xE4Lzwhr3X)Tn+6)#E*ON|%w?V)h|uWi zj?Z0FXQ=p$3^#f(i9Q}j1MGJcxQKvvmP@XOt^;f5H}lAuuD!7`Gn!6vY=fhaqu;I1 z8VE-PCE{zzBQNaVKFT8|BUuu4&=~^$+Lg@AjdDCAD1Q8wzUeUp8p)6n)S0If&AH}t z{g5&SN?kb(6oi?cHRAb1xNoA?L5d066o2|d~AG zsD4n(v(Lda#_e^br&`AWujrTh2L9h^qVxZTp5(xZywQm!Ah2#)UU@Qe&R*Wi#7ZQ2 z@jAjePx&K@L3!9I8+*?%kst_Qwk$La{XW+##v2cL5Su{n{~4}feqho0s~KN+~1&gB)pj` z-d~$9hN(nMw{0`NS%L!4Z&&)++Zc8ZOP1nv-~|GoJ0K_PTJ~U5Zl+YtBpEeH}Yock2N_##Gi^|=|% zB6MYhq5u9c4!S%#uxU0+8;^!<>g>X6L=E)!0_c)urSL<5FhqZ6zyxDzLCC5y_ZYC} zt(vecM-N`S1B_8#>8fPKq2L-85Y=(Ly<+qPeVuuR;?|Vd_}-d2hVSm1RhJZPOFWUs zo}D?6@Gz4{5o;Id9?I_TZMMEZr}iy)tw%V;XCcl7i6?4cF!NMR&-nEZVf%A$q7K;N zWM(a_V(6f3#%$ets{MIO{dRV>H2f#!&S|v#He((YTgBH+qX*b?G`^1xT)UJ}XaQij zr~L|u;LC0DX=1I+u#3LZzuAWG1Mj`5gd>~r4f5E}yaOJ(pq9}!WL{KRwpeOY+BVz` z=88Xz>}>N4_ahlr?CB%GXYAqlyke?t+Ro$#PY6Hw1U*Jqpf+uC6kgjlIf;FUZvV27 z?dY{W@I)to=~~40;X4muLxGaSy0o5+mFa10?I2LB3knP4Vq=#O;amrddNQ+$W>rG& zA*L?N)!P0oqcrQFZVIZh_LM<0C_V7yKgc82rU3Ht#m$*FZvvGK$#}}?O=;?a*ep#< zI4tL`V)3ep4p=JP``S`ZuYB-x@%=s1vA8EgQO7hXT^7C0QievO6v7j&c`yLhpj{?4KDU*zO>S62Ib zO)k|@t!uDGHfd?eesFfiA!e!|7>E4Y8Z@}TA+9~fDi0&`cl>2;YD+BD2!{p*^*}yl zvK)tS8G(PaN`geF5;r5F^52GX%s07>4L@>$ z3d3H~=&CTH+IYtP?QCrbXMjaHJ$Ad4KAlP-#b0HF)UfCqeR}C-k7wP^g~vo|SbSHj zSQ>b?Xo~fqhEIRzJOr)QSrWWEzDa_pLqJ~otAcgw?+O;sY=2N~B@~K{=+0MFR?0zQ z~)a{h5@_pH8`2CJ12A&@N#VZbT}*C3ZG}V=I#_nmJV< zVmnG*IXW_;*OQ|^R*Rl#nmF!C9mZkqLb<0G0xeYNktIqBw@}3U)az(Y%Q;_JmrTRB zqwNm5BGb>e5Bnr1(*!wkSkH837?y0HCK@A_S3$d+ zu4gV4UPJuL{kJ)r>%$%nFwvmEX-a+M=+UMR!Pj0v+H^@9GRM0!n1%@f5Tf@ieySjq z)AybX7;xq@dD>%7@_7UI_CUct`7V@)maVzDCqW;+JjG&t;gxlQ-T+9=d&>9_gQoH) z)&#{|x?;WV*=3v|c89X3^{@_~P9uZbkH)B`txJ{><7g1VfUS>Z}j(@Ce8G$W#Yui0`sL|GWC0M;QAVQ#mfDml#;^Rd$67$ zoSP<-An8~~8gmiuwKKj*GqbEL-!fDUv@9`zR4?52Cp7~7Vu#_+Y@LWG<;BKF zgxPvs-aFD^l+DdLAjay!y?RNySuqxVCFu$8zCx~(jo{Uy^&!{HzLyt>Wq$7P#fb$y zp{7yDidQbQ&>IEKY9HFje1hUpXL9>IsW@>MN3;O5bATbI@zCSMWXNQ)T<+O}#ynpB z&0JPLzrKC3(JCd;WFNcpXnwjeqOi{pw8NWg)OdE+)wC6pM#ko@ag}uxn7V5bw#Gky zA3BQG47D0`B$;qt8*mt?xRcN!_Tc5a+(EF!7O!K@4CS4sG^0eX1A97|QoS2s+n7mAVa_rY=$Tc#1 zM0Od1pzKZ{B)|?I1sp#g(m}gG#0Lj%6B7tX@n)_rA=Zi->e_sY{{H^v=lIJ-(0k;X zKD%c9RqdnDEg=!|(L>n1U25rToED;+@}crG1K6;!GC)fYyE~oL=zn@9zE58~2z$xgsn4entq)lS%_?c`-rF0Um+jG~SI7e!S}?$r@@l)v zYaiSnD79N#3Rwc334P&~6cEC02kU|&&l0|LG8fw|YHHWfGtEaiwFW@L+xZ1#k}d%; zDvWdq1fXH|tvgbcv(!jv6~3#4W}PwTnu=WJ^X#682~deNxGUie zo*H?W^GH($ zMBDAfikM+Uasv%JXlwL}de>dj=Al=lCcldb-xyT$;QqCH-{PoGLfSG;*;qf$k&@kF z<_iX63f-9Uc;91g(ns$o@W zybe5Dew4M#x=@FTxi|t6<1o*Ipbd|?<6NkI*@#iaNoV+-l^U4o!mL051mo z?)%o*W&AeSSC15&$?o0Y4HySu_(+ zn(rqzJF0EKVB=K^g85!CAr{BTn6qOyq3O&D_sslunG=B;b>oEs=-Kn41u9_)CvQPo zMm&~_zdLvtn$XVmIN(;Sh7L@;%Hv&y+FJ-^H-otS0+Ra*@p4 z{{ZUL9B6SvFP-FCnt0B9&xl1lJdr)2$9yjypv4OYrv~iSloKs2Ej6+IyqIv3yJ^WU z63&~mPIiFrXyJfVQ1dmFJR^#>{mwbf95k4pbOiW+s0e~NKDHpkPR2yorc{AocJNY| z?>8f~02t3i2XvbsK~j4toB53C&B#szI5GI@rga~5@37z&cv4N%se!onBHk!0Y68#` zbmkjCSj4%~cJbQth^6?PxjIhrCB5Zgo|@3ohuU{!Z_h)=KZlee9=pwF++uIK(j4n( zM&dd>;gl6AbbKUnD;To|bJNnEWcB7wfvObOpY~(UU3Fwh2Y7pO=>$%ukdt>U5JGBr31@O3pM*ue_iSIqs`z4g|H%#g&!OsV;$s(L4@& zweJcIKXPH7ii?-z3R*#T8b8)o=%cBxBA)&6h>Q(zf-HAKM_{^$Y;7QmYtlHQEA;MY zOdF~qneirGzKGt@(LlYrf2osv`}pZg=@1M-m#{{+J|KWy{*9#}0}t9#L5L77FqbpNwu2V4x zW@07`6s*IA11SWbJgIi~x$li6U~VwWEQ=Iy?L0)ERbrMQVWGdjxr~E+z-BS#dSB#6 z#xAuQiZ3K}whvjc&1{A%ks71RAua;dw&Er8Nz^`mvt@{e0!X?N{+jt6x0iL?>7lvMELUX^a{BzVWG`LqqF#t?4z0!2uhe zcb}!2S-o80F~Du|t-AIG=>Et+HN*2oSqQ1g)~bHsRY?L%PU#2!@{NQDVw!N4Nxxu- z0g*zKs7^xWDDn2tL6Y9GGolmy#f3$Tkg_jlYo_tlAR0o>hdJz8QMKq(cBYlr(ky+z z8O+gBQ%~2>W20A~BqJ?T<}MvU66R2D3p3ye>L4I^M;bO0VBYeY;CVh+NDGmb)hOqw zoA>Tj!xAZ#*mhN!Wq$;7-q4xxrp~g7xkAl^usH42c|-|8`~Y)(zulA6u1)pFKh8yf zHL5Ayayfi{UBL(Ni@=5pbP~d)La7MYR4M$9rN(ACfBtKOJcfQkmM(Arl5jM1i)>Fxp`vOMCdM-k=m~7IOsWF7$G#U8_;R75Cl*-j+ zyW1OC-4F}kMAk*VV?=cOPl15_w>FXyV0Vkh&N%JpfC2aNu(Px8xu9A%#bbj!mJlve zkY?*{P}NkE9eNExaLlwkfFXSPBxFOsG@cUAEVH=Oo(FU8_oB?e?;iG(o51o9Z5CNs zS*uZq2or(snXMyTtkR$(H{e61<;H?8hwgtN>heJ#6?oxbdRK%Sqt!ajGyYgKkonWt z3kdaWppn7W^5i4lWr(84l#HN3NzR$Nekk(P&T&=OcYtre3p!up!ER(}85aocI2&u9 zC0@wS&wqe6kjZq|v$s~?^i!S(Hk3^BQ5vl$!loirEo2;!6J}y$%u<+z3z7+LOf2Ue z7bZNV^C$`QGOFscd*9V%=mL@;37WK2SI!g1HbyV^Sq{uX1OpKrW%}b7piioK3l@UpBG1#sf>1eH%OdvOkWdWErd6Z4R z+iZYm*v={;&g%8+XVlP%Q?`V(OMn?#!qNAo|F|)A5wId=jJE}87}??KT!>elI}k|7 zsY-RDEm>YlNA*Ww?Yr)eWI7BQ)fb50rL%e)Oa?mF@(&)&0%S3{ewJA6X~TXEa%!fT zt{`_%XG#J-vjp6t#$;!NeVBOzWWXj*Bqc-Jwn8HmEN=jv@;#ed!>w81GsP(ht}x%3 zC~{g}HnZ?L5i1_TanEn6oCFCoQu7e^FegwU1(hZ&&T;c$D8T)d;F=k=$eI!gRY^^Sl;m zQgiB8;i?RM2A^@SFidHS$LhIKzFab2o$aY;kFXTm5i9u^)iIsG3pO)eZNdOxLg?ON z(joLJ*Uy|W`$FBOTnr0ZAT)s~UGWEd)oS{7JY>OKoDNh-;Rx5WA1%`l*(gN2bcPM# zL>V+6r&tDidDiASwAaOvyTRzv&cQ za2<9x_GbG|+Fn@Ms8}>Yo|4v86wysd$!U|>N~@;0e#bddhWeDt4d>&phm})Sk|n7n zvvpFa^1E)4s-B=Ya#+Oo(s}t?Pvozs-+TH-n&iaU54Q^UG%a6RFk+8-d#Y)!7a<#J zWWR*;iK58Y*s$~U^}Di&yG1JVfRfrBa;2XlCqLnY4dip5C%0REz7dmIvUnr>)2mJ1 z_k(wCQBY9u@bsIdG?qUy@VUDjnsU7Fl3xk+2hsHX)*m5~5k5lm&`vH(c@b``fvB7- zR%g*~YfkNLc0e^w<^>#&vbpl$rgEWu6kOuQyacaVLDZ|ks(RX6y?bwSI;|${_0T6O z2p&aA6S{KrgSd7F%G9OWL_W~SXO1l1-%-6P7_YMuP=D<`$ujyyE`9aw7b|v!T1_|5 zwF9q*Kd%@P+C3F45ZS%cRora&W1K%1TGVzWWx8_>kM&%DmJONs8l#t)P>=f>va_?H z2A)}J+Q1!$ym*_MT4XiI*buQ{9-E4A3X9s_-i`~iR|vh?l?a&=()m#%_7P)IlF2vH zp7Q${nzN1^GT!oEn|=KaW@}4XW>T#*uP&FKy@!5NrM?97$U5+nF9;Vni1vp;n8LQ3e%p)aleCHL7W-jfbrHV)7wO#q95VtTG)C3j~| zs0kL9%oWB48RDs4{C#af%5znJ0Np>iJ({~$WBXpY)edVpm-b|Id&s4GYQ8R)g7w0{ z!ea$z``yuN@XDe$et%_Fw4)s3cIuh~BjYnEU4`A^2H`zdGCf_{9VV4koYV4Q9KpxS zHaWHdUDJ{8aE4y!;Ef!73%mTTq7zy-4@^D{W}Wc?J#$inoVr5E=0HO1?F^c!b{Sdw zVJ?fx$Zxr5!-sD2JF1z(KS_qSQ%5j$IM+Inx2*iXTV5TbYr*^)D&%#B?nFrJD55^( zrJt^8wMBJ%V8F5WHI!T-?GXbx6765$c_)?Ka9K&?!B=-~a@EYghSFTd``;HQNP}2) zv@DIIdnH8y=U1XWkaG_`E1Qz@<6MGXoL-6^#(2>3c34dI{Mw?g!xfSnD7%oIx7*~4 zT})#lG3_v?tBYloG-o*v>}(BGhUrcRWAWZdNx<^$ps^2>o_;u&)4Jt!UE*B|U1ODz z4`05*1~EF^Uw+w<|M0X4K{3;^Ulwx94Z#*oQt2atdfRzm-_bH5GDe1MP~^O#yi9vO zTS)&p#Vv&=JK3tfe~q?eq$b)bQ@u_Eb6S_89gJHUR=CE%wmHve(J|LY{yLyOe)H$U zwL{Zu2o0O|Vsy-o=`Ok9{TRFqQ4zVN`Xccy&AQa7nf`!%_fufUvLgF9d22mqyrp{$ zmnN68gDF@d72L8{C;oW%z=E@5PPDewZS{Q#mP+-tvY${Tp53Y*vs({vuAMHw^=l4L zv);sEJgZJ+9OQZrbT&@OzL2$7Q^?cA<-&m%pk(W@D$#%tT6*FAr(u7tz41(nG(L%m zp8IEw??$H3^gvZRh`Y1w5vtWumq%}CDyQkE>usdc-(xBuxL35Sf)hSodCha@rHYG; zEGB95ea(D;rp_blw~M4YS(VyJHMG19+_O52i0^O{-LGIqKC2LBM92j;H>Y^XfBalu zPQE)DktvAWM_x6 z=j8R;j$gW|sMY(^ZH|QI3iE@gt?R?3%XIjo^W5LZRU317c5Eha*CXQ6Y94MF!r^>b z`M3^=bd$@U_GS`_IB<4!dg+YPN&b774grkA{TF+2GRW9kwgK87S^7Vc0ua=q6kTjTwt;3a?E;(*b=ujOx@O}c9{veHP}eLU7R zc5|D2K5(8$O&!rz=Px|Zbv@+~@5c1{52>V1U)(E&I9yv?Gn5eJ4mc!zMnoN(fCe1S z5#kqGI9BP=%WhV)Fb7{$93q2=OHP#bN~L*YYl>J^gSa&6)tuu`0;5C~=JucS3QXt6 zb@fvohE{aUgKVM~Li*_CnAcfxi40G2j4aYzm-WR79b$hDSGA1LGp3!Q?%eI#OeR;> zbD{mC`!PmEbot^U7Ow7uD$jY~Ac;rJ3yRDV%V+Zy!>>9;{wX z4_@wozu}-{L@e&G_3-3v@8X|(IFPlvGgUI6t8y1rnNvl~QHTt$GYn8!N!P<#-IizV7nA1F7_0{Sa!CAa6Y(=?LvG@n#`*SwYo|6TO_)Ue z{b^N>HYvJ&(Y6a^?s)TVmv-i~`tfQ5=6U(njuCOr#}_?pRK@3Ovd1l}77E)gs^;*A z;B+?I%WHHk=Nabj%8~y*sbjS?I%_jKj2gS%=PaS8LbTXMJUsVvCX+@$wL8oFbQEcb z#f0!YqtT*gPdnBx+pvNTSMpxtzyTau%RlCsgcPmkSX3SUUS&0N6j4uB{JJvF<43l3=#jpW7KzVhoa*`k9WIAyZ<4l9^HJmQ~_D%9_1CnQ9tq-bzP;3R})7 zTWRiUR4sg(TDp`R*_2CiI*(`E*DF@{BZtjtm5ra&HaU!XT?Ya-R3%LgoeIyIY}B%L zbLnnJij~HXGYwp2=TK6KsXtQa+`M!g^?k_h6h60zEm6~;s!3&?--!}Jn0HeoqBPjmvDDpe&3;V!8Ae2Le${^H`?pUOYoLL^r-feN!CFUvzWIaG&b}|0I-F|P#zL*p zIk||m*DvSiba1#=NV9G)Uk8nP??Ixh;sEoZk0}BgV><}f>zKx#!2P)L#NScc_u5DU zq}X80nhsG!OjPVl(mmFz5|Xr%Hn|SbVMZB7(18_;g9}+lYwMRVQk#gDz!)y3SY0Y5 z_2s;;L9-lJI4bNbX_lQR_k+K`gLF0q%$@v6@^0p4yYWYF3jjxjA0s{6@8N2gr`UsY zO|$zxj+2&_?y^}Dier)04-D|_(lxr1GhzR&V1vB7#B>HS8S|+96XnL=5wH}atGS`N zPD^F8;vC!6Cz2_W=5rdu^G&OJ%~Z&Msy73MJw$X9Sz{^s8m8HuH*gJ8PPGF zJ$jPFOhKeI)=H?``SIBHq|?g9X}zuo76PbAQ$06WhL`_bhMSD8WMMXBv;1KnkbC{QPEi$|DTY{ct76lgUH%nHo7O;C zq<7q-&bMVAhxCAzG{F*)8qnzWwW0IOnetk&vu)s<9=pbw!PQs+_Un({eHz4H1uH;^jrg z9=~|;B2QRaK|%NSw!HHwM+yt|O|=3u^Sxco1U8mLi&SLz(MOkaxebEqGuU8v+5K~O zeXgW|_)TU`(WIr==~2a{#IWs=Bj_5tZDW^`@2hCX*5>C@BSPr5E$@+$5db&5dv`du zXLiMU#~y1waKC{QS8!=EYqp2i4bhV^{Ai_}HDPRDj5U~(qm@h3EmLf~lN46D@Sm&f zgd!erz=+w%T0Htu2)~+>kfKP^*7^mzoyo%FT3zipRmz%RZit;a;lOokw~Y=x88GYH`Pvb+k!pLb=##7yS9@+^8f^mp zx$7HiBTZDEYZ+Yah_l9>FN;vql~oQYgz7w_=GNx4ZHpMv&To9BerI>9GVY|p4a~v@ zv93>Nv5iQZq9WG9P$`+4{^S~upQqI|lN zQ>5Q&yb9LA`sZ6xn-z{HlqlZyZy61|ywb>VhrO-BwYWE zYF^$Q=DzhWVwE&w4GzVI0|UC)7^r(;cV_QScZ_SXi3M5YZmY~v&gP2D_R2>OtVMa8 zf8u_%Ft%c<7sQA63>@pKkAD;z0L zmKl0YIxoI(b#Xa`9k5Q56`RNcK~M>c$!b6CACArDnT^Xc!6q4t$+{m~P3lrgL=HX3gX_3zjOa8P+mv9UfW&wU4yd?n^Ej9GK>P0maQ^Ouo z1|=Kx&D-5+P-3ZJ={PMF#h{I^O{mSK&tg24P;6?V(q!;CP`=l+L9WZ&nLPBRb$nTS zun)agaR}EC@xPYf^MNH8EYU6K%~b>ggk+x*2Dq=i;!ZU z=+4GP3(0bAj9l25zpNRYIDXx*XtDFnA%|AhhhqiZ$7cGKll$%kQLXv$&L$?&`EK=F zPv4=n%AZcv{fr%Yd)&a+F;ibN#9U!(brw)t%e*_2x!r0iw#E*_nrE-b9mTJ3iY0$f z`Q3R^Hv0}e{o01@7!~6fOGL|D-p%F560pD}>J{#Ug=Qxm`519*sSk{YE@q}D(=2~T zRSbwqxh~+70s*rBuLxH^YP znE25E!p*G#L#u^vi!hu|OYCLNYfPya{hs3ryk=9ai!Rj1Y66=-G~a@3S612? zI+19mq$E=7#E&Y7EoVB*Kt`=10*;DRaLzw|bI#0|^@;9^5qA+mF@~#b*GjGg$zQe6 z^YD?_tr8@^t%b;Ld^J*eXj8{|UGFJIo!E!U!@F=B7q%A9rfr_y;AFcZt>SU54=Uhn zn)SPDWidtl`Q6(xW9UtOT8yXPaY7!=*={}k!R?JS%bCt^StxwnNok))Egn1_RJU%$ zGo7tb7R@*rLb=677kpzd)K+oVaV zH-BI*MykBWRD}_2ER?Oeg}qkD*2&>=Uv?Wn#?xQr-8GT##Atd94LvnerI7+TT1K&J zgB{r2{DxdP<&E?h775|7Y5m3rIfAGNHoAWv`w?hIlZs=~YD})=y9>vWwq8l}W*kUg zM~CfU!{ytwA@W-DWxUIcd<_}Aa;U{zY#$ARK7YivWs?!}84-3dk{-w#6p!jzROntz zb?XXNF6pLTMp=I-^XJ)VWJI(G?fMsfQ6=Kg?@0A1u$b*lkP_rRm$&$%1^|_2(0 zri#}>n~Ceg_6oLfO@fA!8l={o|L4N(#885OIZ&P%URx_iAvRuTRfKxXYs zRV!R(a=k6mKiM3EJ4v;yfElwhuXFM>p3_;W&j5sDvGG3-#|%IDFXBdD*ydT}U$@K0 zO^PURU@B{aBe-`zoOGb0Z+IrlE{BS+LyaK!T$Jn{C5_fd4VN0OPm@zLF(Nk7wCg%l zY##ehYaU`Qazi_=E_yV9U9oPZ_HCrQJMI>*j`H$9cn$rI$J!Kw_ruo zolUsRA%`*+ULOh<5*nj6s2-709GDJCqJ1ET^73D$m){*G4|}O#-zmw27kVX9}B-X-1`oQyM+?a+RWW<-cs z{yMCF^OTgBkCI6;b)oEwr)EjH3(O{igSHawTfQ+O^baT4i+t3J%PHBdfVOT=#dhLo z*u)Y^C1Y#(DJiO|s?caOR6jH{H1^G{g`;lxq%!HyIPaeE^&;n*Dj4N!GuH=kNTknA>0hx9~_%RilVC$kY!THnlsnuNN%e8KjU7As=# zsd7r|3RF{lE6oj8DJ0H#`5QI(QOl) z+bn&rK}@2w5XU}>p_Q!hzg@iq$bs1|jHseXdM$t95@@d4iPaD){(%2PL+di{mdV^*amE~$l$L05Zk7wAegT@n7Ts0j!8lI+!R5)daz}bXWEh>`(GQZ@f!8|BTAKE>!+$ z3X*)2Lo@ zi$7UgA@1lIu0FOtGmYRuA|efqN#j9!ubr+2dzu&rznNGu#8Bygo`Muc$>9hsrZLUo z9Q#w0@$lz>az|`{EV9|Nncqk7TEZGxYHY3Q+T75v`}AeYN`&K;v~T&E4UDuhoZwpZ z`U;+cQ`D%Yq3QdhN7P_K%zoGgG>cB0fGzH`Zf~B5!@_$tup*L<*4jwRdGe}K%YnW< zjkDG)A}9vUdg>qap{--i-Bf3?x^w4;0V-3;KWrIzth6J=6D#5$7l(xwMfvfpN9(FS zB`0eTQ-!|n?akk7BH8zPwP6~^3axN_^d+y;Z(tgQEliZyojmvKmp(m0+BXaFwi5S4 zuwfU$RnyHsn;9Y*W*@j)!MjVDYQJ!S1p_+vCylGS9yzCAcguA)S_JRh2ZxAH{Y&6)kejb7;N}}EE?LF2FYhuZ6f#cxOxnTY0^VHmUBy|02RVzJB z3(Y3ER3AI!&rdX!0sizBrrOt6`-k~{U}Zdrxcz^+`^u;&yRUt0d(L_kWUyOc&n=@jXbE(eru-aVtg(8uS)fBiqaYrXe!`GGa} zzR!K`ea^Mx+WQRJHC)q3(#hnB<(s7FNpr&W>blwPmd;nq&7}L9U;n^cZjxn;NRHhh z!H$7~F;-61bND)Z?Y^)hV$r#ngfmkJLYpSKkEVX@(@hc2?eO z-?psh+&gUVS+LvSLyj}t`l2ZN7#eK<-Qaj*iD4?V(rt!?ZHxggq^p6O=FFl5`mFtH z0M3EDL}`6o9b0nk@lnOUyuN*8G#XYB(lyg5x?`QHyjd7Bqb54-+xOZ%j*CHH<}@0+ zJj3bU6t3rTKBWpMLC1zo(|(-vIrgzrP7XZmm9C;=d9eucq(ek*G6{ow!r;J-*7#0)d+!r z(ADpT%tt)b(jrYv${;bpqEcxBA9nD6&KHONj5$=-x>@3nxHvd-gZP*oX zXAL7%+aE^5>0nTp^}7uruY?JDPPK6`M7C&iZuYZl;YB!@CXzzz_SbHu#%;}^GHiD0 z>SOPJygAp-xHm*iRpjFML`B+QI?Ln6k=BfEGXTyGe`IHGVb4tYt@v6_&IgS$);hlg zEtcAX(cMM0oGGl75#HW`=&8TKW{z7B`icrSl7xgQzm?`!Z&?L%bNzIFT%^t)r!BJa z{em3kfF@i zNOYsrtV^*WL~@j}V`M&R)`gr_Ys!cXD3HfoNG`-sL#MB3L)YKaOmLskYK8Kg!bdB* zJMm!aiDr_W>la7O<0A#X<#1aYWn5QXn_Di`x~D!rhgGM2E!J{R)gl@x7|@yMG#|5CF*C}^m%+od@zUYm^J zqM*l*g4tO3x2gEw(MKGJ?u;xn`tYHZ)V|gE&&IixDJFL$hT5*CxU!tlh1o z8L#kWwnqLGQyYSur3^Ro@|M8FIB3smzFQwof3q`us?Wi{{0||livhlKF)@sa%X zSABiGn`G?zqbFDgZH`cjskJMMOSCV(HM_o^rgeoVW#6y+?!d!FnUngvMa)~#2i&!D&j<;Ars-duX^Lg*ojrd#Fmt{CL59(PYVbLh>4Zv zCNa<2WZSgJX<0?g(f=t-w~F$w5knme6H0RJvS}J^ zm&vwkHnl%fDvGOTy*ED)X_rT@b%wU+$t`VdZ7VA)Tie{O+03jgK`CzpY}pq(JoHO; zHJCs}B#v)9*4T9P*9H0RzsYyNT)naFJ~%I{FBCXv{8mU#wd&@Xj>{~ix=t112l71x z)jeaynR;0cpX1=LFgI^hiRFxHNcpVUhBji^^iAL|Qn#75@ z>YfQ$+zIeOMp%vq({YzdoYZn)Fxt?3s4O*h$hRseBt%0~Q}gQ8o6AbaL9muUsnRo* z=V=EJsgpWvbcUnNxhyd0QNK>QN*(8iiH{7)cj%^wD-SiNZf2tL(hK=GX`@@zHu|KN z-^#>dPgSO?PaGC3ID|kjvNW-o#t}|M&Yp_l?kV5oDWR6EI&E$cWZ<0MKl**mP102-_^zs0aN2-I-o`j3 zpDS6XlR^D~6UPTh3hUciMFeFr@oxlvjqprIcsH6?Xw5WBZkylc4sCNc=t)rfy38X$ ztEJv_B~Qt?21*(kw6-i?eP?FcDA3rkD5LjUK^04ID@rE|WSUp<=q}DE^_0t-ZZ@?U zOD{a|^-pWgrG`2BdxFmh#cUsyU9OK%b`#Gu+}&QR%bKLrLz>}cd2kzfZ*3kZ3Y6dz zyrI$Tr4G9<@?|Sq-#nn=E=g4rdpfz&K>BWWd1Kq7Pg!ib;8Mq2w(jhphvRgI#)}%g zoJxBmCzsBt50pFh1&;nrU1czc=JCI4&5 ztIZfyw^6S42kpX>pIK?3|Bh<12J69%g7)gkm3A}VtnFy~d5uTem1c8M38nU5y?$p& z@fjg{v6~Qc=rzjA$>9Z#Ws)q=E}>;068$Mju{Tul`J}oqt$WwBtNO$~2*3c>6pco& zudjdn`0-zlc`EmZ>4KE@y+f=alCdqb%k?J}SY?oO_07%C)?ZZ(2Z{vKR-T$vHRZfL zUuP9sSFGG-+zgQ&c0Q-@1{RII0W}F~Vz_OTNOY%`gFkem{f*cZ(|DRHM!CK~o>i*) z%{ybsh>#Fw`!f;jb#Ck|EOMAIw{W?DtPK5bC z_t;xWn^yl-VL}0^5xgGUFdmFfY>ZxLHTa>W?W`}5BH`>MU9-l`)UVpfA2sJjNXLy3 zC+xwy36=^!xTS5{E&@jn0(__jWjyH{KS$_KXAl}Z-VfvA^4+Eo0yTss& zR@HE9P1$iG#%KHYhWSw9C`dMR*|Nv#_E}qM^5a{t-X%*Vuyb#Jl;C@nIJvWd938eM z(fzcSsFm{xWqx4&&N@qc}6)&a)mRcAlw3Wdp%^>dMHs(sWGoi-^$BF$Yno*%`39V{DwbKDdl; zcl%Ro(l_y`<*a5%ALC+zH+lp(M_OKp@QH|s z@bTqCf2xd(#>vHqd3~VF5D^K!B2a8gAQxUJJ1CG{VI+Ere18RRHW`sAjmJ2Pi(K8S z)P)(`lqloQ(>Eidqd@Qek-5cUi-$a)k3zif->SC{sJ)7YCad&UHFV8I8OisP+uIx_ zGR2DR^-@#LZrKSFF~eb=y&7wwAA@C#wbBu2) zPDPg#Ndj4*%|V$qD|_rqryB#2G{^UJFYnJl7Ler`7&yqfHA%*0rJ$tL(A31m&AsAM z-qF!9;hP%pAFb?`9j6C#pU>PduvG%9L> zCDD;s*VnYudMB7yV^c?={D=?j$}PkN!u%)_mL?5HGMnjqFBgrcT3qvO(TkE-(%(z8 z$jcGMjejNI-^syKxoL5ur@v9}zAR6d#38ndEq&Y>62r4!mR*jxp7&$Kf3Vj-J{Xxu zwXWOkl&ZwX)sswTQ0(~wUqU@O;1Y`bT7O) z*xGtENwb-UXCQDrW;!n7<=MyP;|tl1Xr$Y{m3rC@h1wH5Q(oR%|DBC*nY5@?{ACu| zv@LUo)3g7wa_?>9-m=nLdq5(hBSJT<`uDW5+zoZ0Z$jXwU<%70-Q^4WlEQl z8ph#m`-*H6%6x>z&ipcy)FR!>o7;NXcc!EAkshLUyL~RU?ueyQt0oRUC+CR>|77;Z zFHwu^1_`Gv(@ho%vxQOQ%TCUqZN3DQ%4Fu^>Uc`nT)7vr+I_o-h} zRdrs5K6?}kL(t{iw<`V+V&UMwblWucXlh1A=zRl`lX`hJZJS3VVx3l~ z`x2Y1Kn>=Q`K{d6Smx^qNs!SB^NK><*FUFc62Np zn(tC8I?KrkIgS>vA{rZ^=qyBbG8A^eF(Z*Ds{4ufg|LocU0T@0u&x`}4yfpWhQ-Lm zJH$$fe;u0t2D8>iX;^jy-}e*(mKo*=uURDoaU8iHlv+-q=p5uVk zo0`$@F6CfC5oFD))DapbJ6++QutuV|%gys{W^8>fJ8mG~dzcc~WWC99V{vHm=mxmz z>&JLYPX1?jomAIqXTJp{Qbf)#F-HK=?E%uSLWp2WU|B+9f^zL{?#_}Ljz2cYIi}Bb zu>0=$%5Up#c2woZ{v{)dC;4GuM1=>HhI8GkD|x(M3G_71`H)S$;9R@rx^OB!KWT#y ztOOC!T`DN63Z3>nPqOJBWEeG;K9474yjd#*-MQD{31zXvz;l{gna2~&qC1E2ruyDx7hu0ePATWXA7+Kw2c3GuX%TL#lR zLzNl)G<~3)t-L{+np?`#3g|yzUyvM}ZM4`&MDzhs`JD&@%p#xz=?*>U+JXKtM0e>p zE512Vb5p($EAhbO-b>ep5qG0#h(l=t^e$VKT=zG}ELT7!*G;I~2XmFct{TEQT}PoJ z=LZ<^N?4G(Y;9~dukcl;GR_0@U6Hq_9q<#(7UKP7)w1D0*vb#6yy6exmLg_JNe__o z-w8%AT-|mLGQpI@so?r@8?cQA)aPOE$&5v35bHm&&t4~ocKWxi{ichI!F@Kft~#UY z$}Y*t!U8o|4dZrU;o+Ox9*g_<3FnR6zCC_FyY^uOL|QzJ{g2;pqbC*Y>q>^V=l8W% zk>_+2m;;(Ndkr7n1A%h@j1gdk!wT^B_NEU=PD`ubq9Vf|${~HDFMqtWF(%%gJ^ab@ z6eEPT<@fS+N&H9*)9o_yUXDC%rQuaqJR+5@+jtr}C~|ReLE&IgQTOaJ>iYF4hNKIG zVCWv8hng~%n^Ze23o{-)OLFi{)I1EPHEqU7J)1T$qr32C+t*Q_2da6(76neh-qW`b zpy2`nDq_~5@Hy{N9ZkuM>N1g;I&qqA!zwcT6+Ia()ukxGK@dV4PX`8P{kyuyCGHKB zN2n=XW)mCkfZ00I3=$bFgF*pgwP0?{y)GM|_bFXj+@hDEATvC5iYvfuU9Po&lC zAJ(ScA^+??AqFA~Ler!TGVPS}Dlc0X>x*6I$G(@{P()N)iwqRm8fx%hj-7!I#fYl4 znX5y;7`z>bxIw#RNs_9z*UJ&qQfCr0u;59FfsF~{6>4I)BwAnE6wx=E&AtV1PmkX_ z>|$_JyzV{T@vcbv32)LFfx|inmnjaT%?1vdGaMJGE#y+Zh9J%WB=?rmzkC&T$CHj{ zmgUw$AD@lgbH1Y@Z3Gsqsh8YLPr`}8sMG_91^v-5&VmrmNSB}Bo-5;HPyHEUS4!%6 zeEy{hV#HcVH<BO^-@nD(XJ7d?ly==U>&(A(f$$3?RD~H$P+^d2DXtTMoy~9k* zc@MAGAC7Xp4s7cx&#_rScbWU{g<>aQ=9aXVUXi#J_d`-sFG}zZIMlSb4Ih8?-er~I z5&zahGUWRaE|FJsblg6~{?$fss+7#l&9^)%yJj6d%fwgbOxjC)xvk?nfJN-K^3`4p zHJN(oDE>_WYOafkFLst84KGyAE>#7irB1~x)fU+3w!TN)SLQpmhE)#63@>{7# zp*ow0==`P99QYGZ-Sk2Qgcj3WX>|`y`4ac`of1iY!bxT0-Zs^z#5$-%n9Po^%Wd6a zpfBMNGo`M%IC$Z3B1H|kYQ@~(+M6MP7(KwX5ipk*7M9+QJd~n%iC>$H)l-zOTW|S6 zJNaVjd_F7Je%tC4G~H$w2@hc=UTPQ@JriWO$a_->n6sDY(l$3;Z0roO14fqxS z21P|$M>zf0G?*fxJP?fI{cse8w&n2RdYNAKlWn{Gj5T{;DK>|q{cDnwRh@+$KV<&I z$CGk}mSmMIw*C7a1&9kRHoYl)A>(%r@E7b~I8X`j$KKvvm;1VzS!&H_+djVu;X0YG zx5pcAMT7rDboA+yCFEd3inaLgX=wb)#wJfrK6dm1`AL9S2uF^`F&%^5ho$bj53OTu zt}o)6aC9@!QTqG)fz^py`YXF@c5yv&^c3P!N9GH31`Oe3=~0LXmXOVFVf`4 z#-!hk+fkf6S$jd29`;hD;88M>nLxuMTxm9?1M~rK!ue}0?f9PF;E0dUE9;o?_{Ws5 zb&PaQF#8aUPF`&IWm?+h&4P!tr)#}ruvjcmL}~d$@$2)9$Y5XsxyTCdB?>#EPq)nE z6d1pBR6Y0sgOXiBH!xR`)701x-rL#fv1rTlc!8&?p6i1tBVyW347*qGn6s?Es5VnF zFY*4pu`@SihFL;rA;#)E_}MbzBim~EnE>I*F{LLFa*SUHx5K`9rG?z^c}~temAp>u ztE+beZeVg(3Q4gamQ=TA&BME-I_?Gd!p{JG?jt>TFP@wI5bs|k`6z_m>UHC-*^%*u zhj{o)_e}HdDmzE`;aiU(8p8)OO-cpMOv4q)kzDyHKd=wm+7cUulFI)AP9*+18a;i+ zkBoZW2kGbJKC15y#L&8Fhl$C_(t)}9`pb(FvtpWXV7I<=srcMId-*6J?HdT_y8sx& zb@EygY5Z7{E1j)70HM(z(5q{MJOrKL$)VIBgJ%_gK=?kACEWV?)rXQ^w>%-hFXe1TBK=?bUNfi8BP`4$Tg^ zs)$jaw(V5{7wdQ2B3h^go-K?1fejI&jC>bUSe3Ij31Y9A1Dueo&>ZmV~(mKDN3{K zm?)Xdx$p6wjW0yn9riRwMxI)%`g~`tQ6>ZXF@Br8<;nC6;z4?_k{#hr8_nJm#2M=M z?opHqaz?uM2ev9AOrH85;q%}f%K?BA3dZQS-+LtyjRN+8J1d_ysi_Q}=>_I@Av_9ex8#95jQuwyhEQob15G@7-MwIQWJBG)Kdn^ zFEX{YH+C3m%xQu;1-|j;|Tuzdd5|!Jd{R?4jpH}T1`Y*TQKZ925r?~ zc;voSuyc)#ojiFG{~5*UC2~wZDZ#JopfcXNj;34*IAb%Y?G+h2Lzc!Z~Y z7c7mDkr4n?C?|lHbM$x#gjly~QDElx&21Ow;qT6n=`*&6s2)4v-W{n^T->xX9dNE7J;NJfLF;5(P literal 0 HcmV?d00001 diff --git a/apps/emqx_gateway/src/coap/emqx_coap_channel.erl b/apps/emqx_gateway/src/coap/emqx_coap_channel.erl index c208d00f8..7612a6142 100644 --- a/apps/emqx_gateway/src/coap/emqx_coap_channel.erl +++ b/apps/emqx_gateway/src/coap/emqx_coap_channel.erl @@ -27,10 +27,11 @@ -export([ info/1 , info/2 , stats/1 - , auth_publish/2 - , auth_subscribe/2 - , reply/4 - , ack/4 + , validator/3 + , get_clientinfo/1 + , get_config/2 + , get_config/3 + , result_keys/0 , transfer_result/3]). -export([ init/2 @@ -60,9 +61,16 @@ keepalive :: emqx_keepalive:keepalive() | undefined, %% Timer timers :: #{atom() => disable | undefined | reference()}, + token :: binary() | undefined, config :: hocon:config() }). +%% the execuate context for session call +-record(exec_ctx, { config :: hocon:config(), + ctx :: emqx_gateway_ctx:context(), + clientinfo :: emqx_types:clientinfo() + }). + -type channel() :: #channel{}. -define(DISCONNECT_WAIT_TIME, timer:seconds(10)). -define(INFO_KEYS, [conninfo, conn_state, clientinfo, session]). @@ -98,13 +106,18 @@ init(ConnInfo = #{peername := {PeerHost, _}, #{ctx := Ctx} = Config) -> Peercert = maps:get(peercert, ConnInfo, undefined), Mountpoint = maps:get(mountpoint, Config, undefined), + EnableAuth = maps:get(enable, maps:get(authentication, Config)), ClientInfo = set_peercert_infos( Peercert, #{ zone => default , protocol => 'coap' , peerhost => PeerHost , sockport => SockPort - , clientid => emqx_guid:to_base62(emqx_guid:gen()) + , clientid => if EnableAuth -> + undefined; + true -> + emqx_guid:to_base62(emqx_guid:gen()) + end , username => undefined , is_bridge => false , is_superuser => false @@ -116,48 +129,52 @@ init(ConnInfo = #{peername := {PeerHost, _}, , conninfo = ConnInfo , clientinfo = ClientInfo , timers = #{} + , config = Config , session = emqx_coap_session:new() - , config = Config#{clientinfo => ClientInfo, - ctx => Ctx} , keepalive = emqx_keepalive:init(maps:get(heartbeat, Config)) }. -auth_publish(Topic, - #{ctx := Ctx, - clientinfo := ClientInfo}) -> - emqx_gateway_ctx:authorize(Ctx, ClientInfo, publish, Topic). +validator(Type, Topic, #exec_ctx{ctx = Ctx, + clientinfo = ClientInfo}) -> + emqx_gateway_ctx:authorize(Ctx, ClientInfo, Type, Topic). -auth_subscribe(Topic, - #{ctx := Ctx, - clientinfo := ClientInfo}) -> - emqx_gateway_ctx:authorize(Ctx, ClientInfo, subscribe, Topic). +get_clientinfo(#exec_ctx{clientinfo = ClientInfo}) -> + ClientInfo. + +get_config(Key, Ctx) -> + get_config(Key, Ctx, undefined). + +get_config(Key, #exec_ctx{config = Cfg}, Def) -> + maps:get(Key, Cfg, Def). + +result_keys() -> + [out, reply, connection]. transfer_result(From, Value, Result) -> - ?TRANSFER_RESULT([out], From, Value, Result). + ?TRANSFER_RESULT(From, Value, Result). %%-------------------------------------------------------------------- %% Handle incoming packet %%-------------------------------------------------------------------- -%% treat post to root path as a heartbeat -%% treat post to root path with query string as a command -handle_in(#coap_message{method = post, - options = Options} = Msg, ChannelT) -> - Channel = ensure_keepalive_timer(ChannelT), - case maps:get(uri_path, Options, <<>>) of - <<>> -> - handle_command(Msg, Channel); +handle_in(Msg, ChannleT) -> + Channel = ensure_keepalive_timer(ChannleT), + case convert_queries(Msg) of + {ok, Msg2} -> + case emqx_coap_message:is_request(Msg2) of + true -> + check_auth_state(Msg2, Channel); + _ -> + call_session(handle_response, Msg2, Channel) + end; _ -> - call_session(received, [Msg], Channel) - end; - -handle_in(Msg, Channel) -> - call_session(received, [Msg], ensure_keepalive_timer(Channel)). + response({error, bad_request}, <<"bad uri_query">>, Msg, Channel) + end. %%-------------------------------------------------------------------- %% Handle Delivers from broker to client %%-------------------------------------------------------------------- handle_deliver(Delivers, Channel) -> - call_session(deliver, [Delivers], Channel). + call_session(deliver, Delivers, Channel). %%-------------------------------------------------------------------- %% Handle timeout @@ -172,7 +189,7 @@ handle_timeout(_, {keepalive, NewVal}, #channel{keepalive = KeepAlive} = Channel end; handle_timeout(_, {transport, Msg}, Channel) -> - call_session(timeout, [Msg], Channel); + call_session(timeout, Msg, Channel); handle_timeout(_, disconnect, Channel) -> {shutdown, normal, Channel}; @@ -238,48 +255,123 @@ ensure_keepalive_timer(Fun, #channel{config = Cfg} = Channel) -> Interval = maps:get(heartbeat, Cfg), Fun(keepalive, Interval, keepalive, Channel). -handle_command(#coap_message{options = Options} = Msg, Channel) -> - case maps:get(uri_query, Options, []) of - [] -> - %% heartbeat - ack(Channel, {ok, valid}, <<>>, Msg); - QueryPairs -> - Queries = lists:foldl(fun(Pair, Acc) -> - [{K, V}] = cow_qs:parse_qs(Pair), - Acc#{K => V} - end, - #{}, - QueryPairs), - case maps:get(<<"action">>, Queries, undefined) of - undefined -> - ack(Channel, {error, bad_request}, <<"command without actions">>, Msg); - Action -> - handle_command(Action, Queries, Msg, Channel) - end +call_session(Fun, + Msg, + #channel{session = Session} = Channel) -> + Ctx = new_exec_ctx(Channel), + Result = erlang:apply(emqx_coap_session, Fun, [Msg, Ctx, Session]), + process_result([session, connection, out], Result, Msg, Channel). + +process_result([Key | T], Result, Msg, Channel) -> + case handle_result(Key, Result, Msg, Channel) of + {ok, Channel2} -> + process_result(T, Result, Msg, Channel2); + Other -> + Other + end; + +process_result(_, _, _, Channel) -> + {ok, Channel}. + +handle_result(session, #{session := Session}, _, Channel) -> + {ok, Channel#channel{session = Session}}; + +handle_result(connection, #{connection := open}, Msg, Channel) -> + do_connect(Msg, Channel); + +handle_result(connection, #{connection := close}, Msg, Channel) -> + Reply = emqx_coap_message:piggyback({ok, deleted}, Msg), + {shutdown, close, {outgoing, Reply}, Channel}; + +handle_result(out, #{out := Out}, _, Channel) -> + {ok, {outgoing, Out}, Channel}; + +handle_result(_, _, _, Channel) -> + {ok, Channel}. + +check_auth_state(Method, #channel{config = Cfg} = Channel) -> + #{authentication := #{enable := Enable}} = Cfg, + check_token(Enable, Method, Channel). + +check_token(true, + #coap_message{options = Options} = Msg, + #channel{token = Token, + clientinfo = ClientInfo} = Channel) -> + #{clientid := ClientId} = ClientInfo, + case maps:get(uri_query, Options, undefined) of + #{<<"clientid">> := ClientId, + <<"token">> := Token} -> + call_session(handle_request, Msg, Channel); + #{<<"clientid">> := DesireId} -> + try_takeover(ClientId, DesireId, Msg, Channel); + _ -> + response({error, unauthorized}, Msg, Channel) + end; + +check_token(false, + #coap_message{options = Options} = Msg, + Channel) -> + case maps:get(uri_query, Options, undefined) of + #{<<"clientid">> := _} -> + response({error, unauthorized}, Msg, Channel); + #{<<"token">> := _} -> + response({error, unauthorized}, Msg, Channel); + _ -> + call_session(handle_request, Msg, Channel) end. -handle_command(<<"connect">>, Queries, Msg, Channel) -> +response(Method, Req, Channel) -> + response(Method, <<>>, Req, Channel). + +response(Method, Payload, Req, Channel) -> + Reply = emqx_coap_message:piggyback(Method, Payload, Req), + call_session(handle_out, Reply, Channel). + +try_takeover(undefined, + DesireId, + #coap_message{options = Opts} = Msg, + Channel) -> + case maps:get(uri_path, Opts, []) of + [<<"mqtt">>, <<"connection">> | _] -> + %% may be is a connect request + %% TODO need check repeat connect, unless we implement the + %% udp connection baseon the clientid + call_session(handle_request, Msg, Channel); + _ -> + do_takeover(DesireId, Msg, Channel) + end; + +try_takeover(_, DesireId, Msg, Channel) -> + do_takeover(DesireId, Msg, Channel). + +do_takeover(_DesireId, Msg, Channel) -> + %% TODO completed the takeover, now only reset the message + Reset = emqx_coap_message:reset(Msg), + call_session(handle_out, Reset, Channel). + +new_exec_ctx(#channel{config = Cfg, + ctx = Ctx, + clientinfo = ClientInfo}) -> + #exec_ctx{config = Cfg, + ctx = Ctx, + clientinfo = ClientInfo}. + +do_connect(#coap_message{options = Opts} = Req, Channel) -> + Queries = maps:get(uri_query, Opts), case emqx_misc:pipeline( [ fun run_conn_hooks/2 , fun enrich_clientinfo/2 , fun set_log_meta/2 , fun auth_connect/2 ], - {Queries, Msg}, + {Queries, Req}, Channel) of {ok, _Input, NChannel} -> - process_connect(ensure_connected(NChannel), Msg); + process_connect(ensure_connected(NChannel), Req); {error, ReasonCode, NChannel} -> ErrMsg = io_lib:format("Login Failed: ~s", [ReasonCode]), - ack(NChannel, {error, bad_request}, ErrMsg, Msg) - end; - -handle_command(<<"disconnect">>, _, Msg, Channel) -> - Channel2 = ensure_timer(disconnect, ?DISCONNECT_WAIT_TIME, disconnect, Channel), - ack(Channel2, {ok, deleted}, <<>>, Msg); - -handle_command(_, _, Msg, Channel) -> - ack(Channel, {error, bad_request}, <<"invalid action">>, Msg). + response({error, bad_request}, ErrMsg, Req, NChannel) + end. run_conn_hooks(Input, Channel = #channel{ctx = Ctx, conninfo = ConnInfo}) -> @@ -291,8 +383,7 @@ run_conn_hooks(Input, Channel = #channel{ctx = Ctx, end. enrich_clientinfo({Queries, Msg}, - Channel = #channel{clientinfo = ClientInfo0, - config = Cfg}) -> + Channel = #channel{clientinfo = ClientInfo0}) -> case Queries of #{<<"username">> := UserName, <<"password">> := Password, @@ -301,8 +392,7 @@ enrich_clientinfo({Queries, Msg}, password => Password, clientid => ClientId}, {ok, NClientInfo} = fix_mountpoint(Msg, ClientInfo), - {ok, Channel#channel{clientinfo = NClientInfo, - config = Cfg#{clientinfo := NClientInfo}}}; + {ok, Channel#channel{clientinfo = NClientInfo}}; _ -> {error, "invalid queries", Channel} end. @@ -324,7 +414,8 @@ auth_connect(_Input, Channel = #channel{ctx = Ctx, {error, Reason} end. -fix_mountpoint(_Packet, #{mountpoint := undefined}) -> ok; +fix_mountpoint(_Packet, #{mountpoint := undefined} = ClientInfo) -> + {ok, ClientInfo}; fix_mountpoint(_Packet, ClientInfo = #{mountpoint := Mountpoint}) -> %% TODO: Enrich the varibale replacement???? %% i.e: ${ClientInfo.auth_result.productKey} @@ -334,27 +425,33 @@ fix_mountpoint(_Packet, ClientInfo = #{mountpoint := Mountpoint}) -> ensure_connected(Channel = #channel{ctx = Ctx, conninfo = ConnInfo, clientinfo = ClientInfo}) -> - NConnInfo = ConnInfo#{connected_at => erlang:system_time(millisecond)}, + NConnInfo = ConnInfo#{ connected_at => erlang:system_time(millisecond) + , proto_name => <<"COAP">> + , proto_ver => <<"1">> + }, ok = run_hooks(Ctx, 'client.connected', [ClientInfo, NConnInfo]), Channel#channel{conninfo = NConnInfo}. process_connect(Channel = #channel{ctx = Ctx, + session = Session, conninfo = ConnInfo, clientinfo = ClientInfo}, Msg) -> - SessFun = fun(_,_) -> emqx_coap_session:new() end, + %% inherit the old session + SessFun = fun(_,_) -> Session end, case emqx_gateway_ctx:open_session( Ctx, true, ClientInfo, ConnInfo, - SessFun + SessFun, + emqx_coap_session ) of {ok, _Sess} -> - ack(Channel, {ok, created}, <<"connected">>, Msg); + response({ok, created}, <<"connected">>, Msg, Channel); {error, Reason} -> ?LOG(error, "Failed to open session du to ~p", [Reason]), - ack(Channel, {error, bad_request}, <<>>, Msg) + response({error, bad_request}, Msg, Channel) end. run_hooks(Ctx, Name, Args) -> @@ -365,24 +462,20 @@ run_hooks(Ctx, Name, Args, Acc) -> emqx_gateway_ctx:metrics_inc(Ctx, Name), emqx_hooks:run_fold(Name, Args, Acc). -reply(Channel, Method, Payload, Req) -> - call_session(reply, [Req, Method, Payload], Channel). - -ack(Channel, Method, Payload, Req) -> - call_session(piggyback, [Req, Method, Payload], Channel). - -call_session(F, - A, - #channel{session = Session, - config = Cfg} = Channel) -> - case erlang:apply(emqx_coap_session, F, A ++ [Cfg, Session]) of - #{out := Out, - session := Session2} -> - {ok, {outgoing, Out}, Channel#channel{session = Session2}}; - #{out := Out} -> - {ok, {outgoing, Out}, Channel}; - #{session := Session2} -> - {ok, Channel#channel{session = Session2}}; - _ -> - {ok, Channel} +convert_queries(#coap_message{options = Opts} = Msg) -> + case maps:get(uri_query, Opts, undefined) of + undefined -> + {ok, Msg#coap_message{options = Opts#{uri_query => #{}}}}; + Queries -> + convert_queries(Queries, #{}, Msg) end. + +convert_queries([H | T], Queries, Msg) -> + case re:split(H, "=") of + [Key, Val] -> + convert_queries(T, Queries#{Key => Val}, Msg); + _ -> + error + end; +convert_queries([], Queries, #coap_message{options = Opts} = Msg) -> + {ok, Msg#coap_message{options = Opts#{uri_query => Queries}}}. diff --git a/apps/emqx_gateway/src/coap/emqx_coap_frame.erl b/apps/emqx_gateway/src/coap/emqx_coap_frame.erl index 9a53f3e01..c1bc08928 100644 --- a/apps/emqx_gateway/src/coap/emqx_coap_frame.erl +++ b/apps/emqx_gateway/src/coap/emqx_coap_frame.erl @@ -161,9 +161,7 @@ encode_option(location_query, OptVal) -> {?OPTION_LOCATION_QUERY, OptVal}; encode_option(proxy_uri, OptVal) -> {?OPTION_PROXY_URI, OptVal}; encode_option(proxy_scheme, OptVal) -> {?OPTION_PROXY_SCHEME, OptVal}; encode_option(size1, OptVal) -> {?OPTION_SIZE1, binary:encode_unsigned(OptVal)}; -%% draft-ietf-ore-observe-16 encode_option(observe, OptVal) -> {?OPTION_OBSERVE, binary:encode_unsigned(OptVal)}; -%% draft-ietf-ore-block-17 encode_option(block2, OptVal) -> {?OPTION_BLOCK2, encode_block(OptVal)}; encode_option(block1, OptVal) -> {?OPTION_BLOCK1, encode_block(OptVal)}; %% unknown opton diff --git a/apps/emqx_gateway/src/coap/emqx_coap_impl.erl b/apps/emqx_gateway/src/coap/emqx_coap_impl.erl index 6d27cd85a..09426a13d 100644 --- a/apps/emqx_gateway/src/coap/emqx_coap_impl.erl +++ b/apps/emqx_gateway/src/coap/emqx_coap_impl.erl @@ -57,17 +57,14 @@ init([]) -> %%-------------------------------------------------------------------- on_insta_create(_Insta = #{id := InstaId, - rawconf := #{resource := Resource} = RawConf + rawconf := RawConf }, Ctx, _GwState) -> - ResourceMod = get_resource_mod(Resource), Listeners = emqx_gateway_utils:normalize_rawconf(RawConf), ListenerPids = lists:map(fun(Lis) -> - start_listener(InstaId, Ctx, ResourceMod, Lis) + start_listener(InstaId, Ctx, Lis) end, Listeners), - {ok, ResCtx} = ResourceMod:init(RawConf), - {ok, ListenerPids, #{ctx => Ctx, - res_ctx => ResCtx}}. + {ok, ListenerPids, #{ctx => Ctx}}. on_insta_update(NewInsta, OldInsta, GwInstaState = #{ctx := Ctx}, GwState) -> InstaId = maps:get(id, NewInsta), @@ -85,12 +82,10 @@ on_insta_update(NewInsta, OldInsta, GwInstaState = #{ctx := Ctx}, GwState) -> end. on_insta_destroy(_Insta = #{ id := InstaId, - rawconf := #{resource := Resource} = RawConf + rawconf := RawConf }, - #{res_ctx := ResCtx} = _GwInstaState, + _GwInstaState, _GWState) -> - ResourceMod = get_resource_mod(Resource), - ok = ResourceMod:stop(ResCtx), Listeners = emqx_gateway_utils:normalize_rawconf(RawConf), lists:foreach(fun(Lis) -> stop_listener(InstaId, Lis) @@ -100,10 +95,9 @@ on_insta_destroy(_Insta = #{ id := InstaId, %% Internal funcs %%-------------------------------------------------------------------- -start_listener(InstaId, Ctx, ResourceMod, {Type, ListenOn, SocketOpts, Cfg}) -> +start_listener(InstaId, Ctx, {Type, ListenOn, SocketOpts, Cfg}) -> ListenOnStr = emqx_gateway_utils:format_listenon(ListenOn), - Cfg2 = Cfg#{resource => ResourceMod}, - case start_listener(InstaId, Ctx, Type, ListenOn, SocketOpts, Cfg2) of + case start_listener(InstaId, Ctx, Type, ListenOn, SocketOpts, Cfg) of {ok, Pid} -> ?ULOG("Start coap ~s:~s listener on ~s successfully.~n", [InstaId, Type, ListenOnStr]), @@ -148,8 +142,3 @@ stop_listener(InstaId, {Type, ListenOn, SocketOpts, Cfg}) -> stop_listener(InstaId, Type, ListenOn, _SocketOpts, _Cfg) -> Name = name(InstaId, Type), esockd:close(Name, ListenOn). - -get_resource_mod(mqtt) -> - emqx_coap_mqtt_resource; -get_resource_mod(pubsub) -> - emqx_coap_pubsub_resource. diff --git a/apps/emqx_gateway/src/coap/emqx_coap_message.erl b/apps/emqx_gateway/src/coap/emqx_coap_message.erl index 52a03c418..2e9fb144e 100644 --- a/apps/emqx_gateway/src/coap/emqx_coap_message.erl +++ b/apps/emqx_gateway/src/coap/emqx_coap_message.erl @@ -24,7 +24,13 @@ %% convenience functions for message construction -module(emqx_coap_message). --export([request/2, request/3, request/4, ack/1, response/1, response/2, response/3]). +-export([ request/2, request/3, request/4 + , ack/1, response/1, response/2 + , reset/1, piggyback/2, piggyback/3 + , response/3]). + +-export([is_request/1]). + -export([set/3, set_payload/2, get_content/1, set_content/2, set_content/3, get_option/2]). -include_lib("emqx_gateway/src/coap/include/emqx_coap.hrl"). @@ -42,10 +48,13 @@ request(Type, Method, Content=#coap_content{}, Options) -> set_content(Content, #coap_message{type = Type, method = Method, options = Options}). -ack(Request = #coap_message{}) -> - #coap_message{type = ack, - id = Request#coap_message.id}. +ack(#coap_message{id = Id}) -> + #coap_message{type = ack, id = Id}. +reset(#coap_message{id = Id}) -> + #coap_message{type = reset, id = Id}. + +%% just make a response response(#coap_message{type = Type, id = Id, token = Token}) -> @@ -61,6 +70,19 @@ response(Method, Payload, Request) -> set_payload(Payload, response(Request))). +%% make a response which maybe is a piggyback ack +piggyback(Method, Request) -> + piggyback(Method, <<>>, Request). + +piggyback(Method, Payload, Request) -> + Reply = response(Method, Payload, Request), + case Reply of + #coap_message{type = con} -> + Reply#coap_message{type = ack}; + _ -> + Reply + end. + %% omit option for its default value set(max_age, ?DEFAULT_MAX_AGE, Msg) -> Msg; @@ -144,3 +166,9 @@ set_payload_block(Content, BlockId, {Num, _, Size}, Msg) -> set(BlockId, {Num, false, Size}, set_payload(binary:part(Content, OffsetBegin, ContentSize - OffsetBegin), Msg)) end. + +is_request(#coap_message{method = Method}) when is_atom(Method) -> + Method =/= undefined; + +is_request(_) -> + false. diff --git a/apps/emqx_gateway/src/coap/emqx_coap_observe_res.erl b/apps/emqx_gateway/src/coap/emqx_coap_observe_res.erl index 3cf925448..20473322e 100644 --- a/apps/emqx_gateway/src/coap/emqx_coap_observe_res.erl +++ b/apps/emqx_gateway/src/coap/emqx_coap_observe_res.erl @@ -18,7 +18,7 @@ %% API -export([ new_manager/0, insert/3, remove/2 - , res_changed/2, foreach/2]). + , res_changed/2, foreach/2, subscriptions/1]). -export_type([manager/0]). -define(MAX_SEQ_ID, 16777215). @@ -40,14 +40,15 @@ new_manager() -> #{}. --spec insert(topic(), token(), manager()) -> manager(). +-spec insert(topic(), token(), manager()) -> {seq_id(), manager()}. insert(Topic, Token, Manager) -> - case maps:get(Topic, Manager, undefined) of - undefined -> - Manager#{Topic => new_res(Token)}; - _ -> - Manager - end. + Res = case maps:get(Topic, Manager, undefined) of + undefined -> + new_res(Token); + Any -> + Any + end, + {maps:get(seq_id, Res), Manager#{Topic => Res}}. -spec remove(topic(), manager()) -> manager(). remove(Topic, Manager) -> @@ -72,6 +73,9 @@ foreach(F, Manager) -> Manager), ok. +subscriptions(Manager) -> + maps:keys(Manager). + %%-------------------------------------------------------------------- %% Internal functions %%-------------------------------------------------------------------- diff --git a/apps/emqx_gateway/src/coap/emqx_coap_session.erl b/apps/emqx_gateway/src/coap/emqx_coap_session.erl index 8b9eed14c..98e24f05c 100644 --- a/apps/emqx_gateway/src/coap/emqx_coap_session.erl +++ b/apps/emqx_gateway/src/coap/emqx_coap_session.erl @@ -23,11 +23,14 @@ %% API -export([new/0, transfer_result/3]). --export([ received/3 - , reply/4 - , reply/5 - , ack/3 - , piggyback/4 +-export([ info/1 + , info/2 + , stats/1 + ]). + +-export([ handle_request/3 + , handle_response/3 + , handle_out/3 , deliver/3 , timeout/3]). @@ -36,10 +39,31 @@ -record(session, { transport_manager :: emqx_coap_tm:manager() , observe_manager :: emqx_coap_observe_res:manager() , next_msg_id :: coap_message_id() + , created_at :: pos_integer() }). -type session() :: #session{}. +%% steal from emqx_session +-define(INFO_KEYS, [subscriptions, + upgrade_qos, + retry_interval, + await_rel_timeout, + created_at + ]). + +-define(STATS_KEYS, [subscriptions_cnt, + subscriptions_max, + inflight_cnt, + inflight_max, + mqueue_len, + mqueue_max, + mqueue_dropped, + next_pkt_id, + awaiting_rel_cnt, + awaiting_rel_max + ]). + %%%------------------------------------------------------------------- %%% API %%%------------------------------------------------------------------- @@ -48,125 +72,163 @@ new() -> _ = emqx_misc:rand_seed(), #session{ transport_manager = emqx_coap_tm:new() , observe_manager = emqx_coap_observe_res:new_manager() - , next_msg_id = rand:uniform(?MAX_MESSAGE_ID)}. + , next_msg_id = rand:uniform(?MAX_MESSAGE_ID) + , created_at = erlang:system_time(millisecond)}. + +%%-------------------------------------------------------------------- +%% Info, Stats +%%-------------------------------------------------------------------- +%% @doc Compatible with emqx_session +%% do we need use inflight and mqueue in here? +-spec(info(session()) -> emqx_types:infos()). +info(Session) -> + maps:from_list(info(?INFO_KEYS, Session)). + +info(Keys, Session) when is_list(Keys) -> + [{Key, info(Key, Session)} || Key <- Keys]; +info(subscriptions, #session{observe_manager = OM}) -> + emqx_coap_observe_res:subscriptions(OM); +info(subscriptions_cnt, #session{observe_manager = OM}) -> + erlang:length(emqx_coap_observe_res:subscriptions(OM)); +info(subscriptions_max, _) -> + infinity; +info(upgrade_qos, _) -> + ?QOS_0; +info(inflight, _) -> + emqx_inflight:new(); +info(inflight_cnt, _) -> + 0; +info(inflight_max, _) -> + 0; +info(retry_interval, _) -> + infinity; +info(mqueue, _) -> + emqx_mqueue:init(#{max_len => 0, store_qos0 => false}); +info(mqueue_len, #session{transport_manager = TM}) -> + maps:size(TM); +info(mqueue_max, _) -> + 0; +info(mqueue_dropped, _) -> + 0; +info(next_pkt_id, #session{next_msg_id = PacketId}) -> + PacketId; +info(awaiting_rel, _) -> + #{}; +info(awaiting_rel_cnt, _) -> + 0; +info(awaiting_rel_max, _) -> + infinity; +info(await_rel_timeout, _) -> + infinity; +info(created_at, #session{created_at = CreatedAt}) -> + CreatedAt. + +%% @doc Get stats of the session. +-spec(stats(session()) -> emqx_types:stats()). +stats(Session) -> info(?STATS_KEYS, Session). %%%------------------------------------------------------------------- %%% Process Message %%%------------------------------------------------------------------- -received(#coap_message{type = ack} = Msg, Cfg, Session) -> - handle_response(Msg, Cfg, Session); +handle_request(Msg, Ctx, Session) -> + call_transport_manager(?FUNCTION_NAME, + Msg, + Ctx, + [fun process_tm/3, fun process_subscribe/3], + Session). -received(#coap_message{type = reset} = Msg, Cfg, Session) -> - handle_response(Msg, Cfg, Session); +handle_response(Msg, Ctx, Session) -> + call_transport_manager(?FUNCTION_NAME, Msg, Ctx, [fun process_tm/3], Session). -received(#coap_message{method = Method} = Msg, Cfg, Session) when is_atom(Method) -> - handle_request(Msg, Cfg, Session); +handle_out(Msg, Ctx, Session) -> + call_transport_manager(?FUNCTION_NAME, Msg, Ctx, [fun process_tm/3], Session). -received(Msg, Cfg, Session) -> - handle_response(Msg, Cfg, Session). - -reply(Req, Method, Cfg, Session) -> - reply(Req, Method, <<>>, Cfg, Session). - -reply(Req, Method, Payload, Cfg, Session) -> - Response = emqx_coap_message:response(Method, Payload, Req), - handle_out(Response, Cfg, Session). - -ack(Req, Cfg, Session) -> - piggyback(Req, <<>>, Cfg, Session). - -piggyback(Req, Payload, Cfg, Session) -> - Response = emqx_coap_message:ack(Req), - Response2 = emqx_coap_message:set_payload(Payload, Response), - handle_out(Response2, Cfg, Session). - -deliver(Delivers, Cfg, Session) -> +deliver(Delivers, Ctx, Session) -> Fun = fun({_, Topic, Message}, #{out := OutAcc, session := #session{observe_manager = OM, - next_msg_id = MsgId} = SAcc} = Acc) -> + next_msg_id = MsgId, + transport_manager = TM} = SAcc} = Acc) -> case emqx_coap_observe_res:res_changed(Topic, OM) of undefined -> Acc; {Token, SeqId, OM2} -> - Msg = mqtt_to_coap(Message, MsgId, Token, SeqId, Cfg), - SAcc2 = SAcc#session{next_msg_id = next_msg_id(MsgId), + Msg = mqtt_to_coap(Message, MsgId, Token, SeqId, Ctx), + SAcc2 = SAcc#session{next_msg_id = next_msg_id(MsgId, TM), observe_manager = OM2}, - #{out := Out} = Result = call_transport_manager(handle_out, Msg, Cfg, SAcc2), + #{out := Out} = Result = handle_out(Msg, Ctx, SAcc2), Result#{out := [Out | OutAcc]} end end, lists:foldl(Fun, - #{out => [], - session => Session}, + #{out => [], session => Session}, Delivers). -timeout(Timer, Cfg, Session) -> - call_transport_manager(?FUNCTION_NAME, Timer, Cfg, Session). +timeout(Timer, Ctx, Session) -> + call_transport_manager(?FUNCTION_NAME, Timer, Ctx, [fun process_tm/3], Session). + +result_keys() -> + [tm, subscribe] ++ emqx_coap_channel:result_keys(). transfer_result(From, Value, Result) -> - ?TRANSFER_RESULT([out, subscribe], From, Value, Result). + ?TRANSFER_RESULT(From, Value, Result). %%%------------------------------------------------------------------- %%% Internal functions %%%------------------------------------------------------------------- -handle_request(Msg, Cfg, Session) -> - call_transport_manager(?FUNCTION_NAME, Msg, Cfg, Session). - -handle_response(Msg, Cfg, Session) -> - call_transport_manager(?FUNCTION_NAME, Msg, Cfg, Session). - -handle_out(Msg, Cfg, Session) -> - call_transport_manager(?FUNCTION_NAME, Msg, Cfg, Session). - call_transport_manager(Fun, Msg, - Cfg, + Ctx, + Processor, #session{transport_manager = TM} = Session) -> try - Result = emqx_coap_tm:Fun(Msg, Cfg, TM), - {ok, _, Session2} = emqx_misc:pipeline([fun process_tm/2, - fun process_subscribe/2], - Result, - Session), - emqx_coap_channel:transfer_result(session, Session2, Result) + Result = emqx_coap_tm:Fun(Msg, Ctx, TM), + {ok, Result2, Session2} = pipeline(Processor, + Result, + Msg, + Session), + emqx_coap_channel:transfer_result(session, Session2, Result2) catch Type:Reason:Stack -> ?ERROR("process transmission with, message:~p failed~n Type:~p,Reason:~p~n,StackTrace:~p~n", [Msg, Type, Reason, Stack]), - #{out => emqx_coap_message:response({error, internal_server_error}, Msg)} + ?REPLY({error, internal_server_error}, Msg) end. -process_tm(#{tm := TM}, Session) -> +process_tm(#{tm := TM}, _, Session) -> {ok, Session#session{transport_manager = TM}}; -process_tm(_, Session) -> +process_tm(_, _, Session) -> {ok, Session}. -process_subscribe(#{subscribe := Sub}, #session{observe_manager = OM} = Session) -> +process_subscribe(#{subscribe := Sub} = Result, + Msg, + #session{observe_manager = OM} = Session) -> case Sub of undefined -> - {ok, Session}; + {ok, Result, Session}; {Topic, Token} -> - OM2 = emqx_coap_observe_res:insert(Topic, Token, OM), - {ok, Session#session{observe_manager = OM2}}; + {SeqId, OM2} = emqx_coap_observe_res:insert(Topic, Token, OM), + Replay = emqx_coap_message:piggyback({ok, content}, Msg), + Replay2 = Replay#coap_message{options = #{observe => SeqId}}, + {ok, Result#{reply => Replay2}, Session#session{observe_manager = OM2}}; Topic -> OM2 = emqx_coap_observe_res:remove(Topic, OM), - {ok, Session#session{observe_manager = OM2}} + Replay = emqx_coap_message:piggyback({ok, nocontent}, Msg), + {ok, Result#{reply => Replay}, Session#session{observe_manager = OM2}} end; -process_subscribe(_, Session) -> - {ok, Session}. +process_subscribe(Result, _, Session) -> + {ok, Result, Session}. -mqtt_to_coap(MQTT, MsgId, Token, SeqId, Cfg) -> +mqtt_to_coap(MQTT, MsgId, Token, SeqId, Ctx) -> #message{payload = Payload} = MQTT, - #coap_message{type = get_notify_type(MQTT, Cfg), + #coap_message{type = get_notify_type(MQTT, Ctx), method = {ok, content}, id = MsgId, token = Token, payload = Payload, - options = #{observe => SeqId, - max_age => get_max_age(MQTT)}}. + options = #{observe => SeqId}}. -get_notify_type(#message{qos = Qos}, #{notify_type := Type}) -> - case Type of +get_notify_type(#message{qos = Qos}, Ctx) -> + case emqx_coap_channel:get_config(notify_type, Ctx) of qos -> case Qos of ?QOS_0 -> @@ -178,18 +240,31 @@ get_notify_type(#message{qos = Qos}, #{notify_type := Type}) -> Other end. --spec get_max_age(#message{}) -> max_age(). -get_max_age(#message{headers = #{properties := #{'Message-Expiry-Interval' := 0}}}) -> - ?MAXIMUM_MAX_AGE; -get_max_age(#message{headers = #{properties := #{'Message-Expiry-Interval' := Interval}}, - timestamp = Ts}) -> - Now = erlang:system_time(millisecond), - Diff = (Now - Ts + Interval * 1000) / 1000, - erlang:max(1, erlang:floor(Diff)); -get_max_age(_) -> - ?DEFAULT_MAX_AGE. +next_msg_id(MsgId, TM) -> + next_msg_id(MsgId + 1, MsgId, TM). -next_msg_id(MsgId) when MsgId >= ?MAX_MESSAGE_ID -> - 1; -next_msg_id(MsgId) -> - MsgId + 1. +next_msg_id(MsgId, MsgId, _) -> + erlang:throw("too many message in delivering"); +next_msg_id(MsgId, BeginId, TM) when MsgId >= ?MAX_MESSAGE_ID -> + check_is_inused(1, BeginId, TM); +next_msg_id(MsgId, BeginId, TM) -> + check_is_inused(MsgId, BeginId, TM). + +check_is_inused(NewMsgId, BeginId, TM) -> + case emqx_coap_tm:is_inused(out, NewMsgId, TM) of + false -> + NewMsgId; + _ -> + next_msg_id(NewMsgId + 1, BeginId, TM) + end. + +pipeline([Fun | T], Result, Msg, Session) -> + case Fun(Result, Msg, Session) of + {ok, Session2} -> + pipeline(T, Result, Msg, Session2); + {ok, Result2, Session2} -> + pipeline(T, Result2, Msg, Session2) + end; + +pipeline([], Result, _, Session) -> + {ok, Result, Session}. diff --git a/apps/emqx_gateway/src/coap/emqx_coap_tm.erl b/apps/emqx_gateway/src/coap/emqx_coap_tm.erl index 8830d7447..5a664b0f2 100644 --- a/apps/emqx_gateway/src/coap/emqx_coap_tm.erl +++ b/apps/emqx_gateway/src/coap/emqx_coap_tm.erl @@ -21,7 +21,8 @@ , handle_request/3 , handle_response/3 , handle_out/3 - , timeout/3]). + , timeout/3 + , is_inused/3]). -export_type([manager/0, event_result/1]). @@ -60,18 +61,18 @@ new() -> #{}. -handle_request(#coap_message{id = MsgId} = Msg, Cfg, TM) -> +handle_request(#coap_message{id = MsgId} = Msg, Ctx, TM) -> Id = {in, MsgId}, case maps:get(Id, TM, undefined) of undefined -> Transport = emqx_coap_transport:new(), Machine = new_state_machine(Id, Transport), - process_event(in, Msg, TM, Machine, Cfg); + process_event(in, Msg, TM, Ctx, Machine); Machine -> - process_event(in, Msg, TM, Machine, Cfg) + process_event(in, Msg, TM, Ctx, Machine) end. -handle_response(#coap_message{type = Type, id = MsgId} = Msg, Cfg, TM) -> +handle_response(#coap_message{type = Type, id = MsgId} = Msg, Ctx, TM) -> Id = {out, MsgId}, case maps:get(Id, TM, undefined) of undefined -> @@ -79,26 +80,25 @@ handle_response(#coap_message{type = Type, id = MsgId} = Msg, Cfg, TM) -> reset -> ?EMPTY_RESULT; _ -> - #{out => #coap_message{type = reset, - id = MsgId}} + ?RESET(Msg) end; Machine -> - process_event(in, Msg, TM, Machine, Cfg) + process_event(in, Msg, TM, Ctx, Machine) end. -handle_out(#coap_message{id = MsgId} = Msg, Cfg, TM) -> +handle_out(#coap_message{id = MsgId} = Msg, Ctx, TM) -> Id = {out, MsgId}, case maps:get(Id, TM, undefined) of undefined -> Transport = emqx_coap_transport:new(), Machine = new_state_machine(Id, Transport), - process_event(out, Msg, TM, Machine, Cfg); + process_event(out, Msg, TM, Ctx, Machine); _ -> - ?WARN("Repeat sending message with id:~p~n", [Id]), + %% ignore repeat send ?EMPTY_RESULT end. -timeout({Id, Type, Msg}, Cfg, TM) -> +timeout({Id, Type, Msg}, Ctx, TM) -> case maps:get(Id, TM, undefined) of undefined -> ?EMPTY_RESULT; @@ -106,12 +106,16 @@ timeout({Id, Type, Msg}, Cfg, TM) -> %% maybe timer has been canceled case maps:is_key(Type, Timers) of true -> - process_event(Type, Msg, TM, Machine, Cfg); + process_event(Type, Msg, TM, Ctx, Machine); _ -> ?EMPTY_RESULT end end. +-spec is_inused(direction(), message_id(), manager()) -> boolean(). +is_inused(Dir, Msg, Manager) -> + maps:is_key({Dir, Msg}, Manager). + %%-------------------------------------------------------------------- %% Internal functions %%-------------------------------------------------------------------- @@ -124,9 +128,9 @@ new_state_machine(Id, Transport) -> process_event(stop_timeout, _, TM, + _, #state_machine{id = Id, - timers = Timers}, - _) -> + timers = Timers}) -> lists:foreach(fun({_, Ref}) -> emqx_misc:cancel_timer(Ref) end, @@ -136,11 +140,11 @@ process_event(stop_timeout, process_event(Event, Msg, TM, + Ctx, #state_machine{id = Id, state = State, - transport = Transport} = Machine, - Cfg) -> - Result = emqx_coap_transport:State(Event, Msg, Transport, Cfg), + transport = Transport} = Machine) -> + Result = emqx_coap_transport:State(Event, Msg, Ctx, Transport), {ok, _, Machine2} = emqx_misc:pipeline([fun process_state_change/2, fun process_transport_change/2, fun process_timeouts/2], diff --git a/apps/emqx_gateway/src/coap/emqx_coap_transport.erl b/apps/emqx_gateway/src/coap/emqx_coap_transport.erl index b4c8ae333..2c2aaab2e 100644 --- a/apps/emqx_gateway/src/coap/emqx_coap_transport.erl +++ b/apps/emqx_gateway/src/coap/emqx_coap_transport.erl @@ -21,6 +21,8 @@ -export_type([transport/0]). +-import(emqx_coap_message, [reset/1]). + -spec new() -> transport(). new() -> #transport{cache = undefined, @@ -28,54 +30,33 @@ new() -> retry_count = 0}. idle(in, - #coap_message{type = non, id = MsgId, method = Method} = Msg, - _, - #{resource := Resource} = Cfg) -> + #coap_message{type = non, method = Method} = Msg, + Ctx, + _) -> Ret = #{next => until_stop, timeouts => [{stop_timeout, ?NON_LIFETIME}]}, case Method of undefined -> - Ret#{out => #coap_message{type = reset, id = MsgId}}; + ?RESET(Msg); _ -> - case erlang:apply(Resource, Method, [Msg, Cfg]) of - #coap_message{} = Result -> - Ret#{out => Result}; - {has_sub, Result, Sub} -> - Ret#{out => Result, subscribe => Sub}; - error -> - Ret#{out => - emqx_coap_message:response({error, internal_server_error}, Msg)} - end + Result = call_handler(Msg, Ctx), + maps:merge(Ret, Result) end; idle(in, - #coap_message{id = MsgId, - type = con, - method = Method} = Msg, - Transport, - #{resource := Resource} = Cfg) -> + #coap_message{type = con, method = Method} = Msg, + Ctx, + Transport) -> Ret = #{next => maybe_resend, timeouts =>[{stop_timeout, ?EXCHANGE_LIFETIME}]}, case Method of undefined -> - ResetMsg = #coap_message{type = reset, id = MsgId}, + ResetMsg = reset(Msg), Ret#{transport => Transport#transport{cache = ResetMsg}, out => ResetMsg}; _ -> - {RetMsg, SubInfo} = - case erlang:apply(Resource, Method, [Msg, Cfg]) of - #coap_message{} = Result -> - {Result, undefined}; - {has_sub, Result, Sub} -> - {Result, Sub}; - error -> - {emqx_coap_message:response({error, internal_server_error}, Msg), - undefined} - end, - RetMsg2 = RetMsg#coap_message{type = ack}, - Ret#{out => RetMsg2, - transport => Transport#transport{cache = RetMsg2}, - subscribe => SubInfo} + Result = call_handler(Msg, Ctx), + maps:merge(Ret, Result) end; idle(out, #coap_message{type = non} = Msg, _, _) -> @@ -83,7 +64,7 @@ idle(out, #coap_message{type = non} = Msg, _, _) -> out => Msg, timeouts => [{stop_timeout, ?NON_LIFETIME}]}; -idle(out, Msg, Transport, _) -> +idle(out, Msg, _, Transport) -> _ = emqx_misc:rand_seed(), Timeout = ?ACK_TIMEOUT + rand:uniform(?ACK_RANDOM_FACTOR), #{next => wait_ack, @@ -133,3 +114,13 @@ wait_ack(state_timeout, until_stop(_, _, _, _) -> ?EMPTY_RESULT. + +call_handler(#coap_message{options = Opts} = Msg, Ctx) -> + case maps:get(uri_path, Opts, undefined) of + [<<"ps">> | RestPath] -> + emqx_coap_pubsub_handler:handle_request(RestPath, Msg, Ctx); + [<<"mqtt">> | RestPath] -> + emqx_coap_mqtt_handler:handle_request(RestPath, Msg, Ctx); + _ -> + ?REPLY({error, bad_request}, Msg) + end. diff --git a/apps/emqx_gateway/src/coap/handler/emqx_coap_mqtt_handler.erl b/apps/emqx_gateway/src/coap/handler/emqx_coap_mqtt_handler.erl new file mode 100644 index 000000000..88a4a2310 --- /dev/null +++ b/apps/emqx_gateway/src/coap/handler/emqx_coap_mqtt_handler.erl @@ -0,0 +1,40 @@ +%%-------------------------------------------------------------------- +%% Copyright (c) 2020-2021 EMQ Technologies Co., Ltd. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%%-------------------------------------------------------------------- + +-module(emqx_coap_mqtt_handler). + +-include_lib("emqx_gateway/src/coap/include/emqx_coap.hrl"). + +-export([handle_request/3]). +-import(emqx_coap_message, [response/2, response/3]). + +handle_request([<<"connection">>], #coap_message{method = Method} = Msg, _) -> + handle_method(Method, Msg); + +handle_request(_, Msg, _) -> + ?REPLY({error, bad_request}, Msg). + +handle_method(put, Msg) -> + ?REPLY({ok, changed}, Msg); + +handle_method(post, _) -> + #{connection => open}; + +handle_method(delete, _) -> + #{connection => close}; + +handle_method(_, Msg) -> + ?REPLY({error, method_not_allowed}, Msg). diff --git a/apps/emqx_gateway/src/coap/handler/emqx_coap_pubsub_handler.erl b/apps/emqx_gateway/src/coap/handler/emqx_coap_pubsub_handler.erl new file mode 100644 index 000000000..e6886a559 --- /dev/null +++ b/apps/emqx_gateway/src/coap/handler/emqx_coap_pubsub_handler.erl @@ -0,0 +1,155 @@ +%%-------------------------------------------------------------------- +%% Copyright (c) 2020-2021 EMQ Technologies Co., Ltd. All Rights Reserved. +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. +%%-------------------------------------------------------------------- + +%% a coap to mqtt adapter with a retained topic message database +-module(emqx_coap_pubsub_handler). + +-include_lib("emqx/include/emqx_mqtt.hrl"). +-include_lib("emqx_gateway/src/coap/include/emqx_coap.hrl"). + +-export([handle_request/3]). + +-import(emqx_coap_message, [response/2, response/3]). + +-define(UNSUB(Topic), #{subscribe => Topic}). +-define(SUB(Topic, Token), #{subscribe => {Topic, Token}}). +-define(SUBOPTS, #{qos => 0, rh => 0, rap => 0, nl => 0, is_new => false}). + +handle_request(Path, #coap_message{method = Method} = Msg, Ctx) -> + case check_topic(Path) of + {ok, Topic} -> + handle_method(Method, Topic, Msg, Ctx); + _ -> + ?REPLY({error, bad_request}, <<"invalid topic">>, Msg) + end. + +handle_method(get, Topic, #coap_message{options = Opts} = Msg, Ctx) -> + case maps:get(observe, Opts, undefined) of + 0 -> + subscribe(Msg, Topic, Ctx); + 1 -> + unsubscribe(Topic, Ctx); + _ -> + ?REPLY({error, bad_request}, <<"invalid observe value">>, Msg) + end; + +handle_method(post, Topic, #coap_message{payload = Payload} = Msg, Ctx) -> + case emqx_coap_channel:validator(publish, Topic, Ctx) of + allow -> + ClientInfo = emqx_coap_channel:get_clientinfo(Ctx), + #{clientid := ClientId} = ClientInfo, + QOS = get_publish_qos(Msg, Ctx), + MQTTMsg = emqx_message:make(ClientId, QOS, Topic, Payload), + MQTTMsg2 = apply_publish_opts(Msg, MQTTMsg), + _ = emqx_broker:publish(MQTTMsg2), + ?REPLY({ok, changed}, Msg); + _ -> + ?REPLY({error, unauthorized}, Msg) + end; + +handle_method(_, _, Msg, _) -> + ?REPLY({error, method_not_allowed}, Msg). + +check_topic([]) -> + error; + +check_topic(Path) -> + Sep = <<"/">>, + {ok, + emqx_http_lib:uri_decode( + lists:foldl(fun(Part, Acc) -> + <> + end, + <<>>, + Path))}. + +get_sub_opts(#coap_message{options = Opts} = Msg, Ctx) -> + SubOpts = maps:fold(fun parse_sub_opts/3, #{}, Opts), + case SubOpts of + #{qos := _} -> + maps:merge(SubOpts, ?SUBOPTS); + _ -> + CfgType = emqx_coap_channel:get_config(subscribe_qos, Ctx), + maps:merge(SubOpts, ?SUBOPTS#{qos => type_to_qos(CfgType, Msg)}) + end. + +parse_sub_opts(<<"qos">>, V, Opts) -> + Opts#{qos => erlang:binary_to_integer(V)}; +parse_sub_opts(<<"nl">>, V, Opts) -> + Opts#{nl => erlang:binary_to_integer(V)}; +parse_sub_opts(<<"rh">>, V, Opts) -> + Opts#{rh => erlang:binary_to_integer(V)}; +parse_sub_opts(_, _, Opts) -> + Opts. + +type_to_qos(qos0, _) -> ?QOS_0; +type_to_qos(qos1, _) -> ?QOS_1; +type_to_qos(qos2, _) -> ?QOS_2; +type_to_qos(coap, #coap_message{type = Type}) -> + case Type of + non -> + ?QOS_0; + _ -> + ?QOS_1 + end. + +get_publish_qos(#coap_message{options = Opts} = Msg, Ctx) -> + case maps:get(uri_query, Opts) of + #{<<"qos">> := QOS} -> + erlang:binary_to_integer(QOS); + _ -> + CfgType = emqx_coap_channel:get_config(publish_qos, Ctx), + type_to_qos(CfgType, Msg) + end. + +apply_publish_opts(#coap_message{options = Opts}, MQTTMsg) -> + maps:fold(fun(<<"retain">>, V, Acc) -> + Val = erlang:binary_to_atom(V), + emqx_message:set_flag(retain, Val, Acc); + (<<"expiry">>, V, Acc) -> + Val = erlang:binary_to_integer(V), + Props = emqx_message:get_header(properties, Acc), + emqx_message:set_header(properties, + Props#{'Message-Expiry-Interval' => Val}, + Acc); + (_, _, Acc) -> + Acc + end, + MQTTMsg, + maps:get(uri_query, Opts)). + +subscribe(#coap_message{token = <<>>} = Msg, _, _) -> + ?REPLY({error, bad_request}, <<"observe without token">>, Msg); + +subscribe(#coap_message{token = Token} = Msg, Topic, Ctx) -> + case emqx_coap_channel:validator(subscribe, Topic, Ctx) of + allow -> + ClientInfo = emqx_coap_channel:get_clientinfo(Ctx), + #{clientid := ClientId} = ClientInfo, + SubOpts = get_sub_opts(Msg, Ctx), + emqx_broker:subscribe(Topic, ClientId, SubOpts), + emqx_hooks:run('session.subscribed', + [ClientInfo, Topic, SubOpts]), + ?SUB(Topic, Token); + _ -> + ?REPLY({error, unauthorized}, Msg) + end. + +unsubscribe(Topic, Ctx) -> + ClientInfo = emqx_coap_channel:get_clientinfo(Ctx), + emqx_broker:unsubscribe(Topic), + emqx_hooks:run('session.unsubscribed', [ClientInfo, Topic, ?SUBOPTS]), + ?UNSUB(Topic). diff --git a/apps/emqx_gateway/src/coap/include/emqx_coap.hrl b/apps/emqx_gateway/src/coap/include/emqx_coap.hrl index 911d10a22..3b0268abb 100644 --- a/apps/emqx_gateway/src/coap/include/emqx_coap.hrl +++ b/apps/emqx_gateway/src/coap/include/emqx_coap.hrl @@ -23,12 +23,17 @@ -define(MAXIMUM_MAX_AGE, 4294967295). -define(EMPTY_RESULT, #{}). --define(TRANSFER_RESULT(Keys, From, Value, R1), +-define(TRANSFER_RESULT(From, Value, R1), begin + Keys = result_keys(), R2 = maps:with(Keys, R1), R2#{From => Value} end). +-define(RESET(Msg), #{out => emqx_coap_message:reset(Msg)}). +-define(REPLY(Resp, Payload, Msg), #{out => emqx_coap_message:piggyback(Resp, Payload, Msg)}). +-define(REPLY(Resp, Msg), ?REPLY(Resp, <<>>, Msg)). + -type coap_message_id() :: 1 .. ?MAX_MESSAGE_ID. -type message_type() :: con | non | ack | reset. -type max_age() :: 1 .. ?MAXIMUM_MAX_AGE. diff --git a/apps/emqx_gateway/src/coap/resources/emqx_coap_mqtt_resource.erl b/apps/emqx_gateway/src/coap/resources/emqx_coap_mqtt_resource.erl deleted file mode 100644 index 1fd3d7b8e..000000000 --- a/apps/emqx_gateway/src/coap/resources/emqx_coap_mqtt_resource.erl +++ /dev/null @@ -1,153 +0,0 @@ -%%-------------------------------------------------------------------- -%% Copyright (c) 2020-2021 EMQ Technologies Co., Ltd. All Rights Reserved. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -%%-------------------------------------------------------------------- - -%% a coap to mqtt adapter --module(emqx_coap_mqtt_resource). - --behaviour(emqx_coap_resource). - --include_lib("emqx/include/emqx_mqtt.hrl"). --include_lib("emqx_gateway/src/coap/include/emqx_coap.hrl"). - - --export([ init/1 - , stop/1 - , get/2 - , put/2 - , post/2 - , delete/2 - ]). - --export([ check_topic/1 - , publish/3 - , subscribe/3 - , unsubscribe/3]). - --define(SUBOPTS, #{rh => 0, rap => 0, nl => 0, is_new => false}). - -init(_) -> - {ok, undefined}. - -stop(_) -> - ok. - -%% get: subscribe, ignore observe option -get(#coap_message{token = Token} = Msg, Cfg) -> - case check_topic(Msg) of - {ok, Topic} -> - case Token of - <<>> -> - emqx_coap_message:response({error, bad_request}, <<"observer without token">>, Msg); - _ -> - Ret = subscribe(Msg, Topic, Cfg), - RetMsg = emqx_coap_message:response(Ret, Msg), - case Ret of - {ok, _} -> - {has_sub, RetMsg, {Topic, Token}}; - _ -> - RetMsg - end - end; - Any -> - Any - end. - -%% put: equal post -put(Msg, Cfg) -> - post(Msg, Cfg). - -%% post: publish a message -post(Msg, Cfg) -> - case check_topic(Msg) of - {ok, Topic} -> - emqx_coap_message:response(publish(Msg, Topic, Cfg), Msg); - Any -> - Any - end. - -%% delete: ubsubscribe -delete(Msg, Cfg) -> - case check_topic(Msg) of - {ok, Topic} -> - unsubscribe(Msg, Topic, Cfg), - {has_sub, emqx_coap_message:response({ok, deleted}, Msg), Topic}; - Any -> - Any - end. - -check_topic(#coap_message{options = Options} = Msg) -> - case maps:get(uri_path, Options, []) of - [] -> - emqx_coap_message:response({error, bad_request}, <<"invalid topic">> , Msg); - UriPath -> - Sep = <<"/">>, - {ok, lists:foldl(fun(Part, Acc) -> - <> - end, - <<>>, - UriPath)} - end. - -publish(#coap_message{payload = Payload} = Msg, - Topic, - #{clientinfo := ClientInfo, - publish_qos := QOS} = Cfg) -> - case emqx_coap_channel:auth_publish(Topic, Cfg) of - allow -> - #{clientid := ClientId} = ClientInfo, - MQTTMsg = emqx_message:make(ClientId, type_to_qos(QOS, Msg), Topic, Payload), - MQTTMsg2 = emqx_message:set_flag(retain, false, MQTTMsg), - _ = emqx_broker:publish(MQTTMsg2), - {ok, changed}; - _ -> - {error, unauthorized} - end. - -subscribe(Msg, Topic, #{clientinfo := ClientInfo}= Cfg) -> - case emqx_topic:wildcard(Topic) of - false -> - case emqx_coap_channel:auth_subscribe(Topic, Cfg) of - allow -> - #{clientid := ClientId} = ClientInfo, - SubOpts = get_sub_opts(Msg, Cfg), - emqx_broker:subscribe(Topic, ClientId, SubOpts), - emqx_hooks:run('session.subscribed', [ClientInfo, Topic, SubOpts]), - {ok, created}; - _ -> - {error, unauthorized} - end; - _ -> - %% now, we don't support wildcard in subscribe topic - {error, bad_request, <<"">>} - end. - -unsubscribe(Msg, Topic, #{clientinfo := ClientInfo} = Cfg) -> - emqx_broker:unsubscribe(Topic), - emqx_hooks:run('session.unsubscribed', [ClientInfo, Topic, get_sub_opts(Msg, Cfg)]). - -get_sub_opts(Msg, #{subscribe_qos := Type}) -> - ?SUBOPTS#{qos => type_to_qos(Type, Msg)}. - -type_to_qos(qos0, _) -> ?QOS_0; -type_to_qos(qos1, _) -> ?QOS_1; -type_to_qos(qos2, _) -> ?QOS_2; -type_to_qos(coap, #coap_message{type = Type}) -> - case Type of - non -> - ?QOS_0; - _ -> - ?QOS_1 - end. diff --git a/apps/emqx_gateway/src/coap/resources/emqx_coap_pubsub_resource.erl b/apps/emqx_gateway/src/coap/resources/emqx_coap_pubsub_resource.erl deleted file mode 100644 index c750f66dd..000000000 --- a/apps/emqx_gateway/src/coap/resources/emqx_coap_pubsub_resource.erl +++ /dev/null @@ -1,219 +0,0 @@ -%%-------------------------------------------------------------------- -%% Copyright (c) 2020-2021 EMQ Technologies Co., Ltd. All Rights Reserved. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -%%-------------------------------------------------------------------- - -%% a coap to mqtt adapter with a retained topic message database --module(emqx_coap_pubsub_resource). - --behaviour(emqx_coap_resource). - --include_lib("emqx/include/logger.hrl"). --include_lib("emqx_gateway/src/coap/include/emqx_coap.hrl"). - - --export([ init/1 - , stop/1 - , get/2 - , put/2 - , post/2 - , delete/2 - ]). --import(emqx_coap_mqtt_resource, [ check_topic/1, subscribe/3, unsubscribe/3 - , publish/3]). - --import(emqx_coap_message, [response/2, response/3, set_content/2]). -%%-------------------------------------------------------------------- -%% Resource Callbacks -%%-------------------------------------------------------------------- -init(_) -> - emqx_coap_pubsub_topics:start_link(). - -stop(Pid) -> - emqx_coap_pubsub_topics:stop(Pid). - -%% get: read last publish message -%% get with observe 0: subscribe -%% get with observe 1: unsubscribe -get(#coap_message{token = Token} = Msg, Cfg) -> - case check_topic(Msg) of - {ok, Topic} -> - case emqx_coap_message:get_option(observe, Msg) of - undefined -> - Content = emqx_coap_message:get_content(Msg), - read_last_publish_message(emqx_topic:wildcard(Topic), Msg, Topic, Content); - 0 -> - case Token of - <<>> -> - response({error, bad_reuqest}, <<"observe without token">>, Msg); - _ -> - Ret = subscribe(Msg, Topic, Cfg), - RetMsg = response(Ret, Msg), - case Ret of - {ok, _} -> - {has_sub, RetMsg, {Topic, Token}}; - _ -> - RetMsg - end - end; - 1 -> - unsubscribe(Msg, Topic, Cfg), - {has_sub, response({ok, deleted}, Msg), Topic} - end; - Any -> - Any - end. - -%% put: insert a message into topic database -put(Msg, _) -> - case check_topic(Msg) of - {ok, Topic} -> - Content = emqx_coap_message:get_content(Msg), - #coap_content{payload = Payload, - format = Format, - max_age = MaxAge} = Content, - handle_received_create(Msg, Topic, MaxAge, Format, Payload); - Any -> - Any - end. - -%% post: like put, but will publish the inserted message -post(Msg, Cfg) -> - case check_topic(Msg) of - {ok, Topic} -> - Content = emqx_coap_message:get_content(Msg), - #coap_content{max_age = MaxAge, - format = Format, - payload = Payload} = Content, - handle_received_publish(Msg, Topic, MaxAge, Format, Payload, Cfg); - Any -> - Any - end. - -%% delete: delete a message from topic database -delete(Msg, _) -> - case check_topic(Msg) of - {ok, Topic} -> - delete_topic_info(Msg, Topic); - Any -> - Any - end. - -%%-------------------------------------------------------------------- -%% Internal Functions -%%-------------------------------------------------------------------- -add_topic_info(Topic, MaxAge, Format, Payload) when is_binary(Topic), Topic =/= <<>> -> - case emqx_coap_pubsub_topics:lookup_topic_info(Topic) of - [{_, StoredMaxAge, StoredCT, _, _}] -> - ?LOG(debug, "publish topic=~p already exists, need reset the topic info", [Topic]), - %% check whether the ct value stored matches the ct option in this POST message - case Format =:= StoredCT of - true -> - {ok, Ret} = - case StoredMaxAge =:= MaxAge of - true -> - emqx_coap_pubsub_topics:reset_topic_info(Topic, Payload); - false -> - emqx_coap_pubsub_topics:reset_topic_info(Topic, MaxAge, Payload) - end, - {changed, Ret}; - false -> - ?LOG(debug, "ct values of topic=~p do not match, stored ct=~p, new ct=~p, ignore the PUBLISH", [Topic, StoredCT, Format]), - {changed, false} - end; - [] -> - ?LOG(debug, "publish topic=~p will be created", [Topic]), - {ok, Ret} = emqx_coap_pubsub_topics:add_topic_info(Topic, MaxAge, Format, Payload), - {created, Ret} - end; - -add_topic_info(Topic, _MaxAge, _Format, _Payload) -> - ?LOG(debug, "create topic=~p info failed", [Topic]), - {badarg, false}. - -format_string_to_int(<<"application/octet-stream">>) -> - <<"42">>; -format_string_to_int(<<"application/exi">>) -> - <<"47">>; -format_string_to_int(<<"application/json">>) -> - <<"50">>; -format_string_to_int(_) -> - <<"42">>. - -handle_received_publish(Msg, Topic, MaxAge, Format, Payload, Cfg) -> - case add_topic_info(Topic, MaxAge, format_string_to_int(Format), Payload) of - {_, true} -> - response(publish(Msg, Topic, Cfg), Msg); - {_, false} -> - ?LOG(debug, "add_topic_info failed, will return bad_request", []), - response({error, bad_request}, Msg) - end. - -handle_received_create(Msg, Topic, MaxAge, Format, Payload) -> - case add_topic_info(Topic, MaxAge, format_string_to_int(Format), Payload) of - {Ret, true} -> - response({ok, Ret}, Msg); - {_, false} -> - ?LOG(debug, "add_topic_info failed, will return bad_request", []), - response({error, bad_request}, Msg) - end. - -return_resource(Msg, Topic, Payload, MaxAge, TimeStamp, Content) -> - TimeElapsed = trunc((erlang:system_time(millisecond) - TimeStamp) / 1000), - case TimeElapsed < MaxAge of - true -> - LeftTime = (MaxAge - TimeElapsed), - ?LOG(debug, "topic=~p has max age left time is ~p", [Topic, LeftTime]), - set_content(Content#coap_content{max_age = LeftTime, payload = Payload}, - response({ok, content}, Msg)); - false -> - ?LOG(debug, "topic=~p has been timeout, will return empty content", [Topic]), - response({ok, nocontent}, Msg) - end. - -read_last_publish_message(false, Msg, Topic, Content=#coap_content{format = QueryFormat}) when is_binary(QueryFormat)-> - ?LOG(debug, "the QueryFormat=~p", [QueryFormat]), - case emqx_coap_pubsub_topics:lookup_topic_info(Topic) of - [] -> - response({error, not_found}, Msg); - [{_, MaxAge, CT, Payload, TimeStamp}] -> - case CT =:= format_string_to_int(QueryFormat) of - true -> - return_resource(Msg, Topic, Payload, MaxAge, TimeStamp, Content); - false -> - ?LOG(debug, "format value does not match, the queried format=~p, the stored format=~p", [QueryFormat, CT]), - response({error, bad_request}, Msg) - end - end; - -read_last_publish_message(false, Msg, Topic, Content) -> - case emqx_coap_pubsub_topics:lookup_topic_info(Topic) of - [] -> - response({error, not_found}, Msg); - [{_, MaxAge, _, Payload, TimeStamp}] -> - return_resource(Msg, Topic, Payload, MaxAge, TimeStamp, Content) - end; - -read_last_publish_message(true, Msg, Topic, _Content) -> - ?LOG(debug, "the topic=~p is illegal wildcard topic", [Topic]), - response({error, bad_request}, Msg). - -delete_topic_info(Msg, Topic) -> - case emqx_coap_pubsub_topics:lookup_topic_info(Topic) of - [] -> - response({error, not_found}, Msg); - [{_, _, _, _, _}] -> - emqx_coap_pubsub_topics:delete_sub_topics(Topic), - response({ok, deleted}, Msg) - end. diff --git a/apps/emqx_gateway/src/coap/resources/emqx_coap_pubsub_topics.erl b/apps/emqx_gateway/src/coap/resources/emqx_coap_pubsub_topics.erl deleted file mode 100644 index 328d1df04..000000000 --- a/apps/emqx_gateway/src/coap/resources/emqx_coap_pubsub_topics.erl +++ /dev/null @@ -1,185 +0,0 @@ -%%-------------------------------------------------------------------- -%% Copyright (c) 2020-2021 EMQ Technologies Co., Ltd. All Rights Reserved. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -%%-------------------------------------------------------------------- - --module(emqx_coap_pubsub_topics). - --behaviour(gen_server). - --include_lib("emqx/include/logger.hrl"). --include_lib("emqx_gateway/src/coap/include/emqx_coap.hrl"). - - --export([ start_link/0 - , stop/1 - ]). - --export([ add_topic_info/4 - , delete_topic_info/1 - , delete_sub_topics/1 - , is_topic_existed/1 - , is_topic_timeout/1 - , reset_topic_info/2 - , reset_topic_info/3 - , reset_topic_info/4 - , lookup_topic_info/1 - , lookup_topic_payload/1 - ]). - -%% gen_server. --export([ init/1 - , handle_call/3 - , handle_cast/2 - , handle_info/2 - , terminate/2 - , code_change/3 - ]). - --record(state, {}). - --define(COAP_TOPIC_TABLE, coap_topic). - -%%-------------------------------------------------------------------- -%% API -%%-------------------------------------------------------------------- - -start_link() -> - gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). - -stop(Pid) -> - gen_server:stop(Pid). - -add_topic_info(Topic, MaxAge, CT, Payload) when is_binary(Topic), is_integer(MaxAge), is_binary(CT), is_binary(Payload) -> - gen_server:call(?MODULE, {add_topic, {Topic, MaxAge, CT, Payload}}). - -delete_topic_info(Topic) when is_binary(Topic) -> - gen_server:call(?MODULE, {remove_topic, Topic}). - -delete_sub_topics(Topic) when is_binary(Topic) -> - gen_server:cast(?MODULE, {remove_sub_topics, Topic}). - -reset_topic_info(Topic, Payload) -> - gen_server:call(?MODULE, {reset_topic, {Topic, Payload}}). - -reset_topic_info(Topic, MaxAge, Payload) -> - gen_server:call(?MODULE, {reset_topic, {Topic, MaxAge, Payload}}). - -reset_topic_info(Topic, MaxAge, CT, Payload) -> - gen_server:call(?MODULE, {reset_topic, {Topic, MaxAge, CT, Payload}}). - -is_topic_existed(Topic) -> - ets:member(?COAP_TOPIC_TABLE, Topic). - -is_topic_timeout(Topic) when is_binary(Topic) -> - [{Topic, MaxAge, _, _, TimeStamp}] = ets:lookup(?COAP_TOPIC_TABLE, Topic), - %% MaxAge: x seconds - MaxAge < ((erlang:system_time(millisecond) - TimeStamp) / 1000). - -lookup_topic_info(Topic) -> - ets:lookup(?COAP_TOPIC_TABLE, Topic). - -lookup_topic_payload(Topic) -> - try ets:lookup_element(?COAP_TOPIC_TABLE, Topic, 4) - catch - error:badarg -> undefined - end. - -%%-------------------------------------------------------------------- -%% gen_server callbacks -%%-------------------------------------------------------------------- - -init([]) -> - _ = ets:new(?COAP_TOPIC_TABLE, [set, named_table, protected]), - ?LOG(debug, "Create the coap_topic table", []), - {ok, #state{}}. - -handle_call({add_topic, {Topic, MaxAge, CT, Payload}}, _From, State) -> - Ret = create_table_element(Topic, MaxAge, CT, Payload), - {reply, {ok, Ret}, State, hibernate}; - -handle_call({reset_topic, {Topic, Payload}}, _From, State) -> - Ret = update_table_element(Topic, Payload), - {reply, {ok, Ret}, State, hibernate}; - -handle_call({reset_topic, {Topic, MaxAge, Payload}}, _From, State) -> - Ret = update_table_element(Topic, MaxAge, Payload), - {reply, {ok, Ret}, State, hibernate}; - -handle_call({reset_topic, {Topic, MaxAge, CT, Payload}}, _From, State) -> - Ret = update_table_element(Topic, MaxAge, CT, Payload), - {reply, {ok, Ret}, State, hibernate}; - -handle_call({remove_topic, {Topic, _Content}}, _From, State) -> - ets:delete(?COAP_TOPIC_TABLE, Topic), - ?LOG(debug, "Remove topic ~p in the coap_topic table", [Topic]), - {reply, ok, State, hibernate}; - -handle_call(Request, _From, State) -> - ?LOG(error, "adapter unexpected call ~p", [Request]), - {reply, ignored, State, hibernate}. - -handle_cast({remove_sub_topics, TopicPrefix}, State) -> - DeletedTopicNum = ets:foldl(fun ({Topic, _, _, _, _}, AccIn) -> - case binary:match(Topic, TopicPrefix) =/= nomatch of - true -> - ?LOG(debug, "Remove topic ~p in the coap_topic table", [Topic]), - ets:delete(?COAP_TOPIC_TABLE, Topic), - AccIn + 1; - false -> - AccIn - end - end, 0, ?COAP_TOPIC_TABLE), - ?LOG(debug, "Remove number of ~p topics with prefix=~p in the coap_topic table", [DeletedTopicNum, TopicPrefix]), - {noreply, State, hibernate}; - -handle_cast(Msg, State) -> - ?LOG(error, "broker_api unexpected cast ~p", [Msg]), - {noreply, State, hibernate}. - -handle_info(Info, State) -> - ?LOG(error, "adapter unexpected info ~p", [Info]), - {noreply, State, hibernate}. - -terminate(Reason, #state{}) -> - ets:delete(?COAP_TOPIC_TABLE), - Level = case Reason =:= normal orelse Reason =:= shutdown of - true -> debug; - false -> error - end, - ?SLOG(Level, #{terminate_reason => Reason}). - -code_change(_OldVsn, State, _Extra) -> - {ok, State}. - - -%%-------------------------------------------------------------------- -%% Internal Functions -%%-------------------------------------------------------------------- -create_table_element(Topic, MaxAge, CT, Payload) -> - TopicInfo = {Topic, MaxAge, CT, Payload, erlang:system_time(millisecond)}, - ?LOG(debug, "Insert ~p in the coap_topic table", [TopicInfo]), - ets:insert_new(?COAP_TOPIC_TABLE, TopicInfo). - -update_table_element(Topic, Payload) -> - ?LOG(debug, "Update the topic=~p only with Payload", [Topic]), - ets:update_element(?COAP_TOPIC_TABLE, Topic, [{4, Payload}, {5, erlang:system_time(millisecond)}]). - -update_table_element(Topic, MaxAge, Payload) -> - ?LOG(debug, "Update the topic=~p info of MaxAge=~p and Payload", [Topic, MaxAge]), - ets:update_element(?COAP_TOPIC_TABLE, Topic, [{2, MaxAge}, {4, Payload}, {5, erlang:system_time(millisecond)}]). - -update_table_element(Topic, MaxAge, CT, <<>>) -> - ?LOG(debug, "Update the topic=~p info of MaxAge=~p, CT=~p, payload=<<>>", [Topic, MaxAge, CT]), - ets:update_element(?COAP_TOPIC_TABLE, Topic, [{2, MaxAge}, {3, CT}, {5, erlang:system_time(millisecond)}]). diff --git a/apps/emqx_gateway/src/emqx_gateway_cm.erl b/apps/emqx_gateway/src/emqx_gateway_cm.erl index 546640a90..83142abb1 100644 --- a/apps/emqx_gateway/src/emqx_gateway_cm.erl +++ b/apps/emqx_gateway/src/emqx_gateway_cm.erl @@ -31,6 +31,7 @@ -export([start_link/1]). -export([ open_session/5 + , open_session/6 , kick_session/2 , kick_session/3 , register_channel/4 @@ -225,28 +226,32 @@ connection_closed(Type, ClientId) -> }} | {error, any()}. -open_session(Type, true = _CleanStart, ClientInfo, ConnInfo, CreateSessionFun) -> +open_session(Type, CleanStart, ClientInfo, ConnInfo, CreateSessionFun) -> + open_session(Type, CleanStart, ClientInfo, ConnInfo, CreateSessionFun, emqx_session). + +open_session(Type, true = _CleanStart, ClientInfo, ConnInfo, CreateSessionFun, SessionMod) -> Self = self(), ClientId = maps:get(clientid, ClientInfo), Fun = fun(_) -> - ok = discard_session(Type, ClientId), - Session = create_session(Type, - ClientInfo, - ConnInfo, - CreateSessionFun - ), - register_channel(Type, ClientId, Self, ConnInfo), - {ok, #{session => Session, present => false}} + ok = discard_session(Type, ClientId), + Session = create_session(Type, + ClientInfo, + ConnInfo, + CreateSessionFun, + SessionMod + ), + register_channel(Type, ClientId, Self, ConnInfo), + {ok, #{session => Session, present => false}} end, locker_trans(Type, ClientId, Fun); open_session(_Type, false = _CleanStart, - _ClientInfo, _ConnInfo, _CreateSessionFun) -> + _ClientInfo, _ConnInfo, _CreateSessionFun, _SessionMod) -> %% TODO: {error, not_supported_now}. %% @private -create_session(Type, ClientInfo, ConnInfo, CreateSessionFun) -> +create_session(Type, ClientInfo, ConnInfo, CreateSessionFun, SessionMod) -> try Session = emqx_gateway_utils:apply( CreateSessionFun, @@ -255,7 +260,7 @@ create_session(Type, ClientInfo, ConnInfo, CreateSessionFun) -> ok = emqx_gateway_metrics:inc(Type, 'session.created'), SessionInfo = case is_tuple(Session) andalso element(1, Session) == session of - true -> emqx_session:info(Session); + true -> SessionMod:info(Session); _ -> case is_map(Session) of false -> diff --git a/apps/emqx_gateway/src/emqx_gateway_ctx.erl b/apps/emqx_gateway/src/emqx_gateway_ctx.erl index 406de7767..d9517b53f 100644 --- a/apps/emqx_gateway/src/emqx_gateway_ctx.erl +++ b/apps/emqx_gateway/src/emqx_gateway_ctx.erl @@ -40,6 +40,7 @@ %% Authentication circle -export([ authenticate/2 , open_session/5 + , open_session/6 , insert_channel_info/4 , set_chan_info/3 , set_chan_stats/3 @@ -96,15 +97,18 @@ authenticate(_Ctx, ClientInfo) -> pendings => list() }} | {error, any()}. -open_session(Ctx, false, ClientInfo, ConnInfo, CreateSessionFun) -> +open_session(Ctx, CleanStart, ClientInfo, ConnInfo, CreateSessionFun) -> + open_session(Ctx, CleanStart, ClientInfo, ConnInfo, CreateSessionFun, emqx_session). + +open_session(Ctx, false, ClientInfo, ConnInfo, CreateSessionFun, SessionMod) -> logger:warning("clean_start=false is not supported now, " "fallback to clean_start mode"), - open_session(Ctx, true, ClientInfo, ConnInfo, CreateSessionFun); + open_session(Ctx, true, ClientInfo, ConnInfo, CreateSessionFun, SessionMod); open_session(_Ctx = #{type := Type}, - CleanStart, ClientInfo, ConnInfo, CreateSessionFun) -> + CleanStart, ClientInfo, ConnInfo, CreateSessionFun, SessionMod) -> emqx_gateway_cm:open_session(Type, CleanStart, - ClientInfo, ConnInfo, CreateSessionFun). + ClientInfo, ConnInfo, CreateSessionFun, SessionMod). -spec insert_channel_info(context(), emqx_types:clientid(), @@ -132,7 +136,7 @@ connection_closed(_Ctx = #{type := Type}, ClientId) -> -spec authorize(context(), emqx_types:clientinfo(), emqx_types:pubsub(), emqx_types:topic()) - -> allow | deny. + -> allow | deny. authorize(_Ctx, ClientInfo, PubSub, Topic) -> emqx_access_control:authorize(ClientInfo, PubSub, Topic). diff --git a/apps/emqx_gateway/src/emqx_gateway_schema.erl b/apps/emqx_gateway/src/emqx_gateway_schema.erl index 5cb958701..5c98e1f34 100644 --- a/apps/emqx_gateway/src/emqx_gateway_schema.erl +++ b/apps/emqx_gateway/src/emqx_gateway_schema.erl @@ -215,8 +215,7 @@ fields(coap) -> fields(coap_structs) -> [ {enable_stats, t(boolean(), undefined, true)} , {authentication, t(ref(authentication))} - , {heartbeat, t(duration(), undefined, "15s")} - , {resource, t(union([mqtt, pubsub]), undefined, mqtt)} + , {heartbeat, t(duration(), undefined, "30s")} , {notify_type, t(union([non, con, qos]), undefined, qos)} , {subscribe_qos, t(union([qos0, qos1, qos2, coap]), undefined, coap)} , {publish_qos, t(union([qos0, qos1, qos2, coap]), undefined, coap)}

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 literal 0 HcmV?d00001 diff --git a/apps/emqx_gateway/src/coap/doc/shared_state.png b/apps/emqx_gateway/src/coap/doc/shared_state.png new file mode 100644 index 0000000000000000000000000000000000000000..2a7df229fc3c6e283d73f80b060667ca5f7041bf GIT binary patch literal 31330 zcmaI;1yog0*ES3*ap>-DkPb;HL6DS^ICPiNl2Xzo9ZCy=G#t96C8Uw=mPWey7J5JT z^S=N8jnCm29M0H#ueIi0bFO(^^O}UID9K=;lA=C(^aw*vR!Z&BBY5gZj~??O!+~#N zlJLa94`yd+sI#fPgNKc|h4UjBb31bo{?TLb822=9l|=95a{337FZB1l1>vE3tU(Aah0 zDkWcy?1)|FBVW{r#`G`*&2kB4V`|2U?IywbCo*rnn<@@~c#bwfkho?keKV0-nHYBcu}=x*uI-B2R5Rs~2O2X;0Qc?eQqrgC zSjeXSij|uqw?fRG*E2spYdV4#l_N(w13xtQo};a%WsUn;blZFQT$5h4;o&>KQV*#_ zAx_+hp^p3U<}yil(h$#7k4}WJ@%7O%4IL%cKGvhTKRR!^n9B)PyQrHs>TRgVT zLm+(3{e@v8%!MK=oW5JEKj6xCm@2XpL1=LPu@^O=_xj7760DAl3pm2Hd`ukK--^Jj z;c`+E>h1=+=}1s~8LA)ACI`)|s-_1F;n^l-F;KuztTF_^R_FL0zJ zo_B@5R1LFY%g^tG$P0fzw{zBWB@$eU5x!^{I#@Qg1pj{aHwg<1=gCsX%F^S8Nzqzs zpgKMRKOcT&_NEPx{`)B`$2_*}-zTZjiXNl?xmeo__V2dXDmEVI-v`9X>JXB!Jv<6r z#2$f8`0rC(Qtqn&0;0=5L7U^Ay5yy=^r?)>KT;$6QzJ{}eUPrN9p}FBGSd6SR31H2 zSY-q=S@5ZAne7_8u?*3(a1Ez=xX_>4nY>%1WY8_;X!y!`uG^}-awK@v947WXv`*}8 zv875$k??O+f|JBQ$o~1^Nvsm8+4nXm}nS~ z|JtVZqib>AW>XKwKD3zp4gTJs{Ae%zwfs8Y-yxCH*KH4b8&fAU`6xPV`~R?b8@d}1 z%%(d(VTZ78%U#rKu4)JGMy4QrOgR%fDds&#kiZ828x%WT1j<}HE?EWdNp=>$d*Bfe z5Rj3vx{4R57h+7X-nT?2?e zq7$D5oZi@ccRdMWJx zuD)dy8}{u~-zaY)x*;JYC8eays3~QOL{H-3$cTJXEAZx}x7OcvnrWEO!7EK36dj4w z58UV}1qB8M1_kA|nOd8{_U&p+?V^6@<2+m$TkYXCG+!U{MlnI5635Ta?-07YysWCK zYT}ttti}(e%51SX)=xh$qZ#;TKqzO zPoCN+J>_|@G(s#zXk^2#PAT3^v}u6E!oq@p{Q^1~nt}$CCMtw=V-Ja+^F?dE_2@j_ zzbVV@+fCY8=Ie>hlhu!689;-v^vK}PqLg1lf6=m ze>_TohY*WM9q@1izL+;tenWDfn~RIf>Dd`3Cgy}!m8TPgmE-8^3y!Ds-f!1gwhU1G zd*EW)Xp#M8!+pD$AeCV@nZIdy*C(Iw<4C zS9lz)#g&c*Dy1t%;4|m{WQwFlF2TN>iYK9I6e^mZoAdJao|a`RH;#Ml1ld{8lo>DT zCja)wQ7hMz0htypMigTro@pPoI;V(N;#`?j0(+*N*_YLwW+$uVnXs^@yE_6RVo*?! zH4i$gP{8RV`uN4ADM6#`xeRuo!Qt6nm(V-5HNn=MEp*T>c0Hbw^wh8ST%odYmiYcPn8eY&hkrNq(a)tVZ@T^Nrqcbyt_ydv zHFh?`H(Nzg+;UezCJ3X$B&jb^%k`QpWzQ75y~!P%D0!z_l|O_|$kTsu!u+8`)cZZz z+0+*am$gc>-s}<`K4({hq4;L!Eo$1$fmE{Di88}T+npWH4>InTqi<)bXvPaQ+I@B= zN*atiil?COpEDqfZn%%{A4>A4|CpYg%@lNO9~$E1>mWji&Civ7n&nH$Sq(;YrTj9l_p(l(Nr2qLCfpaNc_33do1_2Zhk>VFQkIU zRva_L&!6bkJ(?RI`AViO>*cjns*eVBQ!PZF=nR90^=3;O?v(!i{qqAS<7qgy=UmNR z?fHSX2eJ)ecH17xSBBGYn9I&f4#XE6@2fx^d&+|X~uKJbq5M#6&eS?5SlZ}GVH3_L* zhsFWeZ1f_n-1M3{3MT%Mgw1NcAvwE8zoF{+MO(m64_TYtaaw6qQWBEyKHeEYFpg46 zQJt`wR~@YF5&_RlU)~7n^N&JH#;q>-;PQpI*B;H_nM=nP3Of^ z`3DI1o?t-UPI8P3_oabIp#SX8cu^TAw@?b%!|o29s4#~&{!-lLKPhFDDP|kgUFUr* zg5bJs#_}qe8oBuc85=7rD-#nFzxE3#^z+nHIVng4bp?-uQvcj@;PTB5ZEE-u6RgGh z!umAaP)@`5B?h7d25p@=Hf{cw&=j=*jV5>F5e`bxXI->E!&|V~UVjrLj3&Q)mYo(0 z2_PWzbh$X(XS)^gaC(&?a(MX;%Q(;sop5)_5B}#;e4&;Avqm9t#J8|E6HYwy@hWTE ztte#wVYIroXU@N40s=Y;UgvQbe!sc+V_I$*7m7|OVdg0LB08FEl1S`D7G+uUn{oVQ z9qlq|KIrDq0lQkxm-2EPI4laC<*oWgEzWmA7Lc7qUvaYHbYY_1#TNC>j*!f}Y13~5 z1Gbe`$GpUBKMG#Y_V<&*^glgOmAVi$RfFtojXkwd^xm0>tg%V<+@Ir^;LHtcBNaN5 z32LZRdH=DrG*wEN7Fp8p;b4(+3Jmd#A{o=oI)eg#ajz@Z!X_zJ&V=hrV2;92PMd09 zr9TZ{w9?MN&56uZ?sG2m>1_?vymOU4%5a-TI*T|^!9Bl7K0YYw{R{T&6ipy!z^ zW%ea&yL7}4x|jhq32dn(Kd^9Y=GS>qg`Pk9-XLPdo}$tQAV&Ll$tU(9uUgr`5)2{r z%9&zP4dG)2@dc7R1rmz=1pNH00}zFRjB1H2*Ca3b!aU`n{M|%Jnw#&qYeShte(jgc zW*CHIqORM&_>GskB9c%~@v*WeV-X~N^O?br{juL2WE44sx|!urr6z~H>TVtGG(tpx zGXFCDQGeVjzN;~_)(d~B*-Ol3f8ZS)94zESoGDVTQ58P4(P}Z|FR^@ZL@6$YF`3Bv zsqmat1G3Xc@K)?=pqi*#zN9E35ms3EkpMrx_Fl6Xdexsy!3KwG{Yy6Sg&>O{@zYAkl)~PO#?;g|brLokG*%&FN%39h ziDDe-aC~*y@5(oSx+jo}RkD5+YP@!6Vskk8ZGaqzL(X4JR!k6;t6ll*@_18vaI){V--t+5#`{SAA+Q<)#81Jt z$rP98hKa{@E6+Xf?OH!X*<)E#|i zxZB6z(}yCrZ~YqkF+ zx0?##XK;`Uq9ioqPzke-k&5l@IegY~G$Ls1C<+*@79L z=?|4HO^|t72S0d`b|xAT8+g%-@KlT-G0Y-(F!2Loup$AG`QZb$&fg2chrlG7hvX4_ znPvX}d08)ZfJ?&yHvP6vX}od^%D=}-t{tUlKk40ZomBZSTxzgcukKz^00)-$}S30Kom7)b#&O?&R;O{_$TtSzAh%e`(M%qkZld>$b77NvrL;-qN21Ms>BYp5&(JO-gKtUzBb!`OqeKX!<;!M0lU$DI;3>SAHbTw8s2Yq-} zH%owM|C#m<6aEYEY9s?azb@BmQG|M(=;?WW)0JP3SLB8|uDH|V$`!r$;cqSK;LI-U z|5~zPE%)-LL&#$T1@l8oyOuIwiDKu;4frpq6j}F5iZcfv{9t@h9 zo37&6H~mn>LIXBwj#N;3i--lJNRk4rrg?Mwa(}+j`90fRr4U$)D83BX3|p_goIkqN z4wWG)Paa(FXEat_J#6o|&F|})A$o<&+L-kNc0%jeq%&s}izfH!inz0h@3h zF%=!d2d7GbkM6oEk5b?AKHn&T!C+M$4!jVAeHyG*`U@qr~z-7kv$J{4z2c zJ!JLf#wCM}=nnVizm7^dKjwi-1v}aAKoZ+{tSoBJKcuFnmX+B%IKYBAQF{UVb(ME` z?6-Tnlse0l%LgZs6I$Hnmc2InF!*0yjzDH4ur@WBu7uGckNnHA%@R8XbVRMm3&+V~h5y z@ggoICC}L4V3dmqU|6K2q(c9DbBl$IRIii$oS_a8b|7O9X)#E`+1TDMeD@Ay=g{RZ zFl;$1MnYRQnkbgaEN*D9lMG~h^~Pn}tif@$__tMZfgP2IV7XD-R1`&Ot(EHHTvP8- zo4%eNe`hz+-O*2F+2O_em?u7p{fU28ucOE&wLZ^)l=Vl{Ucf-CYzXGSH$@WX`|o7B zi3x4~e4QLRH8vk!9S(Jb{F+qAiCxubEZSA=E}xi~u%VwANEPS+8054<>VY-9echUG z{zQ9ISX*`n&VLv|JAi>SV7$pgU)m)3bAox%QjAdmwpx`H%|%8WL&S>jRPof5)UhBq zReO`4B5AG9bw5z(lLv_xAoskIY|IFrUsSu*B_nn(A)4Bb@? zU!D8=vY7ycRjKg0Qi_>CM94x(A!ailEkmxgOOH4lOn)WrRTtQm|HQYBHE?&P`a`#n zuTNQQEX_OB2Skea-S;4Z_sZlQ=|_&Ce#ipja}u1@%CdTjJc^@Ok}^#)f(yxfmY zcaC>`3)yE z!TFV)7$T_EB;KQII-jibn1|De2wos#H91I_e+Izf5c}ORBeL}rEI3~`;`P^H6x!C? zL+stb;bEB5x)Z<|0MS{DOq8Z`%%{=tL0^AEm+V>T3ZoPUlz_RB(cwW$UJf(xcP>w} zG3P@+cqAJe8$Esf=H}*rfPmNJn@SI%QoJ{j&0iLAiyP|W6M_wGaOO5%`uWKKxj$7v zK-cT~EW5lsmew&d33(&Z=OPOeEBR?R98HntE8_@Z*M3V+nKz>YL1D-kgg42*pClMQ z`vG>J>}%@KH5^j5Wv=4?zlA0xj-yJCnvBIPG;Q?|avF-U&1v>jT3W{PtWfh1ihH9z z(XMzRi9JYrbKpxyuq~vNJL@C`VdXz71hgZya9EY+xui8JLafM~(cWUq{o!)Q;NT!7 zB_)U#%u(-{{zi*6c|wUC{}W<1g`W(_Y^vGF*HtPAWQhdCRvjV(kz|=jlD(sO(Qh7I zm$hJa-}Cbq{qY6h>0*ZDX)wz#PLf=*hY?x&GWTkM|BW{N$@+tkB_tVOZf@RX*@23N zhNm?UCjEcg4kXAgj0)7c;*z~jrYkG^f0K*fd!{Reb7N6xF_1Ad3(0W-`7U=)uT_CeOOVrT)a>z&8zlS4=VuE{ z@|v;_;N9|9eg;Tur>2V5`x4djyY)$ki4T|eKK}fK_4E@XsS1PC8`#vGzWBXjWhc%I zzHU9 zq&uKcgF-y}7-{*SVq(|jV}K!W_t?Y9eTi-T;s1Q@n34B|LxJ_!3{<1sWQ%~6QTW+i zIf$m(l`nsl>N7BIphn`|@5p zIxJcGkK5U9EZA9@!fxtcU-F&p>-W>jVkD`FB8kE+m;Z>|@my-N5il2~{sO%3zL#;V z+6b{IQZKLco2*cjHvo${Kz2D@DCSkSw%3g1SZYuWaOtO)F_`wBj+WX`avn`d9g;fT zHi*t{|5+Uytp))IgwGrs`uaF&?Dr^oL~|O6EbH-?jIq=_I3T@Hf(&%Z}|rcT{*E&Qh=C-?0@kR-})gJ>$@@$g?9J3NiG9woSFyo zSC#9phuPr$&uq9nrA!}eLi1pg|7*|_h}-!dBcr*1Z3?@-w3q2OWh(!-j(}Hi)?nnZ zQn6gy27q#lWo7oii`CBbgBNDO508m49o4w%0t})fwZbQ*gwm@sbcz{_+-y9I>$_aM$W6a3lxA3GJRW8<$aZPn|NWK96cAA5chIdBQ4E~5-0t$w1#|GWoQ0(HQuL(3&c4|!E8 zH{2cy1i^Xnj;mMMe)UdWIt?snG1`!~qd9(42e}GJxkb*I0Mf=>0$Nz%-%!o(lj-2^ z?^1iP%>vs@C|VoNc+_`n<^<6~Jbn+OZWZ$W*Ip)oV`=ueExW&7?CFYN`qB^<*&O~{ zXpYVPx@55ML?d{!l)uInsv&8_f>Zjn$MH(reKPz+KxFF;2 z*C{t~Qcn<<1U?fB=!v9+mU|j&eqxYc0%FJIbi3f)W|U5&>odx4xsHN^gF7Qp*-27^ zvAgA_soHg)CMnsDG&e!$gqrD-E-YLVvJp3WU9S1wIhwwWO};$tUV`Ruus^#xTJB)A z93U;Xna*i#9SRw04d5JYavk6YQDy}kSsQ?W%O1!DB!z#;Md{-~TuBiTSCp?5LKPXO zXDAp+We0wMpI(*?@F$n*U5OJCEH>A|-ZZR3C4$?kd`=D**WSjs*tohjp7&bd^LpC ze=JIYS!d_>1rk3|@KQSs)9%e`!$U%yTxKvIIB(NlS%Olh>$<1&0WF+PlHYFL$zr(z zveS!q&aS&bTO^qD)Y4VLZoRXy^}SyXc_xd8NG>cX zXSuw;KU*HUa(TGit5NjLh?DK6BSZlZlPdj=C8`S@?SrVVJ0c@Xu#pm50cjsAYWCa= zX?3M^CAfR~hqV;yO(1*%r%lxLW0@+;AzGWLv7jsYIwAOJ-HJ8KoDV0`41Yj2B)hgE z{qy4D`7Ux802@MXc9StQ`i`GhyU)9HY^NW9)Za)auSa)5`5~weq;v6%)!#v(OG&Zk>i$c9mV9`KlFMk3Ko?zK` z?H_VM&R(p2+^AE{LT3T!al1L}YZRsGH;IA0E7;IFD|A9qYqr79+|GRo5*OV)J=nfz z1bxx(3HN9h=ccA)FU0UMY;Ui|jZjnhiUPhqFCE@Ls_u@yFHp&h2ibMyK<=F)>Kx=J z3f6SZo3u6!=*Q$WSDCpWhQQ`{OexZp2a~d%9JY_`=J?#PQLdMJeMs0%??LW;dCLWar z+3&1Xao8`+2_{eBI7Ot=CvOt2ZSL6Nho9~F8ZD;_r<&jx6arLvk!SuBB7bU1Jou=T zaX-0GgO$1o1h;mrV^Pl<3F>}~LbMFVG+Ii1D8gEN?#GU9YblTJ$UcGYdnlqMV-u6A zVc5Q}E3N}d3>+r5HZJKmP$uk{QT_TJlWHM7_d{xna%PQ)L{J0n>Yp+AzbBMjsTl(t zAK#3{6mw1JS@fw9x0xYMJ6|XUe>piJJDW~Dj;zxznyxZ;*Yp=crmm&Xo)Q69 zxlC!nI{HZ2(ln;@YTSs01DAedyKg5HZo==8OJ1GXcH?a=G!u}jR(Z&~AkpkH^9(hT z4`$4VRr>u%U4#e8gf!|`ne!E9dV5&Hmb{mw=_CviWfhDRJf!lq8L%T0$!;~pAQ?@RiHYlHmDDpN zMiwL!p=gt)2|T~a!f(}Y>s%UT9T$D$;BtFa{ps6KthaQJ4YneBA7&{g>!hmc9Y9AN zD3*?&soIYpErye@nb{A28LVT%!Has8#s7v4uCz|_u*a_tNdtQ^jUiN*sEZuQ|6R4m z@x4RHQt^r=xKl$?zm4#ZUSNbjZL564QAC?$ebMVYmNb(6XRgw}324HkKPS9jOpb42a@<>A+N zw?i-2))hDdtL)}O*&&b_BgghYACXre^F;Q$Hjd~wTCPtM$Ry=4k;1a+A>RXx^GF}h zYP)V|slIMDgVFudfFReD7D9>m;1~!-VWspMRmP+4pJSHn6EoFg)3lWm#f?$jevW~a zYY}R^0#KOnoUsuRGBW@x;>Y$2dQzbvh}85bH4d}a*V#Nr_FY7H9U(n3JN5qbdr0E) zOQuzH!v0KJ$NNm|*f#%IHDoVz_*|3$@$(!5fb)&>+ZIE68D?hl7A%@KtD6Dm%Zehs% z5E_-wlF2+>eq2(48xV!57UbFxY*%V@3#3$mvY&+7pXm1qGj!MRXvXq&Nl(<7HMrJWy|jNrO2^uk^va0v_~(FH=`xeyswjBUEHScP0K+w_i#NM zQ|S!i)#hJ*qrQ~F5|^$^PZGdD-hz1GkFD@?$is-Pc4LsD%k5WwEDL?|$Q7t7-G$P^ z4M{$MHM((1k(2XbSwa*(Z^9!b(F7{*1(RhoCv@7b?sz^=*fptcTQOxNK_iNK?Nx47 z+(?wCPyCn&@zXb(XMfMCcdYhWibqsS%Ox0jWgm zgaa*VqF-dPC?n|R3XT+5f3g+ubf6O|eU~iBxr&j3pb?c@sXC54|D%e0)oN7u?G>4S zDv2KfOM;W*bgOB*1~uY{$D?+d1==`nXuI($Z2&-;)-PTpQ+J1$%``)_LNpfk52B0UY-EQEM9SLO60)u$;qzhYmd41s; zjAIaIMX(nk0foMyWK+K$u4i7({G~jY{K@CeYNHk~ha#gEug?jLppyGpCRxz&(a%So zm(PQ2IVu#2bWYE`zgzgk;A2ta_3jx=Fy2|y2@g?F0%lma9L z*hO+#K7T@5Y_LU1p9WotVv0Pu*Lhvw*Jjd@k-}F*H;+aq3fTd5NMoZbjEV80Lda*| z&x}DXexctxy7m2@FI2+^FgR}m#ZjSdZK0$Q4600g-OsK8^Gwyn!=Vl6dI=ZyEbTKA z?m$AD(dzBxtI#vb2ml~*x#RtTFzykTbU+uxb9$;ciSaXj@dYx{9&JC|NBute1RzeynBC|;h77Tj zsXg_%nN%IM9NOpQ<;6E3;#a_fVf_N*?0?`HwF-6JoLqYWw*|c?@*IqZn2#B@t#6aWg*#`R!NvM-fbw)wlW& z+7<`+)tKo|w1RuPy~eE{%DPyj15Ss;?d%u42E1zRET9o9y@bha?Q$DbbRAmd$*-qq zmH3nd2kANadS15p?3EL6V57b?q?^rofR>6Wp+N z`978qGLg3`_AEfNw~9-GA02|ZJS^; zhe22AZA^2%Xc)nJS`Lyk&Kx!#^r4u(F@X(la8u3Y$g$J=ThswQyord$7J^no=GmJn za6VP;eGy`+!wo%TwNaw`Y`ylNCENK`&_^beM#6tf$A5V`x$J#i(=lGAl9k|4p>lRB zvD}WRQnfP`cXF=Sm6G7~`z#CKE zEfMI0JW>__f>;ebM;i^m0B_tRY+okBYCy1$XT<1~ZtLw7BGSf4Gs9=FiFoZdPr$4e zk@u@SP6O`l=;l}Tde$`%Z^<9D)P_((NcY3il~9bd+fV|g=P(&0NLR~YPb~L1<^-e zgGG?@uv)Vnt`01R2E(tCjS#UboYpzp6F@Zr)ob z_3GpDE2NicjReZ;Vb|E-32AQNc_ICe;iTjJ+cA#m%)PGgVdg*e^x)R;EU^aAeJ$S~ zWU#8iD&%>G5rP@JklX;7wp)CpmGmI{P-~J2$z>yN_n#o55#*)BrSK-9`I+dzmx7Wg?HginS2-|6IhL0cgm(DsOA0LP4PfeG!83fKt*Ew*l z_jrL+6S@MU7JZ*@VY~!+!aSHZ{rGiI6OA{NMC_bR*h@?o0bbxa@aR~LG}k)YWvNHp z+*+=?pQCePA^~%?x)D2g8r|R8X~e$Ldj6%jcW|q~YyGP0RLMtJnBEWyP-t)?iY_{GGSB%a;5Tl0L$*0SE0Hr&X6C#dd(O`T?W?_$Qn6a z(iJ_4BVHd}^H==gyOJN3{G$u`+CcPt@B;7lC9VYhi+^f#@maP23xSOTl^@*^_B`G( zfGOs|27qmM(uTmx_HlxjJf7I7-Tt zSri8$mNq(#Jz8u3hh0uYvt_qTcc?vI`lpA-#l$n!#x;&g0Kf;>oout0u6WOoN!Tz1 zlrMl7?sEE3-c2En*4fJe|4HABn@`lEFHcexnpk)A@(jhAyorEB{`;mg^nr*+mc%l` z>umA5^iU(7XNn*zo_y?E`DYhM07OKs8AN^jW!W7^v~Gfxj46M5_T0D~ob;Oh4e>A(mqW{#HiOoN}kHuo;Nof%N>nF*uC>G1wKw4{ZRIs(WB! z`3K>{&&p#T=k1(#VQj?YjoS_>0ImA_kwgYiRRQ$(Uc5QR#QcD3aeyCCx07@>dhQPf zsdIjr*NMUem2)(-G4JUAUdo3t(Y;wV?WMITJaY0>3gTor_H1Ldxt0rS;( z%j=ts-=)O*^{AM9XA{7$YY!WBHQlyum?IPOy?Wo;34o)h zsN3}wWlSmUXzM&XnMOJkGN82kEa#eX2T<)j?21|cR6$Zd+9+FWS)B)-L3Zx!h$fbr zTR87>^K5!{CO2Qah;Dg*>ar5^;Sp<)q-v?2oV6J(#{ZAb-SIpG2>e4rWTd6T>|asD zysh6a9DUFSd69)zfv5hg+>^5L{MP%(TK6+XvalQe?ym&q0C({IOIF9+{0s3D54LxA zcbAuOh>3|oUjYtIRzNzm7-vdQ&jBZFc9$zF^g$?e>b-}!>7A-&|!&mH(e=h4nt4TKA78CSy@?M zC&0%K(+-O1iAqU7a-1vnIqQ#DI(q#NX=ASA^gddBST z&!goQRfxn!i%#oX^1Vw=Pf!1^1_1N>lLS!2c_@nXzWFPtxA`5@!7H|3cw%*$-Xq&W zCO~fHD||LfT)a6X+SGhb18=`*fL|g%Vq_e@Gr8yItji4WIiQ@+1}TWPSmrx{+&;05 zRHUP?ukZg92po(kCO*`1K;cAL^C{GKK*f91rPzdMD{C7c=pA8n_jjK1#DW%z_6QvM z&tgN;1j`X=PIt5-qOtUv-@h5j4#EeSi3ZTbd}SMqAlig}Q2}Vr^lddC1npa)$8kfu zKAR42Mj3AK)7#5U^6$2?J>`I#v9+=3)Lf=wqgDCrqY?wJNx-W41O$dOAwp0`Fo|W= zUr6O?0sG&^Si~sz)vVBRJgd=c(^8= z1@W@}SXGDAEL8~vCyXF%!>x)6R80=4DdO!cEyePbLyXqQ_X#zc-B{2%2a zO^jGsz=Iz8g31^uRp!=@GK=&>io*S-L*bDyp}M-2vCxOU5-cpD#jnXM^>K-`lZkyY zC@8TjRSyy+vVWR3^u%8=a&hD6Ne8VSQ^R>fn}Y=D3>pwLOgg}GMnz@%9&av)Y6a=E z55&Kh&L;?1U$2&-fjL(ImG1DbD#~`teqt8%G`_b8aOL44Tmj~0W*4{T1Z8^V7Jefm zpJr?CC9=+Rv&~#E=9~)sPdc!zB}NMz_d)VOa;L_k8t3xl{((H1zRFi$`1C7@$4n@I zp)!jjjwJvT^MNq*rEx#dmeY!G4F`vq<+nAskKm>PiRweW8R*mjzd}yS1@cQAoQ3v7 z0A@G(5?{L`1I|_kkb4{-J(m67ObWsSS8R9Ce*uk=vPW@wljivbwa0e58Yr!D=ua5C zJ_Vb>ctX@kiUG|;WNQFY!9c_2tH{6d1duAjG{SJDHOn%tj@Bow6@)4vZ-I;!*=G1l z1FsLrAIsnTOsfCOK1g3*jAW*>0%+gV=zvmHHRu$t)#Ib@s3(gNNBfDDbtkJjU-O?V)zz^G7{ zW&d2~#C>XB=o1AX$+xI%Kte>^`X%Uwf!fouV*8*+OvqU(-jcRE_rqy(4f@!8H31wwC+s(7 z6E%g1JGQx;Aekl*)?e@sh~%n2-!EuMpaH_fxQ+1DB-t8$>VVT%#?3qec7lh1Ph#ko z%Na0=q?|{iK_mP~(AAF&P-3@tqbvIojm=Tet5gfLucDr=NfZTEPU_@!lD95q(5X$; z<9;KM&8rY&>`qt8#*QL=Y-sJuFx5aTu)7bq))0jju%j<3_7cXB@m4=5Ky&4&er4)2 z6{`0dnPc+3^+8(X0-Rj#ReS>|tC5h9RG^dsN&=QBDVnCo%PY_N7xy#exnznV!n%;K zl<--5Q71MXy9x!!c-b(iIk#7r+t~v0cl%QV5wR;^)o-4Dw#|es$RPmGq>q9>(H-QL#wg!;HwhIOE z)@C`G4(|x_fYtyM=B=hHBvSb!-)(9#fI6`j)wfE$8^@1@)Ee7%^X5&jRwZiI8>UG3 z?rrMv#nbY|9=TZ@>J)tvn@lWsTxmQbW7&ekWs8!3a7pziN(Jb+6GdPFk)oc2d~eiO z0dzdwpFi83PDchMp0FTk<>dq|aJbS1-tS{rf^H||kOEu?AgoVzry-CcrSw7$4l?MM zfDWC`stTR9uk$Sj!Pq1HnZ3trVb|dV@r`cw8oBZwIav0c7-=y;-dv7~vxMB-bar?M zcmpIXj_wU;(5f_Jxrg2gRm7Sp45WsE-h4Jt_*h{eBsZx-(hSq#f1P4}1RrvRQk(JG$@QPYvVw%7t*yO%5aaiVrz&#zF{!*Y z>AIP@pHN9PEpr->n`_Z+uN2JF*hmk6jfq_X-}` zOO|@)j72~fJ{83~-yv0jcmvrrugwBgW6mz_D*Af3BQ4i!jkMY}tearADgl0i1`?nJ zo>y$hc>A>9t+n$}#MUC^E|I4UWelG2j~L}OLJvYJ2pC#gT5dMz7e6Y{wy&^m@j?~< zWM-*;+8qLSWVRZl@D7MaXR!9W%${X0*X*;FM8MDCdI9BTO zuGotFg#{mn!okh0KJw!f#M_!D&)Q|)GrOR!VP8twY1hR1k_TP1g0RLRXBG_vmr@PG z*=_PFSp81yV;E8`@97LaiGjJ<{8h5C$-3P;PIs(ubx7sb4aM$7e z{sSjO`pD@qqUPq?52yMR?9+F-_SuV_zl39a$q}Qv%8h1`#QXs8r;7&i)fBL*K>l82 zzt|vO%A!}jorh5VAv9wkVRvoX` zi)+dG_Q}zrrA_JCm->ht2m{)ORW*)^*?u`{*ydsBIAag*e04|B+UgQ#4aED zCo}FFzWYAWxJK~x@^2ZCrH(Cq?5I00WfxMz}29NxV< zK0EvFaclvF61$kh$|kddUXrX=aRN|odvOFMZA<%K9l*#?D!bvSVs}y(*#?P+aX{}LYEU+)yN_yELuB%J0HWMIrx0;m3H;kJ zjr@NO!wvPdt$oKn`)VAU#mAw4jAeUE;g5dNM7L!b98;M~&&Y~Z@1QZ0cUMt0h(K{p z+T+4O>4)Y_H@EQmmjs)`!>i!L6m>L-;2H)jHt2i<(M)#rEnHL-#kbR90wpD-{r!EQ z-OTs0t`ZJQ2zv+>Gg1>q=~I?_Gd2kA(fF4)tnSg|Lt*yQfq`yrly`jZ;=z_W3m)La zNTDKNJZP<={m;PVBpg5)A7{Xvo(3n=aB?8jDx-iBiVvSS# z?s82{&1@yMKXM?TE&_oyvScbU#zfonPg{i|3tNXLXZ5S7bxC`aM3<^0ME6&Hd%CP_ zqBg-$JJ^XP8wl%5hJKuq+i@8-N9{7c)k|2PtR}{J(Q5=$Cj^z!xZzalS0P$Y? z@7?KRm+fMp_~JS@wOa^8x;u_0lZ2rE?jf9?<3E_V{%*Z54B5|*-wSVA zVt>n5I@DBsyk(p8=Ks_L8yg$*q5}~kKIpYTwp|&shqDvWrF$*hVNt{I%;7Bq!nZ!( zwNYPJ!Ipcb^_5r&a6lv{C4Y>cGk$}x1KnP1fyXM)t$hPzMDm|FAVVk19SnqZK>a55 zP~S*_>j1Ei77(G!G$dv)DZaYqX3^_3E?(Y*U}NCO5AC{HeA(@TRLo}{UlP;(rnCy+ zQ-z4^?mO3;E_`k`z-Y{$G@2hqlY&lZ!@~!(2cdx%*0yqcU6@fgT`2=ZE)@4^BA1s$ zUqNX)RoHFN?I13#9n|B#h1#1}`-hlSwLSZiCl8T*@@`rHE>kiB@V0Jl!_unA--56rgwmWr5w{tmJwRJZKf@UjjV>|JpVH z%D&<6fEl#-M0$Jw6pfR8R=WEZ_WsN!fRr7>a0gq8=g{BzaH$QRtVSm~({j=*)Z1X3 z>4a8Eohs($V9hLl4OOQP*xqU9aAdCi} z=0(4=pDeWos_T`NQZdhO+tYTvfI18e5B32Y4PvD~U>z#X2bx#ShRY8ShbEblx_{o+S zwVAG&L4eC@a6sP19-!oAKZp_;BN57SIZb|Q0NpLxvo@Shuz5T&TM+6DC#dAxmuk!H>9G2rhOuC{zDCE()eMyF^3AE<3RHvqD6_UYR z1#p3i1CZ~+OknS;Y!?_FlFh!>LoDxD0K6~Urc3Lt@s;Yf6<#*Q0Lr{_9BZ3lP9fl! zosmIV4wk-&LoLmsT@HWUaavVb*?un(g2}2=$uJ4Bf2+HjOA1kMZ2DJJW-eei3HU?l zUV*{n(UDC|`n2#v<)NM1nln|5xp)L?(fpzP5}8?S)Bqw=#OYKI{5Sb z*GPS(DD4)zTO2=}_M%xWwVWrEz_A$=Og6haDAzNIipHeMX)}Ksi_qwCmY`CSG;Fho zU0H661N_vO;JiqXo3o)Ga+HDS&41liMBC(hsu7punWdP(mYnn{2Mz6C>#igpO)gRn zg|c(14amo2ZcP?P;87`4na}`<`8O2Ge)d05+n%})w|1K21}P^C)o^z=6f`P?n^RMJ z1*)v3)W67r836{qGbm5qNQLvIRpaB~RT#qjg*}d*lC(KT)!8rmbB58ww+FUuFY5DH z7K;a=0;OGfN~4yjdBy_)fP6qB$(l5=c?nd?+FCP-S*u(!j7qo_6q(Al067)p(hS;a zr}n|biIJVZzOx$C+LLaXB`Slq+xid%we>GP(B5ywB88lFQE(k?3`N}6Dd^VN(k)>N z$Td&M=+9@#6wcRaQ20pzBf6 z34yfMp!a(-704q|q}pr?WEY!x$`BG#Z&ScG)*f_lwqT9l`bNYQPeCc`1OT?J#n6bi zP5s)4F>@Zrore3~yJGjXRhAPmWN_nv?6q7CdeJ5rSaApXpCbAY0X5m;W}1mKD%~J6 zKVWaciHFawb#jGj4`6>mpSQc3Jt}3+{0tGP02C=mY~qyFCI&m2BfM8UDG!pwgmt2> zJE@n}P(%5>h%LLK$VT}j84HwBc(qFOP%tns(9j~l%$M-+-q0EN-@{IZKH}> zc^8^LkR&>MIOj7??}|&EriTrnD@eP?RBqzFI4lVjBAZ7>WWWo>1lAkxx$lEP=U| zXmeo*ba^}i^_rk2U0|~lS)GrCfsQjz-C{BG62qhI6!p3w@oF>5jdD7ksFD&woQ(LsXxpPQ!&YFy3&4zwvQ zJv<5(T+zGJExOud@qo3xW->~4UoiJT#MRmf5K9~|rJ}envg=YKyl+-?F};$QpZA!l zXj)LyD}VbTTR8j&Oq0pd2p$lpPQ?-XM(_3||55WdvnqfD62?YIRBDX6-dO7!qE*hn z8^y+Yio8Evb_u{)d5X^hIS0StHTuYQa}X*`8b*TQ3w{97|5{BseX;Z1=;$}@CHLfQ zK>SQ#*5c*mU97etDZy97EyBgc0&{lI(E~pp9UZljFVGnKDJB0PcbASPPjyI2ksM_- z(+}XWC+9uc6ndqD#{ni!RNb~BDUCbW3#bJkU^(n2v!WTrt^G8DN^wu1PE_b;QiyJk z<*~wv2)mX^nM1>g0P@*r3KaQ&Aqu*1u2Ht!mn0j6*dD@7Wf@E&ST2(_LPQIDUc+KK&7P1_q@ItSOh^c~6o4($B{ofkPD)5d zI$7Rvaq$yi5Fntw(i|#WY4O^io^34&r=3`IjL%jN@AKu3Bml~{tpHNLdmzB@1DabW z2B9lPDau9&UWd5-78J$0g!@n(w(eDVX(ZcO<)rf&KpXVW;^o(V`V}<15MfgP5mQ{u zs*Fke{u@Q{xlK2jIg_Ep>}QpDXCr>{80_f`39i>S06@0v=SN0ti6!j#s|O>R0@9zv zh800=1wD}cxo4C+R}&qoru_L6FQoKslYaw~UM(~v1Zlt4Ujr2t)xXNo%`GIz(ZKls^I*=O4#7S-~6@D=3_Fz7N%^H$B>WrFJmGqTEd3mq&cfF#3#E zV5=O$OrJjpWy(7?$3hH8I?b!taX>{7`DQICeVU33(pqhB+3};;;J%Pyjer^VmO+LS z%9iGCK+FYk_gqJW`+13iRR;_`DlFRZ6WJV+EB)8=*nUHljcoI-?e*%fA?ya-Ly!9L zX6ct%URnEFbJJVnxDE^tV}~#b9zR;g<**uOKRlda)1l2V=~@r%7drU03^f=*7FcF( z)vftPV0qp%)$HMfLz$_vH}>ed12;vJn(IgESR%msY?arThHd34wJ>QE1m+S&awl(@ zUhx_)$uOF%O8PO%@3Ft>YPm1ytfi{3e?>-(D)y$$K;K4a=*wNnpljIo*iIW=vAt50yF7DH(f7XIlU7Q>p z{XdsiS9khoh~XwckcGW3pplUn{m#IgJFfKx#r$UD3yVjH2fa)KE?#4a^Um8G9vle^ zs4BtAJ(y7xu>zQq3Q3qp*y>rRey}SrWdgNlKUBZLJmRJ3(?o#I>(s8b|MtD(vH-B& zP_x25PJQLIkv(2_QBv$J$DyPOFtgNAd75q(O~RtS2D!O>H^J!N^b@bzzP$wB9J;qC z(kt-=wz6O@9|i-m`SQ!6Ih>Ez;`Ouz?{5P^)@KS7tsM0Yc0?s`07L)YXruy+)8Y4? zwE2lnxcwCGEr0N^VFnCuJw#!=GzRg)ZjZeGqpNZRC`ROWlShSOeN<=xWYjQeVkI78 zYwkIVMl)jl98UM*iGU|vZ_FxyL$S&XgIygQ%t&mH zy1=tTK~|;N;I@CaTeH+zz+*L8BzAw}MpPi9K3;vlCWR8ai}-5?`w zN)o<7PHt|{H(>N0jU>U0qc1#4WC{ohaU>=CrevDE1gv^lZ--fcv&=W{r$vC}3C2|E zI;+0C5LouT*N2q<-Wbi%&@3_^*q3aAYi>sJJh$!Z>_!V2!XlZ(zz{~C48zlnq2=P5 zm_iW`&;X=bBf;Kw#J&L~Gbl)l7<#`zeP7t{uf0+7aB=VMH=PyG2he~~ZZ8K12cRu# z7Am#zeP9hPE^Fk>!oqs%NN?kNnOC*QN@um4Qb0he4XPQ0`1Sjc0%b#gPwC)BkK?mH zBNBf~ZfM@hgDJm$Iz1Zk;FXaLumtoWz#2l{pOLR`B&(8wk$z? zN>rP5pc#)UMq!bcX8C7eH*U07meE5BnJq|Dd%C{G!|Amvx+W*072sf?_CP5gpzZC| z)~_cG$wV8~4$V9*l)%g`X3#6CMZJ?s+hK0~4FGU`5Zaw4+l2!DCvq5e@3LWrW&0O< z^A4YL>EOuSfQ=5Pk$$D$WEo)PCtxmDWp&ii+yp_S3u#%*S$-z+|QY z8^WXNcSC8JQW42tzL1J|a{rZ21&~j8#MSRFG80MmZWTA#PXNGCv^)UAm|}0Ceht8# zcLC25wDsccVl!cafOsapz(zHXL*mk299;yv+HXM%LL*`T{Ca28U=~2xjp+`>5phR8 z76kbPIc81f95--AOJx3=y5m4YQu6FX16f2L>z1?CQ(Q1 z`#zJgTR=!#Wwxm+Ut;<`S!CDMz=2h}JkYD?`}gPHUR?6Y7zii!(yDL9H7dji^%sS$ zBcjnC=vhsu#9A3wfc(_R)RfzG2cn1U{+u636AKG#y(F2(imo}_(LZUn$|?!UY;|C$ z@u9DQHLhWvCU%htlpp_qV)*oAmXsp~uNw&%C#8|E_BP|LIr^5%YBJPuO&+dU4gk?E z*HU0#xk6wK^R>%Ay>+9>i`}*2iePY>n#{wCTE#k#?*S*N&ij(xm>g&we&pd+f>xSv z-LI#-Hpw4W+7kh{q?`j{FWj$YVF7T&289|w=uhO$-G!(z5YfKA2lI6TAIO9osAqpJ z4#gbmAxpS}9-!fKzN-r-6j9Mj*DeS~)TvkkC4V=#Q|r5AGn6L9KP~7|P(IdO1eqzP zg;Iks0nFj)G+$of@`FJqe;8$|`X2QlHmalvV{d3)EFOT7cwoNXN~6s@|Mr#3_4nsU zdiXo>GO|w=^<`EQD~iWct7!9C6_(ThbUABhp~*|@Gso6Q7Ls!Ef1w@hW9_2g$7s=O4YOTPcd!?eMN&rg>F((0n4PUxp_m}$ zCN6MT?JQDd2d#<6ezLE!9xixZc{%K1p2S4UJwkrHh@>n%v6Pn>Xw8Dk*8^u?$pvIj z512}7FiGi`wISNYO*-^d%gs@oedlpD06B|z(0SE#s6!2#0R>q;i=(JmYppLyCgV&R z%Ephqjy99z08qv|aDJeUCg(;;g#n<2X{Zl_{HzzB=Wb0XL1aKCAZopiOjk>>%>4|M zAJ@i8n8r(wFHEuJT_^}JNtdmuN~L8pkn#-S>{@| z5qb-)evq?0vC+urflXr!D6*^XHoZQUAgLz5;hg_Hce8Fw45;LwtUdhkalx}yPFW$h zJz<7F?O@_aSZFBr#z$rcF~YVgJ-3X1l+6-@@Z{|537GnNnQvmkB+1JRSY;s0LD|aK zJ9ud?ejs5lWi4H(o(}?F@qmd82_$uBcR}t$bkApI7J#szZC6|%gr3}VP#&i#CvI#~ z8g71=#;Y_TQeo2N{r)$L1ep8*2xZy)jrtTg9_4_US}ZF(_Qf^Kd#j_FqLPEGa~6wt zvVC@T7ASRJ-!`bf3Qo9pCltl^F^!k!SYB14j{>73S;7sbZqzvlIFh50vQE%Cr!(vM z&l{O5jT%C~Z;&VLMylWXl7^5LyoK=A?oLG52YF`W8@Jvb>@m+z2cdqr#bCw&5Dn=2 zF*;l5G)on-T*pH^A+J3TkWe24-{!EX@gIJO{!-K9vOC|hZ*FZp4zQwl^q613x5sj; z2(~C{W#5$sM>+it-9qca52@KEGctM?`3c?O(&w)3erJYyhM(((K)Inn|3&oI49oOS z$rL)bbtp!FUom_3&qUJvDGGojSu02VaK7LcHm6j~*wX60HXMeuQB-+lQ+2y?+U2vf zS2eIzKX53M$JTU!s)##ONaWd%uLD2$*_dpB1T%@$eDb&PkV64+qcp`g5g*Kj$(@5m zquZLc_lI(L_P4&e*?CcQFE$+Y=NQ6u_hurtqv+v9ub2i(!}1irwqi`yIu!KWC%(`R zM{HYMylW4`^YQV?$jAT{*m$$}4h+J;tEs`4JTY%hD+J{F!*bMH40W2l9nbfQL9jPm z>o5R{7jC;cF;xo*YPUY1ov_hzp9Y4bT2WCoY85As0=PXWT0|00T!3(PuKJel8dZ&X zzGl8RnRdHm)#Dn58ar4``i~UAbWQ1bYfHIPf}m{HCe4G*gx^>%&7KWb5mSjAocxOE z+c_4iy6(C;$E*_AavtBQEd)^+eY1P=`-_9+#*d2WqGXg#>-{5Z8`!vvBE46LX!RVv zNQI1W^h1f7itwMw-(Cp{{I(2h=&Sag3h+8B>y!|Dq%gJk;a}SI<2AKIMLzAC)>FHu zLdV1N8b8fpIvZ;#3w(RWHO^NX(;n|z&^F5YF4-vBQB<+K#OAy!bvx2r3;eWGy|0wI zXKNE*M?z{?XE93?gO571Y4Rp zv4Gkso|2qEk{P;onPfSJ5{Xs`* z>AW=jlw*Oxi(bI<_fkFPfXL_Ue_Xn#K9kOU(IGUGe_b+-(ymmf+R~vQYYm+&eskMw zNz83CyMbkm*2Z8N~Xq!aLboX3YJ>4LQL`)`%15-Nyv}IRIA@0FYr>;;NYMNn5e7R z3IUUGfx$X5hD!ihm*?pg@mk`^{n;RbV8Pb>Dq?|Q=|z39&8d#|3$5*=CQaB!+*jBU zRhB^{;o*o3gn}Hu2yp5xavsNen9}vLXB&l5Qm&iywjN&&oomJQh z&BDZGXQ11dzwZxT?fHsl4i{%ie!p}@h~_}LM_0SweBD0u#aLb<7A|5{Wh|l(7G_Y2xRp6IaP#Rca$;{u z{KQXNHdQ|i2l1Or)KUxh2VIv4Mjx?l%{uy%70vYZXs2Rm#UNKXHQCb%FSY_d#*i`E zf2n?CjiFg#oJhf#x6otKe_@+R@XS57k1)WG|A1}E%U5sfEBBlELJ{%+nU2zD!j76= zYd8&R(S))e?W;vQG}$WDHVPimWs?aqz~aH9n)KoN41-MYBv0%%UmAL_k?OXXzYs3M1;Sq1H$Rp57M#UzdiK_2 zmgWP0b0g3|j&Qmx6@*_GE@QDx>D@U=RY>wT^E5k*57m51*=tx`Tz`i4G>CL@)axyo zP?PNi#NtT6d$jZ&YN&ux1TRwCFYDe9C0uvyq0jBn)580&t= zDljoMi{fiHdkbXmmiN67x>~2BnPOyt#o|Tf2;-4oHX2CLj{XHRBVu6)tlCV!-2u=CRH8Wzpd99X(R~KW5ANB8y*X6T5m+{;9rb40}C?&X$ieOs?G)p9hc-r3{ZR?I+` zm|YW6BLd)>`sGs#QA04vh&hY{UHL`mlm$0wI3~l>x$7QZwu#JKmIzv{IVZ(HsSO#V_AI+y{pNAAMPd3X}ks39=JAByqx4xzdE)PW3MLFI9VZe1KAqzlXT zfcZdA_fG~i& z@yu|%eL75nxtp+agh?D%I_UPXSI_~|AO37o%QeTk_I3hkWQf;fnp=+a-%CR5@Phiv zr-MMtVuBGvSzs+5v}YKzN;wUgqjTE!!{&ttwO=;buD?5}G7KBIy;zOLdd3Mq2Qq$Z zU)Y z0>{S`7Q?$ z#qWOUcN!9L8&l!~mI$AuDLY&81ASEU^xva=0f95?z#iz34LiimqU%(ynT!10#jm3x z`$6Okeg|usIZ(?;{il0?A7#zB{P!g7d?$^_?&RurC6$8|2utGV=;*%Bd4o>6n!`~K zJ?P$f_QcX|aX_BgPMl*&5S#zTBziE2f2?4m)_VZIo$j{iVO){+;cQ0i?l8LS6qx!w zP|H|RxdB;s*wW>oTRYl|rW3UR7xWL6btpYd43H3z7WltE(ridBv`GDnJz`h25wX+&Z?#199{cT3Xtg zMbB;OXyME{JzpC*GfoM;0LDFv;3Zya=Hh=XH1?F2uM$P~%pdIq0~6ELY!)6mG54Pk zu^URo!p6qNC0;&CZ3F}bq$=y>TGXB;X<1#82T9d2YgnFeGP{(}QENuUr=%GUS3y{0 zT8OotS#;b>HGNE+*>!cmFgFj;{i{X+hCMP1^I%!6aVny979&)UB=g&vf4w{+MqKhi zD=j&V*JSI|BEKQon!DCcY@7Q?-y>@#+S!ViqoNX0 z28I6B9sTz2%(kAm$ncGC_g|NEYLv9M$9&>kw&z!66eh=#wsOdL`R|oP8}`gJ{Uho? zd@9ec34&T);zb2{PCO-!v~^=u~As>8*TDCe9!TQK`Fz?CM>r*C4b03Jpg%KmzI<+Z?e^$H5F zUHiYk{Dx|sw;h41UTc*}%h*^}+68;;=?A_^+lGA)XQx#JJ~|S)G%1rq^^8oAUGoylk0F_h7xUX!IaQh=|$o z^OusP%zU_hJVY}!)GV4PZZ8ayt?50m8#GIyG?Pe$y;x%35vBAz;>(xz!Km6evn4C^nzk~k>neD<1A99yCcT`%n)6DU;cuMS=`J*ShuL_5Gb5bYX zDRHwfX%!|IYh6Ti80Qxj9(y)rs4@^oI$njxJP!Pi(uiS41L5_MlNSABC%(6K0|Rj%*#?!j-H@8Y(k z-LX`HtJ2Sq(IcgyA^ERkq8Aht%p9?>vSR)O|5i;)>mAP*#pv5X`wfZQunHxUJ@GFJ zy@*W1h?VWo+D1o>pw2=j4Lq$2JcKFZG6vTmatDW)80(M!*=o9~awl%o+M)Y5<-7rN zu9N}9fDBFt1!p66xZ>3lA$f)P;EeHPMLKoe=?r77KR854C_RY(b@b@VkP!=RQcR?P zSLs7j!^5h&x@ZIC5EkhyoGQg#?k7!kwm^ud07>Ydk?}CbM~|Fic*Fii(UQ z`Prpm;YUS=Dsm2C(@O&jtw2+h*vdGtDHyC@Ez5!smCzI+dF|9w|3%W+W?&aTDP}j} zw_NjIKWnluEKp_xG+#ZY^#1{c8OGp&XX#@>u!^H*|Ho|ddX|XbX>T}Xucnoi)pP8F zOYeiHHFFp<{$t}`&bl*`Eel!`|y4VtNbBeoO=|e>YnPC$`v`X(9ov_3?7*6$5AC=A=OZrxgjj z#C1KKG^_521-|kaul+BeTJi*xb!|R5mElO0DG~cX2V(EJhrD}Z-9;7MV6%lE$S4D2 z7OCZMawKgTV+lYlY57QJ>896Uc!)xfuqMY?eKw(XhlxA=lm@iPl=4P{YfEut z%KS@+zOoP&Z>iX^j=Ik3z;XKQg@vwYa%$O6Rag+xd=z&l}gm1(RgbhOPX(Z#hb+czx04A}`I-iv+z`}u@j zEY^r2eJo;vxwlEbA(UyKq>w4!9|s*-lj7(bT=MBVqgfVRt}rGfB#1-%&7Ev)in~@( zg2Z=scV~zGU;^K$xArSdWjC)guhgKyM>^J!a&fI`0fmwVLy(5?2V+Jt^QsIKxs7@# z6c74cMze5Y)A`D~*`9xXWF+JE%O0>OJw~oCDnfCwJ@3xt{DY<``_iqJB#t~SqmodA58RC;S?*4a$kJHy`o5Ge&+&cBM)Vep!~ zQT19`9GTHskoLWs+Q9szi^X=L!`Nz9i9|_>=N|3CDJ-7eu;)ScsnsvL@6x9zM|Sce z7f7bR=&|4)MzM7L&<@0o{jQLhl^jo z)Q~*LBc<=lX3a$eeC*t|f31)YcB#pz#^`&z@MVEft)fIbUCpVkmU6LS( zS#_OEH-zJA*4$X>c$%D+TWVYe>BWPZ0zIh1JZfxeBCER!c90m@Jd8laDOF+_YjAr4 zbdKG5g}TNJ1aIWkg%nDKMUdiYf;;dipaM3&wPV0lXweY^VAy4R(6aZvqzbPc8XXD$I<&G;eNuFII4BkAa4y$} zzmmaf7dHZCr;lWy>iniN7V-kW%;WcXO}cjZ{=(Jo-d02Qr$NtvPjh|Y)$DM>oujUq z&NBl2p;u?FYNPccsc-*0uZ5rC!3JQ32DJiOA8L@dXnMu0rqi)^Urb@bEG6dPR`AlV z`YTtvO_2dELUtgkR~_3m152E?SKt;_8%_PNGC75ob-qVqx<5KC{|X!$iF@fZpYQz@em(_(6t-@@e!VoFAuA5yS+dZu{l#`}-B^u`dnr>`Cz)4=Y0G z{k}XHf*#SwtfhgRuV!8xsPk2k&O%jRKXq>R?D`h8^t%kT9QB}>Vm^6G@K#A@Qh_o3 z8T^FdaPm)3;d=uI%md6bET1<`AXx@ttNjY~44t)Lf7)-(1&`d7WB>fG4{8Nv2VxP# zhS*hqmx~hYTRI3Ze^h~{_{$ImR0a$NYz9041srBk$N0^wh$aPJZpKagTD1U}z2~nU zOFon2kd&*`DdxupiwU~@RjbZ|*6Ih8Lq?{HV>*Gwjd6X<&YxhoITSngy(*?EzAAA{ z8v~wC3q^8JfnR&@`;5?+)jO_2sPY(;f%r5G9~lA|f*Har1iuimMQ%4X06d;xp=LS*1%{bQSF)*Bht;T$Rl!>1C zG?V7aTa+|(#UB5`OGTNi$S>nbd9`D#C}}OG$-yksF7ZVx9Zo9u{7=KqTtK}1O4009 zg(@5Vm^hA~H3HmY{CGle8)a1=y+(YEKJhll(qrC|KqmGs$0GXOsA6r5Lu-*D>SPKQ zOGn7v>2=(=Kds!pm4OWMCJ}dYkpHMOG9>~E>hoSh#2opcY@azGD7x? zAt6}B0uIhv8=47*O^kgZl@DG=9JvSStY9O7bSdo-Q9<&hEFHpj7OO66*qq0Qv%%cG zI0(gGrvog^wd|;}l)Ip)w^FF;+LM-^Y(p0xAE>$P%~uQHblixFKC-;Ce-Q;2D1xGp9EEO|)y1Ltk?&2A$US17n3v$`mEYRBwvkSQG@2|^t zUF4#w0_aU}9yZ)1@LXS) ze;50qyt6l}Z%j+|#i-?=*!%Y65f8f;=<_*^ES0P*`84!`vVh!&*gr?0O(b>BHiwV} z>hx90Tj|f`5f{1!?}#7y+OueQoZt5C+b12(^Xq|IZ5 zsJ)wF&RVGnufcqAXBbB*2d$V20)TZ)zI1ef?N*U;}z!}94;a_D|VIRhoZq*feh-B*kMWqbmW+>SfeT&+VfptPrWO~;x$TNB&F9OC0wTQlDHO=; z8jlSeuWb9H#ODcJdpD~xz~9UHUditj8-_i2i=)9gA!722RGuVC}m~1aFV8hwaUsef#J!)_iOnqC*_Y}RlstV@&us<(m zNO^CWp_5VyG2hMklSE1_=3P8E2;U9j)I^P!!v6cTvX8*Wf`yv=Ts@szw|mC-;W$)n z4r(>Ns3u}v@_gwRCDQrBPt7z5mQ6YtZ{TM{Ga zw0upR`NoX@wa`KSO{QboH|S0jZweD&U?v-jYeQ2;25jS)(RHG*;}xt7IkCvGXmV1s zWoh5FVS8)KI@hxA{$^3{EcEiKVSv^wm&5H}M``+6@tZ!+Ev!IFVe-Z!0fGUqp`ihC z8%wi_nO|Hlk_vNjXz@|Od*?QpFTWrth_3uA9fEsYI)%0%Q9+6+qojnP^PV?Fi4IQ( zouY{9udyS3POpj|it5~9Sv9-s%8#yyDEg$(Z|ZJ@HEG~o^M8+dqlgs)^?s^Z~Yi2(nN zT)POaNPoP~1OCV8EUE2mV*l3N#?0IqPuk4R%+bi%%=EFb`{Osx&Tj?T+27h2**Uw| z+OV0}+ur67c!-C0QOZ(X+xcJD@h*U2-X+CoY}$`<+&ZxfJewX+;$ZzkWnC(%HW;I* z!T4rS`^YRIoPww@VI+RN@JH6!Q8&@8r`JnJzQPY`oC7x_}9s@Ucw=CvSw^lRo&46_Zx(p zLWVTys=q{O%X8{TaVF#O-BLmw$)x;sKQOqZ&SdfD>pPoV*;;4w>|d{hrV-K)t)D$* zP**8gAC_aee*5yT$nRTwu6?VesZzlq8}dkR=MSib`xT2!hR~w|zA~qVk;qyulVPIc z>Bdm^9p}!hpOnM&e_jyBo4JV;nl05-C|snQuP^-lqW02dx3jQ2n9=m+q)3YjXW`$k zh4ajF^8^yQZcP0q&ohYpr1?aKy*45G(utQUNi+OXD1J)&Xua--;mn6Db-5BlIUR@% zRIPCM3(kmfuZkpV`ws=9YY%>B6#aZEBwefIJ`t~VsNZ|@NFrstMQ`+I8jmD%{MF5M z^Nc}DKCvO`F>$e|UV%>-$cUw1M#^`-!wYuRzgLFcE^#pR-)?;QAg9H|JaF>0ciq(A z@%Y5o*Cth?PjXN$cy%3qy|VOASy#nw5;PzKrXmHcJ|}Q}2%xTRWb84P3zkt>!Xuvc zx#vZ;YiBp|9s!Y>jJTy-oJ?a`dvp3Q@&w;?EK{S@C-@E?-g~@PFJGv?GguoZ@ao#7 zYTJSZ9kG7aWAa0@GwSP!i*M-b(ago_sr^!AVyucdl4bDW785e`@$p$4X<1lHf(>tP`3zu=PP#Xbed?XcV4JATfPgpn_N>t{Qp|Am_mHDLG^$;LwjA8eI6Y=_K1od_iL<)@#!B}5Vd~G} z#*uVpI`&KZe?oE~^o&~<}tc;PE6<_(EKxtuBDl(Saa{t=oB zHxKrYG5W-#5Xjlm`%+@e_58nI>Ikpp4K0T$oe-2)Rj@ExujzK}zy7b;RUbxH(Rz8KK8&K+%Yx6=nzv?`mzT-N$XXSt#n9uBhsa_l z$gZN55U=wCmPE7aynl;`(e8l3)L`FMU&Ev@e_Jj9LnR|8$1GzTQQtk&Tb1{F9#&v* zdv1_r3r1FklKzjR5}n%kq)V&cHMXosORt?BrFiVGJQ>H8R zpBIuloy6Kik0P^Khj!kXP1bp5Wn~RxL?dckv3ncP6&GhJ6(Ff^bWQx%JGaD(qwbfR z^=fPAzEnD-5fBidqnjsJtbnUo7`1n*l8)a*TeXsr{Cg|y0%RHG`IY4su2ITW8a7KS zzkWS|A(JLYX_TNX8;}p#kEY50>uI?^n3tc`JL;NWzJa}PaBz6_>J=j+BM@8bpXn9H zO_uJ5g5;`2d1GzZf`dvG*nSWh9j}dU2Kphu6yPTULiUHZO-xLpA|ugY4mM~@%A{YmM#`~M-uk1v|JI$k@J?=B z2`14yZ>*~Jm*Z$@Xu#4i>!`T4AcuuNkX(BqouO*X?}@U#e{1`#NNe8Rhw8I;?(Ugq`+=tKC=j`k={ zdS*d_m>c&y+WWr49)mR{@&2CI#ZO3J^TG^*BE+xE{PPvp-k=36Q3->nsy z*B=+d3xCNk_h(3qSCw|evFjEXJgQ`exkGuih90j*l(rA&X!Th3FI=eXN7)yM*l35H z9MRs)iM)J8VRIm>C9ixaS2ay_wv}+g+ik8dmEtC%#C}qJ$bCuK)Mo7?(W3-}e^-ha z4~tE@{0dXl`aj7hx>0z2VeKWpDbl7doQ9d@0yrF3`*?mM11o(WpP|Li>5;Xlkd) zrbz_Ql(x*wk|MH&MMO|#T?V>|yu@(hz(BduD>E|}=QIa%wBm*K^p%*A>ZM(LlX|la z9}p?hu`&1g-u=DHrLVa^pcY2-aAdsr^_>zS{wQZsMN*K znVoQ@xvsCQyjdF~%dMxz?MXNy@6as8qR&eC`SbU#blvA$zumvc3Ykr(q_x=$J{Q!( z35uUg{@EJLyPK1elUyf5 z?^)FDINf1jHmqVbAEl<2S{j%ty%!r;P{Z{+5#7oC$gG1QrN*XO=RR023&i;3aC4`h zl1&ZRx{6vi;m-Ml}{13MVWemL5r!#tVCj_V30-1dbXjeUpH3Q z9MH|eB23k=cZCJ@_4Tf=f}*4EncQ`t6C?l&Yu=5twzy4IKZ4Qpzl`t8B!|@)F%=gQ z6_v?VhPul{9aL$AJb!2P6 zbW5w0Yy-!Xp@Khv+=`5v^bQ1{?bM@pL-;0MSC2FY_O$0Rq}Ze?{J=RqJwDtPWgOah zoJqV7ox_(4>I9V&Bbz)W&?Asc8)Wg+M)hj@MPku+alBhr(3S{V(n$*Rup#rH?Yy0%WSH=eROp&VxSNGn_4blF#c=pv~!dxG|0> zVe}h>$hfXu#^?UN`xZ_)epS5m-qydl zoAIi^&Ov&ggZY=Gjr|!WrGWy@B-vAcx8nb|H9RnDc)!*9#fmD*)cqU1Db-A@)lwU?VAVo$f)>~|9*BrK>=k709l6YdrjHh(}6u!+Mu2ASLb zIKyL@cS(vQ9z|ex2m^f3~RH=46SDHWJs>5-`mWhHH%D~tA?O=AyfH9q1?9yoIU_t#=a*`awGjn7xHjwqR z4$aI0!DZJ*osF*ZU@cVj^SRP~)d!(gR?*;x?U`du1C7J z2i~PHvvrlb+_cMr4MVZQE>^JhNF6Tjas*do6oZM);sRY;=*bg4B{`JoKLCOPr%<2y zw#6>$;1rx$|t@68Z#ix=4Gz0Xy9hUI(}Uqo@HbIl<(Nu-)bz}*kyfP*%S3+MN- zuK(B?Sf2@v+KYU_hherXl~id!^@Rhb=)KOnDK)Qqa%2u&nZ*d&9BwE;o*Z3G&ak zhFwGWM~3v?0*e>_eI=l~(TvM}!jnE~If#9t5SlhW_1mSrof$|H)m`PYwG~f8!D~IV zS_aFv_VS*LJ33i|X_YeGXO6`lB#JJOVlFkzV6>FE+110K*ao>M7u#6~-T3oL4)sKA zjX}|-1R68BhAKDToX{xyCjntZ_d+V<(SIN%)_dVBQ3>R>LaT=$Q0Q&e9Bse_U927o zVWQS^Yo1UWy{dFH8_O-*->7z*J2)HEvPX7z*w1B1`MBC-oTFLQIfsMpnes^z#A{JT z%gXiKocV#QuI)u7{aTOEbruUn1HquJ*%a@cKK%YayhyMoa1O&f=+u?<^-_mfVHCtY zEO?z+{b|OTWJE;Kc+cji@bDfRQrE!G0X>ma7&C-uIoN{mkL@L4pp zCDEQJ=EG_N&%x8juIo1<65%P!Ww0ax_hpu^Pn=2S4(E>#QZ_4QhcZ%pI$bsEBI7Gh zx`kFTOMRM&jsWMPk1bIcYLwqUFkUf|W{Ji0RUWc|{1e<~a7o#O-bZ%%t?uSgN}{ud6^R;_KM?9iT=@68}ra(0q3Wxq2Fv4 zGgXwNCB0MPy2Um3ff|Wy%S*e{!)Mbdp-EBSD%2?-Bd=Bl3g;d+(FHh6H-^oT7Trl40P3Mf+AoTo)hLVcJ$+NPwg8;%oC6tOzHfoSx}mqr>->ys?ZjVl z)#^q{+NG0|(9fboA{ip(k#!=^iTs4SCVYK^G2e6GxAa59guipiriglvWvM0ZI++={ z*UaG;dhV66*SsE!nDo(Q5fehIJq~LG`ZZ|CISnjw(t9t|#(!<<%WV-`B~3w3*VQ%T zU9&E<{Py12UwFh*lc)a?xJwbEC?D#A0U?wuSL+BX~!I|z4P!m-IC61Ied!fsmMJ5SUP9&Qn60ZZXlB( zyUsI(7LAS#z;dbAG73aX{r)^`Jmt}yV_Fo ziydaf631gP_E4Cvr~U8GD}DU`(epSkSfz7N{x%l@UgM4NS2g=TcGoTw}sq%wCgJ7V-ro? zK`cKxm@5t|&SuhJYBwmiaZh34b+r+*wKMoBNPsMqrmQqXar`J?9WA%l!6t15!F$;n zIV?f#-=q_dnuw9ryZ|4$Umhekr8QFg427oBFP^e#U zM*@%a6SO^hcn10}$33T(9Ac9^^wo9)eQ%9Q&h<=IWasZAwAt?d=R!z6u znLsMFj)XCEP}k0e>Y7o_Yi3^yuMTfh7uhnED@g>wSpzcwQa;xgtx4z>3F2|qyMubj z*T~zD#N)B{Pd=NqZZ-Qe+@rR@yM%YuEvILrW!jgjtOjKdH6^9?i$&14;G&wD;k9&! zK`-I&4Sn*>ehOR8FE~EcDS5*(+3{XeSE_ZS_&1ka=(Nb*0N=c;f9S(!?hB@-dX&fb zm%UiZJy!D;=c&VKAB%NYyRkkUa()nw>9dUfgysxj6A&gi^j zW0iXRSoRdNqEmkOOQev19sO!pCvb(VLyFV^lRDJNOMNE0G}ac4(#iFp!1|~;0>(_?8o?(hG;3$DS-mlya@H@9eyhk1bn^7fhk4Q zF3v~uSw)|4v~S*W_qRsC$>*k6wEun(zUn-Hn1#OS>$A2JEkrJq-+voD5UNDO8+{d)7KskPbgoRSw$@!;vB{V*}{L9y-Z z%nu(h_HajS)62}MM7zXgOr!iSTu8XSMf{FrQX803ka{!P=qf}|85rC!SYg-lm0f=5 zcZ};@vT6859ii>x?Qt`kg3~U6Fcqj@?n})y$~MWM^!8|rP zRUkJmt;~jn^OV>gg^%75xX6{}d&V}(RZPGYJ9Mf6AyJ$C^AK1kto?U1!>2>n*5Ivl z=C%=kc!gqYT)^|{KuNdb0K!#jzTxiq2N}45b|Z zp4S`>JlUA9uf)l{-I6$3Y(zZFaqP&RyZ-%zJ|ZN-0v-D3#pp#xH?D?_ks`mtA#mX8 z7SznX`_rCh$J}~}l%%BJPlh6QANW{jb&DrApucAlZ8dx-EjC1tSXwUucVH7HKb*cq zY?G%mIOi69tOeb6TvGmJ^C{t{;sXJ9E~z>U8a<#`%Hd3cPBp43PVXx)^ocgzI6HN7 z58H7fg!*}$%75d~PDD?5rkZxF78oYeC{=Qq$+i<69@eqfug(pxJ#rgkLL8s$&C~ef zK>B&CkQiuC5<>pwo%9iE|BGKD3N%LoxJV|%8&?1EZt)YLno}q_mrTB1<0I1|06YT>X41zc1=72#?P3mYN;NVuz1SO(_kQW5JsJ(eA2E^{;tVi>-!BXMGb_ z9$%v9kNLz_4Q8(Jd~^B)t`Lm1nT+bngc_)%IuNonJm6o zxd7$>%53{d#dNtdBKt4F_GT5HfL`6ru!K8kW{ixm*%#IM{dS&TCeDU&)L2XLjyRi1 zzy7kqGBe9wE<;E@HnY5(#dPz&i+>RL0pg2JXr50FNO|c|Ss{Za#tVo>fH1zCUZ!Go z3^&VPM;X}A^6@R-AaxIIzYzDL+J}SXlW9~wOj$|h1h$HG=+WQ5GfxQroZsIHp_28R^|ukCGXJUNAnO0Kxc4^6ic2hbeB+i&A(ytbc z)*t7ngrrR3ANrM!7<^LmpHFAbxlj%Dt6K6W0W>PT0-GyIHgOez0iy;vYBQzff9B}Q zhNq&ZbL6qi@QE?H!4|bp50G$i&CPeFdcV3y5ixX=`I%GsD^w)!jJ3Mz6ISCU0Qq|#O2QCj$uCTAs0 zPix}YpB`dL=6=z4yX(oi2rX0b*2ILt9ru+{k$YTLF)5nJ7rU7vJH6vphpiz<{2I?a z1Zic-h%?E`x)!>*msj5Qpp7c5w3aq#H~JyUCA)hjO37eIN!_9pepgo)HYS^X^U-0n zPZ7voEX^Q9P`^`E=%F3}rkIIaCygt@kJop8YUG%Ey1RF<#{{W&$ zt7%o){7NnL;T5S6kI`t8BY9l*59j%HO)#jrIgM3!g27ir?D%gjSBbJcQO^%pp*H>< zuC<8YW$l6uu`2Pr2s;bvri|*%e1_R)WIAwt_`8N^UBKR`mDyO5olzKjhRCxH_d?bt zsi-f3_?vqf$$=yVW)xn{t$)CtbEp^AEq>L9e)Vx%;jq6iv>Tgdno_L}WU2fR7a((M z4~=6tnNzh-H-(gI zXyK{wG#_k>)$a~%qjRfwhY|oqsBE&JCqy7Xo}P1dsel@Qrbb2#==lCE!cl!*rRVY&d@&v{Pk=k9E94ze?udVKQOCAKs zy{1u68|g2!MUM?l$_A}Pw5JmQb`{>=V7eJEY}WDS#JJR2YglUZV1>o;G%qHuyV1C| zxnMmKM4r zt|Uj8yojPL0P%(ue{PI$9vNP9+F&tlcznt7zoO3Fi1JT}iltBYqnIwJFIV9>~*W2It~299)-NI5z~zRGUBA zshnAVBCrUU*Z6!#$LgDdYx(Q>)pmUPOauc`b!Vp!Tr?EjdllT5SOx-F%g%Q4=<2aV za?TFESO8q+2ylq)60~hyWr?}~QVwQW#>rf}nPgX7cP3uzC+*t*Yn5f-0$)v7Q!k`u zyZh~dCMAE9_xvrSchj!unk&gl!lNj9LYV$1(KNZZfl&Dgp&&h9>-i#>GNjbX70W#j za|+4JA()3(ol5B`mg%Hjz|R zuPgXJGLi1Aw(}gUvkbgCIz(t>b{m7_X`tL`p~kZ6uyn6L+Jc()nUYeERLIKWu_d_x z!*I7arQLz%8TDiAOK*^G(}-QrEr4YP5H>4}yVp0}q+5kFxWse*p1{D$CHftF*<=;K zf=)WL<*lHA9cqF6$M!>wGYQvPfqu0|n(REG1$s4VvRhmg6ylH^c`$?kD2VXt&%Y!V zaCVeN3u{ecRt61X$Ew|84u^Un@F~5k?emDZL7(34l(U0_#p*Lt)LiqeM?FU=9ZhmsAhDzqwm!b!OZZC$t^Yk3| z+R2a(R=ZF?;SbgWaJIL*x@A(?!&eAYuU`ct-`JSnu9>seZ#rvYGhANh>~Zk^b;zEoG0_8u|cE{-H+i6sDB zGW!q-JWc}wXZ2@w>a341T_r1@^srVqkz4@WedKh!{D2|5nm@iP`kD#(yC32RFn`hXQYkq8i_Lj+Tu<+{3vkkMP>>k%agwoPpG%7Ge- zIFx|)tW;b2C8)9>Xtj$?udjbi#9B*DG-u4%OK*;VhtojWazzb5CBkq1kC0)Nn|+Rm z?h^qo@vgH|QUh>gm2m*6XE8d;mmp|D$)ZH$p`0c)hnmR`RxXkOZOKZ{yt_Gg#4`6o zg-|9#k+i_evT^_d&nv-~5%JtjVKq*)21Z5pG)&mB{#2Y|G!((DSIzW6_~A;IEJ$Hw z6s{Aeq&;GT{ORvk^Sn18{S~f^G#24nanfEH%1aw>LD^f7e&MQ{BEWcMlVwg?Lo=r?*5s)9 zZWvr|9m!0bBg`;33@W6xHNx}DKk^`x5N$S>ENtb@GkC78%k;zxVoUZ96+QEfzX}#E z_M6IM$?l+E^K{O(cPbV=kH~fi4ZbiSeTb9_d1v-~Bux$hs8{&p;b?}OPHqY#D9zGA zo=Zuus9xcE94(fvFy!WpK!c)Kj8SmA$Mx&$v=jqv?r>%0p)BwHH*f!DaQSaxFjk`_ z5y5{3EzbnJZkYH85g^iXYyeO&&}1{2ZI6F>wB*Xm$jE-Lovkf#=QKHG{jXpG_mU5N1HrB zE}%OktL}H0QyekQ$)L?O@OOl(|87V9;^WcNl8~_-3DH+8!?OT+dX3N1!TFt z4`RfLq7U&BJU6n~Q`H992tgV|F`R{X-qCajfDOIUO|r~Mkm$I3mC6Zcc8l{q5A_e$ z8Wduu^w~E!xk77$O*L8$9bz0SObzEYOxx!1U-*m-upGRI@|)LnN9VLE`$CBhwpi5C z)q_Yv%<{+dcr_^e>_#}Wd<5qXXek~m-9b9?aKu{d0*J4ZD>m-fU`7_D0fDrlJqL{ercHC9bJ_}tt}TNayAhoA!raoKYiSCVIu_J&+3PAjreskFsTHxi z8SdMjH{)Wx4(8V;Z=x?f6{5JyJ?R+JO#=vpV$Rqa7ZP+yghpXvC=N!-k{k&vaZUmviF}UiR@;c+C2Vmg(}pR z9#zYz<1mFsfmovE>x+1;QKw(E!;SJ|9ol+->>}#nY!5MC8}TVBYON34Tf0snb_$8l zAv7U+s4WB-XRdirIEcL9Wxn7_*4SQdrEOev+MgfnV)ivx^US^m5Yk@z(?Kgv_@>&$ zR)cE~6?x*icn2!MKe`qM+( zlY2qC7r%0iMtes8{;?K^u}1?$ph9cAo^%bBN!TyOX4SMqswpq8#}o$5^~J0O7H0z@ z)4<*A{mq!c7vaAXjfPFhn(`sJTKMV|jKr&eAvP6eLA(jedYQhObN4>7P|NVq({c}x z@XSxGiai^!!))lMC9_5@_qQ$M#{xPX%hyUgftglVS2(A&92Ot}<@kW}XNE^k3&?-C z%wy>Wk%FV15+6UNBaDk9?dzexp!eREdL3_Rd%v z0OI{b1;=$Ei6NZoeM zzR8z9nPxv-f5r;y&yz+A7J^E*tk2*QX{<>;v@sRk#TPZVaJWa)o=UG)vL|RenS7#_ z3gx9Cwtn8wHru+ZMQr_M$#>UU4j?;`+$e^y-V`6>A|JM}^)?D?X*4L(t1R*@(~6Ow zoorekGNR|=*4t-=B5~OLTD!?t&={0|pDdB=^hJ!Gu1$f(G$vxY=#^VbtabPM3;Gm% zcHiwUZN~tjO~2HNPJ;3I`HK#xy^!!E$2l2wP?s&0;|>4Vye>QI1ioj)a&c^ye?WQYhu9fQ$w}Ar#|nYP1bdnD`58w+;d18tL(yXsNA!(7O0g6H zm|0us_ubX{sBc{Y`f0fS9x%M)d66DhfD}*SJTGVBDwPhc=e1AV8k)%@{!@jwShH@%}(fqS{@oSZ3ECp&Ki;%Y>*k+LP%lCvi{d`0S{;QUHPgrpRvR0_= zdgoscHD56i>g+L0%7cwKO*j4~ApOIp$8WF4j%x>f%LyT6`(;=WZdG(_Tl8ck8n3eX zm0-{$c;uxLwh7*?T?ncAOiFNJQG+V8=0+J(;W2fnlE$>Wlca-&hEqX-+{aj(`Y)w2L-*_>pr5KU^ z>}f~0as3uA?y>LR1l>wutPdw4$35>Zoxhn2E!OraWxNHz+p+7kxc}DG^G7R$Z2GDB z%U~66r!yTaao64xkOa{cT@wlt3l2JOcGZj4G=;YK5w!jLf^pHY$`h#M$FWie6+ArU zOhu?5UBUeJLYL=e?Vf?hGTp)E@xk_Ro^D)nvYp;NJiG?7M~so(AA9(&;7xf5_@35; zg(-msAK5rI+u{t+9s+#-K%*Z4H#c_(A6VL3n)pNFTMo(=piFjs))5cyJICd#SBDA= zCr4EEu)NlN5)yMgAjtRqh1wYYIvAXb4IdBh#=`#AEL6yicj%6LZ;?qG_?ghPFfcH% zv$GR?Q#25?tMd~CwX98b8)rCBgN1W=V%9823V#%Zz+plg6(;MWrS0ulGqJR^93TP9 zw)`bn0h8fky9@?@eRg_MYBk7(xpklpGw*U)9ipSB?;sFk&;xSIa2Wj!l`O`N`Zf>1 zIx4TfFH9~uD1a8jhmRgTqN3`#PKq5b$>ps@(Qw5rJiH1`_L{#Ri#(sc7xg}TDJj{~ z(n3c^7vE)W1=^352fF(qcz9EhckbS;t*s4dk+=Z5qZ}t{+;watA|oS#SZlPvv~52? zXL1A2?owaVh~Pc#L|)s*#zuA9h@_;XgoKVPu!ZkSz1V?159{nt3{{#XrK~3Etk` zrE08T(W+`{A#TKAG1qXDC3JSmv$M0CAeCi0Vp&&bXJo`}eLLOQ+uNI&nfdwiWj0G- zT3^pMv6P-@$A#Uic~`>rVh^9*9~wHkmI|x|4?jBJruPvByG`N!sZVuvb)ur8hv#iy ztl*i7jdO_^dTsd?**twhD;2B^m8?5`jJ-#6e$R7nWB2c04h-Ryh57m2K`ldvWH9_& zBHXsqyP-l9%mEjzCu%AS3fPCSZRp(}us!I*B_?g5jVC*|?Cm$nxXm+xZ4rWXE566x zjN2VhQz8orxVSV@lv)rI78Z8Q$HBoNEG$eamTO8NXBoRZ5ZDe+D40R?lBwzz=z9wDo!NJL1Or(N{3=mR{XBZj#rfkzH% zYIM{Z9vvMW9DH-u8z_LD8*c3^py@R{oWpHn%xW;3%=3$I^>TV*xmD7SN&W zZh}=j8r;LVz)0ujOx=GIUAtDX-7OSi`;zjR)qsq5MV6*E+}F(Z{2Z@ezitkT=ko`K zPa}T5Bqb#!&?GG{9~>A6DYHQq8Z|L#WSi#F<^KfJHU$u;i22t2DC`xTdB(=Z2HLfG zcw+wh{SG)B^p;0yt?uvdgYz#e6ZB@8u_SbZNhSy^X}`?71-&1A*)kMO0MqYv^9S ze0l%yuscb>X&_U@`*4Ts@VSt?041i^1nAErZu8DHB&;-By!8GdH_OLQpXS-$gErab z=9fT*v9YbM{$s~8141u>DV2=UaB%eY^z;l5^BsLmC{T=vGdU>0@ZR#)_%V9JeVzE) zwQJX}2Y&hTy%3zU;wP+DkY-F!8}lZXj?w@{;OFND0~pHhKX)O?{?VIxL&9K}luhp` z`!SGoL_`F7RLKbFQxeGg@$mAM21$V00N1#+wZ+NF2@HOEdYYP=`h~qhT-@w?K2h}E z-rn|hRGj-kfmbcCriO;+?(M{cgfUttOG`@?6&0ZE{RS|-sb@H?Cjd4Mn%Y6PJ$eTE z?b`!VQqsG3?~;*K9-pw!&GVb0Ex_Qwv!Kb@&teKBBqTsL_WZ6W6O*g~`tF@O*!Ff+ z)u+H4z3=~yb$}sn81&$B?^IP)F^hqnI}vfSUzF-Xf`fy(u06%{EdL%{~x@IVl( zhLQ1=!SZ0`{gV4&z5|@MspI0}IyInVWp8`+dlk&xX%4F?LHN$E4h*PggAc8y#&Dap z#vg9(KolJh^8@2(K=xtX@euaTdj$5ol7>9&6}&h}tUl|eVojVa2zy@TQs4@n9trjY z>_V_tDp+vqCC6TQ3&9x<5BADb@%cp9D-CA<{{(nr|8GRZb~;`$`?1CN+q*%)0=FAb z0^zyigvS?Uuj`D9Xl54y_Le9 zMnwH3nz@#}#c3+5Qoka=&X*A$Jx_;6j^=?=O}c|S$tSB`t;H+Qozj;3(3Z4DV@ODM z@vrGJteN^_4|%WHX+_T+FmXW$?0s<>!~=T(iKfn@FS`ZNBSNM=)f`r${E4J-NbW@L zeUc!#vS_nlKA>K2&s`6c_0lBa&YN`duS;yR#b+q@+(X`8SbQhX1em6Q47W*Fut}Gq zABCi%GXS7ffL<103Vl@z5}#@kC`P|N-X!sAW&|TX!tIQ9_eVzAG_4}g(N&zuJu>rM zT2|1%D8im%b$f1{CfEF*frxMeMPq(s=f#pf0 z8#syQxI|+89%$o}E_+e-vP`Z48=K`RnOa%w0$8q|5^j(WO{?VvnZs(uZHGD{RAibdCMj0{+R;|s9Q=MlxGW+xcT@CVASVqLs2bCB=|gD;NC z*xzRV+PD^G#rN0PX}V9o%n;L9VFI>x1?wlC_q7YU`KW~rvnRup>rvC0&ru&6EVq^5 zHTTQiG$^P}=5iJlGbpfN>-%%8_@B~17P)^`*X6bzCwhbmr;u2q2>9K*A5G>$-xh5Y zk%m$!C;;9Y4(Hfl0vb|^J>u_QY#trfk*~Lf#J_I;3bVbeM-#v36Y7njE2UjciT?(| zP;9J}EztfOm$2fNoc1*g$aFX@Gb$J%xxf~iTfzFNHG4b|dKiMVNyjR<9}c<%$f35C z-d6G=8R&%tAFm#}np~Os*v?<;(p8I0@hq;8UtMRWnJ4}-pgzF>zXuXaJiJhsH{+VSykCD6SRg}> z^#y%9kJZ<8nlmQPQTCQ77SH104o-8xguP>RHoH2xqvP%1s+|EV*)pop%B|BU0AAYz zfO*y^0DW{K(6AR^;9(rV!WS%J7U)fluMs^JurFKxR)5QBP9{36C;I*Su-&_HEb-KL zi2<)s?PX-P7nfp@Vl~}ogIuHfAHe+a8O|=gPttqSvWLp$lynKh23;Fc;`R@`r)Iga zb?h?OPGArLN4z{Jb^TGQIl+u_aS9&dqvi>iiw&voQ?=)_dV~^!3huu?-%7Fqr-2T` zx)FRGZ#P4ChcUq&GgO}sr5Yf$quNV6_qb4y!+RPQ)W`v+Uu&~JN1>lSe$)gvDJT-7 zqnoiA!#@j)hMiHW+21^{XfG|l3KbGN1|KJFpvqfaV@0uf>E;ppAWGu6?vM>Y2^tz2 zHa5l6UsJ|O;QbWb#_nxre_Q)qlVy4Mo3Kpcq*39vD@n#)o>q0`>ti6N_l1Rp02%;{ z!`6BoEIJUoXz2qdyKgmI{+ibILft){fVhfDs+j=|u7v$cNh1&LJsWSc04-ropidyS zpqoa-8-bpO&6R!l&>u$0`dO5&!pj<|R_`-=a(sL8=)XKK7W2GCDq#2me^&EOHI(hI7uOoJ5lJ4imXK$)C->p&;(vwJOjS_ zl1v9*N);H|0NxOkZWEqaK2-zXjQvUPOcHpJ9!xo|>)Ui}4nF58&bXj(bhN(@ry?1} z|MG-^!RZz7|KS!mllWSz)#}yO3u$idjI(FfV6v}hlr+f4emfl=Y=k{O?5;?R9+H1l{T`Ixi8idt@XCISWqE2W}OQ?Oym( z?S>zZ{d%hD#`b*)i=zKa686td{~08xe8R(^&Kp$K{aZj=w-*MPlb+L`;uSHuBt+0e z#|i*ga2v4D22pGPde}0-Y*J@Z4g)EWpHUGgz^%X}L8qNfh3)TD7n1*xs?7q;drgIN z8^)V4oRfgU0vVfs`{8stZYrC}$$u|}57l5qMyXDxK=>CVaj?oC3UCq!G zUxQ3mC$yz&TH#pCN;Db>-Izez`g!io(+nq|LKM8xDm8Z7*?Ul;h0FS5!ggj@p=%}8emuYIt=XNctw{_)Gw zI6nPx!-RL+(3E z{sna&a^AhmpaTH(F&COhha1Iv`C%3HKYLB}{NFbJf93@nTiaUsy= znh|8Tfz3AYZs451^!1!^1p~4m6{hkutn{ut$KsXL%x#v~;pM07p&O5oZO^-Lch3F8 zh^Luz4=|AmY-axyn8Uex{-3#hU^o9CEQ~IFFA?j#+ODBq)Fnz{IICfAMpJP5f`>E2 zVi&l&yIHW!V2^9~rg?;S=LU-oar%FW8-PG=cQZYe`o#6elU+1N-%hk71B|c+`5g~u z4$}Z0w<)=4ZpMnVY;3wTKNC;RM$G6(OAEokIxamr)T(zRwH|9>zuc?CY)2qx$M7USi}hY)498CuU2! z8+&@#{}o2NZFniLf$P0D&b#z3*AriLFApDX+YgMg#Xq*Yg)CU(^MA)<_;(Ts+!&yx z_5l3Z+am_~KFD|hvHI#2CnbRNct>HLbt1)x?ZU4D9r{!)&Eb*~pQkrD_D#!ODJq zRp0!Mjc)(0t-9j8_2|&n;RadEqxyR_~WzW}h{surVE@;hfEoiOpr=Y%9 z{n-nl_D0ObB<#N;&;%^<+-*xvH*fl0(XwJ-k49vdyX}sOmx-0=9IZ9}w6R{-2W^fV zHJqP=uqS_f4s0Lloo&zj$s0hDoI}UfTH@Z z$(G;`P74$qjNEoqY0v1)bX)2L4zMclu_22__bG}|*R!ZFvtRNo_SPVT<-tL0=ZzH( zuib17a6EuVU^B-eIxK(l{wJ-;eo0BmNxLU)K+WB`@fl+$mBZ3XGepF&>Y->t2Pvnyp(^oZQ016gonva&ZAu=4Q2G7#To zvPQ)X9LiaBVYw$?o);{TuHp?EMq82@lq14yuY#{?bxx~Y{vvb(_@8ms!Zx+AxmLYV zG4ulKRhDn&!nHHTM$@Z_-pgHPh{meW2*1>T8s;N7mbE&^f={iuz9}gv0J1hTC@ARW z4MMVgsVUnqLzP?nY9xc}WrcecS5kWV%I{|v{w=D~*8c1#DJf}tcCZM~V1Vb9)$=!1 zpn#54;>`B?FF@S_ItdW5EiLWJVt~wglU#7dtafr#KQn2!)EIl|l3e)>mVT!1gH!K^ zB*XpIQ{q^+D8$Tu4^NV1-!L3szK@J6(k^_=!J&Mgq?o-}I)M1mS27OB>63kzy?qyVK1Nbl30T59$z0;#&R(F;bogbx)_cUT|^%}Dh()euy$bXJ2E!QT9BagSMBWV|A|e8UD6vOBfBpoM0Z@K$NgO+k@3?}T`Ore0J)-VO&32w$ z2GGWQTo`9a-j?{6h+0h(Sr|4gG&oeI`KY0y0uS0BOUEN;WVGcfshXSCf7ePTbrzw8f73 z7Dx9d4aUz}{umU@_jw)eQ7!|d4h#SY-pk8NPj9U3C+!{^>ap(60;WHI{y5q(KO?iu z7#8J!=MWgs#cUG14Ni>>%gQxCPEPy0-04Ir=rN6He8Ioc($dn?(|`T?*0tb`TNbsU zh~IBy^gxUo#y}Ml;mfzq(G5763S0u4;e6Vhm8L-%WFs)f-=v>(dNhR=3}eq5JKeWG zLVUvw* z>utXM>Iz$=^+rH6Fve=tdm0xOQARk-eJqGOnESgn zOCPlDihH@t!LrsYczbFAH-;)jwUV}Ky364Q-w^J%fmMZmFY9ocxq(e3-~WuN65#~L zR8Y|Qth*sb)#s4ssF4KP=3oTk-`BfXoby%Dc{uJ9qEx`?TR*;I2AfR;f72wE&aPm^ z-G)bW)wdIv9XAWKk`=Z^#+25rFSVrUJVF(?FfIP-Hl7=BhuNEYEz8~k zahi7ZRVwwlFq}rdr@%#{r@w5zL}|5uZl5H#cr5LU{}McY<1vsfF)kGQQBjdqmN*`5 zxBUs`4o~blp}*qJE4DM+(@F-6bR2h1Z}Eri09mKMdG*7fEpGDoatK(> z2F^ADbcem(EQLJc{-a1?@z|b7(vARaLy0)rX$x5zPXfBDbjc{!=6pFp8Ym{XT3r4t)0-tG1@e zqNypuZX0@0?K@}$`znKAB?#@vg+%*0B!3e%_*b2Dz1=3$V*VFfUmcfKw!M!siUTSj z0xBgSAgv-@N($1QFG`3Y-6deq3L@P|cS@%UQUcQ5CEZ=WbzW!gow?uN{4?{pm-n2# z*V%jRwVw5?XAi}V+V^v{_gq~L`~#!b=Xcn=>=T!I6-pk0`k;{$agB+-?d_D1?reI;iz)dq_e{z1~vR)^exrz@x$n zL&t-OM+Bc`P}hTIneMigT2S7(lV>(ku9zy*lky|{u5ikaD9+W|SD01KyE{8Op--(7 z#omKTkWEPo(e>*CIocHp$&wLS8LGLU9+T7xdK%w6FJ&sFe~cU|wbX-BT?;2rC*Y%4 ziSLfN)wmq*&&Bnn$qN%@DkS?37fA&=uZ~t#z-cH|ITz~;#pTZ=%{SG}`V&NPOq-#& zYJhae-eY4k&@roA7c0u(ww`_7avS350REkD4bwO0FNFdUWZZqb%v4D!_-RwLdO?A! zi~jV-&TN0g=d6D9D0gebkixkm-j1h5` zXaMxHhOl>MsTbxbJ2{nWY;4VU5t-K<7fU%V z7xfuK8+o=ykzuT33RLN77nO0_Vk%rBzxV05Wq;4Ca@vNr%HGdLT?gBXoNgyB?Djxy zD5zw*2@(H^^Yw%=$GMn-ymz0A*r8x4meQD}Mhj*ruwNYogKWTO(rnVf1UM!$>*?Ow z1TO#9hb9fp=bWFbu!Xg>qNR*R%D1~@1({#`f<}$@SpKTYN(j=R=QD}97^>FTgba<) z<$5VdnvBzI_!8%^9Q0|HEklRs=lYFb-8!=$d`+n%FWx8Zr*PeSX!r2)$aGWC4C?#4 z>x$(z^S~)JA1Dyjd^TC!Z)E*F>H^mdcwb( zq+MZmuga(^rNC2GU_VJBh&Ds(gI-!TGdFh`l=ZFf&R-_I9k9_r;ii>~;#YsxnItiI zPsR!{G)Oamq3cjJ${PiHbGt3?*s?$xr14IXcmVlA>kV~vb^BpUFR5-8mo>0#2$Q-( zO8?1bMJKe>M=(z5n@VbEXn@7^CuIeXlRzg#XywuOA2r82QIT9uThAlZ5=4Alj}My8 z-lO5?*N&lw4g|`gA3b7&1sR&=Rm!~7Q`>zyVLk-3Qa_1;9#%h%+Fc#X72D|J=sbCG zg3VpLPQaSG273oM4D>qHM*uttoC>M1*i$yhIR{AP#CYiLR#ED_+zycflA~99TupyS zqjAH#>w4t{g}=JfgQOz3ty4HeV=9nhuA7mOV)XQ*vl!$0i0>;sVY(i{xUj1wpPTCP zG}_R%s115uR0cn&ZT;#H79@?iXW-j(fWkCAQw2qK1np#0m2qZ$18g{*#%wTYTD5YF zXu3l3)@sy;yTww7u)(w0nM-EfX@Ov{t4>9Mb{^P-uBXTLrU@X|Bjs|kKi5-o?`)X) zi|({fI)%TWIrpL1V3bo8{+8R$3T9=x)%p|{v#{qyEEc(r#qIK(snsWqVxn~(7qC^Y z;)&+q;9L47yvDw#pVs(%`KGC&qy)}YhUA|LD()ILAKYxj#=9A;puzL;WNhb=nS(6+ z7l%Ym+}!Tk=Q(}}>&yMS(Q$NiwnOSF=JM6Ypp8^t2*v)TuSLFf)mK``R-@9OO+m{c zp=&;x_;aLnAgmItJ5XHDT0(qu zbBqDmEw@9!*84!a}vejXL}t18vZ%Tg8Ab8Y@KqBJE776M%myAzG=tc(mf#w0Mr z8O_BszN^~#b40p*Hm;3@rzX+$WZ%%J=;=34pBVx=8KvrM8^fn1LyLX6tVEK#{2@Gk z9yr9l<`p*cla(^^P0Ww#HV#*7boPs*o$pamCEVD#g@G~p7KyfS3ulOb4e|ltezNmb zL9jT{Dn_)#Y^1Ivh*sJP)$ouWhum=*-)O(sbf|6v=s)yhD%N1MnY&MFG3IQ2hb>b~ zQRONGKkbgkClA9Jn1vl2N%PpTqHXS=Cr@xze=^KSjs*5}41~ zk_HcPetyv>qfu?QtdW1TGi0t>ojuzoL~7`54!p1VN}0f@w$IzccqPKNKieDr?gP*J3MK6X!8t0yLNB zy;%`9Z0BZX1N~10by{QUK^d>UgjwTrV;hSrftL`e#jwSEPPQUr@5|oRRwlt z#Os}94}Qpl;s7~bOBm~Eg`fft&RmSk(cXG*wq~DYk2)ML-}6P}1isVUx>c87XIA3Z znl;s}9xg>|FeX_Ny|>;#QNQs?*o$E-)LK?D#zTA;`M&7Foa`XGbRxJB$8n*MMJ6Vq z$6YDXJ(=7B#8dF2T28Tkke7Np9X82YouG+qdOH-%$vnj(*}( zi`^b0=e1k<3%ByK6lwWx&a! zg9(#Q2avLg?hHnn5pse#ynCvf7LJX($l@UT>hYvhDac1neJ30fRJdz7DUvS|jmev> zyafaG_3#f^Q1UK(F>_zdvP+tiThJJ64cyG&4N78LNwX?$qt06m9@oB>SgY zU%&2R6MGF7AG7-uPSf*;d&}^1`e!2rI1CtJWIPm zMZ@u6YySNW_A89{pZ|OUMuYR$ymH;s;fufD&9}gN1Q&Pi{CVG=x>y@0n?RM!mkUVjkCH9D*h3-DPywX}tD~W9^HhDT>nz7ccVJE(G(*(HriN zcB2Lj_TRi&KIh?uOF=Y*`py=|@2rwF?xK1j4B|}I@O?L|&micAw3&9pNAv)(NAoqttvkEgalxHfw39w1Mwm` z%}7nd5fZ>$R^|58ES68jKqa$Cr^Z!MmJ&F=0>GoRp8XNnx0z%- z1pBrd6xx87!n`^?|7&(6sQh&G4du83fLUf{IhEbnmqoJh#HlsKWrMJW7k)&rZ6qux zUqXLGbWx__c)yA1E+)C`00VA3ZPL!^tpqdP6CQBS50L?v_Hg?tI~#>fH;jc~$qBcS z2^RfYXqY-3C|P4trGhk26P*TTW+$c^ogH-gRUMEPE$sKP{;to-vcv`eLu7dT8Q0CocV9NKw+e^o&JG!v z4Kd=@zA(AAlT91H9B5#K9?x$YlJJgzwf-BgzRP=3+^6J{b=W-4gdr% z7tOHY&7wH46{*@$=Z%=J9OBf2%3NVnI`9R6L9y2JLJfpVHdQqR8JU?|E!QLC>6fkKtwM4ma z$3vEyb>6}56yFhJ^luC24lGoz<(a+ba=ObZVT%GfsqqEGjLIMO=g2KbGu<|^95GO= zt0J=rnG^x1sx@DSPpb%~+hw2mB!-Q!B}A(LVT2tiQ@S%enrEZUkWY>N)-ZEs?=@zi z&!ig7abko&jhhX<0QulOwK^=>d|&t(;!)F1 zbrf(Xx-pPF!eG#oXl@i`*UB46k6U{<9oHsv>hP?S+T2GFw?3zh*HJ^`;gP8rs?)NS zEs_0@VcRxPYtg) zC*_r%yeZ$E+?=HyojDIT59S~W09i6fkZ(n3bKmk!_;~UAC~DkV@o94IK#sM|k7kpr z_OH_lj~B}}z5#M*ivY0kudnc4)O4s%Jg065-zYfIhh*|}zmiME=R$B4PQL!}2g?nx z_+Nia_2aQZ{ZjE%#S=#ifyU6Vn&nJx`7l1F9wPiRrl-I7v`{24b56A7bird2Yxfl1 zkenE*Dl)1|c%38T}I0iaEjjK7RRdYZ>y_I*qUg-K-O4j}Ao&?5u_XbZkXqT`reJ zjwxr0M!KkHUKt15Q*EwI_VChqnIEj;!d9e?ZH!DE)lu7cnkErYolK6%HybP0Q8whz z<6K_s?fxlViF66bUABudZ6af3s-Bp?;aF2Uznt=}-Hnj7cD?N!T9VIL=IiOD!Mg&# zmR==p1o~p3zt&~=4g^7iu{wIwXK;DTbzgQ;)0BAGNGeVFmvdC9*uA7L8uQ+MBaZHc zDdnHMGZnzX>Lcu*CWgyP;U&`jA`U)Om*>k3c|UPvQ&`;H5z;)$Zf_VFZV1)68Q>_@ zyMozNCC1~A`&pVdb&ITeu4LX2mxfz93*CQ1F1w@SQ(-70;p*~8>D%SzKnZXj;K?_S zq|tbC>9sDGnDCCexDEG)YmmT5m)~yqBR`vbi2bGHMA@YU%nRtbEl9<((;QE+Cfu-B z@>j4a*=92z4h4R&-1w(cw4ZwrVX}YDl5^LmX4}#ElQj7z#`;t*?y&~L0m*(_8fcEdT+c^cW|rQ@#=C(t>tu|Yhx zw)K%0l{dua8tAcyPyh1!ZIAkL)lp`ymKj212ss!f zLj%jfX1nih-wh-4mI}t=8*i6&Q^EH895z}!w6*ZcSk?Xt)>_;!ooK`S7 z&+EPUGTu9g9=5_#G${*h0i1g?XY3h&a1-wa%+XXaFf)H^m+-~ytPePMkgnm;}(e=|e=|g5lkAQ$g z@=h$VUKi+pfw(Uj(50!6*I9))xehj>hpIDYaQ7HZBCG;EY+H17TBLNJcX<&2PmD8x8S16j%O1*XHKcRk3Yhi~FK)Mmu4ddG$IKXrFnLCZ3( zf4a4ML*vLzcaZNo0YMNnKE%elu8n`ms1io9WOtmIxMp9o4%jW`FmJhVYnBZ8^(aAm z=|g$`b+nx1o}68KxYn@xAD?@E{Mk8g12p*aZ$25X;vo^+xX|^uQ-)dA#~aTaYcZKJ zx0*?W@7XiS%O1VOt7#u7G}@ef$!)h}5ha~VUiF-a<;e1AuViG%?sSS@ zHeKDqZ}CnWBVPJ6zmo3%W&T;i6bf>vTve8$4*{>5(d=?MN4k4O(iJ&QTg;BNP&`Pi z(@HlT96+Ua5ej+d&aF+%*h*d{GE)dZ-3O4X&|zs~MlciJ5%-cqs&WvY`XJrw0;Ma# zOqZ|_mVf8-`_0KjVu>BbMa>NlX3!B&&=#(tchjPXh9}?nb4G|m| zcwt*^6h!;}3cilFc`{)gE}@{))b~3^`;qLMbsKDk3L)mI*^z9|<;>TO;~Y~mH;gZN zdUOiIygrm_IuUc?1VB|3M{&g%8X}(Nt4-_0Zy;WKymDAi1y1u!=NdX(haU%&Q*~Np z3;ACb=;QDvvAFHcjyKx{6Fy(LJX9jin7CRa_~^zJ(&XCX-7%I+$A@Dj(Om2HjQA9S z+BXPw^-_6Uw>ZZt2jU;TY>;aS4NFe?0dYzJ$b)@TR@GkFBJhn9XR<+wAIarwRcg%V zt7>&Xq_P-3cs; z$^<^U)05=pv^{#={cpHqjIId|dp{y5`f_zv7cz6XY>kT!L_4zpo7zM++o ze5%PFU-NpQyVGjf(J}R_HEx^TiZS&cS4Jq5P|NVSx&?#rCKn~7eJQ``RV@!pDIU|dbd{*Zd1 z0DdO_!E@d@50+I!NPiVzeL$0*!%{zmzXu?A(Q1%>1jO_)QBS7ATze!VCM)^4_Fm-6 zUF053Q)p}Z+IGxzA)QP<(qjz^>yLAg=y^4K|4vIsM{?1#dDJrq@c~y3INiK2nAkIn z-2Tsau5(+(b3Ha6J2CS!NOtN*Ju{@FxwnBelO9c6zQhFU8z(ImHBt52 zSG_izmPTK~8t?5W&YJFh+8a9`fz00$$$csZJ*(c<(Y!cwni_xG;3{Fvh}*4=kN)Y$ zf`M3kKYFwzF098bjbtjetwpiF*jTB+tS{-rHn1n+h;p6!o);f)2}zx&Rg;(_k00mQ z5-ZWD)8c#3s9Js$K#rSEffA#I-IX<#Gg8wdOvXFP=;^xmG--nw+IH)>{n7Z`r%#`L zU(f)pJRwz==#a=qRFnioLLpx=GEa60afLOz>J_0QhM{7k3cHsN=xG=Faygy0TKsuc z`dgNu)2Rk(L3<oPd~AcY1t7qH&}mu-tigscoN^bi1>VJFj2D3uYtlU zr$>A~*RC+$9z&#eqNj${-@bkOyl4=*_Nq|OF*x%r-U{)d-A<5%_-2h!E+^-2xX+bE zGX6>F8Xg?H-_GBsolXZg8N};38pYHv4aE6*lnh%{O^Job%M&aH=N39FW)s(a+z1|^nYJSVj;b{cWu3X+y?URZ9jEODo>6kdM|P@{@<;xve0F@WUH6q)^S(dL!-rFKA7O)b zITnFPk~Gsr9Fo<_weIvDW{vxVEpDgBBy%%_l6E_TjJYP1v9|Z09fW z^@!m;jpLddtLArF>YoTh4VKC@VL9qQ%dzCMTN_VZ3?8Oe+}FC&@NKUBRFcWOKko~! z;5#MHy2LA2o`swi%7_A9!M1)&Rp({>M;bO0jw%OaCPgNW>M=NiY}<{2gp%JjVBCPg za_W5-hxNDpQ`jDgVj>Gn!HoBSHys>#L*L%1=q;WbHnOhGteq<8sq#j?PY_JMTA2Jj zA0FFs*|Oo<3243_t#M1=Gak-I}Y&);J(6GxUL5^r^^&K4ouBfc(#of`@BHZ@j<@-)b~)T^WVPS z)k9t9*@}o@6D-yUs{i=%aI)U<1W>cvo}`&%TzR0(Ix(5AYf$LuvDrn=AGx>L9_N3p zL-w8P!F;C1auNaE$0UlE9o`f?MxD3U@1dNR%ixTE?BPf4Mq4}}cTewQp$SQ}p z(K{C%x~Q9_ar6uz{{yaB`JBtpJcD zbT_pLv!~_v-?sX(?i`J^(rKxe+oT+Trny2a68nvxhm^&bb=j&-Hv}sq3^_`W&=}p5 z^gx+RR+^Yi>7aoPvb8y64IpuB4;m6smf#*iY z?e?_7^46SEAMG_2Ul!SxNgtr|rg#Avw&t7Jcx>DGg zlYYZ7UW~p^oyqJtJRE(q4t%c3G_h~Ca1blK8>xnu>l>f2PyOC#_R?cn!84Yc0%;ZPT{@cQL-8`7^H#<5<*mv)5hDk2ceBsFtCDOt@QDoOX}X(mKlsTL)7?XqM{u8*8vV2rmji*l{8|eMCKLz*N^Vo=ZC-BIoHsFIr;_OWLHc~ z7;~GUpatnL8mFI=WU1~?;9;`FM<<3Yp*ry|Hl>bg4hC?lww&Mt8yF2JDA~L%1`MtH zgI2}Ml7&5y%V=PrXfDh{mv)dM76O$^s@BOZCaet2fe0KTH{u`s^2<5&U+MCOmFyj) zhK{n=nr(LaG5Kn>hb$~HFl>B}vIGj427Tc)%lHCy=p=gSu~fME;&uIexGd>d8&w*~ zn7lMA76n|G7X1*rBJ=}^RUr-88Kk?iLZYOn)+*J!Q{55?MM6kAg zIr=KYZ2UJr)fPVkt$i>N#^@I_!89HxbcUh}nVqi2j@HRfJjdEYc+{zk ze4r?Tr_}oOFYhdOozUbvgh7XDjqs>l)&2tIfGV<{w4i>vB0gO@ zZ*59D?|$Zu*t1~T{$(t5ncN$}Dx>VQdp5}&YyDt^Y||k}F`c4b zS}1;%6f8b|fmK=Ny7s6hpkFFKUpJ`UlXn#>U$d_5QyI*tL=l;hR$VWyYv&)I`O93R z_{QsD$J08})IhSHQtHMx$0e%MaZ<0{<;rKOHu+iDSi5f4FXpD5hhB-d_B3P3^D`LT zl8*lB=msHT01ds3haIv1S$dxLNXaRBGo3fz ztcS*yV$0qd|EJ0lOMch%@dXTb;=G{}h9F{OL9&>*?uuI~7>-mblCPO9log~kQsqtu zm^khOf^qZ`{|j?f0F6;nm+fTZt6z?moPwX0GN)6=+Igd>SET{dj2x-fjwnV9_F;y! z0CMl}jbX11_ddn;5K&ROnUEuY=9-)PK7q{=4$aozHVZqG3T>!pSgo_CUi%S(c)?~8 zI~`qWeEfq^B)Y?^7>WOZZhvm%INtU0uC{_eQpiz_0c;f!8RH)ELWmjM_N{IJF^-rNm&LzE3*1>4x^S4eP|4NJ{=S5 zHnktjlOQw`nv_X!oO|wV2Ks_OVu^?&+yek=PEVX+FId zQ92G4<4fo=!^Dr+H-X!{SZu;9s{di1Cn ztY$)z3P6_TFIIk@o-qxFbP|8v!%3+*keU%xC`Z1$iG%EiI92xa*N+ILZ60>QAbJ@S zQI{i|ZMo#a7YD(UkD1R78mFExTpmQe8avv3;OIYF^0{DAVpO-g;VvtWe%sOh0ITj} zV$^8%9s4Sq18ohNIFw@Q+r6*(7K^>!A&iDmt&Guq!`1u;zKoHKjEtRK)IG9liay?Z zsLCXNvQ=eVWgcBlG0sITmtQ+SqBOEOK;nS30G<(`6HZ-AGlrM=8%@q&-9S*U|Fyfhi0hU8-~W04uYlO?Nd~EkEKev-2av5rYN;L(Az# z>>zp;Mn=*7o&J2mouv-?%;e-_7Eh6+xq)J768!a-E=OBGekfD~6dHCZD9n0!$%4G2 zCyF9As8EK9&*Dk?X1kUDfY#AHD{DVh>uDHYOV}wX>Ctv`NMU`Z6%%VB^yI62uRp#D z@Cu*~3mtx9&PH_kdcx-`>HKkkwjNBP`D@#0MgeC(7tWag^m%8V=~SIq^|_^NDs}n{ zMG|a`g2MijR=)fQ#=)I1nX(rDmNudCxO#{vm3l2_)duu^ok5PAtR?Ec(S7HgxlY-p zCUs8Z?#I9=vT%CMqg^3z)AL|wnX;N3qT(&Qb*D%U)6Oh)f`-%}eSHxhFD}71pqmob zoYvBo5dWm>a1|E_kU4tCkYn*Xb4VYk8_=zUj@FBt2V5p-@MsIuxb|Kwvj_K-@(e~L zdMnrar#(5KyZ@8-=X`x|j&?J9D4>CU@Y^?IyjNnd_-urAtk5iv*J zd-|0Z!35uZZ;&MxZjI7mQ2w*<*-NU>07wn?;bIeN5GA4t9ky!O29Y>?LB{)AL%XAg z0aM?kwe5&Nc@7^3Byeu25X?htcLJLuy|H-2Xf^rVSma z?vNva%7c73@kKaSV-2^17Ds!mlXdKfUg+#8nLKN@b}RXFM#_-~$5~=EK8tpwUANBL zRd*sx=fr%B1$ug!=0}eoHhjF!CUE8PSxn6O51V>q?Zf5UJ-QwrKA1;`jXAH@)O~G@ zBECIVZ0a1gw^KYc7`*e8W}%IW+c8JYs!zLQdd^%abb30g0utrL-b;Kow;vu~Or}Y0 zU#xHNz`b`G$MD0vs#@AfQ^vmo8}-7*;aT z`IyAd<8Y^*muPm*JWHo0)_Y3eDsWjV)KX>R%=~SWpwabCz7SwC+@V?8But^7VOSf> z#iklFsjOOii3bys-7)oyxqLK0r8zC$G{!v7hZ64z2qtT={M4!b$Q*ZqBO1fq7;QIs z-G)9Q)X5{)+3SwAhUs&XJUHSRo$4k73F(SfXFN8{@WpSimy0l|nmI(o)#RIvJXl}O zt#M5`nU{p!crMh!hC*`W4nS%%L$Ej|HP`t7W9`9JO;}+vt2s{Lq2bK4a5aUyL{in@ z0vzh@b~%k`UYwa_N?;h~=jQ`RfBwy@A&avZ8Ay5)U(8#;BrV0r`yHzZvs#K@wNsr- z0kkCVuB#e+daPOee2Ip$Qmz`{kaV|l>gG$V!9)7dd}SGyQ=YKS7D^9ir<)S%f6at( zstW$Zw>7lvQ4Zs+ipBx9X5aqANaFw>w_26$XYeG?%jo_UrvMDm>hD)s4Fe%`}9`Gdicn)V&DU z=+p=@V76h}y;51B;d_}Iv6tuOl$!A$=HjXfs`!)_I_wOX*)ljtc(icY6E!n4Lrcux zg#yl~){QYpbz+g?QCj`d&fCND^{7LUi2*Ig#)kB{W?;nuZ)6!rq*foyzjJt$k`%K#YAa`M?9fgGX7)<0^I zYviS(&)z(O!>NsynB#6^f~9cYr#Li)s1|d%@<~*=?k57?W^)Y-!@UBDw~TY&bTHPx zEqDhx&f;=~La?v@!zX|>gj0l>p(d%>|8!OQ>;w{vBv5;$5tp0U}L z76-Wg{2zaKe*#>o*91iw8qFPagF+&o=*g@gga=RZ{r& zrSosX_xLTpcsQ}O1TokVQNcZ}iYs>Nxu_8i(;USGAD%fuP7$9kd212;ILA+Qw4+D)YOudl~AQn5|peA??XAu@QLW}tyP24>cGUemY&QI zqW@Z6Y)5G5P2zvaH%j#gLeDbfeIX+3aNYFR8F$VGX{`lUHJ#% z6npcDuYNzCDl65DCD3WqI}zen4Xr7}n@h7=lrvZb0qw+MPy|uQ?5R&CvOE0V*O2?1 z)8_Q`%uMBpC=4|uN1FnVw_zrV*BEhne+|@jr_G0Ov$1+CtP#^y1fEz}m^Wa;IjVMK zc5c^rq}&#$xC)xkS?M>0(YK06pUzyz7*ICZVLCNCP0mlBYe5MkmIJL;`$j=2;ovxDFVVo7WFlVDAA7$#9bSST*zy{*KFY z`xwJC8U;}kN}9JNN>2^K%&*Ct(^@`8f@KsMnD@InJIic#Jl*Mri$@U8H~afxIJ=`S zy9R1bwplHA7E8OoKEJP#om`W&StJVlgUNPp_u|R+a7K!t|1&P40d{5TXCL0+1Wli* zNsMJ|8Bo7(KB@)dn)YSP!Na=#&w9wS!hw2bX41AkA|Rb)S(eXICAfOozWL7Ze@3Z! zHMUjTMmqQHDarIMvHDfO5L&v_^$iVMq~9EVPV2k#{0Ao`g{=3r!>P&DXEd!B2X2tt zKN%R*lQ>W)wCY-*6E|wpFT204Wkwcp&t6@6{oQ5rP<-l};34I~qS2pzHMj}B*3obW7Kaa3&3l=7-g<{#|-9Rfr zzkZdf7%%TAYjuRx^E)Hnt2z3?hQsPM9Uzn2f_d^7z4GA}GtKFOFVbe^^RzS2q)Q;% z`mFE>`|2DH&Kx5X5y$Gu9B~bgn^|K)1(xrOpQa#fad7Ef-7w=)#HQyEo1U=hEt%Z4 zBz@fZpQm1fYwNT)N+sZSV!GNHo;EHWHLil`V%I}rrjnT!ihJl)&gGAT=nJ4z*zvgy znOJ|bQU3Hpx0y3FDd-hd2R+ROZ=zfd=2K_N+rFmfd8ZAzwkjqDm%J)X`qw_GZBKUN zQ~YtGL9y#Uzn-3*g?lumR!B0W$|CCPR}Cjhy+r-UfktNUO5*)^q4ky-(wI>D7};${ z1OH$@9>qB2Fc}(Bx*Tu!SR1?-@tJKc^^-QCa6ZQZEj}fc2M=nY zO(9oH|C2ytBalDb>_pQzgG$koENJJvrWrN1FHi7ur#n=8;{kJgEF&XAgHH+5aaGTu zU`PhaX|rSQ!Fx&~zvTFMt<^L1@BclaQ=8vp%=%zT-0sV;GKFG*xi2Ft3-_W24L?x& z;Ba32DJ9ucpw`cEdMf$<&#yoKgQxlT&wGs7Bcy<;yEs&mJ1iV53n~iGfA;$IYf=x7 zJvO9Cih~0*DygZznQ*ACzo!(<;rQ2-ga;0PARra*IGba9FF-7CdI2Y&iOBEE6Hsp; z1L1t&GtbB*NCCUtZ7#+>IyVo`jYnWoDYq|5iZ-)Hqn^|AYT4jF{cSC7HpO2&&=;#q zzs+>@>Q#LM1D^pNetv!s!~OF5Tsz;U6s(D9E1_ihM6q`M-C=0DOa4lA>y}7n5ACg6 z-fu7xJD%sOWw-{424?W~P0ak!>1FvAywLhXM2oPe9yZOj;97C()PCNJCs;nF8}px-(xD=R}sUw+#7 z-z%`t>}P-D0a@D;|1I2ZTKHlRt#s_$dqa9GZu+U?IYhX15=+n}$6+~H2hCvm(2xP0 zG|FuzF`3xO*?87&4h{~WX#r%JAsjy{)hLPKEB}ce_CkQ{hHpD$>R?*QC)WbgfIhrt zUJ+1zOf3F6Z=;c|lGyRq)6>^+r0kQ$1%|TKlxvr8a0m$8pu-dDQFPjgSI(2Dm|hv+=~R@bK_ZQ6b8mOiWDo@81Wz zOKncdt{15#bUd#MrXV1oes&BBs!#{Nf8+o2A~*e$GCHcfn3GnD=~si|{HiKBg|`{f znPK&0sbq#%LbQp>MKl^fNfq>B-@kwFrd?Fn_GV+Muu+o5PDDV&KTow(ta$GE>c#5SR&!s@C_3`7!GBPqC zejp_!_2>~ELFJyJ3v*~vN(#>)cHw|Yk%qOE)i6r!Li(`)QB*|doGtoX(hVb`AQrg) z0ZEMt5&!G@HDfIO&*v46pcxyl0!g*<5|eM6jzwTdh(VDCxbr6cd)F@hRvC4wLj71l zn@acoje4nEEzOBf#X|Y6Yh3veK4e&rQiqd#@hd)~;RbMIztPM!0$}%~ns(Cc{*w6X z4XaGi+`Gg?e)T3Ce(Bmr^wmU<`Lva}5Mp+ddE=WH)N2%y*#c= z)(~xqXSQBS3uaM>Q;vY{r(pb|3;QNI7&E&0N=uc zQqisA`(=G{^L0^5JkVgGT|WMORPrf0?nSfb$LtX1?o~8%w;PHAojSaJWK(bILdDpZ zJ{U>|wpB^cP}wEI8@Ti0u<>9S89-4XSHFTwMFf6S+GL00 z+euyc2u&1Vi`*Cwh&HXIn^L`ic6cl1RS>r5(t{ZS;jcqA)1{46X@~*`tVvK2199k{ zg_6@yD0(5e`1rR_K`w_5WqzCj>*-e-vViqk8d?H%z44&l+^~Ob!MRg{D_ySc^3frc z-=B)fZOA4?`|*J%ck~S`SFd3_U`H~ly$s>}%z7Jy3F(Ldtyi+KQJ0Rjk116nP4F zbX|a_L9w7t@J+J)CA=t7$EI%$ibb6RTxHMeWC$u`mTJ#sJD)q{=#y7VGk^A!BMJu_ zd%6aydVC1Me>@0HLVk^qkk14oxc!Lw)sRYIk)g_p{smxP#uul_)va9N%`VM*J}lv+ z>dnP+Rp~SMXTCRj zl7(b4I|M!ArnU>V^6*G`==DLCmJ1t4+;HNEK6MhqKMJ0ZL4d?3yGOvXmHNZk^?e|g zMXXa!7F>n0*4G)F_H4wrz4ozLQ-mIhCMJPEysmBkFeQpcRjrhX>2(ZC!JTUtiTphN z`=Ew?9Mkm@f!vCDbxi^D3|82GSu`;oT#2J$2?13_xmFD1J*9dF4LZ~6ib-AD8sz!H zb!PaybE{tyY+2_@-oo(KQ#WIng8i6E|2xYc)$v?+al&Wkr_XRf3R#p?h-cV6S$Xhb zKDX{moOt((Q+w-O7Pd_E-+ z05dSC4I7fug?#-R?XRv2)xop3j@xtFDI&hwtY?uB%lJaVP~N7x7|-hl2@$hq_mr)r z#>wtJY`gnTYJDkv6xt}sWlr7W@jzFK{0LpWdRo6r_M^DEC2vdI=66?FN-MvXbtSZ#2ySk?OOTiI?82o5aD*9M}GoeYpb8*`T|8B<{f$rh0>2rol zMO-+8TbCDiS5_6DWej0AXu^gTs(YvjLMq0_#$saUSFxc2c@;S^+w*2-Sb>gCV_*5C zWMKNP7UUhha3N#b^miigpwI6wY#+c`5+g%=mzB$=yY%O)M4<}YON)C2j~r4}jU~Q1 zRWfk!O;_c*o;nsQDRY$&Hp@RzQwvwgBosIC|N7eA15hA@m{V)G6pK&edP;$iqT>-O zX&Qd2L{xhii$vjYb8)HUB7_TzK^+U9ZlRgJ+^U?Vac=#jEq}uQ_~zwq5UZi4q5?q} z&;|hg7gCRN|DA;S?H{dvrajIB{HOTVVSMKaAp#xx$MHP5r5XL!PjS7!A2Op%IEMGj zxb9mDnCF@Xn-cR<-nw-QJOLcqaCCz%Jb((Mnb$8u%=kqVIc3n1^Cckr`{|rOQ$Y)+ z1(cC`zassJ#dxX1lXXM;ul<182Ip>Dd%b!&mntrhQ7>I0oLjExyYc(`s%BtktB}Ay zpo9<}o~DI@iXsyc&Mt_4cXJ`%0rz%eo4U>RR11ZJDER|=h%c6xn6CQI3X!^9yLcX= zugFM-zn&g|KJba=mII4C`_=NBbiajUP(ij0@hFI6^Yf3OYmF?qe?dd;xOZGmEB0E= z{biwd3L8ul#f#%Hl}$ByTO>NdZ`0Z`l%=gF=p%B2LA~Q)r-rae7E*(kRQ}Yr2+>B9 zenK`p3K1}LFJWxtA+es(V;ro3J}sMtvX5;EzmCokLxW#)g=ifzcaWw9HG1N?WfJ2{ ze-+PF33W?;ssL<)V9B*Zrl(Fhdqr+G^-hi$$xv9fA-Xbm0?>>1=FXenGui@Cv{git zV$B%(uZU2+zd72sp+J%Z{ux66(UckQxhHU{eAHHQ%RCfIj&@s10)Bwug0MGgooAr8 z8aO`lfhE&twBG&eXH}ho(Uh(eagSO)U|HNnrU2xRJ-D+MV83SmXFVMAACKxDIbzH} zgpH(t?r?h}%s-tuF$H?OG&rwMp9y~RuP45@x=ayZ+-=laNYRLSo8n(1A(2VLq@*|HLJAH`bUC-Or%{B%w1sz=P#;?$JRf{P0k4EN7G|6XWaa8_8q4AWre}zQfx1UA^y8v3%TA zRFiv_WO&qZH{2jHf;BaNPUa;xug-8;B(bMRC}55B3L^ci=XUD6?`2GkVDm&=mny zm#aiX%|PB#Mhu>IS3ESAxTd|tjZK#PLC9}|&jd$A?C(tlv=oVO1A>nURm*!(t>|h7 zLOgLb#z=#!$uJ(gSMM-;4(+Ri(G$M9yT3n3v)=B?2y%nQuvqXAXa`hSOb9{w{%@X% z5GBD@!ScoG3aM zc~U|*e7ceF!ig}pHNX*(4W(~S3a6?N=m zUID0W7{qS=7gQ$4kVMXjG=Y>dzk1fSmtWR5Fova(0wu=nR@0IZ+OSJzot2K8(1y_P zyYFSj9^V}sDeou|Xu7@vSF?V)V95HpNza1wxBc(8MzROBoaco4PBc(npFe;8TRan# zfCfxvLy0h&5d};+>764|W>@D`ojfgacdXwZfyDp~25U;k@~KCk2eH7vQvzBuqcibG zh|}-+V#i``xkwj=Fb1cn{1$%i>eA`?Hr<8pbm*7mZ47_BMlqO z;EpvD*M@S~r}iP!3BnqG`q#suZIHrtUa>^ReV9k7_4Ih`^c)tJwIB|LGLi$Y#hdD! z(7NhTXqHKkyLA0(!;;UxQ*XG#K;!UUF&ErZ*425kUH?cI4}A3>PbZu!n zE&~s5FLlA!v`6#E%DZaCXL+nm(6DU0?{$;DMzza6++W1ZiAUHCdxKsv}WR@j9^4&WE>wjKwW=P9Nmq9XEx8|uCe%TJsx_$fzj=!g9Fj(Om3b*u?unb zs{xa?#zwWgCtu!kj^5tIo3VpClAtle-v6r*PZ4;h%DaC&@IXv3%(~n7r=>+DFqq&B zB1W5_TZpdn9@3tD!Gw;gnyWe`i*pe?QBcz@|8BVL2DAonn@vTy5f=c;9#$+&b#edM zC$QLm-!+tmND#OmnxY%{H5;6hXp-1L5r{V7zXgA%nprZMt!6llNJ5~YQMn+XIn{0Nx%{K z@Zkd}OdPMk-NQOH)k+HYGZc4Ec*5AT?VI4Y<9NlX7sd;+r9%!+|j2e8pSww*@IG%@scSThG|xV>}_Q}qe``k3o*>q}@E#J1j? z4q-`wdB@vB+S$F%UFTK)?vO=dCVI&uNQL@cC#|98U%ytrpc^ zg))15g-<_!zW?US6OO3Df`Zb68t`vXdisPy6Be*wIpJ31F8=j$^bQ3G+cC;wfz=}b=bY<|=XqWL^4i}uQnOoG z7^~Q*A^L)p&CFC@L#`UC!D*bpVgjYthgTr;H0JfaUEyhghu|)q{PlEyxC<^(l94e7 zZNi-guNl>fiTpFtzh}U`OaZ3~2FWwbwYeBdCeTPYR8<#_>rv(L_oXsp(2x{)G(H;nz)M1m4^+9Y2 z4h*EZm{?d?;IR#6W-h{jQ(5O7+9b!!KA(q|ncCG}wisu0$A*VX=pRY+N5pjDGeQbM zCFq8dLR=L?@1Jt^#T&-Zpph3%R&m-0MtMC@tfl+KFoJ*!K);aI0J7K^860nVMn*;; zUCZi~ELbSptP+D^Y93zkmvEaLz#qWJpnUIE-pwK#H;zGn^$6X>kuDO{q-?&~Rn~wO zUCQAPTGm=i%`*t2hnWf^8f!vnB63gU#iOp-nWQfU$5pX0@`z7RC?=h73Gv3Mvq7Qg z4;6|NXbcM6ud)>1BwiY^Ssq_Rp#fhYtu$BDBoLpi3iPGCh)qz5RIN}3e|@FCVHsl@ zgvzO#4=1;0?-f~@rueanF+jsP*)m!gFVZhDIKChb!^Kp}B0Hp-x80yPz^r2v93O$J zV2fI<(Y^U=gL?FL?0ALP_jhCq42d*K$3PauS#wG7_knxUn&gsOQ!J94KQ2OZnEe z6Gxn&+z64s({Wd^9}5(U&`zE^A<_|yl$Nr7nDvxznt+9HcqK~<)FB8tg^H5FGySob z0ta^af*5Yp`|>(?uqa#^Tf8mel`~XgYDUAUDxhm-c3^&{CevO^Yc0<{SS`aoPxH}m zPF_!ss(N0J;?3j7Nc#Ob#C+c{;NvwaVLido(0}^$;PISm;Pg4hWA$ZQ9`PgNSksQD z&rvTHZQ0l+6B{jvEgWoB=dYTJb?jz!nCtrwax;m93JUsKz^tfvATQA7+dO`%|BU3G z%L@xHk9)n+Mr0U!_7%0#kx#V~BJXUUwI8q3ZqVl|^SKvF7r3i^NkFch5P=LL+~Wg$ zy|z6u(a+dzN$s#!u}ah!axiJ^*uj^x+;(2od?;`q-w&N5^0#S~QhOR;=$R;a1i*ce zD#fVuyH9(CiM%&2NTN#Q?aMnAgDpyS${%)e<%vUn{&fe+ouD31Ek%^sF=g+5n zaz_)$jp<=8z1Wm8ghXCW4SA@9G9*|${(d;+JQ)wB?b6yu%Oaukmpi=~X7USb7V=m` zOups~+F@Z5T|z+gM7z%q>YWq#(I?~p(>;DT-K*HkADUJQq-8j1G>QE7l;3cjI_Srh zXIKnz|Mp8K|6e~olcvfR?8p-5ZvKI-!fWBNus*t3d19I6u6_OQTRw%6dp8fg+-SSE zKk~kNB9(}GgHebGqaaid+Lnla%3QF4cJrGUOYspGUmf;P4NTV+XQyW8rmT8Tp;lVu zPOPj>^UnmYe}@~+B^kJgkYd_!(O+hF-DE2$*q$h0ZZHQ%qLv!^f7Tjn0d?0xwd37<55-aH-_ zu=QZVb10?3Y*~q})7(4sj2R`Ik82+ctkQ8Hk*T~HWAKtLgOIPJ<5I>8`hS$f5 z^Y1o;H-mP`SDYL>l1FbBn^#&aW-}2th1Uzflts1BtupxRI$s~e+rNKw7~@`xE;e00 zQzN`(otz>L<-DUeU$F1vZ8k zVPCJ{mo_kU9(E}Jb+C{qI(m!S-a^Em7W>bbtXhu+o029;5+1M2;@}-Q)V3E4H}@x< zE5Z(hxh&n{J(l=~eWjm&cX%S`Rk)6enK_0`mUS@js%L1Nxn||n;v?df=rOWIIJ19G z-Z5JCWO?+B8xbDgMrTr+a6wDLx z>p3K`o*OJ~(LqRphl<5-hQ>!Xe|OnWR5TX_KQJCClP_qRTv)JxKXY^0ctdWj{0{(T zxpnJS9KXGdgTuT0QtR=r4-(va0J)Sc1_Zk}#I)2TB#A|0w{PPWW%TDfV2^BsKrqi@ zIQG$2BYRee;lq}eV^x-$VL5TaDUx?qd;qagvDTw?E2Vz?H}H>=lM0p?JWox1FjDRg zWqGLrV6a8}Y9QGCN<&H~?DkSn8u$`JnkIqaRTb!T8=@A0n(^Mf#3^IUIZ9+@UQyB8 zcL$6_D_`EX!+Pp{xKkI#2h73Ln3+AYUfZEb7iSv&_*{jJsWpa0Hns~O=QxCvFK7e+ zdy!=HR4`gj#?8Ttl7s{ph{FLK$$9tFD8fuw?&h4Kmf76geE!t&iok>fx}qPye|!OI zS&8`OVCw5(ZucHNl8LX>tKj;?Zg#``f^)+B>rLEPZ+OH=O-*g$!6RS@&c5H|FyE(d zZa!RKIkLO!X5kH(&4As~tkUI1$l2|~9zfo%D@(89ep6KMM+olSt z&_-*#jEN}&9!DuD`7HkH`qjsHoPf`7K{-Xq#KJ-@J}^PRF{nacMMVYn7046THZgSapjD$5q8jl-!AXcf&ee?^+*eK%4iKcpbWmc)*tt1AlL82 zK2U59rA`!G+3M=(2pjQ&UV9aua+uA6GFQ&S?(}YWxp~tZ9)cFdL3o}$Zjh*8`>Y4< zJp1OtWopvc*EA{HxM%K z;$fcSpmyh5B=+EW<|ug!K>-6CdIQwVmA;t!4B9WZZqKXsOPxJn#zEC8rWUwKui$#_ zt*N&(kKJtj3YZ_MufWpW;@)_l4APSwLsK9{;>{d*BUJ?20>R@V?!QMLD_&^nWW53% zDp7U~$|p@<-*Eu0+a}~E0Ho?1@)e-Mj=}a~MNRwzn^Vfj9k4oS3TEZ-D&&(&ZIya; z!s?OGl}T;Z;f&%&BQkjSo+;s@uI!>Fa1zq-2wMzwvaB;SaadRg%B+j;UguC$RMa+J zdc%8ccBDdN77BPu;{;?J=f*`2b}w&SfMrW~BX%?X_^XwGnl7Hp{EscX+753|`%r&Z z<@0dc+nzGA(_)Wo;DDs2ys!=cVVV1!YQyX*nL47JDV!MWX&lNC?Pe}1?yszg8cvE_`1jn7*GslO{ zc|4G}zE#|VAuu!k$Hz9{Y7tQwhxglQDW*rr$^JE_PjlZr7*pWm6Phb{M^PIuv3`Cz z$Siv4lyXyAX5FmrnhJAHeN&TJ@5i|J?@gSX_$p)pNC8kZsw)qH8mW`_*clCDG3}X+ zz#Rd--wB9r-@0FBiMJ7d4wRpnxSc(#w7Mb`|HtIyO$%V}R*#gf4FpxVcm=i4H`HVp zuE!GZY|j$-ip`+z!r2e5N^~ZjM}jha-#X!RmYHVA7>gAa7stlLt|)%^N9?y+L5k&RW}xZ!lEV3UDISHxu_?#JVT_RSN@yiIyKj$y49h*Dw(Ieq?4QcU_>cjKEyjNvg zFv*eJXy|ujQwvzI7lGpD{Q%Xl6lj>Xf)e zZABnnT~ANc35$W%p;x~6H~rP|`cEWxY+FE7^{cITQXFNme7XT_(a+?Q_5Ntvz> zWdzC^{@$zCuF+n+C;D*4Hd_lh*G1DVuMEKsnbpD zBl~d8e>&Vp%KJeK_nLW@>FBMh5{5BcFhj_|>)95|igt&V5YAWnah-!~&Xua|PNWD6Z!F1Z83w$1 z)mT2p*cD`3X6(BDQabo3Muifw9TF_yk`T>hc@)H1c!i*T$3<$5OMYNFEYvIH$BsJ| z+Q1)V;-aT!#%vPU)+7X^RD^hFIhqzXK1^8 zp47#hI(_E@4<_*{gi08k7Rx>Zlbpv}vlQTQ1R?jR*Ua#D=U73Zbtg-nkKdBj>n$fr zYi%ukA%pLXi0ldV?b4Rj0)kP8D5_{p7h8AtqGQPQMFAsyePg0wU;Z=YRZY#F~}E4)Sz_IVhO){o1dChne2eKE`F!x6XpgrS$_Ei~yz zdV%SJ_qjJ>=K5S%<=&97qdw1=^0`*uPthHJ zIKiA!=s?SIDNjc5hunrJ_x-wIM%TA9Bl{_^s56Ltymzn5w3YZBc&+KTL*)xZZyfH# zm(I%S502Rrf-t{ZJ#k)_nr0NU4e^7Mo`Ji7iUmi*I(a?U6^CG&VT?5z^PM}YeNSJ# zqSc*61h#^6CO{P|4Mc}6VtLs!AdoF5;WHo(;J{C7*pzYTM>#;WdNa zASAh^5t0^`a-S@RL~7ZeE<7eN(k_v8khb2L-#VF>U7t6%*;m$j3xm0f9=%WT?aB2X zPo3|Z)Qi_1;Gs*#Q?DAA3Ep5H?9K@*!fh97V=+n!)$@BNc?XOW>ip||2|iD4%T#h< zSMErn8~UM}yX|2Gv5W`c1v8=&aWtj5QK;7}AELRXx43XnE36a7;6(f5&e|mx_IcJg zJ`iwkbZ?F`5_3@2xWxAY*J~NwPP}yS6tih-3(GxqozYKn+iGZrluD{;1TYTT1WZhDoI$!U9;27pp(|5F2{ixS6a;sm&b0p#q6=KT|X7y|ZkEGaF|7HAn z%2lQcg@yA3O0+`nI(Uy^oM@4QUkVsDlyrF2;PBlJt0n*y(N9AIyYjQtx{p7pCi>f~ zlnTH6djIqTfuO1HNj)X4+QAm#+WekemvYXJS1I>&fXjOLrBHUI34sE-$$mq&{>e@u z67Iv@SF&ljXGkzYPhkBSORPy&PH1KMc}HLM8>8SWKT_EV@p;S7%k!{%* zOw4hcX~3xibnkFFmz1Yizm*E^YPV{@$_~xlIiuS1kfRwJaMt#4!5PNVm(E?9_?9zj zKme|sqSg7btC-3aM4q2(fO)7VQl6r{!7DnC?(j^-QRk?^SEs2pPkbvqBflY9Z}DLu zi$e8x}ES#bF=j$p{_wwqG1dc8W4)MzK^_FEIA)3ELOfQ_d z+s8XA5AUH@BF_FfO-3=wXUR4TK5hLXlyFEcx=6NmY*vPkP+`R>Uc)57t7j@QnVt={21&&s5!bLTa7!+z z1VGGU2kF$uU<^f{emp3AHqS!mGxV0~-o?W`Wz6Hhx2go!BKQcy>Aux3KEOR^xhUv< zzbd~?tMz@`jsP@>fY_cuP1?3WjehENdY?vcGw9;tsrN2zPO#s!uUSoNv5eoCGHeO>-PxD zWUnH-`MGEts9OyQoSjY#VTzc`IW?PM=!~^%>jtu;m{PRX%PdQNgh|hXr%j?Wvwihe6+Tz^Z52w@UAfXwV3aEW(4RU+8Uo^ z4GgxrZ_t5*o&64s8Y%6vp>qZ?wl$0_mukUryc4e0NqA8ZP1dYRR#z+- zdFbw02n?tBUpdGi;(TU>Tc@wbty;gEhV_sXKHhEfKH`TpuEWZ-_NH4A!`fr`at8lr zY}6p({aY~d1HHu(S+d6$q+SuO?%s<<5}K--u?MO&IaNFol!0{Caw%QNXFkyu=Y^`grnap_-`DaayRgOCP zB5AI-xKi&8@1v7+evhB^v_%8HwjePD1)YXTn_s#t$i*&tUflT6r;G=Y?x|0P+0Pzk zTee5HgI(*JOI`b7EL1ch+)!a>@pr=0cT8 z%-HS;gkF#;0zEu~cq3l?(KcKv1_l(XwQR+TXL>UoZ6zz6r0`&cv##%}vFcjc`%S2{ zj?oIzkdw27t8Oimp=UAL@wVGxZ3ps?ZG;z9(6jid<`Fxz)vd^t70lUO|Hd^kiXyVI zEYqZ~_s%S%A+pF>y)(wTHoy2|=L>!f2AA4gI1kSe!t|09+IBX`QDf{RZ!r}5@~*DN zr$7s@!(@a)0i@6(U#`g!`zKPVo)o;#8PnInyk|qVsr0Ot6~5ci>M~;n$r-Wr?-m5t z5N^r3x~9qH#spK;6#PC~cVIN~DQnDw5~LC}@QFmV2ewf%_4RAdW^Sp1lXSb;C49&4 z?&l!>bGJa~B7}QuJJg@w);zH);7QNJqr@Dpy01cjIJVWy#KE7h<`;tY79a5qL{3*! zr$JWQ`k`?B+?Uz(>c)N5Oc_xAP!02uwscY2+cbp93TchKk?g5GSqY9~HLYM=(vupW zTjg<n-o?{%i_cNpQ z3T|t{fmt2V96Xcsd9YWUK1Z}$O32S<+F`syR^Y09UZUg131lSkNHVLy`4g5OwjkVz z$V0?h^PSpzuGO8d&GF&&w-=Mg+$c|wpn9W8mNV=tQ#~jk z-$|IMt)pb4^x3SpeO2rteoDad+TLK@w1WPR`z=+^@dS8YzMfCIzBv=hO;PIF>qF<~ zZ6gKHOrx2$jDsC+fC-@cOm(oYLhAs z4k6LK`(>``kA^mX&30;ab~bs8j68XAQKaGvF7ZeDk-qk1s)o9WJGPlTmjm9OCti+w z>Jw+Q2uCTQ{Q5<6@+5tD16%1^RNlm-*N7Nht6#k$>Lm11LN(b` z8SDhy&Ez=E>KW-f=_GP9A7qWBT{q%nXpST+@W0>qJ|`Xj755nR4@s5u-$XRJ%-&s1 z{MRgYqfYSiTd>fvoG*k|X4+?*$Lol>*ovzy<#k%edN^@ST@5xC=&n}WxDIbC?E z+4p>n9Om!eao@LS>l{EMrTSG~#`*btYn^L3g^sN`hIQ)A%`(Ho8`*lKu#hdHIE_>M zs|goEZx0O(0c>G>e4PF7I`~I+%pjK^sZnHyl}LJcNXcAEaRo0q&H2ymEVvh^W+wWv zH$*@MiqQVp3-Q^v9@{2l&Xg4{YrVU-@AgS8yx%v=%Ih3j_9p&rF_3F*VezSWRaOFC z@QBkXiP9@ErlMOkHOxtYyzT_EoSeYsulLOijEti*?SVorr8jXNw9?)YX11S;@}7!j zO?@XvbM?VDz6aAf6HPa74amQ|_;jeXWYM90=xg_y{PJY|W}=wT@X&e)=iV+6aNJ5f zoH=fR#g^l=Ji)NBN6q&scF&(Rf{5K}w>0cwVs8Yz|94$Lz*c?i!|yQE2tSpa(zW3% z{;Btj?#2t$5M}xe*u0Rb5WuCLxpnoEGNn(4{?;ZngZzNV_Ke7G{Xm{=1D<30O_>*` zdC!tNM!9X*l1miHzwZqTiM{-Qy8m9SfB)|7m_@2LYik^7SubOM>YU0rOCjWJ6FTB0 z@Wr4lF@C1zTmcH>hm1UqXx6`J)NVPS&Q)cK3UB~JoWu3Qd? z6UYpd=C)Ck!>M{eHk5b$!v_~uQu=vg)`)Kb!8mfS`RF61iyQ?b8;n+I575lWv74Fe z^Ow4d_R=5~S&W_d7(Hyx!j))4LZ9^ch+9c^T0@t&8p0(*f*lw4+tXIVUi@&iIh^L+ zysm5Uk>7_#{;Dkf9Wa+QbIBAx8HP*MpEEm1Co2?Zx^4(Uk0fxQD5}^^hRbsddZ;l{$!;>Vn_uzUv zujhSEeUpj)UrH2A>DWg$ba;`@BRVNuoIj(TWSAXUY$ z-o*pTD`^R#Co2O*Jmw*lNYNkWRyiUO$rF&yj6D>`t+6~$O4s$*IH8n=7GakENPo8uzDpgFz!N%6#9d#U$ zrT1Q$k{y+7Z00Dm<;{Pj@!|SieZamx83Lk;2aB7p!fpNTu-2>pxaIHvv2<(7%*d$u zrN@vn!z0B-d+Bn*WfNeP;@0M?w*a&FDK`KIaToEtH8m#Ir;hbW#K)js*X}2i2aIqGBU~7|RRsRdy1Nhg)9AZei29ezmS* z&w+vBgL>w^WBt{Wc%wy|SszdR!^%&@m{bX}df z1rz_dWGJ%Cv`OnFZU;6z6 zd)dUnfux9YgDgEZGJavFi8}x)a3w|!6KSlH>+ww=Sme2&)}UmQ5y@UrZ2cwZ1u5xM z^Y5i0FZ%k;JBN6fCU-#xzr_nhnY=ecg461f&U+(v*{pL(@n=0jYLlyQ9NtM-balqjKTG^!T_=)BDm= zl65uKh);jbqi(?d-ueDyqHEb$uC-<^vx&iy2G#w?{FFg@^c6{{`tYak}>=1 z0V0uJvunecG(0q8Orvy$ZFpp>x@eE}z8cqX#()2)c&$k>yX4Liei9Yt%wZTS(LN{_ zay-hZ!`q_kEV51r4DbFGG5IsX4GwOzrx(j@XK_TC&>U*pnObitx{*=}MXvFWOuN38aMo!7zh#TgvY6tqH;Rt^{* zBi&)4c^O{QctCGW+(9>F#=f{a@$c`x<mIjaKo{__`%kW+$^ zJc3Mt0iL6?v)?4tGZ-nXKtkIz&i@o8+9JV4bx3zjWjeuj-bA-EH)@PR=AH7yfVW*T z*=OZqe|w3{ASTHdrfXPvn!d28v~=|_O?UOo^4j@(>{?+)T9tBdJ52Xb zlW6Qi8^_BUzGVf0$j<0;8l>7yvK1F@>RVgWx;p~4ONi-u8fy#p$4jom%YXHu94{_U z%AiL8vPKpd6&h5$e+}*JoQSzIp;xR}(sw~eargq)x1>cVk=gkP{;J4Q(|fR9dH=6Y zmxb61ARn-Eh|?J%x^bAvB8%w9M-;V`S3~FR8`r#mxDM`*T1E-dBLE0Bl@^=5PCozr zCD$Lz;zIA#s9Cb@ZZk&LMu^Eg6n^oEVs9gc6sU^^YSzikl9OI%{xI$Yy%*cl{)y)> z-TY_nUd56QW^ja4%;OKK?9iEuszz!X)pad51PUDfHoe2l9HePjDdM!&!^7Jv&5)wk z0_5^3_r5pm8Ja%zVxuo%hNJC!tv7RvMn83R#fQA-2xi7_p1dsK`Jc)1J3zu8Y#qDN zET}9cs zq=`%A){OxVkxGT>KKw%1!u9R2hSLyzTXbD;kdE#lEX}!q@$z7h??@OiG^0Ro{4|X% zlVzwGwI`>z;c{C&yi_=9%?#_fcDN4k2?de*)A-9bf_pAi*aATQYL8z=gTc%Y_)O7i z&7r=nXiH;p+{D@sJD1$T&7{^dT0*Wxe9uvQq*vqZ&EB}?*Co$h&)m{6OtqW+(35o! zJDri6yS1go8~`5xBe=rL3$HBbuS~U!xXf`bBhPSS9X+bT_F5V1+(lFS7gKUthfcI; ziwmiZvVp0_%g~#Fu25s#>|pVUx!%R+C5H-UT1dLWEF`=kE#KA1P^=F3o@|i8Y@p~% zKn#Fi(F<>#C)?zi4>~}#y}!SI_16(m&lJ=7+`Jd4BiF?dQ^%Cu^oGkM6to{FIiI?d z`dAx1x)*2s2Or44lSOXkB;39WnQBclfuaxb2?*fvX)S%tq}h~cUCjy)cj&x=zHp!i zY?_2j-g}h}M?#DXy}DuQ-!nH3P4+~`SXzzUy^h}^hM_@Au?pqLExMj8=qkhX?3tZB zam3Y>gf^`NkPj~?6oJ0#V!<08w^6ak;Xbg>T zUgb7f8hwPJ@Y@=H`&A9|N21)?EB5Y8HDg5w*hz@Mw^v|a_{PS@np;|CS>Lch8_?9$ z)U9~+8yD?BvGuT534J0wz|1%+ zc5-`*T#keq-Ka@cx3FJuFyGZ|XMDf2nn{oQzYvdvDFfo6js8ZrJ2VL{EG$6p*U6J7 z{|saO&oIAhJwtTV8uYmDK=}E{^RXNCPU_Qb7o4g8s#^HG>?w6c;& z&D*nklet-9#Hu)nw=uTk+-FAy16g>xz6VvfKrQsMFj&o||^9cy7e7>ov87uyHjZ{=Gt^4@jb#YY4lUc|3>K=r&-s1E-s=14L8rt-*EJUh@YxZZ z!~yj45$_Q%V@1s4OLQBd&=(mKBeEyChIK^zHf=s<*wuc2zIo%uG3R%W)t_T#jvFC) z6VZ_(2ilD*Ijo!|zV1cD=f9S{)+Fv;5qb2)3iTCOk=xNIJwh9Ex8jmAWsJ|cwV&Mq z->B^LM=KxK1=AJe<=IRy$2=9S>JvAcUO1_emDa{3&Qa@-WlUl67D8xkc(&qv0I1-q6$@6T=c_|N513e$9BR!biviO6ZI$gAGO5+ zS@Oep)02>?k2XxjRoFQEM%gOD$}y8j4>!XWy}~i(t}CcaM^v-)LyaD)81lTU zr!J?2YT&g(>+tMbF-J0PU77f=uLYeus;a662L%`y#F@i?gaHa35T%ejZZq35u@U|h z^71a!MXS&7COM#{DiO-L#4+cI-9NSwmenAqQGMBQL7U&CEso-{v6Z~x`BQ$cUTIlb zS-H6h0=`*c`p+Dr>;+~`?&&|We)r2t+xoOAA?g~)Hh$2qixw_w^Q0YaQ*VyAWlS%a z;J!`~cV*_=bb_bH2ht53hW-70cvGqHEw*T!gfWt^T^&dcd8KXq1B%0N5P63sn0INM zb@eBtpeDw)$$wwYkWQyZRG0QOW!bPD$#uFQo{!Sm-Od z6*&gA_{dgZ6Od60IJ_u+3ra<~CyNpNC2p+97;|$fbF)4Vceup8YR{e&iH2A+o1mxw z)r3jr)Q$jILe%rB4A}pr$0MX9=soL8Ylw;zfMto1J%OjNgXu)%;u{{8kH42;PObnR zU!8gmyVn|TBkm=&;fJK=HX6J`%8{yA50Ow-+bWVEV@-rUeON-4Z} zk5c36Jk?sew)A=9GVjz6EidE}$>S-}f}WRhgu2yK`6A~TRyDit}L>xeB2zkBj;f!@kb#cx$FZ9`C~j-L|7Mp zS_3mfWkj}{q@TwVP`IaL5`JXpND71q@WvlUBXMV;EmC|+%FR0Je6Oa_9y}r&g1{z$ z(?Ea8Mv9-JB*lHZ_;76sZL@Ix}zUH~em^kk$Eh>s(GR$TjZ;#VlSCI#zV(4%Ofpi)n!MJ-jKM^78V$M-G zL%JR8vh70BN;{roP)RdOv<56_hfzxK!@12tI@b#13oYu{s$XlaFCAH?bTzG z(O<4mo*G-lN7mGRD+O1owN&u!`TU31F81)=;EL|8nL7jwy>;>l(Kv}XWq3!>6{)JJ z^_XRq-NGdvZ~=g1VdWE7eY`a{?|GeBZemOx)Qdgw?oKw3ef^20eea~8`De{DAFb7q zAW6LY5sXum!}+>6sO0pS@TjPFE2p{8joT#B9qluH&Z8C5I`;BHV6%8-X=y1C!AsW> ztAf8$0}O~iFSSkkXMV;mIz2*v*{Vnu9mQiM+LIUO0tLj75H)?>zvO&s%?HO%U7Uvn z&u6KZa**Z^EXj9Iq0Zt=?88rZxSk0cXE(RqA77qn<(b};JQ>*ucRf%=o8gd6j2spK zc6N3oZ{2D%;-OhkJR)j_NMZ$>5gCA39^E;}jhwf-F-{AEf=+igx{tD(cLaZseBkSL znwC~BXtcq)^rKuJs#d-n?AJ7)QQ>~owPJc|)U@8i_hA6u8h-wPh6bRmU$8r;$ORsN zu=_T(pi>Aw$7TUv_tpX_CLIe-Z$iDl`3-B{qY?PP53}PEq3K=3c%cF`b%uMAZIV&M5H?+bfOp15Q!YG?Z&$dIA~$j17o_ zb;8X0^oc9B_pPihUhnGZ9>M8{J}RForTUIvl&fV|oC$|XNYNQw%T6BGr9VYWyD&HB zI@KHlx91C5p<+l~LX(1QU~@6WRh9$F$oRYMDR-iepJsm4pMCRkW}Dy_akj{?>9a=M zz(St6(uDPIlY)3$++xoBs>XOeoI97gwuF z^u=+6@LwM=M!?@V0j^oOFU$&NeG@MtF2|^K7KvX#z_^%jUpUO}%R(xAuV5zd)_+zl7z-)*N z^yE3vsEPtR1HUVYZi2;H@%fmLa_s~RGZ!NFI8 zC8GC^BqoGt{H}A0Y~<+Jt-cdP5a{QD$VA1cV(uB=;I50tW*cBf|nou$?8 zrg6UNp0teJ#?p1tGn4hmrlrjvv$QbJ*2|M!Q6X?4%wRw~7yXwDv^ETvf0Wx|hDj*V z)5PM+zkTOUKyYv{wEg1aGn7$<8N~LP=)zBGX=yFL zt!`-W6U_R(vB6T(66;j=5Yq-O;_fBA6u3v+*C%{CjQ6_JtpW$%DBvgp$0iRCkH4R_ zf!3LxzRy_o<{OK8wJ<}KwE))*l0gcQFh+Zu`fobjPjtT==4Z|_+C{8Lqh{<>EKPPbw{^tB3C~(JUkrG07!2MLw&`BA&cn;-I-y{WFl4KV*=I zqGN7#Hgk9Q-P_kJRE|Ga@r%qCzc1Prto`n*vs6$Z$%kw^dj{=9{=tUl;-kTJAqxG9 zGMmQQ`@BW1P$TZ^|PdZu3B(KK9n4iG`!W6xtc>N#%si2QgWDD^xbpu}#JbjvV)m-H=&d59<;(c&hr0h&w!3^M>emgAogk`3i$EtrAYnozESF1vlWm!N(jCgA4VyDs*>@ z`?5xyHEoH#KGCrI1Y7SDXSr^KhQb+2mnV;U%H6eEssQZJrLu@a_!Exu+~t-2xvTTP zJXy5lpxRzMX!G-C4E7~snTqP_rd_9v1)U7a=ZOkWSUm{y|Giv2#l+diL>%LjRJ7Yd z=BKfUv?kEYpxSCY)D&A^0j-ozap2CYgp%?7w#gr#g9T%FFJIQlG5$7Q=P{4-Q~CiJ z)CHMeK@LXR_EU577$}j^Z&1S*!H$zn!|vP^^BpOSuC3hZu#JS2U9I(aZ9`!Kei95@ zfn}#jrQ2$=BK}pI<~CHV;)2TW32BHvz+J^fa=ym`5S6Go0Zk^*@dVl*qLFx_tbE4; z-_b%Gs?TH`n`8U#+@{_(JOqFV2_TpMIlSWz78cxxOe5o}`-JyR`?D!_RCQIj8#%yf zk}-#FN2Z=J^~S?Xc7aCzJ`Y9N3svlr3HqFitOXv|rI|%t6pjs(aG=t78KT@bkKuM1 zg)mE8N62wOw8G<{E)|EIi@Iw*Dn?^s`WdqCFQ7?Df9+>hFzs-m^?1Rp$R-Y?RD@Gv zKUeCpCzuW$d7)ELljJ-Eq|zmk*>3Y;&zh^Ppsn`XFG)aa$nrjY@!v~TkZ0$ZH)@Sv z44YohDj&GDVnA}=7zkc2*%&22(Z%BJau(rr7rSJ|Su=?%xOuEbWULVm?Dx0OgZ*(^ za8}G?2fCWt3F*;@=@OvLkdD7iEMfT1t{j)u`T|{{%WO#x2XZe_6xlb4*)|0WZxd74 z*$#dQj)>8KCuKx=3LmuMw^Y^Ka8y=44UW+(-jvvJRnGr86rbg#okw+-Oz)o@CgJ(- zedC#7kY5h)|M)xMd&#s3kSLm(hQ%*55tpxP3M@Z80J(|f-5vEVXc%o3;hqpyeP7LM zsryjHMe#(7z-u8_4hmpGDxETyl1&hfeW9gUzA@2|Q$X}%;n_g;YXD@4n-nNT1?wz_ zXq?5{ihQ`7QBgE|ahQbff160Gkn23)U9?J_I(~eab6m*vSZV34x82dm`D$vBbFYfr z=y#;L=D|{3w#2iZ#>ssnE2y&FO0neQv7Jg~S8HDA$+ShRAAkz3ao(0*9<^YP+^;fU z@08C8q8)bHD}G7^az3gQ97Ln1k(WMUb9N#F*vNhkJC=MJnFs*b6@JRFw1%)lgM_jE zIq`~tN6<3GJqi2vzfO0c!ZQ-=ck+SBP+?Nu+Kb&?g%)!jo};&d=D%3lZhR!5;9$jr z&chGzfP|vS`Ahd3Z^z86>K%6dwjPw&SA zYRV&R@zZ~7-xEM!Lsv$0xi$!7@c$x^>dMMxSVx1j%Um>*@bpWxhfAhsryVzcd?ASS zp6G;PaWLJ^664a+N2t}uauX{?zoRARru7T7f42~>qW@#^L6ak>!$gam%#oWIl>mp|VDRQ-~2hE7S)#*AVc^?*RP+jZ ziPQsBm0ho`c`B87tvu@59=(7SE*Q22ICvKfiv119~&I>{$k#I|)ys zIl2F74q!5;O#e}&=Y2jNBYXvPP?Tu@|M_=S0MBK9u7#}UtZ(7}IhUHB1H>gv%u)T0 zi=Bkl|1lZFiHTp7r{}d>xX58uEr{$=((2p#>Kjq1opHBROpwC>xFZRZs#p?KNXrvA z-cY?kbAo@5QiU_eYT;rmc!x+jN$5joCXVVqKT9!ca9$3O%NCO4z47edk1$QsxGL^} zb^iE8o5OSlGN?+J#;71c8h=Gn0HivVC!ws{{y!$19;FdsFM&?-XW_rjl7(d-{HNuC zY#lp^7ysv3j@d$r5@M1V#pC}!|IPpqzw3@?e+@t28Ya2$AM&5!(>xZX83+B}y4tUG zw6(pEJ&3q9Nk-n({d33E{zQ(OiuS*xXa%YZTW46PZBwWiYX3tYu10Iz2r+CMGr)G& z0~X5r>>ONjsu`9%1dRlD{$66@MqELARY|p@Q1K|HSNadtRX-h53)CfQ+S)fp0DLQ2 z+f`c|-1U>Hc}(fnzl6$g%}QHB#6?8L!I|NYbA7LJAJefJYEFbi!)ckj!*DUE;q(r<9^w2-Szisa3}e-{Jr zGVG!>NXb*%q45Tj_VGhUG<8P+k@`Pd_GXEdFKpMw(BU=69hwaMD|g_B7B_JC2hepC zK!8K!Z*9a?KJZ7Gt?9m#utt_XS}=;?!O z^|2Qkw|HxUka^x<*c-E7e({u&LnNnODx_TklbD5CukKckH~s;tNL>?S=g)Ds`RLop ze?HR?wlcx{3W_im&uLI!v}XL1R&+(bcrDqa5!uqgYgzCXf{%KYi=$pBZw@QeqYH3g zK0-`8IBEYZer#0arz>Qq6%kGNjJg#|d;mga%V!nHQOICaTd@7bubau?VnK~rJ&Rbb ztk{^FN6Rk28OTZ{N74Ud!%x=VaXx=(4jNIe73*VA6%h=Ra}L$}X#A+knCzy%n*|ZH zo=rki>H!-0rAKOn7-C$Mq47QTjZy~V)#!iw*z>LN^ILhsL}gOECot#&pF#a__vh`F zz9)?w%e0NHTFuOi0I3nRI^3)Vj#_bXpIM5&h(vO0d;=ZFJ-uAL>Z`x*RZO@WmzLqO|_49;n9^IL4P}-_ru@Fplbk zB(n(L)>4DFs0bIZ{Il!XGX3i+;YU0bfj|KESe*Sc5H#38djV8${Og#wa&E5?**?5} z!=Pu7j70;3cN*PG{urOI@82*J%&E7`uTMdl*1}vg^w|@^a})YWbWjnFO;Q_4pZa_1 zcIwfOqF-vVEu^*+emT7CPV=~z)zpLuTwI}B6WZDs=+J@W^ZcvTX&mb?Y%dbn=w#f? z%K;Bv7(X|?ki(15jta=w%C_vPt96_3Ir2Aq-cG)Cse$;8htaaPnK03WK0Ps!^Ya-= zLX2o{*Uz`6AOGC6Pu{Vq@aIuX@wy!!zIYZj4cCIdSeVd8T2De%k%{i*-9o#4YGipQ zc?g7E+W2#BC-R=k0%8z=1;WG%uU3{PMIJow|GeWcb>78H@Enf%L>&w9QD@eAtZE^i z33>)%Qs=@MN#H4ujxTe4{*U*YC}c%=zM`$>^n%@&d+3FP7q_^Vr{n#=Q{Kk(@{5DB z$f%^SsWGWNF+MN8-+s%Jd`hrbe#&7RqK{i2wAIfMcR5ijs5fAV(~>QZS_PkSF0A*y zB?29p{NW9Yp8rV9F;0M101PIwAHP`tA}YvF3wec7nhJaSd+Wx|6JQ>LQi=TN;sK?) z_MF`3-IkvH!|P867oWM8snD-mc)1cH`;{X2y6~Of0+7BI**E zhxi_B_k+X->?%{FGG=}0(JSaAn{#L9dh$Hwnk!dMr4$)P+_(9OXZm}4K1C7xcc-)Q!SQejqDp=;F^Ifyda4Z!uXtxcl1K`L;`l%J@kMRfUNk48)Yq zGxM*ArSVR*Ha3bs0x}<;=A&%v&^nG-jWeVje?P0T{4SMn+f=vvC~^`|H`%9P<_X{d z@|_~HyCHkRM+rFn1s@KDIZw4LNm)B0h0;O{W*GW+Bb9#7_(8{3)5xPFDjZ+bC}vE^ z%F8B{e;JN(U_>N25hOW5mm!Ds3rNz?0xkFP_TqYpIw9Zb2Os@{gW-LVFUQF-iHrb5 zRa&67I#YG9_2r9UxSb}ywRs$&ujHf_#*6D*j+g%= zb4uTze)Nlih$bba;?oK_TU|S6T=yQDJbk_myw%xSMe;-&`?2P#<@LN)uG6#7>_>1p zduH(z#uS>y_x+f70;WSGsQok=<}i$EA3B{P6g0`4&o+3Qn3>L6i=U#Ve$jUnV+U=p zDjcSB*2}KVz>j2cmKL#uZQL;hV~oADc8lxx8|cILBYU590;~c$PE#r@F=_f>4<7)q zH(tV_ae^h!@}VlCKoO1XDa(zOkLki2>+$ZDsL=3zDhAjyB%8l}{R*$t83QiAL{>-j z-l*cTa`P+R$L1zF6Z+?gnVoO{dUrRR;-Bd>uk2lzkUA%18iF2?9$MQoIvIJgk9T3t zK)B<BsLZyi?UwzUs0L=XW*B`pwCIusC)4gm!OB&7wB zZs}H1kOq+w5RmRvq`SMjC8R-`Z>**JoPGAYf7kW-m)G8|=b6u(V~)JXJ@6J62SmkD zxqIe!fc=F@0R-3>$3M^!a?k{xQW+9u)5NsV-y!I|3y$F!U6Re0j7NA!HH+q)JZ>&^k zhCD3}pwPU>1$_1LC%mq3Cd# zZUD%VTbw!ot*R?>x08<$@dK{0GrN21^i^O3D`sk!T<^E_rcHr-)z-o(r@iG%%YuaY z4-6`7x1*l99mqZiRSG;8;vgqQKcWq(h1uEJ<>l*_FAIEOR)>Mm%5c>Q&0H36vhk98 z5Erip7(ZB4R0OGhz_UPc z-PQvOwJV_ufK;1hC)ruP|4lOmDSe+!Qn0a)MR}ZfymbRMlycQq;5z(IRTA{8#VxN2 zK461{Wn`U$Wq>WF;`;*qQr7~c>g08FG+*Ywg51K<9Bp*8bs%!2QlpOe2MJ2D5L){0 zt)^sG^(!nFdj;I=A+KNx4Pi)>EzaDmDyOYk8^EZclfiaxeH`{R+>wwO;K$3r`gd^B zHmVZJ8dktkPiPzN8`qgCyry{i6x7L)N%i%dwyK_Z~o_|O^9@UxVBNB7ix zTRpfF@5YB&iKagv zFQC?;)t`|&$`(oBlU!8`35%sZ7Wngk-L#|3IZ?O6CO_YewW2vmyaBN1En_*d$%-Wb z3=9*uGoMBgt&AbV4jkMMvi{{>=8U z;m^js^z5R=&Z$?M0wI)sXV3#=G}4bK@bsJHR=M1csJgiOC>R+f85>xD$Qz1^(w~Bf zJsnxyNFTiT{i!AyypCz2DzGLVBPIO`o?aFra?C zePj_8mR%~kYeDn=S4N?BHeGnj2IpnO82AHg=7CDwH76g#Qh_l^HO!93mt4p`NZ{Qp zyYp<7+iTGCkh}CGQ_9n39-2=ISN{GZ`08!ZUGnSn8oVK7O)WV3BSrFVm^)viAeUOc zDQ1}07D{t_DC%{c4w2Wz%)7S%Y0*7uG+7zY6c^AzzDueucjOX0(-4qeT6NV{C zGvQUe;s9FOK&48YuVp+N&?>h0tOgZB7SigJ`WY|oV>MkA9ejC5KyejaW0iCHPZj&( zk~Z^IEgU5G-~X;wF)Mo7M1`{Z?g(|5;(I^8rsM{Hg3^i=D$fOp0V;hg6Jmp*)hp@Qy@vQ8@6ete9^Z=#GC z)7GtsUEsD0eyzjKqARJRTONTEtHf&1%g@ZU|DFsgI9}%n^>xTqNw1KQq;%;4Y%w@E z*bL^NQ&Yn2yEj!Gm^jg&b0N#`Iw<@bR9rkSk6*^f*(rLgb3MkU_I$^ugdgEEuHshh zK6pmT13eHN8*>%e-3SkuM6_rLd_+#_>0rO#;XsIjNPTC*zEZ!3Yplag1PGvbv;si0uOF- z+HP&lubtwYUc{qy)FCfR!axoSuLG7!Y@M>U_|gG}8H}Q;LUSRgV$VdMAJpbav~g&$ zh#L%0d+igfIdoMu34`H9qwAVpg(Ql2dAP79l?ajK)hamJAF8C23-fB9git;(=zYv_ zOIMnwu$y(IW#yfQgo>Cxvu_C1?UeelF_>@h^N7n=*tW9ayWPw_W$q2$j4%2>6g!Qu z!cDzxCR*DZ2Gj0^C}z)>VhJnnwN|$*zjCG#lm6KH_CyZ4l!XKZA@h!liT=~S&2?u-M&6j%1RC2=0Ypt#dwvcQ~40wBcmz0#$ z);vXX*oyv$L~7Auy~dXAgw;=|4bB7Jyws%Oc~Bul69vnDPY7%DE=VQhe1u z`%J~kI+nK zD+Lvm?sV-tLONxim!nL~GT#Hs=cr`V3(5h=>F4W0X+Qut0^?=_VIj@`3%%Qfu@>;6a<~>Jp!CyFQUB zyY;f6y0%HgZ)xU(4dIiC@|Yh9uZHr-8s0CC6zJbxR2lpJHNk$zpt^OvgW^Hd%UHYm zgQK9~LPN<2=C{0A^Q~8*oqdGNnS@rNQkUqf-9xP7Zm}@hi)7<0+>U5vKbQJ?JTD%{ zt>eglL^3^SLwJatvk~ST6}hWx81IVu{$S#BvK{G$-(wEfj_aCr+>i`^K2z^!voa`fU0?~rA=<2p=?gysuX{iSbMFRhi+ zFf4S4LQzlf;3BK|>jmfA1w0}jpqf_6X?=7Oh|aGLLSVP8UNkP?X4(*FdQO@Kn3-Z zoCw;wo9&5-of^(p$I42jfCxZ8Aj{>{#%4{u=KFriGp8SSbvsN5oNusYh=x#J7|SRf zy5N48k^TI>huxE)yPIEsWkgM1tVtw3#ZFevi8+H{69Nf%bt6=1`=?5-SPGnnDcsJ{HHhNAQ6MVj^aE;vr^@HPI*`ST0ISDUcVICN; zIml8g-}clx{yDP2>aac4P;rNSEjPn(pdB0Q<5%4P7yAPf=eL4LPOLyeW}Fvy+jbKQ zt;Yge+4#|r`qS+W?k5qRip-f?&I2jy%;wWChGU{w^}P#Z9uoo5^LD0ci5Z1FHVyhu zZ)}Ga7%&U?5O#O2FLt(a1i4j6< zQMz2M#xN*}hKPckN-?v4BRz}~alp$Atjp1?ao45k`qHV*On5_OcD{SHWw9@)PKsA1ot(=e=thomq{nD%SmxTz(BkkyA$CW4J9{WmXib1$xZj^Wv($lhxKS4W}JC5 z7y|Iv*44X9kKUH)Cc?-Sc@GD9@=3V*?Qbz;Gpc=qxsT*UahX%-WXYk#DxJ|IA63_V z7aw`>jxPa^Zf0Dm=?6O`7h9g74%&XS>NUai6`%G>Hhxl*$G7v%E@dtFKI1*gDT|uD zyz_IoOg_0ify?IPX&6`$B3h4g_4jS0LWsha*x8qjSE9t|enu)~wBIhnr-Dg0(ppeU z%Y5$yAc@{yV2Bm##h;yAS1L#}eg+sA-VsiJrBmDR(dZjRXn&5`j7Q^ro>m>f@XYa#1pn=_x+{ub zEs_M>zP)<&GhIGi$L|{6EA5r|12A858PBJt>l_xeu!Pf(4Oa#OxU7v%>aR2Pr*5UF zC}|U+p`pRloPzLAA3u7-w4G4Mn48nRoM;uyR9KL@uFay;O0q%9C(JGRM-XV*Raed%@S)tu0puqm=<W$I7^7DuVh4>Yi>Gp&$AF z5w`v5Fd+NvBF&a8{$@HM*_S5&)yj}qo>AlEw*1LxWk({&y+hxR=cFY-|UK8dxs(i==QnaW=OdWS1(I+Wa!N zu?gqhFV|^X>a{%Dv(NqVJff~Kh)j%%PC=6y=PG+6A`2JXpRin0oo8jxaHEeWpC+f- z&O>)#E+%2LVcON}p!oQI*Wr-YvzkI?fPdN~WrY6tx5@xn`hJDDIC$4KT`^lkLowqc zML(c=;$)J19p1#h|Yi*8G4Pdih)^8_8!VW&6ngOS%>a}Ubm;|R%E>a^o z@FTVU%15Qq?{>10%#G>aRFe1_PG;E`2jXa6*XS~IG467akl0!GWVI+eY2LNg7LbGK~vaLo(Y9QHhjKiTaLC3Exe{FpP?iKbI5sMdDWF<*ZX zSX#;@4`7&z&d#r;HrYYtnG8r;UY=V>Wo+F_51PZ0?`7afy2*pO5`po&{KI=sPU9M- z|J=t)9tW=u)rBr*x;eJLudEcyW>lL|WKKU5szZn;j|AjaJN4#elR&3|?#-;Qq^Tb{ zB-G^l3i}F1xYXJ>3L=ipUlV*dAsZ1GVRl>f4))4YJ-1#qIMW;FAw?(W9OS+g>ir{x zp+zD|EX=(vcEvzpd;54b`~ki$<_QOv_QBg9c62t`GO@T5^`D*xRYc>A5S_&SN;)qb zc&L(wJ-*#Wv_^h;r?iVbl8S3}<-r-@dOKT&+WLi@ z|JrD-&npuZY;3z7E#bvJ4@#}~>l?D0nui;t=ou8V4Hi8($Cg4vV;l{q{%7kNL!@|{ zJTEZYK~t9RAxBb_s8n|L$iB1kv#x9M8C!Z^9V$Z&9Rj+~Mp8}St2~=!3Mdi=1#AJ$ z>I&OKPYsu9$pnnhXHnt6#p<2!T1cAFKT;K?1XQ#+nr;%;*iGn-h>RVhyOTchRN)m~ zzWB+bA;y4o&BAurXIuOiv9@eTKq~K1s((QuH8atY3}HLm!Xent^jaF1?#ORe2XDxZ zZ%v}y^(lMxT;V~2+xdt<07jt{pBA(c8V%kGDR(*?E>~jB!X>uAjyKx4cGNN4_Ap{a zNCb7WAM-UCX&539ct9?Z@j2?k;GP9v5fR5<`$t#w-}5Vvfbp)(*V!7icUOkkVswL| z3_lh;_ojVIJ5hm~$bY2uxl!gX;TkL0(g`aicB;+4Q29HcK(6q=o4ngb{}{TLhQ7!5 zUSl(QJW@-srW+JvEjr+ErEUM9fs-Zt4S~0Y1cB0D9zuzOg%WkkfJ# zH?I=8n6wMD%2*K?=V5#v4o;6jAxv2%YB?Tj-i8;B3#Aa)UVZ%Lf3#ZZ$i$&NM8+1c zEe0_s|I#MegJ2mdN&oT`Z05@G7oa79lJuY($dbVUitkwr4hfN!k#V2+XuqjCE!Bea z^&k6C@@-{gu}WTr3OBNzjbGq*NK*1i(FpAI3p|u@z0K?k5WCZf(_^wIp3ugG0N!se zs?JQ^!6|R(>F$O{zoxoKqg9{irr2B{ntm&0Bvzuaa*(HO@*4L$q`|<9xJnX8(5lmyu}! z7$P72z)%64rNJB3I`ZiX$MaF9wUuudO%l4O)k$Qu{^zMhf3D<>n*JK}f7@44Z6efc z;_gu-zds=Njjn0B!SqT9q-3u>?;NPC#*c39A%eK44Auy+RG9LS81+@5-Pb0T&#uFs!3Iy#v zJ(M%Qta?LrPfUzCLV|{dCW)_U+C;$j9fkPi)5m{QZb??__0(nB;?97`HnvJPRMN)H zj3;}LVyvgegw$0Pb$8CaBCb$+p`q9AI{~%J_{hKo%rN89K^1<1fq#ce3mbp@zv-g{ z7MwS>)ffy?78ZF`FF*tWe0@QQ!W!U=3JSKv%9CLXJ=GUN%8(|lTFp zqFbzsCZthHPd}Lj1qZ|ELg*6j(vuJq16{*Pf@@#)i72eR`heSTo@Jh4vx zkT!FdMK|)~R&L6B`yVp}63MES6(+h!Yg21l4L@r*xUi3$fP(xAx+|Y7zOCVK&lL>* z%eF~;ZKQ90hZDr5e?N7UmzZvmB2*@pU(YF6+nVT?Hwg-}h%$El{BMd? z8=`5)R3?VS_D{F(sJY9e1>e)oc#v;im|k7L#X=#rem7wG>Y{cf!k zu|j-|33o5p?fqQYKKq0zJ~T&~-Lv07Ty1IMC$eez7Kjz&!iSABnW49P6!R|pKc5pN z`o4OOyn(nqWc!NP`Ic09UpYHs&y0wNQjtn~`}?VVOFw?-m8qLDM-28s8HEJ-*xAi{ z$~1~LWIER?G5^IL0ia%d#F>>LW4_5>N#EhlO%Ius;E<$=buF9a*aq>k+Da{GyxvZp zURxuBN%Q#lF9A2B!%}(?Sj630tLHk!&N~&TnOI*OL9qSThx)IF(n$Y2yy#BK=BL-@ zMkhC(h{h9?-eFR^wVgQOezm*x?b)+u-90??3x^?x>x*#?9U)EMNUthxVlAncxy$9? z)WGIy{4a8X%j|om)+%?LjX6;#DipsfxLlA%$v;T?%tAkZUef73YvJoSn^+Et7JtSd$HzUI+1+) z_U-4-pP`T5Pvj-E760d*HzIO<`X4W)ZW*BudZLu@9nE#trG19B!%YVc?XT4?gMp*^fgBOc~|sv0tudqEQ_t^6{nSx;5@PCG1di%&O+r#l>eW7 ztV4g5m}IJd>S4B*>7>hF@23{*EJPEh{iPO%m{s}oj{47^rOlDj_aZ#DX_8qZ%~@~| z)X*EiI1A=W`R0P4)(~dSRh0f~oEvnimhAFNxV~3LSr>{_5_Q|ZmBdv@q_M*Q4(!)6 zON9(E4OrKw8&As}*tEkEm!&tuT9oByU$32aBHXjrmpXMU&h%VWyh^9ij^f;4nCxg>pPblnt{ZB9qa9ElnJ`a(~T z6wM#r2b)Ra<{GVu7jn&5vz&BY=U%ucqCeZ!V1EQL*R(qER|gEs!)luy1Kymt>~1b4 zEGnf*9U_D@(Aldteo^EbI;u}LVjwt&`cO%uk&e_Y_KL2k2`3qeCnQ=(m&(;b`a zUfHO9H5!c2m2LMD|=0rkIo_*=~qn+1CvtfhdAVbr{dkuwY}2tKUYrd|ANp?i&vdZ(tKO zm&Zbc!n_PcbBOmdaeC_2jL`qujrlf}r6uE(Q+!O9yF5^|pl}BPPYLZ=gxI+VkMzM``=;QcHGcDWUn+-ENbwi_HTaLo zHch=~`p7umlL#(ZF0Pg0*=otW5ZE2M@DC7wae7A z`wVVVP`o`lbH@4O9QzALelJb5OiY>cM#rhX1j^dVW))9ZoKBS^_)<%Lncw9pqqud8 zAH0=yLUbHe!ZU~@&|&gMdZScd=5#?y@KI7CcaUUAj;GSmJ=Sj?sEwz3{;pl>1ONDG zc1=%9s=(dj>gsAeuL$d-bvXyuE68*_RG0@Jeb4o{q*7Z~CoC-76>ke8xWKD49e-z5 z{Sf1=J-LQvm?drAJYnlP+Xae8(RPU!ba zhBq*1rv`cTSJ#4L%oZ4n+f6Pw^)}cO^d_?B3q3AvxaQ}%`vC^I|7RsotsjI$Xsb?s zmtJCxDJNF4koho0dY?g6 zIppFUQ8!`dB~*a_*uk|RUE;8HPl}NL9a4pGHq!gNxmcv%B7SbX8=vuWLINDy zkG*KNPRk6^OP40s)}$JK8meM4&@(VIlw6We=`-*X5sH-uC$D;uaQodWwkUHv@LA3? zmORY`qxH0+IM}**M@+Q3(x!sM8$idSlYPM;yebZkZbQOY2YF^}_P+u?LvQ#az zQ+u%7Gwnue|8S;^fmwFiX7>j9S)w=DySr*T#jH6m{5|v(FR|w%sG&P$y8m2+aMO7z z)z10nCCct>ZI&63pw_!b@}tBlpe4>DN%#v!xCmh{!(%!`C2yb-b*%X-j!X|aPV^B( z9V&nH%5&G>-?Jgjun_;^VX@U-?>kagd!=+A$JH{2H+9QSPKx6$?PZsqXSAQzUK%E^ z1w$Z)4x5e!;Vz!OvnE@VK8w@u{k@%xK!^(H#5aaY`7(Zz%zW$MeQJ!7d3tD_8|=`z!+39mRir$$8)+Ge`@kb5RP zs)0>xx4WfeRASi7v1$|?3LloQySW#g@pZ*|uxfnM*OnLHLU zT1Lh%2r7?O!Kq!`!@DJ7>Cs$p>;62LXR4kEQUZd=Sobmk!ED9m+JlMX>4DQI*NZi0 zlrP{K9qXTO9uDVA?0c%QPdS3q<~rfJ;T)oKa8eljj@I#RvSO#=@NSwMEo|-GYI$;m zg#e201`!S5Z4Y1jlNxZs@(QJ8klyyQ-P-FaSh>RBgv!Z=LW!?8h-=GLnFy-g%eF+^$nF3V)EszKZ^$?X$$n&N1 zSbP4XazhDFn}s821Of^kC*Ua@9UUz#3t;2Y`)I?OCnjRq47)#8iWrthh@?lA=Uqsm zY{hMZ?12X4F^nxhb?Bw1_bdVmg8_p92bc@Mc|wgNl!Vwm_&8x$;@CxB{LBdAE-KQV z!?-yP)2@~1i5AZjLnI4(2x$j^Cqn)KRt+RTfQm3QnmPT6t30+HW=xH7@RJpfm5P;* zRneeOIiag_7p9PRQ?esf*tY@#+eseR?|(b7rd_A|4r+5mO2uY8-;I!l_Os*V5S(G_ zu8oR+58|`)yYTW++gDETqqv8=GrIGrQx!4{z{%BB&vyU*874N@iMA}&++%k|5^Iu1nfwuL_&l$2yapA^wB{Hqy&8E_b0Nk6s>Q}PP}0P?@U)? z{{?%95}K$&Rwl}Gg@hP)Tv!xx1L8YvDhG3e2QbY*O5j-+foea2aYCidof zciqUmP(1UU-nI;F#Y@uh4ts~FP5+E*mqE@=zTal957<_u{V`gu4=k%iE zSF7RL^35tn!<{3pbq~syux3_t~zejVu~jT&RPRl?s#~5R)*XDwGD0UNNFAWw)JQU5~T;{Tc|JsGOXwzS`4$d+>f`6PhBYr{1wkde7!e9^2LqvVb@kr@8S?pBIt*`RXZ`F|W;Wf#ya z!nQSdUaC_pHW`D77cr8$_elQy(kD17CLwDIf5HWO1i_3d0R3(89K%1l5{CBT6V>e( zlYkY%uu!>7JvKVph&cjQP6r+e^}vOu-l-;Ew;{~``|5Z|QjCp_4XwlzcwW4j)}>cF zSZ%}x%00J&kUs)MySZsjvv-Q<_;oIEGjqi_m@VK3wh?)x!t(NsyDg3oGz0Jsas1Hnz|nv%Ij7tdI_EEj#vQW@#8)=MZ85D|qNWlm0qh zxd`q5t{~9qa5q=e%@L*~)ARIEJbXB$RaHeu4ISWf97kK&OFs*66bCT_@&0+v0^pzz zCJOLEjUeG^0A$yXKR`O&t?C7Hgqb*wG~Acw+_L48_2h4Pg}3PbabH~B=#>k+pI)0q z&L!3C!3VN16kyPl^_ux#KQ1>}h~c4x%l3bNe6-yoWz>Buc0k?1*ot%tjRKm3plnl; zgh721JeHE<4&kMx1Qx~o3xECiI*Tuh-JmjpS_-8a%mRURE&qv|qjIqc@GO9x2Z)Gr zCepSR7a)>^bmA{9^yc>VL833`@6TusqjRvg&nrYof4YTqDkg7%qkvoqkc4HamqmU} zf|`Ji?iv1PAZ@i(=W*m$)guPX4L&-dl2^g^QNv(i2(8QB`qYu^m@!P0_PTiUWAo-3 z;5!Ra`CLx8M-Xw3P%4hYTQd1&2UZmLgUpRFko1Q-z>g0)4*+)Mj- zL&|~If1gc=(h-bGEht_;T&q}!ZC2V@?C~Pf1?pBKbk{2=A87Ix(7fP5I|9^dX9qM~ z2$_Agj42V(H<)qmHnugLw<|F|qTM^BY> zLmn`D@d}aZd+M1AAn|GmUC>s7g&)mfu2uCGqvB{2$M|KP;=Asi9w8y2WXTw@9_}A( zSApVEeyUIf8UG52w@mq{E^2CCQ{>s z-2asy*G5^$W-!swi?j&(ZN#yfs= zmTwCR3f`cf^T7}FA*Aysn&7KfM-oO*8dv#Pjo=un_5%d+rYDc~|fZ$yE?LtE<)l?Xm61)9&)zY7EAw4_LY z1g?#jsic6B%7hLOc^@fxAnzbsY`81_!8`kN=Ka3THA3g!<(=&rz;ZLR5&xJg1PdaU z8cbqL5TS%+#)o4DHA?U^IOJ??OLEw6g@594@FDi>{Cl~)j^{kW18mb-mG53g2E(zL z7+k+?8{Jc#E*RZCI;xs$(Hu%6_Yg*D=XxSZ^Jwc%{aN+9-JQ9ek4iYIV50BXrX&WT zb7FYu9AA=PXN8MPn#OnA-1XbA51`P%T>JO0#@Hx->$4`N@CyDM-V?>Glsyh()M?a7 zs*P?#eQj{!LL7A?eYCoXf;D6}96aZ_c+t3i8!F^VO3Yt2-TB4r3(T0}bP=u7@m{3O z6|oip#l^+4CI=ctP>Hyp{A1Jm+-k-f_h6au#dtikKs%c4g`Hw0Zo8O972 z4&|6A?H`skO>|UL=yc_sLDk^9qmEGX?C`*3exLns0$w9#^ReMpWYn+ zQ<90TA3uUfrTT1j8$A(&vgIkm=Dh_C2oooNUvv(LJOP7(lh*5a9Jh9wZJo-DBZU`W zXMB)KYoF~@@H6rWOTNT2ukyCCx!yz-j)EU@>I66>z##0au6I;6RuOqFtXBC)QRI zyJSymP}-&U-p9uth~-ZGZuulbeHnBnE}q4f5mL z+Sxs!du?HHayW4+b39(=;BoDMVS5G&+jaU{FJJ0Yj&14^fwfDDoO}`e83SA?K_PT7Km-h~zO6KX|?oW?vg4fN` z?B>E0O~$`R1O??f?r#FK9nVg$tjRt=)H3|g&@sIqAh6*SKvz1c^)Efx8NZO$d-Q{T zqSVf2s{J?0phDBFDz49fm_Zp_9G3gR)U_-f+(NOdg39FMHX-E)U0>o)i_?6@mpE_k z9(qN!=|Bs97WkX5TiV*6K~_k!leGwK1(iP!ecwcH0$TURKD%BgAQl!Ts~ik9vRdD+ zjFtX+NA)SL8Q^-|*|uA4?CA=bViVr@pt8Pc)_AfCfQC*fcRoJYb^o~<(}uaL)q>e0E$M}^eCK_-@bU- zaj0lLKk}fpx%qQ|T|!sNz;dB-rbvQP&WkFfmaWEN!m`P|0%#ZRtyUHu`)!!$?#Y@7 zSqR`IEL46v;$hqZz2|EZ6_Tel(-KWJ9cZCA@WrJNdGI(+2i*Gm2RFiuVE;DjjTYjI;J~;n9z!-!#I-0(o2y!JI z9Ra)*;Y=F54!bK5(J+8KL+R5|jy#dDKo|=b7Z=jb{{H?bGzX`{tgR8%vM}{_x<2Nh z#`!oXH${&uKDeIZmHh)3ln|7SCc=&K%{l&(b6Z@iK4{oPXXY1^V106l0PC#dBw5Xg% zYew8@NIB>FKmAvuZYK4<@-2*GKO>jZsP~5KL-TL7U%g5~C6W$8B*nzKmv=a07%3?! zX=%k0x}YTN;qDH5a?p~Tz0K1H8`P=54|yZcTY#T{yi1#o{tNQBt8qhd5%Ef&uZFOp zQNt1Ieu%ohX*RNVB0FgRe;2{cX#C{4M)4Nxzkl0??uZY?Co=(;LC6JSx{& z%Ho;^NAc&t0>MZ5k61+VMOmKYH?yI0+y`yBqWYNLY7JnHAYT{$5n;s1bxSB}Ic2zf z=K2=Uk&~Fyc9)`!32G`$+MoGs55y*9{rsMJ5Fi)dcBhTD?cNCPB*4iza%-DfQXSS* zzqYfvj{Vlbzz8J`6CELqA-1Zuy}A=%rL6e1Zo|%SsA$tmr`tZJ@nwu&(GVLV*}b*; zoiUs!Dr|Wn^^eqrYj9&*`@`*;?l|o6%NM?BjJ$R?X3W-8(D&3Y(w{ev!Q$Y9kD@=~ zTQgnb^v}d_m`2uF{}$j9s0`a}0kWcVqPm?FpEma1OeL6BTJf2{bpC6C^ zbT#g~kj_+wHQvW7n`SD*URu{HKm9Xq6=pH+^f=aNu=@oL~n^E5%wXwOzprSWH)gkl1ite=a*6DtId=(7D95mN}%Y#vR=_^ZtwbvwVrm8_h zB&rS^O%!X4PHh9?n8bn>mGUxERB7`0Xkb09w6~#y|H@6?karB&P4w^SYC85zwGGkY zzN1vCE9f=tqcc!{l&eu6z`LOv73L3Bbxg-T*H z=O*n-Qx;KkSt`eJbdJj?f#3Xk+))SUR=w!8r9&ZwX5*rv2c2(wre&$5 z6{WpE;O0QhBo`c)Wy7Ve?|*xY`c#V}e3GYhHXWT;wTxhz;E=wJwdJ8FtyH!@0UcW0 z5sD6fvK(h>M98oZFRObAi9BiBk*0c{ji1{0>6-_9J2CRx*AK>uY;J-x^yjg&+B*76 zWpsWFA6qGo^X?w(ypeMYp+`hRWgIqAVO!JX#i--*&aDm?+vCaeMMLt>V3E?r(hJhW zxowD7P&3?W`u<5UDpY8KN%MN;2}-V>U6fK0SXO+`kQhjtxB&>QwCw-;WVHOMHgx`4?Wepl&_& zVt7{OmeJjMB4YN{E6l#)_Z@oiD)8m1#66HJ2Cg7&qRFN9>;N3QL^X&MAQSm=WKyH| zVXtuSvtBi$>--U5LmZK9cG=?`jy}eSLzG5M8sd2&CS5lV<(h#-@dNwG<$Wl_$5F^3 zS!{Hn-!%fGBrCc#<5;6DiM%Y{JodVmWL{e!nbl=00xM#xYgzbjHo+;|8sf6(=j>3} zlQNA!#YstDix#jlweA;P5`)$BH#fH-_u#jsR_$e&@n|!>_<7?7B;K;ll1IJm^jqm(0FXWc4B;@1pM!2xJZtZW6LjsK9l={Zm zvT$`r;;4J|d#!rk^!gcHcNGFC4R3rQ*UHi%x(d$4DkK;Q`wsVZC?lqrr*V7q*~j$D*FGD3At=eYj;LE=2ulGiZF zssD?SxWp8eRPof8sSaQrN@1I{{h6eJa`DEgmodT%wehd6klJ6{TtAj&fU3Q#Eb4BA zGA&5fmow?~bdK%GOaREuh$Zx*6^#|W6_XXS)q@e-7oy-@wT@4*xTO~~x3z;TlcQug zHv^9+({gS9OJwplq(CI2e0pkCgUzo$1~5BIo|14g99naZ;9A7_C#@z)e#!cBQ8x;0 z1rkCb@AUVFzI-_zQZ^$%smu%qc$T))4;tj>S))D=S^l~KTG?ucEqTD`#R$JiZ&Pny z?^N$kI65`J$}p1$6!@ObQWX*1@IY>Na}4AL=8X^Vec%3adC0EWSfpl#^^*<@usAw)})T4 zZs`+((qV?3l<01cO63b^R|N%|fIJdmJAv4bx@XvompLd)3=9dkK6Y=)>Fw%K>MLwq z#+!VM`hqh_(Hy0z`YzYf9XyZUo}T9*vEs1evf|A=qkP$j#WfnVPKa+5ehOblcEHQ) zmCum7`gx_R>NNM^N%h0aTF(Y-9k#AJ0m^M{iJexnb1*n;481~Gqu8msGJ6kM9OcjG zaBVYne3XADMkrD<()bQB!XK67r*7kW)3tPs7r;90ptMISpQXUpbo#{gRTZH%Vn%qd zJlqhyw4>X6KWdk~k`(pk_iFxQ#L&NZA8WAt`@{yuYg0<&z?InWG;P&^jj+3ntS?y| zSVN{^z)KHBjyMLw0tsY!XEf|Jso~vvra1t1AG&c8$-kvGH4HK^zAnJl6YgA!3wxWd zhC~H$ggC{X7PTkb{iGr7iF#q{?ELJF1I^Utu@?LFwbjD>0q(XSe0eSKe29%`4W9WiEyLUp<1Ta>X35A`dVo;3IRI( zrQu7>`4bQ5zUHnB!QSpZ~T>R_S&Gb*)61`QlmeNP%>ZhC%m`=kcps( zD@;SzZSsQ6Un&}@EYHlQ8tI?b`5AtI#2k=TTSuV9St5)50M?ld&9HI2!6_vFnTr>u zF|9(~VJPnvu+}G4i~uvkD;*s%s(aV`wiQJ)p@^F-75jlLh)yv}uW%TmkAoASFoyIk zGyuXhE%Y)5mb;@BbW5FAlPV;&p?cH1m71EmeGD@bAYx{9IdOEx2!hB8y7N77h+&lF z8o+)O@LABxqQ{%Ha!I{EaobtI)a};`?S%dMQ;<0nLuK!rDy)_j>`$QI(%@Sf0qCT*;wX){b^Z9BR6UkB!C}`Ui2H(r-wvMP2TfM%2Nuq?WSTUsb{_yyxbWL9<|{rE_9fvaVHF!yCEZ5A-BK>kBgh|YIu z(E|vd2^4LhX9CdtmdxXj8Iq92Ja-PJ&8pcV0UMnJSFb8TLcql(c_+M^QsqE-*il?J z10sExSkB_qlcOoLsQm&Re4Lr3ETP^ANy|L>`o8PMl2NsSe0j1Q=$z|;way|m1j4-nnUfiQ{ z45baZty+930#fet5p~Pi70?)dT<1&NgVXV;@Y6gb0|ca`I-n;5IqAn4QV%R;Tad>I z2{LDrO?ar^pK-O!8kpjXf$zdhq`^MvGK>r5jL~uuSrR>Uwov-`!BA6=H-g9ZAs^IDgxf^LgK)oL+C-kt{SrV7;GiUmEer|%*Jbp(D;D@GfQmYB{7DK{XqL<%Bw$&CG_^z6|)x|%6+ zvvCUl3W$nvcmp1agC*>*Y85YO`T_CBiYG6VnOaHm-n^} zUbOuWuOzB)57I-8Nnj>;c3(pEdwzpE6#c&biaS?a%vSMWuaU{6hbzZa*&pRy3)KP8 zyPjhES*(g~vDj`Up^S{=Bd^{9N@h)UbO2I7R@RCF3Bo~PJzZay*wvPR4yIl9h|7Py zO0Z^ssS6VAPrbb1DrsHcY>j;2tL%kG*4~Q;)rqBrwkWD2>Kll|y}ifD`#S>~sTTF` zuXc;Q==4eG6Qv7MxSJ_m^pzSoc~s}f&t8BU?G~yc2Gj7p`vqjuz*;fG1dCy#)G92`Q;x+uIp1>R|hZAKagBPu?<2d9)5DT;Tk( zb>R0CZ&V-ZOQ_!H%ONgf zOL_aN{nLcfZg|g@C<)RFpW=WD9M%kj-Qt<1)#A_1x%;o(U%mgdm5l14sfS(4L$>7V zf#-&Q@8o8@bIQ}lZ8q(grmsefL}Ftsd&RuG4}Y!cj%)(Yx~>UE4BZAyMlN}BV#PGx zA;{?$Xmcw+2LmZo1%mp8dBz?9q?r0l`V5MiNfE-(Iz5KXsW|OHtR8o;w`V&gN}fOX z-7eqq8u?nz-Fz%Oyl@3lKIhS&Xytp;IGT}Aj`VXLEi#VU29qZSXrmr)z)l(8Y{)6R z7;gS^9;*LohI^fn$edY~>1m1i9syTSn+fUt)l&--XgJz70V7zrLU*uR_Ud;xx9Es- zLG!ghtBxj%gF_SE6z!y+UED)KM6buv$@B}A$&2nqwdw26EuW=BBqO`WJAud0f?-)< zcvZ^f%M|hPL1nM(!qEIQfE+F{`vMT4h@k^&DJfRa0xD4!2#Ngrf>56jUhGOsBos>z zQ^@*BFNCCX$FSbHkdaboRSB40NIDrh2+2rapP&e;Q-?z z4tNDnQd$TMi73pnz&ZXgF@$-pIVbVPfw@v+jj?`AcUOYG8zVcHS4_&IZYC9^(g6g3 zT-RYGJC2xjQ`GO|zS}6b7C{y*CxD-|Csf|d?N!?$Bl2b9Oad(&6rLN(*(lg%F*7(6 zN8f^MyX^^cM^p~(zqVk;E^qO;K};`XHfXn^GB9!tOTR8G#`>YO6ciJ7y70E?C}Mx=kAE^< zmUA`}8fH{O`;P3G`Gl9*$Hv7YkhhjuDTqU|X*SMaE-Q8#5v-jEWIlujWdi?U-tpA!>6W7dKBbDj| zut?ygX=70z*>V7e^EfO4*ZXp{_i)M5E|~B4KETOl)sZg%z$~PlX=^Q&MuKVRJ0>`e- z96(7)N26B!c;#JH;q#@Sig{iHgjUZQ+@SFI-H-HDySv}jpr%(f5rtBV(*PXlJuA-=0o2~?GP-dG=Lcl4Qr+hLjIs5&Zb=Njsf%%KlwQ1i(bzzq^NJ1$4LVa2O z0)3J-j_Y;yhTYRk@i8QJ9baO-8CBQyNLQ-Y6e_jBPM*Ta9Sf`QWCysv928F1O_-6OHLD8jq%U{=bDL96Mq+;(JEU|xPc;n&%{+~;UR`CuRd1Bj5 zwKrJY>_QR54;ECM1AlEdSwupj2}E_rE70?Nq70>IunJGZyL-{WB% ztZ`}&Kz%w>Wg|oXSXaDtQ~IHLnjcGdvQ8!Qg(1CnXR=s^o)C10vJI3PBML4Zf<=#@ z%)38TN_Dp&;CbDj!k_#{j0bkF^TXauymm9F<$=Zs$C^}eRDg;+(OD!deFRtv=f7#E zr(?b~-+O{j>0Dy-B<^&Uh)8gj$5YG82>ow}i$D}Lwg(0crOxX}l(Z`?rBfMRjoW#| zHip%?S!tUzdl`V)(l>yLs1Y89~arCx#A~g0M=ud+Sty)`^{ddze?WV&)iG= zQpCrMkL$6~{ipHof=H9%*&G&=w-ONE_y#Km?a#AB(8EjqMbmCbqf>%s2Ytr&aEY9D zN}QzE_xGMAyK57PVZ;XelFeZpB#*s;j)YQ4dy?f9?!TT@r8E4a$eWT6MP>Rg*fh%~ zZB%|}mcn_m<&8V$YZTM!%G8*Th^4>eag!R)PXYXDfOIG)a)=m&LK$Tiqekf;CYcu9 z@yVor>hsH)@6Ff4-(Bt$8*qSKS>~3L`-K4rg4dmGnPt<@>AwfhRTtcsI}>IW^qC#Pql)5{#^y(Hjdc|X2>`&GH%t^h>q zLwqMD&gTM0>sWOhplxZ>hM41LvuPj8k&S`tIydLed{>tYojzckQ+q->7vUP)+6QJ5 z3z5a`JQ@E3QW6$lJp048XvZ=D)ZX>A1x#hv7NbK32<0rYh=ObjAYV04JiGho{|{C7Zth!7BVHOj1SN^J6;_T4B?)zqsk=UmxlVfh0bY84QiNyK0fyvIE{I3F9nHK-KqKllcza+Zq1{H71Low+k$N1@dNu?QK>PKa*CGQCVB&^ zkY2eI57=Qg88aOe`~hxYhfl|1HlmK+b*}86@qQ}%d0Q(SmN4)8>FzPXb4|u-7gJIc!`sH|0U_SZ%b10bL-Ue40FsY82 z`xVmGd;TE5BxasB>{DtR=%$cC(az!D2l6rmBW*9p-3&~X`jgyy?c(fK0zvxqXEgLl*UEXC zf35gx^WwYrgzc03&BpAj;h(A-Tx}w8ZrdK9VBnzFS%&!!T>n??)`b&0I2SR}u0N9` zpD;&%nJ6^K?16)WvYZ8)Kx!WrmdYJBAacnZ8FnkHlZT_vv>qpLLF>fdx8R)MO7#H% zeC8-1cHBL$?E^J6hkqRj2@jL8iclAhCG2>x?BT2QKJxbz^l>CL%ciRVVfpLeR4!NU zGpWS6j=!bLzt6SLpCyddjDzn~QO#1j=~gmF>iXyC{=BDo(m@k(yR6DbsKd3BY9JaO z02AhG%tEI0|L0-OKiC|MbU&P<Et%wlIbBiOd`Q$e=B={qT49Lgj*@9pU}nce+|aN^O7fODb0+L;(A z(yhgv;#AD}{g94rU(B7Ys(JIOBmyb0F|jDpdg3J3gIBt;&!Jah9Am`uaYD&JPH2=*Yx zOGni6#boFQ0E$frPQ1MRQDm|4{bmII;pe>U{CiNhoqcEaH+4qQt)A5eHO9P6r-DVV z`b2Cd6#b9Ogb~mtE@9{MCZ)`46gv?S(G9dSaVP|E2WFs3J735>(o_9q3c3L#H@lQ4 zZoQyTZ9Zk~=^jviU@B7k_tG#~iLBYyrl5)pCXn^{f2tUD^j)L;tae$pACIU&dEv2m zIs0uGMEQl@4KmI%Bvmabj{tQmPK|9sxo%_rd^K~_rw-h%YUNsIo7vAK1*FeBo@q)u z{(nbUbFmqU4ndmtfAx{<+R);0EFXiMjOZO(zj?_>RHknihd;~Xy;ST;+L_M<7cw@1 z0=HX1+NXuTvDM%fNN3{PQr&wW5mcbr?zK#SlM=vsHSwqW$s&&f@ysTWm2)75?%m6V zN>Gc_1n%Q8|KWhSNo$c1{ftD4DOiR13aFcuMbpgT5_VgX|oPpp%|6;R`zB@`Th{ja%;)qQZ z;B7g2HLV=*Q%^Cui9WL3nqxy;6PixLG+6BxjI3I~pyCT=+thjw0c&EF#N>Dq)gQH9 z{m*lnYC!SWLVWkeh+}qXZSaS&MQuz%-ZWDEzs+8wZbFsKqLZT|Sj2|AXyX1qKXt0T z?14ZhesO$07?gb>0OE2ueh(~}so&$r?tGwBaLI)2;gHcResSf6s)H^MpD50aJ9^AY zn(W5gz*TUsh0a9bNjKt1J4{_mmvE=;e5|Yht%ym2z>#JIjp^B_x;NIya=A*Qzj-^ z2wucIfsSm()zb(i<7ar!c0axRGUZ-eDiJ|b1+ecooe<+tY2Ks|@=xR;usDc#O4v#z z85zIDqMYv+7nW-JNxK{(8du#@FP6EX&{>bgL64LD-Cbjjp%>WodT45=Y~gvASW+ z0jER+qk#~NP>ryGfNxs9UQ=bw$;IKF7Wn#k8kB;P?{p0kA3kj@sbYI@<`XxTH`}26 zoa@Scz>8LiVi3!KiM{l7(g)7KZYj?#s4WSL$;;$)Via8>c63i6#l232F$QduJvess znWi+T?+YY{dfk@mPyq_-&ScJ^Ap_opHQtT)B*n!G!N!6Cc`#2LYrOT z+bHaJb-cOD2~ohhbqJ-1yf)IDITIekR(p1Lc6}P0qrvf)jkq45d9Gu7nV%|1s%J4d zn(ICyCmZV4aJe?hTn*-{hWx>`=rf8q~>XnW6vO3LMl9k2jJ2%u;pvjDx=X- zzxKc@hE($jmUzDZqnyrwAi@R%E(1|=ofHn=>%;9?`LiFPfmZ89*MzL(6=-7&?SW5I z?_t=TSG+}!^-WuvHza=^=8Y!*feOe{o}{ce*EY@Opk(RS?& zCU5)mAz@$`_J0%A3(?JPgI}k=zQwta8FhQ5xD`Ekyv5k%=G{ScgA*Bp0Y^e~LCi&* zTsQk}E}*$kcGs^UMgXT+j*U;5uuIP0k^O^s$)Nf3Qy_1JGE%p1ABv}+mU+xZ&^z;Ojx`8>r}6>DS0)phj)jsxe;JyD2$!yx1{I#g2a*$C z34IX94XRVC%n2RxD<-wOWxNpRp1JElN<#@C_|-^P<}7%T@^;m(#n<9Gu(TjF*uUW9 z6IDCb;}vD4^(h(;=0FZFT1I{upWOsvXeA{_yIO1`y$=)q@=9hw-=Gl-t?OZ@14{4` zTnv5@=h-z0hv@A8DldYo;&KHxGK@Ap&XXd6RIK$Fld{c-;O_%Gt{f$vL^WU*Lk6r$D<32xlo^*GuC9T-(dU!CsAPD8} zI3zKQf|*1_M&d*=LrRdZ#g+N?Ja1(K1A7JNc!sFZ1>u_ddyc*CJI2YL>=?WRBO`~O zVECv4!`Z*JduWh*+OmB_o1gV*YN@M4#Hc|e@6i^Pb^gDO20IjVXMwL$rCCn=Xam%J zl7OhxonyW4r;NMeyI`9odlK6w+C-)nOpcztexEHuAT^VLI_erx*NN7F886lVA3NVqEqV$_P6@e_h;LZdEC2 zFC)|r{FSX#K8)PW7q%MVCOVLS)7l~JkOK6HA3XgeL=nQl^ZRHNNC41@6wDhsL_KI9 z1$GdsJ=ES}Up!Z0QIQV0+N_V_pFcWgRc(=QRCMrq3wz2KqND1wc1Tb|=#R_GuOOO~4A;VU!KZEA*yzwt{#^y>h}WtxjC&XL%h_pm3_>L5{a zKID1HU4ndZCoZ7oN*<043*HXZ=ZR&~(&H`VCdbmz1e2?)TwYoG;*rdLufT1wlNPf& zSyPotwEyjm1V+VvS)Ts&MX)g8cVkk-keR68^$;*Zl5@7zVyRITn*j~|le-iNggIw$}81Ym_Li3OD&H6DG8;qPUyki<~g@+9nR-s^LE&7nH| zxf4(?9`asfY-oZ$WUg-X?yBks7{Wfso5TAC(Y=_u@m%Dtx}^{IsEa$msD_zC0avsF z2fn(!09oP6W%TJom^CUall=6O^~}-Lm6f%GmWZuHj*NJLj0$H7;f()3%7!p*dn+~o z=R3@#Se~|rZV3s2vuDPuCL4<6LglwS<1ypK5=RRd@sTFjXi7Yw_y|vi!U^X^COIcG zAd+=><&md)U#OBN%Aw$cZ#el~jyFi|Hh$oRJIb!W=uIrBPXG7srKB97q@%fup7buA z{nlz``-Hd|^26-t z$h9f+Sn_@f+JE)PaZMo4yN}((4EAUy5)DFoyPByGmW~~jJs)CbV{ooG(V%ym!)yf^ zflp^im;P{@O#wf_a9mb)!1Ik~_C|8DS1+J4_!+$3D{aIn+2)hT;05(HIX+j?&o{%X z49V#<|NW2VK%*hC*gyr%%H?l0TPn-4HAcP6eo6*oB;s&*k^WvH;MwkiNgnYc33eUZ z8mwk`U9$0$&dcy8SsZ2@qMe52^|TSIr&dV_DGDCqIAT1KT34}Do@SnYo=Me0CA|OG z;}Pv_OE2HCeiZS{T5%;TlEQxIIvbXU5}ps1gK`y`?ahr-el*7x=m&dQJMehmtK+#P%@vex5F~6qc^c{ zYX5LlTtuyQw&|6mZ<+Ri%;3n5k%^R2K=g+v(vP)#Oc1> z8X=$}>K15~dXknKCs$FvnwCO}s(nn=o+fh-a) z(jjsd;}(P#Y-z@rj)Ngp9<{z(QL)jaDSg6X|CrGdox>BFgnmsW z#;G>r^*kiy@sjhBXWF5ZKsa@lj{XWxr66)9LK8dVT(EHG@QY@Gbi3^x8#;j>5|*y) ztCo7Lhg@G}Lvf0Z{t37WQv zHuprn6m5-AW{c!m=Ghm`&}+@}6Mjof{DGNC90ZL{jU_hWjpXt;OtawLN^iXuCPFZ- zx|gTbtx0l;xWE{TA;xbFE7>V|2oPPc4&wN)wlza=fRd5Nmv5O*y|@c>G%RqF_dP#x zY-N_$7ZSN*t#TYyR;eU?h-Vs}4KuO;(o+5u0HhS$>*86gBVsS+=2q7UmeUPTTCWth zk5fSzW7Z{6tdJ~(Jl2di^yiZtS6}JbrCuu#+v=j!5+)AjkQ6h_4gPOpa{JA2%wiDh z(hVN{iVv(5iUS|&roZ=G+_!H(!{{`!;ZDzuewdABic5c2+%u`_DE;HV-!VTjwTYCb zHMg)T|Lt~V4Y3tXn21t^vN6C;K;zCK;ss<7SHy2px%cdxBTuQ|p`uxFi?0d~@Qtg|tCEqZ9!4lx;0T^0n9oeIyiXjgr_YbJ22Qnh$)+gX1h>g)XDlll4q0thhIOmo9*YDDyF&351_Sob;idrM zH7jN~ljXolsKHlNft-lhay?Ddw^U2h3#%0ALjH3_->o3U`~1!vI|#{=_YE;Fy41%c{>YB8sCt%8 zykw`TkX6Au_{PSpu}W|pBPs&8ehS9Pqpa_a=H_{I68M!+oGC{R>;2J{n_FF7mr<@n zkMX|g3M$R3DXbHAdt*pXf?cb?DwbO*A(7}mubA_}KETqYU`BjXq*FSwZti`b^V0+n zdJ35%{(aUPN#dtLq9uh^*@M$PEe)$gFuYEe85W~R(a}t;3|S(!(`7K0)?2?rTN&16 zLr?z%y@`2}62@uq=6+NVV{(=~D`C?4^R4M<5R)Bw^X9|+ zS8@4mnW>FRJn!=V`yG)D{!+*n+rmEJW+M|Lhhlarb!s4wR-7JKagH}UlMEiSpM7oo zuj4;H*V(>Z^5?+~U0V@%2ft2XScAyU@nM_XP`&i@px<+%rFP&o0FdoZLBn8HR#tz% z>_loiX4{!F=GJZls_f#A(S+8YMn63iaxSpRboI!xGu8nvk2iE+n#Wn;IOGLR5-Iy_F^- z@RrOAQ_?fl%YOV@KEvYv|QoSz~1OQ$%BSRxXD4?;%@ zq0t{H1H$BJNc3qhPo7v3hz(?9jfs`NjX0+$TB$LL1q*`Sy?bY3LS0iIq+)Z1>VNKx z`6CpX&N~{`MX9cClf+?jxQ6OZ)Y9^Rgm4?1a=+h*r)Lfrl!V_Aaru7xCex~W_q1Pl z*Qokkp})VswgmnUs4!WVc#~7rg<=D`*yaIG8i*)Tc&*^@sZm+N7{Ut5Uyi%RT zH3Z9)3_OlH!1U-e2Hv~jg(3>}5r$uh2oL%6-t+90)7|wn1Y%HOesmP~(w|iD z+#d{h%IH)v__PCd2n>SZh|tn^Pw8?ap3-?OR_&Q7rhV8^z-J)1yLBb+3FQBk;@c`o z|K^P(h39H#?V3Tp7N47w+x}d1N%g~B@z&-@6`E*WfyVc)&v!^@VB3R9|JVDG5y?Q) zIBW^_wV%q$gDq;21S9y)>q{lRkdO#|4%cI$ynskSTP}}}sfYHGP%Ky1W%rAs&4osO z-S=R3kc~~@6B6ydxb%2b)1QU2VBady=RW48l`_J?mO)#RTY(Rj_+yN_Xh<2itm(3E zx!!nQV-;$%-|Uv>*zeiT5LrOV`kMB*(e&Y&8s^?uM6k$*VVAP>#KJI|~ zfw`T(>AtSRu6dxRx9%6S{r#;W7xLTSMUA4jk`ZNyW;e%uf0`cz$f``wk@V}Vr?Z^* z1RmC6CH#>uxE!Iy5=nuBvc)Ole*O=E`BN1?(n!(*Xc2z{vaGq<6SKFzyog?+$)nYF zW_b&?^E0Uejlo~I9gL9UC}LWM(;K^O^(_tlp-CoK@iI5%XF55 zdES?@2^K%K);0p`<2D3joJ>wdD(5s|0h-wQWYjMIS@Mr3e;u!26c(y0$L{y!9=Dp2 z*Mgj_xg8hwiJuvfW2GR$YiX=ofF?I4R?Siz2L*u)IKCi>Y%isn^iN6RQK~l%iGty;bBXXjc%2)a&pU(I}@o;lWzwjnebqZRc2D67Wbu6t~{ofCOic@ zwR*AscyB&t`vhRs_w_aubn{`oB{%*9B()`UXeK?Hrv?Pxa#0zVK&|^dQY-hD5s8{M+!cn(*h5?1*-)O zIM&^nGkSY?)S)*h54Vmu)FOAHuqEPPKS}d_9bz*~I6~816@8qq1MM^Oxl7N>`Fa<+ zCIUmdW>Q?k2FxHNh1f&cArF*4%c6@40u~5c5k!qx?o`c&qM=AhfwVaqaAyqfFAt0D z8Hc-HZ`m&jU(eSIu$gWS>qnKD_W3!iHqm?#e}yRxcE<`ULr?y=Qiny>)T~l#(C=u? zHSMX@bGYz=QXvKdTmE`v2| z>@l*KHD9}RWADdYy_>7%b7S6Wp5kjCY zCpnT2_j(~z!eO54pHykdzF<9{ig5B9CUgCG+p-9mvjDb|QQJe70j}en-54w`t~@q- z>_J^XuKb?gDKJ7&-anu?*oRnKuCRbuC0d&E4KW;Owg$uxoYbai_*`yI1tsCQP^dn+ zSv+`$a}L8_e|aq-Gs0kwY@~XNonv(bY)_5mnst7@>zr#~c?nO)JZ5P(XJ1`e>9;_L zCPWRR$JdUC0n1#vFK^$Hamd z3F})gZ-z8=CKpO3g=MY%GD?;ZwIq@?w%M<|a6TJ(*;6XvhbB+@t*ZNb_ehdiiPR~f zc8S)clMSrcxI!I#>9u9@hY;-EU*ylFf9L9mmHWWp_>ocy%{6<+gb$Fb_YE)-9L(3P zYh_E*gxqX#A^0&$p?2A+mix%uEC;8QC?tAl2grIwfM%a!^?}=MH8bVQwH`g}5wGj5 zVAVk15QwtnSYBr;pU9sq#U}*AnCH!gZINq>W{b{$N4eJ618^do1SdbW+4nla z%I%G?M?@&S2{4vv34i?NeyK0o%Oa#bi)AI7x>u?q!f!4QrKrSI32Jr-~^M?mu!>SbQ06RKnBZ=%{ zsWCl4MfXCI0NnpSmk*?a;er^w*`y33>Lnl9~w&F$k z!{Weg-5@5>=Fyvrrr8?)LJfUgmD>^5K%9X$02qcwN>IbKEu^()yxRj&!rVBiY1W_P zm}nHI$P+&$=xSa6ni!9cxlW`nlA$GJNTAb-!a=_S#|F1X$bLzOXRb;|5V*s&4$#OeUzNO^RPEv<)AxxN5RcwpE4+(40E3Cn4t~`P^;&w z`U*NMMGAWP8M+RoK!$z%H?Wn!V$tidIeTM~-XwO`ul~3%NBgXJuM#kps_hIg-2E3y ztR{;?nowzJV-H?Zc1E_yTm}2k;>csTWp9mo`>>Gk zc)+eN$5_B#-i=6p+l8x6j~JK~s=>K*R}A#}9^|+`Y5G$eMBJdD)cWM0{<54fN%(I9 zhbMej)A4e?Kqq(6$Q_pI9mtC%t!C`yt`kH<-Z@Z6eo^dy)vij6@Dy&Vb8isr8qCpcTEYv@$ymi$+#d?RfD;wH&BmO8*TJ zy}Im|XQWZxYpHJo#4`SLueA`~q94(yDHBLY)V*E9>b#1a@P6BFqtZ-5 z5ycPnKth)DEiDowzlKR*Or{3!LGeBFORXUWKECIz>!4kDuHGdwYi(nL*`P^RS+iWT z(lWlm%{!{cgqntmD)WPttxo1w~Di#&Qr*toY1 zMN#>qlO$W%kbqThx8Z!fBN0>cv}*L&3R?wZ`iOYG);F>$-TVnoxDcqJt-fn}NRtUf zR=Ss)C81Ega9eRG>rabcmgBNQRh`>-q8)w>XXv$1CH3$6mY~}~L|aSyEn2zlQGI`F zM3;-}v+|yL<0y8E-!P#bEL5JU-QZP-E$ENLMMa6W^KTA@(Tp?Xs~3Xhiwd_X^n7zb z0|&nd2-Y~Xk<{sJM*omUOTd`*IvuGGM#f0brFyDxdwWm&vV?JqbNSZd4dxIi&<56WMJs6bk~Ms}5Z~J&IDWd6F&r8GD#<*A!x1HxG*ApYSCe%zV98IV@Ms;6y&b0O9wF zQGN<|zvQT+u{17uePeL1!1gzS5eCpH-1$>qc#MDh3w1kiuSTCUmfaxRiA|b$X3;U0 zkp6mB0Rdi`Kszu1!AXFRv4x`D`iko}1nE}N4Z^1*G?MuMxo^{r%2g`Xqp;ILbxcbOhQ6@%+->afh zNOjfjKbr{s60E?mD7u<>{3UJ0_wN-uKH*U}Y!NJav<*-jeY!jFmZMNQ3;dP`J=!TQ z|H|-t{|$Ptrgl~Ip(?><0?qL>p?G1A@C?61BvtWSz*3CP&Ejh|(7IdCg^1J2E_LAjmkMRYnmbLZNM`tO@Q!C&JMKtUuk8b|Zx+tZT z)N!#m3pB>LZ!I#to3|59m_5))iXBYVh(x|IwOf4~xD;H7tr(-h3Ztk5z=dNM7LfM^ za(V_&6bfc{Y`Q^iZ32_TfteTXP2umm>M)rZWe8~e9y3WkTd{1U<^3SSYC$-#0;W=N z2j?m;O<^t$78C4;@Crual*bqd?2ubE*9+q{!wE(bAYtK76iu(9>G7S?L~4w?hQOae zCI}cca^gq-^PFJ72;{i9Eo)SX=WJoP{}F#L7oEa;N6ph8S|(-&)ReSo&U@Ryyh4%Q zi(5bjlGwjI^AZm^Z1Gpg;&T;$t6l+JUaL@|^!E0ZV*WC=f|jX+7jFA436Y9-X3B%{ z<(y;B!h%2eKTQZhpS~@usje=^s1u7I*uiPn-OSCMK*W}31y%o?q)Dsk9~-k9(WG&? z;68`$G<=VYa4U++h(%pjUr?8iIL@Ho@J_HqgcRO-hApAlTN%&Exo2n6(4g`?yLaAt{lT5)h9UB%J8!58V7 zUj2RQj)l57Zv-igCMe&FKhf(tLPUp(A-sv7sfLGB>U<0gox&B%eMUf_mygfRul{l zlS+*@^yTnubz^75%@@9>{^cvp%%V(D4cC29-s7(BVg zkKi#t$#rQEdOQF0cqKG>782TEvwV>CVgOF!KBn3(B0J~4OAx`|A9-3n{e|*?-@`Q> zg@xlYBar1(XsX81Yek4qY7C?mZw%oO^C!6*N>j{K+ew94=#{@nC#DaYl!PDjtdEi# z$AB9G5Z<$>)L8c%&I?SOckeFVO#cX6Kw@Y3lNB5jn8)>C$G>(cY@33E$MDsi0_?nM zw2(wWcj=))0JmV)4zSflPNZ zwXEtTqV)I=v2t=h^m2qG+}4l&W2j4WwSI{e1#642hLoxlYGVulW=R#huSI}5GFn0& z@^7^czA)A%xTP7a(Xk|T09IO>Ik;F%@H|U&P^(FW5tAN;g%KKfu=K3s^mK{c3i`EY zQYT$Gu3+Z?_bP0$_1GgnPb(_g=XLvJ1~k3y9|?&K_~8;!9^X#4uAnDr#zBSkLvBun z#QWvDk2!O4a-7CvGT6||r0Lm0frL!h!eWR?*uz|a5EqC!y~t!;ugYRuT_Hlpgin6^ zp6?G7X7&9{(gHt&7R#Qj--s4pk4txPlKUDP?WQ;*4}9@cq>Ft$iaEiPp5H%zqA&Rl zBs-R|zx(B5t6D|Q{1w;~jhd(TdpUXo8Edvb2|y#p;Q?RbzlGxz6`kbV>0G2LFm`c2 zb>8G2ivJn{pNb^iD6rh5F~IFzzZ{J9Tveb4(8m(ugYJYecwlI^-f#@~{Y2~z=L8yt zJteI8WEGo5F_p~%Mo>dN02-a>>gy30;FaUc0GBT{Or?^qb$hvLFSUGjs7g_5!jpUf zB!fS8wU~^pEIwd#c_BaF#ZmL8v6cef&YX{5ch+F()8b ztHJB8PB~i|w7WCwKRcfF@qt0T5a`fg3p9rSZnoukWxSa)XL7MU+^dx<@j}+zsK-#e z@E2rlF;`&-d)~KbDnAN5+UEP-z)Sm9**9f_&3}@_LuCyZ#>!Df80wrX`V{6WLUnK? zGQL1zsb^WJm=d3`p_7Me(;O$NJGJs%!f?ahm!bTsb>!B-S?D(L#ki+=maT=2X*H7J z0K~bbqsy3?2~|qd(yjjkS5>4@4DrU(XAut@Vdyq7)_FRf%=>i#WG)021?@w@FSsFn|pWoQo8ldIb!#+BAO`*Ky58+ON|iD zzkWCl!?DhXVt=Hygk-}L)a7R9q@>=|kF|?jJGY7-t2tA!jZ(XiW z48|fcLI`VX2-E}2`(WY|aGJoSgGQA!%&1ae=^I9Bj&4p>ysK?pV_pvPI^Xs$Vo#Ol z28!KtDP@?8Nj4L=dUHuZ%GVT_FtJ?NSm}{rM~_x%E`Jk?(j+0aCxD?!pFGt|U$1`7d@0w}g+(16O?>Azhi(R)Y7(b3Uj-c-JsOX458RWK?0Tzt+q6BS=w?!xj==#X-e>7*2i&tNlut@8FccNv-3nu%)( zz?X9mq_Jb92yt7slLG)8(9#K}PysLbocDtstLyQv_v^9)1N6bc__Af>b4{La0wkjl zjR``?)2T7;d0lKh0l3yW|0)Z>n<#JS1H$b?4w|c{E3IDcdUt&40l9LO4Lt#atE)}1 zc4aSs`T_Rg0cK`#V_NMKm`#4Y%XBcdg_+Cf=z1(^d>8u22`tDxGBYsq?;YD18EWj* zz^Jp~;S#B6(5WA+{(K#KuKc=ny4e8SYg4ofd9*YmaobWgM@L6qUS3qQBj<|#wqUG9 zkZ!WFmgCW@3u(A*kG;$=s<4^mpr;Rm=+xM!iwT^-p<&~QeK4P#MK!#Yg0R85z&ZMl zd)?T4E-V}mClq}P`N9YwUJ9?0%6(ov2 z+B@tNgo@N1gSL8=mb#g+gPn`mT=wr;vHUa|7=B))k!` zbv51T4L084#ZYr#k4wEEc;10zb4r1A=JibBdY%>P3LI*zD11-Z!+s-#F9X!ruB$yI zvAHK(!evW`0%lXYGR&@?0(2k@MSjKO@Y0`}ss&9?Z3g?*q;H>ae!jt^gUMZ<-ACr4 zxhLdNE3YCGI5_k=_r#Vc2?+`LRV{*zG5`X_J%VwVRyZfMB-%@hHw~! zj1@N&_thkW55U;FOJXxzPiRkV)_{31@SgWe$r8JFmerkefYM>t2{-8cz^#5u2OF+- zdC~~9)(1N|<{%fl!fx@n6Vt_}&@5fz5P5!$bI}7NkgR~_b8~YunbS_XW~jz_BLNWV z`ag3UT<=RDV}*jnnP|-zr^VlS95Q)jEj1)$>b%Xc1(ya}m)2y6;^SP7MFvX)l6>QY&*SoY|Qe0cH% zQ|ApUZ=7N%lp?m6K)McE6QGo7ZTP_NuKhJx1Nvpl_o=@wm%{N69P_425gh=X(9_#C zp?)JcRWFHc@posly%qTOit%KnLyJ~XM*&b&9)>ovm8pBh&UDB?Cx~ zc{d2qHipRl3^@d%Y|YjB11&oa6PATPsk`TbEw zV=I@eqsS6Ui>~=5&L0t!vjiZR`Ribuw~t`Ew z=q~&?r-8*UVRfqSE5M@~76t)>e;&+-?Xj;MHYKf3Xqfgdv!vj=vr>-N2bP2m4+?cs zT4T^q2jMkfvvwL-8oVFYerk#KSp3Sa1l8yoheiFyZQ1wf>Hbgs{gZkO+$a~taR=jl z>ObC`cYxXwHIdcbbtNDeX*Cy0VB*%)s(i!FUZ`2>M-&_6G~z7IG>>@G-{&y^HHYyv z%YZ8NlG}w))6%w1kxE9IsyWKHmgYkX)Rs zf(ThMPQA>JjJhLz(xm>4;56gB{l`VvCVAlvb?nO4mKIpP#lF5UG>E;$r8){+IyVT^ z_=_AYA+KV7O3~_iKGk}q%6r*2G-P(aHyW%%19+K^M`b>R*GGa@(wOx>rG(-_YYR-! zd>glQp)m6>@xqoL97^Rc@H#t5sS4~~spdpkD&pH{Jhtx){iJ&(uJuafZABt%UBqo;oVYWH%VD=W}iThpav4oA^g z9HTU7!myaB@WsvN|GsdU=X^K`SRnvS{oX?3?Ch-jPzt|Zoqbs8hutZqlY5r?Uk;$N z4Rlu*Wax%W&x*@e$`wBkvc++^C~SrJE3lKI7f6mVgo~Dc<&JefF&{`GY-O-{!_3Sl zu%Lq)xMNPh_F=?%er6f&#=})-U;yv$cZa}XXPZEwv~+YQbh?+<*N^lR^|jobyBn(2 zxotSS?(XiOltOjglHMjycIvxIdX=C;L-5PO-sqFRKUm5Ec%PD!lXG+FxIDnJs!I=9 zS&SNf-6y(ne_#pVd_VdpAr^Nr)+ZreT|VMOsO1&i{r%{xUEa9?=#X%Tts2J<=R-3q zD=XW3+w34f6EOssrg{pA&u7?y{4Tk^-h~TU%SEYrm6k?Dpmf7W7jX`1o9yT!dUSfQADQXMuY` zLPYefmJ}CXK1D+i!3PoId5x(?dB|r0BJ9IR`*dj&3#GOtuvEYu^?eB;kq9mNF1O4p z1Apn-_Y_b&d~S9&Po+n79G17Nt`r*(dC+b4suH8Tx_2iw1Y0(v9lXZ#Eu>%ECWQ*C z0PVaLW}Y&WHhG?$4*M4k+!QjvgB_~HBX&PsJ(%CV;C81afBkxRadB~S@*-WD{KvfoXt>zXDOV9uq&z#alBq zy{RCe^{jVuR_aA`tDhN*22FGsG?tLJt7%L#MFCU-B|~c=$<{$gf0HgFghcyjzz*Pe zNHDe2S_jr~8-XSPN)SI&QZjAh!0uf9Lj87ig+)v9_ZXqfYQIo3wS9#)Q9%CyDLy-T zmS&#BVZ!?}_4^%b4mIR%wK9!g>{Y z7tcKnQ<+4WdseXs#$D zyzcPC_kQyY=^rR=&jHLed=lPyLnxx--uKS6{H9xneW7y6Ct->%8Ork6s!+az}; z{M>rVK+y4RJnZ0FUvw9-XKaGnjG3QMoZAhv%^W(arI(3 zcfWHkT^DY=i;I!+MsFu3yO;4{h`HL4UPRdUY_COz8o=<|^TsG^ShnT+I`#cl*PD0z zo?gGd=7rTfU{(oIf&}~@4UyD;Xc0)gG%#Uh^ZCW9RF3_UloTCKX8yV_ao`0epZx~Z zBV^446xdKffh{sD2~nAWZ`3p^jv0aAS?D|1)4WlBUT)2gAKuc8iO)SC&645#AHLo? zEbFf68YV=LM!G`*m6HbP4v`j-PNln%?viflknZkAx8i#*$z;$DE30 zcEX}vsfzSSnDNh@Y?y?|y7h$$^AVq;lkuVjDawvuID6G{PVRhQ8u>VEVq6=g7mCv2`dglRPv@5xmL(r0uIU{IE zda({5P479T?*qTO1{dnv0b9yUmt_mari3oCbNcT^en(>IT3;s*GZWwP8oa@rd`XF^ zj|??_<=R9)!_Iq!c5LJ43WTN(JQdfD0mI)?2I~NNe*4_cEj*f@Gf|~3Q9W0Tw#+?; zyjPD>B!2wFE?>uK_parbT&W!%f6?*mBCivzGh(~afP=pK&Jx&&z(2iTc^W#?AASqh zo0nYE8_}%s&?P~KY`zCh?DdFf`~kYX_;6W6>{8?|P@aMd_fFh1(Jz$^;I^N4@rOiP<&o%D1J7+Qd`Y6JN6JZPnDOERLN+BGK&nP3Aw&rnJ5>`@A?K&te zbp{X4r<4!iwNe39%B@;y4*X^U=Ro{|qC`0NFW-27MOh;%&Tppd`yM`f;ema%b${@A zUM#AF*-B?h8a|a~RAT{2+VEb8N$+Mq|0abDV~bGqgF(d6XamZ5%pk?y-QPOkzj}MS zp%@uWe`&`sg>|o`+2rG-x?0ltGLsP}4>c(aGZvQMwXXT}=P)6+jmOi{h^Z!g{e@c> zZJ!WI6JmTV1*|3A>y!`3bolN%rY9q%96HJ^EXo7ErCA7&Rove=R2*(c^uJAd_xFx6 zU;W)p|9eLz@%W{=9sPzzVg8^5?GAU?`o3AD&4)<87J0<^OV`_I1kH=d0^GSzAOuHz z)a_j|UZNjIK3G>WlHjm4rBe9JK`g3=vgF5H7#L@5e}tZC@!i6fDyqlLP=Lyh7o|m# zM!Tuuf?)sbL?k|vv_Y}Tdq`X3ivg)7`l& zv8K#Xkog4@a1JKEu4nI5E*MJM$`z5kr{Rz0#PGY0u$wUH|w3FrnKejL@DIeR|ok zI8SsQZ6l?I)5Q9e+s4mbFWB%wlYW~W(+?VNkflp)qH`Y^VU2-Wz+bLs*Wu+Z>$7{T ze2{bQO@Xl4_6gv1m10fRtXJ*7a{6ec*` z&HpTU(np{`BT%viy3++oEu#PZzcI+FZ72=-|6P_B#^IbZ3BQuX3 zhmm}jp`DRcV0JhtQbe~{Yg7i6DH3`p;AW^QOcWyh_onLgDuBV&8O5PL0Yeg??lcg; zi8B1^G6*Cd5vE$MDy5$rGN8ajB8B<)|C~g**QI5gqW>qo30{&*gMKSF3!j>36&NWrCIO{N z`-aX(55v*_u8fe8K}<>pQo^v%Za@I1BXo2zMgh_)@ zlz%e;CpWgG)&snXe~O+gZQn~iG#K!G$k)Z996n1sFt9MM+XxpVK!(1Z7{I+Lm&b1h zI)30Z?e)L}$-gEzP@Fi_^>*jqZ^M46{4tvbPZ{sF&wv0OjG3d}J;g-w`I9sLxx4?j z6;*@owZ48Q`m^|5kOKHXQ-BvTk1*6$)as@FShvt}>w$+&@i;r{5n+-S81#ff!@~%GrT!%D9^M+FUnHBwCv@x28D3I7hc{{>YAzjC_6mV9!_@TnU2 zc8d^tYu@C%0md!lMr(z4z|}X+h7!})PY`sSBi0;SWbt`w8Ru_+o>)Gm-X_bGq!JiI zn?{8fJzSy|x1~q&<@{4gvoBNyGc35TPc43?If_14U=HWl8gOz=dpV1Ie~Jq1H2)bG zWD=DU2+q(Ux@i|6N-zKsQ1z2esde&=v7Duw6&t3*SG(8Vf8)?I?IIkWEzDGXx*Qxb z^VjtrBnhZ>zZ0p`im^yF0(K_$hR_GI+fG3X4wTl}by) zgYOWNiZ80>I-nf*T7u+-iTmdbZowY>W}&@|@^I1zW?oOq6s~AkGwxdH6x4-dP zF>vFS3-%0CN8?qC)2JfiYIfe0`Q@58LO{!2M`!6|!@pVam9Q-sI`O0x6%#8bbcO|& zWMZ<|;OJWQ%a8AHHO@toVs&UHW_1oc@>uqJ78-JJ`ZHT?LS5udF-S<0WF`rqfj$$*3i#Lf z;}q7XPiIi!-vCMlutP+P_Mw1flqwR)bCnYYviJkeWlvhyhr0_ie=TS<=jxTcvT(V{f2J;MPZ^JIp<_=ghW^DL5E^fdkvzn$nOqe% z#N--r^^CirYN}M52fT;4xhn`~Ma0GZ!Nf;lAzgHf!=4&3ani}g2QYW0`%B6Xt&XTt;s5HBzA$BqRyKA1N)%?Hd>UEg~hA{hTS97~sK}LH*VSxE}yxg1eJCX_|6aqvL_(^C%z( z2gbBT6cuquGJ$@dng3=xYH=tTAn<-H1vH4jzrokRlB@u(bdYny0=K@ktx+k_h$Ywk zyqu@zC@fgC<k~sL?sN~xcY~RJK5}=gn zq;AFID~f@E;ZEhVxoPwQe)3+NKOfeC42WjgPK=MAA1q?zR_S&==G09@KYOAMC4JS& z2Q8?GZ$LIq_-Ccz$kIjr`}vCup!2OGViY=(!h;wjytRC^+7m%WMAV-J-^N9WG7p0e z%OHdgRxZTj*^AE`k}H zJ$iioryg`pkJpV%z`xy<46~yMf`p^2-mr6_J^|k;K%9z;M*EDaGN1HXhB}g*?U5DF z%-kH{!@Ie;5vh!g(PPqn5VurLxn>4#k9Tk+^w9W-Z%V(0L>f|30v!^ACiEX2r+JSz zVmpWgiO}F(LJ;Vr7AyIi9?}~u2C1l7(9fL=TWSBb8*A%hXTV`IVYy``>yrNrjMt|#My?}ZcP9w&0BqcB*|I6z7yHeXq#=36+%uTF z9aHQQYpA5$F*z`C5LLJ!yS!3NAoU!;BEJVb>hk~?L<-eWN1p_W?04V9*ZO1OOD}=I z>RUY2-M6~@EG#S(bPx!tJD}nx4MR~MTRemx6b+Xu10r-10uH+b(dc0Eh_T8s=#i|a z-jk`y=~fSctU=I80##Me(6EaJik>+@+)Q140>{?&1gv)y4c6-2+8PDEdZWYM;h~i~ z>|@{n-Id7`yRciCN=)PJ>aI5M7BV6w!VF!)H|D=pOfI*ck20gSwYRr-cKSdj2c{gw zzq^@4m~~a>7+x=s2_4BB70XabtD}aP7$WMQi)qq~LHNPY2SI}fof}|! zE-EVGu`sB7*L{H=Kc6Lw@pmee5LIOAnF$QA*QcAD~m|2CE zfsF}$iH-dL3}ZP4025$EHi3+x@JhYy#-=~hykF!4h$joZ>@h%=Psj^2lvD8J5nQW3 zf*F{CCISGB=3EBkzq@m_7_y&%nzvr^e7&uql#~=_A2{<)3i78{$i4hry*QpBAt69R zP{b>iZjtZ;7^wVJ1i%BLN5RFx&7l!6dB(j%%2b7tpMxfd7p%aK>0gcW@;DInQmy94 zXhacxSaPYnUK6ibS>XpdTCc9Itd4<5pqDuy(hJHCd?m^j9L|582TT|kE%5$11?BwLct%42BvnV$T@W4x`}{l*0KPFdM%vX~oW{7w-Y zD7k?~n7V1(mIplggG*qTZg2A=^G%>-Dl8%bq%&DrSykhoG6Twh>{LJ*@X~&L!xwQn zI-x3U6FD=;BtsRE&v@(wJ6{p9`Hr2em#@msZB4 z0<=G5Cw$A3KDi9I#lslNw-JlIhudTv-$a+Y0Bl6O{#KM=NAfc^2@(w$VF4q>cXxMSmRoA;*M4}*j#7aK4~uHiM?H$u2IM*}H)?FwBrhGu zGR1BOZVx*#K;F@}`;9BxBjgM+i#I@4Byz-42N_9-E!gQ~op}priF(>`vs4F@xuTV~L;d^^o*!$U28M+A z;z-awc(X4r0&$S06CdA4#|{139(Q83AE9Zs=UJ92jKzU9E%Q7SBz=X|WGfgamLuxi zsJ!7HIet+Tep{a;?jG>S5`h+oRwnmQ8>H9L>E;8%4~2#%PAAxWj~naYye@X8hH3U- zK&?dEN&w4aoo{pn`7WbEDdD5%4tSHugJ^jU`CY%25Ld#aJ=uKi^AD{=Dkk%dBPfmL zPaTvIihnsIOsd-nZ5YbJ9-_)P)I&5Xrxx?%w^S}sMQZgTA|gWG0-p2PvkwFtovm-e z$@IS*y;B&1>z}~MRJGe2^~z}i?W|ATAxgvir zQYs?=Ton=7M$T0dTTD=-a;CSg)|B;+l|(|#-NY{9D`F~($;M9iu*n^-3O_8Six1O& z*2f1VLW5HloOPw$fIY-Xb!ONgg<<5zXK3_q5|4+|wx;$4vq;|C3{@yRXNWRj_ z-rny!7^I9;F1!p33Zm4PEKr3}t1){S$w(Usf)xnlASS%P$Fwh24I$;hyZ0;SbBPQ< zkNogF7N#T2jyB8r~m`d$w}XAW>klz z?hB!JiDH1mp27{t8%yIlIk%`s*JUMk0lD+%mhsUP;_vFNX~?-JA#I5OhzS`4)Vnv7 zxPG7z=FsUp38`SMymcOauIc^<4ZPuG=nbI*QGmyZQBbWfsuhPE?fxgsu;6bRiyMur8?6j~B~z_Rf-O->!JW8shQRBHv^;iN>&RPOUDX0ws?CV-1% z9`f|+Ih;EcJUd%3RI=tLAdOFdA92Vp^$y3bSQT?wryZa>Sg5^c`~92~5u6I)7~&W{ zzx&ZhY5KFs>lCB_KY;>0cthNl#^L#8vIUp6TqBQzL~9`H1Xwwk-8BT(%*Mgtas2x& z*ukX^kdRLc`(?ZzS^;WQPp^)tx>6rQCyY~70Amit*%eA_3&MN4X8wxi1NR6=7Kvwu z#~(^7o4c`gY!48MTra++fQ#)USNIpC^T%g8mFI$%xi~>vS9nMFb<*mh7_LMw&aSfr z^3C__*(|^2mXD!{RKm>j5$;}VaVR_iWGf@mymUn`vc4w7<2rz$ON7eKUJc6B)0_mr zq?6*otMl+O()u4J9lNlio)OJLyF1G^s@I*b1atodEj7*SeBfAhS0{h&B7z-hB1oK-C-okO|d^d7^f?Dg9 z%D-qduz=Q{im^mFGa!YUCY|FYKBuXPR;p60BMN>Dj5I#yZe6YKl|b%y;sUroBk8sp zs&%AltA_-kgb6ksJuM*kK!CwYt|XtS z3InFC5rY6gz#a#oPIu^coy{7ufTnt4S5j?h!0GPH39z&0)U>p;OiU53ht;A>bod?A z5`=lVs)9Z=k)=SYaSo1B7iQedM6+O7PWcriuP0Gp}27L5cp9mre-c~*ne z4wP6XMDGWKfe#k(0*SzJD{6s8C8zy%jA+Q()lXDpRsoYaS7O9*m6e$#+ z)o~Q7RsLWlO~iBgYs6wTnCXY#T6K z&;bi@7iOtcKwv_h>cNg0b=c!(k0UBiY>0}LHJbO3gPHjX=!U6Ro9Kgt@Bzquhtz65 z5sV22Z;lE=zl>A^SVO5@1kbVRgapD}#9_kw>hf|gBuScRx0}6MFm3?ur5)|)KFA~y z`oS>HR~lq!!deF~RElAu_tZatG?&M5AFaG*TwGig%nw%p<9>e37&}_c6>EwIUJXEB z&I=B(kQkoez@Cf$l?d$`lMF3;{*R_Z_ys;HOO)ie{}NPuLro@_J(si1Ky(93DYirmbJady4N4+ZLUpM%l{^+vp|KC)a9D|Jn!5f zUC`ci!`vhMrNb7?!5iQBdG|*-+57A@Zaka%{y3|Fx$ZJYP{yJuYj%wuE zd!#f#@W2{;U^EiCNXc;*Yg-?t>@f>yy8a@1s|BPe*spH8x`fltA@Az|UtQoMBedOx zX5#Ke<|U2XN5h;bbyX@~6kg-lQx$ z=<-d@XUO8ST_r7VVV}+UAYydfFOz^bmDtl?^YcrXK)0rfAViVU@1gzOCECkDS41OB z3T7%Q@3c$tdlrNc8>pa@`|ant1u*o$$?!f$6i7M<0i;p#lS-KH;1DSz7ZrfE6^g>< zh5lkMEoYHtW87CCBep|)X(rosX`?j&!b)%Q@qwq8JKP+5CZSzvfMzzV_fDhE3br5T z?6o|2@v)VGwAo9|yA`}dTb(LLrL&1SEPxV<;qTr^JGTfRMAm_>OXtqa-}@Z@UM;oX z8kEYwE4Q68j$U0{p-o^J6QpZZs6TkKvZj`G2TlM5_V8DrPMYOI6T zZhJGRt_;Uy2o7bkL2Cg7fVZ148K#JAX~)rS`SDh~2&nS1mcxxBZR-8(JF0{Q^;PnF zmo%o`Z?>j;ySr@za><;q=5$pdCUT{?l>J4u!9P#+e^OoR_zj0?qt+y~Xk@5m@O>kW zGC0a98@S?esS8)7y4xhK*^c;_`M$FSeQ|`lLN|%w*ClD{rM9mRzZIQ30?*kWh=5(- z?nb`Fhhm>=T<6E?Kih`bUN%cogtrH4x?$^{N=Qi+f&?BE8e&?@sSMHq@DG~E{rCn- z@^y8bfy)3w-`v!cyhlP3XIVvj5-n2NhpzO=D@?PS5-mnY^acR^?wXc+Ti~S!doXT# z%~!#j4dCe*WSp0c#hx#uf#gt#;XaQ$>cJLFBg%@`9J^_39Mb+f> zZ7nz7D>iMkd#5h*#=G+Om|hpgY>s|<`nA(yVf$I*d4+5dHivsa-iHSOSZa{swIlT$U7}E!sIV+CjWGi73?W{Jr z-f|L4p^lalw{|9!Ot|us_ve^k{Hcp8_sYsTdX&!1XjRUHR0M$I$yUJCn-Tk1!2$95{)Ihktr$?j|!%aXG1{8BKyWeIjAfYVvUoFFR0PN@! z13v;%Dtn|GAS*y=g@KCtXd^5rC?hg$R<2Mqm}P&Dip`C%Hjpe`>Kk#Y!O>&Q5+?M$ zxe@Kl?ycsMHwF+xlpvS}yH&W~&HXm{M!5X8tVtPse|A`t(qv65Z`<%e7tOY=X2tSu z>M>if)yP8KI|qDhAc;knm8p1)(501|Q$)#ci$}W;duo2&urd z!}=njqoZRE0&T-bx@9mYURdoh&)0qaTJ!DQU7zhMq!r2-kzOb?aXVt4T8KfY)^&>4t*YIo3$@Ojq-w&bp*a7ApZ z3S=8Q_Nb~35z*J<&Eny0`>bG-ku83{J==%l7MRLIjXDR~=C%>YytM@c;?Zj+WkD38Z;S*QrCUSlEmr zr^ZVe?Vk{E{0p0eMCUR68F>Q}VFp5;3~wmzT+4oB9j?UF;Ef-rBnJ#TTHAe;+97Rl zT!j-Iy#F;*gdMU!jk@<&=zTObwIAT@PNXt8MbeK`0*KD-y#@2oen8kJA$k=7W|X0k zHx3IBjpvUZVd4o|!B7eVKl#WOlOb93|6C#;KfhM6Zkle!?&rpguPwVOf41;F8*~e& z*Nl}bDFowrW?hIt7i(?N+unG3WT#eh_wlvg{;xWi9%2udoB_qx9}53Wx6i(jRqF;U z(j#^$-3Bq{zq49+)hZE{P~bAiKvjL*XEw2mv?k)UU@E^5!JC|6Vd%0zBL})HjenOV zunsR`%Dl_U8G~iXK`{}J6}$=Cz;XQv%|&tz)4{1>6tWQG6wkxwMo*`5NUI^i{rMt+ z(0M%Vm$de1GqJ4%dbk%|==~mMQpSfr*0{IYeeIDE^#_#J&uek(>{&?I%JdrkFIuv^ z)AU3GW;;SN0$!_EmLe%0ok8S-;OYp~9m4!&b@o_?goq*2b7((K#m%tz1gFH~`}RkN zUwj^AE6Lqusu1PNwn4g)BsIo!jS-4(Z0d|GeGfRW`R})MHjq=Uf=UkT8>`$G?_4gX zL+vp%8<~ZEFwRGX=1ls<0#K@LhenWzSYgw%;uX0cH{%eU*23W7X zTnJXCj5#eu0+%bMZNPviz)|9{BtW9hMM1|}@Ir6#)5joZut(>y&ZCfiiqrscTqA56 z(xyb$9kuM81cvt~wzhy#dtr9@sUFYBHw$uwCA*uWzGdd!b8)ZeV)0AYoX*nZKMi0M z`ey);lDFK`fa5S0}JH{-L&y!{7!B7h+=mfj>+`n9l?{kklA3f3d zJ+A4+XV|$2*vQ>WGFI180<8L`lx_jAocNFTOX?l!1uUyQrK_T^;g9g@8P`7OF?&Iw zM3NwdM!QrThgj^{`JsVcVgCrqhIw!rzc@g3_-eHuw0e=*y9i#`>2<6;1pqe6T{^%e zj-^58NLe8^Z^5DJ-qJdW!(qE~I_+Y{#g#4y1t}Cz`tZ8S28DcLtwQ_r4w0Fk|A;Y} z1c>>D1P?JQXV6Wbc)fTDOd2*#GO=sI)9UGmEb*Je8b2lmKl(3VSxCMm5%kfT8E*3H ztCd-n+`Jz4e;*B?g+<~|vz^eZv%ZN{x#YO}=~i3tvt_S)-EgB!EEIz!0bqG@TS)qH zcK(8wnf4Cc3b;7JkxiUk!14yA;8iOI$C=#JWEWd}Z~39nrLAsK_*1F4n4Z44;FbB9 zf)sAH`tu5jk5p7Blq}wXI+*Pg-}woAMfK8t-wl!M&nL6$MoCB2M;~l(h0}6fEU4~t ztqxwTGY}G!xwuFbM&82p0(JLm|HsWWP0ZffFfa%}vwIC)NgwZ&Jk%o=y=rf){zPw1 zVQjo)Y3eZy%nR81`i$bK5A189 zzWS_<+mr^|PpgMF?#N#VbpK}TdCeQwLcJ=?XE?a{T3-Q({$92Xy!`HF9~)D#`H$eo zI&yMyv68rCWF=!pcHE?`#=3!@sDW;)&0*o9vGN2ys?*v&CF`xmEa&YSYN%!9$GKBF zj!Oh;!A+o`g-k1wX7}tINjoV%K01}~N15ZLDftmfTU2sYNP3S;KmXYSe;{5Z1k6>UVV<*1Dq^ zh1mrhhnSd{ptX*VpF4$5Cyn1DsfS1Ht4Y6e=;+Z;S84GJ-Qs%Kzh}XrtWddEU!!qL zI~)Ft&0VMuvw@8zxZ^FCwZ(%kf-AlKlEAG|j~43uFrz12vdXrU%Wj7=dn*NF__>wP zR0Zsd+6Yw%?VF+@NJZ594;c12L!aKrM41owmp3($xWmK1zz{DpG{0S|nzM<^Dov>U z4%#Afb39B;^2JI$Jw3G4xO5*e|13@vA5W(7TH#Q(F##ps3kEt%7ZQI{j4YXjlX-K?)Rc` z6{|7EgnOJa91IJ}mT6jb0sG>%S8VhtIeIHB42)p;+Pc>7$D|@P zG(}fD-D9;~Fpk*d{I+6{wx= zTF>P_YKZ8|PCm%^f>}6T+~6H&gG{3_V(LYBgfdMLlfxKFfrJw^FXoL=ns%*>*4vx7 zSH=PZbg)4D>~yFUGePV+mKc^j6miAkfJ@;VNr5Zq8$Aq6TaAq^BU0y(mv3x0YRZ=l z4%_L?osA8AP~Qa=ov&ZN#>I6DNdCRDkG;L9ZWa{UV2&f);GIbF$&(HI7xM}1x~DC& z55(X9UD%H&#)#r)sgOwmmde-sN3Al9=v_j1e)_!pT~#|aXzKzF<1O~R7(9Z^l$8-J zSGZJ_y^W4!M7VpIi+UJTv7hQ{5MW@YB^)gFU+SiFML4_9UB77{2v~?mY-nr@#$Os7 z9$qKUXZmwH`<59DDC48!%CBNEKCpAs8i$<>;0%0@=(2_PAv$|GbW@M4Nt7VATqg4B z_En9{gytvqT&3dN#1nV*lTsulu48hv*m1jm@QR34EX#} zf|=1E($Kg_)Zm>>R5;D?2bO$8J7O|7x;)(j9{iHyftanLDVoLchOT_kKlgQGlZ0dS zflIcy8ijXDSwzXfD%xFl2yq}BN5|;e%|J%QK%rb#&X%Bx+{jWwDExawg8sZ0BkD(< zi1Sx-%~fgj?6Cb@z`I2e&$A9Xp<&?)QQhll>XE#=vfb^1TXNdn~aHh0orbB?#Fy}?t*v8qC# zdjqU;>_Pcf1l;dKmgD1+^>q`!jNe+!Mr_!v23~%Sxmcjw0;!BxTvN=Q!2QqKcbXQJ z1ma(_?ez^UKNJ;1b}53#1z@!Pa*7V8Bi#>98X8-RJB=6tY%YwuSB*VL^V2SNz!kw( zFJ_4~Uds*0((gYAgaw>G*(014*dgDNz4>ykLdK)CmhUK%M*Nv?o#{sV*VIhxIcqDk z;FbTN@HL*w=Ad^A`u5qio5ibE6H-?h+8`V&a}=i_*1NG?SBsKiyY*f)9Pk%oqkYQu z;_Lnso7oua;7OGy6TtCk z^^ldK-B*X!Vr5h`_aI4e2#SH~t&q@5i~53dG^ZR4VhdL-@|B}BVid@xwx#7kTbm$I z&?P6gjP`*XLqcPFA-nDEjPde~Ml=jd_%D3dPy9}=8KH6Uh0|aD3u~{Z?7`!w!1&Ne zm%ZkhEL*z)yW%Zft>Fe|+ufMfap@1)S<4pO+0oQfTjOue)1PJZUqxzmAI-tUSoT7) z4!r$_A;;3?VqmvG)qFR{9F`I7Whdy+CNC)%yE@+r zzO7LBD}GfjA1#bOh#gnduLabt80e0X&E1Y8t_){A{gKDm`uZ=kHBtFK=$%5DIkB~w zMCGQ9s#$n^z%f?)<*1-_ePx$u{&X+!oLm%xgq#P6cSHXqh4e2*gMh1>KkgQs?Cdt> zmD1nqOlkI)KEIs$%pYhc83^X)LW46hGRDTn01q`A+yAlZ07^QSDVWu>TXdNZgY=K9 zPNqgt_{;U^ThptM{y6EP!m*c&7wWXDV|ZZIk%XoFR|_0hj``)I?(513FBT(IaX2b_ zu|EbM9v;G!R-5)nUpU?Ws>YrB@_?Q3=crZGU)7#CS$l5O5t2PL^kI~yr-3q#;wxOV zFA6%kg_Xht*1#+4DuYyxnS3zo^|)y|&G zIi-@z9_=%CH+EX(U)qs)c|-pcLGzV!|MiFRZ$NrsmhZDa<+EsQGmde)sn@*c=hqE<{pYA~f2|SKEsCow zZ}hS9d==&D2QIqWPt2HfRkc^KF#XJWcr|^HW4&_VQoO~#y(^pqu%1`3Us{x$U0f!l z3_ZxBTkPOqU{r$8$k}25_H(RE*aroT8Dw>ABqr5rFU!i7h5il-=Px)oEM{#?@&nP+ z^t4*L7^~syXSn9L-6c=TrP_I}^s}Y@_*lxd@AZvd2qkr@a7G^ETCrg@>CHo>u<~J) zm1U|1k&cWtqdR9nM;)NMfQc+GFP~PkfCh#Zhugp@Fqrf69Lr=-=P?C-pUk%#g^1l~ zHy!Ky$Ot0^g{MC*k%m!VhL^uTF_E3wXEYS9KWAAhTda1VTyDN;3;#ZBZs{h(e2-ip zjeC5I%i`8sf!1#8X&=O9oaJ&bhd^ zl&G~7Ze-#Vk6L7Vdi^k&=}-BH9nS7*mJAHx3BRU-Pu0QB|p@-xbr^8PDnAu~GB1jMA0e zs~3I?&%>1?q@%);;s`h2datHB21D1hF7JJf{ovx^%{vw{PDne9o9O0pOG^ z;#~1>GbkV}pkUJ)%@g{B7)k-`i900>Y95mNhsZ&kP)F`DlW*J@FqrN?H*TU=agN$r zhg052X|}`5up!IcS`-4d_HjZNIAlt>i})Nv^*MB|a=UjGucgn?CWIs%w#mvXe3ADA zXG6ii#5zFs^kye-7Z~k98jdaH25;gJt2G^`uJ|x>Mi-Q>!D@GjppH! zs?LE!t$JhpGjJLEwL-KJrl#LTThLnIYO{W6n*M;|Z3E&Ezan*#Dp<&iVCd$^NBsCM zW#(R;eU?Y;5`G*kh01rZuFRjc@r%{9hLSZ{TO-GpLGyIbdttWZqD7ar9Hbi>A8z_v z6f&plk}<4MjDH5~?d7?@XE~TY&KXu>`8Bn=za=o|5|W-@cgg(@`PDJr{MG){`MCi6 zv;fE}dY&YJjNUWh&yUAx_$>csdGMV51zxYacY0dalTR&Mq=+4hN+*5+AN;Ac?qp!s zb2K~nt13Z7#W!a;1MD)*yB>q=@4YQ@nK2T5P1Wjm>u=1`Ecf`Ae}+D7x-Hx6|EV%5 z(p{(wg8wALwT!FN3k(QY#Ltt;AHSoT$*?&Iz%mT~dl{LiZVJ13X|5@n;MqWaZJ^p+ zopei7W5u)F5%wUHfnIqO^swbf@*95+F+&QUxiXOSjy1{In8rQDbhNicIx|M6uWufo zb=S6L;~AodI`R~yfyH++-S|1wyvZwtuep~U@fJRdqD zb!*9b{DJSsRa=(W%O3OdYFd!q0XGX0WVaN}i_kmj9RuW6|6iC5cJEk%-_yZQXPF*+ zE!ES0_D(XJfX&6p6Gh4ku-8Endx? zawK1$Dq{tAHbaPEkHA|LOBj%@!syV1feewPb8iA4Lq@Zq#R6ls zDnl{=YzS}t;KO=5wv*Dl?sHncli6XB9``dOkF)*!t!)n4&5q2gv)!oCY?KsL(Ps0e zkS_2v%t~FPxj_$7D4<@``z%QR$p&YWTjSf<^XJbu?HZ!KUZkpQ4{&pp=<3c>WiHnmwz#;;o?V*k4fE)&PesI&~e^xyQ2UDON5GQ)# z52jJ)rdu1(q9!%M(*`?Amf+vtf?9yv zxiYR@tFR1zp|2zhQU4e+o~-$y^+C)Qes0*MGV1+|pW4SaGEdWpx@g2q+DBV|PS;$u z9YGC|s}}-(X%PB&M|hD44l+`e#8cYmOJFF(?u^cZnv9LyrcYgWX^fqXAH#-&2_!k zRMqJZH__&Eu1nzKB+^L!bJlP;GMnRmKw7+-Kzgn_EERIIZS*GlLm^Zwo7Z((yTJN# z(7V6n{!{+DpRa+O$KSQCj4`99pePa*_2sJey0>I?E3&qUS>APgoN=|gSuV8E`7C@T zv*OijkZv4Qr(3Sp{`1@9#Q)>Be;VKsPFYl7iwu|E$emA)h4p_5pUmd^-Qu>OAmh{v zk-e)NZB)B@8Px(SZFzV`ps2ilV7fWo@wbgM07TVMe)!<%JyI zWS)4a2|lC0?OCHkaahPL54C>0;`^rwfJt#1;H3d}j*Hc{w65xOAO$6|NRyXl?8FqFUwM>T&Rc}mYvV6# z`XO0(r?=a*>g?p4&!K_g@qYpXj2L!9RdqtwmWPi~XWR8Jy+z`IbOKZ&T5RS@OsThe zc*-TBW%xR@2?)58BBY_L3mMwur=1fM(VEl3-^R*XCr{9fQ=$i^#y(vuo0#^_F!F!n zi=kInQlJB}B~^8Kc3+BFf;Ci8W(%&`D4{Wt^?z7m@em|z*!mkD+i8tUd+}f;5VU!jrBSH6wzDg01){NsJ-f^%W<>Be0w zone*b1F{Qj3Qy~>R$B@W^LPzF|E>05xZYpo0KARSY}InQ5TC=Y)hZdFRokk*fhH3mG{Ce63UmBILOL&FS`f|$qBpN5*x-Dma#rgtLL^`zDDk%OiQKL?f@c7|b(>(epwxt94d-Mav? z0@=oucDrU0Ft7c^9a|;jX84>YsI-9qZ zF+Kq}lF{HXBiHZj806>VeAlEu6XkfvmH>_R!*YOJcJ@aDp`G_VIUI#kZ@z>(q=EZd z4E*0y;Qv_v%l~<1KGB?=9TYy9v8>WnEPYpT5Q@RT#+BuyS!+>Te~pZ*k$1nVdg6r0 z)|{J&fI@SzHy7#t`Er@)Y)3#?fRl&Ea-qq)xYA_u0^DxBNZ29DEyGviKGVOQ@!o{x z8IeiJfibJX$Y(cWt!&z{B|BV}3md0Ry9i~5xi&WrZ0eFHw$3wEfi$&M=HX=Kuat@e zF~lq-?{VJexQgybr``%(?3bL16suuO7OMyI(U?=WWFf`{qKkx1goizwm&qzr1IhQ! znR5$eF*eUO?I+PmhrmlagxI~ghwR$Je!7u9x}FfH@aAeCM7QkzX%)EwLXLg6bJJYe z()zl(rXz7%=bInb0L_z?eQZaeT$kE)xa_8Ct6ZWHR1L=$=z4b(lb82k)aiU?(t2Z| z>Oc4YxEl@_sY1m2+X71G%}4FoWeEr}qQ>W&t0%$j=@~3~z3Pf@C&Y}a zZ<2{WMh~u>j0B9*EV>ykJf|~FyJd^;9!4A6d1g!`eKrv9LHA+&cay;o5gR4Y3S!KU z(#NYhMq%W|#nLUx<){WH1tvHYTlEJduR7J*4A7 zgEbWNeQl#RlLcp(&B0Rf`wPVEw1xug$S&Hgcjwtv>s7|j)((CQn3hz%E!p~vrZ!t= z4S(emJhcQluBW7x1N=9445U4g;1;a}kBo{Gt1xS-89um^K;^8@hQ039LsJQ zIvGSpRqOz(ⅅl2LhO9VkScW_%Fl%zyIZ#OLC))tmp@n81`MWpd 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