From d9ed4619509f94493cbee1238b9a13a12dc9a6d7 Mon Sep 17 00:00:00 2001 From: grro Date: Sun, 11 Apr 2021 19:47:27 +0200 Subject: [PATCH] [WebThing] Initial contribution (#9555) Signed-off-by: Gregor Roth --- CODEOWNERS | 1 + bundles/org.openhab.binding.webthing/NOTICE | 13 + .../org.openhab.binding.webthing/README.md | 106 ++++ .../docs/channels.png | Bin 0 -> 83048 bytes .../docs/discovery.png | Bin 0 -> 92446 bytes .../docs/sitemap.png | Bin 0 -> 29029 bytes .../docs/speedmonitor.png | Bin 0 -> 66100 bytes .../docs/webthing_description.png | Bin 0 -> 122538 bytes bundles/org.openhab.binding.webthing/pom.xml | 16 + .../src/main/feature/feature.xml | 10 + .../webthing/internal/ChannelHandler.java | 58 ++ .../internal/WebThingBindingConstants.java | 38 ++ .../internal/WebThingConfiguration.java | 31 ++ .../webthing/internal/WebThingHandler.java | 298 +++++++++++ .../internal/WebThingHandlerFactory.java | 58 ++ .../webthing/internal/channel/Channels.java | 74 +++ .../internal/client/ConsumedThing.java | 70 +++ .../internal/client/ConsumedThingFactory.java | 50 ++ .../internal/client/ConsumedThingImpl.java | 262 +++++++++ .../internal/client/DescriptionLoader.java | 97 ++++ .../client/PropertyAccessException.java | 44 ++ .../internal/client/WebSocketConnection.java | 45 ++ .../client/WebSocketConnectionFactory.java | 56 ++ .../client/WebSocketConnectionImpl.java | 185 +++++++ .../webthing/internal/client/dto/Link.java | 25 + .../internal/client/dto/Property.java | 40 ++ .../client/dto/PropertyStatusMessage.java | 32 ++ .../client/dto/WebThingDescription.java | 67 +++ .../discovery/WebthingDiscoveryService.java | 297 +++++++++++ .../internal/link/ChannelToPropertyLink.java | 84 +++ .../internal/link/PropertyToChannelLink.java | 76 +++ .../webthing/internal/link/TypeConverter.java | 42 ++ .../internal/link/TypeConverters.java | 179 +++++++ .../webthing/internal/link/TypeMapping.java | 143 +++++ .../link/UnknownPropertyException.java | 34 ++ .../main/resources/OH-INF/binding/binding.xml | 8 + .../resources/OH-INF/thing/thing-types.xml | 60 +++ .../internal/client/DescriptionTest.java | 60 +++ .../webthing/internal/client/Mocks.java | 78 +++ .../internal/client/WebthingTest.java | 501 ++++++++++++++++++ .../internal/link/TypeConverterTest.java | 58 ++ .../link/WebthingChannelLinkTest.java | 206 +++++++ .../test/resources/awning_array_response.json | 394 ++++++++++++++ .../src/test/resources/awning_property.json | 1 + .../src/test/resources/awning_response.json | 98 ++++ .../resources/datatypes_test_response.json | 209 ++++++++ .../src/test/resources/number_prop.json | 1 + .../resources/unknownschema_response.json | 98 ++++ .../test/resources/unsetschema_response.json | 55 ++ .../resources/virtual-things_response.json | 75 +++ .../test/resources/windsensor_property.json | 3 + .../test/resources/windsensor_response.json | 56 ++ ...dsensor_response_without_websocketuri.json | 52 ++ bundles/pom.xml | 1 + 54 files changed, 4545 insertions(+) create mode 100644 bundles/org.openhab.binding.webthing/NOTICE create mode 100644 bundles/org.openhab.binding.webthing/README.md create mode 100644 bundles/org.openhab.binding.webthing/docs/channels.png create mode 100644 bundles/org.openhab.binding.webthing/docs/discovery.png create mode 100644 bundles/org.openhab.binding.webthing/docs/sitemap.png create mode 100644 bundles/org.openhab.binding.webthing/docs/speedmonitor.png create mode 100644 bundles/org.openhab.binding.webthing/docs/webthing_description.png create mode 100644 bundles/org.openhab.binding.webthing/pom.xml create mode 100644 bundles/org.openhab.binding.webthing/src/main/feature/feature.xml create mode 100644 bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/ChannelHandler.java create mode 100644 bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/WebThingBindingConstants.java create mode 100644 bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/WebThingConfiguration.java create mode 100644 bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/WebThingHandler.java create mode 100644 bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/WebThingHandlerFactory.java create mode 100644 bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/channel/Channels.java create mode 100644 bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/ConsumedThing.java create mode 100644 bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/ConsumedThingFactory.java create mode 100644 bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/ConsumedThingImpl.java create mode 100644 bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/DescriptionLoader.java create mode 100644 bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/PropertyAccessException.java create mode 100644 bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/WebSocketConnection.java create mode 100644 bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/WebSocketConnectionFactory.java create mode 100644 bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/WebSocketConnectionImpl.java create mode 100644 bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/dto/Link.java create mode 100644 bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/dto/Property.java create mode 100644 bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/dto/PropertyStatusMessage.java create mode 100644 bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/dto/WebThingDescription.java create mode 100644 bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/discovery/WebthingDiscoveryService.java create mode 100644 bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/link/ChannelToPropertyLink.java create mode 100644 bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/link/PropertyToChannelLink.java create mode 100644 bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/link/TypeConverter.java create mode 100644 bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/link/TypeConverters.java create mode 100644 bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/link/TypeMapping.java create mode 100644 bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/link/UnknownPropertyException.java create mode 100644 bundles/org.openhab.binding.webthing/src/main/resources/OH-INF/binding/binding.xml create mode 100644 bundles/org.openhab.binding.webthing/src/main/resources/OH-INF/thing/thing-types.xml create mode 100644 bundles/org.openhab.binding.webthing/src/test/java/org/openhab/binding/webthing/internal/client/DescriptionTest.java create mode 100644 bundles/org.openhab.binding.webthing/src/test/java/org/openhab/binding/webthing/internal/client/Mocks.java create mode 100644 bundles/org.openhab.binding.webthing/src/test/java/org/openhab/binding/webthing/internal/client/WebthingTest.java create mode 100644 bundles/org.openhab.binding.webthing/src/test/java/org/openhab/binding/webthing/internal/link/TypeConverterTest.java create mode 100644 bundles/org.openhab.binding.webthing/src/test/java/org/openhab/binding/webthing/internal/link/WebthingChannelLinkTest.java create mode 100644 bundles/org.openhab.binding.webthing/src/test/resources/awning_array_response.json create mode 100644 bundles/org.openhab.binding.webthing/src/test/resources/awning_property.json create mode 100644 bundles/org.openhab.binding.webthing/src/test/resources/awning_response.json create mode 100644 bundles/org.openhab.binding.webthing/src/test/resources/datatypes_test_response.json create mode 100644 bundles/org.openhab.binding.webthing/src/test/resources/number_prop.json create mode 100644 bundles/org.openhab.binding.webthing/src/test/resources/unknownschema_response.json create mode 100644 bundles/org.openhab.binding.webthing/src/test/resources/unsetschema_response.json create mode 100644 bundles/org.openhab.binding.webthing/src/test/resources/virtual-things_response.json create mode 100644 bundles/org.openhab.binding.webthing/src/test/resources/windsensor_property.json create mode 100644 bundles/org.openhab.binding.webthing/src/test/resources/windsensor_response.json create mode 100644 bundles/org.openhab.binding.webthing/src/test/resources/windsensor_response_without_websocketuri.json diff --git a/CODEOWNERS b/CODEOWNERS index 0f9c7f908..6304d89eb 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -295,6 +295,7 @@ /bundles/org.openhab.binding.volvooncall/ @clinique /bundles/org.openhab.binding.weathercompany/ @mhilbush /bundles/org.openhab.binding.weatherunderground/ @lolodomo +/bundles/org.openhab.binding.webthing/ @grro /bundles/org.openhab.binding.wemo/ @hmerk /bundles/org.openhab.binding.wifiled/ @rvt @xylo /bundles/org.openhab.binding.windcentrale/ @marcelrv diff --git a/bundles/org.openhab.binding.webthing/NOTICE b/bundles/org.openhab.binding.webthing/NOTICE new file mode 100644 index 000000000..38d625e34 --- /dev/null +++ b/bundles/org.openhab.binding.webthing/NOTICE @@ -0,0 +1,13 @@ +This content is produced and maintained by the openHAB project. + +* Project home: https://www.openhab.org + +== Declared Project Licenses + +This program and the accompanying materials are made available under the terms +of the Eclipse Public License 2.0 which is available at +https://www.eclipse.org/legal/epl-2.0/. + +== Source Code + +https://github.com/openhab/openhab-addons diff --git a/bundles/org.openhab.binding.webthing/README.md b/bundles/org.openhab.binding.webthing/README.md new file mode 100644 index 000000000..0de308663 --- /dev/null +++ b/bundles/org.openhab.binding.webthing/README.md @@ -0,0 +1,106 @@ +# WebThing Binding + +The WebThing binding supports an interface to smart home device supporting the Web Thing API. + +The [Web Thing API](https://iot.mozilla.org/wot/) describes an open and generic standard to discover and link smart home devices +like motion sensors, web-connected displays or awning controls. Devices implementing the Web Thing standard can be integrated +into smart home systems such as openHAB to monitor and control them. +These days, the Web Thing API is primarily used by makers to provide a common API to their physical devices. +For instance, the Web Thing API has been used by makers to provide an open way to control [LEDs on a ESP8266 board](https://github.com/WebThingsIO/webthing-arduino) +or to monitor [a PIR motion sensor on Raspberry Pi](https://pypi.org/project/pi-pir-webthing/). + +## Supported Things + +As a generic solution, the WebThing binding does not depend on specific devices. All devices implementing the Web Thing API should be accessible. + + +## Discovery + +Once the binding is activated all reachable **WebThing devices will be detected automatically** (via mDNS). + +## Binding Configuration + +No binding configuration required. + + +## Thing Configuration + +| Parameter | Description | Required | +|----------|--------|-------------| +| webThingURI | the URI of the WebThing | true | + +Due to the discovery support, **no manual Thing configuration is required** in general. However, under certain circumstances textual +Thing configuration may be preferred. In this case, the webThingURI has to be configured as shown in the webthing.things file below: + +``` +Thing webthing:generic:motionsensor [ webThingURI="http://192.168.1.27:9496/" ] +``` + +## Channels + +The supported channels depend on the WebThing device that is connected. Each mappable **WebThing property will be mapped to a dedicated channel, automatically**. For instance, to support the *motion property* of a Motion-Sensor WebThing, a dedicated *motion channel* will be created, automatically. + +| Thing | channel | type | description | +|--------|----------|--------|------------------------------| +| WebThing | Automatic | Automatic | All channels will be generated automatically based on the detected WebThing properties | + +## Full Example + +In the example below WebThings provided by the [Internet Monitor Service](https://pypi.org/project/internet-monitor-webthing/) will be connected. +This service does not require specific hardware or devices. To connect the WebThings, the service has to be installed inside your local network. + + +### Thing + +After installing the WebThing binding you should find the WebThings of your network in the things section of your openHAB administration interface as shown below. + +![discovery picture](docs/discovery.png) + +Here, the WebThings provided by the *Internet Monitor Service*: the *Internet Connectivity* WebThing as well as the +*Internet Speed Monitor* WebThing have been discovered. To add a WebThing as an openHAB Thing click the 'Add as Thing' button. + +![discovery picture](docs/speedmonitor.png) + +Alternatively, you may add the WebThing as a openHAB Thing by using a webthing.thing file that has to be located inside the things folder. + +``` +Thing webthing:generic:speedmonitor [ webThingURI="http://192.168.1.27:9496/0" ] +``` + +Please consider that the *Internet Monitor Service* in this example supports two WebThings. Both WebThings are bound on the +same hostname and port. However, the WebThing URI path of the speed monitor ends with '/0'. In contrast, +the connectivity WebThing URI path ends with '/1' in this example. + +Due to the fact that the WebThing API is based on web technologies, you can validate the WebThing description by opening the WebThing uri in a browser. + +![webthing picture](docs/webthing_description.png) + +### Items + +The *Internet Speed Monitor* WebThing used in this example supports properties such as *downloadspeed*, *uploadspeed* or *ping*. +For each property of the WebThing a dedicated openHAB channel will be created, automatically. The channelUID such +as *webthing:generic:speedmonitor:uploadspeed* is the combination of the thingUID *webthing:generic* and the +WebThing property name *uploadspeed*. + +![channels picture](docs/channels.png) + +These channels may be linked via the channels tab of the graphical user interface or manually via a webthing.items file as shown below + + ``` +Number uploadSpeed "uploadspeed speed [%.0f]" {channel="webthing:generic:speedmonitor:uploadspeed"} +Number downloadSpeed "download speed [%.0f]" {channel="webthing:generic:speedmonitor:downloadspeed"} + + ``` + +### Sitemap + +To add the newly linked WebThing items to the sitemap you place a sitemap file such as the internetmonitor.sitemap file shown below + +``` +sitemap internetmonitor label="Internet Speed Monitor" { + Text item=uploadSpeed + Text item=downloadSpeed +} +``` + +![sitemap picture](docs/sitemap.png) diff --git a/bundles/org.openhab.binding.webthing/docs/channels.png b/bundles/org.openhab.binding.webthing/docs/channels.png new file mode 100644 index 0000000000000000000000000000000000000000..d94606393815949163ded21287cc1a0a1460f820 GIT binary patch literal 83048 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 z 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�p_h;VP8G7l*c>UK@MF-22-tAyZT$Y-Ww{If;YU@=#le9KFf2;hrY0R< z9e05MDvE~~|F?@ag68MDQ&ooL%Lbk%e;F14fyq+ZY+4M$NUo;qL*93$5A@ez|wrhx>DHGWXS7=SmC>caHuR_ zpvTeLzl>iI{zFjy`r98W2<-?$VL1+f`17)cM`^P9VsCzMPNqpZUwD`v)o1XErSl3y zWEGn!zSQH`8=tbZE!3h;VG#W`7cFC^UZ^Iu`{g9BR!VUmaa!d*Xly_G2^68+jrNr6 z!rl-dzE}t&_>8Om896)?B8tb=zuZJT>)T*DRq~?9QQ+%(v!=UC!+ zRkbJmv!lCznlud(Lo{Swg=Nfx%wKBJ_!+ZMmRy*f|Inxka7At^Q+J#CZSmOQKhw0T zQ#St*H*XR3WhKS+yzn|u@*o%BO-${9OHjq{dvWwVXV*&b7loOt*GiR}>0`M2)!ivi z{DkS9%ToTo<>%CzANcW-NLOwTG zNjCTJl?l*XK$m_a?=U<(+!IY9KuAm+vbMIC*O%wud$HdkFe({BBjJIyR~ys9;M8{g z#o2EzWlp1yjg^(~g2Cf(0Ra?;cT6bUwmm-FDqn7;Q?IVB0)Vt)CN^G%9?V+3XJ&(UV*?@& zdq$}gqte@mpoo8NWFz81|F%;%KRnH)>I1f;)rLp|)k?jAW~K>-!9FWq6i89g40Y(> zV}GTvS#LT8d}>ZpYXT?jHF}02_N#d?$&?}ATjtwVo3f(fBbbw&RAi|`zvX$vVDqd~ zqQ82$5_QGV_bP;Iw%}BDPTmvzHwIND#C&gmkdVi2)tX`1iH6vY;-nI-7UHRn5xoP%+=d zdg$aTj__ZLOdxKo0;^Kga=EYh%MvKQz6Amza|Zt@mfD$))`oouzfH zoh7!qb4J;qP!xbh0O)odJ+Y2ai49G4zS^HEsz@@`*2b{kmoUzYRAN+REw_<%G3LHq zs+Zkx?&xaM#-@0x@-$iwdTZSD+Z_IavM9|IYkZIX%gtIiLm2jccO#m<#Qt$)zs1(2 zv=U2C&5#YZ4lgyl_plY9W0Q+I{h2vT-P$RWBh5U4~*A1Wty0KkI_9%4Gp8GP{> zU}9j_$mGNdxw`V|xFuXrUkgIRr_j4x4wNC~F^)EB_P{>ZY-Lmp9+PIIR?(fDp2k(c zOZo5t3qk-$deeNh8YYSr@jQH;vkw#ip`W+_n4!hyP@3pb%PHEb9JKgI#i+xZR$E6W zAwHfCPBl`jki}APbnAHkT2rwnudo!C3rfr1r<_yQN?^-&J6u!?$9dkB{&lqHdT^vG z7(I_Z2-D*$jXK%wAf7+sH3o%W=O8NR*7&9}<1q#epH9vbgITIAK%wIY_8>{);kj(Z zMCTAJGwMFs2S3AkF5_6#zACj$Gt@TJfuI4CQ~`6|D&kp=yw#=(=j$4hEfX(#=D4R} zGkq|>6>^AP`!q{1Cnrwcm*I||r=wkA)}xB%ML5QM9Q1zq`#eJ0?8uYv$Jb2T--t-C zEV=(H21=hmk&4hr%o;+KR}ykpgVO&b`x9^`w2945MMlQZGH}OjBSEpTl@-`#`klw9 zNtgHM0Fcjm850vDKh3ghs|Z!d(Zre$zD+d6rp&92>Bg1YV}t_d1hh(JZEd1}^HLM+ z>%kNrGD%Y1HXcUSq6+`p3+yGb-4aCzelUy>0VN`H!y_`E{LRSPCSZ>ep z3t;gz9x5LwEu&QxFGkAu$xU){d;Y91^#4m@ulk7uZCwl;ySGEz$#W=K^Nq4oRyS`w!8a1MO11-P$$iPn(i=$B1UYq$R5tI;269T5t0*X}~c26D#2 zdKj3vDWCb16Y)>vSoOBcQ^n>-TQdKA0k>=q>AuqMH&PN60+Wj*PJK>BD|j7N)Tqx0 zaINp|hCio`T1B|PHLUu~+owKEl7xoY-m&ta0~WvE9)k zPosRhth3NJO{Nms*eGhXq7h>Jc&{Yv?vk6tXpxZ}r53a`Y4rB)3Xod8x>}D*NJ(MA zLfL)P@PB+u<^C~uXLV)pJPvdopO_ ze!U0OZrPaRqizRV?Dtx1hHNeN(BtAAIC~+VN(x)#L>Q%Bicyu7VdKO$-TJ7L!E@_6BUP8;?TppnxK# z6n#G-eI@#V#-N-+#t%(MxsLSklw2@8e7eBlL+sJgS)JK>J7{8$NI%|>`I$1 z_YB4li2xaPg|lIhj~*+JzSD7I?SsM=$!a>~WO-aSu0IBF=_nPdp7Ys`~E>&Oaf94Nqnz zrp*>FLbmGzrKY1tEtC~6JnUx@LC?nskH{Vu#EhB!BngNK>#ue1SS)`zzYZ9hs0 zKHRw+1HC+s`U{u$}za;lbOXu7hdgkoJWuJj&=;*+Y?P&*|0shGhl0I&5QKP>o21yt+{X zuVqj1+Nr2kR`X{lc_!t-lNtKv_NfrjGZ*$5dc)C2ihV z{^nX_Wpt1k5SHY{OLl69u*8w!&z2qszBEQeWO`FLwOo*7243ngW1xQiFDnAcqB@9q zQRK8QZUMvkuRWRN0NLz!K@%2ZVSlyVAVfbSfVkaql$2b-BA)RjHBDLPtew1tKTY#$ zUGDS%WB7E~Zl{#j!TDu^e?GF62|4$-LxR_$Vqoq1xak8~<>w5xw!3DQN)n5#Er-Un z4b}G!tu}9ql%Gd{`<5j9ZFpvbeQABEk^($MmL888{Ej=6^-nG=QYD0`9SZ@xh-SO) zBD?%6m1BKnmpM$wpNsO-oLQa+Us*2!(6WRXyCduSoWtG`ME%RL)-7$!PB=R!wr-G; zgjo9Q!YwEEw>z%)KH3a^+t)gZO#-Pz;yiG!-c1z7v8aQMlcTJIkwuozj3b0h!s$n4 zL{48XjDGM;e0**Jhm(k#+%&Xv87N-+xDJH$|0!+LBLJ(Zg^fwU8lddEv38F%3W$PCA47VxJj=;UqII@;pta$o{k;~S{9$-1>I z_Omt7*u>1LW`oot6hU39gv`j){j$#gH0XQZe($5Ll)t&_vEdr(%kSBO>aBOr17bmE z{R7+5_8s0Yvp^Yn$UM?sJej_GI%PNJPj<`Lqet+1=0VG`?z6v(ifv$Cuc01+&OEzk zU-_i9!pb=^`$FQl`bv1(zyIoTP@xdRFx&KRJot61x$rYY!^D^9sBA!K_k);9tS07? z%}n({`Bv2^A8Oo!Hv9NHtLap2cM3UW+H>uGR-;+OE1*zinluptoNXhN@ z*wT-GI3{O=QUyKGJlfq^Ag^A8z1bQLYArzWG`R(Z0_=&0{zoe}g)h4dKZaOm`VnDL z_M}QXphzBsdEG2Oe%EpG4`a9LryVHo2|Z0&84D*n8Tf@-WN#l1G^fRQn?M~mk9dWQ z!+Dl{h~lKLG4#rf5sOSTxBF^$>oOYV!*fD2A6|qERj-3tD!NPp9znYG zmg_q#m!_LMn+(qs*ipBON4l&(U(!2nphZ(iC<296YsXEV$63l*9b|jLxkd@WVhml?zq_o%_8xnF ze4I%z2|GJUq8A}uqYZ2&E8zOA-(ZeDa{Ie7RQPWsXU$3iY13T>|^TlJMXC>LjU& zRbIADW51tT9(8VwF20?r`Y zvcAnvz+FnR3}juezY$yWh~v6$4t1^5I>}e|#fAq<@xn&>q(qED>qeJ?q+0Wi`v)sm z(|mdQazI(#h0W|M+dHz>5gmcke?-TpmIyGtWzzu=Nr=vM^@-O-yGX9h7UqoZ&(Kj5 zpx$IoY5k*!arY6KM)32EP<_hS=aqN3R-v&S?w5DODVZOUX`AVw)qtk54|vqiAg1*3 zT+ldhM@GfoFrv@+Ra9^}hx7D$);j3X54*DM4DZXcKgX41(u!ow0}Uirc|ShIDrdD~ zzcrI{ilm;XY{8FP_9Kw?|3mQlY~HR4;3!y(`F6F{o)u;}!+Ce}vR!`qFy-VTrP++n zBd_?!dy15$=*I;=dXIn$lwqYuH!rjC|9VmiA9%KA1QY=Ak`IN+eFK+J^8tFAKc|xYwAG3q!Nf5v{}EhK8U69zEOQc&oO^af)K zQ?pe9pezZ08a4guD!}U9IgjOoI`R4|m5T+l>1uZZ{5f^_n=Lg(-$D9RNvMs2e6?w> zC}UxCcjF1WsISBgTKQo1OEyzm`_RSTVf^gG4NHDpy~=5t^Hzkxi#cjtVq~x1pX`_w zl}o^xwzzs`CcUCFMnZq+Q{e2Cu39)`lgV|?gKwz3I2ivlf`x6_d!wlkU<(#`;u598 zsYpt_(Uz}d7OJ*TrI^%Eu$iG3jL4>zUK2ihoq(ytMphA#ipUSIp=MP39OkVP!9efI zAK=KdwPlsj@IW?(e-SRwYKb zRyNT%wcK!Ws|c)KL>R+deuD*tJOJgBDxW>xlLZbwYgI{!Krj)@NN2ZJF?mmg6SA)X&&iz@?3M~%RT`aO&^Hj29qi&!}h ztM>grn-8L;Ze^~m|CEgzC0F$0=mjlNdT{yAEKC6Oz;p47H{JAZ59N8(S-3Rj3h+I# zFG6$ud_VSv9oD_8>2^gZ?(1XbSSssMhvM=S+rAXjxbhWwOxN#=zPNa-pAk%X1x=(= z2TG#*Qmj8@g5#@5Y?!3w$W^-CZcWdlSh1VY$4q;BqD%(@L9`A(f(8ovTCTq)q!ry8 z=5J4GmcEHs*}$6W$*rm)$0$WL8h#EFZfy-jN?5P09H-98F1wwLX3{gd>QpW=zR0VVx>%m3`DEUA&ZVddgO6_q z9*rAPdd>Un)o|6T7}257_kvOcIqy97ChhcniwkXOTRbMGb*nE72orfxo|BEps<{gh z+p@Dxv8zg5YA^WAA2ePxJ$3~TFzA1t@$SEqkE@HkfAcu=Cd+TY{mQ0ik9=>iN6NDm zUjv5MWEh)W(t+e#iQE%*uBl`x&+w*@14jWK>offBuZ6W)3mINO+%#GBD-gvKlHn9@ zq(*lU!?ZdyLWdNk?p20 zs&UqT5~uC(1V7tv$A3Cy)_AAU(3N-(dGI(bzq*wg?Uechy?ZyJAD!w>Z{7@A*?e`_ z^J>qP{wJEbtG;&i=^t7RG>TWrPXVQ|&s3&M7yK2?*N~QPjvV{uR>eAO7g_oPcn{w* zG=}C5PuchmTI_h$bRuq@zM%u8^%BBDOe>!_xVtBN_M3*Z*D5|cb~`jIMP8mRUbO?f zeXM#JSKBVPbno)KCL*r(jw-&tXm2KJkZb_IH1ekSqG}8;*CrXV{)2A*)F!SwI}Vi98^V)%4;HPqv(x5q80)|^>4kgu3Xr8`cOT)KRBav2NK zpSkD97xi?NRVYAF2ZIuef=*9Btrrom3ydGn%_Sc8ps#+X^EEL2}9V!9rSmoA+2H+N+ zjd!RLgrDTLh)`a6690LJYvx?cXZ6Q2zi*6-P`;rU^|og0ZHj64)m!ppa)RnXxRmen z1im*!rCT%OwVdJ1BxK3iQ})WbYrLwTL=zE=dU1={{-hm~VpifSR-*?*ul*O*oL>BXb6{@p zUvqK6q3rIPfdL})T;JPFCN3Qwbe|V0l~Ui3R@2Avp8l;i0^XXfXp183_y^-O{PeoN zWPtz0rr`uKyjW8G1JnOq^cVXWkyOtq1PZ5#7Cr+sPw4_kaTBq|rGZKZ56;ch+tq$j z45F(wmz_2cax$lOfXSQh{QJ&H+{}MtS|4`-5$*`ZGYtp6cb;1~Iv+7kn#yeKSd}X= zx9!Wm-yA#%;tH@|JScj5h*O4-(n2sfE&Tn@`B21v^HFCh977+J5o`lwqcn3RBYg^x z52rYbZME2UdypleIR3=5ozUYZQ$fK_HvF*3`KZk%W>zp0w{>bUh!ww@bXLYo2>?lvv7Hs$c&anW~DI4x33C zCuQT%@6q|K^1IjXcEUCiU;8k86Kq@nt1w|=bGe07yCg(yFc0ju+SUC$d^T^r^|@!#)9g|T?skG$O9>Jf z-`KC<%?tGes)FyfKgVPQu^L2Ecx>ep0WJ;#Dm-|0;Wt1KycKS!vrk<4Y0>bx-SMU0K?5j)2g?!TE})A8FBG*dIdZpv{Y7t-3Ktn4 zs>?hBY6YiBGi_mFi&!NX%(Yo6HF^IZIXUKJ&cO(|aR!!V@{gtL zRrPKZH?R5>;Q~U}nWRzlOd?bTr7!bpT1akI1Mu91JCY6H!*+w3HD*j@9s=o6gH_ja zgR2f@3hyqU_J$^ipXUWC?-7ha_}B@Z8TCm`A_8YZcuxEHftQYV;&u zT=Qj7L&M@OKf4~2N!k*1@BL)c91&68)i6C+GAj8JGU z?)!`}1UIF)sH-aIha#{8y7$I+Mn^h2}0fU!Htux%NghnJc}ys=c{$3p!0m8)Y8l?8fgbFUFXbTBfokv2xULWVPbgl3f+ z--6mf?tWIx#v~`F%awD>H)5&Q5b{$c7`=%?;B%2(+t|F#F_#VTuP{wB7%w^Oet$J8 z&ZKOZHI`Cf+Q#M{dI{XM(beF-GZpd3DbAzv_eaHwv{8VV#31NYGIh{+Y==Vc7JA6v zzEymw!4uxw2aegvR(gX(++K6#zRme`?T%EJwn%X}fzl2CIyC{1n;q7%zHt1Aj4hEv zjD4Cz+>~xKX_{Ih=B4K5lmFYAuECj4`(U77MNPRQSCWy*AmMWc;&>aYQ(OQC$2C6P zUiq-*HCzQ*+!}*@Fr~|0J$N`d_`4;Vci46R@H4qc25gLKX{klTS*>nVBsX;PMsj-O{itzY{Hrwba?f> z93LIi6e7AzcjL)#1>9(hpR`Kq9nhKK%IZ^TFnAnAWGiDVLV2Ww*vEX}8TX(>y%ytV z6@rAHiqAd{dM>(8yU#Z`J;v)ZH!*riLS_yw#PDS;kr*fB3D28d8aJ_&TFuDK#YtY2 zE4-Dn@_WU}8@a2X%)1%&ovtRM=LMBkVixH#u+L$YaU~^KXq#4<+}BmLUn-CrmOO5y z9O|Z;d)O(Qy%gU?2?}T2LBkXi4uhe_WLEv_3w#fM-2YD?$pF;%kifZ*Wb#_#$SD>UX4&)2;B z(jdk;WC@4Exy=y2k-l+$HXXp&@<^CLi{gHJnuDD@ZWB7o*=*4&Onr}l!?%Aj96i1x zO#9}{tyV?!T(3qL#(aTHPef`+OPF>I5QB$y{W%f=-WenIjrT$|L;Pe*MM$B*zUY+4 zm9-2^P+{yeBn0-#^Rd@4!3FSl+G_VtG3a1UXaGqv@E~wI ze!VCBH%h5*hQBPi7x0IXtl1Mylhwmg1U^j#xg-yjfsR7l^Dqg~Tg)kP!l&dh63np^ z(z#H&SOH;(!exFhl{9#mO}GQt+@Da#2go0`G_jh)t+Se0NPiyRqRI)Xrc-d+cx}jH z)iLlqrZb~_nrq@cw9{Qp2{FRSc^~e388$`>U-k0G3Ov;Am<@(+<9DfV|GiCxQD+hh z$0v1AI>PFX!Twh_9E;PxZ)SznFm$Q6$up7=4W~P;CaYdB7#WeB?B4|v#gFjS z)#Va_ib8r;++5jbKltdQF~tcfR_oY$aU?qL#nja?=2)S}sXJqjd#V|ft?Kx*lM6S5u@xN-6hY7y4 zDn&M<`#X4>4dt$ct|~JdRtaTI;*&`NrB(1?odbI^7ysJk6O5LxLvVKj8gnSTXh&PC z3RcD=y!Hi$;g_hQic4?5Ku!3@Hd?$DsS_v8nK5`nRitYz{R>Pms|q6&SY;IL5X#J* zj9tbDujeEYEI~o5&!xGesZVGdHd#G`T#H|PtSIQU$hUuP17}<)w@4uOxae~p6c>tFa=)$vNmY)LU z!;}lNCyPIee^D7Q@Zp?#yM58SQp?T@UmRwp**6c;phRrryAn7^5}(phME5gt_#HsS zV9&_dUT`nFPa91;EVtb&n5S(gt^hPb4f8n?5hvx#tjtMlnegp3`dhdD<|7LK{&iw3 z_BHM@#B^0-4hQroL9S~kzM0P@4pd5cwifcP^);IbqxWMOWdPct^?dP%X}_wt6t0F74;=Z@9vtcfof8&oVN26z(f!R*$okpu57 zdR4DF?GZMaV;cXbPn;Dpe(KJ95nziSj>kQ$HmA#d4@TY(VJ z+s)SkeF?Y29*)5I;i;usA@6hOC+p3ci?F{&!A}KG)(TShCxPRiX=rV7wJA>^e?PRs z@DkY8P^dVM74F~71&7-N>D#E)6IbeS?ocS_0IMmt6mE-rFs}E&j7_fXVdk(W?6I(}fl} zK+hE_|L-n++_%PF3iBbQVN1@CME$#91oxj|18lKt7qdQKlz@HP(K5oUF94YS|GDCS zO(=R2@Wdwl{%t_uUn98x`;TwlA>uj2<4m&SRHkF?lDK1RKGnuD_l}ukY`o<7C%XoU zY4=UQ9orE6oekl*d|?kE4jLh%WP(GzkT~qBVqL@hC?N^HT41WMNzYK;cYKy94kL0! zQ&SM#P^Kf1-;Yj*QsQ*d;$`&V!6LGosWhajsUR*|_i7T=%@>TiG3AQD@T9rjNS2$9 zBhBLD@?W;W|IZrXx5{#~;=@RhW1E(3Y z8rn`8$#o8Op45Il3E4!r(-dAxJ97*Sp2!3~l#&JeY+VMapqjx9G5 z``S_w#_*K_kM@(RJ>a-}z~Z&kw&)!muBwkLAg%`Ui z;e4+z)yeUFdmpMs8j6GD=EkBi<)R|~|cHf_D;?eFj zU0on445vxDwyf}u@Ov+FCn8t;LTTp2m^jqxWS@IMQi`B$SV z+r`qCZ1eGH#x)1N1BF|#^*5k7*NmgT&>=kW0Fc@?D)&64jr{JhnP1`A#@+@F@~R~J zxX()C3(i+;Qpgez#?*%d7U!Rc$ldwAVJczF5mvu3dzuU$UGN2!yz1jywe2>c4MdCZ zWl2aX?oznC!-;5KI6fCz`8J1f^#+M3^LzCt|7{3v}AT+5DC5%tg_kLIi5Kxi{B^s|0(dL><_GwHP)*AY<7{!%0P3bJr{#xa1A-TGh^v zdsVmJ7IpPoqJ?C{Y^!thH7|Qh2|M``|N8hw7914PTnahVhb)~`c&_~5dR1NU4js>S z|2IYOmyV60uHSFcips@;V#C)pCsHC!yCP@YM$Z_1nQNblC@Cp{X=sTnAvWUZvC)3^ z&41YKn=hC@d;yu-50N?P6-;Yf%8c)H*J*Hlw%5~FH9I4SHSeUAUyjEe*Lf*$UV=EX z9yAPhDE$fu*oB|u5D5D2>zlNp`Otjj{~O+L@*#l+DUOW@=~xz0|6=z*w$6oT-;ym2g&o@mCX9bMUM#N)^(F#P_9uyO3k zI?oECl}q2a4a4Jp@Yj&sM1cW{oV+8B)n z8VjGE+ZKE>4lmn+uYI4mH1+%p`Yi0!QBoscr1forf+7hk+)atXX7TQ0R|~x7R%?I1TGOfdS;rCVmjiT|+`J`rU*83VsRY6Ks_c zo-XYP-cJiSzmmxiYJAnw;i)s^8F*&zhQdaYncd=UEt|`|9KzV^hw&1@NqyigwSiZ` zA0Ct>Zx;ym1I&1Clv#f3g$A?xNz>jm&y9_XvHn7UB0{D~1+YP1L10QS21$C>C! za5^mcdn9amuyV6yX55K#_Fv3sSEDJlq9{5APdLK*;Gida!sc&+D7c2XuwI>NwG9#Y z-e`YFE?3eDN0)LK#!CIF)zpZTyrKHx$yOKP<8I9tXynO>mL-=#Nbr!Lehj7dyFslN z#z|IU9a`1 z2&iWllw*qZd{oh>&NZE7|G+&M;gpR^e1pgNV-%)sD9w(Oajb63YV-od$dsfyABBYH zM@Wagvez+Tthdhb$mjY_ZVm&$Eo}!UD24@r$spc$0}K|Ztww7Oy7}=c$O*v{Ph$^x zls_hnVrx)wTQOhp0`7f)Ub{)9_}z6y^I?Y7WA@kd>|&Kj9IG;RE^O%_T1#NbY;sMN8_SY z68zE=aXb}e3MER&nu>B*yUM|Gn^3sw&4nI~N1YadT_mfGsC_oQl#;~SjDOkm?|uCG zsnk4BOawvt@pjM^VXvaIPP6m~R_l!*x=3F$3jl$8?Y0sE?@%j>wp*VN$A(Z1cR z?&@xzn1={(`q%Wzb7jRch*wU{_nGx`yNl)@@kCpo-xMi7s|O@>LI^o#@ zWs7r>Xw~tk(bUkM6`o&Tv|ZRj-rv?$0`EMwJUP;$I)#lFF-QlmnD5 zG!TKp0kOwtV%^_*iv2_Iua=jWFdeQ*U;FkvbK%9H1-uy9f|z8{Z&rO+?Mi=kZ^Fyi zOaB$(#&f4i#n>+AlDNP2(@1v98FlmTC3I{)0@MVUc;W_j{H=+=Vsn>?6k&umyn`AN z3MxT>;c!RnfiUym&z9mEZ%ZPciYOjW0&iCM>hGigz*YM&xfJ65wfy+qOZNS_(3ZF5(Aqr-*KBY1Lv^qL}6MK!fQc`icA|I;vDbHF4+ynk+qEJ zi~h#(2DqiapSco%Y>83h(~K+dVE;~9+buxoI?lvS8be2o)4tX%!zUDJdVEH3Jg$kf z^wi+1xP}e8-x4-#a^?)@?<9|aNNd$A3zqUe2vuXnQ>L9ZY2v6re&paKjjt)9Ab1&a0y6d%5WjDBNz(bW zN@p75a*+m2FQQI;KvCd)pOYzA#t6IFiQdHoqT&biWCbe@3QQNBMFKo4qRV->g9NeOqYieMNNElY9V3fYUA~=8nN=j2;Fy@p>eAxKzFv~DsH|#G$0TEoJTUU zY5cYB=FQ1z)+0eom+{$wH{{XX8SkYy#>tpTNp%bV6VJyhPaBAHp68MJ-9;+dbV}Os zZN#C1|1`k9A|0;zP8vn|s5j+ti!Xsf@pueXBEGGLdc3~XYhzqt+tYKcyG?w9bENyS z{qCtC2B(U~)N0DI7d3k6OVhjV$2AQQZSbH3N|qR?;JSG0Cr>PJO7BRUK!RzF_(0`> zh`32*JKCeH-!Ry8Li!A{qxe*dE!^;e7 z@1C|hLI#*K#Ww6AoTKWXWU6szQ>4pwl0hg?=;7g>wliYcA3gSPN3Pp6R1O0My;T`C zh-|pOzdg}7`bP0gN6Ij6Ka{VM$mC{2`B>!f$|}EriQefz=&CQS6~w?J9hBc=ce11L zfV=d~pX%q&q;c<+&p!Vdo4N(!6dzvYG>}CV=v~z&brqT2L63WdC}~-L~R7> z7>C}ZdzP&KqiEU16R%sfz^GD=sB8i9_XsWOC07y=zq7ontM&jCkxH)MPU;xoX&65P zLdPl))_8D!-`bCl+qmv4VX~AJ?N$^R^A}xN1qw~ZA?gFlzk#|Ux2gH#QQCG=ajxj0 zXp$LK@$KQKn$&vR=9Gd7mfYEIl|&O=;~C#!w=Us(@GL^{wktjn@Y+ zczexRfAojSrR(t79N#dc>IMb>Au8kK>Ug{jr0tlK$Ba)2CYe_qjwh(r#LF31&7XS{ z#$_rvPzq!QbFW!}V35t|_#6E=N`VHKl9e64_>G@_vpeeCCH4Dp?ckwcbNhZ!9*d1q z;uMY$Ckkc;!Fj}9b>Jv?-`j^Q*_vBEu>(F}O31P+K^WUhNQ@jbL~c1%fhWFEs=6j~ z;*jV^MJy+OSW;jk?t{fcEggKXanRi#56W}LJnpZgmFxZTq^ME~PIfV6I;t~j=GGsT z82OvEpRzO5JY?21Ov_678D5E`>D~9WJ8`OKgVRt^L4wjQ zIq`+mGvP92M?H+>-x6cB)-pG}!TN@Jk!89ZKTm)1F3m>LYmGgArmB#OoWRZ#HL>dx z{qZb?0Z2=8B!B4(M15sQnoL&kJu@*v(c6Gm?5AdxANEirLGp$hN#!ye+Q)bS5yw`D zq{*wNZmAQ*e1Hct?TIif?{*~2`LOQ1b&hgyTJ{lp=K!547K^Q}3jg@Kz?sn?KE0a! zdS_rQ9Y@>snP#0Wm!!X1k)3^*bTi(Ys2Wo~CbPF%W-V!{xr{lDer$T>hCvlcbvE`p zvRcEMrAVli-WvHG1#xUBd7yb^XdCmcPP13A$}u70uN^xs=vE#FJ-ZuslR_VP;DQG&iv zBpPdxOil`|{F--cFD$S3Y0zgvC8$(!Oz8cRWRhQ{0-z*J!X2MFBEn&AzeqwT($Wl| zzgK>Ew$VBnnDDnMTC!u{@_(&apRWwKEcZJ7)HCtw?`ck3;1!ZQ@D04DZ2Dgx-o5re ze^JCb5TWJG=BvfYRy5}vHsc}mYo^0sLBaaYgE)F2DST$8;EOr39?xic5sq`A;q&pf zqlT*=qmZs-yGq&hAgOKK`S>JTiIh8Sm{Gta^<11q-yT3`9s4Vpw6@mmJ8fjnO<+61 z8bhZ#$Bz%MFqTH)zQf3d@}=g7-y1p*;7}yS6`AuOR}_g(dirfqWUH3ANySK0CA3!rj%^Q0`}QXYPj(*ynfD;S6JODt#QX2+ zg~jx4!Xl;%fj9LR45Mp>GWUFKE`1JH5wDzj8Un5??si2q^5%s?FD|Umrixd+3T=+h zAU*ei0Ys>o(@9{ZV{PbvvgEv*sH-}o zRhaGy&N;5nCrKucV42$`ceum+BYs1xuYjuftmRP5fF@SvctY_J-{Q!#D8*IxI8&SM82FVV zzs^K-n%AhZbl9bX5po7)=)6$4CM(kPaeV*rec>k?#jb~|CaqCM<`xU`tay;)7lYH| zw8{tazg>t+u64u>3lA?A9{ZM8@)|yLu~wQCcJQ=KuZ&@#oP4pzXgRpg>H%yU-F#V3 zr3g7*hZH~7bn1~V9Z6Jpw-_cL|7OodcjFb8NfYqqHT4geZGDZ5PcrK?b&6|r3g@}` zRyJZE%!En=BqoVSmn7-L8E5gm?szWcOm0Z+-<_?dfFK>eO7&K@pW-_;y+hBu%3A)e zf8NmOUH7E@dZ5AOvht{}OQY@mdk63jQi_vpCy1<|7{%z_1&h0vX0gE2xf451_;B;Pwj)2q1Yhq#JoI!eqLUN2@8{pd{d)&dzP<`t=kxf)j~+(p z6<6WlFaHHUf21Dm^-tjk-~JgIquJQDemRC3Uc^^E{VCk@*d7dYoWPy`{YNZbcQqEL z%PdDyaqzMGv9Dh z)QgAi{uX}q;C>XX+l&Hh1iSw9bA0@Z-@#rHFdljOH+ZBK*t)3_mUC^vMnpslicZlZ z$!3Qk=EcB}7bbf$EXLXD31+v@<^f6kW~})jTHuuA#kg{5HkuBKLjSQ^L~=LcUGIAb zM!OE7y{iRvE-$XQq7eK4@E!dA;25sD;T_nzT*0q?_FXg##}EwL*Z|o`i6` z5<`V+bO=L}VW^Qwbafm;Ec*(4?v6W<-?tNge)0rbpZ`66{%99IbjP>x>0957$=((W ziF3Uc1`#au4Mni+eILVT-nRx%-TM>qT~&;`hcPIQp+&>!?QX>ovhkU(e+!$9-T2LK zc8fo&$MB6iAI1m2{!@JAqwj*w)rCR##JM*UBO;;&NsFlnN1{*+260chxQpepg;u=n z5zQ0wiN;ycnX&H5V)S;^VAsK8$S)~H!OGQG8tTKL0|zk{EJ9^Q4E4vW5sbyq+ujV9 zE*m$#Wh)$p7!*?muG(@rRu-?omTTS&r^g*Hu+K&laY=G+A+FwBiQ=-&SX&lGC@?9u z=;BX9WY!tebXZxo9_!1Oqw=zi$W8XZJvfN^ZUt|?@kUgvD8}ViU5WG*`Ca3OJw=5c z%PMcc=S47Z=QlqA@AG$K=SffeDUm$33{X_fi49lEp?yoRsj3puaW8@c?bv5qgzIm- z3d@!kW8-Bduv^3j#PMfpv*fufwx!s5}g0TSc?z->u2zV&wmyl zc<;MVlx7r#XfJwu`{VsG+UkzLW3eJNX=a40mopg+Fij8nq=?se*pYb2A^_1VGox*Z zt%?qc*$kV`kM6EMO!_C$)7pv&|0{e~k*R4SP>M#vh|H3~X*vapekvQ2pN=Ps4bG7f z^!AJ(;P;`UbpU=@@jGqmG%`psiffCnnqH}c&1S{KU>iope3)?eqpM>mzW(KAxfYRZ z7J~>L#3#h}6qk1TCv}=QjUI~J5PvVWibadfjMzvQdPe=25CLCT+kiOO%!LsV(M3;F zG1S+N5fOYWS+)qt)>ppo&P(S|R!O|eoqhO1MDtEY;WCtE_~Fs#pnQ3{Sfj_9HI;Dn z_hI##^{_iK@s{`A21~;O_|(6B24A`34&3wXiFm_Iy(st|eg1xY`3s-KH}2Ynx4rl8 zQS6v`3L`Vb#7sskYl)fU^fr-`$WCN&@}sBaGBN0#OYt|iT!trp{zZKL%iqQyo;-%A zY`=6y7Nj?5Xg>BZ{{73J!)L$t3#481L2N5c5iyDE>@9YX0m&J8vF1JxjO;*P{+63iIQ|?y|8Jkfoj>^lI=o^(5jebD z;_o2HU9?l*T97NI-peyj{en7io`j)~#UW%3(bA3A;L0UKxcx&P#dm*nFOK)iXl%A~ z5)siwN!$>2@2YYgJE7AhZ{c-9pJK2$P*k!CS8d*kwJVC^ zvyP|ahH(j|78L18wly1Nc+cqNAY89VbiyLpe9$9uPHs8D* z|9I0DSY!={_}6UD!19$?pk&!%nDq)W@>Za{d@b^G^RTR>6swly zBR_8u$|_f*FgpcCvmHxTmSbg!*l+D+SiiCW83iTSvN{bW#goi|^H4Qtk5`I03l$X|-e(v?`0orUG4;@XQBi|?mLnz+u=RpOW{%CT+B zdSqv1V)d3S@YFqyQ2sW&{jwF)*Y%Q&yb@GYtVLFe9XiE`)V#$gEvrO+dNPcbR4iGs z3MI>zA+N9qRTbq}oSTip z3V*Y;3T9S>5D{Gh6xi%Gn9q6cEMTE^LQgDN%>*CvnW9Z3he-1AX{ubl>#n=5+rEAK zhr}|`CBftIz-||X%Q*}{WB?@7MI{zS^P%TZ-R_4eGK?1=e-OT9+wuJ`{ynnob6f4K zx?AzU-ih`QD2Hbkv?f10RR__+8WWeDS$t}{@bdn>w$WEm) z2#F=$-{!8AMMSeY>rUtkfyilM5kKnp?ZOMy4am9j{rJ{r-h-?;4n8E=cVo1p9y_0X z4jqw9eCAtU$F-}@U+@tpeviONH=cjuX`CEZaQj!kgPX5d!r+65h%Q=*L5Eys4G7UR z)_@QZ5z#_0r!^p=oK#bP@^#mMu=gX;0u~8PV0>&0V_qL3Z_sqwY9xe!98&f*QX@eG z!wExA36W3${^05BUMo$FVq$#!WpjnR5;+sP-yfdN%ru090dYOkpPk-z=1(Kf5%dR6 z%K)R|n&ZFabn;Dv5D~vcaArpLY2lzBfzY|Mz10wy@WhWj?wOpLkzP~bpY)$TJN>L; z2*tmLCa!xDp$LcWB_g6Za1IY@69bS}yW0`bJQtl9!JhrkVAtL~c<#l6=pTD+ljyyg z!L}OgI@$k!PL8LBC(+#N62)R*pm`tmHMCD{m^MDtgRTM3^t-b&)OrZJcRY{YvC{*D zR}%IPWfA$5`v<`|t z#7T6tcES^Qm0&G8j>Au%z_>q(fsQr|d*_2ri!ON!ZxpN; zMqBF8;Y!A~>#jz{(jqvL#PzEIw4H21@2Cexy90XhexQF0!y`TD_k_h?a6dZQ+u@HH z;k27E?iz)A+=KqkE{q3ta5}B<40oU};zV(d9X?kF8e94ijGEv`ww!wKG0;+tC-yfX zDK!no$vzDFbx-j%1O+D9~H1FzLkk#kGuzfTZ8;k2iBOK*dORCpvmY5RGc$ zodFi})R482iE-4t_$)%1C8$_l1T8R*w&oTLj!(j5v%{zb;c^XObl8Qkk_4;82u0CE zz*CPv@-n1o6X-r(gO*q}$_mrr?P!4CmWd@97Id{Xpl8GfllWZ}aonz!KA2Jr=?F+A#ntG^4w z<0>2}HYi$Dyl+KI?8WeA09x(=C@;MN(^l$TqrCpfKL2bBs;9| zj`YIob)loHAG#zbY~nWw`P}GiZG+o4A%3$Ua#!TSY!Jt^C5hi^7-QaX^mMi(sI$Rt z71?++fbP~-^pAK&kf=d1nqV}thY1nU#blw4f;C$W$ZL7PNJR6F0%u+xLheS?H+4hR z8DKEz5g8v5fkX`c;WpGAZ^D?n2Y>wQ4h;B%XxR5O9@}{k-tkfFeYOT(QCMy{whs^P zI)OmYkA}ks(AejNoM2F9FusuvR5!PaEF^%&`V;7N%RFUDEEbE;(IH=BY7||~b?}8J zarD3ev=8|(*wTo@Cr2?k(uN2B`V2Zn@Y8kV0FHN#V7RLmwI^B;j{0%zh38S%A)AX% zlO6G8t|X2dnQ&q6-dec*Q4th1W6!}lgndKU`NUt*Iyez;Rwd&h#b`rDdLew>Bk=jh z;K`{%dB6q##3XtKHKZro(cN?aeLfW-Z#VYWH6a|+!PPe)3hI*xjQ8Qdi!~6Z5dok$ zV*JsJ2%+QzgAqTPTG|l^`*3pai|8H;W8k>>o!Ujv)pZQ_Kd}d6fe;#w?M0Kzhtck1 z;`puN#t=l!{vD|87?$7al&A=FUBiRu9q2~t;w+d{5BBV;!>~7m>ZkvJLrp#K4R>SD zfd&M`?_RrSCwg37Oo*Usc)|xw{JAt7IEuExakL(K0y_>KMIbVc-7g%#sCNP#$6iEp zmkZIL8@nFcAp%j>ln@co+?uTq$jmDdEik6kBHVD(+Ysrh!5^R8fj(~#iZuHRoVk9FL6|F>7RTWk(Ex=I!7@AJFvAE<4tgl>+O{H0|m|p6uq0=b{PI%CG;;0A+ zts?jcAuJCRPZ|uV;(JwYz{X8g$Wl7t?rTQB*@>#luE3fNt5M)|h(9lF`l*rlui1u0 z<(tLtxD6{)2jLRIXY1HFDmQOJrMRZz-25}=ZX_ZidVS=B!m~76J^a}pg^13JvmJ(4 z);^dV+1UKno3JKHkG|GE)E=nDm~|=2D~ge9nK|B6p;gvu*o{+7o#OA~O9mKp2C*#H zXs{S(nt+MV=uF5hT8>q#DzW+cw_xSc%!EutY?oCK;$KA^D0%vG@++M7R6}f3l1)?X zKV@x6C`&d^i*d$A`%{jVxr#<7g%rm8ns|G!e>Z%G7$RK`++FSD#`@&xc_$ zh(?zJhc#7PPcA%l&6o^k$M;v1G?cAcg*EFo;@TTGz-AG_j=Z+%i`AKoBIr8p%BL7~ zFk0o+ixUg7cIYMII`qb=-y{-4G@wGW8lX4GH5wuz@jjuixU4ZsPS3_w*ItinH!VfL zUyo5)X+3>Nvwr4x0m7>Iy!fm|97{Ga)1pyKs_Ll#P%?;pt%j*TsbkbU+|vKe3e z7%}*xk$Am05fRZFX106ft4O?MPu)$4Xn|5OHq?RrduwpwL<2@dp))znDoUavV+aN? zIPAu#Z>pJ8M4c+OYB3dRJZKQb`FLSgh8a60{5uzw8FGb1}%eqXy_dh$Dcl~5Su=S436ZhJii<+P;S*^v#O|u z$Li2r*MZRVXJ^D>QIRyH6coba>csw&Ni$C_Ix>H65;=A=KB_<5xoupho5K zr%oV$v*`5i_tJM0znxeozoQ(zO71Ct&qz#& z!{ORi5qxCBX_D=Dr+yz*72jJfh;yqV;Ltk@5gPU4@WEOfudYY`uqWOGEBXUHr@KMwqtwTrqP`m*y5fRZ`O6=V#?}{>nk?YtAoi2Ivp%c2nU^t6T z=n4#?aPJ-%z+^OrtR1j@pY%rLtNKQ_NJ;?%d zvMnC4xVlDQFgsyH2ziStuslCS6y_~Raikz8CmR`NHQu4w;&382H}h02fnMyBZVO{P zVnkt14pLJy;ILX?uvppfmCtc)D%0M$tg%rwnA?d$8|cfbkSlMqZ1hSY2rGJ zuxIBXFKxOxm0+@nYjdWu%@CE$rdwg$!YQ9#48%6=@dQe={YFK zU4*<0JB$`P92xmooS%zi@qM%MauFHm$ApMIvh(xcblQ-)I0yQ`Bqnu6R902OZk7jB zV6lnskm-QQsEFSpNqmP?IIU*!|A$R1r-jjIoic1#YOp;bh{9WivO2w zdhuskh!h(eVi6HtOy;x`x<~^fuCwZdo>;P)2|i@~y)H{EiJ(uPfmNF~BJ(0CBzp#%apXiBCS?tUmWmCVs*savncjMy z#Z+{)oIpeS02D0%i*p6mZ7hSGqhJvcT~y|DB0@z$OQr;~kba zRit0g48fk7jk59zRIFN$%ieU^MH75TNzQDPlvQ9=MHRNaY2$?pJ|vxj^qfLeREXbp z%@x?Zxq`t55fRO~#5>VUNr!<5(L8bCYhQG*Sd)-seyz>E-WV3E69okYBIUEVK&S0qb|I2=>x(5gygDx?4kVyt0Gq0xwB#Ct zaulp2k&;D9nNIf4eeQE>Zn@=_Ycx$e`+63l1!!Vo0#>Va`W+Dw5fPn9j)K+D+J-NF z^*?s@HPttWRUwglB6$*0KqR?79+1oyfXK;mEh5RGc%352KtwLfb#j>_! zCP_1|L_|bHL_{-YYC&d8r~F^R#F^U|cn}d05fRa=Nennn3qFX5h=_=Yh=_=Yh=?vm a!2buS2>^HaZxSW|000008{26qd=9fA+R3GVI$cXxLW0fKvQ_rYBPfkA@nKyYV}!9TA1dDr)& zSFb+Zr%rX9THPgk$EqsJVxp0v!N9;^ewC9_hk=39g@J)3ML~KWnWAL+^nQYMSC^H5 zshcK0dcQ!h7FQC7foV)ee>OvWzeaVD({qP`!5aGSfE{zL_yz;x^7vIsT+_$+Yy;Vp zd@l=dX`Q28z3JcjZKdg>LftYxnZta}QP0Ov1UZQx3T_>5M&tD0bGPpiA2ST$P+f4~ zh!dDbG4I)bYyG5G(7x!&INN*cZD!H?{F5z@xSrWgI_y^<|XF$-C~ucaYN~1 z>D0_f%;ZhK5EW3~MVSYXS1D>DRS;LY%(x{YFgn%FX`q&WP@+$Z!zMu0eHR>oQ$Ch~ zP^OI}{y81F6L zr-$q7YdgO+>C#ZNXjZ2YAtuwSy#ZooCe7k9rO9#V#>LxB^J!M|w%c{7^#9(gNZsD$ zW}N1E{=V<&^eQe6?f9>FX_7n(0hVr(2D~YIyI}(MZ37nL@ zpeG1$DTgO+((^HjuD9Hd8^W35-!O`)%Y>>%!ts2r0{Uazkon2)F{E_qiJJ8z4nPQ1 zXJ>F=i|Vx)0|U##bX?$^NFIe|_`$kWztQSemeT-wrCRVaCnq{L>);;QGgqy%vlEAu zv?`(mcYVX*b4k;VfYmq4f}54BfU=x*BmH3JXPX)o9p&{A5Qu0Nx9GC;`v~4nRvPV| z1fyMRmlj{zV6cyF!<^FlB19H0E;vuvr$f0N?kPF^_AURWvJ=P0z zetw;eK^v=(4^7klwF9AcK0d@FBO}Y5o-9}tLJ^^%u&DYwaBlk?+OsLN3Iw*? zFJ9!wR~yXOZud66^SNzAj7{)sBdVho?NH(3QU;xQ^0OwzB|ZENLq>dL;*Zb6#2zD< zCv)x&JwJD{G&?>yY4n9y5n~{g`kpIR&VHUrdaN@;Kt@sx&QG$qg!W_!sqh23D$%>V zE~LNeVH!T-NFk`)5!n`49XrY@L?aH+1m#a1ebMmcI!;8ALVjX40&11EcYNT>^OB0l z4|-79g*I^)otjX*Lt^$)X{A(@U&@?%kj};Pfx>QGPeW58T=XsdCf$6o#eej zMa|6SnwlR;Jo%8HoS7-Gw~~)HGUVCPZnn#C;;r6$RHXcTS`A>9)O64^Jg7yCXDM4< z)$e|LebVg>5Tx`!?uDIgj zGR6FSmWa)@t*4tY6*E;YlI(q#HpDexTg3}NiARalwj6uyF;HFSJbd^!S=8ByB=)dW zP@EPe11avtmHh~`>K_<8`k<2P~%4IZ13QM0qv)=XjV zbKviVRioqyV}i0VL{ommrtIq%-5yUWjK(9*h0~D}=b)G>_QwDjX3{&yQDLeYNzVfG zqu;Xv#tjsRvhj`WO?Z;6dlePcqodgT#cKp%e)6iVfnD^+dv-eRXg;v$yo8LQdHk!Xx#IH z4`ise!qMGa-jAHTCsFt5d`-8&1gURaN(!+`wcCP1yKXbKmxeC4)8?Dyh@XCgLxtF1 zxSTTh-dUdSI9C0pyEG1L$Ks0mXjWwm#r3Z^oB9v9cjO{yTbKA!NUM!cFUe{eI-$u+ zjxfdCI2YD~=f!>zRYI5h1}v@>Wn@<^b$mu6`DO~HF>>M&eVAQh&nP3(={D^TG)$kD zCoxM7kb_}?^fy!OI*cm2FDH}r)Z8L)-s?eRdA^6Dfq9!iHr;Off~L#vJ_ug4qjrv) zAZ5T@T1eu+kkMykeq7IyOTX*sO zxLC6unW-1gNq7HYz0m;xcYD52jF~XH)4|gKels3^@}Dqm?BZOO7k3OMr~}^87*edo zFX>Rp=&S%7suy<__u8oo`w)KT^%J?-e#sQJ{v7l=X`QYRDF%I=M?rhUu%;|$6+y1d&L({x3l@nt zdA>e??lt#)adgCFW=>+c=y*QvdqYoDN-V(A{ZRKFv-sq;hwOO>6fPbY9y^WnZxw`t zCxo~Ao()idX9mRjSN;MgN#fP>c~{t9lih@HvvOl=(xiq*K1uMbqn5Ag_!>qGh`|_* zO{%KvK!I1QsrgZvW`!l^PzU9(Ee|Vgi5nbAcupqF=LN zgp}8ZczG46d{83t;D0lg%FI^A0Yut@KGwQWZbscNUX;sKi7%ca#-O8%Une+3c-@v% z?g=DOipDKeFBKM-P-$y0Bx!5Y2Cp$deb#U*__TS+>qpY`+;NnK=q;5sve8uRh&bGDXanaErC|3<5cb=GGOv(5e3KXZ#rxd%Hx-7?i&m{h4r7SKrh)*1q z!}(8BT$-nT@$t*WF1(2tyrL*3XS5|99 zqL&kOCw&W8T(eAWf7IUF;r7cLjpUu{Q{qcD9(?{Z&{(hA3WduN92XlqqPOTXaWCX= zs?X)mQWVu$s004pXp6kSnKm)8fcQN&ujZmtbWsylFvZjOi3GSRWpshS|> z4X%69s-=G<8>WrGCodA)7N`9UiH}^EMLF70n`42o+9b$qHQ^J>j~mhh=}3{zUr<^s zq8F;bB^dtKe>spSDDt2S?tL%E82HQ7K=thYu+3@5f))3_ulfvru4g{ z5pj77kBN=d(l?~~b-#XgE_@-QYf~|I@s+(-i#Y;kM?}yWHr_y$n>Kt_G%xJyA{;$1 z!BE{*>G!~>nP?MtISnJD+>w_Mb8XUSNw|D%X#Ic=s@{aXiKrzXRfNpb?hC(I7~siH z%Ikcz!1$5O*r0<%l#n4HAP_u+o$<@;rWeU3-HM4XQ5L(_H||$p<2wR!N=M;Ng(bJ~G1_CMnAIl8F+E@0128y>h_@{CGs z+}fg?_LCp;*+#TdOaEi^gT=)t_H6Ojp8e=5NJrf)E(>;!OOlG~ED zLr#=~g<6q?UxK}%E`ny{q#?ieBcetL@bN=B9i7d)T$#^-tQ5>tVhE4(&l>e!5Kg27 zLK_c1gt<$*40uW2plQ3;Q1Q#sSOY~#V(wKi)t3PjQfPv4zWab(lSIjV(NU*qn{c|R zG)x~1-U(>XM#+dYbQU{5=*~wP(M0B`P+hh({XIxHC$3DNR_Hf>uCAV& zQzr)m5KBr*%I_7VriSY^Tjkwmm=G1W(XFXEC=K#K=0uE!BhQ-=SVy1Og0n`SV(Z^C z-1?uf2sIF|SQi8_7;X*@72nqd4HeN+5$t%XWgo667Q$5j^oZ*E%#aWmRGoKiK3UGe z#&aCx0WAY|d<25L7JV|{BLxbkJy27Ai)y_;&}};ht5B`Qk_?BlV?I#y>JY4|d1v$P zLYurtAtM9}%Q*>=K;lbm#7}Wlux_96j%441MV+NzKYr-fUO$5^1-FQZh)hhVpd>eV zandCj{SQ=>rVb=8a=q~H(ntBhAtT;@q9c)*2-0zga#CKFT;?ES)8-#l6WP|^Gua4% z_>{ioKU!nuugeh6rHuvw000&VO$%%`Fd@kr3DmtRbqwAMtvQ~xw(AfH#{BX=C6lrD z$HA)wh-~!50z_Uz-2N@^hP(#jdZM}>(Ch-1=s1uMI7$%7%9H&0UP$30AtUj>0?7}fv&d}OKjuGJO(C$CbVIP^n0K9l;d0D^cN6U4c& zTfwH}=SI_LjR%ONTPChVK)OrhkeGx{<=+`QzKNmoJwklfMj-?AMIe7ibn4z@28Xhu z;;;6d=51BWHeIvU)%5SB>xO3!itmoW3A<`VAgHyJycP z7Vbv|6-NSS@l*efP6ioZPegW9Et_=z<-@-l7T#&^;JfF5*yj;(nwkCW0vdlI6lXVq zGl50*5FM{qve%Zqg3DQOpXtGs*0SrfXn@aQaOE2I_ zGe`1UK!QOB{{%W@IvF-o4!C3M0!B7dj^oZfxV7fx&WE(t0;q@}-RM^%0=H0iKoYEW zj#9_cu>(~1w{-PF{(O6uB&kW0pwA`s-Njb&{=Su^Z&+B^r{Dlltv=l4AbjYUm+38F z+mw&uU!}h$=R&Uat8jU$E8v)~m)ySOalFP*8WyU8>TgeKXtKD(-*3ZBN8SI%lel!= zVD@yCuG{g3$m^*yd)Lyn6n!8TH1*PQzf{yx3)3qU{4qkQbWiZ9moGnM>?Zdlpy2ES z*cVlI-L09w55|ah3b;(HqH_V}P*-xK2nf8LIr?<M1*qFY;|>2&CoDmB2Iq!)C>Cbloyy~L-;3f z44hQdf=y(#fY8tXQ8T=>5*=E7!Z^`88QPsM)>v5=x^urWsA%`IfpwUTL zAKQWn^5sJVwWg6@F9Y8ca zECaS1>b#Xx{;C}|zv2=(we|LU6T11HF5GYWWBcEoh9)OtQ-I*O&m-t~NKk2*jI?FPL@_&YxZvC=}PtDrD@g}(KIR!B>GOCS` z*u?6_@ar*Nktsk#u6D#Ufe#v<_SFa-`DegL8$Efz~tc9nImY4S*Pc&=E?}+xzAR>SC zI~p1qtVXWc!^7jjeYQ1I?wm%)F{eEuj>^hs_{rwo@Q9U(llvPV$!y#1lcWA-t6RIh zFPtJG3D3_x0zutyT=??g;YWXL$n6r*=&5?bl9>ZteVs%~T|mgGrHjQEhhxy&98chR zwp8~^LH(ffbb!>8n_{L2OWugU!gF;Yo-ngC3~vUJxhxpB1 z5wIKS5?xlRLHww_=o_{dA*J-ecZ!tRl$lws{=Y`aXKN5O{S6pN7yPgn(Y2h#lFDkd z$T1;RoffjT7+xtg)m(f^Sy?u;BwjjzAlfl1tAI{RUOKW%&3ve?P`K7Cr(HTcLG<-( zZLGw%kUJg(478qor_;4Yyb(>VmMo8$WDGTlNyh90@S@!*hoh{a`Nv#sbaDaTo?u)k z^siq4)x_gX3^r9cx4WQeTAxq(Ges^zo$dJ42h*?_e3N8_a)O@3= z?1jn!WH8+iHV+~A1}uAcb{45!E^Vnre|^6{6rEIlb#;{w08vmK{8vDFELn(AiIG)Q z{1XvIc0V+B6I-`hR7BH#J;5>oz390&{inJVH*5;3(PW*N;eoqHya&63DECqq^718nn=b!*Z3x&udlDF zp-~bcQKw*GVIj)!GnL<=m1V4G6+pKM*o+fzMr4yAo0GuElpbSaQCf>0o!VOa-LQ7X z$Ws5s$VhaevX@y@yNp*A0U0^eJu0hg==S;>oWj!=(M@J30a9YFigIp@a2~_C(f$(M z?!VwOEEavFsuT)ursrF6`TO77F3`~&7RDMqF6+A*)Yhi_WA~oldEPO#_;rAl7R384 zccP|dD<8lW`zE-|TCtQP9+tk;QXWoJr#rk}ubGk}FAqAMx;0GEz7c1sP(MhAy&2tg z4onQ&VG!`Ch-t5|j%jWdRyMQ}p~&AaQ_4|OR}Vv`48XbH2&Ss*IoA(3=-QITL9F)H z?v_02bXFIxnDZOlOEXJzn#dU62>ka_`I6XMLR9d&zA?BkTG-i&w`wR?%R zrQcW#6tfgwunz9Ow7O*bH+mY-?6?t{8h46)c3zGOs*?2mteNI;tdP`SaaTgUZ@hI* zn3j65AzHvtfXB4qLz%vGUXYMXtjGSE@tXX`FMlLs;zNM^bt<+#d1zfWw1PzZmAuYp zoncXMcS)Xvq(1uE&%v7+Ym(F4jeRIxhxLof5qlahR_8$hfGo@UxR4x&my|)?yLO;g zXxHXsqr7~V(yPUV=y6F@*_-N5&$*9)N;KC{-s**qrijW!K(3YUqnKAn$$r zrHiPY`TDa?HQRD?5FfK&ZlOCO|8eZn#&V#u2f0P35sFVx5+T({5{0nKNp1U1Q8d+H z7$Q3KU>|r?meXK1gjA|^Vz}>r%I!X)tE(Dw8RJ4Ot2 zD~|*AJ%A}y%t`9&c6MQznJZODNlzakC{mYIB1Xg)xd+ThdhUl$hNv*g1-@bTgWj+L z4(|I+#Nb}HdcJsbTprwd;AE}`>WL(im$f;rA%zcw*w^|Fa9uBvV07V3P z4(2EV9rjU#0)n&Ep6F5gvWGH!(O9cup1|0LNflcnk=NwhC z298YfhZs=RSN1f1?~<-o5~ILRH!b`UWa**H4XVG&e)X@yb1PbG2_E0~ecQ3TwtZH((tc9P9u!I+?HAvw8mY-x8;{M3Ln_cw zq}__UZsnyX7qkt&zGM_P6~Pbn#koGbqA{(Eu401xbYV& z+U>C9g-n}QlYETp*m!LpQ0Y3`X>)ccVXYAEc2v`0pV`@ElQTvQh?|}xv$riclnJyH z%s8JU@+PWcuI4l?Yj)1wi3~9Swa;^zp&}-q<~m^9 zU^CV#1_Vq`O^!5G*N^_3GWbL!BeH6f2eIs|HE1_qn7CKfFbFqr>Oed@JM(eglXuwc zCh79NkiiQ~h6)4;k^jlX!(dr|9L-p)>)0oKFV!(+AozB7Q|PIwrMRIZMc35TvF|Ml zo89L1m%a2iC&LW*ZHJEZi;1DEy9r({*S3hw^KNcn1)K?OzvO*c3bF2w1*;B1#@dSw zy*E6^$H%{X`}VO+Ij^dv`|AEURRy3{=cK6pb&0x-|DJK{_q18n&|zdO7CY8sJIGj_PY~PG z{s_&1@l|-g+$ef@2ID?xH_LWYC8?bvWCZZ=SioUD{pYttuAA@7{On{mVFU9a_4Twx59&#&!Q@6GVUEPP@HyKeZgnAL3kh$wZ$tlXN@ zn9u?7m|H{myZd_`EWcY%&k3SS2i_#J?)!V9hSu(k>9VP1XmZBoX0KI6UXSk87*UGJ zijpuGXJWEzcF8y@PPs}oPo~E2$XQ@nF@5MTzck8rn;2l+hi)ZQvV65^a`n}f}a8}Imb2X_6-d|0BDf+#A zG~+=o?dwP(&qA7#naPpX`<7vRuIbwE|S!#X$&UmoFg);(_52r_)#gcp@Li!^>e?C z_rT&(f|7lEA;@lYfQ?Lb%_3q-B<3?3{Sf}nqQg3N`DmoYLrx>al!7fBGcobZhMB3q zEs*aVM%>I4J8y#@dwIssgQ$&YpIGw{m!xqqXUR}xq zhIP>E`rwbX*k9>Y++>R0MpYFyxfqYBd34I|td2!I2GOxNNg*_jpJ=(OE8_XbS31`>QOREiO+uYqr|6*(P<-ik_&%~2%U%8^*{v(}1W9_fJK_{Ng5}p-!z6}>* z{|3)nQeLt%`SI?%iOoM|8s2s zdUZQx>7|AARZ^>f<{CO*p!aoqKtgd;kd5iUK&`!+?k4I1_0$uYb74i2aZXpG*_liW zX2*=12ZtAVp<^8@!Wc~c541Ca$O+(sk;)Km0I)2?JO|zK!JxtEDX41sFdQ8r*cnPm zRp)|-_o2am$q9}AVWLM@xa~q!f1#uJzyjOkmKc>8&+;9eVb73fj3lXa=mip#>0R#bHhLPdLy75}*V1IjrS(ky1h1UyIa7;S? z&1B@~2hFk3kedP#8JU^mj^Cq1e={?qNn)#ejbzJ^yO zNYo(4JYw z(fLE~>+K%U?Pv-*+LHmkj8bCUXhtP?#0c0e>S}OUQ3AT_2}$f)nJb5(5sV!rbe6+v zwR(IZHnLx9hb%toXYvNQT)`%Ksofry3iLjt_XeyNA2tgt4-~zqzp1BY*(@_z3+-@ond-5rVfwWi=0E4u_W=W{^Ulk*Z7cT zI;WL0do`d&(g*6g?W%vX+&4cW5WJkdn%Xa6`6^ib&pY7Z9kzAT2cGuxu%k^O1;cj% z$eWpn@7nnXY)B;(Ea(tLzm%iPOw&WYi_#(M7z<$F;8Ot_sFxfdr_0^_f%oBX2?G6-^B#NW&+&U6*<&~ z;@D|FM@dJUBdTKC3fwFa%x0@S^TokQPSMfW4`|%IG-|->s5O_9YXebB!MZMwPU{|^ zL9Qhz4pK=Cbm39|CpgzNheEW>4E`VjOV=D`S;S8^%<;%4@dW zvxsTOsN{sMlW1(0FHvVo+|V~eIG^TxQ9N!78!cfhOGjeHjYIylV6cwIN$btxB77>P z31j}7mOv7Nc@?>e6G5&&y1tTOt{;ImP)U+0%7UF$39cxaaA_zZ#SF)7>Er0Xsp$Z| zPGFD=`Vh+qEh0(%GNqilS0weSa;CCdwJiWUs<4QPFcG8_4amuZq$C7fT!QKM*?UM= z^z?MQzo7>BDX1;j6~8PdHE6DmSt&|4)bA&ZMS}3C4AK$lc&a~6>5C=VW$?+N zXdcX(2qx0A!snoXp^pjVTMtopjYSPf%AA6i*XbBRVp)sSh>1Vp?O-sS%Uwno1_W`% zq558MKR-s!w=K-XM&b2p5<$on9h3@i@bP0x73zl1+BXy-`Mh-OHk$g`!RQn!Ex=C);)eVX+z901&ZQiG&nvW&sUe-LPaR1p zDoI1zQbW%jm-_uXllEKBqf0n4!Z$GVkP#ijsFON9uVO?0)(^VVdotWk6AFqk<-@r? z>R{E8dHI|laleKU_6j-m8gC*`PfsNbgvIt=zjf0<(C;jUMyK-G@!X5G4(EMxV|gze z9czh+55XwxICh&G&*t| zwKy$Kwt~ZTu=QLg^X|>A5(F}%AFRq|Mboh&icnCm)x3PDL@B=2N*>x=l+56bpY^rS zRpH_jCY*1={xb2yrkwKFP8JI$14c-;Jig z{`<=<816=ZujMp+f(@Oy6|YBBa^f>U&bqB=1-;SdN(*Qg#5{pbP+U+Z$jhmidH^Bg zd5o&LBl13e=HmI54!rrMLn}ES?~KxANp8f#_wf1Rh2yBggrJmxlczPRt1V*rQ#2JHgTA+ZGsr!8tR!dt@8nar08h zG=t16NnED%HSA}-!6VdS<#uUst_Aze=OvKbxrk?#Yfb5aD*2C@xXK%KHgjBqCB*8q zgcHBug9EU!ziXjj!GBGFsErt z{0wjFvs%|e5n%h8xxpLq10He0%}BM=-B&Tmhc2Z+M7E^R3OR=p}ux@QtHp&m9unT6#SXBdYRKh z!!qmr1=B(~Fvx|VACvpS`PW@Uf3g`>1ET)d7M_^_KH3kutwe>6iP-3eT`~~aF|u_|vI!1!qZa3} zxvx;EQ6-;;2dV6O-AfUO(9TocI~JtM(0uP!>;u}vV#?PdJvr>Vq4RyGh}p(J(VJ8y z7N_C>UvRQ5z z`k+kbJtueW6ZCjo4^nPO&vH>?eOHWCRrU?$druP?Cjnrd`Vv_MTs*wQw12+Ilxu*|rNDAMeYz|CLBwO5Od&U$s@Q_$%6K&!?L@7Ge1--psSNtH6(Dx%{?|XK$ z1U^5*?O|Bm#wI$#e#o^mPj*K&%YlRzTv!^?r7|wx(4M2S zXCw-$r#31M8)(`1ko>aWifDLhkqKBm2)}vT;-q9E*()Tf#|l2`&zR5B2~J~MmTJjO zOoxW{t+(WBE;?!Qd5BAzI9bTTKmHB9EP6O2U$ofFWj$1UIV2@6*4mFSA_~p9sUB5?0}$&G04;yn3~G zV5)iZ>DyNoVa7*`O(}fQg!^Fu5B`;EPDC+7{%EuAu_g)>;)jtQ;XC*J)ZO7D);Pb? zEPoIkQK1^aU~Tbm=DmGq;5@Q`&V2~8f21}LU7lJ={!-!4wDSY88F$-4Tme$ZtxTXr zTAS#}xw6m_^rW`-Ic9v>1+5tnlcb_~XIA==o~hQRfP24Cm>XWixO`p)QeX5!4JRII zrt9;<282wnxk9FNXlWwgcwS_C5`|j1wP)d^Wn`&8I}-lXhzxu><2M7JvK|U1blMor zicN_6twY8OEylnP{T$3#N#~zDux7oZB{Z!q3E&QYMR@61W?MwLP(8^CUv?JNDt%R~ z#gOO}U&v4v2v2+U6&y`Eh##FCNj4k*{d?fi^CV5dp~$QVXg*6I zuX|KtvAxP?e+1?6zd7#j*uEk?l&WZOp$fVmyh!u!eSU%Glq)*_d*;h*ykudJ2#TmT zzuZ&oy|@4UgMLB;Qp(33kh}LZC3D`lqfPT#3XV{UFZqE{!-hbqi%_!#|JMu7*#Uv{ z@V!e2D@fAsegTKxB#x{N3b8InfJf7@wY6PtwI_PLj21IpsM4Ac{buNVJ#|6eun#JD zPXf}C88Ytr9%elTztq1lQhVi`*-*BaT5BX(7eSSB&@Ys-+&LZ?Jp&Ugrhy6a|S?LO$Q8nVqGyy%vGUv{*753#B&mAGe!2I%2Rd zMyi7Y@Pxe`rE2N0OuF7aef;>5?pq;ReNPLVFnZe%IRMWcZ^7qjfq>D;CR({vT58lm z@#262$E2?}>6jv~q z77Ys=gVAEXwlB(9Ss|%DZT?3dT~bN{qso?4dQ4t*&U|2Sl3ms<07Jrv4f^dsoV?z7 zC_$mFteJ-g4SUISzgzIKJWfseq_VXLYY2WrKs^8CqrRh*gZiEmDuFTJvn8ZAX zkG;1%?-^IV=L*7Szka%@8p3t3lY-yjQH}?Eox~*p}GJh-TbkgSy37{ z>HF|7LSS>;VsTgefYNYNRJ0WN=cp285Xb9mJ=|E9k?_yd7o{uXQ!x*G`n`oq)MUv9 zJCwv8JH*Jss^h)iD_9bX*LM4^h{^8hNnn8|~kv$fQSR zAmcJaBw}HG4`pB-%AY@SlE2Jgaz39)TfW2b9o61*BL&lj`=YX`gaq5K_|?A4^3=?j z13%esDkM1h=&=B0+74U(D9Vx|>{&TsJ4V8)hF%!5Rr=rkkNCzD7D{S+vGlX8Ft(@z zL%$X_-@hZ~_g+5&^4;tgQs`vUayIbrQqz9c{?_iM1FDM#KpWJ7aE4yD+-X!CI{J3N z>%7l_t0aW5`qwdUa@;)QJ^pUp~HAI7R5e+F3{bajR#!JfIb3~ zxql&kE0!5dVmRB|!Yhv85;ZzuS{ySZs$q@qs~dCCgKYqOPt4ufKg8>~gpo%#MskIq zPr^)CisD{lRl^u&wqUhR`>i!1+BeL1#YQBi8`Wcg-Uz;vx~s+y5e`~f55-R-^E z=DJ`Dl@dTU_lygZ&VAV8u6(c@{M=ApfpNWRUoZL}0?JR=mm<$d9?wxiBoEPtL?`X# z1%4t>y@1{@aRiwp=pVe8Ls~&Ru7q%q@wwthwf@}0mA@zepUbINYyX*w-!_9qlF_Pq zdX>M9fKZ=RHESkNq2QX{rmhHk#t>F-Rq5iT#`g{Dt@VxHO28Yxf60~Cm`MTH_+sPE z=JSOcKb4pAo@MopDB5v4qD!0t*dhT3d4@;(S=hZ)p~ilfP8Yp@2j_M67a-XnU0|h- zt)uFwuU%g^yKl?i^ftkE%`1+!Y-}e9ac^Fy^1^aMkXiyi>jejcN>1V*4rhH8hR80e ze2#njQnGZ70~0XuXjwWHjqi$^V*I7XVse+W{+s;Uc>z>7TKIAxy9c=QlMJ`A+&w$x zDpSAVx+j3O<3KsW-qr;C>Z@xhQoiFlC&s&82{|1t=o*{c-F~p7n{@d+@tja&K^e7Q z`Y?k;PAoqn`kRwt@DP?QE!D$ zLO}QZOky4r)7tq5BMcnftOpY^V`G@D6uNo~No}xnVVJ$TKZv8AxOZ`i3;uOpZdc1z z19WSjQNn^F$J$}8!drEMyRlmFi&ODFxQv~(E8F!xe7X~Jd;qNaog8gs?qa;yyXzmB zY}P|@IeC@!LFasD5)#9j0sgTyfYF ziPd9fq3?WDhVg;nOu9h}9zvSqfCtOrF+nU^a&;(QJJQt&C@k3|z-@|+*dp07pk^2E zD_}a&J7DiTK<`!YzA+z*1O5%p?VZ#!Vc&ZYXAlluo?tU*wgv(23kR+1ES36CazX?5 z`f(zeoze|?@qBDhzsnEU|9}V+f_CM=o}jf5bkKz$2tpiyU6G~y{UL=*NdB$YWBqU7 z=wo92jDW3Z@}Kg#LcG?Q*|H5EM-YeUXY7IiR&rk+D+0(QOdpPj-vcOx zMA&4deHu~a-Z0woLqqQu?P^Rbp_!O^fpUr$cn>Ri>zjZ`v$S~`>u?!_C>j~>3uRzb2}WohDyWZei?){keD0| zw#DC~8(xOpBWdq!1yP#eO7=@zlG45RKxiC-I88x(feyAT7?Rm}=XvL;($5k$cR(fLD4ZPd&kB|jR`}tY8 zmz5DLpD+T;EF?ezDKiYWccWCNzPiF$V8gPGNsP8NYKe(RnT$6}lh) z$EY2Ea#%|t@|7Hqql12?rKtc+E&n`%d5psUA6!<(r9TeEL1F}a1;0pgG4SC(**K{T zu>YeT4^DnGMg31fpDYB{|5Nn;C+hyc`Q3_e|EEyK*Z%)azH9>VnO>Q!r^x<9d!Mp1 zc@9CQfng#1{h->#Ejib*OR@kY@&R?X4+A4jfR0e%-<)9 zj?IA;Eq+pGq-DofHmy9$5&S(d7r~@nC);{3IG2lw4^GGE18g`*p!LPpg+72ra~Llh zI~_@bhpzEooPc4E09O1#1f9s2m&jJ)>mZz9OC;j}CqNx&PJJ5^unqRG`<_LTXsI(y zD=PC;`S8z$fRZYr+Qye~8YOB|VX|n!J|&MJDh6iZP)KXB{;BkRZ?Cd)GeSm+n0P;7 zY`qOQtbgV}0F*0Bmr9shkq15O8XD#wBMSfu?52)pcGRm*-)>_uq!8>xj6jN|bF@rc zD6wk#D(|4>Zw@eXAD#=}N#*JCwIgiz-*$Dxeh*oAD-Y!Hs|?I?eEIY&p= zBMrwkFUG*P6QeLC_o7-4crPm74e9w@mkB`ge^BQ!Q`D7%-d>`8q0_aoC}n|r&Fn}j zv;aZWKIqa4(9J7mZlZkF_IoaALv8lGOeZ#8?&0C^+>hSC`?SQ3omOpaeauK(1c8 z!qPya)AS~7q$DyV^~mk32^8hrLi&KNJdW_IJ@$LfbDgM($^idD`qpH~R=>hsx-iVs2o{Gak%4BM}5#gi5w{DBE z|49D{yt^)WyOQ+Z-VmH_tRWBx1b5fq5S%~~+#$HTJB{2X-}~)*&KYB$GtS-n=l$7Zt**7I zYF4d!=6vQedp%xR&h1J#h?y{NJp8Sa|YO zf!r`}!GUFI&)I%Y$&kDVWF_gP5#+^ELt)haGdPkjXL_?LWEfBKEC4`Ks}I1Mz%}bY z-1hTx{*~{d%P07Pw-7?3=pf_Ppp1^Z;=|qOsLj+R{mfIfN8XewuHaJydA ztWJ-)F_4sJ^t^nxyyZ(VlQKP{$ks&9jhf3LGhMn6F7}@hA#&+x?_zrDlH@xq zxlB)jtp{>;7{csE=05~OrB{FYHQfnjS|8gw z>9nmKb=9>IdN3@XHt)=@HQth?VP(fNTajvH7$kvUlBlL|6mv; zOKL*XnTl!}uY~o#HoYxe{bDHTjx_>Xl(L^+2r{#LZu_o3rZ@iW!XAq_F!s=sAX-2l z|J-FP__<-?Ca$DO09$j{f=XUz*pw%xwFf;74Z_zQ|LyFHTuhukcAdVFX0)&%?Y!9b zsHr}@XkwzS+z^+^9HD_!vI4fKKkwzN+M&G&)&w#xXNlZs<1jc1w`M3!FFNAu79Qn{ zh9`wYC1Cj9BDyzh9KpHXyKw9c*LG0-hM@DJg7~UZQY3xffv&q28&5nEUXc!K`OEThzM&~@#3<{15yNI7lyU2n){oj) z*m|Zs!Xw^g1T8q1S-wAm(tZ?QujFb}(=ZaQJm}{Ep*>KYKKdz3*_BbL85@ZY>_Z(Y znFFs~!>7anZwa{BM`DnEeB=`4Z}jsaepu>e4nNhQXA>Y5G)xU8WyCg-c;2E7nWG;3 zadoID8`_Q%cap6u!ulLhpAlz0Q^M2;h{*b@0SN*{83-RYMGa#jI6%euh|uQ$sQKKz zHhZ!U5QIco1=q?buHL?Vch|qRqli7;729>fqp#!kxmHMZLIzPctO<9pC)P=+BdrWC z^!c`Ri~L%zoZ5ErfwWH)QH0H}>z%9d5#!My96Oqdrr`RwwTQNi4a6xfjkTzV+}zjG zfWe;lG=yz;iJxC7AbXsc3OXLRC8A}=>7N6w0GTnRn{ssYqqxnNv>5dv&e2A%pT2Dp znmV^PSUFo*h<5XL0xa;vFPYq zZULMJcG;&+StG=4>4@Rj(t~^S-4AUE=0n>C8$eudC~}!Tm3@BgYMtex@1P6Q#&3I! zLef7LLWe6l$$SJ+)KeQ16Gk%SjfjTgZyZqYsBa?C9*I zGFDmcLo^DKjHi$x%SQayaVgsCa`U_6Bv_)4&rvvXRAu%~&zN^t*D=?i0_?%o@5l<7 z4}g5#4NE6%j^}1nh6GMH``!0iQ{Lw#NEF`q6(9u6N`#g=zLNn~VN~y^HTtSOk16Bq zi?x|Id}waanVlQz*{Cw@F2Ip}7tyoNCz+x^;{y_Mjh~pQE+mjIwc5(^*ruR}fErQW#a^xO9S7Q|)lza9<{0iz@#Mrnj(7m9!8 zyg#utYOB)qDI0>lGc3JGAHtkZ1r%-l&lG1yD&Pb^}aW zSczQ7uQn7&pldVru6~(QKaM|5uUyRQ+yq(n%N)Ntu3Q8j_Ig`BjCiCemlRfN+}Py0t-l!~+!r1W;g z&bS~x)Ab4^(bdJ#x-fMJ4X?h&H)b)X+chbJ-kx9U8IJya|vI=K-68Z+Qf3*8|kS0mLe~lmS;!1iJU+hFG>czJVH`h=n z313o(a$Dn3GXuk|t1lE{CE@Kq;E8E}7tW-az}2shyV)NfuF0!rf%DM;x ze_1fEhx#v0E{0uA3FH(I5CUseg%7GUim3I5YRc4+D_QOAI0cAsX+D}gD=3gNAB{#x z*te73K)@5)tR@c~*51W2*_u!=Ya3o}`r&ap=^DhqehIf-!!lv$xssUAq?Y_Un zhe(Vi!0l~D5v#jqyM4Uc8A0Rro_CfXI)K-q&W|pgTM@O9csusd}yRonDfBM})w{o8;l%R0GrwR_!mK{9= zeP6!0^Q!!^y3tVToVSQv{qm&hk_AL7zxz9b_{zY27@t}vkm4Uc&LUDC?6%Gto3Rc3 zCEXd)ENYKa+tAeFwzFHqyufLQqsx5#90H~n?$Yr=nXGnD-abC*BUl>l%-IQ2OnCu5 zdN8H-KN-}#cCp;2cJ8|Vrs)LdtZN#$T;$GrZOgVT; z0k%W(+>xGrOl0GVL>iA#F6Tl;UE4Vt>{w01ll^gPF$>jjd0T+!(T6%RT53;TR4386 zJM{kjt825{eQz;W1+3dr-w{nKc@rB(98JBd^%Z+DcqI1?A3$(EF^t4N1v1Mll0dyD ztA=^}bNXAApOnxG^AMM586WQzlW*MOGhyHU2qd`M9WO78yI4AM@qFl6*^BCyyl1N& zSI=&3LxPo3{RHC5=-7xVk-t;A!k<^4@W~^B>^U^v#=SF4rHW2oR~5T~V&!Sjz?=&FzNEk-*+ZHP#P_|dr3V?mXloOrK2dwn1-YRdwz45WFbq^@ zfosVlJa9C9&9hqi(xNgs&32w8r?8OVW9!0}`%cJ_&dqx*Vd|S99I>7a*v*WwSl;~H z*!TLgIFq0{g94QnMjY ze{lruZi|!iM`ZvPQucl8b!NLx)}m5N$ZUA~g9>-O#?K~L_3Sm~V4ub`B=>t2HuS)A zrWtlJ_sHIvO-+??_h9(_d=J_CdhGT7!WQ83ifib zNWxFOa;G)-WbwbR9FKdk+41EnW^KbGUDsLW)x+Ig{`H~*H`9W8MEm!-)wZwcy=Hu; zv8cWFnol1Akl_|N+pQb4BQ$08&S8<(wYTq>a6ERW1*fQbAI~rEH^|i0BTEt(0%l zfw-vhYCO)9=NGuR9?{?PBx+-uP=z63XbPx=4XEH=Wj|aSzruOuN2XLhsTx4YVqMFT z5+2b_(@Hk03Th>`<(K5?LQGjNbaq~*IQVF-FNPI6uC%tr)tfZNVU!VJbr{uM`e+y! z+rl<7)=1@<;T7qV5s@YW0H)x!P20bhxOU6%5)S|#r6;JrPJe$n4AeU__Tx+AU}(%XlNrv=J(Y@5I>XWCfgu}mGA!K#%! zeyN{P5Z1u#p+lUwIsSUQL8Bqg;YlB(^fh*QDHajL*t@)gI_lp{BK=k-#Ayn=MH_SI)2GDil$vGNwBYxG2V zR9HL$gmv@$orV1uXSJ>sD|KjjxNw3?fMFaj4%7VY4|Y~D;7ey!!7JT`Mk0B#VVhu# zH4_R~)72ZT-p(_rHJxXjq?C&TeAJeU4vbwyq8<`Lelh8|5A(%rv0H99Uo7N1IDHnP z%XnKDnKC#Gxl0S{Y(jq%d=ZmuTUXApC&(C5WVEDiY_C3BM%Nk0j&^&;N>}c6B{Xlb zJo0nTg~5>f4xi+KEi}}DrsfVj!PH|qlOEL1#pGE%qNzsZX zgxsA0ZD$9J8RbPq$$lN6n~kK*uW+7M8t|V7zbn_aSZe#|eRl#6(&)P4{x9y+|9HRu zmQMcf8j;hq<)2^~PIb#Ga4C{l6M7Z>s%IQV=chJK^fWmkd!A7FT*Ap@jFdg@L(jIo zno2*1VlZa@oTRM3@{uqq19S>}cL7*cTsyYHv9-!q?;cZ+*2>%uLnc@08xFw$zQvvL zuOeRP_EZssZ%(Vy?>n=xk5(Jn{i%l^4_{IiS%-aQv4&WZib{GT4@+KA8b4Z#qLi_e zEDXhR+H|;fI@WaVxVF2A>{rdEJ2$1BS0dr0621DYcVn3En%$loAssTA?remUto$mO zU4VS7_0P?tgEnvU#DcjS(*mg+j_$w&C$zGq4*jD%-o7Jyvf0Ke=YB1t z6$QeqOIpWXwmdM_TDi_c%x@rlWJ5*AA0(>eFX<7R!MMkrQ|2@LTZ|Y`z98q1JO6kF zon8Cc8`xrEV+$kyeAeW6!O@4H-P-mH9J&*Zbt>hsf@06aPxrD2yYlWpCLxK)YHwH9J(XK%g;z~hlYKM~nbs-mT*(O$axcUFH9kK2ZA<)nYaN0D?ty~; zgTy&Z*22~g?GNkaO1YOrPj(L7ZUeO%Ga1^ro{Q-m@fdmCFRJdt8J2&|U?av9LkVL2NVXctZtmW6-cjmlV0H)s3#|9M3zWIKG zg#%fA5Rbiho$mb*#{PT&DKaePHA!4(sA2#gykHHv)9#;^P{xwKcEB zj@|`SwT1bhMOxNxXQz1UFrWI2r{zhIt1diZJcqWFr`LD`X2rLwqG?}7GgmLnu2?3R z(WvO1K5Tn&dC8K%N6u~M$>BGtnFM?$_>NCdaBVGCa&dNHVL>JxTzsxZmea+~T*2vp z`DM_N0vilZEf7Gh6eGD6g>j$#@jXs2qz($$liKHSL^PS!P%~y)Xd~8A?41S#Jd2g| zM$*45?~5z&oZ!PU|K)(Y7U3irX6F{H=AHEdNf}mEJRbpRyCJ0heyHBa7NYcaIA{S` z5zgEayIEgLraF?9f#D%b(1Qk~8t;SpPM|Gca?H2L6B_u;F8(|lXujnTyB?8gWcU*e zHMq)d`i3CNs?~VkhI%p*;?<>P5PtuXf2L)JAe2Klrm*dXYpnZ1seb~k?swQ9`W9|d z2{;R5m3iJpPeh+0l^G;Fy2KwkD>x5v3fM#3Ccnx(wid?_EDsZRfJ;Um)6V-|Xxbaq zARd%s>o%OwY%aNSQs*7|NKxswH;^h|)@R8jg*k~|up1_kgdoV8t zf}fBQRu;;&eV6ko2|wZ%j3UHrRWeD;SBqu78~qiHe;bc7GkRUogik=fdL3+sXKknO zaCso4yNDJw8Xf~CmQ@~>*DL}&GynW44i7s~KV(OET&?-y-?)5V1N(nY*Yd!GHQ?OQWqPi9H^FjKu zfGE1;Ci~X9PM>*QRZvNf1Jvn-cQUxGok|62<-C?)dr-~wZ15|#rXk8lLv^5mmXaLZ z-)rqNm4uB8k`}+IRu!cj*`BDHAl_EJpNG{strRn6bZDqNA}lo@$v=lRe){A~L>;jDMoem<{jnRc zT=14B+e6Pxtv4I|Imv7Q*v0OF$oo_ z(55)4&cX>^hTkqad{KBEuN{d;=9!w1(iN<9_GPLTz#LLC8ISa_T4PhDGG&?y2G1Pb z{9=3ypUjWLzI*1~%I;bhwc*wAw99yx%}B}l2&}|ZFeUMJ!M>i3hKsZfg=+Hi;#EGD zF8r`2?FUxV^rXDd+7NQDeL)P=*F>?6syrVyr^%_LrWN}G1{uCajcK_^AW}Ymk(goly%sy6`@qcc zRR4^BEi(5T4Lq_{6~sQ|x<6nG)T`{W62u=jEu))gGM8zy$vL|{o8qw1KZ}tLfVQAS zgIGEdI{~oL4jV1ns{p&J zZalKsyctyt8Nx1WA6Q9b6^yAIa*D)MBtR?3h^jXpQf+sJ!^hW89NhOvE1qe8QSsJ`FkCLi~R4ujPj>wSy)JkP%+g; zdBWFgnb9zyucfPyQTsvoySuV#a+u#L8u8C~a=1nov6OoV*WUvb0_&)5U^rRX{gM3@ zEy%OQ=xA!V=8q5eMNWcrK1wX^`cwtODN*OnjF*Q)3Nr1;qh@i6DIx^IHc~>MEQBBV ziK=oR;AveB7 z2Xz%pQ6W`TLj++#!Fzwy5w{Cm=V+#`DUhcZaluF{&;KcD82lk4bFWg$?>(t{e2$tA z6X1tsqBD4~qb}+ck0SGVfC1*^CP225HTerK;dp^cSmtmNPb%CC)A;j*UGj&f6`6FF@JC_q3dXBoauILYn$f+h287>g_nfGC`+gR&;_*v9)r}4m&C@zbIiO z!ii<4{hX4#PK#n2`kQhPV&ihYy2gZlo9{dz1B{bZgGuk(9p4od#Gnv*lD2)6M$Q)I zBvf&`Fu)!cPZ{i#`a)&l#-flXt*`|$*6u3on3vje6n{~fGm;ph;FyNX9^1`poPl?> zcNo z1i3*BrxWkSvp?eVGmaT9qwVx-BE_(o2bJB; zLzD7RX_*xW(u8%uz<8xy-qPq0V{d1rxY5qVPw$2M%xH9*HhC@!BSpIW#X|yX?Z3t zqKAfQNZ1a?!`RA#LXHB|0qY{$b(u@2e_0ZxgjHxusYH0D$9&lS{<>m82_uS`H) zFDl|gTPE!9T_zqT#s6Y;ocMhDw_y5z%ES1-0TOW4^#=-&#iLLad@0k0I*S?r3Bmi1W)kz3Z3i&s1VdBxF$|TNiA<8RQif7Iqd%pLhdr z15dhW(w2~fWKBWxcC;oj^nb!m{2sd#(Mcx$H(zhgw%-0j99a(3($x*`gX=8MmXwr? zqp&rh{(ono{O7%&ZA5&_f2!dA#Ji#G$&03_0{KF>k9a|ge<56W1i7H;O$j)wknZmt zudMC@iIyt~pL&GGE&QZUKUwhq{wkA-LJ83>-&*)FxZ~V$=nPu)fpj~DobkrQ_pLZL zi5*Eu0wD`~dou7Lxu!dII)(Ezm8R&E{ey% zk^4;&c&J1+z7(!u z5>PS{U|WYyvE+~WQHo3vYcfP&bbHGJN_F`B%D1i`?7;dElkwA?0p(N(NJ@1$ah1U{ zW$iWW`-ALua)h{&>6&z|v^M!GadsK*)4^hOU0QiX7#4 z4N?_OPIVoUC&|Z6uH52!^j8o9mLw{p1NQCxeOX^CTxjVRaIsALFZo=TPFsP_-Zy&X z!5&4JlUhVY#ZD-(>Jg$inEK?laA~Lr@E4$v_1$+V%1!?XZMBAa<6)uRdWMrb?CiEb z;sGCDi6V1n#A=_PduD^dc86I9h0htU_)@&}O6KoftunyHl}K7dL`8O1>Ws%9#ra;+H+ zO=xKG__D2VFcH8(-s_R(cNE5`DW9pWx)6?&AH^O93-`=;@aZmSJC`ReiG%&A#s!CZ zf?=8`Nf!YxSAZk+YWKaGzcUF4FIG-xNM6<%4@`lxnoGs6>v`4v6Y6H(*E~4#uH{7o z`)_F#8D=E|wq$WeT>q3`THwrL<^E!7f~$L$%l z&o!dh@v-2igXxH142m%sHtTIFSp|0FSZ5PHL3M<^BCs$6_Q``pg21?Q|H9RBC#q9O zNijzH{RhkL5tfKF zja8aA{^Xb*ckOVlQmS#t<1}AN1D7S`_EX(53tKzP-%x@+LLd%_BSpLSZqEgtxweu~ zT1Xdg<%qCP{9kzd@`3&(tpb6^O`W$%b?(mVDLTCOFJYj+bp zXRdL1qb;U22O{;GB;B=_^Ys$cH)!FuCkOv<^{?3WyLm<&hTr!Z*B&uD9P0wL7S!{D zu|sDsCs8Eu=Q_jnjWq%kp#CCwbaEWBUaP37HIbD)86JkYWl>d!Gnoht2fhgcmIs@d zl49qA^{oP>HUcLP*ME)ldgN602T$0b|Bjrv0n>921YOcHuI9+7s#PJEE`G#J#nHBy zv6okYi&;ybs@$;!tUyc@KPa@Ou^OM`| z@+X4@&l|EUa*1R@LYTx=1Mj--NvHZ~f}go7IB|mXOVpAxW4kw?;YyJq#WlDo9Za&J z6j@{2_^F=|T9uwSj^R<1T9zCTbeLdeS8C~5T=hB7@N;U>{1=NurXQWZY1aobV^z~J zZ9mdfG_L3iu{NwVE!`v6h1gzO^Q)E)s}SD4s5e#X<++w|5a_aZd95sEZf%VqfNH5D zNreKs?L1K|FL0i40%r!$sH=~Un$+VGA%Wg+TD~4P0*7e5%7gpNT~XscuZG80Yy*g5 z3AT60U7cu>h(5|p3@(P@E*W9FIn!+#*FV=;XK*DB$*klY2obL;Wm;~s=lht;6N8Ua zN`y~#c5*D(7KD1#Mtu(v%*kp-0+Jt%d`j$!BcGxrUySX_4L}Ia9e0M^IZ>KtO9X>37zg^KrCn54}C_2i^CeWt~O z-%~T0i8?}e3KkQt%xY?!EFT(nE%^HN`xY#Kqs30dR1x7RVC-nQJ z`vrj;)cozLdd=0hgVR+XRJi}>8*t^J%f9~vK(0jG|8vZJxqj5yM{!B(Fhu$O{RUl+ zI~J=%7GAvtfw9jGfN5{ae5DMF(7`Z5x#hI_@Lup_v(I-qT(R$b*{tlwn(Fd!CR*87 z>9xz?zc4*ro_hDZKNg^34w=4|t6p>Y;1R|uG2@NqSx$9M0na;}M( zdRiKb-ggX)J#_GDBxJ?h+x9lEGbd4#jNOoU)}F15k>X|P(9_amM&NfI=R)znq(Gx* zOn=(}uTkV^Bm|!OX$`{JrX0eEDCH>t`=nN z;25Mu5PgHWNi%~72Ui+4x1-zkWspfhl$vkjc&Q1YrmZj^3zkfpyq5}DaOLw>dDIWa z{`{^4cWR(>G`g{~<=rD``>73GK2{=;C7So|^Rn7o@fTz~-y4DWH-XTcDk0>PP9UFP zofHus#B$m&;wOS6L!nAgZY7b?E24s}bvkAN>gpB$t(SFh+=RE4t`xSi=&0+_si^!$ z{!=FId0QJAdThRkB;l)EB5r1~C@H z&TokyjnZ_VY9wKSe@5%TC;01}V~e~^dDC@K)>M(goQ)xe%3H#6LTHNHOF?`L@0@6!@Q+};@tH@0ove%bRNnqFcwg1SwwQGRM{qi&Vv ze`DBALQK3`4L^I=!;jwoj&p={f3cW<8yXjf7#@yx{Jn*=sXMG&Ltck23B}PpV>-4;U7@sTp;=jN54xtRFM-Irz%B!JB_p6gPa} zd3D#w^b;8(-=Wfv2<;VoQIY(O?Jfc2)lQ#qbM?;m-88|T#lY#)S)7D5e<<&ENTMKm zqTx`)$-dD%1N8Y;blRC;4So!7H7+GQk;|cyA_=89d_dWJb?wg*{q(ohE{kMgQDitO*ww>caIu4zXfI_ee490G<3G z$^0tnRZ;s7N#7ZB>fs)Cvi?~m!=PjJZRpw7aMC|8u@kYhstPYw^5MD>P7O?*Z@P(! z`uiF}v$L*aa76SMv87S`J2>{giyQq@sq6nd4F7*4|B)2&pTp7ri_D7uQX^1`s{M?A zL)!Vk{A{{GgC{%0`z+`PR#%Jrm!WX`#AiPNUE1&aScq>AyZ)wh2$8IzvbFp&`g@@# zFD)DSf4IWPR2~#rxdr`eP02;Pd}=2l{+H}2amxfp|3TBd zC{H!wH%%p6c6b<`!H!!v{wDozze4rP<)x$$sRQm#tXR?hS&fl#krwtHr@8QIdl5=K zwKn5p0RQWi031xrkp7Jv;NQMU=c{KI7NS+dER(AFt(Pml<_OL&>_Z$fa09&)u!R@6+Y5 m{>tOQEAQ{q(2kHEB;5+|xLqRn4dJB`5#GoFWhZ3Y1dZf)#fwUfgN$;u0VPX>oT86btSSm(N#z zGdK6o-OW6i%Xq8mEIvCp)w*NA@^coAZj3znlp$m zWVd&!ib&O?w0npGnyrF{0uoYP0`7wqI--p2{QA8c5)uLQpAYhYQ~5_Er00@1N(y@3 z<_9^L-}L(y!q=9rzaF=D^MbEei(eUOAFS93&t~+#3x?g=7le(tw;Kt>~IpFmpjK5x%aN8c1@%=P0bs0>QMn6)dn4#eBqVoK}3)uG$`Xs>T}hzpA)bgT@5P9KDu;{Mx4uroIv z1hP(uZf!E9r}v@1v_hMTbRVb*VYLBelZjQs4(FCt9#jzYX{{4cPkI!sGpOe z)gXNi-2&4vkal)1?qoI+EU`kI{GDDtR@CFDSLf98URmB#<yqTkzeF&w7t%l9tC5 z#Ek!rlV^Qr2^8@B`Ky1^V)1*r?Yg4^P&mr2ozYn!-0Z zqGYa=ui+ELd3M&_&-PeKQav<3WUphJbiv55YguF)6F^8al`+&U78 z_&)_$EE9?nktU^S=Uh)1<9{kq5gl|M#P0ss$OJ!=BKFt<^D8U4zG@wpMQ?^e|D5T^ z6NkE`Hkn)WECo*)%v%5TuXGEj`sJ5nja~pIZF}xAppzufILDVW^nR!lH~+zMhP@^$ zgZR@>U2Lw3k)YkIXF>rlS*(HeQ~saF5dtQb`!Z<6*1Sr+Eozp>LLFP=%f}&A1M)8) z;1Whs*E(yD1$4oTv|%8_?Rlm72=#9gvbQal-0L2wvRb=K_T4+m-9@7l4R{~|llF@s z>zj|_D(X6pQ0*0!?00(YRt&=QZvt<%n^jM4gHH{(4p3E~vR_EJ-_YqPm4EqC1jG;W z-&HaqnF@Ac52~8u?_ItU%CO$JY(=G?bEyF{W{Z>qzwV9e%PmoT0b`(+elpB|{9F$F zII@dvvPKN?oAGkgip`^MV84r-c7ZgNM)~ItZod$v!tTn!b^xXqT~{>yo^`O}uMwd9 z>G_lI0Ck|}`{b*X^=X!WMxGqBF||bOcAh}wap`|@uo?@0mPHHnSb+8S{Ed_!rt1o~ z9`56pC?a+ngF0)1%^T5qNJ-hU=(a=29$#Vgxa3~HFn<3238`L)v*lT@ zK-2b@YWMdv2wok?Wrs`2`=}XsSMFFAUbc;P4nK?3 zTPq6j5y)Yp_O1jC#ZK+4y9|yeWOz%^4!)Q}=`DwX%%#d!zsUo5I2qarZMxd%Mfl{x zzs(hm4FN~o1R0DRA=Y}RJ)YY`ZsC%mdb#Rln+p<<2DsP0AVd5V`rqds?X^@Q*9(S{ zP*qI%oFxIj=&upM?K2+MPwlAyi@Bdo=Qd0L-V2ki~Bm#s+qEP)=k9KWc6VxA1Tv?q$6NV5A~Yp?hb> zWBa5&=a4Axn)U}>ut#K&hr*oDjOL5W1Ab7oc(_JzR~-R8GeLD~ z{fxwO1U&GWB<+UG?3mj=M?XjJQg=qJNkLj{-(bC5R9?ghbm$!4juz*zUEneiQSQHE zQJ!^)Lfz?&x!wEM5;GnqArls=Ce(!1kYaRiKT#_JBaeO|;rekfmP)9!+)+WC{iMar zndgQvo#nfo>7`iVAoIpgk+^4y(NdRtnws1~Pw`7WU_kP*7Ss`F6w_`@=;lo0K=g_SiEcm8lB+Dm{R7 z6t{W;90!aH1x=;RqZzed>0Zj5~?L=$vpfzi`a@Lo#aFdqQe z8Q~iyL=uk%MpEwjhY*bUncEM?_cGZ#78OhJ@*3z5sU^VQy3>toIy)T{SLOf@%t-6r z+sNnDJXp4?2rX(qd~Koy$m@6O>(Q=+%6`_9MWl@p_nwNgv(R)U4YB{>dYDl+%)2@n z1+b zWjTdtDt{ZY^yqS49JtpmT(q+2nRGYB^+Y%lp~q-7(y&qdU{*!zfcEO{C_9vl0SZ?9em3>PJ5=w1V9uw)pb6m$H>b`YZsaHzT-Rsw2Y#>pCC8 z;_w+(M_!dLGJxv5rQ+3u~m z_cr^BlyO6{;m4K)%&7vfkuja61}D8Gk#{dK0)nYOjBFwCeoBSz;M zQeW=Bi7nF`O~*rv^LcODEGBI6I#1^VmyGz|mu%+PrM!#n`^Jy0f*(NIWmm}=QUT~= zormQC+Y0`)%E?vtNH#4V)8SO$o{myx*-%f_?u2lOnj)7ycH`Os|6{&3)X;MQ>a>93 zyu<35^9z2SE)Z#2N<45BW5;Ox<~o&ZcQh`XZxt}I9~dGbs~?rf@@1h z1K(@3EQ1hxo0jVq_8O){+-aEyJB;`l>8+g64eB1wT6jnwlEl~6dhFNie4hsrP8|}1 zMV>%{z5dq%E2Af-4Qli6d+um2#{`Mlv{uHogy2u$hJeT!W8(#fSmoYVb`%DZQ!+ z-0j~@(K03vttYwsdkIVt;8&x%9BM!wHdl1YB|$T94!F5{i+h1Wc+mK_SQDtRt1*5v zU3dOm#sEh)451K=6Tb7RG7JyM6zm|i(kJvFNQz#sWnpEO9!xAdIT4$N9D^d*y%H#h z+Sqld76MqELAiHSpxhfd$8yBgLTV+TJRIPq-Xg}Uu(|ObXp{zC!!r6l*$5#KxcXqz zJ8j3uiB8Dvd6=1xIg?e-BL0_Img@3+HQ09lvoP;79&$4Y*~mH{*JLh%?^;ruHPk|< z5d14tB~m|%1gJut9#9!!*OIEeDN=|`<}3nl8m?0MUem!LZaUn1^}5lJyaW!U0R8fX z{aGTV#VNg-^Oq#eJ#-i^N28But5Z#D5#s}Z1=k-yaSrxc6^sp3(=s&9Vue@WzsACvv$VT%k;2o``&TokfU5*;<h?a3FoTh`Sn={;;;o{YGb!^nusYi49BJQ!p#O|BIp?#u%-C(V}egV0NJQdG4+-{sJ+MU>k>1=vBt zo7uKA(c|-iqC#-|{ShMs)H;_3PTE&lSvo@J z35eVlkJ=wjn{8Rm0`kQZHjRX<&GG~CEVQD_exIaL{9Ln{o#WKjEs<$tv!Tr_+OXUk z*XYv^N5c=5g>{H`$-R9z z1WWN?kim3&hpA-dCWp9h=fi*IK^t9?s%;N4+#QY3Oy*>rH9OzQoXgE!e#>F>sLxd$ zaR^kt<*U&>9FPk+?{Z(QG=&rxH6SlbyzN%+F!f5S1&@2mxA5dIv8%kAC|qnf`K)YG zVs(mHe*c$sdMrT1=-Pb+zq{VL>ZoNM$7eVTS~Gt|mvsF~5iOE2n^O;e2hemCs0Fv8 zb9d=qy);>=ApRnqp@JTRKKu3Y;)F2%*t5z4>pG2`(~P;WbS?ZhmDesS_rmXS$DtXw z-KMyweys~{m*l~>?eAmGiJqqd_hHPzjKZjSZDe?Z8KN#&-;e0Byq=7ep z-eN8yw`+i%(Mh$r4clp*SK`GSVI#6aLa?l+FO5FB-tCDIUD;>>dlpyS_{nWnEhnnX zX;O3I&Cd0ObkaA_MfSDT;WF;2oDWV@C$w?gO3UWLV@-K-O-^~Ri<0^5OzKkHVXWHY zPC8zI5?{#lD`KPYHlk<_n^fd8bF5KhN1Ab{=MCZx6h$zD&$% zK07Lo6f-u6c@qwl+lm-=xW(qh?^Ybm7%CSb+ zG1s3tkF?-0y4W^UrjIxKntwp=z&*5wQEg&+Ij$Hx*%JNcXgjRU%t!YL`sno87sn znu42v#v`z;yE1`n#w~rKRqY8F4JS~egq~{zBbYuh|D=4<9(?b$`w+{~Or~C+=TYpF&-PM;#s9(#r3`5V?%k`ah z@s@SexX;uWvtLmybq0RfCPB03sk*&Rv|o?EuKjowEK-sznu}^q`NcncpXvSTvP><= zy)B^P+*hK`lny|Mvg0lwr*%cKGWEwZY{+afzwBE}BL?;5MH9aaW&V01hZ@j!CH{sp`tn$0;3de7VA|!PbaD#*2fNhvzDL5L z3E7&cyjt&cY5LUc!pLbfOkjYmd$uu;Ub2tLn6}yqChqL<9&9QPNR6-_+RHgTSj=A% zYjQv~1Yb>$pYN}B8sxAOb&STp_MVZLSAe>cu?Tm1oAaV|*X;^dcihLDw*ZJ1(LtJf zwo>V>`W|xYU&kGB_eIvO`(W8$R4p4T?){`5K;Ur{g&B0OS&S1Iy6kI63G}_#<7K0> zlgUphF5$P4O4(wlN$Gw7UqcDiq2dD+-!2^>2g`(q#g@(Cq}H4bLC{AN7|-tsK#PRd z(Dw;Iv%+E)&37c}+~mI+qw9mFUl>-F3?QJ%ewh=>>5enoN11tKw+{hrjqs$obNDq# zqb(~{A%ukdt$w*)fdYD``yW08l<))QfK3!ff(rU|2Gc^_z-o}1BEnVBDV)H^-vrEj z-zl-fPOzo*Rf?s@-|lntvBT||sLid5e?h2eopl+#6uK72gcm!vHX~aU|0{rMkC1`p zt&^WE-OK=}K_g+tLsXC811%ud4^K~eCxG?w7IoVH!UA!W)QtPQ4`;hgEZt&iqve#9 z=GnZFc~}m0oPr60HZuvq#Qk;sJ_*0O-rTWNBVSiM@A>IT3*d2-vP2BkOzu6zSp(J( zs8Nq^mdAkn9P(_0w)FAo39x)K&K;*{)qXmFCAZw4Rs%vzOh!d3Te80ZyTCDvm=;j+ z-}0hk0NF|g&T7ookIROzdE%t^#>sBp{?+cBz-RYx{6FynS+xA|^~AFYH=%>w?l7Cri~Ur$IEuck9Y;bhR62>*8tCE2 zoG*l{7+~f87ug1K_cX%Q*>q&Qs>Oyux5P!AXHp?9vN^f-ifd5pF;#S4Kb`A8G3EaI zQOP6>>><PNj@kJ?|s`ZvevyUNo$9=g}PgBy`{@RajU!UI4(nfY0EDU=sF!Lq;W{qr*?GL(61r zNUV9LCsGizB5^ehHXGdbaxjMxI+_z{fr_8XyQ>c$Ix&8e4^Ule;W8Yj)uXspa%RpQ@ zJkWulMom+5miasMQ1g0C8*#Ovjr-S(fq6IReGBc{iyR{}HWnpk){A_{^nGdYMk`am zx}U7k-?(7MdMsDQ`)a|qkun5OsS-yW=H$0YlOgHBIXN}ec=`s=`V)EZIJRs)zivo^ zF`LkJcbq9DEsdFvPs{hst_MK-^ zA)=wF=)XDsqdG0~Py-yfdy*Kd>R>3q$NlA;FE;~71ALeVV?tIm(YNYZ1zDZ_-Ev-F?hT~Bc zo?EoKvaSX``^z*d-H-rtyft3ftux@70|+9lB}bbj=r01e&D!*8jQjV^wY8m>nG95@ zyt84a{3v}GU|zD4ny#ldidS)Q9SP|FLi9tgRI-Q}g=Hlc{2uQv7uU1-t%9%o{BoFd z4|0y@Y8Z}MHVGczu%rX(DfrAQ!948faXa5g9N9C<#-%NGjQZvznq{wg2TrM*|4P#A z#iyq!hU8XiWQo#Iq%F(lwg@;&=Co|3nVg*GJ=1nQZ1J7OSUjM}-7kze?^iW5v#HS@Y`C#L-7HN?Uk&uf;g zMU*$pVTz>1%PF+0P|3z`<2nV68os{JY?k92CfO|MIbiI4?nZRtoZIUX>y+Bu^*|); z+f;6y4h7p#NlQD~Goi3^b#$U!Xgbf6MRXEB`QJ8g5w(y;VE}6+y^bm)ye{{qR09d9 zg|X5t0$R;qe}kTh+lJ+mN7MW#HvfNO!=Ds;np6g?2GDfU@k7oPF0DQ^{B z=Wir<72e&hy|Vh==klh2rAJ%EQy#nMZfs4dFRv>kTJ=b2EALo!D^KqRn!|atWS8+Q zm!rZ;Ku?M>cDUMvqp$UdN8Yv5daS$C$v~d4T6NZjJHz*2j+?YSsxdLiZw(@WlO)3+1Z7kzQ50gR!L(@YPLzq*O zCo>5tsna!6deU_Zs=JcZMgWdsuPDI zV&Ctyj}jPE%hb%Iox3ATKrjvF1uHlAMs z8+fWVbF!9rD2+2G6m;KeEE&G6VD>E5Wy!Lm zGuB|^`&ZNUcVV-~iQ(U0AJ6TH$2zWe2LbK$ru1vC4woXD*8*r#Q&WLkTm&UWwSUjR zv748rjP{)LEvCoe_%sdO>w?|tLmeFIt&)^Gm=hI>go8Jyn=VhcI}T2>bL8p+iUttL zIHOAbpZ6-b8ufR7n`V%u_6;0gJsdgnWwu>)82&|`WJ}bq?PTjnxCA@R2942}C{oj& z3Y>s!r}hT$OiabZlMkH@=W?5_bcrtG*^TDPn2h~dS90;7=OO#SlCK2V{NYpXf9SL*FZQZvZMKyXMR+&n+`abG zMJVguJaZ`N@}vtxu2&v{)@{b_Bx2c^r>5t-tTqF3LNh$a%N@44Ag@>Rv41;{HQtr4tO1wImxh zkdpQlh4}KDFxc)3V6o{lm{rKBLJO}w7UzBGgRPfY;T@T6%Lr()LB8m^&*D2F0!^96 zjMooz8L~p|vC>#rSh%}8K~K~`Rc5w0dHsWw@q$~2!?~Qi4;jp$4zT*e>Mr4uy+<|B z<#Gc}K(Y>9$s>^@G|KOJHomvRq@6Ib zb)5|JNG%T~P$+6}N3#Oars7#o^z`UEw@Zt^f(Rbb=36m3H}NvbM)8>CJ25`d(1P%_ zUPu$@&`Gg?d@YpvMUh-qh?6tJ7g6s4*jg;eT+HoSs_!hgK%U2Ph4>VqO;My*Ump{v z1JRhJegdcJ}jU#pF0AkO;s zT%mDV=@UGnn~ z;BP8<0L6wmH7+g*(ZDosGiX&FHF4t0_q!@W-$_0Uc5ew>quF&j?}v{lB>N=nv!MOFp;g^K;FRNE-o;q>Dx@j1jSHX0$MJH zv>?UsTmm5AMyv>d{4beeWCW+KCZ$z^SQ`W$WQ9k42t@c~P>%~#GfTvZHhxva=4>&oIeqS!jY#Jb7qSaGNq+PCt{+4ZrY_dB|ky zxpvzp0XV@7+#lkbfk7&FNgQoGKu69HEk(-^PwXZB^t%n}uS&;)<%p6+GMtX=p<#uu>~Z&&7`4cd9m&va{n; z9y#xtGe^Y<{;lQ&n4Y=j1o$F-IJzkzVM>S7e8=#c2@LdAC*E)tcR!Yhdq2vxehWP% z--0t~Ztr^A>}q{mSmm6oE%9y3)q`{ua5P)v}E3TAN5Ph zxa80?@+6W>S^bhwWWOg#7JBQe?p@%mQD8WAN7CuA1*)j-K_!&_b{zP8uZm8PfSZR! zPk@dNCcn@dzZU>r*n#trxFnxTO${>FUNMSOhJGl0rLH#iyK&Ck_ahvX0)?N6U94(;GzLR zKMFrM65Z}s=%iba_^B@x5-<3QlVBz&e*7G4UNxSQ5!Iq#oyhNvS17dUE<4+@8hP|1 zI3u7)@8Pw0GA-O2m-go)(F`kj9je}45MVu0XG~|iB9~R*QH8}NangOOxCoQ9c*r|w~qy@q#fWF_cdBIN1_>YD=i*Fkt zGTR4qJKA(OAYqYsr zD9{`AX=rliNj3WW%{iVV$#_ zX=Bvu_7l$DUghpp55Y-Qf(S7u2ESRQdD3i9Jo@^9kY?X?5SN$S7nzwlXvA*8zT*A_ z93>Q^7)Bsv?AHP_7Gjv;lR*iz?-W!?xoLr$E16$uWUxS`N#WvZu9yf~UKg>b-ac}Y zF1ODXz}LD6d~o7BhGNf8I{I4)tqFjZ9BdD9ddmYXfEkykMY!dv@YO5P77eJmO^sov zWUfo467Jdz@%RRSZa{J?b`n~uPMj3kx@q|OW<>qv!&S*Pv?fm%hTe;yN^3pg)q;3k zp34N!^rLkfAq~CxPIq1#iLauOJDn5fl5{SE3z3YWBypzyf4r4c0*NfJ$dSshepTY5)J}$dqWAr(=PpxfiXlBLb z3y&*&E_As*>Hj9F1%ao5uV&(Br z&FV$t5W=sx6&zQQr@!zakw`%%BuFRrH1+6)L%Kj%t16fuz5^k&SWTI2!tt+VU{h72 zCMMlXHNbSn27Hd$85y6yjz2k5B#`Seb99=|g@nl{3VCf=sX+&k2UD06{*pz&CC=#- z@h5TGAX#o>5eIzv|9VRN|`UnMCe?=`|5BUU#!5&;YF3S z*A$b*cCT;-v-NrncL=-fy@18CYS3hhYtyez86ZiUgyb-|YOv?p`=%lR{I{~^rG?f@ z+Zn-usbs5(bIBVikAzGT=BrhJ)v?sZ?zlrFg*cfZcSV%iMH6%O0JOwwPooesWG>y<@bdC9;@a(l1bc2C_eJ+Os^Sk|O{izQR@51%zSixyP7n0sFWSp>?CJE~J9LJ0 z5`BAL_n<#NBEG53h|I)~yLq?J<0zVZyLPZ=eJFills&j1;TK3v$K%K5GaW!}5+^xI zkrdhR$`CT)O+-#JS5Ws>#+F;**sa@ye0Zt~{w;y)^TgC>L3H-ViZkb*wg%nRxsERU z6<4#llc*DBK!|Pwrat;DmK|X%`syza@diJc;g#@0Xc#4nVAvS_PbozcCZxc+&r4M~ zR?U+!R!SB3s~e#UN7~nZj=MfEfcy-m5vi5#bw~Ob@+@(U zNO>O6FHewrfpnNb5RXoUV#s$uptySk7xx~<`xR-0(^Fd>*1J&RQx|X#NTAydb&pD|7ZDbPM@@#h zk^jIUdR$GwPTzBD^>Ui7`09ev5is}K=I3Y;f>h^0Y7tD85MgO~mqzjircE{-C`#&q zP%W|d-gCWmUk^P;s9+QxDUa<0AW=tG3Y*i!+0xbYuXSq-cQmJy#~sWAX^$%L?>bCp z(<>ZKmuG~Yi`SmMx+?AZaExe(%jr5(+2CLU6})96qH@$;S$HnkjD+u3w`=nGs|!G` z1IC3&p2jyt&kHg8u(DOZr>2(dWOSVN(*Whx$a|WXVvy`>yl4FVkvgM4KWby&fFb&; z()5nf=%0sRJUac~$4V%3*Ky@h^}|5);S_Nv(@+awCVYfFBg7^FhYbVA{%=#g~3 zOyAqw4X=R$eqR$n45@=0xL|hn^>9NO$_LufrTh&V0G-VfMvDVzy-GUt`xXtch(V6S zhWkrGDp0H-=|lBf@6VqtHIIUdUD6qCmT&oI7?ehW{PeGjWylwaKshzWmsFpJijoB1 ztWZNZeq{S`=lz|``LGb- z&qG~;9o&w~SrefBa!i>}^1 zWug;lHkLl}`80X{uxTSn?mGKQ8yjx{(p%O$1VOwzrFydyL4sm? zHXi=B3qZSc>l2^I)@!d?kE5bEe#HWv`)xUGxqE#X%>KfZ4vicd&yo#?LDdyKyqADrFqQ5m!f(pJ3&>>jzDqf;&-awHQ1*)bQ@)I8kH^2s zS|-@L2H0`t{(d$ z!FHYw^flUc{dsE7w`$ofrPLqT*1} z#Jm)lDZktD=w9UkefkZ!y&!^5h-e2o6wy0d$RFYc2u=PR`*tUt{W4{>62)-v9dn=O z79a5vJ9Vno1M-HM+~vnPPQc`&Xc~Z1>FU^F;7(3Qs(&p+w zLCeVwX7aA%*Ihn{*5d>JM%YxJT)hKBrrGjufh$w}D82+PodUhEx8&lUxnPbbQ5bRo zlh5h&xz%DF0>gb$iXrTLFMS7UC-#5z(lYlW@<=}I^RM%gL)-aVvHn7WymMN;@;%s? z@VTIFrP;{>{BTTMzNtP@7umU?*}HtFJKuISa}l+pl}qWaaL`Y(Z095Z~%j8R$9S! zpPZd_j@mRFd&h94s24NlL`3_;H*-wKc>}TaIVpIEtb+L%7{YytatMl05foueb7NZH|(n4;`T9Ksa5rsZH_T9wqK zqyh`+*TZpt>q#JqY#YYpte%YvX)iO>+N-ZbhYg848^0p(p5=5kka zzhjj>njAU|U>#GfN7FXZjcHyDpkeU8NIJ6bdVadUyk`~9-nrputi<~Srlv6S%jOso zi;ZAA3v&xaYJJ>^>^$-Xy0)5U4h+or>oI#|%XYH%3ylrT(0NNYry5NRh`w)CE4tdJ zZ2Ea&s?k@bsiNSLk~CU(VV;`ThG8uI^N|bcYa340hem_ z;W6RF$spWubuLeJp&jb(_z`mNLy&vzjzfs>3>;!rhxY;Ba_o+EKe|*iBjghQ5XOg} zuqXsFs~~^o9|sVMZZ;#ndy3Dg6rcY{y)q77I)p^0av_j>3%ig^z_*(oFlh{7A$_Bt zSj0*JyZ=7++DK%Awc>3w-*E28MWMtQiXUT{carO0;_m|N_Vwq6DMWm zFpr`a>s~l0{ijpnY!BIZ52Nygh%6SAv51KoI??p>{LW&IJbxW~tnw6oV|SMo>PCyB zH2VgFnBgCL(fBrYbMfupQbt${ooCQFIS;KCX+i8|3YE|&b)BU$OdH`7{2kFwD!+L$ zZqsIBgc)pR^HJi@&HjbAu5;!4dKE4AGM(I%lu#2VuzpwSz20@PTX37hh&0%})}I4? z#?FzFH*IfMEEJE?k`#{;gduhgJGKH+uc;4o3)A-W z`ukBa22!FXyyE4ZO>VYt5Q=wV-H{Mq$Z}%0&CRxjJhY4my1I%F{WG*413BktS`V?$^BWE2$eGZ$XWF{qE+!)Pl#H;XcMAYZ}`N&AB)%qk_-=iHQx zhm3tV>y#T>*CAp-nXrUD7yOJ&-uGb|M={d1nSs9KzC`68*VIT|+cNlN`>08QXe&MI zz>Hg_9LANrkS3vtoshNKu37EXi*MjQ8}G|h!@7@uNWh#VJM81HA34W=Z$%?$=!@@1 zjyui_)h)sZjLoql*H!!hT6mEKW7W~Jr+yM{uul;h&o4vP5|9tca?X5DeVU!6h?=#B z;6BRm9jW)1wODf3>{F%^#X^>;4-xO#8usbl5P(CDcYum>BrJ`j_@G(t}ze^e85pJ zuzEvACOmHMH`Tq(&aQW^47@lwks4BmO0%)4#1H|IZ&qGw1<6Ao9XB~$3HE#Bmd4ds zeQSLe;fCLKN?~J^&n{VeEeQitH|*gYmeL7j5s^XRGBS+ZVhKB!);^M+2j$9`H9wP9 zy%TVoU*RG27Y)u<>pr(8?+tRQ!O5 zedN^5&RebJ(t*&f+_A~(iIH(OhpYJeDrGA(o9^!gVq8Ll+pb)BEI+; z6)if3T&CRl7X0IIy3Nk9XaMREWHUn!vEF3qcA1RM*DwZSf<*vhzmphY%LF#O4AKFb zicSGtXxJn#UyCx<5Wl ze)dfGI@Be?zy+4ER_uNvR_a4x1N+|uFZhwB%CrVfV9-W|73%TC(uprG;Jv$BJM8Fa z&8@@@Cp;n16#01o(_Sa@K!KJ@)Ac}WcC+b+wtrl@H-r?J+OX^@l2 z6R{Ji&CIg8yi;zz1cB*!inlEhIw4qSovmK}~4sgU{ZT z>Ze1=dD%3WBLVf8u!;m>(7D1*E)EVZb(OH4{qp4QmMFd+bq8K325%V78Xv?<*Ewr% zNl>_YkIAw|Htui=867E%u7*m6AUu*NKD=;r^K+>3DmxQa1o0jdVq2k2IDTG_NEr6J zO}*lh$K&9g#~sV{C4g=?b89MX7du{sy2*uMfoZaJAy#kvpc1GS@dH-!hv?C~(IHb| zFk+^%b7@;t<8PtTLjPW-JyAaEL74QJ5^kUFDH&noYVw3wVG#m&1N@5;DG|AZS8%tb z7bGvSEYSaJEM-?!Lx0`=Yf>UMnmL3tT}V*y!Y}G*rF~y(6c={FI*Ltn`cF^)c^paW zrvI%eK^%zxhcOf}X8#P^|Gkqm9(j$AMIrcKvn-LZV5@+&p@NbarzbPmX>Df+%fvY8 z-%XBs1Y8s`$eh6|YI4n-6e&Z6(EBi9Lwx^{w~(Ia9Q*AgQJQ-zAXG+vN%h}h zEz-*-s4XzXouH#&-K5ri6@`4M>!I2U9hq$M$NZmo%^MfW6;p9oIa5H|KNUl8gs~nF z7J>pQrEh*R9O9nS$B^hn{NJC46+b&Sm8=nfZ|MzoPRRk zfSfY#EHcgf+$~G{dj$Hl%q;Aka>vLaB9SI1iZq0Wv| zca}{(fBl937suaVwM}1f34Deo#0sUdKZ$z$Ga<);Xej0>bjvZU zxRh2i;fEX`XBJUe0+-Xe$fzjAVj&bZC)Bem8x}4pOdAi`moHgaID3G-+NDk10}O#3 zAEDv+|6|R{XSAZ#*Oy1kA7OwAF=Id;u9WOEl9u$Tli$hSmxIA;tCMkaXG1+?Pt3{z zB9;Izy0;EsXUQ)I;u6;0sInb;cLcK4rbr2&wMW?MKN~Hood0&Mm6n~kI&|AA=+=$Z z(E(TrO`LN5vx=&|two@k7{KaphjjF8Rq~jM1Z*a~W9fuYQ17pmy8`?tx&q}cj;Ba- zgr=;%at!2}wI}LohuusQypHs2NGki1n1+*xQ0J)=joPF9HoL{3H*H{$^WDh18Q4sK z^~V4q2cT}Lu6wa2ipk^!X^(q~4agj2!L0LIE;0&yt*x!KC;4w2E`}<1Y>-BHpXvJ1ON5Wo)#;7pMWY2(N}g>h@5O8Ejyls9+RwEQ|T9audzvGEr>xTV3m0V^rAJxJbpaYB2v{ zbcM@piWR^9(LnI6nsffee3QJ1iZo;JIG!UEbptTkbDeZZAIw#Hp{f*0>f++^`@IH|m?Dw@O2eJT>oJL-xS+(Nu>rUb~ zaqs6TouN+AJvR1U1rAWrmJc=ETJK8p=Ns|+WW|_ySWW`%{p-M;IEH1*;W33miF>8NN^};^;+LZs5SR zZ7r0SsfzSFOULg8Fb(<){C1^;C0m1Bjf)BK_GNc%G;zPNpV+Xa@v!~Vu-3zZxC1mO zS+qg48LO!HL9p<^K<}@ULKP2nRFbUU)5cm|>F+IYFLJh19CK6Lhj)2t4jmR8ZJXekvVUSb^fw- znm@XA)y6r7*#C>Nw+@PH>!JsPySrPk-~@NK5G1$;cXxMaf+isW5}?uG8r-FUCb$HG zLj%Fxow>aCzTZ^MR87@X^&eeS(|zx`=bXLw+H0-zHEqa-LBt1{Gf_#~qAP~4Gr%BqNd?RAlRb27 z{v94ZT@v#^A3S{C+nmrVZG9OWbzc)kU9L=!y2Ks)-K*W{v!Tc~6N-~LX3rY0sYl4z z>sk){U}PMr&k)dl`BL$XLold9AwI?oi&{*`IZnLlkWHQbT`bc%SJTdv5QRJ zVDoZY83Cj;wg=3jj#$aR2OIE!6!WVSL!`DKZ zeT2kGJwdTtDpqcw6^Fq|lmDuY#voo&J{UTYE@sb;KjZ^DNL%UI3=YAhSRmoS79D=? zK66XwO17!ZrIV=i`hgsdhTc-qTr~%sZTB))GYe8Mh;JDW(NHAUy>TM7dDU;rFUl=^ z5=805-dkO)U0%76xcn(nQ>zg#@ZQB+oRXCEHS%N2G>gZ%?EClF5~bp?Z1}%{O_8MkiPMUDC*z|*3pPe=e-*DJ2*Z=0`Btn{jem7j#oJyd?bPB z4&%*%TrcJ7AM;)nd7%=An#srj3DB1IYM_)MiDc>7;Dr9zBR0jm$&?9(`J^z1AH$Ex zoSAS0Nyh%Fn~qtHlBhPQzhY>o@qnc3^#R zFQEF+|8RXL8Tw&x?0sK{?BCgDXF-R>;p+{U!#nILp5+V+UWk#=3q`p}*w@zkYT6|M zO#VveThT46FMKxU2C^K7u@nfRYR1@)qY?dyeq&2v8I~xNE?*wP(b-GyX&!^OL({di z{F`h`Sc8OfWj~PrGy6RKGz<;UswDBLrt)#(lWC1zR>~uJvOkYO%@#l5yiO5^M=SYN z{rgW&d8G*9f`r{Cz~{p=v4Q(OjtWUsG6-p<^~yBpC>-T@h8biUR(aM2Pyyc@oexF3|P-7 zHOfn$_UqQWcCU`Ra5^Gs9@pGoE*+a#HC?XLJOvTYeci7X^2aZCSJ5b7nV4FvuVpc> zMc*^oX%ah;@v3IDRNc2SCOYV2)|o3ksV^qXEP?f}4RUF03`?~zZU_Hl3ICXLdSLcO z{%2oq2a2uN_*BnD4ZB@e;pvzL%@UUK=IX7!ZVEw3gWC3{#?96{Yl z-CQ2|x29Q^rHrF1zP!9rWV{+QxAeB+(#q&Q;#_k2`l&n#XB)oX+IiiM(oV*hs-|fw zT9IKRAM6S>6TysKLSGw8Z+YC^-Spv$%RK4mU!A5OkqA>ShmioAEeMBgtAsK`a@pdi zrRuN{BPacrmv+4~yVJ7=WwLdixG@>z)eRDgcXpzpC}v-l!kg<`$3-2)0$%Z~X*~_L zw`xR;9#2OQv229`hPS zTFoEoaq%&-e|I$O%T>l-GBPtT3Tx6pbolcu^Ey6X)9R)WrS+>z$MK(}Q=`1^O8h&G zapKbF)TUR18yJ*057Jzzrh4<`dUeC=aY$!nrD8rz%*|wS^sQ~gkL}Kr=wi^|{%H3Ew z@GLVK<@tR!LxzV|+X(lya@B38O0FwDrr+>_vW`I@@9S1M_~o;UkC3%jUC|o&H^nEX zw?c)eJS8^J>#HBX&7H0rxjJdSEnnO23!m`7>`{k^ER%W!Q>vuj+u{UgKBsh8vbWBar>)UiHk;QvyetfOT zPn1v7spGC3J)tPsy}T%LxP;Eu*h+zgqbp(JiFY*>5*Uoj9vp~<7y)wlDTIATRoT7o;-mE(h1GmDw%@S1njvIHDQw1y>;n{YCm7xcf3$FCS$W| zMiKMY7e9JkzNi&lL-Ib{J$Ru%;uS|0g2z1KK#TX@@pgXln&i_B&gA5z*J4NT9k=Z$ z<)S;3%1y+dT-q)JAgy{M2IDB+q!}TRxjg$Y)e$Y$%U_>oCA;PDAg6FOBSy9|QG@sV zjlcN)GHfM1)3v568PhkGa7N5?c827yl%|XeD>y$rKFr4&RhxCgcpL*S_a|JxZDK3~ zk6F;nNCnc#asRBH0+^BFuZU8Zl4ZpJlFg%W`BKP>3urKj-iykXS5C&4NSjs5iLu!2 zJnrXR0t^yrF~sd?!5aggSYO)=r{^^oMGgJ!8T`uTzU;qcuRZ|qsJ+!sPyY^m0)vwz zf^TV=nNeKZFNhmlSCRmw5Z$ZYA;y7g;$59G-Q2o5LIB{$BPS>S`0X27=Ss3ks}Brd z8fK4{6%-%>kmK(i$)|hI0~3Q+8i?e z;|+<^e4R3dS6^SBVVH*8{oTq_KY(%mMoJo&iK2&u?Ff0r_vD5?JzgI}a5ObEa^!#Q z&(-o+4d8NcH#jd8_Kj+(i%0kOD z{O>)W$~c$lU;Q{I_aSBx}6BDfLF;GGRCdW&m+$`B* zK$TS%9W!DxWr{y42)pc#M7eM)Ct}lGRg}ENV|x2ND#NwIAW#YHze$$$ACya5hjjfJ zc0RhqV{@v#c%7Kxes|Eg+OXiFnZ43AB50h1mXAWuz<+p7dSshEbxOg4xc$KWP1O)n zHA{r3s{NAO!otEUXEjGLaxKCXE8r!mYnMM=<^s&8^<>UAJ6EsD)X;A{P@1PU;KISm z+B(;$(dCwsvO^wc5a^234dgaPZgrlGik<)nm10_MUY<;RX7=NG(e12Ta{Tjj23~bY zb_*WZrPB^t4P|eG4bMNf*-pKCRTP9TvZd>Gh%8Rif7*Jkt)cD4D*{sHdHkwpIw4yl zxO^4SmL;De4_nZjCQY`H=^fY1vW zhq`<#){XktVzcLk8)twfb?CkO0bVmKhN7+*Mx&4WU6v^qt+T-2PpCj~K+g@De^K@<+>;piC z8MewS&S-6I9k7f7GH~}JSr;aW&K5(-{Syg2ZY53aIr(@M_U`~>QdZnj<6?U|IIL=^ zlFCHT({ggE1@iU)7+;h-cH^3r$Dv>noiR^5q|A=cqqVKgxT>%ZX5!j$!=#Wvnwz%A zxZf_2I&V#lIh^cHFYzxxhnVYa=Xs_NtX$cGo@i(d5c#{KNlatm5Rg}&$*6VqQ*y@t zTaFZkBWSpzOF2b(jN^elH`K<1X`XMkFaDeAh`9&!#I655EmT{~{{g4KX2fGyhdu)U zi&IDMpKkTy^}6w+F0u8x*Lu*5_oe=WA9*-TkN{fmMv~~^_SN-za{LRtQ8E@OAre;J z&s9DDp^<96tVFcFE5W{f=f!3i2y!aYI|W~e87@CCe)e(%>J`C9TO}o3o)nb5+c93FE1`0 z&n6_Co}Lx~7yS4Ei({)CFC#e750FWBwYL6oS(rXzlRzU$4WOwLP+m70gfli4maaDc zGYw;7%*KU^v%kz|YbX89tlUC;3Fd%u_j)a!tIiG8 z!1;Fg^|hb#m*?G0zuF8=<;|OVXrAxU^1Mdq&X2S@((BbooM!I{ZtLNsSI4h7NOy8X9yM*5E6d8&=3%u2ev~X7Dn>~vpTpb)rFJr0` z;)yvXS9VIw!EAb!zyIcro0G@kq8Dy#SeXbE{_U8nwY5B4Yz{y*Fg2wHNDJOAfMV1T zgCaHfY;&ZAePUuFw~V0NJi=4xr!0%RPCorIo+Vq?Q?*;nJdv zkpl>SciLRqP87WMX5JR%lIAK|2$Kmq&-0z{&uQV%>7RRyZx<@UN{YafrpN*CcE?kq6IJge zIrv(oib*X-3giOQJ>l>X%jDRNd9ie2F)~p%WN&`*h6adjH=ECi zc<&aRnNgm>cozQvg8YY!B!0B_|885jqx@>kFLG-}n`zG9sit$o0SQ6x#;=rm7FKrl z-?F*e967W(g5f8~0DFV)IPs|8$J0&HoP1p$!R3AM#q{-|Z)X|E-rbJKyt(I0aM`Op z@XF=jN3L%am<*k$5CaEUEGZ(Y6C@Me16uyx+bj2Qm*{bve$4w^TmrA2=22D>TE2mu z8&Y1YSa8@V-CN2vIrZ+D3L_qe-z@E_hwI6bm0Nah17FM+wJ1rWFpxsXR}%SP3sGQ{ zezI^=OwNu?6kx*SWL>4uvk18d9-A;Mit5@mgKIQ1_oCmA&>pa z)gXi?M9w@`>+bqm$wJSDhfYe%B*LmaeC%`H2%}>NO4a(a$-j`PS~U6H@9i z4|h_MGaF%65kHsIubx^7%E#w+fO1T|-O5Bw2A z;hChkQ}ar|Q~%x{P4lKn-A=L&39ctFHbVc9>Yve2Lv&UXd4ai5%WtOxgp`A<23o1v zFw*${oNFm@eDpoEH5`46;{fESN*d_Z7;Ce1pZ1(pZl=b!XBVet6 zCUUMY;EK^>0531CriKj^G30SK_#L#KfO7#eht##qXj~k6yNRJ;98eb7e}a&B@OD1; zRMXsD78>3b{Tm*I@SY95*dxHGm2k_1oPQ}EEk;w{0Uin~o9Zxp8k%Gv!`=J)Vdp|g zRaMT=kQ`XM5kLn#CJ8rcCK@b)Zo6(>J<=V}lNJ;M3Cx7n>$p-!ONt_>H4wnGHBC$^ zhTLA|D%S6;02QITCjLxd>i^*34o+chygw-5k2xmhF<~|czD6p9nQ1Wa5XhG>Aco)A^9Rmi0gkU zj6lDCYpZ4oX~rWWLvTq&yjXw=Jch%lftHC0SvCf9!n`XCZeGf4J~kE=6Hw{{yOn&E zX?tC_LX8C~b%64-r396z&o=c!Tbr2kaUv;?3=JD9GeR~=jQPA*Mhp+aQG35a$Jr~? z_Ta@a5)ZN+VDZ(suPbDwj?p78Pu-6`1nq45Z)Jg^q7Z|zsiDCzYWe=x>iwF=XHCbv zn!Rq4S3KaTwB&_;9tA@ND)Wv6jHkrm_`g;rU@`xnmr~^ZyxbL<#4e!hAr^{t%oF*9 zbuy?ken`3Wbxm7gn@#@>>DWD4f-{24nJ?eSijt%86gHKJ+4V6@L=v5{K~_~U!O?uf z@t%5}jNrI=3D#MC9bH{>SkI4vF|IHO zUijjoSh;Dt8vmv4^f+_OJ9L?ah<-Slrl8qI;&Ms8xa+xh+aFdVMOj&u$53+pVv~|| zy~lE|PQul5rQN$hqS0_?MN+U1pezd>1$<2MJ-0>!PDQSK0dEo4DXG;q9G9t&tH*4c z(g+cM;-T{L@;hy;x@&7|UM<7JsxO(DvwyqdAb zMZ0ggA}cFvi|KfZBAj}6yX%UC$yhpbqGbaSU!Ff@AGUa8xfVOg*jp}!A!v&N4%Xh} z=17LO5#-*0xX|*Oy;bcn;R!o)D8f)9;QzAZ-{mo31o8N}zt6qOFYI@`3UllhGobmF z8osqv4|BDh`<4VKmD`%L{ZC2bs7#q3O-(%?sZ+zV2*ipsISZ|!$W?ShV?S#+R*x(w z7hY_RcpkTq{`unXcFiQp0(jh9@axxDL>~?-sjL6VZW~n{0(>ENf?*dtr&g^@sDRCq zL_Jfj?U-rat|W7^$1qc%1mGpoPLW{ACA(VZ4`|A{$A!!p8UuX=Hb=9Pzq0+=Mt;fW zm^@FT`sbb9Dk-dt9(lYOE^s0NT<3|G-#Fg1l4z?fvG_S>i?!(BYe9sSNg-s6;gPrSDcCo8W?Yf=p(4SHd$lFo$DTbF0^BrlATJ44 zf7dnc2p#VX4Gm7N#n#A4rVv!y>OLAyyNJ0ty}Q{0Qa%fbT08bB+)jYJU7t2~tbHuT zH_M8xpWT$*6NUWx%<{e~9HHKAOCTEW%)&4=Sthz)G#V3W8qgNjg}d}l`Pm99U-O&I zZ7&sY?@i=`Ds2hz?i0^9#+7WzZbY|*bD^K}!u!RekwOtfiCLI1rR8y0L@`)a{YLzj z{K20X6nD=EQnO{^wrs?=>Nk#7oApiO@J-JE7M^xmMqcEO-&_CoLba^YQ06Mu^=~v) zJVVevB+?UiZirgISoIZF>-~uhTc(t0}q9l%&0NI5N`0beUsyy5D-YNj(uVK(KrSY ztA-w~ShawxsD``V9N)1YR*l zRj4{O#8b}P?4i*9ib$<0H1M7p6{ZBK+B*%uN=(<-X z>K*ksShjz`T-V&o*Tr!5nAi2Gk>fA}XzYePXNktfJWfSwGYJXB1kbj-Exw_iS0_HRZ;t&uJu;7#JhT-_jqgnEOv#JSPOvmw4*)$mr>Ayi`M<`2tPgf3yFVnZ13p!q znZ$5CV07%-+qL+<-Q15=6qz9pw`RBJ7(mYEwv=9jXVMWw1gMcJ1LKnZRyg76lEw1#Z^EG4=XN2K|QdO<=7= zHS-L&{%p!1*hKAB5nlHVc~DMm+9&bc?4Z*R0y6sQcE-ow@n-bMeTO5F5dvj|Gb5n9 z;4O1Qa{qo|13^}&bV25(*RH04n}jm9)`i$ zBqd4Vr#{(LI5D_|2(p_tz4ecv1rf!@j|JX7m@@gJ7|FUmaq9H7 zm9W1{e#a!6%n>qHP`(5RTGQc4BnFP`9J_YzWs#K3cqD#oXDL9F#75 zgYFHT6Q;Ha+~1)^xLvv#ZiZFYtY;?w{OR!!Jn%7G=%}qGHaS@f`K{sw_lKUx2SRwK za;NQ?iZU1NjL1Z6iqU6_uTjyX-{P1F|&Q-;SO1$b_}IHt=P3fKy4aG4SfLU zPE(!X{@hdx7^%^nSqJb{3}euh;gzulko8&+d1}U==w-vlEI*e=0aGKuPYmS!gWrCK z@}t{O4FC7Yt`fvG9VN~1RMkZj-=*oJUjR;}gumJaf>8Wih)a)s(lAz^oO^;h=Psvqmjd>G|r;>k>ecQj6L2zpO5=7M2EUwO)+ z%@*E*Wsl#Crwk;04EazHK03<0njFW5fo46$pF8oyzV1LF6K)|i#P+T$iDNV|M{`7E z(38yHeSiUwE%{kcMq`-Yq|XQ?yJyyntaKka`Ci{OjrirOiX~ZZGEaHXoLPzVpIy1r zB>(l5xU;+05;|_30Fyxp*1tzXPrj4=wW7Q_^UJ4#NTK4#;)<{|E9ityk{u_8!@h_}lhDg{VnFgu>#eu_+nCdPRYmwCpf@dKG)1w6i~8-Anao@*{V30L9SpV)J;;fx2c6Fn{m;GnbbT4 z_7_7E2W>@Q(CJ=+!PSCNkraB5ncH=Kzj2Zvm}HyzX$F_3H}>`5Z@y8MWISk4q6hD& z(58N8O9uJyA%OotI|4@mSP6^OG)a)TMg0O|}J#m{9K^F6~0&k(`fD z5-~+{^G#{^a={f|65Ed#Jmi&@-7z~rmjD96kt|n16h$UoW4aHT#J&K=-} z4>Uja&aY;#EPxPDPU(BB8@7nmz=gK~1W=3@c2kt4m!`5L;~3ufyP@$6i_{Sr~;m(+mNH`1p(vhc4g2J>bE( zdOB2OxiJ6}Num#1pTrzfR8irrY&+$}q>(sB^$pNsAs5Qr`_uVYPaSeGYni-b&cAQI zhWo0emFy}x^j=n-r3fXGV75t{OPn!C!_B@M@KiI1$3TcfmpwmDiHIgRN#`1a-0M~t z{up{|nFTc!wq711%-Ye;SenENvuA`2+Z^A=U>8p;^Xc(laFSn zkVo74_FTpW%J)pgxMJ8cKX>ebI|9B;f(Q;j#$1Ywq@d(vMc1sk2`u(UdrKf~^RJaG zY%yOP9XHN~Gk9+D{2y2=)5Hx?-Ep!IQ7Nz|y-AJbvsERuSvio9)}!+uu1PZ%i9J3} zENz{Z6>91~Sjhnzdh#VNVtn5JP5?rLC5+R<^5p2(_n#d2v`|6Sthr zrMYY+ndTFneou2`SuXWM3P)^mU2Z+V>qUI?{1Bp2C&4jh^-5t@YOQ4}VXg9Es9V@@ zzT(tbcG4?^6!#U{$-tkUuXg;M6*d6aIFqZ(itp|&ahx7rFJcu}mOAs(G5rJ4%|!!7 zkwT8g>*J5?<;$9cw;}BJv%hCdDc<_d58ZjW5^7K!5ief-ztb;@vS7%yCC zWM5EAnyCD90#HU6im2Xjw`Xkwc)S)?StakBRc1~7u|GgtS9>pj6;`I8hLpCHeVSSD)`eP0B$aFal2HXW_K0ao>w{<|7(+$1R2lyctU zAX8+XGIAXQ4_p+FGmV97>$b8=_+}LBoZ>bSphZ%l)Ro-QV%XH?yv3MNIgh`wNiDV9 zZNb;1Zr$8ATW^M)>O8FIR|$?G|Dvl)bAx$)r(t9o9+1pMIKgW?eRq7lvZBzOP(p~9 zOJuJF|B`<&Dm&48HTALkL+4*Csg}6AJ|R(;ZQDrs%{BBM<+Z-UzZl$S%_Q7sbDgm6 zm3tCK&TP|1mz9RGqNjVo`@5T`wXx1XR16=&_+t`7 z5_Lv!_6?>kKS5K-J?rxorH!uh$kA$l8L`_N#w3UHdvsuPMNxC-P!v zS83G(cXG1S>d2DlzAg~(VjS0=Nmo1-Mt1jC$!j(h$4*K<1EV$s$&Lrkw%VPIQCHpt z+-%$mnnxr@5{5e|12+(`)sXe#-@dFaU}j9wfx9YVC;fz-3}8q_I#bUqs) z&rb04M?v)htA+l=zXjdTYHY~k z^>D<-Mf>;6%z@C zb#U0_3kDzDNs<)3_S#8Jh4fBlEO$z$l@9pvsovJlws#`>w+fhTh0DAw{E-`QgnWPX zOOmdP4$q|33m~0fJL+*lFU3(-Rh8uHAW`=RftuQx@$D$$vDE^rQl@B^M~ks0cNm}M zS+yiXOVKYa{+>?H8o?9{9eCpeLnBbKg9tXawXJ+q6bllQ-_QtjTnS+JsrBI;b|P)5 zQ-8qzHG#^fZSh`BI1Z;A+G65g-B(1vY#+Iz1xj>GHJ`d%idEVUn^h9MPvoEN2oj#L zJy4W;htgXTu;U0g*z&VgJ8wyAZ%{`G{vbiVQpUQ(MZRa5ZN&B@sg#juz*e9X(x!jOQjT_ ze7oyh3Q)ulleY+c`!ioY!z4cecOmrpU(^Jn)D<{Lm2rJSB7O+YJqR)gTy#AN(yTT? zZP56|-JG*;T#@;{fz};3Mk@ED+2+D9jI~*zLiz6>$t)F^iFjqg!C&_740!05JbLwg zB(&b?1W1HM)gmm@Yqc7>CE{1yw>G4P*HN>`DurRcJc&U)N=wvp-$NoS@*`5mRT=Xq z6XOqwwJW_wwGBDl2Qdo=vX;SAVj(!hp~sTt!<=&NqsVP1lNbY4mHjB84;-eZZ7B5@ zF8c;oJRz5$Ckt0;G=X7%0@u-BGQkGK5+UoJlZTYIk6(;aDSteETfW?aGu^iU=+L=f8qWNwZ4V-w<%7~Uxsm#{PW;9Km9eh4Qna|? zpVHn(_HYsB%RK0+TT}aN=~`|NtB>*88iTGJ)Y5HYu~xqZHXG(58|8p1J?6K76#i^d~%rVto@Z+>|O&t&E%KZ z*t%~?jv9v3aFJRZ>5Fp_D9{CWC~XEt@`xQ&?aWoU5+dr-d}{Hs_t=p8El1p7+=T@W zTsDUM#Sf+3w4|u0@N}_trp2eMqt)`aZyI(!k=h9`Iz zV;o1bN{ka%#8%$QBLMZhsNnLZP*vguG{ z(WB4b&DkWJya5yMR>ptT6I}TtvX-lYl_IqDO3}cW7SVYtfZ_*uU z)85c@OT-PjGs2^@#Qb{S)?Lv2p0|!`8F8U`=xA-46oQXyI_QsSFi}-$^@9dO%e0;a ztko4(;VaqmJxl($gbnYQ-|XRD{p9jZ73@dRQ(T|HhbAXGLE`{ZNvGf^te^%nxQ_H9 z%pdTLyt+ZhuOhcIn?htVm|n110}|5|NBH z!FAr9KuEvYM9wX0QrTjOi|)rJsfJ~#OMd;(M;P|!uR_%Xf%`z$7Z=GMM=xX zX$iyeCT3o<6uu>QlT(1$m;D*zFJna099NuD%I8>)>1; ztKRQ!TA^&zq~_4E{<)JoWo%U~YnZv%(-?IAWbXv~{#Fbn`X}RvC?RD% z@=Mc@$Rb=rsz)mF-@&JYx{dhs62^c26haI-W5a*NbdwmzXD^Dt0lFoT-hxXg4$VDL z|E0R@R_@gCEr`a#I8Eui<=98;Vc(Uz+LQNPpjuyk=nYki{KCXlgwaXad*kG!lM^MS z!*DwB^^am+uMVGJZnHK z-t-HUFPp~h?y7vz`_fgm+YUXLi4n-A4q?-?UVY`M(u@h1DeSx6KkL(PalmTO>FY|(EJsX2+1m;#jk@C<4mi-U zTCf=RH52qY%1*W(y38*uME?61WTvtokyI*`(P&fF zI7IQ(bQJbbtzOv*H~K1?`y_wtqMt;y>4kZij+s4HCfYlRY!V*fYqNHszGc3wNMosI z&3cRdRttKwY5^}V^`L87CDnyP5_qruhV0L4yoJkhXa}z(=gxHO*3+XHF_%FEjzmUu z%i+{VyR)*r5yz@ppezuwj%xJa8)H!#y?*HhPNzn$#2sATZ6^x(!snKwq@ij&1&zU; zu(8$%Sbeu+XrcI%*-nK7!=nsg;MEm_4C|*4-*m-OuRid*h;KMJF=L>AITr4W*8wo} zJVfOyL;|qk(L~~Hf~oGlCiGnnrN+&$_Lh3GfVr0<#-%Q@+kzAYcwxUg&zOc>J5Vh- zeq6xph^5c*T>%hu_?ZrIFyqCse0|tBatb8W0|ifKodt^zc0zx$gD*Yj-FQ9 z=Er=PT*J-!7^Wuv8n5Ee)<_O<^0i2gCur7;dWURV#0?SIw%1~Bv!b{-skd130gr$x zzJscLHcKyhn0g6!uX;D8&qy=DdrvSwrwPAZ(KL>Y`9cPgYrK&v@{!ym8vhNtOUqwF zFHP@4XtieXFQa&I6cxOsK*U>LRoNA|2TkD6IiD@!{GqVi?eBAN4UP4)?W5 zqe|%~7cwPfw-~T@DV2sdw|E5sFM%cAN=1r@!t_?JlAN4euB^i=k(a(*#mgnLwbmGe zK_8knDFpN1$RL*QUj6Xa_*15ZS>Ax!TU53;&4^&n`fGcMjp)}maW}hA0rrzD?x6dZ z1x8mEkR&lLQg_zM3|>;TGAy)T%G(nRRM?l>Xn;9}Jy6&~j0g>BGjBGv=}e>lacUaM z^wH~t^Od~$I4@B#-USPkWD$7$If&#Va`8rBJ&~R`#%9(41-YNq=J2<`X(lAae+9%{^}i{!b7W2%ztQPOU5e_p?E)$bUQA_v$10>P zeJ8Gq?9XU!_Zizx*shdli6h5$MTs#vpWR9^?>#3OWY-(!sk)~2nvJW~)xA32eZccS ztfLwQ3hskQ=h?!;j4icyK|t-FiFvs#=XI3DH1+~O6o>&p1GNOhKk1On0g?=zCvj*SjF9<_W}n$-=L1iRnn;?4iz3l2%7nIj5W93P82M6=;Ypf8vDJe8oF zCEPodye1-v&GnhSPUN28^x&p-@ZQfRl7i@&Eh^-kj{C=1$mQws#w|+n8GwnhoZJMA zY?j8s$Uo49K4oSHM3Qv=iNT*)KUd5wU zpgdu^?jLWP2mSr$YL?Q6tBUu+(n<;gi` zV^XTr=MPsU=Yt~G%zT^QSJm}x$(7)fE{=Uzr!1UWg}c;2`uLtg_5FHG($;v{Im_!! zR-T^?iyaD1Qk)p~r@2l)&gqMW z2rq|^)-Z{6&P5tBe%{WVFePVP?^Spftvrt|0fCDEn`f)HUN<@jDPMENkPSClR@0&_ zD~sT7^Xb>^#M+F@CUoNWy@l`l{{@7EKMehq3DieoTl@)tA#%8eDVHo#i!P0(A?p8p zqbEVx*TSH^=hLY>kWc^dBLYYf1pj;Y{G&E@H80G$ssX9pJB_FRxL`%;#8}-ee=l2a zA7HKkj3wl2S6rp&@CE4;wow@;giW^kpDVUQJFrL9jYk}K?jQnl~9st>%FLIO|zPN%#+SL8+ z_FYMMr7?tIqm&iW9m&Wm{SQknsw&|b0W(7Nt2RH(xP}assh3F2Hv0%{x^ih7!4Z}o z6oG?iTr~eZ8azmTKI#R}=B&rhgA*CYiSJv)Q7PS4ybueC+mMU9HajP$sG$RlKExCM zM87Ix4v8w}^QDT;v!-AJ#~QjVTrp}%5%mtV&O1n!Ta+5?3UR7ceAz6jXX}b#^{RWs z51{xGMCmdNrzr9q;1u8e{u7(`S@sxgHkr1fmHfF>K&3V~TCj=;XQxy7~y5d)s7@$sBN zogaD(4(Mkvi7MW;XA1{iA&O%b$oH#{efXyGqwH;+P3U?g1=U=DR+O)FIb& z_xqyj$1}sWHASnm%b}M@FEKkXJGD-puG-7+T;0v~H`v_AI0Vgiw-5EtZ|`C$g5X@5 zU^1$m2Z2q0Pbau_(&!{R3B#qZB!YJQ3ru|2sDrM}7sZ2dO#>a6(8b{hofg9eXW^Qj zx>wd(sK5F>Onoi#Qc8C_#5)euG}21k{Z8)JtZG8KsHZm+?Cr+ivML^v(X;0e2Hlg@ zv8Ri3*dG|)F7H)%$t&s;F?}T69sV$zW)z34H=eO&Up_^p>W!6nYyV3zrYu*tZ#u+3 zDU1fIo*$4yhO-fFc?b)1CoH8ow<;8~#Xv{D; z(<9EtvVXr+)jdf8S}Fy}!qkLF=St5<^{9l~Pnb(_4Fc>k4NYlt;;5ZOTs2Sk0{eh` zv5_A{Q8R_PR$M;m4m>uyxV?S7^p;&Oy-Iv7_crVGO;Qptm=ffJoY+5$TJ_B7M_AK@ z#v0UaS}x7Bvv6|7h^~e~EW$@%VXx`86LW0`jB7|Jt}c2Da@%o9C_vPa3YK0M0{g-n zk@Z`+#@zLi_-ktuwYH&OoH?fALoj;u=vU?Ea%DD%2=i!tC9yY2LWK!c4%l=oM3@C> zwN(DH4=i7(G%F1yN0VWv^&x4h@3b5fa#0%6MOSjw?-MFDr4!ZK@FXC8B1%{ z%l#4Q@WIxcYh1CA3*!=2MNM~}(@PtM)*MwF{&H6FsC$H)S0(_YLlw2Kr8v=1G25OE z-83Jobo$Mz$qDR!l*(o3xOs_WL_+t2MdYq!(?PRcI5@i}xxI+cs&?@YylI*UxxibH)Vij?aCTCQ7hS(&VX0ogOTJ1R-N$e_XL8!@43Yw(>9 zhnzk&_SD)qTj5-rf2{;~p-itz!Q7l~(M1s8kCmNa3SJ`S)}vh;vkWdp^Y5DeeK6d3 z1Ch7q@jIg#vy8r#*h?&e9SUHtD<(qfHt5BkhRZ}k=0027RomoL3XvEIy7m^0wMS!l zb1q5s3R!+?w;=P`XN&oB6bU_$rY)pUNG|Tx;%ZC$Tc*3ZF8E%0eU^>qrSOYJX#V@n z;-UP6)~gN7Dl->at|jdoXz$=gjTE922Sex!6#f8vKN zNw0{I>u{VMNY>FO<<;2-u-2jfm*_>tS#HObi!Sj5NhTN0C6au(Z7BJxxz1B_t#?>xn|!o~_AOgEUi9qW9Ao z0$PzN_e_Af4IEf9&&CT7=m80b{TMnZ;KUgFqFVXwTdc2ALKJpsDdRdKpsA$Wp9lk@ zez+()ZiU{^jd)I}fZmYu#gACNyMFhp8ELdk^zgx;MCmVqk~7ZBSU~H-*sB{!>GctG z^MHs{?19`^q)CuB(2D*w0|LujqKB(kz|~&TdBW&+<{TPAzj{QiouI(MfPz<*X4773 zJYGpc{q`)P*HPvNmR2OaXrI(m5iHdC*8=>A` z(5pP;r+B4ux?0=UweKo-2o{s`-bU1NW*u~ZFBR95q5YyRYd|NaSu(Iq8sGB}sOkDa zCSeH_QA+Nmq!QlPfPO(uU|~rQt16QXiGG8IMnJyA`9ollrNo;qF=ZTqbAx1tuH911 z!GR4ASbYvbeC)dM0mQSKTBa{Nz0fTviGKqQzs`xW7GGfQ0BKsNy)I388}vJQ83_?cDRJe%GB7inJ^6vx)C8{9p(d(hzS?(V@MKyXcPg1ZHm z;O_2jLx7;c-QC@9lfA!l>eQ_|b*pZQ9}{Ni?pdpQtydl)RRwKoN#JglmXrT-CO!%}g8J7zXu5tb;ZhuGg`ttr=In*gD{2CSl5UG=OgVcF+=4a%*Vv0Mtv{EYi)yRe>XOl7s0J*HTi~25)2lqnW6Y$pPru z#0%L#&@n~i^&bw^UqH$If2%~PNxg7P(MW4PJY1($eVH;l&IT|xly^t9&9t5?6eH8U z^~nX4_Ba3=v$bweN=j+-p*tCHKg|-`V7Dwiv5e+Dj z8UxJJCIA9-{f%4@$OG1$4MoJP@qo28+S|*WR1XeTD|ftIlIQ3E&MY)U{8s;YJlBd0 zuZ)W8Cr2Meey&OK9f@)=u2hIi30DFY2c}o6i-ejOMN6K`ckxh9D=~tW>jQse8fB(W zM|sdF{ zaJkgz7)j;(fOez^Yh5U*mat!(xruR30$0d{A1O1lex;|2snnlLptScJx!;(`S#W!I z7r@>Tg@lDoS~9V+s-om>*wZ5aJeVm@Qy7NZ*4EZ`_Z|dnEo0;3^Qbc_0iGFvgx0}v znB?Ine@}+bVLg5+1Nbi*=hxM#AtY^?@`MM}2HxBQxeJ$v5x<2FHn=xR7|MybtuWk> zjO?1+LBLf&5qSWp+M+^#-zlJBI>~H`t^b3j>?jSapM49^mp1^*tuB;YcfI73vTvHH z&K}GPA(gY@qiFj5^hN7}H&~yUK^)qD{WlXIefny*Nkm(6MovHw>6BC2eR@%w$fHP* zA)JT@$-7GTxr=9_lANL&9uY+xAaUWs&PD=qp$_mi!vXQ!37uwW^-B$xD9V4=ThttY%Qda)(MyLMwUuxz8j4}5=6jR`` z2j0vxfyEg3>A@vmGLmPWEO7z^%F4$zcD~yWX8tSImQ87o?BtOQ@utL@n#}-<%0c3J z*zxzzL}b?pwr7r--UA0R@CUde|KwQ<7{`v7^ncUMwYc za8L@RjxHo^Oa3cyw|P2qH$4QZZ$A1qbZ1GwL2UY_>wjG^NHhK^W4FRk?4x7chQC>TG z0Eq0@*5=u65M=UiS}O8bs15}yF7D+8adSF0o#UT@5)Jat$uZvA#m=g(Mk_A>$g`SSy zcgVm1Z8#WKPl3)G=LiCBL~LCq+}%uKL_m749X|>1^mGAanreV)SH~F0APAaYR!I6f(MA!?K$iN7GesSF)`nPc@1b| z)cA>VTUc1Q*?zmyI}nL~E%0CWVFut4LP16bz6pv3h%WqBOl4D0V^h^8lE=$$wyCx) z`&58q;da0ZV(ol{!{)$x%`oFsPM|*80G!BTZ{Df=9p#ceVe_BTzo)QK$O`4r8g$$){oB6fk?{Pxh_K#kpBFFU)JYb)^tSv?ZBA|2# z6D9qhC#n;C7LzT=D6u-HutThZ%!9`+ITa&(yXy>N^EPtjvIJq~HZniMsA$ z%68sRj#vWo>5w&t(P6qdFvhDrt;4sy*0G~NCGZUqRaZ^T>0!s<-t?#X$YT@(4)67M zn>CA_%y=`l9T2xO}cv88M@$7*ulO`&^_y_i<(c`X+y0m~lWRV0$|C1uzG`dO{1s zx}i--LR@4}YsNn`JRF;vI+VN?#dPs&gFst2AWuu+NoV23T89Jx%8Nc%N@~c>Ce4zJT zhCo|!=N_-FxYp8r({qk&Rr@Z(-O;`Q$^1_6YTiM_iVXp3UlDfRy}L=e|9%JG4A;r< z)7}?E8+6Rq&j(dkSok*#o_LKzwCtbiv(+s@HR;!Zz*rqeW6$D7&~Bg4`Db zl1Z^_G{80qJhKKVK$UncHigyP5l*{fI7cS%zg@x0>*z@kG!|C8HaZnXv4B$WZG=|0&>@x$!c4di%F+Km|Lk(lA8Pe-~ zti>4y&;@&%^2*xurI_b6rdG8zZVj!ap%s09>StL1Ls5R1({C){Cd{G1s2B0MbcVFE zOaaahKqBeS$du_fVqBj{nA+(Dm&3@cmGcIOhhwb^Y4cmkURIm+J6g}HX2rK*?tDj> zUz{G8>#*8#N+Di-#%T41U8~L+ zs$^Nn#(}88dNEX#{Uj?{>9sZ$VsLCeYC9Ydq-Az1L|pFEwN>J>u5QuKQp9|OiZ74S5vN%GLr2?p z=eIsh#&?f_ysoiC?09d=H5X z0#@6e7(1NwHJgT=&i@d52Vx8AfmQay*@^O_w?ubG`@F*1@>NnVVe&fcQeqoNU+T!= zYlk&oa*%!OeEiv+?5 zmEcVITyz?dI}vf`CBXot=EkYuGijpsz}mIq?)qwHJ7&TsthM84&0bJ;)9fiJIX~R${U(Ce)x9~+d^ciTKXUjq0fGL0 zWiLpPKSZ#-9=DP2%I^UQf%)(^HS>6UU@)=gd)}e81ySQ_DElgV{>g!r$mreC-rCM~ zFzw5gzDI<{-r1Rg-nST|M>~Sg1!}zv6t?2e*yoaz9-J31r|UkSFIAJYVYuS`+4a-9 zGtZS0W!!IMb5ja}3`ftKc^1QQwWqtq+3awZ7haTfz^J4h&H)M7gtf7ru2f3W@d-6_ zeNI1~twnc+9}Zk0e?^5X!|_=D&E;dyd4;V33EwxpIYcwHNOzJ;f+7<}3*B zSi61$#+(9Szy6tgjgdcuVexC$%7$1LDS|jhX z@#tbm#D3$3?_ptl=1pgHCX zH@EpSna-fUkp}Z$=591nwerukI;g7y4M6^@N=IIX-m^JCZTw~DRsL*7owP8AV3~!N zgmSVVdi~H1U6q%Vb~5}TjLfBsM?YUddOv*qnFqpqbv>aLTqfOlKc)=i#3I*KVnXTe4D<3!}I5EW_Q)n2$dw^A1};y9GnPvwC4Ui4wtvC=l?I zbF{KzD$>;CVxYwxE=_ItqoB7|rI97}oVZqvB_{bbU{Zu9av2RO?RU;lUPUkS#a}Y^ z`XBPQb^>#hofV9sg9Ir#2lBl*Ws&8UsS72!nyj+6PCyVe{tpb^E>mMh+Vc70zLAOF zuz~&SmqkdU`;&2_X&HPetVK)#%9rOowpuR%T5#Q;_je_ZOy(zK zP3_sw@Nx6-owLEuFvvM=IjHK_YHZm*WyHA9TQ?7A{Hrc=XU|p@HF9$bh?+lPuis;v zljp2b$Pp|l=lz}FI?}%rEG7g8(TQ?K_3ZbHc<+xZ}3jvXPkc5o}zQ% z^ae866v_~E_sKgn`1EH)^Q-5(IO-_SmaJ{pksr>}LA9WfN~6|Y!pj+L!rG+=>W~D6 zlADu7k|rgrWx#jZ@J~NKsuAT3Z8;4nz}WHPV=AY%G8s*0d9mxh373ZHE}i;3?Co zhxhF}!I`h5E3?MrGNoM`@GU!@Ypz6{*?WJ5KS%r%J-2>B(XqkXx2;4Bk(d>dnZpZ} zZyGAO(Hg@YSrDat%EU;;n1a)azXsWj+4c!iOgjP9qO9-1<x2P6 z#;FKQ?-5a=B^SMvy@Db|k^*28 z`Veayk$D?!x;y;f#i+jad>8hLMYqx1Mk2|&vC(fwk3?%{HWtI4OD--&mrbe^@tp0( z8E=mpTCZaJ%dual8=w5_3Uus%v|bi0N4dv0j$>}K61;ON&5-BmC*;)LuZ3)`XX7#Q zNyv4Uj&xPwo~gJs0T;O@gn%A#D0kzCJPD#8`}O;@#9w{e&eMglg1Zp}DZw&ha__-* zFdm39cI-Q{?IceSeu|0{obvq5WzMF*%$@=|3g>GpAu=cw0{bqQ3?%KAu#0>#3 z#s*?Y8Q}a;2??PxPlp@1I0G?44BWOc-yFYOkLzcv0NE=SqEWZMWBqnH>|b2KM0Wd< zFk}=7Qqy$tklP90Q(qP7x@{*k-7HuEsd41elI}55HcTMt5}k1$J`slhnXCWK#((9R zxaQ@U^1i~^YtB4xf^#h`JZfrch7&pB$$~x|SQPIC-qQj3RS&?StFl?-AVjp22J{yI zLU-_+=!!F98mHZi1E9h+4f;=&Vcc=_z}6EUQo->fEv<;0Tm(_-G>{oNAN+v>5=o(d z1bvi%a-e>@`xnJuKPY9d7Gr4yaBu*n7XRbLMsi+W{O#@Sz2#QGEhqR5J@L<6NRP?@ zvP2+20_Ln6hIkE#^Mz$(;Ca5CL;%7#YU=7=&K=gez!<0i^@It)iOJN|)NpS+`>kFE zZVIUQ0h$hfMEr^30Z}}l$edkMqk?jJ0Fa##d;gWL2#Cv**BaNa+&x1rObpr-9uu>) zq^)S)!Q+Ps=<(a|?XBdZI86LxD-5_NjL*##@l(9V4d@B<1vw33iNgn*0@wVeS%(9Z zE0Iez%6ovESWyf4->XNB%A1Cgvb2PEbh7JHwu&MRGgsbeq*4 zBvk3Z1Kz-Rh*tsQm)+}XXlQ65k&*p?x}h`AC_;8{uVp&il6-qE7)gbXkDN%NxJcn|iQ1%iIrRlm?Fr?dO~|2Y++= z3IaULC|q{(T6zr7`?OGmfr8^FCiu}`qZISzOyeQKB^K@^y?4L%tsq+p&Olz4%VVwG zxXkr0v;e3(B>#8&^{Qk|C0pPqCcOI7Fi&^SUA6PpH8-3)u#(TP_(QPkTS=nsH)Ej%H zDyFFYlqh|)oiB*38*ilW6~-`>6`1nSw)1})|A~_emvO`Z*H6-HG`(5VM#WyOSSd%O z7(RiPt*9&C>=`IH;f&91gu^9x!b$`PqY0T*aVwv@0F}nz8*3)JQJ8fC6nF6er!=4z zrbW#4r;^g|)7uRj;Do<0NFeFBJU3;=1eIM z*9}B{f;rIoMl3g3DNpywL$~&HAuMIIdiPL6PI=?`Wv=~tG*6vSTD99c{n*L z5rhQfyVG$bE{@Z&3m1}uX<{ap&xOuK5u$E#-J9EV83eo33iLi4@z15{1%%wa@8gl@ zsxpB?&VpdsAd7nS1V}UeIW|>=c_d0T7`%>$6UC|r%$aGR9(4~`D{O}Tf$~q)UXoZf z({{EYG7|m1pFe19@4W{#euDf`HUg?ax*y#8f!w-%#rLf92-ML2iy9(*-LF6Jpp*sv znE=x~OWs3h>lwz+o<5!{G|X?_Ao?xD96c5%Src{9216z&lQ1=9LzJHcFv}?kO*P4$ zXAjRM>`IHCP9-Id0*dT2?YGb`7loj+ogw}+=|k@!eimSKQtWD5u-pwHL%Gw0|3}v2MN% za_HvZ=tq_M@P)#6Eg&HC9Vsda92|`hx`@jjDpULI&PuDUY4hNZ&!t-Jv#QNEW1NL? zpEsfB96g9}PEU^N^p20cPrX@dJ*?178)OW0=h9Ngt?m4;GT4h=w`>_u<*qHT5W=RMC?b;uGxtF<*U$=#2hl7KQ2-?u-A~;k zUygd==(oiWMnE&7-)U-cDFDj@2C?MX*ed82FNm3Z(&(aTB0Hn-xcn;{Cub?2Udnhu zLz>Rf0T=Ju-i+7W7*=R(T%n=$Dx{b=)#lR|Rpt*II1;(EpZJgS2s{cU2L$QSRH>1J zewPLKm4LFNDy0c8Ul>P;xE6G#@6~pNr^(NkQSRk7;xS2%kB^HgD%LfB!Eqx($6@|z zS3$L~1a)kntHmef3JTcw-f(03Z+%` znUjDa!S!+irrO@%1LOUu-1{*PJOf(>36o#Yd;+)pd6_=AX7cjgi(`Dg>WeZ_bDxJT zoXH<^Ib*c{ln}lDt#vgZ`JvLucy;IYe6_ihd8-YEc|!V zQ|qd)*HrkO;W{$c=pSBI(txY?5_B8r^dE|fRiV9MhAgddQr-s)KvUA{;47Ipkg|}W zV$N&N)tM2_lo^EUQ6`|q&6`w;Dx4sfY1hMBaU2PWw&HugfK}-{8*-!=)z7clG52O! zHy6~j&$V$w3}ewtD#xLd9!Jh4#|96~aBNvGhfp3i8egU+XmzkaxBzIR1-zJATSB0z z819lbyA~e7V8LC~nRKPbl*Yh>mtF-;Q>q^tRkP$WH=ETbx6N3l+m4u$VpVPZ%W(^H zHaw?$MbGM**?MFyH1z@N_`GPb5u3Y}&d83w->=^)wwV&cD)D1aV!90FyQQL)xJV?r z8N=m*NUa7-qJ~7yZw*5H;R)ksC`zCsa}As70~FZD6#4J9gzACZgGw$8+AYZJ2TOIF z@g}`H##{vDb5$}4jg$zubl4`_4?iu`K{Gm%zVWzto^ z`*zP`@k<{=D>0;tyH-zV)w;=Q>h$M+QbWj zK13p>6#WpME|$xcX>!wFxr!a-Yf=k{E|;67SkO$LiBLHR{irx5TJLf1tIti7(FH>P z9GohXtp!)ZX%S$QC?f0B>OHY!YZo*uh!@A09I9Vn7N117u9_Nrutp)5#*MM*9+;iK z>^(jQ2cdI7Tdl+I!(q)JF6GG;59ymL4@aFaerzFHKII3NTVQli1-bP;F{i!*5en0n z>)XYBGE)VyHC3)F|}ii|4r8<7f`?jVDO+BR?9uDCnWTv{3$&Mfv6W7|9516-};xsaY7 zzT~MOlZU!XCZ?gV0uIVQqvN0@8ge0>1n^N62?^P7Jp|Nd5?oae4qC?tithIvvtX8X+c)*W-*mx`d~y6?VD>@XZ%!lS?$uxcr-NXM{Y|nY5bJ% zj=2Yqws#zI8aj@+3>y1@E;Xi+9pWwiCz2#HlP4%AB3j+CfFlin1rtVtMYitCc(N2r z%R$3Ji_R)>JSwFRB4tD#xWVIE{;GCFH<@wJw*q&j+GrqZL9rnMVWf7uUuBPRu%N>$ z%Lki_+fZboHT}H2DhOMlQCM@5_kHvkR>V^aCxTWlE0c>Q-NLF;+|)B3&`mZ%fESOs zUVChZX*k27q#Et5`vsw_Q3a)5ZmYia;#@sZ4SUAgJBIa+TDR)koNuxirn#Si5Q%m7 z%OjF!!f%K;9u#KS>U)~*EfgO`x^$cCgJzuXF+x7qZS`b)Y(o6Ryq5%6lvZV6u#svx zgQk9+{RNr%DqaRj@E70Wa1u9c(_hUmpkeIjNxX zJ$WvqkPSF#b!Y#hky9XS&2cI~4DFBRts!_vBfEU;P(1z&mLGFG`r((QI(T8l2jZ{6_{R(` zMU^GfUk$&tiMz7?>V)nTVoTJ>s%Vyn%hhtKoBb${Vt-L2*cSk20vKYs zn;-O&W2;zM(KT4l`*GzjY;JD8iLL@DEC4uvNlFwG$8YtHlo}$=fXTh^Ht@9nhk+2J z$|m`>p>PqthxO@72wW{0R}QC&aj#JgWR9XrTL!K;Y^bb=iYJqMWIH-%WOUc>&eTZ! z*GB>L2YG*S=v%iq7gD_e^vCP{)bl>Wn)USkxGL&A&Pmmr_HUa^>iVY=OHPNC_K*H{ z8zpIWT{sE5LsmY)UE3cGZ$5ha@)Em)O*@**)cxk&pUHbr{ zKJAQN!lMSaIY66OHrBM^Xgb!qnlDUlB*Xr)zlnx#5ybw1fa5xbMcW@09VZLqI#^3B zLMUk{M>}wRW4ND`X}CS=C|0tYqRxLt59SLCU(;iHBPy0Wl)J!ijDUs`)X8(x{aj@- z&quG-3}AT7kk*?HOEJLF#`GrJ8R#k zOeXbeO*N4D`KuOA9eLI+aExy1vZu>!<5@l@mST?aI|`yRwh;>QH72Rm5?}KsJ;-^p zSSTf|IjrY`>_oH|?Cg8L1$Av%f^tw!`X2W1&lj1c&x#&><@xKJbzA_-#j0UiFI=vr z>i4KyELm96txq`_FbXcOoWt)d+xKTo7{y4OCAzXtIxiSk%QDa$UtNmXSa=iVHcU0f zpyEyo%1*9p#yAt&`93WjNRvHoH*bC&M$|E$b*q!7c9HgVFUyvp+eG6hDrB6^nrwV; zCutT4vl~Gi`Msi|k>zXeJhy7X#N(1mtEqLUicm>{@h5j12|EwI5`|(}{#~_h7FXSa z%M;Bn>d1E9c076=vh_OCvn%UAu)2?}yDMDi4Dr250Z^P?VEZ8RUZRv6yd7`bCUyU) zI{wdHxgkzx!qy7a`9_wR$$iI?x)qa(rDi;+8Mbs*CMdI2Qevp;{C;olnRR$-KS1dJ zzN6V`_e8mr<=1C_cy(H}QWA)Oyv%^M^Kaku)u~aqrJI}Gv;bAOnab57M4!{VbZ%}p zcT{&hy`LOifS{jx>azaDp!|Ha*r-@;L#tvqQPm}sc=r3 z{A@~v;WEW`?`D1-bMBdG~xvbgVal4TDvp?_0q^&_kql znfF7`(u8i%w@e?zMZ6yl=Wfp}0y3s5E-8^%khImrrg4p$dgcE8g73P!yJ72;JyAsl z9mJPcy*5Nq{hMSxVJ$nw`7xe6KgRswpU=y{-C&Q=u59TG&boO7fLLQ#tKM!WAz&4k zr5E`ha&;a~u61yV>TDvn=bA+3P0~1wk5_c^ZV2DKGM)z`6t4LD86QW{K;rQ=-<8Bl`-;LtJ4-@=CiegsFdIpvY?VD z>*%zqQ<{ET*O92iRva;bPVeIy6LO&H|o}ZsxV(I{eP#w=VxoJQiR`|=8 zVl0w`gakm_bf7O3kj>5h!|9~57ChslKe@2 zHej%@$P!}C;1BsXe%Ap-;1EycU{%E?$Z+98I;$@suul)|On0O`mA(;Iic%q>a&mP< z-x*gBLS+?COCg2mG%9q%Z*Gt&Xmcq91Qg()?HY@EN%b+&;8&kdz5z1i7F)Z!R?1{S zOR*8$_gZq=+9^aaF90RP=yauhVUgKloaC71{>`=I)2GFhRMZVo0fA|sGy4caUMv%d zLUJVuY9gpOO4#S%Xd%xc_af(kUsIG^^l%Qsk}r`MBCy=G%&Fxe5sFF;2Ix7_Uv`Qy z0>Qx6W2L0z#Ef;>p1k}?6yNQ97wVJY4~2uR{n^I2#@|gtD&!fTm`Jl-r{qB^CN?N^ zrJNgNg;wQy&hni9+r$f>{$6}AudwitbH2H`d10ICu!B);l6{!7LM-N-h{axSz)#nq zAM9P8lp+7b_IBpyS?4_hY=yT2e88XC`n8S7{C*rBQB|IS{_VcjD z!HM!zVP;|BzFw7K^+}=&Jy{>;JIR*u2pnecH%yi-4eoaVyA?hL3Kh@1L2833#Tf5BIhfh{+9>sc$r+R+E8?LT3%HsSCGg zhoZ)kcpZr=4gP5-^Q0&r38Q4ymv+Z(V|0=AMibs3MN<3MIWmYN} zq?bK5cs)|UcAR|L8re}pC2>3sogMwAhyM4V$kpnKH(Tt5`S13l#_q7I*LtZTKY$O0 zzI{+YVJ9-+?Ryu(6!sttn_!YGFT)ydhtz+>(u|hx_2BX}-ZZ@9NWOwB>|tyB=aU$P z)BnB^}1cp|`06{>u*y_3x`ZP}aMDeiv|s^Pc4Iy8$so z{^0+-LY*{uOQ3JhyUC&cIn3bxFfa;R!&68|NJW)`o&dMaZ}IoXY~WS}j^o(kI0+Tv z%AT5v_LTHj?Rc$7Hu6V*1%el}xN-!`t(YLq8#RJ0JAVtrP>ny${~Ed7hP% z1Al)XSX5pvF8_O7)WrqK(eZ1qt=;j6musGG>vDytq@<+zkuTRzg*QxNd;7Chc;L>C z+0jyStdNk>?n@=f@=Z0dk? z_9CliwT_khPZYo@6a)%KaAE=ixJJ^s2>}!)A<#qVPG%-&{xS&}fzJt#L7m}$z6mnE z*b3DtB7kFN0`i&Qk`mgtKHS|zw08iYn$tZtrg+MkB3GqF&y@C?r+mWVk8lI!U5wWc z1(9#L{Yj%qiZLu+UrhHG6Q4U=wQr|or4$XBO04wsZXJ(htCHn^dPHGByLfplC?~f9 zZWcRP#pQ(Ct+g>JdXT%t92&CE$cw48Rc=mHL--5RU(Na6X4*X+i1kCn*BqN&W{Vpd zIDpneww68vU-2kayP87f{aSt>}Dl2eeG|?p7sbCpNhB6C1%! z3dlz8pFf^2pFY3qeCQN3xlgp_JA2IB^mx7f_MXkzS?`q^#zoMfp?Brr+BS6r+S=!q z=IQR@bp8G#XUQ^1I|2>3FSnAp10h4~Lr^jO;o=6 zM{I2NaL1Y-!WI5!G(s{hu`;P8|jhZ=b11kk{bD{`TKHD45*QDts8oLkKNF658JC}2d_k3 zb1%|&zmPinmphxW&V{`teN^pplwd4AE{1|mS_n}()4<~TAsZ2-(!S!_zV;H^{|W#r zu>skUA-p}5p8N_lU}Pb%Xq!uiNU_!LjXw-F)R07>p<$5`Ft(kEyvN420$aZ>Py>*G zMzDy8V!FENSlsLD>u>tlJwjr#K)`m=Lus5>R)z?8qUcx*w$zmalGQvmfVBzQ`}cW= zym#_;w>DqC2@Ct)^bNXVps}dT%yJWnM8UZ%Hy>@g-c&ZOpGVg)ZDRZM-~;wzng;H0 zmF?Ha8D47~eOm1~LKPDb6^s6jUVC?=F3z&KVe@GQ0Xs1ka)PgXhy;I79AcGm1P{&c zuGQnvESRN!Knx#uydZHgoeF;@RQoC`PK4#%gc^AL)pbih$J=M!YhW!X%{y?SoxHU# zc56RltaZ700*TNk#O3dBc)blrPw%?@ft?rEPh^|C@QIIPq}<%atkcz`K>ThRGAmqg zk7?vk#Ei2HavW4yATjQy^J^nB0>H#Nb!YMep|7w#4t(J+W-< zPj}|Co85&g11Di-dQmuQ^TQckNVTVZ4|-5{SNA@f*t2@!9>g9GeFh0$1+O} zmzC#tk96xCILaL-tV_<%cGVV|?1&PT=ba|!CQUCbtufjw(BZ9c9|gQWo_OwwA1yS) zz1}S|xUOFka1mZ>alR5RJwD>w|7I8LB_?vkTMR##K1CbUd!q988OxoU)(Tgze8yPq zyum7)TMY24w_7hTScFp1PHpC$q@oJFgp@!=zc|yiACve9Y$)9>QZX{LUzQgWq3w@*rw+$Rw}u|g zgc1n_1@`0uuUD)iZfA;j)>iEFqqJ>TUvOul zyd0H!K|oDDTd&T;gJ0ic4|&NRB>LeiRCgycKFZU6G(e3;iHWU6A-cw}pqY=nH=q~s zj$HOY4Lk5d^n96DQDbYZoBK5c^a;ZSdN+Mq@L#>I$xV-o#J5M?T<=mi$4x^;Gy4qb zJ?;&fP6~W-a|mH!qa`d)At94TU_+$`x?aA(Hl|D{{fLAzV3hC{4<`awNosuG`Sg1_#V5_$i`HFV) zr~21;Cz7|opb(1s8IJa=tE+3#jnW_@`vpVHa_enQO%2}tJ(N3Ne}fHgOhP>&E^b=F zhx6GUF?`ivAw&rUE`qywHT7Q5empWvVMF*sWqoE+PrA2ZXF2O zUw!1RXf~y{Rt~*8FTY)jn%5*9D4|vAH1{tN6_dM<>UZ5fMwCl^CRy=#hT?np!`gJ( zFpRddJO8muo&U$ooP4xLJH}(H$S?Q#8^W`QcI31MyKX@{BLB0x@bjKwJEPHFl#Ogq zW{=>>9np>LJ!%^Kr&yj7vL*LT#c^t`_vDNn$gfX_r_3dqA&oXNZhIz9Y@79<*C2Tt zh_gTVcI*2f;@($%FNj+`4`c!NCqb>|#^Nb*6ETxqxYg!!yX4Dp6W7gr$?-A0uy2XB z0n09X9;k1jMAV2hHinJ`&g=_6slYn29@P@dBTq+yftgcg}epn2yfG5|}^YisfULM8O z>8e3xcu3PhN$J`1sgHq&2!+B>^HI&PeLtq=p70ScjT_<-QcK@DE(r-g3J3gpqamEd zxQjzddvx5kpMJ>}9drO02C?@+Hn!s05C(HZMOJ(*Tdsi^xMLeh6~NN~NEMQ|_&x#> z*Q_RrJ5+3SZjnB5+-OM(#3(+|2vo1I6a_b$+YPzJ)7gDd7>vu56A+D4+sE#EiOykUQ%Iq@hkTY%f z$fE5IfrgH}WGY=Tm6l?Rl9||WZG#aS;yZ9G>T}8~&=js0PYcriM&A+X=w7f968+(V&b`@BOSFV@_1ick##8Kf(VPO=|GK4GxR*>}U%P zPs;yTS@t-2w*kxT?P|ydLuNDg&Q<5K+VD5ybuSB{A<6KfCobMfwpc(WdOz5O9%?g| zI_lW>2~)M%FOo?dOgLpSd>$b2{bL2rz$cF@y1DNK1v>S0Jv-*}nJb$=b#oBvD}K9X zwu-KE2bhzxP@yvmzbG}UTVe~iJ)kt*40u#$=VAIwWcbs>1syssN8d`hE+Nk)NU_2^ z_U5tNTe79nqxx91%6U&{CwmI^FR9mbdra}oguQ+B3rvL+g%RT|0$Gv(0=&-(CUfzn zOai}9?D(EEJv#)j%aJKvmpAhFgzh_*i!7Lp`o25YC1RWWPULG!IE#TplX2oCFB}Z* z@RuN;qwSQm3)M@!pB2YMO^ZQxl4Rhp9`#kN|7~qgY6mi7V{de(V(CKPfT=BnO88vg z!jLf|W4){ez58+tj`wVX@%hTCGN2Uv(%=C$ku+&@#pAU5b@_}nLK^8vZohxg+GR;+ zpdmtMy_PJZ7Sp+)3tKg5(Q76X)A=)`3(Q0c2^O zynTjI2ZFdh&xbZu>J|MAv#+p%o%8A;Pim|gFN@1} zv#gaH{+t=THs4lYJSLrWowi+FpApIKco9y-@V984#fMu~&iV(vuRGC!eMNC$E(L&# ze^_zbBI3(Ba67)2JRe8M%vSC|Dsm10nFt-lDDS2H@#Q4)csJJm0G;7}#7sZep=fzZ z|0!F;l*vnz9U6gbLsY5WhDPA-45IDjiPiPGR<3;!n_gJB3aT}R{gm+OwEi|mU1=&s zZ|J&f3){EU?vBzr|I!|0ciK&N+7Y}<^ul}MVJkrOa>tpRN>mY;_QxyBb%Nni<1K!R zv4aGXS94UN&*{;f7g%kVLr!=5P@+l=pD|b5ANj3UW+Mg;`3N*w_$OyNHu7!bVaN znqTM-ILM%zy8{OIxcVf64urQGn!1}FUtk=zi%{FHSA8~qve)13SH7aa#riTyxqqI6 zp@`}iJncmBhX^|xA&)kRc0=`cct*TB!7MzyDf*A;)sdUhU`gJ!~niHwgHx>}|2maVAeH*B<`n6*}n z#fQJqFGP!=D6neYn&Xii0!U?@ZlFit*%7g1Nl^pm# z4KwiWBY`Y6UXP!5XhP51k2Qy%_uKAn?l)Q{W#(7v{U>p*Oc9BqBO))lOsjJoH%pVf zrP4Os_yp(lJyhlD&95_#1uMNhu{1tay2M{m@2v!t((O@ zU8X)(_b^>-eT;D-rj2?lR{%D#tDdWXW$JCwGzTW0T9Hb&PM|xcj=Fu(8Wvq3s$&qT zURIw17WusS2ic^Ylb~y`$Lj{W%A8LE#LL6zo{P(>E{dC$c0Cz-i%R;lIglY3+pV*k z)i9Z&CPF@P8EoKYlrfNcl^-*0d$SMsN5S0wDDUgml;65@GyQ&X?D!$EzP!79GvIo@ zy+4}0@pq{`Qu+=Q0p3A3eWE+t@j30ft!yGl(siflczm`xzb8VmZ9B9bA$VU3h4%IY zj|#liUZ~%p(37^G)vi84bUshJ0It2I_M3!0pe0WI-qVT{_%v;mx39Zp9RQSH9F3WD zV)*O{Dmr#}o*oA9&o8YidIr5itM)1set!9T4Kr`G9d0AnE!iyvbImg(cWU5NgYyXg z@5P2VUOF;c9i8=Jp&x?Ku z`~L3LKf+wv`KqziSd3ApPRfHuB8s56)vg^tj%&5MyO_gQCdbrx8SfY>Pw{tn@X)m8 z=jRVA@w;}C9Cp|jc}dEglGD>80A`WcNn9&ubWr<=aR)YEUYY zjwAwE%j5y*1_SNwDrsVK|pjEup1{G;(HU?N#KmA@ZyerlCw-~xR?eTqiui8kOdfu>!r~OG zMoohNj|rE?j|MM5v(Ffy@$!UZ;Q&NmEX-HH5zj(4Kk^nP@8l)S)lVDubp(yxT;NNss7;f zpxMM_w!-AM&TjlNH|V{S^48)2?sA(HSK|XAj@I&#hc+_pr2sbZeGK` zKSeww3^8~bQEhjdq*5ugYXA{2qdC;7v&PVohm(>;?#?J18#g@mKYNGV^tLv3AQ^Y2 z%XI)0a?By3O4ZT}ECaFc?W}{zsG)J3JsB7~U}(9&4Cf5mK${xSUT#TusHW%gk#x+6 z+YF6u>n}hT2WX3Et^q>`0-UUiKr#_T{CEJeXL7|Cu+aSi;SJpQ3tevm6LnbGsUKZv zVQV{Mg9>q7J0{Tkr&#rTSMU}0cEzLe#u%_F-}jo-I{++Brd$Raa9+tQ-@4>WfCF_C zkQr^~9onjpg}jjs^b&EZgGI#RLr4rf@^sG^LiV&8ta0D`Yv0U8c=Qo1(C}8AEXPH} z`z8S+Z2#8N4t&6Gw?%%dbZ}L3G!j;0GITMNL7T3+UgQME4=fhW|IDAxEN5ahuzTtw zDA}7?t3u4hVd`a`&5vw~xkB;OWRI=5N^@gsTD!;&^E4eFbABfxfWF zH@5$$ySEH#>kIz}akt6f4E8xJ#f&aVf>M#UZ#9 z*h|0r-`Sn{&F;+ZyUjaDa+92U?>WzTJ{Cj+!yt=zHV|lQTXLx?c7Hy7J?b1-*g?|! zlsorTCe9Oc0~hWq^CXrRd$`_w*;VbtrXfcAgdElnX8kECVLgl|C|XP{N^9EFeygSy zPYZe2E3e-3>)!+y$V@3xDBO)j&v2R%!jlwVim@hEA2*=rL|!N-5gI}Z!UNB9RF#Lh_Mm9JTi>wT5?A}$~=3X z8?enb(@15(H}b=CrI8|zB~w*dD(eSSO<8*NJY>f{A*yW_@xvreAveRny23|26CHwc z0b-2wRIBC4O}yBDaegI*!i(`ek**MRu$F$H$wwSUPZnm}jsiw05=|lB+?c!uve`lb z}?P z>J=xszP>ljJYO#76)B@We#6GQxDpx+n*_R&Lg0Eg@i{Vn&-8+-+OaFd+)I|C_%_0( zpdf0j#(VS8Ub$(K%XA{QL>GutIdU{aeFI&xfE;n zfry9FLKlFbyw<;EeD1z~^ut8di2`#n8{Sz0EIk6ZOBb2Sxt$%wC!_}%t%#%W*VIL^ zq=*OzfEi`!cE?=foF)2Y87yVQa69dMzAUDZ?@!GtwMr@(Jf|pRF#QO@7!3BLAmX!x zVK~;SG_g?FGnl0S3FV6Tf75UKeKL6L=brz_62j;1ye_Dc9Y_R{drYVv_y%NcR#JA| zzl;H9KFiB0!^x*bjvJFFY1>5D=$qvlu$fdgo%-M>CW8lov_Rlr9~y3?{ihHw={Vbu z0wWm)Hj^pWsMw^o_%T0fJezOF^tX;VX_-O3Z?O@3w01JusjxGgdcs$i63PUqYKLiK zOX#0@rKZ2W2)&uFUyQKOKsU*+Rixt~sD)$hd4Gz#Wcm21O_Y|r*Pl_G8MDLhdmrgu z=yYL~q$jT5j|as=Nfh46XvN*l#Nt-@X6(O7bI)j>Abg@yCk|5Poqf?Y7k1zLDz&!H z$i-XqnK<%sIf0nPaS8HTdLLSIcW<6n%`rjsLHhF}!^%J-7bq{c{3)<3r}B`;pSax2 zt=BR{HaScA`uH@{dc2>MBeUaCtO~t_4xm)5( z#@-ayM=HJ6Vx`|oAwq3f~dhY)@+t?Q#!%a&}?pzjMda> zSAy0_2kEGCr0Sr0pkW^*P$uyy>~tnSleeBu4EHXH&jBkE?_?s_^(a{6x?8q$gEj7jL7-V?S z-*YQ8))VNWieu6S*@Oy;J)TJ{YbLzPFu{5|hE%a^5H@!zb70sB>H{SD1MfK|DPPdO zU`dqT-tZl?i;Xfr<0JPsjj6}z8e@E#JO+ih#G#a7!cha%ddiC#Eci>~Yen5GW{d_J9b z0$%(JR4TRQMToL#6WmL!BneOnMGZXp`xS@hMzx5QfryzB`)w|QhtgVs63WV-cx+GQ z$kU4gPpbqE02dvH06K`#^8ClIb07Q}f9Qm@$Gn7vM_4!)A|lH!&CiktYq5b?xd($e z957^zVrzWl&_3z;+n+YBeeZhU=w0$O?678t*)t`V*ha$9h?ag27vz8SA(@yavT+Z| z`T%W;aQJl$d04YW%l*H_DvMrlefO04{3v}ClZ5{33qZR$xq?n{B^~y7u;xKR{|xml zhhXJ3v5FvRUTHI^G{Yq7v)KgMZ=LpEPeb<+w#y`?zC)h$B0{TB9$*5w39AMw(umPM z?E$M=ZdhXQpSD5NAgm-Ssc`gubcU#&C%dhfT-w&4E}#G7*{AOU9Pj@Irhkh?D`a$d zQ6qZo==yJG)tY^R4Gm=ZIx#&Ntg&)O#HaSh0#fnUqr)ea$JNWD+g7lgt_7Xu zG#TvaaH@A^)$_|RoU`qWfHD_BvXE+4?$w~fxq=&%;+79nRlLHb(*xI0rjk`{G2-E%eid$=p6$ju^iXFGk}&ZuoltF zia2GXuWi^}AY*N0T%WPsfZf67nOC)OoY3kc&Z`SF9CfwuU$(&`lc8$Z5`A~(&mpxU zXvn&OBC}2;UH1Kgcf^^Uk^{(od0s?l%Hm4h1=YoE>ma1(FKhMxx$xDBjn3FQh3 zFF65>g68FwkBdgi?(m~~{QM%dezxS(sd8@cw|cwB11I*K^UjYe0q`8_w-wR@b9k9) zr0$JBUq4WByyh{g@xK4le8ug(X&w2U^Itd&P{d*$buC41Dl)TRAV zn&z1yiC4c13k9(?x>`|?$8(^Uv!6HmzWClcsXp}uIDwXf+kizdKsYEEJv+JTdH~^z z-GbPu_G>-X6*BK8(S3joKyBc!uReb+e!}Oo-`2L|k<)eFa;^CPK^8mzBe|YWwj%3m zg??FegK->KuN}mOaU}0x@+va_16nVTu^<>k#a>vzD<(mZUW0gjGaeN4Fa$P(WY1Vm zt|$gP_Ld4?{pH|csUUduC0c{4xcKw$w>e}k?5 z!Olafn$8AEv?4jMurPIgh>-Rmi5K&E#WvUQAD_-Mc8R*`)Z+uvW&rsYOP#YT#McVeY1YQ{tKl@^7Yr-RzK)U6$9NKw59x;l- zgujzm-%Rhkj8!N?P&$fg*ieZu%j{qKvYOc6e$j%zWHIg=@-KTy>8NL*_XU^U_%G%y zQ>9nYNk3NSgp5@!+ROsPkxmJgtNqVvFc|&Bo=RU!HT6&H~>um@|DqH=-7{MuYb%JjbY)#9O7Z|K@YrM z;`j8lfu6J}DU3<9+xP}iH09?0gyY;E8?E+1aV6@AE(kfdvM#K(DZ;kwPWOk$uG3dh zR?}0ygCna6)YDQX@Ou^4^>akS8ix^H{6=qqw2ic9kKv|=vL_=d-+RlB{hYQqZ;(PZ zi@^*qx*C-AY&HWc>uPe<&IdFUry%63QD2gTK?oBQ`dY`^hgeSLkoo2<9czc>_}LL} zdf%Bu*FftRwAbH*YAV?f!+Oz5x}?z$;EeFT{h&n2zuP};uTLlr99{ElM{M}Ns!J(D zQCYGm4s(vEGCVR~ps*$v3ju|A(l;caM>)nCV45VhC;4V8=53Ef`1gXw{z1K-<$RQ2 zt^0F5835_i^W+o685}W<9L!I4`I(+yUx7xW)<56582Z|Za5la-VtG-&=jChR4P-nk z&T?Co1DC(sH(%jj_lxuD-jUzRp<9kV8@G~m7klt~RNKj-H%$>MspgVWa&&(?;6$#b zsG1F(tCK(8X=wC=$e|SQx+8}c%JO*3yTsA*VqFS|l$2M>xW1;q`yy-I?fu#n@sly- z$$(B`!TTj=mpfbo`j<8Cc`XZFJ_@`8cr;j&E!eFzCC>pmMLHh&z2(WiR@fjacL(!Qjm)C9#Qib@); zX5+=+U_^`)T`MIgn&No%uptY%rFoQ!k!4O<$C~PP;)G-(5SLES(~9>N6QKKLGmxiF z)ZC)?tR9eH1U@`q)O@mtRfb&CQ_((-Q>TiC@$#}ER7+ei2_D%8_e?|IoSF5Qc6E__ zwn1P2{^73BV*Ac#KWuw&BoqBij*Q;Ors>`Df!_rzakM-p8Osrqq4Ysnd=+UGn(}|= zxIg!pdapzTi3`$^{oT??_x2 zJ5rJVhKd-Xf2e9#y&V7bw?usQuy%!+PQ;Rid9Qd-J9bdO^($+Grh>u-tg&H1oCA(c z5tyr1;`oX`ajbi}R_#6V-}S1+Gz&j+(Dd8a9)8?K@t>jCZvk;I*;sc?&pofDHRa2) zx|0d$?zgy(IGzVFTE!2^@^b&Up%z`saO6VBqNSmts3TEm$d8cD41nN zOLR(;G>6vAnUA4ckl)Zk;q*Zg30bv9NGPwW6qmQwmB)j>pl&Q-LTU}()e*mLU>=i? zsjL{T02UJ_7@K3^pUv3ZzLMxcmHaD-lYl3+(kcXZwPAWVj>IOIIBbacJ{uA_Cy4S( z#zN35HECe z+&)Hh)-}~YsGE>DdZ$K;9JlP?_eU3uU(xbY}&@JYcNX(tFNJ6dFKn5};!(s8DO(I&S@IdMV&+^lB9F?N2mH zv-76<2RWgB+^f?=^>y4idRQt%U?}=9tsNX-x=`-=NN3j9ydN0zu@6|naCduk&Gce- znyudiBaeE@mAsIr7x8$^b9Z|#tkv0s#4zNloJVbWfcydK5524~Il}-iaA8-73b5jaw#dKy84*unf?3w;cMd`;#V-3FvGN(dnMeXVom`760~=7`*g88${c@PovHCPhovNg6 zsvhyGCj5iQ2h^u6i8{CX<;aMRC8Zf}E;~m#VD*AGGdI_>?qXZW#mb5SG(s2!1mv7Q zvu-6yAtwY7siPupc(qLeUZ*W`PkS0SYZ)0C^)d{A-3vK*Xm1w>@B^BKg(6%t=?zgf z%cXd7UgARecwrWhB|oL-!%?Wr224?uc*ApdXGcmZn0l<1!SO?*;>ReCCQTpdJ-*mGILyfOJafU5AHIrCWK826 z1VpOZPr2UB0GG7BB0h?$N~A+9orLQhYxl`56|6fl(S2gW51;Nh-+$uR2$9Cba~ zxmT&2+w;Y-_J3A?2Y6$NKr{V{Vca+b zdCSr7pfv#3a=)*I*2~K4Kh9?B*?*>^{ zw`0?CBrcVpE#f8-8`v5M*3Rny0VB1+P?g zVdMBXk)yhu(0j=hJq3WZOrMOI%s#I^TsAcWmzw8C`=3>Zl=VmUQBZ5vHA@gz z^127V^)k6SF}n>4#kjvpbqahNm3gKfvnD#X>3SdV;mpg0Hu3wSxYow|k!rU!CL(jW zQ`#2JXGd3V2Y>SJIuv%IS5NYdyo>y{#prHKp4flS5`fEcE1#5@7`nEWS1q=-#aTbH zePM)Ax4ODo7I&oC@tz4b-?g1?d~zK0NcDL8v+D#%MF#zFNJ^7XYTft zU|iT&sg<+KzCEJWL_yNlc9BMw;qqEZO5}uj;ncq-IGkU4tJagfMtI|C`8K!G`dZhzb zRu$H5<1ceivEU!jppBQ(D_;Cn6%<9&+F^#1VDtP{2kDJKd>L*ffP^Xd8*?0#sg*^v za?)nV{;~HK#&0HSnHBHQa8Y#N}D7b!h8+Eak34L%9f{@cfWsMALA zgcm+(O_%JYx=(U_qw`A=wjf6PQgT<7TAA=|bfsb}`pU#_ai(}AtfE>??*Vw?iKgNkYSAbxVS;$5CL~| z-1w8o_z4jO*1KId6nNF3l-uqwvy9A?%15vS3>$p6xv^2t+ZJ%+wydYps;JbqCA@{( zwgt*(P=Px^4Ir&=l)TyDK8o#IX|Al`yeA}fc}zp{UKd}LjQh#nZpL>GK1B**=VN_{ z3vv%aO6p2BK?X}~9bbAT@6S9V*Pt_DU1-4*=m~SZ_yK1fGL4PQ>m*Mm3?Es%`;f_;6J)W(vZ9()OY$7sb(G+GB?kk`rHqn zfZ>f4_j4ahymY6<5L{9F38A6jrrh^9&Ovo3{v+8t(_Li4O#vZ~61PZ#Tcic~DjVf~=U4(-dFU|V@)c$^gf0Hw z1+&~}aFFz#kVW{nQXIO9L7C6t1kZE2s73rQ3x3fAH_u~a&Nvt4GZBsabd=5M3(j=m z!1A)mZ>+_l`spa|@8S$IHm-fwFMsf3F}k4LE&SP6`U%V6p&eL4f4SBh3^|7)y2~;1 z=mDtVf!PBZ-_=ZB-y5ySuGZX8!enZ$CVA%PM*B5^n}iPIW8YT}99>Xhy{|f{C_egI z2t|U~M6gH;sUjBjtsLjfu2I9m^RscLqOn?wn$U}VFZ!}^DPjA@*Zl)H2ftp07m#{( zerW%$-Q+FmMIs0mMZfobTdeG^!?g}bcLse3FEA(P#}>Y-J2CY{9M z;y03~EaG~1ljZ3SfMu8mwt!!}_@-VtY;od6a*!k4 z8BgzetG0kiM8Bbyy+00M6`>h9@`fw+|a#oiZj>M(TtxeaNYJ0LfOUR<082*Ma>cHIOrt6>wVe^WHV z2Ts=e+NM-~X;-B(TFRmcsx(y`(Fv!vGC6*hc<%y~8}|4y9{nkvcAtyVYMHgwjf_5# zs!idlhDTC|&9EI3!a*b?5#8NVIc9sLTC$xIZt>AkyIEM!X}#csk+JU9xWmEu8d~OD zYZI?se&I9y*FD8Ds+vFR86>IR#G`FFt;97?W~|jkBPTVye_?r>7*WbkCcxr(kDnm- zP&{gTq9OIjiY{pL+iD{7^`LnZEzSG!9{jiQJqaYAE$n^y$Feeu<8E+-9oFaT-8lW! zZX~!UGN1<);!rxVx-10V?oC^HyH}`|DR({N(=pjOcN5-Ax<9Bt1>?4zg6K%X{}$*o zeW$45?!qLpF^!ukvAFO~IzVe)q^j*GLEFWAn9rULW_vLv+f}6aCTXPBpMab&zEx0Y zplsECuR}E4u4H?DQ)gQG6&h4XDmVS6 zuY06N;n1??ZM4v_qbLZy*U~k_{MKrY(sU?WZuI-@7Gu2u9g{re?5!D7v4WNP>lb4= zo|uuB37UV35$+Xm!pv)ltUCRQ01`5R8xD0j!p&`UWFm-nt{;P1)Qg|1 z-G#;GM`p~~SXTJ%^mv~f*{G)cb&(YzU8vYezYm#47=Cp(+>g143myl+x@LqF^jvmw z&lSyliMR$jeTX1=ic39;*%%mXvam3RyPKOQ*GwZ~MVe43F6MG_qvE}GRGdJPAT*dD znc;?MuoZR#Nv;+XK`Yf+VBgnHpWy_{4>PRBO>2lz(`~iJDAI&u?y}XeBF|fU6js&C zSH1#~e1Jx;w%}OlRI+-b(X&<3`CX~V8rAEq;%?cjT{gqqB1af`(I3>~SQycYu4DrY z5#HG=Tf}3^1-QNB%JwAD4m~JwZ=K-i;MTr7moHk?>ZGq;u*1QZ)&;;_HTKFflU8xe z#!Mz03fjt_X{4BY;0ouI3a;7nVdG{ zxOnw*0z;ZO!fDMo`vOS!mSG*HS;X>sk#i#KicZm&O}7l-!8yH^Krvg-CPraC92?Kv zzeuT2*S7UkE|ZszS2O5NfGVoHg1zpx^wUeD3qw%h%RhLDtv}=FLJ2-5%BHQ8QAVLK z7b{<-7XA$Gsre~L-vu+rM8w`R)-%?l{mOtL`wTC%|4{d;hycYAsBrvDEXb8=J$PRcl#GhqahgB$^Mm?b5aed|2hnt zgTU-20n1E?j+XKBqeR1{1Tgs9rvM+SC<(^DhQhiFN3L~TrUgvbfH?Y1mtL1hB@tj01Jm-pTfOC$?0NS2ImGN+K=@2nmngc)=B?!MCucW~ zU&jv4(we{Y9p;JI2ISeRYf--5`B$U@IZ zRof>{5Edb1sUuBNu&I-@l$uDhCl;;%%hL#@cwNgzE}SR1QCN`APg)jhuemr8{;3Yj zFzx}P{?n{TNt9_0cIni!BWu}eFRlytepk5=bb66;U4F8YonK%sk9Ax$A?67*%Jm46 zd!A_GJ4KzrWr$w**)d0D72r7{v5JV?AXFnWC~Te|gl>nJQcUKqLC!VQq)l`&*s(@H zB7doI)at=PLin7HAo3T!#AvXn!n!`4d6t#=ZO=>s8Y1+< zHWE&}7gM*mk%jDJ_I!L=6I=4DX3@ijLM3;hh#~obtb+@oOB*&okPRcd2yJl!3-fP3 zhWS;Dwhq*}HCqU(pSWnqI;e*KxWDznSaW43k&P&_Z}mXN{u}nXQrVGu*0RM#)LRX~ z(>)r%E2+m8SI*i4N~jg@g5J;A5rlJTUDcC**m5#okVHW9`$Du-@YN5N`qE9c!=Lzp z1MfVcoFJV)w1-v(v#;JOsXG2Gs~#k^)_foF_wNz`uB@d=68DBdK~e_Il?5 zH**>hZcRSxY;4oO$BOty|2zFR5nr4YPq>BfHe-I>xI^T$S;l${TkMU40*k8d{G2Fi~QZM^?%$jry#YIS6ft(Ue_$?|9?hD@nzsdhgP*$AX`2 z(|mYBAuoNUu|!t$X6g3tAY74(W-qf<^UeNIVwpgSL94FPs}%K^j4I`Ko8_LRXUs<= z&ad{aXIz`x+8l`8R&?WUueTyOa@B^)waYx6$IO zAeAAjlO0UXr9DBe-L1bWcg*TduV~7LO7=X<{Pg;7fef&eaeprW+-j(7^jIuX+aovr z1k19F8d-^3$`&W*Jrjl2(fX(Y#pPgr^Ud$9<1B!*OWVL6S|}aCPEw{fH7YFl%w|1VJ&>Mr|s#JvEug9 zqvK@=nO&HK;Bo2_VJkLL565$BWmDcV(S7Z0-!tFwL<#)m{wR9SeLg+2Wi+LIz|5u| zP<7B~rf2`DrrhJ}ug)eCk?eFzOZh2!SdD>p>?E0G(WESoHa^_|?sdP}! z)q}*L5957B(S-yQw&_o*n5||RM47=?3El{9 zf6y3|-JoB?t$qW&kZjifSB@F~V=w;ys}0Bh9}gOt@6HA#=Pf75lgY%IWQUXzy!5|3 z2mvC(S_~?Q-1IG)7GLvyw5T64e71|TTE?tr%9r4wIUea zG4nW^z76fO5Dsl+T`7i)?iFGagkh3Ppf=xrm#V;pQec~0Akz!TZ;L~0!u$@R`jH+^ ze{lo%i^zXJXO*;2j^Z*|%0z79Eyjr~vrJ-0OH`)M!ihorrGtRs=qa~FDTi4fY?ae>B;NJv~34mH9*IXl|7 zMVNbztY3}zX+bYFCUzGHguWC^N0#gFp2M*i0_UlAQWU#zNT+3dS!hF;Z>JetDBY9H z7K#F>`x5{CU^t5~1%^REemkn+V>BV6h%!GbB2N%kjS9s*7!O5(=%nW{xWjXJkQ>>| zPYx6L%>mVHAY4CFl|7!2`B=Pi_?_MzR*3fs(%yDhuYy##d{mi#2qB0@xpIqb{q&bi zLltbI_fN2RS?7CYAF*p;&6041teN{1LRBZ`lvMIpB`C==pPPuA4ZheVCz27#48lYH zS>=eVK;ce$U@2JNt*XW8m+t1XU9p80v6A@JF3sJ2IqE-|izU)6v(-M+RsdJkno2zr<~}CDm*}w$+yDoqyF- z|9T!}ZR1SumjOb$HnVb>?wvm3AJZ=j{K%PKHgseYR!HK2aYFmw$EmmyuOuG9a@Ox7 zA;IS^y!K1Nno7)_oFcFseTkeEg=SHB&*D1(FG1j9mfr|#zY}=(s{}T1bolNuw!55N zO%sXW3#4bVCNpGk%!4KN_N#2#@ud^CpO|9i9E0DoqfTh4euJoH|DFG|;!i&N8l!w9 zfbJ;yZ^BI43?YZhSn={4>sXxV(i>77CnJaKuA&FtP_0FNF86G}&EUJ91+%L~c&wF~ zm%JA$b>U3P3y<|-qjqGEXMe%|s-JDrbrknq7yIUSb~U$>sy!$*4~A(aowh7Bbt#HU z^Si~P_bY#A{X>wLQ;Jl`fKPt*-zPgq_@&0sUhl}QwLBsnk0BF&M)NH$TP#AaeBb?52_y@5D}~zOj!I zb>CK+(+qOWr_R?7t+_{FL?XsJElP)1qyhNGBFbq zVl+F1mPsP~#PGP&mYK&ok^=+=LP%uY$z+hK{64LTczUwj)G7J`0`Ve3X zXMi@JMC13EN5>t}Ceb%=(k4mGq8%c_kBR9*slyhWwcsDILoTR-mw$C{_)6U}r6p{H z5xD*R&)8}(@D@j327*cY6`TA$s>_gJB>?qr`TVyWC&`Fi1|T3Hkt;!@b?+g?NYh*h zHYO-Idi%gh%LbTo{}zJ(i!)ZCf3-S@F&nTY>o4WOPXA%K?lNc%`u92o`2#db$*vDC z{eRbvg~|aX1%ogN3Uu*M-rjy+DMvl=X;t}(9}*G*+@jf4*;q)Bq%4g8mYaluQi~TS zqQL(VHU9zqTZY0p4v|)b^nVEfbMSvl7dc2^3)_6%1qqhXQwdb=1h4+VzQFi0@KVMb ziI&i-U@k{MQAYCzg0IU73S^3~Ky?ovKL0H`4#Su5;b;p>`i2O<_M}7Z-Ov4Z#GNG| zUsIzKC?zA_=?w()muVKtRATYbLN>D5pKiE0xnM&*3~dGzREjvReZsfeA@6Jd_th~< zW@RA;y~s4ehQ#`$CA@e{7(|~Nh6;t^e7yW#EK`F8max`;E=dBD1!}AR-Xj7;R21!} z{qSP`W)^*tM88kN4i&zMK>#H)fFUSR82Gyh%%Ko5#_#+VIZs~?I0yP*q@p%52vF@2 z!1Fuk2=Oj$uOU#3grks^fBb6Tw@;qV+5Z}|{0Xy!u=GyP(Vrlae^Vy#fk}+6!Snyi1nmRH$)ou(nSAon RtTqDhP?A%JRLNL`{%?Y!snGxc literal 0 HcmV?d00001 diff --git a/bundles/org.openhab.binding.webthing/docs/webthing_description.png b/bundles/org.openhab.binding.webthing/docs/webthing_description.png new file mode 100644 index 0000000000000000000000000000000000000000..f9d55a3287a788d2d9cd94fda41aa146d36766f8 GIT binary patch literal 122538 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 Cc(K_4 literal 0 HcmV?d00001 diff --git a/bundles/org.openhab.binding.webthing/pom.xml b/bundles/org.openhab.binding.webthing/pom.xml new file mode 100644 index 000000000..d3a4ea303 --- /dev/null +++ b/bundles/org.openhab.binding.webthing/pom.xml @@ -0,0 +1,16 @@ + + + + 4.0.0 + + + org.openhab.addons.bundles + org.openhab.addons.reactor.bundles + 3.1.0-SNAPSHOT + + + org.openhab.binding.webthing + + openHAB Add-ons :: Bundles :: WebThing Binding + diff --git a/bundles/org.openhab.binding.webthing/src/main/feature/feature.xml b/bundles/org.openhab.binding.webthing/src/main/feature/feature.xml new file mode 100644 index 000000000..df244f015 --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/main/feature/feature.xml @@ -0,0 +1,10 @@ + + + mvn:org.openhab.core.features.karaf/org.openhab.core.features.karaf.openhab-core/${ohc.version}/xml/features + + + openhab-runtime-base + openhab-transport-mdns + mvn:org.openhab.addons.bundles/org.openhab.binding.webthing/${project.version} + + diff --git a/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/ChannelHandler.java b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/ChannelHandler.java new file mode 100644 index 000000000..721136d4d --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/ChannelHandler.java @@ -0,0 +1,58 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.openhab.core.thing.ChannelUID; +import org.openhab.core.types.Command; +import org.openhab.core.types.State; + +/** + * The {@link ChannelHandler} class is a simplified abstraction of an openHAB Channel implementing + * methods to observe a channel as well to update an Item associated to a channel + * + * @author Gregor Roth - Initial contribution + */ +@NonNullByDefault +public interface ChannelHandler { + + /** + * register a listener to observer the channel regarding item change events + * + * @param channelUID the channel identifier + * @param listener the listener to be notified + */ + void observeChannel(ChannelUID channelUID, ItemChangedListener listener); + + /** + * updates an Item state of a dedicated channel + * + * @param channelUID the channel identifier + * @param command the state update command + */ + void updateItemState(ChannelUID channelUID, Command command); + + /** + * Listener that will be notified, if a Item state is changed + */ + interface ItemChangedListener { + + /** + * item change callback method + * + * @param channelUID the channel identifier + * @param stateCommand the item change command + */ + void onItemStateChanged(ChannelUID channelUID, State stateCommand); + } +} diff --git a/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/WebThingBindingConstants.java b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/WebThingBindingConstants.java new file mode 100644 index 000000000..9038afdcd --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/WebThingBindingConstants.java @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal; + +import java.util.Collection; +import java.util.Collections; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.openhab.core.thing.ThingTypeUID; + +/** + * The {@link WebThingBindingConstants} class defines common constants, which are + * used across the whole binding. + * + * @author Gregor Roth - Initial contribution + */ +@NonNullByDefault +public class WebThingBindingConstants { + + public static final String BINDING_ID = "webthing"; + + public static final ThingTypeUID THING_TYPE_UID = new ThingTypeUID(BINDING_ID, "generic"); + + public static final Collection SUPPORTED_THING_TYPES_UIDS = Collections + .singleton(WebThingBindingConstants.THING_TYPE_UID); + + public static final String MDNS_SERVICE_TYPE = "_webthing._tcp.local."; +} diff --git a/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/WebThingConfiguration.java b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/WebThingConfiguration.java new file mode 100644 index 000000000..1a7d33783 --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/WebThingConfiguration.java @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; + +/** + * The {@link WebThingConfiguration} class contains fields mapping thing configuration parameters. + * + * @author Gregor Roth - Initial contribution + */ +@NonNullByDefault +public class WebThingConfiguration { + + /** + * The webThing uri. This URI will be detected within the discovery process + */ + @Nullable + public String webThingURI = null; +} diff --git a/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/WebThingHandler.java b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/WebThingHandler.java new file mode 100644 index 000000000..53406da83 --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/WebThingHandler.java @@ -0,0 +1,298 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal; + +import java.io.IOException; +import java.net.URI; +import java.time.Duration; +import java.time.Instant; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.jetty.client.HttpClient; +import org.eclipse.jetty.websocket.client.WebSocketClient; +import org.openhab.binding.webthing.internal.channel.Channels; +import org.openhab.binding.webthing.internal.client.*; +import org.openhab.binding.webthing.internal.link.ChannelToPropertyLink; +import org.openhab.binding.webthing.internal.link.PropertyToChannelLink; +import org.openhab.binding.webthing.internal.link.UnknownPropertyException; +import org.openhab.core.thing.*; +import org.openhab.core.thing.binding.BaseThingHandler; +import org.openhab.core.types.Command; +import org.openhab.core.types.RefreshType; +import org.openhab.core.types.State; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The {@link WebThingHandler} is responsible for handling commands, which are + * sent to one of the channels. + * + * @author Gregor Roth - Initial contribution + */ +@NonNullByDefault +public class WebThingHandler extends BaseThingHandler implements ChannelHandler { + private static final Duration RECONNECT_PERIOD = Duration.ofHours(23); + private static final Duration HEALTH_CHECK_PERIOD = Duration.ofSeconds(70); + private static final ItemChangedListener EMPTY_ITEM_CHANGED_LISTENER = (channelUID, stateCommand) -> { + }; + + private final Logger logger = LoggerFactory.getLogger(WebThingHandler.class); + private final HttpClient httpClient; + private final WebSocketClient webSocketClient; + private final AtomicBoolean isActivated = new AtomicBoolean(true); + private final Map itemChangedListenerMap = new ConcurrentHashMap<>(); + private final AtomicReference> webThingConnectionRef = new AtomicReference<>( + Optional.empty()); + private final AtomicReference lastReconnect = new AtomicReference<>(Instant.now()); + private final AtomicReference>> watchdogHandle = new AtomicReference<>( + Optional.empty()); + private @Nullable URI webThingURI = null; + + public WebThingHandler(Thing thing, HttpClient httpClient, WebSocketClient webSocketClient) { + super(thing); + this.httpClient = httpClient; + this.webSocketClient = webSocketClient; + } + + private boolean isOnline() { + return getThing().getStatus() == ThingStatus.ONLINE; + } + + private boolean isDisconnected() { + return (getThing().getStatus() == ThingStatus.OFFLINE) || (getThing().getStatus() == ThingStatus.UNKNOWN); + } + + private boolean isAlive() { + return webThingConnectionRef.get().map(ConsumedThing::isAlive).orElse(false); + } + + @Override + public void initialize() { + updateStatus(ThingStatus.UNKNOWN); + isActivated.set(true); // set with true, even though the connect may fail. In this case retries will be + // triggered + + // perform connect in background + scheduler.execute(() -> { + // WebThing URI present? + var uri = toUri(getConfigAs(WebThingConfiguration.class).webThingURI); + if (uri != null) { + logger.debug("try to connect WebThing {}", uri); + var connected = tryReconnect(uri); + if (connected) { + logger.debug("WebThing {} connected", getWebThingLabel()); + } + } else { + updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_ERROR, + "webThing uri has not been set"); + logger.warn("could not initialize WebThing. URI is not set or invalid. {}", this.webThingURI); + } + }); + + // starting watchdog that checks the healthiness of the WebThing connection, periodically + watchdogHandle + .getAndSet(Optional.of(scheduler.scheduleWithFixedDelay(this::checkWebThingConnection, + HEALTH_CHECK_PERIOD.getSeconds(), HEALTH_CHECK_PERIOD.getSeconds(), TimeUnit.SECONDS))) + .ifPresent(future -> future.cancel(true)); + } + + private @Nullable URI toUri(@Nullable String uri) { + try { + if (uri != null) { + return URI.create(uri); + } + } catch (IllegalArgumentException illegalURIException) { + return null; + } + return null; + } + + @Override + public void dispose() { + try { + isActivated.set(false); // set to false to avoid reconnecting + + // terminate WebThing connection as well as the alive watchdog + webThingConnectionRef.getAndSet(Optional.empty()).ifPresent(ConsumedThing::close); + watchdogHandle.getAndSet(Optional.empty()).ifPresent(future -> future.cancel(true)); + } finally { + super.dispose(); + } + } + + private boolean tryReconnect(@Nullable URI uri) { + if (isActivated.get()) { // will try reconnect only, if activated + try { + // create the client-side WebThing representation + if (uri != null) { + var webThing = ConsumedThingFactory.instance().create(webSocketClient, httpClient, uri, scheduler, + this::onError); + this.webThingConnectionRef.getAndSet(Optional.of(webThing)).ifPresent(ConsumedThing::close); + + // update the Thing structure based on the WebThing description + thingStructureChanged(webThing); + + // link the Thing's channels with the WebThing properties to forward properties/item updates + establishWebThingChannelLinks(webThing); + + lastReconnect.set(Instant.now()); + updateStatus(ThingStatus.ONLINE); + return true; + } + } catch (IOException e) { + var msg = e.getMessage(); + if (msg == null) { + msg = ""; + } + onError(msg); + } + } + return false; + } + + public void onError(String reason) { + var wasConnectedBefore = isOnline(); + updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, reason); + + // close the WebThing connection. If the handler is still active, the WebThing connection + // will be re-established within the periodically watchdog task + webThingConnectionRef.getAndSet(Optional.empty()).ifPresent(ConsumedThing::close); + + if (wasConnectedBefore) { // to reduce log messages, just log in case of connection state changed + logger.debug("WebThing {} disconnected {}. Try reconnect (each {} sec)", getWebThingLabel(), reason, + HEALTH_CHECK_PERIOD.getSeconds()); + } else { + logger.debug("WebThing {} is offline {}. Try reconnect (each {} sec)", getWebThingLabel(), reason, + HEALTH_CHECK_PERIOD.getSeconds()); + } + } + + private String getWebThingLabel() { + if (getThing().getLabel() == null) { + return "" + webThingURI; + } else { + return "'" + getThing().getLabel() + "' (" + webThingURI + ")"; + } + } + + /** + * updates the thing structure. Refer https://www.openhab.org/docs/developer/bindings/#updating-the-thing-structure + * + * @param webThing the WebThing that is used for the new structure + */ + private void thingStructureChanged(ConsumedThing webThing) { + var thingBuilder = editThing().withLabel(webThing.getThingDescription().title); + + // create a channel for each WebThing property + for (var entry : webThing.getThingDescription().properties.entrySet()) { + var channel = Channels.createChannel(thing.getUID(), entry.getKey(), entry.getValue()); + // add channel (and remove a previous one, if exist) + thingBuilder.withoutChannel(channel.getUID()).withChannel(channel); + } + var thing = thingBuilder.build(); + + // and update the thing + updateThing(thing); + } + + /** + * connects each WebThing property with a corresponding openHAB channel. After this changes will be synchronized + * between a WebThing property and the openHAB channel + * + * @param webThing the WebThing to be connected + * @throws IOException if the channels can not be connected + */ + private void establishWebThingChannelLinks(ConsumedThing webThing) throws IOException { + // remove all registered listeners + itemChangedListenerMap.clear(); + + // create new links (listeners will be registered, implicitly) + for (var namePropertyPair : webThing.getThingDescription().properties.entrySet()) { + try { + // determine the name of the associated channel + var channelUID = Channels.createChannelUID(getThing().getUID(), namePropertyPair.getKey()); + + // will try to establish a link, if channel is present + var channel = getThing().getChannel(channelUID); + if (channel != null) { + // establish downstream link + PropertyToChannelLink.establish(webThing, namePropertyPair.getKey(), this, channel); + + // establish upstream link + if (!namePropertyPair.getValue().readOnly) { + ChannelToPropertyLink.establish(this, channel, webThing, namePropertyPair.getKey()); + } + } + } catch (UnknownPropertyException upe) { + logger.warn("WebThing {} property {} could not be linked with a channel", getWebThingLabel(), + namePropertyPair.getKey(), upe); + } + } + } + + @Override + public void handleCommand(ChannelUID channelUID, Command command) { + if (command instanceof State) { + itemChangedListenerMap.getOrDefault(channelUID, EMPTY_ITEM_CHANGED_LISTENER).onItemStateChanged(channelUID, + (State) command); + } else if (command instanceof RefreshType) { + tryReconnect(webThingURI); + } + } + + ///////////// + // ChannelHandler methods + @Override + public void observeChannel(ChannelUID channelUID, ItemChangedListener listener) { + itemChangedListenerMap.put(channelUID, listener); + } + + @Override + public void updateItemState(ChannelUID channelUID, Command command) { + if (isActivated.get()) { + postCommand(channelUID, command); + } + } + // + ///////////// + + private void checkWebThingConnection() { + // try reconnect, if necessary + if (isDisconnected() || (isOnline() && !isAlive())) { + logger.debug("try reconnecting WebThing {}", getWebThingLabel()); + if (tryReconnect(webThingURI)) { + logger.debug("WebThing {} reconnected", getWebThingLabel()); + } + + } else { + // force reconnecting periodically, to fix erroneous states that occurs for unknown reasons + var elapsedSinceLastReconnect = Duration.between(lastReconnect.get(), Instant.now()); + if (isOnline() && (elapsedSinceLastReconnect.getSeconds() > RECONNECT_PERIOD.getSeconds())) { + if (tryReconnect(webThingURI)) { + logger.debug("WebThing {} reconnected. Initiated by periodic reconnect", getWebThingLabel()); + } else { + logger.debug("could not reconnect WebThing {} (periodic reconnect failed). Next trial in {} sec", + getWebThingLabel(), HEALTH_CHECK_PERIOD.getSeconds()); + } + + } + } + } +} diff --git a/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/WebThingHandlerFactory.java b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/WebThingHandlerFactory.java new file mode 100644 index 000000000..e138454a1 --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/WebThingHandlerFactory.java @@ -0,0 +1,58 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.jetty.client.HttpClient; +import org.eclipse.jetty.websocket.client.WebSocketClient; +import org.openhab.core.io.net.http.HttpClientFactory; +import org.openhab.core.io.net.http.WebSocketFactory; +import org.openhab.core.thing.Thing; +import org.openhab.core.thing.ThingTypeUID; +import org.openhab.core.thing.binding.BaseThingHandlerFactory; +import org.openhab.core.thing.binding.ThingHandler; +import org.openhab.core.thing.binding.ThingHandlerFactory; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; + +/** + * The {@link WebThingHandlerFactory} is responsible for creating things and thing + * handlers. + * + * @author Gregor Roth - Initial contribution + */ +@NonNullByDefault +@Component(configurationPid = "binding.webthing", service = ThingHandlerFactory.class) +public class WebThingHandlerFactory extends BaseThingHandlerFactory { + private final HttpClient httpClient; + private final WebSocketClient webSocketClient; + + @Activate + public WebThingHandlerFactory(@Reference HttpClientFactory httpClientFactory, + @Reference WebSocketFactory webSocketFactory) { + this.httpClient = httpClientFactory.getCommonHttpClient(); + this.webSocketClient = webSocketFactory.getCommonWebSocketClient(); + } + + @Override + public boolean supportsThingType(ThingTypeUID thingTypeUID) { + return WebThingBindingConstants.SUPPORTED_THING_TYPES_UIDS.contains(thingTypeUID); + } + + @Override + protected @Nullable ThingHandler createHandler(Thing thing) { + return new WebThingHandler(thing, httpClient, webSocketClient); + } +} diff --git a/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/channel/Channels.java b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/channel/Channels.java new file mode 100644 index 000000000..8ffb417df --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/channel/Channels.java @@ -0,0 +1,74 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal.channel; + +import static org.openhab.binding.webthing.internal.WebThingBindingConstants.BINDING_ID; + +import java.util.Set; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.openhab.binding.webthing.internal.client.dto.Property; +import org.openhab.binding.webthing.internal.link.TypeMapping; +import org.openhab.core.thing.Channel; +import org.openhab.core.thing.ChannelUID; +import org.openhab.core.thing.ThingUID; +import org.openhab.core.thing.binding.builder.ChannelBuilder; +import org.openhab.core.thing.type.ChannelTypeUID; + +/** + * The {@link Channels} class is an utility class to create Channel based on the property characteristics as + * well as ChannelUID identifier + * + * @author Gregor Roth - Initial contribution + */ +@NonNullByDefault +public class Channels { + + /** + * create a ChannelUIFD identifier for a given property name + * + * @param thingUID the thing uid of the associated WebThing + * @param propertyName the property name + * @return the ChannelUID identifier + */ + public static ChannelUID createChannelUID(ThingUID thingUID, String propertyName) { + return new ChannelUID(thingUID.toString() + ":" + propertyName); + } + + /** + * create a Channel base on a given WebThing property + * + * @param thingUID the thing uid of the associated WebThing + * @param propertyName the property name + * @param property the WebThing property + * @return the Channel according to the properties characteristics + */ + public static Channel createChannel(ThingUID thingUID, String propertyName, Property property) { + var itemType = TypeMapping.toItemType(property); + var channelUID = createChannelUID(thingUID, propertyName); + var channelBuilder = ChannelBuilder.create(channelUID, itemType.getType()); + + // Currently, few predefined, generic channel types such as number, string or color are defined + // inside the thing-types.xml file. A better solution would be to create the channel types + // dynamically based on the WebThing description to make most of the meta data of a WebThing. + // The goal of the WebThing meta data is to enable semantic interoperability for connected things + channelBuilder.withType(new ChannelTypeUID(BINDING_ID, itemType.getType())); + channelBuilder.withDescription(property.description); + channelBuilder.withLabel(property.title); + var defaultTag = itemType.getTag(); + if (defaultTag != null) { + channelBuilder.withDefaultTags(Set.of(defaultTag)); + } + return channelBuilder.build(); + } +} diff --git a/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/ConsumedThing.java b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/ConsumedThing.java new file mode 100644 index 000000000..4ae43fb71 --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/ConsumedThing.java @@ -0,0 +1,70 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal.client; + +import java.util.function.BiConsumer; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.openhab.binding.webthing.internal.client.dto.WebThingDescription; + +/** + * A WebThing represents the client-side proxy of a remote devices implementing the Web Thing API according to + * https://iot.mozilla.org/wot/ + * The API design is oriented on https://www.w3.org/TR/wot-scripting-api/#the-consumedthing-interface + * + * @author Gregor Roth - Initial contribution + */ +@NonNullByDefault +public interface ConsumedThing { + + /** + * @return the description (meta data) of the WebThing + */ + WebThingDescription getThingDescription(); + + /** + * Makes a request for Property value change notifications + * + * @param propertyName the property to be observed + * @param listener the listener to call on changes + */ + void observeProperty(String propertyName, BiConsumer listener); + + /** + * Writes a single Property. + * + * @param propertyName the propertyName + * @return the current propertyValue + * @throws PropertyAccessException if the property can not be read + */ + Object readProperty(String propertyName) throws PropertyAccessException; + + /** + * Writes a single Property. + * + * @param propertyName the propertyName + * @param newValue the new propertyValue + * @throws PropertyAccessException if the property can not be written + */ + void writeProperty(String propertyName, Object newValue) throws PropertyAccessException; + + /** + * @return true, if connection is alive + */ + boolean isAlive(); + + /** + * closes the connection + */ + void close(); +} diff --git a/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/ConsumedThingFactory.java b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/ConsumedThingFactory.java new file mode 100644 index 000000000..a926a7164 --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/ConsumedThingFactory.java @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal.client; + +import java.io.IOException; +import java.net.URI; +import java.util.concurrent.ScheduledExecutorService; +import java.util.function.Consumer; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jetty.client.HttpClient; +import org.eclipse.jetty.websocket.client.WebSocketClient; + +/** + * Factory to create new instances of the WebThing client-side proxy + * + * @author Gregor Roth - Initial contribution + */ +@NonNullByDefault +public interface ConsumedThingFactory { + + /** + * @param webSocketClient the webSocketClient to use + * @param httpClient the http client to use + * @param webThingURI the identifier of a WebThing resource + * @param executor executor + * @param errorHandler the error handler + * @return the newly created WebThing + * @throws IOException if the WebThing can not be connected + */ + ConsumedThing create(WebSocketClient webSocketClient, HttpClient httpClient, URI webThingURI, + ScheduledExecutorService executor, Consumer errorHandler) throws IOException; + + /** + * @return the default instance of the factory + */ + static ConsumedThingFactory instance() { + return ConsumedThingImpl::new; + } +} diff --git a/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/ConsumedThingImpl.java b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/ConsumedThingImpl.java new file mode 100644 index 000000000..9dc7d453b --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/ConsumedThingImpl.java @@ -0,0 +1,262 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal.client; + +import java.io.IOException; +import java.net.URI; +import java.time.Duration; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.jetty.client.HttpClient; +import org.eclipse.jetty.client.util.StringContentProvider; +import org.eclipse.jetty.websocket.client.WebSocketClient; +import org.openhab.binding.webthing.internal.client.dto.Property; +import org.openhab.binding.webthing.internal.client.dto.WebThingDescription; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.Gson; + +/** + * The implementation of the client-side Webthing representation. This is based on HTTP. Bindings to alternative + * application protocols such as CoAP may be defined in the future (which may be implemented by a another class) + * + * @author Gregor Roth - Initial contribution + */ +@NonNullByDefault +public class ConsumedThingImpl implements ConsumedThing { + private static final Duration DEFAULT_PING_PERIOD = Duration.ofSeconds(80); + private final Logger logger = LoggerFactory.getLogger(ConsumedThingImpl.class); + private final URI webThingURI; + private final Gson gson = new Gson(); + private final HttpClient httpClient; + private final Consumer errorHandler; + private final WebThingDescription description; + private final WebSocketConnection websocketDownstream; + private final AtomicBoolean isOpen = new AtomicBoolean(true); + + /** + * constructor + * + * @param webSocketClient the web socket client to use + * @param httpClient the http client to use + * @param webThingURI the identifier of a WebThing resource + * @param executor executor to use + * @param errorHandler the error handler + * @throws IOException it the WebThing can not be connected + */ + ConsumedThingImpl(WebSocketClient webSocketClient, HttpClient httpClient, URI webThingURI, + ScheduledExecutorService executor, Consumer errorHandler) throws IOException { + this(httpClient, webThingURI, executor, errorHandler, WebSocketConnectionFactory.instance(webSocketClient)); + } + + /** + * constructor + * + * @param httpClient the http client to use + * @param webthingUrl the identifier of a WebThing resource + * @param executor executor to use + * @param errorHandler the error handler + * @param webSocketConnectionFactory the Websocket connectino fctory to be used + * @throws IOException if the WebThing can not be connected + */ + ConsumedThingImpl(HttpClient httpClient, URI webthingUrl, ScheduledExecutorService executor, + Consumer errorHandler, WebSocketConnectionFactory webSocketConnectionFactory) throws IOException { + this(httpClient, webthingUrl, executor, errorHandler, webSocketConnectionFactory, DEFAULT_PING_PERIOD); + } + + /** + * constructor + * + * @param httpClient the http client to use + * @param webthingUrl the identifier of a WebThing resource + * @param executor executor to use + * @param errorHandler the error handler + * @param webSocketConnectionFactory the Websocket connectino fctory to be used + * @param pingPeriod the ping period tothe the healthiness of the connection + * @throws IOException if the WebThing can not be connected + */ + ConsumedThingImpl(HttpClient httpClient, URI webthingUrl, ScheduledExecutorService executor, + Consumer errorHandler, WebSocketConnectionFactory webSocketConnectionFactory, Duration pingPeriod) + throws IOException { + this.webThingURI = webthingUrl; + this.httpClient = httpClient; + this.errorHandler = errorHandler; + this.description = new DescriptionLoader(httpClient).loadWebthingDescription(webThingURI, + Duration.ofSeconds(20)); + + // opens a websocket downstream to be notified if a property value will be changed + var optionalEventStreamUri = this.description.getEventStreamUri(); + if (optionalEventStreamUri.isPresent()) { + this.websocketDownstream = webSocketConnectionFactory.create(optionalEventStreamUri.get(), executor, + this::onError, pingPeriod); + } else { + throw new IOException("WebThing " + webThingURI + " does not support websocket uri. WebThing description: " + + this.description); + } + } + + private Optional getPropertyUri(String propertyName) { + var optionalProperty = description.getProperty(propertyName); + if (optionalProperty.isPresent()) { + var propertyDescription = optionalProperty.get(); + for (var link : propertyDescription.links) { + if ((link.rel != null) && (link.href != null) && link.rel.equals("property")) { + return Optional.of(webThingURI.resolve(link.href)); + } + } + } + return Optional.empty(); + } + + @Override + public boolean isAlive() { + return isOpen.get() && this.websocketDownstream.isAlive(); + } + + @Override + public void close() { + isOpen.set(false); + this.websocketDownstream.close(); + } + + void onError(String reason) { + logger.debug("WebThing {} error occurred. {}", webThingURI, reason); + if (isOpen.get()) { + errorHandler.accept(reason); + } + close(); + } + + @Override + public WebThingDescription getThingDescription() { + return this.description; + } + + @Override + public void observeProperty(String propertyName, BiConsumer listener) { + this.websocketDownstream.observeProperty(propertyName, listener); + + // it may take a long time before the observed property value will be changed. For this reason + // read and notify the current property value (as starting point) + try { + var value = readProperty(propertyName); + listener.accept(propertyName, value); + } catch (PropertyAccessException pae) { + logger.warn("could not read WebThing {} property {}", webThingURI, propertyName, pae); + } + } + + @Override + public Object readProperty(String propertyName) throws PropertyAccessException { + var optionalPropertyUri = getPropertyUri(propertyName); + if (optionalPropertyUri.isPresent()) { + var propertyUri = optionalPropertyUri.get(); + try { + var response = httpClient.newRequest(propertyUri).timeout(30, TimeUnit.SECONDS) + .accept("application/json").send(); + if (response.getStatus() < 200 || response.getStatus() >= 300) { + onError("WebThing " + webThingURI + " disconnected"); + throw new PropertyAccessException("could not read " + propertyName + " (" + propertyUri + ")"); + } + var body = response.getContentAsString(); + var properties = gson.fromJson(body, Map.class); + if (properties == null) { + onError("WebThing " + webThingURI + " erroneous"); + throw new PropertyAccessException("could not read " + propertyName + " (" + propertyUri + + "). Response does not include any property (" + propertyUri + "): " + body); + } else { + var value = properties.get(propertyName); + if (value != null) { + return value; + } else { + onError("WebThing " + webThingURI + " erroneous"); + throw new PropertyAccessException("could not read " + propertyName + " (" + propertyUri + + "). Response does not include " + propertyName + "(" + propertyUri + "): " + body); + } + } + } catch (ExecutionException | TimeoutException | InterruptedException e) { + onError("WebThing resource " + webThingURI + " disconnected"); + throw new PropertyAccessException("could not read " + propertyName + " (" + propertyUri + ").", e); + } + } else { + onError("WebThing " + webThingURI + " does not support " + propertyName); + throw new PropertyAccessException("WebThing " + webThingURI + " does not support " + propertyName); + } + } + + @Override + public void writeProperty(String propertyName, Object newValue) throws PropertyAccessException { + var optionalPropertyUri = getPropertyUri(propertyName); + if (optionalPropertyUri.isPresent()) { + var propertyUri = optionalPropertyUri.get(); + var optionalProperty = description.getProperty(propertyName); + if (optionalProperty.isPresent()) { + try { + if (optionalProperty.get().readOnly) { + throw new PropertyAccessException("could not write " + propertyName + " (" + propertyUri + + ") with " + newValue + ". Property is readOnly"); + } else { + logger.debug("updating {} with {}", propertyName, newValue); + Map payload = Map.of(propertyName, newValue); + var json = gson.toJson(payload); + var response = httpClient.newRequest(propertyUri).method("PUT") + .content(new StringContentProvider(json), "application/json") + .timeout(30, TimeUnit.SECONDS).send(); + if (response.getStatus() < 200 || response.getStatus() >= 300) { + onError("WebThing " + webThingURI + "could not write " + propertyName + " (" + propertyUri + + ") with " + newValue); + throw new PropertyAccessException( + "could not write " + propertyName + " (" + propertyUri + ") with " + newValue); + } + } + } catch (ExecutionException | TimeoutException | InterruptedException e) { + onError("WebThing resource " + webThingURI + " disconnected"); + throw new PropertyAccessException( + "could not write " + propertyName + " (" + propertyUri + ") with " + newValue, e); + } + } else { + throw new PropertyAccessException("could not write " + propertyName + " (" + propertyUri + ") with " + + newValue + " WebTing does not support a property named " + propertyName); + } + } else { + onError("WebThing " + webThingURI + " does not support " + propertyName); + throw new PropertyAccessException("WebThing " + webThingURI + " does not support " + propertyName); + } + } + + /** + * Gets the property description + * + * @param propertyName the propertyName + * @return the description (meta data) of the property + */ + public @Nullable Property getPropertyDescription(String propertyName) { + return description.properties.get(propertyName); + } + + @Override + public String toString() { + return "WebThing " + description.title + " (" + webThingURI + ")"; + } +} diff --git a/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/DescriptionLoader.java b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/DescriptionLoader.java new file mode 100644 index 000000000..f172ff793 --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/DescriptionLoader.java @@ -0,0 +1,97 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal.client; + +import java.io.IOException; +import java.net.URI; +import java.time.Duration; +import java.util.Locale; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jetty.client.HttpClient; +import org.openhab.binding.webthing.internal.client.dto.WebThingDescription; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.Gson; +import com.google.gson.JsonSyntaxException; + +/** + * Utility class to load the WebThing description (meta data). Refer https://iot.mozilla.org/wot/#web-thing-description + * + * @author Gregor Roth - Initial contribution + */ +@NonNullByDefault +public class DescriptionLoader { + private final Logger logger = LoggerFactory.getLogger(DescriptionLoader.class); + private final Gson gson = new Gson(); + private final HttpClient httpClient; + + /** + * constructor + * + * @param httpClient the http client to use + */ + public DescriptionLoader(HttpClient httpClient) { + this.httpClient = httpClient; + } + + /** + * loads the WebThing meta data + * + * @param webthingURI the WebThing URI + * @param timeout the timeout + * @return the Webthing description + * @throws IOException if the WebThing can not be connected + */ + public WebThingDescription loadWebthingDescription(URI webthingURI, Duration timeout) throws IOException { + try { + var response = httpClient.newRequest(webthingURI).timeout(30, TimeUnit.SECONDS).accept("application/json") + .send(); + if (response.getStatus() < 200 || response.getStatus() >= 300) { + throw new IOException( + "could not read resource description " + webthingURI + ". Got " + response.getStatus()); + } + var body = response.getContentAsString(); + var description = gson.fromJson(body, WebThingDescription.class); + if ((description != null) && (description.properties != null) && (description.properties.size() > 0)) { + if ((description.contextKeyword == null) || description.contextKeyword.trim().length() == 0) { + description.contextKeyword = "https://webthings.io/schemas"; + } + var schema = description.contextKeyword.replaceFirst("/$", "").toLowerCase(Locale.US).trim(); + + // currently, the old and new location of the WebThings schema are supported only. + // In the future, other schemas such as http://iotschema.org/docs/full.html may be supported + if (schema.equals("https://webthings.io/schemas") || schema.equals("https://iot.mozilla.org/schemas")) { + return description; + } + logger.debug( + "WebThing {} detected with unsupported schema {} (Supported schemas are https://webthings.io/schemas and https://iot.mozilla.org/schemas)", + webthingURI, description.contextKeyword); + throw new IOException("unsupported schema (@context parameter) " + description.contextKeyword + + " (Supported schemas are https://webthings.io/schemas and https://iot.mozilla.org/schemas)"); + } else { + throw new IOException("description does not include properties"); + } + } catch (ExecutionException | TimeoutException e) { + throw new IOException("error occurred by calling WebThing", e); + } catch (JsonSyntaxException se) { + throw new IOException("resource seems not to be a WebThing. Typo?"); + } catch (InterruptedException ie) { + throw new IOException("resource seems not to be reachable"); + } + } +} diff --git a/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/PropertyAccessException.java b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/PropertyAccessException.java new file mode 100644 index 000000000..dba60bc73 --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/PropertyAccessException.java @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal.client; + +import org.eclipse.jdt.annotation.NonNullByDefault; + +/** + * The {@link PropertyAccessException} indicates a WebThing property can not be accessed + * + * @author Gregor Roth - Initial contribution + */ +@NonNullByDefault +public class PropertyAccessException extends Exception { + private static final long serialVersionUID = 5177277585758195790L; + + /** + * contructor + * + * @param message the error message + */ + PropertyAccessException(String message) { + super(message); + } + + /** + * contructor + * + * @param message the error message + * @param cause the error cause + */ + PropertyAccessException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/WebSocketConnection.java b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/WebSocketConnection.java new file mode 100644 index 000000000..26293ef43 --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/WebSocketConnection.java @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal.client; + +import java.util.function.BiConsumer; + +import org.eclipse.jdt.annotation.NonNullByDefault; + +/** + * The WebsocketConnection represents an open WebSocket connection on the Web Thing. It provides a realtime mechanism + * to be notified of events as soon as they happen. Refer https://iot.mozilla.org/wot/#web-thing-websocket-api + * + * @author Gregor Roth - Initial contribution + */ +@NonNullByDefault +interface WebSocketConnection { + + /** + * Makes a request for Property value change notifications + * + * @param propertyName the property to be observed + * @param listener the listener to call on changes + */ + void observeProperty(String propertyName, BiConsumer listener); + + /** + * closes the WebSocket connection + */ + void close(); + + /** + * @return true, if connection is alive + */ + boolean isAlive(); +} diff --git a/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/WebSocketConnectionFactory.java b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/WebSocketConnectionFactory.java new file mode 100644 index 000000000..b46ab195b --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/WebSocketConnectionFactory.java @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal.client; + +import java.io.IOException; +import java.net.URI; +import java.time.Duration; +import java.util.concurrent.ScheduledExecutorService; +import java.util.function.Consumer; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jetty.websocket.client.WebSocketClient; + +/** + * Factory to create new instances of a WebSocket connection + * + * @author Gregor Roth - Initial contribution + */ +@NonNullByDefault +interface WebSocketConnectionFactory { + + /** + * create (and opens) a new WebSocket connection + * + * @param webSocketURI the websocket uri + * @param executor the executor to use + * @param errorHandler the error handler + * @param pingPeriod the ping period to check the healthiness of the connection + * @return the newly opened WebSocket connection + * @throws IOException if the web socket connection can not be established + */ + WebSocketConnection create(URI webSocketURI, ScheduledExecutorService executor, Consumer errorHandler, + Duration pingPeriod) throws IOException; + + /** + * @param webSocketClient the web socket client to use + * @return the default instance of the factory + */ + static WebSocketConnectionFactory instance(WebSocketClient webSocketClient) { + return (webSocketURI, executor, errorHandler, pingPeriod) -> { + var webSocketConnection = new WebSocketConnectionImpl(executor, errorHandler, pingPeriod); + webSocketClient.connect(webSocketConnection, webSocketURI); + return webSocketConnection; + }; + } +} diff --git a/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/WebSocketConnectionImpl.java b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/WebSocketConnectionImpl.java new file mode 100644 index 000000000..e491a9e8d --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/WebSocketConnectionImpl.java @@ -0,0 +1,185 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal.client; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.time.Duration; +import java.time.Instant; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.jetty.websocket.api.Session; +import org.eclipse.jetty.websocket.api.WebSocketListener; +import org.eclipse.jetty.websocket.api.WebSocketPingPongListener; +import org.openhab.binding.webthing.internal.client.dto.PropertyStatusMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.Gson; +import com.google.gson.JsonSyntaxException; + +/** + * The WebsocketConnection implementation + * + * @author Gregor Roth - Initial contribution + */ +@NonNullByDefault +public class WebSocketConnectionImpl implements WebSocketConnection, WebSocketListener, WebSocketPingPongListener { + private static final BiConsumer EMPTY_PROPERTY_CHANGED_LISTENER = (String propertyName, + Object value) -> { + }; + private final Logger logger = LoggerFactory.getLogger(WebSocketConnectionImpl.class); + private final Gson gson = new Gson(); + private final Duration pingPeriod; + private final Consumer errorHandler; + private final ScheduledFuture watchDogHandle; + private final ScheduledFuture pingHandle; + private final Map> propertyChangedListeners = new HashMap<>(); + private final AtomicReference lastTimeReceived = new AtomicReference<>(Instant.now()); + private final AtomicReference> sessionRef = new AtomicReference<>(Optional.empty()); + + /** + * constructor + * + * @param executor the executor to use + * @param errorHandler the errorHandler + * @param pingPeriod the period pings should be sent + */ + WebSocketConnectionImpl(ScheduledExecutorService executor, Consumer errorHandler, Duration pingPeriod) { + this.errorHandler = errorHandler; + this.pingPeriod = pingPeriod; + + // send a ping message are x seconds to validate if the connection is not broken + this.pingHandle = executor.scheduleWithFixedDelay(this::sendPing, pingPeriod.dividedBy(2).toMillis(), + pingPeriod.toMillis(), TimeUnit.MILLISECONDS); + + // checks if a message (regular message or pong message) has been received recently. If not, connection is + // seen as broken + this.watchDogHandle = executor.scheduleWithFixedDelay(this::checkConnection, pingPeriod.toMillis(), + pingPeriod.toMillis(), TimeUnit.MILLISECONDS); + } + + @Override + public void close() { + sessionRef.getAndSet(Optional.empty()).ifPresent(Session::close); + watchDogHandle.cancel(true); + pingHandle.cancel(true); + } + + @Override + public void observeProperty(@NonNull String propertyName, @NonNull BiConsumer listener) { + propertyChangedListeners.put(propertyName, listener); + } + + @Override + public void onWebSocketConnect(@Nullable Session session) { + sessionRef.set(Optional.ofNullable(session)); // save websocket session to be able to send ping + } + + @Override + public void onWebSocketPing(@Nullable ByteBuffer payload) { + } + + @Override + public void onWebSocketPong(@Nullable ByteBuffer payload) { + lastTimeReceived.set(Instant.now()); + } + + @Override + public void onWebSocketBinary(byte @Nullable [] payload, int offset, int len) { + } + + @Override + public void onWebSocketText(@Nullable String message) { + try { + if (message != null) { + var propertyStatus = gson.fromJson(message, PropertyStatusMessage.class); + if ((propertyStatus != null) && (propertyStatus.messageType != null) + && (propertyStatus.messageType.equals("propertyStatus"))) { + for (var propertyEntry : propertyStatus.data.entrySet()) { + var listener = propertyChangedListeners.getOrDefault(propertyEntry.getKey(), + EMPTY_PROPERTY_CHANGED_LISTENER); + try { + listener.accept(propertyEntry.getKey(), propertyEntry.getValue()); + } catch (RuntimeException re) { + logger.warn("calling property change listener {} failed. {}", listener, re.getMessage()); + } + } + } else { + logger.debug("Ignoring received message of unknown type: {}", message); + } + } + } catch (JsonSyntaxException se) { + logger.warn("received invalid message: {}", message); + } + } + + @Override + public void onWebSocketClose(int statusCode, @Nullable String reason) { + onWebSocketError(new IOException("websocket closed by peer. " + Optional.ofNullable(reason).orElse(""))); + } + + @Override + public void onWebSocketError(@Nullable Throwable cause) { + var reason = ""; + if (cause != null) { + reason = cause.getMessage(); + } + onError(reason); + } + + private void onError(@Nullable String message) { + if (message == null) { + message = ""; + } + errorHandler.accept(message); + } + + private void sendPing() { + var optionalSession = sessionRef.get(); + if (optionalSession.isPresent()) { + try { + optionalSession.get().getRemote().sendPing(ByteBuffer.wrap(Instant.now().toString().getBytes())); + } catch (IOException e) { + onError("could not send ping " + e.getMessage()); + } + } + } + + @Override + public boolean isAlive() { + var elapsedSinceLastReceived = Duration.between(lastTimeReceived.get(), Instant.now()); + var thresholdOverdued = pingPeriod.multipliedBy(3); + var isOverdued = elapsedSinceLastReceived.toMillis() > thresholdOverdued.toMillis(); + return sessionRef.get().isPresent() && !isOverdued; + } + + private void checkConnection() { + // check if connection is alive (message has been received recently) + if (!isAlive()) { + onError("connection seems to be broken (last message received at " + lastTimeReceived.get() + ", " + + Duration.between(lastTimeReceived.get(), Instant.now()).getSeconds() + " sec ago)"); + } + } +} diff --git a/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/dto/Link.java b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/dto/Link.java new file mode 100644 index 000000000..e4598ace7 --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/dto/Link.java @@ -0,0 +1,25 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal.client.dto; + +/** + * The Web Thing Description Link object. Refer https://iot.mozilla.org/wot/#link-object + * + * @author Gregor Roth - Initial contribution + */ +public class Link { + + public String rel = null; + + public String href = null; +} diff --git a/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/dto/Property.java b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/dto/Property.java new file mode 100644 index 000000000..50420d4fd --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/dto/Property.java @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal.client.dto; + +import java.util.List; + +import com.google.gson.annotations.SerializedName; + +/** + * The Web Thing Description Property object. Refer https://iot.mozilla.org/wot/#property-object + * + * @author Gregor Roth - Initial contribution + */ +public class Property { + + public String title = ""; + + @SerializedName("@type") + public String typeKeyword = ""; + + public String type = "string"; + + public String unit = null; + + public boolean readOnly = false; + + public String description = ""; + + public List links = List.of(); +} diff --git a/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/dto/PropertyStatusMessage.java b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/dto/PropertyStatusMessage.java new file mode 100644 index 000000000..caca178a1 --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/dto/PropertyStatusMessage.java @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal.client.dto; + +import java.util.Map; + +/** + * Web Thing WebSocket API property status message. Refer https://iot.mozilla.org/wot/#propertystatus-message + * + * @author Gregor Roth - Initial contribution + */ +public class PropertyStatusMessage { + + public String messageType = ""; + + public Map data = Map.of(); + + @Override + public String toString() { + return "PropertyStatusMessage{" + "messageType='" + messageType + '\'' + ", data=" + data + '}'; + } +} diff --git a/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/dto/WebThingDescription.java b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/dto/WebThingDescription.java new file mode 100644 index 000000000..e7a45812b --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/client/dto/WebThingDescription.java @@ -0,0 +1,67 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal.client.dto; + +import java.net.URI; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import com.google.gson.annotations.SerializedName; + +/** + * The Web Thing Description. Refer https://iot.mozilla.org/wot/#web-thing-description + * + * @author Gregor Roth - Initial contribution + */ +public class WebThingDescription { + + public String id = null; + + public String title = ""; + + @SerializedName("@context") + public String contextKeyword = ""; + + public Map properties = Map.of(); + + public List links = List.of(); + + /** + * convenience method to read properties + * + * @param propertyName the property name to read + * @return the property value + */ + public Optional getProperty(String propertyName) { + return Optional.ofNullable(properties.get(propertyName)); + } + + /** + * convenience method to read the event stream uri + * + * @return the optional event stream uri + */ + public Optional getEventStreamUri() { + for (var link : this.links) { + var href = link.href; + if ((href != null) && href.startsWith("ws")) { + var rel = Optional.ofNullable(link.rel).orElse(""); + if (rel.equals("alternate")) { + return Optional.of(URI.create(href)); + } + } + } + return Optional.empty(); + } +} diff --git a/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/discovery/WebthingDiscoveryService.java b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/discovery/WebthingDiscoveryService.java new file mode 100644 index 000000000..0e056221e --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/discovery/WebthingDiscoveryService.java @@ -0,0 +1,297 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal.discovery; + +import static org.openhab.binding.webthing.internal.WebThingBindingConstants.MDNS_SERVICE_TYPE; +import static org.openhab.binding.webthing.internal.WebThingBindingConstants.THING_TYPE_UID; + +import java.io.IOException; +import java.net.URI; +import java.time.Duration; +import java.time.Instant; +import java.util.*; +import java.util.concurrent.*; + +import javax.jmdns.ServiceEvent; +import javax.jmdns.ServiceInfo; +import javax.jmdns.ServiceListener; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.openhab.binding.webthing.internal.client.DescriptionLoader; +import org.openhab.core.config.discovery.AbstractDiscoveryService; +import org.openhab.core.config.discovery.DiscoveryResult; +import org.openhab.core.config.discovery.DiscoveryResultBuilder; +import org.openhab.core.config.discovery.DiscoveryService; +import org.openhab.core.io.net.http.HttpClientFactory; +import org.openhab.core.io.transport.mdns.MDNSClient; +import org.openhab.core.scheduler.Scheduler; +import org.openhab.core.thing.ThingTypeUID; +import org.openhab.core.thing.ThingUID; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Deactivate; +import org.osgi.service.component.annotations.Reference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * WebThing discovery service based on mDNS. Refer https://iot.mozilla.org/wot/#web-thing-discovery + * + * @author Gregor Roth - Initial contribution + */ +@NonNullByDefault +@Component(service = DiscoveryService.class, configurationPid = "webthingdiscovery.mdns") +public class WebthingDiscoveryService extends AbstractDiscoveryService implements ServiceListener { + private static final Duration FOREGROUND_SCAN_TIMEOUT = Duration.ofMillis(200); + public static final String ID = "id"; + public static final String SCHEMAS = "schemas"; + public static final String WEB_THING_URI = "webThingURI"; + private final Logger logger = LoggerFactory.getLogger(WebthingDiscoveryService.class); + private final DescriptionLoader descriptionLoader; + private final MDNSClient mdnsClient; + private final List>> runningDiscoveryTasks = new CopyOnWriteArrayList<>(); + + /** + * constructor + * + * @param configProperties the config props + * @param mdnsClient the underlying mDNS client + */ + @Activate + public WebthingDiscoveryService(@Nullable Map configProperties, @Reference MDNSClient mdnsClient, + @Reference Scheduler executor, @Reference HttpClientFactory httpClientFactory) { + super(30); + this.mdnsClient = mdnsClient; + this.descriptionLoader = new DescriptionLoader(httpClientFactory.getCommonHttpClient()); + super.activate(configProperties); + if (isBackgroundDiscoveryEnabled()) { + mdnsClient.addServiceListener(MDNS_SERVICE_TYPE, this); + } + } + + @Override + public Set getSupportedThingTypes() { + return Set.of(THING_TYPE_UID); + } + + @Deactivate + @Override + protected void deactivate() { + super.deactivate(); + mdnsClient.removeServiceListener(MDNS_SERVICE_TYPE, this); + } + + @Override + public void serviceAdded(@NonNullByDefault({}) ServiceEvent serviceEvent) { + considerService(serviceEvent); + } + + @Override + public void serviceResolved(@NonNullByDefault({}) ServiceEvent serviceEvent) { + considerService(serviceEvent); + } + + @Override + public void serviceRemoved(@NonNullByDefault({}) ServiceEvent serviceEvent) { + for (var discoveryResult : discoverWebThing(serviceEvent.getInfo())) { + thingRemoved(discoveryResult.getThingUID()); + } + } + + @Override + protected void startBackgroundDiscovery() { + mdnsClient.addServiceListener(MDNS_SERVICE_TYPE, this); + startScan(true); + } + + @Override + protected void stopBackgroundDiscovery() { + mdnsClient.removeServiceListener(MDNS_SERVICE_TYPE, this); + } + + private void startScan(boolean isBackground) { + scheduler.submit(() -> scan(isBackground)); + } + + @Override + protected void startScan() { + startScan(false); + } + + @Override + protected synchronized void stopScan() { + removeOlderResults(Instant.now().minus(Duration.ofMinutes(10)).toEpochMilli()); + + // stop running discovery tasks + for (var future : runningDiscoveryTasks) { + future.cancel(true); + runningDiscoveryTasks.remove(future); + } + super.stopScan(); + } + + /** + * scans the network via mDNS + * + * @param isBackground true, if is background task + */ + private void scan(boolean isBackground) { + var serviceInfos = isBackground ? mdnsClient.list(MDNS_SERVICE_TYPE) + : mdnsClient.list(MDNS_SERVICE_TYPE, FOREGROUND_SCAN_TIMEOUT); + logger.debug("got {} mDNS entries", serviceInfos.length); + + // create discovery task for each detected service and process these in parallel to increase total + // discovery speed + for (var serviceInfo : serviceInfos) { + var future = scheduler.submit(new DiscoveryTask(serviceInfo)); + runningDiscoveryTasks.add(future); + } + + // wait until all tasks are completed + for (var future : runningDiscoveryTasks) { + try { + future.get(5, TimeUnit.MINUTES); + } catch (InterruptedException | ExecutionException | TimeoutException e) { + logger.warn("discovering task {} terminated", future); + } + runningDiscoveryTasks.remove(future); + } + } + + private class DiscoveryTask implements Callable> { + private final ServiceInfo serviceInfo; + + DiscoveryTask(ServiceInfo serviceInfo) { + this.serviceInfo = serviceInfo; + } + + @Override + public Set call() { + var results = new HashSet(); + for (var discoveryResult : discoverWebThing(serviceInfo)) { + results.add(discoveryResult); + thingDiscovered(discoveryResult); + logger.debug("WebThing '{}' (uri: {}, id: {}, schemas: {}) discovered", discoveryResult.getLabel(), + discoveryResult.getProperties().get(WEB_THING_URI), discoveryResult.getProperties().get(ID), + discoveryResult.getProperties().get(SCHEMAS)); + } + return results; + } + + @Override + public String toString() { + return "DiscoveryTask{" + "serviceInfo=" + serviceInfo + '}'; + } + } + + /** + * convert the serviceInfo result of the mDNS scan to discovery results + * + * @param serviceInfo the service info + * @return the associated discovery result + */ + private Set discoverWebThing(ServiceInfo serviceInfo) { + var discoveryResults = new HashSet(); + + if (serviceInfo.getHostAddresses().length > 0) { + var host = serviceInfo.getHostAddresses()[0]; + var port = serviceInfo.getPort(); + var path = "/"; + if (Collections.list(serviceInfo.getPropertyNames()).contains("path")) { + path = serviceInfo.getPropertyString("path"); + if (!path.endsWith("/")) { + path = path + "/"; + } + } + + // There are two kinds of WebThing endpoints: Endpoints supporting a single WebThing as well as + // endpoints supporting multiple WebThings. + // + // In the routine below the enpoint will be checked for single WebThings first, than for multiple + // WebThings if a ingle WebTHing has not been found. + // Furthermore, first it will be tried to connect the endpoint using https. If this fails, as fallback + // plain http is used. + + // check single WebThing path via https (e.g. https://192.168.0.23:8433/) + var optionalDiscoveryResult = discoverWebThing(toURI(host, port, path, true)); + if (optionalDiscoveryResult.isPresent()) { + discoveryResults.add(optionalDiscoveryResult.get()); + } else { + // check single WebThing path via plain http (e.g. http://192.168.0.23:8433/) + optionalDiscoveryResult = discoverWebThing(toURI(host, port, path, false)); + if (optionalDiscoveryResult.isPresent()) { + discoveryResults.add(optionalDiscoveryResult.get()); + } else { + // check multiple WebThing path via https (e.g. https://192.168.0.23:8433/0, + // https://192.168.0.23:8433/1,...) + outer: for (int i = 0; i < 50; i++) { // search 50 entries at maximum + optionalDiscoveryResult = discoverWebThing(toURI(host, port, path + i + "/", true)); + if (optionalDiscoveryResult.isPresent()) { + discoveryResults.add(optionalDiscoveryResult.get()); + } else if (i == 0) { + // check multiple WebThing path via plain http (e.g. http://192.168.0.23:8433/0, + // http://192.168.0.23:8433/1,...) + for (int j = 0; j < 50; j++) { // search 50 entries at maximum + optionalDiscoveryResult = discoverWebThing(toURI(host, port, path + j + "/", false)); + if (optionalDiscoveryResult.isPresent()) { + discoveryResults.add(optionalDiscoveryResult.get()); + } else { + break outer; + } + } + } else { + break; + } + } + } + } + } + + return discoveryResults; + } + + private Optional discoverWebThing(URI uri) { + try { + var description = descriptionLoader.loadWebthingDescription(uri, Duration.ofSeconds(5)); + + var id = uri.getHost().replaceAll("\\W", "_") + "_" + uri.getPort(); + if (uri.getPath().length() > 1) { + id = id + "_" + uri.getPath().replaceAll("\\W", ""); + } + + var thingUID = new ThingUID(THING_TYPE_UID, id); + Map properties = new HashMap<>(2); + properties.put(ID, id); + properties.put(SCHEMAS, description.contextKeyword); + return Optional.of(DiscoveryResultBuilder.create(thingUID).withThingType(THING_TYPE_UID) + .withProperty(WEB_THING_URI, uri).withLabel(description.title).withProperties(properties) + .withRepresentationProperty(ID).build()); + } catch (IOException ioe) { + return Optional.empty(); + } + } + + private URI toURI(String host, int port, String path, boolean isHttps) { + return isHttps ? URI.create("https://" + host + ":" + port + path) + : URI.create("http://" + host + ":" + port + path); + } + + private void considerService(ServiceEvent serviceEvent) { + if (isBackgroundDiscoveryEnabled()) { + for (var discoveryResult : discoverWebThing(serviceEvent.getInfo())) { + thingDiscovered(discoveryResult); + } + } + } +} diff --git a/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/link/ChannelToPropertyLink.java b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/link/ChannelToPropertyLink.java new file mode 100644 index 000000000..eff672d7a --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/link/ChannelToPropertyLink.java @@ -0,0 +1,84 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal.link; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.openhab.binding.webthing.internal.ChannelHandler; +import org.openhab.binding.webthing.internal.WebThingHandler; +import org.openhab.binding.webthing.internal.client.ConsumedThing; +import org.openhab.binding.webthing.internal.client.PropertyAccessException; +import org.openhab.core.thing.Channel; +import org.openhab.core.thing.ChannelUID; +import org.openhab.core.types.State; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The {@link ChannelToPropertyLink} represents an upstream link from a Channel to a WebThing property. + * This link is used to update a the value of a property + * + * @author Gregor Roth - Initial contribution + */ +@NonNullByDefault +public class ChannelToPropertyLink implements WebThingHandler.ItemChangedListener { + private final Logger logger = LoggerFactory.getLogger(ChannelToPropertyLink.class); + private final String propertyName; + private final String propertyType; + private final ConsumedThing webThing; + private final TypeConverter typeConverter; + + /** + * establish a upstream link from a Channel to a WebThing property + * + * @param channelHandler the channel handler that provides registering an ItemChangedListener + * @param channel the channel to be linked + * @param webthing the WebThing to be linked + * @param propertyName the property name + * @throws UnknownPropertyException if the a WebThing property should be link that does not exist + */ + public static void establish(ChannelHandler channelHandler, Channel channel, ConsumedThing webthing, + String propertyName) throws UnknownPropertyException { + new ChannelToPropertyLink(channelHandler, channel, webthing, propertyName); + } + + private ChannelToPropertyLink(ChannelHandler channelHandler, Channel channel, ConsumedThing webThing, + String propertyName) throws UnknownPropertyException { + this.webThing = webThing; + var optionalProperty = webThing.getThingDescription().getProperty(propertyName); + if (optionalProperty.isPresent()) { + this.propertyType = optionalProperty.get().type; + var acceptedType = channel.getAcceptedItemType(); + if (acceptedType == null) { + this.typeConverter = TypeConverters.create("String", propertyType); + } else { + this.typeConverter = TypeConverters.create(acceptedType, propertyType); + } + this.propertyName = propertyName; + channelHandler.observeChannel(channel.getUID(), this); + } else { + throw new UnknownPropertyException("property " + propertyName + " does not exits"); + } + } + + @Override + public void onItemStateChanged(ChannelUID channelUID, State stateCommand) { + try { + var propertyValue = typeConverter.toPropertyValue(stateCommand); + webThing.writeProperty(propertyName, typeConverter.toPropertyValue((State) stateCommand)); + logger.debug("property {} updated with {} ({}) ", propertyName, propertyValue, this.propertyType); + } catch (PropertyAccessException pae) { + logger.warn("could not write WebThing property {} with new channel value. {}", propertyName, + pae.getMessage()); + } + } +} diff --git a/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/link/PropertyToChannelLink.java b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/link/PropertyToChannelLink.java new file mode 100644 index 000000000..107b5490d --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/link/PropertyToChannelLink.java @@ -0,0 +1,76 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal.link; + +import java.util.function.BiConsumer; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.openhab.binding.webthing.internal.ChannelHandler; +import org.openhab.binding.webthing.internal.client.ConsumedThing; +import org.openhab.core.thing.Channel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The {@link PropertyToChannelLink} represents a downstream link from a WebThing property to a Channel. + * + * @author Gregor Roth - Initial contribution + */ +@NonNullByDefault +public class PropertyToChannelLink implements BiConsumer { + private final Logger logger = LoggerFactory.getLogger(PropertyToChannelLink.class); + private final ChannelHandler channelHandler; + private final Channel channel; + private final TypeConverter typeConverter; + + /** + * establish downstream link from a WebTHing property to a Channel + * + * @param webThing the WebThing to be linked + * @param propertyName the property name + * @param channelHandler the channel handler that provides updating the Item state of a channel + * @param channel the channel to be linked + * @throws UnknownPropertyException if the a WebThing property should be link that does not exist + */ + public static void establish(ConsumedThing webThing, String propertyName, ChannelHandler channelHandler, + Channel channel) throws UnknownPropertyException { + new PropertyToChannelLink(webThing, propertyName, channelHandler, channel); + } + + private PropertyToChannelLink(ConsumedThing webThing, String propertyName, ChannelHandler channelHandler, + Channel channel) throws UnknownPropertyException { + this.channel = channel; + var optionalProperty = webThing.getThingDescription().getProperty(propertyName); + if (optionalProperty.isPresent()) { + var propertyType = optionalProperty.get().type; + var acceptedType = channel.getAcceptedItemType(); + if (acceptedType == null) { + this.typeConverter = TypeConverters.create("String", propertyType); + } else { + this.typeConverter = TypeConverters.create(acceptedType, propertyType); + } + this.channelHandler = channelHandler; + webThing.observeProperty(propertyName, this); + } else { + throw new UnknownPropertyException("property " + propertyName + " does not exits"); + } + } + + @Override + public void accept(String propertyName, Object value) { + var stateCommand = typeConverter.toStateCommand(value); + channelHandler.updateItemState(channel.getUID(), stateCommand); + logger.debug("channel {} updated with {} ({})", channel.getUID().getAsString(), value, + channel.getAcceptedItemType()); + } +} diff --git a/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/link/TypeConverter.java b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/link/TypeConverter.java new file mode 100644 index 000000000..ce00d5599 --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/link/TypeConverter.java @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal.link; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.openhab.core.types.Command; +import org.openhab.core.types.State; + +/** + * The {@link TypeConverter} class map Item state <-> Property value + * + * @author Gregor Roth - Initial contribution + */ +@NonNullByDefault +interface TypeConverter { + + /** + * * maps a Property value to an Item state command + * + * @param propertyValue the Property value + * @return the Item state command + */ + Command toStateCommand(Object propertyValue); + + /** + * maps an Item state to a Property value + * + * @param state the Item state + * @return the Property value + */ + Object toPropertyValue(State state); +} diff --git a/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/link/TypeConverters.java b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/link/TypeConverters.java new file mode 100644 index 000000000..b7665f5fc --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/link/TypeConverters.java @@ -0,0 +1,179 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal.link; + +import java.awt.*; +import java.math.BigDecimal; +import java.util.Collection; +import java.util.Locale; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.openhab.core.library.types.*; +import org.openhab.core.types.Command; +import org.openhab.core.types.State; + +/** + * Helper class to create a TypeConverter + * + * @author Gregor Roth - Initial contribution + */ +@NonNullByDefault +class TypeConverters { + + /** + * create a TypeConverter for a given Item type and property type + * + * @param itemType the item type + * @param propertyType the property type + * @return the type converter + */ + static TypeConverter create(String itemType, String propertyType) { + switch (itemType.toLowerCase(Locale.ENGLISH)) { + case "switch": + return new SwitchTypeConverter(); + case "dimmer": + return new DimmerTypeConverter(); + case "contact": + return new ContactTypeConverter(); + case "color": + return new ColorTypeConverter(); + case "number": + if (propertyType.toLowerCase(Locale.ENGLISH).equals("integer")) { + return new IntegerTypeConverter(); + } else { + return new NumberTypeConverter(); + } + default: + return new StringTypeConverter(); + } + } + + private static boolean toBoolean(Object propertyValue) { + return Boolean.parseBoolean(propertyValue.toString()); + } + + private static BigDecimal toDecimal(Object propertyValue) { + return new BigDecimal(propertyValue.toString()); + } + + private static final class ColorTypeConverter implements TypeConverter { + + @Override + public Command toStateCommand(Object propertyValue) { + var value = propertyValue.toString(); + if (!value.contains("#")) { + value = "#" + value; + } + Color rgb = Color.decode(value); + return HSBType.fromRGB(rgb.getRed(), rgb.getGreen(), rgb.getBlue()); + } + + @Override + public Object toPropertyValue(State state) { + var hsb = ((HSBType) state); + + // Get HSB values + Float hue = hsb.getHue().floatValue(); + Float saturation = hsb.getSaturation().floatValue(); + Float brightness = hsb.getBrightness().floatValue(); + + // Convert HSB to RGB and then to HTML hex + Color rgb = Color.getHSBColor(hue / 360, saturation / 100, brightness / 100); + return String.format("#%02x%02x%02x", rgb.getRed(), rgb.getGreen(), rgb.getBlue()); + } + } + + private static final class SwitchTypeConverter implements TypeConverter { + + @Override + public Command toStateCommand(Object propertyValue) { + return toBoolean(propertyValue) ? OnOffType.ON : OnOffType.OFF; + } + + @Override + public Object toPropertyValue(State state) { + return state == OnOffType.ON; + } + } + + private static final class ContactTypeConverter implements TypeConverter { + + @Override + public Command toStateCommand(Object propertyValue) { + return toBoolean(propertyValue) ? OpenClosedType.OPEN : OpenClosedType.CLOSED; + } + + @Override + public Object toPropertyValue(State state) { + return state == OpenClosedType.OPEN; + } + } + + private static final class DimmerTypeConverter implements TypeConverter { + + @Override + public Command toStateCommand(Object propertyValue) { + return new PercentType(toDecimal(propertyValue)); + } + + @Override + public Object toPropertyValue(State state) { + return ((DecimalType) state).toBigDecimal().intValue(); + } + } + + private static final class NumberTypeConverter implements TypeConverter { + + @Override + public Command toStateCommand(Object propertyValue) { + return new DecimalType(toDecimal(propertyValue)); + } + + @Override + public Object toPropertyValue(State state) { + return ((DecimalType) state).doubleValue(); + } + } + + private static final class IntegerTypeConverter implements TypeConverter { + + @Override + public Command toStateCommand(Object propertyValue) { + return new DecimalType(toDecimal(propertyValue)); + } + + @Override + public Object toPropertyValue(State state) { + return ((DecimalType) state).intValue(); + } + } + + private static final class StringTypeConverter implements TypeConverter { + + @SuppressWarnings("unchecked") + @Override + public Command toStateCommand(Object propertyValue) { + String textValue = propertyValue.toString(); + if (propertyValue instanceof Collection) { + textValue = ((Collection) propertyValue).stream() + .reduce("", (entry1, entry2) -> entry1.toString() + "\n" + entry2.toString()).toString(); + } + return StringType.valueOf(textValue); + } + + @Override + public Object toPropertyValue(State state) { + return state.toString(); + } + } +} diff --git a/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/link/TypeMapping.java b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/link/TypeMapping.java new file mode 100644 index 000000000..945d03622 --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/link/TypeMapping.java @@ -0,0 +1,143 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal.link; + +import java.util.Locale; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.openhab.binding.webthing.internal.client.dto.Property; + +/** + * The {@link TypeMapping} class defines the mapping of Item types <-> WebThing Property types. + * + * Please consider that changes of 'Item types <-> WebThing Property types' mapping will break the + * compatibility to former releases + * + * @author Gregor Roth - Initial contribution + */ +@NonNullByDefault +public class TypeMapping { + + /** + * maps a property type to an item type + * + * @param propertyMetadata the property meta data + * @return the associated item type + */ + public static ItemType toItemType(Property propertyMetadata) { + String type = "string"; + @Nullable + String tag = null; + + switch (propertyMetadata.typeKeyword) { + case "AlarmProperty": + case "BooleanProperty": + case "LeakProperty": + case "LockedProperty": + case "MotionProperty": + case "OnOffProperty": + case "PushedProperty": + type = "switch"; + tag = "Switchable"; + break; + case "CurrentProperty": + case "FrequencyProperty": + case "InstantaneousPowerProperty": + case "VoltageProperty": + type = "number"; + break; + case "HeatingCoolingProperty": + case "ImageProperty": + case "VideoProperty": + type = "string"; + break; + case "BrightnessProperty": + case "HumidityProperty": + type = "dimmer"; + break; + case "ColorModeProperty": + type = "string"; + tag = "lighting"; + break; + case "ColorProperty": + type = "color"; + tag = "Lighting"; + break; + case "ColorTemperatureProperty": + type = "dimmer"; + tag = "Lighting"; + break; + case "OpenProperty": + type = "contact"; + tag = "ContactSensor"; + break; + case "TargetTemperatureProperty": + type = "number"; + tag = "TargetTemperature"; + break; + case "TemperatureProperty": + type = "number"; + tag = "CurrentTemperature"; + break; + case "ThermostatModeProperty": + break; + case "LevelProperty": + if ((propertyMetadata.unit != null) + && propertyMetadata.unit.toLowerCase(Locale.ENGLISH).equals("percent")) { + type = "dimmer"; + } else { + type = "number"; + } + break; + default: + switch (propertyMetadata.type.toLowerCase(Locale.ENGLISH)) { + case "boolean": + type = "switch"; + tag = "Switchable"; + break; + case "integer": + case "number": + type = "number"; + break; + default: + type = "string"; + break; + } + break; + } + + return new ItemType(type, tag); + } + + /** + * The item type description + */ + public static class ItemType { + private final String type; + private final @Nullable String tag; + + ItemType(String type, @Nullable String tag) { + this.type = type; + this.tag = tag; + } + + public String getType() { + return type; + } + + public @Nullable String getTag() { + return tag; + } + } +} diff --git a/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/link/UnknownPropertyException.java b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/link/UnknownPropertyException.java new file mode 100644 index 000000000..ca2128e43 --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/main/java/org/openhab/binding/webthing/internal/link/UnknownPropertyException.java @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal.link; + +import org.eclipse.jdt.annotation.NonNullByDefault; + +/** + * The {@link UnknownPropertyException} indicates addressing a WebThing property that does not exist + * + * @author Gregor Roth - Initial contribution + */ +@NonNullByDefault +public class UnknownPropertyException extends Exception { + private static final long serialVersionUID = -5302763943749264616L; + + /** + * contructor + * + * @param message the error message + */ + UnknownPropertyException(String message) { + super(message); + } +} diff --git a/bundles/org.openhab.binding.webthing/src/main/resources/OH-INF/binding/binding.xml b/bundles/org.openhab.binding.webthing/src/main/resources/OH-INF/binding/binding.xml new file mode 100644 index 000000000..ca5f51919 --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/main/resources/OH-INF/binding/binding.xml @@ -0,0 +1,8 @@ + + + + WebThing Binding + The WebThing binding supports an interface to remote devices implementing the Web Thing API. + diff --git a/bundles/org.openhab.binding.webthing/src/main/resources/OH-INF/thing/thing-types.xml b/bundles/org.openhab.binding.webthing/src/main/resources/OH-INF/thing/thing-types.xml new file mode 100644 index 000000000..3458f13b4 --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/main/resources/OH-INF/thing/thing-types.xml @@ -0,0 +1,60 @@ + + + + + + The WebThing to be connected + + + + url + + The URI of the WebThing to be connected. E.g. the URI of a web-connected MotionSensor or a URI of a + web-connected Display + + + + + + + + Number + + Number channel for Webthing Binding + + + + String + + String channel for Webthing Binding + + + + Contact + + Contact channel for Webthing Binding + + + + Switch + + Switch channel for Webthing Binding + + + + Color + + Color channel for Webthing Binding + + + + Dimmer + + Dimmer channel for Webthing Binding + + + + diff --git a/bundles/org.openhab.binding.webthing/src/test/java/org/openhab/binding/webthing/internal/client/DescriptionTest.java b/bundles/org.openhab.binding.webthing/src/test/java/org/openhab/binding/webthing/internal/client/DescriptionTest.java new file mode 100644 index 000000000..eb7cff09e --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/test/java/org/openhab/binding/webthing/internal/client/DescriptionTest.java @@ -0,0 +1,60 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal.client; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.net.URI; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.time.Duration; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.junit.jupiter.api.Test; + +/** + * + * + * @author Gregor Roth - Initial contribution + */ +@NonNullByDefault +public class DescriptionTest { + + @Test + public void testDescriptionEventStreamUri() throws Exception { + var httpClient = mock(org.eclipse.jetty.client.HttpClient.class); + var request = Mocks.mockRequest(null, load("/awning_response.json")); + when(httpClient.newRequest(URI.create("http://example.org:8090"))).thenReturn(request); + + var loader = new DescriptionLoader(httpClient); + var description = loader.loadWebthingDescription(URI.create("http://example.org:8090"), Duration.ofSeconds(2)); + assertEquals("ws://192.168.4.12:9040/0", description.getEventStreamUri().get().toString()); + } + + @Test + public void testDescriptionEventStreamUriServerlaAlternateParts() throws Exception { + var httpClient = mock(org.eclipse.jetty.client.HttpClient.class); + var request = Mocks.mockRequest(null, load("/virtual-things_response.json")); + when(httpClient.newRequest(URI.create("http://example.org:8090"))).thenReturn(request); + + var loader = new DescriptionLoader(httpClient); + var description = loader.loadWebthingDescription(URI.create("http://example.org:8090"), Duration.ofSeconds(2)); + assertEquals("ws://webthings/things/virtual-things-7", description.getEventStreamUri().get().toString()); + } + + public static String load(String name) throws Exception { + return new String(Files.readAllBytes(Paths.get(WebthingTest.class.getResource(name).toURI()))); + } +} diff --git a/bundles/org.openhab.binding.webthing/src/test/java/org/openhab/binding/webthing/internal/client/Mocks.java b/bundles/org.openhab.binding.webthing/src/test/java/org/openhab/binding/webthing/internal/client/Mocks.java new file mode 100644 index 000000000..92f386167 --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/test/java/org/openhab/binding/webthing/internal/client/Mocks.java @@ -0,0 +1,78 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal.client; + +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.util.concurrent.*; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.jetty.client.api.ContentProvider; +import org.eclipse.jetty.client.api.ContentResponse; +import org.eclipse.jetty.client.api.Request; + +/** + * Mock helper + * + * @author Gregor Roth - Initial contribution + */ +@NonNullByDefault +public class Mocks { + + public static Request mockRequest(@Nullable String requestContent, String responseContent) throws Exception { + return mockRequest(requestContent, responseContent, 200, 200); + } + + public static Request mockRequest(@Nullable String requestContent, String responseContent, int getResponse, + int postResponse) throws Exception { + var request = mock(Request.class); + + // GET request -> request.timeout(30, TimeUnit.SECONDS).send(); + var getRequest = mock(Request.class); + var getContentResponse = mock(ContentResponse.class); + when(getContentResponse.getStatus()).thenReturn(getResponse); + when(getContentResponse.getContentAsString()).thenReturn(responseContent); + when(getRequest.send()).thenReturn(getContentResponse); + when(getRequest.accept("application/json")).thenReturn(getRequest); + when(request.timeout(30, TimeUnit.SECONDS)).thenReturn(getRequest); + + // POST request -> request.method("PUT").content(new StringContentProvider(json)).timeout(30, + // TimeUnit.SECONDS).send(); + if (requestContent != null) { + var postRequest = mock(Request.class); + when(postRequest.content(argThat((ContentProvider content) -> bufToString(content).equals(requestContent)), + eq("application/json"))).thenReturn(postRequest); + when(postRequest.timeout(30, TimeUnit.SECONDS)).thenReturn(postRequest); + + var postContentResponse = mock(ContentResponse.class); + when(postContentResponse.getStatus()).thenReturn(postResponse); + when(postRequest.send()).thenReturn(postContentResponse); + when(request.method("PUT")).thenReturn(postRequest); + } + return request; + } + + private static String bufToString(Iterable data) { + var result = ""; + for (var byteBuffer : data) { + result += StandardCharsets.UTF_8.decode(byteBuffer).toString(); + } + return result; + } +} diff --git a/bundles/org.openhab.binding.webthing/src/test/java/org/openhab/binding/webthing/internal/client/WebthingTest.java b/bundles/org.openhab.binding.webthing/src/test/java/org/openhab/binding/webthing/internal/client/WebthingTest.java new file mode 100644 index 000000000..8d7699e73 --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/test/java/org/openhab/binding/webthing/internal/client/WebthingTest.java @@ -0,0 +1,501 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal.client; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.URI; +import java.net.http.WebSocket; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.time.Duration; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.jetty.client.HttpClient; +import org.eclipse.jetty.websocket.api.BatchMode; +import org.eclipse.jetty.websocket.api.CloseStatus; +import org.eclipse.jetty.websocket.api.RemoteEndpoint; +import org.eclipse.jetty.websocket.api.Session; +import org.eclipse.jetty.websocket.api.SuspendToken; +import org.eclipse.jetty.websocket.api.UpgradeRequest; +import org.eclipse.jetty.websocket.api.UpgradeResponse; +import org.eclipse.jetty.websocket.api.WebSocketListener; +import org.eclipse.jetty.websocket.api.WebSocketPingPongListener; +import org.eclipse.jetty.websocket.api.WebSocketPolicy; +import org.eclipse.jetty.websocket.api.WriteCallback; +import org.junit.jupiter.api.Test; +import org.openhab.binding.webthing.internal.client.dto.PropertyStatusMessage; + +import com.google.gson.Gson; + +/** + * + * + * @author Gregor Roth - Initial contribution + */ +@NonNullByDefault +public class WebthingTest { + private static final Gson GSON = new Gson(); + + @Test + public void testWebthingDescription() throws Exception { + var httpClient = mock(org.eclipse.jetty.client.HttpClient.class); + var request = Mocks.mockRequest(null, load("/windsensor_response.json")); + when(httpClient.newRequest(URI.create("http://example.org:8090"))).thenReturn(request); + + var request2 = Mocks.mockRequest(null, load("/windsensor_property.json")); + when(httpClient.newRequest(URI.create("http://example.org:8090/properties/windspeed"))).thenReturn(request2); + + var webthing = createTestWebthing("http://example.org:8090", httpClient); + var metadata = webthing.getThingDescription(); + assertEquals("Wind", metadata.title); + } + + @Test + public void testWebthingDescriptionUnsetSchema() throws Exception { + var httpClient = mock(org.eclipse.jetty.client.HttpClient.class); + var request = Mocks.mockRequest(null, load("/unsetschema_response.json")); + when(httpClient.newRequest(URI.create("http://example.org:8090"))).thenReturn(request); + + var request2 = Mocks.mockRequest(null, load("/windsensor_property.json")); + when(httpClient.newRequest(URI.create("http://example.org:8090/properties/windspeed"))).thenReturn(request2); + + var webthing = createTestWebthing("http://example.org:8090", httpClient); + var metadata = webthing.getThingDescription(); + assertEquals("Wind", metadata.title); + } + + @Test + public void testWebthingDescriptionUNsupportedSchema() throws Exception { + var httpClient = mock(org.eclipse.jetty.client.HttpClient.class); + var request = Mocks.mockRequest(null, load("/unknownschema_response.json")); + when(httpClient.newRequest(URI.create("http://example.org:8090"))).thenReturn(request); + + try { + createTestWebthing("http://example.org:8090", httpClient); + fail(); + } catch (IOException e) { + assertEquals( + "unsupported schema (@context parameter) https://www.w3.org/2019/wot/td/v1 (Supported schemas are https://webthings.io/schemas and https://iot.mozilla.org/schemas)", + e.getMessage()); + } + } + + @Test + public void testReadReadOnlyProperty() throws Exception { + var httpClient = mock(org.eclipse.jetty.client.HttpClient.class); + var request = Mocks.mockRequest(null, load("/windsensor_response.json")); + when(httpClient.newRequest(URI.create("http://example.org:8090"))).thenReturn(request); + + var request2 = Mocks.mockRequest(null, load("/windsensor_property.json")); + when(httpClient.newRequest(URI.create("http://example.org:8090/properties/windspeed"))).thenReturn(request2); + + var webthing = createTestWebthing("http://example.org:8090", httpClient); + + assertEquals(34.0, webthing.readProperty("windspeed")); + try { + webthing.writeProperty("windspeed", 23.0); + fail(); + } catch (PropertyAccessException e) { + assertEquals( + "could not write windspeed (http://example.org:8090/properties/windspeed) with 23.0. Property is readOnly", + e.getMessage()); + } + } + + @Test + public void testReadPropertyTest() throws Exception { + var httpClient = mock(org.eclipse.jetty.client.HttpClient.class); + var request = Mocks.mockRequest(null, load("/awning_response.json")); + when(httpClient.newRequest(URI.create("http://example.org:8090/0"))).thenReturn(request); + + var request2 = Mocks.mockRequest(null, load("/awning_property.json")); + when(httpClient.newRequest(URI.create("http://example.org:8090/0/properties/target_position"))) + .thenReturn(request2); + + var webthing = createTestWebthing("http://example.org:8090/0", httpClient); + + assertEquals(85.0, webthing.readProperty("target_position")); + } + + @Test + public void testWriteProperty() throws Exception { + var httpClient = mock(org.eclipse.jetty.client.HttpClient.class); + var request = Mocks.mockRequest(null, load("/awning_response.json")); + when(httpClient.newRequest(URI.create("http://example.org:8090/0"))).thenReturn(request); + + var request2 = Mocks.mockRequest("{\"target_position\":10}", load("/awning_property.json")); + when(httpClient.newRequest(URI.create("http://example.org:8090/0/properties/target_position"))) + .thenReturn(request2); + + var webthing = createTestWebthing("http://example.org:8090/0", httpClient); + webthing.writeProperty("target_position", 10); + } + + @Test + public void testWritePropertyError() throws Exception { + var httpClient = mock(org.eclipse.jetty.client.HttpClient.class); + var request = Mocks.mockRequest(null, load("/awning_response.json")); + when(httpClient.newRequest(URI.create("http://example.org:8090/0"))).thenReturn(request); + + var request2 = Mocks.mockRequest("{\"target_position\":10}", load("/awning_property.json"), 200, 400); + when(httpClient.newRequest(URI.create("http://example.org:8090/0/properties/target_position"))) + .thenReturn(request2); + + var webthing = createTestWebthing("http://example.org:8090/0", httpClient); + try { + webthing.writeProperty("target_position", 10); + fail(); + } catch (PropertyAccessException e) { + assertEquals( + "could not write target_position (http://example.org:8090/0/properties/target_position) with 10", + e.getMessage()); + } + } + + @Test + public void testReadPropertyError() throws Exception { + var httpClient = mock(org.eclipse.jetty.client.HttpClient.class); + var request = Mocks.mockRequest(null, load("/windsensor_response.json")); + when(httpClient.newRequest(URI.create("http://example.org:8090"))).thenReturn(request); + + var request2 = Mocks.mockRequest(null, load("/windsensor_response.json"), 500, 200); + when(httpClient.newRequest(URI.create("http://example.org:8090/properties/windspeed"))).thenReturn(request2); + + var webthing = createTestWebthing("http://example.org:8090", httpClient); + try { + webthing.readProperty("windspeed"); + fail(); + } catch (PropertyAccessException e) { + assertEquals("could not read windspeed (http://example.org:8090/properties/windspeed)", e.getMessage()); + } + } + + @Test + public void testWebSocket() throws Exception { + var httpClient = mock(org.eclipse.jetty.client.HttpClient.class); + var request = Mocks.mockRequest(null, load("/awning_response.json")); + when(httpClient.newRequest(URI.create("http://example.org:8090/0"))).thenReturn(request); + + var request2 = Mocks.mockRequest(null, load("/awning_property.json")); + when(httpClient.newRequest(URI.create("http://example.org:8090/0/properties/target_position"))) + .thenReturn(request2); + + var errorHandler = new ErrorHandler(); + var webSocketFactory = new TestWebsocketConnectionFactory(); + var webthing = createTestWebthing("http://example.org:8090/0", httpClient, errorHandler, webSocketFactory); + + var propertyChangedListenerImpl = new PropertyChangedListenerImpl(); + webthing.observeProperty("target_position", propertyChangedListenerImpl); + + var webSocketServerSide = webSocketFactory.webSocketRef.get(); + var message = new PropertyStatusMessage(); + message.messageType = "propertyStatus"; + message.data = Map.of("target_position", 33); + webSocketServerSide.sendToClient(message); + + while (propertyChangedListenerImpl.valueRef.get() == null) { + try { + Thread.sleep(100); + } catch (InterruptedException ignore) { + } + } + assertEquals(33.0, propertyChangedListenerImpl.valueRef.get()); + + webSocketServerSide.sendCloseToClient(); + assertEquals("websocket closed by peer. ", errorHandler.errorRef.get()); + } + + @Test + public void testWebSocketReceiveTimout() throws Exception { + var httpClient = mock(org.eclipse.jetty.client.HttpClient.class); + var request = Mocks.mockRequest(null, load("/awning_response.json")); + when(httpClient.newRequest(URI.create("http://example.org:8090/0"))).thenReturn(request); + + var request2 = Mocks.mockRequest(null, load("/awning_property.json")); + when(httpClient.newRequest(URI.create("http://example.org:8090/0/properties/target_position"))) + .thenReturn(request2); + + var errorHandler = new ErrorHandler(); + var webSocketFactory = new TestWebsocketConnectionFactory(); + var pingPeriod = Duration.ofMillis(300); + var webthing = createTestWebthing("http://example.org:8090/0", httpClient, errorHandler, webSocketFactory, + pingPeriod); + + var propertyChangedListenerImpl = new PropertyChangedListenerImpl(); + webthing.observeProperty("target_position", propertyChangedListenerImpl); + webSocketFactory.webSocketRef.get().ignorePing.set(true); + + try { + Thread.sleep(pingPeriod.dividedBy(2).toMillis()); + } catch (InterruptedException ignore) { + } + assertNull(errorHandler.errorRef.get()); + + try { + Thread.sleep(pingPeriod.multipliedBy(4).toMillis()); + } catch (InterruptedException ignore) { + } + assertTrue(errorHandler.errorRef.get().startsWith("connection seems to be broken (last message received at")); + } + + public static String load(String name) throws Exception { + return new String(Files.readAllBytes(Paths.get(WebthingTest.class.getResource(name).toURI()))); + } + + public static ConsumedThingImpl createTestWebthing(String uri, HttpClient httpClient) throws IOException { + return createTestWebthing(uri, httpClient, (String) -> { + }, new TestWebsocketConnectionFactory()); + } + + public static ConsumedThingImpl createTestWebthing(String uri, HttpClient httpClient, Consumer errorHandler, + WebSocketConnectionFactory websocketConnectionFactory, Duration pingPeriod) throws IOException { + return new ConsumedThingImpl(httpClient, URI.create(uri), Executors.newSingleThreadScheduledExecutor(), + errorHandler, websocketConnectionFactory, pingPeriod); + } + + public static ConsumedThingImpl createTestWebthing(String uri, HttpClient httpClient, Consumer errorHandler, + WebSocketConnectionFactory websocketConnectionFactory) throws IOException { + return createTestWebthing(uri, httpClient, errorHandler, websocketConnectionFactory, Duration.ofSeconds(100)); + } + + public static class TestWebsocketConnectionFactory implements WebSocketConnectionFactory { + public final AtomicReference webSocketRef = new AtomicReference<>(); + + @Override + public WebSocketConnection create(@NonNull URI webSocketURI, @NonNull ScheduledExecutorService executor, + @NonNull Consumer errorHandler, @NonNull Duration pingPeriod) { + var webSocketConnection = new WebSocketConnectionImpl(executor, errorHandler, pingPeriod); + var webSocket = new WebSocketImpl(webSocketConnection); + webSocketRef.set(webSocket); + webSocketConnection.onWebSocketConnect(webSocket); + return webSocketConnection; + } + } + + public static final class WebSocketImpl implements Session { + private final WebSocketListener listener; + private final WebSocketPingPongListener pongListener; + public AtomicBoolean ignorePing = new AtomicBoolean(false); + + WebSocketImpl(WebSocketConnectionImpl connection) { + this.listener = connection; + this.pongListener = connection; + } + + @Override + public void close() { + } + + @Override + public void close(@Nullable CloseStatus closeStatus) { + } + + @Override + public void close(int statusCode, @Nullable String reason) { + } + + @Override + public void disconnect() throws IOException { + } + + @Override + public long getIdleTimeout() { + return 0; + } + + @Override + public InetSocketAddress getLocalAddress() { + return InetSocketAddress.createUnresolved("test", 23); + } + + @Override + public WebSocketPolicy getPolicy() { + return WebSocketPolicy.newClientPolicy(); + } + + @Override + public String getProtocolVersion() { + return "1"; + } + + @Override + public RemoteEndpoint getRemote() { + return new RemoteEndpoint() { + @Override + public void sendBytes(@Nullable ByteBuffer data) throws IOException { + } + + @Override + public Future sendBytesByFuture(@Nullable ByteBuffer data) { + throw new UnsupportedOperationException(); + } + + @Override + public void sendBytes(@Nullable ByteBuffer data, @Nullable WriteCallback callback) { + } + + @Override + public void sendPartialBytes(@Nullable ByteBuffer fragment, boolean isLast) throws IOException { + } + + @Override + public void sendPartialString(@Nullable String fragment, boolean isLast) throws IOException { + } + + @Override + public void sendPing(@Nullable ByteBuffer applicationData) throws IOException { + if (!ignorePing.get()) { + pongListener.onWebSocketPong(applicationData); + } + } + + @Override + public void sendPong(@Nullable ByteBuffer applicationData) throws IOException { + } + + @Override + public void sendString(@Nullable String text) throws IOException { + } + + @Override + public Future sendStringByFuture(@Nullable String text) { + throw new UnsupportedOperationException(); + } + + @Override + public void sendString(@Nullable String text, @Nullable WriteCallback callback) { + } + + @Override + public BatchMode getBatchMode() { + return BatchMode.AUTO; + } + + @Override + public void setBatchMode(@Nullable BatchMode mode) { + } + + @Override + public InetSocketAddress getInetSocketAddress() { + throw new UnsupportedOperationException(); + } + + @Override + public void flush() throws IOException { + } + + @Override + public int getMaxOutgoingFrames() { + return 0; + } + + @Override + public void setMaxOutgoingFrames(int maxOutgoingFrames) { + } + }; + } + + @Override + public InetSocketAddress getRemoteAddress() { + return InetSocketAddress.createUnresolved("test", 12); + } + + @Override + public UpgradeRequest getUpgradeRequest() { + throw new UnsupportedOperationException(); + } + + @Override + public UpgradeResponse getUpgradeResponse() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isOpen() { + return false; + } + + @Override + public boolean isSecure() { + return false; + } + + @Override + public void setIdleTimeout(long ms) { + } + + @Override + public SuspendToken suspend() { + return new SuspendToken() { + + @Override + public void resume() { + } + }; + } + + public void sendToClient(PropertyStatusMessage message) { + var data = GSON.toJson(message); + listener.onWebSocketText(data); + } + + public void sendCloseToClient() { + listener.onWebSocketClose(200, ""); + } + + public CompletableFuture sendPing(String message) { + if (!ignorePing.get()) { + var bytes = message.getBytes(StandardCharsets.UTF_8); + listener.onWebSocketBinary(bytes, 0, bytes.length); + } + return CompletableFuture.completedFuture(null); + } + } + + private static final class PropertyChangedListenerImpl implements BiConsumer { + public final AtomicReference propertyNameRef = new AtomicReference<>(); + public final AtomicReference valueRef = new AtomicReference<>(); + + @Override + public void accept(String propertyName, Object value) { + propertyNameRef.set(propertyName); + valueRef.set(value); + } + } + + public static class ErrorHandler implements Consumer { + public final AtomicReference errorRef = new AtomicReference<>(); + + @Override + public void accept(String error) { + errorRef.set(error); + } + } +} diff --git a/bundles/org.openhab.binding.webthing/src/test/java/org/openhab/binding/webthing/internal/link/TypeConverterTest.java b/bundles/org.openhab.binding.webthing/src/test/java/org/openhab/binding/webthing/internal/link/TypeConverterTest.java new file mode 100644 index 000000000..20f94c191 --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/test/java/org/openhab/binding/webthing/internal/link/TypeConverterTest.java @@ -0,0 +1,58 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal.link; + +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assumptions.*; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.junit.jupiter.api.Test; +import org.openhab.core.library.types.DecimalType; +import org.openhab.core.library.types.StringType; +import org.openhab.core.types.State; + +/** + * + * @author Gregor Roth - Initial contribution + */ +@NonNullByDefault +public class TypeConverterTest { + + @Test + public void testStringType() throws Exception { + var typeConverter = TypeConverters.create("String", "String"); + var state = typeConverter.toStateCommand("motion"); + assumeTrue(state instanceof StringType); + assertEquals("motion", typeConverter.toPropertyValue((State) state)); + } + + @Test + public void testNumberType() throws Exception { + var typeConverter = TypeConverters.create("Number", "Number"); + var state = typeConverter.toStateCommand(45.6); + assumeTrue(state instanceof DecimalType); + assertEquals(45.6, typeConverter.toPropertyValue((State) state)); + } + + @Test + public void testNumberIntegerType() throws Exception { + var typeConverter = TypeConverters.create("Number", "Integer"); + var state = typeConverter.toStateCommand(45); + assumeTrue(state instanceof DecimalType); + assertEquals(45, typeConverter.toPropertyValue((State) state)); + + state = typeConverter.toStateCommand(45.2); + assumeTrue(state instanceof DecimalType); + assertEquals(45, typeConverter.toPropertyValue((State) state)); + } +} diff --git a/bundles/org.openhab.binding.webthing/src/test/java/org/openhab/binding/webthing/internal/link/WebthingChannelLinkTest.java b/bundles/org.openhab.binding.webthing/src/test/java/org/openhab/binding/webthing/internal/link/WebthingChannelLinkTest.java new file mode 100644 index 000000000..cbdd63497 --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/test/java/org/openhab/binding/webthing/internal/link/WebthingChannelLinkTest.java @@ -0,0 +1,206 @@ +/** + * Copyright (c) 2010-2021 Contributors to the openHAB project + * + * See the NOTICE file(s) distributed with this work for additional + * information. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.openhab.binding.webthing.internal.link; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.net.URI; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; + +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.junit.jupiter.api.Test; +import org.openhab.binding.webthing.internal.ChannelHandler; +import org.openhab.binding.webthing.internal.channel.Channels; +import org.openhab.binding.webthing.internal.client.Mocks; +import org.openhab.binding.webthing.internal.client.WebthingTest; +import org.openhab.binding.webthing.internal.client.dto.PropertyStatusMessage; +import org.openhab.core.library.types.*; +import org.openhab.core.thing.*; +import org.openhab.core.types.Command; +import org.openhab.core.types.State; + +import com.google.gson.Gson; + +/** + * Mapping test. + * + * Please consider that changes of 'ItemType<->PropertyType mapping' validated by this test + * will break the compatibility to former releases. + * + * @author Gregor Roth - Initial contribution + */ +@NonNullByDefault +public class WebthingChannelLinkTest { + private final Gson gson = new Gson(); + + @Test + public void testChannelToProperty() throws Exception { + var httpClient = mock(org.eclipse.jetty.client.HttpClient.class); + var request = Mocks.mockRequest(null, load("/awning_response.json")); + when(httpClient.newRequest(URI.create("http://example.org:8090/0"))).thenReturn(request); + + var request2 = Mocks.mockRequest("{\"target_position\":10}", load("/awning_property.json")); + when(httpClient.newRequest(URI.create("http://example.org:8090/0/properties/target_position"))) + .thenReturn(request2); + + var thingUID = new ThingUID("webthing", "anwing"); + var channelUID = Channels.createChannelUID(thingUID, "target_position"); + + var webthing = WebthingTest.createTestWebthing("http://example.org:8090/0", httpClient); + var channel = Channels.createChannel(thingUID, "target_position", + Objects.requireNonNull(webthing.getPropertyDescription("target_position"))); + + var testWebthingThingHandler = new TestWebthingThingHandler(); + ChannelToPropertyLink.establish(testWebthingThingHandler, channel, webthing, "target_position"); + + testWebthingThingHandler.listeners.get(channelUID).onItemStateChanged(channelUID, new DecimalType(10)); + } + + @Test + public void testChannelToPropertyServerError() throws Exception { + var httpClient = mock(org.eclipse.jetty.client.HttpClient.class); + var request = Mocks.mockRequest(null, load("/awning_response.json")); + when(httpClient.newRequest(URI.create("http://example.org:8090/0"))).thenReturn(request); + + var request2 = Mocks.mockRequest("{\"target_position\":130}", load("/awning_property.json"), 200, 500); + when(httpClient.newRequest(URI.create("http://example.org:8090/0/properties/target_position"))) + .thenReturn(request2); + + var thingUID = new ThingUID("webthing", "anwing"); + var channelUID = Channels.createChannelUID(thingUID, "target_position"); + + var webthing = WebthingTest.createTestWebthing("http://example.org:8090/0", httpClient); + var channel = Channels.createChannel(thingUID, "target_position", + Objects.requireNonNull(webthing.getPropertyDescription("target_position"))); + + var testWebthingThingHandler = new TestWebthingThingHandler(); + ChannelToPropertyLink.establish(testWebthingThingHandler, channel, webthing, "target_position"); + + testWebthingThingHandler.listeners.get(channelUID).onItemStateChanged(channelUID, new DecimalType(130)); + } + + @Test + public void testPropertyToChannel() throws Exception { + var httpClient = mock(org.eclipse.jetty.client.HttpClient.class); + var request = Mocks.mockRequest(null, load("/awning_response.json")); + when(httpClient.newRequest(URI.create("http://example.org:8090/0"))).thenReturn(request); + + var request2 = Mocks.mockRequest("{\"target_position\":10}", load("/awning_property.json")); + when(httpClient.newRequest(URI.create("http://example.org:8090/0/properties/target_position"))) + .thenReturn(request2); + + var thingUID = new ThingUID("webthing", "anwing"); + var channelUID = Channels.createChannelUID(thingUID, "target_position"); + + var errorHandler = new WebthingTest.ErrorHandler(); + var websocketConnectionFactory = new WebthingTest.TestWebsocketConnectionFactory(); + var webthing = WebthingTest.createTestWebthing("http://example.org:8090/0", httpClient, errorHandler, + websocketConnectionFactory); + var channel = Channels.createChannel(thingUID, "target_position", + Objects.requireNonNull(webthing.getPropertyDescription("target_position"))); + + var testWebthingThingHandler = new TestWebthingThingHandler(); + PropertyToChannelLink.establish(webthing, "target_position", testWebthingThingHandler, channel); + + var message = new PropertyStatusMessage(); + message.messageType = "propertyStatus"; + message.data = Map.of("target_position", 77); + websocketConnectionFactory.webSocketRef.get().sendToClient(message); + + assertEquals(new DecimalType(77), testWebthingThingHandler.itemState.get(channelUID)); + } + + @Test + public void testDataTypeMapping() throws Exception { + performDataTypeMappingTest("level_prop", 56.5, new DecimalType(56.5), 3.5, new DecimalType(3.5)); + performDataTypeMappingTest("level_unit_prop", 10, new PercentType(10), 90, new PercentType(90)); + performDataTypeMappingTest("thermo_prop", "off", new StringType("off"), "auto", new StringType("auto")); + performDataTypeMappingTest("temp_prop", 18.6, new DecimalType(18.6), 23.2, new DecimalType(23.2)); + performDataTypeMappingTest("targettemp_prop", 18.6, new DecimalType(18.6), 23.2, new DecimalType(23.2)); + performDataTypeMappingTest("open_prop", true, OpenClosedType.OPEN, false, OpenClosedType.CLOSED); + performDataTypeMappingTest("colortemp_prop", 10, new PercentType(10), 60, new PercentType(60)); + performDataTypeMappingTest("color_prop", "#f2fe00", new HSBType("62,100,99"), "#ff0000", + new HSBType("0.0,100.0,100.0")); + performDataTypeMappingTest("colormode_prop", "color", new StringType("color"), "temperature", + new StringType("temperature")); + performDataTypeMappingTest("brightness_prop", 33, new PercentType(33), 65, new PercentType(65)); + performDataTypeMappingTest("voltage_prop", 4.5, new DecimalType(4.5), 30.2, new DecimalType(30.2)); + performDataTypeMappingTest("heating_prop", "off", new StringType("off"), "cooling", new StringType("cooling")); + performDataTypeMappingTest("onoff_prop", true, OnOffType.ON, false, OnOffType.OFF); + performDataTypeMappingTest("string_prop", "initial", new StringType("initial"), "updated", + new StringType("updated")); + performDataTypeMappingTest("number_prop", 80.5, new DecimalType(80.5), 60.9, new DecimalType(60.9)); + performDataTypeMappingTest("integer_prop", 11, new DecimalType(11), 77, new DecimalType(77)); + performDataTypeMappingTest("boolean_prop", true, OnOffType.ON, false, OnOffType.OFF); + } + + private void performDataTypeMappingTest(String propertyName, Object initialValue, State initialState, + Object updatedValue, State updatedState) throws Exception { + var httpClient = mock(org.eclipse.jetty.client.HttpClient.class); + var request = Mocks.mockRequest(null, load("/datatypes_test_response.json")); + when(httpClient.newRequest(URI.create("http://example.org:8090/"))).thenReturn(request); + + var request2 = Mocks.mockRequest(gson.toJson(Map.of(propertyName, updatedValue)), + gson.toJson(Map.of(propertyName, initialValue))); + when(httpClient.newRequest(URI.create("http://example.org:8090/properties/" + propertyName))) + .thenReturn(request2); + + var thingUID = new ThingUID("webthing", "test"); + var channelUID = Channels.createChannelUID(thingUID, propertyName); + + var errorHandler = new WebthingTest.ErrorHandler(); + var websocketConnectionFactory = new WebthingTest.TestWebsocketConnectionFactory(); + var webthing = WebthingTest.createTestWebthing("http://example.org:8090/", httpClient, errorHandler, + websocketConnectionFactory); + var channel = Channels.createChannel(thingUID, propertyName, + Objects.requireNonNull(webthing.getPropertyDescription(propertyName))); + + var testWebthingThingHandler = new TestWebthingThingHandler(); + + PropertyToChannelLink.establish(webthing, propertyName, testWebthingThingHandler, channel); + + var message = new PropertyStatusMessage(); + message.messageType = "propertyStatus"; + message.data = Map.of(propertyName, initialValue); + websocketConnectionFactory.webSocketRef.get().sendToClient(message); + + assertEquals(initialState, testWebthingThingHandler.itemState.get(channelUID)); + + ChannelToPropertyLink.establish(testWebthingThingHandler, channel, webthing, propertyName); + testWebthingThingHandler.listeners.get(channelUID).onItemStateChanged(channelUID, updatedState); + } + + public static String load(String name) throws Exception { + return new String(Files.readAllBytes(Paths.get(WebthingTest.class.getResource(name).toURI()))); + } + + private static class TestWebthingThingHandler implements ChannelHandler { + public final Map listeners = new ConcurrentHashMap<>(); + public final Map itemState = new ConcurrentHashMap<>(); + + @Override + public void observeChannel(ChannelUID channelUID, ItemChangedListener listener) { + listeners.put(channelUID, listener); + } + + @Override + public void updateItemState(ChannelUID channelUID, Command command) { + itemState.put(channelUID, command); + } + } +} diff --git a/bundles/org.openhab.binding.webthing/src/test/resources/awning_array_response.json b/bundles/org.openhab.binding.webthing/src/test/resources/awning_array_response.json new file mode 100644 index 000000000..b33a07237 --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/test/resources/awning_array_response.json @@ -0,0 +1,394 @@ +[ + { + "id":"urn:dev:ops:anwing-TB6612FNG", + "title":"Awning lane1", + "@context":"https://iot.mozilla.org/schemas", + "properties":{ + "target_position":{ + "@type":"LevelProperty", + "title":"awning lane1 target position", + "type":"integer", + "minimum":0, + "maximum":100, + "description":"awning lane1 target position", + "links":[ + { + "rel":"property", + "href":"/0/properties/target_position" + } + ] + }, + "current_position":{ + "@type":"LevelProperty", + "title":"awning lane1 current position", + "type":"integer", + "minimum":0, + "maximum":100, + "readOnly":true, + "description":"awning lane1 current position", + "links":[ + { + "rel":"property", + "href":"/0/properties/current_position" + } + ] + }, + "retracting":{ + "@type":"BooleanProperty", + "title":"lane1 is retracting", + "type":"boolean", + "readOnly":true, + "description":"lane1 is retracting", + "links":[ + { + "rel":"property", + "href":"/0/properties/retracting" + } + ] + }, + "extending":{ + "@type":"BooleanProperty", + "title":"lane1 is extending", + "type":"boolean", + "readOnly":true, + "description":"lane1 is extending", + "links":[ + { + "rel":"property", + "href":"/0/properties/extending" + } + ] + } + }, + "actions":{ + + }, + "events":{ + + }, + "links":[ + { + "rel":"properties", + "href":"/0/properties" + }, + { + "rel":"actions", + "href":"/0/actions" + }, + { + "rel":"events", + "href":"/0/events" + }, + { + "rel":"alternate", + "href":"ws://192.168.4.12:9040/0" + } + ], + "description":"A web connected patio awnings controller on Raspberry Pi", + "@type":[ + "MultiLevelSensor" + ], + "href":"/0", + "base":"http://192.168.4.12:9040/0", + "securityDefinitions":{ + "nosec_sc":{ + "scheme":"nosec" + } + }, + "security":"nosec_sc" + }, + { + "id":"urn:dev:ops:anwing-TB6612FNG", + "title":"Awning lane2", + "@context":"https://iot.mozilla.org/schemas", + "properties":{ + "target_position":{ + "@type":"LevelProperty", + "title":"awning lane2 target position", + "type":"integer", + "minimum":0, + "maximum":100, + "description":"awning lane2 target position", + "links":[ + { + "rel":"property", + "href":"/1/properties/target_position" + } + ] + }, + "current_position":{ + "@type":"LevelProperty", + "title":"awning lane2 current position", + "type":"integer", + "minimum":0, + "maximum":100, + "readOnly":true, + "description":"awning lane2 current position", + "links":[ + { + "rel":"property", + "href":"/1/properties/current_position" + } + ] + }, + "retracting":{ + "@type":"BooleanProperty", + "title":"lane2 is retracting", + "type":"boolean", + "readOnly":true, + "description":"lane2 is retracting", + "links":[ + { + "rel":"property", + "href":"/1/properties/retracting" + } + ] + }, + "extending":{ + "@type":"BooleanProperty", + "title":"lane2 is extending", + "type":"boolean", + "readOnly":true, + "description":"lane2 is extending", + "links":[ + { + "rel":"property", + "href":"/1/properties/extending" + } + ] + } + }, + "actions":{ + + }, + "events":{ + + }, + "links":[ + { + "rel":"properties", + "href":"/1/properties" + }, + { + "rel":"actions", + "href":"/1/actions" + }, + { + "rel":"events", + "href":"/1/events" + }, + { + "rel":"alternate", + "href":"ws://192.168.4.12:9040/1" + } + ], + "description":"A web connected patio awnings controller on Raspberry Pi", + "@type":[ + "MultiLevelSensor" + ], + "href":"/1", + "base":"http://192.168.4.12:9040/1", + "securityDefinitions":{ + "nosec_sc":{ + "scheme":"nosec" + } + }, + "security":"nosec_sc" + }, + { + "id":"urn:dev:ops:anwing-TB6612FNG", + "title":"Awning lane3", + "@context":"https://iot.mozilla.org/schemas", + "properties":{ + "target_position":{ + "@type":"LevelProperty", + "title":"awning lane3 target position", + "type":"integer", + "minimum":0, + "maximum":100, + "description":"awning lane3 target position", + "links":[ + { + "rel":"property", + "href":"/2/properties/target_position" + } + ] + }, + "current_position":{ + "@type":"LevelProperty", + "title":"awning lane3 current position", + "type":"integer", + "minimum":0, + "maximum":100, + "readOnly":true, + "description":"awning lane3 current position", + "links":[ + { + "rel":"property", + "href":"/2/properties/current_position" + } + ] + }, + "retracting":{ + "@type":"BooleanProperty", + "title":"lane3 is retracting", + "type":"boolean", + "readOnly":true, + "description":"lane3 is retracting", + "links":[ + { + "rel":"property", + "href":"/2/properties/retracting" + } + ] + }, + "extending":{ + "@type":"BooleanProperty", + "title":"lane3 is extending", + "type":"boolean", + "readOnly":true, + "description":"lane3 is extending", + "links":[ + { + "rel":"property", + "href":"/2/properties/extending" + } + ] + } + }, + "actions":{ + + }, + "events":{ + + }, + "links":[ + { + "rel":"properties", + "href":"/2/properties" + }, + { + "rel":"actions", + "href":"/2/actions" + }, + { + "rel":"events", + "href":"/2/events" + }, + { + "rel":"alternate", + "href":"ws://192.168.4.12:9040/2" + } + ], + "description":"A web connected patio awnings controller on Raspberry Pi", + "@type":[ + "MultiLevelSensor" + ], + "href":"/2", + "base":"http://192.168.4.12:9040/2", + "securityDefinitions":{ + "nosec_sc":{ + "scheme":"nosec" + } + }, + "security":"nosec_sc" + }, + { + "id":"urn:dev:ops:anwing-TB6612FNG", + "title":"Awning lane4", + "@context":"https://iot.mozilla.org/schemas", + "properties":{ + "target_position":{ + "@type":"LevelProperty", + "title":"awning lane4 target position", + "type":"integer", + "minimum":0, + "maximum":100, + "description":"awning lane4 target position", + "links":[ + { + "rel":"property", + "href":"/3/properties/target_position" + } + ] + }, + "current_position":{ + "@type":"LevelProperty", + "title":"awning lane4 current position", + "type":"integer", + "minimum":0, + "maximum":100, + "readOnly":true, + "description":"awning lane4 current position", + "links":[ + { + "rel":"property", + "href":"/3/properties/current_position" + } + ] + }, + "retracting":{ + "@type":"BooleanProperty", + "title":"lane4 is retracting", + "type":"boolean", + "readOnly":true, + "description":"lane4 is retracting", + "links":[ + { + "rel":"property", + "href":"/3/properties/retracting" + } + ] + }, + "extending":{ + "@type":"BooleanProperty", + "title":"lane4 is extending", + "type":"boolean", + "readOnly":true, + "description":"lane4 is extending", + "links":[ + { + "rel":"property", + "href":"/3/properties/extending" + } + ] + } + }, + "actions":{ + + }, + "events":{ + + }, + "links":[ + { + "rel":"properties", + "href":"/3/properties" + }, + { + "rel":"actions", + "href":"/3/actions" + }, + { + "rel":"events", + "href":"/3/events" + }, + { + "rel":"alternate", + "href":"ws://192.168.4.12:9040/3" + } + ], + "description":"A web connected patio awnings controller on Raspberry Pi", + "@type":[ + "MultiLevelSensor" + ], + "href":"/3", + "base":"http://192.168.4.12:9040/3", + "securityDefinitions":{ + "nosec_sc":{ + "scheme":"nosec" + } + }, + "security":"nosec_sc" + } +] \ No newline at end of file diff --git a/bundles/org.openhab.binding.webthing/src/test/resources/awning_property.json b/bundles/org.openhab.binding.webthing/src/test/resources/awning_property.json new file mode 100644 index 000000000..b6d1c4bfb --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/test/resources/awning_property.json @@ -0,0 +1 @@ +{"target_position":85} \ No newline at end of file diff --git a/bundles/org.openhab.binding.webthing/src/test/resources/awning_response.json b/bundles/org.openhab.binding.webthing/src/test/resources/awning_response.json new file mode 100644 index 000000000..3a95d46fe --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/test/resources/awning_response.json @@ -0,0 +1,98 @@ +{ + "id":"urn:dev:ops:anwing-TB6612FNG", + "title":"Awning lane1", + "@context":"https://webthings.io/schemas", + "properties":{ + "target_position":{ + "@type":"LevelProperty", + "title":"awning lane1 target position", + "type":"integer", + "minimum":0, + "maximum":100, + "description":"awning lane1 target position", + "links":[ + { + "rel":"property", + "href":"/0/properties/target_position" + } + ] + }, + "current_position":{ + "@type":"LevelProperty", + "title":"awning lane1 current position", + "type":"integer", + "minimum":0, + "maximum":100, + "readOnly":true, + "description":"awning lane1 current position", + "links":[ + { + "rel":"property", + "href":"/0/properties/current_position" + } + ] + }, + "retracting":{ + "@type":"BooleanProperty", + "title":"lane1 is retracting", + "type":"boolean", + "readOnly":true, + "description":"lane1 is retracting", + "links":[ + { + "rel":"property", + "href":"/0/properties/retracting" + } + ] + }, + "extending":{ + "@type":"BooleanProperty", + "title":"lane1 is extending", + "type":"boolean", + "readOnly":true, + "description":"lane1 is extending", + "links":[ + { + "rel":"property", + "href":"/0/properties/extending" + } + ] + } + }, + "actions":{ + + }, + "events":{ + + }, + "links":[ + { + "rel":"properties", + "href":"/0/properties" + }, + { + "rel":"actions", + "href":"/0/actions" + }, + { + "rel":"events", + "href":"/0/events" + }, + { + "rel":"alternate", + "href":"ws://192.168.4.12:9040/0" + } + ], + "description":"A web connected patio awnings controller on Raspberry Pi", + "@type":[ + "MultiLevelSensor" + ], + "href":"/0", + "base":"http://192.168.4.12:9040/0", + "securityDefinitions":{ + "nosec_sc":{ + "scheme":"nosec" + } + }, + "security":"nosec_sc" +} \ No newline at end of file diff --git a/bundles/org.openhab.binding.webthing/src/test/resources/datatypes_test_response.json b/bundles/org.openhab.binding.webthing/src/test/resources/datatypes_test_response.json new file mode 100644 index 000000000..95402b26c --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/test/resources/datatypes_test_response.json @@ -0,0 +1,209 @@ +{ + "id":"urn:dev:ops:test-1", + "title":"Test Device", + "@context":"https://iot.mozilla.org/schemas", + "properties":{ + "number_prop":{ + "type":"number", + "links":[ + { + "rel":"property", + "href":"/properties/number_prop" + } + ] + }, + "integer_prop":{ + "type":"integer", + "links":[ + { + "rel":"property", + "href":"/properties/integer_prop" + } + ] + }, + "string_prop":{ + "type":"string", + "links":[ + { + "rel":"property", + "href":"/properties/string_prop" + } + ] + }, + "boolean_prop":{ + "type":"boolean", + "links":[ + { + "rel":"property", + "href":"/properties/boolean_prop" + } + ] + }, + "onoff_prop":{ + "@type": "OnOffProperty", + "type":"boolean", + "links":[ + { + "rel":"property", + "href":"/properties/onoff_prop" + } + ] + }, + "heating_prop":{ + "@type": "HeatingCoolingProperty", + "type":"string", + "links":[ + { + "rel":"property", + "href":"/properties/heating_prop" + } + ] + }, + "voltage_prop":{ + "@type": "VoltageProperty", + "type":"number", + "links":[ + { + "rel":"property", + "href":"/properties/voltage_prop" + } + ] + }, + "brightness_prop":{ + "@type": "BrightnessProperty", + "type":"number", + "links":[ + { + "rel":"property", + "href":"/properties/brightness_prop" + } + ] + }, + "colormode_prop":{ + "@type": "ColorModeProperty", + "type":"string", + "links":[ + { + "rel":"property", + "href":"/properties/colormode_prop" + } + ] + }, + "colortemp_prop":{ + "@type": "ColorTemperatureProperty", + "type":"integer", + "links":[ + { + "rel":"property", + "href":"/properties/colortemp_prop" + } + ] + }, + "color_prop":{ + "@type": "ColorProperty", + "type":"string", + "links":[ + { + "rel":"property", + "href":"/properties/color_prop" + } + ] + }, + "open_prop":{ + "@type": "OpenProperty", + "type":"boolean", + "links":[ + { + "rel":"property", + "href":"/properties/open_prop" + } + ] + }, + "targettemp_prop":{ + "@type": "TargetTemperatureProperty", + "type":"number", + "links":[ + { + "rel":"property", + "href":"/properties/targettemp_prop" + } + ] + }, + "temp_prop":{ + "@type": "TemperatureProperty", + "type":"number", + "links":[ + { + "rel":"property", + "href":"/properties/temp_prop" + } + ] + }, + "thermo_prop":{ + "@type": "ThermostatModeProperty", + "type":"string", + "links":[ + { + "rel":"property", + "href":"/properties/thermo_prop" + } + ] + }, + "level_unit_prop":{ + "@type": "LevelProperty", + "type":"number", + "unit": "percent", + "links":[ + { + "rel":"property", + "href":"/properties/level_unit_prop" + } + ] + }, + "level_prop":{ + "@type": "LevelProperty", + "type":"number", + "links":[ + { + "rel":"property", + "href":"/properties/level_prop" + } + ] + } + }, + "actions":{ + + }, + "events":{ + + }, + "links":[ + { + "rel":"properties", + "href":"/properties" + }, + { + "rel":"actions", + "href":"/actions" + }, + { + "rel":"events", + "href":"/events" + }, + { + "rel":"alternate", + "href":"ws://192.168.0.23:9060/" + } + ], + "description":"test", + "@type":[ + "MultiLevelSensor" + ], + "base":"http://192.168.0.23:9060/", + "securityDefinitions":{ + "nosec_sc":{ + "scheme":"nosec" + } + }, + "security":"nosec_sc" +} \ No newline at end of file diff --git a/bundles/org.openhab.binding.webthing/src/test/resources/number_prop.json b/bundles/org.openhab.binding.webthing/src/test/resources/number_prop.json new file mode 100644 index 000000000..8ad0cc117 --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/test/resources/number_prop.json @@ -0,0 +1 @@ +{"number_prop":80.5} \ No newline at end of file diff --git a/bundles/org.openhab.binding.webthing/src/test/resources/unknownschema_response.json b/bundles/org.openhab.binding.webthing/src/test/resources/unknownschema_response.json new file mode 100644 index 000000000..8ed08e7ae --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/test/resources/unknownschema_response.json @@ -0,0 +1,98 @@ +{ + "id":"urn:dev:ops:anwing-TB6612FNG", + "title":"Awning lane1", + "@context":"https://www.w3.org/2019/wot/td/v1", + "properties":{ + "target_position":{ + "@type":"LevelProperty", + "title":"awning lane1 target position", + "type":"integer", + "minimum":0, + "maximum":100, + "description":"awning lane1 target position", + "links":[ + { + "rel":"property", + "href":"/0/properties/target_position" + } + ] + }, + "current_position":{ + "@type":"LevelProperty", + "title":"awning lane1 current position", + "type":"integer", + "minimum":0, + "maximum":100, + "readOnly":true, + "description":"awning lane1 current position", + "links":[ + { + "rel":"property", + "href":"/0/properties/current_position" + } + ] + }, + "retracting":{ + "@type":"BooleanProperty", + "title":"lane1 is retracting", + "type":"boolean", + "readOnly":true, + "description":"lane1 is retracting", + "links":[ + { + "rel":"property", + "href":"/0/properties/retracting" + } + ] + }, + "extending":{ + "@type":"BooleanProperty", + "title":"lane1 is extending", + "type":"boolean", + "readOnly":true, + "description":"lane1 is extending", + "links":[ + { + "rel":"property", + "href":"/0/properties/extending" + } + ] + } + }, + "actions":{ + + }, + "events":{ + + }, + "links":[ + { + "rel":"properties", + "href":"/0/properties" + }, + { + "rel":"actions", + "href":"/0/actions" + }, + { + "rel":"events", + "href":"/0/events" + }, + { + "rel":"alternate", + "href":"ws://192.168.4.12:9040/0" + } + ], + "description":"A web connected patio awnings controller on Raspberry Pi", + "@type":[ + "MultiLevelSensor" + ], + "href":"/0", + "base":"http://192.168.4.12:9040/0", + "securityDefinitions":{ + "nosec_sc":{ + "scheme":"nosec" + } + }, + "security":"nosec_sc" +} \ No newline at end of file diff --git a/bundles/org.openhab.binding.webthing/src/test/resources/unsetschema_response.json b/bundles/org.openhab.binding.webthing/src/test/resources/unsetschema_response.json new file mode 100644 index 000000000..82e15c206 --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/test/resources/unsetschema_response.json @@ -0,0 +1,55 @@ +{ + "id":"urn:dev:ops:eltakowsSensor-1", + "title":"Wind", + "properties":{ + "windspeed":{ + "@type":"LevelProperty", + "title":"Windspeed", + "type":"number", + "description":"The current windspeed", + "unit":"km/h", + "readOnly":true, + "links":[ + { + "rel":"property", + "href":"/properties/windspeed" + } + ] + } + }, + "actions":{ + + }, + "events":{ + + }, + "links":[ + { + "rel":"properties", + "href":"/properties" + }, + { + "rel":"actions", + "href":"/actions" + }, + { + "rel":"events", + "href":"/events" + }, + { + "rel":"alternate", + "href":"ws://192.168.0.23:9060/" + } + ], + "description":"A web connected Eltako windsensor measuring wind speed on Raspberry Pi", + "@type":[ + "MultiLevelSensor" + ], + "base":"http://192.168.0.23:9060/", + "securityDefinitions":{ + "nosec_sc":{ + "scheme":"nosec" + } + }, + "security":"nosec_sc" +} \ No newline at end of file diff --git a/bundles/org.openhab.binding.webthing/src/test/resources/virtual-things_response.json b/bundles/org.openhab.binding.webthing/src/test/resources/virtual-things_response.json new file mode 100644 index 000000000..6f070827e --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/test/resources/virtual-things_response.json @@ -0,0 +1,75 @@ +{ + "title":"Virtual On/Off Light", + "@context":"https://iot.mozilla.org/schemas", + "@type":[ + "OnOffSwitch", + "Light" + ], + "description":"", + "href":"/things/virtual-things-7", + "properties":{ + "on":{ + "name":"on", + "value":false, + "visible":true, + "title":"On/Off", + "type":"boolean", + "@type":"OnOffProperty", + "links":[ + { + "rel":"property", + "href":"/things/virtual-things-7/properties/on" + } + ] + } + }, + "actions":{ + + }, + "events":{ + + }, + "links":[ + { + "rel":"properties", + "href":"/things/virtual-things-7/properties" + }, + { + "rel":"actions", + "href":"/things/virtual-things-7/actions" + }, + { + "rel":"events", + "href":"/things/virtual-things-7/events" + }, + { + "rel":"alternate", + "mediaType":"text/html", + "href":"/things/virtual-things-7" + }, + { + "rel":"alternate", + "href":"ws://webthings/things/virtual-things-7" + } + ], + "layoutIndex":0, + "selectedCapability":"Light", + "iconHref":null, + "id":"http://webthings/things/virtual-things-7", + "base":"http://webthings/", + "securityDefinitions":{ + "oauth2_sc":{ + "scheme":"oauth2", + "flow":"code", + "authorization":"http://webthings/oauth/authorize", + "token":"http://webthings/oauth/token", + "scopes":[ + "/things/virtual-things-7:readwrite", + "/things/virtual-things-7", + "/things:readwrite", + "/things" + ] + } + }, + "security":"oauth2_sc" +} \ No newline at end of file diff --git a/bundles/org.openhab.binding.webthing/src/test/resources/windsensor_property.json b/bundles/org.openhab.binding.webthing/src/test/resources/windsensor_property.json new file mode 100644 index 000000000..2d3f0f994 --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/test/resources/windsensor_property.json @@ -0,0 +1,3 @@ +{ + "windspeed":34 +} \ No newline at end of file diff --git a/bundles/org.openhab.binding.webthing/src/test/resources/windsensor_response.json b/bundles/org.openhab.binding.webthing/src/test/resources/windsensor_response.json new file mode 100644 index 000000000..4dfdc5f5c --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/test/resources/windsensor_response.json @@ -0,0 +1,56 @@ +{ + "id":"urn:dev:ops:eltakowsSensor-1", + "title":"Wind", + "@context":"https://iot.mozilla.org/schemas/", + "properties":{ + "windspeed":{ + "@type":"LevelProperty", + "title":"Windspeed", + "type":"number", + "description":"The current windspeed", + "unit":"km/h", + "readOnly":true, + "links":[ + { + "rel":"property", + "href":"/properties/windspeed" + } + ] + } + }, + "actions":{ + + }, + "events":{ + + }, + "links":[ + { + "rel":"properties", + "href":"/properties" + }, + { + "rel":"actions", + "href":"/actions" + }, + { + "rel":"events", + "href":"/events" + }, + { + "rel":"alternate", + "href":"ws://192.168.0.23:9060/" + } + ], + "description":"A web connected Eltako windsensor measuring wind speed on Raspberry Pi", + "@type":[ + "MultiLevelSensor" + ], + "base":"http://192.168.0.23:9060/", + "securityDefinitions":{ + "nosec_sc":{ + "scheme":"nosec" + } + }, + "security":"nosec_sc" +} \ No newline at end of file diff --git a/bundles/org.openhab.binding.webthing/src/test/resources/windsensor_response_without_websocketuri.json b/bundles/org.openhab.binding.webthing/src/test/resources/windsensor_response_without_websocketuri.json new file mode 100644 index 000000000..ea909d03b --- /dev/null +++ b/bundles/org.openhab.binding.webthing/src/test/resources/windsensor_response_without_websocketuri.json @@ -0,0 +1,52 @@ +{ + "id":"urn:dev:ops:eltakowsSensor-1", + "title":"Wind", + "@context":"https://iot.mozilla.org/schemas", + "properties":{ + "windspeed":{ + "@type":"LevelProperty", + "title":"Windspeed", + "type":"number", + "description":"The current windspeed", + "unit":"km/h", + "readOnly":true, + "links":[ + { + "rel":"property", + "href":"/properties/windspeed" + } + ] + } + }, + "actions":{ + + }, + "events":{ + + }, + "links":[ + { + "rel":"properties", + "href":"/properties" + }, + { + "rel":"actions", + "href":"/actions" + }, + { + "rel":"events", + "href":"/events" + } + ], + "description":"A web connected Eltako windsensor measuring wind speed on Raspberry Pi", + "@type":[ + "MultiLevelSensor" + ], + "base":"http://192.168.0.23:9060/", + "securityDefinitions":{ + "nosec_sc":{ + "scheme":"nosec" + } + }, + "security":"nosec_sc" +} \ No newline at end of file diff --git a/bundles/pom.xml b/bundles/pom.xml index 7e6b4fd55..bb91aa1cd 100644 --- a/bundles/pom.xml +++ b/bundles/pom.xml @@ -326,6 +326,7 @@ org.openhab.binding.volvooncall org.openhab.binding.weathercompany org.openhab.binding.weatherunderground + org.openhab.binding.webthing org.openhab.binding.wemo org.openhab.binding.wifiled org.openhab.binding.windcentrale