From 4d88144b2883afccbe766711b0970910659278dc Mon Sep 17 00:00:00 2001 From: jundi zhou <92794317+jundizhou@users.noreply.github.com> Date: Mon, 27 Jun 2022 18:23:17 +0800 Subject: [PATCH] update: use cgo instead of uds (#264) * init probe for cgo Signed-off-by: sangyangji * add cgo receiver Signed-off-by: jundizhou * convert the cgo event to the KindlingEvent Signed-off-by: Daxin Wang * using a channel to store the events Signed-off-by: Daxin Wang * update: use cgo instead of uds Signed-off-by: jundizhou * gracefully shutdown the cgoreceiver Signed-off-by: Daxin Wang * remove the probe binary Signed-off-by: Daxin Wang * remove the udsreceiver since there are some code errors Signed-off-by: Daxin Wang * add periodSeconds to the readiness probe Signed-off-by: Daxin Wang * fix deploy files issues Signed-off-by: Daxin Wang Co-authored-by: sangyangji Co-authored-by: Daxin Wang --- collector/application/application.go | 11 +- collector/docker/Dockerfile | 9 +- collector/docker/DockerfileLocalProbe | 12 + .../docker/kindling-collector-config.yml | 56 +- .../docker/kindling-probe-loader | 2 +- collector/docker/libso/libzmq.so.5 | Bin 1078880 -> 0 bytes collector/docker/start.sh | 8 + collector/go.sum | 3 + collector/model/kindling_event.go | 517 ++ collector/model/kindling_event.pb.go | 895 ---- collector/model/kindling_event.proto | 159 - collector/model/kindling_event_helper.go | 9 +- collector/model/kindling_event_helper_test.go | 9 +- collector/receiver/cgoreceiver/cgo_func.h | 57 + collector/receiver/cgoreceiver/cgoreceiver.go | 204 + collector/receiver/udsreceiver/metrics.go | 113 - .../receiver/udsreceiver/metrics_test.go | 190 - collector/receiver/udsreceiver/udsreceiver.go | 242 - .../receiver/udsreceiver/udsreceiver_test.go | 39 - deploy/agent/kindling-deploy.yml | 75 +- deploy/scripts/build.sh | 23 + {probe => deploy}/scripts/run_docker.sh | 5 +- probe/.bazelrc | 220 - probe/.gitignore | 5 - probe/BUILD.bazel | 0 probe/CMakeLists.txt | 70 + probe/COPYING | 203 - probe/NOTICES | 28 - probe/README.md | 22 - probe/WORKSPACE | 167 - probe/bazel/BUILD.bazel | 62 - probe/bazel/external/llvm.BUILD | 123 - probe/bazel/get_workspace_status.sh | 72 - probe/bazel/kindling_probes.bzl | 9 - .../modules/agent-libs-repo/CMakeLists.txt | 15 + probe/cmake/modules/agent-libs.cmake | 75 + probe/coding_conventions.md | 278 -- probe/docker/BUILD.bazel | 11 - probe/docker/Dockerfile | 19 - probe/docker/docker-entrypoint.sh | 9 - probe/docker/gdb_print.sh | 11 - probe/docker/post_start.sh | 5 - probe/go_deps.bzl | 4211 ----------------- probe/scripts/run_docker_bpf_daemon.sh | 13 - probe/src/CMakeLists.txt | 19 + probe/src/cgo/cgo_func.cpp | 20 + probe/src/cgo/cgo_func.h | 18 + probe/src/cgo/kindling.cpp | 497 ++ probe/src/cgo/kindling.h | 404 ++ probe/src/probe/BUILD.bazel | 97 - probe/src/probe/catch_sig.cpp | 78 - probe/src/probe/catch_sig.h | 8 - probe/src/probe/converter/BUILD.bazel | 38 - probe/src/probe/converter/converter.cpp | 37 - probe/src/probe/converter/converter.h | 24 - .../src/probe/converter/kindling_event.proto | 159 - .../src/probe/converter/sysdig_converter.cpp | 378 -- probe/src/probe/converter/sysdig_converter.h | 32 - probe/src/probe/main.cpp | 179 - probe/src/probe/publisher/BUILD.bazel | 43 - probe/src/probe/publisher/defination.h | 316 -- probe/src/probe/publisher/publisher.cpp | 237 - probe/src/probe/publisher/publisher.h | 75 - probe/src/probe/publisher/subscribe.proto | 14 - probe/src/probe/standalone/BUILD.bazel | 56 - probe/src/probe/standalone/README.md | 2 - probe/src/probe/standalone/standalone.cc | 133 - probe/src/probe/utils/BUILD.bazel | 24 - probe/src/probe/utils/shared_unordered_map.h | 135 - probe/src/probe/utils/termination_handler.h | 46 - probe/third_party/BUILD.bazel | 71 - 71 files changed, 2013 insertions(+), 9393 deletions(-) create mode 100644 collector/docker/DockerfileLocalProbe rename {probe => collector}/docker/kindling-probe-loader (98%) delete mode 100755 collector/docker/libso/libzmq.so.5 create mode 100644 collector/docker/start.sh create mode 100644 collector/model/kindling_event.go delete mode 100644 collector/model/kindling_event.pb.go delete mode 100644 collector/model/kindling_event.proto create mode 100644 collector/receiver/cgoreceiver/cgo_func.h create mode 100644 collector/receiver/cgoreceiver/cgoreceiver.go delete mode 100644 collector/receiver/udsreceiver/metrics.go delete mode 100644 collector/receiver/udsreceiver/metrics_test.go delete mode 100644 collector/receiver/udsreceiver/udsreceiver.go delete mode 100644 collector/receiver/udsreceiver/udsreceiver_test.go create mode 100644 deploy/scripts/build.sh rename {probe => deploy}/scripts/run_docker.sh (88%) delete mode 100644 probe/.bazelrc delete mode 100644 probe/.gitignore delete mode 100644 probe/BUILD.bazel create mode 100644 probe/CMakeLists.txt delete mode 100644 probe/COPYING delete mode 100644 probe/NOTICES delete mode 100644 probe/README.md delete mode 100644 probe/WORKSPACE delete mode 100644 probe/bazel/BUILD.bazel delete mode 100644 probe/bazel/external/llvm.BUILD delete mode 100755 probe/bazel/get_workspace_status.sh delete mode 100644 probe/bazel/kindling_probes.bzl create mode 100644 probe/cmake/modules/agent-libs-repo/CMakeLists.txt create mode 100644 probe/cmake/modules/agent-libs.cmake delete mode 100644 probe/coding_conventions.md delete mode 100644 probe/docker/BUILD.bazel delete mode 100644 probe/docker/Dockerfile delete mode 100644 probe/docker/docker-entrypoint.sh delete mode 100755 probe/docker/gdb_print.sh delete mode 100644 probe/docker/post_start.sh delete mode 100644 probe/go_deps.bzl delete mode 100755 probe/scripts/run_docker_bpf_daemon.sh create mode 100644 probe/src/CMakeLists.txt create mode 100644 probe/src/cgo/cgo_func.cpp create mode 100644 probe/src/cgo/cgo_func.h create mode 100644 probe/src/cgo/kindling.cpp create mode 100644 probe/src/cgo/kindling.h delete mode 100644 probe/src/probe/BUILD.bazel delete mode 100644 probe/src/probe/catch_sig.cpp delete mode 100644 probe/src/probe/catch_sig.h delete mode 100644 probe/src/probe/converter/BUILD.bazel delete mode 100644 probe/src/probe/converter/converter.cpp delete mode 100644 probe/src/probe/converter/converter.h delete mode 100644 probe/src/probe/converter/kindling_event.proto delete mode 100644 probe/src/probe/converter/sysdig_converter.cpp delete mode 100644 probe/src/probe/converter/sysdig_converter.h delete mode 100644 probe/src/probe/main.cpp delete mode 100644 probe/src/probe/publisher/BUILD.bazel delete mode 100644 probe/src/probe/publisher/defination.h delete mode 100644 probe/src/probe/publisher/publisher.cpp delete mode 100644 probe/src/probe/publisher/publisher.h delete mode 100644 probe/src/probe/publisher/subscribe.proto delete mode 100644 probe/src/probe/standalone/BUILD.bazel delete mode 100644 probe/src/probe/standalone/README.md delete mode 100644 probe/src/probe/standalone/standalone.cc delete mode 100644 probe/src/probe/utils/BUILD.bazel delete mode 100644 probe/src/probe/utils/shared_unordered_map.h delete mode 100644 probe/src/probe/utils/termination_handler.h delete mode 100644 probe/third_party/BUILD.bazel diff --git a/collector/application/application.go b/collector/application/application.go index cc3ae987e..7a1a79891 100644 --- a/collector/application/application.go +++ b/collector/application/application.go @@ -16,7 +16,7 @@ import ( "github.com/Kindling-project/kindling/collector/consumer/processor/aggregateprocessor" "github.com/Kindling-project/kindling/collector/consumer/processor/k8sprocessor" "github.com/Kindling-project/kindling/collector/receiver" - "github.com/Kindling-project/kindling/collector/receiver/udsreceiver" + "github.com/Kindling-project/kindling/collector/receiver/cgoreceiver" "github.com/spf13/viper" "go.uber.org/multierr" ) @@ -73,7 +73,7 @@ func initFlags() error { } func (a *Application) registerFactory() { - a.componentsFactory.RegisterReceiver(udsreceiver.Uds, udsreceiver.NewUdsReceiver, &udsreceiver.Config{}) + a.componentsFactory.RegisterReceiver(cgoreceiver.Cgo, cgoreceiver.NewCgoReceiver, &cgoreceiver.Config{}) a.componentsFactory.RegisterAnalyzer(network.Network.String(), network.NewNetworkAnalyzer, &network.Config{}) a.componentsFactory.RegisterProcessor(k8sprocessor.K8sMetadata, k8sprocessor.NewKubernetesProcessor, &k8sprocessor.DefaultConfig) a.componentsFactory.RegisterExporter(otelexporter.Otel, otelexporter.NewExporter, &otelexporter.Config{}) @@ -130,8 +130,9 @@ func (a *Application) buildPipeline() error { return fmt.Errorf("error happened while creating analyzer manager: %w", err) } a.analyzerManager = analyzerManager - udsReceiverFactory := a.componentsFactory.Receivers[udsreceiver.Uds] - udsReceiver := udsReceiverFactory.NewFunc(udsReceiverFactory.Config, a.telemetry.Telemetry, analyzerManager) - a.receiver = udsReceiver + + cgoReceiverFactory := a.componentsFactory.Receivers[cgoreceiver.Cgo] + cgoReceiver := cgoReceiverFactory.NewFunc(cgoReceiverFactory.Config, a.telemetry.Telemetry, analyzerManager) + a.receiver = cgoReceiver return nil } diff --git a/collector/docker/Dockerfile b/collector/docker/Dockerfile index 0504d59ed..e42513037 100644 --- a/collector/docker/Dockerfile +++ b/collector/docker/Dockerfile @@ -1,9 +1,14 @@ FROM centos:7 -COPY libso/libzmq.so.5 /lib64/ +WORKDIR /app/ +RUN curl https://k8s-bpf-probes-public.oss-cn-hangzhou.aliyuncs.com/kindling-falcolib-probe-v0.3.0.tar.gz -o kindling-falcolib-probe.tar.gz --progress +COPY libso/libkindling.so /lib64/ RUN ldconfig +COPY kindling-probe-loader /usr/bin/kindling-probe-loader +RUN chmod +x /usr/bin/kindling-probe-loader COPY kindling-collector-config.yml /etc/kindling/config/ COPY kindling-collector /usr/bin/kindling-collector +COPY start.sh /app/ -CMD ["/usr/bin/kindling-collector", "--config=/etc/kindling/config/kindling-collector-config.yml"] +CMD ["sh", "start.sh"] diff --git a/collector/docker/DockerfileLocalProbe b/collector/docker/DockerfileLocalProbe new file mode 100644 index 000000000..1967d4de6 --- /dev/null +++ b/collector/docker/DockerfileLocalProbe @@ -0,0 +1,12 @@ +FROM centos:7 + +WORKDIR /app/ +COPY kindling-falcolib-probe.tar.gz ./ + +COPY libso/libkindling.so /lib64/ +RUN ldconfig + +COPY kindling-collector-config.yml /etc/kindling/config/ +COPY kindling-collector /usr/bin/kindling-collector + +CMD ["sh", "start.sh"] diff --git a/collector/docker/kindling-collector-config.yml b/collector/docker/kindling-collector-config.yml index 3d53416f6..0336bc504 100644 --- a/collector/docker/kindling-collector-config.yml +++ b/collector/docker/kindling-collector-config.yml @@ -1,35 +1,29 @@ receivers: - udsreceiver: - zeromqpull: - # Address for pulling events from probe - endpoint: ipc:///home/kindling-sub/0 - zeromqreq: - # Address for sending subscribe messages to probe - endpoint: ipc:///home/kindling/0 - subscribe: - - name: syscall_exit-writev - category: net - - name: syscall_exit-readv - category: net - - name: syscall_exit-write - category: net - - name: syscall_exit-read - category: net - - name: syscall_exit-sendto - category: net - - name: syscall_exit-recvfrom - category: net - - name: syscall_exit-sendmsg - category: net - - name: syscall_exit-recvmsg - category: net - - name: kprobe-tcp_close - - name: kprobe-tcp_rcv_established - - name: kprobe-tcp_drop - - name: kprobe-tcp_retransmit_skb - - name: syscall_exit-connect - - name: kretprobe-tcp_connect - - name: kprobe-tcp_set_state + cgoreceiver: + subscribe: + - name: syscall_exit-writev + category: net + - name: syscall_exit-readv + category: net + - name: syscall_exit-write + category: net + - name: syscall_exit-read + category: net + - name: syscall_exit-sendto + category: net + - name: syscall_exit-recvfrom + category: net + - name: syscall_exit-sendmsg + category: net + - name: syscall_exit-recvmsg + category: net + - name: kprobe-tcp_close + - name: kprobe-tcp_rcv_established + - name: kprobe-tcp_drop + - name: kprobe-tcp_retransmit_skb + - name: syscall_exit-connect + - name: kretprobe-tcp_connect + - name: kprobe-tcp_set_state analyzers: tcpconnectanalyzer: channel_size: 10000 diff --git a/probe/docker/kindling-probe-loader b/collector/docker/kindling-probe-loader similarity index 98% rename from probe/docker/kindling-probe-loader rename to collector/docker/kindling-probe-loader index 13f65129f..7d632173c 100644 --- a/probe/docker/kindling-probe-loader +++ b/collector/docker/kindling-probe-loader @@ -101,7 +101,7 @@ SCRIPT_NAME=$(basename "${0}") PROBE_NAME="kindling-falcolib-probe" MAX_RMMOD_WAIT=60 -tar -zxvf /pl/kindling-falcolib-probe.tar.gz -C /opt +tar -zxvf /app/kindling-falcolib-probe.tar.gz -C /opt mv /opt/kindling-falcolib-probe /opt/.kindling if [ -d /opt/kindling-extra-probe ]; then diff --git a/collector/docker/libso/libzmq.so.5 b/collector/docker/libso/libzmq.so.5 deleted file mode 100755 index 154f4aea0519cec7a9189e1fab716ac1ffcf6ba2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078880 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

hy=w=cw^R_|*;J<6KYtC2@b&o`mso{Kar0 zgWoE1a6*|ZWh(1OZI-EwDO1Tf%@1TMx5wSY2hzUJa!W^J_m!wr&P{Hq##!W+YWF84 zDsgMgEv+3)<}A{-wWmSrvcc(Wwap?kergO(nUE7p_AQIF>+EyG^CGGtS~NsIi^f4Y z?O?AAExA?+*#6}@9wExHAza+H4B(4_e@1AZemC?U|L#5BDZ!r*>}F`NX^wCim0ON* zfo|eIkR#lR)E~59yJbrejsTESgh~M`MW|>%DMIbUr4-?aEG@>8BDA9_6Jd&wJ$G|_ zjrtO>Cq;NswcAyxoE7va&YdJ*s6dJ2`~DU7tOh}8^bKZs6I>e^jW4x@FC5SA0$4^g zxPf2Dls^1?(=Us^N^-Y&!)}Ye=`~=<=})+xK%KZG+Ow{#v}V9l^{0PaePqPyDQ%kg zabwT3%E}v1n=7sz(irFd;yr~z(dUti`Co5}B0F$*YUG8&Ie#q3J2f&LIMLvuNgQ0R zDS_iLb70VRIViVoI6Km&4cC#F=dTps_TT??li-i9Hh$mfGLzt%d6qy)Cl;f0nk2Xw zjV1|>PGOC}yG&a1JMFelpmAyXSk^ho&_uZY%=1*~I`R{J%kZ1Py)@JD!Zb{(im5h9 zsOY1n0dW*!IVRwt5f!&+U z0DAsgx~^-hNZSpf$WMf%&C;3V5&M;gRWt7#<4yXv6WxzVcgiXv^_+T(d7 z?vnnlqP0R$~n z#mTIk;MBUIXY6SH&yS5Czm)Si@DthRyrJsr*gB%!qK2wZV|(&Z`g{%4WnWfQKL+SL zx8I*d?u6=YXid@^b_3nHo<{YZ#urOh;l=;Pt!SrH{iZ;Z*WP6q1wCePb z@nE>8=|#9A?bjDx^FsPb(a$F7(t|FfFVpGL7huE9(xvDBpQcOq5mQU2YjT!GoN{ue zu#duGc{s|MHbUM^V)Pt@lL2BSy?=#^Cq-vD(l8;~7@sT2V@Dg2M1S0hEc)a29)IWE zuAYq3kT^YAxrCo#h_8IfpyU=1WVll{xv_C9%grBhs!N2U3q_@*<^{FKw7fF8e>vm--3K zsED*{b%q>7w+oh6&q5tGp_wc!T zNis3zwb<7r^?`G&!RfQTr`!>jO5sSaDdGBAmV#%dK^|mUUJ2Jp0JIz_uIL;};)(e^ zimpJ7sI#y6wK_XC6zz7IRfZ26^ts(*{9=2k+VHwISUs+Hx{jyOnF7$uP%gan*}V~L zCKlMSzeR4hzYFuiYB0yaOTXsLUC*Zlqo>=KE(fF3BHDPi1SaSgx!h>gf+Ea%Yk#<1 zz)-3uNKpqvFXdMkOxDY6-jwYzc<%GG;IJ88aE!dFqSR%?UfN#a@>?iQa`TN$JfnOI zxkOWKLuQJDEv*+jP%N>BZK&vfwD}X^?J^}vJU^1}c+cW?+=L^C~W*)&J}J|C+0ib6&;F^F@~bPtL2*Icwea&kpwkU@MI<$y3y_Xm9~k zWS`AWTMETJowC;D5{qFgkv05xJR_iwlR#RkV)_NZXlI-Ra65Fua&iv~3IGg*#0zpa5%D0pW+ zc_Wy*rmJk~)Oyn7#8pQlUkK)(7zxM~o{E3P^nZVV^x zRr8(Ayw311#%tm#grKN(<5p9)V@s_pPU7?|Iw|#*{|gpZ3^&GnsOunM>jH0*S66@h+M;T01WK{ zv=;O$i9Y45k-=Ge7B*IW61n7F-q+1KML{;pU6@(S25##)X~n&B8=uYCh>D*+g|ilL zEDL6x*mJQXhIkFfc^3N!y|UO9&#KSYwP;p-4|lgdArx=ywhqS?sn=C+Y8FI)?HOzS zp62NFd&T>EceSYbX+MA}1q=Pu}Xfd_M% zf%yYX@;>NYK%wkuDvJ+#j)&DCST_llb~ftn@Af*18&al%H zQ)y{%R$*REXV|<(vEqnh)z4JGUWmLpAYF!;H=fE{#QQ6)6k+1NzGNh%r#xbS3@O#H_73d88X zPa1-wcLEv+|3A#Vdwf;J)jpm8fq>wSSK@^d6*Li0qDB)TkeCE^^hBee#3G6!h{Ynx z2~eqWaOaThZjVHfLR&Ai)>o?5OQ{e=C4lCDw<1DKEop%f8_Cx8|s@Ov;;-&eYkMSzM z=>hiPeNq8fFDv>eoYx4+VXj(5R?UGeKU~k*%0p&d${pA%;(h~5xrNMqBf(zR2{t=)~ z#sdVxIDQ!Q;qtqED#kDmtyBDXM8;h&qy8935XKlQ7fNfzGL{oDNb02C4QBd=wjJJj zYgz}o8g;*AlUfJxD$EUVX){rE$X!AaFURTP&!yi;)M_8(UfMwfBf+sdC{v z3HJivW@|W=fb7Wy!Tv$=lbw)tpnG^E*896Tk97EHx*XkIXY#BLJ%w9QiE85Qnv>35`F=EFzXdPRReDWgG^MH{wp}Xya1#g+>nlNx||Di z%b=W_$RNcEmT0`X5Us!UE3E4q&DB`vxVgWR0zldlH!T*kH1%96O7qpRg7e*Y%&s(b z?@!}TcCpS+MWx0A@E_{NU!95^eHA?tSuG3% z4E^ZkTAe~V;H=05lo?yyih`+f5;|wa7Pt|#fkF8aw0b#%PWW1utzyi9cyAR>^dFBJ9IuiUdBSR43)6eIrylbUo9<_ zri1n(ks2-SuwoMt#8x*m=q%k<%NZn%cjom{gGPaI8;Lu5l%gROR(m=8k$^vk>oJxr zf4)0ffPL*OkdBi$c&*~=Hk{0i$3YNr5lWT1`?Fr(9$7jYtKBL9jz|HX-45_K8t_H{ z%8?^r4^P3K8iX|#()f~wA4&KRbRl-e{X*w8Xn_+xzd{)F$P;n$_$N4JNc=)>=!H0)vxe|HLgKZZ%5Jzs;6OSk_T z!oNVTReVhfzDIlfTYPx#Zxb6e{23lRG(3)9sIog z9)y3beSGrXU}RPY;N}kg>JEOM-~`jBb%=kmgTJJMe=q!6KX3^aaI7MD|7Y?~&g=Mo z9rj@4BhA>X!(_EpFz-`@!E@;#NxbvmosXQJ$jEb>T7%S*RX2{<)qR3jg_O? z8b-Il{#klc8oI%VKG_rM^kT5>MeV|3Ru32KwQXLT=(-%%+8zq`bdI+B%7VPSOSreO zs`t@T?B2MTw64qY^l%SjWw)any7hIUM*^c6dwPz1R+CKF*75jtqS@lk5jR6@i!ZG@ zQHI!7uDBUuTZ6^T5E#}FH$!aeEO9f$whHlUtc)_K!6F0VL>Ywp;NoV8ZBd2Li892t zOmQ>BwnE}&2<+~Nn<2I}R@@A+ts4BAPEy< z!a9OM4b~j(xk)^~(w>{ebBp%O6c6mU5gC&ZSxX7vEMCsfpvBAhf#eS#{!#MhIoBS@fVau>Qs{PW59|lh z!6i!qd8~Vvp`6w7p2~k=u)Ss~ja{ zD%#es<`!+&&!up(WTS98|90hK;?ByYu|?%$Tg(*Y;@$eV#b5qWDwA@Wt`mkca^OU{ z3iYRiALnVNa?7<}jdY}3OwLB@q+CqgS-CW}sC+Q}0Odsai}747A29`h2`Dik{9*#) zS6y+P4Eh=kG?77-I*4uz`l$>$n?X*LZeZM?V>a<)TQm4^qVln=Ioc;5+lpwPd~B;h z`{ZL=joK$4+ghr9^0BRD+9w~(3+KQtbOvatqt(0xl^Qqn-~*Y zy@f$j5#&VaL}k)6S4mFNwss)QiN23t+v1Te2n2%~V8)UW46?1ybOeJMti2M!Alv#z zM=+=X2RlfZQ*7%1K2DSXwslb4jJGZ3?nD`4TixJRuW|)i8P$yKA`ueAgyn6p zvJj7`p7=CahiOkQ@sMeDqP_8JTeMT;Lg6u<6RC0Fe_t39W^ zhs&CgWZ}prkqP%CoY;cSWIF>Nu(;%Uj?~h5_|{_3QbV7j^J%}^Qp}HCVZG_|AT_d zM#^$*C@AhQ)7K(jfp=3o4=qRP{EaBrGNQq9fsb39CsWQQ*V$kZ423eHMSgLZ1jQjZ z7YzEGrwNzO;xIN?ob(RGAv|8Qz^`Ph@t`1EypXuH*LB7%YH|u#+~PLTb>_Iv2CEs6 zSRIHBC~{LE6z%fQlR;yW5e7tEryydaC`qL-J*RDDF%sh#pB6FNM;W$z!AmX%G@5b% z4^FTLZ-m#sj+ulD(UogI&Y(1H`dwgJA7~BeGcdFUq39Q}PfWk*`e`r;8n`gXYg#Sc zV4~I@cQA47K8O@oRvc!=<{oRtY7Zyx)=+j#6XmZ)-EhXPVwx^U)5SG+n;3{-9xnD5 z39Z#AD-winFvIvL7e;rFhr6Z>S}H-pzw!DhUU*PZ1hHsCShN(PiPCgB)ishzcEy~G ziy8%QW&ol@XC;Kr&1#4a5^CrM9jk+;qUD%73)DjgO$-Em!zI(PY63wYN|5Y@Dc!r| z5<;v<0|eLDGQpwuz;dnO3<+4hToz*3HTf8=t%d+c;yt+7P^@Pn4}Ix-s5a$$@`E1U zK=WgYgPyXWr!we?2J_(!f&%7E14dOO~+OKq;Y#6_Lp8-ntElG?9bGsNaKMk%B{F`i1&SJ*yW&DoRjsWYeZ* zUB)1st%mFaIBinDy@mer0VNO%{b^M|EVPKD0TH+X?#e)(V2Jg7y0PG5xFGhG3ROvk zJ}^X}E}48Mx$QFZl9lP7s|;pnec#nsuoY!PstW#G3UZO`2FEYE;PLrxYjRWMd?w2oGJ5{yU6 zc*{hptS+n5h84bLhduKv&o*?bX2W2Z=431-eWi9U)(F)KXr-n2c|n?hHF>m~$w$LW zXay)rLvhI`s2}Y$*0AClpv28?t9TY1r~m~%>>5F?ckuHJ>O?&(+u8`Cs7HXe)cJ}> zO(1)fA!Qy7fW!n0XUac3oZ(OapRw>l6oiLA+3I3oO^l@1D*onaw*=uq?V!&v`h&4p_DYuq1l1@Ubg6c*X8KhWj=lX=ibO zfGoW)EVjgzxPThq2mmBs_3h))2D?d9rZUS+SA?oB%9-(KYK_{iY))@caNr_l)Ey-> z5{EN5R)evC`v}_-r3e=D63TL_hB^e8kQnqK7{wPjRW^o!V+ZuZKwLY61989Fj^n{K zL(wUr*k3tU)&0M5vs!P|aZej(mty%W$#lP2?l+rX9L^Q|9g_`1CdY&!EHp-0P9>%` zwuKDB4}zdP8Jn3ylKmtG0XAlM?maw*6^g~UIP3e%u7)3sQ*TonAht8DXbx+nkz?|P zigp>%-N@A+p%TKqJ_ef^7;IV&?#eA6gY+~(qUWDO<6@A9u9%5wK*I~Tf&mcs??YoH z>xADddRd!UF`b)HNuELV9uRUytB`Y>3fb$bisB*EGqchd^^Q6nr!}aT(|bVeDIv5< zW`0{$UTfw2R*af?#=?Fik{Xwwh>c5+%`13Vb9 z2jO;S-e*V`kerbeP%777PSuyn_$Yn} zvFgH=NDpQoT#w1@taU&4CAGcmBA>cO|O zb64-fjwdWdvcYM`#tQgh#u9T7>s%bJnoH_%{JXQ#{;YPIEKsoTrjwi=%KP3uc)txZPeCP1Wcc18B4qg`FnIaB6wH8S zw&q{Gn_3S53bZN1dr)CEV>f2{@)QnZvuJ8|7*iS6BR^B;%G%3GFawhTb;@I9*Z{1J zeZVwEy(#Z}U@5S7C-|Uuszn>!_Xt1(sE3n-GLZ}l5#m93jyi4ui3F0a50{5x6LbCp z3F4XfF0~J3s-*E}m@DDA=M$I(Fxy*cSAfoeM#5eu#LGf^{uv%Fw5JLRmAowO5*{cr zY*QCe567y==u3Y^Z?=!j}bkG6ElXkSXZOV0g;yy`(EAzzMq2A0JG-rydtlg1crjt(Pf)KMc~rg&gog zMs#66nBW#xZWJKZTtC(MfmDK$#7C!k*iY4+=pdfUm=8Q4q<;l@QRc;%kLS0>Zfdh{ zZna-d)(1ULqNmjq**b1l_k+(#4Hk}Dk&D}Ji&&gm7LQ@cLJwy=g7&u`t-%t(6G+o` zEf=iU*8;rvIKH?U(0p6zI2L9HefDmnF-Gze@*Ud7WC)8vc z4ORkwT%Cw9ri!8O7EdD|BMbyP6VnU*IDSHYGu(218}5~QZz*zH`q0|Fk=wcqt=)~X z;e`FPSjB6@yUZSCQbTx+a+u}ZTDvw>G+;pZvPy7x8Vl@Xf)o~gPqLxDz{-!28+`_e zs_fRvye;nHd0XE~Od(he>u}csnl5@hjagCylIB>!mg}&x?VKbfx{VYcQ?uYQEO%sp zzz}U$pCD2mCfTEI!I&fWqNne$;%goS*ZW%x{RkXLfeCZfv#5=z**rrVS{STxprbXN1EQs+ANS z7r7}D?&a}G?c{71hj%xAE1HI; zwg=cU`qat!%`Kw`iPgWB(fRleO^c5n%n}9b=T3CgEM6ikv4mT#JHmbAB{{4cQ3v&7Fdjr3%3EK_UsT$!mtI@W*Hg;7pCK7(vTs0GG=iZcE!4c zA$zKnIAoj9*FY&*vL30DWw%@QLr(GZ+u_#!=S24=`H-IfYZM_Wx{Tdm1OM27}b zLpTfFj-KP1YD23@|Ay>|ZtKlRwcbT;>rqdLBR;@nMS!0@GnKiK`I&}}n3mNc%MQt) z&$LqQg04nj*e3ssjyLKkfDfnOfFX5;CSMZ)bQKmW(iy(|g*4=?h z87s$}8aXf}+^2EYX^{g{!^cDpTn~fO9KsH#6iJOsk7QU&fULuj1Cz}dX6<{pi?!?_ zX}PJ_NXs2PfuDl#Wo$Vru%U}^rDwH>j)o~KA}zP~3bfp+Qn--|rw8cvkZ~GOe~oDR z^@3=SAo>k=j8wawDR|&GS0ge3rKSUsyhV`GR~`$2T25g1KdT=s3WV&}!xiHv;9`Fz zuHo2kfFm!xBC%sMiebO4TEXYj4loGx9yM(i1NGJ)_K+}d^dxrM!+l0A@#0vmX(0Dx zfJE~}uDBsnJtSL)IfHS+%tifZVm{2nj5mbh>IkxAXaiWh(xZHRsr71G^0N-(Bh`P` zT&eqSk@R2Lsl%s)drv|C4WAl5cKG$RFf+{FD*+L5dn*D!k}J^qRR0a1T-)1NS(fL9 zHKH5eeNejbj}xUEFB&hc|JSkXM%q5q-S~~Dmu z-wL@=w3+X`a#VQRGR=3tz{Q?hz^|)OGO^~ddI`~WAvL|>%kNnl3 zX4M@E44P7Fe}?am%schEAb$w|pLK zJNS=u{p9b|I}oqoNvW471#dIw!BMiHfVz6(>q)+ zJS&`!DXse-E5#sd=kbvPy~Bg4+MQLqlF7bBvhhIM15gq47$@lX1m(LazuM#iVY}wr zvzGFm6DZ&J*zsYD87$uhnfSVV&tW6+e<4xUw=ds9ga*nNae;#6b4CwtH(tQN z_qJ!F>fUC7AOQohFk#J8nC9?=cq9z~(g_X%Gw6#; z5Y{oV@NjFP`Ucl4u$L%o=?1gVkVy&6CjE=e%UACpvZcIVK54y(wo?0R@J}nqv8V^Z zJ_KLPbnRzxKA{Rqg;i*B)-t^q$ZV>v%?v*lz!Lx&d-zuMiNEOR?p_EZ*bjwXHp^tIdh!w8@ zoLXB58hyPc^piE3AsWpC8cmU)xj2Ppo`+_XMl+jeZXp^1-Ms6=}0LO>L%Ng*guQT2piIyy{p^0Wds`i4ut*pOfjv z^+ZTAroI9diKiWk>Orcng#^x!&wnr7_cYjhbYBU!N*H2mFJSl4gaC&ac#|HaNp!qU zsb;J=8*r-2ISeezOz=qxe|_n=o;-(Pj-fS)O;7?l3+c{vrURSV+c9IMl=yP{1DRI^ zw?AMyE6^OYDP56+FLwLb@r#wnilO)x!e6MO7=rnmA-cJ6ldOE3z&NWc)DS{LUCHDw zdtLIQ#*XC~Eafrkevq-SM?Ho#lwJN-{M*%MvKAP1_qhI$_BZ?){ud%{;C_>Rx?Noa z@)M_mfLOECLnT8!19dEp52LQ0@T~0ry{1BeIJ^RMIvWE3ZF(n*!1801+Y{aKz_2Fl z0`^*I=`y*zbZEJ~mQcp@#8d#QozP$K$3yaW-hLPKqSQSrG#ZY=7%;6{QNJj4`SD~M z&3UASkH>*D$d<8q{qXCJ#p`n34EIF`=WkULuHb_w9?J`d4tSS=vOk5lvVRCnp5L`W^{vtoRT>sYB1g)Z2&g z4(j|jjpP=MuJ7YLHcK9biUAR>~*8p&!>=Z$9q2_LiK{PpP--=lzb#Srx@2nKq$ zpXmrCIm)Lb^My6TdjOnxS}wz}&#kG?PQV^0j$=F-SSD2UM)#UxkL!)$Q-_X|x>+OB z!kM_IEbTYNn%6r`GguME2hN{FCR7L+2iMwMqt4T9z-*K!k3<%4)X5oUDgyIoHASad=v#a{~@^K|{}H`-GfdBKY&#Ude${ z-YWasN|II#^FNOGp{>fPh3UIJ>gluLj_#}70eDc7J?hUA@Oc<&Q=ccFB~HNYQZWP* zcLq+Dl8Y;y8xh*3X1k%8mG+(lpOM$HQwP#4u=AI@v3*QfYXMnO3994}1awM+oE-!~ z;Z)*K7X&0tgB%eA0bZ4OSH@8}B*-qv-U3}X$q3AXlGoIj5t>|MdCdjs#j@lken}MV zWz?y$Aniq6e_kAvTc4)WpSy3oTRIaZ*siWBMuzy#2G&wz)z|^OD)CAdIs=b(A4m_+ zTurC3z~Qeue#(ti$;!2#bj20gN?5!>^>W#s5OVKPn?RKL%>_EdyBG;&;eB^~ur{UW z&DzzKP^EEq;gn}3W`mBpbgI(9OW-UdR8h98+XUlw^)}{RC7%Xof%KqfLdZ(`4Z26> z^1T1?PU`W^(O+5gLHK0UA4$|O@N!jnenbpJtw;Kq&72QC^0)Hob?DH4 z9-di&!#SrSr?RMfsd0B)1dpnWRo3U419j8?E47MBV22_FRCG)`0T#6!GvevX&^Q(b zo?No`k0wj6)Q6K-tuK{x%;cf~z0d+=lM-8_u6sAM2$Y;cv1>3UzW3!1pnCbhSbbnQ!1c|8+{tyCN^ey17*+pKw*kq)(djUXYW2aZ4HIq)W0b}tDttU zBVp7X3K2Eu>0Os{*iFltVwLqqv0q9DISJWGDu_VgCQ$ZO6xb4$zu-SGL#ER@)^yFue_B+^J_^IBNu(sX=Q{Wzr@MTV8juIfgiKFt^{ zC@(b(%k3|xz&`2ev5TQKx*0F!yu|~O{LO*+5%12_2Os6Z@br;?fDPO-u8dE7JF(h-JMhj8)C& z$Ic?7lBQndftv{0QPh{EEn19~7i2OWZajZWATw_*-}+Ha)!Z(X7fxgBx8akx?qC*Y z8LKw%rJH!SmkG^6BP8#uqBm+kmf^cM0m@zznNBv>hw~y{9cW@rUWG~1d&DnKL+)oVl_lX7gVzW5!PASx0 z>@Tp*xC=!3nZ;5l3?-6k*(?4YJtvNAjyc#Pu zh~Q`-=&bn@RKdk8Lr;+^J%NG5WotB=RYGB_;z#v6H#8ri7zVfK%#-I!BivDj%%`|z zf8ZKceWbchXMGRi)F1L#bBwYbFm-{l57WsX)5)ute7qzdp(aZ55h_L= zd9vb_U~O!!{S3$UmBX&gu5xYzySQ0e6jl{#4^5W(^dIXSTWB#>e36!Jhf0rH!a)uS zzGpD&KMKe0Dm_&6NhNF-*S=nvCpt>P>H4Q%DSR{@2tE>7OMS>gA8rmCmou{hY!7WT zA_PV`ZBJeWV`%zj{;-R4X5$><71OB%3_?puYY;kXH-fU0Z)tomNe+u9K7(CV^obE2 z2*?mDMqqv(56+~@o}OJ9A0>1S>QwONz$^11L46lApFDI-y5g;uDBPMtv=H{E-?}2N zLTV{v+JwMYV*Zo8h7W77nhp6H8aP}4)vWewxttk#XTkPVz}MtXv1bfzDLEsprQ}Tf zKMNfQ-7&OodL^(Ri)=7blwzk5d6vIFM20Fg1 zJi2pZ4)|u|0?rkbZuA)qhZkwHk<_69S#`V5YZJ?c%F!)_tn?GG!05sI`SG_&*< zm}QzmDdZN^wH+eiUY!$12qae8GOp{FrcFV+?&Qh)72F?gVV@wcaax>h3werGhpyiD**V|ZL`x(?+tv3 z{;~)~&{A@gPy=p)tKJgG#Cr!p}}C2pPni9nBGR6zO#A(Qob=|*jO@$ebLj#s!g#_ zuePGsj3^E;+a#9-Cm=sAJ+brKtleGE;FZ>|-(vrY8HGt3<^8S7*x1+hCJ%G@7i%|U zrnh9K)n0-ooKo~s?dMo%j&6`mK|Pi;tPh8b5>mUnkedSDAaGZjp^%-(O0yq?6Quql zu6~0CkYJMIoR*cR$a{jVFk^#-t>8fX1&EZ-S?uGO<(kK{7Ey9()vrN6c_x{di{%aLiyj9Qcd`R2ty?ouEUJ=L#xBj$&#xK6 zpIP81S?Jo!0{#9oUEqaS`Oxo2=mLLrHVb?pRp3Iez-^G>qrgcnlxL#ABm-XGgDF$# zZ@B&6a6x7$Hb8~|=g4)WMILjx4Tv!WP)(}K#=@UN{th7($H4=X^!(`ndcj{mu&MtJ z)6Vbz5Vqopzo71Td;K@UOne8G9U38)$|g<$xspAX_EK`ET}NZmXcx9>WUfw(N@p!P zPwKu&J_Y*9dkVD1fA8obHR!nf%zag{qu4+r$3O4#fmo|R{bM~IZXrC zOtbl)bWOad2l{n_sLz&CDSA(hZ9Lsk$#+tK1huR)5&=EcHkDJQoOe!=Yf6E zBjA$8C$?c4bF`=6c`j5ah3QkN>-IQW7Tk1isT(B`TI4YXrJ~5=I239;s#XuM#Dyr; zPw^=hAlB!*5^4S`HNNN0WLt6ns_}Jo@x20~NqpxJ-;Y1*4Bt|X?=KqPp&H)}f-j{& zuwtAp-&_~pF0@+W@lNrX8sFs_-wOaleUBG>yr{3sH_62}$i=sW_^#{}U+a9SZ%>VH zy2khF8LaPXKE5Mdd|N?YS>MsbcW9^hmTP>^jFk5Kna1~P!MEARw;t1!{o%Oy_JfWm zUg+0Z`_*WC*K2&Q0}%BcEco8>@y&Gc4Ri55OnlQj#h0n^9i#Exrt!U>&-&_hgylNP z#g_zeWPQgG-_JV5*A$WV+c-k%dz!{~hv56jFW;Mx#t`oxTzox<@Acz5tM62e?^hb% zHmonG?{LAl+s9|Q_%3kqtpZr$wodV7YkYYc-<=xYXSldq+O)^VcczQ)drU{x_d4P` zty6p(=1G0uEtdL@(D?2ZeBb!^J{qg*OZ{Bp>q~swj_a(xb2L6%-(dRugt}Fh>LGF@r~#d-5e2;5JPr@5f_0tM5{c?=KqPp&H)}f{&c9rdKOOuro}}b@A;2{Z2gIDLzxW7T6Zp%EfLhH4O*KJ_mYErZX$64RRSQ zwSlf<_)Zwa;r0l?^lAY43!@ArsY0QwamFKVS??dtV9>PAY{9icRzYf-=cbOtMmvu%y5r zur)kF-GQRY@i^pRP-hxH!EQ-30NUG6vOIF)MGbqpRxpp6M7k-H+Jan_Vwv3|KH$T zFx5zYogmdnQy2cX`9pw}rgHv8{$BG1%G(|Ad;u^^C39u81pBiS_#Qs|>i-J<2oGMw ziy_D&a@2e;WpF)l zpTFV8(60z6j5-f{IgC^66GQg3I5UUHm?Pg{&i_MV=g;WieGHcOC#d#gTcc5VSSZU@ z6N$x{(7G|Op8t#b;?iQ88Y)Fktraf)qI~-m>Oq=Chu#cB25+18%W42_70R1nvEjUM zocEqO?@$(E0@nj8rJt{cozq^=a%cPTV>*YM&Uwm=ndynfY+ztM){ou7N2~PqDT#G` zqtgRY-Ps>CbjfdyoG6FeAP|B5wWK{(v^LkC-7aS@Jp^itk=i>?a5DZllk3~UX3$bI zz77H!RAWgEeD;!w@=I%f@g8Cy$ZF1xkM1T;_cB=vo<@w<9|@3a(T4H*Y`C&cq3d|K z@DHvWeBK91iPsN+i#f#WbA8uf0twtu*VR&g7GvY}g+9=5AE?B4(Vn4BXu_qlr^H8x zRl8v=^-~!ZufM^KYN?+=S4%xj65>O{4fxOuAwFSzV8Eq*4!-zA^rt~S3peS{7Jgz2 z_u^wOX_Vi4OYb_=o7B8mbT?N)E*h^?r&5SL{#X1&Au5{z_(N@7 z7b-q9#@KIy|Xxo}gxYRBtmq?~h7&PdAHka9MroJ&*AWhv+Kl=I1yvnl0lcAY7D zjrT3>O(2pU(^g_y-{CM6hZxuceV4~)k-p0b9|mGl61>rk{lnpAXRj9Hv=uM9#_LVw z#LR>`mbmKJ<&cuY29iPJD_8(pp3MUUtm~_mKBTTVV&hrsyV$frTJ65)gafiH*n4r& z(GrO{ta#gW+(G^`?jRq81H+7#cOC;S-~PwEdRz-vr(>Ofbov$$Aa8wQxuHVCj9SVE z6k-5i6^61B_|37@kAoT}964~nQ<6hZF3%l@s`I>J(Qa+3M8L0YPNAH%rGNse(O_`p z884n&-W2v+fJFzi9I8lsY;_cvG%D)Azg(=#^eV5JRH72o0N$U3X_`q@W@Vi~c) zcD>Qe>^+X~6n$%C`g(Gl8VCKX&m0M__QUB9mZwJIO+TLgV0@v(7y9w^2jjEpe?fR; zopE0Qh@gxz9$ImP=m>+Yqv;Q(-y-p3#dSRW!T2VL&-UZ#55_N*_#^#z`n`B#B_4y1 zjXNwbfu1=86Ud9#?RyzgP%?_fMXT0`uYNfufV>bH-0ziM1_gc!Twsg^hD2cyrcU&5 zuthSWr=ti^CN}DL*GF`r@z4+S(V>2QUIok>Q9l5xFQq(H6#Zu0@>uW8%qcHwnGIup zzIt;4>dm!BA@t^(^yP4Q<_4->QyQzlg+QNq8*cz@SJQh#DF}#R$_dajHz!M>on=I) zV*!FaBCrbYsI5J4nhGtY%u4KLMWu?4T=q>R_y$lh$S#7pM7LJj+l)F3I6_6=hG*t) zEp{Ht%bc9@Ri!COv<3^mQBZeUb z@cc26S(NSgWJhp{l)U$V3`nqm#=vGu4kuZO2f<`{-p!T;L%t5L3eVcK|4!BTt zGDe8s2_NHWtg!+p?p&**b6A3(JOO9zq@rf{h>;6r!@@~t9E^#`dq$!6(o-9>z>(ZU* z*rY$8%`sKTqWN`uh7`>&p5BR}Wzt0BSkU$8fNmAB5Z&V%9XYz>6Kvx95TJ{>2rjpf z_?S}G#GL}acxq}8grH4_(NT*Crk~)aAEVQgD?@u+3LmuE&z^WPM`mRVS46Q6lo)ld zv%@*v-I`8EQKe{;=@2Wyns$>)X%f=%$XxcK##I&Q!Suj}D3*m{U zx(_kQuq94hbut4-V@v!caB8b`S@tII!V6y@2)4h~>PT);p9t^~s0{fTO<5Meg;pR7 ziOMv<$I8y|d}50kh~-S`@=^Q zWLQ6h$ZiMkk77p`A>3GraC^P=ReFQ;N8&4R5iHev`07$`f(xZ4V+mxN-S}ty_$PJz zL>>P(H~#ndk~-XZmyRZ1iR6pi=(%om!_5*sp&R06yKz@}apZ5xDGT137!PNqbpT9d zDO@giSI7U!jsJ}wAJOq-9FhO+Zu~FsmC|3WqqBANBscm3 zH~P-=bTrvUq%MaqIPM3)kNf6_@%~oBrI4JEYON{2pgfk4(tv4%(G6IUndkx^>K84< z)GYeSh$Y|``nrP-sJYisOjk;FqNr=Bac_&}rIOUghR*a!&Jq8SlY)Zvk0Be}6s%pg zpgdRQAgv{@dZZ_A-;Z*6Mjj@^<8l=~T{;1$xQQ!*P$M-|1Wk}QT`B|VRcsviz5}=h zCXtXVh3xP0VHc35SV$x?)f^TXdW}#Q=<``WJlKaCr{(XX@!}G-S_lxirlAS?TKylu>~q)<8UL%g#FEzjrweC%Ox=~;T?c%!H;`n)D7L*h5W0S3g4$*hX>Wl zK|@l0b`f}6qN@QZn>L=O2DCGb*W^mb)*zzV59#8Dl=vZ!q0~}LKV*g*lH-NcoklzT zR`J=u4dj&Kody_Rif1hB0|1s}axb)PnppKm5fJe4_XnkDIf<5UfrCx48WTjX251G2 zxlLZoUc@9nuChN16+JW*85ni1a;Zk`V_0LIGjUfj@fU_@-gTE+(0ULAN7H?52ucWg z_hBSPHY`8CDXk2uoQRNMG4DJ$D#5G^1t;sMCha@emMHP!k7d!FC|N$n3J+RJh{0YN zhjBPK(K(zh9z=ga^ztAY1wy}A6MH@z^-x!Sg;t0~$!fqTb}l~rgR{hQ+EG>*6o}I% z@xnK_NdG%9;H$w*x*RnWm9rD8&_c*v){|k;Cs7C(Qimn5Xg)jP=jkykkE`B zFcA(3nJSm3EJ>G>P+-4Gsezf6h;RXqJO#{r_!8OOoQXF(aT7n~1)mug@c(#a2ka@39JMCZKLnAv8Z-;x?Al4z$HaUt9VH#q!(7{%!DEEzyBLttOuRY!KFDVXRzOVJ#_k%5 z{Su>Votd}Jw07c^nB7KQGba${JSvN8#v+(BUBM*2BACP%nb0CiR})WyT>`tHxKN?x zL^MhHU%vBQmq3EA<)HTas(;D>*BoaN=&A7G;a&F=1rJ(#DSd8ECgiheNa^q^={_k)6lv|Vzkamc~lI2tEMhlYx9X>zw%CvW7=TROJ%@9D-J{V{^p zs{W<8hj$W}X5*3-`y>x!8k)>Q(|yO-E&uPX^_md#(B%z)hRR9{v5+w0{)Z zX73R_kLw{1;uAJ_qnRC{-UUhHNghTC!p39LOh`nr#*1d0?h2@Ky7(e%wy@c1`Xj|Pr$T)?a^k@?whN< z8IBvwA4&UEIZv~5DX|^KZhVe3leQ;{c0*j7(HLZ|qFU6cM^XfoZ6hk z*j!{^U&v`Y?cdn` zR>D@81dpvQ#7A8(^_9l~eRPNFq>3Le+ub^BM=ACGfdHW1;uziJ>MR1T)KXc5sfFDR@3F z?!(Xfv*sR)0GnJ2!0jO)afc_f$6)Q!z`coB9(k~epGd*;9*>XMSa^;P|33DeV(J$7 z=cV9xwTEBKk_x~37~$QgU@l6*?{5!(u@C=i!k?!r+CK&VaC`VSxL*wS;dw-`i&dpUj@(!wx0vICuk_hs2*z zwxIvT4*vh=pUiHrPfEr>%@%!F+`qgM4ck5*`y=~X&$u;oi`-?$i1K!b>D zt1|fAaDSNE%7K9wazZCy7slE8JM0Sa5D3=h+7F$lxd<_K1wu{dX|C$n=#%`a89jN8 z_#t7o;!(!%55Ned3<`1yrsiKubPH05KC50M6K~4G-LH40ELeRGkp=4l`4sHYC; zl!uw#Ah`gnSjZNp4dcNZBz)@N=?-Hgk%eTQ{SoxvTkZxwSJi_#z}CSW&9O2!&y3YV zL9scDue@Um0igsQ>u@T%*=5IzZAI*{VE-|zp)A*Z1O5h_x#~CIBiaSsf-<=N|Gxpx zrOtcPoq}=iO?MtDcyGGrh`SKKPL#5B+kMiVa(M4ackW5OC*6mNn^JzfVS5%n4ep!n zMB%;ZK3v>m@$0<-Un6dwi`&)};wB33b$6aQ*cOjUoG3?*e(4>9j>)i9njtY0C1#Ge z32Vzs?I^}ncmlMG0@CJMn0{Mp*Zks))egl4k=jFlikKHjj zA8+lLX@4s(BCV2H1zivr)q@1muQx^#v<4p*` z%g{=H_VUx|`|ls1A#MGR`@ebrooG6HA6nz}-hXE)%$U6Bj^~HLbGZd2-{?9$*>foN zDA`DqkOFFaa`@@^{`>n8Z@deL z|Hiw3_;0)~)9IRYy5-u}tbI>v-v;dy5Zl_MeF9=zTi{c3xt7JAmYCRT#h|GO>iGV9 zHrN5%ea)R$4E)#Jcfiviuep2gzf<1@RD-A*+y~r0lN5Zw9T9saf|@s}_ur|xkN5sN&$&W++twiOuOo`OJ`ENv|G-1M4c3YH_1=FUAa3Ht zju^iH;$4LXYp_JHo^gwK-LcA@q3fLJIqgN&aAK_1@Z-JzK9rtz@4u5W+Lr7sF^xKV z|DAX`8?PF%_x?LG#xg+s{`>DU;KQPTU)982V(e)`aX>QYAsxhM1VtEhw+>=D1T`>d z9)jF=**kgveJMcPnlDQ^m%C0J?KW7A@IW60%%POuw!61o&VzTZ9-+f@1+Tt6>q|K$DlMIn1oaUC=#5cGE)B%{-X`lAGiXod#hHXqJS zg%-=W5c6~*QW_8S4LXQa$qTw%2h9ltjnY9g0zqf$ps9hN90?ME439SM`X?(W!WimF z>iTLy43z=YO#&Ve!_43^>S!^HTjJMr&{8hgZqTzjs4)=qu&lq^)s5JAvjaz?>TG8= zYw}*-wbFO3@mz_|(Z{}rH}riE%|!X0wxA~i!^)4D9gMj(=;29%4|b~dBrXl6%?(0O z9}?gRg$=x)?5{zHCxV`*;8D{dDove5a3ALHFWk+=|HJmf4}&^M8IAO2<#1SdP4*bjd)2m(=dC-%c* zF35jvKRhxoJFWKE$h>2*@QynsoD(^aeoV9I9O{!O#x!9nq{-Py?QUGFop)SXcxMVO z`F2p=9CG?rcDCp6k4!a8SYhZL;7MDjM48T|Xrm*$w%`%Zma=2;|5*G#4*!qGe{_{TUGeXy z^EFB67QQS7WOI1Oz<(i;M0Wy|e9(q11<>2Hci^#BoTfoIW5#A=s5hxeUFWF8r;tnf=b4+lzQjv^-DjOnxar zIk2y5+OrTGphtJ9u}~zVP>knVi2EcMS157eD>|0Fr1P>TwxH}FQC`_MVzpKuLp&NN zyKWH*FWr0nIJ&1!6-0{XL)?c0L+D!UQMaMSaGybUm+e}=yLLJgdpA-%{x6mO7Z5@w zUr;lVp;OqXj^if7=@&keRHe^b-*#p7uKpMwdmUP(wCMrVSc_#Fp-M%uYz;85O&b4! z5mTq~1e2U6Vnh$pi0;scvNfX8rauA;(76YaqXZL9Ci}RkDuBw~k{~D18GYH3I19_W zjE`8sEfCw{9fJxyEwb@hjFGfNU$m%8PuSaBBS22HUP)x$G1y`ZBzJ_dhfe3v8};Tv zzWZ`+WNtr1*0E3Z0c-52ZYcOO>~)ST!tTZh0X^UXfRkmfJ(;rh!pPj?k$!`lJ~(c_ z`Qaentb|U5QP+%k^wQnzy&G_S5P5-o@lcfuj1m0`@myj;u}L8N1-E?DRfgONm{c5c z@<>dq;5r0@0;aR&yGvB~k{4)agq{Bu<`Pjo<@zgdC+FFVF2P`SM^j{u>TN+9T2HnXa>LpLfl!riwh11-?7Ys9S?B zF`Z{*nqCUx(aALZ@huE>ZA%0yP+zFi-aZJ8<{gQ@A*rBGEQbp^7T*q);dj~B9DYaL z&ruUA*oY?xN}Fy#X0DEffvyl8i?N78@Tq*2>zi@AwZOHdXpaq&YwH#w{-OTv<0h5^AJ{oH_ZE* zvBn68oV{cyMksvC=*!r`Uu%tI4ATTA<6yD?pIXrqz>pX}A(4sUjG6S|>Cz^Td?ju2 z^bTngeoC88M={;0^gYOdob9ipnn0{L1^~7170k@XrT+8xumlO-S91N#PL4!fKTDA~ zE4Y5I!i;875?^3i5-P=0n;Kv89dBPbe-H5`p_CM1;~}2-lB@jr2$6<9oUy+S4>7Ih zrSg2AX?y-Y&ZtD?OR{*>F*%y!J_5*8!?^h1G--qX`BK{8?d{SAPvKMAR0L>uTS$SRar>p6sl)LN;2edU6rkSr4DV|@Np^Z zbhjp;heM<$aC`#_$(cSFwMg(dTdl)AV_=&GY@pXK%2?|Y)7YNU*f0Z2n`R0&(&-)4 z_QrQPsV#`aj*Y-|I&cNXx9P}elr~7r!~Aml5e8*k{h~m;fwiJTym#&fT{IsMiaKAb z70^M&vr(|Gvt2DgLo83{gM!lFYL^~g>LLtubi|2XvtfR!tu!Ydq%y8VATGX z;ABwymccSC7VeR@T=9XlWogr7R2^-gSF4>uX@{vta3ICn@7!<@_r&$ANR8()SVpi` zsBX~U#T5P_4~XNIj8P(sTkKZ;waB52JHLym z{}q`nMJ+ViBU(iKl-?q;9y~}%BJ#hV1z_|L7? zJkCiEm%2Q~f>#f=LFp07Q2n`^6xcsuC<3;2`~*;JeT<6!DR&<1hSf2-#T^G~5R^xd z)P3Y`EqJkwA5kh;aN;28qetJDJ~H^>c*h8BKyz~Dj!+}OIq};a4MO&OL>wdZDvVH| zxgBWG)mu*$G}mf08@37>8R)c&sJnVU_Zt}KYch0K?{5JbQTm8}4yGe~A?v;wvjN+= zc(_EJqESaQ>Yf_)FFQqjuZ#Lx7xleB&3X9^O3wbg)L6L@T!pc6v&UqrBG5BtIR7Ac z8jG#v4q~CVu+Jpf{>Npa-SUtai_t6THGNI|9gXDrg`WR8ON0>;mEFK;Iuu`Gx*3N%@(7vflM4E&vMruEA?)}( zwpK7JnF(>O8Lz13^bOAip~g34Pp)pMxI7)naZdicXi0$4BX|zFNi5mOZEMEv> z6{sy-$VvqP$M5Mt!0&z%?pSdVpwu8D;Uk(r@{d!b5LvOFkA3VbBHG3)U$c4)^4?P&^9@d)%QxXoep9M2c(+bDAxUg zJAUCK039CT5AFyPXmB!!ctSv09wJXpc!F^-O-R^S(tLhX!;{7)U+29+3yhCCS*rPE zLaNzIYFqH!J8Y{ex0+ZXyGT9Z*hoSjE8Yok^}{-Jnv^(kHri}TBj1yEE}CNwS{Okd zmE7>Z9kO3ejK%WA`4gE}lU94`eyKcI#$AJf`{+f5kNUVB@6 zauW}?^A{$T$f%d|e7*j1o{_&j6ouy~NX-Z0OTO36pPPKSoxd>oY|8KPmn3B-cpxDt zq-LCuLe0KttIpN52h+u< zRYwt#Yl?&#b+s~}wyTpMyue7_p1e!zK{!v#EOyB$*SED?WzPk;)!Nmlgikkv+!Gb$)lV(03xg_WJ#){5TT){OIxW>#6fQT<3SO&hLZG ztleFy{7&-n6M7yi&SQQ*`$>NGswSjK>E}E3?fq_fB5P!>v-(wFYL_Do|3c1Wxg>fr zx)M5HIBZ^q&~PD0o?Mb$L_qMS_)Uiy<=Qmv*S>?CEH(d}HB6$)u~SSwgdN+U6WDi0 z-K&|ZVo>d8EC5K;T?D>g97mIO$BN4ktImI(eRe4}5JH8LcDwb-jMWoA$Y~uuxc?i_ z^}~Dv>tKI`SyOvb5+)(a+2Gq%E;b3v)2Y(8U0nge1lF^O!WlT&b#80BBpa*(ZKHYf z38k*hkr8*>M>67G)bfYQH`phA+)0G19SfnSD&@ZnLVuM1UdkVS^Bih^k2(oFCFNDUYzHS`qT1Ji$1W9urT=-A{{i4@qnYcz(qILrb7QwHNKRGR4mID-!XzhxZ4W%ny#x)vUIn4~&GjSuc zI;*9uCLJ|SFSqAjq4#uK*p&7dJjdSHN~gP&^Cj^yxoS16de~(cuNm+5V_UB#c)aXd zjh^rA;IZYh83-hYHAlX@RTj4*bmI?Bp>^6x%ELchZ@OA6b~&DSlF81H07Y;od)#Vb z1pZ1I9_1PZ($K6w8}Nx+oAAp&@Oo3Zb^3ca!%8`6nno>+$>-;o;85j6Yge7=sd- zxHoWI`Y@G6{^{uW5-U(@bhwEy<}XK2V>P-)gil8e(sH;VuW`(`rpEkC$T(!op9{hb z+R&A9xamzkJ9<4j4&%!kOQx~%#+s74&%-$Z-V-Et9*7#oe{Nl~{Zj4W7(6UJj!xwU z5zFt)1w_FoY)S$aLdNoe1iCW^`yee``&>0bV&tdB>sn8vGIy}iV|^A=U=%y*p0{KI zPkfb?d7e$hS-YI+=(v$`npp94K&b~;q0t}K>*)_;jFnf_)NKt6`*)BG%iW%w2JB4nvRMey; z?^Q##ak((+>`r{`Y(XF8*=buOBk-xl3>TQ>~X{`sFrH^a5Dwx4Q(G{&BG1*w2H za?^~;*7W_!_Zp4LMEYCF_kDbctSHus+f~rYJWiL zQI03NCzM`^r7FOWd-)x7*|^V2jFor=g16#7Qrj_5(RNjQ#93C13wN^%pe;`RWw*Kr zbMl1}))vHnvq&>wv}~8^3#I@So<#Tfok-Gd9;jX*9Aq)BVY#9RAZk4__H{wI? zx}~&fj5L-o)w3X>5Jxe{7j=DV|Bn8jOj_;qJ4RzTQ7{~3X~yVtXp@yTjbqs`bk3Fw zSHskgyrdc{z6vnv45IisP_%E4z!A;V-NfNocxVTtuhcjEp47Jn#q=1LiK+T7fB;77TZIC% z6{9Oa9TtJU4A#jDB>7Rl)vcB$mAytP3$kJ&wa^zsS9b=WR2eWNxCd;%AG6=EzruwL zE@+7?%v(JSpeqnt(@cDz{Hlf%FjfmKiPc=3lnK96kp*>CfpCex%Rj{Gna<~jw5*i7 z!Zq0f{TW!Qf^A2ioTjcOV;XJ7G6YsKwt~qpuGDWB99zMh%-F4&>K6DN$;z%k+A)}6 ziz0}u#Km{L$l&%U+x;#`a?tKsvJa4p76r4A59w5QoHh{Tezpv+V9@RYw!+-2t9L<5 zlAC>fiP#fcfL#Q7?uFq@3|JJj_7I<3lmP2?6^+I5MUI5AeuATL zx1(wj+$~XIoAACQa@kGJ&|^d7UJrz09uJkc7FanG)=Xqs-hMV!vu6H+qetv)wYT=E})L`{q9rG)7?R4zM1#^{`hiT(9crOU8hc+I(6z) z)v2Ll`82aRZJGI2a}9;X(tKIJ?$imr=_Y>gur(Uhj%mc2jVfD-2TEdl8UMQYT)L6- z%Sh*bGgl8sMKi7D;lUmn@JhpU!t&5%4e*4{EUi^(E-BJas>$w-A6*fanqrc!mvzdG zsWbW-@7xX;H!!Io*`oB3X01pzxKtrrb}r37YeS2k_3#}%>!;hINyQUEQKhSPTq$*tq4Z{BvjTh-z)X)sQzdR=Yd&WS zAYJwPGwLbMhcgP_kOS;o0N9S&kaVtn5V*-6ZiuJzW?_lW^8hHIb1JBw&J8-y`2en^ zkj{ywr$y)80%i>puSyOw>dLb(7tJ2jBd6qNK-5Oiqx9{QTTj0A21-^0(+ z%v50{mo}siq`zk0AS+si7P)RX{G@1RQ>N@n7VDD4y@IhgVP^I2lVncJ?ZS}o~wWkOIC z2qRKFoAx5jS0DynwT$)xf*Ol7KW$xZ$sHSss9Rc9G3f`TQz(K0d{sbkON5s;w)vO( zCrZ%TSvb{r0~4E%XQ{D&@XjOQ;QK6 z&bq!u1sD%$?ixA~Qv;aeQD1-$dIqW^BzmGsWJGt4rZpTT&MmDnr%H;jNDN~Ls^ooq z_KbSLMwPHQkH5zBX=51@>oS@g(lTs0IZ#l0~$a!T=0m87Fm zjHZts`#)EV&xxY-DaOteBv(1j$0M9xx>kpbrE=z&>M5!3p{{C9E4)-!6_jVUTzOPO zh_#LMxr}l-Q+!XGL&U1im0{XSa(0EYxgPA`SNy|sOb9qtT?a*figYODmtBBJEwVn$ z<`IhA95dt>3Ea)*nki~7C0pvH+RNdgtx(%GMKl;fYd}g+`YIy)gZijh1SWqLkx!y z(G*18myFQu$X@6vcH-lyBdYK(61>O@TCls zJ8VV3Aa|-1ZMx=q-n(1xMX4y@ZGk_kceTekz~dY&oLY+D&77k=3c&_{>v2X1=WyXH z1c&~x_YWJ2j;c*~0XaW0$Xqy#?-gdcl-~eo(}0|Jq@dF^rGkk7)1X*Z8Lh{+@fsHV zec&|&C%6H4zaO>ELv1aj!vxMO_oevU?BX&H_&D#~Q};mENrmOh_pkB)s(;17YxavO zvM<)>boLa#5}V*#e_^MZ>!U|igz5y{LAqXTI-Q4y-cZncdgu{?*6^X^uI`elp1TP;U3C>m-h@ze-#oQT@OI>=y+n|7 zK~LNTprWG!bBw{1uQk!Enz#fJ%JuauvvC&#U_vxhAE#^1A%#010P3$aqw}vR@Io7g zly4#|9qle(#g`doP{qRm zRwvy8XyzFY_&j5yXsZ0TLbLMTD?ne~4i)^bP0UcqxDus}I#?|iY#dJv@v+qZ<@^WWRp--Z7SkF# zr04w+`TR1stml3Ag6}U{&-+6Bqt|_}VKO~U;)}A>!4 zPuH#0JkfL;5n*}R*1XiH{%lY{B_EUcyf}$jHY@t{%C6DQLx_Bc1-yCGj!fc2TRSo7 zaK2~vLsDn3vQ8#>I9ZKE77s^#j_l7b`mPowc;GK9_eqUlLvqe*n;VU_Od zXylQN;)5h9gmxN6%3&j8+eDMYG$Pdvm$efuAC~`!y;QM%MhxGu*4}%wD zqMlpBO7Wu-4-Y@F6c~CMt;5+ z_mW+_CmqRTKX2W}vr!*^DwGb@pVrVEKSFg>+L#&^)fiW0D_-7M-5NW4I7=E%&p(U) zuVkHFIeBiD#ZCxizgL0EkUVs$48&oNkg{m1OQlvOC5J^DpsvAF$GH~R;K!gVS*QAV zV5jnR_PKl^sf5xT^Tw1$+s)CT=F-l=jr>KY52M!G-8_sQBPeq!fCctyNwO$d59oCw zN~1J7XiDGMZ{%-^rmpu5b5yCDXm%57mACOv-ErIwSR0)_WuQCU-jvK<+b7Vhox}M8 z^xaPXDSlZ;{NgbM1s&*{TVYFE9_x+p!jM?` z+Sg4l;bU8G{frtLzaV=26eNe?3IosR)1RRaDSh=Cwbs`75`=U(Wy7x8Toz2a{CD77WWMVW}ny<#1by6x7)0t>1NGWV+|J5K2d{ zwZ`Vu&#lEZN82N>iRpOUCNm)*qvqk8XkeFvvKsFPg&*lr-qPpks+s~6ksFl#G*GPU zdju$_f?}&6O}}y;VXEY$U;1#6G~(yI*o+r#b&i{Brm-Ju-l^;KA|bo$!K9?ybKk1_ z_S@|K2%xt4IWK~$S*UIB)ZRfRlzA6V?G&jxs-aBW1oG zl+GUID39`qK2KLQ6rfy^N0}6&>=&S%2TDc_8GR0slOS?^3w}W(Y`BCk~DvRwQ^}5(H^^4g8*V)NcVwoH0F1h*0Ukn z9e`=7?(ORV`Vj*epx*!lNs~NKkq0`#fc$)oZ`h*cYH;*B4j4aQBd%or09wAbwSGp< z)dt0+3)NUO`7`;-(^~4%e~~0dS}wp-WUA~IQ)PRbz(-ojdEER?e5-JxMB1z{_%Y{q z>3Fcu;FF57e}JZbE;8SsSd?%^=n`E{=_C${nuUtI~4OnLa~UgRY}`I;#ztzGVHt_f}VdUFA*#yfIa?><0rM z?!h0qKLE$k@4@8`UkQ8kdoKd5N$Hi>0)30G`AVa)_eCD2tA{zY07gDQ@4~tP7}fl7 z0n818*&i63<~9ENugqvGKZ6k&lDIK2bqjuP09p?}*67&JRRBPX7^ZRCVFHn-2`QY# zydP5d_cd0e3q(Y^>izrjMat9CGoa;l1V%;bDVSnlY;?(a4}zi%kA|(jzsb4!5yMf@ z^z2Y6bpCVDr}!$ZTl*T{F@BtboTF<;j7vJ}MOlyliQhdeu2&u6Nqj@JrK<*oBp2ap$h)&aAoq<1*8^ z4&*C!{rE0y{p>{LC4TG@V;^zi#}ZDt%*Tx`Nq$2;dD}75kI{XH^_t4xwTpbMNPGzG z&~ZNB-oIh`t)$|+KCC2De)aK#9QcVN&79Mwc zj=igmBQUIsN}@v>qv>cjzlGL5B$VQzZpKJ9nka&P>Tu^ilxT8NfKkLgSzY*S)8`k@ zV5T>wTM{lb8Mc?bzk>ySLH>$J%XCq1pW71s74eaDKmBdF0G-b(mbB-&izIvH*Vs?h z-FK_0X>u?yzrMh?V%^U?P3s>Ip%I>>8oeOF?M z1iP61B%E~=AKN}%w`x}M))cHqOf9hu)SGFPoLZ!7XmQWd+ZVTdp7o~P_1|4352kY1vVi=zv z$bTn3AI*1#e6Ha;H}|=%XPfHB2RIV0% z595DT|912$#<=Psn*7F$vR+Fi)+@xv#ndJ-FxZ6m?0KlXs^-Uufl&&b>V-xwHVxT) zujo!!jnO+MrS08b_D<`~6sJO?$E%P?Jj5vyh)(vrOnPC$%=k8ZxrM$|^$PXJCq3#b z+&82atCkkS@U^a(A_WiV-QAyPd_h%l4g%{X7;Lx)=Y=fkF!C*smmEF6rO_szZTT|( zy0m*eyri3t>-sq=U4j=|Y;JhWvian;d^X;OGW&2- z%Lha8ZOWmHHc>`3$|yJ3g3pRCRC~+1@r7>X2^mdSM)&}6BK_<5LicAy&6En?9}~o; z0j~?(4G#Y~6%6Y?))QZ7Ha&7y@r8!w5*5Um3E~S~phW+>_(EIIO;B;;GKXBTu6?m? zd?5`(CY1UUgSEB|;WQH@mK5uUs;5_!kEo&z4ei^sq)aLl6b)=|On%~aL;Yr7Dzx`P{mM`b+p6E|Dn>3C5`+JB z<0DlBkFe!%BVpsE!YE345tqlA#i7)4^{RM5$fVhTQ`(N9vR?IO&}-;~Y&)WSK`v2& zC$NX(%DK%=S~!6^oed`hBgivF??t=>6eANcONp% zp!r0q<9%z3J-7XnX@(bXHq8K&>lU<`0ted?4G5h&Di9AZ* z?WRnV7VYR&4IvV1N~P%!LMID2bdUXT#UUwhu$*uA3w{9%^ zQI}>7CF~#dMPVGA!7|b%6&)XcLaSm~YM{^C-LqGt%vWMM7T7n28)ZW{0by`l`k*|t z)y&u>YW2-zo%jDrqsa$6*>#Q&eoEyKC!Ru7Vfb0P-h+Ooz37-j4;|4~+vQNip=(=h z2~?eHoR?*u*%kqX>nDG1jo?1>9G1V}9f*T(QX}{j;K0(p1S*W}ieExAxPx@=qDx_Y z6Bv~q<3x|~(k)hjYi<ovqEXsSJF;tbjd~rL23SD*~!Spx&}?gRag(NG=0sn zHG!)x?sRkwoyoxP{G(iaMs%}Dscob60m3TK8^lnGGp~Q@1q>VSfRszIejnEa-E9EQl?OI zTV&UIkuDn2al%3|xBh`U3gKC|v7L-j!^pPTJHR?N#G5fJ*V8_Sir9@*&py6doO>H| zh$`G+y$3^VNL;gaETSq$@QjBe7+M|)x&CD0jfua0g*M00@gV^{+y$7X47GY>w&o%I z4-D7&2=1yoOb~rPwZeUKk+1w~S|jsYSHGFPG_a@EQ6%qT1+ItwmQ>DIwD@o*qHkOi zR-I?CIBCTxVCVYrFI+!41&`rR!OtA2-k zqFV2Hg?ASYy3YC|y7MqfmsviisFlhD>Q83sO-`PMQv6-W-=Ld*vYU;^wlPy^-TuLj zFLkZh6k6?$X17YbElnjZVxa6RG1%DUaowg2+Bmp-JA}$zPa24>HKKdp@Uap7w)ZPu zdTpNQQvvr@{9_A6^B{K-3RxsS)`SjLEL^V--^~1xYw2V4M;wrmJ8z9CW}@QcP4L7o zMN>D7Z=8$&@OAN|D9W~I_4{A%G$}e^rjM$WPp|dJNXb;rXB?iMR1s`Cts`nBivZq7 z`}T4Rr$SqL*Io^&V_CuWPP|vxck0cos$>6|PFU~-^iYdouC z(L2O{-W$PxvR?x_``fq@^x*x@f*4taG@~L zV4q29YJWR(G`pAiZQZ7FP*)RIvpx3PX!Tir<6qWSpVdFk7N_^!YJ^flz!3?NaeAfE z5$r&P*@gZLztkIMCZOY_R%($ajW6-!$7&fV({C#@^s|TOLe{Ks&dVwI_6jm+ta=fi><4mJD~;4!l4R{DF3|{c?hUZaF%@ zKb>e#y(6no{-cTZv6<=UlwAC`u*B}l7HO7?IlcDWv2bf7Yk|kvCaLl_-s@wL1y)Ql z`^&AQNa>z$-6Nx^e2x87J$a>Urxvme?5|F^D$M?Ro`E&?*K*RipD#q!+*-izb>p=l z3AR)Kfh(y{KHib-zHJt9aV8_r?Tb(|T$qAjXL=%G=)J=|MZ-Kr=Xr{DHi~vIicH^4 zLSxhW z9pY6#Y7c%Dulg40G9ru-Wc7>ewGFAW$`qP?dhnEy;i}BJ5?AxZrcOrlx4Tny$MLEMwAMDSjc-Q~#L1gQcY0Yy z$JFRF7RK@uIq>PFW`)o{g!3!m{OQl;pquuEwK^>Ck&US*D_0_G(bUbAPQTc!Q#C^jnqBgKs?a(|)6#Wtd zI_Ge%-SU;yuOvR~hSRDJ9O+Q(=9P$RV+OV}D@pG}2%eG6^F_4I)o}x}N1P?fSNY zYmuZsrBS~6({;WxX|8Owr~dhK;Wc#B2K?8W=dx(~GgLTnHGXlsUS&+3p*>5C*J4|0 z?vKC#Pl-!zqu}k%yk%uTY@_d+D}UidainEKcquz~DYra*Ur%EVg4lpt1v=>z8|rtM zq$DKC&l+h=w0gCNM)8GpD9N_QbVIMkbR7blapPHLtk&=(c@KC8OYBs^oe11lhTiS_ z`pSzt#d|PkUj_L&dF<5);6UvHrlHkpBCtPgCdiIvYx$>Z%iLNvJhZf)zvL;EULv&- z#&~uY^$UrgFyU7qtL}-LWumTTAdu?oF2cl>%w15zrp#TiWv4BZY<6fBO%TUENrqW+ z_6=gNsY2+4N)6e^N7IK@jtpDB77BbPzaFxoA6CG;v{NucFw&lABuH z6CI8Et8kZCJC4k_RS&5}#xmc#GyEughRz5JWYb zLQnSaPZ+pMe)OcmKj|K6mK#P-Hu6t4@B>bafT1|g-Pp;}YbCe8X=cQc@~5ZEx0tD) zs(4an#Oc%^`yg22{v;ZPv~i_n$Z(N*=5)>HR{--!j4{AMHY|$&%I#~+8Xy+q@eO<% z?QZZNeFey0V}}4|KIV&jpRVt0y?(kXrSIf_QK#0$f7g5*sg8vPf+qb2>=w7KZb{dEpq3H$v6MB^hVb%QYNzFLSv;be4cD?vdn`n#M`}`aH)7FQ-Ljk^8 z-+J+n%i+I)!|`9yzv24u+c1hl{m$Lxcn3e<30RU;9 z$OCzUR&BLu=_<0-NM%Y17_xNI&mAp9Q!T19u{SM$jl#Xsxz!*^$mb!mO7!WF?9 zYH_3b$7~;J;SV7qZTrQ90yq$xaeeAuXg*Ab@qX<{VEQ1 zhw){qr0%a`&3_p`_glv9(&J(La@I~XAsD)^rN7G-#Iv>d<<|$}R~xTQIu%xGy!QS% z>&`cZcyFwO_pjoiYs~LfUn3vZv1IQ}S;m{8Kiu-$kZhu#{gh|beA{a@r%D^Mnh!&OA5l1`4-EH1#d^cY+|_g4U(Sn zdoM8|8o*E8f;}K#0==J`O!Luitr}Fi<`Q1J*csH~O*&7vq+xk59i8?O!hLAdlM(l5 zE=v9^bs!z07hH6ZhaevP_3Q9Ij6Y2MSbX~!y{hWp_@Fo0p3%F|tg{uauTf*Zh`rZZlL8axpWMhrMWTh4o#(&V844 z?hiwED}4ufSc^x83YuwT{m*<`&4qo^kPbm0Lt<^6Z^C%56Xmvb^VN zSdt#hCZB!jWAX`j&+-%Acjo8mmD_fIlNDwK{ylkiIrY3|>EHXXx9kYma~W5z&u!j{ zROg>68N(wws?FSPv;vz^RM2kr7xA1g#`42Pu4KvX`t*KpnYX;gr$G_qFG<%Nr?(Hl zcf1tWbKhY1K}N3w$g?V**%;q_Wb-I&=du@7+wg+-U$UaeO@54TdVAOD?HQ3(mFY0yAkr$c3JbEENNuqw`mLY2<<0A;u z?;P1S@cpBcfcZPR6qp@7Op}M{?qSX_7}_ptG-Y)AiIJNFm=k~r!Zh6g5;K4Y_^;<& zZNmGk{ZwrZNZo>D?(?IA&-;jqbj@s1xg$i07I{L+EeXT={sk-0RFROb`e=#@ zTUC%v0;so9C@RnM?>Zh4|K82LlrPgY_bNqaoOeoLOP+m8v-Y2^ zS*X`tPBuB6OY+<8o{_SW-{a*p%`-2jgD&?khIu)S@q%xL>YL?QJNo8vh~U|AdiDoK z2FPhuo063uGg3cQTjZ3EwPW3V9 zL}0pmn5iD-O=}cAkMl6ko}ZVFyqtau!vymr>LrlVzn@^Wx334e+JkK4L7ECc@**}j z0GR}cXqgK_M(0pc`aQp-EY#jEf}{4n5#8yU#^CW`Hjlo-y~|@n=Gi8Z)B86*(|eR# zx@yCMO!ES{Z;)xHAk%%7={a7mFZM8Rv>PACdzfXD^9;yK-Zzq27_bPr5bfU_56mXO zrH<*$sRLb$v~#ND@Mp=$W<=P~Y3p^B&|Oa_Z~f!@v^k;VF$?BX zrq;TPZOk#Hme%W@v5#1Il`6SnnRs^^e!U?T$P#l?een{r)!fVNI{G{}KhvaQw+}1T zC;XNLzrBLr3jMYX>l;u!38xzCR#&?tQ1Z-f+WZ&+d6gt0Y$#x zq+GF7^ycVe6gAq*`&XA+MV^F$S$F`rHh4N8|A}4H-p)n3MvBzMeoy~=8DStgTiIDj z_6*G4)ICWx<+*3}@dwJy@+Lk(Fn^z$uH25bYfNacNRbtp$rhS(m!o=pOK4He6`N-BUKT2<8|I=za>NidMXw>{2 zd&iE&F}T8=ii}ETlS7F|h^;#A=!RsMN{I9O8%$JRil%xVu!IG=tUf-el+Rxu)tDMF zo}wxyffkt5Gcw?p@VM?ROlFqf_GWTyZEQ!T#LpgMsIc=O{f5T|-S3QJ+dcb8fH+)i{at8Lso!;BT`8kR$?erKVBM8oojF*ExHwS@O)FKDxEsy_iN;`S7A_gl(UZU;Ku#^g%W=|2}k22&1!Iz5BR&APmX zni)+GD=pYAGLw1LoNf#HzlDMb^(`g4FMpr;dHg#1&T66ngY?BuiPiX@N|r-E>*-PK zTV&3)p(DVn$_nF!SpV6Mk~R6d75I+)UN?Q9{~J^H=olpghBJ&5!DO}DBngMAmvM4o zYMy_`d0tZum>E}dH%z_ySL?}h=bNQf_a#GB)&km5VjN;yP(ItQEuxo1Rk*|#lj&dn zO5JPS`iKdDw6xN~BF)FkUOawYUnUJSpHYcCN0W1kAexj*Ci1bXC`hjJ#z0Ga`UPkEW70Mz=je;3 zMStLVQEXQ&xMXVmGk4V~dTB?pPC|9*(JI6=np*T6>79*tQ}ZT@7_>$uRYS#vw~vW6 zJYFo%A`^mC!z$Mww;-B*vg(p%6!f3{-m*F?zhJsG?JQbu;h`#edqUjSpGG#cp|A1T z*~Q~Bz0x%wlhkF8Kn0&7J21pcdc2)I-c7mg25RAW!?UJ65()Ck!gKso$08g`yC*Gs&rtv)c ztMz&2_@+J36l$B6C<9?oMpy>flt>im&`0ut_yPgBetD{O6Hw^f0N$N%DpH4)SEyc9L-Qdtx4Z}p4V~a zP%dcC|Ly%K`jV5?9Me6I(CkIJ{C)K$>8in}s~XNEOFxcI;NMVZaGF#`{=26MKR=$?KEThSScE@D_`mrN@Tn>$KvVPHgj83< zFgTG|$z`z&Qmv<-t~)BUZTiQ0j5B9L+qCHU={CeHqYdk8K&0WFqbmv?jmsR2byeVh z8kLy4QZN9<5eq?b5Lm(b`bG2$>)_2Q#FKqhfJgsT!CXMD&+-;;dTNE-1n%;4O^t0C z0%8VIH6JB9<8ID8a)NT|cmG1Gy_ zM$+ywD<+@6^4#C)-(hce3d$|jF5O9}K0@hi|I!-SSK}30; zzJ4)Fkw?<0BomID3MdKYA?P)?TcC<4-^5Rv?0F{jkuTUne}u0YrUS{sF4jt4rE7L2 zsoV1~6xtE8^|gDZ5Ej!BaemtciAw$9<<4XL8XPG)gfdhZcpkos%?OIn%xNSpykbZ9cUSs>1NHc z2}VdC^~&D3j{FS6YBxc-b^YzP;Jh_#r%I< zGTmgvrg~|72hI4>IjnZ~(6Z1Iue$xtm(iVA+a>mDV(o^Jmh)6U=@Z`^7Y^2fUOQiY z@x#Klg!5Cx1N@Un{x9b*mtmop{Tj@7{a5psJ4!RCq5kIZU+L%n@;qnL2a}LZc@ zCFGFNt%G47Bk-s@-%*olTGnoJdKz7DTJL1XdD;NxSu=1NZikD7f^VFD0~Z3O?(b2 zA=b@8A=VaU1|8g?KMdZ-bMH^X(91V3%_p9X82;DoDMmK`==_AcHLE;t0 zQF!d722QsMT;Xn}8^zwAsCGBgt~pE3-kDnHXUSt9xR1}Vrk}=MrRje<*P8y3ezM}# z@%g5IBkT^EelfkOnGMff=9_*|Bi;RV!8ninzE&5m6MZjH?t3seOH_&ALF( z-Nh)QP|tmWx`OPp_2FA~9cg|^HSJ4zo+XFuexB^VG0cJN-96cN`gw|N3dp`cPxe7L zhm7ov1F{=virMSJ{*ep^if;7#C2cL@c$jIiWhxcAv*aYFtIV#~6JF(XD-WCaly5n| z#uw&=wiYkOhFY9`A~N5uY}n|I#|u}e?Xoxd`43L^jxq((#fJ7JqwiP9qE=d*fm<)G zey*_9CVZ>4li`C|l)S1fY2Vt7+5|od30d28PqYbNaUgQh_Li^- za`uESBQ1)b5uA&)daSQajaF@zPh5Bfmy1pi@ii!UQ-%MeuM&$5jfi~8FkpK6sLI+b zJ{0%|YxH|t0Q;%sWb*scL4t|BrIG9-Br_{}71Ly!{Z239n{xP9d?U|zIvKA&SfdO= z*wNTdRv2Ja9h;xo63NW-E72l}W&IP>JSDb^kk1eyemQo`9fcw8rFv+~mq`R$?wf!o zxuU-@uCVAC=%nb)f29jD8^I!Lx!+?@78nkh(a_+zH*{oS8~{?7fxco4)t8e+}Qa}4opkNEjfdBo63 zzrWkk0QYwvn3rj_+fsOaz+))A*ndC3zAuk@m@9#)TQFYC!s>k+6{Fuf_?*E-C28E> zh5@lD5bktOPPs4OnI7)LxD{|*0Xf9M3JaJ7(ED=&f@TP92579*3j{geU#GAa3dXa+ zd$~|d$m1Jj-crXF>i1u*_e=cHg}oT8TEczTxjxk?@ylMZtrEXf#kb@^`B3(tltr$Y zE-XHsFcU|5k4!tI3EICBtcqMaU7A|h(dx$~>#=T`f8gAsKW(2LwxrBTo~Th`bJC4| zV?)<>;m^G+y?>7Kr&`qT*?=Eu)(%W|)y66i{=?jkbZ6~F8}ZEKNxCR^UL)c<3yi_V zvCSpAf8ZJ#|J-g^e4!qQR;Jd(7=HNSqP*UV`FQ&-ew)6lL=dIRV|(jvbKR-=PLp+J zP+B~looDu4U;8f7qBBFY%YA>~6VWz`vX>8NwSlGAZ&Gg8kAnW3Rx5M|&&+IyaavG+ zK|D{UL(C;c#FRH-C+g=_E6S4P{_X?FQP+J7oVgc%4JBvp+Y(A$><))QZe=&$WW!at zQKL+wXx~X`o4ma49BQM9%^;dBh_uMxhFKkH&XSM1k7#m{@^Vw?dgzc_K2rWE|7;BQ zPt&56BBc(nQVqO~Fdjsj7xI5|t0x7*6&Apqh&fvjPa%7LD35{5FVgaj@F~%Y80SGg ziIv4OtUyh7TCo^7N19KA(56KncsAI1n4GV2H$9N7hCVo0n-+PFHNPAnHo$$=<+psv zfHkqKZ_WW+OKK|y#yW3hugD&PSbgw0k91#Z0I{WRHg+kxB|2Ut_P+fdbc+@ReW{F6 zgBVLp@V>T7#!An8&i04Jc(bG&S}w5)af^o#6|glkNjli%Fwmi^T<42u4c|AyT)X7iiu+ zun-TNcrXn;tA1?Z0hCII^N8L+Ok6#%?L}w9N#A9R<~@ zHn7yjkb{{#zmXM@t|=m&J5<@c$y#maF#3p{XZ&_4W+x&1kXZm{Zz82Etxyj zCs?Wk>7Lh2w30o1c)nz6A--fQ)V3(uJ!ou|Y(*VezMvf-al=BM+}6NRkeG)X>fw$H z;gBBfaSO_E1$b7D!wqniyIg={MO>vX1M&aR=6E41J>GX`8F?FrcrdA+r1 zO9Jz0HVK-RbXVJtofl0%K9Vbyq#Gnig5M*jHa~dM<0cA-4ry+kk+^}B@m-r1&9ZL^ zs5BK;X@Qe#;yZ^YQZpQH)ba(cz_JOp< z2KJ4cPI{@0ZK;TL=06Jjg-})&nLk^CPK@dexm2?!;Pj^CQdnsSR7Ztaxhj51UP7rHXG9gnDAPqu*fv zZTt*)r?L8z*n77A>Y{;ee;PSDf#K<6*rhC{z&wgAp$0z)W68`kyEbKJtmZ+saDy1( z7W6uSJ)jU;-e0tCe=zNf1yo)0E80n$TdUBEM@16j;`lKfRy|Jx^P$Zg(Abj;ttgl% zA*jXQ3F3{5Gi#a3oW$XsqC(XFRZ3P4E z>qdlS;_%doF4A(TvgKq6Xf)DXA5=PWr^OOPZ+aOs)gvhO$8F>92a#J^f`_-P5Z|trT^v>?lqqlqk~j5C}`CXZo|S zB;zn4@+E0hN%T&MjQ;u=2NJSk8%z9_zFowc^iNK{%levpD0>2^SfvLBfJD<$PN=ic1u z_^)-}RrjY!6G{#S(qB=8NXr!vU7wnxveu=C77tB+H8i=(b7WPi=K+VNKkdqlGf-K| z9&xI69hO8fVmh)UGQW}KF(F^b(^!+^$mGs&rOS+HC)fK}DqGc`dDjXhsd2N$O9EKm z@T_|eQ{FP?MD$2Y%*1L{zB2wIZsx>ln^3G2@~bg;;?|`P48(#a@wDqDZrD{>lH(%vsFX)N+@L&3 z{YB`&Kr(6>rRv~LV-1{u2E+p<5caJ{CA`p!9>gISo;m|AeC4h}HA;H>OP9y#$|NEE zO`gr9%8SiF36P0REqtymGO-!uhqs8$k&V@Jq=I8n6Cc6t-QU<+ODj4-n+Fh*{_X?0 zSw;u9W$qPjC(O*0!5A+@PxD}A=0fhhwOE{e(o5gHyvW|jOv4p7NR5{l$@ooI-H!HM zc)1!+c#iH|hUGdiV3PE3y5^50aC53uGK4hqCEGy(Imm-7I?OUrj24sZp*zG^f}kCaDGFJ)d9aN= z*q;QZWmGx7w$gY7ru7tnJw^iegEsb;D1 z#^jgTGShEbtx(I-=vEdgR*$VX_bYCDaU1_T>#Jkqqt!=OOgd7hViDkl^BPe6*gYF# zeuVM6{5XadCab?EcAm_j6Ze7C!~>Pjk*R`?$z#UC+cZ&DXuq0$&%A=Rz@O*eg>QV{ zm^qNafX9{npkZ5jjy`lhTe~g!{#w``tV~J%=kwO?A=G0uoe+P5ah)G$$WNgrt-oOC z)@EZoCJ&TYe^EP($4GqB7q49-u8@)=*o*d`@kN z4~5j0kfP*A^YLBV5|{DAB%ACG9zKjB=5D!u+zaX*(u+ot-aW;&SQgH}9izb+)zB45 zVKtQKCFyPaXsq_InCDlTd@`7(@Dl#t-29>B?-~j7|8=25Vu=-==}zs`WxBJLpZL(A zknToi9YXpp*L4Rv+%6&_y~t|wSg7y|%;st1K!cotujq&S>Xwfq%=-zh*WwpFnN6e>~GAf3H$xzP0W$*l&E# zu3&1u_*R;#TFI~Qvj6G+alba^aS2h~=;6uL4N2|IxAo~d`7ZUi)ltj$u^sVXXE(sU z7)R@SC)O)keOkpie~(=HB4uvCrb&&Xk-igW{o_v!)wf9I8d5E)2z6GR@4YFa(onr3 z-aUJiC~i!CBo%swnW&1_DFHZ(v7cIJJ4z$`I^l|kSO2piX;|^+qSc@gwI|UbPGCX# z6)b9%8;WnIA-!0&$TAPtRR%7PpJE`~Q2pR?$cjJN(B7g8{blFo?JJfrrw;CwyKi|u zwso}nl#26)a?pD;)j%nqkAFquZ?-Q@V{It?SbcKEIk@EMJxpCin!i&|%F}Z{m&(e% zZgw{a9o8=nul^;{qN6mRR_(ye!8-tB*w z4GNuvAl0YtN;U7En`o9OUA5Z*`~(|J3buqCH9?|*Yi@f~h-!LVKiZU{bb_#UrXegJ zXHD}UA*8Ebty9xH1hVYAtwVqh(cv`AN>aJa1@bEFbPtR&l13XzRS$W?JQ4H)jnmG_W{!P2#QUHF%qo$HXt&#kVHW7$rKCL{jEC2=ohB znf5($^I0U_RY`Y@T>A`jVz11&UTQzKQQLH>cxH>G;;n~-f_mgLMSsy=v^nq0rI-CU z-}cn57wD^k^}A7#x4q2%?+o?TPzlSoZKDRGZ*71$9#{~Uz_3?dUhe|TdA6?CY zjiqrKPQP8QusV$$X?1$L{Zy^pUv>I>vI^AgP#j36ZhK%0Qmf~a&eiUMfiIm`*H)^-UHTnz=sU*_&ngZ_;?I(kra8lrd)ulcBWUF*D-!b5I=LMA<-#t;|B6D#op)T;R$%n{Fgo5ko>%q z{Lzi#2?qQ>hpMgj8=baFxK$HJ#ERc9Xjr)Or}B;bqV%B}ui3>uIJTuc&f1Blr8Db9 z`zrv-T--~V8e>Ct8Rg@H_4&a!m#}~{9XZ;NNcAKnDu%<`q|`v7Ilnv#(S(;V8){# z<{joAyL*vS>|4S=)tcWdu$Wf3xfGFAGrP!NCGXJ)cM(Hc8VOG5O$Tz7$SpPs`y;c2 zMZ+iqjn7q+I?3aFgzv@A47)1cW>Yk;Kc|dUK7dro ztm$O%Kd|~2(C1+Fi!m&Y=70TRs!KrxmnxrKvOb(k%=xeRafckJb#FyzY;T$O=xB=v zf@F)|I-~O?7b&aCd0zRLnJdfdT6NUk^geZfOz*Hh3+?X(mx_V^f&FdNu48}q!_F?q z)NQXEePy}T{kcZFAgkEfM?e6Qxku8fYl`^=%3HmApzFS>E*~n$1hP>LLds%O^#JLb zS)_Br`cMQmBGO+4>l-uD64t(ad?pKk5!{=79opZrq1@w@V9CDT52c_~`93aOFZmza z*MTu@GkX=4OprsvN6^bT&*xEz&iRs;>r478@`wCT5V1Jv4LXf zVDbwlqkf`Z%usqp3Nl^Og>>%w?NN^Pun?FVJYF|GZ!c6fn z7m&`)70i*q6 z;uAj~y!|)viSI5PK)&WHG=4}lf0)~AM446S}{(kE=6?=_VE5TnTrWdbGnc6>WtoKvS} zbpk5FtDH9nyb>5ajmhlH27*X3wtZXceOI_!G5C~KeX6#C@3Bb%ICqI4yAF6KJAcB= zhU(X2{RgZ~9Z*p{w4ye06%)!CHNL|bN;MESn7|aK*qrk4TcM9$x^-^t>#6A@c@VAsI?`;r6sjNB!3wN0R+Xiu+m6%p^(QM0Mhk9% zm!s7aE6zPO=a=KCx>#AX`s|8H8;qM7j$0u6xP+0tl_&cqP5Py)s*LPCa%5j<9+^R| zJ|H_rvdpAyDNFKcjjXdbv#V&9WxiJa*ly!^I&keu(Q@TDEP{;I2Na}X@1v#ZzjkGy z?^WKMza`hdC4Q-3G@M$b!qbcLKjm8+`<<$9!1r`Z|L7&$em7lWr8o>vDa`-L3R88~ zo??Cn^C*070g{0D=Jm)!xh#<+aK=ENNTY zHj`YM?$rO*D#i_HJ$l{!vFomve1LE7?G)=3nLlKg#L8_3_lWfzT*m4g)k-UiBBQCr zAz3GAcJdE49Ey!q>#b!Zj##|v-oOTAbkM|T2RVGJ$!hSbMq_*10Dh7_+SL*W_O0hT z+!Sg(i~S6*`)(Vm?lP@!N`dw3;xg9vm!4v#f+4!k`eLcY+9Bc%ahXgOJTd*yNfy50lijlYt zjN}#W0Fiw6C>E%SK}?p4tg!uF5w_p`qnrY>d0xMW6?uON|oK+js3s z+n-Vk`8oTI^%KdzH4;;dGr^5ERYW=i&#^7^EdaJnYLTlckk0028IlMCo_=Q0NL zez9LAkyBV>t54mT8Yoh)T^aHDorKvBvq*VC`wQBE9Sc;uc4g>{N4}>a-)P)^#GEiO zj zroeXb0!zjz@j%kKU$%hGE5NwRV;ti#zUE^v&Nqy^^B7C;GZ@CD9^*L@xF^8KjPqlM zV?4|j9%c^@qo2^*U|&xTVfObh8wloH!9;-RXfJsUYiIGQyYBC@=)nQ6;MVM!TrRa5 z#7}Uq)^PX}p9ji2`+;vyZc+aEX_O@Ud`EosM}Zp8Wikkx)@^UK5!+qW*^O$&Pt$|W zNLs~>srS{q1S6A~%HN6(>#bN%b1?a}7bz?2D)owP%BCP`vR-7Rm>{E z=k0glM`08{;49jwm(W9TQ%OR%lHx~49J;xjPT7Y#(qGtZXO_^d1o9f557OcNZ0KF* zeJ*|rjE?3LN16{p$+$E5Ah1T*I_HiBKR9nm6t&VyDLxBsJImxqu2?%$yTj#he9}t7 zd@RK#$?uyMnSy10ClQ`Wx71Y(Hl93>KLGd5Z_hWLyi;#HiR^4V!FLg^05+#h%^{LN zdciJeOt}mPmm@Y)sCM_tAVZtt(O#QuXlal3^iFxSt`sbAK&~1dpv|Yf3hgWOab~2@ znhlNm+{NQHd%PNtcXk0@mptC=5N|?&C;e_yd-U=Lc!ZyZsC?yr_Eo<*Ky?dN!>yp3 zKMDvlEVnnOQOzGo=f(gN8ign0bnKu{rmG9e_1CHEb?Cjhuo%P;`)9fxZqGTF%r~@t zv$U|jCr1-z^A*K3pB{#h3EIs!Xl1m~r%j8BFhbC$3E$Nn#hMkC!PN4Mj>8^-i?qap zjBM$MJ<&lbVXpa{=-%7h6_!(+`8P7U#4;Lc`9x_imd}^6X_QZp0XrzU3&G?2hNin6 zeUMyX2fnx{&9I=t%nxR&&#FE7a^?i^aDGl|3*0*_)?|U#3!OZjP&$SMdnK?-+BjY z;rgjtAd&;oKkgv$g0|h4{(&Cqn?8vCQ5ysETVI}S^Vw=IOs+hUD^AU2+o)_6p4C0G zkLiQcnEHc+Wicb+qFT%Q5uk0R5AE`&JOwLkumlBnqkE+f-Y)~Kg(XylYkd}hUU>hS zGB*>zJw+W`|9`N4ZJ`l$39oITQ7yVkZyg2AzLb5x5M;?ZpgX{6Y5Fi;_;+#~__Z@g zy+phyKFA+PJ;wxIXUmn*VC7_Wm+qxP`<9TJ=dIGWIb<%?t?np|<1Gs0Bj*}RPGxEg zg>-~>^tDu~R&Fw$SZDpB937gFy$aP!tqhQ(uPs6erqMRe@EALIj1rGgXBao;F{XzY zhj@(ls0DWk7#SV(*c^B|^V@2#sD}#a9S)bP+DcT@ofT`U0p#vbOMkQh zMO#v##4@Y3g0D#ir?PC(ItgScFdJ z0+c1aI1I&Ac_=f;--5QrRAK>z8ycDaeKdV=uX-HE!;?SYl9DM8_FXpENzBR>qh*yY z2`G7R=3Qt+X*csDpnkt2-z6G*h~_`brfq4pjON*U%Sf4!*>C4-yY!eLAI*=`_aDcxrg`TdtoOEszVg5}kKvVtZdziC4%t;>RGJ`oT z53^kTtU9FYJtWQSyJL~6nchw*-Mjs*muuNUI;+q7XBc~~ z_ZhtS8@LoKv3We;IEws-0|JR_m7+t6)^sP2-Kny{o6L+fKV^$;`(5p!8V#!a43Bsc zh;<9@%+vfJSjM6lSa5nM>D;}-n*>Z|nCu1L4^|jEtREb>kuShX3QU0ru|yiT2PMhA zZjRdm`_>l972a#1Tw%v~IrjzcgT5l(O^$ck|A6l^&tu8v{CA^*_zWjV$E8a8oTg|c zt+elgBUAo$a0acHD%t521!`s4%g8cy$_j+lA)rHGRCf%=5^4DdVocXPmb~Z|ZsGr? zMGxzyF@0x$e&eyQ$7Y<{mAHOu53Pu%=9sp{2f!2$@jDrn==W074?a3%deL~k#%HCJ z`g2hmE|hG1x?+5NhAWtFEy#p>UvD%Ci}&ESowWY-sS3W3sdMM{nv*bsf+IEi&4f9a zZ4LWaV;ki~;Dl`?0$1}@V7A>)gEtX4TefVvW*3RTUEL6YZB+ZTe-G2i!}R8R)S!Oq z7HE%O0CRi@v$Kc!ZfjtU5llNZoY!x`dde6NWgp=much3X6M}o2UwK^ZU-P@i(B{_} zFaN9fRl)oS^}8|ko1X?R6o%=_DvYnQ2^!J-m#VyfA75uo=YXES(3<}{dg>16x8)~w1sWjGCc@8YOUu>KML&2`#f}*ug-|hGgMrESl7)Ph-4a5B(SdN`#8|t<*2m)n)o`W7cPF;`_=+ z$SfFLnfUwl04ci;hjU%927?3M9yKxtJTD!0^xkrMG(B0l0i@AvjuwTSY&uXCK|ARQ zQ9axw6b^iwsaRlOHDPLGbXoN0L1R2J!7_;4p&raI|u zjpz;^uC%YOsr%2s>0xPl*}Y;ch%gT?;&*VMo33zPIro`Yz5 zajTwfX3twvBEmLa)My$>3pG!NcYT`Wd>;Q72i~IYMJo z3YBqbf+e#F32hF&MA zd#YA%c=(h?a9(ib?p;eytaW$STU~kC9z-|B+ORQTy8U;OFHlZr^95!O;2~un1Km)p zvTKl3Q1-KxAXoM#aA%}H|6LU z-9tQfm-Hp~fo>NjB;j>481w}-nw&~koxOQy<|6Q>;IzCj&+6ICZ5gX4pv=XuTZ_@( z{8Ooq3#o`5SwKO12MR8yf3gxk>?!Y;`)1FAZz?-{b7c5UPadZZT9ZC|ZStHo%zE8c zctZs6niVGme2DE`fM(3i@w`WfHl!n3MjOfs0ha-Ic@D6!Nc3L?m9c2kph&xWHXNDz zrm#pq%fibMF+Kd|Qyv#)`l}-K$e|S$>8%cE)gjt59nmt+bSz?4MOt)x$fLp{b?yM@ z(Cb!9U+7G>M9uWvH-$xdLN9YgdNlmzP9Fc;B30+m3X61I2eb(x+SHC{nMECom|ceG zKL2|Y-Ai^eHSw~yKW^DnYT^%h+5Lzyo5}9|8pfw<@x#f&{x|tu|xsk*nW5$ip6~IE7s0z->{u6~YQvC)R zygV50CZ9=sxVq`bPO-AV5vKe79ED#`XV;le%4De2vsY3}4cvSR!tfd6D0Upo{Pi+} zPf!-2uQI7Uur47NQ8V`P60=~_RdaWTp%>xzko_^#Ohco~oljl?jYM@hZS_yEf1Xk7 zOTwOBm`LrVu*1qnPXM(`N+;M6G=Z zm6!OrQ)K#eAhvutVP>psat#lr4s2RvPN(>JO^a+&nDwi9K6Zo9XTFEfz=(mhdNkKR z3b|e4j;XeyjSbkpi5cDvJj~g%dcsHrLv4jC;ymZ<5O+>td+{E* z`QvCZE7pC78fVimmx!%fT?s>Q_>6$T+7&p1kBiw}7=KxvRCju59H)EKVP@Kfx7dyi z7?QI{q&7pG2<8te8g!63kMyUnMxnCxg%^%UL*mIwlgvo-Q4p20$T2t@jT>7T_rJ`3r8w9{zu4#gTm!#F9aHSCd-FKhUl>jx%P|X zwTH1kuY6m070Iq^<6w0q4wggJ`_EJ(`pf)cgQg~3+xavssMCf7_CuX&`=MSBmTIrN zA8HEU{dzytiNVu#_Cp=I&VH!xA}tN16tx<=xEo8fA?g9EQ59-pK%Jg7ajj>nF#Tm3 z^(CyfB1BrQ4Q}l{VG6ianXOK!B(3Z6k(M*dP&|d>#cxrtx|e?VjtCKc;Rh~ui|$*{ z)X!`A(k}}szIf+A3B@M`TIY!hXu>1&8I3IX#H*j;0pGWLSsS^w&E5PDUIh;ONb{wn zFVGpL5AaY-B2gg!Ien1VET;$gXa9^U_~$qirpL^ySDw{8WV&j34+&FGY{I~)xH*QY zIqlz*{!iB|C7s)N4XWS(RDtoqD>L`xURY?S*uy4>lZV2X8NZCSrm>Md#D}xPtF%k!FejDN;wj57mOw9> zhb29=i`ITs;IY8j9HE(<2zY8r7aJeCH5l{BA*Dpv(0Z~q_pV!8B%I@R! z>9n8z+O4Q)QXe-5f1E;cZy4WY$!)~7NGv_U?SqBHD7g&v&1sLZSIMMX&?&kpmfls8 zgtmOqk;eYRec?~t5cX>&4`%RXFwZyT8?f}$l(m07I9l#HkUbr#VO`cekJ6To_ez~r z>UO6f)z8Lz6MHTB=@YidFIX(@Hj|-{SW{|*_0o!h519bPK2Ko^LDku_MHH1p|tUmdn85hYe zm72OMn!qTni|cBGB~};Bc!Ov75cxkfuGAf)ZeO`XIM>!dkx&`~^YGE#) zOVTIl>vT;MsoWe8GAF?s1rSt3CT9M&Ad%)F;$Lr1v*r`YbX%Y48qLn8 zt9lgBJm~*W_a^XB6Qt3mXOXGXIqy=$`gVYbdVD$bGj2T&{n8;3 z3<TEeE(WBIn^bl`n z>fAtafg#=w_1Py8)^ve|_rEl-8GWP$F%9fl4NN$e>Wc=}aJp{5WB?<-Hv9x&?}60n zNCDDuhz4S5ApJFv(%LHl0iX=qKOj)R_Pq?42*5_-A8r9ae4}gc zWqQFMr_;-N#8I^4TnF@ApDyS9bMzoF9Qo(vTvs;l^PnTw+uLnteu6z+=u@9KFVL>KxA4kaCz0{m{?552mft^( z+Q+c*Isku;Z1&TQRBXKGt9ZVlK*PIU!+S%+Ya#INcj5Im@QyX` z#uMHp2ZX0C6Z~3hc-Lxp^O_UC@h-gP2Hpn{K*aA{!ux&8f$*EG;VnE-+S^LQyG`Id z?ZTUm13{F1_ZoN`A@uDx_Je2kC%oq`+7)Q{*K7E1aJGQ76Zp@&@OvBh#~S$K3ICG6 zgfAOYZ%#?q=dq{Z*Ex?}(DXcZfj*D@Wi}d;IFJ2gFCpd<>=&c6{eolukY*(2xzI?= zpneDYjk4)8iV`bUd?NCxX}IyH0&i>bJa&nD9{VBTO1Esi%FtzL@qqfv9vrx^yR`KxxtfoU)l*I7aV@;Lvc-u7XSP_!i;7Eoo{|zeitEpnkY@hyZTirVE(!CQg>=yR(#+t=b0DdW zA$-gVP7o(>*Cj&@$HJAaB^mKrkCiC?#h{w83%D`y=B97v;MQwsmUwlbCn({{$I>gp z``YLYB;WWqkrj^PDd>vGzS0PmcO7$3IT)ifvI36dwRGd8<9MPya#g7sN5e){9cE8o zO(%59~{Z>%2_YC%`5@l_s!FVaVzrPTBD0cG`MZ1a&uN9qH%rukpS3c=kU)%`islmGPn@?$o#&vxJo{^LCPcVqrY zYVXk)5q6rBU+8&-C;$6R^UrR9{GY=1EbX02`k(5_&n=N8_fbhkbj1gU-<1HH-GTHq`cR(LEdV~tH+-nFQ3usAmcT7 zNmBln z#n~iUgoW7+l<0UW4(VzVhJ;r#RB>a&iXMSypdcb}4tnjr%glXV*zUg8bH9k%)6$XO z*j0NI#bn=UEl&WYKntZ_I{8Eh3>E)@{1jgo|9AZBg#3y(#8<>W^n~l;^W*b8;c4+V z;;(taQ{qp@pYnuj;t$3rB*Ip7Jms4!U+r6AzVfc$aDK;c{1?p{q#vw^7Mz{2=D7^K z#HT5;d96+f+8{SJz+V&VWYDrJOysj6e&BrulBk9>#LA)t$96tJbbzkWI4CKXK=5U< zYeDTmQ;ipAR|}!h>U!F3tDbIH3c)gz_Oo=nwvHWXE zB^b!Lg4qBC16HqIh`vBat5rIxlW*pu0dzp@qMs{vr4B!_V)x;}tA zp-LPIr4&Gfyk=1Wjs=nOf5eVFX*X5?2A@LIS`&4Lj*1{^fr+|WqI{Kiv14QTZ<**a z6MZ$J)kZic)Tdkn@KUpPd^-CZzx2u546`nEAymExcP_`?q`91n;sO{Q&{*79p>J_r zyRW7v85a-2Eau@?oW}#FAjhSiOPZm+WdjFXU43_V;k9P)%m9LecHqZ2*;S)5T2{_i zkHS>M-)kV6=wkQichFHD0*tS*0|>P%U&ENs!m<3592js%pDZv$x9$lb@^O?v*{CiB z6niiUQ-!DJ7YDJ0i2JAr5#)UsmNe`S;5~8u=GC9HAEu2a?eEv5{g^@z(0A+r6Tmbd-h z-iIklAD{!h&co_}jva54Goqrca?oxAZAs3rKt?pZ+!0}L;_o=VOj2W|pH~idHkh)hxTKmg^x}g;yu^Y(GWW!c~U>{5df}BD4 zK_Ug(T>(lP`e?-6CPzeq|zc7~O1o{=?7Xt{MgC9HEs6^cj& z7&#?xb9@onHX2)om`y(`6)IiFM#b_M|7>^z!^>$K>~TM#BgNyP7A#LCVCy$%9UlP# zptAu8~&O7bQs&z8z9jlzsf=#8~N)o!E7q2+8$~V`9xhSUtHum0Kdc)eBp~5HGvsC;zvt93Bc_jWfxGU>xbLLpUwOidP|@D*hU@ z?h9Hw`Z>?fbjy?TGdR1TH~IAjlf#Th1@O=annb0s6P8vS%in?C6?3JbzN$Js7x*f9 zn3Ek^yK9fQxvfKZ4ie#1&8|EVN<0f6jVR-Ag7XpFcHX|ES+J!W6=5d<%tAQxdX9=_ zp%{u+Rsmpm=kLBso@l92hd~t%7aWFx=&M?QB)-|I-&4g^@ANh6##fzQM2fGP_nl)a zHWx%vi@$_z<;G6~u`Zd&abGK&*9>Dm2#-!VEOd9?sxq?0T6G&1|KN(j`ymoqjSF8| z*QhAm)#ierP%!vF7cKz`W|CBkjo70yiUF9FPz|8uCe{bt^7h%IP`b3fo7|ZppyIP} z{THzmYfk(G>@R4%zSWm!9t_;OMSd%7zl5kSagkjBxY3&@$~xIVU{3GGP@txQAvr-rtS8@sXm2LMf$o7ms|)rB@&_Wbbv6QEIS z&R&Do@Ct3NKRN#Vkrn2eq;7fZ>0ST@6hh1LjKG)l2;8V%gK>a^XboELjzC@#6W-f0 zctdz^tKjJHUYtqdA+PY>Y@E-yA34K&d-*D#74E+mFE0Fq3*@mL-pY-Y#d!6M9J^7q z1|Jag78C%-!XoGBG_owKL~#tFnc*B^%YE$YN7HWR6Gdd0jfEa z&1k{cedJzWCEvY}U00sAR*%6P5{MRWJx{v+Xl*9jn6|nyE`M#(gvEh-|hXdkC&O7J^{;tbXF;{}gzJ{fx6% z7TTqg)l66-?6G90z}`L1xZ{41eFq{jTsF|a!c_u}4yG4qycZJTSpF&a(c=ymt>ZfU zt7I=U{Rn0Pn;#3rIrw^ihT6Zx*wFKtjBUBhUwr{3PIjtgpzqb=Gsp^~9X~1*5?!II zngd&u)Z9m1bp3L_+h_JotLZqYy`!nHQaTV}Y$%8e~s;%I7Pq=aKWdb)A3+n0BR0E z5J&wrpbdn8tNk579)Vb-Mgk7)5hVgn zwLAl67o{7p$paW^s=WcQjD8i~a#Z;D)Zy;^!q^|e7TkD}9a1R}eTkG$&^_1%isYg6 zM~sFgPqd4IS6Fn|aq7EG#7tswd_RgKlt{C}OHr$f z;K*Phb!BL9jjD~2t5aDN`m+1_Z|Sv7=IizG_u1YU1*w6ret>~N*8}(}7m7>#MRd*y zvc{of2S)K-=LpN}*(g1I9e%u{cp^?7AyYXsVHEcPJ91>jR-vnNz%lA%pj;aM5DY29 zmfjGk;a%!V(RN2_*w1L#&G{42-aO8*EmCJm4Ml1<#v@yN7D2ZL7_V{QbA8HPdDcoL_$zdDS7X@|1%xIP#&%rLm0sA9VO#EJLzXe!$-$6J?CN!r5 zt;nnl!0=V_O))-Xg$mf%h78@8yi>r6=FiT@dD0fBTb)agRdwKGUnNhHac}HKvAez6 zkI0}kXLB@1r%O=JI`HGX^bCOwBtX{mJXhSjajJW!>~V%5q;AJ^aU=LLN)v= zt$hPu9FLHrQ=~S0+)NQ3D=tA1^<;yKv#k&HSFj)m&h?7w0#jhliV2l$nR1qJKd+#?o5Pt-(@(l2~*xi6ycd>W< zD;?Slt1m|jSVlHFtM}2~syN%*@!w}jdv9h#WBDI^Z`zx@ z?%jpqEP5^FIUBSStYq_na{%fBK$tfl)qsxIfbRDIat0u}d73O}@G-&wdXs?o4zza& zo=%7$*UuockPBER=1=GRqOTY- zw|?A$9SRP)sudiy(ki z(#ub!VMkCe1A_s*hQe*2Wk`ra_cIHdr1ja!7!E|m$J+mReWsU_^iRZcawKY!<>VU( z`>HvkILpc4hq9c+Zn&)3H2ML()R`ry^sR{Fwpe<3z$!_JmI4UH74p&9n}g^TK{uK%2Nh5cN74- zDXe`px|X|V;hCQXXz79YL*k;XG#sak5iUr*21QQ|2~ZmqyL0LHnSa z=3j&yR9ZWIum|_64#Zt^dTD!TEl8YV*CE+iAlt_ypxQ#Y^e$KVTscPL8`w9*us--q z;p&=oGOT}DYle05a`hzeq6}*roWROYMCJA%tq$MB4ajK6`JDt%4-M#52arcQ!)X2j zg2+?X_%o(1yR%=CgDA?gtJ3u2Z1k!Dr#P#6hD**l` z0ET3+IMY9&aOHRq2=62yXkMIw2n=&8X-SLmXK@ta>TI)_Br49 zAB1#E=R+DgM6ShDLaGfwm65^C29-s!g~A49B>7`-gf2yurQtD|STSz&`^xZQLpQ)i z+eflIUU{=iWPrEpcZP7;*ga&|w$I5={u$p;2+xCef!5xK!Op}*KoQ#+D;|YhYRGah z8Z|+vfJbN`T{Mv6e-qZ<_%(sdcY$;=K(?bt0AweDoK7Ga8pw(cg2|5Ef{CRuc}{@T zxj<|fT8PP88pufmvZ3BI=~Iw1X@2huo;6$Cazm$|R>s(yT>FV$4_yJbR;o|2e8;3+ z5U844f}~)Z^2k|M)H(GV*I)J^^o@D{~61M{ z;m`ADH_d<6pXV=Wn!nkf=dWm*f0fqW|A?Mqr}fh3xxdIyy}_IRuD{3+f+pp^@GtUb zH_3naU*s=olK(rb@BV}zQqW;Z_`H3<{C)61J4l0}`oU~rx$vf3I;UibJx@QRjBSz- z3*#d8T$~HT;OjX0G>#WsYgO17I+i+&`NmrvYt>E)i|~?MUe_Ehz8hJQw{K>!i|ZRP z=0iF&`qUfHAmVk%bh(=;Cy{Bo&JiY*=xT&T#C=M zV0uaA_D~1aog=h9EE6&Ls6I@g#6RF&V$2p562`jkRNR{a|D0@X;-tnhKLx`LO)ZbC z;|&-b8@%wMvy_N+gJ^((kpJYW4%ii;yG^b`qGOEnjV4|mmZL;NZ)1mxFGgjWT9+mW z@sTD(1tdm%A*gk#o9Wy{rkOg^)y(t?BoQ^0^JON3KM~YLFU?-{29nMnY5QGM`JJKK zz&ru5+`&Cb-1{py--o$Hg!!*g&48T~>AgTd0Cw9jiNiT!4-e&VTBhOSIgnQ$acF#Q#udxv#?1C*(6Z7 z&sTK;1rQhq#ZAnWi~+4J^d|AR8})$R{hHXajGdITB%bz#UBy><6QHYw;6z=Kwu#24 zW912)NR2*AG{|8@BbMJAo8UBP{u`YP{Eks{&~wVt&qgjq6}xv>*f+)9-&?B+u~-j} z%1O%@(S~o{riqSkeX{Q5=D;^}jw>LO$Jsc9J_utx^jVv4?a>|wO2BA0 zo$4|W<^@I=HR^VB37)ybd60V58oOg+MUrvttK|8@gz0{MYd}Xf4AX2@q%MSB#M6DJ zn-NH-k5-Ueh?C3YXsOqG5QBk=&8;RKyb?h%GGv1~;LE#D67FvHsc`q8PlUUnK6v-U zAEogOe0dFq3A^yo`2bl0kg5YVAU$@!;}D0oEX58W7COgk&@T~YEdMYK8k+`5`*MYV zEdwV7z`4*VAn>cPK7pv%bD|?pE^E`X=$@_qtH-&lc zMbIlfrg;M^#T3eGS7ZI@tNw5DuIh)2CNwA0x$t|5D`Ol8aU2>-23#-JMfw3G+l%49 zUW1Ny{VQRt9=9A3R%8!v1j1pR^q;ax|M?Od>xtntNj{^QIDx-+9>K5i-d{gnQq2Xp zi)H-NhKU6jCc$l@e?_|FEU?HUE4HIJZ+Ki1>`_my!BlbJM@%pW`bFqte&k0k9x%u( z#g(<4mvzm=0`In*f>PXqRFY~%({cjQ+No?q`V?siI9qOnv;m**p5&I}rS%fB!${68p*q2OX6avO3clzIEHx!~AH zy~q!c!-`Ix20{c1_XN9;f3tAEozTIG4u--pGF#{&3n2=nqhXkm6NM} z-jTS}?DuH?PS_uE)tBs^!UkMVf~A_T@-xsurpBda-WZ*$#xEnHqjP1lSN3#P0e=nH zdHsdhH(nb0qP!@SRUQjv1cyMzJl0O|F3ULqv)+veSdp}xP=+mw?TFmJ5TbI+SJ`1O zS*k|JqDvo$!CV)*nc{oVy8s`)Jr@@-Yzi$0D~SfF4~r!HhG}P*;E#r|qur<;0@U)z zOZlZ$W8}~AF%Vpoj-&GCRPp(hFq-l2iUY`v<;c=Rac2>PN2Cw0rox^E3L!AcW z9_gB)Z@L3Hm$Iu|eCvfFfG@}|uFd<6Z$!4)_* zswk@F?~Rm%iH!<4Kn`Fwq!c#lxu2I$xawUHvc6)jYz^V1N~3tJ+@^E#5-^s$;3plf zWjHps8UWR;pb3?e52&0(!xk&i?Cw97_uqykey(gLq5!#(Y8EO- zRE>_Rz>jLf)iPe0=J)cgx{5|NH#T=9<98r8(12DGLM*?~1L%HWZZ?i?1|YFGb~1nl5zr~%FJSbF2Gm>wnxFw~ zeLsQGm;|8X9Y7l}=!sD~0$L7?Fl^U>^?(FD>PyfmuE_B{)Snq-f!6XpIXwBLGH2pF_^F zVT{&(BIbTdw8jaOJ8kH$5~j^e_4pcHoX55#727?t)3#NMdp z$K_&k{*2QXe8o`fCt{|1cQs}FQm*r{57UjK=3zZ*pjS2L&`5q=1^dPMKOw_{E?_z} zgp(2XaUn{B`4sA#0T1uWOvtH_VUGhPd8>F<<5zLJ3tp-H-RfsSJjTrYlir>c#@b%? zgYZSsN6k`Z-vX4iT`$1R#%Ovv^T4jx@@E8N#pfZDDxD4}4;%ki0gQQ9eFbAZe(4am z?o(-8=z(O6L{TDA0|Y5w6>lqW%RfnDzwF^blYr?XzZt8>_UFU0H4gt5a74m>M}K>n zZT<36k=7~kf>CT3kCS#*{n63kducPqQ;xiL9241gf9zfMP9QQ6c9#egm9lLr4Er}- zw*p3a=nc7Q#YV$`xn1?ZcNFiI^SsbT5IbAFgEbXrFia`!zHLkT(Y&yhwi%cwoX}b5 zz|M{yM%&Cc$cntsIPP(Wzhj#@99o#zW@_C`rzbMKqvgY9tQ+Gmi~i848jLQIg+B6( zhB&s&L~Q{c&eiwbAcr`EZif2l&00~~7ao)P&;oe#R}Kej?51jPm&aR9Ua6p_c%SwI ztlElM#$Az*~B?Kmf`&HH4-5?-fiPun`17MwK?era+<~Y$LIkl+Mo~41E9Q{^lMn;(UsGk$PyzNzyIXb^18oq$jOHs%jNzb@gJ znm32|-Ig;zjQKwsW<3>l4bo?*OEKKk4n_-;&Gjx0o0p}EUqi-1FbE`uY=JF>UW%l!34Ip~#QM*mYF5ZnA>7PPC`IyE7wV#%6Tt8xMGt`8 zw;T>agnagG&{s@5apxH6x*Em+5(2{u&w?ydtFgv+j%-Vh?M09o{h9ZJ808F$`b%o|cMm=mJ8MRRjlQmU>!-jpPISh{NdQGu0bSv}CotDI4 zzRD+|q<~A~b3lrYnTC47t3CYl0-7X<0}*xg0?^`N#F%zLs-Q^@iXQ>GD3abaO0{Ob z6IqhZx?b`;;|bV((ZAmC1wakeNDcNnBw~OZCL^icKp!WemYeHj67R(yWAaUGs8!Hl z2Sb5{H91wOidTWahq%Ghg~^NMycJr|l8|WgWF_i)2Ie{l^PR1vuCcnV4Y=x9>PmLj zJOY)8kIR=hLPS0_1#q=%kUt=hVT_!e{vRXa$FJM#%WBsS0 z*70SyPaI^gg?b7@Kya2-G`MqUGfZN#@ezNCaP)mK`@OfywQlvH?5Dq6>xLK5>H>_$ zTWoOTu@d}*&H(|$a!1XksQ9-Q=#4>;Xkth+?~3oE)JEeDhH|f$aXhW}1+sz_o5|j8 z+nd)2N51|pR|!WOqZJk!+u&#}iv1i6Sg4d2AfMVY6&*MZy*vXjbT1#1=;g7xmwCyo z2wHDPdP3YU~Do4O>tmu#V4H0 zs=pIQZ?n#VnNaP+aw-0y$bD=bz!k88{;7O7)SP{?VzWqXX@qf1c#`s#$7lJ}v>s!y zszjDq9j43ZTljnPNT>u_MGEQ<4yFkfX9#nh;TWz1K6+$En`2$^5&nmnj+-j`YV@A- zS~UxEA)MZha;+dW2oHamNtV>e|1SC76d-qa-JCEsXO?jB5quD*N)0*;z|4X8m~uMlw< zI+G5env84zF{44%fM^m0xr7scPwK2tSG7ZidLGLK(57!}V|UxthMqFsUC zQ?RlFP;6e#Rq{LR^pfrM&2a9H!ZzCVIDGK{J9e_OEqwE+H;nbU)s;E@^k;i~^3Jka zI1Z)ws&afODS&|Y5Yq9*+ZGnu&8MbqvtA4y5?yLg?BtZ2SDFY?I-9!ZV zY+p3oMF*(BM#F3-Qie*POb3DzU`vrQ5&?6=GnzC?lGt1%RY>4+9jKH5TaT1#2~ep; zV1fh&=s=AG2I{~>2@KYO$p~OX3`K|}og!%?b=p)3@H7`vUPAyFvFX5Qnj}@~q!~J? zS|`=&P(+7j>k$1~QH;)50K&U@5t^$*6Le@ELh7_PM7~T$6zEKds*R4CqNCUYDwR>u zxpnyF>qYq4<{J{8ieC#?%)&?{fBfERzHv=5gF8*IT#l!tW0k(mH>NUY4WfNjM;rnl zQV5?qf9jGzVLiz~Q2ZsBK;#7}AMB1tjd?Z{*HvLMKg){16W}h$k~<-V?#je3RFJ#C z&39&jowBX)!fdN>cc{T1uFDRzUu1>9TZi$NnT;869WeICCM_r8rWPQH%MxAuaWl00 zo$Gu@a7dMlGM*Tmn1d^zQi3;uS|o=W^bAM?SS$!6<1G^F5j_7M?S)EAf`5V^%O40offo(;Gx)K}Xm|iavFU^H12QlTeN`h#lo<$2 zL_lS8;*3onsYN?|}>L>zGyI(=BXt)C3$h=OcG%y4>(*OsF)h1Z0gEb~tr-PGC zaJddnF~J5MoN9t=ba0vpuG7I<6I41_XM$UGaJdQY)IkTU6i8fPwZ^1oaE|;Nn-QC? z5C@ttNo6An2b7pAHa!a=(+)b zLlA67G(4CgFe-jf2h)%=8A<9IDBwsLsZ*FwU8JKbbQH^|b9Gd;j$&q&gD8-o2Hzm+ zWc&o8&re|pR9z0x4ka5r-)qdbzx^+uR2@RTs*|COW6Z5(*yxP>Bqv9 z=qwn-c`-=zmGbJkIvZMvyi^VX0gq`Kk6Pl9x)7+;F~UF~O3GBt@2#Hio#tDkv<@L( z)nNR)A4&v3fGjMN41SYQdKOBj2c-ssOXO$mf$J1T%c<(Bvmm(SJY5K0+<13VymZU4 z)}eLdCYes>%I;nS*2>>iSFFXCg);yYE)M!W1={V>)sLJ@5JRHtm^BhpnN!OcM@Q@k z{~QZ1@J#bYuEe%3Bd2;Jqb72SH?pHd&d|5U8$QkELI$NRZ^qTo;TW0ajid_9$V_kK z;U;n_yUIaxMq8azSjmYTY9h&IZqCCc5-%Je5?q}PfudGSB1TXIb(~CKbA%c*WUfU% znScLfXhvzKY4!rAIbbLv(5bhgjYdYqq!W39i4;+4A}eqE1%{Jw@#eib#E@Hlry-lW zl=VGyF*86#&E}kX6l}_NA!7J`SpNAdw4(hnR@IszZUIMAh34a!9e^U9#;iPPocJ(fQe+df0LnrdBu`zJTbA)eqKP+ zA*FH#yx?gKgVV~zP`u0G{eu=0L`N3MjUoT^k6TOWh0JoCxTb`JMXDI`&3`d2!YrOIqM*#SaU{c zWEm+n=6xKW;dqs+D;Anzq?pU8<2f^oq^Q&TgMXIZZ`|YdegUfW^nMR!K<}5Z_m75- zVCN%->rhs^oaP9;dMX5*t0fmMHQC{h?6mJS`J$AQqj1<#qZKz}CFCYdR|PIkyaW0B0CLoB;D)PP;wS*m`xl zv9e|^=n1N*e`~IhJ%ziNA6YJqVa7xFQG^b1<4*;UWDSeiEIpwi`vOb7W=5jb? zrV)fv)Zvu#x8jw~k73qz_8(Lfjup<3{+&bmL}ZB`X@%?4tnjil_?<-h{$~GxNZ%~R zHbZQ)uxd6a()V|JDWWkNw_z`xhM! zrkG>Wn5PK<(~A%SI!pwUFtVM%rP=tT#@`p5D-0O9@ zBLrIjk*)AX=1HX4AjJ6zxJpTD9lZ2pQ8{Om$n2u+IRwZVdm^%VWcK6C02HSHxVi}} zY>!6__`?2G_~P)T!fJb71z*sNqxqu62b#q`rKF7&r@|nkG9E_Z+eDC~DskDO@X^vN zLmh%qOY+pQ6;a3-66hD~F66xzi0n3oxyv8a?O)DJ&geMNG)zi5kvoyYD2n##xL|y) zVBB)R5@Ou;b>IY{aTp$jF0K9D#r!f%e&p<9H0I-p`6d4V<_~BfKmQ`lK30I_r?J`C z2{O%YYYKnE)p)Gl39CVQk^$00w|#YBap;2g>ByZ1$H}QD2&XOz6ZDgsB0C@#r7*1|`IGs1d-e=Tgis?2On7q30Z=s)ZN=_Kle5>CSE+|D(u1bul*TJ^t+nBN{_) z1MLvej^|4qE$d&9Iy&$t>0pR#$XtoKbOJIKA>aCU(0_7kM^OhS`uweaVPF$hHB`@7>GGd-fHz!|fQ#Q*J zw-;lWIC0_Tlb5n z<#zoISPs~4F(zD`?q=`g$zI{j{x@d712G;xh`-_ud}u-FVS|R8t6q2;*}H(T;QLu#UEWYn1G3w>a6oRGP^|j3=_UYRT*`AjVT$Q!0gvC%J&U zz0=PNXbD8E-Cfsvvzy&pZyRs+N146ZU)6iO3+OCQH_wFn={6uhKrbMMT8z*S`n)|1 zlfAb^%e}NeTRV@qeOb^X+@(plq)E7}N!V%<4m1h(Y!be_Nw^=w;o`i_PH%aM{5C8F zZ0r<>V09f-bbAV8!o|(p>|P?@;mzKe+502LON!(nV1(j!tkEc@2aqVN${D$%&GgTi z-iiA=;_TMijfJwQ0{Ja$qFx}Q`eLNUr-R<{Hw@9IAU!@uorFmp9<3ih1IO%}vq>hj za_nwF7i#@aPH0eYF+G;n-VV{BwYl>b>S_2O5tpN&0C%ZIb(bwp1`nxX*aJP(vv2%Wh+l=; zWI7Gr>tW0+COUmJ9m_WRAf5dRH~aOT?2Alx(T6ITeHvm+j|?=+BB(%ms0wknM3HL} zR64s89DBTojpB?3qJQ9tj6ZHgMZ(F%x9D}0y$WR|lJW)ypvCG{Mt5a&xcH49oo0C_ z;NNHl02YGh*H}>6KOzQ-3X9Lfd~T{=!La(GGO&$Ot^Tko83DyKZauHRy~Q?7a+z{_5Nb_1Q(FE-eF!qKQ>xlHs_7ikFfz-Q5@-J_tqQpX8#wn-;0<(Zm;X_ zp`D|#72T&dJfp3Ql$44Ea#ODrIXlN!RdNi311`^04`W5fwe)?6z-fyQHc|lGMypAe z94q!zP6fmcoX!3F`E)=R6@y!bT8Tvnd^#?m=<8WJA8dp!GS5iV9EakfxjHdlAB~u? zONdcfWUJ$5j-y)^Mj7aIieji{%n12BhxBG);z{zL^jgu&Maw$Dz6RnISD~i_eR& z077FAt=MyQFuh{Wd7-OFHW(!OrN-0Y-?})}H?u>TZ~opg*rVF%ayGwP>w@3Jx_#0m zb@*qoZp-kqvZP|~DZ%$5D!gt_m#c$y2woGMgMUvC&WOY-zY3i!l575X=v{Rtba^x` z==04iNe!#cT@LY$YYD@(nmLuLjP3dyxUbU2T_IqjFel zP9e{@yaVS3+FZVnRU`x{pYW{!JyZ`&OLSDk37i7kJ=jEbLk+l=S{O^N zQgZB#tWj!-w#ktR)nQbrEJMwsc@WCD3t2_?uRthsPj>p24q7|xq4OONtMCWw- zxD-+JF2i1mvf&<$0ah%aZvYq|!)k3wHEsmpKY5yZ9l(Gk zm77bs`!Evy(2eK@vVjnuHJ$>{DZa{C=riDZ464NTUlDQ-Yk(gi%dq<8+LPL`)}nvL<`I-x#w#C6`>0Th>oiRH>sBl z^(@8-^k6>o)t$S8Mx4+cRuz5a2Buzt3q}mI86!yK-k>8DLKN`~PTr`gRPtggo3zAoty0Yp$U$=T&p;8C& zi{J7T`wqGQTh^L{M9U!FAZ6s*D*fcKTS2v+Lu5Q7zwG;JQZ@Gi{D%fO5yQ0VWnO0A9qLQ&w?QDXCVk|ZyQ(~7GX+{t05}jZERd8w?M4yoOifPCE)ogW$8=+#zk{6(5^3(YJ0a|^?~d^b z7wls2c$f6x5wV`TDt4z1Ka7e71pNz`2Wu(lWe*~<(0)d268XFT4K)Ir=qYMs6)@zc z30^~djT=Hx9MZ;u3XyA}6Rf350jr-;Z@w~$!vw4e{L%ZM2bhGDFpXA>Y}OpNGysvL zq|;!5sst;Bkihww`}6#L=sxUT{fHS+PvrLHSj!r}bKKvMfw|&2l)!l;Q-{3zM~Tf& z_Q$X(sXl~>%6@~3rHL|eqD#qJPA1hK(?KaZ1f0b^Of$`>Ziu#f$xzMz=^GHDCkZj6 zGC_!^2?d1s3an%ZAya7uSXC&J;8HaUmM#vpN3qhkhe;phKS`)TLOt38^&RY66Kei* zF4Sc5P5@sL)KJQjT!13-SsWI}1tQ-%3V^*=D(N`?YmqV=u^j-x*6=W{_cz=y`=|Y- zO~YH{M31z2Xci)3#q&_kA+ee}5}2W1?N(qJ_)jEJ`&yWsWrz|H&AXV#!Ncqf$4!|- zN)X0q9K|#spUrJJ>Q;i`#(DV#6Xd2I zDw@imqyD3nubJeYI(eE28Yku%CfHA>)|#MkWS(b&19U166R=|A%)G<|2kX@32>Ova z6hRWc!6c8=$!ko|_%wgbAkid!faW@rZ2X$nJIU2LSvg_j+iW{wPGQ`o|%j|^bA3(JQFuX$Fb8?JH~+p>llZzU5npsrM@8`F1|RcWbxul{PCM_ zOUid-FN3*Gu>G&r!oBG@B_V#!d_mJ!bt-8Q)3|aW6O!S zsRl?EI7s5V#Pi+H`G$w2MU1qcb5DE*dxK=8h`R4C3}C=wL73L!IP?C#6}<@V&F|5@ zS(jui)-oQaW&$C9>@=vbE@GI8xf~cW8rTd*tWXo*e8tuIu6DiweX`X_`cE34*E@W;^mc zHD%;vK~-$xM(Vi1jBC$0K(3HD@QqGuzz-{4XAr42VP(QKCcM>zC!6q26P{wiDOijV z{8SUpFyUz?oN2H{5?ZC8jy+nJ_H5l0Gc zmADz=ijOodTF}g%D8^Ld<9s=T6jD2p8$zm|Nj84Y{heg4Zjd~{BpYAnfle}kBYCid zXI17n{?50U{4I3lx0xWf$AHUF6Et4WK?GG8nw}t(jXY#gi@&kQI^zc{It6(g7M<$( zu5-T0n)o)ux)z_ns{%g))VMy6b;8E^`F@5$6yyF}X@a>L&1xt283+T~1d~jZ(25!a zWq>lfY7WUtb|P{I90tU0|6xEx$vp!AgT>h%Vl)_GVQ%?dz+|K@N2I|0^i5 z6}fy>x8s6!<9BSOeuRZ7Z6^f4Ulyj+XF=TZ13gXZoo4E-#VJ{8lAzGQ`e6ASs;yX;=X3%hZ~$ld}r?RFO2! zIwWj-Vb*ygb4}zLZ{$YfHPqmZ#Bo)q%}~w}2__I0EP)kIRz}{8gC!$et-O&fO=O8T z@TL$hC@)-rM@R30~ShKbzjiL5+rGZuE?;+7xhFejaBMvF=e z9o)HHAdOjY#`?SpEM0cMRm$8q({Xl#ECRlJMiv1dpt0^Epap<5F*$qyPphOwzyq|7 z#foR4oVy5^32!P{1f+-?Z5f-3S~p)^mwd&kpV3 z+Y(hs`-2zBlGSN@TP|7A_VdS}?HLS&i@#mzb#%l;j%a!b{+N6`@?BYuvlyz->In z)Yyr6TmDszvs@^bCQ<4|?9anUp%e{Fll9(y)Xm#DDepkDyU&%kn#BT_HQC*N-Am^W zL9P-P)D20X#>@Wr7Ii0~+`~XL|90f1slhDt;rXO~7UvTfK6ob!MwI&a4sx#e8tI5S zMqr0xFwAh?%AZh^P}VUJ%IzIFKS&S0{*gn^K1nF0GnuMc8d~=SW_Ekq2E^c2l6x=$ zjj?4NqoVnX00YJgBs$ot9yCJqL{2XjFM$NbZhe8I`clm{sZjIptgjKHTU=F^D*te{ z(=h{SW492X;dW%S!TsK9rU8+7gL(lgbL^Iv)07kK_^%Hs5?Zc&QbfWdqxtL~HXyL~ zUXB)Gq|*4f@LA@?NA*iI$Lv#eg8}~|NEZ8+&#}P^xx5hyh86? z&T|VSv-1<)0t#krySmBlqY`xPl%VsK zvgPA3yJW$l$i8+gXV%TAKcY8z4|5RK4~ZtVviy6H&f(I(5$Phvgo{6W-yzGuqyo{6 zo&wES;BLl*i(hmLlq41C<}L6s?Ai9;5aXeQ9c;qolRb&?c>sNp3p%-rj-U&ngZyxU zPGwBE_-MC4au?m>#ibhy3{J)+p4>$MwcDL>5q-cP%&|=;$}&>K0}Q`$hK%zhD=_YI8K?RHo#+mXBS~lUud7o$}w+s z{wK987`321iIIyMse9t+Yxpa9K|JRLF@VlYTod^Db{{N!RE&)a?#mD-O;zpHPw6>j zq$l54$!9ceQ}%WfCyKU-yVAsoo^9f~nK)6iO!)D)SavsuGp|j>g1pt!P1K_)+}p@kvHjP z>h%{Fex{0*NU(=O0wZhu8yC}yJ(b#*c>}!k-OV<@8@SmU;8pQ%wvab43W3DYM_g1l zqR3jfA)O7o>j^e2*)(gvfmzIjbdwiS83JkryvZ;&>>Ci+?+jKZ=7R&A!D@u4R!hf; zdUFR95vVuyi)Gr~D*G1sGlGd}w^T1gsMT=)Q`DQ6pVsQlx7UGsgVv%!;o=tnL2EL} zlIYBJ>~y0DHei)!w_^-Y##6dUBI09xPlMyl^b2ny?Vb0Pb8F2JR_vLcX&jVm)nxcH zz=Nhe{XsyuqXz=9s;?qTaYGSO&jW)X_0p>&N*--2y_Wa(Rzit^8|62Pq@{zXnhc_w`)~r!b1f+L0QM&#kqeT{#;gMM<0LewVcUV*z&2c40XW` zQUH!4YCUEje-VyHBhepOT~5Z~0ywfbI0_fGmV@TpObH!s&%z4Bdmo3~zx^v@I#7`F zA4}Da@%oA-md55kZcbV{MAB6;YV<=M3T$kE;&yaDtyBa(!(UjBH+#d*10V8os-Ip# z#Hnz#uWA^F7L62wS)&?)jq!5Wgam0=cNovVygJ6#vKV3soPY6WKwLiD(Ph0ZwbYung>2Qz6#=M>>-$V>MG4N?#*! zVM{nwUKv$iV*i_a=e$)y4%N|+)E4UsM$!TbHYS_B4OU5a(tpt1Agkm>+tWJo4%Q&-*CZ+ ztPRYF3b*oCf9_0trkGAbhK$5#X5ur;d?p?bTqZAxrzjiUfitZaEx@`j_Ix$+l~qsg zi66i!NB}4?pMlu)0Xngt6N6p|*J0|HqiO1H2tg8#hESKlGq9jwWIvdpgupvgFDMy| z+KxUdi_E2^d;aNc7>K`GM9Tc`I_P^;ZX{9*bS#W=%!CWl@c8$RHIZ;nKv2&~BCZ=u zMMF@6Mq=}5DJl$}x}X-t)NP!5=nJqk*q@g!LX6CYRuezR?8`5h#$4UqT)xT&q_%qX zU0)8tMs?l*d4t4Pxlj^bRpzdQ^d!sA&cHYCYxX?dpMgunV=AP%+mN*Rg=AoBsJ+Y5D*H zh~+Q2?SM_!_9D$1Gr{X@`WEn{jcK3Y&eBLm2}_zjO5ij>@;5{#n*Oxdpft=I08{tR zWJ0}AtXNCw#*!-nLI$@La~`%hxj(ae-U)c_YDOfz6Y!82jg#I9*aR#oT|brL>FosD zwGbZ=;#y2c)BDXr6Ld@o2Uj$`(;PR3;$0ot3v~es&zDkpxt0?fEkL*@`Uf?6H0#)_ zpLaxRAEd_DAs_fX{s6tq67z3w+#G|OKGk|LzNJ^8>iY1Mgw%7UL=25OC-y&{abg0= zipa!+_HmxY4<}YM>WkUZD9X*{h|%{q@;=00t;p|k52?IdlA-#chplK81%Dv=B87h9 z0eFfwEAOj#E9X8-oexgrYt#U$Cpt`5-Y#qC%&g{I3hESoA6jii-ytlk!#jj*;UYzn z^hs(O&>`@R7uB^;v(FixcxOBP*;=PF4qgoZne=}o!uCHgv=hVyz1{as7IemFkyhzD z*ZJtA4@Nx*V+?{|F^<_oe*hl!C7I?|+`j4=0J)s!d(xlN)q!ly`J$&h=2IRW4fnrp zKpM__xL?3mITwZa$V_%18dC8NP-ZIyP$06^YQM%R21|??Q)Cq*vSKu!@8LsS!M}lt z{LvBFXuK7@R>{jfU&_lpXT!;fUhj30`ruqVQ1cOA{6Ue>M}b0!i(tQQ_&y;J`6+Lo z)&2`>EEdVApfx^NL&>bvQR$JD3mZ?6cWmTX_7AEK`ldhJEmt0}2}IU;W)R?^pRrk~ zf0jG=m-e+{Ju=J%?9@Wx^K~7@4#sfRSH8*^Y70cq@kj4a@ssuaAnUC5%Cxu8w6~)b zy&A}W6}%pA@nl2kEXO0R7?pv-4dr+S&DR}o4(wK?GGzzfMQd?s5)P7M@wr2Fkl4_X zxaBj@eqA!)QE7PGsG}7*4)fR5Am~@2XGB2WwtoF+_0=|c;8LfMBR3MU*Qyv|d zlL?@qSM@rEXLh^ep$ZKim!#i}-ra<*{Zw5kkV9Gi_M7};A@$I2nfPG8jVi%KmuP=s zAQCT+-VT79Lvt*+zGH-d0oQnX%#1%|u3+6+_UV8$s0O97;`b-o>#QemI3&EOpX`nY za|(Qwt)Q(~v9g>?p<~y*g8>%VE6hy8OaU$vCa*C9J7@4&1qJZwiN<{^GYJ9FU{kJ*0z1u|04zlsAd7$~+&4 z^1k*cFf#2gkNl1+;6a;4l?qAXk9NoFQ1@lhW`Xw(d{vVGj%*a{L)YScp_Sr2N2rNB zHv$RHZapQ>_F#H>jV0VGhiTl3LE zHawf9c3#f9*9SZCL5I#5c;X8<2PL@~*>h*rD&Ir>1P;!{s8?>pZ0I*&bDMw-UB)Rh zSG{OJwj{`0f}~q25rF_oLL}6KC9>5pT>>{1NizoWpv*eC!5f6#Fdc;DK55WvzaI05 z1v+J@EMOELk8JbZY^Qpxe`B83*?xlfk3Z}+`_1zPJ_CT!E`ZBC0DKSKC&;s|*8s#G z!eF@gQYSYq_W{yLC5E{r?qP|62zo1fg`_BGN(x-1Gb*P*4eqV`Lx@*EG8`t`Axk`K zM_%Q<@@+#EU*%QF^^cjUoBTVJ*!U|B16IiHYZ3#7EHdAY%Y^xSm3*fL92@@#(CzmD#fshwRp19JIs_UjoZxCD z&o%0NXi0hDmf-1leGvdQ>IKYNT#_gNhG_t2`P;Ack45=?W9~bG>%2hH%SSax6PO3{ zNt3mMYRV!ztLn;q)|U7x@yBx3bHDP1vfmaIATv~1^E%lDV`V*um3FWYdRMktyZyn+ zj<2D#!}J!29u|o91|sE9oceSoaj=-fLN2kIn<=Eb9r_;@bGdq5^Rw0dOKU6~EI^7P zdAqF&XH0-c~C54i~EgAN79^Cp4|;R3*2hOd{}~6W*z5Uf@SzB z_dxmdEXuIpo0c4dwcbt1F<9muikJXyAQa=rDvX8l=n%btdrAU&0e6eLehVEEKbzyo zANjYVE?++kPGuGM;bo8LwVA;~;2)W-%CWYh#=Nu#NA_2t2L13bU;oVv9x9Lb%KD4T zwP$snV7fo@b^Ni?iqV90jX)Zmt(ps@Ms=^rg;$uru?J%GmR5{m#_J^Gm~8bW7Dn{e zx-5}#t=$P3Wi`c@N33YS%upY_j5@>QYH3CK({`}N-YzQ<=-^J)U@K9{Wgl%cfU{th z+SXlK6l}+WT+7?9nu1skz&)jSyxR+UIT+W^W`uNXjr0W2|V?4AZtMsh*S z1Sq%%iydN+q3-k+gs@vN6ARP2Lr#!MZo+a`I-1Dj0F_d{no*X(DhR1SWkH-Bc9>=~#OukK^ zU-SPO{x=Fv{~7-0{y)M0e`c@y2kb5T%kO(7_J1$Gn@hd_Z^-YLVXDU@o%KJm*B!Y3 zsGd-%`xM5I@Z#*Tp z*gVC&`k~489x{XuK^EWr^JSbS%%okYAz_rs-6}f*g*4Vm6*Z>p8kTK=1lZqw_rH&j zSR`o;T|zr(A}i=0cz4LJq5BPL;A)fbL-y?My3w@QV zF#T5S_W8!)^5c}q$9P-jpgKD(vV7sXG~BF!lavSh#vK7D6}y@tt$QY7dSv>>5pcz> z=8Vc_RJL#2W>j9WD~(Z|8P(Z0?n{YEXH*HJN_^v}3|H(rh*3Qm)zdd_hD06Ar~!-` z;2Za>L}f5)D5Hk@#yu!ehahTP1wIiwp1;HIuGn=bBk5$#Nd68VSh4FcMoux2{2hL2 z#jX~NoMs~VJN&$gT`d_|XCnDK{FI7atr*#0BKbQUO&>CDor&RZ!6IMfbkM;!b2;7w zOT(jk3&(!D6$xe4X}*}1TJXMa+#^Uw;zHld_qrp`K{}}!lSZ1PvETlVGM?1tOr>dW z|AJ{uy1*?+>%6C6I#W+PV8Mf!bdX!HNsR|HRT1<3P|aWx$0?J>e!DZd#zUA&+xY$k z4`mWBY|sUp)Oc9I`@`?qzfcQA->3^TXkUXJ&UQUT64vqdYQRabox^cl(GFI;}tT2$Q3 zfo4T~7?HptQ6Hanall zQ+GvCy6gn_x-Ft?S`3Ghf~R1gjJ50~+w*Pr>0SC3<=mzJJ3#TOKfGRk85AP zHajR1aLpQul&hThx8{_R}3@>_|nsz=)%`)Qp!A9-q39HXezjtk9&X5!f$@R&Qx3ucP083e2QSK4(JPc%d>7gS=VsC;+9$(mZYe8znG&xU ze`+;W4Iz+J=Y7o0D^bm{Hx|Ql;q_hh4tRSQ35q~kJpQ@(z~g05-~aE%%ROD2jF;4= z<0a#9>BSRokzQOWKlxw#$q7pmy?7GTIO#>+b_z~-3HemJe0=|BKw!wyhd`-2ch&^W}whyJ-B%$vxk(umJH zScZXf`A9ol_Q~1*qqc5RYJ^IR6zjlTPO@p|yqB+QFY3-5kP0m7@R3McV zElG=XZDWst@Tf8IX^4jtLr*lfH&89Xy1wgi_BF@>DU~}(y0KI|@7g}09q@kZ&Tjk( z?KM*B!dnf09|Ea^ZoCWmRPkAmQV&3Jb>_DNkMD6<>;K=I5Bo$u5>bUkKe{`kql;20C`we)?2=rLz+i^41c#5S3(6Z z#XXB@!CP>fW)<$;$CUl_O)~CJfY&1&>#pp^F7g8-b`fUEXW-&1AA`sqvEm)buAb;j zehd?FfJ>G3`YKzZ>k(`oJU(v~Yw=a>K`+k1HCHM2PoDnt&F`It=S8g>SJ^ymQ6qG) zyQ8$8?@KSws{?VPj}g91{kxkFA1;dOhvIF0BJKC63#jc9wlG@|7y+_iy5Oe|v~ zZZ(a7-ti^R>QDiB7BT>hIE#%~eI^?r)CXk`g~GwM1Y1fIVE5mBB%);IHtQ;Q!G(9H z4d3LO-!&~<2c2sXGQ_{Bao)p*k^;3Yyb15QbP%~~1!CBYrqE~wtd0d%oMCUjm?Aio z%Igfjqc!_BOv_?K6F-ci;`I;bq=b5*7ip_=REN(IiQd|Jqx9Arx}mRjWkZLfp;}+K z*)($w#bd0v8oAV#P8d$~YR9h6TL1zm@R`VWuiPCoNu;Ivp%l{d0a)1$DwLq`NKx1R z4X}XaL0|;WCU<;kLjPS z3*c`B20uCLP~?wx{PG_t4R>yo=AZUcX$+l!94X8J{P6ln=xpM*3_ca0nM@<$;(CX&^2MkIwdWn#U6+cwpB$PCagBgSr@I}-3c^oxX9Azb=Z z3Yj=Iw+0eN<>+sEW~yrJdLq6SD;G5n9DwiT{LZFLHa2%1v?#Uye0)dKLpAK8xg}CX z{srW$$g3oIeR!uKe0?|*~jspzc&C~kI+FZ74jebJXk zvYJ@S({2z3?kPX{KbDYzF9c+BAh|QW$|-kt+(JZ)bCFMVI0Jn#MYK}Q8D7P7zLrHA zBiM)Z*{`XL1y@Xi=LY%88pPkF@p#Q3ycZrFue0x|AMZ5LiY;Iq-lm2dXiufa|6iQF z3w)Ht75ATTGb(hWg5m{@8WpN2Q6h;LO(e($gP?dp(Mm-Tt5$@KQc($R7P79Z)JxTB zt5$7Qv}#d6Q3=<0sfu{RD|ls=s93Ft7s&tnJM%od8?^8He*SzuWS@DSnKNh3oO9;P znKLtpaL9=1h2qDu=g0bQnG5)q*Z6rFEFjsNsAYVwt6mA-S=%qD35NyohDVy zMWvE+mRPijt*4tS#tUAy`WvFyJfA=%EILxu=`2guHX3l7q>3uco_P0q)EIY}qdyE_ zJ;8b-u%VhBv`VHz%_+TgiMTryA&YNn_fgT2rWXK;MmHqlm-oiGbs!~xxSgHp5nwmb zBJWxm5}H~XjuUenCrTwZ)FhX=QAlfQp&C^y<-Ec@Qukwfa!FYW>!mxoV@4_C5*x7M zM|6qhCU=r>fqE3M0jM{ic?VFn@FLhYTuV<8rr6yn-h;TN?rjTJi}ZHpD28IdT2!?$6Gd)Mb z#eKH?Rn6ZJxy>)Z=wAF*xc@LXdO0D46ay_N?d9ZW<>!XwIh))-xW_cOqRomu5Yrib zG+#-Z5)C-%#RGVgS~xD`$}e385eZi8`aE%sIzEUUO_~TW`3T=M_47mjJaUmu$I9GG zp6qxRxxPplY+(Et&5-%t^TBxrwa3&mjGfxgGDekLsmkM&^qo5@ur_W*R`SMMyUiyr-S%Xj{;fIbDJbLj zQK5@%4Y?#`nyH?N5cb7~!6Yp^E9=Ju3Qf*YW&3YdMc z8$;lgw)-jmNJik8{bUt1QKhj>iH|U0dQl6*JtKy5Cu0Gm(puO~-TV-LlS@-i+^>{< zu1zH#7xXXO`wX<(uC9*U%yf5I$#?JjO{978<1U58nd(i*d8Q|glD%qEml>ZI3!I5e zdej!?AD3<$-_+HwN7)?pbFhnV>P$Q}8TH8rKd0wtz>q}j0A!u&+6~Ul$;ljK4(}(l zip<=FlFGS`I1cnJd*@B4*ahQdXoKqkN%E3g2vPFVAWsj6@e9d7COy64o3@EGT_&DM z^>3MFw14$9W78K-w=TG;LTvf~#RE2d2bjjDcgsjjSN)BA?u~t+ij8qbvpi>U|5Z^d1m{5A&Qdv%os|V{!h=*0ISx1PY%&VOJ6y2lfb=pohil^}O$W3>TT-~l9lk{JDrWbddMISRfwHpEA+iOh493Ggwy5q#br?eWpH zGKbF)MwGChF1F@xaF6($iTE#8{M(KdpO~!}hAqg9qzrSigJxQvRI!hdsoAfrYsw1- zsZX9Gn@v@sl(dJ427z>yBeNT_56VD+!vI;AFd&;wH6XVctn!723&^t}kj^0x#peQK zihyj{8z9XdlfQW&b3KrQJdjHbh}M-1foJin+e5+w=_Vjg3W&}HFggbI{W2nom99CZ zF8OA(bqN$}uQ|Cc`K{el5K0xJkh=yAh&w=z)JRh&Nr3bQ!+7V$im|KJ}TG0T7Z{Ks7ZD!Yngx@vzOhZ7foO8fnFsL!N^r}CR@+l*kSNf z!OpxlOQ-D>Kb{@actuJ3nUO?|DvM8b9GO;Mx+PW~HpLE?77DjR(x53VNM2?D1zfi* zQ1*+oT}O9)C);Brwmsv-E;N&Njx3H%kH4TT20Lhn!MUnQ+v&_)s%31D<&!zy5UBb% zZe^Iw=H_^j>)$iRrHt!I{>)2C`blkxff6xYvQ!viFN10Ru<~r%YpLOz(wDR+CvQr= zV5Zds;w!STAx!aSe69^3Swo|#E37ZiPg6Os4{n~I<_HAF=H8Ou~gN=yW1 zbC2nHCR!kC)0={ir}LDS6(g7;#yINYfg&d5R)}E?XTw? z61v`VXBydRdk-Of{>*^>;6x;whI3ho@0a5M3}l%aFQXvy#{F-sZ~Spqt^rd!<4@R_ zqe)6w`v$i?4v|nV`CHgFxbsf*8thR(gl!a!&SJnuW|}$MQf(}O%MiRslk5+U>eox0 zt?!uN^uK0?_HT=rNDxc=pM~uofMh_15-d+Y51v}&-e7DqP&)Uy9xfb3f!fG?L`#eJ zGci=m;yya+fgCa5`%cdrgE8@flgQd z&S$!nmu$`sIa-Sp0NN0c{Vx{WRP}memh7*K1E0$t8+e6ODhPFEhL^dRMAkmlBrr$! z*O=Fabgvdr==%!%rje{dFaqAv`*rYY9^I#+@kFe|pP+lDv+6iFYu_LSMO9Qi6#ih` zGg>B>1e@iK(g=v(f4aEQ$7_VWQsO>DgiR9~lV(m4+}Um+o?41LO_9vy!ZSVB=JV+r zHOZC+?dRvR8jjWQ7miSYpeIuO<5pMDAuUEv&prW38>at!$UT7e<_)=<=v!~4P(?vz zH`}7p|4;+mW5@|MXstQXtdVX5G-#b^)nF+fuW5!%=3eL?wBVEEa&<_$w?#6K`m@uz z0V)upkEK|0y*W-&CU$g(F~9b^xj6spsvv)d+ZFfC=G{hlC7|9X={2G_T5WcJ*h@&k zRN;$>dO^Px)9ic&nSZrhrk~$pGd5fGiFs(gL_0+L>o77hEozjn6Lk@~7CQ%(%n?cQ zbTrxsoIc$Xug^>QmEWJ2$n2|*k5_$gW!UZu^D2J`%vAXfs{Brm=HuC%BlB`jQck&P zX}SA|!6@?^WfwM{U&4=u(+S{|SptjaVbXS8eqv705a9XiQTJ4l&guuw!NMt>xJ%Z>*gDnstTy9I`)ZC)@tBSEv{edL6e5GTu!b3@JDG^yZ9!fH+!bo+?0Dj!f%!kmfqbTo^ z{&^+B=PtsIhgHXB9!E#!*=udH0>3@H>w@o^U|D3X(&n!{b=LsO7DQ2Ra}CP+ zYdgYgYt5wvuWf!9uMnKjB1fRR*k(_X=mDa!D&DQm| zs(7XecagqqwO-k`anY?RPCS@FSY*H=iOCw~;juo@>i)vmSUrCzx+OPYm%9BKIGM~q zxoENr*Cr7&wgN+-z-?w$%hemj#62&IB((fVR2*?)fRmjZO)gXgt{XFV4GepbVMSaR z6sm>|D0&$ggM->HW}>UKV)~ek#lu5D^7$jV!G=(GkGzp_10R4?1N~vA{#Gz&&VOV>dZqQhgM@`{_rHB8g$<1WY;KYzaY=NOqGYpA8xMsm!&@A(3{^a@_ zoB7Fzh_k`%9kk|cuvhwSgBD5bqSoaq%It%D=j2r@O@kO9GE3px8mL;7pV|F{>DF4n z(azqy&gjx?w~m*fHyfh}kcZvm;HiyIjK8aImjomTE}%X!KBH26YKNUb8^E2{dmW?Cu%i zYq)?KWRu*}lQ#V$2mdf@$R*i^?8zt1|2*jZ40NwuSfj!dSwIan3(hduHr+ZF;P%i% z_@}Ej$op5L8it|S-CGRVsS2}`-87BnsXnh?W+=ZztP21a_Z1;L%G0taeirQDJyv6}00uHv3-iZZmk< z`A1H#^ln^KB$-+woxQu?rfE z(axzeMjNw#j?tdU_1H`tT4u+M80C8`u>(Dp7PQ?xv}G6{>VFSyXAf<=JZMkmpjCv> z+D8WcFKCyTK=pq&X862L6bufP2?z@O|HythhYEc2U7Z+`hi3tRI8{rWzAgsH458GF z8K0^M^umE4#=&w;9_*C{w)_&{nLM@DEYRi{G5S&NE(3d%n`mgYySoHYd);wO)cW#O z9RftTDpFiHSvSe97>wO zdX#zuD7`@kYZFWl!Fmo@p}mxqmmol+cVylp>UypyjA=h#?+)AfCd~dn^7En{#e@w+ zbQ&)!Xj#1Y9P|_~M*?1E!XR04qY&F@YLfU@Y+b_~lG0;UYvnJ(-axpM7tx z<$IQWZ=obWjDziZM%N4PSir+8;wJQ&Ltth1Fk%1&Pr*Q=Qy-aZ6ukdfqu?F;<|z2z zECpXgP}I3MqJl-i7k>o>Pm_tt`j0O^(aQJw;b;Rh1TZxVHUPjlJ|#gDubl`0c~YUwa_?dLXqPmo57U$XAAim97oJZ12JBK|Xi1z&r?p<;LUCvzDG?_TC6t zYN@V=Ura+;jQM{)X~-Wj?K+5FSk6B<(b@5MKC&KsgKk(4~XfSJ$AblY0LUUiBrIK`9(3_6N% zd@W5t8VrTnQd`%z@NRW^gSczy2`+66GNOY^8gKBlMjTfDxwc~qz5`o-&unnw|YX6vpxY9zVd?TDyV zH?y@#OH_da>N?|aYS6rZ`JzHtG&>)l`J*|LDin}gqWTJmORIJl;`V0vtuAQTkDro) z*mk}JJ!t{rI4T^K@QO8psI_l^+t`N*$1AdT-Me^WWoj*tUq{I=abJp46MwzAPATfJR(bEE~d-J zcR-{eEPP~8ScptAMBvxVOdtevV_a9E3!oqp^kT>q?YpZR*0@{HhQ>6q+1UB5Luo$d zTidI=X#02GMAV%9`SBD!KJVXtnw4%GV(pA@z!Ckd2NZyo>Pkc*VG`TWX zl*FKEPPW={oUyG(Ai6Rm7o*PKL?i8;aZ3=kl1=NG*DfJcRzY z&(@+2gUrt8u@c^$uOhASzC7yR*rn)CvmE1#iu5j;{4rL+jLFKw@B$&NjQcLOJMWcA zg24MxCGzRr#Eu4nQB22SACI`uXfuz{9cc5O{gm(BN3@y5v?wr;&tn#82J*qu^69F_ z$>+{4f;LT|_RB@o7d0-@N>xF_B~1T>7y4E&(0}WNu?|_%9F4#vkM#!k4`?Z8l|Ktq z9P=r?k(xWvuwUbbq2~EGNy!wawyjwaZxLVuRi~=weSf#FrL(WNz#8|!^?_{s2}i#5`kAOR8njV^-XFI?HlmE2fGPK2{_4TB*-!bl21bf205dWKv$F@Y zRA7b+%w8VMm%lS?PW52^?7=MAUD!O815*@&d4(x3*i06f&I0oaa<-NK0RG9$;&m8r zX5&vd_!KuTGQva>EQ&&&8#l>A&FV{{rd z$y*R09!U&0TJ#y?Auc}BAns#;%MUV$qYa`a-BW<5-@zW@Ph@r%3u0FT(tjrpn*g73xHr$_BSXz{1<@+u?GdFufUweSf=>BfMZc)4gDGyi9Q7w_Nn=zm-`Kh z!4nNWlHiZkNdfI^b#`PEIn~kV)2DL!RI7We;)Z5s{PXH)peiFx$BX9!ofK)(L4|>a zbQ@7{-qK&L(d8841YmMEl1Zv2tx2+St|DxEkxdxpqvpMJ4+Fa=$@OfBvM@0?Qqy3s zkHxT|N*7NZq9)|jx_rtx%`Wa6H4%=e&RS3cchRps2AZn)_1pJgiCZQZOBCRjgC(kW z(@*&Y__1mhj0?2(QSM(DK4OW>)wXoiZsc;&Zx^&NPk2eR-81Jci6mG5srq&xy& z#)UvJ1OG4&rjUH@Jb`JE4Up=;y$2KXVE$}B=%Oh99<_BM?O~~Fc$#E z&13yd4kGNsu`(p_gP&_n?Bn6x4Ls(v=H#0YKppH>YFL0pZxu`|^Oc3bd((7dcD*Vb zFIntO*^p`4PkRXI8>ydBebqO=Yg~A`STB;ehrf*rPgA1dY(agnAG5Q=&t6R#I)6pns&r3l zGD58bt=8Bz#`ZE~+h;eDGjl10MW+>U!}r-4zPM|Wg;{GKm5g4v6B{&Ri|~paJ!6Yn96N8u7NH*7MxtDcYMf>5@lswruag9QT>IMD zD`t%WUP0Su+4;maY~j#|BBA6_LyG>jkLsP8+ueqSHBUA2Vr=HC&S;NWM%T8#2jis- zNROktn@I;#_#Uz#viigw$l_;fK?wl7ynWbl{0;pP>>1(I+A#KNwKPkr|95ALqFROD zMq5R`I>aj2gLn~yf5tM))!`6L-N)S7!ju^v6{-CGmLJ;NUN^h4zI2=--Uis73v(R+ zlgZEkt{g0I1DR1_CqAH6s7ZCqqsF)o+kb!|yRQFDX~7DApRP2LE>*k>^z@I{59pE5 zXWl9rP5<<4%RGA4F~m9pKkwUf;j=D)RGw7VtIlHWJvEV20Hzk#b-t2)Ox$WwpFG-q zv9C<-@=L)%NL33~BW3hY&&~ePo@eJh-V8VC2YL}FvlhE6;cKR-9PPEv{gLh^e*yU|lg&n%HoGxC6I&p4@XGIewztbW zW-E4OJ{zNoTmbw2pxz5_2^#?q)k8i;pC%*{n%`vM4^d39nH8X<7a|%jqM%t6i^|Mv zB4m@zN-Gr-aR|Mv`7skmx1t-U#;K;TF4+=IM|(#Smm3h;6`5C1(_G!Vu97+TRVohC zjZ*ESqJ#uNZ2YsY7#KU8);*=c4_fg#San}z2tsevlpBn`(C6yx=d<{1efbOhSAIrb z|Ec-vk!;D^4acry;5N@q*`Dr&%Z{yUp7E@k>yuY>nFMRLjSV4sCUL)Jbs%#U>%gXG z!j)h){HRSuv3k*ktLc5f`GJs9bTgtB8yO*@o7r_M`Y|-n#tyXGP00RVXm=H8XBOGO z$>u{lMHAxIgGg^TnQz%Eg>-|9BD=QAb9`Q&wxnvS7NgT$*3m`oFN`vFX^nA1f5rn; zwqv=^jb@0IQ_EurQ}|ATnQ0~~^h3}d;_B^fSQ{+kMH?;;l2TzjdVOH99-FSZP2jo+ zT)gTa1f5nBwpE$uG>Hm(;pNUm$7U+6F;rR8T5W!@x?}+>X$8FtGB5HeZ~EWHe&S!u zcOKTFu=jiyD?Qk7z8-Cv8K_3G{|BM}IVMdiXPCU!9ZVW>V5;r4fr$!??$_vuNxbU# zEX;lLTDL<0^I$h!FguaVD2^k)^jjdCd6>qDH<63wZVDop<=Bu}k2=kB_87030*;-! z4`8Q?Xl!zMn?I)HGZT0-JDll-v+PLI$4E@$LK`LhL>nVUQ{BLb@z!f#-ZYGBTsT$( zX2YPyg)R0F$(wWRrR79q_!g;)R=b~ryr@lE+BW%lwoxz0vlHI96>$UBHa9o^KRYA% z{td3hz({GkChz;z!S~nfyA95EoP999KU*DqpKIT(S$1~=!|PoV?R1ZAiNV3_9b!M_ zvF@J(%Jhi@>)@OGCQj3E(XfKJHPJ{rMK4h5g{2A@PNd?xC;N z@`;Ukb1I`t>&2CNK!iYJLd#HQJX1 z#igNeHL#iV>OTocza_X2lo1~>egoB@;9*WjzOjVbH!k7r8*G|PnTL}l~ZElHd>1=l#eplup zgi+Ea&lF`F+eeMtI%n42_U%o6gm*|S2?=BE26MSj?7b}5o~7-x?*gu-R2*36i;n*) znw)FI6`SJKG0Zc6rYmLtnrB2@dN<34-m$0k>JDh<YP z#XIo0sF%&-awy9{wnrKJ^psP@hP_4|BsT1^;6VM9|GG$QIDmc=8y@8@0U!NVN_x^& z`;ysR^o^`Ex;SXWZZsm4tVvDWmw^9C@#?r4B=Jns{-B>o;z~w|#)Ydb(KJaTNFX@V zb^$FpLqh)Q|KuqqBl{Ruy{3BP(%T3*`7DBox#Bxb&HY(QJ6$!3eD3A1k&&(jz5iqn z=3QH7=yiq%bF6{c*4k*LuMNSB_Fx7I%q)R<8_)8J%tDlA?gsZQTkl*%=wd`)B*vX0`WY z*e(;`8%!|;x!o{!x4Am71}dFCwF8kjbF zaSRdWrf#Z3>`xqrLDfAUepr7k_1mN{a~0_05#RSD+)u>y~H z6-_Y5dKa7ZRDDTySMimE#*A5`in+BJ&sUB%kd+?fI{PWV*FfHrQiZ>51tZRK0HCDyna#hRC@fn06DG!2+{ZvgGF<^54%V8O9d|wgj`l&^;A9 z&*Wi%lxVbZp@~?-0gVeQC2I}8qPG-i81g?U`jVZRO44P0H03&_)W8)0|G7PyZia~P}gAZja#adNP!x?7I%*|Z8X}RrcGAU zW_^Jd=9aDYqoQ28&KxP2I{IKGRR;@Q(If}%C3hiy1iVrUCxS+t?S{L!aomk9_wiAz z6t~9p9=cG;!bTq54H(e+n)2Gx`xe_{J>0ISWJxRQmCz+zvWaywu7FRxN^6Z507d^~ z0_HxdKd{}+*4g@Fe4IX}`i~q%Gq^Y}1Q1T-&t>ftTO_Jn;k!aB67HnX5e<>V!}f0B z0+|DL!|9()!WZ6}eUY#i@n*dUA$@1U^B$y_5)qXc!(e6QW;=>0&BqnaU_l6O!%yV@%*?N<8*=$2mwEXg%jRFC{D1TL&(7sPt7HB-Y6m`q zh`V0-?@%&cb!aaC2Kp=y{)^fCXDR>FK7XfN{-Zm>cWR))KScRucL9G@eYU+9cZC0b z7JmDWX`rXAHw{5DgOl|-OZHJ0vYxMgFAA06UC9L%|4oC#*aC<{A*6A z9#Qm~Os7lHm6FSUeg?ox*r}1{tICM~^3!7wi2QUj43?kXwAJ^bt-i~1m7o9qt-iah zzTdi4{Y6`S*KW0Zc+suCFW9R5#I5qLhT!?-YmS8oG`crtX^7FPd)H zA!k5TZ)|01I;2?Je3CmQhxASjS6TL6CZEEM_E>Cr#VfS~6b&t&NzVn1+_gy%_v=d<$+i))J z&dptRN%?4y^b_Xz;J_i^C*ue4H1zn~R0^x74O(g^(89#}?sf0iz<74buAd=>9N+kp$86Riw z6}Fj-pJUIX?0F)8qp5_7DL}}+C~q=8)t;3%8NY(RprOpocC&6OaiM)^@*h;LIo|9O zmsld{6O%1*jZaLmgn~u^7PG{){B=ywMMgw7-ve`HxSd1y3s32ZhQi}Die*U8wom$2$Ixi=@; zmcTJ3(aKjER@TK^O6obFGrn#uO9vGt(e#b0f!G??-vG(AxyMc6qsJzij<4hmt}o|* zzS2+X2}3c78^s4(w7SF^NnBizI8?N)drm%+uSQdf?OD~pf@?}(+PYc%&PoENfo0aDeu$1&k!IzE6$@QeDNQTj!rQV*;;jgQ2Gu~GT z7=4mnRr*)T%B!h*wZC4a5`qE5=lqwo`bowc^^;1dD5++jQYliieaf%CaCHK4n?pOP{hV+(heBmWA*`pRz2;_-az_0!&$OwlC?0POrxB zDwWVzJ``v=kY1>12yDo^RN_7UCgcC*FM47vKg}FUq7R?g2TeZsAW+S56;CBTw-1`v z@cLNdOcWfRC`TtN=0gdis4#r7^x$#|(f3t%$dm%o${#OC-x_CXD7jSFDFtkK-#xbQJ~<0u|s z)-n1?Ju!eE&bLz{9k0+&g2h!U8M`0@~#4@-oK|OW- z{u|rD)`mZFQwt^8i@69fTDX{c^Gm1hQ)!N$Jn%k2)9ArZfKE&9@wwo!IsPb5+60>T z5EbXqQ4!Elc8woOrJfMDGNGdi^3lmC_$Ln?E1jNGjnxqV0gKfX(mx;Nwl+xd!G(_s z?azgtaz0`3p*g;iC%$F<8+o1zw&}~b;U5`#=N?OPk9~8Gn)>Ts;9w0R3Eiz&!F6fE z`Ou(G&9*Awc0#Gh9kc_D_f8~N!cqs5`HCmL7VQr@fC{?)|1 zS6A9A@0_u)n$O=5aPOMoMUi{g=P*k_`xalc^uh%i@6DI>!uy8KU1k7y3=i-X-RfVl z`A6;=w}XExdrs3|ACmABr8C-9qIRminZ4<(Y(k#VY(n7~*~DS_iOT#$Rer+G>&ek^ zszfCq+6<4lDX!qv@9mX$n^`c@Uv{J$0;gG!XSgsvKM&)!r$VIKmS&$`a38TE5GFJ4 zk{?gxtyHgfMz}w|XM}4OO2RP2E92ic=Arr~uQEZq+Fr~;)yxbw%KSYKo6K1x+|64U zax2_X|CJ){f6HK-{1z0OQ>y9nLPLU^wihVAELe*87c0`X6!8Z_a>e$Ky+x(+eyF~b z_l44LoMJ|2)(S~(1W$hIZqw{9J*~HE+!kr-i;z&D?IYvwzz-Uh`W2!+V2bKvWkW zZh?Z$RBa-wP(3~Kk3d09fPz3lak%~|7*8@_&+<5umY7(Y=ljEF;`0==M;#{*`gx$> zCglXHcx;B77kUc9AR zA%X!4yH(mNrZ}|(N$#=H>U~D}(o+}$rj1dn08uP3L4es9AFt-4@mz0kO+7IYg$>!= z<*Nk2qf(c?iYb#eu_>5i92{Pcm`&2gyQ%e+o46_ml0=EDYZ@r-*VdQYmC3}TpR))( zZcOA{C$}#%pt^WF>zKr75un$E1C;u76Fq|DPQojT4j)nZZ6wi5M+!u>A_tkm5v8Z| zQTA3A*7K^fJ#Oa{5ekTEDu23%PORSG7UG3oG=R3c8NVWbq6O}a9Toi_cUHEN5i|^H za%hQG@dkvkd=UBMzM?ApX*Y1XJ2yj`#HzaFtC6O-TF#CPVhFk9?>iDPbmp+Uj#dxdCDcPW_llgUuH9is zW4N%V-3uZ^s_Ps9O!c@|KQM(tf^6dH>#KG|S#}YJrLwj7irou8{Sd5_4wPI8-&9UbLQal-)?##q)qqTi;v z8MxNkr$?^u0!R|{NMq#Mufer8*@Db8uj8?-J@ctyUrQGyzt41|NY+0`y4XH8QC3|j zmQPO^Wn^^^GcK4YWO`aAEL#@!lfpk;_0^|^p8D<-i(<6!L3X+NLH$J9EP38dnh3%8 zn(>YGQx0*;7TZh3;#I>?7BGdD9?BqCo@@7Ee6v=)YJEfICA}98mX$fsj7oXko$pL?$bNw zo-1$~;oO@almA{1{SUeP8g;U$MXtY@41#{YayKitnRK@e2t>j}CgA$lzxPyo+BRQS zNjweZ*zi1nwlZ%BoGg$xc!W10K|b$+d3n##N6Xt!c~2&p=d^8mG(SN&vh`)P*GsD?eeR2z_aMs0X zdJN?iBEH7->hNKV9_o@aHGKoder3Q&&eXK6KDmiu7lPE5MoqiBzVt|4>Q6DWWr zO9YQ&%wi+OWHfYePxSN)!b_n~=RAqQ=g3>}25paWQMJE?5C{e-`2&FLF2SxI${ye} zw5&ba&qb@G_omlIt3aZ$W`5xnm5be8HObbtGK&MTd#0z}4Lym99CMw+ewj32I7X+hQx*Ms1S|A)(_AC;Y#o`U|rvah?xjJ|qpUBHz6vNqZ724GD` zxyN~o#mAk^EI3*z0w6-hG-p}rr#Z7Y-8{}m&G%e{W= zWRswKKVcHoI@3CYDxQ>!R;%-a-GjDZIM_{=@<>9Chc&j|h%TyGKzvP5Q*}^Nk*TQ-u3EL+2N11WzD9?o zDh%%Sf;+{-{da%0qDQ%h`{V~XxQAuoI>o@zl1Gd9Wu$h`1NT&bZ~;LV;l*g6`B0m? z&O$8cF=H|Jh!CR3b|HolVz+%FIv-)~s}1g>mwsq>SFYrb;?q(U8BN@1=@A~IdkRI@ zUf*v7qjdSNK#Z$&vM8M#pwvewrK?^empegdeQU$aQkL*aY&0|dy^gB5{-v!EB;0W9 z#muSH6~-4uvjOFx9R`6#nr@;S*(cq8Vg>6Nu~VZ#47s8ZdDAI&Zuka!MlXxm%eF&a z>_-#jfxxjdV67cY-QAt<(oi4p=OaXXyx0Pn?F5Y&5xLZ&=8TNiV?00XPLN7#!7xDh z{cwL_=in{}S*JA?7>WLFKjm%ji9~P0?m-lH8E#A4Ik-tep02uzeD0v<#7-6*o7od0 z33d(*CMv+W8S9gv|=0_211vxGUgtR)DRi#g#)tM*BpxN~q=}j{pHdEv zqozHh`x3tJlG>EM+=r9h&Ntp8Fu{vudJ%d!jzEiON~nzsC1tC^ks^q5Wxf(?^mCPI zRL2~oK6M#mJmY-wYi7&LP~LFov2_4kHA89GXGFg*%b1FwJ~S`UO;seQka>x=64fTZ z(!4}BEif;UzYZIFDCmOkNM-=?IOLsbtu40_^u5eBaTl!)kj)(EOKu;QjGdiVYOju^ z24zcW>LYcQq8ALR%)k3lETVm*%~aO7zNFn!I3fRdYn}O?mu|aNy5@uLRC0~mnTd=a zPijt$riTUhqt_*WQh22fRp}e8WH!Q?3P=mnb?xBy`Rf?g`(jT`3GAs6xHe!A*;C97 ze{N3wM1VZz)Ra7P>cY^R8p}9PUwNS_*lb-cdkW9N&&{cM9?H+msiSk|)WE=;I>_T0 z+EcpX87EjTaiQ4sjo3x7sUPKHS9?pUS^7?bu{`$wWJzsw6JDl7Xi1%>gm{U`d|*j^ zhVwpfXF%=V?~`G$WC=q`Lphuq1aJojhF2E^ivNP{F-Yp_ZO)2wn{ zxs~*LTSoobO~xWM9Ysqz>W?zrw3-*Mk1W5spJa`o)#NT5$to9LG@)lWYnHU43=_7w$ZQJ}%Z~F6B+y0SDs~FL;z8@6$;?|*9L2qp4sue$rp9$c- zl`F6M{^$9t@Fww!tiQDuoCVL=7z8czRQ+VU#hDs#i40oCY@GTGza&}s@dGT z8#MdIUud=ucl8H~alXze>0^J$&Yr3ndM~>$zNH(QHJbc5n&gz9b+O~zXRK$#sNkjZ?=THjtX#t4}!rMq-N7zY^R-nFcam;JOD&^dr0G>aYD;wYRSdW+O#~m!fgl8#1~0+Q)}0lHW#vA_{O~4>Yqa1l3~7-r716?k708 zti>ph*eC*AMZj8qgLe#}x-L1GyXM0@x$JqBFLK|&{iv#F{Ks~V14Cl14(_L7I;MF* zmj>-SDGKT)Vt)JBhIsq7u|4DMzl-gf9`;{s+)H;z54&H#+s50^O0I5LznB~|BbqPQ0bA%!BwA+1C06yXlFGF~P(aZ6@=Q}@`-@%AwdZ?s((=uOe<-+a%Uj0EQC z`){mOIg#YNisUObr?B7g>)PbkvK2SioHQc2EFAdR!hW5cDI8`|&v^3%wy<;-8UTZC zoqL#Weo71*nZL<%`rs#j(B%Ny=r)`8>^qD!{UgXdo!k@b9$fkRQ*#gEZ(?I4ahatC z1gX>bZCt2m6kG>S^Eb*3ka95S8j?t2DQ{A9r798|r)~q4{;&`#&F!0eQ6YO&z2id7 zXt!`QQjiUu;By`{5%wDxFb$uCsN_a{1nL#PjUNqt;ci_ z33P6%HQm~+nCb#|)B?n3d1f1m1pNSh{je@OG@(hpAGS-XQNo|m35qd5L=rl~pI65| zr8;7h-7_DWLZ9%KK=fI(r!n=U{~A+2^h%DYZv$7ahTpXvh@9svb)4K#%Yx-;y zGsG_&-1)RRbGs$0l|GHZDsyF!eg*{EGtZLp`jYR@KhF1&!S@xzDsbFM`|{(jmgm=I z3a!IzqCj$w;B#s4dysxxhYi%v*8InQ!J6dj{?Ixb3KUVNT3{Qp>(Gij`Hi-UANUFG z1aBSU>l_l)IV7laNKoexU*{03lWUU;=;uzc8ud1ZvYNWFOLN(HxBI0V>>z!vQ1*ef zEK>}{EKuBSZ-Q>~a&tdS{HMsJi?+(&_D>d__vvGu^Uc@loL>LZ7@02L_>v~Q^6>?$ z&PTEyYpc$kH_<=os%yyS1|c(<-5|W(KO=bz1W{ypcCgx=+#t0%h7qT`E7A(14l`R8 zX{x2;wceXPLvCvh$Bg!q(WwRY65M0aS|;&P6I2jl-8tqL^a2FQ5i#>S zI>YQQ%*GkJ(y_nPfW9=KVTz3wZ4WRDJeo9}&S4kzc?%bN0m|lTZW8J*Q>yu;SJ$L$ zT^fHg+LxbS`aS%O)36Qm#)HgY94>k3Y%IdJvYfd9X*QOUn~8r>@>3}y{=pL4#SZdP zupxVmYV|y*J7bwjbhJy+I~3F@7318C8bgz7*a_`cGQ15fdwytHOKtMY!1{Yq`^n5z z(CS955ld;$bfO$KUvS7FXxuZ85W}z04L$>-3u5CZ9dXDZV+&YH7@%j4cRifXEG$fb zsydf;p91$B6EftU>wKngJlzEUpf8T%Beqo)lT9mmd zpv+07wG&8)GLd;Fl^)xCQ|YDuzp1p%FHz~w^2ru1RVS1{s_VW)amJStH#P(nv<9l> zXmtpy3jdo{Cy4z#tqupK-$l&&=Pspzq#ThaDcb)Fx!rrPqq);1jH0gkKoU5bp}U#IMBmYPwFvHMD3vS&ZGF;X{MTMz`-1;b8Lo zL*dgaOaTdul(N1T68W*_htE{Ug<5s9v1EhWgnU}$h-v8!t|DXBPc3S)YfqYkO9=$L zqJ;ae#4ETak{Bsm6mR0)g1qUfH}PfTLhX*JK@Lb@mSY3=p5UKEFQN-<*Lth)gV=J zs;{JB+vtqVsELBSvnqGU!saB`%Wwr<6(-U^^V_G0jo%I5F znzNn?PqqEpe3>@XCLYI`itPnoHMK6&zk>qXw|e0woIeGg3`+2_zT{zK%l zWAJ?ZX(vfRkMlBSi>Um5Y$*? ze7A{nnUjl9ZC zfTR%V645=~;}~Z|($*Q&@6e?p(jGY?rEn=3kxrEPm#!L5J~#892sV_k6IB4UzX$c* zIs?_)gZg2KK=sUlst!SI<3W8zb~iW#H3qCE(wEv)V$ku2Yl>VlKF za;;;FgKySOZdc}Ka76aTs8s(}l~4DW>d9O9vGvsLi$&hyxn_N6TM22_{U~Od_4Y?J z>phfl+Y?$cK=!U@HYtU2038wfV^j0BzYc^60b%#IT`~WZO=e$xRHr6P1?j@vdAfn? z)7sZJdn5cI6o{sL@N4!)_`4||z6=(TSdg7UTl|gi|Iv7DZgy^j7j1NIYODJlqd|Bh zyxwMSgg4K0D!37T)stXd;QD-QbLa3<_;tMFv=$?@zZ708Hvs(>trOys@|VK@i&x0i zX(g2l8o5R1E^rHREv#$WiSjC}5n2Scng^QG%k z{f{tUz1lu8F04nXKDi(VQ{gnK|4;`l^Sab+xj)JFbMs73_P2kf-60PXinZYwMZ)*|LgYg zIn1VE2fKY-=bdw`+*tRSrcgg_o9x|iG4Pvhd7{sU-HjYKc=3Lj^SNxi$6db=?s%G0|9S1H}qQdiX4OV*AkeIPd`BFO2nD`H z4J!)bS>x9KU2@#8zn=F*cj)(U&H8676R^-2G#6ks+JRehFDxBbwo$?ST$lUkN-{aE zpP_S4gN07qUY?6u-5R1Lx{qx9u4#WWnj*=}puTcl>>ezo6Uc`+De6n?g#jC{xHytnW6T{MDCIuWED$<2MCg1dE^#D)dA(<#FfLSx~m z?|Eu0bGFbr!KMV&Bq2YUbC6&4Uwlg^Nh;@ZXD)%oIe%LQLV^3_PT#CMUa;S>nYk!W z&A)>6-0=R)nv;?*o2)0_LfY3-RJ}A#7Z5$R)MSvuE4#kD4dmAr4t%mRmRT;p)MB@) zB1c%&ny-GT+EQKbRCX^%>wGbZ(H}MTdNJA>N|u*JXPfSyBSlKLbjQ@opWl1EB)zxF zq_XR4-Bg$Hjkn$k&_sFG+Z-u#v&|Vp%<4MdglB_$OrE!zlg)7P@h*WZpjgv$#E66t z;BEe#s2a}OWx_07XGT@*B5arsnL!0cWOf-ZXQ~8?r`KXmqsV?|;}>4tfZNYyy!2%Q zE9Ks|Enf+jsDQu!p6f+Olo}O-!yQRUMSVU-5%8iZVCpRl-Q@<{Im!@ME5}Ir(ZQn zq=A!@@!+c6Gtk6skC3rbm@zgrn<;Yr@sPwTgTu&}Ia*2Xf9?_hjpg5itO=CQyN&W{ z;{0LI2@%Ku;3G5`B@!TiDZmyZ;h@%ddeF||na z<%F|H(@$mrY*K%fl(jsm6&r1ED3)E_sD!ljm)}I^JXugs1W&cPGrhG`lUxyLdVn0f zT93jUk$T9EoUcn=Ye&)7RlXD(TG#KTy2YEjj?k_txqiytZQB`bxwNppvW;s{DII1f zSO!NC!|9jN#cR7p(?=G%PY_eA|CO~YJ&Zw7$h!ZEA~mVUOKSn9Wl1eaDjnrlVPCw` zNRLLki=WW2@O}Ze69#CiB0cO|LP9S6ElaksGqg6lCcbG{?8JEc`LPk{VHtfJ>TWf~ z)aO5)U`<71d?cVL-TS)pJ0>-&=1OXG?`sc@Y1n&jpgY9nJy5fLUBV;rGe5i9Q}kE0 zC-$D3P9u@bzP`R0VSPVRU)y!wkEQ&p|6=(cawC2IO(=F;i6?~lx1s%+v9J^Rocy&~ z`FH!m7zjo8j0}z3cyIM%N_u}%s!w+TN%yFFTMg@V=0a=V+JDK$UkV!Dsy#r%Cav6{ zXp?l+Aac2VX~a-AX^ELKPhshMeDmj@74CTEU=J z>$EAMt}wG9jw0=7F+4`I0$mYU42Kw@%wp)Xd!bh}=9|=IuUVDB8zzJCsuFSlT&iFZ z-?LIaeQz(dCp?NO=oQ92r8=A8**;tLDe9&oP{`qTL-GSjX9u&U`_GWPMvIFw4nW~A z1)<_7%T^z`{=}@}c=-|XD)uLk{(s7VLHako3CZ%7p`LI1ATODzFy3ec(Qv%aoD|r5 zjLvtr?@P1g#_>aC=)cK~VhjrXEw3AhYN*!r67rk=|AjJc50#NCX2@N?XkXxOFUj|} z*PIkhJnskbqwi`rGFb;0JVn|7$ znVm4!$G89(PmZ+4^mv#!W?VV_mr%FFua}mdN920iPn_Zo^m@~`VNOukdkJOZb1V%-gN_b8VEKMKVo*K<5r7YauvYa72*1fDn=V{k2!D+#i z=Oa<(A%s!ot0=?A*sk$u1KMLdE&3dOaIYYPh_~O)6OB(BSJ1G_&$X}dohEhJF($sW zy5?yBGRkjYbYWvov4pTc`YScEBszXEyKm_1%OcUmuA2~f?W5?nCoL;+SIJ_kgtDy- zZ!$X!4zu6j{sjM{QRDQ;yP`m<&%n*rBlo>-e6aUFb9@k^Vz1UlY371j>n$ZtTSwi7 zbRB7oUXU7CYMbPNm;@s610Vfl5J!86udq^Mt_x!9wD>8`qH8y!sO(`GDpSkmKivvU zsNN2sY6G<2Z645e9?;A@K&J(O2>W~70P!#_05n&CE(egS!)eK=@ij&S41b)5_VjDk z(25Wm!`Ap5vJ6F(#18sEU^kN$FV?#H8a=v?4^Plt-2IJPTnLY285Lf5j z$DY&gGd^!N8C@48gk?F>j$|BOwu;?TOt1H20!=z5<#ZZA^n1c{BKNeS_MPAnmCbtY z-KEc3llHPE^`H8qQ97fbuypykI5CXUT+;o6l`;a~2xHpA>GZwk8aLcRldhomp!A#K zlT`mhJfOQgpgr;c{bYblEQbTg9(D)-)d`T4te+3pr_ZZ6xxVtlX!0cqXY#TE$x{c$ zE{movi>lh=Zlrj6bTyGLQGhA}W}N*dM~{joN3#*R!OnO(R+*1y04H!I${e_@$lD3* zB2AqVo{u$URPNlTmC@Y!SVI6av@a!X?JRG(aduft*($#_xnfusP8u54jRQT1t_|mt z>Mw8oF-MBbKegM0_z#7#OBM>n$V~M@U}r?;x798Fv@`bs)^$ewqp7}Zcju@vU%VG7LDZcY;nRM z1GvWR1;9EPo0cQDV1oR{zBeA|p-8-RukAHWNtZ_-lwG0~RWHET!(|d+>2vIoPv>Em zq;3{pXsZ{s{jF`bts3U(Pxe>VnDf|E=D#=$-w0+ioJNMJdJW)NBsi#);Fcj>hE^<( z#N`(xI$>J32}9YQoLEiL)^ci_FX%#l8~Ut=bBJ%(f#AKUHyO;$QOgMr4{GMEXdoi) zx}nwNL*E~9sZU-|9GO3)h-2R-poA%36iFPU45=Z-ZRZ7aOLgWupOc-vYc81gW#iBz z^N;IB;7tqv--yirPvKYGU68hQE}%?^e~+h0c6wyqXrf>@^m{8h{w*9xD?upIv=Rjo zjek+7)n&%3%x3h#gqnCeWi)K5=`*iT(~}zk&-`*)ac#d9g)1f`r*wtZ0t++s6zm4rH`DWh=z3?1F2D=xOTcqMmzppD_ZTL_^>MhK$vKfh~k-hK_x)7)bwjreKm#r%x?$DY29iWLyMw|*L8NMV_O6m)?$#edE)OB zt4)4CA@O`{zw`;LX0D2+2fk56-MY@ROCSwP2y+|4xcGHLn^1x!TcR9zQ(LjVCNk`e zntm&rM|T-9zGZmw$QC;p$jdP-_}Ip+S?~ZR5bOgMKi4ML_gf;sY_yM#r($@4w#10) zYIoO@&$}17Haah_GRBWwNr1sYPSSg4q!-UfTE$s(yAn9m8p9O%KUA-g+EVA6n5r~|IFrE+y_w}5(3Qh$T9 z>r+*2|1~U|41D=!G|-b;s;o;L?TQWN(QdVD`gB!SVb&dxA;VaA+gT6v$~^|B$B`b* zlRUV~?h~4)tJSFrrjyU&%pvb(%F7Tx-2*;AxXzuePjKPwhHux=2Cuvv2w0wwBK_Qq|}j%br8~sR3!0y!x3D}7CQzYaQ4V9HNYt+ z@w{N+!7M~=y*jk;g`t%zuk0f&+rTp3^kS8at+1g1v%L{aV84$0d9#^n|V|V&AAyzJLaYCB-iM*PRD`W&duF_ zE!|2RUO{cWAj^e&td> z;%Yx-EjN%LuKm7`j(@&BRr*|63y1c_{uYg|C)##}MRN^+m$3?Qrnz1aI=KWVRue3I zImDHv zUu51i_?pvhT1e4NuT%Rm>G~tuYbsxgBsO|m;3xcH(bNUS>0{dC>pR&vaK#(cnOLKt z_Ex-w%fB*yZ|fC|Kk@ZMvRn@B6N|}$s9+4NZE#rQcW*F$JEGP2?P2>VZ@5eRwuTOs zNyiLoA+dS(a5dC{=Mv;|^HO?wfw*Z|eY(_!ei>Y%&JQxc6M+R%OH(nhZ1Vc0Yk!1K zsPsXMYqT!2H;oGVlWs_?;?f5T)ahtcHHy9JQ{#&>I;lF8<5d&l7ZhP6gx22ZZjr<> z*gJyzJjzPlP+j37O}bFzm~?Fkbj0E#Obu1u|GqD+?MJP!wjcA5e#-xFr`rC6wS8#W z7uM>h&AkmB;!@q|s$IzH=3k@cPb+r6zau!SNXDZGpxTd<^G*D4=@FulbqDc)MO1Ne zajZ|~TPmP)n$#?~8@nQY`6l}3Ba-?3Q|NL0^K!%SP5UW-c?Z>7Ez zu2fqv>!RtN*0)hspNJ1Ga(!-~2H&}+ID&2U$=0D9_c6W|$K3J)*ZZGjqMJuyY1KB5 z$Hw_8b2y`#QDSJCpstE_#1$h|pt2!z77wE4G3g8UYd4NcUD&#*8cR>E>clN{dZvy) zR=hU(VZX%)xwtrzXoS?6GSNFrPXN`Y4ryD4CDQV_I=R73BsB6^2y@B zj8VJ+G+WJAx29Rf!f1_Eq8nb2#UFLH0|$XN*`W2<-k|lG;DH|d7j?&T)*S}-+7Rw& z5BDhYxmgAm?hxF}O|%7g`*?T@2_OT>Z9KeQ1tb+{J zes8uJJ74T!Eo9V&ogXwD}%)9?8n+JS=h7oe%Thy9>7?st@j^VSk;Pb%Y z?3`(!b-Af$Fy9|URB`SlM?a+U&l4b>9FRA`*Z1l!x%s@lPwJTFq_eHQcT8iibZ2bz z^6w8CFfZc_d_b5~I0@G=f{xWD4DH*{@ezL~aKY>I-1_Pg4YOK1U+#vfWPDjsvSn-}2ZwS8?0qp?)*erYt72OOz-?+QUpKRfHpi4P8cZ0iuLL7K+x_K#m zdv?ZnE=5=!{QHsplpp?Q@$ZCO-(Ge zCaS;B(=)IMpwmC#UInU=l#%tL&$I)vaoz z90Af1h;wgiBoAxoMjCkv`P@!wHA5$f60DJ-&Fc2 z3A!COklZFZb5O?QB zbZM{MVRB>-MdE7v&{o2w3Q1rEz@H(u0s+~l^4mVjj76z}v^)#WF{BBSH4hNsd z%zcWF(}U@o1=Cd8$aAFW=l}@T`W5V7NIza$A|PK&o_NDbfNznzD+^>m9*|}Og0q;O z-ZUclT^;c=pfteBx`zTN;{;_bS>5SbC>427W*d}qfuh0{Dm>0z92B0Y!XlmPlPz4G zSNK*d+$ktrt-=%Cp+RBh%}qu|w-&O92;M*sIuf_gJrsxQF#Xv~UG|0B1n=A4w#g-(KN*a1;xUZ-IWem^GV4sU37+=tD6$OfOCX1KCsg_a zMkBMfF!~9Mk?JFvCY-*-?m2Q*D3=j=mbPvx*IJtGo(^&iuv`O_%Q|#c1-a-=Wn8I@ zHwGCwcm;5r=Mk{ati?1-xmuL#q99j^<>HD5u1$~3IxWcZsIm+Xvh=nry_IEBWY*{A zHSi+n4p5dE%OsxRD!I<4Hh;JIi?!b~ryq;xY5ElW=zx>BpuzKDQO* zUPGR?q4$=Xq&gCy6_^+A<6JSj<=$sOfy;f#=T=Y8*N>5T9Q&bZ@wYZg9oR@l4Lk6~ zN5VE!hkqdJ-;P!e(jr+dtx%xz@Bs_E_*aF#Rk`uD=9Fl<%c{Wli}~2Cdv*fOJolgS zGMKM6R#Kll&^9uzakqLD6lW#3cFk`xe+OfZ=Y8cPYx5?eg;1C0`o;5mZd9B97PR>& zw;rz}6L9x0v?eV+T8rnOT}6xkYVU82?G<`+4?q1)UPeA&+4>m=B(2*7rv(CM6 zwM-t?LD#wI=v>2bo%=5sX+e6O+m0vW>_D$u2n;sXJ|5ZQJhD&QPx;0hgsgU;c#nD& z$jZj*>XH2uxm=}?y*i9XX9k}9v20^myDNNvyy1S|WM{vAr17onU5!0hDxkydyU}Eq zQn!qm3n5BK@7{qOq{EI)elx5B$SJ;Wh^m2A+%JrXw1C3)##nI$QmMMpE zA|8u|$zkYMWSNJ2`zb$u^&2AEBz#Qyb?7gO_ap?310qUln`=u?jWlsKGm5ISk9cE1 zijo9D_Bl8B-R2=U2-BWAZZh7smeCN{MY&Gd#F{GmVQ4Kxn z@T-c7BPusv_VEZEUb~wB4L+l^gqb~9>s?|#526le8~T&nK;}vw5zepWOJA&>eexW?n=Pu*WtvoiWzva#N)~6HqL#QHo7HVk>-S8x4;o{>Mb%&3XOF*?KnecL*qMo^4g7X1%4g40JS-Z5^@e5D#kgodws5=+3o0$%DlMW|rMeL;D$z|O+jTAVQro|^)xW)1Y1P(>B3=SW z0$3?p?^;2vde&7zt$;UpzrQ)pUIO&qx1aar^CA0O&NFAuoS8W@bIzG_Cgt3gZxbuK z1MQsCPnf1q;%=09mzv9&I3TXVEPkCU=j-EBM;)y-({u!!ugQb=FE*I& ze;7TPo*?juyd;Mi;Tl_32AWl}KU^pggiqiOk-307vi^~q zL8ytrF0mGph1wN6ag*(l-7~$8Ss}<&Q^hconrW9Gq9gUFKaUiry}mPZlj%A4A{Kaa z@fP)HT|ldiu8YR2_?@sHzcT$lAbz49XvIc<_h+=cN?e^SvD__**(1^lxP@HSr%qx~ zdTa>Ax)nEYyWGr*tkA*(_1Q`K3~JS-W(o}Jq1^rf;lD#g5-v@4iEApti6-Bs^g5&> z&|7X`w&E@~S*Y1s+2*0IyMwORprdRX=ZtUtzD@iJD6Boz6~9y*UF%E!W9cUWRP#W*9fBC0alzBU8QY z4q)80n@N8}hLPSv;dKq_Vo7MYmgN5?v{5$7niykm_Ym1^I(j{>iS5NGQ*cOYj1cHI-Dh+@i3UP#*bS6@ z)4k1u)MRR68OY0SfQ1xZCQYv1RUn&Yv@9XW_pF}$*z~}gZXsWBpIGMJ{+3-aJMLcL zGQsZp+4hk*dJN-$KAV>-{y6=bnuw0l<4&`5pocq|$9i%nzvAsb1-xBl4HJW>e<_WR zMunBs#u${~*YoTwK7+r&VQ*^UN&-}u6RKq9S@F4u?%==)D+<{s^bHsXy4(TB6L9UbU8x^XgkJoS4v;nWw(p)bgWV4W7YR1Q+?~*5!u4s?ncJ* z07$v}4mUP}9A^aj*hP>ujq<<2B(zdp?!ce;M=xKHdsL$E1f>>ZF;NP_eD4wgQg@%- z?yu_HX?9gei-Q?F(hr)qbLipEn&eN`dc4%&Kibdm65`VJ_djcrZv%GZSAs_HrsB6; z5YDEYYeYY#{{*p+{JL${KPkeMpS26SN;CUxe2r;eU^ubak1Ry`>hG6mg%fF;k|0q8 z7V+!uKv+Fod&m$@yr=lEtty__Tu&rTS&GXe@#S>)dbgH-MG$M3wLGWWyWz6-&brVI z-I*U|$E$F1oO0>q@)vk}*Uqsd6}19!A7G4Qq*_t{4TJ!i2i$P-$S8}k0FTlsj||;3 zK6Mn<87mHkZiv)&h2}BS4c_bBDw}(;`SJD9)TkP_hzF6O-8#*pee2~%Gs{=5Z@t|V zu4O$%+d{RO+1Q1}v7I`4sRZ*543zp^!us#`T8Qt{KC}B`dxVpmLQSWf^DvwZh>8@$n@WBJaa8RgiituQEGRQo+D=ptO+}%l- zU~9DY<7jByW)o~SrMi#q5H&|es6v%7>Y|{Z3=iELE?yd1I4snrz)4*P=QWOuCXa{I zADxiet1ky>G`FuLzoe0hk$hrt?DOW4L~%>7mj!xDOrY^nqWmG8WuON(7jvY@#PVoj zVnzB_v{f8x@st>!%m5n*6`^A>+bUuM>;RH(_W_#C9*)#hY$&P`$o&}jvZ*VMPxY&5 zE=Fs!08Gj4kFQ7<0h#$%*?wrL@TQmDI(Cw#YQBF#O8a1M@vd1~S zr@|}R=((h6*o)~>-K9o`Q=tC-gRl%0Js9I| zxm`o_7&rY+sz{AKOyB7gVM`UjDb;|b)yMlD3$KTuq?|F&&$Q8@af7SJbM!4 z-c{%_l6WJtAMHU#*SnLk4fIjad zkPB73ct#K&S3;YdK7z~#;osm+YD!b}JrkQxE?+6I3m9}Wak}oxI9>O>bHtI4rnS61 z|9xs)9U00LzQgnOiOX>5;iIz16Yxl4oKK^G&NF+6_2bF1^?&$$(Me2mRG{t%I()(k z^00d!Ml@uSWk)~Gm&rLbDiThVxG$LDP*%5^$NrIeZJAroAjh(sA22XuH@>$jytOl|0em@saVmAJ9fqHel+xeTcF`2U$!RQmWI~s)^pOQWdy}$i< zlAB{;aeUpVt+6?6c%(jPdSei;m_2|AeCFFxUswA)mNUYttv`(nExf3X>-f9H;i((l z6#ATI&kd&UlpuePJ8~UFpazTH6lwZ2L zm_9AczWpoTFYY#;Cr7ZRD!#Q}%ca8gJq#OlNOws;fZNWP^c?!$`q5ovaI_T4zp>m{ zBV9k40m(zZK@ZaxPvVQf1#kVS$}*6TLkEig=fb9$`ECU^8#6fj zc^G{?i~$8OCK?QjOO67DU6cecMgqf*It%#iq-g4bIz_p}XIfKBpM@5lf`vQlSlqB0 zb})?y_gTZEaV(H5_m^XNQ|&JsxUBM*ja*jx%O)->xD5B%5c_&KY26-8ok{HP$=Q7( zwNHiST?dZgl<)Q3p;ZuvIS>AWsA0M_z3TG}12Z^RYr9_GwyW!kTnUC=VZW^n`Ypp) zo9nkr)Ni%eT~zUff_~Fp2|u6c7E`{vDA#Y98?_!+reN~WyCrt1{y$_b9=iSJ%k!Of zWxmrM)1abGyB5Y(r>#OQWUg}qfq@X7=V6@WVSFVE10ie;It|&I2MiO!@djhPy9yZT zI(UouGvcZjgeTHH2+1dslQ)Xp$#RNl+UXFIU%Aw`DRSiHW5P-ia%xp}v4@uxQxWVB zHC6p|w)^3$=U33oZE`JgUkQGCUS+?DS=EtL6WRy;w8(wdz%{W+{2f8}9rT!} zH3zX?U_u}0s>QgVQ2&CzA$orRqu+!Lq@{uf{fDMOmob zFr~=5^=!JqZ&%XlVNMcw^C+TBQ9(m+_yx)R;S^MPiiKM#+ z!B4_0b5ifrZuA>bi4rz5z+d$T9?~gQ&4d?{b1IvMb`g0i#X!dd-4L$b6vNhh-)%I~ z%|W?0R7Hnwh!$^xsj8wSEnve(i4D<2OHrn`{Ck~MAD_b}r&}m&mR-r53J#aY+}NFX zMK4A6O1G{dmhe>0l!1r@sh7^0pmDtTttiLiBqoA2Rgf1u^97^x4uQ#f0t>-wx!dZE zJ?+7Atm5gK)=wgAu<3jME6(bFgZ&IY3CM2QqJA-4KXZ; z(CYNpZ6twKWh;T`#Z#lb`g4REjui1~C-qOZKh3kV@wqqSzKzeME zHHy#g(&s5{GnrV36F3^WVUw_i$|+!m40knzw{|p42rqeSM90L4Y@8);)pSfe&Rg^B>dn8Sc)P|`2R%Lu{b0&>B|_L&OcmKp&_vf=1<-S99wTm7V?{xe8c>~=cgpBeUgZP1_20p}#nOjG(Pg?eaoJii< zaEXq~m{C_Kxe~0c>yW9V4V(UJNQVSc8T%Q&^DN0!9IOJFIuX1~rYb#N%P8lf!t16y z2DJ8)?eyIU_qu$TWZ6QIEGti@Uq#0ql)u-Pze?o`^y5C$3R`RX@s#|`NP(3VO@6VN z{oQTrMAZ14Iwmq4mo|^KLC^4&hP{&+KEFBfwtT@zYSdwop>Go&jfRe0CpWJ6b+-oE zs$jHuYI$_%x=8Ii2t>uj--a1lKHoa0x~N40m8EVWWw)-;cg$Y4{3H?|Q`GXqXsx^O zdc`#&9Llf_&twiaeK@DiU4Zcl?31N3-1~T{ip!ZH7w}!PCNf=q-1Z>|wU1$eS+5H? z%&iiEC^WgP3~gQJ>ac4WqSF{Nboy8^QmX%pR~ri+-oj6iT1m!P(C4T9FzE9kMBL<( zoq8riv}Dq~kHH1Bn>@6?sHal>Qy$tYu{^X>^Uy+BXwRUY1#N(!?F%%7+S`YW*OO%g zc{ikoKli*b!;bv9F}&HvpPTOXr?n7sI2`uu5+OH(F+OKJJk?6yg2B~twUTAu=%hrz znC99I@~wMlj$R+Sn{VAItfs^=Ey=bHcVeWq&ctXUveDXee6aCj z(`l+4|8D%$ZO0GXgUMav&h#1^mg>Vz@dMJ~x0l9BI!-zB_FhIJT-=t=gLrf)h;L6X z4EUV=aqA<#$TlvTil8q}W?jO4v>rn>@i<4lR>;(NN=9(CjXmhVzoRlm#xmK0{Px!n zn_zHAmfc}QpEJFy;mo4Ojs>^V1P+_G0E8#BtHAZ8hYn%rq0hH-LgaeBE+C9TIn%<; z!N7#=hTt4xOJ8P{^nds!>zH#d%%2P`+f__VfBb+sNxL}1N08l(&_9#FidTCaDLfW(QE562to3~c*_2>KYF zxW!kh{{lb%B7NJ3@f9}M&-;tyF|gbe?pg|ZM^TTIO9oHzP_vs4y-F;d>fgLBrc=zlu9CwEQ`6^HG?Db>{msS4q zR4(!C_4G6@EBxi@T$Xd0{>AA6-U?bYcii+I{tWwz3-9xSYg|_L(t}XSm>64z{DsnI z{N5mLPnMm(IQzE5GsUuPzyDFs?{5yiKgoZ8n7+@A&mKhj60ptb^I-Rq9a)x#4F<2F z`q?y5W!i%K>xeJFXBY0HA(bsh{8(%>!epF<620BW;|Vl?0`6;kA-#|*VfKJuB=H~i zm%5nYlshG){y+1VrlyugMv1ucc zcZhPHP%JX4LTC2;RS)P5wJYzSVXtNVkIc$|FIhX9xpCV3tgDjw4UuxHo3Kc3P0m+( zE9Wce%KJ*X^1hO;ysxAy?xKWPp%XC=(PRIh zzgYmUtU|5+JA?lY{G}fv|2y)RR^Bgg|A@bIMo)5MfZd=cslkU4cS7O+;(|hdX^}bE z==oMD{M6`Q^Va?DBy_#}rH1>|_ME@;>30h~h=0*v>TTHczeOSb)ZoSTGyKJKw(*zt z122;)r@@i!ER=J539p|1(l5c#+Xeaf!@W2w@<3 zm$&nml4VQo-JXA1zHa<;?C%QrCm+AsJ*$sbpZvG=@%b9=3-s|dP^5=GZdQS9_3?C- z(ky;m%goTiu|C=q`vyApYk?*X&0B#slQw=>YV8qC@GN597PB@e9%@s}pHIenwS4@J z0#ozUyh621KBnWtr8yw6VVqamdsGF-RHQR)KHiX;v~%744Nd6e#CzRi%Xez1A3rTI zwqMuS0nyC$+CRL!uVvTD*;|b}*M%SMGx4Oc6C1u9d0?!4`B6AAvwT`&LWL!zz$KTa ze^}GPWFQ*x$Urqm4O7Sse|?Fo>1ZH6rmO0X2I6D7s_JMUKBlY6jt1gmx~k}CAU>w6 z@{WcREEii(|FJ+nGhVK?u(Q|qyW+71`hJ$tEG)8h#(DH6I^aNtDD4{P|M+snHMd);)ScpzkOC zMzC`FzTbBWHQ>Lf?{_zB`rkdr^!;P@GdweO8+|_vyiE2r-w$55QO+GAyn5>UU4Fa0 zye`KYM&Ey5B->Wsze0<)9UpG+<)^89fxh2@e)#X{`@5m-e^uX~&{Cl9pTw5@&+7Xs z)FK*sB|&}k{r+O4RR6`77z>8Z+M&K5jnG-2m)Zi5^=?#iR^LBK2oq>?JhZ3OQ>p&n z^w5@kEf1|g->=7sH)z_wE`9%QbX$GDZGHj*3HNheU$}PObNqyE*f#%L_=@foWf+cw z=qv9Z#kW+m+&I2vJP{u*+B$u}2M&9zrL2k7ou_h!V`->;eJ2jW|rLT$q+6yGw=uO}b&PJGLGp|)RBZc4)8rFkE2J|D$? zl6XJ<>Sytfn>gff%Xu-L?G$SJynWp})b?e&2#4Bl<=b%TuIXwXwD>agBu7)IEv@H% z+0BnF#usXz#5a^-uUJ2YZxSz9)TG-DKqM{4SI!@$H8*q)d#7Vw5nwy!74tWLtRV3) zy`NXc({vL~zV5rM5TvzFhP_kJ9Q**6`PRo7O zAJEml^==?BuCz|Q_Wnum9Y;NbYR_*^-R|2{a3j)9Ja+wQ9Zb9s^O87W=uTteyAvi7 zpPrs);=h2CLMF#Jt*6xQ2asMYeDHC=Ix~j{YaPR>hsBaC?oVG%1hD7$7EWHJW`%1v z$4Z%dW&So-_(TfNPro=$84&a97d5}`wWCGV3WcHVe=#Y7hBGM=YTw{bAt`nWo?}M1h zp{Uw&9MC$!*FAH*VYfz2^Vr#?hql?cB(8!$^UQIbIxKy;L2HHB>|aJCGk39`U~!Eg zwt0wkd5Ct|13wi6qR}~Vo#>iApCyRyb{M)$9ap6#lUgmoQi!9X$uldXsoCYtwV%empfrb7He#`& z*nOv2U%u&HrS?c|w`LVstXtmle5Cg2*l3Qb>N`ykrfFMH+ju&IrD82OM$P4QBUWFy zSMiG4uFH0#qKcub!&6s>lZUKe`FFAA8m|a<#|?iqA?Tmh#VBjFCisu^|1r<`Z$uD ztERf2;uwlfpK7YBb~*D2Eq{)VJWuKD&S3;1jY{JXH8j-rRc_VTSR)N>R%@Zgh$li< z*7KrxP3@9U>S(SaT6R42i6A?YnvB8?wV%hU;LNpF+NsY$w|+!ZQK-F$cg^g6tH`YJ zf~Bp|p@mJs>(xe)Z&suqG_lU|Gb?F=%{m%Z0`kDtl{SBXk)HmUpBhp+k&aHq#2tV{( zCnSL*1S8rNeVtkX@|*by+NEJWxYV#`m#L0m=n~?5ucq*o210w^9oLv?mx-iW#LMdJ zlkRv;{&GbAvMzsF#HBU&XqrK%>z-y)55{fb>6@#@fm@g# z!?xROmf-Tt?9&`K2yyUGQ}}9n_I7HtY)sCB6WlB@MJJX7;_kAmn`Nj%;pa@If*vWd3SKM9kC3e%9;^2)U?g|&^OxWR_AKwp{9`w=Ni5t=5%s&^jsb3+DoQS>(vR%IT6Zz46M(D1 z!+=i(mi9O5olT|cTUZc;ZXyP-s zV5TnDyExD_?9NdL^$Dqd=1A`3rO36L0-`~qAK=@b%r}8n>7N_ZXl-}1_{`2l5>;Nn zFLej_H|ZMbJOG~*0DeeLYtYuOdB7r@{!vF!7VsMl!lT<=BUsOK1BKHYKvMJYeN@}C z0mh#aJ{HDb_kfLX~f{LyS zD*EI?Yk`sVCv{x+7+AZfADCh4Lq}ZT+)w>XGRbHg8QfBIgMFST?N& z(HnoDR1T^6EU|}UZd}1I&D|}!D|^nK&0D8ui5s7jF&mx=fs!|uL%rtY&no$eB!69P zclU||Gts;~5^PdA)ZK$b5Zo9NO^(#Qu)z`5(MD2p%iXsLD#=n=I!2AtN*h>sS$VYf zwNP7=9F^KXwJeGxA2M0u%P&Qe?Ghs}kQjwi(_!g9UA#{)56Gq%zIHJ|BRK^+z`k@- zdBC-LUqW*fP$V=!F`)^dFvIM>KdRt+ed9iF-?u-->5Tc6v6a9@c=7>4#sy&bZ3v+AXol`qs-U0Cr65 z9X)b~V3zQlgp6niZ9$xck*oX+wIl)lit}~fZ z&Qa!dtJl5AHOV3>qqScjQXU&xPl5&2H)=>Mo%xe{NN!XBqCB>94n*d4XeS02?M4Lc zqsgK}wg>i7Bq2+`zl_e)U*EaccmRyb0EXx&5T3?&t?hEA8uNGxJ zIm<dA95Og)+>$Go@3@77G9hqY4G8ktQ=K$WHYlRY zWW2+EuG7%n#rGglY)CNaCnREhyLt&h8`^EZt6c^zX-l-J?awXRAKYV{=NA26z+T@8 z7smXr!%{WNL2G&PSNCpola?J$SGx+(7CecPka>lqfam4j|mj?ON=$ClwUONhC zpF?eMs!BMqj6>bn5_*^o(wuLCeM4v_lPS!nhfrs;!!#=4hSIpPt$Tuo2tpb2Y(V3> zitEkRIqU)&|ln>)83yY{c%cdkURW8V6Rd&RPCCK5bBZBUAf=>rstd={Na?Cj+b)LGld(S9 zk-n{vs@0ue)%TZ*Sns;mh$%CdlHky(D%H;WDs&sa8g*T4Iw7pk!h7V#^DKgmSWoqA ze&{gQzV$Y}DXx!iEGF<3YP(u|M<`=XuvO!2$gZs#f96-PpAzo0aOe8g%g~NjornG# zwy~>mNJx37a+{Qa6&u{T*un*i__Qe0w7MgyuB=lnM^Z~J0=7gwdno|mVJUBIA0MIJ z;Mx}+YJZZ~ZuHq|@;#H)ia?d5PTp*Nc%`Sgf>|RtzCA(g*y|b}CzjS2)|u69;3O96 z6KcN)6trA)0l&?uStzef?vyWC;~-L~Z56#BLWB&Bh^e=a>pPl?+%Q6L;3B!ED%0|* zlRZD>`aharFrK*se&T$BAw{u1;wCrwECJdfBiRhW-)5xbJ)VKgL!$%gpx?;~xQE)l zEAx@B`*s-SIrSVb*aC;#)nv7C?-8br^`Uv@?)yx-X2+0f!J!k_*p<}=Dd3m$;R5n;$<%)56(toj6b;O4k_yNeqIcA4~ajwT8w-&nl zLGDA;0qa(!n2d47V%zAxe|~U#jzq+g5)MDJLC9Ue2sW%UJYpX?y;*zrui6WLD8S?5GdvmZL>)!6 z#k>a@dx-o$PsUg1QYa`ZCCgw}DOQ`bC|#z#2kTuuTyO4CbJKrDinjT%**-MZNcYm~ zWZA0uvZx1-ME^1JzjSOc^7{il-a$ku^K+G9_UFzS+@?mqNFn#?A#~UK*2QI4c^I28 zVuA4k!8qMISBHZ9(!)3_fN`#eaid`TSTN4r3?4eWWRn|z4Dhid-e7*$jJv?Dc!ql` z!u%~ouq(3mjSr3Y%!ph^N(z6TYuGzTngF;CeFeyt^Ep#uI;2$WWnUIQB8n}a3#RYq zqBpQ_>$29Y=6ij@n-3WQY!3fT_ZB47jO-OO&~_WFb-Oe8Y0P*~Z3g{QfRkC^{i)PL zfv>{RVjEq5uup&6Os+#u{H_S!|NV1Cw81~BGuj=%PyPMJ14yP9i%4f+RoI2%^Uyv< z0XOYn!0Zbc_vwi?E%!5Kp_xV7a*cufiGduR83RbI3FM5o$pJ)$mpu$37wfbX1gcjG z+Au@vfCoK<(>zj-h7GCt0P@GY*mT}=7ViMSPXGW)Kctg>z|FkPg4i}bFh;R~V=+jtXF?V zdWl~3cmzM@{Lvu4to&ri8HSwvjtP@mC9#?fQ%bzDWHbIuS2(_<_~OZ4M-EWWd15!v z3(R?-B}>dUVy(H2KobE~F#NEFj!ph-#KjKH=Gw3we7W)GqH0w-bc3pkrl$8I?L+bL zsm4PIR4ob3`;|mOD?(o6BASZz=@quQFSu=AOVd=$7(`|*B`Pd(=bt5xd>^}lO_0^m zp>Ktscq^JZWDTpjJbFXlH?51W+K-GAB>P$KULYbwl*L_(E{P^aMicCwBzZlVB&s7! zf1Z%~`T?8Ch7h&|ePw>arlBg5Bmt#X2xgzurJsj+=SPR8!%w8C^AFM5cQ3BB<0kTz z{yeBu6}YcaapngB9qJ#(+$>5TLA$)%$Cnx!N_Qi_QZBwG8p&L90E;qTrDvXX`vM_7 zk*BT<4PxK@d;NRZ*9!VKw9xl&ua1fw{SyCp_h!fE|78DOg9q}@_V35X`TqSa3g*As zzgJN4zt_KGfZ+T007itK{j0#)BTB@B1kaX>d!{_%$x?iX9GNeb)At0~vuMO1=j?RX zd z?ar>@;jAOf2B%1sE-IM-A9o~88SnP{ygG2JOIK?o=A@GOz*Bq_HHp$8CA=H3pKo3* zZo>&hcx@yzj?ZRebG6*KI_0RO{wg6gLVKG1Th1lKDGT&!?Ri70$v1^Ga!QAv(I0_? z+46<<)i^*Lbc3cOX|hqjqjad-tY`s59b+z?-c|01xQXd#x|x-sg|Q*5i4IqBPTrX{ zjU6+OfTYEB9W%*O6;o%i)^~ZayNG!y-@lx347Qjb>aNd9;iRt?1OMv&1qi##v}Xsq`_ZGwh4aly?{Hk1T0Z8cA?O*YPO1QBR1MPIae1A|ZM--OZr`;S%<~Cqehg*nYvuJQG}raE7TS@Wh>b zpjguv^xXp;`q^@j?-F^?;Zuo*exgl1d8IiE^3l+h0|9OXx@rhTa^TdOSiCOB+Ix$Vur^7oWmTE8wFCY$)(*qk zQL*;So~+#w&T+Q886QnctdC3Xwaym5zJzlUs44UF1{zj=&s%Db7NLDhPRyRA6fKDHL$0 zSE)WvjG(^cOjxp8^-OSQU=m1F=;Lm8;Sg^8d|LV$u=e!hEV}Z>RIJz5j!8qtC)T7N zfbC_s>bcHV3N2jKSo|tS?}Zkwu3cdSY79l+uU&C@slMpJ67hFvxe>$tOrC@S#ZA^Y z=DfVx_-nMEKmY-YH>XmhPE1oLCRC-1fswOUVH5WS`O%yt=d+?sOHAyWo`fUj@#YxT zh35?!535}`P;3@jxFR)am#yNn!zqM{-cp}QQ_gqDd=e^kqDF#~;YM-t8`} z)82`_Ma1x4#De}1yDCZM&~DDbilmNu)a^q2LS9*r}+Mc(MPymQn{(oC6sqx+=tD-7f~ z53=(#19^vm#PN|LVi_C&-zDN@F3-KE8nEwE(xvwffIVuOw=Cg-eSD1Jcc8%>ewqQJ zZVyZhe5(N)RUXdMo=)i+wM}ybIeZQc;C!gicxv>oM5m#^k-APFV6Ze^j$}=VP1~Jd zAMfj$P%QElSspk_j}mJ$4wC+Ou1GpKWYrG8dpJ63uCI=-Y5v2Ap=||f_x1gj5^m9+ z3bo%i18YX-YQ0{PF7m_S1cTOp2{i!p4y}1j4Ig5SXeop`Jqz`454Dw&ZYoeE-sx|7 z&MEQ0Vjfr@8Vayy4;Mu)%mVXLvWJ1=T2k_o6jf^U^8#5Rkdl%L5AyEIje+*_Ajf+A z+6*MQctm91>J<}%R)5z6s}!(hpQE=dbcJEC8{H6$+qV89SR)?{9RG~{E8PEs_U}lw z{=a4aRtEMjvh~;O-`#xk{>%0+OOQm=G5=Bf_e(wO-=K>Bg#8QPzheL5A^tu47uo;U z?O(WM$M&!64B5Xx|C{#j922NDBTV4;t2G%t@({^rPy2U*8iM_cW=1$SQ{G*)JM#38 z+P{$K@7lj+8)fZZB>(?W`xj@?riYX-;9szRMalo9{cB#sU$=ixpp*Uq`?uM!l95_q z|6XEa%RSigXzod<*=_7!E$or~D;0?SO96NKVAY4VM!D|D{*^nOvw!#C=D%kDYUR=Y zJ^L4T?f)zLS6Zk2@7lkbHI)5}UDCt;on>0%e~vP(apXkfkI%j!t+B2BOFU8i?d@Nw zTwJ46(@Fl(#^_OF4< z+P_j%*uMf zSKgc&b;$9lQDfLXe(_0BP07Aq!pzMRuI$2rEVyvO7!$7?)KIVM-% z5dbEZm@|F7#PuOMPO!0GG?8X$Ky>IwI(~pzz9-U#6`L#%S)mETXz_JYX}?zObd)zGA7Lbe&igPST9RIag*O3KtVI z&o2_Foq00Ee#uGEMuOvP?v#1cHxHv{uXSriv&<_SPsr=j|89Rw0hfQTKQ1Be`ET~e zGg>M@e_Yf5AL5o&Wp8lvC75Hie2_OlYeRM9_Ty>1W1f6ff z;U9X!lz=H>t&In0#?3TO7w0 z^t(H-b&1z$aw|PxkoGUpLqxi+B>vA5nHOi+pgt&K*2apx_(}LvQNDzb1UuI^)&+L& zLnu5k{D-}1VY~R#?`KF4A&_kAu!H>(gYx&bKcY0axBU^lhkKOL@9r!$Qde*uR{$^b zkM57)yqNZlI&BlcAH?cd;N+JVz3ldvYnpmU^w4^z+vIa3hyQB2n)^_>QTzpW8ZoFW zaei}@5o8tJ!!o22Tk11-un3YG{^LDmI5D1ODe`9&phdzLpgk~{-l2e7yA!;B2`$a9 z`2j7?_xXUDk5J85bgO3f2Ehwen;uP_^QRT$%LtN$r2oRgC{NFBwIKZ$ghKafYOvo! zE!J`uH-f1^twzzRE#F`^drXA&fgEg=&T50iCif-jDxZmVE^MMj&szUwkCwYA%wdb3 z^{n+a{j~+pmgbs8qBD5FCXWKBA4ra0kqMM@3x1yVDh7>XcU`5QrsxTV?UOx zeqEcwBk{M31CH%77=AazyY2&K(kL`W+|?WT(UP)D`C9k$U|ZemY%M=YYo`r}9<7Uo zNKvSLrZE_OWfH*5cy=~7ea=ubHhnx`8ysva#=CAeg0lfSnTNo)<$g#sBPK(!$(G{r$Iqg$9n1ZY641zuybyZ&sGV6~hDmcT+sPQV;Jm z5AXXP-fvLq)00NHY3cN;lyk1XHXO6uz#?S z?<#Cchzp0Tb$5UO+!FTmS>{$9WDUHC2tNs%e}A@df0;*UQDwe?%77fK!Fv8W?#hSFBrxZ$90eG^yCi{B%4a?i8(PZ|6TKkr?J`Xg>zflFx|NWD z29O!woo|Yils2!sWi&_Kdob+~m)xU1N-WPj4R>ZZ=6ZSN74?q>9)A+M&aF92yx?`g zMW!xoC{gz4M3*Zj_Y37s?U zUPnW~&`am*^B?dzSr4xcnEm-O)fs!;ZD5)e(*Kb81(GAZ|8*n%!DEf|YX=9Mji{{w z5t05FH-JE~exE_Rizx;aL;4?iNijABlW^)jv4txBE|BT-0rg#NLyQRN!w_>f+t<4v zZ%LK+ZC`INkAHSSz4utXVXbPtp;l$NI5nvG`XXxnMSgvwC@ujnM_=D1Dl%iza)NGD zv2MnOQ$I1pe81$@x!C!4%h4I?hg*Yw@WkIgi+Hi$7$)9r%%|IeeW9<>yM^dD^!|g< zyP6m@^!{l;?{f?`^lm-S=&kugSpCYWM(@R}&xO@57!=T(wYS>-=UM&7g!shj(-`f< z>ObE45%hLP8=&~sot3}rY?1V76aBpp^Dxi$F!%H@Otz071$r?n=qFO$72n!zaRpMsV)`eJHZYA_#@~M8_l@B zD>ywelSzCxzYjIGcd}+D##+j5*NMV0{zSAO-mbbn6*ZyXzaZ2cRtU(jP6g)7k>M-P zf?(uy;qA#(DBRzrEt1;2Jt2E%t0mNm^>JH2Z-Do7J5j#7XaKD-E-jE(L7U8&uFUW2 zhR}>^(2IXo+Oiv|>SMbk4sJ}Wv*H22xKAoL3{g)r&h&ZvR+(&6cCD{$H}^xp6jlZS z>m&|S()+^2<`ov;+av!MtC4m|e8_TK4m5T39^l?CoC7F&a5ud2xyPt`XSC;I`y0)6cTZBiZ$?3_%L?jC zuYvkDzKQ~pJ*}q7<9~&Rw72Wn5hUUHSMfg?5%Kt+G|_`@-#UAUn@fd>7vO=1r5nXU zqfrCOHwqPC64@hrT4hRQH>@-B=KS<0Fj)b=rZYY7w{Jg&2h2$OK|kMqsanA=Z2x@t zh9(F7|7GG)d`SP>hgv}IyDHoNuI96k*v_I;i1Pg(kgf_iEa%)Sx81!ww!14bh+2tN zuGKyjtj5}_Wgl0YgAX!QxjNdY5TfwNc&)*BEl9li_736Sf~>V+l5GS3c_`3bB>evt z{3CJYp+^D!mNv^8z;e`njZ9XR$M$j~t&&D&8Oo`spEbnRm9^~UF4$2`S-uV0anqKM z3i~fS^+^n%Me6_bhVqY%_^=*}_22`RQ^p3kl}Mq`qRV;qt`vy z1^Mpgyv5joIqLikc-NuzcMNZ64|p^FL3kxF!;axSPfz6AyXQX$?~nZqUa+zP z5{gA){n(oBIt(EF^9PKwVejNxTjhs7&(A5_b@8fC8q8u*76eyF&kTFVRbpx}>_5&H z#euPXTmmTFMP~&3l!M{<)i%kjb@$?6V1oV6{D7Yd>HiTulW*ThgBEb--=P08jEo)A z>z6&?W%l{U`tu?WFTH2)p8DiPT!#XAPCtf4S9rg8=brb+gMZ=s8Tf96_lv*S^ZpYo zi^BIe(Z2=vxpY)TQ zl32^mWt|#dWqbV*;mXW;Hexj=4{uJ+G6yMPMm0$!-zBu`X3%~VaAIwI-Dk>)Q5kA< z?&rPGjI1oKNW6s+q|L&Uc!H~QQsj!y2+quv9L}u|9lM;ZGWfjR715DjM|hRh#Oi24 zRbrziOkR=E>E6Z+c9Jw=OdN^z=s7d61Ot1}Ml7)( zd;61&4#6yZ9P|Bx&AS%E*ZIXAiYFzc~dJF4|5X3Vf+BZ3=hzwFKQ8`@VvN~?#I za&7wrWtY=yvZu8@8dv7$!~Cb`dpdIVczyiMV)tF7QdaTD)E$X8u|Jj$uE6#Q-MCa8 z$HMiB`nG3d-&Xa%U9T?l`S9EgbOEl#F=oxNqm2DIW#5}@WZpE~$b5MpMU3jSxHG9; zfA?UrQ0P1r;>#EaYVrTC{(^Pd+pN=8uqbjPf!xzCF652*Zclq3=!fan*#*4gKBY-{ zPPvmc4sgn>Jg3~{UZ6yGQSQjz%*}2EPeAEg=xvMrAr)Y{^b~7OwQtT{rpnH zKYZCv`QEu1f%3icJ^>qPhzDwX@4WvW8sfKw_Hoblw^;izVKla7+kd7qTvPhsooKBF#pMcOi^O@yVywZ^v4pEG?P>S~MmwTg}qW#s}OdG&9$KlRapa zp(qBqdx_W7gA*i8dJQ2CPm_b|MUw@z?_7ow-1cRYj3h&Ysr|A%N$w3u0{LD>MVZ_F zGnhea_oodI3FB;Ar_^2SNbTc+4T^AFUs=$w zen7p?=?(fD8n=|rXEGv)!?=Nk?W_#?UH*EOKaW7y<>Log9u32zp|-2gG!b*e>JzKo zY=(5?CKkjFSH5M6&T@!1CWu~J1Ys&p8pzERqQCg$qpgbykvn!pr1tlT$2r6H6=J}I zA}DkOOD3dTmrxg|JFjDUvHt$joH`p!NP|MF zRfsP&e%^pz#B><6H(lqu zKzlFHizOb;sUFT!R<98yi4?%;n}efxlHk+@aAph607%Ao32T+R-XPa=%utlo^aBYU zdiWRVyWV|(rVIGE z!!*Stz5ligj~qSo#LpMC9Kx5eU0{S7u>t61`yYHf?t14Vet6-d&*CFUazaIHOnlYW z4WT8wv_Cm_aX1wlvai+&mb+_zXW;<8*K1Km7^lM0$JZ^L9TU!$s zZcePqERJvKB@;Y$N_>#!R#|FC<1G6Z2F#@?F*8okY5R}Zy+jY<-vDB7cwmsQG zKy|IFqDbiB&LwW&DY^F0iLV~ORM6K65Lt`u*j#qG;mj9dCQVtEtHb)oJpJ@;*b$!Z z^Y$)kh-3xZC2f}v@lMzyJQW&lW}sm# z56wF~C^J*{HQ_|t5IbWvu{6~H36B~w>>Vb{*%h>8U1>D+^_}?agUqBr4mln=k$zaA zCAmNosJO`WhNt42(Icy+3ZI-7pVJSq@lZoIps1ErOiN6vF4dNE^7O?{3n#DlRod>x zmOJdE>U5&?AXY5(3zuANFB5AL&&1dDA`$g8_Sx;x8Gp5W)0+6Y(more#Xm0I<4J)P z#7$4eU+vXr4S=U5>PuU0V;A+13DMN0L+Z%xvO7EN*ir?ShHsTFLJKb)!dci+5^tby zt8658uiE1pUnkNX4kM&bay&~tVf}?N2t%e zkd`PcQP)?6OOO}#q3foa5`i%37+#!odCNOg#Y*uJu zjLu6XZ(f$t53tynka=2bKiymc3k8wU^hzFLO3aQ5m%)8JF5l_JD#0TGZHB{-2;bPn zR3VWXJ)gJkMn|1iM^fy$gl^J@3gOk5e+2_aS_=z$#+y&FJt;QxK#2N4TH<~w-Rg&dJ*3tmSfJ=` z{4oWxvv%o423l@L{v8nhd_1)9LGEwK_Jr(xz%^$NWbG7-wSI{$x_I!hBh;j`7%;I? z4%GEd-pg@!W^O4>*xKfsJD=!?v&fj-N{Gj}z3#4}g+EGb=HN9S-r>%k2b z90Kaf3f6BF+Pj7$`$Ode*C&4OI{O-iqqGnB6t!$$^du-BKdpY#qZ_uiO!bsl>nEo} zkNjTy{S?j~hn1YA+sGU?DjnE$fr+bj?P>1=|8EEHKVgu`ji=kc-wyv{a_AR(^bd`H zwly|2K)EhJ*{0JAFmA!l_5M=Q>a+1-hxpF;tN6GH_Dbh)Wpd+Z!Td%elqHdkJIA|q z!$sDx$hrcBBtI{}kwdyf()!RNPf0nY6R&=h=O>q;n+y0LFh0o7V$Vg#9F0K&|IeQ1 z0x4F$hdqR@_wz4DdGuD%dE!fvZG3>zFikhMr zMxiG>|MrOIBNrdKRBpS&Q^P?4EhRV&NjLhdC9;%x%O81 z_7=#qd(7UezcVk>|J47)0}OL0sSn%*=-R~6C2#H9rk(OAqP?`s0u{>KVM93@80FKT zQ{~7gF|l&klZ?pY*Cf_31Cq=6)1$wLY<=kd$Gk1(IZiCZEGwz-V5-nKURoDa<{@aT%QH~#SRL}9>cKVT7+w6qpnN|(+1~={qhUw_+e5I-Qf(gsAcLIIc zgC8^>xw8klyBoVBpgraz?~QgwGrgZg=-v_;h=?Cz7M3;#$%gbCM;&7P9A^xzrcv?E;X<#Ig9D)^f+Q8S$&(q9`wyHXnM~& zqnv#9{NBFq!`C@}FnjWEeV^E*M9I$#douk5kqPMiG0c5j6*it+CEl3v`@zraLN|7W zu3f?zF|mUv@p+X%I#l9=pMySWWcTF}i#hxwj(#JNvyPKv)Gxp{N3W$sj%_}+kF_vA zlJQ9$Fi^9H!!Y?z4N^L@sYg8Eq({oL^6pyS$O-zcPV1qV@=ZquISym!B+t24jNBcaZAy#@Q=63rCn_s+ymIHa(w?XK|Bwj=3rShPE(FWw2;}9TC3J~8qtbB{g-SPV zgi0s#d9ZeF0YL*>J9i;^4J!SF_wMH}L8V*NZ#n-zoOs%_@W!Pjq4r}Lk%p}#Y}zzz zW&I7V`@;Z`Xz7e(U@4X>9zayddXWmh3;CzeKa+AUz#v< z4U0KTdyVZV-8ZqKe$yNEi9gma$qZ~vJh$mJ%GQVOdb%lfPD%aHKQ>VAbCmnS{SCj} z?|anHYtt*fG?V3&E&yLx+K?&T^jdv9oJ>s3XntchjEp@mO|77nVo;^VD6i(Q^rv1v{1(peYN z&f+IFy+O@XTwmMS@}tD6#>9%mA2^$Q$@=n+K_&I6`r^bY9Z;_86MJ!A0(DF4I!4iN zOFR0N7)rxdf>iqq&YN5kBdH1MdWYDxfwT(Wbe9RR!-_WVur9Fv(Wo{UWHR#$^dDN}*wJW_ zm9H60X^~xm{4~Z%Qi9k|hyHSu$@jURGx=WpKJtx1%xb~MG$klI=UUA)q((o&d)LL% z{yaSk?XASop*uGe*o!t=5bf+8#2trqZipXVtaC%X{h#dJQy&_yvV!iXXpq1(ol-cy znZ7**hhOIF=h)Xmthvns+QH|!qg_2H&h$VV7XoKm$cmw$9eUu27`;I{9BcQne|>l2lgOZJ?i35*ZM zRXSto6LoX_hIn-`VU9O&tYyja=&7tD17g^kli5Z z_a!>XLtm^_^ZH+1spbv-t^EwY>n-H;{&>EbA8N!FS3gL&o@RcBa&E)Zj9Nbu_vG=@ zF0VrVQ*-Hs9DZJ&p~3~sF`rS<-FyARzkXR6C_TFQh&U>?`^kt9iK#Os8n*19`ACEZo1pa^kc<6<56S0mU1 z+`CvjdR{|I`BW=Qc)qjvCH-Z-nKs{8r@&skV$8!2Y*~eI7RU=NnQI2C;SZCL`Y9hw6bd42~Cjft31*23;Mdnb?XK~=xE{W|M zj*lp6d2i&*@|L$bFuhV=ny$>Q(_cU|p#XmmHIIKV`|X=BmnLi`LO1egh!GnVPK~R| zR0MLT`bJL9wxgSNoCxIl2fZ04|9i@5Xnu=^h)+|qsv@-;VtYjiw+>a#&@$z#>rblC zGPemCh$fpVBXL*N)kIShYom##O4jzcmvH;wkbA;OzuV#Wgm3eJ>+ozv477=-N9+tD zn3;k3_Jrfz(B-4pxNv-o=rRks2$yi}doflouG$Wl8Q?;;JZB7ny`rfm)buidrw9or~9!Qfw zz4|PLvr8KjQ}?Q8VNT}OEWbBT{S>&`y1C@dl3<#ubVw=qY3WbNNj2_VID)30!jXkF z7TFPiX=4+UMwHqnpX|7BS$X~Mirw2VC0-9@Z4KtMM7T7)D?I9Mqo4h<8F8GM59v-! zO=gXMaFnUgD+Zbht#{(y;pe?B6*`i!DOmqQw1=|isVplOz7@jW&DIw>un!=BZ(+Jk|6*= zV0Gz^H7zfGuq>Z{SwiCUoDVrOb6P)sB+U#Fi$t zVkJyyMW#MmpB#@b267^B$)F*L2c{=TN0*6%oZyETT$OS0&}nz`@BXLhpttq z0{T^duuRYIE{<)i@A5kCM)vHM^>O^EFIjf3^-O@g+ zKAQt?gpr^`c?FU zj7^4?Z93fZ#8#9*l-^^N-XGi%zenrrNkxI(Ij7v+MZ74zm+H>N$J#qDADmd)nApe? z98u3Dv2C^Lg6^K)LtMQ5;pQ+qm^;~dy6MS+V)JE{h4HCH>h@ta-PlUAWS4GN*!qWk z|B0>S2Xy-zU`;e-o^*q`VHWgVDd6^ZX20r6ZBml8+&fbs_M3A)vzg9ouou0mZnlQj z71{o^#N#qUpYn5!W-eEeuOP6Ix@5q>bq^R;omH7#4UfQn3AO#Np4WD@aLUtK_f5iE z46}pH+|Vftx9Tk~25Dvz6D2&dsY?79Xl)2bfg&D=%vkw*4T&aDg`@~QkChsBjuxXX zvlRhGs%yW;~UL2~|jFz*p)H*GdL^)PlV zX?E7Vpb?_Ill_It2HfrXG7BC}w2+K+lRKTzKh47!Zz)e7AcVV{tO4$N1D{((nx3tf zsmnm~4Hw1)NPkTalBbz1&eOGSe@La@k5MQ&FwF)=#PQvvQy0MQ;X`3qe+0(yl+b6d zm7vd92Lg%=Yfp2BSn+4)93rk2x6y-n3%>C36KE5TR*;Q74g$wnyjHRup^nzn!j~rMuE)I z!2VRcwEn>=2%NPnAj2u;;e&S%OlqIc8g*sUN$yj^WAd)BA6TRlO}yg|PAJo=2aR9F zPqVkpkAZlu&FH=Hw6vMVFrp=zY0G#xw3+3OI^8R=MJxBhnn1$%i!ax-9=*5ev5&Sk z7r#vkJ8C$X!w6W{lTEaci$j#|%2|9D_ltBtx(=pDe^s2JMTh#=8(ek@-h^vcL_^2E zny%&fG}~X%-TQ?Xwyf$NC;I`d$QhzntptNqLsfT!D1jB#P#yf%>9@OKg5BE54&>uV z5&!LOm~79w8)gRY&Lk#0eOvqeiZQAy?+<3}d8rqfMAdjLHlq4rfWtq85QCi?+x5}b z@u{P#>yzV3bs$D0bwX8YItRtSSf99{v}M=y?bJIzN^)s&&)}%mxJ`stpSdu@!%7~u zWWu%2dxb=Bx%L^xVN~>9kA(Tq=1kpTNC-V)gH!B_>bHu32{Dm;^SoJ?&6Lk!Tva5$ z<|seTc{_6i)>9o`F^&(r(z@JtQQVRExH|ck)jig8h7*s8_Zc#a(wEW^E=HdR%Q{VE zKc0InLpMLZWa$-6on7Viv7L!>Mh$LCsO>NSHYVp(*C#fz#-fq)Plp72EtN2VNzX_v zD@$3gRT`9R;w;qHU|l-#G8hvH zi!HmSpQasIzko#Q?JLpniN}bZLH~^xX3XDfU)ho|B$fF<^xs%We_L-ZAsA)a`|nd7 zwLZc$eq&;`(VquKdkaVz`70zx@g`6H9+B%jJ>4fnKy$jQ+LS?dY#;(2O}v)t2rZ$? z+3$ak{vV3?`!atF-JfG`NS5yXa&-U9(>sm;Q4YKK}{&6OWiR8J8~zgr(+&-O7hW5)u%l z=2T8e-}G#c`MMw;p1Pn)+6CqwSEF?p%>BeBkDOUe*o6}g8YTbTu7>Gey%;lca&^nQ z5k{HG5w^8W5Lw0%%g78+e=g;G8%T`09yz({^7Y(FdAGbDu6-i5-^j04UAmY11vY1{ zO~G0MYzb@))GM_|SbQ0FudEY!9wqU(7%tG`S^1W1OY;$THOwpB*d=P_X*EiKkit-s zb!mq>ucZH@sc(kat(6(1RoK)2V*JJ~n^2q1A&sPFAtCEsk!&nbeX%)tK~?k652K+l z%Z*Q~iH(cae$rB&!HC7D{6H)__(d5tZ*WO71>RkR)YcKN07v6Be<>utD?-qq6hUyx|btbTU)N;)8IPuV2|^* zEvk*54?)7I8CCRT*d5U+M{6qdAmbE^&!ESMNbTF9wlRnpPr}U_qajjYuY-;V;Xa1p zpn~7U)I9Qns?e2TzF?;Mli&H|HNu`xYYmwA9>se#-$Td(cv%(z7Y>h zM^?7%nLdG!^ZF#5JT5DLtHQ|((SPqr{~ZU9p#Q>T(Qg~U2hxAfe%T`opxe-RTfI&x}F%j8JnZ4)QH8sVZ?yBHjFpf>@yrUM(S1HGO9Xt;-J z6^z(;aY9J%GcWsbf$SS{@gCB|j(L091o(*gX5DUgDZBU#@zrN7PiGcrLZNX8Tb~#m zUlv|G{&iX>^yVIS^H}h6@)8)X^b^a!IWsWSb{*f#RD>`lqMjMrPPNCmC+xK&Jtzfp zPjD-kgDQMd<+Joeld~}+2)*nOy-26E(duO7B#afoSY7*ZnrXc+dqttRK-4$bVE=CQ`Q&xd0`QdbGALg z4D4)?cwrIXI$QIsBIVg4XBHO0cyQ^T(klVUeMO^#B7KERb^4on-!pEM7agOQ`qO4e zqp1tZP3(QZUq)T1Z7e;N+%1~OL=&Bv{>Fd4-(tIuoKQ9Q{ZPuMK*IDh9o<5Px|bp& zPp@oFUJgh6fqom-iPCJ@Ide>4uOu?+n*-2OK1x9((0xHd0ww37Vj{_7v2+|;9bbea zzcSK&ti>NemD?(AP5-79BZGc+wxj4btW#Np^6EB^18hy22=Gj*?o}B^p z%sx`v`O4at-g8lp@szYCDv}9^pqy}-ess4R)zSk7qmQmvggAG_%T!vdLgyaK9*XkGQOp$Wgx6{ z{k+QmL)x3bS5+i^{{a$31#eW)IBrp+1Eb7<8U-Pm2+H--nOpp3|qg zy1Kf$y1Kf$dpik()rE1$eZ^?($L!oXhW1`{>dBdKC0dL#7YJ(Q$)`xH?(+pZ(h_AK zQ|&yik}^NrwI%z7^3?}JIoV9WJ{)jw$RbTHCrj;T1B3b!ovl`NuJeaxrwWv6isv#nE+tiLLFaf?yI`JH+aByNm8Kuk97@vtR9@ z@JS0+B`olC)M8W2a@x&(vMVOAzSMCbyJf6esTWElNdy|WEsLl&Q=ps<6ZsR|0<$eR zl4+wXjmMd_$AiJe;ZCSgdmo4w^KDU)q}P4pzIcHinfQCjVlcN$KWl?P9iI`nF3a`n zcEW8Eu{Nz>jj$b3*K|uC%WKr{QrGk(-YfULx7~SCS;HFq*M5s!w#jVhwz={t%w8DB~e~xAPS> znbW)JmlH6U4bx4O(xyKCyvCpEmq?B#Hw#}zUk$66M{Rulr8@hulmK5}gs;#oel#X# z@>l=jjS1B!e3VFskE(X~sIFv>;$mZBb@ZCtEyGM}2;Op;nGjL&lob_E&hRakkhkTg{NZdCz+`cYp6$_!*fl8lHk`lkP2-nqW_*`P-k2a~UcKdG}y%B7`# zr!_{V4A^!}Wud+_XF9jZqnO=M_#X*-|vs!Q8n1W92TMpNs~GVP-6|Mc8YGWSD6VZq&_PN>qPa}Os)>j zXBno?$Zj=zo893OidWYKzf5vR!j9@b7k0zkOU+g9au*P$WjZqGae%0nw20toMnj`} zXbx?icv5|?U0Q68_$N}PvLTcTGz=m=y^np={qAC5)SS46Xt#}Bt=tQljCi8AN> z#@Mv9v_GnLKjzEnf0r+AfgjCrWa9`<mNq@YI?z$0?jOb{dEdQq za(_q0$~hfx5AU>w#(%y{xwt7*b;a`~)Q94IO%>HJ-CAs3I2M7D7{2}^0ZgbFgNrgo z{N)g?wWfy=I~A&)=|undjI#Rya5J6~dzj>>e+_$b`a|YKS7{_T@s)WGZe=1mtGz;0*0@;`C3!lQyMZ65 zvRm^xNnspYh>6E+c2&}HnFByAFgC~jOqK2lwezV47F@G?fzUWapne(eRf!)8YUWde zADK_imqro9-3C$nS3*525*xPTfYt4)Sg+^+{bX!-KpD?_hb|zccs8mS|I%ga;bK`Z=Bv9#EOA!|;G|?2qNDPAu;|550Nl?aucm zT0BR<{rttKEPzU;pr5%P>8RNO$Kz9j<75Dp14{*Nn6X2AQCAn~y7+%)}v?q;8&hTaY z4HjbSLr;P!GMMlP674YMWevQ^?RZ*gPsh_DQ&#&&+GNUF|46G$asH8ZnX<`0(lS%F z`bXMkN*+=bPafa9(F%aTaKe()NY$xFR3g4Qw?8by3b*qoOTA}B2ZHQ~_*S2XqLlsU z`q6g)I!2KJ;BIy&g=6>wSl;ZfG^Zc>5ioBD8XOb8R!$zb9A5@a_{Ueo)w0GyYxYe{ z7ijipmk6`JHa2He5^_3Y;phjJ3PHAZ1rq^GJEU}%&@E#n!6olx>;8_ z@xPkixuc-w7v`tY`Ou2*GQBg|pAY>G71X=;vo5leS-o!P=!(3?qdVoC4}JJ-**McB zzcJNThw1*0^V?If!~ZYmw@1;dP(Z`eJEH_dRhA#o{P-v5dq?(GbbkF1PCvL)ZOZV@ zsX1H#t)L=^)IiUKk2`KPzH6PUo4cw}?RI`ixxznPeDe1SnU76*Qu$E{#LCT+1r#qR z)L-%yRvF_UZhQ(L+#~WJc<%vE}jwX>h7ETX)P0<21OBvKJa02c|9Z4=e47dMD@K(3_eqyQGWp?m#9U zagS|%buiIY^;rWu-gnbHs)imwRCoVgXRXl`RyWPv7s+Mg?#_nS6M2JY6APmFe|84D ztDcpntu84ZARo96N^%|GleMi4lJP`cPioxG9ZC<@fU?$zl&okBbq9r%O|WFik*#6- z&f`w_2M1Sv!JKkw&Gv5oo2UX5m$FU7W*4^g5Kc_-(dgfM_-vwdd1ujU95wne1nv-W4ArB@0L zm)+ist{T&qpJOOQ@uOeBj3&=AK{U&CE6V1)gV{x zbV$RMS>)G5$Scf?xyD^B9Z=bP$sdQ&DD-AgI~?cos^E z!CW$X>|v}meE9buji#q=O;^e6m9O#MTt)?CJ`E$f4F8dV2l(LU>%_R027w(by? zcpSZRAkJ7IYmTi7CV}gt>fmxWun$((=k(3@+*jBQsH0T_lWt)5O;wY(s$WiOAZ2-4SLN4vRL9&`b%2Ov|=ceE~Wv=cF<4?nNAWBkEpdj|Yr7kCGc zfZ1&KNWIYo-hL3`ZWTSOeBzb5PleWhShKTE$*{H4I&yMc8oTwp!wtlYh0~j{*0H+=ZEu`j`I%L;-#p_qZq$l->#U-( zw=Q9Zr{BZPzT4t1d4RrqCBp35d0dZrTpc{FdXH<<+$=8I(OT_Tw_k{BJ^fHN+pph&P%JPPWFD0{s^NCtYovv(NLq}pzF4?8f}AqCV(%Cid5;z{BSg6 zNCtNP9cXM5o^v3Cpxv1OxLf{8`%O#l1frbvjL5(F4)TKS_V0rKrGFDOXC`QN-+SsY zsXsRao0S6IX-5VAA1+(?8nv8r*}`pTKHPT_vPSz$<>fCdA|ZU#_^p3o_hc@uj={WJ za>$Rri$T{e#B#1(xYVYZwL3(bW2yTNTM&_Y0O{k@{~z+L0j~ShIG=tlJAU<~EOp*v zToERje%G#%7&N=0`{Dc(_y|QEbadoLlj*|O_1!LB_{LOk%#hhUs5l68L^nTbh!!W z3uu&c!i^ABp*MN9I36msJ!Cw5f+qyN1TTm$2YuSX_;SI2j4y9-5>%wrjtu#NT(%%& zCYLKd60&Bu?LIol1a*+i_!i#((}hGoA89UU{$_su@LjIkwDiB;Z9a4Y3>R(bjdVDr zX8YSO&JQ9z-NrwiGk<0OOz0J4c*YNSzI*}}i1`w&7Ef}N)$g%%;!F{G#wSm3eva^% z#^Tgp)W$YfT;r0@0o1p_#4bolEb-IIAAk+R+7qWZv1+s|R3s;4z<;FW*sIc}vqR+>J29>EbTD-UM zq`lS7jrV096Rvm3H}Jr{5(nlHniBYcOj66}c1qpZQi;{~3d&u8UD4}9EZpU_9L5IV zgShepcnl@8ywB_$t}vANfqNmnKGv`SN%*Os(9f6L3`{u1D3dMen()&3`G=c8dQjAK zchp{~lo%85^J=VNg=~P}IqOw)m?dzbI{A?Cxv?SA1gvK#AF_Ka8m;Egke6;DXISoD z;Ln*KrB5`$%X1w_H)?V}>U!76^!3Y9w;K&G2Ftg|{T}ThbE_ylQR#`Y4fIvS0h9Tv zC|_tYew%r4n4}#Kr zXd7PPRK?h|tKo7yI0Aj~1fR7=>1wSotwZnS%d7F_ee;o(cWzF3)3W7Fi^@ASEbk_j zx33hVpY`CWrv+@*bD-*s6uky3bH>Nk-qE08G0F!&h(!H<3UZgySghRCpKm>GjXP9g zQ|48H?(&KI^Kp_5=J&F53LDJvMI0`D(Hvho8Z6ncR+!mI%%eHJ0{oE426KF|UxY_< zd=ZJ-XheV;LK@@(b94XZJD*H%KX7I4vvMaidORc@LsG|&OS-X`_czjca5$l5{uPV#Cb0cfo<#DV@A%9d^(O|vU#qz)PwYOn}Z+BISO#=+OR;k;dN9DfbNv?R2Zjk3% zFsK^y@=qL8wW2)#_vu5VM<8-Fz*?`;_R92aYTbj0lL>lDzTIoHB?LW6zBl1~=%3Uh zRl3XH#R-IyInfYnVVepai~GhNwtG)4yxtvi2Q6$N2=8DX2EFm;OaLDe^UimMZ4AZ zy~3vjw#<5u*-NKA2%j=h46Xdf8T&`!z^8|+VZDiv=^(}oC>ccG+Vm}T(*m~qrHppH zbAkggDV{c4L8~mSVg~03gT}_3WW0Zug~`P^$%LYvD`^E9$5|%uuxG5kC`=~gbF|_J zWA*aM4rJ@HVhyhyHGLqa3(sspWc2+bgyz-8(g75O_QSyBHg(BM5y)a3}$mp!NBC#O*e2q0dN;&!7eti zW_N~xeOg24&${%22!)pZLq{8n4JSQA}q(T9=CV(?aZ+)g(< zSflQrayC_kXuGvRTYHLJLEYTDcd9y{)^rw1f}Pi9LJ^DG<~YHeNA3ZiBUb;qRpWex z&aO4tgt1+>!dNqF%5xTWC(SU!(Z!*tX$oK)w?tqE=Yrkq!S)x}Ex8M|FXX(i~s*Zz;R!(MSLb(L!wmur@B?`?VEF zAnhc|L1LT!0rvZ|*yZob!5*8oO!QdoUVn(%J;$rBUBfDtz$ZQCzdgmbru(c9wymj& zNs)U3eUYgt!Ru?&gMJWZTk>cnueBy7h3;CPBUZlvj@s5k@RX8 zCXE@eQ*&xHDHN0MP*%SzCh7ZHw`BT@Ht&ig%Wdh0vvWh~fB9!m=ongg(s`(-5m;s{ z9XEXFg8-_7BddZxx~2oo9!jo_cXxhSW>TMc8S0|$x*qXhI3dm-)||_375d3$^Z<_4 zW@2IqvS&Bhk9a)Y67&sb(Tn(3-{d`9!G6qA6`kg)yRU7H*p`oa#FKloMQ%8u2_M$d zdQg^#Hn&xrqnW^nob^5kV0G#|Q-{NKrb#jD8^{#<=umKkxO4PnJa+tB?r@muOw_**A+`gF>{cZBd^=^5D%p9znTX*~UjtmH zvWwEc0h9FmWkpTbXWNk0D{6HGSOOic=ZGa7Jm1E{DJ3JpD#PV9nr)x*srv z1E?A>^?^eN=;yH>{IH1-XXSN8?hiOQ=I_FHvx}Ha?|-9hGfwtDqGktP|G?BZ>wR8| zZ)ok8Hs(LQO1iP@m-bWo>;rPnoem!F9Qq!&i=0DCWn87oUI)r;xrt7zc}_*$kIW_X z1iG6&x<7byfA{DvFmz{R(EU9`SL4y$Aat{Y?qHDMnH@&_A{P???=OZcDzDqdS?I|w z%ve88tc@iW?`A2RlP_&~FY#G-x6|Fs!`CENVDuGhdPu{_DvjcqiQj9BjF25J@L_jq zr!DWz-=C6%W*K8xh~|UkIcR8rH~ryTMI3@!;Y7bV67owX5^VCZNALOG9bAmlR}0nB zH9|I83)?tkNtf9R~R|Ns(+-}V1|RHZ(zXtI^P*-^se!4Zr)6w%Xf#1s^v{{!hWTxRZrTNee=oX*B(_JoW!v~951C7=%U>EvrsJ{1h(6v6LDul z8FJH%PRZrzi%d#;G&P&hzwo9Beb<%xDP1&ELVps&R5&*(fRSeDzK&BJvHt>amq&-v zrQf;!y2$?2DQ)2-sVJC8ywN)Mv79TZ(jF@?=H?D*j~{>3l2?hlh|MKJcfDJM?=ODd z>V^*|Uam3paQs=RnhxzT)R@3%B6KdIra8l{su`r24RZbfC@(e5cyR}9#PlM!grXyU0zx1h(mjmCvJZx|Q$GG>%Mf1kKeV_dLl zLklx#dsxA$GF@94&nMdB2t)qC}QYFkN9juTza)(yatQ}2oW*# zgdr@rP(b9o9JJ=Y5z0M5nZ2*Y^OJpH+CSVlrBI!ie>@h2kA6dO>Nwo&N9-QovXY%{ z)$KMl?dtVC+n{3gn&8KiO?4AmI8o}7mfFvCO9DO=TWtKCql^?MxnEUx774#~*VDRH zsZ$|{QHP+L7B_|zSyVlHZMIu1+_CsAbTWxq-R@@EH^#scHAnk8og{(poPh0aOnv z6-MReOH+(m!Z|Dz$y@E(J|5~zc7=0pFT9S)rF!kcYp=zL?>UG<{tCB*)pcJV7WQ?K zFQ(4FHiV?soRUMPk7SKV-6143tvd`tM-@f|a!6$4wJ8b58dpNg=Y%z;3xUmfZ+bL} ze+kzwZEt76y=n21(42&;tDDr5#^e;QJ;BmKA}R5{f_`M z&9-2ZCTh0beyX+Of|Z$sah8x+tc0M)TTLn?jDWoo9PuDAPoJW+dkrq}RBqbmK5bTR z+U}M%yUx-UjN!+w7+9h>H*F`MR+O7|nooO*#>|kC&`Xe*m76A4J83g> z(_XVKH+#ILEf~#@yD}kCX2*R}ZzYW|KFluiNgb6`?Rm9H`Hgue1y+OAN{ASuOR*?% zWo}w`pZ0QY+By@+{>7P$5Bdax1&rOb7ossfaj+k+O=2-k+rQ9VJc9xgVSFmhbM)tG zp3XbHDgwIxYoUHhcg75?m=_0Kxcsa2MpIRLX$VY}Jqw&0bOUzuOxAJ1l$; zzlJf*9BjZ}pM_uE8h%a&{z<_|2@RI~z;NcI*!q>KjKQ045NbrYy z_%CUOkUu&NFvz)utWau0u47XBe*Fo*t%4EzYeALilPXW@0BSq}Wv4E*l|f3=5S zwf=yJKNqxy|Ar7RPk)QtSD)!MQTEp?d~Iv^ybS&~1^-_Ue`N$;b7>AOS7dNMAlN_f z>h{C~&fxhHYms!1y~s!R*npKmzvy@;KcORVaJF|G$)czA4(&gc`A~{7NU!{^^;Gkw zoOx&Z6R6C6Z%;Gkz8}!${mM4)hqZaXzRmkz+q|EG80O;tq|NtR+I+vI&38$4ZvItm zzF*IG)??z#w`349*D!nB{EK_wyhH^JPoIOrXl>sKzUiOY`I(QdAxKrjQO&`GfRvMS zMgN|8?uz+_#igh5n^;Czl#Usl!2E<}s##~vRJmNu)OC;f)>?7AcNO#GIt;a#_A6OC z4U>77Dr?4maLLJ-owrBpiK2fTDknQ$`WYg7Q3>8}sp*>hyw_%T0adi}3F$clq%3EA z`KeK`beU0bADEGs6}O23MKp#>UY!88^^CWrP*Y{&M8Wn@5DzBwZh9bdUWVsG7^148 zv83=1ZchwM%k)i19-f1-cAnTLAa@sFBO57F;hUXXfb&1w=F&n z7Xxa@f5yMpFQ+58cbTZs9urxH z!DM~^6BCVDFOf4V18HFPC4 zt^Q1VR7ad4Y-Eeu*(laNA@1-{O@OC{60`U^ zsQVthl+wFNJH{FgkOiBV&^r(Pi1X@o#&Hfmh}EA=x(_zNd)3=b zh3COoPPAC#zIZ~#a$r%=KaS5A=cc!v6XPBDeg`Y+7FfM%kMH$G-2yqlNT0@ET>{50 zkm!4?;b;Rkh}tTu&@E>MoTWeP|FQZ6;EK?qLpCPVKMRd})j6Ft~_XAb#`iB1LjW~LMvS1<3tqT_P+*IV_r9trJszn8A3=;HN@xtzJ?;7s-# zrwgjNVh1Mo>)gIJn_3^6yUER<>vHp54N-?{Q20ln%YK0l;y*S2aFZLnf|!rQcm>n^ zOpb#2au(9`4&Qt`hxNRaxmCpHdReAvnX_5`Nk&F%&H#;6Dn(VmZ8zAia8KeOkOCx} zFR!wm^??y8dh8K)gTxxQ34Y+1(a4?QuX@?(_ygqw!Ld;WK2R$PjwW&2G#SBtWDVr% z{33Gwmvkvo@jv~ZxkGHuj5B56Z`~0>%44@KN4M^dSOqgKrHLW3Vb#RWs{cmUqVBxI zaww9|`D3-`jd-QFWqgM(()WTDf0b$C6;vdniC;mDryt`hYU(flHm&l<7bQGhtDezM z=@mC=P`!*whu);Q@Y(d##Cg!4D%&48_srFx`2s5oG^ctrzxHUh5;Oyv-x!*UvuMUd zXpZt|Rs!cP5t=(ZnwUqkR)OTHuFE}||FAKzV%{IKXu3yeHc8i|%KjoWB|Z9)%=)H{yl4YnMsZW$$o3T)gDl7><)rMxo79MC+Q(vjzpLfoYHN zCT4CDCbs1FMCq}xLree|%R?mODwK@>h3xS#o95L6&%;4SoaAPA3k%~ycCw|aUcXO0 zc!*f(w)|b?a;)lSlKF1|{Aq20kJTd)c`i*2g$T!jD3?hU;pEa@QlhyF#^jg`f`g=q$KBRaz0DYpj@enxQlKyc~4)aHOGY zaeoxLyHwSDLq|NvV;*0=$M>#c$hrSB8CDj2XJqm17vcMiHkQY8U*Q`ee9xj=Ek0y8 z_{uLJ1;l%u=7Zx7kf-N{~+xY^}iu?i)_f(n%OR9$?T|1X!gHS z>O8uP&bVl;-{zDM>9#>_XpHb>@+>q{-a}$>QTb+_*{yK8{>4FM9``N0|%X zV{TdSzN2jbwRsN&EF$vuybQl&yAN3Vb?Z4$%JA8gN7n|9&OJ$ z&@!3OxEVAQ+w&NEF0p5=6a)?3>{*C{hC}W7T6&dsd~AiD&r> z8Ke1`nwV!FRI6m-1^;1;eOT;YuCSLS{^d%0dC9+wwHJ+BAXD|Ha+W?S=e=tYkJNK@ zJj2bEN?PiZR85jrE9ohczKUJmFr63n2KHL~RcsRHr;GmEM0os=+h*#gF|mmslbA*h z>j@uq14LsYkKSNk2&!qgkI=ZPcFVAilz|@sS0^73P&{~1IIDvO;jHe{SW~SNiIOk* zaZ;B_>>Cey#gm7{gDViWD+!Id0uSt!%;K*=Ag|<*w->o3$&e5**Fjy)m9x zzm~A7-o^3Mj6zCbGeblWn;Ei?J)=iY6NYt1QaHJ!*#C6XPw?E!Mz%By5l{m)_;vcD zdaI%0wvVO`Tt^uXP9~OMRqfaDWT5O#+i9N9H9P?aLHqQC$LDuFCKDU9UE{Nl)5FK=)a=nbLRX#tnW~@Qxo-OLbZv2OGIqi&W&Z`bl=6 zEoVZ71`Tn&q@EjWKMQ8^lT6%cU#ji-&-`^8uoD5YdZiZ3Qql)LX(Z1``cq0;p`@T; zv?V?Fvj1X>8=O|7x1eE+ev*mB{>@h*VUR&Xo&UDdf1B#xR{OW<{%x&)yVJip|2EUV zZSrrk{M%Ol_LP6iGgGc%o`37;-;9W4qL4SYldp}Hom!wp8n+d5FleyyQ_mTK)B??@ zn1=8-X!sY%l8HlkMk|Q0sfnKU;Zyr?g#REKrzU#ahYj|jpZ_3orzXnvGPmJNUPdJo z#~Iky1~$N+RgGjKZqGm1b2ZQIENG)tt4M0bc#^79w)8YLaXK%2+JT>`i8K7mj`pJY zQP9wdzsbZ|_N=NW6C?RcjxPL6O`LBZ)M$+f;SFWAF8g?A^q8D6l}BWCx_*M^RQqIN zv|e;3{K;gMb+Jh*ks-lgmo#lJ|3{ntEj&LbuO4wj+_ENAaL_PVFNmW3ESSYlGBK0C zEj}G6D0!={Nd1HP&u_8a=@{_0i zkZ#$`Ok+;vF4$v#h^K0Im4P(1|GD#QOGEwp`Z`y6+LNb!!nGfjJZ)QgG0E}3R)q1` z`Gw9uXygg}qOigOG}&aC(#`kjs(qC7h);SdC+Sw7q(+LMCR>s%2TS^&dBE@w&Vd-= zGZp6~Rr{o(oTNTJ$ty5V)4@K;YdD{@n@{p8&?n_tk}U$uIeNtfBES}aHK_Ue`o&*@ z20FTv4Sa!_61Ma^Si@eBSZ#x}NBOumzxrdsfBu;O3A2FZ6Y;Ji~7VnzO z67Lj})vz&GBL0irP4$_ldoxduL{Bzn%Dm{DfXvIsxi31oFY`sAm6;d0o-!{N( z`?9NlNtYpO8Suhf2;Hr~m-I@eG8qU>5Hl}#ppA+jPJKwPNrJVRb zU3gpmKYWiTH^o!q;`msx+3=6us-Ql)o?U@90O1P?{`Lyow$=3QIUYN1Ywdl@nrMUC zb~@#%<7)>1r#)W#W>y*}eP*GgwhG(l8XAp=p`|&?X-)siT`wCq8VIeI{q~Z!>t(|% z`Y@a~5olkq7t}PKPy#z!R-7;(OIX2~5(?%(@gy`N3DV&Ol<|4QLV$t91rp;vU zRBL`S|4Y8#dJ`4fr(n)_MWVWtJVUALAei-$kK7-b953uEHOB<=z}Tv(Bjox`OEiqIHPGE!_F9E#PgFCV~&cMa9$ zj-eQ*P&Ze`=4^3YsT9w;Hz#!&=hIyHEtjlrgX+ZQcI8Agx-Qg;ud2tM)G4fcqpQ9v zTfwy^5j9o|*B{z^e48rSK!<8ryg*V_(}iXp@Avj+?yj=xjKpmS5mPG%xOHe8E+C5O z_SKrcb=M7m=%=Z?dmW#b4|-~vXZ8rHaIo7B1!nP1aHDc%a#%@b|E{vu?jUD&Lp$<= zUc7ei+H8+=Rd9Blp`{baD>rsAXIT?ZGMSe|@?e5o%!35ETe7m)y~av>#B2GVK?G7l zE3fCN4>vo!N-Ma7GGtnv!{fE+?i=(6MfBxx*AO6Rk%Fl^kG$v{@x9d-6*iD|_=> z6jYW|L%TO8GrsrwkY?zZ7ps@E&)T8BjHjTo1Xd>xld|js#a7G4yxkxny$^|*{3?s( z5B0a35%l!Se1z;HBC>OIT5Q@ysAy021#)bi$!jZ}mh+NU_+dPWt}xk-&X##`l%#Hr zyMPW954wJ~R0A1G^d)-2(2|i&D|M=D`h7HJs2^ih}thaUwKOQJ)RHKqw`iRK4PxMbLsnIFd(XuX;H95Oy=& z_@b&Sr+WGZOi!Gm$HEDgSXVwME_D4(zh zlcSgaYI1bkSd*jIu9O_*oc6HG9ibepR%cI@{R%kO=^T@z%zbc?{0zOlwLCqG+d%SD zF_a^dBykoEK5Duy-Ln(?-bNs8<7_AMdk;@Kor0rg`+#8z-|QEbo`HWLgy&ukV4gFW z+K;CVxv7jlYwcs({6~?WYgpS4A4N1+wp&U{_nv5`TSpym-$ZNL+_2m%TsRzqfA@s3zkUEGhS%W$qKNU*joVD~SK5YCFWgnSmUyX+XNf0;b-phK@! zRmrtj`U-_lu4x%uXiL=zK5~8m+Yt|C%O1fnuaFQ7D@=U1cWg>W+2dRk34!!3m{u9f^DuJ?XLYQ3C9!sk zr;_SnxIuJ=Tss$5742xd0sQ>c-D9YC{{_^n<3Xf_xLltCEoe`lb_NWBs zhK8u%Z2D2KMg7Bl$Slp@V{Bu!g;(e31Ll8=godm;aZQ@+-_FRxjaXcXSsv?lo__6-=238ryGyvAWxz#p=>dm#SDFx3@29!Uv7@ zwe{7$t^)&>i0XTqva&-{+eMl8ajNl(j!j)6{=|d5?8~)kU>)>994EK4Y#9)n+uJQd z*!#8H^NYl~t%>D34&WA_m4rnQA-CRrTBo`ayHxukNkxet+s~5%ov#k0NfH{=70*!7 z9KJJ-IZt|bYRY=`N!NLPjEL25rJceXSt%R1LBP4+0APpzQsLjuw+bIc^gpsS(|$_Z zUn1GsFH_?x`7Mc5+(jKIRdx+fuJY7uts8cvlz|VQN0Y&@zg8Fb}Qw2%}Qgs}$PrR^q(m z5qJSM`Z*9GckQm)Cx~;K#rV!5asQCS!F9cda~qR9l#MS*UKeWk6-4tHkcE~L6S$is zPavtm?L5A|gI#ROz7!X4T%ugYi)QzlnP|@%r>YVY3G=I$H#u8#E)WfkqAl)T0eglm zHMwq6n<361OL>fnO1sNw6bR!r_5lt<`mDwJz%1ky2!g(>epBknivt} zv&~(Iv8K~jV-1h<#q7S=Tx;PLw}7rKcX8rU0?}S#f7W+9*5+3xFDDcde@^D$``?O~ z$;%|CIhuXcbQODgNQO>Nb4?hg(fq$Px9V*XEK#;~&H<{BcE&tG^JIL2v1xZ$JvO>u zW3Q+G#0&lP9`GT|$<>LYcZ)UXWL%@)IA$?S+uT;lmpJMi{p5!=pC^ z5O!0y?R={CA}JYv1rcoNe;Il86fQoOeq{0PoDT_ou&F^i71V6!qUf+dv^#On&56&p zCRXg|I*;@9F0M-A%*AC?l{~?mNnDe6LLmvgE0QM^r5A$2k1x11;z8Ustg233(c=5< zMNDn23m#Y3ujkpZhT}zXQ0}CyQt@qEut&?zN9y4k>WTfw_*T6Y;Lf(Zt!2Kx!1HAB zvl*Tg&=@&9`IK!c8J>L3L^-{Rlu%AyFa;ECsoZe6ZK)iE#^@MpI2*8Zm9LEFmpcRw zc=@eLO=MFgr^USwy?*d^p49`;@Ew4w4!j=m@J(;Hjd-h~7g}*=Pq8*$js-{J)y&Nt zPpe8{D~c3%1XRP`juu);*0*P8Dyz_doXXy4l?}xP_uqF+deY;Rm?-;8HrK8yFxqq$ zX}8$4190mge{Pv_bu}MPSzkFYW(=p*a{N()B$BSjP^GSM@5;xRDtnZ@!S13EGUaKo zeYn2GbpMcYZ5hHO_BrV3oTW!suVv_oP20*MoOU7f6CF*w0KMj!Or76u4ZS1P6V*El z`bST7Lk+b2`%LIclsy#XtSQSWV_*)G-P`AqwXafCNw1kCbfWhJ=uNjrapXAYny@Qw zG|^Fpu&!(*P<2yRJGYzibRbX2G&Dsxb_(M+sHC)akXdPU))jLA-Vwkwlv0>|WUK6R z^z{n9<`86eKIOhY*XH||R4(`X8!#(bL9tPW?UH3#gs>8=JPH zK1Yh?HoODrt!)aZq9H1R<8>TxMe@|GO|OKk^#fK;W!Ilf?zS7SN+2J98TY+CiP2-e z{_S-?NWp)f$h@b^$eA@p(d(S^p4hs54Rf3An0j-cPCG4dmFLYvVDgw*R|k7kb+~3; z)B92UuqI=iFCR~SPu&|;}+3wcyq!`3w5T@aWb9c@obW?ENCWzG!+uboD!|_G=B85GfhR zd+|_8X}Uk-uQPwcg=k_?lc8`zp*t{#!ozBc`W^18n^;`Hs+4ZU_WCO5zjv$mD4x*o zXP>-5%cL6f7W2ym9Bj|b^w*K-;CwZYZU=y@x+e>u{&PsvocnHkiHSDD|94pU;CT}y`z|^p#A+m zc9wR^mHhxE+AVRKPFjh%#i_p{Pd`bYK);(0!NsDF)tuqXFWglO@f6gUcLFRXmn*%} zSM5u*U}FcRE}*L_kXj6BwRq$C@so0f{6hKP(>00u%`3KZS&63|!@^PkHOuYj=ZeG+ zJJsB&NDTvGh&AIn~6pj zBdBkqYrsnK7T#>SRaNSVI{UzVGB5%zx2rkoCna9-3nlKU65(5MT5HLg!!;m7s_~!eyyO<;&drx5Kobp8vI7xcOAyPSa)5! zp0#u9u4~`3_US5L9Mvg@1FoDRt1wpz!)mW^=SYSi@I83VFS=P(7i<^723_%F2Ew+PN^fSPi#g-53^G)q~ zv6Vtv26wa_96#amPFCbk<#;xVLbv`Drw>Qbx@R#!iC{h(gHH3n$86qtVG4Rur4O7X zvUK1@#k@NxJ9KHhRVP?n8h2v$t4UU#fSNsAO1iJ>;t^fu5xs!#8ANABhzN65WNV0M zYJ^Dp*JT+_5hCq##{S;R6SfTf2Vwhod~axDL#lMg2p@!fnkB4vgs%l3mk2vb_+F)< zMeQ|)X`ivj56>=f|_fO;a-Q5CLab`kSniCt!PPj5-x}Efb8P+i!I*AXbc_m#JtAcIaQ& zD*jwY&T~TLtHa`{%ZoJlsQc`pl7oVxhehuMCjOr>jV_88Ott=?aPi&Tc^+|>T*MmJ zY)~wye2A>LU2GWdU*y&?v`CWvLgiZdzcoHpCEwHW=L3_={6b1%!)VRDio?^R@c>rq z<_B224P~z$cNrZe3RiF+pz&Gqr92y;7@`YofO`5O53D$|g=f_c_pbVY<1RpfeUW*q3s72R$6o$Ccr874hz z4yd0p=|t!=rTsaOfLD;| zCcd45A?mTI&iPZQcB-`eRB0u40Z|bhoK#DM0YJYM5P2o<)%b&0D0tspguY9kgfZe; z;0<4Aovp8>?L5Y3ZZM1+hw&5ceQN-(7SE4y`+!%!>u69-{r3^BeS~Ya;bMQ6A?xw% zgGSy39@+g7G6tGcLS$&`H|YVk&+&Fc*W%tN2VGYN2zS1rWBl65<2&Eu>+12HoP+Q8 zS$vZse8-3QCJNtE%%fbF2;YLURM{R~Jig^r4feIm!8aj`?{^Wt%{0FT!ruztSdI6~ zXn5Q2bcx5e>;bE9t;hHD(2#l5w=Rosje3Q~(1$~O9~}$6QNmXf;oHmOtMT{_^7zip z!N>SxjRBfz5x!GHd^ZW-A*ydlgzq(G`_#9@<9oN>>bpx0zLT=}j*am7{p&667~$*B zG||0tL0I1j9^X5EwfZ)Ad`pI8>x(2t^fl9mtiE&T4C3F$W59Qn@YP574)OTvJ-$+p z?}{9Jf5_syFTyt}#CNao-64EOMEE|`$QATB!sA<)u=?(wgYS|ozCjVb-9vo87rqyT z?^EnAYu~`*`}BUR?`bn95vFf|641B|c@74%kUyturkFV0> zo1BC1oGiX4BYand_?{5H1l|@mAi~#lhShg~$M?1U(dAqKIHLzOh|rI-?3SIu?XLL6MTJl7QPLl@4*P)Ngm&W9^WvJ@8%qQ zmuK-UVgbzfcSDG8VL$NEm$Uozw5V1Q8u~iwlTE`62Kgl{O1hbq8Vv|U&0U`xTA6$u zGv%9j>Z*=5S-+U+kyquRhhP{3aF-5^{fi)kncjJO+k8LrKd|2OKK53{sg>NTGpssw zd9h3|Ln(A9K??!66~&0ct^M->+Plp8aCYt5ns{nVN4J&965sxNpEd)ArHtL%n`n1Z zW}E<3Of(-0kXf!(kWNtW_j?XtFpLbdVplC(DBgTn@5ilzS1420Ch6R>f|cNdE_0aJ z1%->&ViCA?INlhiIx#Y-cIjaQnRVxpi2DEAX_BCW+Cv@#%6XGbf|>_ei$eql&VVzF zo!W;9o5fCjifR-cd-r81`&-tYxASu3<t~{iihuS+hHa8E8B;wtGcv4n};VJBC)I zk$-(RtY<$QrRg6P*0BEDe@kR-9azF_)MwoTmNRQAI1*k1@)!>N@z^o#bw+XZ&Wy!r=NVsplJ(`02N!l|@8 zAmIBYmiQX0CSo~7Va~bNfr$qTLKqY~T}Xmj!3s*}63w?eqzVrn&RwK{IzV@258d zmxlg5MRIUZN6X-m0?5b#)6z3g3Cu_5UnlBHFF}<)znv&$vnPzxztAr*2G^ENQIC?C zrOM6+)Ln8EGN5Z1qjGxe;PGAT@$DsiJ9>O-lN@}-5x(^ZH~6{;-(JGkUyi1r$0Esb zs&lbn>bk`voPmK+F>hZmhGc!9P9Q62rbqK8aPFNWK_h=UWA}KE=7Vch!LIvDxQRJ8 zGoEI7G2=BR?Uh^A@&-9vyFdTiasj1EBF&|l& zWa}PtO$Ibpe>>d&X^)xJQ=~km*2xG?T8#I*CFfV#s=VaaLI9e&=@XdA{P9mH9zkjSUH{@SBnO^ZFR z^&&NRUzb)7znqjm-%Tg_9ARbtO;2Pua z+sM)LgMXI4t68cy{@$mNg)_1xa&Mysf04hVJnF`)4fS}T9-85A($MvFCwpuYg{=W> zKgZu5SfAqWa@xf67e|iFqj3D<7$^l@<<*Q>SgxjJ(D;qUyI_F^2E~@?j5Nn5DcTzV zty>_ymltceTkt`_SGU83Rw}PpISDJv=rFTe@W&2@7@^q^mb8+|B;iAky9?<>7$${- zRC14tz=)TsVxIQVi*Kly7svCMDy?E=fSr&`cK_An|$d9P3| zL2J4r3?=jB53%fE+7aM0rm5m--6ZCA@pYIF00r*m3#{=4=H(RldbYsdMg@LDe^ecM zs6g$Zh}N&#*gwR*FH$%Tfi&7sxp4cC#mkXVvHZ_U)BrBYS}EIr-)_uR`Q>Jt!BxM< zJUfBlu?MvC*zL@hQ58#G?>K5ea%2GwB;27C4lb@+aHfhPy7Tw9n9yYns2MV#Y7Y)( zZ$da5Hc#Ap{$wk34c?PZ?hdpM{+>=N5<8&Ne9f1x6ys)kx^m_rQ**q-~9%Le1d#XkXj=P`~qVA~e z8r~uSZ5dpYK1I4|dMdw;|CX$6uXDofPH}cC&1aUZ9Bw1sZAC(qwo4B&cs1`eOg1fS5w{c-x_-g1_6G6eyVfy!SAswGhmz1gS|B&AF z2+=Lv?vcySp%rEY*}9b5C?hi{*m9#f-~#K;jfs)Srs{*m#gqQ|xdsW+Zu*xaT3I&$ ziQQDXzWbAew!aCyI2tn3kb_f7@MqF@jo_S7?eUE+~-@yIUo$le%Z$j;0`hQ~IVP)v=G4GNJ>0a_hK}2xgNI z7o_(+^m(}^+VO%=)O*fz?oPc{D%o_i@VUgMr}xAYvl0|JHJIL z1(A`omFqEK`HKC$G@12Uoda}|>Js^2@;anHVT@|+f0;kH3d-|N7&63e-b-Ja=?|Q? zs7dqG!t^Q|+2X-mbFv)4^de$xhNDfl6HjDL7`5UqKL=v>e5rr8^8YmE{eD<=b^4p1 z5Z0JCxVoasZqHl&Gavg8JLOb9R;G2^6SBN9Fj*e-NBEKII>vrVU+Slk@GW>0PG~!x z8w&HAGGtO^ao}8sZgdK3wDcg5Me>kYfA+3~remY=DcC9A{UzeHI(T=(nwFbqQUU=x z+?{x02kZKE3-qleX)m=0CARJ`?sRyj7DL%y`2vR@GLGAAHd*;2c>*H|o@sUfG}D4z-=@ zSJm!-(rTYPAg>9RTEV$f4D_ovqH-?n+*CHFnzPf;*M-7VgCimDe&s5gm} zOBoAbO3i5q(pY_&Gh2PC7izmac3Y!63-vLJpxA!9)edM`$*A$$cw&J%0M=kumdpxV z!VE!Hpf~?QdTCO#2D9^NHdhTGwh&yk&vHq1(BlItih?`(QWJ_M`zd|=XbAz4neaT!V2b*8Jo&v=6XU5xHL857G)*qMs>Yp%J*8fM z4~-elRNUp#YaC00x+d&JF+aPwov2l-Nvf>6@Ve9ip~8?7Kv&exm0LV2YF4JGtym9` zaaWKyACwq`BdBq8F#Bc7X;_RiggA7lSY&r-zlO!f%p0RPRuInzgYTtg0_~@QITXn%Oyh<8A zRrUbM?$Hu>sHvOxLuBZGn}r?Es@_I_tl?eyT`(i8!#$K#9Xw`rV9(NLvHD)BLmkw( z?R_20r>RSQ;;ECka$?3vzFAyzqZ@|j)D{h>2D`BEDX1E?qY#Hzr%;7U$(8O+!@{jz zlw^3r;^aMg2t(HUCt~&ALi_-rEP_Qh4&}9wCR%3hQRNPb#j33Q2 zej%N3fGp=N8iPQ&eLWd87Dv%%D~ZjvJZ!HUu{hHwnZl~0WX_%YB0V5Se=Qm;9!)=u`)B&K`pvH{Ag5&K2)|Xyt6X0i#vDeP5W; zblJB}ueM%KU_Whe(37AY2D}D!a}l|NG6dILmg9dr2RBJu|Il}b zX6tqnbpE1$sA50MEdLO+nj)1wlH)fS>v9<&TVo(!_N_vnBnJ0c;enYge)f8PHh$4gV8A|GST6 z4*A(@voUi6P76^)M>|*IO&r!JtM^zG?(+}-EFZ_?J~BQYJA#K)*`sH z*^0{TNf(F*b^fQksAX+dUc&PhqWI@%JnWd*)~Ze-4Gl^G)anJPO6I5%Zq z+WKkXiLSU$^H(O2~v3SSWslkWGiyz1Q+lQ&h6SGC` z85Ox!v$a&&n-YgEDsm5xW}Zhw%&^dWWdyeqf@i2a4-xRs-WP3 zI(X_&uO(43;KpMGVYYZo35~KC%1G3Jsk1e@WF-8tF)FJ8gZEM%YH$hI4i!JpN6t{IN*P7b1EO;(@yN0Ie898ZiC-(T8fp)#-4{Dgw1*oIv=URi9tM9cT zq0jFYY1vfSBEGv7ztYx(^tlqRMA;M&kX2pyb~0wW@D$&L=gChs-op-$U~Bqi;9}Es zm!pThQLty~)$f%mv}9}Kb~c``aetHZZ1C39i7nhMoLt$okVe2AMh3UBT9_27;!C)iO}FN?HOQ z{|W)gVQ$l7xi3rW%pm0wbQY$<0kLH*<81nECW@>dvUzB()D!A09CzKfgF&2CTHdp6Ea-%@u00Zd2Ws> zjhN{!IEG4d|Irb`(&Iuy(7E>rvA1;Sp(>PR2$sa|v5sU4?Rr&9!+I4;NiMa?&}_4I zxIO?3zG=?La{UI+^{X|z*A-E~?VW);CIc6nX67PJ@R%DY*s`$uQ1Kp2#?(l)^4jI} znfr5JUdZ8Z&Uq-I0a4p8G8<|Xwd{`Gl^MP_9ehGs!i^6v$6!vV}aV^*&XV;+0+@Uxjkr+37L&B{Zh!)5=h9H(}a z{j*hSXpt~c`;7flMnxnM*gyC3Hy({5X7b!~b*{2a|wd2-|wL z+N$d~EC!l;$Zs@+^~pB$U3hS;p+};9(3pdObGLS-VXpO!cp7NP$$^dMW*Tu)gKz8` z8Nt$52`=bS=!;AG;*PPO(oegqI82&o#QaTE+<)na6t_EY?jRMn7ieoF+^Z#L=WcD}sHEDN}RIXQL8iQWwqRJOkUPUZj!Wuwz@m&a-u}~hc z?w)C;tR=GNc(~ij5;6C6=p!DxGl-Gs$Ea?uy!Ltp(fKOQq6Yy|)xq|`9VS3hr+`$czNr*!hKC1R(-w{S+% zc#;Z2b=`y-LB!qz&bnEp;o&bocyLwDkD8*1FL41q&SrY*__5o$6NQD^!dDp?RQ%8OEbmnOi}!E$!*yt9nB!8(?QIjEXF1Y zrH^BHUa>2b*iqT+({yT4IbtcQMq?ss-(5%TWRSh6wkyWqRCtPS)xKrl*Kj~m!-DoC z@RbrwYpt`?aioT3Dy%tKtVwRHIl_mQzPc9(Wu7+1>V3SPd_f-%P?uHx-6Xr>t`4b}M{SbMRGrd_R zUSOTNa~B~`vfxl!U>J!k;(aI))ybC`f@)Q05E1(~{j`UklZDm-aSrsuA@n+VsciddqHJmwdSh$cqs?i!(aja~ zaJ?kT&WxaIew%~0n?BNW_H%(?_vAIVKWc3~=e>!u*qH=cvy(?{@BTyAR#LIHy6vmI zYfAk`nA$T+ctHus-uYsg{Fdw84ia|6_+(3>N9u!n0Mo8%Z4;ejdD9~*PH3BE=TKoc z|K`5yHpj?*3Vld~K5%JGkvr&kQK!(qoUyQF`pat79Mehu-)vu$zT-@|e1P=ZNxz&2 z*V-P&OHjdiR#CWx3gkM8DwY8&^CaW4hKh^`yEM(G?KOv-X#uGks@}u!-Vd>7e#-k+g2AY*RNx{4bqoO@H=i zy^4qacCF}dd%j%Vr0qJyZqu0q9=>Ae^I9D8j*uTg`{hs>i-~1*Up*Y1=ccK-aL4Xg z8oNcOy!F&u_oY0Q>xo~}q_Kq`@;EX~V#%7>7>8!1`PDuJBxfjFBME0lyO!QWIYlOXHQ~>U6pn_>L0Qf5&mrDD!OM~U$m)yO^NFqbwU5o)mn`fU8@Zx# zyAGq0mHCMN;1!kI=Pmi9(~`ACJFMIZl9H93)Jc++9nJJKc|!JAqhb~*zw$O#np}-a zUYFlkX(EzbEj%LF>@Pp=frm38j*Z=*i{vS{CxZKnFeU)DM^a)|c3F zOuVta7KsU*2wyBn`(j~10< zS+AQg8k8^dsYp3;K*_z2&yD*F4k~v(^<)>u@!N6uN!@qtVmBmE1O4bTyTMZhKXqXC ztOL$E@NVN>uUC3)ei31$f$=m9cJ9C1%d8R;vK9OV;&&F2ttj$jgjU6*OJr+YAW;em ze#48gJqO;c!+z1|!!&fL6v+fkK{dwE{4r`zrLyTdY}Dkf`E}IMB*BhQFzEmk>^EKr z_DC`!l2(f&FG=rkQ6cqJ2tj5alJB1sS%?PuaS)5F+XG$^{IQe!ooosJ;lKJIadf{T zamg2Ik3!~ahvNDYYzX#x1U7kH-li6|=6un~rSU1)XTX2N5YGYsOBTE(2JVF+D3EUh z86rIf|E`ry&W`TxEXwYByH@D1xAap=MH< zc<^@<*y=u;VmB;NLLV2apQjZ+9mP3_p)cOuNk^C4;rqHj_*aFpUjGkqX96EpbvFDV z2{;lAaqXz6Lj@g`C9Dnzm_R}X3=kmdsOTgl0}~C&m`q@BsnH-E3TSF=JFTdxOPyA0 zQ)}C4wY+gA$xpx+l3GMg(zTfxGkIR4VS)TKp=R9Y* z=ia$FG-AoNZhmOY3*wCTt?(CH_{lP}f9V8=wwUIupgHMxPgPtn@+NxP*juN`mMv?P zYPmqGl#W)dZpwb59c8vYF=}nPLZ$ag>9P_-toCk+R7<^!TqT*Ll03}9ojb6Xu-q}9 z>sT`9*SwUzVK1OO#Xv#O>FxsLRkk;8A~TCaw7n%E{3DIUIZJtvk^qyXMPC zzORH%lbmnmRUsvzV%xrvDv-OY#`*ro4)e2bFH8HGRoml8we=Q>P=5B98A#>#u)H;W zVV%TNYr{crOQ*R%on~Q1nnLaBbefw~npp=c%reAZE|Tc&Blk+bk(Vl@`~{OKf4PLx zvii$6lm60(zRF+ZI?D8y%9Ou+aExJbafO}5wz0R$pOX`_gi36#3y!I!V1C^$IdO|( zS;XQNEHh-4`SFFAcPHgwye&W+ViZqjW{gz~RIXf7jptX@tix3M|6LN|z^wnqZh3^_ zOdmig@d5W>jdaqdHF{;8Xw;ZpqcvzGewcLC2UOy_C2`VK=a@;Ti*nVQCCQeHWrf~8 z|1M6bsa)e9hjV5u;b%$$sXc$U_j%cVYU6jS9Y$Z-*`mzhVUpXokBTnY*0b+r=5e9= z%}VTYdabAMt3i)}MxViK@hxQ=*ukwCJ-k;aKZzGZh#owA4uMwY=w@m(k z)sIktrDPEcGwm*!cvY`9E-5OdPs^pl9iu3M%Yy4ekMLrT)T^DnXvmAnETV=^QiZg-hi9R%+H{nEAUZWHN>9SNn21=l?(wkCDXu{R3~x z%<>p|hMBLEce#naS`Axm`>v7G_W60q^nsNbX}`uV%_Z%H+AK-i#HpzR&EGKLLNTXQ z^`Vi(%FUcTC57Uo72BpQe7b*Q>%_>#HshZ8qL)*I#x9+}i z=s4*4SJ%$+!``2*o_){w0}~hXJ`dReRX=XkzQ%42HMz8wnwU3mcg`9pmmVwI;#L{x z%saola;EPTb<^Z1xdJsdxbImjCOGDOmE*+c6=pRbFIRdQ_h_T+|ETT2o96Rn=lpv} zr~Uj;Lf%P8C!)`+n_*b(5Pe5RvGjU9xnFN>S9foC`rt_!?6#}DV%PSdO*@yy+0s4s z);kF2?VqS@Q5P%P_yY-fw2(iV$8;8`WbF4y`59S%dQcw6%nbQ0H-@*XP5*5laPvSr zhQ|Q5Ju|JFzfo~Q`vJXmw04(VQ91JhC&>*z{A|$s-uGB|`kb{P&uzx#??7nRkluI& zrOL4XWiBMv*C?}fEfzzc=s86&>w@FNY&>e3+(o@vW-r-Ab;%8ro%7Epop!^Q3EsFU z?QYDka?k&uyt&JG9}nhg|Iof&*-EYk3tij(X1=nTMPi|()3&jHfn9h9^w=$T6F}WI zYtNoZ-~rz@+i#^>0r$>DcknFo#>(~s*9I=yxoDT1ETW|<)cwWN9#p=6%*SO)^*fFQ z=6322%?ezgJvB@8zd+k|0V5{YqEBJ%4lH9gmZQdXZ3!zfX`d3-`a;vFcJuEebZF!D468%lJo5z4sG3Wi(_41NBq-89jnRhGX zHLd)CCs_gN+Iy^u5%+b(Ntb2mp1zVO)O^Zjsxk5=><_E!dGY#QwyuN;Zl~=39z#|m z`4Pa4o)xJf>!vo!&>k$H`?p{Kwwgpa!ql*En#BfZ$Vxc#b7wXjQbIB8Kcbp zhcoYwChzY&fJ;fwOK(mWX+_+!kQKB>?d2KWGY`9s_f=E-xpFgzn*{3OzeBs8;C5$A z>uWCK>67h0mu8hA@z}|tBR_L_o-xJP@a3k9Hk!*W?N+(aPTj?p``R<;y^KlKWH$Gj zR?;`kYo^mqyGkt0a%0Y0M$eZBE@+I9E%JOi_B@?bhCRJ0dyc(b9>0-R8mp~f=-5}x zX?nad)is}Fx=QUhzh&yHHL>tYRaMMQtqz#e{v!7OGOhe=%D?BzWclg8v^Mtkm8tUo zAiG@)InB(tH?54^e`Eg{DVgJO^8Vz$BDuCV@6WxC6t!QoedIRMs}Vk93{U3K4ys1r z(V`Xx5|M8{AGXK5o+zo>_IuU0cuU63A9hPGQp;3+YJam$^&5UKG4h@@sH9$JmP_wY zsm#qPxlcjAP*+CpYrj`R*vKYHZuE=yjchcQw(=ySJsG10OG&x1G?Q}XnW!s$W$$!Z zRi#aonjf_Ln9ot|oy(;xoH?rRe4^cqX!HFKJAW#Er;Lch z-uz(%J7^``X_0$w^0%a=<-f^v2xWorL!5v)Xv^tD9X1Eu{kb^@$z8dzTQ-|nH>&i3 ziNqOCeou774|Q@5`->kQzv3fKm@viK}ys*zQB5c>T6^Ki_!If_fm& zc(C>h)^DQYX$(CwIsSqQZ2!3rsYYp90N0nwykxepy>$D-q9f%=zFBHBCV4+aE=b>@ z^`&G74-4I^Y;5+vw?zUG_GIt7Ri*&kLX4LDX;ylFmOuZMlRNg-HyLlV6+F9Q%#CJp zHANZ&ZSwa9C}aIX+Wr$>!mjFL)Ii-IdtR%+pT%HjnEtOFpp}gGe;WJe#-_Qv@H0yp z^wELKl6^G&B*oa<=Od2yM`)9eriT{EN&EbsRLaapkw%y)b0y{H)XE$e-pP>`cuPBv zZJ5mNeb|!}yE{s%_P|P?JfR9$@W{Nbr^-Yz#~vz zdR)a%9r)XRFH(RkbDrU^AKm<{WY63;*7h^o$={pE57f2m^#M=2o)`GzwnTgHTkVPR zz{@+!_sP`$oYtb2f|FlzOZPd(yFj#<_3NXheB;p+qdC=ro%F%-^0!K z->k+TLxm@>ik=)2wolw>NFA%Bp14Pr3p-~mMR-Y6Rv_lfXgUz9et~+aEC+Yazn65{ zc0_OgtyEt9(Yws~shDIkFP-Yze!NU7Z|Qf)1fLqAl|GDKh1ywM7aTslR57Qa37AahghPSrdOq=m7BI1Q_4YlwtA^7>F!OX z%Xl>EXGXf$Nw@z&(^r0F&eS>v$n=#+=83UhN{;v9Y36wU>BXXK@-g1@^DFzR@r-2p zjQQay(x>MKV|Yx>50fO1JbJpCl~m^ZpbX2+B8JXq_@4Yst@Cc2+S**xSl6^68J5Y9 z%#+tleqmDXy32<(t@_lOWD%@BZj*1Cl=Yl^{$;>&pUJpy$)1?v;*AH8+Uiw|8euko|yLw6?5dvL`Ub3Lcc{&Z!*s+)fD-Yu`(HPW}^ zyaf$soYDTLhYyte_L?htUq1QxuZ`dQ)khtF3{U;W!k4|DocYbt^RJzH!LkqkaG?7a zPyS`w%@6+N7yF#QaD8^g)0fOSxo6}rKRx!-%kEln@=qVQ<-$8`H*fg!8&{2ccwtWN z{ox-U72nCOwdNPAk8S^RsDI{@y)yf6o!s(As z-thdi$c5t%gkxvtcD-Bh$?iQjUG`s3-yWI&S$^;H6CWD=t@3X^^hVPyxxFiEUmWFc zEEv81oO4b%IQ7-Vw~qeR*=N0Q)*9#dQ>T1%?z5L4+%Rd`TR;Ey-Nzr}T>aPDpKh;e z8SRZcwrSoIqp#lh-lHFtPkG_#n=hDk%L%tmYQCc`_tT0WX#aKJh@yp0UbOC%$Tz>6 z=<#pA=;@-}Rio}-*|5j9>XSE5*6w(v@JHT@Cye^uo9EiEz4X>u1)oP>d1AW1^XkG_ z&#Tdso_gTq)eo1fv^Jc7`uFzV_EyCv*Vz%*U4Q$$eJ^A&gb(j6z4Hh6=6`nG+>^vP>C2fTKElXdu~ ztJ63ykO%7doPDankDoOdeAnRApBNk^H*@$bnriT&KN>tR-{AKQSeBhy;8X1R z%cpIE!FDs=z0Npa_rJtb-Z09ac)P*s$p$ZZ!Qf*LnepE?gh> zr}#Y3tzbE{+F;|$249Jc_~RA8iVj+fFw4{y~FpU1D(WpA3#N+u{D8aef(_KJs~SnZf<71|ODtQG7~D z3@#gO&~LyJ){HNkH<>IpxMzpKmO}=c%=Z4c!8p%dWsnu^|LTV|%n?6pYg+1SJuQLe z`o{Hh=XzFqYMUB4Ypo5~8(SM1?2SzU`^K7v`Z`OX-d}5xqqWX&3DlYfn%d+KOuf$A z+_d4^$up14M@A23By_S-e7H@N)zNyi^uBN`hTQ}D} zvBmC~*fMuw-8rKzlEh;lKi@9Dqs~-#`Hbr}Tsy~<=LxW%V|<1wx1rwK7*NG3i582> z@2pkfl6|;*O|{pkY}w;Cv2LrKfP#EQ}Z?6W{-#k;>Mz#p{y!QDNCJK_`S_FYM8EN2xstL>$TU^GSv7R z>RWu?I(vPioyKftn6<0MG3`|4^VVp?3+pV)n@B0`ZLitLR8d2Ii>s+6U~g?Cl&&ZN+1p{= zwW<-udp0yRGa&NGp02*h)3o+#99<<}SJTkqwGd_$>yar-8H)Tyf1OdULOkA$)Vn3K zPaE;mQUa599JXAe3{|dY1JzsG6!b8<)KRA;E2d5~mnBMf`7bTsRBl)wtoJLSQw#3=$W5Q}t!dhxP_Os5i1G<^VzCcDi<1>7I z77%I(F}jfwH+ezIHRz1pbh~)H*{IWYm8aiDYGB z2o@U;Up{^s@HU#g7{M$mG6Wm)W{SLI!r{d=tW{PJMY5N-`Px=*t5=PohFOM7C#w;a zEV~@j5maf-wU+Ts*O=mr_McOqbd^lkQ%Q{aOy8`QJ4U}=vV65?PHJ&bRyHJ0Qnpa# zKi|k67?iW3e%kE8*;V>ENynuj%un`u(PVY?GMacc)-=~k$4%NQd-|l@mYQ|OJZt*@ z%*=>n7gHst*4MMW&&rUu7&ylwC(>{1^XA(xUgRoSXk`yhLg}?10IVCPF@7q zZ@9tUQhy!RXJja{G|NJlw2sBoIz=tcHh2RyB1dwmYY8H*t8LgI z8W`nFUa)Rm<1mV@mw|&O-N5yb*Hh1=r@X<_$TT&jk>!Sk*|CLL5b4t_^+wp_1xAaj z;V~W7P|wm)@~E+`C?j=7%mNW(pJz{JQ_eHoc#|<{(H5^ie?WhhdjtEBwho3{zSHdFmyPOwheDC|?0lkN#i=%@> z;{7I7UcMJ`SU7s$L_S9cho7T}!@?oyl1J|wq~VbBPLs*FtTfY950kc-a0iElqxW?~ zZa3^Szo%plKBxTZj4&799UN9OtS>|79=>;FoTp?C3JY`o=-aeAN0hdb!^`)@=J{E0 zR7PAf&3k`4pg+&?5Ql_?;0BJB9J4r1;*juv_8!pRzJU^yRH8YI;$TWd_GE7j?#ZWA@=0GiK!M6M(;_-dGN*?6c)m@|b5{E=iIr ziDB}~@<}$6SScniRcmSkjIc6Iq{HgG4fPx9F^Z?zTk9pd?(leJu4eDGo)#vYX|jMw z=S`YY#T_BrbjdbMd)2LNUAK;{HIo;l&(}3GsbvIk<$^W2fN803yv8E4-nxdG^=!1AV?WEzscaUh zYokrg^#NvGbA2_vrn$Lhvj@v<@C25y?n^EEjP@QJKmFgt&yaYtb!BHS*}A4tGGNLd zyndafbWN3#kzvqRBmZn8KQlbl4N#t}Wd9=>Du3qs*UVK>KYdo_;&&LoY^bSk^knY4 zw6ZFbgCY%wS@%f#W$dR6zjY%0 zD!G_d3oTjCa(6}T1}QH#cU)xcdXD9~8b5vP+E%$>6VDu?vAI=qn7;pZ|0QF8LUs4` z-hii}iJbuaS1vv?&slaLeP18F9jC36p7DZursnIm<*n6#gYpElEsHg~3^_fDJ9T(c>e4duFnW58%^{U~R0k8ok@!u-TY~lG&~`mCw*Y zMbTDjPHkzCOMT^-!|1`xX4Y@K$J|Dg+0HWFSJRT3_Uw*kgEkQ>z>jjt6j3t$QHM%q;$!O;UY`RS8)xmJ~G`;$ts|% zQnC*pudeowm}GSsd+FweJ|5OWg`|5+XBL;AI~OC$j-1rg+uYpLEYh+j4AgJ%iZPFz zDz!1Fl9~0B<%5)}8bYa?3XwTTTtY%KSH5POsVix_L+y;IafwUqIwh-tHJ5Z3v}(r3 zEaU52GV`mpSAua1HJBL{PT!y$Z<+w-RIAYR<}pjJq*|8xMru?$cdB`RbP5quil)i# zG7csy^zrQcwy+PG*2dEF_(45+RA+ooh7CtMX~V;$&wl6Du&>#F+20nk4!6HOGt;3D z8w8B}b9~;0h9-|J+L9@a>1mkpsHJ{=W9m+eaW8F}#lNm@O0%H>i`B{%6%|XCTk2Xj zY}jmUw2JoyT)MkilpM8>))J_jJGZfwre=Agme?)xTG_6fHro?ez-qWADDACQ z+AW?dimsHsx8d^4n4X!(7&qkpZEJIV+BuT95o8mS{i5c^CegpFq`ZXsFs!PfI%xq* zvhQ-iveA^UWBzZn|KRI`qU3a)T%VcS zsnS4)xsMS)eOj{OL(&c3-o_n@S2@*gt0lSK9xh%ct|>n5E~!O( zb{SID8g_!E8H<8N(`3BKIG-`-d?uG^Jd4yKOO?mgwsK zds6vfqKE1{OhU6pncB2A`Wsr;ucr?tRb-M#2c{m3F`C8n|MSJK<;Fn99V{ckFzp<` zcZ?g#rW^+i=UwLwaOqzs~F;HH@aWhEk5fX#;xckC7F*0d z$MPSgqeH50jCf{-mTSablc%XWSKKEt7c=ImaYI+8x{T|7ij;7<^dCl>bI!3$6uS;z zzm$`!8vfgnhU);MSD4E&^l6r-0L+eL%rCRVa4Eq@w14Whu3=y!|4hlBdB1l!{nc{^ zX49yiH%vXbJ!Di*-5Cm~M-nI?^N!Cn%ek@}=ux+>c(y_8?}4fF1;#1$;&vh18*+$xHTTlNKy%^<1F&XhK*Lb;0DN*<&3Dw+|@lYF2sWsHpdg)HJ*LZ4LgO>5e zcBm)4VLgo9H%?1-@ucmu+ua-oGWJ)Gn9ftfs9V|7d3N zTHjcpsQriOX{B&D*^zMapd`atgEuWVwa!t_!hhy^=&-!WxNJ22Gt2&ml%EVvZGU9Q zPsfSe>~`2VeXv~z>tL3jwf?EhM*U|@W3ZLyGm^`h4PLgASxY31EXGLIKQr&(GBeMQ zRR8HmsDEZ$ro6%5hnGKd;|$MG3!CW&#SLfQAX|5a$I1;{v;St^&6WOq-q5?d7IimR z(sT7OS;d=~&$CZsC@}6Vn?VaQ@{2rHpUKk5{clS{KAU-&Ik<#R-MP-HppiwHG9%v* zJu{0o#;3I0jImHQZqpIQs4}RE3{2^QQo2%Cp1eqBMOVYWW{cfr78tf&4x6)Q2ah;u z^MJ8xL-mYe(ton|C)s9}H8IaS7*7VIE|IdQN3=?7%=Ya0@Vsxb1cQ31UbT9aOTVaM zafyE6f-=j9oZP&TqmHs3U92xzxU_ubgo$UJ?KtP$^CnH6GPP*h^cgc}%|72bXYK{_ z<}cHi^KQ}6`D2bL7+ZMkamSx<;z?hzoqWov<4!yM4Ey-6p1DG=)b(_hnzgk&b-dnJ zfAuvD8ycJZ*EY8VS~qSAZoaN$;iA&A#pSLgOE0QewtPk9%2lhYF23Ya_hpw)nLPKr z`B#mfdhUg1&0F9&=ZY(@zp;4YgfoY=dvX{_4GBiYeOzvPjQVD`lX=-^?Bc7&kX<@C zT~}w$HS!G3u;t49*QE00EnUG?_Q;Ad{^o$;Ea$68!&{Q$^DHAQxo{nJ-?WZr9+g-% zEXzHY!d$3dQZ))Z?2@e`&JfCN(mmH7N1&jXYCS#NKm?81WqK?q7 zT9{0e8@PrHWtcf;c!q7VxAXcMo&im6#VY|Sztaep?Ai0x%grWrt(wey*s@ioby>5L zX7YlXdQ}tbagN%`F;~^+B10{w<*_04RG`|~!;Z;?@t_;?H33o3m=9)TC}31FyPmT3 zmw7kPqVBh;C#y5BVkMc{Ubjq}l6kR~DsOsPP=-yF!3O=O^qW2>BfUKN$A)ai#nJHN zc5<;U%j^*{v3HsmtVHQ^=pXTYlsu>hbI&Cy_tmCx6b*_@wtC4%<^n z2dnEvbDb&QMO_~oFYN59DE`E6xje+SdeN#S3(G8vN|rAwtFZ7_Q_Ix@XvuO?RFz1b znO}^j$_Izax#=GnhCGsgn3tXDE1A@#wz)G+=RWLeNH(W&mBRy*mq>CItR5Uzj-5?A zQ@`mmvKBmie>0P(u9#A48ugt%JzD}*@$CIVrpe^^qDH=X=Ps~ZKe2U^`gfzHcw*}m z^>1RWWnS|8+=;CV)US@%LAP9QnPj)jvrI95hNNU2{#5Z-rHro*Gk&P@Q&vxoz3KLw zeRzV5K6ixrB(0Mv&h&>_N?tO7h#PTg?gcaFSS%BdvRK?*3B8i<&VMHKo_34ndf3N% zA3I>MX@n&LL;RjC!cUxoq>J%lnivf8j)`6v*Au#ZuEi4MXW2gJ7{QAnppD;bcfr^( z{kr7>$V(O~VThmDcS0wxKGC3!mnS&qL4Hdef>B;9(F1+_UR{H6-g0E+_l_F0!vu6f zD=$(DK^yFZJ{X5lXyd2zz7^;L!>|KtFbX4;{dytqTZ-SABh^n=AP0o~C0e82984%h*m zFalk$8@gc}#$h3YvO9);FbI7x4BMdZ12^f2s^e)mt7qtE!yKEKC}zmC4p{U+@PBQOqQuutOuNWCtizJEp^ z?sr=EB6m6I{?0jc?#F(Wl>aI9gt3324-apI58@|PwBLyXddJ1YpE{sxFnaoc-buf5 z@r&j@=stTuFS?X;lLquQ7@9Jm$Dn%#`J{d`2lO83gB|GMn8k0$pazThm16XK^1--s zK##)29DYxRo{6~wx(miHAiwB6pM2=6!6JSq9KDcyFjh`H3|H_QH1yY2q8D_m8PJPY za(?B29)Z!?0lkp>u;ID^y;A5!AE>Px&=b(%AJDt0xAR)cr{1n+(m`inKo5%@cynQ~ z)c@uI-ATRUw_^`pV32^8%ShKTpgUj``e6KIht@U3Lpu!LO+Fa9m-dHI7=@1eNp~gZ4`MGEdYF1c4fenU)L`sU>~COs!5DN`6aMo7Jp`k$6UJZ^YA_BHun$@v z$6hs*_Y3ra!CxVFE%l5d7lxm}e$drTxwYhf8u>8(4DzA-S>!?=?13Su!PxJxXB~RK zJfQob1Gb@G0(L>`@976ng9!;hx35{6!(T;ypm0u!(sT3@AJ z&<6XU6Bc^W8#PVHkoD*a>5>8^&QAYOoI`pw&nIKT;2<#mNt? ze&<*|9knSD&qwrno0mFYsALxD$y&JHnM!lh9ALYU*?18Qih~GdySPXsp z>31*)J75ULp!-AovXSzk8`?gi-Jtbj{D62Dv~V7RLE$IZ0VbfeiFAGBhc@VhZdeK9 zumgraMGn+pH?)3E{r#ke4j6^i(ESDVgFe^;L$D9VVd1sZ@1NKK24N+1{tJ7{IqZZQ z?12fWL2ClNn<)p{paT{`Cv-sJ?{MHP|NcUt%|jhuzS12)}?a=-`Kj zaUK1kX5n`W&^LnLT)-gIUtTs?L^YuK>W$X!_cYd3mvEN+YaIB z)c;20!WiWyU_$gcgWs%(99S%JU=itTcIpqqFa&+$DGx@W{K;C&mht|p12il+?I;Zjb6Y{%Y7`kB>^uZVm!Cn}F2^gM^ z9LllHKn@JTN*I}m92lL2zA!YK`cS?GE1~;*NO@rxhpsu){}#%DMbI@5eV|s1-q5)a ze~@r!ZKu4&=m&$aoBSc@<~&r6U0@jYLAMKeTd3y}pmH$gB_MS0M6F?N8F8tm|O@_7&Fz7X~GQJ$P%jegMCKzhP`P=gw@ zZ{vIe{tSaK2%WruI0jv?7rJ2rYS8`-%7sqo@MAYJNe6vjr$2oQd+a1X4Bv*o!^n3?52Mg}C-s94==d&r!65X(7z{yMn0A0Z7=ux$ zLF@O(|843E9WVl2Fadqg^?mZgFpNMA#-Q^q^1~3ceuwg*13Gq*9|oZh#$X8A?j}F< z!59p|UKoK17=?x3B|UV&I4l<4i=Chb<1hjHptX~7!;}Xd&HVV z48~vr_CePV@YnAV4~wA&eb9Cv`JfMWNj&UWxh3~f+@K3I4^;qPK!7=t0G!A=YIvzz{0=q#U^ur(wL1#bnDRjXeIUhiupArv?USP5Nu2lWt)z;5Um$uq4#C*9Ep^)?thp7gX^2v)){^uY*hgHafUG1vv;Fa{H_ z7ursseCULQw2vD)pzFkgdNJ(~gKp?J3B9F#zJeauJ7gn2)S%@N@|}E8w?oG%lnEJ{W_JUl8v=Z|FOh`a|b=q=PQlE8)=cOZ0#?=$M3j;pBsQ2TZ_jiJyX8=$wk& zUr|q344p;T14dvcjKV0iP2*X1=$lEpDB-h62V*b<qNQRsv*SPA3M z2Q}CR-4)1zJ{W^R*b7520mHDcoAz2py`U3TLpN-b@Ji|dL#t@trzj70!#M1Pj@8uv zY0_1pmz+Zzj6fHR!D^U*ZP0l!{!e=ArKEp`@?jB-!b+&YHW+bJ4)k3{xug%mC=9_K z7={{*!j5Mt2S%Unijiog3Pq4;H~7bioj; zhG7_l5!g$<1hhO)eLUoYZs>$QSP4VW596={I;v?8=!7vCg$bxZ+aA)dB|X$&2TZ^S zwAGRxI$*Da!@?Nl*5TLC1&g5@x}gvHVGxF37)D?OcEc!)!x-#?4lnXvpnO;iZR<%7 zov<6aVH}2GAB;fji^zd?7=uozK{rf5KeYNNAKG9ibipWe!yf2^8Vo_}?~o7eFan*> zRgXW*IgG&QHP{PU8?e_)l-Ec+v^L>4&cy(6Jf0 z5)bXar`+oahY{EXFm@~TfN^N)AspIZ0v18rR{Q}vpbt7> z8+5@iw1&tJBirz|SJ3wx#KQ;-!_ao>A>puB!gnI~RnBiiPZ)t6FnBxqy@p*oXb0%{ zCiaI;*a=-Q3f-^=24NozLF?qe@gp7 z2lPQFY=dst34JgMgRloipa!GR@)zs|ZBTs4?873h8*aGacFyi{C`6)=zxwF8F!!)hM)^}!tfuk4~)RVw`mvX zfbLh(7dl_V{=(NuCwzl(@E!Dc6aRtHKcX+x;`rIS*bTa%^-t6rI{!?4Vf4T8A1J@U zD*8L+zl}aH20NkqUF5(pEPRjj?_qzay-$9afDstfsGr2|N6+_3|1o;P=qJdB8caZ2 zA96Ixfesji#V`WhFb@6D`YHB+PS^>3Fbc!42gaZV6VS2`JN|?Ag>G0R=buqe==&Ud zNcb1j111ub_W|!>0b$0M8B}rAP4*T)?x?j=cq$IwAB-j{j7~&>fP8w zgVorFbIRN1BPG(Mqv+(K@B># zQr-Y^po)W}fL);jhQ5KlVH~ze_;%7m2ke7RXgx@KLpzMY zV(7k&`UpGF2Zp|h{$HZsoydbR7?ktxU@z#rn{p2!2S$*qK?mmvSPXslkPil75Qbm} z48sVF!WfLfUKoc7sKG)V`S;RZ&;_gI{C?UQ`hJN1{QU-J1p7eikB|#}k5EsTfVL4M zERLU0E_A{U=zR`Jv-2;$irG{GGpT=lTdg5PnQNf7R9b3F*Z?&;{MF z8v0-ihG3Zd(NBpdU-&chC0_)Fp$5BP0>+^AbLs(YFae#=HX8Y`2)dyQ`d~E-!61yo zFtq&>{h%A#@+l7%!#MN_|AikwTY~an3|hyKt{=O@2=v4F0qg@E2k{H&{1X2>hIBgm z!w3w+DC~k-&LQ1VKs{hFwB{bt-OvX8&;dix4LgOS4(WZ+X+5M@jztb^gE1I}8jQjO z?17P^59yXd^n!Nbm_vFH#*R6pcR@$NAzg#k!b7_ASjvT!FnlcXU>tTs>v4zlUWtd* z$B`dKpzZiWdK@}WIHcS7`_I~m#6!1@d@yk`<)1+QQx53~@;hLmq=ydZgDx0^HqwP) z5wx9(92kaS7==-2Jso)`k{{Zk;|$Wl80>%=jKGAQbSDvh7WIL_vk&P$7;zv6#$gXk zKuzMOlI|;%4}CBU+h7ESVH9@37>vO52Nxj+#$XJ_VbN)DF?zyKIrSnu?4n+r$6yEo5qPW(#bLkH}EL70HiRg^y-d#$ECiLaua zpd0#O7}|*UT|#|e7`neozrPf@&<8DNQV#S%=Vg=wZC4OJ0eR2{L$FKo!(J&5CZGl# z$Z@VA9!8*z{MM^zFY-BIH*~{Z81_)_iR6QwFkX#)CBBAw!w_tPG3X>dT#H@K;v7~( z4Yt9Mm-1j77N1T0I_yGv*Lw6OJP7SD3geQ#9(#~33_~yqJ0%~CLRSNNIIstF!4Ry5 zVHkuqKlX!KGk$Om^}3FJ0o^yE=egvAl`sf>Fa+CR1a`tGjKUb~fpO@ZM82=lA19OU zX6!NryM2TFFtQzeke}E=IgzO2bsGNkIPuU2Looge+DF2Fg&$3)9bhqZLpSt6Kh$8Sghxpa!!Q98&^3c{ ze@%NqHw?ol)L;VIW@3-updYkB7j(lm7>1oN0b>&W1mg>gLHjK9gHGsp68SI)Lof!r zpzXKl10&Er8#&MgUAxg6x?u?VU?&X1C=9_K7={{*K+E~)4Q((6i(nkOpu3xTLG5YM zIg$4a{sx24CwvyUF#H^LoH}ji2wktC7YxG~ z)SzVn;jiNlP=h`>e*^h20{bK!Ixa;2H)$6bgkczkQJ8>niT@*hBJt2xjNM@o)SwGG z;>d?i*ajo83r1lN)L;U}{)8WtpvPa(0|xgZAI70=A^HCsd%!3R!5Hj>aTtXf?12fW zLEB%k$0FoG2Mobt7=dmWgMJu?9TNT)c7z)2g$bB|)?VygN`B~qVOR|#FbI8rqkI^I zJunLUpzUq)l@Sh$pyM6v0HZJjV}GZ968;`~E+!qcL#IYOjKT?dD2@;;*dgdbBM zX#E8JU=Z3|=m(2nv=2K&=RdH6oPUO$mQXL)4a1*f$EE211>rFEFU}>rAHU$-dI0^Q z4O%avd}xO*=!9-q2}95a!>|oTU>L?=6vkl>)Sw0(2a#8Sd>#8kHw?l!3_}fe!32y! zD}Noh7doJ28TElS=z>Mi4P8S1CSwrBb99~$M^2uuJC?(dy6%TgtFFgk_-I`(UV%Me zHH^U^)L;ipzzDRC*7a`agc|fgOC@%OHW-3MFaj%K6#8Hcwn5ie%7fNpDQ_j^!XR`W zr|VtNeLV73p)V|g8gxPD3A!GI;S-5pO?fBjx)X+AB@9C!jKDS+gPkxAqfmoAFaay8 zDF0OI1Kp?Tdf~;SJA?c%A(V0_P(RW~&VqzTq2&_fLYwexU3Wv9gYuvoMqnJqCHx%H zUrIQ1z~H&ag|YL{M>v^s-L&6K>Ia>$8oFT{^uaLHU<@W;uY}Jc-(~1OhxE_~!!QWD zpqszeS#&w!&;_mhN!>7X!YFjX9vE4!>mjKZ?1V8Gg>l#eHE6$r{QQMrC-lKe7=nK2 z;`hFtFj%GQ2?>XVYiI}PfDu>>qtFdw&<`CK<4@2DBhUrAp&Q0w5GG&<7G8-w=ztMe z3~iSn2RdK~I$-|#Ks$^>C)8jiw64KFq3bIA9XhLt zujRZRy{MNP_QD|SAUq5sFaow>@P!o2B3D^mJe*6jsp$4PS>ZP1(DF;S3 z(;iTRozQU|>0u1o*HQlU=m~w$2SYFf!>|*&Za@!cy%9aubKZu%VdQ4?gw}T2N5XHV zJRjw4#eTxC<2TT`4Snj7`wj9z>kjG(gSR0UI&UZbYRZFl80sJ$jDL&vgN|=gFBtp| z?S2jEU@?q9H?(~heW3$(!f2TK!5Gw_2CWU)3)-Rk``8cqcA+1P!MN~l{A&a0p#$3P z!7pI&Ui?wQVHb3Ck{-H$fZRspKsyY;~f5$Y-DzrtUj4JITU2CpSQjKD;cc&PoF{LR?+3F4s(cEI?P z$d`1`0jx)rDO9qS=%fZo^rvtGbVgh zqANH`IUKta`mrPVvaq1=_MD3fY`5i>71(#?Ei7>C7+F$Kv~^TTfwTRnr3Kw1av#qd zUEn0Fq`O^aVM5A!!&dtPqoh|vYM5+$fCzclrIi3sH*I3S}q-y;D^&oa@|C3=>n^jsu*mKPM~ z1hOe9cA1HNtj{O(`$Y~#Zp|qzu(juw7ua*|R63LtSjBb>>6Q-CeUitCtDvwwC-=R) z0;}XwcDsT2>fa^whmImZ=~F5CV3Q$sD=+BC$-VKYY#J$XO5RJz>wYz%e>o~CPqjlf zc}ojAb8_Dpb!2(tu(SV93H^zbJnA__zf!|qeIs(ee*}4A{|4mszD0daKe;VuMS*Rn z*ndYJzOYsNq3*U5Z)rj2h}@s&Vt_?M`mZv8lv9PgAitSb<#R5d znH&v-`w5rfMErfH*kwmNlFr{kC0~eqE6jYi z<+xJzEKS*SWkF@lP-9B{-X(vS{11;c$~DKQZ2e+cL1JXCR*x+OABP~T0dbXCM{A)SMCyCog}xw*$FnPB!G;p0hklKT+*kUeI-1ZvUig%_>S6 zel-dI@Gt1s#~4BCf3Zg?;XcCWN{F(@GNYcw-c&usFB(YKMmjM|@+09}2oDYlmv-M} zmRBx`m0eUnQsV_R-ip5{yHr*Wv5NAWy=Hm;llh-g4wC%@T$l5sktKIwKYm-;L%=*!97$ZS@$DA}q;Ur_!hdOeOD+sb~u zUOE_Yw~N1+dNIE25W8$0wZxcjyGG~c6%OyuA}^0A$yw8{|0s*RLGyQcLHBXFZDX?z zfJ(nf$g4tL_}YGb4c|q-9XaJPPviIPc^gwR^HMclivMgOeT?+yO8RtvT2Wx9zmyjg zGM%dV?Ge)Tkj_K9X4HGB%$KU(>2*eVL1%vMQ8G{u9jBC@GL9ZZUhk%UeX*3gqM-0n z#?Yntm1>3-zZ`e8#ZnkF$DOKz!t01p{h#pA&HegD$%nq})X#q1Xr-tUPOzj~L%Lql zeJwLx&ceeIiXQSAab0DFT7eyP*NF$lTTV@`!)6jEvf}8u8s@z=ZG>S{e9^QiZc{T_ z4VoxpE~KO#l>O2FeEco%Ve%>4GIq*Zr6}hLqbacNqI_lF9pow8+^;Xgzw&M}%E|Pt zv@cv__*O?A38uxZ(OpT%pt~_tc-dx3sTRrd?o*L{4scB zXO{2@gog)(i_Y^1?;!j*k)!;eLe))9Mcx`S9ydsRBs@U4_|M?*9fY?H3ZF^(2M7-m z-X>C1e@eIg#i{h?mQ0eKr=Jn21 zq+gWk?S{X-MEVZWXVy>b^e*9{Ea3+UZ_5&XLIM6ZC|t&%Nrd|epDg;Q_T~CQwJ+oJ zMaDQS{#s?`FHfaQ`oS`^HWIq>S^FSpl*ySMkI&SUPWm%Z~h(DY_K!|W@ z1H&(`PP&~j{u3W2{-#uX4i}u(i}IK9|Kj{hCGkAsWc}6sLBIYe-}CO7WY#Br&3bu8 zb#iW2gOn_J)ko~Hi*ky12g{WbqUxo_G)7XfW3nzcCPz1wPwMqL`GV+YcC}RahlKkH z&-4$`Q`TQT!k5cDao{|q=gu73G;^$AO_6gGW5uG3)j5Wg@=94Z1h?{z8dZ|=hs;;iAa3GypCET>teO;SL?s>g36p* zhOUd5gXB}iQ77xAP``dR6Gz@T$@-o3zxwqw&?HpOQV^nGTQ8|Af&Bjq#e$IVDtW-hLHRS8jGTTpG z@2A(h>U#f5!^AWPO^pAS=jWL1kP2c>5_yjxuXx}8J9!6@*M+>NhO=MhdeWc!;D~H% z9rTiq*y$xE2>6RX3rxRmDbDbvj+HySp`C-3)x~Yfh=V?1BKgV(8 z(l})l?9@3Zh`uBJ?sep8$m0>p%znorb*t>Nh_4stga>)H*dJVW2?eM#*BEoI{- zhjmw$ON+AnDycv6Y~StIw=(|cO*G_Xj(uhu6tOCDFl^uthUYKI&v|c*N`TWClWzdMM$F68~c@PCn4aT5OD*RLNV6G2)( z{CLQIW@$mkh}>J*w90bzpk{zch}ea^KHfPN%i|i^Outwn*V<^4-W$wezR2Ph^evJ1 zp~&m(*Jq2obN;P7+3;DDRYSZ&|+_w7tr7Sllu0{_3$wDmHsxyhJK?5^k1g> z8|$d-`yK4m<@|7{v@%%*rk(l7IFPnI|Ay@v9Fww&BorMzK$PwG+1F-F!?;|BCRnKxD&a?N>zJ)X?H(45`I zIB86Vc%8XwG~`qv$8nk|=e+;9oL$K2L(YEDC-+Elm{5slB4a6;IY*b|OFw-VIpH(# zL;Nx?KWVRQzTlF%?4p9|+-I#>&9zv~FEd%UL>}V$1OLujn3Tuf=xw>IjWfqu)!xer zx~;iC8=bYiQ|npLbBC=AM<^Pm;Is)VMd3^-cJ>etiP>Gx8ov%1zrdEw^0kSzh4J z(NS~gPM|rC%K9sK-hh5Q*MoWOL*=FSz07++{@l03oY~x2mMm4LG5>cabi}1TV&4xb zr;vA$ena}r`$sBA+4tgt%G{5#cgCe^e`g+rRldY^p2*v6$jh?MD9-&2QVv_J8Gd;K z`R%+r^l{05#Cn_U?a#eA`>;`xFa7r=N`1!hZ4%*<-Y%hPKPt5yrLKc3%=oh;-uy`Ub%eXf zm$`o=@@^np^qnDTmArMy%YP+r7xC4D@`=313D;&19JVhvf$*0I?;|{YA7-iSgIrW# zuSsqfsChBKI>~zefZD&#```?7eXj1UsC$&^+PX~IX;bDftFBmNUYu!1UGkq|&TFR6 zv6Ri&SCng$%)Nq)b?4`l?{E(2W2AkrGs-vDRq3@ooy&Y?fc~5NXXyt+JMiLsvB$IM zqg`;geIx>j)39ZjyJ$?hrq999F(stEzjR>2Znj*>B0x+ZX2N?9Cd%tqtk# zYsT~6f&sNJE$g$)zG?0`6kjvQOk6^j3<^?LW>TL=kXMPkF?>&cRQ(BeT{xiQ&Z&>8 zzoaKT)9)nwb2GgomD<>681q&9ZBTmgQ+d+EO*q53T8Fpi9KO$8YQ|@lGl`^Y2$%9} zB_H)SpVz=o+Vd(?dtb(Wr|7kV^c{oB7da0Q9{RtK^E&BcgXGLaP6O+)Zo(rYX!pxc zQ+~gLE#-{+C~6kZyh1OP^2sOTN1x=IW#qd}_Qx{s>EkbIT+3a8tI8$C;p+gYU&ERB zEB2bn4GAmZ z&q)2wI+9-Ide@&jEBp9yQNH+B-bDPXazKC8)Mu+aS7h8fTA12sM4|X*Z_Eu5+HsMAiuWi@O~_M>>#|C@H)N^?l0KJX6zcJ`^%H0x33=1 zSze_+BL8*5ZG?|Wg&Ox0J|w)5@c&f)I2^Syi~N~{yRyiyAiQ(Kfc~76d)W25Y?p}o zsmpaWzuiFk;>MwR-buKV@c2+UY>f_;^DODLEOPb|-b?t)L*=mPI8@Gt z+4D7@1zeoE4mH>1l{tUPI)AdL6M5rU&vaA2*G1l@q`X1b59$4vrL31nNk7lFE*HCe zNPQ|V9?(A+S|9G-A6}m|q>=Sk;U&DwSH|TNjPf(rvuYew<35kijL7{$2L3@8fQ$2U zempdkv7`$52a(_F9?*Y~hx`}5V%jTx9iztAB^m3Wj@;a_vS&q^gZ8Y9!3CLOw<oUekB{YQe4KDD z-EM0AsK)=L1--esak+3g!n`E@G3Gq{_y5p#KJb-aWByNWZrZd-r)h-%~o`Q~$;^PGRrdCqg5^XK~l?yh!vJ#4R}e&(0cx5rwc zpWGA8xB7Dz_^Cebe&#)C-FkrV7W8CXKa7DlCE!!w4dCJWQ985W8Sr9yW5I>T(^&zp zO-QGTN~n(E?W9u=UIEV5bkqLD`au6cp(WwWexvXE;L{Y-(`x5Y@P-6@0z8v|&w$s) z@Ot>ngI9yEw?3_UTXFF>@vi-m*x>#=vKeR`JFNpg@8UiE%^D+LW7_-W*4|T2i+VCI zHY!J!gb&8@CA=5>06606Kf;H=Cllz$!S^T7PlN9Rztrbq)13o91WtGNAMsxRSAN1c zMK|`B@-xAEx}5Tb$LdU~V82ZLKTzMX@j?7s!K)MSF7S#Nu6pkSF99zmuVXGeF0WJI zr^s&{p9Noz;mss*4E!YcFz;4h-TQtS)l1c*kx%kx?Yf$&MfRVUul%F6(D(Gl>Qcu${qajgBxo*N2xdi&@Dv(3nPa}(`*!)d!O z#W7ZTS@0h4a6749d%<^ukBByy2Qon#NvB@n4Ic`$@;naxA?UYC-?&Hor@@zRboNLH zp99}N5VeEVJ`3Rc!10ipblrYq(sh0c?DW+4X^rqA+{Vh?QNSi7evOZzy##rhNc7G#_nYV^^Ix3&CznX47ZT2~*-*RDrUd4;fs(o%%;0 z55$|{J$*g#!uqOhh%(ykedT%E=dIkF1@pI!};43pWU@E?m!SrjDyO;QThfe2T$$O}MXy@>BCe>!j-EMoZ;!P0m z#GeuG81Y(e`QN8kMWXxum+@-IXFKsu60cn4bC2+D@Dt$Sd5iSc0Qm0V(|MZ7*+ERLdHA-$_X$4V7f1N^!MEvFzV#u#S&uL4 zR=4YH2D%7=mFTga7A#NQ47pSk#9 zyHh>th2c#jPA+Spoh9Br(%qwY?h$?r{3LjI+!wwCegb@hXz4QgBRu_&_+!AE1-M7$ zlKoZkN;ghqs-pcabMNCsH+HGtfar9x>&NMzS z+s{5?)hW6c8oEnIWvU|#8L?103-DVWiP~K%?9HU6L`D9os4y@HU&lj~$Ae z&HiZFmyM5Syd6EAf18VE_I;<=(H`?_bU}COHK!x{3YDKe@Pov^Q1RU(d=&gR^!M{X z{z~p9!1qC)BzFp*b>W*7&*gWplYpDTW09iCx>oExW%(j-{*G68+{ z?a_IU@EPz5@UWdBd>*_c0bc|^MY?hN9QbkqUh_}LM*`jmegga=lJOp;+wSPYxaz+f zJVSnx>R<7O2=633t{=z2JJyLeL-=4Up6YiVydV5l-lO&VT)%!j#U^>qL4O$fT|T|B z8|Y=)C{6>>4V2G%6zWOn;`+T6{6qrY1%4d7N_^d8+8_KV`16EC+TX1PgzQYoP#yM3 zHT~kLjJxTBjK0WV*oHGU*G_WFPN$gBW%|zo={4;=oqvYXv-`*Wg$tD{M|eNs@%pcM zBK|(`q<*J(%`Q9~PxYAv?;+ktc(>)-!am72l--fOa;$vhoYXk$m5M(A-6`n8^4JVM z2EGjbIzRpn%|9Y`9NXC(qiKc88b&)_IZr2j*|4|?2h{-gSv0pANAu7Bb4;KSe=KD-C0WRYKk;O`b_WXRa< zW*&e~a-^KK6&%!&e0v)s#JB!Q$a9RZ%F_yd6x@`@=tpzT$;@l6u{H0TD5m_-XU0zF zzo~p&p>xA#|Gf6?U9Wy)o+Zpm+EO8yaN19yxVcd*nVbSlwv*|7R+`? zWPc4p|6jbPzg1@Hp!9r&G=jqn*tf z)hi->T=d7_(*mEj@NV^xr`MxrAQarpPr42L4*#DDi0EZ)tal1zvraeETH6R|QN6bk zZ<2Z;N3NYXU+Qdhw*fV?*=wz>mH1GkRqUx1&o3xGY3z^&@~d^DbR*nMUkdE~T^kPT z=tnRy#H)_mIryLabP+cTpUj(2=f5L9|5NJ5i=eL?9i`&}3^x%OW!r8HiS&p1jr0fj zhTBu=$^M!I|0v~8-(}Nty42_ZlESs9GFwf$wNlet|KBY-k`nxD9ZPDzanjp!x1A@K zgxjMjwaaf0mqW?T9Q3E459d#O7QmOmzr=ft&(o6lRAH#>n~L&L`%IyLcE8oN&lgKv z`_Qtkt+Qv*K1TlGe*!*RU4BMVI8`h34}F-QD(sPJnw$u49i_d1ur(oSW*k7`PyA{MOVR^vrx2xYw`QOPpBJC{MOwQBx z4V~ALB?c54-%d`@{vDMJrty5TK~?QD1mC0YVm|8lhUa~fQD1DJRX=USUTK>=onPfW z{hoYSH+u5MUeQ3JH1ttKCQWCHZ}}25!^$(O2$lYw9|`9@rYw>;Hp$=`Q~t z25a%3hfnqU3+H=_;1%F+SGtk16rb;@ed@NLkBRqUKc3N}nv!p}X=AWDf3VWeLVxh1 zh4Z^!aDA&dKJOa>p9BxhxGpF;HMCFrRUHD4mb|WoB+^jvSe`iJiaqKnG zGfR{|MQ4HZ&;%uYgjav!bp9Ix0v&JWlT<2`lt6abMm`+=-?=>upBeacypQ}kc?tJN z_HMa*0kp^PhlNAEJEx-j=HSywex9lP*!h9oe8Rs9uiJ(`B>b8nyvx&9(lf1uXa41M z{_$n}LwOSRcXg)jh>a{r@#|xdL`eOvO7_qPPv_52f9dbi%VRvvnK?<{7h((;3zXk^ z@^kb<#pf+cE<7%8=??lk@xr(%KX?h{N1Zyky3s4X(X+GUcanI2ohHAJw)sugv*wJ> zHug0?U*>1w`ut9_k8h0h4$ejG!Df<{{dEYr`WMy9Z%#YeF=t_|-|myXEc)ZN^1lGT zrhAg>L-n0=;s4>}D53q@>^>gUE5kO;VKh2XP5E0l9L%VF}y{?5?;%00>LvdQc-uHS)u_QgNXzo~ZUCH~+SPUoM+yY#}1l*8N5E&Ve} z_!0Q48+ni7O@Q~@a4OF*<<$oY*HWncW(l7p-aUeXzCsGO>wKu0kKAIr3KKKidgjn2 zz#NnGsy2XK80zE?nGyur+r(hT`I z)Lx^|AAx?8+TF-eu*W6Xd+zU<(Ru}Qd#oXLbNGgalYGh1G4cEN)BgEocRv;NqV(;d zYpbrODGa{OFBgP%L=KyCPEu-a(x7L+8_L%aFBymnKYtiW&2 zmrv&(p?<$h*F$;&&sgyDvlkeC2fh(dGOTmV>6U1^Szl1ltoN?_;9>MzX$AJv6r4@Y}0svkU*n zwG~AynD6`NNCwYKR63g~RS!AR8~*RV?D?c_(vkhO=SQr=Qs3zx{=wusd?%K<%ZGhV z+TYrldL3hSco!8%HO<5+ZbVzds}KI|vVZ;)djJKJez)Zx*2O^|a_1O0d-w?{yuwpe zJ1SF5*%H*W*I&9wZ-(^tFPzTbt@JvJq!*S+&RcCvRK&oy@~%sZN{6%PF@yINAC5KT+U%for15K2S01Y$z^Q33Fcev zjD?>`tYnNl>D6)4+4GY^fAchW4|rJLs@~?ncZ1)_yX|MjPUrrh)Sy>!;=2UhVdyRp zoqL3*ufV_WX?XxwGNdmU>BI-FC>^P+YK84^>xUPnLp#^d%?YW3-(jH$()%sv1aEqAnqKk==#1Tr7b=a@M-$_>Ad>5 zm2+eBF=mXUog-wImTH+{ixVQh&51lKxQfFgxnETN;X^eVK6mK;IOn(a>;!s!Y#WG( zZF|-~mHtNjUkeE9@yv_;GIV&i?@+d_m02I>j0pbEplp(l0r=Ja;&i^vwP$$VA55!u zRBrLh)lrGmxiYp_a%F~l&)V}Z@T>S`VSiZwFNxtwe+B#$=|7Km)ob`3K2smaC;qj_ z?)9yeeNjMhdBm^1i}H}peZf!iHV(fQ_?@c++#`G%ya_z*f&8uKXAZmp{K3K_dXx1D z{+H3H_)E}bprf1mkMQ(WHve(F4!jzAPnHx(^v&R^?>L?XSAECvUU1cS93KK-PQb^( zPbT2g;3pFBIq>7)alN(xel!7J0Y4JMo5_0B)6kFLZ{^+UJ63s-X7(TO8`lz7mLSah z-tPA=#cL;?>i>TePxUxNynVzAx2N!N@V(%V;GN5asx|2rJ`Fwze!g(`2%iJr4}O0S z>$Qr&Loe}n$@^%P^e^UJvn z^G4@B$42ITV@Nky(?<2#3!jSLVrMENk#gPa)x2rnG3c70s}-Gl)V@>TE#MFIK>kYa z%!0Rpf8OP9U7PP-?r-UWpX{&0zq9_X^dD(8qZ=8!!+ZSDjj1=m&gf|mjaZd64brIgOPWS-fdy0fh zuEz=APxu2QpY9Pp4L%9}AP?lP@Hy}U;PG*E!O_R@6>#xKP593cZ&lA>JO=-*8-GSp zxSA?1cVj;GdPS$KTz*?CU>omO7^I_8@7o=2Lq%z03>VZce~#fSMO6f#z?=q zVm0E27Cr@Dk$}&F^KqI8eI3v-@Kfi8`@g-@l^~POiVHtafP0iq6$>EC#Eawg;3pIC zR`3%sT+`r|;TX@rMZS zB)nMpCJ65#{NdsF*97^WCA@!~^cM&pF2Y~!og;i7;hul}_LMI_gEkc_ul3iW&!PLr za6UGUl=VZTagYyZVBTW5p9QxYxS0jEVr85m)4gNUs zp&vXGeZp}XV{t3qJmF1*oBG}n%o`TLJHXEkDZ+N>hp@}qHmv4fSBgDy>5rU^PTu@` zm3v4cgV9ST#=32<#D9^oPBs2DSyuVlpG$rpzIs;sZMvWzfPVLdtNE346nR6n_B6qq zEiNcq9gnqDmeFF>C`UoLw0Wck|&Uj3BS`((bUd=0^Gm~?)Z=AWRPySP2#!}NQXGdqaK0ML+uT_g#O5vOqVu{@PQv>AWJTslDdNcL(j# z&b#*rUjQElkN2k)@ImlRBBtI)bQL}dm<^67_2B-Ix_`#rj>T8IHG}U5|ALEuyZp)0 z0Zpl$v1T)J*$aJ3+iGNgp4xK=ya_yMo~ry$xbX9oj(h6)I|JT8yluja+_>~J1D??)r}LUp+7n6+=#b9i zp?r5i-?DKva&BMs)(74OeuvM;vjYM@y4MdSClk<5La%kD(D-B4=g~KIzwy7u2^uv2Qbw{yEj($Vrzvln5Lj$-A z(4Hmn?}g8i_QG_Bzz>683XS)OejNNHxQ0#d5k3umB8ID8jr|2a!F#&qdtqI|SY3FY zdj&onTMF}2)kpgz;Pv1wFOn$pvcvyZ_jsfrn;>GbX@JtMEhJFgX7JQg@ z$$>kIZ`Of=aWwk@8sL;Vz=vEn?wF*`jF~%oOnlwcdd(uU)kR%uJmRIuid_C&RK~>kMMb=2VP|m z`%CyDcuNAF18<7qO26hh+6R2QSeSirL(Z#h(`hDrH{tR2%Yt_%;Jx4-FnNC;n!X&6U!V3-CX@Z8fwH zW{0!Yg6}k`e$v-dKQD^<5rx-*HznZB;0+0Q7Ce)H_k!1gm%-C}#D5698oa^-`73-J zyaN1wF?`z5$MHGGKaMYeD?ede^|Au4{Qp?|&G?tRU$m|t{Y(9Y?I7vJX7K&sBd%YC z_g|WMhOq;+%>RbM{g-Z>5T7CVoak81|G?!VSSNNXx@Ng!m({1n=Ho1(bAWjB9@W5!KB8a3KIjX2u%p) zQezY{XxXMBS;KFJdE0{el9omy;_AIhzkO^SI78ji?RDH_+ zI&|Y|{zrO$ujQAlQ(TSulL~vTcy7S<|6XO#*axN`#_R*Dc+?M9pg%-EJRABN=<8pK zKNk9P#os-`TfvuOxcGO0p9KGyXk+;?yFp^-;6|ZWe-4iWs+S3H_2-{CK8gJa-%-T> z;`FQf%L4H;JDvVBdR{B}Ti7FG{RKI~+XxS*tNhoX09(MTB`?JD^>R<@L%uS0>w2n( zcIa!f(Rp`P>GvV8;2(rfdf}*(6XTbO?S*pt^4iMklGpn-RyM zfkA5K9jeb>`0TknJYRG3rwm>`H+}NXH>f_xq2CLAc-$2}4L%GWm%};mLGTPT-ecO| z(LY+CX@9$eoJ~`9|1;tHh$pw9%9q^dQaikuF3=jX@Ta$*f44Hzv)z*sF1;0bYyNY+4 zu9=_XuM2FMEtSvpOc_xb{XRy#6T}-95agHpn>iZeiCZ5xfj_bwV zskm}A-;<^sw|?FA!z6!;>xZ4GpZh+X@E&t~v2%%jm`&!s*m=?^dD?3J7fcM&PxjJ@ z`C+jQ-MItv9fJSHiJdSs*v-ALliW|eocR#r2wda;i z`+5C5te=#qE!PnAN1?ySLgu&Rb{zaT__KtV{P!9|NQ(g5+m&L>G)R zWs!o%-aIG#l^sKF1Z}?I+$x6)%!c_Rc#wb8dXoKkJ8>FEBoT$G0Dl=kU3I zdA`0HGj^QaX7nHNj|`l>zib@(Jui*UW7Tfc;630;?J9Ygcj1Vi|Csc#e|8h^J)r4F ze$CaDx%UVE2zPDyb;V(IXvSqPLBAsU3oLyRznQj4hP9e^tl9eiZ$ZD_w0c(e&nll| z&^NtoHFTeV*>7dqlSP|A$v|t`ANpbF5A%Ph{f*tD+o)UwdM)=X(9Q^eo&ON8VsJIG z&r0c6-HJScFC_4bO=nE`TA@D-y}G@XQ|4{#0$>3EKPpwjyY4E`qxR{8zU1b@`OGNz zDfm1?ggRk@)!xTzo$M3nw=i)|PkhCcF>GfB`}&=qn0@v|42Z3jWlxZ4QMlvZX&O`h z+pw30R?q(aPw3ljiOQ+U*#+JL9+pE>e()x6)Uf{u9|dm!e~6D-JA1GQrE)2$i zvGZEnHk??ePY}J8pY*G+A78(kALKpMzS!vQn>*&b778V3U+UKimh#h1{FYa(=1U~- zN%=8y>iX#6va*R(qNMtM`f>Q}AwP6`|4}_%iY0_!Rib7_R;{3w{Ee4d(E_oViiAbcO;@%oqn-kn?~(p(^^v;r)a^)(;Qv^;G@!5q@G{ z@%UqeFB6_5r}f02cH!;fPu=-`sf>Tj&+NB923-UB__9Af26NDY@v$xS--)BqMt#9I zVP@*=Db?#N_S8Z0yU2U`_Rq!gl-ldJ7jaateXqq{erus$XB7MpIL+=qqMrai2!5fD zT043M`~Y~keUzWK4*Qi~WHV&OZnZ}a!XD_8>RbHkUT4EidmCQH z_hICQokz65R=@ovzgb8BQQkv#L{@eL_3rNFz~|L~E5!HV+MRz!{$GiFke`neJ-z+2 zhQ}QYf!9B>7f6{Mzd(@93d=b0_{2b-WJ;HO~O$m6->ye)Xyb(N;fVYF! zCg9zoe@kJy1EL3ike3<$DnDZh^lGOmN1xPAiZ|!N!{t-^Er3^(&PLv?EEs)k+V2KW z9V?7S=~RtTAJ9Ks0IfTc>h;@KeNOgQ8{ws8w9o9UYabdi>*JYzeF$rH;amK0oWES(r^R}OcN5-5{2-ibx0n+v zT=^X$yr1xL#dl95f5*Z1fa8V=>lEfkI;w`^b#n*>E1fy$4?+J30jAw-KC~~e3#fM# z{|n*!(TC~gPlwwLS#axBx<``{D$;74hUc7D1oHesru=W9e%|5c?be?39c?OKH{qRx z$J=87yaT+LJdeBZa6Hw^G3YePm_AM*@1?W#ef1c>w zBYXw?IC!fE@>h7(o&1_8q^}1*mB6PJd^v`zUb?_ff)^{_fD4c3YYaRozf<7KZ(5B-GluTs;>pYt0~Ww3J?03@h82^9}Dcb-wR3AKI#|xG2|qqzs+6?GtW2c z`dpS_M1nEZ_HB+hUt=MEroXAOaFekzVe5H-boRWHeK{8L@iFlJ1bhm75Io*qv*459 z;d)U!9s}Q>fG>gXi{Yxr^c%4s!Hcz5y$g@0(+WNuH}gIYejNOl!i}Eu&h-XO zvDMsqU=Jf}DOU9`PrQA1yL_2(Ao_jMB^MqZZ`7Wn*g<=VcPdT$@4)&>Y7;z+Wmm6td>JVy9zv(|AiF(L#0wo2?V*X=k{LzmX4L>e&a{hldy z&HTvzDw$c$KU;RjjW)mGJ+oyGMt+=LFpUSf^pEVXhL5kB@9U+XN<1U;u(#(bbR~v8 z^~OxOMoGMt{sDaz@7^PP9{gwmz6gFKhO7Q_;D^C4786tdzWHL(sk_UDhxMh>X$C(; zyf~f(KN!Qa(D#BL06*;H&h-yA-QAJqKCH3wpnvF0_B#{Rk6TYuJI=tb_MX-JJA64d ze!yUyHvU?!doIUhoR=@9-Y#AMBOl9?9XTNQlok^oO7ix3B7P8vG!5b+K_{ z2lD&jnEdY0LR91nOeV+e@XNuk|I@4S@7kGs!3u}HWE{aTGv+<~%l!@ZU+?-lBPZ=| zqdjJ$`E7-NH+VJpH+i@H&CHbooBIm#ORYALA_)b98ssYP1o4+Yci*f}s9pQ8e>%y} zN#4`H`8U@Vj4j@GRi>hC0h#HavcD=mvzlk-!1vII7ww-cPDlG^*V`HIpbxj7+O-dS zUjjY~zBh)ee@=i8gBRO&{kvFHxCz z_3uQUh@^urhIoLz-zQ{bD+y3PpFS|XZ za*RRW13jKE*Dlfyu700t>s0kQ1Kla;szm1=>9g!O?E`+A_w*yDjqJI73uY}ZSR+au zL3FWCd?%bY9G46ccN{(k=2)Lae$#*Wkl~YT(|P-a%xAL`?2e8~2JZx8k8ct~tV+z8u~M zW7eT*pW^2;RR7KIW_%*vUyG4@glEAI$M9D0UhpH}A9wi<&v(52ZMv~1Vt2U~5#K4| zcYLMLuQ?0e2A+Y&d%Ae(!mbhhwET2eebCfZLYkAM^xjCC95|keoA_>gSN%6mGT)we z=LWDJ!|QFSO|}8JdCkPgLcc&hdcMy2CfTol`aoEY%>K_{|Av#J{<1-mZz()gxWk;w zohJRx@321{-rl2jo|{B}gFjiI(PzPVm1ZE>UxS3}UZwOW$;Wp8?nCl{4RVh!Jf3)1 z`|mxp=dox%Q+qUnABy41M;81bc%YA?_GF(6KMz{(5x-IJ1H_Bt6X28Jaeu)KxYCc) z&nNI#z7`$-V);tHH#z+}aHStkM|x%kyJbcbCiw~G~eS^M_>b_SW>-~$g*d;t`Jg^Wy7UWy=m>gyP1!ih{}oTsT=$# z`1MKobW?du%V<8mWg`Nl$<%&R@M-wbs{dWvk<^R)d7|p09lNH5aQ>8}fBXJ$U9wlm zod2`+7vDSzz2q-FMSBuI&Aa!gzt@591AmpkaQifA-?Ycl#!!1^pm<*WHtY<(RjwrViwOi(2Q@tn`_<* zQg`KlAM*dx=)P*zdmZ>Bc!qbYR|5aP>aCUV{#WG+*5|sw_Y%)q5Q=Qm=>s1IM=kr0 z_>6)NCg2m|4_@U{TRt=3d%(l}QhesYdlKju!FMOn=fDrYG8b7#6rUPIs0I25DqXif zMR+54TLRt=-jRTJgLfw21K`R}oc|cO@*l^iz*XK$lppsfKeOPf&u~4c-Hw5)J~xRL zF&#+-_N~HK2tTk+c+J1ipVtX*CcNTj$^4bCF2Y*~kLRloylI_yV}$p_;;A1_f$s)C zoB6XTKlBwR-MSO)r)fGnw2jVCzgZ!?h49bvZuMu-Pq%Mq!;}j8&CW_zje~!^?q~Ey zE2{q>d^U)WdrbMk4}gc|zl-ptchR4~x0a)GE=LKYyOY1ulwx@zVxMA})TP51HoftP zD7`t-+yAR*dcqgL_koj~|Hv*Gz;4UW8DNryR? z(*6PD_Ui{?_sN+@Hrs?K1|SW%x)Br(aiu560QZIg~4w9ev$ElVN|b zbQ3r6U4-xP-#Nb9?;F0Y@NI?F;or0FSxSB@EZ+n>w@KGKL=NK70FsX!rt!g*Lj799 zl;=PUS3hh7p9F6pJ=@Oy{aD$Na%zCZM|UjB*cl6CY4Q)N`5_d3dU(>bZ-JbJ*B&~{ zE|>jVcrVS)O37^_qI&eyYW}B^+pUHC%-$BmZ}Wzhk#mg$kY-8Xx7~c#LH1Yw>T3RN zs=xCszi|B_e&4lYiq2b@^{gadaVJT1n5Bo|`58o-?cYrzm}+=Q)Ulrh6fpPVyo9 zYnbpFQ(rc{aQWQat10zmE4vsA>}F3CKHb{0Mdelh`H z057R1q+bEAO~9*gZ8jy~_23-|cq@2M0^S8an1J_z?@Pc(!4D+h6X1sv@EP#q3HUtt zass{xUU6Qu9wdi3@C^7DdAIt^__eaQC_DVY%8fM5kW6DY9fn@_(5Ih15td!k=h?f% ztVZ2{&PX@XIM+qIMdBSfKbQX%@9D?dc;SA?8pudF4tHi1F*TzT;DWGEY|nI~3Udv3 zwaQ+q%;n#xezAm8vuM9?a>qD+ccOr8Gya9Dk1!r=$VKdyI?|E-bpX6Y`Ij@+=$f01 zJtg^TC*Bdlt9kbx^^0!s!{ARy=x2fN!|jWAx}RgysHO0sJ60amo0GZ=X{a9NNT>Fu zT)u;L3Dtq=&pV>)OIpRfK;4<{7)!@CwB%wOyQ!l(XTEctKE$jtuxVJIx+NkSDrfsg z>3^jE2|s=2Z{hXzus-Qby}z(Dc#Zhr*QXQnB`LDyoF<*N!Cd}FX@H=uO*w=5bb5<# zd}MUCaGiR~!SBS-eaA1$(&fPmbN>DrH`XWX)gG->CFIT)*Ni`P*eA=h!!IP?8{cNi z9PT%6{Aw$E8!Z~^Ig-l-@-tZz9e;$cfbUPht7gzoFw_bP&9Nokk0d^ugY;+ z8JRKT5^Fnmq_?YYu(spwDWGpWwl58A2d2`hd#FZS!%SZf@tBG>;xnaljgDL1vLic^q zk!JXN8Twq18*bQYorK?}{2+$~x|myh zGz~^!(dc$L-&;^n{66CEBmUR?_~;_H|7NGPflRGMRJqe|cjuFH`LEWK?=O4# zHuIW5pO|@r)2G81>H5k9q1tHXvsvt*qu1v0r>K+kO>B0ejgo!)*f4Sk_|A%rrrcGZ zrhSm7cb}CVV~+47CxKxiG2O z{+gXdKfDn8N0_mZQ?K(f)C|-|_$1+4r?CAexJSVF8ffd(O&b~*1?WFC9>uAFbc%TU zX_pHX&ppC*1VQapkA37l!jFL;xIJo*3tv+D;8%FW{H^0B{TcKp_}>dR`3}x4DPBF{ zrwBIkE&t>DWE>2x`MX+vp$iM|i~1oYwlD_t`RejNO@A`Qkja~>ktr)@_>@tJ|X zDnc|;4R?8yxV-y?sjkAi@kiQ9mb&B2VJptm?nIZ@OV4Sf$xu{ ztNbiDe(`o#0pAOKydA1O$9M#Ow(Zag{fPuVUEs&T&$b;#p|5>yVSehcPpZM0ah9ZO z-WY3BoN}QyRe9%?f9S*W&{pt8@Ii2$|FHcIeG|SHSYN08Mr;bx#Ea zJK-k@kGD%V_zCcEek2bAj^D$1xAMTgx{)%SZ}Ey`fA#kP@D}i&@E+}_+8P#WRD#v6Q_!D^@lm_Xf-i$# z%)9uEaL&5xEn#$5l=rX8P+tB!C zc7*@mXzq_W2A?Bu%;o=}`h9;ApH6M54YP@C36#yK{7m4O8-8;x|7iHwalzbKV`NT- z0dApSMSE){MveZpH~pB!F`|jjB7F9YW7le&48|8zrX3p&rc&<7(^r72iTMPMB+R)3m@5E%lmWr zm&smvkL45gp#=7dXUC?PQ?{17bgcjPwtJ_wk+{ zCVhLR?P|%0DgVC{Fd5a;!rQ@5C8X00z8u4q&H(sH@M8UT+=YkxtDyjc(1-Mu_CWL7`cl7GkbQL^m+w-2J;%l?n2)%A z!Cw6{g&m{A%xk8;jJ@)qTz*un>07SO&3NbPyh*oyFo61Yv*#$6+$<9RIPw2Z@!cal z2VU~)Xg?5Ma|C(*RW7pMSa>7&GI-n$ZwEgBf4YhPh`t+q5*OG*-cmQjWHmJ3uKNo5 zi;njw5Y;o*9fyv>8}122!}%lHz*`RY#{ESdxHsrf4X=Ofn7Sy0dN zV%Z^vUEcmXUrTrHEo=UmcI<}F@JFNLc0K$Dzz4x!%e(d$jp+L`l#iW)cz0gG?=6*e z1WiD90=maKIxbLQGqnD(dTN&Nk>CB%o+Cw$blNRTSl8##U&OnO3QFJaHAYqnbby&- zyK!V+`uQk3vkMb3Bn z?KePp3*q7RYbM?pcoVpHueS4ZdgtPGL9{wJ9PJoK6f@7CBi`Om=km{SdbPMb)<_;v z8DV+c#P{wCK)z|fG0r$CdR+awd7k$BEOMp{xJUgW3*Ha@1ecHS*x=SGI?G-}79xYg zCLJ7zY|pTta3GJqHrr(P|H8lX^U?m8CEYpj4sgW5jdNc61p5@tH|S~+HkxXi5nQj? zB*gYzU0>y^`8xJnEFIyE;D^D(dP#V@qYvYa;N9Ryp??MMQMqw9agZ0U<2OT6HHW_W zLN5Q^bCKKkjfQocvDFaSvS}PNfe>sl^)jdQzY?t%$>D@Cxu&@pF&phrpY_&+|b33Lgh= zNWiDTGcjCpJ_lY4UQEsxU3fg59Julu$7{Z2^Bcz-!AqcjAb&J&dH1%pJNi!H)F<;w zU9oJQE`IkC-a@>`xpqq4^Qe20(M55cyS4IaKt8t{*4Z1)`q?aeGr!D*z6*AR=G)wH z`5f=~R7pMQFDiZLo}e6&zuR>msG++yLRa-|W?s7bx}R`4e9MrUt1 z9ck8~y7hjgGX}rv-?;gjOGxQVfp>s!aPpIA$6~=mhSiM)-=sEE z8p)&VuZm^t1?l5g44XP~d5`T?$l5gs_EKz1R&Xx&w%=xtk^kRC?E;mn7rY{d4}j-1 zV1vtlpRTg`D6m~CttNA0wK8=_OjPX6 z8g|u^X%)uh_R2>1Pt0R~pR((n=?~o+vthJT(b`j*YpOo7|BwFgr>MV0`neap0sLa# zt$vL9DMwv+Sl=rBI_#4S@jk$N`q5tcl+msoZ1RnX`m^Ec2(#QT4=d%DGzqhNl6 zG2-r7-?3pbmAb5meWG?tAIE+?6K%J4@Cnj63_hrIeluk97{1Ses$ycQyjdfHi-0~J z{$F(@z26J}Q+YT3oBA<&A6xQyUhSB9?-+E|C2RJalbIK8W!|*4a<}VO(}ZUT56g-2 zKL=h>v6j#9?mfa6#1Fj61Nkd?TygY|5^j8a{^zx<{r{iX6T}OrqxzV}-a1G*rg%^P z9;@E?AcD1n?1teKYB;G#D%_16l`6!~d^ zKI8Xu#_zDqUS%aMA}CHkm2cT!wWVwM52ziVZS!5AXPqCaCpA&1b?D&T@M-)n=JTnw z{0rT97v{mF()W8DElr&)WP;*hF|$yG!84wpJ(t~)NXVKx;Iwdf?{<47wWyfy!O)gxM*z?Y)bRKH7vR};R(dt%+P7*NWA?Z|lHcEqbM1={hT8~Ud6*COY2y9issK5GFll{{A59L|gJX_|JHHL0s2Bg#*g z9z_tBJ3GE+v6GhJJEwWp%%I`x^ddKGB<_=+DxwyRJk@<4e@69M{%%tu`zybs^z)KSFaqv@rRY*S#zMO#1fu96-Q!bN+>T&`61o$OFjIIv)_ft32ata(%$57jG zs_KW9{$au*I+=B8e4e^TLVTN{Q+j8^SMb2Pl8tj($uy?fwSsmvm?Q*n8~m!*v%w z__G(ga-(r!g7^pFEBn{R=f18xq;JD}gJov66%Gro;_HaI2%p*qttH-Ls`ebk9#Z(z zcu&8H(JhcswC_k7hXS|o25kzNsgKqlvA=qr$<@k-0_&4Q zR3gc-?5~zbteO2b>3@8QlV$Q(@a+Qme>w6OpY zd;$C*^pEsF{t90KKLRfC^d9w-s-Ixrc=TpoaIHT+D7=wyrT$ zF5c5U{jMJ&TkgA#H-~h+_zl7DAoPJ<7|e^+-V-id-_Hxl6)hRs=fuvD$Ux9x{61mV zmeB;Quvmg$btCQI^Ftqn=MnN3Ovm`Sg=Cel@u%4TkFxWYkdDCa!Tw_!WXCZGd6fTd z=ubR)&D;kl`U0Q7l~*Pl5qV{2>*ZmHzG3(GHe&a5lD_VjNT;tas1t83Jhd-Y25Lb0 zUsC=bw{}+d;H!P=enxvkZ{#OI9$E=ML3olpD1JBLZR^O>5aFGKC$)b)@h4n(JMU3@ zB)IQh>C8bl2%pEOU19LuwJv58&u zQa>CzN&Ws)VSgS6-``x=pQphO#^}|q?btg9z}t9F-``8u^Aq(O!6a2ekzsxYpg#ot zHr~@e?{oR|=x>bBH$yW8eGB<{ujoGmy%`^aer>+#88+geGwuI#@=Ls=_RT^wMEEfI zfTQ8*^to9RGxNSJ@&%#~UH7oxb7A!|3MjVGYxD5yA-(GiVt*-}Mex0(qkB33ul-Q6 zICBDfk#w$5Km5px98Y7L;QMyAiOGBF^?v55GptT$m00~S^b5*=>016jUB1>Gf7)~w zw54!~&8@pjp620K{rH6WKX?WBGobOFMqYB@ldWg34;p{T`~&)8`XEbq$&-rfgFeE0 zXoq6)#|ZByJV{=Z-)R?a){&66;J&=n2kg*d7DG%Cr9T#+AAZ7Gem(sm{g7TlJ}B2; zT0bmdceRn9MWy-1e_mHVsJs*8Yq{<0+h-p7wvEN>cZu*$!i(was$UUK`xR@SM#6gt zFV;R;7yc%vhePdi&~G0%o~nI@pg;QLdvBj9=#Enlf9duaqha=uAJaZ1d)93q^|#hv z)895l?I_`0;1%Gep7>vn@IFUhWf1#ofIp*-{^c^rjGcgee@7WU8>dT*Z_-@1iCyE{ zwd^^<9TqViHdk_jQ|>FDs9n2?B8XKO%1=)DX)nxY&2N|wfj`)0(fk&DBX|b9JcMU? zZ+G-Bb9QvXzL%!5CT!%0p~l`}M(GGd)_UPL4!@3VYxyItKEir2wpU=shMtr*L>B7B z4sGj6xK7)xASs<3>GWT_mfz*;U&g?Kd62RH+c_Jg+nW;-(n4G`Y)r)<5&^=l%QI zPJy|}u*wprFCBLOO!~L9_freUjXLn^1iTr%B8F?c&w`hLC+PV=6_=~iyVFa100t>>OKKfJOD?d>+^ zb;0i#c3Q*p*7B#%hxgNwH2U;9GMv?Zmz$FJyD(F=kN7rX#~i)h@!fFW@NI-|`uCLo zinaXhO3I9@_`l2=7U+kujy!krR*KaipSq~)lUAK|A4$aYb|fac{5(o|H5~6nR%@aRVDc4 z%&g4z`yu$8pkB{`r}s4TQnQ3SfPbC$^!PP}_mu`8^76#e+W+wDzpYS@ErRb!z;oa| zFw{Up`s^nBo&+&uK}7T{4n8F3U`n2Mesv0ydFH~_&rLrrr%?Cn10V(#+_F(^3TC9 z#b0p!DZK7!=4sZCpAk2Pt*?Xl1;MeiWVBIlnFKpAgKU=|28WGdL zn>eW+W{AI^_)k*4@i*Ju)AoKp*$!NqONh=|g`U`s)(v%d8V~$<4?)+VmZ%9S$BjXO!|OQ}^Cs_Q6jP zZ;*J8Q9QFR0&2ud>rtwoIl}i7{!E3#H!M$PEfv2WJR=`L*sPCu*eySJwu1E_mAB?J z`W}9gHPXvGophA{M(~5+ZNg1|@%Ahz_x7GcG_v<9DwDrn;vKq=^4AE@8TcK6-&2%8 zkPk|ODXf|cropDY7ok56eb{bSIdkAgW4Ov$vugRb@gCyO5{SylLZIOvEvM=#OFZ!t zk8nFlUZijO2wx`r*$O9{Bdn@4;S|7Xu|e&+XF7-cfL|uej=!T%H ze$D#nYP_9-t_8X~mA^p$n0~`48yY=02Dzn@3Jw1Cj*FQ3UxLr@y`-o5uUSL>?}bkF z*$UlJ=;CtK1%4y}?*l)afRBP7O28+;4<_I<;L2Y--FfiI1bh*Ee*&HZ-xtHBPioHK z4+6inn7(DU>Fe9c($s$?4jy)%-3z~7_#N82mVb40KAXJvov%mUm~8Bsb*zLLtr;4X z?|ITW@wzp8-lB*eOl^w|tXnHD_Y@&fd_}1Ct;-{yuV0JYZ>w~g!7IQ^T>XUgtyzQ6 zt%)gVTtpNVY5AIO9z=AoGA@3j@H+&*`zP>o`Wt>+xe&Qza=Tg9v+J^?zzrkfC*5-l zetXB(^4Ieo(O*p|Hqqzw~7KCCf)`C?os~g!4H9de_eSn^G#E7dSJqO zsh!FxodNiDykRY}k6!o~cqe#VuBRM*9G?YmOQ1gn-V(#5NBXdvn!u0pp1$E}1!J&Q zA3MUE7fclg%EYVRW;QMzg3oK=WA!{H2fNU!Z!D;rGT$6sTx;RK7mqRo}Um zXIkt(UA(2SM=HQymF9ivDwD4Q8z<;<+cz9emAxT(zUE>+6+oSj`^;+lCeaow#XjDyboZq_@p&`(1DkKz!r zQ?wtV52%mu!-RiY;YIo z%gd&h^tq^bdS1V6Ekj=6{}xvsH-9nX5_bSO8*Z08knY`hBZGGjCcflz41SaFdwBvs z<^wKXRwsA#j(r^Fr(D^6l*iz696m1-VA{>I)7U;&Yrh$2MBDX$%IvEGwR=svl4E`ddQuO^ArdE>rtiLqefOP6nXg5B*l3o&y@L zqcnq!6Mls7?JhjLmY+W2O%m@}0*c7L zHaLc5dlTh!9U@|U&j^8&G&*&Ly z*}G?HldouuZ&m!ppg#dW)9*~V*t?8HrCy7i<@xyYV`j`Np1b-~=ww<45+VKjfH)jbyOt|S6=mUL& zi|R6GPZfWG@RE0~<*!nF!nsied(HX@RX;hx+X$alc+fuR4fb*focMegvi=8W|}V$Ym> zH~vg`r^|N6+A^?36-DiIjPz?K-99z`*CRc*1l|e$(RKBlTQlrW9Z2*eZjqVaLJ4B( z&#kAa-n%ZKJ>SFrd?kDtx)(XSazm5;GvC)6AiUze_yME!6PzCi>Sx;q=EHX<&xef( zmoOjZ&^#$szF4=bd9^8IUh+{C8c-TW0J&)-+rX1;eBp1!&j5VgS!cGjW0 z*Ydxh9@DpBr5T-U)TuzHPBY@@OIgMHHRzBPM~?l$-v z8N*k`p&Xf#d@5R29ksgA_($hB7+di#Yx!%%z{;b4piAX?LQvaDat#xuL`O031emJm}zpWTQ_C(#z9S7!K&mOyLw(vmkPFc(e&1Vx*Iy0ox z@qxc=I;x+#YUY3cx|aWZvGN!>_4fzAuQaJ&z(^d8D_7<#3pU8d}_$gXYA{F;_v%6`c*W)re7g!?mNq_f48OX zO65B@-bj0YMCgr_gI^kI8ecpbRt|3UQb z5#9`53x1vl@>h5kT=@y(YWH5p|6~7n0gg^rB{DH^!Z2Ke97ehHfqj33U4R;IN^hW z%s%1Z1AQt-FX1g8D{PM;@TLTO9K0chE1hZZ40y46oOj{j`cnFf;I+hy<2mr^7~Tl| zICfJ7ILk`hf3n%M+3olM?AoXermBZm*&I(Chn}b}V2Yk=wt;805}{%F_OJ z;aITI9M+GG1s!JnzE1Yb$Jt*-JEmVqKF|qwrkEZi?@`*Ovm_gn8`Jed+KMc$kl#a} zSTpx|T0LXzQnrnaq<3s+;^L!>Z>4RjWDiL2ufLukJ=}`Jw*MaXPbJ7%un)(bOBpUj zeI?ipeD~sLVnEFPIG5Bd9ja1)R5+$o|?jGR|JfbsBC$@2=y zQKJhF?^h7s4&Fh$xL)aY^l?2j;ON76J$%N%+u*a_dc4w`aq;7NX&$_X_;ER31m7LQ z)t_?UDsQp=RQFdlJkGBfT;&bpUGSU7u2TMQO(U=0XO=|B&UL|K!q_^j@ zYx&Rk?T=?B+y_`s_t#_gm6o+9j~nfB-4!z|nn|asmiffzlGoXg9XIgWo3!j8yv2V1 zj(D|)*YaH78@0nIcrEeb_yl-$3|D`c0Y7zg z?JxR$f-cgTz+Rf9KFiggcVlgs@rQX%xbKDMYK%WmP43VB{xRi$;BU}JUs}s=apOk8 zej=ti?2nlWx3%%OYjGs(++qvydt#6$5X%1o>9ieTTrQRldDor1{Y*IGcj#~d;2#Uo zZDzjJT!%jTYVmQRi}2b%722hJ;ML&q@naOc0$kbj9?8W7cu4~N4EQ11KiqFcKM#Ho zJj}lpd=dNr_?np0hGG9!;cO=8xaQu`Nly(xcL2H}pU$nxX@ctry>&J5or3-p^iTBZxlh}qf3-($*FT`E z{`UHGs*e@u8laPTt@^kl#aSlz9TIen{KcK9ipVt(Zrh@nXEpyV?e(4TzVTR}2;0}4 zskf}7wvGLm#=faIhP^5MckUCC`&q!#e3S5RlKYvzU$~i~b;I}If3S}Rfk=OW)dw>s z7+cS*(b3Jy^6&}FyN%{P#hM3W&wekekEGuk!Hav(#WY&RNP z#9S`IYFEPeYWD%FJ{vRW!ymf!DXl@9 zZzOz{{3-k+yr)OVpOFcp%jEdugJlxQV4k=ndkgv|>NS0hSDvIZCvMKfxqx@6pBGMA z{Cm)p|2gtGcq-bC!WY2%!QdOR8Is*b zY+T0P(!Z#Tz2Ay`qx9u>NngV1u#rFCPr-H3f&8f+mq=$B`eN->^)T#R?2T}}s66%H z4GDNFcm_ON9;MR-F8ilgdkwhocsgU?vXA2U6u9i8Fs}BR1($vFeBNz)p^x3YGOUpo zwAT{!ZP17FtMa9BfVaeO@vj3{eO&AFH)o#B*r^pzOd8awwK&Bm3w?hAAK71fz)d^7 z>2d3}llY9oXYjl;1?%hI}) z(1-iK+Or;f5WHCokg<^zw|TI$#oNEoPWXPpO}viE_zQTvVmA?${@?$;& z<)Jjj9sN^;8=3a*%X7UDmC6^vJ?R#eDc3ylCgHc+AoiEiSp+``UK_)6;LG3~%kv-6 z*ECrAc>OejpMXA&w}T%~z`MbZCg20$M-uQc@WbHodYS@11RmGpv)~64@MGWy67VH( z)lZyH`VqGM;&>gn-#)H}hWOj;=r48isykE09}`=@Gxotw?F9X7;+VWuH^3ygW0=&j zM>Qe9bhIq#&yfD^Rqk&i3vYk0T))U)e%kU=^${nT@`h`tZ{PUv4; zK(BrcJs-C8=I^Sf3F!AhAFe0qqZ#nM;EZ^#oHu%AhZz^Uux}0!ej~x@591{@b!qOl zGHYqK`PFC7)216~f9PMPjvdsCk!Rz_4(#xDtw%qpEK#7%jw0o|3w{kXXY4v3-Zw4A zn(~9Ufin|xc{1Y_=e$SKFYsDaVLWQDI_#8A=qGqj{{gSC$y*@nW=${1+YTCx>c>DfphOJ!9?qac=r*S^HnL35 zluZHVB$oBB zn2Mj~16vgjI+O2p`ZOVaTj~(;(M0ijSNwM3xBTrHe?2K7ev>W{ONy`h9VPxL;=k0T zpFB@D^I&8g<(Dua@)V)?9fMy(=1jib@hjp>jvTf#^J1p)5f2zWx*2{`*h>u$Ig@`0 z{L)`zR~d3Oru9H?FW1LI?FGFaTD7FR34Qx_XYza0E{MVH8mH{t&DwMYf`W7&n|4UX zpg&lDCjVL9Exo5tQ*v)u584j%m1i~qqbxUTr;Ec~1xWuKgHOZ5&e-#C;>DwKEGa+W zTptkS-;}z}&(AjP?{Rs9XBVVX*hvi!Ka=02e)YpgnDQ6+Y>h8f`3!0hncZ4h_A7NZ zB*)*9Xy&fUkL<6^BjBrgy~pw$Qyn=QUPnG$zvASmeI#$q*fA}aoXKxiyf-JrbETn8 zIaB!#pNT|X^|SIA)~_CUCUP&U@T$k6Z^6UkjoPsuT=ZsMXxh%Xhs&XU(TCl1lz2~9 z`Zth1a_sJ*h>dl||G+&I`Z8V%EgQ3)P>zz^*`Fc^*=dVZjQP!O*<^W z_h8eR{Da`(J*vMI@I&DB0!@0?dc%;Ne~{i0!mm<#Z%a-O%SyVC*mew(oMf9B-yU-& z|3b(2c3lc*`g=ceV)yNPf~>TMpl^EY8GByD$d#ubp5d8KMvv5E?{q-N@K}P}qC9m)m_Q4+p>p!4C)wY!vD;_-+BpATnIGS2E|0AhxQ- zdk%ib;YacPNB9Ex(FA-2{0Ml3PfZ>2UiEn9pWqL0cEp(Gb+_xgwAz2hLC24VD4mBmOK|+fii0>!-B>cZ5TS&jw^&W5HH-0%CGFNk{xI4_YHpZcdm}nHg25BZa7g&J!F`* z(V#}}-x~eb+I_OW_Q2)7`VdPRdhvKRX6>38Wdn{L>KMt_ZzU#8nx zE|o16p8agEMEl34GV;zvAl0MFxAX+`arR7J#kBGh*jn4Tgot@@Sbp@mf(#U1S&3xr z$QklGc-fge$H@4O$U_{jh@QqS4cgVSyZWBU__8b7UgDY0msVYb^XWn5k1yH9U;fw6 z6@U8)GWx-?^4DBY@{O|c&sLRuxV(Jsf|AdcH_l#A@}+ai-&$ERdT#mqHC$Z`7w0UO9Uu!XKh=#tE`48F$z1CGB_$s#vyrxbxU~G9i%asU@~>2vyz9L3 zx$2V7pI`p!>XNUYU!J?LE4E=g%*T>8d0{Y5COefQ377BTDOWT1*C$qRK&VoEn8S*sVq?zA&LZW z!J-lnTmnes3TPFr3yMLs2rg8FvbgX*bDrO5dmw+VzFx0adp;lfJNf3xGtWFTXU?2C zCt)w;S=F9CueM{qf1%Meo9r)?>utu>@-e%8tkG_Q-Pmr(N9{(HAwRO&AGJv$@7d%A zyBI^QX170Vms{+jLS?K{{rM?cigl#1MWL_lGLR`o#K~!yVxdFs&lIo3%Uzk`!vy(C zBh|3W8;MU6r7u(LOOyvQL|L-@GDECQmLF$`k5lAZ8DeajT$drfO_M7!gfCrgZXjl+ z%V?%}GF?8EDJIpI6B>y5_2uYB;@SH0nMUIE22|{ujTELZnw)#p2kpf?L%!Hvyp}0x ze@g32A>L_EMk+5S8d)mu7s*L>qpytG?Bncmie1dARUPFhv#0zzSxhrNw~t5>A4xi^ ze6RYT@^P}^I#Vu_;ve!oDHa&AN*c3Ov#yn7FvB5dIeu=3^@g$1Xhu9={+MChEJrr6 zzi71mF58%6lhxTqm6Ts++ebO%wrsoKA>YonhZ5wg+4lDn<;raP-X!@(6Z?*2xu%Kz zP_kUs#6BrSE^1<5pDK4Yv2RJ0A2zY?Pm|S6?DL%RDe_ZKewk(W*OMP-*%#N72ea%i z)RPZn*+UH_mAJ2=oSS7Il_8(XvQNv9GcxU^new$PF)>T}vh9nq8BQ^dLK59Z%$~eP5zJ|R@iT^j2GMDo-jrxikBSojROhd+XQ->%s9_Ydo`V$ zXjB;Tg9P!JK~H=e8PX z6>(vQ*zBMq`HlGR4BDrUr8J?p+R4ksEo^(rB4xYHkl)3NNw(uQOYya>({Gi}^PC+$x)-Tlb&aZXocf>Iw_u`qD00rnjb7%WRk5 zPnPNpLJi%dm&h;d;uBl17wmi}5O-#G5@MerH#x)`(yy{W-LWItK4ly>w#A8$>@+T{ ziOZ(ly{O@7&0InZynRKo*llb7QIc5hkPjw_$^=RKC5f^uS-hLrhTeTIiQLRc&ZJ#( zdR(=!&{!(PDizRXyPPS-xVW|i-i^DOBWy=+TqZ}@#UbPB3Y+*|)sa4!bqeW)@(sJV zUB0HOelJTLoqh-sM^of2|#>_-9oxZ96UcC4&p2*_~SwwzJ z$Rt31TdT(CC!dTH58F;2FF8{b7=fvA83bNd_5C6)i+0JpTeB)UKR#iXv(vfvXfN*)3-L}`mVDF@C&?o5Fi5(p%{U`7V2GD3A5Um5-Qo;- zn_Ok7^GpXh!A7-w!6t@HGoG}Gg~)2F8)btmyyW-#5&!@jL z)zCnWqp_PBDH8CGEJssq?`+nz_OzHMKpR?$wFw=4;GPJCm!ZiN@LFRJ#bE z*^c~J_6c2uxK)-(@s81mZmSxS=Gi~m*KvPM9 zMV2UQ(Bu9rQ9>t|CSp=UxxI;)(@=(+h#8q#WcgWRW$(*6jWW@PWVY9)d}Beq&ngHMyeBzHap>N`cwn?Kx38AxsApA2J%n?@u`~FZECDA zwMwd*JamzFh#55wy!4K8vW?Cwbh4x)*K8?e8+R8?bx3ReYjVHQ`#_v{%TBh_;<9LW zt2)Q}Fd(J1vcF-7TZnuF{~0aFVF`638|-26z8gzyNOl^shATs8udmc z(1c(%4d?I5wZ`^%u{u6$M1uHU9q`X3WWAN3?5-!f&+5~NP;XT|F(zIfsxLOh%hCp7 zYdjSqwx-;^t-hF;mc65%*p!yNp}u%Ly(#T~m7cY|zF6(drgvx6Q{_W^?6B zhPd^Ds3EohXEhl^hv+6_tWo9=+ife2YIXkllo&Fbl0u)mSoRe~q{OVR-EHL}DIQW6 z7jx}dw7b)O?Q3!3Lp63xmKn6W5-~MtBZGGOkLbv9qCMk9JI$(So;f1!TG}PY$QqD}@+IPUw=9CjQB4)E|=~4%lQ#iWp_5 zCl0=#`B;+h#ktgkN6ttQ^W-*iAC8xsl0{W~Nt{`xiqzSS;#*}rnD%bEs7&Wrd5j!M zmnL5(if0V@d7}8lkh>DaRGWM&QLM4ay@_IvO+K0=9<@tf5*^p_xg;?%PL50x&&0`K zlK3P}PEQh3rCgIF)<{`R_EJ7Z_6|9f>>V;h_VIEw*~iOglIS3m{vxUY{f(*y`!Vj5I!{~(Uik< za1_*_lWNkt=)uiNs@v;Uje#3>mXF!!Vr`;LJZ{j~HV>Vk{$&r?ciXAj*9-A4xx}D- zmC(Bn+g_JqbsQZ;+i-} z->}iO!31@%(x)19mUC^QoAlYl0Kzj-zVqTyaSuDh^O9mJ!?`}ahn!>+4;n3$Bh>#y z(o#dxe;+jiD6N(Jzz}!R=RVin^Pe9WZ#cw5b~!O#ykx(V_SY!CV{1&BQq=^zwHzYG z;zKI7Wa`&8;Wx^uf~w!B^C(~2uC^I(+9XZDb&!%U%gL`Rl#dXVs>1;JqcpAqbZScb>e<6g(9Pm=<@zpYY-c3 z7s+KgG@pM!KHgp}KWynp7kzR=M>XiI>L^N*H*PU6A(^3_h_{e~SD zcM`iAtFqQ)$*<26JF?EA{ZF#xHyy<8?2!h&IMhUbc8=KIRDO^n?mteB>L`{U*M#`w zW^(h{Vret^(%E8jGv(sB=JLZ1Vs-PYY5y^ooS!S6Y@zs`7IJ$>F`{K}+TYny&OAqK zJpMf!y;$p(FPteV+;aJuVuxGKIa7>1Nq*c#Jl*O-dUx!}^1-vk&Xey~Q5-%+zLq2Q zwsz6}qiy7qXN%|B$Z!58s@r4{`J^p1>ZfXj&%I)37re-qOUF>KsXLc7OTF8mr#i16G zeqC#FOS#7@9&IT<^NQ-@<$GQ+;RLzCE7qSVAL%B>og}As6MIgQW4j4oE4iVonAJ*d z?%_j<_tMeKHfiJ3vNs6elFsFfybc07_g3s}EfjjKfRfamjnE2!u=^Wz_w5++cS*Fs+no0It08S{lEM_tA9GAwV5mj6QE_qtUBbr6H?zg!IQdGpS~Y(^TkMQi z7s2BbFOk!EQ5{3x5;v5V>(vllbIr%Mr(uO3Az@^5-+98 z4O!yNbagTPX}TQWR6N^2j&3T}HjulThyxAeXHCTVhK--2i@OZ@b(WZ)A-~HK&t}M% zv&BL+@b9ESFH6j9l1V1iaB59kO}_fc&35|%yPOqA%V_kP5?f9kSL;H)>WbuV$ zg+ET+Ll+UM{F9BQqtsDBlZvq2pt;gCyPej^*4V`+b;hq5hq~5YYs{wqVNl#3C+8*^ z55-CP@uJGOp+t7bX=M9+y!_-b;(je=IW?6i_?&U&ZOqK;j>V56HN z>hsRzk+d_*kcSLf2S)N3XNkY_>#RS_PR|Btx_sX=HzFqX|?d?SEk7E0&{N2bsq!eW;;VzM&?FPuRrW_kL&4{QYFp zq2(jBUd|q88273P)zxxEB3;w`kV^C0XewPb%Fk29yEeHw)mRp%?p1vhCl93&K)S%hTiwX+L!ws)4FW^4U*k(B<$xm6s!59!Hl_&p5=MxZ@smh@e#a zuSrS!qaE}_EZKLt?Q6O^dDbCUI>mJmq}CU!@Ly%_(-LDU-?R z>dlwZCvxXd9-47F-nCIW=)&+0xyeRN-Fv1@tVfHcsIJ;t_7bPlv;6dlwB(jToGup_ z>cYw-&aR}786V0g6U6R#zJf?-DK8X#`F+~INA#izD1BNTHA?7T!Wr^Baiub$do$S= zQGcK{vH5oKlq#4`axdDA73yA^`I(JRy2viWNM3KqHw@!FRkV8JImPLOt*)XL8FGyw z_9Ci=mrK80+?GqfOHAF7E?;azRoSyoHClBf<85~Nh(pYXlM@}r%W;>{KJ`~R$Iz^i zyvDCHh?phQXJ{F?G0`jK78_k|)9m_X>DNm5I*>yp$GY)Oh*f}NJ4mSCSwRZFm2(&Vm2Vy(H2iM~@l}0wRvOhnouO#;YgYsDr7HZL#tKu;k~*J0-4IWr88h0ROJ|KMXdUt$qs{CD z5wX2P#$=YFn*37PU)*~1*SDX3!NaNQvgrY*TBoJ`SB$13(`nJ_UfO@kE?=c}3A=nE zUF^1Zr2UO?mk{49CE09t^q~DtFWyJ~T#ieNll4AScDm*|ph&N_h>eGT~-b!!`4atG~d*chjJ zyO<*7N{1+y@&#I(cF+wL@=e`0Y@?IH<2IW0(z=*p>22j|#b|`RkB%#a)V~Z>nbXu@ zG0N~8kJ`j0l<7K--e@Zq+i7`hk6kP_Q=8LDbQ^gez(Ax0;UP)6HQYJ8Os)poUR24yuoohDND z5?VM=6@Au_G@IC93^L7sI-OHHO~N(&u}|mqvgu-jmL=tyI5EwRrnKDGF$b)=KXnM~H5fw~OTWuPttbs6|KGEh2)E?j6UpUs+w*ZQM7@8)lQeFohI{RsL#^eyNH zXau?%`T}%0v|$}9-(Rb-{MPY5R|ftH^V2_9i~X@`Q`dj~ zSncsgjHc$CvgW>u)mHOIGXIFd|Hd)l^7!y??DjA3?pWi{Up_&N4;@mjT!B9I?K>*ZO-E-?%TYe~g3ba{try*Y(t@%hjrREY)^(`q#+7vF0Cj_h0`S z{ovQu@~_Z;_(>Md(6O$sZS){|&CN#Nud3VXGVs5afn%+symyTIChL#!{{LD&bi6LT z^E;_^p7x(E_P4IzFOC0~+W*>otQgGm^Y;d^_Q2~-L-=(pzrS^UtmPc5{?_-cudV*- zUjMZ-@K>0h{k2>8KU@2{{_~&B@1Na!UH|#Bw{Ttke#;D0{THsAYOZP2+*kFgdw$@z zY~4Cvzjp@e&Og6*#{XL7)%CCc?e;!a`^Bo=ue~o8%U>P;V`ku3{o~j6gSzjh{xRG8 zw~p%1(0}Ns1b^C&xIW0Kd3Thq7jkRA{^^5tJO7mo9IOAu3hLL6Yq9**@uO$pf1!P9 z9?`$___y__`RSwQppO1=GjOc_`D@3Cy7|u^x6OY^WOe=Hmt^aYYkRDA{NqMm7uo-n zfn&An|HAlPbIwt7U)9^@{J&~n_ntKa|Bd@g))?wu|9%mR#)>Y}U5KwSp@x*0gu`24?c{qomsz5jmA>-x`szYYG(5!Cgs|LxX2R{O=O z-LF0G#PV0i|2H#mtp4+B`$^sXvEQdZ9IO3eMe%FfHI~2si`QK9uDP#1^WR?ou3Jz3 zzgn*Dy<=tISjXS5JVQKB(v-qv+|4ZxlOYQ$Z)BmUY_OU+Y_%-@VeI({JefDUQZmr|6gYoUPrs}e4+_n>&Nf1 z@wy7{H^poH-_z~;@$gWEst_psclPF1)tP|~(qc-$!0d@*L$Ae z_YdOr@$ge8bs4D3KwSp@>KSPDeC_K|oew|GJ3(j&8i7_oE1}g;M?RmgGNEp$2kM39 zLkpqBP#@F}4MIcE2($uP39W`Yu0;7zH`D|5Li3@8&|;_$>W2oQA!r0z0j-2qLmj

Xd$#1>Vx{BL1+jXfmT2(q18~wRVW|ohI*i0Xg;(MS`76;{m>vZ1dTu| zpq0>SsN-ss4|PL5P%kteS_mzM`k;Pj5E_C;pcT+cXf@Pv4a$eQp&qCgnh!067DIhd zKQsspK_k!#XeG27>bMr=L)}mh)CA^+NNZh0tQC59)^op&@7lS^=$uRzn@V zQ9jfS^+3JQd}txG80v%ip+RT}8i7_oE1}g;M*+%*x}hGZ7n%<(gcd`6P(L&X4M8K& z3TP#?8tUkS@}X|12kM39LkpqBP#@F}4MIcE2($uP39W`Y`l5WO8|s02q5054Xff0W z^+SWu5HtdVbNp`OrdWG1Le3Lxa!|Gy<)FRzjXb>8LMxYhYN@z9IF%acL-B1tI3(bcXLW`k3 zs2>`HhM*B>1+)@c4Rzdv@}X|12kM39LkpqBP#@F}4MIcE2($uP39W`YZbtb~H`D|5 zLi3@8&|;_$>W2oQA!r0z0j-2qLmh)qKGY5MK)uj>Xd$#1>Vx{BL1+jXfmT2(q18~w zV3ZGaLp@M0G#^?BEr$A_erOOHf<~Yf&`M}E)G-9*L)}mh)C%VyF-5hX$b`XargTt%O!X9YrV~>V|rtUT8kF5LyiN zLH*DmGz5)6E1;FoYN+EDln-@7Jy0(+A6f`4hWem>Xb>8LMxYhYN@z9IF%0EH-B1tI z3(bcXLW`k3s2>`HhM*B>1+)@c4Rzd#@}X|12kM39LkpqBP#@F}4MIcE2($uP39W`Y zhNFC_8|s02q5054Xff0W^+SWu5Htd7KGY5MK)uj>Xd$#1>Vx{BL1+jX zfmT2(q18}FG0KO!p&qCgnh!067DIhdKQsspK_k!#XeG27>bM={L)}mh)CA z^+NNZh0tQC59)^op&@7lS^=$uRzn?kp?s(t>VbNp`OrdWG1Le3Lxa!|Gy<)FRzj84D~_%&>%Df zjX*1)mC$OaV|rtUT8kF5LyiNLH*DmGz5)6E1;FoYN+F0ln-@7Jy0(+A6f`4 zhWem>Xb>8LMxYhYN@z9IaUaTux}hGZ7n%<(gcd`6P(L&X4M8K&3TP#?8tN!P`A|31 z1NB1lp@q<5s1NFg2B9Hn1X=;DgjPcxBTzon4fR01(0phiv>57x`k_H+2pWM_Kr5lu zP{&A=4|PL5P%kteS_mzM`k;Pj5E_C;pcT+cXf@O^3gtuHP!H4#&4(63i=jTK9~y*) zpb=;Vv=Ukkb&N*&P&d>A^+NNZh0tQC59)^op&@7lS^=$uRzn?QP(IWR^+3JQd}txG z80v%ip+RT}8i7_oE1}g;hY#gL-B1tI3(bcXLW`k3s2>`HhM*B>1+)@c4Rwq~`A|31 z1NB1lp@q<5s1NFg2B9Hn1X=;DgjPcx<4``-4fR01(0phiv>57x`k_H+2pWM_Kr5lu zP{(+b4|PL5P%kteS_mzM`k;Pj5E_C;pcT+cXf@O^0p&y8P!H4#&4(63i=jTK9~y*) zpb=;Vv=Ukkb=;5gp>C)L>V@V*3!%kOAJh*GLPO99v;tZQt%f=#qI{?u>VbNp`OrdW zG1Le3Lxa!|Gy<)FRzjV|rtUT8kF5LyiNLH*DmGz5)6E1;FoYN%r}%7?n4 z9;g?Z4=sciLw!&`GzbkrBhU(HCA1pqn1b@5Zm0+9h2}#Gp~X-i)DI0pL(mAc0$K^J zhB``7KGY5MK)uj>Xd$#1>Vx{BL1+jXfmT2(q18~w11KNrhI*i0Xg;(MS`76;{m>vZ z1dTu|pq0>SsADS1hq|F2s27?KErb?BeNaC%2n|6a&NJ|hVr3qs0ZqW=0gji z#ZVvA4-G;?&84D~_%&>%DfjX*1)mC$Oa!;kWzZm0+9h2}#Gp~X-i)DI0pL(mAc0$K^J zhB_WZ`A|311NB1lp@q<5s1NFg2B9Hn1X=;DgjPcx521Xh8|s02q5054Xff0W^+SWu z5HtdX?o4p>C)L>V@V*)qn4#pLsc&&cB_XbbK883{=~8KkvLQ zu2$VIy5eM4hjyLXb#$GUb85#N&uOQ-T3y=z23LJ?Hg^d9Txo4iPpRVh)Y?2j=;v5#^F*Pa->uD)M9CH0PiymJQGk9~o2Ll<+;453 zDgt;OxHeA{trqAfbbo%wF49H8)}wK!_%usDVO-O`p3u)1|4fCji~2%8S6rJn5C`zQ zacxdd|9X#n&de?{#L=EVvx`j8W7W~@>8W8nUtHTiJr%tDX!cnm_o!Sy9sRQx)y?9> zH%E*G>BMc~=XN;{A90f!;^%r5fL~?uRPn;yoM-(!vU)h#5UC^ceWj$~~F5s_!eqxV`A(=5{`D z6;C<*=;!mViQ%Wv^mAnYzZHI>mg9OHxO0wf5iWN&c%FqXHU0nGpLLvJlOK6J?tq_C zi=S^z`y-F*`t%t7(ejf;+{^>~)I*0pK8AgJ*yjbgUb|7f4#ZWS!+N|z1w63NeS!@a zqN8*NuX=|04`}yZnm^Bc6?k9pvM~H0&KtlBBFs0#{{Z4D9@h|V_YzLOxEc1jue1FD z_%Al?vqS;L6K#K&_A|7$pL?~Rci7Kd%DdV|!MQ5SEX@&r3H;A7`Oo7p*II~q#E;gm zo{qs+!T)~bLHl_R{96m(2fhnjkGBozgQ|UZTkLa)A1$7LgD`F%N8{qr+Uvv^yc2PCT)aPm^RMRvdEikC9}vUOEiw3A zG5Gy4_^cRwaSZ-U48E4Qs@HX6xL*2ua$CV~1lQw$I-e-}d~lryC+#Sn2To?@){6Mi z@~q2E_th>}`%eJZ{yW2emW5vu!~fMW_)RhR-7)ys82ka^s$b=8qaE6&pkHl|VgE%8 zzBdN{AqG#NFBTdiOXPjZ*9-c4hHb%J;5lYgLgax9a6N9^PW))?GByT(Fa{6C;7eoh z=VS2IG5AK}D$mgj+M$gOXLH*f!~ReVE~x__t-ktvy>wFTaaE7Ei!EHAuO9=~@#ypW zQx^No808)xgP%@Z9YDcGPihvv6InoffX+{}5cqe_4!pu8YC7f9JH? zdAlWs{XH@G=ooxr3_d3Y*YRBCuN}{l81^s6;I9!^{jFdv?a=n6`B#YdW7vNZgMR}* zCGWBy6`$G?Xn~4Ixf3Ijwi)@p-e{%!UwG znf%CgxuM#=Z*BVkcnN+FN&DGq^2SH3*X@FRfo1)0KX`ahZU636Ro{jpFqnB1aTbER zF0O4K0FRdI!vT{Yxo&CD0+A{=`j6WFyAZFh#({Y>A)(EQdCnE!<#+Ru ztAEd7l;#1pe;oGf!JP}}0HlqoZ*HH07ZkDm9(2%Z;w`D%yqB48f&D48psC_1n$I)L zyTLC2&%2ykT>Bpk?wnMcKM0<43&-CbepZ4|c+27lS*GXVL}!`+*0FnZE!&pLh#uuaf(?y~ZKV7hzw1 z4*SPhMr;F*stXO;^mv|L5BcoJ?V{sp3SQQb>(vM4-T+?kJlhwb+)?0p-MGHG+<$>r z4Pnm(@UvC>*~6B%!OubBs$Q;{T(4Z%=hjzo9=Y{4d9n!a<#y=-lOphf0o)=>;C}{j z)vv-UI8JIlb6W=cK#=ppe}&i#p0k|e)b+AAU_VvgavpR(+YvY09sN+-U#fXCE|;?^ z#4zyiom}Ev#4`;%swRrGB_saT;Cbh8y>vg^uX%vu(Z^#J4SDAAdl_?mTy!9=@=$Kc z!_}~Np2rcMfOy7&2Yl@3H1MV1MfY+0u0Wihf?Mk)X<=NITXHtn7taHg3e!JG{>WVCuV?Yk05HuH25j`gyYot|B$#UH`J_Tk_l&Jg+r7ej0xK;L&E>j*}73QsS!r2gY;%?*;n} zun$zQpZ4H8z;iz3{!fRwx&1&~)z`U&^SK)SFQg?-#a(;ZkM6gR5?A$&Iys(m;m1ZD zNpaUr>_`6&&*|XKQ`o)&_C3I($QvC#=5{rB3C90};CE?1gE-F%z#lX@Ueu81VIQ?| zxnuF(x8NmeVT3k)T&GY2srbWTuCI>gbnt?P?B``OA(PY8bE zo3VdaDaTU+`_sY2LXJo0Eg!rH=TmxVZgev$+Ke%J>v{R?Eelw(YtEv;6@FPI-hJVU_4?=mk2pAB9$gWFx#D@0tiZ}=hRr@?-!$?>9w z?18-#H(Fn{^P4SBU_a51*s~j-xd6P>%g2Qt_XdMI`*R*f!hRfh&i5S8c<}j}WBk{7 z4ue-A|M=REc%QiHS590H>f>=Q?29htICJ3tZzrPNdvpHz=%dF}h^zV1XX813I-<<& zO4x@lWqZ!H5VwFk157SMd(8kZ!u3dZ_z8eVzpmXbt4t1~8uBLW%Ug1}x*fj+FFl_5 zIcS$GY6#W7WzE>~1n@54Vm8Ow6=hrlo_h`3bFFE*2=3Y%XIk3$V`46NcoYL*u^ha# zE7vO%{@>O1GZ8=Xvj<$X<#KiVHa&^kv7jf9553^0GjUZf=T^2KYvVVrHSK9#YaU0g z&&#*LzRVSG8gl7EJP2O(6h{s>;u+HqT{q3*a&Ti>87g&Wuyg?#(%#&al6Y_|fK*&%wU5XS`_{k9b}K&$*A| zr)itHeHz10qt;w*InLvmh^HHIl?RuD={bS$-pR)ZoI3Cx4yDs5) z)}kYRO|A2E;RcZE2v4aXV&j{QH1dYu7YrEW0MrjM_y!Amb;`_Zr; zr~M4&cI0=3SfKqp!{j>HZvro)T&N9c7W*~dzWAfX zDY3Na^Xc8NcjdC5L$LqQ=MOm1;K4m3EG%gsBB^VSug=>VR)h52XTgTQlU zupgbbk;GLVoG-C`AJ{JfuS(`T>v_=^@Ke&8)@2hJB8~{jeka%msI5aXc+xzY>02Q`wI`FKmH*-fbM`L$Kek{a?iGdpX996Hn(j zqa8WUY_$7z;3ea^UgyBi81S4B`=0_HB(Cz7hv)G)Dk0XwKJO6QbLm2C19xHlUb}}b33{pK4RL#X$^T!`=7x1 zc?s|B1TV1EE50MgFQ#xLb6}sXxn;fG173o4U|rvV;8D!;^>O+*cmV4aZusA=?Jes? z7kfCKa`gZMZOdSP6L`+q%=PgynYiko;S0G1U9evadl%M4b)4@JSM6SIaQj||{&U6| zTyEfE_CEo{Yw}Z-f6bTyJ(kx$$&> zsN*qbE|;s1m-E3(k$)~-h#SG9_ptrR@Z%${`cGg!AE!D$kHbD-Ip4hsUT}Wx{#*@i zomV%aimNzF)B_&0tu_BrJmAr{*^iEMEO_~uOwwULhq%gT(MsmU;1Ss8;JkSi_%`CI zUVj_O_0r?vx3G7e$K?)!eFB|O%yA6!)pGFG#8v!7{rPxN&mXJpdhonO>__+8dx@(! zT?6@iq~m-RJeOl_L_MsgIfJd>8q{oxdnxDw_ z{8xyl!OMM|Pkp>>C4RJiD`~(t+i?va7q=r1r-4UXuxCB~_X5ww_4qZYZ>h=gqK1^g zzN}^KINt`ho|kum=i$2GQTV#>Z)h*|fEjH%4+Fu&mho*Yc-~+xw*maD*Y*!F$LU3E z0~eTYw1NFT@SMjuKj(s9c{bv?srLAAKXH}ka;(d3hy9DNFYV3!=VI`GnH(=_$S&BI zY-IcA^hA?RaH_q+-*G&5;4>}3oqM=m+W!UMrGvRYPv@#y;_j$Dqj1oIYsyfgw2;JRM>ISstZav!HJadrF__;~!( z_bdOY{a~EY>6rvxWVv7Vl<6l`MDd(eBf;Bx*q6294CwR1PSc*|KSR0P#;`v`T-8@N zxW2kxXHv&d?UJV+h^38Nfu0ipxAvb^;N|K;BidS-f9dfaa3{vSZ16NXkX5;5FLH}q z4c>vcnIHWBN-ps0iK}>=5AyMnY2!C0!B4s1_;X?Z33!?1zMkzo^k>|!)W=JE;>v&S zzu3R-Cl`X3s|WdL)9pI}JZx#-1>mI-_HzN^`4_mr`AFxplDG>tHDzB6o_IdS|7W=! zTN(VRw!~HZ0_*wOe-H35?iXx8A-9^mW{JE%2KG6pk}ui@AkQno16w)IZ`#@Z2XO0o zuzoj=rxfG7j^`}!+`n;#shP}e0C-MI=3ju101w>F`PBJ;n7HaEfu}hS`aBpSuKHC0 zuCH~uAHq-7l^p-I$lG_|uIrgMMY-`_j=#XpT#wH!H2;x3zYjk>G@r}y>+$C%@Tw1( z>v(1pSLglcD9&>el)I9+ia&fIm#fF0AK<49<8v15PwCF~VwuAvF7WQe&Exl3F0le} z4gwDh;s|yAr+}BtVy?b_qPAt=(KZ~Xem>z_a2MuF$FsROzXz8aJ(J7Dvah%ayv#CB z8w(z=jC&7)7h#>M9{fK~T<-&!@||g4lkk4}1sqR_deE1)3dZ6r;wsNBTsOJEuY!Hi z9h`qkySa@4FP+DE*8MQ3dHs0PPR}de1kah7Xmb85#24U2-!swuO8%YW%)#|FdlTY# z@RA3(+<@s#h%-!%7d7Pa7`#OLf0y&{+6nxjr@*6F?~Q}6_2A)yNhXotUxHWRIphQQ zKzdJ(zwAqn6WvF6G~dlNx($A=Fgae-kYTVd>X&TNp%{N2C9c}bxt$|fjsCm`_JNZ* zpF00d{-NSIa_eC7WKs1a$8#J^E+Ve{2ke|5u7wbjwLRvIm%zRp_GQ!9QqPlHUC4O| z|Bd+^*k40j`7e2o<6id6F1Ml*S9q-^I+c{_TmE0+bQ71;H7UcUjsfByyWl9TY|pTccmb{# zQoy%s`%ErZuN$0v8P_ZNEoYvOJ|VghH`})#=S}k~!9_c^*Z%JX4@8+S#{l;*an&D6 zM%C_DOSPZT?EekK`I*V_qJ|uXeU4?Fr~Ty|r!$vZupd5iHE~t0b0C+i=kue8t9Hyu z=RCB;_?dDA`^iPU2BUq4YmWXi1^y?4=bg)bx`M9(4?N8LS@0jg%SLdVUid#HpUce| z!+976`y0V?hq1lR^Ahla!QAefVgDs@Ro|*5Twf=+<4Wea6Kdz*MO?M73+qnojru2e z8O|4O_!$CT-UE394}j-co?CbUJa;O`zXSH~fai>3Kl*t84!i{S*{M3_meGsjEW!Cv z=ixl!>NtH-J-AL=y7^a#e3R3>cMR9J2ly@U6TrHwE_X6`ndSWZ6nN3Kwfp}{?Z?vY z9}zdlVXOn_c)o>w39iR=x%IE&dKI9)dK_y5UWVreJ8_ysU+};TZYe#VTnwJ~4Ch(* zhu6Wymt5l0$isf{@MFyNah*vQn5sV%S=JjngXdhv_I=TBM}vzGnb(8=8QLDtEpRK) zdLg(I*I7BRe;Yjad(JZ*p60d_Ja0I25BOp2ryIAs=Iv==O2sd5-mee)ZYIZz8geD< zqmOXjw0#kHpbwXOAwF{_cp1*uG@P2-Oz?tSZYVtttOO6^c@ORX9c_<^KW9&fJ;c@V zTY3d&tTFt{Yf&%UC(`rJR>W0*3tY@`mZDt>VPA&%s-C~yYjQZPAyZ)=MV$KlvI_o7 zUgCPaj?a7r`zk!Ys^d?%j^oM0c(o4pEs3jkDXqtGHV3~Ryu|XH(rEC!?%dDyxb%d{ zYXpwn7quU(*WCgBCU}mYg}0^7R~N4(4ws!A}?Pu)p?kS4v#9m%#Z&kGIQA z`y=CgI|i>JZnh(yb8di-ru9ZV=X1HbzvU8Fp0XYhfa0iLs-%hlu9 z?cf6E1wGC`OkBn3!hPq{;OBMNTkogr)qcwPxc(8xMN%Jbukh`BeC5JVbK*4n0EY^zQ=bX$CHQqP$$9972vs3Id2ES@6z`7Grt)8CGdhf zIi4TEKQ=jD)RY0-KclyCB)WZ1C$8G11mCZ8<1^P0S9z;y5^oayeEV?lJgnQ(w9VWW zn0{z}i*ZcP6JCaW;0KOhm%H2K_;3wrFp$fQVqNzfyw{YtI=-To=kqUxeHh<+ng{#A z-~rr!NdO;X@)`wVcb>K%!Ew@Q#oU$>SLKE~vxhb~9xu9yR0OdN-?hj@(+CoYrAlbNq=g z=>cAj`;U6uyBa(i$Cmnd91mXg3iC$rGY7l`&t0?u-$GpVt6Y5Vsf7-05a-Q$Kdv5l z!F?R(J$C*;7vg3fuI2GxA759%zRbh%w1NFS;NcHBKMT=b4}s_Wm}ENE^Ref_OJ{Pq zUm?z@$#u{_>jB~_o>JVu(BoLW!CbGr1Kb}z#YftJS6S98I)l3~{$CFJe`xzhIi6jp z*Nxi$&CK=qRtg@lT!$_OFK}}_`g<#@wIAI7qSL6keQI*Ns3H4d@4|Sl%e4UPeX)=`a z@5FkAgnbY2@)lgKo(J~U_Ll3T$>4dof1!_;XTfvNN;W-f{snmH-Z+yVk8&kVkj(MZ zGC#i>yl64UL(4DbRzh4~s{)y_7WQRJ*nSrZ-mm>*onQB#)LV|;E-i?wJcsf8i4%pK z4=(V0ogTM)n|^5B-f~@B1bgQQZZB;=8ukS}IKWouw+q3o-)jql=VCp%9pc#n?wY~J zuMNCf^D~+2{GU3E>m^D#9z8$oMqK5;0Q33zaC9fQ^*;M7aDn6Ze3TmjFSne>_Y+tB zxo8>3qvx@WZ#{bcJDHr$r`@?7PlEsc#FZcG^E|U)AGJIm{v5bY$zgS&2H{~WCleYAZSCP;%A0smE)N3BGhPr_cT^gE)79=U&CUlldtj4#Q7T374zqZ)tZT{%P#l1wTE(^B&=N(!g&4cVeD- z7yLf}US_#&dIH?Fm5+DouI9E``?;9wrSo}!xT;stWYi1xnN*Oes{{@(z=YUUxeHr4U<~Fw_;H9&;Khy_*6+9RB$2EVSxOv{pl^FKWo^uy@6Af50#!z9H_aVW)Rf??L~$l=Q8ke%keUpxS0o> ze|5hd2m1oc{GlB7<$Y@RldoW3b|vRu$AA1kIZh|O@67KCaW-+)UV(w!F5NJ|t%H5h zT;@Aa;V5x6pAX}?wM_6su+QDXo~av{Tjsr7ZeADe=jS0m=MY!rI`RFTblCTXeHqs0 zb-%hBJa8@7Xcz1sgdgkgA$$z`5`6FMWY{0p+|s@$-p6s4<9AVx=d_A5h^sio4cxvu z&P!qMtmJquK)oh`ms+kjpVYi3=O+UDSHa8CZ}m8^3%m;Jz2_nR>=KSsoXznp2k)+V zHT!Q3-pAy4QA3JNPV<&&Y_HGDtB9M&FPG(ecFSp#E`Vl<*2z$7%F*|BLijNmDf&0HcUOJnc#^F0~ z{2FY3DRDKH09IUjNU z--i8Tn)l@6ZaerEaM!ua^?d1EAN=FKYBR*&2Rz!0<2ez2rh=E?ey%=W%mFXh;V>=r z`12~bQ*s7Ag`aKUE<7hW5j=4$`W5;=_jVypBd*Rn(H`6r^!e8ddl%+u*TK&f+K=VA zlp)|%!(^>EeVXIPqx~_zw|R{mS~>Zw35_nenD&7uX*LFX+lO(*E0y zLwz?fZv*>_i7Wrkb2y(m4|l`96!Qdq9QjR-57&?~_{qaOr#0S-YCkx?GzD)sp5qCR zPcTVC^tT@1(Z6#%YdC%4UU277u5TIq%p-2bkM9k22j2_(qQl%DT;Po+aJi+$%=LM> z1GvERW;$;@!OJ(WJ;D*g!1LB}oZ9|j@RIl0p5GPXMetn2(*W_j3+}v%Ew%kY@FXmRoQ_9KTVe{hys|f-5mDT{DT}&z;M8=n6mg5m)`Kv<=6z6dmFj*yrIn zhqmxj0UkYx`}u3|BPVlx3-01_8-crst8uvCDbCNO@N*ID#eBBc=gk4IkKWJzkB9vP z*tfTQ4{HwWT{sWwzO)qF`hCD^@PeW2pa0U_e+tK$^A+bI3-RZIJF&i`{a z*cYwmL?)wMMuL~)_Z(WHUQZKO{ZLr0XI~|*+9e0SE27)|1MLUj`@RNcXO?pOu1ooN zX$js1+}fWDh^zit;OG2fIwS6Zy?BJ%i@gc)2zWVuFH7@P;5j3>zL;)`E#OYey2nBA zFzz#^AkN$eIG$Ym?oc!EzThtWes4B-330Pu;dg{E+=?J^l{f3ST>&2ck=s{~S6{+U zcq;S0@Si-D{a4{Rd|h7;an)X>c)rUC`#ji}VckH-GYCBQIQEajOZbSp@Y$LYfW5$c zPv>U?akD>!+0Sl#XdmoLCo=yI{p$2-9Dm;9%nQ&DdxD3nnAeA&>%mKKAD`b9Vv@;g zM#%fmYkNFzuj};@xb=6g_JBKAaVBp@&|9ilXYX+AqzULATfS(6mZn^He4&3_ta>IzL z<7+m4CnObqMiDp1+ZQ;)jr2GGKQ3Gs>vsPL_M!tHkNW#2>2%?v@)N~6r_R3zyr>cT z?*RY3!JYV>8QpJ(gI8_f%*;oeQ?wsEmwq(@S^-|Rob&00ed2>0PeF5zvkA_#O~Ioh zIiHnimu|$>aTLC~t?5DkE?FOKZ}~mRDd6S!UVIM9T?+2P^<5W~8wD5t^SU3)38azK6Xl!g0QW1E#?ojx!hEBRCWG zxx`hu)^(w4U|)`PjIOZ1gShG^1_kmk~_bCV-Udevmh5hs3xwya90sJ+S<3$bG3HuzJ7cR$p--B1-_Xiq)H=fIJ zR^j=yR^UCr!?QWhUBGV!FB!{u7>@c*29M6*`0oQRBd*%93iCtVj+;$Rzn5aUuG|Yh zd1dUs66H3W$8ieWr{JiBXb)b}kn>E_Ds#I<+v9nDZ9fCNYA^e5kN&d+ya>;+>v8o9 z@NkGdoTcLlAa9oMIi5~j^*1M;7uDrn1p9J4kJK7|Zi0Ql^4#V)*oU!xSPJ`<;8j?^ z#_^)3skcaDwH1I1l$GrMI8^19c+=b^E zxOPG;CvNtK*Z8>5zYBU8_Td26D;55adyMlOzsMtgk)UJ&H?^*ZPA3%I^6Jny8>Yu$;fIK_FK z8GU>e5m)^x58vz2^&JiS0Qz$y1XTuJhUe4zf^R0S@*KeLbDjn+gIsPo)@O!;p8{Tr zdD>6MDRHx(Tb>sk4Erd?Rc${GJbVu4p)33^0nbTdKHtu7yaWG5Xh)rgy|6E9$^As1 z$Kw}r`~h4K>T#eec){{eB82N%wR zoxp#9eW~UCb^Ario_g^-KJIjT{hhdK_uRwrrUwW7+yw5#_Yqovml9X;M?d7q_4n@{ zhkYKN?`;D6b>QIw_Ke$*;t+8aPtiDzClmG!7jryeTrX6{@f$tCOEz&n?}7bP@FJY| zb)KIluJTi&et3;Gou9R^&n@8i&%p8WKDcPkdC^_@3|>#N7Bo8c#bb$gxvG2miRlIg*QaqL;}g4?)U-4E9hSLNou#~ym4 z+ymexcz&-lc*`d^{wVIh=-<`s0q#1)ezgBS#FhUdoCk5Zi1FI~%mmZ3KE9R{uZOZ~ z%1+pq1-M>1Z)s1WU%9#521w9M;;Mg^TE6%93b+&B*axc(LT0U|39VLt^p6=cLD{DyBoj@e&qgxuN8@j;9<;r+prt47`()C zyhn(u`UWiLh0kDL-jMx&0YCN1xL(%haN2@9@8y1|$G3~YbC^Uv>6zXcEAx#AS~F9t8cbM;q)KR{fSn}h4(Ebt|;FS5+{ zwt!dN%EycLvrlu}_s3x*>OIHt=U`r;>wBWfQCJP>0(%$M7!_7B5P4*Gd_@Dwnj^EGM{V*}aahBnCL^baS z?p(*jK>z6hUhd#>d*cLoD|i*|D_x0r9xypx)Q|N!>rA;H9^7 z|Iz-x2N#xgNau2{SCwU++#1}8-`PWYM0fCj<#*Wn6IaK(_4i;Wnf5g*gx!GlKY;t2 zK8`km=kDRWWx{?tc+Mrvu^b>0sAK3pU$Yc1aTQPW3%0)lZw>~p!tWlm248FXQQuc( zdwm{Ee4g_ouHby?IL`ogm2hT?;pgw*Q9Pf(-h>ze9>BVNf7nkYuHwvF#g?a{|Ez|6 zF4lAO`q+oC4`AIMrxEc3?5pnOIPZaWUXTEx`KP4J}$bN97Z+d8rVlI>!?2M$8!Jl8{#TIxzo5_U&Ghm zUtlhd;}Z2c@H@oK^HeG4Q^!*UE->B}!cWr|mHm;M$K=$1@SGb}-`p-EuJRVZeK9Ba zjj(s-avpR)Spe?p$9cXO_WLzIhvU@q%;V@psp8MQgZZU!lm{LSaerF}Ka+{8{1mii zd%d2Y@v@4O*6WtnKF^*?T=_4v%o}@x=ULkKX7F;$_iOF|&&9l5*LNX!37&u6hYnh9 zas*vNcER3>`B(Lnu&nKUa53SG~*S{Zve+6D@`Q5hqbResC zwEq4{8}QPnx#z^e&qd(E&zw$+=5{A|!18_e>EPDi5n4iA<);MwEggQ=!ruD(Bp<=v z`un%-A}anPw~L6Yak9Yjd|*G*o{rN#+(RzJM~9pC4e5t%dA#ZbJ{k4}pK}i%2mUm8 zndNu7)|vdscs?`z)3|M!--=h!AMpPVUX72o1kb}b!=twlL&3}9xqn^-`_bSzxUZ*= z$A#c7%kvoPh?~bdo{P}=-$Gm+chPCJ$L%lSC)&$lmZ-;D=X#Dm9N>6nBAyFOju$oL zx)}Uc__03sI0;->o^M|S9<}`c3md=-aQy1={8R88%!_n>#J`T-e;S#b`sX+Cwd&gq zykI%^AN~JU+(umGGv|G2+Fyq{PlkQq1okrpJP0l<>l?elte|9E>7 z_(+Q~fBay*94L`j-{6uJ?fvbv;)jvg_^sp5yz}TUGsbGN7OTe3T^LuCBM6hXb^UL`_>oU_EZP@=$Mv);z!zbMPNMw*;3J3LU64zGUq!g+8zUjzzJ+k1bMQT* z^G~9m8tfo@uWz7z4)p^I=>HFBUwrXB1$iFuWBy&=YaQ~}=Ko~Ec|0q~zkLwe??(GL zU!n{=_hsE*HlAk*jxT#Zt|FY@YY};3_r_=MBb=YxiSxF`$37?hke-kHBJ2Oxz?1%a zNe_0;?&vS-do7)+^IS&%X9F)jN!$O2PDe6JIFF}z5AE6X{M*oexl7xVx+wo1b~BHY z_#yQF6M^p*oW}nKMQq-lO*qS`8sb()x7PyiI7;dNaP;#L;JF)gJT^Z+lKu}*I->er zzeD>aftL_2<3awm-P?6N@Db$C=(m#Odxk^rHM##=>;L{b zPPS zkA2RUbvzx<4xf7=;kMV%h5WcwaNih~{{Y(8c4+%wVqv}lJomkjul@@7 z@-uZ`*nJ9*`A?mPr9WyvkHK@#2fhOThSA{+@HND_4#9I@1w4V=??yj2Tl?4Rygl^q z^n;%QUxHuSo_n{iU|m2zPeMOO0AG#b&QBnm*FC|xl>xNB0PQ!R=jd#Z9s)eU`KCp* z|19tv^7M4olH|LD^ZF*=SNV7n=w#+Y75W(f z|JjfC{TJZ1%R>6U8F1 zF9n_h{n&S34SWQ+zIBqU5zc&j?b$j%9eBtOt$)Z_kEI`ccw z&tAg0{{i?>9|!#Pf>Znm@suL)e<57f1%5mm=MRBz{9Y;cv1otPH?!ww8{tgd4IHjG4M6mx%0qp z6dZqeKW?&qBD?q}z&qh@+>P%X`fVL&$G3DQZM{weK7jfFwjcKZU&48l)6mbQz!yu} zPdD&q0w1|7a|4*7l@+JB31UiT5mJEP~jkm1bpIq*82Pm9Yx0QfTE4xQ+yAUOW; zeiRAk{yVM><<}Vc>AXtm#P;1j-~%O{fwR!pmB4F|3zq?ZFYu8Koyqru4!=t{KezUp z@VUQ3`{ZJsx1DHzBso&}eHRhOzYYDL1ibSi6Tp`uf7EkoD*E)SY-Q+Ft@Zz9;uZz}I2#91i~TZr~lz z>ulcs4S0^;jsHDJ{+lE}TURs@Zyrb z@6WLAbA+?JSVbPu1Mu7{r9J-eeteE_p8wqav}fA>@~`VweQqb{R#!7gE&^VQ*8NSu zm!MZz{iRjlYpBcdTJ(Pl@I~-R+wZ>tzIuedm*MyRfsSVd@wH3P&+&xwzTSxJqcaKT z_gcX@*#g=(&`*4S?rVTApQHQw5orHe;I;4Tx?FWv{opsim$2?e=Z_%5c7a9*z@ibuZ!?c@7~K4ASse)z8f?}+lFeu@6Ci|!ZxKfx&<9`MDF=z1-p{dK@Qkk7BPN_n<~3%y~#pMv(cp#9P} zwPg|X{ILJh=dMQiNM`^a!8~k3KhF>xe|SHhZT&z_orKTcKseJ+@+O@JI~V*uv|mSE z=;P4-tH4K)Z!-b>r@#mPa5q7&06`r2V}0M%MCa#Fv~Lj3^SSmeecwgk?*^WGn(_^6 z{{`#k*NU8p4^IDy_Oo%c?$9USMLQY?UVDf3PuoiVy^e5x-&Ne3upRhyXurIs?XLxX z8}N}Oec%)I^^%i*s?Y6QP`&{;c`D(&z8z6q>uhGx#z(=C{T#opKK6eSYjc1$Tr{7CPX#0JNaGrX`i#`hO+xxW3;ffhRLMo-@$?ht~eOaGvk6 zf$?Ks-y7{u1m1Cp_G9$0n{eKzBdKN~prYW!*e{S3^6^Z$O}BiHIYzZCCvE8#r; z^^Yi>V3^5KztM57AU0BDCLlh0e3h=RD!U-{3E@e*O{dm!7WkW_2Au*QWpP zqWwzbXZSPlHH_2VYuo?o_?My2n;v)}@WnqUXSgrkVUBPfXUuP33%s+bABf_KBfyuD$7tvK zo(FtwIDD_Gf#&oUqt(X59s^;9mcr$3i~Nu`0Pl$Gvg8js&g3H@UwtUy%va+)$&-L@ zzz<+_SOmU=b8xngUM2n0dZF&|qcHwYpndV1`d-%lyTCh9AIbW^4R~_8uCKL!)E{-6 zYp`oxjsDLhocBdX6es!t+UJf`zVux%n!Ef-`>9=_^k(z?Xu-V&!LR3{ea9^!-`Gbu z)93m^NT071oc0Uu)v|r}7WA|D9(|)*K)2sPKb^44j>2>Q2kqCMpwBh=e%haP{J9V6 z{Foe{20n16j_1kf|7zgNFVgvcFZ%xi@EY>y?h5?pz&ob2|DOOq<}do(4e+refS(V1 z9elvnYZ~|x;%-L&Zzi1AE57gPvHz#@Ifr{Rtp8I9XZqYgzN__r5%2-fr_IB2fUjPs z?`!k zNBb`m&g(UT`b*Qmdx-He9-n6^5iaZXWu1SB&*XsM__FuoWoW+w{Sazbay{@OANwo)x$CYvo+apw&%{TU z1Mh_Yq!aixg!6NY-%^S2ap0c-K7x3hu5yz682yZl=zAGGA9bkC+X(z-IrOuGaG|Rx zZ)y^F4)+sXiT2L}zI36^!z||WE$Dywf^c0vhV~m#z4xzK`)EABLi>?tYX1XxZgMvr z|03*#BJf8ME_4{>v*m%WzF7(336KjX1MhgG&gavi811t5PuJ&Og#IUiFLmmC8c%qh z^%Ln2KL9@PVx_mU(a&QJ({bh^`)eogfur=fpT{_-1-F+^e_l>F(?eVr<%8CLRBz`C zz!!0^nbE@$cRwUE-||etc|MbODMj5EhRPi96`bEc6+?O@;k+N$qIzQAK>Hf^MgNrR zCdpr{Pu@5T7`1Lq5CpUfUzkn}B@u2?$-uYf#-xs0(qwlTb z>A<;_eZad3=kdh#Z1f`7go?U$l_ymtbR>j&P1 zepddX{oDu7{l2vK29943xsQ$~2YcV<`AETA+dmcU*H6{{&p?ys5zgaZy+-MO8sq;2 z+Al@Ac+x{Plzj|3Ut?@qvFq`#3-UoFldU$~|>FJJ8Q8 z@T8(U1?oWZQs5(~51>y^l1~9&f2^)AnUnJG4}{D5{;STz5AnVy(!n<#XIy{#9N^1Q z-fUHHbn5;1Alk2gPDk=|5aO+bGhbbX|J>}0-?r)JUiZ`S#P!@x06u`cLDNz$65JaI ze!U#+JE2d`0RIH=;>&fMmjnL}@YTpJ_+Q`~IHzxX_`dho`CNkDV*KsVgv+`=PuH=8 z{~jPe672VMmKKMw7$1-|-9UB`z2|0wVT_KrS1N&W-)`guwZM*oM< z0c0NM2|9s%r1JB*A1acwz`6A&=C#&$E8=c$=e4wuLZ~WnQ^pn7z{U`Ku*n@Ta z%T?{4$VvV^fNM?{f9d^7wD-!bUYo<+l^L_1wQfxUB?pm^G?EL|6Zi?Z+7UU;fSXg{%Z8I{3d;_>2DtbUOP>3 z<1@ENKje49c^T6mZbSbaSa<9Ht`F7m*C02I-=0i3&*y4%Pgx0g@!D{n_Y=f+n_K((i8^m)D7>+t%@5VfQl5iep4f>Mpi~mIX z#mK+<$iLThTtlA5fb~x}ulok#;|coz0O7ok7IB{LQE2}yYY)5W*}(7h2<@i`KZ()v znj8y};vp0KZ5$&rc`()j72Pi}iC#$bXJM zR>!}Bc*JMW{)xahqWqjD;j({GPwcU1|90zVRd<%vHTtgLXypC49qns~UmN{*JW|KA z`fa6vu3hs4)Uw5>@$E+XtKMw^ze-rQo`7QR`Pg(oDx=-iO|INS$V2>O9|3vWC z@%$0(M_#7=T#6ch=8w`rM~Nu>Bl(?h(pYt^R!HqxHEP zIPW=varO|-&+SAU(EPDQv@iaD`rOx}{iOBt-#QPk0e(5~5y;sB@Yfm+f87Yi|6#$= z$ouhq!g)Nks6N$7qocmeEd8>!v8M_H*K9eAS#^!kn_;R;S z0=(mH`rOxIejZP_@Qujt zIu1N}Rj7Z?TR+pvPu_;{Tm^h>Msbiy@Gldr{N94`Mnkq-?#O8IodDbepU0Y zE(4F_N;d%CK)pxne+~V|^%Z{xd=>SObyn&A>uoyDW$16lAI=88fqF{U+xh}8UZ6Ai zG~mw#zJj`WHlDXwKj4QmX#W}DBVW<^G5zOvz&mih?+mm*{v;je0OG|@2ELnc-Y*@m zR{F7i_M&~qb98;bgZ7sJPojFNR|8+iIgVkp|2X;|xLo@;yLAoi*Z!jY8-KV`OjqO) zXnzy%4eX0C;Qwv?zgyo3Zi3{2c^&`y-)ld{2Tldvfpbr`?lr;DsrTcBXrDt|`;YqC z$$No!!Y)1!-}xBu^@z^D27C?i#|PUp3OdeC_9=Yg-iMCtYlFoGe$?aS%UrxVWm zbl`#dMhoDdzePXm*e~|J_wUl@E`CCh*MVR40bhguX?$-F;mlVDmUX>sKBovrh%X%s z{dNudS&IDIp9h|c@j@R65l|Av3m@b_sC&&4>u4tx>vT6ay79PxPc zf425>9@?KFIR5Z{ya?@cutOhkgnsx{!kNFVK@OUIw1M`kx9Pe(27LA5r|3K^A;D zOLU%1&v_K#+bqC;te1HK+66 zfpxqQc$_!&ZQ#YH>3o{r`(wfVk?8M#Li=_21C9P4bsF|5_?7iDNI26;$GEoC)udx? zzz1N*JsyvGHQ`xuc8ze6cTxTJU!k96#AoNRj`teS=f?G&I)Qhf4y199-N08*(s{FS z?ggIU+~^?2`7+?~{c&#szEad4&PV%i1FuErvVRABB=VO&;B(q$NwRW|EGfE5AVm3 zXXrSWkc(0!TUp-3c)8bi&?a=WrBA+~m_KzT( z=Q)m}ord-Uu*=A-kbf7W{lNd|Jda{L4Z``oR(_%LU~>G8);_AY|3Tn6)Ni--`WA3X zppxgA{`qI%HRQ9MfbpL|jzJ#(>Wt3M7lH2vzJh!Jo6o(1qmlRH9o7%^#s6%*z5zV0 z`}%X>9mu;d|H%W-!gwI3?7fP>Ymo0|?>xuwQ*^yn<>^WCHo|#6JEAz$H_(3Nm)i5Y zu`Y+5&ChN9cdX#F-y=I~7x2~S98i^Ter{Zk>mSg5y{0o`^Z8NWosnF7*f}~68}m9& zn}LUs(GqfDeEVe+TdT4&X_2PT~887mtykwgJ|D5sq0H>oBX?(aGvMY-|L(H z8}PfGtMj&qxSP%M4&WU)|6=nqA~*)&{a8TzC9J#k^B%%^oGZIRJ>hfK|B2f3kI>hT zfG@sM-**}K?+F+Bytm?~VL;#6spDUNuHxNj|0}||eSFW_QM*7V|E}vYg!X3>&f{E! zUVQ=Z657|`N4*&MOMtJeVw{-I_gMdt-SKVUOE@pD-=ckg9_Ig2rE~ND9|wHkYs&Wq z5zoC4cvW~Q1-uXVB8`dv z*?20zi>E05V$9D=2$y||^J}(G--`AFpVj^s(Ekl+zXJW-^p-E7{aSP$>V8ks@fWf0 zFl|W>;j-VmlztHQNG8#K{qc$$&v_Q`m8j0}Ypnfmb>4o6aee@J5$F2f4E(6`bv&yt z)%Nd!U^|O&9#4EPObzYVPt|!dzVSxjHRRu3i2iRRJd57Gfc66q*7y1`+J6stTo3=x zz&oRS)MJKq{EP6vZ9_k&5H9oCuPgpItnW9`z5{x%(fRGbN6yjl4)O`QC#NkPuB4a{8H&~9OLW) zz8>X6?jfA{%$uU~O%rHei{c=Qz&pRM^Kb(CzXo^_d8)RLz9{_@AIAM1=0E>F+IQST z`QBBS|9d_~#~;V_P5?dvJ;&&3l5n2Sjf+Eh^gOiR7}5T1p05VJa+1#QAjbcB!kHdc zqWH++Pu2cMuGRi+{GGs;U|(DRClk*6wixAGo+mgS=KZ*YaDMJc zzsqoXH~t5%E_r{ko^tNfcGJZpabfpG4B3Gq#P?)!l+SM^PwgMNP4rk}@LoZbJa zf)gFyqAR!${aj#pq~Fd1U*4hP-;4HdZ`1!r&^~vx_HXj>7liXZ>WKV5e?j{t)Wfv* zeelzG{6r_0>Hc~up8Gh$xu3;mxL=-t_RF9L;}4fu`^ew&5^IlqX*(})HSpZ3K6eoI zS3IF6FPuKB}9IEqn1isJ(d;{{!Xy5|iYu9MQ$KkneAe`x^ z<89iH=>s3O_E<0L=ih-Bkw>uu^R^*4{_uWuJVVF19L@h@fv+R)(e~qcz~elqCh%4G zbsvpqyi;)Rf%x?kXkR;0=hMdjE5mUf(EM-PN|?{+98kSzrK@Y;5gpIcpLD&m!qF263+cE zU8(&WKcBUJP#40+`61vNQN4&;f#<%X^frqAA6C}!bl^Pc8-Sk*eB&KDo-YBP1ik|Q zsy+ABz*nRA&OZZRM_j%Hg7_lvSpWH%;CPt#<4@Mltvdb$`{MXf?CTHc{H)_U=Mye` z0P$9vw>t0*oNvN*Nv<^<@d%@+IQSn$2pJjJaCN1)B5l6 zg!B5YMSj9*X;1vNNB8d;P`IxKzVU0F$j_n6?*SjF>2q&`|MSq-+LqQj!C6YTi;JvKgj<#Kf_^D zm`})AlSd~2UxxqF=D!4d3HQ_(pL_-3!Vhu(qwVXrqWucSY59R4H~gMD|1ZV-d`J2r zI|X$lte*|SnciwRS7rR+m@3APJXLU^y{`DIel3Ic}QQm-1Sp^EIat z&ir%n8lC5p@!%H#UykxIUM+a*bFWAHk=N+@J{NR*6Y%6_-6lC`{l?EI${p{(eb&CIGi-eFYQm4C{HqPrtFih2 zAlfg(-)sB#v(^vxwe8dI5zh0r7TJl1&g=M>aX#*NjOp(M_Xdbxcc6Xp2A$_?FmKb= zPgIBJON7fj<33#5k3S<^=o#zMiT)2;(D8JOykPK7FsaKL5pp^ZcwM z-zkUwUxN0_uRo96e!=mF_v7X^_-*K?inNYqkBUz>m5N?}hU<5Rm)3M1Y@a>_c*jkOUxoHB0KWKk?Vpxa{=J=W9)Aw! zD9yfDMf(x(s|TW=pIAQ??dOG9;M;+BLf^Yo#Xxe;XY%-4|2vDq5&k2}^{|3JNImK^9|HnQ{ z$MX=Jr#8K@hj5nH8}R2_KFL#nufsoM&wZxh(Rqh=0bh>%@c%`)@Sk<%9o@PU&iyZcL+8`x;Tveb0{ZO4JlyR$`rO)_N|3W4V7h=O8`{s~ z(EeiJ9q&;(*$q0m68IACGaW(uj{zS+y;hsI{{_B*`1n6yy^bM6L-eJ6I*>P_{{h08 zo(J}a_UwgdzxY-i&wf0226!>b2foJIFDN~%;<=wDoab#3_YOQ3{rtxI*{yW@PT)tA z1B%C41D`bc+Yfy8Mjg*TqW$@V%ewqUpNrQ@E<^jc9{#Hd=lAWz`2yqrpF{ijT;Y#_ zuSE3^|L$@fXYm|e$1CvQ9Pnk_hq8)sPFVYg={PIEuLQojU*Bs8_?v*|5LdN%_zdv% z$lm-9;Bnsm{hp`$aRqsd=0E8sT=paC%^r>C?ghRU-KX$!!S9h=@MPl{`h{0X|73rm zetr@Ce8T#N-0TBAd>42p&eNTa_J=-S$CJCizUi^R9}av4_ahGiKMi;h_9?bkGDNuW zXT(oU|EWlOeA)YP0R602lnzZVeS`FKc=E<;6gNNrb!fkaI&3CK)_^ZYars{e?mZB{ z-sJ`QzAJd&PT)D<%kUSy1^6kzbEw;6?>lbzqm-^5gL!_I;fUkxK|ikmzK%NoF9H58 z!g=0SpR9bqAKG*!TzcoDaPd@y`phKJ|{e&^lnabEydA8b^*)~?IC8djY zZJ#aAR7%s8+2YQzZMAZ}xh+TVMZ3E$o4GWfcg;)9{PxD&*d>)_sd=DQDK(n)>g?oT zb+CuO-{79|y?%rJwfWIjv^GCIEoji$c%?jDskh?wx%npWpzqpzV=ANXa#j22@yAiG z$ZJM}YhZ9e(@d~lxl|q%w6u2%-h!s2Ql3flN2xM9S)HwvM$3%~rh2$J-545f=JT`y z^-{B5t~MJ(V}pa|6V^rTs$-=&{qoS*p3>lOPsuGwp4WsXc#@{SR;koWPn_q%R(<@;;Z%2;JzwNWXJ&CSx_=Es^z>FixkJmd6Tr4r3oX{co1 z7^^oM&H0ImZDUEPbncnwmv#*e?-F*hn)YV>Kr&Hhq8^{0 znK?jT@%}1N%VyBDF;&jfkogA@H4#g5U!~HVEssqTIx{!EE7?VZsM8|y1k~ztwQYqM z=t^qku}ca)J^B9RyoA;!*-=OuW98{`eP({TnM_XP=>K_Xl{Bi8Gv%bzpOkXR&ZN4K zT$o&t>_~=^iSeXXukZ_3r|Erpe`1-jBDyELXbjD{vAO9I@4Q`I&9T}bQAhTN^W*J5 z>}J|&|5f>rnZ;~{rh*1DHeIFJ#jnH)^tbu?LZy_l36I`)<$H)TG|H1qJTo)p+3{pd zTKgRd(5O%+b?Hx80e)Sm%}wjG$0un;6(v%VUn;ZXwYe$=RB4QfXD4E6t7W zt&Hh+=&$A!?NXiHYE7E(&MGu#YD7B=rG;|6k;Hq7|EA@irEV}xMy8plX8~Mt>3n5g zclz|GbURb7PLIy%Zo==SMtMTpWK7shrCA;?H_Q6v#-#ovHml#5ovY7)smLeZTg}y) zRU%G-OBdz)Xp1x|O=g1h3I95@cd%OAxiC{4Zg%mXdrHI2?rB<^q2VrKG-dfQn9S{) zl|E*PNvBJSZg=Ik^TZvnwG`?TuC$$|e6AkiHR8qcMdnue%j8UnsJl|Nm97!cphfgP zSH7*yt2KS^+H|=(OKii@9!Q<2i}!N1+^m#n+e}pVJ5t`2@7`CLCYsCmq@XX+@{NMN zgyH&Bk1pL)3saTp={fgEM|b=Su{cNn{5MI+(tNY3B+LL!zP??3ZvO%Kjfk&rVy?cg zTpurD3qyKwPo?HyF~6N8aS33fS#CB;&Eb5BR*wE#+&x_CnQ2T?!)?_@y-dQJWRpIF zRuR86rsS78ZNWJc{AWLf$i9nqCGSuDWOOi}*WXHw1GB`&FS?UWde93k%h=rfY%{5s z_Yv)m&Dmn}-{ZvU{J<>Od>y8pwjgHz3{5suBpq`?h;*sxo#-sYcXNn%XyW{!W?0 zUirH@m^3QWw)MTWY_Q~Sn@1uAkwWj{di0!YwfMh5+f%5$?bLT$!`&(P=T%; zV_}G4%ir`fklg%t$YmG_xQxfV^w$#42k9A!;}iArcy&K%7Zu$;JW06;`l~ccv)$8HM0yu!!shBjQ^Xaf1_z60Efl9_iVLibBn$aq(dbWqO&1E` zr-ks-u2R^X^+U|>u5MBsMvFW7LCJp7Dg-C0x1X|!jKA&b!&CVs`angbWe7Eu%CtGh z%B()fm$8_-IR$A}XDaxRr)o~X@hY|m$xENf@}Is8CYjze5inV9PJv{qHDYazxoKl< zmz8NHGdNbBKcGfTeS^tmGtJ;(P#hfzc=Rcnr6Yy(1JVB67w~?uXeyP?I{)>8wpxlVdRq0+V+`$D1L>z~yJ+OMRGjFX;r3A4rQL6r8K zccy#K@y48dWxC>xqub}~ZTqoNkUo6>wHdS2`dQRcls-{<JQD**j64rnMNXCS&yjwI*wRWA#dt6wlIJtukw0E95;MMW2YmSZek&yChLO+enwu z=>YuwbZq&&Q=UsrV%T#v`V7zHr;S!fjj7De@Dq26^Pm6`Wn|GL=K|F4!Si{|@j0zI zNf{C`U2O33%sxdHHQzG}LGb>V6rVpeO*2_Yr)I2k< z%P6xjxVLJLaTK5Lp?T&FBlZPLhVyq0H)Px7bM%QAIlM7=XSk7L&pC?mDL-FGCAAD- zhJ7wJtKB9l)7=$*VUTy=_OVifD4hu3Nz}nX(XfXby|fF2Ja>-G3=EvTYv_zKFSwx8 zwXNIe!O@_-Y(8fy7A*-a>)1kRg3Ke{Sm}i23u?kwo0S>bn!Bo9gM-0q(T-t-f4X`Z zX)~4PzPb7(@@?5=eZ*OX?0Nz{ik_Djk&nIR=09Ix;SMiNGvCK6$fQtS@CO!l9dGiS z4qnJz_i4VX+9=Tm9H)IvBTZj!yBfCb>7gJVt_I6?as-v`33yd6t6|}mYR{B?9$VQ)P~g=m+$pF03^NQFhnR)t2H5Yib}5u;srJ23EW_Uf*P=0xV& z?Xm6qr^<~IDcnkR!@3d~RLf%+ZWeMSW_QG2$-6p9>nSECvAA&0s3_|N^#)W)+Q3+}$)jN2g@!zpkikNM zo?0PaUU`fxHFDdO=4Y!s(sPNjn}vLaqmj(qW>0gT+O@eG z5>FkPE}(WpqdeUx7g(j=?JsP#N-AP$NLW?#z);mK8~s+MKL@w-lGVu#F-VT1d^)ZC zH2OT{MfPfUT%xcrXfQt?CC@RbF`_;Q8xMs))Wkpu85|W|F`5_EH=Twfd!-*XoTq;F z!?Q{9p?AN!3rwSpbOe*Mwm7~>0s%n|@VJe|V!$m-r$@BXNGV8arYg-5v4O{dOOy)R zy2#^fe7~Ts6p1Y~dxWE~yxv}gD9d-NBa29jtU2$6W$H}Jws#Opb$VF7kA>HKozys| zsHN&OD`Ui;Ni#LqqB<3MGpND_jfV+i&r^tEwyP{7j!l|`iiM#u!lM8P5gSE8Vy37> zAE|go1~Ko87v0$;P6+JKHR5gSSgk*mHX|Ne2rP%t(k7M5O-rT9^C4`*1q!Lh2jhwQR zG=tsJR;v0c}aa1 z)vvyFR>PgyhX?FwqiyAg&g^wsHB`^bHrRNw7_}>^k+P&54{= zOVdWguVuVHovuyYAvQD-#@%qaisw#HLIy1&^x}2Z(Vp z9|~F3ASX;@O1MIgxfD`wC!A*yzmcz}UWESnSr=3{o+nmgmXgHO>-*1$hDo@$zD~ol zLGy!C!wu&pfpplyzk-+SxA-S}LxdUl4=?03h(ViP6HHW%3`P?Xn@L}vbMD<62$H={ zjL>f)srpDzjm_0~MOxL_y`-rtkn^ zEL~nC&{<-^UQ4B==i3GK_3YnE82}i!*-3EOn=92Zfo!Q>=oeF%l2XW4Cl0@vjAylr z{ocHLR2=EPagTr<82SlxoBM(V`k~nd#^uS28t=Z*Y*4(B?B-&*0T1y6f}3Eg`pyXAoc9uE9O}D*s}R8u@B_ zbDY+Ywt{XzIG%g60yE~-X5p>@)>5-ac8biRC`zWJ_^w4q9qX?E;amo)HxUFzjUE6 zTiM_ABBz_^5?cfpF}OI=B|1iIfA1!i(#Og_hiYkA#2wJ%y93DIa|e9^>D)ny5Q^zT zpeJ;hk@taupX^Al&QXqKtIr|Z-Qe`{tt=uCYZR{_TO^QsktDi%2oz{Fgh(*h+FrA|d=>@x8(RP|FiPLyv^m4k5y8n`hbUt^23S$}_Q2V18&@EtHJ z-3|!GkrBz6CpoQJB1JsG_1nZYw~tn5$I}QCSdyPk#=bwAwefj!Nn0*iq+~NUaQ-5n zt8W@GG9Auy4^rN1qtYU}!OF7D6PHgzdx%Vkt~}*FP-KZR^E9cFw7t3dftL83zG!G~ zr-F|8k&0~9QlG$E1Z}Q28+?JXi z=3AJe92(xnz}zfsCJ$hxjWr)~D!9>;Dn$APC0B_`1lP0J^vY9cu_!XqB#n0;#RPS} zd{ZNI(vYVm3W4}OEcL^&#sYu`Y~BiqB&NJ4^4(@W;?8>Zha0S!%*?ao86=w}&`oUl zyC+DE?`7o@5f)kW)RHb3Cza@%XR9Dcspcui6iT9Rk{ets{6Olb?5UqAusk|fC%>cm zPLnWh@6#LF`=URk$RonbzhE2rRyS?fXePePnQ=aU@$ZX5Y6GwYvDR7Q zO$aBj*-QS2or}-&IyhGZWx|gw@HPqvfVqGXk@1=~zODRrI;EnqRn8|+zq|0z-cdRM zqe`>VKoIaFW?79{t^A!G=de*ktM@l$xjc{5f11#(PFs7lV-A!`2?bS^jX}!wB`Vni zCKaY~IZooH{NNmo`M;GW<8hlu}%RyI$Z<;aCn$EKa~kZ5NyYvt@TNkZExht(M3?J3jVhB^zq zWHZ*uxoBH6(^=t`W)lV$YN0)%1S>CB&9`l~kcbz5KW178DL+4`AZLbii$W&8b1NKg zfvp3vsYGPz*$eWo5ksCL?Lwq}W_*$7*I1))VLeuYJRo6@GXHLK__|no&A@XN>#pfy zi^MH5IstEm|2W-AW|&zsC7{i`L&4TGpMw~hVlu(dB(4Vq#>k4eTY9vCtd0ih(!_H_ zlOk35;QavRBuRtL*=J-dNZckCo$ZyUV3KEH`7*%FHxmz@2*?nZL{*a63b90rLMq~8 zE8XO#7)AXW2}P=3oF!xvCj7O<*VWGaRI=KHyZGM~bp05Tq<$M(<@3rFvrY(pY3s zfQ*zp{bOsNUEUUgPOi@JAvwu__H_-LmmaaLGU5$=FkyqmiR03lQ*mcaFVzEr2wuLM zS;SU3sh%O!5*+KBpOw5;3eHj1LW2UT^D{14d$>VwM`i<^`XUA}mhIBhAWM&I(R5#? z%fVeR2aD6Q!%%ZRPX`7jIT}hQAX#L%1(0+u?=*xkIdQ=#Q{-1lfU`i{ad6On`#p8C!RA% zMW#HNLvN-eb=o4qh>DnpCOM0`h-2jtA+_8N!j3aX`V5g>4?hS1f) z+em*irQOs8VMTFTb|E@U5F}dXDUQ?dq9nvFC{@bMV)rzeWJH54M{)ulA8Gvu=V)>J zDhObR7?-E^Ta3TOPZK=bX~Ig3rAa<7r+NuF56@jFosSv}XHJ(JBv5ECVw-NQf;%>( z**Ej` zdnynj2u)ExhfTFB`+D9v3OUjsV#Ii{6Azrq*4)k;lnz=_$`jAKZ`N4&$~KyXdcDJs z8bI^Ew0ZajNeC?*k$qz<<;ZZg;fV_D7@xnep>oVR8|7%L^qYbBli9)x=es$+5HW9= ztwN5E>5y+HaGufueMR*vb%nRwalv=4oOtjOQFVz!GfxLE={B@u$Z;H) z^0AA`q_8lVm=|Ze&H|}PZ z{#7aEUS3zkx>K5m?lbS?-@f{L9(Mz|!NB?*TMLXktA%_Ayy z)9$2U2>Z9mmh4RB>g6v$6V3cF;&S}ImOqYKDp-P}i)M!9>8w79ZB%K|u#IXUzDdwxl{=zx zJCpV^DaWo1OP~vR0t^W;=1TNw$aPi7OIKQ5#mpLHCPZw5#}Q~#QJh2iXQmvTm4OD7 z5{~lq46mh7O};JF@YzNFG^U!&2&L95;uGV{U8Y!Iz>2Dt?~ITBJjwDlv#(K8XbHJ zK8lV9V67~fCe;0XN}$}5ICkN*f2f-Um+T~td8fKH2E{3#9+qiy{>LN>9K0Fx!&Ear z%hE*0-A&~;m?2;QP-5CCta)BCV*EZMpP?0I18QjJjFMYds1X;$awh>eK{d)+kM{JW zM|)<3Dhb&9fF@P!5xS97*opD-ftYYq3F*Q)RZW)*&Ye3Mk(X=(vQHe!6sBIh3=gQf-zYbXlL#oD zC29qk#B+5v?aAktQ_*l}`qlAM^auuEE7F0`3-M4XbUMhAmK;2DdR z=@`E=F@oX#5_@y=y-YHu<1)J<+aN>1O+5;%1IYAdh&-PW6^K;S@TMIIJJU16GgAtX zUcZIg272q3gqJVS5fZA{Ss7zRf;N(#FO*6x#x*SrW`h3?X2Q1P3|o7mHDic_;WRi) zM`98*A9ZN=32|n+2ztnkPlgSaFmOmgE2aMRoIeMprr30FZWgE8Pzhb9CUF85g+?w3 zbfuV)xGWUUY%~3~hrZ7>GQ@KdWQn(e+cP7S;MRCrj*p%5)zEWACBrJXD7$ zt=y*vra{(zWWLGzUOjzNCl=aU%Gsvg9d^U+g!gB*GC1sHEy7$|)1OSRxSnaNxpi_1 zFjhVA$FP)^og&|Dm+qSK-!SzvHNJ#w*$>*HOv&Ez9XisKNf=rr$b#z^rxg@P4v;^U z4n?()w{tEt!KT@yQK}WTQMkvf)R29sd(&LaK9dVnx5xt(d0X?DwPaWf({yOjMXCc# zQftNq#@$|JdCGfjMjB>MU6?|a&#^lUnb}3ku5vTvTc*f6LFN?uLq|!qJ8M+UvY44# zl@^behE)uGc7aoKh2EKR{gM&|O*BcbL}4O1^TlZ%tPz;U-*|~^Gxy@;*rG#HRQ$!& zPSXk}x)~#8sqd^poXDCTbD2}+go4MUoFAU%KzLJ{WJlQ-R3nZ{&t~?Pj#X`V;g94c zQsqv<+k@?EE_4;zxRGb)aCU4fHfLI6`;vdIItsml6sw=DrEiiiB-IJ2MckyLpyQSO z=|}$Q*A_>rzt-`QCK8dHw}6UZIuR1c5lN?+YjIdPD2GWYK`iIPszGBjMbh$%Gmesl zgN5TTi%V@Ou1=`?-EcAtH%;~i)n=GOMl}9MB3~UZG8Pnt8NvaE$7f7WjtE(o+{>Kd zow$XD;xY1rItv2c2BsQ142augBs+RcTsIDMKvEZwPbACBfi}z9i4rfE#k=iN$YmV3 zZwRrp)7f32or22fVTv-0&vTXNVwnrp)7C?+41W;Dw}XXfNoxx9g85nM^peb-V7+1K z{Dg_kMPnCLwd3=AS`#G|NRIQcA)?HH3J0oMONzJp1O;#K{02GtS|Nc<21(K9@Qy3p zMN3kz%#d-;rKeKZoj}FQq3)nl=-ZeIBJ)H-ho(TD599JFh0-jY6=dcj3z&T@A=(%R z@890ih9Wh_aRogQ>!&inUW2Y_SQAu&b44>J2l&!L>OjUj|? zdMSkARgOp}zxAkc>dAv`Xl9i15OM}f)FRB0B)@-sX1rR@B=FE<ZkCV?b zNEVW)uf}v!6Va0iE{NyLFOX%#Zd3aVXPqhS0x5M}RwFd>Ten#|-b$Oqrs&`X2UJqm zW=jPacBhkxUM()TT&sNCh!|p}PA*@%4#rN5Tg`uH=ZG77ag@-u?C}e9&2kZZI{iF5 zr==%N=}Q@5Wc|$x<2p)Et-QA}Md!RONf}$1Qc}oQs*_VVndD`cXmW`u zg`rX4p5RQqt@f(L--s0Tu--Ta=2O1GmGxK)VoRR4O&Su~w7S{3VRbWMxp_IAG%?OT zekxoF*Mcbem=JOyEi`6yJ4o&-Q-3JOcr5Nvi5<8d_KI;*jT=M}_KLW6n}y}Sx@|U% z9Y`%4jtmTvcQnI;y7zpp-$`Ax_n^|3BM&N$8jyez<`<{Zx`1Yw9-`xS$y6HlBNoZW zkeyLq*dj?j(B!gnjU3g)rL&c~#aB*zdB0B=YC42$$g1sK2}aZm_aamFsw6VN|7rO zBw;rW`jK=V)R=|L?3T*9zrf(^oIw%P@poL!ogm9{tJs)=v^T1NO@yr}6zQ>KL%JQ(?l9em$fay&Y+>7Y>`yjY^64&4bn!fa6xQQ1VHA!ZyMzyMN*<*ptwIW>C~EQ+tAnxp(Ba!+@Gd2l(!8v`BUp47qVYR$%u%IDpl-ko z;QOju#VaN;JY2%NA@*ptc;vW|ca{xtYI(=>U<+y2TO9R~FGTrfA}lztR3bx>hxV>|gtw`p-VD$%cLFKJR1pV3X#PiJXwWoTf- zx?P@~wF0xIje^HFLTO?N2Z)SItB0sC_fI-#|}d;ywAiI)$Ca{K!-49_^)z zTrTmIaF1<*(WqG?ioQlIL~pOB6BiSp%QD48ZDn}+3@tjQ8h2%39sP=IA}c$QlCtmp zk~}|VC2W{GZ%H78d*^3seD#8}L!5YlYoC1^kdH#&@%xIDV6koa?=i=Q0;znoD~QVW zPLyY={!KEmtI4)~tJ^)hzPRpEr3CZU%5*Tf?J7i-E-Lu96XM*0U2#^S z@+(ATGvc`j9u(J)@|UMgIj?*-2M_n9j#}~QK=UIDyqR9+B9jjh?MGyFgI%`02M&L? zQ9?ziNA#f0v>giKq;wN59vgZY!3Wld=qgTPeXQKot8;W)%Ynhvr32q%hIcF5sKtR+ zBoRRxhk29z7=?_@rP3-zoJNvvm#vDo2}P;$OZ$d1>?~C4#j-8bfWBX2x3x`+1AkqmbQGu@BJ7clSPx_FNKBR=9!eS7z( zH)`41#^?ebVrw3m{NAEtOCWi4yP68$SNE(-fN)vFR09U>{H3d1DTe^qF7sZ#j^5rHX+jp78!py#RQ0XSE zN84LY`0*wMXCk@|4ke;2Rm(w(_=YgMJtw`u+w8G0o@qlD|8GR%bP$}%Gg4r2v*H&x z2ZrGmILELuU7g_zi_*zaV}yvsXQg1w`4x>Q=ZD*}_@sbWnC$6&E#Jy7;`Fs~v|Ehvq{M zub+}xH!q_)DD(yBv6{$q+om1_+NVfTeD+Y&8*{eQ{P;3hm_DRMvi`i&u@rKG0w#(pjCC1p4j*fj* zuW!p7ab zUv0nEi?joA3kBBDUsHty+0^bP3d$13ASgnU`37ct80yz(Hg@1R&hSdm8NiSMUpmmnX0%hVj&2z~!PgdoAmg`Cp> z;ntc@s1cD*QclhC_bl1Bbw#3sQIdPISv_%?P;8za4Wdb8h_rW~uK!kLER709E~Z&+ zc`2tRPFQny7IM51k#VAVd0IZV;o@jc9hRehyj@k?24S~+fi^}eRGm3xF1a`eAJUs= zuZ3RaHZRg$R%h5JyN{w0tqacwTv{eMf#TbKNOgj~pE9W8?l%OG?&b(6)7n^zm<35}F0hn8EE+Uvfgi%pkl`1)PF>a}~3y!B`5Q;z^Ihk4L^7pPk%yCck_fp}zhj?J9QmgCAya3z`JXxQF+P!M3wZEO2)th# zK_YJn58Ni6c0N`_wah_{vsCVBc8d5xQ?4tK%o$N{v#pd+>+!f;dXmB4IHLKM zV7{UlZ0JO`%N(-2iZW8l_MC5yvq+OE2u;*Tc{GDh)bTG<=uJ?#J7d zuD6p2xonL6qmCk+7zXiyW1uPt>&?7neD4t0Jz_g zVQ;k{7=toeq_&jntjDv7kiHmpvc&tO2necXP}K#hg2S#X_z=hD>Xp)zckR49#Oz2h zd#vJxQgvWL5T_EqNO*uu8+M1erxpqKcSWXqyIqIyas_N6)LA6I0hT@|49H1Tlgjbw zY$usFyOxLs&6(e{ZI~8J;g;fN5|j}efscZr&>~YywrwE(vADJqH%HP)0Y@;%K;iud zd6RueEuJC%J6EDZPNc_k)faSCl}qLMqwWUXq2gXR+A-bU#hgm+xTnp8ygE}!V!?eQ z9kun>OBZ;l>=Cux!9;25QB5VudguLMbwlJ@?4fh{Mr>LT&3n(T8bV(UYlhHuvlN3e*+}4$swR=FgY#EoBG9|{>ptg{XZD%vg#QiH~j?zsI zZrbQ{UAAc*&4@2W+cU^~PCX}*!^3PB9M=DaXBO){yFy?-AEJyXE|gFr#~&5sqO{Q| zy3&Da0OdM$JGPXMKy-8^2gL69-Y*?*K z@22j62eaFPZYiVdCF+%VI=?P{7CAjf>$(_w>ji^WfEsyB_U*cz;g!&#H2|az% zuYIA?`=AT=5p(hn+*$U6n|%K%eic$%72#NI7=59~?Co7iciRCtt@2MxKb zWa<)Ur(}A35$_$*qWBd3V1@Y{yn#D~mwxdwQIu1(R$lOFF)QrS&eycts>V=piZp4Z zt!uBH?=3h01gkiXwTXfjYeYt_Vg%ER+Wo#d6J(TF2qE|dM)tnwB_mhh%Qrv|>+TG=bD1L4Z0{?O#o!Xv0GvTflhfnN< z92puMRUnUOnu^Uy%IyO$6Eeip4Dt8c}>fYpTg!_N5&e4^%L;zceJ57&Z@3@>s0wQZ89OFAA=n?GlQ% z*#ra5=ZUH)U9nP{-lvSfl0>r{Pf^~cRJcU@7KUyWh%)k7an!B7ZxsRqGdx8jqxY9n znv}0W7cXAcMw1Nug2cr<4k)rL<&k0`+L$wTx%d~_1+0wLl`0}}pB4Sm4et)>I(gKV zafM!Tp=Xyo)PCABL!?oi2Qni(wv8}kzgNe^Vv#a=(KLjYMPVAu5RN0$sDK)DVY-Mn zgjC;f2jyhz@T#ZD(cwV`$zCL#v|gf0;O6-SS8X#4nL{)6y~nq)s>$h0+?`xRFitgI zCs|Oudh$}{X0}c5Pi%P79YsU&JtHd{jZdc`i^=yO8P=}5RIfvagozIuY_s&x>Eva;$db)$nYq}3> znC9Ng;3TF?nF=mWMhU*}t4tGT(^@X@t$D8!F*0L{VaiH@?yS|@NSF@Hd#M$jxV&D< zT>`s_HZ|;~nfd8vb&TtVRVVlqUUjr>F=gMTcjgZW3XAHjDz}R1=`EWs;Yj+reCw2C zEx2LYJfg8ErM=x+)VS3#zUlRHZ4PgMQlLh4z_i+j8@9_Rc_^P zvrWzY79WA~QU7MV78gMJ1cpq^o>N%>#6svs|bgRr(EhZ%aVe#8{+OSapfvhEBR~*&~JWAU%5!YbFje;5eubN;bVX9uDeG z6AsO0+-U;)imuj_LZ;rk1e%P`OXH+HQ~tpi&DxXK@qI;i#KfUesq=KXkgD7qaN?9S zq9F>CxvdhM(S@TbaJD$w2gTtfoD$2fu&l~8u^E@=l;c@RUxUIT%9YV^pP%EXm(DXq zh{UxW3p*E6rNxMO@5@*B)8$ar;gZG@p<%Z;%Dk6hdxR}L(#>FZ?ucxglQd@Ue{ z98LtUgLA&v>iE9MXgr((sW}Tg>vHRB>W*q57B9 zw}W&TIX5dgAjR=BaRA4RJTi!mR|LBwbSwn=VLSJ_&jk=TGR;wBZ@~UY4XIPChzgmO zH9dgx``zBvG|gBFCXL2edA6On4Fo6!2S`+x>~1{i*lHhYvZ}DMAdwko@FwUWdNoK+ zNOKbcYd*_GLA#++o}pVD_wya0T$IP{bu;Euj_%LbW;p<&z%-^S6|a;r%Fp-=wB^>Y za0%6fAcqK5>G6(wYhHGmK9QNi5R_FVPa~?WQtiNlDYvRm?$v|3Y$4NaBlC4S1Cp9J zscg^AX3wX|$9&!`zn$_Ei0@Nc4$6s>GkQ>~OW5J^BI zsvS$I>*yM0$0plc5PVPs6mYAEYlq>gfDvS$2VwKPgoCYdUex@+UQIlXk=nE0C*?3~J%@AqUiWl+ zO%4ks1wB%I6~Z%+>9XQc7EKFP@K$GW?M%&lpXoL(QkAkIWoel-m=P=ihl>*PIGe@Q zJCVBDRVH8Y$f0Ip?zlOJlJtup67|Bp%H1z zB4kpcaKq5;kV*EUDr`|jHs94+U`}^n=#PTj=lP?!hbkd~&72Yb+fA9C-R&-h^%-d3 z$CG$2`Fn@SNjTQbH=07~j{4QPD#V{v#h0CTaxLX1Reb5oX%$~1{~$F2wBLgek6F}y zz^XN&-sO3xr9+^H`KqBUbvvu$&NDhDq<9}7M(GGJ)hj~!A@_|Kp6$c-vg9sXDJuuS zg?VKknM5I8*r0>~strxoJjBBjO4DtM{URIGIF2hpCm&jmxMa3|V49rVnLXy?SZE=P z{*uffMm#%5$Ex|YNq?-)_R5ja@@&ghk>QBU-{WuZOob_P9sinR=PiO%a^<&@qyE_` zzOHU|tU~S-DvDb7wC3OrEz|IIk5lf+n54qf?drr!d6MkdtSp`+We4}(|HW6`8rY4#6HeA>MeV{`LXWmoE_lln!HKI`8_XB#|PA_!oi7V{;h z!}Td3btqZ4>W|f`X#DWZ)I*yLzpH2r{d!)2i5}$!kC)5oeY?o+!{?OI06gp>=rOE;8e2%lI8kI|D=Q)uG)?3pP60O;?2dSN5 zyg1?Q*O<@~7Lb^Z3hZWZDlW-f+f%qDwWOQNMbVwmbWfVmU?iXVHL|5Aw+^yA8uXap z0!(5Sq>OJ;U`W3dMW3s0=4La>2@Evd$oFe1XQbO_YM5eJnUfH&n(sEPmOMhUm3?mN949~lM{y-$ z+iF1oH(XA!_p(ft!3VoSN#EZL*~KD*`H!uC%5#xAWqeOb`s^SMYb*)j9*fO8!j5v8 zWQo#J1wE9?O_^F!!;n&8NO;<%7p20sE_$TAlLe41y%?{nj|^);2xnu)VeGM;t7VgT zURc`BZx}6k`($LH=IAI!YnDiR6`yMUsf^a`#QJd|EdtPzT(RA=epUY`WQ!ZXsYSY^ zVL+3v3)1waNve9$#GK`UA^Ox~b;2##n?Okz6hil_ zle$autmN%k3wmJ#2?Zl=a->SG5BWOg=@2y>+~kYzMO9DcY^H?9Wd|H_wB)s^$b)g5 zGBl6w1D78}ZLrU1Iqztt3Xvz44Y0Y#()5JT2|+edOG#55+g}lgv0MsP%g-0p4N^<| zOM_gXme(NT;uU$cnn+Z=Y6tDiu_+-Vi)OZ#TrV6qp zNs5bkv(Ra}UvpLxE-hc=i`!~7@E=#5_n3Yw4^=6YkmWfhd~?5Xl^kb&72XUlDV@QT z<00Z8wX;`raynfX&!S7sooptbwVea&(B%dAnxNgu6=j|AlB)_G*xYoMo30Mz1=dg7 zIp*?``9jtUNjBEx$RR=&izB4eQ32K&$m~ts!>z~EdXPNiJLPA_RF^hP<6%DSgJT_Ti_)htaWEpNk;kDHT7YqJyvq5saZo?bp=`SM^tNk#M= zvn4mzbHD>y7Kh)%49Czn;734fj-)NC#HDmdJ z#4*yu3h$spnjLKM9QbvFNdZG(14r+~8WNUYVJ~xw2UwqKkxe&XOIejIsp~#^pjn}W z{OP%d+bkKvlS^w*>Q72(!BNwLyEim)^|(PH-6yn+m=NL8a+OnMenmMIVvp)NY<1E| zxjB;yCj^l@ajU?RK17%q*erdGN+=S|QF7HBE)A7d;l9iFk;PM|JU|NJ(7|uw-yZuW zHJ8Mtagc+sX*srBp(Nb&($+Sv6+RbSrc^)6-=IxTOw4n5l7eET){M|RjksNnii35# zu|Kd+lA!|MQ5+pIX&|(nCcoyn(7rpKL9HL;*hZ}o$Vboc#Y@X686v>Z`RcS@02?Z~W)a(>@=UdHVbg2y zE1Eu$Rb#+$gw(TxeG*U<(mlMDXc@BBQ6cJ&7&~3v$a=9ULE+I6c|6-HlmpqMi=Xp7 zrCpRhNKT{iid5I-u>KTX_bNrT1D3lj-@~HBH*~_(fxn46M^hHqfx{0|iy`uLQe=fo zP1NNk@06s%O=O2yHHnGcjAGxlKg23DgB?JzT0Q%UH0RXeqnwS_S^Rc(q=tveWRa=@ z-on929d1b2tgMsQY5G|}k=dZ3Df4Xd)hDS($q`QGdF#mK>C95`=~;VG5KjGG9Bs-4wGpf(XS_nDc zSevKne+$)mbG}UGbL;U&&@ok?5GRSs43A;^Cx|(jna}2tVnXMs#o(d4*JiM9$#u=) zQrhxzc+ZaUmFseuyA0Dmpg_cxmB5JCA*U7HlO^1@)O7jCsgH|T{6Wxz_~gl%Vi%%0 zd1`Mh#sSTpu{JU;*q_(zU7$=aiW8u4W4iVc+wEr2t8~;>1}J;T5et!8f<*Z(;UtPg zMCoK4o7g;qn_3w8I-k=fhXR#{xqB4?9+t5V*qNc99gHr#5C%*lR`dN6Oisa2o3#rIY}a z;cjN61bEI6Po8J5Mx0z~8iCUu!6sFs+4N|#mM4@SwZ;?#Gj3yRTpqP*449&(z^Y$ZMj@5Jz_vH4cZZ;kEaf9saXV+9+6dELLyp@PLg~QdrPG`XN8>H|N^NzzJln2!R?Pm?pG$mann zgbsWn*(|F5@e>5Xi=$|m6vKs+KQ0fclB3@$=Meaerv1%oRhU!}=|R{I7aCY7>X zZdbRfY`Mza?g`2ug9tG|j3ObSJ7EHUAW@JAvrL#VVS*wh$^;~?5JH(i_||i;wa-3P z)twt!x3ArHovL&8UVA;hwbr+K17$ZpB!(zr;9kKh1O?q{0Sl57pKZMlr!Kkpa6!aY zW~fBn3g+kA3K9fj9cBg|+TOkMYvR_R=$P5CC`T}Y1v#{zJboNB2I2 zsJ_*b26kRH9H)M5K!wCvP#!a`$3IN3Pf6J9q9aNC8V!&ue2ce(A3{9T+Ua#Kz+=Hs+zVW=$?b2yknlsrOtMI z)-~!LS-rE`t*o63TlMogKZTP%d9^t|Wgc5yI^iESnPC_7zNpOP@wF_+m zLM)yaLP<;tBHKXtiKsJ0S_>MJ^JvN1TGlJxp|vrZnzh1%Mva7Ru%Q?hO4Hoq4Zz!v ztd^FCRBTsEtD-0BvaNt5TIqFfmNRZ`hS&*|{;fc@nh54YDO9`TphL?lxLRls6q@W9 z+ch1Qx*AC6R3KF&m$Te8nx9dC$#AfxAEDmq;LtyLxVwHxD!6pP_ER@dooS_W2hkIsRct<8-I{?Kee$&jm4c`|hMfc$CP4=-|aZrc;XdX;q{noDXf$B2G#k!Lmw^TH=HiG!2+DOwUCBuXclNMcB)!OVF`s z7K4gK$EyN6e79FNw&BlbkzA*$;|-dF${>VHUIaZlYr2(fz!gcy35duTg%T8` z*lm#gB15d_lSSqH>hTMTbB-3*0DP}sj%{j1uJ-Qo^8*BZlOp;-2GHJWQ|W@L6izW! zYDM-WHODJ1Tkmo+*fD$3DA1G2$Y!whKztBu_7I;BlJI)9{V`ntwYKqK4>2x@*shye z8k3uqZ6;4bniltpWOWa0T?X|-d`pQzblJttJAPK+a4ia^c3!qN0!L_W)Ga{1uSTjt zOny+zR=!cuo0NB~eQy(tBq&`kd4$m`{&ftQd6T0W9YpW?(r#_)?wl}Cwj6P z9gUxWq6bZ1+PB0!=P0|GTv1>ADLKK;$WrQ2pfaDFjGKONTQ77x@G-yx+-_eGosiKk z1XVDEB@y}z;Kwu22h(ZIHEGSGapa#>jFJW8T@UuI47EAMt&-v7<`*~AEnel8r-&}M zNmwNw9VU(cn(0#oIJjcO@;pW2GWe@@#U3EvECWY+G+5~scPobE>S62nL8)ribk5H5 za?&9mac)Q;EcPW}OE4?ry$Y)(%-49ztd^RQXxXu}G@x<8hjK)7`%xF~IBr{Z5$+dF7=H+df z`-R*@TJaGm#+S2A%;LPaqldzQHYOMNC2IE0Cb!@wg(t2}Ay65n;Z@k%{hlW6?TVbO zNZ$N#3={-Hd%rkfGBnfYbWTztUF5ZLm7`;4USA~Xb>I7ljR=n{{F@Ctb z6>1SyT0#3sswy7`%Sg2e+G@>jF&tCHa1e(>N^J4P2FEyVSN#n=_+AOq?dm=&`8na# z-te=2Xx->`{s_IA$1ezF$7nt39efXoox{RoD5>X`S&!M06a?^2eJH8O{wzq25%7Ri z3qzqsD@5qcf~<#&F-8eJAHOJrw$Q0?dpmhW9nFY&9({K9AWo&UPfHS;KC=St zqA@g3<~5a<=%Fs+!010k`~u>VBdUgeIX+*|deC!Gk*E!+rj-tB8oJ-eG<$zKO0`fy zMdU~!Mt)4+_fmh2-c6?u)~AAAyuqzaW#17wkP#i9U0!20X2^mNt{vEhc$t9PQgagF z+V$a8g;qFUWKl+vBcD%+=w`N@Ygt>=R{9L+z@Ypov$7MX8qx$l%K_uUZfsITJIsWI#)F;8 z0(FPdr%-ANH-o@j4Qz zc2j;$9yEH}XHYBL4rknBBy+qL z<#kexB|Qxi(bwTN`A;rwF(@l_zHSY6cahb{K_XuXt{n|v83R+s^q4ECl&i@-OdSCZ zkEvI}Fp#PW+TY9^9%}z9WfAO!D+01Zu29dzqC;gainY1Mr6r~R6jNcS$|Nl=_a$XN zx2kX)SXJo!r?*dM>u<#xKSC8@g`2~qFn?^Q(z&=>9G_m&{-RRp`IG@Z^i$YAZct0< zsjFqSu&3VcI?C~e!9FMl76HO3t>e;2saV3gY=m@GP1P5ArXmL+ZNu*n6CR{Y*zJY3 zmf*ZP>u`xSjaOZNc9$-8{pT!$r!`~ZxraV~7#sUKF&JfPz(wx%uh2etcT-w)c_R+A z()l#^tgB9j|JyS%}J1?QFRtsika zQu-S6P<0eN&kSzHmFpvf(IA#eK1lRJ+kS%^OADbzk97`!HM0J$jVPx&J(mD_B3uQwh=zwCEWW0T zfleLSvm`U#Ydp66rtOLc6`fpEol=HTxO%hbqg=ZE-c+3?C#OnHh2)joZW|vFNYo8@ z&Wx3AZ*P+yuU1!>VM;-0dd8tv{`9oHN|R(rQndz1c0r#H+Jl#@M1V-B$!rBPR>il$ zH8&?k5l+k3>+)45xpo-+VoE|$q2YEP){JA#YDG7_W}VAf$)syT>wtE*XnA69efhw# z!|qyxnVVKj#A%OYJy%tAngkAwfGDYr5?;lvR)><()G#X6>{XPQsyKafzd1S6!^A)6 z1(?m)#}l<$KHOD{zgMAYX7%XJGE4N^!1XL_o5MvuDjBAyB=`QtEum4^2fg@?rnbPR zRV}6Tck zG{MQ5w9M|!+(7m^h`f&(5H11yU!Y2$$=DmrHJQ@p#|_|F2hwJMoDz?)!z@iclw8E- zXSsbX->`X?#C1Rq%t}rq_AscMCGqAI2@8p?9)U-Pj%prBPT~i-JAMK!@sOb#!17m5 z<|rF~;!z88{X?+ba+-+j!QZ}-AEUs@kuT9#=5`mL^}`>GWB@EWeQ1$%)})^zJ6ut~ z^l0mkEH}EX%Nn2Z!@-a@=L`7!n%Un@Bf$}jNGWO#7w4#IK=6ye<^ggNFzZAn5qk_v zRHOAos)MT>mJ2L{lMmy3K+%S&EiU?aY6pE-km*{0_!tY(&~%if7*m%tl3G{SPth&M z)tgWR_36`X)J1X~We7$wolz2c6JFDEw_RR;`Yw0ghQr}JNDXg7S11x1EA>|dh=^$l zbYN6izeK+gx`iUpI_?`1UCFNJOoZ5tGdR)YpoQ5FidBzSw~XJLwOI?H^MY%~3T6U? z%w7s$%!(BqCgTeB08SB9Nf2`eK>8_0RPyq`O)t8jum=CR>1^xKp(^~!Htt!J8Nj@P z+u3p@B27~y^7w9MT~NfcY}P!9G!W-Kf$Z$1EX_hO22xEm91P0&jV$mpZ%S*7DY)e5 zvC71kO^{-0LI}BIW_&i+OpPc2muG*Zp(0c3D=0?Fn*fE3i=nQlb2L8Jhc;PjB;EP5 zqw?LDL!^WkjUmJHLywR-lL|n>7|><-7>xzCpT23FY8h945jv{ug*C4ij*G*H24v(q zd*Tx;6TekIRi}*O%ZM-a*$PS&G;r-&x(;aYyQdOvq*5~$iyFJcvsMHfxl4M>A}f>a z*ssRhtjP$COYg65ZE>B^7LUj=KwJ`CxpX>`Um6vATLo;DFHGT{(;>t+Hl87!cNg%b}aoVwvFOzSn_Co zeNG7?nwG)zZUzBT3At(;LJ6dZQUYu%z7_py!?QwaOHEdp+lgH#znc0N=^2FIjD%4Y zt1(Nu7OI;e_mMUs@0~1zbVGU@B)yGAlyM@DzgGc1<94`Sz@BR+$cO5L*i8w@qirQ1 z0C^k0Cld-fNve!`HM?d}pxa_wv9t1mnkS|G+*DIlZF*fVu}k)~#s-1bRfmh+XP$9xWpk*yZ9lCVhebUkb*{rq8EqT#)N5gqF zs)0FMm9!dPATmhp=^!;G&JpkcoHd>+nkCtu{|AnP^_dt9jkUG2dT>_*QRLPGar`iS zMl{9Y)H^ViA^yOsvbGzKU(B~Ft@X23kbW;C;&z*!Nzhz>x|<4X_w%iJux8B$KP88_ z1DaP;9;N6iye;9jt@n z`k!`f?IS5t3fx4N`|0)c`+`)-*e;G7Lf}~}T`hQCaZ6cm9JrvMFxaU(%}W3$lspqu zoT4Uve0_mLlW^IV7^OR+>N|c!yw1Yx8DebOLnR|IrrD(#p|q*|C7D+VC>wwDY2_&V*boE9^DvO!iXu~OXY?x8TR>MF_OHC{qx;L*+1cF<6>5cbG@))Ii+0Mp6xRApbSbYsf~sAdUronU zaX`BMj*8UIMPKpBDary%ixXBFlX}SjQxFE!BM4gxT1W|pi`#3fO(^UsBte2wv>omo zMqBu2P?_4ckseRsu{ZyHf?$rIdB8S$79n;}PVZsf_Fe#Kz^}dUpcNR@4d3`!V| zT#uP^Ol%iqqsUu9e1sQ&ih*!2R*q#baVTjxZqPfqrnpL}7w5-lxw(EXw{SC=qCR?p z_FbsrZ3(7D#c;E0jzCp^G)_M+wnf{GAqr`>gt9MH3d%FC+W9}g!pf@9nxtudJwtQB zk_~iv<~Gbo)hN8{BuWF_q}>DQExVblF2$b;kXCv!s2Ef$mxLp%6S^{dJ9*cw$OQR4 zW(-AGF3c?Vy5gflV94;gGJA@J6hdg83~SkKAqlR z^ze%*u`A+_`5cvpGFa~@zJpJSZ`!4#RlKi4j0iNkmjU1yqU2$Yc`^fSFU|OLNC5Xl z02jytQ(s__DCHzJ?L$HgoP=fWBMb7>QTpzH(Oj zq}{p1aQ)51hviK4HYbV)6+r67AiO!dY)vVsq-1#aOAMwJf>9jX{%yQvFE!Z6dnuNp zK6t}uO0~*845Q@|7ERXnYvP?J)!W#^cxt_fD=v$erPC=|nXYg#G)G9?=3`jDFP-vVOUMDLh z{{Jv~Q}k+d;rPzOd9pl3s#Hux=AN8*jFepE4b^BD3Z~b4eXR9N?p^Bz1^qeRYSNDUdOiZ`7^-Aj8%1V?Z+4^k8uC+46H1Rr@%N^>CilRjqZ5gs$PP7}*hWycPdVhoIMKbf$1Gm9icSEoh``S(8DqM+h0Z9GQ0S4si1nfzbyQmV_ z6{(eOu6x9Y4my|FKZS%(Ou+1N~k5?A3ozf2D1+p3go+O zdwkt~ArX$)mjR@tHX*NrO0)|B**zKgd+2LHSFq!MNMj!d6#hjD@ z_3}d=_tsGBxEUj=abPMp-0=1NJin^R=t4X*Mf#a%e37GI#4RTpfNeVT9e3e^68F&w zTDox=v->~eoHKrK+$5xU^6ZJy5Dl}H;^M$oO8&MvWmef8(#-BmV-qOy;aeoU92Bg| zearS)k{%mqaQTS~T9!}CmRqjX3ZexH=@BV_{0^P@&6=W72TJPxrFg1oDifk7z`0~{b1f?H zf0nv9-AA2pj)*49i#m9tLrPbxx2kJwM@Jg}##TK4eEMoEylz>m+V9bd zJD)6{=UX4CZSoTUWB(c$FvyCS^QZz0zB$2j4}hjwa~n>s#K^^#b}d2{p>)f`LoJ6`xAR>7~!K|{qrW=e@kK#AYI zr_z($Mv1VMN`+h%%QD}Uc}8sCDD-SsZMgqQ)X?xh&2`YB@ud6>s6f+zOtWtu0=1hM zr!={JPIN%YfY^IzVqFBb?N1$7M`9&VwuH*Vb>b0Zxi9!QqJB+a&a4^U%B9~Pt z#|F+g$U#}86Gw5cRBp?}K5wGdEpIM3<5vT#!)?Oll%>Zgd7?MJ(!P2UHaH8(!*fqx zQlCpK1HxMx^$H*1QaOA{zl@GRRWb!n(emz$DY3Xc@eJj#w>-A4q#8UV+?d-*GErr1 zS;1JV5Dnsk^G0-yrWN|pD#_Vk12i!&-b;5(CD>#|O&qbb0}KAOxT$BkJouMBEw z{+){(U_Gmgp0~ko+{^+o*DC9gcm_@4bIp2P3&`*4-VpQh0FEyiFF27IG-(NX&y=cH zQsXoPISAKP@IdW82ON34mG7< zlf}D-BJ!XOO0e4Ilrku2BihAYJ7~8@L6rJAP;bQ6elm7)elxi$8HVf?KPP8AN)+k^ z@a9X~Emf%tys;-Je7DNmlo++Ty?oZOXE=(k} zgx51cq`7P-OGpz*`Mm$gv~k`MuQiOkbSx)2ud*Z32Cxd#H`kjN7>lxT0P87r(H0N%go-rpvoIwVZwGQ{&xFK5)$ea0V5-w;0Pz<-bLOjR1>I z%u60{$PLr;>G=%FYdd`gbp&b5`!fjgYXTx(h&5f^*l@8`a!N7x^Q0_DoJCr zLM@Ta=Kde47?ovn5$bssk})Iv%WaRjQ;pkix!}w#>3LNTbdzV+JkzoIs-MPG=QjrU zwUO<+(Y#1f24j)S;K9ueV!a86A!SHM9ECfaGwcwZPQZdZS)h8trYVpE=tZ3UdX7@J zNoTNP(s&s!WNQoMGljl7s+e-)(F}RkEl@9_NE-MYXr$?K)eS}M zlMWOMerQunP!@t|F3sLdGxy>#?XRu6SLWOEVPI{V;m!Ne}Ept5F!2j!kh zJ!~fKmaOnD9x2%7n%>tAG;awRveglrGOF5_;;y7CYHvOZcGoNHU;&Ts5VyfV+18X# z73C}dZcNKr zYD6e!Iz`-mUHcSxs+x_~tw;W)5wEoJ*&^0Xm%hWv60PH(8-w}xIeIs4(W%rFM73b0 zM$RpmvoXs<*YacFLQ0l#Tv`RoeYgQ`R0#{DiBIv@iVMe=trtv2HDrPRrse>Jr>dsV z?M6RfvBOEH-X|HM$5x)~l@;XVu1-6Zs2W_poZP^|RWy@CKoUFrx;;)Q(Rn1te&^zB zvASw1rHyr5n6?RbRe*T_dG+|RqcXlsWuQ9JE$1XRcrrGws~WnrS@A^F)V!nz(y&Xw zd@*GMUbw1(815w($V!9ac?tI*!R895@P;M>(QF_tS5n`jObWse!eg`>9RRyuPS2iG z)qJ{jdoH+<@Q9@d$%aqS;s1paASL{2ya;4FyPw=M^&z3F z7mykRL6xjef@zpfW>-|=v7B6>Hb>7&);3J)$2(4Hl1fJHGY0cM!Ak%D#(LB#hD3!r z-X2HRt}or@sxd4pwINW6D>m$Se#(bHmYW&u?B4vScZho(r57$A)rYd^+^v8bFpL4S z-qdtTD@7BHp&?}!YN3xnsiIy^uK;9Imw721wmWJE;;Pm%22iwGr6~*Opk9D&jdUuq z9@aP!LkW+m2ZEBcwR*rt8@_EPTfKiP*OqQMdqBS*^>fw$*sKGq`V?(LN?kIvaDR&%Lr}cj)3UvIjf*qFeJ5ss(*$nUg<~A%uaN{ z6*xRcrV$oSSY!BI6ocw#iYog`5g&Ik%K(@dedQt_GqKi7ZupIy2IkzaaUEZ52cguX zjxw8Ub{zd>ur@;Hp_N)j{cF;K_FcPB+EXs_@ToIuR*cE>GJG$hM9*tU`yBv z6urLyc>lOyn)$GGRMvTi&!%`th%V@z4LW75+RJuZlu=pAUQ9tEE!M5A_I$Pba8fy~ zbnlFra3Q{>)MrR)LGkTVK$ zZOr_kiK>#LU@EoR(J_R`+`Q8Fry1Yi#j39ElcM^us&0gLRo%&4gjh~mHi}@ZUm{r| zk5KkqVaEE_kt+ zi!B?^>hf5k8Hy1j+dq$7q1V|BQI(lMBziJd6`@x=y;UqiVG~`K^YP{F)uy&4>4tzL z{;+?36>soU`1=ukqi_9~d}CjKQ-5w>e%!v%ub;%%|Ng-buI>5{^m_aH)z8WcKdP_) zn0~b{hxq1a@z<{Z%ID=b_Vx1L-)bgZ(yHq*W2?i^!ne|H+=u!<(2mJYnSp1`svT$Z+-neeny}0 zllV)2{`d=YH|6WE@W0CcN)3@3Aa&`TmUy?NK?AX_z=6{v{)%X8r_!WJ=?dSV?y?y=4@0DxmySMT` zcm5Lpj@Q5aH}d)Rb?+!&P=EgW)%9QeSGnH4e))Il-OC@_Kl{nw;+y#S-~HvE<6qg= zZ~nTyQoh!o|M&Ru&*QJj*SC*DFb^Xq}a{oK;%Kg7h0vi6j6~3o$zlXmhVfOiNe_gJB`|EQ3TPhf~ zZg&5+F8_gRN_3w}3!|A>3`QOp&-_h$oK{prvycNEuZ$F0L(@P#yKey}k zZv40QcJ}q-_>FzGzX;#V_47Y&FVtUF|K!iMvm3Af(s$+gKk*T{;@9v?T5DT3)1Rat WTA%;b@6oA%efUcL#Qd+Fo&N)8i9r4U diff --git a/collector/docker/start.sh b/collector/docker/start.sh new file mode 100644 index 000000000..346da003c --- /dev/null +++ b/collector/docker/start.sh @@ -0,0 +1,8 @@ + +/usr/bin/kindling-probe-loader + +if [ -f "/opt/probe.o" ]; then + export SYSDIG_BPF_PROBE="/opt/probe.o" +fi + +/usr/bin/kindling-collector --config=/etc/kindling/config/kindling-collector-config.yml \ No newline at end of file diff --git a/collector/go.sum b/collector/go.sum index 76a3c8a1a..25f15949b 100644 --- a/collector/go.sum +++ b/collector/go.sum @@ -578,6 +578,7 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -590,6 +591,7 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0 h1:UG21uOlmZabA4fW5i7ZX6bjw1xELEGg/ZLgZq9auk/Q= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -836,6 +838,7 @@ golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/collector/model/kindling_event.go b/collector/model/kindling_event.go new file mode 100644 index 000000000..1b5983231 --- /dev/null +++ b/collector/model/kindling_event.go @@ -0,0 +1,517 @@ +package model + +import "encoding/json" + +type Source int32 + +const ( + Source_SOURCE_UNKNOWN Source = 0 + Source_SYSCALL_ENTER Source = 1 + Source_SYSCALL_EXIT Source = 2 + Source_TRACEPOINT Source = 3 + Source_KRPOBE Source = 4 + Source_KRETPROBE Source = 5 + Source_UPROBE Source = 6 + Source_URETPROBE Source = 7 +) + +var Source_name = map[int32]string{ + 0: "SOURCE_UNKNOWN", + 1: "SYSCALL_ENTER", + 2: "SYSCALL_EXIT", + 3: "TRACEPOINT", + 4: "KRPOBE", + 5: "KRETPROBE", + 6: "UPROBE", + 7: "URETPROBE", +} + +var Source_value = map[string]int32{ + "SOURCE_UNKNOWN": 0, + "SYSCALL_ENTER": 1, + "SYSCALL_EXIT": 2, + "TRACEPOINT": 3, + "KRPOBE": 4, + "KRETPROBE": 5, + "UPROBE": 6, + "URETPROBE": 7, +} + +func (x Source) String() string { + return "SOURCE_UNKNOWN" +} + +type Category int32 + +const ( + Category_CAT_NONE Category = 0 + Category_CAT_OTHER Category = 1 + Category_CAT_FILE Category = 2 + Category_CAT_NET Category = 3 + Category_CAT_IPC Category = 4 + Category_CAT_WAIT Category = 5 + Category_CAT_SIGNAL Category = 6 + Category_CAT_SLEEP Category = 7 + Category_CAT_TIME Category = 8 + Category_CAT_PROCESS Category = 9 + Category_CAT_SCHEDULER Category = 10 + Category_CAT_MEMORY Category = 11 + Category_CAT_USER Category = 12 + Category_CAT_SYSTEM Category = 13 +) + +var Category_name = map[int32]string{ + 0: "CAT_NONE", + 1: "CAT_OTHER", + 2: "CAT_FILE", + 3: "CAT_NET", + 4: "CAT_IPC", + 5: "CAT_WAIT", + 6: "CAT_SIGNAL", + 7: "CAT_SLEEP", + 8: "CAT_TIME", + 9: "CAT_PROCESS", + 10: "CAT_SCHEDULER", + 11: "CAT_MEMORY", + 12: "CAT_USER", + 13: "CAT_SYSTEM", +} + +var Category_value = map[string]int32{ + "CAT_NONE": 0, + "CAT_OTHER": 1, + "CAT_FILE": 2, + "CAT_NET": 3, + "CAT_IPC": 4, + "CAT_WAIT": 5, + "CAT_SIGNAL": 6, + "CAT_SLEEP": 7, + "CAT_TIME": 8, + "CAT_PROCESS": 9, + "CAT_SCHEDULER": 10, + "CAT_MEMORY": 11, + "CAT_USER": 12, + "CAT_SYSTEM": 13, +} + +type ValueType int32 + +const ( + ValueType_NONE ValueType = 0 + ValueType_INT8 ValueType = 1 + ValueType_INT16 ValueType = 2 + ValueType_INT32 ValueType = 3 + ValueType_INT64 ValueType = 4 + ValueType_UINT8 ValueType = 5 + ValueType_UINT16 ValueType = 6 + ValueType_UINT32 ValueType = 7 + ValueType_UINT64 ValueType = 8 + ValueType_CHARBUF ValueType = 9 + ValueType_BYTEBUF ValueType = 10 + ValueType_FLOAT ValueType = 11 + ValueType_DOUBLE ValueType = 12 + ValueType_BOOL ValueType = 13 +) + +var ValueType_name = map[int32]string{ + 0: "NONE", + 1: "INT8", + 2: "INT16", + 3: "INT32", + 4: "INT64", + 5: "UINT8", + 6: "UINT16", + 7: "UINT32", + 8: "UINT64", + 9: "CHARBUF", + 10: "BYTEBUF", + 11: "FLOAT", + 12: "DOUBLE", + 13: "BOOL", +} + +var ValueType_value = map[string]int32{ + "NONE": 0, + "INT8": 1, + "INT16": 2, + "INT32": 3, + "INT64": 4, + "UINT8": 5, + "UINT16": 6, + "UINT32": 7, + "UINT64": 8, + "CHARBUF": 9, + "BYTEBUF": 10, + "FLOAT": 11, + "DOUBLE": 12, + "BOOL": 13, +} + +// File Descriptor type +type FDType int32 + +const ( + FDType_FD_UNKNOWN FDType = 0 + FDType_FD_FILE FDType = 1 + FDType_FD_DIRECTORY FDType = 2 + FDType_FD_IPV4_SOCK FDType = 3 + FDType_FD_IPV6_SOCK FDType = 4 + FDType_FD_IPV4_SERVSOCK FDType = 5 + FDType_FD_IPV6_SERVSOCK FDType = 6 + FDType_FD_FIFO FDType = 7 + FDType_FD_UNIX_SOCK FDType = 8 + FDType_FD_EVENT FDType = 9 + FDType_FD_UNSUPPORTED FDType = 10 + FDType_FD_SIGNALFD FDType = 11 + FDType_FD_EVENTPOLL FDType = 12 + FDType_FD_INOTIFY FDType = 13 + FDType_FD_TIMERFD FDType = 14 + FDType_FD_NETLINK FDType = 15 + FDType_FD_FILE_V2 FDType = 16 +) + +var FDType_name = map[int32]string{ + 0: "FD_UNKNOWN", + 1: "FD_FILE", + 2: "FD_DIRECTORY", + 3: "FD_IPV4_SOCK", + 4: "FD_IPV6_SOCK", + 5: "FD_IPV4_SERVSOCK", + 6: "FD_IPV6_SERVSOCK", + 7: "FD_FIFO", + 8: "FD_UNIX_SOCK", + 9: "FD_EVENT", + 10: "FD_UNSUPPORTED", + 11: "FD_SIGNALFD", + 12: "FD_EVENTPOLL", + 13: "FD_INOTIFY", + 14: "FD_TIMERFD", + 15: "FD_NETLINK", + 16: "FD_FILE_V2", +} + +var FDType_value = map[string]int32{ + "FD_UNKNOWN": 0, + "FD_FILE": 1, + "FD_DIRECTORY": 2, + "FD_IPV4_SOCK": 3, + "FD_IPV6_SOCK": 4, + "FD_IPV4_SERVSOCK": 5, + "FD_IPV6_SERVSOCK": 6, + "FD_FIFO": 7, + "FD_UNIX_SOCK": 8, + "FD_EVENT": 9, + "FD_UNSUPPORTED": 10, + "FD_SIGNALFD": 11, + "FD_EVENTPOLL": 12, + "FD_INOTIFY": 13, + "FD_TIMERFD": 14, + "FD_NETLINK": 15, + "FD_FILE_V2": 16, +} + +type L4Proto int32 + +const ( + L4Proto_UNKNOWN L4Proto = 0 + L4Proto_TCP L4Proto = 1 + L4Proto_UDP L4Proto = 2 + L4Proto_ICMP L4Proto = 3 + L4Proto_RAW L4Proto = 4 +) + +var L4Proto_name = map[int32]string{ + 0: "UNKNOWN", + 1: "TCP", + 2: "UDP", + 3: "ICMP", + 4: "RAW", +} + +var L4Proto_value = map[string]int32{ + "UNKNOWN": 0, + "TCP": 1, + "UDP": 2, + "ICMP": 3, + "RAW": 4, +} + +func (m *KindlingEvent) String() string { + data, _ := json.Marshal(&m) + return string(data) +} + +type KindlingEvent struct { + Source Source + // Timestamp in nanoseconds at which the event were collected. + Timestamp uint64 + // Name of Kindling Event + Name string + // Category of Kindling Event, enum + Category Category + // Number of UserAttributes + ParamsNumber uint16 + // User-defined Attributions of Kindling Event, now including latency for syscall. + UserAttributes [8]KeyValue + // Context includes Thread information and Fd information. + Ctx Context +} + +func (k *KindlingEvent) Reset() { + k.Ctx.FdInfo.Num = 0 + k.Ctx.ThreadInfo.Pid = 0 +} + +func (m *KindlingEvent) GetSource() Source { + if m != nil { + return m.Source + } + return Source_SOURCE_UNKNOWN +} + +func (m *KindlingEvent) GetTimestamp() uint64 { + if m != nil { + return m.Timestamp + } + return 0 +} + +func (m *KindlingEvent) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *KindlingEvent) GetCategory() Category { + if m != nil { + return m.Category + } + return Category_CAT_NONE +} + +func (m *KindlingEvent) GetUserAttributes() *[8]KeyValue { + return &m.UserAttributes +} + +func (m *KindlingEvent) GetCtx() *Context { + return &m.Ctx +} + +type KeyValue struct { + // Arguments' Name or Attributions' Name. + Key string + // Type of Value. + ValueType ValueType + // Value of Key in bytes, should be converted according to ValueType. + Value []byte +} + +func (m *KeyValue) GetKey() string { + if m != nil { + return m.Key + } + return "" +} + +func (m *KeyValue) GetValueType() ValueType { + if m != nil { + return m.ValueType + } + return ValueType_NONE +} + +func (m *KeyValue) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +type Context struct { + // Thread information corresponding to Kindling Event, optional. + ThreadInfo Thread + // Fd information corresponding to Kindling Event, optional. + FdInfo Fd +} + +func (m *Context) GetThreadInfo() *Thread { + return &m.ThreadInfo +} + +func (m *Context) GetFdInfo() *Fd { + return &m.FdInfo +} + +type Thread struct { + // Process id of thread. + Pid uint32 + // Thread/task id of thread. + Tid uint32 + // User id of thread + Uid uint32 + // Group id of thread + Gid uint32 + // Command of thread. + Comm string + // ContainerId of thread + ContainerId string + // ContainerName of thread + ContainerName string +} + +func (m *Thread) GetPid() uint32 { + if m != nil { + return m.Pid + } + return 0 +} + +func (m *Thread) GetTid() uint32 { + if m != nil { + return m.Tid + } + return 0 +} + +func (m *Thread) GetUid() uint32 { + if m != nil { + return m.Uid + } + return 0 +} + +func (m *Thread) GetGid() uint32 { + if m != nil { + return m.Gid + } + return 0 +} + +func (m *Thread) GetComm() string { + if m != nil { + return m.Comm + } + return "" +} + +func (m *Thread) GetContainerId() string { + if m != nil { + return m.ContainerId + } + return "" +} + +func (m *Thread) GetContainerName() string { + if m != nil { + return m.ContainerName + } + return "" +} + +type Fd struct { + // FD number. + Num int32 + // Type of FD in enum. + TypeFd FDType + // if FD is type of file + Filename string + Directory string + // if FD is type of ipv4 or ipv6 + Protocol L4Proto + // repeated for ipv6, client_ip[0] for ipv4 + Role bool + Sip []uint32 + Dip []uint32 + Sport uint32 + Dport uint32 + // if FD is type of unix_sock + // Source socket endpoint + Source uint64 + // Destination socket endpoint + Destination uint64 +} + +func (m *Fd) GetNum() int32 { + if m != nil { + return m.Num + } + return 0 +} + +func (m *Fd) GetTypeFd() FDType { + if m != nil { + return m.TypeFd + } + return FDType_FD_UNKNOWN +} + +func (m *Fd) GetFilename() string { + if m != nil { + return m.Filename + } + return "" +} + +func (m *Fd) GetDirectory() string { + if m != nil { + return m.Directory + } + return "" +} + +func (m *Fd) GetProtocol() L4Proto { + if m != nil { + return m.Protocol + } + return L4Proto_UNKNOWN +} + +func (m *Fd) GetRole() bool { + if m != nil { + return m.Role + } + return false +} + +func (m *Fd) GetSip() []uint32 { + if m != nil { + return m.Sip + } + return nil +} + +func (m *Fd) GetDip() []uint32 { + if m != nil { + return m.Dip + } + return nil +} + +func (m *Fd) GetSport() uint32 { + if m != nil { + return m.Sport + } + return 0 +} + +func (m *Fd) GetDport() uint32 { + if m != nil { + return m.Dport + } + return 0 +} + +func (m *Fd) GetSource() uint64 { + if m != nil { + return m.Source + } + return 0 +} + +func (m *Fd) GetDestination() uint64 { + if m != nil { + return m.Destination + } + return 0 +} diff --git a/collector/model/kindling_event.pb.go b/collector/model/kindling_event.pb.go deleted file mode 100644 index 385822ca0..000000000 --- a/collector/model/kindling_event.pb.go +++ /dev/null @@ -1,895 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: kindling_event.proto - -package model - -import ( - fmt "fmt" - proto "github.com/gogo/protobuf/proto" - math "math" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -type Source int32 - -const ( - Source_SOURCE_UNKNOWN Source = 0 - Source_SYSCALL_ENTER Source = 1 - Source_SYSCALL_EXIT Source = 2 - Source_TRACEPOINT Source = 3 - Source_KRPOBE Source = 4 - Source_KRETPROBE Source = 5 - Source_UPROBE Source = 6 - Source_URETPROBE Source = 7 -) - -var Source_name = map[int32]string{ - 0: "SOURCE_UNKNOWN", - 1: "SYSCALL_ENTER", - 2: "SYSCALL_EXIT", - 3: "TRACEPOINT", - 4: "KRPOBE", - 5: "KRETPROBE", - 6: "UPROBE", - 7: "URETPROBE", -} - -var Source_value = map[string]int32{ - "SOURCE_UNKNOWN": 0, - "SYSCALL_ENTER": 1, - "SYSCALL_EXIT": 2, - "TRACEPOINT": 3, - "KRPOBE": 4, - "KRETPROBE": 5, - "UPROBE": 6, - "URETPROBE": 7, -} - -func (x Source) String() string { - return proto.EnumName(Source_name, int32(x)) -} - -func (Source) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_81bb5d1665ce2a0c, []int{0} -} - -type Category int32 - -const ( - Category_CAT_NONE Category = 0 - Category_CAT_OTHER Category = 1 - Category_CAT_FILE Category = 2 - Category_CAT_NET Category = 3 - Category_CAT_IPC Category = 4 - Category_CAT_WAIT Category = 5 - Category_CAT_SIGNAL Category = 6 - Category_CAT_SLEEP Category = 7 - Category_CAT_TIME Category = 8 - Category_CAT_PROCESS Category = 9 - Category_CAT_SCHEDULER Category = 10 - Category_CAT_MEMORY Category = 11 - Category_CAT_USER Category = 12 - Category_CAT_SYSTEM Category = 13 -) - -var Category_name = map[int32]string{ - 0: "CAT_NONE", - 1: "CAT_OTHER", - 2: "CAT_FILE", - 3: "CAT_NET", - 4: "CAT_IPC", - 5: "CAT_WAIT", - 6: "CAT_SIGNAL", - 7: "CAT_SLEEP", - 8: "CAT_TIME", - 9: "CAT_PROCESS", - 10: "CAT_SCHEDULER", - 11: "CAT_MEMORY", - 12: "CAT_USER", - 13: "CAT_SYSTEM", -} - -var Category_value = map[string]int32{ - "CAT_NONE": 0, - "CAT_OTHER": 1, - "CAT_FILE": 2, - "CAT_NET": 3, - "CAT_IPC": 4, - "CAT_WAIT": 5, - "CAT_SIGNAL": 6, - "CAT_SLEEP": 7, - "CAT_TIME": 8, - "CAT_PROCESS": 9, - "CAT_SCHEDULER": 10, - "CAT_MEMORY": 11, - "CAT_USER": 12, - "CAT_SYSTEM": 13, -} - -func (x Category) String() string { - return proto.EnumName(Category_name, int32(x)) -} - -func (Category) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_81bb5d1665ce2a0c, []int{1} -} - -type ValueType int32 - -const ( - ValueType_NONE ValueType = 0 - ValueType_INT8 ValueType = 1 - ValueType_INT16 ValueType = 2 - ValueType_INT32 ValueType = 3 - ValueType_INT64 ValueType = 4 - ValueType_UINT8 ValueType = 5 - ValueType_UINT16 ValueType = 6 - ValueType_UINT32 ValueType = 7 - ValueType_UINT64 ValueType = 8 - ValueType_CHARBUF ValueType = 9 - ValueType_BYTEBUF ValueType = 10 - ValueType_FLOAT ValueType = 11 - ValueType_DOUBLE ValueType = 12 - ValueType_BOOL ValueType = 13 -) - -var ValueType_name = map[int32]string{ - 0: "NONE", - 1: "INT8", - 2: "INT16", - 3: "INT32", - 4: "INT64", - 5: "UINT8", - 6: "UINT16", - 7: "UINT32", - 8: "UINT64", - 9: "CHARBUF", - 10: "BYTEBUF", - 11: "FLOAT", - 12: "DOUBLE", - 13: "BOOL", -} - -var ValueType_value = map[string]int32{ - "NONE": 0, - "INT8": 1, - "INT16": 2, - "INT32": 3, - "INT64": 4, - "UINT8": 5, - "UINT16": 6, - "UINT32": 7, - "UINT64": 8, - "CHARBUF": 9, - "BYTEBUF": 10, - "FLOAT": 11, - "DOUBLE": 12, - "BOOL": 13, -} - -func (x ValueType) String() string { - return proto.EnumName(ValueType_name, int32(x)) -} - -func (ValueType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_81bb5d1665ce2a0c, []int{2} -} - -// File Descriptor type -type FDType int32 - -const ( - FDType_FD_UNKNOWN FDType = 0 - FDType_FD_FILE FDType = 1 - FDType_FD_DIRECTORY FDType = 2 - FDType_FD_IPV4_SOCK FDType = 3 - FDType_FD_IPV6_SOCK FDType = 4 - FDType_FD_IPV4_SERVSOCK FDType = 5 - FDType_FD_IPV6_SERVSOCK FDType = 6 - FDType_FD_FIFO FDType = 7 - FDType_FD_UNIX_SOCK FDType = 8 - FDType_FD_EVENT FDType = 9 - FDType_FD_UNSUPPORTED FDType = 10 - FDType_FD_SIGNALFD FDType = 11 - FDType_FD_EVENTPOLL FDType = 12 - FDType_FD_INOTIFY FDType = 13 - FDType_FD_TIMERFD FDType = 14 - FDType_FD_NETLINK FDType = 15 - FDType_FD_FILE_V2 FDType = 16 -) - -var FDType_name = map[int32]string{ - 0: "FD_UNKNOWN", - 1: "FD_FILE", - 2: "FD_DIRECTORY", - 3: "FD_IPV4_SOCK", - 4: "FD_IPV6_SOCK", - 5: "FD_IPV4_SERVSOCK", - 6: "FD_IPV6_SERVSOCK", - 7: "FD_FIFO", - 8: "FD_UNIX_SOCK", - 9: "FD_EVENT", - 10: "FD_UNSUPPORTED", - 11: "FD_SIGNALFD", - 12: "FD_EVENTPOLL", - 13: "FD_INOTIFY", - 14: "FD_TIMERFD", - 15: "FD_NETLINK", - 16: "FD_FILE_V2", -} - -var FDType_value = map[string]int32{ - "FD_UNKNOWN": 0, - "FD_FILE": 1, - "FD_DIRECTORY": 2, - "FD_IPV4_SOCK": 3, - "FD_IPV6_SOCK": 4, - "FD_IPV4_SERVSOCK": 5, - "FD_IPV6_SERVSOCK": 6, - "FD_FIFO": 7, - "FD_UNIX_SOCK": 8, - "FD_EVENT": 9, - "FD_UNSUPPORTED": 10, - "FD_SIGNALFD": 11, - "FD_EVENTPOLL": 12, - "FD_INOTIFY": 13, - "FD_TIMERFD": 14, - "FD_NETLINK": 15, - "FD_FILE_V2": 16, -} - -func (x FDType) String() string { - return proto.EnumName(FDType_name, int32(x)) -} - -func (FDType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_81bb5d1665ce2a0c, []int{3} -} - -type L4Proto int32 - -const ( - L4Proto_UNKNOWN L4Proto = 0 - L4Proto_TCP L4Proto = 1 - L4Proto_UDP L4Proto = 2 - L4Proto_ICMP L4Proto = 3 - L4Proto_RAW L4Proto = 4 -) - -var L4Proto_name = map[int32]string{ - 0: "UNKNOWN", - 1: "TCP", - 2: "UDP", - 3: "ICMP", - 4: "RAW", -} - -var L4Proto_value = map[string]int32{ - "UNKNOWN": 0, - "TCP": 1, - "UDP": 2, - "ICMP": 3, - "RAW": 4, -} - -func (x L4Proto) String() string { - return proto.EnumName(L4Proto_name, int32(x)) -} - -func (L4Proto) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_81bb5d1665ce2a0c, []int{4} -} - -type KindlingEventList struct { - KindlingEventList []*KindlingEvent `protobuf:"bytes,1,rep,name=kindling_event_list,json=kindlingEventList,proto3" json:"kindling_event_list,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *KindlingEventList) Reset() { *m = KindlingEventList{} } -func (m *KindlingEventList) String() string { return proto.CompactTextString(m) } -func (*KindlingEventList) ProtoMessage() {} -func (*KindlingEventList) Descriptor() ([]byte, []int) { - return fileDescriptor_81bb5d1665ce2a0c, []int{0} -} -func (m *KindlingEventList) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_KindlingEventList.Unmarshal(m, b) -} -func (m *KindlingEventList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_KindlingEventList.Marshal(b, m, deterministic) -} -func (m *KindlingEventList) XXX_Merge(src proto.Message) { - xxx_messageInfo_KindlingEventList.Merge(m, src) -} -func (m *KindlingEventList) XXX_Size() int { - return xxx_messageInfo_KindlingEventList.Size(m) -} -func (m *KindlingEventList) XXX_DiscardUnknown() { - xxx_messageInfo_KindlingEventList.DiscardUnknown(m) -} - -var xxx_messageInfo_KindlingEventList proto.InternalMessageInfo - -func (m *KindlingEventList) GetKindlingEventList() []*KindlingEvent { - if m != nil { - return m.KindlingEventList - } - return nil -} - -type KindlingEvent struct { - Source Source `protobuf:"varint,1,opt,name=source,proto3,enum=kindling.Source" json:"source,omitempty"` - // Timestamp in nanoseconds at which the event were collected. - Timestamp uint64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - // Name of Kindling Event - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - // Category of Kindling Event, enum - Category Category `protobuf:"varint,4,opt,name=category,proto3,enum=kindling.Category" json:"category,omitempty"` - // Native attributes of hook point, including arguments or return value. - NativeAttributes *Property `protobuf:"bytes,5,opt,name=Native_attributes,json=NativeAttributes,proto3" json:"Native_attributes,omitempty"` - // User-defined Attributions of Kindling Event, now including latency for syscall. - UserAttributes []*KeyValue `protobuf:"bytes,6,rep,name=user_attributes,json=userAttributes,proto3" json:"user_attributes,omitempty"` - // Context includes Thread information and Fd information. - Ctx *Context `protobuf:"bytes,7,opt,name=ctx,proto3" json:"ctx,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *KindlingEvent) Reset() { *m = KindlingEvent{} } -func (m *KindlingEvent) String() string { return proto.CompactTextString(m) } -func (*KindlingEvent) ProtoMessage() {} -func (*KindlingEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_81bb5d1665ce2a0c, []int{1} -} -func (m *KindlingEvent) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_KindlingEvent.Unmarshal(m, b) -} -func (m *KindlingEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_KindlingEvent.Marshal(b, m, deterministic) -} -func (m *KindlingEvent) XXX_Merge(src proto.Message) { - xxx_messageInfo_KindlingEvent.Merge(m, src) -} -func (m *KindlingEvent) XXX_Size() int { - return xxx_messageInfo_KindlingEvent.Size(m) -} -func (m *KindlingEvent) XXX_DiscardUnknown() { - xxx_messageInfo_KindlingEvent.DiscardUnknown(m) -} - -var xxx_messageInfo_KindlingEvent proto.InternalMessageInfo - -func (m *KindlingEvent) GetSource() Source { - if m != nil { - return m.Source - } - return Source_SOURCE_UNKNOWN -} - -func (m *KindlingEvent) GetTimestamp() uint64 { - if m != nil { - return m.Timestamp - } - return 0 -} - -func (m *KindlingEvent) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *KindlingEvent) GetCategory() Category { - if m != nil { - return m.Category - } - return Category_CAT_NONE -} - -func (m *KindlingEvent) GetNativeAttributes() *Property { - if m != nil { - return m.NativeAttributes - } - return nil -} - -func (m *KindlingEvent) GetUserAttributes() []*KeyValue { - if m != nil { - return m.UserAttributes - } - return nil -} - -func (m *KindlingEvent) GetCtx() *Context { - if m != nil { - return m.Ctx - } - return nil -} - -type Property struct { - // If type of syscall_enter, kprobe, uprobe, tracepoint - Args []*KeyValue `protobuf:"bytes,1,rep,name=args,proto3" json:"args,omitempty"` - // If type of syscall_exit, kretprobe, uretprobe - Ret []*KeyValue `protobuf:"bytes,2,rep,name=ret,proto3" json:"ret,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Property) Reset() { *m = Property{} } -func (m *Property) String() string { return proto.CompactTextString(m) } -func (*Property) ProtoMessage() {} -func (*Property) Descriptor() ([]byte, []int) { - return fileDescriptor_81bb5d1665ce2a0c, []int{2} -} -func (m *Property) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Property.Unmarshal(m, b) -} -func (m *Property) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Property.Marshal(b, m, deterministic) -} -func (m *Property) XXX_Merge(src proto.Message) { - xxx_messageInfo_Property.Merge(m, src) -} -func (m *Property) XXX_Size() int { - return xxx_messageInfo_Property.Size(m) -} -func (m *Property) XXX_DiscardUnknown() { - xxx_messageInfo_Property.DiscardUnknown(m) -} - -var xxx_messageInfo_Property proto.InternalMessageInfo - -func (m *Property) GetArgs() []*KeyValue { - if m != nil { - return m.Args - } - return nil -} - -func (m *Property) GetRet() []*KeyValue { - if m != nil { - return m.Ret - } - return nil -} - -type KeyValue struct { - // Arguments' Name or Attributions' Name. - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - // Type of Value. - ValueType ValueType `protobuf:"varint,2,opt,name=value_type,json=valueType,proto3,enum=kindling.ValueType" json:"value_type,omitempty"` - // Value of Key in bytes, should be converted according to ValueType. - Value []byte `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *KeyValue) Reset() { *m = KeyValue{} } -func (m *KeyValue) String() string { return proto.CompactTextString(m) } -func (*KeyValue) ProtoMessage() {} -func (*KeyValue) Descriptor() ([]byte, []int) { - return fileDescriptor_81bb5d1665ce2a0c, []int{3} -} -func (m *KeyValue) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_KeyValue.Unmarshal(m, b) -} -func (m *KeyValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_KeyValue.Marshal(b, m, deterministic) -} -func (m *KeyValue) XXX_Merge(src proto.Message) { - xxx_messageInfo_KeyValue.Merge(m, src) -} -func (m *KeyValue) XXX_Size() int { - return xxx_messageInfo_KeyValue.Size(m) -} -func (m *KeyValue) XXX_DiscardUnknown() { - xxx_messageInfo_KeyValue.DiscardUnknown(m) -} - -var xxx_messageInfo_KeyValue proto.InternalMessageInfo - -func (m *KeyValue) GetKey() string { - if m != nil { - return m.Key - } - return "" -} - -func (m *KeyValue) GetValueType() ValueType { - if m != nil { - return m.ValueType - } - return ValueType_NONE -} - -func (m *KeyValue) GetValue() []byte { - if m != nil { - return m.Value - } - return nil -} - -type Context struct { - // Thread information corresponding to Kindling Event, optional. - ThreadInfo *Thread `protobuf:"bytes,1,opt,name=thread_info,json=threadInfo,proto3" json:"thread_info,omitempty"` - // Fd information corresponding to Kindling Event, optional. - FdInfo *Fd `protobuf:"bytes,2,opt,name=fd_info,json=fdInfo,proto3" json:"fd_info,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Context) Reset() { *m = Context{} } -func (m *Context) String() string { return proto.CompactTextString(m) } -func (*Context) ProtoMessage() {} -func (*Context) Descriptor() ([]byte, []int) { - return fileDescriptor_81bb5d1665ce2a0c, []int{4} -} -func (m *Context) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Context.Unmarshal(m, b) -} -func (m *Context) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Context.Marshal(b, m, deterministic) -} -func (m *Context) XXX_Merge(src proto.Message) { - xxx_messageInfo_Context.Merge(m, src) -} -func (m *Context) XXX_Size() int { - return xxx_messageInfo_Context.Size(m) -} -func (m *Context) XXX_DiscardUnknown() { - xxx_messageInfo_Context.DiscardUnknown(m) -} - -var xxx_messageInfo_Context proto.InternalMessageInfo - -func (m *Context) GetThreadInfo() *Thread { - if m != nil { - return m.ThreadInfo - } - return nil -} - -func (m *Context) GetFdInfo() *Fd { - if m != nil { - return m.FdInfo - } - return nil -} - -type Thread struct { - // Process id of thread. - Pid uint32 `protobuf:"varint,1,opt,name=pid,proto3" json:"pid,omitempty"` - // Thread/task id of thread. - Tid uint32 `protobuf:"varint,2,opt,name=tid,proto3" json:"tid,omitempty"` - // User id of thread - Uid uint32 `protobuf:"varint,3,opt,name=uid,proto3" json:"uid,omitempty"` - // Group id of thread - Gid uint32 `protobuf:"varint,4,opt,name=gid,proto3" json:"gid,omitempty"` - // Command of thread. - Comm string `protobuf:"bytes,5,opt,name=comm,proto3" json:"comm,omitempty"` - // ContainerId of thread - ContainerId string `protobuf:"bytes,6,opt,name=container_id,json=containerId,proto3" json:"container_id,omitempty"` - // ContainerName of thread - ContainerName string `protobuf:"bytes,7,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Thread) Reset() { *m = Thread{} } -func (m *Thread) String() string { return proto.CompactTextString(m) } -func (*Thread) ProtoMessage() {} -func (*Thread) Descriptor() ([]byte, []int) { - return fileDescriptor_81bb5d1665ce2a0c, []int{5} -} -func (m *Thread) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Thread.Unmarshal(m, b) -} -func (m *Thread) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Thread.Marshal(b, m, deterministic) -} -func (m *Thread) XXX_Merge(src proto.Message) { - xxx_messageInfo_Thread.Merge(m, src) -} -func (m *Thread) XXX_Size() int { - return xxx_messageInfo_Thread.Size(m) -} -func (m *Thread) XXX_DiscardUnknown() { - xxx_messageInfo_Thread.DiscardUnknown(m) -} - -var xxx_messageInfo_Thread proto.InternalMessageInfo - -func (m *Thread) GetPid() uint32 { - if m != nil { - return m.Pid - } - return 0 -} - -func (m *Thread) GetTid() uint32 { - if m != nil { - return m.Tid - } - return 0 -} - -func (m *Thread) GetUid() uint32 { - if m != nil { - return m.Uid - } - return 0 -} - -func (m *Thread) GetGid() uint32 { - if m != nil { - return m.Gid - } - return 0 -} - -func (m *Thread) GetComm() string { - if m != nil { - return m.Comm - } - return "" -} - -func (m *Thread) GetContainerId() string { - if m != nil { - return m.ContainerId - } - return "" -} - -func (m *Thread) GetContainerName() string { - if m != nil { - return m.ContainerName - } - return "" -} - -type Fd struct { - // FD number. - Num int32 `protobuf:"varint,1,opt,name=num,proto3" json:"num,omitempty"` - // Type of FD in enum. - TypeFd FDType `protobuf:"varint,2,opt,name=type_fd,json=typeFd,proto3,enum=kindling.FDType" json:"type_fd,omitempty"` - // if FD is type of file - Filename string `protobuf:"bytes,3,opt,name=filename,proto3" json:"filename,omitempty"` - Directory string `protobuf:"bytes,4,opt,name=directory,proto3" json:"directory,omitempty"` - // if FD is type of ipv4 or ipv6 - Protocol L4Proto `protobuf:"varint,5,opt,name=protocol,proto3,enum=kindling.L4Proto" json:"protocol,omitempty"` - // repeated for ipv6, client_ip[0] for ipv4 - Role bool `protobuf:"varint,6,opt,name=role,proto3" json:"role,omitempty"` - Sip []uint32 `protobuf:"varint,7,rep,packed,name=sip,proto3" json:"sip,omitempty"` - Dip []uint32 `protobuf:"varint,8,rep,packed,name=dip,proto3" json:"dip,omitempty"` - Sport uint32 `protobuf:"varint,9,opt,name=sport,proto3" json:"sport,omitempty"` - Dport uint32 `protobuf:"varint,10,opt,name=dport,proto3" json:"dport,omitempty"` - // if FD is type of unix_sock - // Source socket endpoint - Source uint64 `protobuf:"varint,11,opt,name=source,proto3" json:"source,omitempty"` - // Destination socket endpoint - Destination uint64 `protobuf:"varint,12,opt,name=destination,proto3" json:"destination,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Fd) Reset() { *m = Fd{} } -func (m *Fd) String() string { return proto.CompactTextString(m) } -func (*Fd) ProtoMessage() {} -func (*Fd) Descriptor() ([]byte, []int) { - return fileDescriptor_81bb5d1665ce2a0c, []int{6} -} -func (m *Fd) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Fd.Unmarshal(m, b) -} -func (m *Fd) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Fd.Marshal(b, m, deterministic) -} -func (m *Fd) XXX_Merge(src proto.Message) { - xxx_messageInfo_Fd.Merge(m, src) -} -func (m *Fd) XXX_Size() int { - return xxx_messageInfo_Fd.Size(m) -} -func (m *Fd) XXX_DiscardUnknown() { - xxx_messageInfo_Fd.DiscardUnknown(m) -} - -var xxx_messageInfo_Fd proto.InternalMessageInfo - -func (m *Fd) GetNum() int32 { - if m != nil { - return m.Num - } - return 0 -} - -func (m *Fd) GetTypeFd() FDType { - if m != nil { - return m.TypeFd - } - return FDType_FD_UNKNOWN -} - -func (m *Fd) GetFilename() string { - if m != nil { - return m.Filename - } - return "" -} - -func (m *Fd) GetDirectory() string { - if m != nil { - return m.Directory - } - return "" -} - -func (m *Fd) GetProtocol() L4Proto { - if m != nil { - return m.Protocol - } - return L4Proto_UNKNOWN -} - -func (m *Fd) GetRole() bool { - if m != nil { - return m.Role - } - return false -} - -func (m *Fd) GetSip() []uint32 { - if m != nil { - return m.Sip - } - return nil -} - -func (m *Fd) GetDip() []uint32 { - if m != nil { - return m.Dip - } - return nil -} - -func (m *Fd) GetSport() uint32 { - if m != nil { - return m.Sport - } - return 0 -} - -func (m *Fd) GetDport() uint32 { - if m != nil { - return m.Dport - } - return 0 -} - -func (m *Fd) GetSource() uint64 { - if m != nil { - return m.Source - } - return 0 -} - -func (m *Fd) GetDestination() uint64 { - if m != nil { - return m.Destination - } - return 0 -} - -func init() { - proto.RegisterEnum("kindling.Source", Source_name, Source_value) - proto.RegisterEnum("kindling.Category", Category_name, Category_value) - proto.RegisterEnum("kindling.ValueType", ValueType_name, ValueType_value) - proto.RegisterEnum("kindling.FDType", FDType_name, FDType_value) - proto.RegisterEnum("kindling.L4Proto", L4Proto_name, L4Proto_value) - proto.RegisterType((*KindlingEventList)(nil), "kindling.KindlingEventList") - proto.RegisterType((*KindlingEvent)(nil), "kindling.KindlingEvent") - proto.RegisterType((*Property)(nil), "kindling.Property") - proto.RegisterType((*KeyValue)(nil), "kindling.KeyValue") - proto.RegisterType((*Context)(nil), "kindling.Context") - proto.RegisterType((*Thread)(nil), "kindling.Thread") - proto.RegisterType((*Fd)(nil), "kindling.Fd") -} - -func init() { proto.RegisterFile("kindling_event.proto", fileDescriptor_81bb5d1665ce2a0c) } - -var fileDescriptor_81bb5d1665ce2a0c = []byte{ - // 1158 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x54, 0xdb, 0x6e, 0xdb, 0x46, - 0x13, 0x0e, 0x75, 0xe0, 0x61, 0x28, 0x29, 0xeb, 0x4d, 0xf0, 0xff, 0x44, 0xd1, 0x0b, 0x55, 0x6d, - 0x0a, 0xd7, 0x40, 0x5d, 0x44, 0x31, 0x8c, 0x02, 0xb9, 0x28, 0x64, 0x71, 0x99, 0x10, 0xa2, 0x49, - 0x62, 0x45, 0x39, 0x71, 0x51, 0x80, 0x50, 0x44, 0xca, 0x25, 0x22, 0x89, 0x02, 0x45, 0x1b, 0xd1, - 0x13, 0xf4, 0x5d, 0x5a, 0xa0, 0x8f, 0xd0, 0xeb, 0x3e, 0x44, 0x1f, 0xa6, 0x98, 0xe5, 0x41, 0x72, - 0xd1, 0xde, 0x10, 0xdf, 0x7c, 0xf3, 0xcd, 0x81, 0xb3, 0xb3, 0x0b, 0xcf, 0x3f, 0x26, 0x9b, 0x68, - 0x95, 0x6c, 0xee, 0xc2, 0xf8, 0x21, 0xde, 0xe4, 0xe7, 0xdb, 0x2c, 0xcd, 0x53, 0xaa, 0x56, 0xec, - 0xe0, 0x27, 0x38, 0x99, 0x94, 0x98, 0xa1, 0xc0, 0x49, 0x76, 0x39, 0x7d, 0x03, 0xcf, 0x1e, 0x87, - 0x85, 0xab, 0x64, 0x97, 0x1b, 0x52, 0xbf, 0x79, 0xaa, 0x0f, 0xff, 0x7f, 0x5e, 0xf9, 0xce, 0x1f, - 0x45, 0xf2, 0x93, 0x8f, 0xff, 0x4c, 0x34, 0xf8, 0xa3, 0x01, 0xdd, 0x47, 0x22, 0x7a, 0x0a, 0xf2, - 0x2e, 0xbd, 0xcf, 0x16, 0xb1, 0x21, 0xf5, 0xa5, 0xd3, 0xde, 0x90, 0x1c, 0xb2, 0x4d, 0x05, 0xcf, - 0x4b, 0x3f, 0xfd, 0x1c, 0xb4, 0x3c, 0x59, 0xc7, 0xbb, 0x7c, 0xbe, 0xde, 0x1a, 0x8d, 0xbe, 0x74, - 0xda, 0xe2, 0x07, 0x82, 0x52, 0x68, 0x6d, 0xe6, 0xeb, 0xd8, 0x68, 0xf6, 0xa5, 0x53, 0x8d, 0x0b, - 0x4c, 0xcf, 0x41, 0x5d, 0xcc, 0xf3, 0xf8, 0x2e, 0xcd, 0xf6, 0x46, 0x4b, 0x64, 0xa7, 0x87, 0xec, - 0xe3, 0xd2, 0xc3, 0x6b, 0x0d, 0xfd, 0x01, 0x4e, 0xdc, 0x79, 0x9e, 0x3c, 0xc4, 0xe1, 0x3c, 0xcf, - 0xb3, 0xe4, 0xc3, 0x7d, 0x1e, 0xef, 0x8c, 0x76, 0x5f, 0x3a, 0xd5, 0x8f, 0x03, 0xfd, 0x2c, 0xdd, - 0xc6, 0x59, 0xbe, 0xe7, 0xa4, 0x10, 0x8f, 0x6a, 0x2d, 0x7d, 0x0d, 0x4f, 0xef, 0x77, 0x71, 0x76, - 0x1c, 0x2e, 0x8b, 0x19, 0x1d, 0x85, 0x4f, 0xe2, 0xfd, 0xcd, 0x7c, 0x75, 0x1f, 0xf3, 0x1e, 0x4a, - 0x8f, 0x82, 0xbf, 0x84, 0xe6, 0x22, 0xff, 0x64, 0x28, 0xa2, 0xde, 0xc9, 0x51, 0xa3, 0xe9, 0x26, - 0x8f, 0x3f, 0xe5, 0x1c, 0xbd, 0x83, 0xf7, 0xa0, 0x56, 0xf5, 0xe9, 0xd7, 0xd0, 0x9a, 0x67, 0x77, - 0xbb, 0xf2, 0x18, 0xfe, 0xad, 0x84, 0xf0, 0xd3, 0xaf, 0xa0, 0x99, 0xc5, 0xb9, 0xd1, 0xf8, 0x4f, - 0x19, 0xba, 0x07, 0x4b, 0x50, 0x2b, 0x82, 0x12, 0x68, 0x7e, 0x8c, 0xf7, 0xe2, 0x44, 0x34, 0x8e, - 0x90, 0x0e, 0x01, 0x1e, 0xd0, 0x15, 0xe6, 0xfb, 0x6d, 0x2c, 0xa6, 0xdf, 0x1b, 0x3e, 0x3b, 0xa4, - 0x12, 0x61, 0xc1, 0x7e, 0x1b, 0x73, 0xed, 0xa1, 0x82, 0xf4, 0x39, 0xb4, 0x85, 0x21, 0xce, 0xa4, - 0xc3, 0x0b, 0x63, 0xb0, 0x00, 0xa5, 0xfc, 0x23, 0xfa, 0x12, 0xf4, 0xfc, 0xe7, 0x2c, 0x9e, 0x47, - 0x61, 0xb2, 0x59, 0xa6, 0xa2, 0x9c, 0x7e, 0xbc, 0x00, 0x81, 0x70, 0x72, 0x28, 0x44, 0xf6, 0x66, - 0x99, 0xd2, 0x17, 0xa0, 0x2c, 0x4b, 0x79, 0x43, 0xc8, 0x3b, 0x07, 0xb9, 0x15, 0x71, 0x79, 0x29, - 0x64, 0x83, 0xdf, 0x25, 0x90, 0x8b, 0x68, 0xfc, 0x97, 0x6d, 0x12, 0x89, 0xe4, 0x5d, 0x8e, 0x10, - 0x99, 0x3c, 0x89, 0x44, 0x7c, 0x97, 0x23, 0x44, 0xe6, 0x3e, 0x89, 0x44, 0x9f, 0x5d, 0x8e, 0x10, - 0x99, 0xbb, 0x24, 0x12, 0x5b, 0xd3, 0xe5, 0x08, 0x71, 0xc1, 0x16, 0xe9, 0x7a, 0x2d, 0xf6, 0x41, - 0xe3, 0x02, 0xd3, 0x2f, 0xa0, 0xb3, 0x48, 0x37, 0xf9, 0x3c, 0xd9, 0xc4, 0x59, 0x98, 0x44, 0x86, - 0x2c, 0x7c, 0x7a, 0xcd, 0xd9, 0x11, 0x7d, 0x01, 0xbd, 0x83, 0x44, 0x6c, 0xa8, 0x22, 0x44, 0xdd, - 0x9a, 0x75, 0xe7, 0xeb, 0x78, 0xf0, 0x67, 0x03, 0x1a, 0x96, 0x28, 0xbb, 0xb9, 0x5f, 0x8b, 0x66, - 0xdb, 0x1c, 0x21, 0xfd, 0x06, 0x14, 0x1c, 0x79, 0xb8, 0x8c, 0xca, 0xa9, 0x1f, 0xcd, 0xc7, 0x32, - 0xc5, 0xc8, 0x65, 0x14, 0x58, 0x11, 0xfd, 0x0c, 0xd4, 0x65, 0xb2, 0x8a, 0x8f, 0xae, 0x41, 0x6d, - 0xe3, 0xe5, 0x89, 0x92, 0x2c, 0x5e, 0xe4, 0xd5, 0x5d, 0xd0, 0xf8, 0x81, 0xa0, 0xdf, 0x82, 0x2a, - 0xde, 0x81, 0x45, 0xba, 0x12, 0xff, 0xd7, 0x3b, 0xde, 0x3f, 0xe7, 0xc2, 0x47, 0x1f, 0xaf, 0x25, - 0x38, 0x8a, 0x2c, 0x5d, 0xc5, 0xe2, 0x77, 0x55, 0x2e, 0x30, 0x76, 0xbe, 0x4b, 0xb6, 0x86, 0xd2, - 0x6f, 0xe2, 0xc0, 0x76, 0xc9, 0x16, 0x99, 0x28, 0xd9, 0x1a, 0x6a, 0xc1, 0x44, 0xc9, 0x16, 0x17, - 0x62, 0xb7, 0x4d, 0xb3, 0xdc, 0xd0, 0xc4, 0x58, 0x0b, 0x03, 0xd9, 0x48, 0xb0, 0x50, 0xb0, 0xc2, - 0xa0, 0xff, 0xab, 0xdf, 0x05, 0x5d, 0x5c, 0xf5, 0xea, 0x15, 0xe8, 0x83, 0x1e, 0xc5, 0xbb, 0x3c, - 0xd9, 0xcc, 0xf3, 0x24, 0xdd, 0x18, 0x1d, 0xe1, 0x3c, 0xa6, 0xce, 0x7e, 0x91, 0x40, 0x2e, 0x9e, - 0x0e, 0x4a, 0xa1, 0x37, 0xf5, 0x66, 0x7c, 0xcc, 0xc2, 0x99, 0x3b, 0x71, 0xbd, 0x77, 0x2e, 0x79, - 0x42, 0x4f, 0xa0, 0x3b, 0xbd, 0x9d, 0x8e, 0x47, 0x8e, 0x13, 0x32, 0x37, 0x60, 0x9c, 0x48, 0x94, - 0x40, 0xa7, 0xa6, 0xde, 0xdb, 0x01, 0x69, 0xd0, 0x1e, 0x40, 0xc0, 0x47, 0x63, 0xe6, 0x7b, 0xb6, - 0x1b, 0x90, 0x26, 0x05, 0x90, 0x27, 0xdc, 0xf7, 0xae, 0x18, 0x69, 0xd1, 0x2e, 0x68, 0x13, 0xce, - 0x02, 0x9f, 0xa3, 0xd9, 0x46, 0xd7, 0xac, 0xc0, 0x32, 0xba, 0x66, 0xb5, 0x4b, 0x39, 0xfb, 0x4b, - 0x02, 0xb5, 0x7a, 0x66, 0x68, 0x07, 0xd4, 0xf1, 0x28, 0x08, 0x5d, 0xcf, 0x65, 0xe4, 0x09, 0x2a, - 0xd1, 0xf2, 0x82, 0xb7, 0xa2, 0x83, 0xd2, 0x69, 0xd9, 0x0e, 0x23, 0x0d, 0xaa, 0x83, 0x22, 0xa4, - 0x0c, 0x4b, 0x97, 0x86, 0xed, 0x8f, 0x49, 0xab, 0xd2, 0xbd, 0x1b, 0xd9, 0x01, 0x69, 0x63, 0x97, - 0x68, 0x4d, 0xed, 0x37, 0xee, 0xc8, 0x29, 0xca, 0x0b, 0xdb, 0x61, 0xcc, 0x27, 0x4a, 0x25, 0x0e, - 0xec, 0x6b, 0x46, 0x54, 0xfa, 0x14, 0x74, 0xb4, 0x7c, 0xee, 0x8d, 0xd9, 0x74, 0x4a, 0x34, 0x1c, - 0x84, 0x50, 0x8f, 0xdf, 0x32, 0x73, 0xe6, 0x30, 0x4e, 0xa0, 0x4a, 0x78, 0xcd, 0xae, 0x3d, 0x7e, - 0x4b, 0xf4, 0x2a, 0xc3, 0x6c, 0xca, 0x38, 0xe9, 0xd4, 0xe5, 0x6e, 0xa7, 0x01, 0xbb, 0x26, 0xdd, - 0xb3, 0x5f, 0x25, 0xd0, 0xea, 0x8b, 0x4f, 0x55, 0x68, 0x95, 0xff, 0xa6, 0x42, 0xcb, 0x76, 0x83, - 0xef, 0x89, 0x44, 0x35, 0x68, 0xdb, 0x6e, 0xf0, 0xf2, 0x92, 0x34, 0x4a, 0xf8, 0x6a, 0x48, 0x9a, - 0x25, 0xbc, 0xbc, 0x20, 0x2d, 0x84, 0x33, 0xa1, 0x2d, 0xe6, 0x58, 0x88, 0xe5, 0x0a, 0xbf, 0x1a, - 0x12, 0xa5, 0xc2, 0x97, 0x17, 0x44, 0x15, 0xb3, 0x78, 0x3b, 0xe2, 0x57, 0x33, 0x8b, 0x68, 0x68, - 0x5c, 0xdd, 0x06, 0x0c, 0x0d, 0xc0, 0x44, 0x96, 0xe3, 0x8d, 0x02, 0xa2, 0x63, 0x80, 0xe9, 0xcd, - 0xae, 0x1c, 0x46, 0x3a, 0xd8, 0xca, 0x95, 0xe7, 0x39, 0xa4, 0x7b, 0xf6, 0x5b, 0x03, 0xe4, 0xe2, - 0xbe, 0xe0, 0x7f, 0x58, 0xe6, 0xd1, 0x46, 0xe8, 0xa0, 0x58, 0x66, 0x31, 0x7b, 0xb1, 0x0b, 0x96, - 0x19, 0x9a, 0x36, 0x67, 0xe3, 0x00, 0x87, 0xd0, 0x28, 0x19, 0xdb, 0xbf, 0xb9, 0x08, 0xa7, 0xde, - 0x78, 0x42, 0x9a, 0x07, 0xe6, 0xb2, 0x60, 0x5a, 0xf4, 0x39, 0x90, 0x5a, 0xc3, 0xf8, 0x8d, 0x60, - 0xdb, 0x07, 0xf6, 0xf2, 0xc0, 0xca, 0x75, 0x39, 0xcb, 0x23, 0x4a, 0x99, 0x6a, 0xe6, 0xda, 0xef, - 0x8b, 0x54, 0x2a, 0xce, 0xdc, 0x32, 0x43, 0x76, 0xc3, 0xdc, 0x80, 0x68, 0xb8, 0xc1, 0xc2, 0x3f, - 0x9d, 0xf9, 0xbe, 0xc7, 0x03, 0x66, 0x12, 0xc0, 0x93, 0xb4, 0xcc, 0xf2, 0xd4, 0x2d, 0x93, 0xe8, - 0x65, 0x12, 0x11, 0xe2, 0x7b, 0x8e, 0x53, 0x1c, 0x15, 0x56, 0x76, 0xbd, 0xc0, 0xb6, 0x6e, 0x49, - 0xb7, 0xb4, 0x71, 0x13, 0xb8, 0x65, 0x92, 0x5e, 0x69, 0xbb, 0x2c, 0x70, 0x6c, 0x77, 0x42, 0x9e, - 0x96, 0x36, 0x8e, 0x20, 0xbc, 0x19, 0x12, 0x72, 0xf6, 0x1a, 0x94, 0xf2, 0xda, 0x63, 0xbb, 0x87, - 0x51, 0x29, 0xd0, 0x0c, 0xc6, 0x3e, 0x91, 0x10, 0xcc, 0x4c, 0x9f, 0x34, 0xc4, 0x61, 0x8f, 0xaf, - 0x7d, 0xd2, 0x44, 0x8a, 0x8f, 0xde, 0x91, 0xd6, 0x55, 0xf7, 0x47, 0x7d, 0x9d, 0x46, 0xf1, 0xea, - 0x3b, 0xf1, 0xfd, 0x20, 0x8b, 0x77, 0xe3, 0xd5, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x5c, 0xb7, - 0x0c, 0x9b, 0x7a, 0x08, 0x00, 0x00, -} diff --git a/collector/model/kindling_event.proto b/collector/model/kindling_event.proto deleted file mode 100644 index df4a696b7..000000000 --- a/collector/model/kindling_event.proto +++ /dev/null @@ -1,159 +0,0 @@ -syntax = "proto3"; - -package kindling; -option go_package = "model/model"; -message KindlingEventList { - repeated KindlingEvent kindling_event_list = 1; -} -message KindlingEvent { - Source source = 1; - // Timestamp in nanoseconds at which the event were collected. - uint64 timestamp = 2; - // Name of Kindling Event - string name = 3; - // Category of Kindling Event, enum - Category category = 4; - // Native attributes of hook point, including arguments or return value. - Property Native_attributes = 5; - // User-defined Attributions of Kindling Event, now including latency for syscall. - repeated KeyValue user_attributes = 6; - // Context includes Thread information and Fd information. - Context ctx = 7; -} - -enum Source { - SOURCE_UNKNOWN = 0; - SYSCALL_ENTER = 1; - SYSCALL_EXIT = 2; - TRACEPOINT = 3; - KRPOBE = 4; - KRETPROBE = 5; - UPROBE = 6; - URETPROBE = 7; -} -enum Category { - CAT_NONE = 0; - CAT_OTHER = 1; // No specific category - CAT_FILE = 2; // File operations or File I/O - CAT_NET = 3; // Network operations or network I/O - CAT_IPC = 4; // IPC operations or IPC I/O - CAT_WAIT = 5; // - CAT_SIGNAL = 6; // Signal-related operations (signal) - CAT_SLEEP = 7; // nanosleep - CAT_TIME = 8; // Time-related event (e.g. gettimeofday) - CAT_PROCESS = 9; // Process-related event (e.g. fork, clone, - CAT_SCHEDULER = 10; // Scheduler event (context switch) - CAT_MEMORY = 11; // Memory-related operations (e.g. brk, mmap, unmap) - CAT_USER = 12; // User-related operations (e.g. getuid, setgid) - CAT_SYSTEM = 13; // System-related operations (e.g. reboot) -} - -message Property { - // If type of syscall_enter, kprobe, uprobe, tracepoint - repeated KeyValue args = 1; - // If type of syscall_exit, kretprobe, uretprobe - repeated KeyValue ret = 2; -} - -message KeyValue { - // Arguments' Name or Attributions' Name. - string key = 1; - // Type of Value. - ValueType value_type = 2; - // Value of Key in bytes, should be converted according to ValueType. - bytes value = 3; -} -enum ValueType { - NONE = 0; - INT8 = 1; // 1 byte - INT16 = 2; // 2 bytes - INT32 = 3; // 4 bytes - INT64 = 4; // 8 bytes - UINT8 = 5; // 1 byte - UINT16 = 6; // 2 bytes - UINT32 = 7; // 4 bytes - UINT64 = 8; // 8 bytes - CHARBUF = 9; // bytes, NULL terminated - BYTEBUF = 10; // bytes - FLOAT = 11; // 4 bytes - DOUBLE = 12; // 8 bytes - BOOL = 13; // 4 bytes -} -message Context { - // Thread information corresponding to Kindling Event, optional. - Thread thread_info = 1; - // Fd information corresponding to Kindling Event, optional. - Fd fd_info = 2; -} - -message Thread { - // Process id of thread. - uint32 pid = 1; - // Thread/task id of thread. - uint32 tid = 2; - // User id of thread - uint32 uid = 3; - // Group id of thread - uint32 gid = 4; - // Command of thread. - string comm = 5; - // ContainerId of thread - string container_id = 6; - // ContainerName of thread - string container_name = 7; -} - -message Fd { - // FD number. - int32 num = 1; - // Type of FD in enum. - FDType type_fd = 2; - - // if FD is type of file - string filename = 3; - string directory = 4; - - // if FD is type of ipv4 or ipv6 - L4Proto protocol = 5; - // repeated for ipv6, client_ip[0] for ipv4 - bool role = 6; - repeated uint32 sip = 7; - repeated uint32 dip = 8; - uint32 sport = 9; - uint32 dport = 10; - - // if FD is type of unix_sock - // Source socket endpoint - uint64 source = 11; - // Destination socket endpoint - uint64 destination = 12; -} - -// File Descriptor type -enum FDType { - FD_UNKNOWN = 0; - FD_FILE = 1; - FD_DIRECTORY = 2; - FD_IPV4_SOCK = 3; - FD_IPV6_SOCK = 4; - FD_IPV4_SERVSOCK = 5; - FD_IPV6_SERVSOCK = 6; - FD_FIFO = 7; - FD_UNIX_SOCK = 8; - FD_EVENT = 9; - FD_UNSUPPORTED = 10; // TODO - FD_SIGNALFD = 11; - FD_EVENTPOLL = 12; - FD_INOTIFY = 13; - FD_TIMERFD = 14; - FD_NETLINK = 15; - FD_FILE_V2 = 16; -} - -enum L4Proto { - UNKNOWN = 0; - TCP = 1; - UDP = 2; - ICMP = 3; - RAW = 4; -} \ No newline at end of file diff --git a/collector/model/kindling_event_helper.go b/collector/model/kindling_event_helper.go index 7cb9ae21a..fd41914a7 100644 --- a/collector/model/kindling_event_helper.go +++ b/collector/model/kindling_event_helper.go @@ -104,12 +104,15 @@ func (x *KindlingEvent) GetStartTime() uint64 { } func (x *KindlingEvent) GetUserAttribute(key string) *KeyValue { - if x.UserAttributes == nil { + if x.ParamsNumber == 0 { return nil } - for _, keyValue := range x.UserAttributes { + for index, keyValue := range x.UserAttributes { + if index+1 > int(x.ParamsNumber) { + break + } if keyValue.Key == key { - return keyValue + return &keyValue } } return nil diff --git a/collector/model/kindling_event_helper_test.go b/collector/model/kindling_event_helper_test.go index 3d99c197a..51726106e 100644 --- a/collector/model/kindling_event_helper_test.go +++ b/collector/model/kindling_event_helper_test.go @@ -26,7 +26,7 @@ func TestGetUintUserAttribute(t *testing.T) { for _, test := range tests { t.Run(test.key, func(t *testing.T) { event := &KindlingEvent{ - UserAttributes: []*KeyValue{ + UserAttributes: [8]KeyValue{ {Key: test.key, ValueType: test.valueType, Value: test.value}, }, } @@ -55,7 +55,8 @@ func TestGetIntUserAttribute(t *testing.T) { for _, test := range tests { t.Run(test.key, func(t *testing.T) { event := &KindlingEvent{ - UserAttributes: []*KeyValue{ + ParamsNumber: 1, + UserAttributes: [8]KeyValue{ {Key: test.key, ValueType: test.valueType, Value: test.value}, }, } @@ -78,7 +79,7 @@ func TestGetFloatUserAttribute(t *testing.T) { for _, test := range tests { t.Run(test.key, func(t *testing.T) { event := &KindlingEvent{ - UserAttributes: []*KeyValue{ + UserAttributes: [8]KeyValue{ {Key: test.key, ValueType: ValueType_FLOAT, Value: test.value}, }, } @@ -101,7 +102,7 @@ func TestGetDoubleUserAttribute(t *testing.T) { for _, test := range tests { t.Run(test.key, func(t *testing.T) { event := &KindlingEvent{ - UserAttributes: []*KeyValue{ + UserAttributes: [8]KeyValue{ {Key: test.key, ValueType: ValueType_FLOAT, Value: test.value}, }, } diff --git a/collector/receiver/cgoreceiver/cgo_func.h b/collector/receiver/cgoreceiver/cgo_func.h new file mode 100644 index 000000000..838f063f4 --- /dev/null +++ b/collector/receiver/cgoreceiver/cgo_func.h @@ -0,0 +1,57 @@ +// +// Created by jundi zhou on 2022/6/1. +// + +#ifndef SYSDIG_CGO_FUNC_H +#define SYSDIG_CGO_FUNC_H + +#ifdef __cplusplus +extern "C" { +#endif +void runForGo(); +int getKindlingEvent(void **kindlingEvent); +int subEventForGo(char* eventName, char* category); +#ifdef __cplusplus +} + +#endif + +#endif //SYSDIG_CGO_FUNC_H + +struct kindling_event_t_for_go{ + uint64_t timestamp; + char *name; + uint32_t category; + uint16_t paramsNumber; + struct KeyValue { + char *key; + char* value; + uint32_t len; + uint32_t valueType; + }userAttributes[8]; + struct event_context { + struct thread_info { + uint32_t pid; + uint32_t tid; + uint32_t uid; + uint32_t gid; + char *comm; + char *containerId; + }tinfo; + struct fd_info { + int32_t num; + uint32_t fdType; + char *filename; + char *directory; + uint32_t protocol; + uint8_t role; + uint32_t sip; + uint32_t dip; + uint32_t sport; + uint32_t dport; + + uint64_t source; + uint64_t destination; + }fdInfo; + }context; +}; diff --git a/collector/receiver/cgoreceiver/cgoreceiver.go b/collector/receiver/cgoreceiver/cgoreceiver.go new file mode 100644 index 000000000..bc4dc50d0 --- /dev/null +++ b/collector/receiver/cgoreceiver/cgoreceiver.go @@ -0,0 +1,204 @@ +package cgoreceiver + +/* +#cgo LDFLAGS: -L ./ -lkindling -lstdc++ -ldl +#cgo CFLAGS: -I . +#include +#include +#include +#include "cgo_func.h" +*/ +import "C" +import ( + "sync" + "time" + "unsafe" + + analyzerpackage "github.com/Kindling-project/kindling/collector/analyzer" + "github.com/Kindling-project/kindling/collector/component" + "github.com/Kindling-project/kindling/collector/model" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" + + "github.com/Kindling-project/kindling/collector/receiver" +) + +const ( + Cgo = "cgoreceiver" +) + +type CKindlingEventForGo C.struct_kindling_event_t_for_go + +type CgoReceiver struct { + cfg *Config + analyzerManager *analyzerpackage.Manager + shutdownWG sync.WaitGroup + telemetry *component.TelemetryTools + eventChannel chan *model.KindlingEvent + eventCount int + stopCh chan interface{} +} + +type Config struct { + SubcribeInfo []SubEvent `mapstructure:"subscribe"` +} + +type SubEvent struct { + Category string `mapstructure:"category"` + Name string `mapstructure:"name"` +} + +func NewCgoReceiver(config interface{}, telemetry *component.TelemetryTools, analyzerManager *analyzerpackage.Manager) receiver.Receiver { + cfg, ok := config.(*Config) + if !ok { + telemetry.Logger.Sugar().Panicf("Cannot convert [%s] config", Cgo) + } + cgoReceiver := &CgoReceiver{ + cfg: cfg, + analyzerManager: analyzerManager, + telemetry: telemetry, + eventChannel: make(chan *model.KindlingEvent, 3e5), + stopCh: make(chan interface{}, 1), + } + return cgoReceiver +} + +func (r *CgoReceiver) Start() error { + r.telemetry.Logger.Info("Start CgoReceiver") + C.runForGo() + go r.printMetrics() + time.Sleep(2 * time.Second) + r.subEvent() + // Wait for the C routine running + time.Sleep(2 * time.Second) + go r.consumeEvents() + go r.startGetEvent() + return nil +} + +// TODO finish it using opentelemetry +func (r *CgoReceiver) printMetrics() { + timer := time.NewTicker(1 * time.Second) + r.shutdownWG.Add(1) + for { + select { + case <-r.stopCh: + r.shutdownWG.Done() + return + case <-timer.C: + r.telemetry.Logger.Info("Total number events received: ", zap.Int("events", r.eventCount)) + r.eventCount = 0 + r.telemetry.Logger.Info("Current channel size: ", zap.Int("channel size", len(r.eventChannel))) + } + } +} + +func (r *CgoReceiver) startGetEvent() { + var pKindlingEvent unsafe.Pointer + r.shutdownWG.Add(1) + for { + select { + case <-r.stopCh: + r.shutdownWG.Done() + return + default: + res := int(C.getKindlingEvent(&pKindlingEvent)) + if res == 1 { + r.eventCount++ + r.eventChannel <- convertEvent((*CKindlingEventForGo)(pKindlingEvent)) + } + } + } +} + +func (r *CgoReceiver) consumeEvents() { + r.shutdownWG.Add(1) + for { + select { + case <-r.stopCh: + r.shutdownWG.Done() + return + case ev := <-r.eventChannel: + err := r.sendToNextConsumer(ev) + if err != nil { + r.telemetry.Logger.Info("Failed to send KindlingEvent: ", zap.Error(err)) + } + } + } +} + +func (r *CgoReceiver) Shutdown() error { + // TODO stop the C routine + close(r.stopCh) + r.shutdownWG.Wait() + return nil +} + +func convertEvent(cgoEvent *CKindlingEventForGo) *model.KindlingEvent { + ev := new(model.KindlingEvent) + ev.Timestamp = uint64(cgoEvent.timestamp) + ev.Name = C.GoString(cgoEvent.name) + ev.Category = model.Category(cgoEvent.category) + ev.Ctx.ThreadInfo.Pid = uint32(cgoEvent.context.tinfo.pid) + ev.Ctx.ThreadInfo.Tid = uint32(cgoEvent.context.tinfo.tid) + ev.Ctx.ThreadInfo.Uid = uint32(cgoEvent.context.tinfo.uid) + ev.Ctx.ThreadInfo.Gid = uint32(cgoEvent.context.tinfo.gid) + ev.Ctx.ThreadInfo.Comm = C.GoString(cgoEvent.context.tinfo.comm) + ev.Ctx.ThreadInfo.ContainerId = C.GoString(cgoEvent.context.tinfo.containerId) + ev.Ctx.FdInfo.Protocol = model.L4Proto(cgoEvent.context.fdInfo.protocol) + ev.Ctx.FdInfo.Num = int32(cgoEvent.context.fdInfo.num) + ev.Ctx.FdInfo.TypeFd = model.FDType(cgoEvent.context.fdInfo.fdType) + ev.Ctx.FdInfo.Filename = C.GoString(cgoEvent.context.fdInfo.filename) + ev.Ctx.FdInfo.Directory = C.GoString(cgoEvent.context.fdInfo.directory) + ev.Ctx.FdInfo.Role = If(cgoEvent.context.fdInfo.role != 0, true, false).(bool) + ev.Ctx.FdInfo.Sip = []uint32{uint32(cgoEvent.context.fdInfo.sip)} + ev.Ctx.FdInfo.Dip = []uint32{uint32(cgoEvent.context.fdInfo.dip)} + ev.Ctx.FdInfo.Sport = uint32(cgoEvent.context.fdInfo.sport) + ev.Ctx.FdInfo.Dport = uint32(cgoEvent.context.fdInfo.dport) + ev.Ctx.FdInfo.Source = uint64(cgoEvent.context.fdInfo.source) + ev.Ctx.FdInfo.Destination = uint64(cgoEvent.context.fdInfo.destination) + + ev.ParamsNumber = uint16(cgoEvent.paramsNumber) + for i := 0; i < int(ev.ParamsNumber); i++ { + ev.UserAttributes[i].Key = C.GoString(cgoEvent.userAttributes[i].key) + userAttributesLen := cgoEvent.userAttributes[i].len + ev.UserAttributes[i].Value = C.GoBytes(unsafe.Pointer(cgoEvent.userAttributes[i].value), C.int(userAttributesLen)) + ev.UserAttributes[i].ValueType = model.ValueType(cgoEvent.userAttributes[i].valueType) + } + return ev +} + +func If(condition bool, trueVal, falseVal interface{}) interface{} { + if condition { + return trueVal + } + return falseVal +} + +func (r *CgoReceiver) sendToNextConsumer(evt *model.KindlingEvent) error { + + if ce := r.telemetry.Logger.Check(zapcore.DebugLevel, "Receive Event"); ce != nil { + ce.Write( + zap.String("event", evt.String()), + ) + } + analyzers := r.analyzerManager.GetConsumableAnalyzers(evt.Name) + if analyzers == nil || len(analyzers) == 0 { + r.telemetry.Logger.Info("analyzer not found for event ", zap.String("eventName", evt.Name)) + return nil + } + for _, analyzer := range analyzers { + err := analyzer.ConsumeEvent(evt) + if err != nil { + r.telemetry.Logger.Warn("Error sending event to next consumer: ", zap.Error(err)) + } + } + return nil +} + +func (r *CgoReceiver) subEvent() { + for _, value := range r.cfg.SubcribeInfo { + C.subEventForGo(C.CString(value.Name), C.CString(value.Category)) + } + +} diff --git a/collector/receiver/udsreceiver/metrics.go b/collector/receiver/udsreceiver/metrics.go deleted file mode 100644 index f727bc5bb..000000000 --- a/collector/receiver/udsreceiver/metrics.go +++ /dev/null @@ -1,113 +0,0 @@ -package udsreceiver - -import ( - "context" - "sync" - "sync/atomic" - - "github.com/Kindling-project/kindling/collector/model/constnames" - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/metric" -) - -var once sync.Once - -const eventReceivedMetric = "kindling_telemetry_udsreceiver_events_total" - -func newSelfMetrics(meterProvider metric.MeterProvider, counter eventCounter) { - once.Do(func() { - meter := metric.Must(meterProvider.Meter("kindling")) - meter.NewInt64CounterObserver(eventReceivedMetric, - func(ctx context.Context, result metric.Int64ObserverResult) { - for name, value := range counter.getStats() { - result.Observe(value, attribute.String("name", name)) - } - }) - }) -} - -type eventCounter interface { - add(name string, value int64) - getStats() map[string]int64 -} - -type stats struct { - read int64 - write int64 - readv int64 - writev int64 - sendTo int64 - recvFrom int64 - sendMsg int64 - recvMsg int64 - connect int64 - grpcUprobe int64 - tcpClose int64 - tcpRcvEstablished int64 - tcpDrop int64 - tcpRetransmitSkb int64 - tcpConnect int64 - tcpSetState int64 - other int64 -} - -func (i *stats) add(name string, value int64) { - switch name { - case constnames.ReadEvent: - atomic.AddInt64(&i.read, value) - case constnames.WriteEvent: - atomic.AddInt64(&i.write, value) - case constnames.ReadvEvent: - atomic.AddInt64(&i.readv, value) - case constnames.WritevEvent: - atomic.AddInt64(&i.writev, value) - case constnames.SendToEvent: - atomic.AddInt64(&i.sendTo, value) - case constnames.RecvFromEvent: - atomic.AddInt64(&i.recvFrom, value) - case constnames.SendMsgEvent: - atomic.AddInt64(&i.sendMsg, value) - case constnames.RecvMsgEvent: - atomic.AddInt64(&i.recvMsg, value) - case constnames.GrpcUprobeEvent: - atomic.AddInt64(&i.grpcUprobe, value) - case constnames.TcpCloseEvent: - atomic.AddInt64(&i.tcpClose, value) - case constnames.TcpRcvEstablishedEvent: - atomic.AddInt64(&i.tcpRcvEstablished, value) - case constnames.TcpDropEvent: - atomic.AddInt64(&i.tcpDrop, value) - case constnames.TcpRetransmitSkbEvent: - atomic.AddInt64(&i.tcpRetransmitSkb, value) - case constnames.ConnectEvent: - atomic.AddInt64(&i.connect, value) - case constnames.TcpConnectEvent: - atomic.AddInt64(&i.tcpConnect, value) - case constnames.TcpSetStateEvent: - atomic.AddInt64(&i.tcpSetState, value) - default: - atomic.AddInt64(&i.other, value) - } -} - -func (i *stats) getStats() map[string]int64 { - ret := make(map[string]int64, 14) - ret[constnames.ReadEvent] = atomic.LoadInt64(&i.read) - ret[constnames.WriteEvent] = atomic.LoadInt64(&i.write) - ret[constnames.ReadvEvent] = atomic.LoadInt64(&i.readv) - ret[constnames.WritevEvent] = atomic.LoadInt64(&i.writev) - ret[constnames.SendToEvent] = atomic.LoadInt64(&i.sendTo) - ret[constnames.RecvFromEvent] = atomic.LoadInt64(&i.recvFrom) - ret[constnames.SendMsgEvent] = atomic.LoadInt64(&i.sendMsg) - ret[constnames.RecvMsgEvent] = atomic.LoadInt64(&i.recvMsg) - ret[constnames.GrpcUprobeEvent] = atomic.LoadInt64(&i.grpcUprobe) - ret[constnames.TcpCloseEvent] = atomic.LoadInt64(&i.tcpClose) - ret[constnames.TcpRcvEstablishedEvent] = atomic.LoadInt64(&i.tcpRcvEstablished) - ret[constnames.TcpCloseEvent] = atomic.LoadInt64(&i.tcpClose) - ret[constnames.TcpRetransmitSkbEvent] = atomic.LoadInt64(&i.tcpRetransmitSkb) - ret[constnames.ConnectEvent] = atomic.LoadInt64(&i.connect) - ret[constnames.TcpConnectEvent] = atomic.LoadInt64(&i.tcpConnect) - ret[constnames.TcpSetStateEvent] = atomic.LoadInt64(&i.tcpSetState) - ret[constnames.OtherEvent] = atomic.LoadInt64(&i.other) - return ret -} diff --git a/collector/receiver/udsreceiver/metrics_test.go b/collector/receiver/udsreceiver/metrics_test.go deleted file mode 100644 index acfe86752..000000000 --- a/collector/receiver/udsreceiver/metrics_test.go +++ /dev/null @@ -1,190 +0,0 @@ -package udsreceiver - -import ( - "context" - "github.com/Kindling-project/kindling/collector/model/constnames" - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/exporters/stdout/stdoutmetric" - "go.opentelemetry.io/otel/metric" - controller "go.opentelemetry.io/otel/sdk/metric/controller/basic" - otelprocessor "go.opentelemetry.io/otel/sdk/metric/processor/basic" - selector "go.opentelemetry.io/otel/sdk/metric/selector/simple" - "os" - "sync" - "testing" - "time" -) - -func runTest(counter eventCounter, workerNum int, loopNum int) { - wg := sync.WaitGroup{} - for i := 0; i < workerNum; i++ { - wg.Add(1) - go func() { - runRecordCounter(loopNum, counter) - wg.Done() - }() - } - wg.Wait() -} - -var eventLists = []string{constnames.ReadEvent, constnames.WriteEvent, constnames.ReadvEvent, constnames.WritevEvent, - constnames.SendToEvent, constnames.RecvFromEvent, constnames.SendMsgEvent, constnames.RecvMsgEvent, - constnames.GrpcUprobeEvent, constnames.TcpCloseEvent, constnames.TcpRcvEstablishedEvent, constnames.TcpDropEvent, - constnames.TcpRetransmitSkbEvent, "another_event"} - -func runRecordCounter(loopNum int, counter eventCounter) { - for i := 0; i < loopNum; i++ { - for _, name := range eventLists { - counter.add(name, 1) - } - } -} - -func assertTest(t *testing.T, counter eventCounter, workerNum int, loopNum int) { - runTest(counter, workerNum, loopNum) - expectedNum := workerNum * loopNum - for _, value := range counter.getStats() { - if value != int64(expectedNum) { - t.Errorf("The result is expected to be %d, but got %d", expectedNum, value) - } - } -} - -func TestCounterMutexMap(t *testing.T) { - counter := &mutexMap{m: make(map[string]int64)} - assertTest(t, counter, 5, 100000) -} - -func TestCounterRwMutexMap(t *testing.T) { - counter := &rwMutexMap{m: make(map[string]int64)} - assertTest(t, counter, 5, 100000) -} - -func TestCounterIntCombination(t *testing.T) { - counter := &stats{} - assertTest(t, counter, 5, 100000) -} - -func BenchmarkCounterMutexMap(b *testing.B) { - counter := &mutexMap{m: make(map[string]int64)} - initOtelCounterObserver(counter) - b.ResetTimer() - for i := 0; i < b.N; i++ { - runTest(counter, 5, 1000) - } -} - -func BenchmarkCounterRwMutexMap(b *testing.B) { - counter := &rwMutexMap{m: make(map[string]int64)} - initOtelCounterObserver(counter) - b.ResetTimer() - for i := 0; i < b.N; i++ { - runTest(counter, 5, 1000) - } -} - -func BenchmarkCounterIntCombination(b *testing.B) { - counter := &stats{} - initOtelCounterObserver(counter) - b.ResetTimer() - for i := 0; i < b.N; i++ { - runTest(counter, 5, 1000) - } -} - -func BenchmarkCounterOtelCounter(b *testing.B) { - counter := newOtelRecorder() - - b.ResetTimer() - for i := 0; i < b.N; i++ { - runTest(counter, 5, 1000) - } -} - -// It's not practical to implement with sync.Map, -// because you still need to lock the value when increasing it. -// type syncMap struct { -// m sync.Map -// mutex sync.Mutex -// } - -type mutexMap struct { - m map[string]int64 - mutex sync.Mutex -} - -func (m *mutexMap) add(name string, value int64) { - m.mutex.Lock() - v := m.m[name] - m.m[name] = v + value - m.mutex.Unlock() -} -func (m *mutexMap) getStats() map[string]int64 { - m.mutex.Lock() - ret := make(map[string]int64, len(m.m)) - for k, v := range m.m { - ret[k] = v - } - m.mutex.Unlock() - return ret -} - -type rwMutexMap struct { - m map[string]int64 - mutex sync.RWMutex -} - -func (m *rwMutexMap) add(name string, value int64) { - m.mutex.Lock() - v := m.m[name] - m.m[name] = v + value - m.mutex.Unlock() -} -func (m *rwMutexMap) getStats() map[string]int64 { - m.mutex.RLock() - ret := make(map[string]int64, len(m.m)) - for k, v := range m.m { - ret[k] = v - } - m.mutex.RUnlock() - return ret -} - -type otelRecorder struct { - otelCounter metric.Int64Counter -} - -func newOtelRecorder() *otelRecorder { - meter := initOpentelemetry() - return &otelRecorder{otelCounter: meter.NewInt64Counter("event_counter_total")} -} -func (m *otelRecorder) add(name string, value int64) { - m.otelCounter.Add(context.Background(), value, attribute.String("name", name)) -} -func (m *otelRecorder) getStats() map[string]int64 { - return nil -} - -func initOpentelemetry() metric.MeterMust { - devNullWriter, _ := os.Open(os.DevNull) - exp, _ := stdoutmetric.New(stdoutmetric.WithWriter(devNullWriter)) - - cont := controller.New( - otelprocessor.NewFactory(selector.NewWithInexpensiveDistribution(), exp), - controller.WithExporter(exp), - controller.WithCollectPeriod(100*time.Millisecond), - ) - _ = cont.Start(context.Background()) - return metric.Must(cont.Meter("kindling")) -} - -func initOtelCounterObserver(counter eventCounter) { - meter := initOpentelemetry() - meter.NewInt64CounterObserver("event_counter_total", - func(ctx context.Context, result metric.Int64ObserverResult) { - metrics := counter.getStats() - for name, value := range metrics { - result.Observe(value, attribute.String("name", name)) - } - }) -} diff --git a/collector/receiver/udsreceiver/udsreceiver.go b/collector/receiver/udsreceiver/udsreceiver.go deleted file mode 100644 index 7080ddc0f..000000000 --- a/collector/receiver/udsreceiver/udsreceiver.go +++ /dev/null @@ -1,242 +0,0 @@ -package udsreceiver - -import ( - "os" - "sync" - "time" - - analyzerpackage "github.com/Kindling-project/kindling/collector/analyzer" - "github.com/Kindling-project/kindling/collector/component" - "github.com/Kindling-project/kindling/collector/model" - "github.com/Kindling-project/kindling/collector/receiver" - "github.com/gogo/protobuf/proto" - zmq "github.com/pebbe/zmq4" - "go.uber.org/zap" - "go.uber.org/zap/zapcore" -) - -const ( - Uds = "udsreceiver" -) - -type Socket struct { - *zmq.Socket -} - -type UdsReceiver struct { - cfg *Config - analyzerManager *analyzerpackage.Manager - zmqPullSocket Socket - zmqReqSocket Socket - shutdownWG sync.WaitGroup - shutdownState bool - telemetry *component.TelemetryTools - stats eventCounter -} - -type Config struct { - ZEROMQPULL *ZeroMqPullSettings `mapstructure:"zeromqpull"` - ZEROMQREQ *ZeroMqReqSettings `mapstructure:"zeromqreq"` -} - -type ZeroMqPullSettings struct { - // Endpoint configures the listening address for the server. - Endpoint string `mapstructure:"endpoint"` - hwm int `mapstructure:"hwm"` -} - -type SubEvent struct { - Category string `mapstructure:"category"` - Name string `mapstructure:"name"` -} - -type ZeroMqReqSettings struct { - // Endpoint configures the listening address for the server. - Endpoint string `mapstructure:"endpoint"` - hwm int `mapstructure:"hwm"` - SubcribeInfo []SubEvent `mapstructure:"subscribe"` -} - -func (r *UdsReceiver) newPullSocket(zss *ZeroMqPullSettings) Socket { - - zmqContextServer, _ := zmq.NewContext() - ServerClient, _ := zmqContextServer.NewSocket(zmq.PULL) - if zss.hwm != 0 { - _ = ServerClient.SetRcvhwm(zss.hwm) - } - return Socket{ServerClient} -} - -func (r *UdsReceiver) newReqSocket(zss *ZeroMqReqSettings) Socket { - zmqContextServer, _ := zmq.NewContext() - ServerClient, _ := zmqContextServer.NewSocket(zmq.REQ) - if zss.hwm != 0 { - _ = ServerClient.SetSndhwm(zss.hwm) - } - return Socket{ServerClient} -} - -func (soc Socket) connect(endpoint string) error { - var failedCount = 0 - var err error - for { - err = soc.Connect(endpoint) - if err != nil { - failedCount++ - if failedCount > 3 { - break - } - time.Sleep(time.Second) - } else { - err = nil - break - } - } - return err -} - -func NewUdsReceiver(config interface{}, telemetry *component.TelemetryTools, analyzerManager *analyzerpackage.Manager) receiver.Receiver { - cfg, ok := config.(*Config) - if !ok { - telemetry.Logger.Sugar().Panicf("Cannot convert [%s] config", Uds) - } - udsReceiver := &UdsReceiver{ - cfg: cfg, - analyzerManager: analyzerManager, - telemetry: telemetry, - stats: &stats{}, - } - newSelfMetrics(telemetry.MeterProvider, udsReceiver.stats) - return udsReceiver -} - -func (r *UdsReceiver) startZeroMqPull() error { - cfg := r.cfg.ZEROMQPULL - r.telemetry.Logger.Info("Starting ZeroMq Pull connect on endpoint", zap.String("endpoint", cfg.Endpoint)) - pullSocket := r.zmqPullSocket - err := pullSocket.connect(cfg.Endpoint) - if err != nil { - r.telemetry.Logger.Panic("Connecting ZeroMq Pull failed on endpoint", zap.String("endpoint", cfg.Endpoint)) - } - r.shutdownWG.Add(1) - go func() { - defer r.shutdownWG.Done() - for { - if r.shutdownState == true { - err := pullSocket.Close() - if err != nil { - return - } - r.shutdownState = false - break - } - req, _ := pullSocket.RecvMessage(0) - if len(req) >= 1 { - events := &model.KindlingEventList{} - err = proto.Unmarshal([]byte(req[0]), events) - if err != nil { - r.telemetry.Logger.Error("Error unmarshalling event: %v", zap.Error(err)) - continue - } - err = r.SendToNextConsumer(events) - if err != nil { - r.telemetry.Logger.Error("Error sending event to next consumer: %v", zap.Error(err)) - continue - } - } - } - }() - return nil -} - -func (r *UdsReceiver) startZeroMqReq() error { - cfg := r.cfg.ZEROMQREQ - cfgPull := r.cfg.ZEROMQPULL - reqSocket := r.zmqReqSocket - err := reqSocket.connect(cfg.Endpoint) - if err != nil { - r.telemetry.Logger.Error("Connecting ZeroMq Req failed on endpoint " + cfg.Endpoint) - return err - } - labels := make([]*model.Label, len(cfg.SubcribeInfo)) - for i, e := range cfg.SubcribeInfo { - labels[i] = &model.Label{Name: e.Name, Category: e.Category} - } - pid := os.Getpid() - subEvent := &model.SubEvent{ - Address: []byte(cfgPull.Endpoint), - Pid: uint32(pid), - Labels: labels, - } - p, err := proto.Marshal(subEvent) - if err != nil { - r.telemetry.Logger.Error("subscribe events marshal failed.") - } - _, err = reqSocket.SendMessage(p) - if err != nil { - r.telemetry.Logger.Error("subscribe request failed") - } - rep, err := reqSocket.RecvMessage(8) - if ce := r.telemetry.Logger.Check(zapcore.DebugLevel, "Receiver Message"); ce != nil { - ce.Write( - zap.String("rep", rep[0]), - ) - } - return err -} - -func (r *UdsReceiver) Start() error { - var err error - if r.cfg.ZEROMQREQ != nil { - r.zmqReqSocket = r.newReqSocket(r.cfg.ZEROMQREQ) - } - if r.cfg.ZEROMQPULL != nil { - r.zmqPullSocket = r.newPullSocket(r.cfg.ZEROMQPULL) - } - r.telemetry.Logger.Info("startZeroMqReq") - err = r.startZeroMqReq() - if err != nil { - return err - } - r.telemetry.Logger.Info("startZeroMqPull") - err = r.startZeroMqPull() - if err != nil { - return err - } - return err -} - -func (r *UdsReceiver) Shutdown() error { - var err error - if r.zmqPullSocket.Socket != nil { - r.shutdownState = true - } - r.shutdownWG.Wait() - return err -} - -func (r *UdsReceiver) SendToNextConsumer(events *model.KindlingEventList) error { - for _, evt := range events.KindlingEventList { - r.stats.add(evt.Name, 1) - if ce := r.telemetry.Logger.Check(zapcore.DebugLevel, "Receive Event"); ce != nil { - ce.Write( - zap.String("event", evt.String()), - ) - } - analyzers := r.analyzerManager.GetConsumableAnalyzers(evt.Name) - if analyzers == nil || len(analyzers) == 0 { - r.telemetry.Logger.Info("analyzer not found for event ", zap.String("eventName", evt.Name)) - continue - } - for _, analyzer := range analyzers { - err := analyzer.ConsumeEvent(evt) - if err != nil { - return err - } - if err != nil { - r.telemetry.Logger.Warn("Error sending event to next consumer: ", zap.Error(err)) - } - } - } - return nil -} diff --git a/collector/receiver/udsreceiver/udsreceiver_test.go b/collector/receiver/udsreceiver/udsreceiver_test.go deleted file mode 100644 index 90dc1f16a..000000000 --- a/collector/receiver/udsreceiver/udsreceiver_test.go +++ /dev/null @@ -1,39 +0,0 @@ -package udsreceiver - -import ( - "github.com/Kindling-project/kindling/collector/analyzer" - "github.com/Kindling-project/kindling/collector/component" - "testing" -) - -func TestUdsReceiver_Start(t *testing.T) { - cfg := &Config{ - ZEROMQPULL: &ZeroMqPullSettings{ - Endpoint: "ipc:///home/kindling/0", - }, - ZEROMQREQ: &ZeroMqReqSettings{ - Endpoint: "ipc:///home/kindling/0", - SubcribeInfo: []SubEvent{ - { - Name: "syscall_exit-write", - Category: "net", - }, - { - Name: "syscall_exit-read", - Category: "net", - }, - { - Name: "syscall_exit-sendto", - Category: "net", - }, - { - Name: "syscall_exit-recvform", - Category: "net", - }, - }, - }, - } - am, _ := analyzer.NewManager() - r := NewUdsReceiver(cfg, component.NewDefaultTelemetryTools(), am) - r.Start() -} diff --git a/deploy/agent/kindling-deploy.yml b/deploy/agent/kindling-deploy.yml index a74f1fef8..4871aa402 100644 --- a/deploy/agent/kindling-deploy.yml +++ b/deploy/agent/kindling-deploy.yml @@ -16,20 +16,14 @@ spec: spec: serviceAccount: kindling-agent containers: - - name: kindling-probe - image: kindlingproject/kindling-probe:latest + - name: kindling-agent + image: kindlingproject/kindling-agent:latest imagePullPolicy: Always - lifecycle: - postStart: - exec: - command: - - sh - - /pl/post_start.sh - command: - - /pl/docker-entrypoint.sh + securityContext: + privileged: true resources: limits: - memory: 300Mi + memory: 1Gi requests: memory: 300Mi env: @@ -39,8 +33,16 @@ spec: value: /host - name: SYSDIG_HOST_ROOT value: /host - securityContext: - privileged: true + - name: GOGC + value: "400" + - name: MY_NODE_IP + valueFrom: + fieldRef: + fieldPath: status.hostIP + - name: MY_NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName readinessProbe: exec: command: @@ -49,11 +51,8 @@ spec: initialDelaySeconds: 5 periodSeconds: 5 volumeMounts: - - name: shared-volume-kindling - mountPath: /home/kindling - readOnly: false - - name: shared-volume-subpub - mountPath: /home/kindling-sub + - mountPath: /etc/kindling/config + name: kindlingcfg - mountPath: /sys name: sys-vol - mountPath: /etc/modprobe.d @@ -82,36 +81,6 @@ spec: name: varrun-vol - mountPath: /dev/shm name: dshm - - name: kindling-collector - image: kindlingproject/kindling-collector:latest - imagePullPolicy: Always - securityContext: - privileged: true - resources: - limits: - memory: 800Mi - requests: - memory: 300Mi - env: - - name: GOGC - value: "400" - - name: MY_NODE_IP - valueFrom: - fieldRef: - fieldPath: status.hostIP - - name: MY_NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - volumeMounts: - - mountPath: /etc/kindling/config - name: kindlingcfg - - name: shared-volume-kindling - mountPath: /home/kindling - readOnly: false - - name: shared-volume-subpub - mountPath: /home/kindling-sub - readOnly: false dnsPolicy: ClusterFirstWithHostNet hostNetwork: true hostPID: true @@ -126,10 +95,6 @@ spec: - hostPath: path: /etc/modprobe.d name: modprobe-d - - hostPath: - path: /etc/os-release - type: FileOrCreate - name: osrel - emptyDir: medium: Memory name: dshm @@ -159,8 +124,4 @@ spec: name: varrun-vol - hostPath: path: /sys - name: sys-vol - - name: shared-volume-kindling - emptyDir: {} - - name: shared-volume-subpub - emptyDir: {} + name: sys-vol \ No newline at end of file diff --git a/deploy/scripts/build.sh b/deploy/scripts/build.sh new file mode 100644 index 000000000..0d6021968 --- /dev/null +++ b/deploy/scripts/build.sh @@ -0,0 +1,23 @@ +cd ../../ +mkdir -p probe/build +cd probe/build +cmake -DBUILD_DRIVER=OFF -DPROBE_VERSION=0.1.1dev .. +make +libKindlingPath="./src/libkindling.so" +if [ ! -f "$libKindlingPath" ]; then + echo "compiler libkindling failed! exit!" + +else + cp -rf ./src/libkindling.so ../../collector/docker/libso + cp -rf ./src/libkindling.so /usr/lib64/ + cd ../../collector/ + sh collector-version-build.sh + collectorPath="./collector" + if [ ! -f "$collectorPath" ]; then + echo "compiler collector failed! exit!" + else + cp -rf ./collector ./docker/kindling-collector + cd docker + docker build -t kindling-collector . + fi +fi \ No newline at end of file diff --git a/probe/scripts/run_docker.sh b/deploy/scripts/run_docker.sh similarity index 88% rename from probe/scripts/run_docker.sh rename to deploy/scripts/run_docker.sh index 32e11eb55..897d456a8 100755 --- a/probe/scripts/run_docker.sh +++ b/deploy/scripts/run_docker.sh @@ -2,7 +2,7 @@ script_dir="$(dirname "$0")" workspace_root=$(realpath "${script_dir}/../") # Docker image information. -docker_image_with_tag="kindlingproject/kindling-compiler" +docker_image_with_tag="kindlingproject/agent-builder" configs=(-v "$HOME/.config:/root/.config" \ -v "$HOME/.ssh:/root/.ssh" \ @@ -22,7 +22,8 @@ docker run --rm -it \ "${configs[@]}" \ -v /var/run/docker.sock:/var/run/docker.sock \ -v "${workspace_root}/../:/kindling" \ - -w "/kindling/probe" \ + -w "/kindling" \ + --privileged=true \ "${RUN_DOCKER_EXTRA_ARGS[@]}" \ "${docker_image_with_tag}" \ "${exec_cmd[@]}" diff --git a/probe/.bazelrc b/probe/.bazelrc deleted file mode 100644 index df5656a13..000000000 --- a/probe/.bazelrc +++ /dev/null @@ -1,220 +0,0 @@ -# Global bazelrc file, see https://docs.bazel.build/versions/master/guide.html#bazelrc. -build --incompatible_restrict_string_escapes=false -build --incompatible_require_linker_input_cc_api=false - -query --incompatible_restrict_string_escapes=false -query --incompatible_require_linker_input_cc_api=false - -# This is to flush bazel cache for new version of clang/gcc. -build --action_env=CLANG_COMPILER_VERSION=11.1_0 -build --host_action_env=CLANG_COMPILER_VERSION=11.1_0 -build:clang --action_env=CC=/opt/clang-11.1/bin/clang -build:clang --host_action_env=CC=/opt/clang-11.1/bin/clang -build:clang --action_env=CXX=/opt/clang-11.1/bin/clang++ -build:clang --host_action_env=CXX=/opt/clang-11.1/bin/clang++ -build:clang --copt -Wno-dtor-name -build:clang --copt -Wno-unknown-warning-option -build:clang --copt -Wno-mismatched-tags - -# Get version information into the build. -build --workspace_status_command=bazel/get_workspace_status.sh - -# We only have support for python3 on the Ubuntu 20.04 image. -build --host_force_python=PY3 - -# Limit memory for JVM to reduce runaway usage. -startup --host_jvm_args=-Xmx1g - -# For all builds, by default, exclude tests that require root or BPF privileges. -# To run a test that was filtered out: -# bazel test //path/to:test --test_tag_filter= -# Which reset the filter to empty. -build --test_tag_filters=-requires_root,-requires_bpf,-disabled - -# Sets the default Apple platform to macOS. -build --apple_platform_type=macos - -# Keep debug symbols (required for go binaries). -# Unfortunately, this affects C++ with -c fastbuild too. -# Upgrading io_bazel_rules_go provides a better way to do this, but that upgrade is a tangled web. -# TODO(oazizi): Remove after upgrading io_bazel_rules_go. -build --strip=never - - -# Give each sandbox its own tmp directory. -# This is important for //src/stirling/utils:java_test, which otherwise creates conflicting writes -# when multiple instances are running simultaneously. -# It is also generally not a bad idea, since it improves heremeticity. -# For more context, see: https://github.com/bazelbuild/bazel/issues/3236 -test --sandbox_tmpfs_path=/tmp - -# Build for Clang: -build:clang --linkopt -fuse-ld=lld -build:clang --host_linkopt -fuse-ld=lld -build:clang --action_env=BAZEL_LINKLIBS=-l%:libstdc++.a -build:clang --host_action_env=BAZEL_LINKLIBS=-l%:libstdc++.a -build:clang --action_env=BAZEL_LINKOPTS=-lm:-static-libgcc -build:clang --host_action_env=BAZEL_LINKOPTS=-lm:-static-libgcc -# We need this to ensure that external projects are built with -# C++17 support. This is needed in some libraries like absl which -# have different behavior with C++17. -build:clang --action_env=BAZEL_CXXOPTS=-std=c++17 -build:clang --host_action_env=BAZEL_CXXOPTS=-std=c++17 -build:clang --action_env=BAZEL_COMPILER=clang -build:clang --host_action_env=BAZEL_COMPILER=clang -build:clang --action_env=CC=clang -build:clang --host_action_env=CC=clang -build:clang --action_env=CXX=clang++ -build:clang --host_action_env=CXX=clang++ - -# Build for Clang using Libc++. -build:libc++ --action_env=CXXFLAGS=-stdlib=libc++ -build:libc++ --action_env=LDFLAGS=-stdlib=libc++ -build:libc++ --action_env=BAZEL_CXXOPTS=-std=c++17:-stdlib=libc++ -build:libc++ --action_env=BAZEL_LINKLIBS=-l%:libc++.a:-l%:libc++abi.a:-lm -build:libc++ --action_env=CC=/opt/clang-11.1-libc++/bin/clang -build:libc++ --action_env=CXX=/opt/clang-11.1-libc++/bin/clang++ -build:libc++ --define use_libcpp=1 -# TODO(zasgar): Remove this in next diff. -build:libc++ --copt -D_LIBCPP_NO_EXPERIMENTAL_DEPRECATION_WARNING_FILESYSTEM -build:libc++ --build_tag_filters=-no_libcpp -build:libc++ --test_tag_filters=-no_libcpp,-requires_root,-requires_bpf,-disabled - -# Build for GCC. -build:gcc --action_env=BAZEL_LINKLIBS=-l%:libstdc++.a -build:gcc --action_env=BAZEL_LINKOPTS=-lm:-static-libgcc -# We need this to ensure that external projects are built with -# C++17 support. This is needed in some libraries like absl which -# have different behavior with C++17. -build:gcc --action_env=BAZEL_CXXOPTS=-std=c++17 -build:gcc --action_env=BAZEL_COMPILER=gcc -build:gcc --action_env=CC=/usr/bin/gcc-10 -build:gcc --action_env=CXX=/usr/bin/g++-10 -# These are copts because they apply to both c++ and c files. -# In particular, upb is has issues with this that will hopefully be -# fixed upstream soon. -build:gcc --copt -Wno-error=sign-compare -build:gcc --copt -Wno-error=stringop-truncation -build:gcc --copt -Wno-error=maybe-uninitialized -build:gcc --copt -Wno-unknown-warning-option -build:gcc --build_tag_filters=-no_gcc -build:gcc --test_tag_filters=-no_gcc,-requires_root,-requires_bpf,-disabled - -# Default build opts: -build --config=clang - -# Default mac config. Same as clang except we can't statically link, -# and mac does not use libstdc++. -build:macos --action_env=BAZEL_LINKLIBS -build:macos --action_env=BAZEL_LINKOPTS - -# bazel build --config asan ... -build:asan --define PL_CONFIG_ASAN=1 -build:asan --copt -DPL_CONFIG_ASAN -build:asan --copt -D__SANITIZE_ADDRESS__ -build:asan --copt -fsanitize=address,undefined -build:asan --linkopt -fsanitize=address,undefined -build:asan --copt -fno-sanitize=vptr -build:asan --linkopt -fno-sanitize=vptr -build:asan --copt -fsanitize-recover=all -build:asan --linkopt -ldl -build:asan --define tcmalloc=disabled -build:asan --build_tag_filters=-no_asan -build:asan --test_tag_filters=-no_asan,-requires_root,-requires_bpf,-disabled -build:asan --define signal_trace=disabled -build:asan --copt -DADDRESS_SANITIZER=1 -build:asan --test_env=ASAN_SYMBOLIZER_PATH -build:asan --test_env=ASAN_OPTIONS=handle_abort=1:allow_addr2line=true -build:asan --test_env=UBSAN_OPTIONS=halt_on_error=1:print_stacktrace=1 -build:asan --define tcmalloc=disabled -# Clang-10 requires additional linkopts to make sure ubsan is linked in correctly. -build:asan --linkopt=-L/opt/clang-11.1/lib/clang/11.1.0/lib/linux -build:asan --linkopt=-l:libclang_rt.ubsan_standalone-x86_64.a -build:asan --linkopt=-l:libclang_rt.ubsan_standalone_cxx-x86_64.a - -# bazel build --config msan -build:msan --define PL_CONFIG_MSAN=1 -build:msan --copt -fsanitize=memory -build:msan --linkopt -fsanitize=memory -build:msan --define tcmalloc=disabled -build:msan --build_tag_filters=-no_msan -build:msan --test_tag_filters=-no_msan,-requires_root,-requires_bpf,-disabled -build:msan --copt -fsanitize-memory-track-origins=2 -build:msan --define tcmalloc=disabled -build:msan --copt -DMEMORY_SANITIZER=1 - -# bazel build --config tsan -build:tsan --define PL_CONFIG_TSAN=1 -build:tsan --copt -fsanitize=thread -build:tsan --copt -fsanitize-recover=all -build:tsan --linkopt -fsanitize=thread -build:tsan --define tcmalloc=disabled -build:tsan --build_tag_filters=-no_tsan -build:tsan --test_tag_filters=-no_tsan,-requires_root,-requires_bpf,-disabled -build:tsan --define tcmalloc=disabled -build:tsan --copt -DTHREAD_SANITIZER=1 -# This is needed to address false positive problem with abseil. -# https://github.com/google/sanitizers/issues/953 -build:tsan --test_env=TSAN_OPTIONS=report_atomic_races=0 - -# Note that we are lumping tests that require root into the BPF tests below -# to minimize number of configs. -# If there are ever a lot of tests with requires_root, a new config is warranted. - -# Note 2: BPF tests are limited to --jobs=4, because otherwise the parallel tests -# cause a lot of flakiness. In particular, many of the BPF tests deploy containers, -# and the sudden deployment of too many containers causes some containers to get -# stuck for minutes without actually running. - -# bazel build --config bpf -build:bpf --build_tag_filters=requires_bpf,requires_root -build:bpf --test_tag_filters=requires_bpf,requires_root,-disabled -test:bpf --jobs=4 --strategy=TestRunner=standalone - -# bazel build --config bpf_asan -# Need to repeat the negative build_tag_filters from config=asan, -# because the positive build_tag_filters here can re-enable such tests. -build:bpf_asan --config=asan -build:bpf_asan --build_tag_filters=requires_bpf,requires_root,-no_asan -build:bpf_asan --test_tag_filters=requires_bpf,requires_root,-no_asan,-disabled -test:bpf_asan --jobs=4 --strategy=TestRunner=standalone - -# bazel build --config bpf_tsan -# Need to repeat the negative build_tag_filters from config=tsan, -# because the positive build_tag_filters here can re-enable such tests. -build:bpf_tsan --config=tsan -build:bpf_tsan --build_tag_filters=requires_bpf,requires_root,-no_tsan -build:bpf_tsan --test_tag_filters=requires_bpf,requires_root,-no_tsan,-disabled -test:bpf_tsan --jobs=4 --strategy=TestRunner=standalone - -coverage --config=gcc -coverage --cxxopt -fprofile-arcs -coverage --cxxopt -ftest-coverage -coverage --instrument_test_targets -coverage --define PL_COVERAGE=true -coverage --copt -DPL_COVERAGE -coverage --test_tag_filters=-requires_root,-requires_bpf,-no_coverage,-disabled,-no_gcc -# Uploading to BES from the coverage build seems to fail on jenkins. -coverage --experimental_build_event_upload_strategy=local - -# Use stable GIT build tag by default. -build --define BUNDLE_VERSION={STABLE_BUILD_TAG} - -# jenkins.bazelrc is copied from ci/jenkins.bazelrc by Jenkins workers during the build. -# The intention is to avoid polluting configurations of bazel for developers. -try-import %workspace%/jenkins.bazelrc - -# Put your own configurations into user.bazelrc, which is ignored by git. -try-import %workspace%/user.bazelrc - -# Import a machine specific bazelrc. This can be used to enable caching. -try-import /etc/bazelrc - -try-import %workspace%/bes.bazelrc - -# Tensorflow requires this option -common --experimental_repo_remote_exec - -# Try Stirling flakes more than the default 3 times. -test --flaky_test_attempts=//src/stirling/source_connectors/socket_tracer/.*bpf_test@5 - diff --git a/probe/.gitignore b/probe/.gitignore deleted file mode 100644 index 901bf8647..000000000 --- a/probe/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.idea -cmake-build-debug -bazel-* -.git -.clwb \ No newline at end of file diff --git a/probe/BUILD.bazel b/probe/BUILD.bazel deleted file mode 100644 index e69de29bb..000000000 diff --git a/probe/CMakeLists.txt b/probe/CMakeLists.txt new file mode 100644 index 000000000..e3b73c4bd --- /dev/null +++ b/probe/CMakeLists.txt @@ -0,0 +1,70 @@ +# +# Copyright (C) 2013-2018 Draios Inc dba Sysdig. +# +# This file is part of sysdig . +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +cmake_minimum_required(VERSION 2.8.1) + +add_compile_options(-fPIC) +add_compile_options(-pie) +option(MINIMAL_BUILD "Produce a minimal sysdig binary with only the essential features (no eBPF probe driver, no kubernetes, no mesos, no marathon and no container metadata)" ON) +option(USE_BUNDLED_DEPS "Enable bundled dependencies instead of using the system ones" ON) + +# Add path for custom CMake modules. +list(APPEND CMAKE_MODULE_PATH + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") + +if(NOT CMAKE_BUILD_TYPE) + SET(CMAKE_BUILD_TYPE Release) +endif() + +project(kindling-probe) +set(PACKAGE_NAME "kindling") + +add_definitions(-DPLATFORM_NAME="${CMAKE_SYSTEM_NAME}") + +option(BUILD_WARNINGS_AS_ERRORS "Enable building with -Wextra -Werror flags") + +if(MINIMAL_BUILD) + set(MINIMAL_BUILD_FLAGS "-DMINIMAL_BUILD") +endif() + +set(KINDLING_DEBUG_FLAGS "-D_DEBUG") +set(CMAKE_COMMON_FLAGS "-Wall -ggdb ${MINIMAL_BUILD_FLAGS}") + +if (BUILD_WARNINGS_AS_ERRORS) + set(CMAKE_SUPPRESSED_WARNINGS "-Wno-unused-parameter -Wno-missing-field-initializers -Wno-sign-compare -Wno-type-limits -Wno-implicit-fallthrough -Wno-format-truncation") + set(CMAKE_COMMON_FLAGS "${CMAKE_COMMON_FLAGS} -Wextra -Werror ${CMAKE_SUPPRESSED_WARNINGS}") +endif () + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_COMMON_FLAGS}") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_COMMON_FLAGS} -std=c++0x") + +set(CMAKE_C_FLAGS_DEBUG "${KINDLING_DEBUG_FLAGS}") +set(CMAKE_CXX_FLAGS_DEBUG "${KINDLING_DEBUG_FLAGS}") + +set(CMAKE_C_FLAGS_RELEASE "-O3 -fno-strict-aliasing -DNDEBUG") +set(CMAKE_CXX_FLAGS_RELEASE "-O3 -fno-strict-aliasing -DNDEBUG") + +if (CMAKE_SYSTEM_NAME MATCHES "SunOS") + set(CMD_MAKE gmake) +else () + set(CMD_MAKE make) +endif () + +include(agent-libs) +add_subdirectory(src) + diff --git a/probe/COPYING b/probe/COPYING deleted file mode 100644 index 9f7ded338..000000000 --- a/probe/COPYING +++ /dev/null @@ -1,203 +0,0 @@ -The contents of the driver/ subdirectory are licensed separately--see COPYING.driver. - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/probe/NOTICES b/probe/NOTICES deleted file mode 100644 index bba7c1f43..000000000 --- a/probe/NOTICES +++ /dev/null @@ -1,28 +0,0 @@ -Copyright (C) 2013-2018 Draios Inc. dba Sysdig - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -SYSDIG SUBCOMPONENTS: - --The files in and its subdirectories are used to compile the - kernel module and may be injected into eBPF; these are dual licensed - under the MIT license or the GNU General Public License 2. Copies of - both licenses are available in the subdirectory. - --The following files are under Apache 2.0: - - userspace/sysdig/chisels/fileslower.lua, Copyright (C) 2014 Brendan Gregg - userspace/sysdig/chisels/memcachelog.lua, Copyright (C) 2015 Donatas Abraitis - userspace/sysdig/chisels/subsecoffset.lua, Copryight (C) 2013-2014 Draios Inc. dba Sysdig, Copyright (C) 2015 Brendan Gregg - userspace/sysdig/chisels/v_backlog.lua, Copyright (C) Donatas Abraitis - diff --git a/probe/README.md b/probe/README.md deleted file mode 100644 index ccc9a046a..000000000 --- a/probe/README.md +++ /dev/null @@ -1,22 +0,0 @@ -## 编译 ---- -### 启动编译镜像 -```shell -cd scripts -./run_docker.sh - -### daemon形式启动 -./run_docker_bpf_daemon.sh -``` -### 编译probe二进制 -```shell -bazel build -s --config=clang src/probe:kindling_probe -``` - -### 编译运行镜像 -```shell -### 编译 -bazel build -s --config=clang src/probe:push_image -### 推送,这里需要registry的密码,可以修改 src/probe/BUILD.bazel 来修改推送的registry -./bazel-bin/src/probe/push_image -``` \ No newline at end of file diff --git a/probe/WORKSPACE b/probe/WORKSPACE deleted file mode 100644 index 2387399b8..000000000 --- a/probe/WORKSPACE +++ /dev/null @@ -1,167 +0,0 @@ -workspace(name = "kp") - -load("@bazel_tools//tools/build_defs/repo:git.bzl","git_repository") -git_repository( - name = "px", - remote = "https://github.com/Kindling-project/pixie.git", - commit = "c98c1e8c041038d535db1fb2590087dcb91cf92f", -) - -BUILD_ALL_CONTENT = """filegroup(name = "all", srcs = glob(["**"]), visibility = ["//visibility:public"])""" - -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") - -http_archive( - name = "lib_zmq", - urls = ["https://github.com/zeromq/libzmq/releases/download/v4.3.2/zeromq-4.3.2.tar.gz"], - sha256 = "ebd7b5c830d6428956b67a0454a7f8cbed1de74b3b01e5c33c5378e22740f763", - strip_prefix = "zeromq-4.3.2", - build_file_content = BUILD_ALL_CONTENT, - ) - -http_archive( - name = "agent-libs", - urls = ["https://github.com/Kindling-project/agent-libs/archive/92b86531d3f325ff7153b61a9346f4efb3cb9e01.tar.gz"], - sha256 = "d8415c0730860bfe7940164ba9a88b407be29fb6b7712f7544d3720537f14106", - strip_prefix = "agent-libs-92b86531d3f325ff7153b61a9346f4efb3cb9e01", - build_file_content = BUILD_ALL_CONTENT, - ) - - -new_local_repository( - name = "libzmq", - build_file = "bazel/external/libzmq.BUILD", - path = "/usr/local", - ) - -load("@px//:workspace.bzl", "check_min_bazel_version") - -check_min_bazel_version("4.0.0") - -load("@px//bazel:repositories.bzl", "pl_deps") - -# Install Pixie Labs Dependencies. -pl_deps() - -load("//bazel:kindling_probes.bzl", "kindling_probes") -kindling_probes() - -# Order is important. Try to go from most basic/primitive to higher level packages. -# - protobuf_deps -# - grpc_deps (must come after protobuf_deps) -# - go_rules_dependencies -# - apple_rules_dependencies (must come after grpc_deps) -# ... -load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps") - -protobuf_deps() - -load("@com_github_grpc_grpc//bazel:grpc_deps.bzl", "grpc_deps") - -grpc_deps() - -load("@com_github_jupp0r_prometheus_cpp//bazel:repositories.bzl", "prometheus_cpp_repositories") - -prometheus_cpp_repositories() - -load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies") - -go_rules_dependencies() - -go_register_toolchains(go_version = "1.16") - -load("@io_bazel_rules_scala//:scala_config.bzl", "scala_config") - -scala_version = "2.13.6" - -scala_config(scala_version = scala_version) - -load("@io_bazel_rules_scala//scala:scala.bzl", "scala_repositories") - -scala_repositories() - -load("@io_bazel_rules_scala//scala:toolchains.bzl", "scala_register_toolchains") - -scala_register_toolchains() - -# These dependencies are needed by GRPC. -load("@build_bazel_rules_apple//apple:repositories.bzl", "apple_rules_dependencies") - -apple_rules_dependencies() - -load("@build_bazel_apple_support//lib:repositories.bzl", "apple_support_dependencies") - -apple_support_dependencies() - -load("@px//bazel:pl_workspace.bzl", "pl_container_images", "pl_workspace_setup") - -pl_workspace_setup() - -# The pip_deps rule cannot be loaded until we load all the basic packages in the Pixie -# workspace. Also, bazel requires that loads are done at the top level (not in a function), so -# we need to pull it out over here. -load("@io_bazel_rules_docker//repositories:py_repositories.bzl", "py_deps") - -# py_deps() - -# The docker images can't be loaded until all pip_deps are satisfied. -pl_container_images() - -load("@com_github_grpc_grpc//bazel:grpc_extra_deps.bzl", "grpc_extra_deps") - -grpc_extra_deps() - -load("@rules_foreign_cc//foreign_cc:repositories.bzl", "rules_foreign_cc_dependencies") - -rules_foreign_cc_dependencies() - -load("@px//bazel:gogo.bzl", "gogo_grpc_proto") - -gogo_grpc_proto(name = "gogo_grpc_proto") - -# Setup tensorflow. -# load("@org_tensorflow//tensorflow:workspace.bzl", "tf_repositories") - -# tf_repositories() - -load("@px//bazel:pl_workspace.bzl", "pl_model_files") - -pl_model_files() - -# Setup the environment for the open-source python API. -# load("@rules_python//python:pip.bzl", "pip_parse") - -# pip_parse( -# name = "vizier_api_python_deps", -# requirements_lock = "//src/api/python:requirements.txt", -# ) - -# load("@vizier_api_python_deps//:requirements.bzl", "install_deps") - -# install_deps() - -# Setup thrift: used for building Stirling tracing targets. -load("@px//bazel:thrift.bzl", "thrift_deps") - -thrift_deps(scala_version = scala_version) - -# twitter_scrooge will use incompatible versions of @scrooge_jars and @thrift_jars. -# These bind statements ensure that the correct versions of finagle libthrift are used -# so that compilation is successful. See https://github.com/bazelbuild/rules_scala/issues/592 -# and https://github.com/bazelbuild/rules_scala/pull/847 for more details. -bind( - name = "io_bazel_rules_scala/dependency/thrift/scrooge_core", - actual = "@px//src/stirling/source_connectors/socket_tracer/testing/containers/thriftmux:scrooge_jars", -) - -bind( - name = "io_bazel_rules_scala/dependency/thrift/libthrift", - actual = "@px//src/stirling/source_connectors/socket_tracer/testing/containers/thriftmux:thrift_jars", -) - -# gazelle:repo bazel_gazelle - -load("@px//:go_deps.bzl", "pl_go_dependencies") - -# gazelle:repository_macro go_deps.bzl%pl_go_dependencies -#pl_go_dependencies() diff --git a/probe/bazel/BUILD.bazel b/probe/bazel/BUILD.bazel deleted file mode 100644 index f096aaf6c..000000000 --- a/probe/bazel/BUILD.bazel +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright 2018- The Pixie Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# SPDX-License-Identifier: Apache-2.0 - -package(default_visibility = ["//visibility:public"]) - -config_setting( - name = "disable_tcmalloc", - values = {"define": "tcmalloc=disabled"}, -) - -config_setting( - name = "debug_tcmalloc", - values = {"define": "tcmalloc=debug"}, -) - -config_setting( - name = "coverage_enabled", - values = {"define": "PL_COVERAGE=true"}, -) - -config_setting( - name = "clang_build", - flag_values = { - "@bazel_tools//tools/cpp:compiler": "clang", - }, -) - -config_setting( - name = "gcc_build", - flag_values = { - "@bazel_tools//tools/cpp:compiler": "gcc", - }, -) - -config_setting( - name = "use_libcpp", - values = {"define": "use_libcpp=1"}, -) - -config_setting( - name = "debug_build", - values = {"compilation_mode": "dbg"}, -) - -config_setting( - name = "stamped", - values = {"stamp": "true"}, -) - diff --git a/probe/bazel/external/llvm.BUILD b/probe/bazel/external/llvm.BUILD deleted file mode 100644 index 9974be018..000000000 --- a/probe/bazel/external/llvm.BUILD +++ /dev/null @@ -1,123 +0,0 @@ -# Copyright 2018- The Pixie Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# SPDX-License-Identifier: Apache-2.0 - -load("@rules_cc//cc:defs.bzl", "cc_library") - -licenses(["notice"]) - -cc_library( - name = "llvm", - # do not sort. - srcs = [ - "lib/libclang.a", - "lib/libclangIndex.a", - "lib/libclangCodeGen.a", - "lib/libclangFrontend.a", - "lib/libclangSerialization.a", - "lib/libclangDriver.a", - "lib/libclangParse.a", - "lib/libclangSema.a", - "lib/libclangAnalysis.a", - "lib/libclangEdit.a", - "lib/libclangAST.a", - "lib/libclangLex.a", - "lib/libclangBasic.a", - "lib/libclangFormat.a", - "lib/libclangToolingCore.a", - "lib/libclangToolingInclusions.a", - "lib/libclangRewrite.a", - "lib/libLLVMBPFDisassembler.a", - "lib/libLLVMBPFAsmParser.a", - "lib/libLLVMCoroutines.a", - "lib/libLLVMCoverage.a", - "lib/libLLVMLTO.a", - "lib/libLLVMX86CodeGen.a", - "lib/libLLVMCFGuard.a", - "lib/libLLVMX86Desc.a", - "lib/libLLVMX86Info.a", - "lib/libLLVMMCDisassembler.a", - "lib/libLLVMBitstreamReader.a", - "lib/libclangASTMatchers.a", - "lib/libLLVMRemarks.a", - "lib/libLLVMGlobalISel.a", - "lib/libLLVMPasses.a", - "lib/libPolly.a", - "lib/libPollyISL.a", - "lib/libLLVMipo.a", - "lib/libLLVMAggressiveInstCombine.a", - "lib/libLLVMVectorize.a", - "lib/libLLVMInstrumentation.a", - "lib/libLLVMOption.a", - "lib/libLLVMObjCARCOpts.a", - "lib/libLLVMMCJIT.a", - "lib/libLLVMOrcJIT.a", - "lib/libLLVMExecutionEngine.a", - "lib/libLLVMRuntimeDyld.a", - "lib/libLLVMLinker.a", - "lib/libLLVMIRReader.a", - "lib/libLLVMAsmParser.a", - "lib/libLLVMDebugInfoDWARF.a", - "lib/libLLVMBPFCodeGen.a", - "lib/libLLVMSelectionDAG.a", - "lib/libLLVMBPFDesc.a", - "lib/libLLVMBPFInfo.a", - "lib/libLLVMAsmPrinter.a", - "lib/libLLVMX86AsmParser.a", - "lib/libLLVMDebugInfoCodeView.a", - "lib/libLLVMDebugInfoMSF.a", - "lib/libLLVMCodeGen.a", - "lib/libLLVMTarget.a", - "lib/libLLVMScalarOpts.a", - "lib/libLLVMInstCombine.a", - "lib/libLLVMTransformUtils.a", - "lib/libLLVMBitWriter.a", - "lib/libLLVMAnalysis.a", - "lib/libLLVMProfileData.a", - "lib/libLLVMObject.a", - "lib/libLLVMTextAPI.a", - "lib/libLLVMMCParser.a", - "lib/libLLVMMC.a", - "lib/libLLVMBitReader.a", - "lib/libLLVMCore.a", - "lib/libLLVMBinaryFormat.a", - "lib/libLLVMFrontendOpenMP.a", - "lib/libLLVMSupport.a", - "lib/libLLVMDemangle.a", - "lib/libLLVMX86Disassembler.a", - "lib/libLLVMJITLink.a", - "lib/libLLVMOrcTargetProcess.a", - "lib/libLLVMOrcShared.a", - # WARNING HACK: This adds a stub so that we don't have to include all of - # clang-tidy with the LLVM build. We don't need to use clang-tidy since we don't - # do any auto cleanup/formatting during our compile process. If this ever changes, - # this stub will need to be removed. - # Refer to: https://reviews.llvm.org/D55415 - "@px//third_party:clang_tidy_stub", - ], - hdrs = glob([ - "include/**/*.h", - "include/**/*.def", - "include/**/*.inc", - ]), - includes = ["include"], - linkopts = [ - # Terminal info for llvm - "-ltinfo", - ], - linkstatic = 1, - visibility = ["//visibility:public"], - alwayslink = 1, -) diff --git a/probe/bazel/get_workspace_status.sh b/probe/bazel/get_workspace_status.sh deleted file mode 100755 index 68195cba2..000000000 --- a/probe/bazel/get_workspace_status.sh +++ /dev/null @@ -1,72 +0,0 @@ -#!/bin/bash - -# Copyright 2018- The Pixie Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# SPDX-License-Identifier: Apache-2.0 - -# This file was inspired by: -# https://github.com/envoyproxy/envoy/blob/master/bazel/get_workspace_status - -# This script will be run bazel when building process starts to -# generate key-value information that represents the status of the -# workspace. The output should be like -# -# KEY1 VALUE1 -# KEY2 VALUE2 -# -# If the script exits with non-zero code, it's considered as a failure -# and the output will be discarded. - -# If this VERSION file exists then it must have been placed here by a -# distribution doing a non-git, source build. -# Distributions would be expected to echo the commit/tag as BUILD_SCM_REVISION. -if [[ -f "VERSION" && -f "GIT_COMMIT" ]]; -then - echo "STABLE_BUILD_SCM_REVISION $(cat GIT_COMMIT)" - echo "STABLE_BUILD_TAG $(cat VERSION)" - echo "STABLE_BUILD_NUMBER ${BUILD_NUMBER}" - echo "STABLE_BUILD_SCM_STATUS Distribution" - - exit 0 -fi - -# The code below presents an implementation that works for git repository. -git_rev=$(git rev-parse HEAD) -if [[ $? != 0 ]]; -then - exit 1 -fi -echo "STABLE_BUILD_SCM_REVISION ${git_rev}" - - -# Check whether there are any uncommitted changes. -git diff-index --quiet HEAD -- -if [[ $? == 0 ]]; -then - tree_status="Clean" -else - tree_status="Modified" -fi - -echo "STABLE_BUILD_SCM_STATUS ${tree_status}" - -# Use 0.0.0-dev for all dev build versions. We don't have a version number that is -# shared accross all our binaries which makes it hard to semantically version. -echo "BUILD_TAG 0.0.0-dev" -echo "STABLE_BUILD_TAG 0.0.0-dev" -echo "STABLE_BUILD_NUMBER 0" - -echo "BUILD_TAG 0.0.0-dev" -echo "BUILD_NUMBER 0" diff --git a/probe/bazel/kindling_probes.bzl b/probe/bazel/kindling_probes.bzl deleted file mode 100644 index 6569fcc34..000000000 --- a/probe/bazel/kindling_probes.bzl +++ /dev/null @@ -1,9 +0,0 @@ -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file") - -def kindling_probes(): - http_file( - name = "kindling_falcolib_probe_tar_gz", - urls = ["https://k8s-bpf-probes-public.oss-cn-hangzhou.aliyuncs.com/kindling-falcolib-probe.tar.gz"], - sha256 = "fc6b44cfa36ad7cb1c532a07c0e5a761b289d696a33299af7293878003db74ac", - downloaded_file_path = "kindling-falcolib-probe.tar.gz", - ) diff --git a/probe/cmake/modules/agent-libs-repo/CMakeLists.txt b/probe/cmake/modules/agent-libs-repo/CMakeLists.txt new file mode 100644 index 000000000..16078df2b --- /dev/null +++ b/probe/cmake/modules/agent-libs-repo/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 3.5.1) + +project(. NONE) + +include(ExternalProject) +message(STATUS "Driver version: ${AGENT_LIBS_VERSION}") + +ExternalProject_Add( + agent-libs + URL "https://github.com/Kindling-project/agent-libs/archive/${AGENT_LIBS_VERSION}.tar.gz" + URL_HASH "${AGENT_LIBS_CHECKSUM}" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "") \ No newline at end of file diff --git a/probe/cmake/modules/agent-libs.cmake b/probe/cmake/modules/agent-libs.cmake new file mode 100644 index 000000000..27f3e8163 --- /dev/null +++ b/probe/cmake/modules/agent-libs.cmake @@ -0,0 +1,75 @@ +# +# Copyright (C) 2013-2021 Draios Inc dba Sysdig. +# +# This file is part of sysdig . +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set(AGENT_LIBS_CMAKE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/agent-libs-repo") +set(AGENT_LIBS_CMAKE_WORKING_DIR "${CMAKE_BINARY_DIR}/agent-libs-repo") + +add_definitions(-DHAS_CAPTURE) +add_definitions(-DMINIMAL_BUILD) + +file(MAKE_DIRECTORY ${AGENT_LIBS_CMAKE_WORKING_DIR}) + +if(AGENT_LIBS_SOURCE_DIR) + set(AGENT_LIBS_VERSION "local") + message(STATUS "Using local falcosecurity/libs in '${AGENT_LIBS_SOURCE_DIR}'") +else() + # The falcosecurity/libs git reference (branch name, commit hash, or tag) To update falcosecurity/libs version for the next release, change the + # default below In case you want to test against another falcosecurity/libs version just pass the variable - ie., `cmake + # -DAGENT_LIBS_VERSION=dev ..` + if(NOT AGENT_LIBS_VERSION) + set(AGENT_LIBS_VERSION "972312900297c01d8d52657d333e36eb8710c23c") + set(AGENT_LIBS_CHECKSUM "SHA256=1b8740c1de91abe36169ea2c6850265c9c86a18f6b6d9bcfd9a4c8e7330e78a9") + endif() + + # cd /path/to/build && cmake /path/to/source + execute_process(COMMAND "${CMAKE_COMMAND}" -DAGENT_LIBS_VERSION=${AGENT_LIBS_VERSION} -DAGENT_LIBS_CHECKSUM=${AGENT_LIBS_CHECKSUM} + ${AGENT_LIBS_CMAKE_SOURCE_DIR} WORKING_DIRECTORY ${AGENT_LIBS_CMAKE_WORKING_DIR}) + + # todo(leodido, fntlnz) > use the following one when CMake version will be >= 3.13 + + # execute_process(COMMAND "${CMAKE_COMMAND}" -B ${AGENT_LIBS_CMAKE_WORKING_DIR} WORKING_DIRECTORY + # "${AGENT_LIBS_CMAKE_SOURCE_DIR}") + + execute_process(COMMAND "${CMAKE_COMMAND}" --build . WORKING_DIRECTORY "${AGENT_LIBS_CMAKE_WORKING_DIR}") + set(AGENT_LIBS_SOURCE_DIR "${AGENT_LIBS_CMAKE_WORKING_DIR}/agent-libs-prefix/src/agent-libs") +endif() + +set(DRIVER_VERSION "${AGENT_LIBS_VERSION}") + +if(NOT LIBSCAP_DIR) + set(LIBSCAP_DIR "${AGENT_LIBS_SOURCE_DIR}") +endif() +set(LIBSINSP_DIR "${AGENT_LIBS_SOURCE_DIR}") + +set(CREATE_TEST_TARGETS OFF CACHE BOOL "") +set(BUILD_LIBSCAP_EXAMPLES OFF CACHE BOOL "") +set(BUILD_LIBSINSP_EXAMPLES OFF CACHE BOOL "") + +list(APPEND CMAKE_MODULE_PATH "${LIBSCAP_DIR}/cmake/modules") +list(APPEND CMAKE_MODULE_PATH "${LIBSINSP_DIR}/cmake/modules") + +include(CheckSymbolExists) +check_symbol_exists(strlcpy "string.h" HAVE_STRLCPY) +if(HAVE_STRLCPY) + message(STATUS "Existing strlcpy found, will *not* use local definition by setting -DHAVE_STRLCPY.") + add_definitions(-DHAVE_STRLCPY) +else() + message(STATUS "No strlcpy found, will use local definition") +endif() + +include(libscap) +include(libsinsp) \ No newline at end of file diff --git a/probe/coding_conventions.md b/probe/coding_conventions.md deleted file mode 100644 index bdb5850ba..000000000 --- a/probe/coding_conventions.md +++ /dev/null @@ -1,278 +0,0 @@ -0 Introduction ------- - -Sysdig strives for a consistent high quality code base and uses the conventions -below. If you are going to commit code that doesn't follow them, then you put the -work on us. :-(. - -If you use vim or emacs, you can put a custom configuration file in the base -directory of sysdig in order to follow the conventions. - -Also, note that the conventions in this file apply **strictly to the userspace** part -of sysdig. For the kernel code, you should refer to -https://www.kernel.org/doc/html/latest/process/coding-style.html -and always run checkpatch.pl from the kernel tree before submitting pull requests. - -Thanks for your attention and time. - -1 Curly Braces ------- - -Every curly brace ("{" and "}") should go on its own line. - -Example: - - if(a == 0) - { - b = 1; - } - -2 If and for statements ------- - -Every `if` and `for` statement should have the curly braces. - -Example: - - if(a == 0) - { - b = 1; - } - -and not - - if(a == 0) - b = 1; - -3 Whitespace usage ------- - -Spaces are used in the following way: - - int32_t foo(int32_t a, int32_t b) - { - for(j = 0; j < 10; j++) - { - foo(a, b); - } - } - -Note that: - - * in a function declaration, there is no space between the function name and the "(". - * in a function declaration, there is no space between the "(" and the first parameter. - * in a statement (e.g `for`, `while`...), there is no space between the "for" and the "(". - * in a statement (e.g `for`), there is no space between the "(" and the variable name. - * in a function call, there is no space between the function name and the "(". - * in a function call, there is no space between the "(" and the first parameter. - * "," and ";" work like in English: there should be a space after them. - -4 Primitive types ------- - -For portability reasons, please use the standard C99 types instead of the native C types -like `int` and `long`. C99 types types will be available in all the user level sysdig -source files: - -Example: - - int32_t foo; - -5 Commenting Style ------- - -Comments should be in the C++ style so we can use `/* */` to quickly remove -portions of code during development. - -Example: - - // this is a comment - -6 Commenting Content ------- - -Code comments work in the following 2-level way: - - * A three-line comment should document what the code does and give higher level explanations. - * A one line comment should detail single code lines or explain specific actions. - -Example: - - // - // Swap two variables - // - int a = 1, b = 2, t; - - // make a copy of a - t = a; - - // perform the swap - a = b; - b = t; - -7 Class variables ------- - -In order to know whether a variable belongs to a `class` or a `function` we start member variables with "`m_`". - -Example: - - public int32_t m_counter; - -8 Global variables ------- - -Similarly, in order to know whether the variable is global or not, we start -globals with "`g_`". - -Example: - - int g_nplugins; - -9 Capitalization ------- - -The naming convention is camel-cased "Unix" style, i.e. always lower case. Words are separated by underscores. - -Example: - - int32_t g_global_bean_counter; - - int32_t count_beans(); - -and not, - - int32_t GlobalBeanCounter; - -10 Packed Structures -------- -Packed structures should use the GCC and MSVC-style supported `pragma`: - - #pragma pack(push,1) - struct frame_control - { - struct fields.... - }; - #pragma pack(pop) - -11 OS-specific macros -------- - -There's an online wiki which enumerates the different macros for compilers, operating systems, and architectures. -It's available at [http://sourceforge.net/p/predef/wiki/Home/](http://sourceforge.net/p/predef/wiki/Home/). Generally speaking we use the operating system page: [http://sourceforge.net/p/predef/wiki/OperatingSystems/](http://sourceforge.net/p/predef/wiki/OperatingSystems/). - -12 64-bit constants -------- - -Put an "LL" at the end of your 64 bit constants. Without the LL, on some platforms the compiler tries to interpret the constant on the right hand side -as a long integer instead of a long long and in some platform this generate an error at building time. - -Example: - - x=0X00FF00000000000LL - -13 Class Declaration -------- - -Class declarations follow the following sequence - - 1. contructors and desctuctor - 1. public functions - 1. public data - 1. private functions - 1. private data - 1. friend declarations - -Example: - - class foo - { - public: - foo(); - ~foo(); - - int32_t lonli(); - int32_t m_val; - - private: - int32_t temustra(); - int32_t m_val2; - }; - -14 Struct guidelines -------- - -We think hiding the presence of a pointer makes the code unnecessarily -ambiguous and more difficult. - -Seeing a * in a variable declaration immediately identifies a pointer, which -is easier to mentally keep track of! - -Also we think that defining the struct as a typedef makes forward declarations -clunky and find using the C++ style when declaring our structs makes our -lives easier. - - // - // Us human parsers find this confusing. - // - typedef struct _my_struct - { - u_int16 m_field; - } my_struct, - *p_my_struct; - - // - // This is easier! - // - struct my_struct { - u_int16 m_field; - }; - - -15 Temporary variables -------- - -Since "j" is used less frequently in english prose than "a" or "i", we find -that these variables (in hierarchical order) are great for counters: j, k, l, -m, n. - -Example: - - int32_t j,k; - for(j = 0; j < 10; j++) - { - for(k = 0; k < 10; k++) - { - int32_t foo = j + k; - } - } - -as opposed to: - - int32_t i,counter; - for(i = 0; i < 10; i++) - { - for(counter = 0; counter < 10; counter++) - { - int32_t foo = i + counter; - } - } - -16 Error management -------- - -Error management inside libscap is done through return values, since the scap -library is written in C. -Error management in the rest of the sysdig user level code base is done through -exceptions. We know there's a lot of debate between return values and -exceptions. We decided to pick the latter, so please stick with that. - -## You Made It! - -Phew! That's it. Thanks! - -If we've left anything in the open, feel free to contact us and we'll be happy -to get back to you. Also, you can look at the existing code and see how it's -done. - -Have a good one! diff --git a/probe/docker/BUILD.bazel b/probe/docker/BUILD.bazel deleted file mode 100644 index 916e736b2..000000000 --- a/probe/docker/BUILD.bazel +++ /dev/null @@ -1,11 +0,0 @@ -filegroup( - name = "scripts", - srcs = ["docker-entrypoint.sh","kindling-probe-loader","gdb_print.sh","post_start.sh"], - visibility = ["//visibility:public"], -) - -filegroup( - name = "localdriver", - srcs = ["kindling-falcolib-probe.tar.gz"], - visibility = ["//visibility:public"], -) diff --git a/probe/docker/Dockerfile b/probe/docker/Dockerfile deleted file mode 100644 index fed0f3c9f..000000000 --- a/probe/docker/Dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -FROM centos:7 -RUN yum install -y gdb -ENV HCMINE_HOST_ROOT /host - -COPY lib/* /lib64/ -RUN ldconfig - -COPY kindling-probe-loader /usr/bin/kindling-probe-loader -RUN chmod +x /usr/bin/kindling-probe-loader -COPY docker-entrypoint.sh / -RUN chmod +x /docker-entrypoint.sh -COPY gdb_print.sh /usr/bin/gdb_print.sh -COPY probe/* /opt/.kindling/ - -COPY kindling-probe /usr/bin/ - -ENTRYPOINT ["/docker-entrypoint.sh"] - -CMD ["/usr/bin/kindling-probe"] \ No newline at end of file diff --git a/probe/docker/docker-entrypoint.sh b/probe/docker/docker-entrypoint.sh deleted file mode 100644 index 9018a4bec..000000000 --- a/probe/docker/docker-entrypoint.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh - -/pl/kindling-probe-loader - -if [ -f "/opt/probe.o" ]; then - export SYSDIG_BPF_PROBE="/opt/probe.o" -fi - -exec /pl/kindling_probe "$@" diff --git a/probe/docker/gdb_print.sh b/probe/docker/gdb_print.sh deleted file mode 100755 index 4907abdd6..000000000 --- a/probe/docker/gdb_print.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh - -binname=$1 -corefile=$2 - -(gdb $binname $corefile > ./$corefile.log 2>&1) < +#include + +static sinsp *inspector = nullptr; + +int cnt = 0; +map m_events; +map m_categories; +int16_t event_filters[1024][16]; + +void init_sub_label() +{ + for(auto e : kindling_to_sysdig) + { + m_events[e.event_name] = e.event_type; + } + for(auto c : category_map) + { + m_categories[c.cateogry_name] = c.category_value; + } + for(int i = 0; i < 1024; i++) + { + for(int j = 0; j < 16; j++) + { + event_filters[i][j] = 0; + } + } +} + +void sub_event(char *eventName, char *category) +{ + cout << "sub event name:" << eventName << " && category:" << category << endl; + auto it_type = m_events.find(eventName); + if(it_type != m_events.end()) + { + if(category == nullptr || category[0] == '\0') + { + for(int j = 0; j < 16; j++) + { + event_filters[it_type->second][j] = 1; + } + } + else + { + auto it_category = m_categories.find(category); + if(it_category != m_categories.end()) + { + event_filters[it_type->second][it_category->second] = 1; + } + } + } +} + +void init_probe() +{ + bool bpf = false; + string bpf_probe; + inspector = new sinsp(); + init_sub_label(); + string output_format; + output_format = "*%evt.num %evt.outputtime %evt.cpu %container.name (%container.id) %proc.name (%thread.tid:%thread.vtid) %evt.dir %evt.type %evt.info"; + try + { + inspector = new sinsp(); + inspector->set_hostname_and_port_resolution_mode(false); + inspector->set_snaplen(80); + + inspector->suppress_events_comm("containerd"); + inspector->suppress_events_comm("dockerd"); + inspector->suppress_events_comm("containerd-shim"); + inspector->suppress_events_comm("kindling-collector"); + inspector->suppress_events_comm("sshd"); + sinsp_evt_formatter formatter(inspector, output_format); + const char *probe = scap_get_bpf_probe_from_env(); + if(probe) + { + bpf = true; + bpf_probe = probe; + } + + bool open_success = true; + + try + { + inspector->open(""); + inspector->clear_eventmask(); + inspector->set_eventmask(PPME_SYSCALL_WRITEV_X); + inspector->set_eventmask(PPME_SYSCALL_WRITEV_X - 1); + inspector->set_eventmask(PPME_SYSCALL_WRITE_X); + inspector->set_eventmask(PPME_SYSCALL_WRITE_E); + inspector->set_eventmask(PPME_SYSCALL_READ_X); + inspector->set_eventmask(PPME_SYSCALL_READ_E); + } + catch(const sinsp_exception &e) + { + open_success = false; + cout << "open failed" << endl; + } + + // + // Starting the live capture failed, try to load the driver with + // modprobe. + // + if(!open_success) + { + if(bpf) + { + if(bpf_probe.empty()) + { + fprintf(stderr, "Unable to locate the BPF probe\n"); + } + } + + inspector->open(""); + } + } + catch(const exception &e) + { + fprintf(stderr, "kindling probe init err: %s", e.what()); + } +} + +int getEvent(void **pp_kindling_event) +{ + int32_t res; + sinsp_evt *ev; + res = inspector->next(&ev); + if(res == SCAP_TIMEOUT) + { + return -1; + } + else if(res != SCAP_SUCCESS) + { + return -1; + } + if(!inspector->is_debug_enabled() && + ev->get_category() & EC_INTERNAL) + { + return -1; + } + auto threadInfo = ev->get_thread_info(); + if(threadInfo == nullptr) + { + return -1; + } + + auto category = ev->get_category(); + if(category & EC_IO_BASE) + { + auto pres = ev->get_param_value_raw("res"); + if(pres && *(int64_t *)pres->m_val <= 0) + { + return -1; + } + } + + uint16_t kindling_category = get_kindling_category(ev); + uint16_t ev_type = ev->get_type(); + if(event_filters[ev_type][kindling_category] == 0) + { + return -1; + } + + kindling_event_t_for_go *p_kindling_event; + if(nullptr == *pp_kindling_event) + { + *pp_kindling_event = (kindling_event_t_for_go *)malloc(sizeof(kindling_event_t_for_go)); + p_kindling_event = (kindling_event_t_for_go *)*pp_kindling_event; + + p_kindling_event->name = (char *)malloc(sizeof(char) * 1024); + p_kindling_event->context.tinfo.comm = (char *)malloc(sizeof(char) * 256); + p_kindling_event->context.tinfo.containerId = (char *)malloc(sizeof(char) * 256); + p_kindling_event->context.fdInfo.filename = (char *)malloc(sizeof(char) * 1024); + p_kindling_event->context.fdInfo.directory = (char *)malloc(sizeof(char) * 1024); + + for(int i = 0; i < 8; i++) + { + p_kindling_event->userAttributes[i].key = (char *)malloc(sizeof(char) * 128); + p_kindling_event->userAttributes[i].value = (char *)malloc(sizeof(char) * 1024); + } + } + p_kindling_event = (kindling_event_t_for_go *)*pp_kindling_event; + + sinsp_fdinfo_t *fdInfo = ev->get_fd_info(); + p_kindling_event->timestamp = ev->get_ts(); + p_kindling_event->category = kindling_category; + p_kindling_event->context.tinfo.pid = threadInfo->m_pid; + p_kindling_event->context.tinfo.tid = threadInfo->m_tid; + p_kindling_event->context.tinfo.uid = threadInfo->m_uid; + p_kindling_event->context.tinfo.gid = threadInfo->m_gid; + p_kindling_event->context.fdInfo.num = ev->get_fd_num(); + if(nullptr != fdInfo) + { + p_kindling_event->context.fdInfo.fdType = fdInfo->m_type; + + switch(fdInfo->m_type) + { + case SCAP_FD_FILE: + case SCAP_FD_FILE_V2: + { + + string name = fdInfo->m_name; + size_t pos = name.rfind('/'); + if(pos != string::npos) + { + if(pos < name.size() - 1) + { + string fileName = name.substr(pos + 1, string::npos); + memcpy(p_kindling_event->context.fdInfo.filename, fileName.data(), fileName.length()); + if(pos != 0) + { + + name.resize(pos); + + strcpy(p_kindling_event->context.fdInfo.directory, (char *)name.data()); + } + else + { + strcpy(p_kindling_event->context.fdInfo.directory, "/"); + } + } + } + break; + } + case SCAP_FD_IPV4_SOCK: + case SCAP_FD_IPV4_SERVSOCK: + p_kindling_event->context.fdInfo.protocol = get_protocol(fdInfo->get_l4proto()); + p_kindling_event->context.fdInfo.role = fdInfo->is_role_server(); + p_kindling_event->context.fdInfo.sip = fdInfo->m_sockinfo.m_ipv4info.m_fields.m_sip; + p_kindling_event->context.fdInfo.dip = fdInfo->m_sockinfo.m_ipv4info.m_fields.m_dip; + p_kindling_event->context.fdInfo.sport = fdInfo->m_sockinfo.m_ipv4info.m_fields.m_sport; + p_kindling_event->context.fdInfo.dport = fdInfo->m_sockinfo.m_ipv4info.m_fields.m_dport; + break; + case SCAP_FD_UNIX_SOCK: + p_kindling_event->context.fdInfo.source = fdInfo->m_sockinfo.m_unixinfo.m_fields.m_source; + p_kindling_event->context.fdInfo.destination = fdInfo->m_sockinfo.m_unixinfo.m_fields.m_dest; + break; + default: + break; + } + } + + uint16_t userAttNumber = 0; + switch(ev->get_type()) + { + case PPME_TCP_RCV_ESTABLISHED_E: + case PPME_TCP_CLOSE_E: + { + auto pTuple = ev->get_param_value_raw("tuple"); + userAttNumber = setTuple(p_kindling_event, pTuple, userAttNumber); + + auto pRtt = ev->get_param_value_raw("srtt"); + if(pRtt != NULL) + { + strcpy(p_kindling_event->userAttributes[userAttNumber].key, "rtt"); + memcpy(p_kindling_event->userAttributes[userAttNumber].value, pRtt->m_val, pRtt->m_len); + p_kindling_event->userAttributes[userAttNumber].valueType = UINT32; + p_kindling_event->userAttributes[userAttNumber].len = pRtt->m_len; + userAttNumber++; + } + break; + } + case PPME_TCP_CONNECT_X: + { + auto pTuple = ev->get_param_value_raw("tuple"); + userAttNumber = setTuple(p_kindling_event, pTuple, userAttNumber); + auto pRetVal = ev->get_param_value_raw("retval"); + if(pRetVal != NULL) + { + strcpy(p_kindling_event->userAttributes[userAttNumber].key, "retval"); + memcpy(p_kindling_event->userAttributes[userAttNumber].value, pRetVal->m_val, pRetVal->m_len); + p_kindling_event->userAttributes[userAttNumber].valueType = UINT64; + p_kindling_event->userAttributes[userAttNumber].len = pRetVal->m_len; + userAttNumber++; + } + break; + } + case PPME_TCP_DROP_E: + case PPME_TCP_RETRANCESMIT_SKB_E: + case PPME_TCP_SET_STATE_E: + { + auto pTuple = ev->get_param_value_raw("tuple"); + userAttNumber = setTuple(p_kindling_event, pTuple, userAttNumber); + auto old_state = ev->get_param_value_raw("old_state"); + if(old_state != NULL) + { + strcpy(p_kindling_event->userAttributes[userAttNumber].key, "old_state"); + memcpy(p_kindling_event->userAttributes[userAttNumber].value, old_state->m_val, old_state->m_len); + p_kindling_event->userAttributes[userAttNumber].len = old_state->m_len; + p_kindling_event->userAttributes[userAttNumber].valueType = INT32; + userAttNumber++; + } + auto new_state = ev->get_param_value_raw("new_state"); + if(new_state != NULL) + { + strcpy(p_kindling_event->userAttributes[userAttNumber].key, "new_state"); + memcpy(p_kindling_event->userAttributes[userAttNumber].value, new_state->m_val, new_state->m_len); + p_kindling_event->userAttributes[userAttNumber].valueType = INT32; + p_kindling_event->userAttributes[userAttNumber].len = new_state->m_len; + userAttNumber++; + } + break; + } + case PPME_TCP_SEND_RESET_E: + case PPME_TCP_RECEIVE_RESET_E: + { + auto pTuple = ev->get_param_value_raw("tuple"); + userAttNumber = setTuple(p_kindling_event, pTuple, userAttNumber); + break; + } + default: + { + uint16_t paramsNumber = ev->get_num_params(); + if(paramsNumber > 8) + { + paramsNumber = 8; + } + for(auto i = 0; i < paramsNumber; i++) + { + + strcpy(p_kindling_event->userAttributes[userAttNumber].key, (char *)ev->get_param_name(i)); + memcpy(p_kindling_event->userAttributes[userAttNumber].value, ev->get_param(i)->m_val, + ev->get_param(i)->m_len); + p_kindling_event->userAttributes[userAttNumber].len = ev->get_param(i)->m_len; + p_kindling_event->userAttributes[userAttNumber].valueType = get_type(ev->get_param_info(i)->type); + userAttNumber++; + } + } + } + p_kindling_event->paramsNumber = userAttNumber; + strcpy(p_kindling_event->name, (char *)ev->get_name()); + strcpy(p_kindling_event->context.tinfo.comm, (char *)threadInfo->m_comm.data()); + strcpy(p_kindling_event->context.tinfo.containerId, (char *)threadInfo->m_container_id.data()); + return 1; +} + +int setTuple(kindling_event_t_for_go *p_kindling_event, const sinsp_evt_param *pTuple, int userAttNumber) +{ + if(NULL != pTuple) + { + auto tuple = pTuple->m_val; + if(tuple[0] == PPM_AF_INET) + { + if(pTuple->m_len == 1 + 4 + 2 + 4 + 2) + { + + strcpy(p_kindling_event->userAttributes[userAttNumber].key, "sip"); + memcpy(p_kindling_event->userAttributes[userAttNumber].value, tuple + 1, 4); + p_kindling_event->userAttributes[userAttNumber].valueType = UINT32; + p_kindling_event->userAttributes[userAttNumber].len = 4; + userAttNumber++; + + strcpy(p_kindling_event->userAttributes[userAttNumber].key, "sport"); + memcpy(p_kindling_event->userAttributes[userAttNumber].value, tuple + 5, 2); + p_kindling_event->userAttributes[userAttNumber].valueType = UINT16; + p_kindling_event->userAttributes[userAttNumber].len = 2; + userAttNumber++; + + strcpy(p_kindling_event->userAttributes[userAttNumber].key, "dip"); + memcpy(p_kindling_event->userAttributes[userAttNumber].value, tuple + 7, 4); + p_kindling_event->userAttributes[userAttNumber].valueType = UINT32; + p_kindling_event->userAttributes[userAttNumber].len = 4; + userAttNumber++; + + strcpy(p_kindling_event->userAttributes[userAttNumber].key, "dport"); + memcpy(p_kindling_event->userAttributes[userAttNumber].value, tuple + 11, 2); + p_kindling_event->userAttributes[userAttNumber].valueType = UINT16; + p_kindling_event->userAttributes[userAttNumber].len = 2; + userAttNumber++; + } + } + } + return userAttNumber; +} + +uint16_t get_protocol(scap_l4_proto proto) +{ + switch(proto) + { + case SCAP_L4_TCP: + return TCP; + case SCAP_L4_UDP: + return UDP; + case SCAP_L4_ICMP: + return ICMP; + case SCAP_L4_RAW: + return RAW; + default: + return UNKNOWN; + } +} + +uint16_t get_type(ppm_param_type type) +{ + switch(type) + { + case PT_INT8: + return INT8; + case PT_INT16: + return INT16; + case PT_INT32: + return INT32; + case PT_INT64: + case PT_FD: + case PT_PID: + case PT_ERRNO: + return INT64; + case PT_FLAGS8: + case PT_UINT8: + case PT_SIGTYPE: + return UINT8; + case PT_FLAGS16: + case PT_UINT16: + case PT_SYSCALLID: + return UINT16; + case PT_UINT32: + case PT_FLAGS32: + case PT_MODE: + case PT_UID: + case PT_GID: + case PT_BOOL: + case PT_SIGSET: + return UINT32; + case PT_UINT64: + case PT_RELTIME: + case PT_ABSTIME: + return UINT64; + case PT_CHARBUF: + case PT_FSPATH: + return CHARBUF; + case PT_BYTEBUF: + return BYTEBUF; + case PT_DOUBLE: + return DOUBLE; + case PT_SOCKADDR: + case PT_SOCKTUPLE: + case PT_FDLIST: + default: + return BYTEBUF; + } +} + +uint16_t get_kindling_category(sinsp_evt *sEvt) +{ + sinsp_evt::category cat; + sEvt->get_category(&cat); + switch(cat.m_category) + { + case EC_OTHER: + return CAT_OTHER; + case EC_FILE: + return CAT_FILE; + case EC_NET: + return CAT_NET; + case EC_IPC: + return CAT_IPC; + case EC_MEMORY: + return CAT_MEMORY; + case EC_PROCESS: + return CAT_PROCESS; + case EC_SLEEP: + return CAT_SLEEP; + case EC_SYSTEM: + return CAT_SYSTEM; + case EC_SIGNAL: + return CAT_SIGNAL; + case EC_USER: + return CAT_USER; + case EC_TIME: + return CAT_TIME; + case EC_IO_READ: + case EC_IO_WRITE: + case EC_IO_OTHER: + { + switch(cat.m_subcategory) + { + case sinsp_evt::SC_FILE: + return CAT_FILE; + case sinsp_evt::SC_NET: + return CAT_NET; + case sinsp_evt::SC_IPC: + return CAT_IPC; + default: + return CAT_OTHER; + } + } + default: + return CAT_OTHER; + } +} diff --git a/probe/src/cgo/kindling.h b/probe/src/cgo/kindling.h new file mode 100644 index 000000000..cb31c6628 --- /dev/null +++ b/probe/src/cgo/kindling.h @@ -0,0 +1,404 @@ +// +// Created by jundi zhou on 2022/6/1. +// +#pragma once +#ifndef SYSDIG_KINDLING_H +#define SYSDIG_KINDLING_H +#include "sinsp.h" + +void init_probe(); +int getEvent(void **kindlingEvent); +uint16_t get_kindling_category(sinsp_evt *sEvt); +void init_sub_label(); +void sub_event(char* eventName, char* category); +uint16_t get_protocol(scap_l4_proto proto); +uint16_t get_type(ppm_param_type type); +struct event { + string event_name; + ppm_event_type event_type; +}; +struct kindling_event_t_for_go{ + uint64_t timestamp; + char *name; + uint32_t category; + uint16_t paramsNumber; + struct KeyValue { + char *key; + char* value; + uint32_t len; + uint32_t valueType; + }userAttributes[8]; + struct event_context { + struct thread_info { + uint32_t pid; + uint32_t tid; + uint32_t uid; + uint32_t gid; + char *comm; + char *containerId; + }tinfo; + struct fd_info { + int32_t num; + uint32_t fdType; + char *filename; + char *directory; + uint32_t protocol; + uint8_t role; + uint32_t sip; + uint32_t dip; + uint32_t sport; + uint32_t dport; + uint64_t source; + uint64_t destination; + }fdInfo; + }context; +}; + +int setTuple(kindling_event_t_for_go* kevt, const sinsp_evt_param *pTuple, int userAttNumber); + +enum Category { + CAT_NONE = 0, + CAT_OTHER = 1, // No specific category + CAT_FILE = 2, // File operations or File I/O + CAT_NET = 3, // Network operations or network I/O + CAT_IPC = 4, // IPC operations or IPC I/O + CAT_WAIT = 5, // + CAT_SIGNAL = 6, // Signal-related operations (signal) + CAT_SLEEP = 7, // nanosleep + CAT_TIME = 8, // Time-related event (e.g. gettimeofday)) + CAT_PROCESS = 9, // Process-related event (e.g. fork, clone, + CAT_SCHEDULER = 10, // Scheduler event (context switch) + CAT_MEMORY = 11, // Memory-related operations (e.g. brk, mmap, unmap) + CAT_USER = 12, // User-related operations (e.g. getuid, setgid) + CAT_SYSTEM = 13, // System-related operations (e.g. reboot) + Category_MAX = 14 +}; +const static event kindling_to_sysdig[PPM_EVENT_MAX] = { + {"syscall_enter-open", PPME_SYSCALL_OPEN_E}, + {"syscall_exit-open", PPME_SYSCALL_OPEN_X}, + {"syscall_enter-close", PPME_SYSCALL_CLOSE_E}, + {"syscall_exit-close", PPME_SYSCALL_CLOSE_X}, + {"syscall_enter-read", PPME_SYSCALL_READ_E}, + {"syscall_exit-read", PPME_SYSCALL_READ_X}, + {"syscall_enter-write", PPME_SYSCALL_WRITE_E}, + {"syscall_exit-write", PPME_SYSCALL_WRITE_X}, + {"syscall_enter-brk", PPME_SYSCALL_BRK_4_E}, + {"syscall_exit-brk", PPME_SYSCALL_BRK_4_X}, + {"syscall_enter-execve", PPME_SYSCALL_EXECVE_19_E}, + {"syscall_exit-execve", PPME_SYSCALL_EXECVE_19_X}, + {"syscall_enter-clone", PPME_SYSCALL_CLONE_20_E}, + {"syscall_exit-clone", PPME_SYSCALL_CLONE_20_X}, + {"syscall_enter-socket", PPME_SOCKET_SOCKET_E}, + {"syscall_exit-socket", PPME_SOCKET_SOCKET_X}, + {"syscall_enter-bind", PPME_SOCKET_BIND_E}, + {"syscall_exit-bind", PPME_SOCKET_BIND_X}, + {"syscall_enter-connect", PPME_SOCKET_CONNECT_E}, + {"syscall_exit-connect", PPME_SOCKET_CONNECT_X}, + {"syscall_enter-listen", PPME_SOCKET_LISTEN_E}, + {"syscall_exit-listen", PPME_SOCKET_LISTEN_X}, + {"syscall_enter-accept", PPME_SOCKET_ACCEPT_5_E}, + {"syscall_exit-accept", PPME_SOCKET_ACCEPT_5_X}, + {"syscall_enter-accept4", PPME_SOCKET_ACCEPT4_5_E}, + {"syscall_exit-accept4", PPME_SOCKET_ACCEPT4_5_X}, + {"syscall_enter-sendto", PPME_SOCKET_SENDTO_E}, + {"syscall_exit-sendto", PPME_SOCKET_SENDTO_X}, + {"syscall_enter-recvfrom", PPME_SOCKET_RECVFROM_E}, + {"syscall_exit-recvfrom", PPME_SOCKET_RECVFROM_X}, + {"syscall_enter-shutdown", PPME_SOCKET_SHUTDOWN_E}, + {"syscall_exit-shutdown", PPME_SOCKET_SHUTDOWN_X}, + {"syscall_enter-getsockname", PPME_SOCKET_GETSOCKNAME_E}, + {"syscall_exit-getsockname", PPME_SOCKET_GETSOCKNAME_X}, + {"syscall_enter-getpeername", PPME_SOCKET_GETPEERNAME_E}, + {"syscall_exit-getpeername", PPME_SOCKET_GETPEERNAME_X}, + {"syscall_enter-socketpair", PPME_SOCKET_SOCKETPAIR_E}, + {"syscall_exit-socketpair", PPME_SOCKET_SOCKETPAIR_X}, + {"syscall_enter-setsockopt", PPME_SOCKET_SETSOCKOPT_E}, + {"syscall_exit-setsockopt", PPME_SOCKET_SETSOCKOPT_X}, + {"syscall_enter-getsockopt", PPME_SOCKET_GETSOCKOPT_E}, + {"syscall_exit-getsockopt", PPME_SOCKET_GETSOCKOPT_X}, + {"syscall_enter-sendmsg", PPME_SOCKET_SENDMSG_E}, + {"syscall_exit-sendmsg", PPME_SOCKET_SENDMSG_X}, + {"syscall_enter-sendmmsg", PPME_SOCKET_SENDMMSG_E}, + {"syscall_exit-sendmmsg", PPME_SOCKET_SENDMMSG_X}, + {"syscall_enter-recvmsg", PPME_SOCKET_RECVMSG_E}, + {"syscall_exit-recvmsg", PPME_SOCKET_RECVMSG_X}, + {"syscall_enter-recvmmsg", PPME_SOCKET_RECVMMSG_E}, + {"syscall_exit-recvmmsg", PPME_SOCKET_RECVMMSG_X}, + {"syscall_enter-sendfile", PPME_SYSCALL_SENDFILE_E}, + {"syscall_exit-sendfile", PPME_SYSCALL_SENDFILE_X}, + {"syscall_enter-creat", PPME_SYSCALL_CREAT_E}, + {"syscall_exit-creat", PPME_SYSCALL_CREAT_X}, + {"syscall_enter-pipe", PPME_SYSCALL_PIPE_E}, + {"syscall_exit-pipe", PPME_SYSCALL_PIPE_X}, + {"syscall_enter-pipe2", PPME_SYSCALL_PIPE_E}, + {"syscall_exit-pipe2", PPME_SYSCALL_PIPE_X}, + {"syscall_enter-eventfd", PPME_SYSCALL_EVENTFD_E}, + {"syscall_exit-eventfd", PPME_SYSCALL_EVENTFD_X}, + {"syscall_enter-eventfd2", PPME_SYSCALL_EVENTFD_E}, + {"syscall_exit-eventfd2", PPME_SYSCALL_EVENTFD_X}, + {"syscall_enter-futex", PPME_SYSCALL_FUTEX_E}, + {"syscall_exit-futex", PPME_SYSCALL_FUTEX_X}, + {"syscall_enter-stat", PPME_SYSCALL_STAT_E}, + {"syscall_exit-stat", PPME_SYSCALL_STAT_X}, + {"syscall_enter-lstat", PPME_SYSCALL_LSTAT_E}, + {"syscall_exit-lstat", PPME_SYSCALL_LSTAT_X}, + {"syscall_enter-fstat", PPME_SYSCALL_FSTAT_E}, + {"syscall_exit-fstat", PPME_SYSCALL_FSTAT_X}, + {"syscall_enter-stat64", PPME_SYSCALL_STAT64_E}, + {"syscall_exit-stat64", PPME_SYSCALL_STAT64_X}, + {"syscall_enter-lstat64", PPME_SYSCALL_LSTAT64_E}, + {"syscall_exit-lstat64", PPME_SYSCALL_LSTAT64_X}, + {"syscall_enter-fstat64", PPME_SYSCALL_FSTAT64_E}, + {"syscall_exit-fstat64", PPME_SYSCALL_FSTAT64_X}, + {"syscall_enter-epoll_wait", PPME_SYSCALL_EPOLLWAIT_E}, + {"syscall_exit-epoll_wait", PPME_SYSCALL_EPOLLWAIT_X}, + {"syscall_enter-poll", PPME_SYSCALL_POLL_E}, + {"syscall_exit-poll", PPME_SYSCALL_POLL_X}, + {"syscall_enter-ppoll", PPME_SYSCALL_PPOLL_E}, + {"syscall_exit-ppoll", PPME_SYSCALL_PPOLL_X}, + {"syscall_enter-select", PPME_SYSCALL_SELECT_E}, + {"syscall_exit-select", PPME_SYSCALL_SELECT_X}, + {"syscall_enter-lseek", PPME_SYSCALL_LSEEK_E}, + {"syscall_exit-lseek", PPME_SYSCALL_LSEEK_X}, + {"syscall_enter-llseek", PPME_SYSCALL_LLSEEK_E}, + {"syscall_exit-llseek", PPME_SYSCALL_LLSEEK_X}, + {"syscall_enter-getcwd", PPME_SYSCALL_GETCWD_E}, + {"syscall_exit-getcwd", PPME_SYSCALL_GETCWD_X}, + {"syscall_enter-chdir", PPME_SYSCALL_CHDIR_E}, + {"syscall_exit-chdir", PPME_SYSCALL_CHDIR_X}, + {"syscall_enter-fchdir", PPME_SYSCALL_FCHDIR_E}, + {"syscall_exit-fchdir", PPME_SYSCALL_FCHDIR_X}, + {"syscall_enter-mkdir", PPME_SYSCALL_MKDIR_2_E}, + {"syscall_exit-mkdir", PPME_SYSCALL_MKDIR_2_X}, + {"syscall_enter-mkdirat", PPME_SYSCALL_MKDIRAT_E}, + {"syscall_exit-mkdirat", PPME_SYSCALL_MKDIRAT_X}, + {"syscall_enter-rmdir", PPME_SYSCALL_RMDIR_2_E}, + {"syscall_exit-rmdir", PPME_SYSCALL_RMDIR_2_X}, + {"syscall_enter-unlink", PPME_SYSCALL_UNLINK_2_E}, + {"syscall_exit-unlink", PPME_SYSCALL_UNLINK_2_X}, + {"syscall_enter-unlinkat", PPME_SYSCALL_UNLINKAT_2_E}, + {"syscall_exit-unlinkat", PPME_SYSCALL_UNLINKAT_2_X}, + {"syscall_enter-openat", PPME_SYSCALL_OPENAT_2_E}, + {"syscall_exit-openat", PPME_SYSCALL_OPENAT_2_X}, + {"syscall_enter-link", PPME_SYSCALL_LINK_2_E}, + {"syscall_exit-link", PPME_SYSCALL_LINK_2_X}, + {"syscall_enter-linkat", PPME_SYSCALL_LINKAT_2_E}, + {"syscall_exit-linkat", PPME_SYSCALL_LINKAT_2_X}, + {"syscall_enter-pread", PPME_SYSCALL_PREAD_E}, + {"syscall_exit-pread", PPME_SYSCALL_PREAD_X}, + {"syscall_enter-pwrite", PPME_SYSCALL_PWRITE_E}, + {"syscall_exit-pwrite", PPME_SYSCALL_PWRITE_X}, + {"syscall_enter-readv", PPME_SYSCALL_READV_E}, + {"syscall_exit-readv", PPME_SYSCALL_READV_X}, + {"syscall_enter-writev", PPME_SYSCALL_WRITEV_E}, + {"syscall_exit-writev", PPME_SYSCALL_WRITEV_X}, + {"syscall_enter-preadv", PPME_SYSCALL_PREADV_E}, + {"syscall_exit-preadv", PPME_SYSCALL_PREADV_X}, + {"syscall_enter-pwritev", PPME_SYSCALL_PWRITEV_E}, + {"syscall_exit-pwritev", PPME_SYSCALL_PWRITEV_X}, + {"syscall_enter-dup", PPME_SYSCALL_DUP_E}, + {"syscall_exit-dup", PPME_SYSCALL_DUP_X}, + {"syscall_enter-dup2", PPME_SYSCALL_DUP_E}, + {"syscall_exit-dup2", PPME_SYSCALL_DUP_X}, + {"syscall_enter-dup3", PPME_SYSCALL_DUP_E}, + {"syscall_exit-dup3", PPME_SYSCALL_DUP_X}, + {"syscall_enter-signalfd", PPME_SYSCALL_SIGNALFD_E}, + {"syscall_exit-signalfd", PPME_SYSCALL_SIGNALFD_X}, + {"syscall_enter-signalfd4", PPME_SYSCALL_SIGNALFD_E}, + {"syscall_exit-signalfd4", PPME_SYSCALL_SIGNALFD_X}, + {"syscall_enter-kill", PPME_SYSCALL_KILL_E}, + {"syscall_exit-kill", PPME_SYSCALL_KILL_X}, + {"syscall_enter-tkill", PPME_SYSCALL_TKILL_E}, + {"syscall_exit-tkill", PPME_SYSCALL_TKILL_X}, + {"syscall_enter-tgkill", PPME_SYSCALL_TGKILL_E}, + {"syscall_exit-tgkill", PPME_SYSCALL_TGKILL_X}, + {"syscall_enter-nanosleep", PPME_SYSCALL_NANOSLEEP_E}, + {"syscall_exit-nanosleep", PPME_SYSCALL_NANOSLEEP_X}, + {"syscall_enter-timerfd_create", PPME_SYSCALL_TIMERFD_CREATE_E}, + {"syscall_exit-timerfd_create", PPME_SYSCALL_TIMERFD_CREATE_X}, + {"syscall_enter-inotify_init", PPME_SYSCALL_INOTIFY_INIT_E}, + {"syscall_exit-inotify_init", PPME_SYSCALL_INOTIFY_INIT_X}, + {"syscall_enter-inotify_init1", PPME_SYSCALL_INOTIFY_INIT_E}, + {"syscall_exit-inotify_init1", PPME_SYSCALL_INOTIFY_INIT_X}, + {"syscall_enter-getrlimit", PPME_SYSCALL_GETRLIMIT_E}, + {"syscall_exit-getrlimit", PPME_SYSCALL_GETRLIMIT_X}, + {"syscall_enter-setrlimit", PPME_SYSCALL_SETRLIMIT_E}, + {"syscall_exit-setrlimit", PPME_SYSCALL_SETRLIMIT_X}, + {"syscall_enter-prlimit", PPME_SYSCALL_PRLIMIT_E}, + {"syscall_exit-prlimit", PPME_SYSCALL_PRLIMIT_X}, + {"syscall_enter-fcntl", PPME_SYSCALL_FCNTL_E}, + {"syscall_exit-fcntl", PPME_SYSCALL_FCNTL_X}, + {"syscall_enter-ioctl", PPME_SYSCALL_IOCTL_3_E}, + {"syscall_exit-ioctl", PPME_SYSCALL_IOCTL_3_X}, + {"syscall_enter-mmap", PPME_SYSCALL_MMAP_E}, + {"syscall_exit-mmap", PPME_SYSCALL_MMAP_X}, + {"syscall_enter-mmap2", PPME_SYSCALL_MMAP2_E}, + {"syscall_exit-mmap2", PPME_SYSCALL_MMAP2_X}, + {"syscall_enter-munmap", PPME_SYSCALL_MUNMAP_E}, + {"syscall_exit-munmap", PPME_SYSCALL_MUNMAP_X}, + {"syscall_enter-splice", PPME_SYSCALL_SPLICE_E}, + {"syscall_exit-splice", PPME_SYSCALL_SPLICE_X}, + {"syscall_enter-ptrace", PPME_SYSCALL_PTRACE_E}, + {"syscall_exit-ptrace", PPME_SYSCALL_PTRACE_X}, + {"syscall_enter-rename", PPME_SYSCALL_RENAME_E}, + {"syscall_exit-rename", PPME_SYSCALL_RENAME_X}, + {"syscall_enter-renameat", PPME_SYSCALL_RENAMEAT_E}, + {"syscall_exit-renameat", PPME_SYSCALL_RENAMEAT_X}, + {"syscall_enter-symlink", PPME_SYSCALL_SYMLINK_E}, + {"syscall_exit-symlink", PPME_SYSCALL_SYMLINK_X}, + {"syscall_enter-symlinkat", PPME_SYSCALL_SYMLINKAT_E}, + {"syscall_exit-symlinkat", PPME_SYSCALL_SYMLINKAT_X}, + {"syscall_enter-fork", PPME_SYSCALL_FORK_20_E}, + {"syscall_exit-fork", PPME_SYSCALL_FORK_20_X}, + {"syscall_enter-vfork", PPME_SYSCALL_VFORK_20_E}, + {"syscall_exit-vfork", PPME_SYSCALL_VFORK_20_X}, + {"syscall_enter-quotactl", PPME_SYSCALL_QUOTACTL_E}, + {"syscall_exit-quotactl", PPME_SYSCALL_QUOTACTL_X}, + {"syscall_enter-setresuid", PPME_SYSCALL_SETRESUID_E}, + {"syscall_exit-setresuid", PPME_SYSCALL_SETRESUID_X}, + {"syscall_enter-setresgid", PPME_SYSCALL_SETRESGID_E}, + {"syscall_exit-setresgid", PPME_SYSCALL_SETRESGID_X}, + {"syscall_enter-setuid", PPME_SYSCALL_SETUID_E}, + {"syscall_exit-setuid", PPME_SYSCALL_SETUID_X}, + {"syscall_enter-setgid", PPME_SYSCALL_SETGID_E}, + {"syscall_exit-setgid", PPME_SYSCALL_SETGID_X}, + {"syscall_enter-getuid", PPME_SYSCALL_GETUID_E}, + {"syscall_exit-getuid", PPME_SYSCALL_GETUID_X}, + {"syscall_enter-geteuid", PPME_SYSCALL_GETEUID_E}, + {"syscall_exit-geteuid", PPME_SYSCALL_GETEUID_X}, + {"syscall_enter-getgid", PPME_SYSCALL_GETGID_E}, + {"syscall_exit-getgid", PPME_SYSCALL_GETGID_X}, + {"syscall_enter-getegid", PPME_SYSCALL_GETEGID_E}, + {"syscall_exit-getegid", PPME_SYSCALL_GETEGID_X}, + {"syscall_enter-getresuid", PPME_SYSCALL_GETRESUID_E}, + {"syscall_exit-getresuid", PPME_SYSCALL_GETRESUID_X}, + {"syscall_enter-getresgid", PPME_SYSCALL_GETRESGID_E}, + {"syscall_exit-getresgid", PPME_SYSCALL_GETRESGID_X}, + {"syscall_enter-getdents", PPME_SYSCALL_GETDENTS_E}, + {"syscall_exit-getdents", PPME_SYSCALL_GETDENTS_X}, + {"syscall_enter-getdents64", PPME_SYSCALL_GETDENTS64_E}, + {"syscall_exit-getdents64", PPME_SYSCALL_GETDENTS64_X}, + {"syscall_enter-setns", PPME_SYSCALL_SETNS_E}, + {"syscall_exit-setns", PPME_SYSCALL_SETNS_X}, + {"syscall_enter-flock", PPME_SYSCALL_FLOCK_E}, + {"syscall_exit-flock", PPME_SYSCALL_FLOCK_X}, + {"syscall_enter-semop", PPME_SYSCALL_SEMOP_E}, + {"syscall_exit-semop", PPME_SYSCALL_SEMOP_X}, + {"syscall_enter-semctl", PPME_SYSCALL_SEMCTL_E}, + {"syscall_exit-semctl", PPME_SYSCALL_SEMCTL_X}, + {"syscall_enter-mount", PPME_SYSCALL_MOUNT_E}, + {"syscall_exit-mount", PPME_SYSCALL_MOUNT_X}, + {"syscall_enter-umount", PPME_SYSCALL_UMOUNT_E}, + {"syscall_exit-umount", PPME_SYSCALL_UMOUNT_X}, + {"syscall_enter-semget", PPME_SYSCALL_SEMGET_E}, + {"syscall_exit-semget", PPME_SYSCALL_SEMGET_X}, + {"syscall_enter-access", PPME_SYSCALL_ACCESS_E}, + {"syscall_exit-access", PPME_SYSCALL_ACCESS_X}, + {"syscall_enter-chroot", PPME_SYSCALL_CHROOT_E}, + {"syscall_exit-chroot", PPME_SYSCALL_CHROOT_X}, + {"syscall_enter-setsid", PPME_SYSCALL_SETSID_E}, + {"syscall_exit-setsid", PPME_SYSCALL_SETSID_X}, + {"syscall_enter-setpgid", PPME_SYSCALL_SETPGID_E}, + {"syscall_exit-setpgid", PPME_SYSCALL_SETPGID_X}, + {"syscall_enter-unshare", PPME_SYSCALL_UNSHARE_E}, + {"syscall_exit-unshare", PPME_SYSCALL_UNSHARE_X}, + {"syscall_enter-bpf", PPME_SYSCALL_BPF_E}, + {"syscall_exit-bpf", PPME_SYSCALL_BPF_X}, + {"syscall_enter-seccomp", PPME_SYSCALL_SECCOMP_E}, + {"syscall_exit-seccomp", PPME_SYSCALL_SECCOMP_X}, + {"syscall_enter-fchmodat", PPME_SYSCALL_FCHMODAT_E}, + {"syscall_exit-fchmodat", PPME_SYSCALL_FCHMODAT_X}, + {"syscall_enter-chmod", PPME_SYSCALL_CHMOD_E}, + {"syscall_exit-chmod", PPME_SYSCALL_CHMOD_X}, + {"syscall_enter-fchmod", PPME_SYSCALL_FCHMOD_E}, + {"syscall_exit-fchmod", PPME_SYSCALL_FCHMOD_X}, + {"tracepoint-sched_switch", PPME_SCHEDSWITCH_6_E}, + {"tracepoint-signaldeliver", PPME_SIGNALDELIVER_E}, + {"tracepoint-signaldeliver", PPME_SIGNALDELIVER_X}, + {"syscall_enter-alarm", PPME_GENERIC_E}, + {"syscall_exit-alarm", PPME_GENERIC_X}, + {"syscall_enter-epoll_create", PPME_GENERIC_E}, + {"syscall_exit-epoll_create", PPME_GENERIC_X}, + {"syscall_enter-epoll_ctl", PPME_GENERIC_E}, + {"syscall_exit-epoll_ctl", PPME_GENERIC_X}, + {"syscall_enter-lchown", PPME_GENERIC_E}, + {"syscall_exit-lchown", PPME_GENERIC_X}, + {"syscall_enter-old_select", PPME_GENERIC_E}, + {"syscall_exit-old_select", PPME_GENERIC_X}, + {"syscall_enter-pause", PPME_GENERIC_E}, + {"syscall_exit-pause", PPME_GENERIC_X}, + {"syscall_enter-process_vm_readv", PPME_GENERIC_E}, + {"syscall_exit-process_vm_readv", PPME_GENERIC_X}, + {"syscall_enter-process_vm_writev", PPME_GENERIC_E}, + {"syscall_exit-process_vm_writev", PPME_GENERIC_X}, + {"syscall_enter-pselect6", PPME_GENERIC_E}, + {"syscall_exit-pselect6", PPME_GENERIC_X}, + {"syscall_enter-sched_getparam", PPME_GENERIC_E}, + {"syscall_exit-sched_getparam", PPME_GENERIC_X}, + {"syscall_enter-sched_setparam", PPME_GENERIC_E}, + {"syscall_exit-sched_setparam", PPME_GENERIC_X}, + {"syscall_enter-syslog", PPME_GENERIC_E}, + {"syscall_exit-syslog", PPME_GENERIC_X}, + {"syscall_enter-uselib", PPME_GENERIC_E}, + {"syscall_exit-uselib", PPME_GENERIC_X}, + {"syscall_enter-utime", PPME_GENERIC_E}, + {"syscall_exit-utime", PPME_GENERIC_X}, + {"tracepoint-ingress", PPME_NETIF_RECEIVE_SKB_E}, + {"tracepoint-egress", PPME_NET_DEV_XMIT_E}, + {"kprobe-tcp_close", PPME_TCP_CLOSE_E}, + {"kprobe-tcp_rcv_established", PPME_TCP_RCV_ESTABLISHED_E}, + {"kprobe-tcp_drop", PPME_TCP_DROP_E}, + {"kprobe-tcp_retransmit_skb", PPME_TCP_RETRANCESMIT_SKB_E}, + {"kretprobe-tcp_connect", PPME_TCP_CONNECT_X}, + {"kprobe-tcp_set_state", PPME_TCP_SET_STATE_E}, + {"tracepoint-tcp_send_reset", PPME_TCP_SEND_RESET_E}, + {"tracepoint-tcp_receive_reset", PPME_TCP_RECEIVE_RESET_E}, +}; + +struct event_category { + string cateogry_name; + Category category_value; +}; + +const static event_category category_map[Category_MAX+1] = { + {"other", CAT_OTHER}, + {"file", CAT_FILE}, + {"net", CAT_NET}, + {"ipc", CAT_IPC}, + {"wait", CAT_WAIT}, + {"signal", CAT_SIGNAL}, + {"sleep", CAT_SLEEP}, + {"time", CAT_TIME}, + {"process", CAT_PROCESS}, + {"scheduler", CAT_SCHEDULER}, + {"memory", CAT_MEMORY}, + {"user", CAT_USER}, + {"system", CAT_SYSTEM}, +}; + +enum L4Proto { + UNKNOWN = 0, + TCP = 1, + UDP = 2, + ICMP = 3, + RAW = 4 +}; + +enum ValueType { + NONE = 0, + INT8 = 1, // 1 byte + INT16 = 2, // 2 bytes + INT32 = 3, // 4 bytes + INT64 = 4, // 8 bytes + UINT8 = 5, // 1 byte + UINT16 = 6, // 2 bytes + UINT32 = 7, // 4 bytes + UINT64 = 8, // 8 bytes + CHARBUF = 9, // bytes, NULL terminated + BYTEBUF = 10, // bytes + FLOAT = 11, // 4 bytes + DOUBLE = 12, // 8 bytes + BOOL = 13 // 4 bytes +}; + +#endif //SYSDIG_KINDLING_H diff --git a/probe/src/probe/BUILD.bazel b/probe/src/probe/BUILD.bazel deleted file mode 100644 index ef063f520..000000000 --- a/probe/src/probe/BUILD.bazel +++ /dev/null @@ -1,97 +0,0 @@ -load("@px//bazel:pl_build_system.bzl", "pl_cc_binary") -load("@px//bazel:proto_compile.bzl", "pl_cc_proto_library", "pl_go_proto_library", "pl_proto_library") - -package(default_visibility = ["//src:__subpackages__"]) - -pl_proto_library( - name = "hcmine_pl_proto", - srcs = ["hcmine.proto"], - visibility = ["//src:__subpackages__"], -) - -pl_cc_proto_library( - name = "hcmine_pl_cc_proto", - proto = ":hcmine_pl_proto", - visibility = ["//src:__subpackages__"], -) - -pl_cc_binary( - name = "kindling_probe", - srcs = glob( - ["*.cpp","*.cc","*.h"], - exclude = [ - "**/*_test.cc", - "*_main.cc", - ], - ), - copts = ["-Ibazel-out/k8-fastbuild/bin/third_party/agent-libs_build/include/userspace/libscap", "-Ibazel-out/k8-fastbuild/bin/third_party/agent-libs_build/include/userspace/libsinsp/third-party/jsoncpp", "-Ibazel-out/k8-fastbuild/bin/third_party/agent-libs_build/include/userspace/libsinsp", "-Wno-unused-parameter","-Wno-unused-variable","-Wno-mismatched-tags"], - deps = [ - "//src/probe/converter:cc_library", - "//src/probe/publisher:cc_library", - "//src/probe/utils:cc_library", - "@com_github_jupp0r_prometheus_cpp//pull", - "@px//src/common/metrics:cc_library", - "@px//src/common/signal:cc_library", - "@px//:px_headers", - "@px//src/stirling:cc_library", - "@px//src/stirling/utils:cc_library", - #"@px//src/stirling:cc_library", - "//third_party:agent-libs_build", - "//third_party:zmq_build", - ], -) - -load("@io_bazel_rules_docker//container:container.bzl", "container_image") -container_image( - name = "kindling_probe_image", - base = "@px//:pl_cc_bpf_image", - directory = "/pl", - files = [ - "@kindling_falcolib_probe_tar_gz//file:file", - "//docker:scripts", - ":kindling_probe", - ], - cmd = ["/pl/docker-entrypoint.sh"], - visibility = ["//visibility:public"], -) - -container_image( - name = "kindling_probe_image_localdriver", - base = "@px//:pl_cc_bpf_image", - directory = "/pl", - files = [ - "//docker:scripts", - "//docker:localdriver", - ":kindling_probe", - ], - cmd = ["/pl/docker-entrypoint.sh"], - visibility = ["//visibility:public"], -) - -load("@io_bazel_rules_docker//cc:image.bzl", "cc_image") -cc_image( - name = "kindling_probe_image_old", - base = "@px//:pl_cc_bpf_image", - binary = ":kindling_probe", -) - -load("@io_bazel_rules_docker//container:container.bzl", "container_push") -container_push( - name = "push_image", - format = "Docker", - image = ":kindling_probe_image", - # ATTENTION!! Modify this if you want to change docker registry. - registry = "docker.io", - repository = "kindlingproject/kindling-probe", - tag = "latest", -) - -container_push( - name = "push_image_localdriver", - format = "Docker", - image = ":kindling_probe_image_localdriver", - # ATTENTION!! Modify this if you want to change docker registry. - registry = "docker.io", - repository = "kindlingproject/kindling-probe", - tag = "latest", -) diff --git a/probe/src/probe/catch_sig.cpp b/probe/src/probe/catch_sig.cpp deleted file mode 100644 index 131af5c11..000000000 --- a/probe/src/probe/catch_sig.cpp +++ /dev/null @@ -1,78 +0,0 @@ -// -// Created by root on 2021/7/19. -// - -#include "src/probe/catch_sig.h" - -#include -#include -#include -#include -#include -#include -#include - - -static size_t get_executable_path( char* processdir,char* processname, size_t len) -{ - char* path_end; - if(readlink("/host/proc/self/exe", processdir,len) <=0) - return -1; - printf("process dir: %s\n",processdir); - fflush(stdout); - path_end = strrchr(processdir, '/'); - printf("process end: %s\n",path_end); - fflush(stdout); - if(path_end == NULL) - return -1; - ++path_end; - strcpy(processname, path_end); - printf("path end: %s, processname: %s\n", path_end, processname); - fflush(stdout); - *path_end = '\0'; - return (size_t)(path_end - processdir); -} - -static void print_core(int signum, siginfo_t *info, void *secret, struct sigaction *oldact) { - printf("crash signum:%d si_code:%d\n", signum, info->si_code); - fflush(stdout); - char cmd[50]; - sprintf(cmd, "gcore %u", getpid()); - system(cmd); - char path[PATH_MAX]; - char processname[1024]; - printf("get pid file.\n"); - fflush(stdout); - get_executable_path(path, processname, sizeof(path)); - // TODO!!!! - sprintf(cmd, "./pl/gdb_print.sh ./pl/%s ./core.%u", processname, getpid()); - system(cmd); - oldact->sa_sigaction(signum, info, secret); -} - -static struct sigaction oldabrtact; -static void abrtsigaction(int signum, siginfo_t *info, void *secret) { - print_core(signum, info, secret, &oldabrtact); -} - -static struct sigaction oldsegvact; -static void segvsigaction(int signum, siginfo_t *info, void *secret) { - print_core(signum, info, secret, &oldsegvact); -} - -static struct sigaction oldstopact; -static void stopsigaction(int signum, siginfo_t *info, void *secret) { - print_core(signum, info, secret, &oldstopact); -} - -void sigsetup(void) { - struct sigaction act; - memset(&act, 0, sizeof act); - act.sa_flags = SA_ONSTACK | SA_SIGINFO ; - act.sa_sigaction = segvsigaction; - sigaction(SIGSEGV, &act, &oldsegvact); - act.sa_sigaction = abrtsigaction; - sigaction(SIGABRT, &act, &oldabrtact); - act.sa_sigaction = stopsigaction; - sigaction(SIGSTOP, &act, &oldstopact); -} diff --git a/probe/src/probe/catch_sig.h b/probe/src/probe/catch_sig.h deleted file mode 100644 index dc97ee802..000000000 --- a/probe/src/probe/catch_sig.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef KINDLING_PROBE_CATCH_SIG_H -#define KINDLING_PROBE_CATCH_SIG_H - - -void sigsetup(void); - - -#endif //KINDLING_PROBE_CATCH_SIG_H diff --git a/probe/src/probe/converter/BUILD.bazel b/probe/src/probe/converter/BUILD.bazel deleted file mode 100644 index 69fc2fce8..000000000 --- a/probe/src/probe/converter/BUILD.bazel +++ /dev/null @@ -1,38 +0,0 @@ -load("@px//bazel:proto_compile.bzl", "pl_cc_proto_library", "pl_go_proto_library", "pl_proto_library") -load("@px//bazel:pl_build_system.bzl", "pl_cc_library") - -package(default_visibility = ["//src:__subpackages__"]) - -pl_proto_library( - name = "kindling_pl_proto", - srcs = ["kindling_event.proto"], - visibility = ["//src:__subpackages__"], -) - -pl_cc_proto_library( - name = "kindling_event_pl_cc_proto", - proto = ":kindling_pl_proto", - visibility = ["//src:__subpackages__"], -) - -pl_cc_library( - name = "cc_library", - srcs = glob( - [ - "*.h", - "*.cc", - "*.cpp", - ], - exclude = [ - "**/*_test.cc", - "**/*_benchmark.cc", - ], - ), - copts = ["-Ibazel-out/k8-fastbuild/bin/third_party/agent-libs_build/include/userspace/libscap", "-Ibazel-out/k8-fastbuild/bin/third_party/agent-libs_build/include/userspace/libsinsp/third-party/jsoncpp", "-Ibazel-out/k8-fastbuild/bin/third_party/agent-libs_build/include/userspace/libsinsp", "-Wno-unused-parameter", "-Wno-unused-variable", "-Wno-sign-compare","-Wno-unused-private-field","-Wno-mismatched-tags"], - hdrs = glob(["*.h"]), - deps = [ - ":kindling_event_pl_cc_proto", - "//third_party:agent-libs_build", - "@px//:px_headers", - ], -) diff --git a/probe/src/probe/converter/converter.cpp b/probe/src/probe/converter/converter.cpp deleted file mode 100644 index b413c7b10..000000000 --- a/probe/src/probe/converter/converter.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include "converter.h" -#include - -converter::converter() { - m_kindlingEventList = new kindling::KindlingEventList(); -} - -converter::converter(uint64_t batch_size, uint64_t max_size) : batch_size(batch_size), max_size(max_size) { - m_kindlingEventList = new kindling::KindlingEventList(); -} - -converter::~converter() { - delete m_kindlingEventList; -} - -void converter::convert(void *evt) {} - -bool converter::judge_max_size() { - return m_kindlingEventList->kindling_event_list_size() >= max_size; -} - -kindling::KindlingEventList *converter::get_kindlingEventList() { - return m_kindlingEventList; -} - -kindling::KindlingEventList * converter::swap_list(kindling::KindlingEventList *list) { - std::swap(m_kindlingEventList, list); - return list; -} - -bool converter::judge_batch_size() { - return m_kindlingEventList->kindling_event_list_size() >= batch_size; -} - -uint64_t converter::current_list_size() { - return m_kindlingEventList->kindling_event_list_size(); -} diff --git a/probe/src/probe/converter/converter.h b/probe/src/probe/converter/converter.h deleted file mode 100644 index 75155fc07..000000000 --- a/probe/src/probe/converter/converter.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef KINDLING_PROBE_CONVERTER_H -#define KINDLING_PROBE_CONVERTER_H -#include -#include "src/probe/converter/kindling_event.pb.h" -#include - -class converter { -public: - converter(); - converter(uint64_t batch_size, uint64_t max_size); - virtual ~converter(); - // source evt -> kindling evt - virtual void convert(void * evt); - bool judge_batch_size(); - bool judge_max_size(); - uint64_t current_list_size(); - kindling::KindlingEventList* swap_list(kindling::KindlingEventList *); - kindling::KindlingEventList* get_kindlingEventList(); -private: - kindling::KindlingEventList *m_kindlingEventList; - uint64_t batch_size; - uint64_t max_size; -}; -#endif //KINDLING_PROBE_CONVERTER_H diff --git a/probe/src/probe/converter/kindling_event.proto b/probe/src/probe/converter/kindling_event.proto deleted file mode 100644 index 351a6e420..000000000 --- a/probe/src/probe/converter/kindling_event.proto +++ /dev/null @@ -1,159 +0,0 @@ -syntax = "proto3"; - -package kindling; -option go_package = "events/kindling"; -message KindlingEventList { - repeated KindlingEvent kindling_event_list = 1; -} -message KindlingEvent { - Source source = 1; - // Timestamp in nanoseconds at which the event were collected. - uint64 timestamp = 2; - // Name of Kindling Event - string name = 3; - // Category of Kindling Event, enum - Category category = 4; - // Native attributes of hook point, including arguments or return value. - Property Native_attributes = 5; - // User-defined Attributions of Kindling Event, now including latency for syscall. - repeated KeyValue user_attributes = 6; - // Context includes Thread information and Fd information. - Context ctx = 7; -} - -enum Source { - SOURCE_UNKNOWN = 0; - SYSCALL_ENTER = 1; - SYSCALL_EXIT = 2; - TRACEPOINT = 3; - KRPOBE = 4; - KRETPROBE = 5; - UPROBE = 6; - URETPROBE = 7; -} -enum Category { - CAT_NONE = 0; - CAT_OTHER = 1; // No specific category - CAT_FILE = 2; // File operations or File I/O - CAT_NET = 3; // Network operations or network I/O - CAT_IPC = 4; // IPC operations or IPC I/O - CAT_WAIT = 5; // - CAT_SIGNAL = 6; // Signal-related operations (signal) - CAT_SLEEP = 7; // nanosleep - CAT_TIME = 8; // Time-related event (e.g. gettimeofday) - CAT_PROCESS = 9; // Process-related event (e.g. fork, clone, - CAT_SCHEDULER = 10; // Scheduler event (context switch) - CAT_MEMORY = 11; // Memory-related operations (e.g. brk, mmap, unmap) - CAT_USER = 12; // User-related operations (e.g. getuid, setgid) - CAT_SYSTEM = 13; // System-related operations (e.g. reboot) -} - -message Property { - // If type of syscall_enter, kprobe, uprobe, tracepoint - repeated KeyValue args = 1; - // If type of syscall_exit, kretprobe, uretprobe - repeated KeyValue ret = 2; -} - -message KeyValue { - // Arguments' Name or Attributions' Name. - string key = 1; - // Type of Value. - ValueType value_type = 2; - // Value of Key in bytes, should be converted according to ValueType. - bytes value = 3; -} -enum ValueType { - NONE = 0; - INT8 = 1; // 1 byte - INT16 = 2; // 2 bytes - INT32 = 3; // 4 bytes - INT64 = 4; // 8 bytes - UINT8 = 5; // 1 byte - UINT16 = 6; // 2 bytes - UINT32 = 7; // 4 bytes - UINT64 = 8; // 8 bytes - CHARBUF = 9; // bytes, NULL terminated - BYTEBUF = 10; // bytes - FLOAT = 11; // 4 bytes - DOUBLE = 12; // 8 bytes - BOOL = 13; // 4 bytes -} -message Context { - // Thread information corresponding to Kindling Event, optional. - Thread thread_info = 1; - // Fd information corresponding to Kindling Event, optional. - Fd fd_info = 2; -} - -message Thread { - // Process id of thread. - uint32 pid = 1; - // Thread/task id of thread. - uint32 tid = 2; - // User id of thread - uint32 uid = 3; - // Group id of thread - uint32 gid = 4; - // Command of thread. - string comm = 5; - // ContainerId of thread - string container_id = 6; - // ContainerName of thread - string container_name = 7; -} - -message Fd { - // FD number. - int32 num = 1; - // Type of FD in enum. - FDType type_fd = 2; - - // if FD is type of file - string filename = 3; - string directory = 4; - - // if FD is type of ipv4 or ipv6 - L4Proto protocol = 5; - // repeated for ipv6, client_ip[0] for ipv4 - bool role = 6; - repeated uint32 sip = 7; - repeated uint32 dip = 8; - uint32 sport = 9; - uint32 dport = 10; - - // if FD is type of unix_sock - // Source socket endpoint - uint64 source = 11; - // Destination socket endpoint - uint64 destination = 12; -} - -// File Descriptor type -enum FDType { - FD_UNKNOWN = 0; - FD_FILE = 1; - FD_DIRECTORY = 2; - FD_IPV4_SOCK = 3; - FD_IPV6_SOCK = 4; - FD_IPV4_SERVSOCK = 5; - FD_IPV6_SERVSOCK = 6; - FD_FIFO = 7; - FD_UNIX_SOCK = 8; - FD_EVENT = 9; - FD_UNSUPPORTED = 10; // TODO - FD_SIGNALFD = 11; - FD_EVENTPOLL = 12; - FD_INOTIFY = 13; - FD_TIMERFD = 14; - FD_NETLINK = 15; - FD_FILE_V2 = 16; -} - -enum L4Proto { - UNKNOWN = 0; - TCP = 1; - UDP = 2; - ICMP = 3; - RAW = 4; -} \ No newline at end of file diff --git a/probe/src/probe/converter/sysdig_converter.cpp b/probe/src/probe/converter/sysdig_converter.cpp deleted file mode 100644 index df67e4255..000000000 --- a/probe/src/probe/converter/sysdig_converter.cpp +++ /dev/null @@ -1,378 +0,0 @@ -#include "src/probe/converter/sysdig_converter.h" -#include -#include - -using namespace std; -using namespace kindling; - - -sysdig_converter::sysdig_converter(sinsp *inspector) : converter(100, INT_MAX), m_inspector(inspector) {} - -sysdig_converter::sysdig_converter(sinsp *inspector, int batch_size, int max_size) : converter(batch_size, max_size), m_inspector(inspector) {} - -sysdig_converter::~sysdig_converter() {} - -void sysdig_converter::convert(void *evt) { - auto kevt = get_kindlingEventList()->add_kindling_event_list(); - sinsp_evt *sevt = (sinsp_evt *) evt; - - init_kindling_event(kevt, sevt); - add_native_attributes(kevt, sevt); - add_user_attributes(kevt, sevt); - add_fdinfo(kevt, sevt); - add_threadinfo(kevt, sevt); -} - -// set source, name, timestamp, category according to list -int sysdig_converter::init_kindling_event(kindling::KindlingEvent *kevt, sinsp_evt *sevt) { - kevt->set_source(get_kindling_source(sevt->get_type())); - kevt->set_name(get_kindling_name(sevt)); - kevt->set_category(get_kindling_category(sevt)); - kevt->set_timestamp(sevt->get_ts()); - return 0; -} - -int sysdig_converter::add_native_attributes(kindling::KindlingEvent *kevt, sinsp_evt *sevt) { - // TODO - return 0; -} - - -int sysdig_converter::add_user_attributes(kindling::KindlingEvent *kevt, sinsp_evt *sevt) { - auto s_tinfo = sevt->get_thread_info(); - if (!s_tinfo) { - return -1; - } - - if (kevt->source() == SYSCALL_EXIT) { - // set latency - auto latency_attr = kevt->add_user_attributes(); - auto latency = s_tinfo->m_latency; - latency_attr->set_key("latency"); - latency_attr->set_value_type(UINT64); - latency_attr->set_value(&latency, 8); - } - // set params - switch (sevt->get_type()) { - case PPME_TCP_RCV_ESTABLISHED_E: - case PPME_TCP_CLOSE_E: { - auto pTuple = sevt->get_param_value_raw("tuple"); - setTuple(kevt, pTuple); - - auto pRtt = sevt->get_param_value_raw("srtt"); - if (pRtt != NULL) { - auto attr = kevt->add_user_attributes(); - attr->set_key("rtt"); - attr->set_value(pRtt->m_val, pRtt->m_len); - attr->set_value_type(UINT32); - } - break; - } - case PPME_TCP_CONNECT_X: { - auto pTuple = sevt->get_param_value_raw("tuple"); - setTuple(kevt, pTuple); - auto pRetVal = sevt->get_param_value_raw("retval"); - if (pRetVal != NULL) { - auto attr = kevt->add_user_attributes(); - attr->set_key("retval"); - attr->set_value(pRetVal->m_val, pRetVal->m_len); - attr->set_value_type(UINT64); - } - break; - } - case PPME_TCP_DROP_E: - case PPME_TCP_RETRANCESMIT_SKB_E: - case PPME_TCP_SET_STATE_E: { - auto pTuple = sevt->get_param_value_raw("tuple"); - setTuple(kevt, pTuple); - auto old_state = sevt->get_param_value_raw("old_state"); - if (old_state != NULL) { - auto attr = kevt->add_user_attributes(); - attr->set_key("old_state"); - attr->set_value(old_state->m_val, old_state->m_len); - attr->set_value_type(INT32); - } - auto new_state = sevt->get_param_value_raw("new_state"); - if (new_state != NULL) { - auto attr = kevt->add_user_attributes(); - attr->set_key("new_state"); - attr->set_value(new_state->m_val, new_state->m_len); - attr->set_value_type(INT32); - } - break; - } - case PPME_TCP_SEND_RESET_E: - case PPME_TCP_RECEIVE_RESET_E: { - auto pTuple = sevt->get_param_value_raw("tuple"); - setTuple(kevt, pTuple); - break; - } - default: - for (auto i = 0; i < sevt->get_num_params(); i++) { - auto attr = kevt->add_user_attributes(); - attr->set_key(sevt->get_param_name(i)); - attr->set_value(sevt->get_param(i)->m_val, sevt->get_param(i)->m_len); - attr->set_value_type(get_type(sevt->get_param_info(i)->type)); - } - } - return 0; -} - -int sysdig_converter::add_fdinfo(kindling::KindlingEvent *kevt, sinsp_evt *sevt) { - auto s_fdinfo = sevt->get_fd_info(); - if (!s_fdinfo) { - return -1; - } - auto k_fdinfo = kevt->mutable_ctx()->mutable_fd_info(); - k_fdinfo->set_num(sevt->get_fd_num()); - // set type one-one relation - k_fdinfo->set_type_fd(FDType(s_fdinfo->m_type)); - switch (s_fdinfo->m_type) { - case SCAP_FD_FILE: - case SCAP_FD_FILE_V2: { - string name = s_fdinfo->m_name; - size_t pos = name.rfind('/'); - if (pos != string::npos) { - if (pos < name.size() - 1) { - k_fdinfo->set_filename(name.substr(pos + 1, string::npos)); - if (pos != 0) { - name.resize(pos); - k_fdinfo->set_directory(name); - } else { - k_fdinfo->set_directory("/"); - } - } - } - break; - } - case SCAP_FD_IPV4_SOCK: - case SCAP_FD_IPV4_SERVSOCK: - k_fdinfo->set_protocol(get_protocol(s_fdinfo->get_l4proto())); - k_fdinfo->set_role(s_fdinfo->is_role_server()); - k_fdinfo->add_sip(s_fdinfo->m_sockinfo.m_ipv4info.m_fields.m_sip); - k_fdinfo->add_dip(s_fdinfo->m_sockinfo.m_ipv4info.m_fields.m_dip); - k_fdinfo->set_sport(s_fdinfo->m_sockinfo.m_ipv4info.m_fields.m_sport); - k_fdinfo->set_dport(s_fdinfo->m_sockinfo.m_ipv4info.m_fields.m_dport); - break; - case SCAP_FD_UNIX_SOCK: - k_fdinfo->set_source(s_fdinfo->m_sockinfo.m_unixinfo.m_fields.m_source); - k_fdinfo->set_destination(s_fdinfo->m_sockinfo.m_unixinfo.m_fields.m_dest); - break; - default: - break; - } - return 0; -} - -int sysdig_converter::add_threadinfo(kindling::KindlingEvent *kevt, sinsp_evt *sevt) { - auto s_tinfo = sevt->get_thread_info(); - if (!s_tinfo) { - return -1; - } - auto k_tinfo = kevt->mutable_ctx()->mutable_thread_info(); - k_tinfo->set_pid(s_tinfo->m_pid); - k_tinfo->set_tid(s_tinfo->m_tid); - k_tinfo->set_uid(s_tinfo->m_uid); - k_tinfo->set_gid(s_tinfo->m_gid); - k_tinfo->set_comm(s_tinfo->m_comm); - k_tinfo->set_container_id(s_tinfo->m_container_id); - return 0; -} - -Source sysdig_converter::get_kindling_source(uint16_t etype) { - if (PPME_IS_ENTER(etype)) { - switch (etype) { - case PPME_PROCEXIT_E: - case PPME_SCHEDSWITCH_6_E: - case PPME_SYSDIGEVENT_E: - case PPME_CONTAINER_E: - case PPME_PROCINFO_E: - case PPME_SCHEDSWITCH_1_E: - case PPME_DROP_E: - case PPME_PROCEXIT_1_E: - case PPME_CPU_HOTPLUG_E: - case PPME_K8S_E: - case PPME_TRACER_E: - case PPME_MESOS_E: - case PPME_CONTAINER_JSON_E: - case PPME_NOTIFICATION_E: - case PPME_INFRASTRUCTURE_EVENT_E: - case PPME_PAGE_FAULT_E: - return SOURCE_UNKNOWN; - case PPME_TCP_RCV_ESTABLISHED_E: - case PPME_TCP_CLOSE_E: - case PPME_TCP_DROP_E: - case PPME_TCP_RETRANCESMIT_SKB_E: - case PPME_TCP_SET_STATE_E: - return KRPOBE; - case PPME_TCP_SEND_RESET_E: - case PPME_TCP_RECEIVE_RESET_E: - return TRACEPOINT; - default: - return SYSCALL_ENTER; - } - } else { - switch (etype) { - case PPME_CONTAINER_X: - case PPME_PROCINFO_X: - case PPME_SCHEDSWITCH_1_X: - case PPME_DROP_X: - case PPME_CPU_HOTPLUG_X: - case PPME_K8S_X: - case PPME_TRACER_X: - case PPME_MESOS_X: - case PPME_CONTAINER_JSON_X: - case PPME_NOTIFICATION_X: - case PPME_INFRASTRUCTURE_EVENT_X: - case PPME_PAGE_FAULT_X: - return SOURCE_UNKNOWN; - case PPME_TCP_CONNECT_X: - return KRETPROBE; - default: - return SYSCALL_EXIT; - } - } -} - -Category sysdig_converter::get_kindling_category(sinsp_evt *sEvt) { - sinsp_evt::category cat; - sEvt->get_category(&cat); - switch (cat.m_category) { - case EC_OTHER: - return CAT_OTHER; - case EC_FILE: - return CAT_FILE; - case EC_NET: - return CAT_NET; - case EC_IPC: - return CAT_IPC; - case EC_MEMORY: - return CAT_MEMORY; - case EC_PROCESS: - return CAT_PROCESS; - case EC_SLEEP: - return CAT_SLEEP; - case EC_SYSTEM: - return CAT_SYSTEM; - case EC_SIGNAL: - return CAT_SIGNAL; - case EC_USER: - return CAT_USER; - case EC_TIME: - return CAT_TIME; - case EC_IO_READ: - case EC_IO_WRITE: - case EC_IO_OTHER: { - switch (cat.m_subcategory) { - case sinsp_evt::SC_FILE: - return CAT_FILE; - case sinsp_evt::SC_NET: - return CAT_NET; - case sinsp_evt::SC_IPC: - return CAT_IPC; - default: - return CAT_OTHER; - } - } - default: - return CAT_OTHER; - } -} - -L4Proto sysdig_converter::get_protocol(scap_l4_proto proto) { - switch (proto) { - case SCAP_L4_TCP: - return TCP; - case SCAP_L4_UDP: - return UDP; - case SCAP_L4_ICMP: - return ICMP; - case SCAP_L4_RAW: - return RAW; - default: - return UNKNOWN; - } -} - -ValueType sysdig_converter::get_type(ppm_param_type type) { - switch (type) { - case PT_INT8: - return INT8; - case PT_INT16: - return INT16; - case PT_INT32: - return INT32; - case PT_INT64: - case PT_FD: - case PT_PID: - case PT_ERRNO: - return INT64; - case PT_FLAGS8: - case PT_UINT8: - case PT_SIGTYPE: - return UINT8; - case PT_FLAGS16: - case PT_UINT16: - case PT_SYSCALLID: - return UINT16; - case PT_UINT32: - case PT_FLAGS32: - case PT_MODE: - case PT_UID: - case PT_GID: - case PT_BOOL: - case PT_SIGSET: - return UINT32; - case PT_UINT64: - case PT_RELTIME: - case PT_ABSTIME: - return UINT64; - case PT_CHARBUF: - case PT_FSPATH: - return CHARBUF; - case PT_BYTEBUF: - return BYTEBUF; - case PT_DOUBLE: - return DOUBLE; - case PT_SOCKADDR: - case PT_SOCKTUPLE: - case PT_FDLIST: - default: - return BYTEBUF; - } -} - -string sysdig_converter::get_kindling_name(sinsp_evt *pEvt) { - // TODO - return pEvt->get_name(); -} - -int sysdig_converter::setTuple(kindling::KindlingEvent* kevt, const sinsp_evt_param *pTuple) { - if (NULL != pTuple) { - auto tuple = pTuple->m_val; - if (tuple[0] == PPM_AF_INET) { - if (pTuple->m_len == 1 + 4 + 2 + 4 + 2) { - auto sip = kevt->add_user_attributes(); - sip->set_key("sip"); - sip->set_value(tuple+1, 4); - sip->set_value_type(UINT32); - - auto sport = kevt->add_user_attributes(); - sport->set_key("sport"); - sport->set_value(tuple+5, 2); - sport->set_value_type(UINT16); - - auto dip = kevt->add_user_attributes(); - dip->set_key("dip"); - dip->set_value(tuple+7, 4); - dip->set_value_type(UINT32); - - auto dport = kevt->add_user_attributes(); - dport->set_key("dport"); - dport->set_value(tuple+11, 2); - dport->set_value_type(UINT16); - } - } - } - return 0; -} diff --git a/probe/src/probe/converter/sysdig_converter.h b/probe/src/probe/converter/sysdig_converter.h deleted file mode 100644 index b4961556c..000000000 --- a/probe/src/probe/converter/sysdig_converter.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef KINDLING_PROBE_SYSDIG_CONVERTER_H -#define KINDLING_PROBE_SYSDIG_CONVERTER_H -#include "sinsp.h" -#include "src/probe/converter/converter.h" -using namespace kindling; - -class sysdig_converter : public converter -{ -public: - void convert(void *evt); - sysdig_converter(sinsp *inspector); - sysdig_converter(sinsp *inspector, int batch_size, int max_size); - ~sysdig_converter(); - Category get_kindling_category(sinsp_evt *pEvt); - Source get_kindling_source(uint16_t etype); - L4Proto get_protocol(scap_l4_proto proto); - ValueType get_type(ppm_param_type type); - string get_kindling_name(sinsp_evt *pEvt); -private: - // set source, name, timestamp, category according to list - int init_kindling_event(kindling::KindlingEvent* kevt, sinsp_evt *sevt); - int add_native_attributes(kindling::KindlingEvent* kevt, sinsp_evt *sevt); - int add_user_attributes(kindling::KindlingEvent* kevt, sinsp_evt *sevt); - int add_fdinfo(kindling::KindlingEvent* kevt, sinsp_evt *sevt); - int add_threadinfo(kindling::KindlingEvent* kevt, sinsp_evt *sevt); - - sinsp *m_inspector; - - int setTuple(kindling::KindlingEvent* kevt, const sinsp_evt_param *pParam); -}; - -#endif //KINDLING_PROBE_SYSDIG_CONVERTER_H diff --git a/probe/src/probe/main.cpp b/probe/src/probe/main.cpp deleted file mode 100644 index 15d60c732..000000000 --- a/probe/src/probe/main.cpp +++ /dev/null @@ -1,179 +0,0 @@ -#include -#include -#include -#include "sinsp.h" -#include "src/probe/utils/termination_handler.h" -#include -#include -#include "src/probe/converter/sysdig_converter.h" -#include "src/probe/publisher/publisher.h" -#include "src/probe/converter/kindling_event.pb.h" -#include "driver/driver_config.h" -#include "src/common/base/base.h" -#include "src/probe/catch_sig.h" - - -DEFINE_int32(sysdig_snaplen, 80, "The len of one sysdig event"); -DEFINE_int32(list_batch_size, 100, "The batch size of convert/send list"); -DEFINE_int32(list_max_size, INT_MAX, "The max size of convert/send list"); -DEFINE_bool(sysdig_output, false, "If true, sysdig will print events log"); -DEFINE_int32(sysdig_filter_out_pid_event, -1, "When sysdig_output is true, sysdig will print the exact process's events"); -DEFINE_bool(sysdig_bpf, true, "If true, sysdig will use eBPF mode"); - -#define KINDLING_PROBE_VERSION "v0.1-2021-1221" -void do_inspect(sinsp *inspector, sinsp_evt_formatter *formatter, int pid, publisher* pub) { - int32_t res; - sinsp_evt *ev; - string line; - converter *sysdigConverter = new sysdig_converter(inspector, FLAGS_list_batch_size, FLAGS_list_max_size); - while (true) { - res = inspector->next(&ev); - if (res == SCAP_TIMEOUT) { - continue; - } else if (res != SCAP_SUCCESS) { - cerr << "res = " << res << endl; - break; - } - if (!inspector->is_debug_enabled() && - ev->get_category() & EC_INTERNAL) { - continue; - } - auto threadInfo = ev->get_thread_info(); - if (threadInfo == nullptr) { - continue; - } - // filter out kindling-probe itself and 0 - if (threadInfo->m_ptid == (__int64_t) pid || threadInfo->m_pid == (__int64_t) pid || threadInfo->m_pid == 0) { - continue; - } - - // filter out io-related events that do not contain message - auto category = ev->get_category(); - if (category & EC_IO_BASE) { - auto pres = ev->get_param_value_raw("res"); - if (pres && *(int64_t *) pres->m_val <= 0) { - continue; - } - } - - pub->consume_sysdig_event(ev, threadInfo->m_pid, sysdigConverter); - if (FLAGS_sysdig_output && (FLAGS_sysdig_filter_out_pid_event == -1 || FLAGS_sysdig_filter_out_pid_event == threadInfo->m_pid)) { - if (formatter->tostring(ev, &line)) { - cout<< line << endl; - } - } - } -} - -void get_capture_statistics(sinsp* inspector) { - LOG(INFO) << "thread for sysdig statistics start"; - scap_stats s; - while(1) { - inspector->get_capture_stats(&s); - LOG(INFO) << "seen by driver: " << s.n_evts; - if(s.n_drops != 0){ - LOG(INFO) << "Number of dropped events: " << s.n_drops; - } - if(s.n_drops_buffer != 0){ - LOG(INFO) << "Number of dropped events caused by full buffer: " << s.n_drops_buffer; - } - if(s.n_drops_pf != 0){ - LOG(INFO) << "Number of dropped events caused by invalid memory access: " << s.n_drops_pf; - } - if(s.n_drops_bug != 0){ - LOG(INFO) << "Number of dropped events caused by an invalid condition in the kernel instrumentation: " << s.n_drops_bug; - } - if(s.n_preemptions != 0){ - LOG(INFO) << "Number of preemptions: " << s.n_preemptions; - } - if(s.n_suppressed != 0){ - LOG(INFO) << "Number of events skipped due to the tid being in a set of suppressed tids: " << s.n_suppressed; - } - if(s.n_tids_suppressed != 0){ - LOG(INFO) << "Number of threads currently being suppressed: " << s.n_tids_suppressed; - } - sleep(10); - } -} - -int main(int argc, char** argv) { - px::EnvironmentGuard env_guard(&argc, argv); - - int pid = getpid(); - sinsp *inspector = nullptr; - bool bpf = false; - string bpf_probe; - string output_format; - output_format = "*%evt.num %evt.outputtime %evt.cpu %container.name (%container.id) %proc.name (%thread.tid:%thread.vtid) %evt.dir %evt.type %evt.info"; - - LOG(INFO) << "Start kindling probe..."; - LOG(INFO) << "KINDLING_PROBE_VERSION: " << KINDLING_PROBE_VERSION; - TerminationHandler::InstallSignalHandlers(); - try { - inspector = new sinsp(); - inspector->set_hostname_and_port_resolution_mode(false); - sinsp_evt_formatter formatter(inspector, output_format); - inspector->set_snaplen(FLAGS_sysdig_snaplen); - - inspector->suppress_events_comm("containerd"); - inspector->suppress_events_comm("dockerd"); - inspector->suppress_events_comm("containerd-shim"); - inspector->suppress_events_comm("kindling-collector"); - inspector->suppress_events_comm("sshd"); - - const char *probe = scap_get_bpf_probe_from_env(); - if (probe) { - bpf = true; - bpf_probe = probe; - } - - bool open_success = true; - - try { - inspector->open(""); - inspector->clear_eventmask(); - } - catch (const sinsp_exception &e) { - open_success = false; - } - - // - // Starting the live capture failed, try to load the driver with - // modprobe. - // - if (!open_success) { - if (bpf) { - if (bpf_probe.empty()) { - fprintf(stderr, "Unable to locate the BPF probe\n"); - } - } else { - if (system("modprobe " PROBE_NAME " > /dev/null 2> /dev/null")) { - fprintf(stderr, "Unable to load the driver\n"); - } - } - - inspector->open(""); - } - thread catch_signal(sigsetup); - thread stat(get_capture_statistics, inspector); - publisher *pub = new publisher(inspector); - - TerminationHandler::set_sinsp(inspector); - thread inspect(do_inspect, inspector, &formatter, pid, pub); - pub->start(); - - inspector->close(); - } - catch (const exception &e) { - fprintf(stderr, "kindling probe init err: %s", e.what()); - return 1; - } - delete inspector; - return 0; -} - - - - - - diff --git a/probe/src/probe/publisher/BUILD.bazel b/probe/src/probe/publisher/BUILD.bazel deleted file mode 100644 index 51f543527..000000000 --- a/probe/src/probe/publisher/BUILD.bazel +++ /dev/null @@ -1,43 +0,0 @@ -load("@px//bazel:proto_compile.bzl", "pl_cc_proto_library", "pl_go_proto_library", "pl_proto_library") -load("@px//bazel:pl_build_system.bzl", "pl_cc_library") - -package(default_visibility = ["//src:__subpackages__"]) - -pl_proto_library( - name = "subscribe_pl_proto", - srcs = ["subscribe.proto"], - visibility = ["//src:__subpackages__"], -) - -pl_cc_proto_library( - name = "subscribe_pl_cc_proto", - proto = ":subscribe_pl_proto", - visibility = ["//src:__subpackages__"], -) - - -pl_cc_library( - name = "cc_library", - srcs = glob( - [ - "*.h", - "*.cc", - "*.cpp", - ], - exclude = [ - "**/*_test.cc", - "**/*_benchmark.cc", - ], - ), - hdrs = glob(["*.h"]), - copts = ["-Ibazel-out/k8-fastbuild/bin/third_party/agent-libs_build/include/userspace/libscap", "-Ibazel-out/k8-fastbuild/bin/third_party/agent-libs_build/include/userspace/libsinsp/third-party/jsoncpp", "-Ibazel-out/k8-fastbuild/bin/third_party/agent-libs_build/include/userspace/libsinsp", "-Wno-unused-parameter","-Wno-ignored-qualifiers","-Wno-mismatched-tags","-Wno-unused-variable"], - deps = [ - ":subscribe_pl_cc_proto", - "//src/probe/converter:cc_library", - "//src/probe/utils:cc_library", - "@px//:px_headers", - "@px//src/stirling:cc_library", - "//third_party:agent-libs_build", - "//third_party:zmq_build", - ], -) diff --git a/probe/src/probe/publisher/defination.h b/probe/src/probe/publisher/defination.h deleted file mode 100644 index ddfd8664c..000000000 --- a/probe/src/probe/publisher/defination.h +++ /dev/null @@ -1,316 +0,0 @@ -// -// Created by 散养鸡 on 2021/12/30. -// - -#ifndef KINDLING_PROBE_DEFINATION_H -#define KINDLING_PROBE_DEFINATION_H - -#include - -struct event { - string event_name; - ppm_event_type event_type; -}; -const static event kindling_to_sysdig[PPM_EVENT_MAX] = { - {"syscall_enter-open", PPME_SYSCALL_OPEN_E}, - {"syscall_exit-open", PPME_SYSCALL_OPEN_X}, - {"syscall_enter-close", PPME_SYSCALL_CLOSE_E}, - {"syscall_exit-close", PPME_SYSCALL_CLOSE_X}, - {"syscall_enter-read", PPME_SYSCALL_READ_E}, - {"syscall_exit-read", PPME_SYSCALL_READ_X}, - {"syscall_enter-write", PPME_SYSCALL_WRITE_E}, - {"syscall_exit-write", PPME_SYSCALL_WRITE_X}, - {"syscall_enter-brk", PPME_SYSCALL_BRK_4_E}, - {"syscall_exit-brk", PPME_SYSCALL_BRK_4_X}, - {"syscall_enter-execve", PPME_SYSCALL_EXECVE_19_E}, - {"syscall_exit-execve", PPME_SYSCALL_EXECVE_19_X}, - {"syscall_enter-clone", PPME_SYSCALL_CLONE_20_E}, - {"syscall_exit-clone", PPME_SYSCALL_CLONE_20_X}, - {"syscall_enter-socket", PPME_SOCKET_SOCKET_E}, - {"syscall_exit-socket", PPME_SOCKET_SOCKET_X}, - {"syscall_enter-bind", PPME_SOCKET_BIND_E}, - {"syscall_exit-bind", PPME_SOCKET_BIND_X}, - {"syscall_enter-connect", PPME_SOCKET_CONNECT_E}, - {"syscall_exit-connect", PPME_SOCKET_CONNECT_X}, - {"syscall_enter-listen", PPME_SOCKET_LISTEN_E}, - {"syscall_exit-listen", PPME_SOCKET_LISTEN_X}, - {"syscall_enter-accept", PPME_SOCKET_ACCEPT_5_E}, - {"syscall_exit-accept", PPME_SOCKET_ACCEPT_5_X}, - {"syscall_enter-accept4", PPME_SOCKET_ACCEPT4_5_E}, - {"syscall_exit-accept4", PPME_SOCKET_ACCEPT4_5_X}, - {"syscall_enter-sendto", PPME_SOCKET_SENDTO_E}, - {"syscall_exit-sendto", PPME_SOCKET_SENDTO_X}, - {"syscall_enter-recvfrom", PPME_SOCKET_RECVFROM_E}, - {"syscall_exit-recvfrom", PPME_SOCKET_RECVFROM_X}, - {"syscall_enter-shutdown", PPME_SOCKET_SHUTDOWN_E}, - {"syscall_exit-shutdown", PPME_SOCKET_SHUTDOWN_X}, - {"syscall_enter-getsockname", PPME_SOCKET_GETSOCKNAME_E}, - {"syscall_exit-getsockname", PPME_SOCKET_GETSOCKNAME_X}, - {"syscall_enter-getpeername", PPME_SOCKET_GETPEERNAME_E}, - {"syscall_exit-getpeername", PPME_SOCKET_GETPEERNAME_X}, - {"syscall_enter-socketpair", PPME_SOCKET_SOCKETPAIR_E}, - {"syscall_exit-socketpair", PPME_SOCKET_SOCKETPAIR_X}, - {"syscall_enter-setsockopt", PPME_SOCKET_SETSOCKOPT_E}, - {"syscall_exit-setsockopt", PPME_SOCKET_SETSOCKOPT_X}, - {"syscall_enter-getsockopt", PPME_SOCKET_GETSOCKOPT_E}, - {"syscall_exit-getsockopt", PPME_SOCKET_GETSOCKOPT_X}, - {"syscall_enter-sendmsg", PPME_SOCKET_SENDMSG_E}, - {"syscall_exit-sendmsg", PPME_SOCKET_SENDMSG_X}, - {"syscall_enter-sendmmsg", PPME_SOCKET_SENDMMSG_E}, - {"syscall_exit-sendmmsg", PPME_SOCKET_SENDMMSG_X}, - {"syscall_enter-recvmsg", PPME_SOCKET_RECVMSG_E}, - {"syscall_exit-recvmsg", PPME_SOCKET_RECVMSG_X}, - {"syscall_enter-recvmmsg", PPME_SOCKET_RECVMMSG_E}, - {"syscall_exit-recvmmsg", PPME_SOCKET_RECVMMSG_X}, - {"syscall_enter-sendfile", PPME_SYSCALL_SENDFILE_E}, - {"syscall_exit-sendfile", PPME_SYSCALL_SENDFILE_X}, - {"syscall_enter-creat", PPME_SYSCALL_CREAT_E}, - {"syscall_exit-creat", PPME_SYSCALL_CREAT_X}, - {"syscall_enter-pipe", PPME_SYSCALL_PIPE_E}, - {"syscall_exit-pipe", PPME_SYSCALL_PIPE_X}, - {"syscall_enter-pipe2", PPME_SYSCALL_PIPE_E}, - {"syscall_exit-pipe2", PPME_SYSCALL_PIPE_X}, - {"syscall_enter-eventfd", PPME_SYSCALL_EVENTFD_E}, - {"syscall_exit-eventfd", PPME_SYSCALL_EVENTFD_X}, - {"syscall_enter-eventfd2", PPME_SYSCALL_EVENTFD_E}, - {"syscall_exit-eventfd2", PPME_SYSCALL_EVENTFD_X}, - {"syscall_enter-futex", PPME_SYSCALL_FUTEX_E}, - {"syscall_exit-futex", PPME_SYSCALL_FUTEX_X}, - {"syscall_enter-stat", PPME_SYSCALL_STAT_E}, - {"syscall_exit-stat", PPME_SYSCALL_STAT_X}, - {"syscall_enter-lstat", PPME_SYSCALL_LSTAT_E}, - {"syscall_exit-lstat", PPME_SYSCALL_LSTAT_X}, - {"syscall_enter-fstat", PPME_SYSCALL_FSTAT_E}, - {"syscall_exit-fstat", PPME_SYSCALL_FSTAT_X}, - {"syscall_enter-stat64", PPME_SYSCALL_STAT64_E}, - {"syscall_exit-stat64", PPME_SYSCALL_STAT64_X}, - {"syscall_enter-lstat64", PPME_SYSCALL_LSTAT64_E}, - {"syscall_exit-lstat64", PPME_SYSCALL_LSTAT64_X}, - {"syscall_enter-fstat64", PPME_SYSCALL_FSTAT64_E}, - {"syscall_exit-fstat64", PPME_SYSCALL_FSTAT64_X}, - {"syscall_enter-epoll_wait", PPME_SYSCALL_EPOLLWAIT_E}, - {"syscall_exit-epoll_wait", PPME_SYSCALL_EPOLLWAIT_X}, - {"syscall_enter-poll", PPME_SYSCALL_POLL_E}, - {"syscall_exit-poll", PPME_SYSCALL_POLL_X}, - {"syscall_enter-ppoll", PPME_SYSCALL_PPOLL_E}, - {"syscall_exit-ppoll", PPME_SYSCALL_PPOLL_X}, - {"syscall_enter-select", PPME_SYSCALL_SELECT_E}, - {"syscall_exit-select", PPME_SYSCALL_SELECT_X}, - {"syscall_enter-lseek", PPME_SYSCALL_LSEEK_E}, - {"syscall_exit-lseek", PPME_SYSCALL_LSEEK_X}, - {"syscall_enter-llseek", PPME_SYSCALL_LLSEEK_E}, - {"syscall_exit-llseek", PPME_SYSCALL_LLSEEK_X}, - {"syscall_enter-getcwd", PPME_SYSCALL_GETCWD_E}, - {"syscall_exit-getcwd", PPME_SYSCALL_GETCWD_X}, - {"syscall_enter-chdir", PPME_SYSCALL_CHDIR_E}, - {"syscall_exit-chdir", PPME_SYSCALL_CHDIR_X}, - {"syscall_enter-fchdir", PPME_SYSCALL_FCHDIR_E}, - {"syscall_exit-fchdir", PPME_SYSCALL_FCHDIR_X}, - {"syscall_enter-mkdir", PPME_SYSCALL_MKDIR_2_E}, - {"syscall_exit-mkdir", PPME_SYSCALL_MKDIR_2_X}, - {"syscall_enter-mkdirat", PPME_SYSCALL_MKDIRAT_E}, - {"syscall_exit-mkdirat", PPME_SYSCALL_MKDIRAT_X}, - {"syscall_enter-rmdir", PPME_SYSCALL_RMDIR_2_E}, - {"syscall_exit-rmdir", PPME_SYSCALL_RMDIR_2_X}, - {"syscall_enter-unlink", PPME_SYSCALL_UNLINK_2_E}, - {"syscall_exit-unlink", PPME_SYSCALL_UNLINK_2_X}, - {"syscall_enter-unlinkat", PPME_SYSCALL_UNLINKAT_2_E}, - {"syscall_exit-unlinkat", PPME_SYSCALL_UNLINKAT_2_X}, - {"syscall_enter-openat", PPME_SYSCALL_OPENAT_2_E}, - {"syscall_exit-openat", PPME_SYSCALL_OPENAT_2_X}, - {"syscall_enter-link", PPME_SYSCALL_LINK_2_E}, - {"syscall_exit-link", PPME_SYSCALL_LINK_2_X}, - {"syscall_enter-linkat", PPME_SYSCALL_LINKAT_2_E}, - {"syscall_exit-linkat", PPME_SYSCALL_LINKAT_2_X}, - {"syscall_enter-pread", PPME_SYSCALL_PREAD_E}, - {"syscall_exit-pread", PPME_SYSCALL_PREAD_X}, - {"syscall_enter-pwrite", PPME_SYSCALL_PWRITE_E}, - {"syscall_exit-pwrite", PPME_SYSCALL_PWRITE_X}, - {"syscall_enter-readv", PPME_SYSCALL_READV_E}, - {"syscall_exit-readv", PPME_SYSCALL_READV_X}, - {"syscall_enter-writev", PPME_SYSCALL_WRITEV_E}, - {"syscall_exit-writev", PPME_SYSCALL_WRITEV_X}, - {"syscall_enter-preadv", PPME_SYSCALL_PREADV_E}, - {"syscall_exit-preadv", PPME_SYSCALL_PREADV_X}, - {"syscall_enter-pwritev", PPME_SYSCALL_PWRITEV_E}, - {"syscall_exit-pwritev", PPME_SYSCALL_PWRITEV_X}, - {"syscall_enter-dup", PPME_SYSCALL_DUP_E}, - {"syscall_exit-dup", PPME_SYSCALL_DUP_X}, - {"syscall_enter-dup2", PPME_SYSCALL_DUP_E}, - {"syscall_exit-dup2", PPME_SYSCALL_DUP_X}, - {"syscall_enter-dup3", PPME_SYSCALL_DUP_E}, - {"syscall_exit-dup3", PPME_SYSCALL_DUP_X}, - {"syscall_enter-signalfd", PPME_SYSCALL_SIGNALFD_E}, - {"syscall_exit-signalfd", PPME_SYSCALL_SIGNALFD_X}, - {"syscall_enter-signalfd4", PPME_SYSCALL_SIGNALFD_E}, - {"syscall_exit-signalfd4", PPME_SYSCALL_SIGNALFD_X}, - {"syscall_enter-kill", PPME_SYSCALL_KILL_E}, - {"syscall_exit-kill", PPME_SYSCALL_KILL_X}, - {"syscall_enter-tkill", PPME_SYSCALL_TKILL_E}, - {"syscall_exit-tkill", PPME_SYSCALL_TKILL_X}, - {"syscall_enter-tgkill", PPME_SYSCALL_TGKILL_E}, - {"syscall_exit-tgkill", PPME_SYSCALL_TGKILL_X}, - {"syscall_enter-nanosleep", PPME_SYSCALL_NANOSLEEP_E}, - {"syscall_exit-nanosleep", PPME_SYSCALL_NANOSLEEP_X}, - {"syscall_enter-timerfd_create", PPME_SYSCALL_TIMERFD_CREATE_E}, - {"syscall_exit-timerfd_create", PPME_SYSCALL_TIMERFD_CREATE_X}, - {"syscall_enter-inotify_init", PPME_SYSCALL_INOTIFY_INIT_E}, - {"syscall_exit-inotify_init", PPME_SYSCALL_INOTIFY_INIT_X}, - {"syscall_enter-inotify_init1", PPME_SYSCALL_INOTIFY_INIT_E}, - {"syscall_exit-inotify_init1", PPME_SYSCALL_INOTIFY_INIT_X}, - {"syscall_enter-getrlimit", PPME_SYSCALL_GETRLIMIT_E}, - {"syscall_exit-getrlimit", PPME_SYSCALL_GETRLIMIT_X}, - {"syscall_enter-setrlimit", PPME_SYSCALL_SETRLIMIT_E}, - {"syscall_exit-setrlimit", PPME_SYSCALL_SETRLIMIT_X}, - {"syscall_enter-prlimit", PPME_SYSCALL_PRLIMIT_E}, - {"syscall_exit-prlimit", PPME_SYSCALL_PRLIMIT_X}, - {"syscall_enter-fcntl", PPME_SYSCALL_FCNTL_E}, - {"syscall_exit-fcntl", PPME_SYSCALL_FCNTL_X}, - {"syscall_enter-ioctl", PPME_SYSCALL_IOCTL_3_E}, - {"syscall_exit-ioctl", PPME_SYSCALL_IOCTL_3_X}, - {"syscall_enter-mmap", PPME_SYSCALL_MMAP_E}, - {"syscall_exit-mmap", PPME_SYSCALL_MMAP_X}, - {"syscall_enter-mmap2", PPME_SYSCALL_MMAP2_E}, - {"syscall_exit-mmap2", PPME_SYSCALL_MMAP2_X}, - {"syscall_enter-munmap", PPME_SYSCALL_MUNMAP_E}, - {"syscall_exit-munmap", PPME_SYSCALL_MUNMAP_X}, - {"syscall_enter-splice", PPME_SYSCALL_SPLICE_E}, - {"syscall_exit-splice", PPME_SYSCALL_SPLICE_X}, - {"syscall_enter-ptrace", PPME_SYSCALL_PTRACE_E}, - {"syscall_exit-ptrace", PPME_SYSCALL_PTRACE_X}, - {"syscall_enter-rename", PPME_SYSCALL_RENAME_E}, - {"syscall_exit-rename", PPME_SYSCALL_RENAME_X}, - {"syscall_enter-renameat", PPME_SYSCALL_RENAMEAT_E}, - {"syscall_exit-renameat", PPME_SYSCALL_RENAMEAT_X}, - {"syscall_enter-symlink", PPME_SYSCALL_SYMLINK_E}, - {"syscall_exit-symlink", PPME_SYSCALL_SYMLINK_X}, - {"syscall_enter-symlinkat", PPME_SYSCALL_SYMLINKAT_E}, - {"syscall_exit-symlinkat", PPME_SYSCALL_SYMLINKAT_X}, - {"syscall_enter-fork", PPME_SYSCALL_FORK_20_E}, - {"syscall_exit-fork", PPME_SYSCALL_FORK_20_X}, - {"syscall_enter-vfork", PPME_SYSCALL_VFORK_20_E}, - {"syscall_exit-vfork", PPME_SYSCALL_VFORK_20_X}, - {"syscall_enter-quotactl", PPME_SYSCALL_QUOTACTL_E}, - {"syscall_exit-quotactl", PPME_SYSCALL_QUOTACTL_X}, - {"syscall_enter-setresuid", PPME_SYSCALL_SETRESUID_E}, - {"syscall_exit-setresuid", PPME_SYSCALL_SETRESUID_X}, - {"syscall_enter-setresgid", PPME_SYSCALL_SETRESGID_E}, - {"syscall_exit-setresgid", PPME_SYSCALL_SETRESGID_X}, - {"syscall_enter-setuid", PPME_SYSCALL_SETUID_E}, - {"syscall_exit-setuid", PPME_SYSCALL_SETUID_X}, - {"syscall_enter-setgid", PPME_SYSCALL_SETGID_E}, - {"syscall_exit-setgid", PPME_SYSCALL_SETGID_X}, - {"syscall_enter-getuid", PPME_SYSCALL_GETUID_E}, - {"syscall_exit-getuid", PPME_SYSCALL_GETUID_X}, - {"syscall_enter-geteuid", PPME_SYSCALL_GETEUID_E}, - {"syscall_exit-geteuid", PPME_SYSCALL_GETEUID_X}, - {"syscall_enter-getgid", PPME_SYSCALL_GETGID_E}, - {"syscall_exit-getgid", PPME_SYSCALL_GETGID_X}, - {"syscall_enter-getegid", PPME_SYSCALL_GETEGID_E}, - {"syscall_exit-getegid", PPME_SYSCALL_GETEGID_X}, - {"syscall_enter-getresuid", PPME_SYSCALL_GETRESUID_E}, - {"syscall_exit-getresuid", PPME_SYSCALL_GETRESUID_X}, - {"syscall_enter-getresgid", PPME_SYSCALL_GETRESGID_E}, - {"syscall_exit-getresgid", PPME_SYSCALL_GETRESGID_X}, - {"syscall_enter-getdents", PPME_SYSCALL_GETDENTS_E}, - {"syscall_exit-getdents", PPME_SYSCALL_GETDENTS_X}, - {"syscall_enter-getdents64", PPME_SYSCALL_GETDENTS64_E}, - {"syscall_exit-getdents64", PPME_SYSCALL_GETDENTS64_X}, - {"syscall_enter-setns", PPME_SYSCALL_SETNS_E}, - {"syscall_exit-setns", PPME_SYSCALL_SETNS_X}, - {"syscall_enter-flock", PPME_SYSCALL_FLOCK_E}, - {"syscall_exit-flock", PPME_SYSCALL_FLOCK_X}, - {"syscall_enter-semop", PPME_SYSCALL_SEMOP_E}, - {"syscall_exit-semop", PPME_SYSCALL_SEMOP_X}, - {"syscall_enter-semctl", PPME_SYSCALL_SEMCTL_E}, - {"syscall_exit-semctl", PPME_SYSCALL_SEMCTL_X}, - {"syscall_enter-mount", PPME_SYSCALL_MOUNT_E}, - {"syscall_exit-mount", PPME_SYSCALL_MOUNT_X}, - {"syscall_enter-umount", PPME_SYSCALL_UMOUNT_E}, - {"syscall_exit-umount", PPME_SYSCALL_UMOUNT_X}, - {"syscall_enter-semget", PPME_SYSCALL_SEMGET_E}, - {"syscall_exit-semget", PPME_SYSCALL_SEMGET_X}, - {"syscall_enter-access", PPME_SYSCALL_ACCESS_E}, - {"syscall_exit-access", PPME_SYSCALL_ACCESS_X}, - {"syscall_enter-chroot", PPME_SYSCALL_CHROOT_E}, - {"syscall_exit-chroot", PPME_SYSCALL_CHROOT_X}, - {"syscall_enter-setsid", PPME_SYSCALL_SETSID_E}, - {"syscall_exit-setsid", PPME_SYSCALL_SETSID_X}, - {"syscall_enter-setpgid", PPME_SYSCALL_SETPGID_E}, - {"syscall_exit-setpgid", PPME_SYSCALL_SETPGID_X}, - {"syscall_enter-unshare", PPME_SYSCALL_UNSHARE_E}, - {"syscall_exit-unshare", PPME_SYSCALL_UNSHARE_X}, - {"syscall_enter-bpf", PPME_SYSCALL_BPF_E}, - {"syscall_exit-bpf", PPME_SYSCALL_BPF_X}, - {"syscall_enter-seccomp", PPME_SYSCALL_SECCOMP_E}, - {"syscall_exit-seccomp", PPME_SYSCALL_SECCOMP_X}, - {"syscall_enter-fchmodat", PPME_SYSCALL_FCHMODAT_E}, - {"syscall_exit-fchmodat", PPME_SYSCALL_FCHMODAT_X}, - {"syscall_enter-chmod", PPME_SYSCALL_CHMOD_E}, - {"syscall_exit-chmod", PPME_SYSCALL_CHMOD_X}, - {"syscall_enter-fchmod", PPME_SYSCALL_FCHMOD_E}, - {"syscall_exit-fchmod", PPME_SYSCALL_FCHMOD_X}, - {"tracepoint-sched_switch", PPME_SCHEDSWITCH_6_E}, - {"tracepoint-signaldeliver", PPME_SIGNALDELIVER_E}, - {"tracepoint-signaldeliver", PPME_SIGNALDELIVER_X}, - {"syscall_enter-alarm", PPME_GENERIC_E}, - {"syscall_exit-alarm", PPME_GENERIC_X}, - {"syscall_enter-epoll_create", PPME_GENERIC_E}, - {"syscall_exit-epoll_create", PPME_GENERIC_X}, - {"syscall_enter-epoll_ctl", PPME_GENERIC_E}, - {"syscall_exit-epoll_ctl", PPME_GENERIC_X}, - {"syscall_enter-lchown", PPME_GENERIC_E}, - {"syscall_exit-lchown", PPME_GENERIC_X}, - {"syscall_enter-old_select", PPME_GENERIC_E}, - {"syscall_exit-old_select", PPME_GENERIC_X}, - {"syscall_enter-pause", PPME_GENERIC_E}, - {"syscall_exit-pause", PPME_GENERIC_X}, - {"syscall_enter-process_vm_readv", PPME_GENERIC_E}, - {"syscall_exit-process_vm_readv", PPME_GENERIC_X}, - {"syscall_enter-process_vm_writev", PPME_GENERIC_E}, - {"syscall_exit-process_vm_writev", PPME_GENERIC_X}, - {"syscall_enter-pselect6", PPME_GENERIC_E}, - {"syscall_exit-pselect6", PPME_GENERIC_X}, - {"syscall_enter-sched_getparam", PPME_GENERIC_E}, - {"syscall_exit-sched_getparam", PPME_GENERIC_X}, - {"syscall_enter-sched_setparam", PPME_GENERIC_E}, - {"syscall_exit-sched_setparam", PPME_GENERIC_X}, - {"syscall_enter-syslog", PPME_GENERIC_E}, - {"syscall_exit-syslog", PPME_GENERIC_X}, - {"syscall_enter-uselib", PPME_GENERIC_E}, - {"syscall_exit-uselib", PPME_GENERIC_X}, - {"syscall_enter-utime", PPME_GENERIC_E}, - {"syscall_exit-utime", PPME_GENERIC_X}, - {"tracepoint-ingress", PPME_NETIF_RECEIVE_SKB_E}, - {"tracepoint-egress", PPME_NET_DEV_XMIT_E}, - {"kprobe-tcp_close", PPME_TCP_CLOSE_E}, - {"kprobe-tcp_rcv_established", PPME_TCP_RCV_ESTABLISHED_E}, - {"kprobe-tcp_drop", PPME_TCP_DROP_E}, - {"kprobe-tcp_retransmit_skb", PPME_TCP_RETRANCESMIT_SKB_E}, - {"kretprobe-tcp_connect", PPME_TCP_CONNECT_X}, - {"kprobe-tcp_set_state", PPME_TCP_SET_STATE_E}, - {"tracepoint-tcp_send_reset", PPME_TCP_SEND_RESET_E}, - {"tracepoint-tcp_receive_reset", PPME_TCP_RECEIVE_RESET_E}, -}; - -struct event_category { - string cateogry_name; - Category category_value; -}; -const static event_category category_map[Category_MAX+1] = { - {"other", CAT_OTHER}, - {"file", CAT_FILE}, - {"net", CAT_NET}, - {"ipc", CAT_IPC}, - {"wait", CAT_WAIT}, - {"signal", CAT_SIGNAL}, - {"sleep", CAT_SLEEP}, - {"time", CAT_TIME}, - {"process", CAT_PROCESS}, - {"scheduler", CAT_SCHEDULER}, - {"memory", CAT_MEMORY}, - {"user", CAT_USER}, - {"system", CAT_SYSTEM}, -}; - -#endif //KINDLING_PROBE_DEFINATION_H \ No newline at end of file diff --git a/probe/src/probe/publisher/publisher.cpp b/probe/src/probe/publisher/publisher.cpp deleted file mode 100644 index dbb264553..000000000 --- a/probe/src/probe/publisher/publisher.cpp +++ /dev/null @@ -1,237 +0,0 @@ -#include "src/probe/publisher/publisher.h" -#include -#include -#include -#include -#include -#include -#include "tuples.h" -#include -#include "src/probe/publisher/defination.h" -#include "src/probe/converter/sysdig_converter.h" - -using namespace std; -using namespace kindling; - -publisher::publisher(sinsp *inspector) { - m_socket = NULL; - m_selector = new selector(inspector); - m_inspector = inspector; - m_bind_address = new shared_unordered_map; - m_client_event_map = new shared_unordered_map>; -} - -publisher::~publisher() { - delete m_selector; - delete m_bind_address; - delete m_client_event_map; -} - -void publisher::consume_sysdig_event(sinsp_evt *evt, int pid, converter *sysdigConverter) { - if (!m_socket) { - return; - } - - // filter out pid in filter_pid - for (int i : filter_pid) { - if (i == pid) { - return; - } - } - // convert sysdig event to kindling event - if (m_selector->select(evt->get_type(), ((sysdig_converter *) sysdigConverter)->get_kindling_category(evt))) { - auto it = m_kindlingEventLists.find(sysdigConverter); - KindlingEventList* kindlingEventList; - if (it == m_kindlingEventLists.end()) { - kindlingEventList = new KindlingEventList(); - m_kindlingEventLists[sysdigConverter] = kindlingEventList; - m_ready[kindlingEventList] = false; - } else { - kindlingEventList = it->second; - } - - if (sysdigConverter->judge_max_size()) { - // check if the send list has sent - if (m_ready[kindlingEventList]) { - // drop event - return; - } - swap_list(sysdigConverter, kindlingEventList); - } - - sysdigConverter->convert(evt); - // if send list was sent - if (sysdigConverter->judge_batch_size() && !m_ready[kindlingEventList]) { - swap_list(sysdigConverter, kindlingEventList); - } - } -} - -Socket publisher::init_zeromq_rep_server() { - void *context = zmq_ctx_new(); - void *socket = zmq_socket(context, ZMQ_REP); - zmq_bind(socket, "ipc:///home/kindling/0"); - return socket; -} - -Socket publisher::init_zeromq_push_server() { - void *context = zmq_ctx_new(); - void *socket = zmq_socket(context, ZMQ_PUSH); - return socket; -} - -int publisher::start() { - Socket socket = init_zeromq_rep_server(); - auto sub_server = thread(bind(&publisher::subscribe_server, this, socket)); - auto send_server = thread(bind(&publisher::send_server, this)); - sub_server.join(); - send_server.join(); - return 0; -} - -void publisher::send_server(publisher *mpublisher) { - LOG(INFO) << "Thread sender start"; - uint64_t total= 0; - uint64_t msg_total_size = 0; - while (true) { - usleep(100000); - for (auto list : mpublisher->m_kindlingEventLists) { - auto pKindlingEventList = list.second; - // flag == false - if (!mpublisher->m_ready[pKindlingEventList]) { - continue; - } - if (pKindlingEventList->kindling_event_list_size() > 0) { - string msg; - pKindlingEventList->SerializeToString(&msg); - int num = pKindlingEventList->kindling_event_list_size(); - total = total + num; - LOG(INFO) << "Send " << num << " kindling events, sending size: " << setprecision(2) << - msg.length() / 1024.0 <<" KB. Total count of kindling events: " << total; -// cout << pKindlingEventList->Utf8DebugString(); - zmq_send(mpublisher->m_socket, msg.data(), msg.size(), ZMQ_DONTWAIT); - pKindlingEventList->clear_kindling_event_list(); - } - mpublisher->m_ready[pKindlingEventList] = false; - } - } -} - -void publisher::subscribe_server(publisher *mpublisher, Socket subscribe_socket) { - LOG(INFO) << "Subcribe server start"; - while (true) { - char result[1000]; - memset(result, 0, 1000); - zmq_recv(subscribe_socket, result, 1000, 0); - string reason; - mpublisher->subscribe(result, reason); - zmq_send(subscribe_socket, reason.data(), 7, 0); - } -} - -void publisher::subscribe(string sub_event, string &reason) { - SubEvent subEvent; - void *socket; - - subEvent.ParseFromString(sub_event); - LOG(INFO) << "subscribe info: " << subEvent.Utf8DebugString(); - string address = subEvent.address().data(); - - // filter out subscriber - pid_mutex_.lock(); - filter_pid.push_back(((int) subEvent.pid())); - pid_mutex_.unlock(); - - // subscribe - auto ad_index = m_bind_address->find((char *) address.data()); - // if exists, delete first - if (ad_index != m_bind_address->end()) { - // TODO - } - // new socket and bind - socket = init_zeromq_push_server(); - int rc = zmq_bind(socket, address.c_str()); - if (rc != 0) { - reason = "sub address error"; - return; - } - // set selectors - m_selector->parse(subEvent.labels()); - - // bind - m_socket = socket; - m_bind_address->insert((char *) address.data(), socket); -} - -void publisher::swap_list(converter *cvt, KindlingEventList* kindlingEventList) { - kindlingEventList = cvt->swap_list(kindlingEventList); - m_kindlingEventLists[cvt] = kindlingEventList; - m_ready[kindlingEventList] = true; -} - -selector::selector(sinsp *inspector) { - m_labels = new map* >; - for (auto e : kindling_to_sysdig) { - m_events[e.event_name] = e.event_type; - } - for (auto c : category_map) { - m_categories[c.cateogry_name] = c.category_value; - } - m_inspector = inspector; -} - -bool selector::select(uint16_t type, Category category) { - auto it = m_labels->find(static_cast(type)); - if (it != m_labels->end()) { - if (it->second->size() == 0) { - return true; - } - for (auto c : *it->second) { - if (c == category) { - return true; - } - } - } - return false; -} -Category selector::get_category(string category) { - auto it = m_categories.find(category); - if (it != m_categories.end()) { - return it->second; - } else { - return CAT_NONE; - } -} - -void selector::parse(const google::protobuf::RepeatedPtrField<::kindling::Label> &labels) { - for (auto label : labels) { - auto it = m_events.find(label.name()); - if (it != m_events.end()) { - auto v = m_labels->find(it->second); - auto c = get_category(label.category()); - if (label.category() != "" && c == CAT_NONE) { - LOG(INFO) << "Subscribe: Kindling event category err: " << label.category(); - continue; - } - if (v != m_labels->end()) { - v->second->push_back(c); - } else { - auto categories = new vector; - if (c != CAT_NONE) { - categories->push_back(c); - } - m_labels->insert(pair *> (it->second, categories)); - } - LOG(INFO) << "Subscribe info: type: " << it->second << " category: " << (label.category() != "" ? label.category() : "none"); - } else { - LOG(INFO) << "Subscribe: Kindling event name err: " << label.name(); - } - } - // notify kernel, set eventmask - for (auto it : *m_labels) { - m_inspector->set_eventmask(it.first); - if (!PPME_IS_ENTER(it.first)) { - m_inspector->set_eventmask(it.first - 1); - } - } -} diff --git a/probe/src/probe/publisher/publisher.h b/probe/src/probe/publisher/publisher.h deleted file mode 100644 index 73291d32e..000000000 --- a/probe/src/probe/publisher/publisher.h +++ /dev/null @@ -1,75 +0,0 @@ -#ifndef KINDLING_PROBE_PUBLISHER_H -#define KINDLING_PROBE_PUBLISHER_H -#include -#include "src/probe/converter/kindling_event.pb.h" -#include "src/probe/publisher/subscribe.pb.h" -#include "src/probe/converter/converter.h" -#include "src/probe/utils/shared_unordered_map.h" -#include "sinsp.h" - -#include -#include -#include - -using namespace std; -using namespace kindling; -typedef void * Socket; - -class selector { -public: - selector(sinsp *inspector); - bool select(uint16_t type, Category category); - void parse(const google::protobuf::RepeatedPtrField<::kindling::Label> &field); - -private: - map*> *m_labels; - map m_events; - map m_categories; - Category get_category(string category); - sinsp *m_inspector; -}; - -// publish kindling event -class publisher { -public: - publisher(sinsp *); - ~publisher(); - // return list, add for converter or clear for send - vector get_kindlingEventLists(converter *cvter); - - void consume_sysdig_event(sinsp_evt *evt, int pid, converter *sysdigConverter); - // run [thread] send, [thread] subscribe - int start(); -private: - Socket init_zeromq_rep_server(); - Socket init_zeromq_push_server(); - // send threads: different content-keys correspond to sender thread. - static void send_server(publisher *); - // subscribe thread: accept subscribe request from clients - static void subscribe_server(publisher *, Socket); - - void subscribe(string sub_event, string &reason); - void unsubscribe(string sub_event); - - void swap_list(converter *cvt, KindlingEventList* kindlingEventList); - - // single sender - Socket m_socket; - map m_kindlingEventLists; - map m_ready; - - shared_unordered_map *m_bind_address; - - // multi sender - // vector for multi event source, e.g. [0] for sysdig, [1] for pixie - shared_unordered_map> *m_client_event_map; - // selectors - selector *m_selector; - - - sinsp *m_inspector; - std::mutex pid_mutex_; - vector filter_pid; -}; - -#endif //KINDLING_PROBE_PUBLISHER_H diff --git a/probe/src/probe/publisher/subscribe.proto b/probe/src/probe/publisher/subscribe.proto deleted file mode 100644 index c72805b77..000000000 --- a/probe/src/probe/publisher/subscribe.proto +++ /dev/null @@ -1,14 +0,0 @@ -syntax = "proto3"; -package kindling; -option go_package = "model/subscribe"; - -message SubEvent { - bytes address = 1; - uint32 pid = 2; - repeated Label labels = 4; -} - -message Label { - string category = 1; - string name = 2; -} \ No newline at end of file diff --git a/probe/src/probe/standalone/BUILD.bazel b/probe/src/probe/standalone/BUILD.bazel deleted file mode 100644 index 942833851..000000000 --- a/probe/src/probe/standalone/BUILD.bazel +++ /dev/null @@ -1,56 +0,0 @@ -load("@px//bazel:pl_build_system.bzl", "pl_cc_binary") -load("@io_bazel_rules_docker//cc:image.bzl", "cc_image") - - -pl_cc_binary( - name = "stirling_standalone", - srcs = glob( - ["*.cc"], - exclude = [ - "**/*_test.cc", - "*_main.cc", - ], - ), - copts = ["-Ibazel-out/k8-fastbuild/bin/third_party/agent-libs_build/include/userspace/libscap", "-Ibazel-out/k8-fastbuild/bin/third_party/agent-libs_build/include/userspace/libsinsp/third-party/jsoncpp", "-Ibazel-out/k8-fastbuild/bin/third_party/agent-libs_build/include/userspace/libsinsp", "-Wno-unused-parameter","-Wno-unused-variable","-Wno-mismatched-tags"], - deps = [ - "//src/probe/utils:cc_library", - "@px//src/common/signal:cc_library", - "//third_party:agent-libs_build", - "@px//src/stirling:cc_library", - "@com_github_jupp0r_prometheus_cpp//pull", - "@px//src/common/metrics:cc_library", - "@px//:px_headers", - ], -) - -load("@io_bazel_rules_docker//container:container.bzl", "container_image") -container_image( - # name = "kp_cc_base_image", - name = "stirling_standalone_image", - base = "@px//:pl_cc_bpf_image", - directory = "/pl", - files = [ - "@kindling_falcolib_probe_tar_gz//file:file", - "//docker:scripts", - ":qianlu", - ], - cmd = ["/pl/docker-entrypoint.sh"], - visibility = ["//visibility:public"], -) - -load("@io_bazel_rules_docker//cc:image.bzl", "cc_image") -cc_image( - name = "qianlu_standalone_image_old", - base = ":kp_cc_base_image", - binary = ":stirling_standalone", -) - -load("@io_bazel_rules_docker//container:container.bzl", "container_push") -container_push( - name = "push_image", - format = "Docker", - image = ":stirling_standalone_image", - registry = "docker.io", - repository = "kindlingproject/kindling-probe", - tag = "stirling-standalone", -) diff --git a/probe/src/probe/standalone/README.md b/probe/src/probe/standalone/README.md deleted file mode 100644 index 5d9bc0485..000000000 --- a/probe/src/probe/standalone/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# Stirling Standalone - diff --git a/probe/src/probe/standalone/standalone.cc b/probe/src/probe/standalone/standalone.cc deleted file mode 100644 index f6dd86c60..000000000 --- a/probe/src/probe/standalone/standalone.cc +++ /dev/null @@ -1,133 +0,0 @@ -#include -#include -#include -#include -#include -#include "src/probe/utils/termination_handler.h" - -px::Status consume_uprobe_data(uint64_t table_id, px::types::TabletID tablet_id, - std::unique_ptr record_batch) { - - std::cout << "[stirling][grpc] table_id:" << table_id << " tablet_id:" << tablet_id << std::endl; - - if (record_batch->empty() || record_batch->at(0)->Size() == 0) { - std::cout << "[stirling][grpc] record_batch is empty. table_id:" << table_id << std::endl; - return px::Status::OK(); - } - - std::cout << "[stirling][grpc] record_batch cols is " << record_batch->size() << " samples:" << record_batch->at(0)->Size() << std::endl; -// -// auto it = m_kindlingEventLists.find(uprobe_converter_); -// KindlingEventList* kindlingEventList; -// if (it == m_kindlingEventLists.end()) { -// kindlingEventList = new KindlingEventList(); -// m_kindlingEventLists[uprobe_converter_] = kindlingEventList; -// } else { -// kindlingEventList = it->second; -// } - if (record_batch->size() != 20) { - std::cout << "[stirling] size not match" << " table_id:" << table_id << " tablet_id:" << tablet_id << std::endl; - return px::Status::OK(); - } - int ids = 0; - for (const auto& col : *record_batch) { - auto received_type = col->data_type(); - std::cout << "ids:" << ids ++ << " types:" << px::types::ToString(received_type) << std::endl; - } - - auto batch_size = record_batch->at(0)->Size(); - for (size_t i = 0; i < batch_size; ++ i ) { - std::cout << "[stirling][grpc] begin to process record " << i << " ... " << std::endl; - int64_t ts = record_batch->at(px::stirling::kHTTPTimeIdx)->Get(i).val; - std::cout << "ts:" << ts << " idx:" << px::stirling::kHTTPTimeIdx << std::endl; - int32_t pid = record_batch->at(px::stirling::kHTTPUPIDIdx)->Get(i).High64(); - std::cout << "pid:" << pid << " idx:" << px::stirling::kHTTPUPIDIdx << std::endl; - std::string remote_addr = record_batch->at(px::stirling::kHTTPRemoteAddrIdx)->Get(i); - std::cout << "remote_addr:" << remote_addr << " idx:" << px::stirling::kHTTPRemoteAddrIdx << std::endl; - int64_t remote_port = record_batch->at(px::stirling::kHTTPRemotePortIdx)->Get(i).val; - std::cout << "remote_port:" << remote_port << " idx:" << px::stirling::kHTTPRemotePortIdx << std::endl; - int64_t trace_role = record_batch->at(px::stirling::kHTTPTraceRoleIdx)->Get(i).val; - std::cout << "trace_role:" << trace_role << " idx:" << px::stirling::kHTTPTraceRoleIdx << std::endl; - int64_t major_version = record_batch->at(px::stirling::kHTTPMajorVersionIdx)->Get(i).val; - std::cout << "major_version:" << major_version << " idx:" << px::stirling::kHTTPMajorVersionIdx << std::endl; - int64_t minor_version = record_batch->at(px::stirling::kHTTPMinorVersionIdx)->Get(i).val; - std::cout << "minor_version:" << minor_version << " idx:" << px::stirling::kHTTPMinorVersionIdx << std::endl; - int64_t content_type = record_batch->at(px::stirling::kHTTPContentTypeIdx)->Get(i).val; - std::cout << "content_type:" << content_type << " idx:" << px::stirling::kHTTPContentTypeIdx << std::endl; - std::string req_headers = record_batch->at(px::stirling::kHTTPReqHeadersIdx)->Get(i); - std::cout << "req_headers:" << req_headers << " idx:" << px::stirling::kHTTPReqHeadersIdx << std::endl; - std::string req_method = record_batch->at(px::stirling::kHTTPReqMethodIdx)->Get(i); - std::cout << "req_method:" << req_method << " idx:" << px::stirling::kHTTPReqMethodIdx << std::endl; - std::string req_path = record_batch->at(px::stirling::kHTTPReqPathIdx)->Get(i); - std::cout << "req_path:" << req_path << std::endl; - std::string req_body = record_batch->at(px::stirling::kHTTPReqBodyIdx)->Get(i); - std::cout << "req_body:" << req_body << std::endl; - int64_t req_body_size = record_batch->at(px::stirling::kHTTPReqBodySizeIdx)->Get(i).val; - std::cout << "req_body_size:" << req_body_size << std::endl; - std::string resp_headers = record_batch->at(px::stirling::kHTTPRespHeadersIdx)->Get(i); - std::cout << "resp_headers:" << resp_headers << std::endl; - int64_t resp_status = record_batch->at(px::stirling::kHTTPRespStatusIdx)->Get(i).val; - std::cout << "resp_status:" << resp_status << std::endl; - std::string resp_body = record_batch->at(px::stirling::kHTTPRespBodyIdx)->Get(i); - std::cout << "resp_body:" << resp_body << std::endl; - int64_t resp_body_size = record_batch->at(px::stirling::kHTTPRespBodySizeIdx)->Get(i).val; - std::cout << "resp_body_size:" << resp_body_size << std::endl; - int64_t latency = record_batch->at(px::stirling::kHTTPLatencyIdx)->Get(i).val; - std::cout << "latency:" << latency << std::endl; - - std::cout << "[stirling][grpc] ts:" << ts << " pid:" << pid << " remote_addr:" << remote_addr << " remote_port:" << remote_port << " trace_role:" << trace_role << std::endl; - -// struct grpc_event_t gevt; -// gevt.timestamp = ts; -// gevt.pid = pid; -// gevt.remote_addr = remote_addr; -// gevt.remote_port = remote_port; -// gevt.trace_role = trace_role; -// gevt.req_headers = req_headers; -// gevt.req_method = req_method; -// gevt.req_path = req_path; -// gevt.req_body = req_body; -// gevt.req_body_size = req_body_size; -// gevt.resp_status = resp_status; -// gevt.resp_body = resp_body; -// gevt.resp_body_size = resp_body_size; -// gevt.latency = latency; - -// auto tinfo = m_inspector->get_thread_ref(pid, true, true, true); -// if (tinfo) { -// gevt.container_id = tinfo->m_container_id; -// std::cout << "[stirling] find container_id for pid:" << pid << " container_id:" << gevt.container_id << std::endl; -// } else { -// std::cout << "[stirling] cannot find container_id for pid:" << pid << std::endl; -// } - -// event_mutex_.lock(); -// KindlingEvent *kindlingEvent = kindlingEventList->add_kindling_event_list(); -// uprobe_converter_->convert(kindlingEvent, &gevt); -// event_mutex_.unlock(); - } - return px::Status::OK(); -} - -int main(int argc, char** argv) { - px::EnvironmentGuard env_guard(&argc, argv); - - TerminationHandler::InstallSignalHandlers(); - - // init bcc & stirling - auto stirling = px::stirling::Stirling::Create(px::stirling::CreateSourceRegistry(px::stirling::GetSourceNamesForGroup(px::stirling::SourceConnectorGroup::kTracers)) - .ConsumeValueOrDie()); - TerminationHandler::set_stirling(stirling.get()); - std::cout << "hello, stirling!" << std::endl; - stirling->RegisterDataPushCallback(consume_uprobe_data); - std::cout << "register data push callback done." << std::endl; - auto status = stirling->RunAsThread(); - std::cout << status.ok() << "begin to run core" << std::endl; - - while (true) { - sleep(100); - } - - stirling->Stop(); - return 0; -} diff --git a/probe/src/probe/utils/BUILD.bazel b/probe/src/probe/utils/BUILD.bazel deleted file mode 100644 index c462718c6..000000000 --- a/probe/src/probe/utils/BUILD.bazel +++ /dev/null @@ -1,24 +0,0 @@ -load("@px//bazel:pl_build_system.bzl", "pl_cc_library") - -package(default_visibility = ["//visibility:public"]) - -pl_cc_library( - name = "cc_library", - srcs = glob( - [ - "*.h", - "*.cc", - ], - exclude = [ - "**/*_test.cc", - "**/*_benchmark.cc", - ], - ), - hdrs = ["shared_unordered_map.h"], - copts = ["-Ibazel-out/k8-fastbuild/bin/third_party/agent-libs_build/include/userspace/libscap", "-Ibazel-out/k8-fastbuild/bin/third_party/agent-libs_build/include/userspace/libsinsp/third-party/jsoncpp", "-Ibazel-out/k8-fastbuild/bin/third_party/agent-libs_build/include/userspace/libsinsp", "-Wno-mismatched-tags"], - deps = [ - "@px//src/common/signal:cc_library", - "@px//:px_headers", - "//third_party:agent-libs_build", - ], -) diff --git a/probe/src/probe/utils/shared_unordered_map.h b/probe/src/probe/utils/shared_unordered_map.h deleted file mode 100644 index acee25bc6..000000000 --- a/probe/src/probe/utils/shared_unordered_map.h +++ /dev/null @@ -1,135 +0,0 @@ -#ifndef SHAREDUNORDERMAP_H -#define SHAREDUNORDERMAP_H - -#include -#include -#include - -template -class shared_unordered_map { -public: - typedef typename std::unordered_map::iterator iterator_; - - shared_unordered_map(); - - ~shared_unordered_map(); - - int size(); - - bool empty(); - - void erase(iterator_); - - void erase(T key); - - iterator_ begin(); - - iterator_ end(); - - iterator_ find(T key); - - void insert(T key, U value); - - typename std::unordered_map *rangeStart(); - - void rangeEnd(); - -private: - std::condition_variable cond_; - std::mutex mutex_; - std::unordered_map *unordered_map1; - std::unordered_map *unordered_map2; - -}; - -template -shared_unordered_map::shared_unordered_map() { - unordered_map1 = new std::unordered_map(); -} - -template -shared_unordered_map::~shared_unordered_map() = default; - -template -int shared_unordered_map::size() { - std::unique_lock mlock(mutex_); - int size = unordered_map1->size(); - mlock.unlock(); - return size; -} - -template -bool shared_unordered_map::empty() { - return this->size() == 0; -} - -template -void shared_unordered_map::erase(iterator_ index) { - std::unique_lock mlock(mutex_); - while (unordered_map1->empty()) { - cond_.wait(mlock); - } - unordered_map1->erase(index); -} - -template -typename std::unordered_map::iterator shared_unordered_map::begin() { - std::unique_lock mlock(mutex_); - iterator_ index = unordered_map1->begin(); - mlock.unlock(); - return index; -} - -template -typename std::unordered_map::iterator shared_unordered_map::end() { - std::unique_lock mlock(mutex_); - iterator_ index = unordered_map1->end(); - mlock.unlock(); - return index; -} - -template -void shared_unordered_map::insert(T key, U value) { - std::unique_lock mlock(mutex_); - unordered_map1->insert({key, value}); - mlock.unlock(); - cond_.notify_one(); -} - -template -typename std::unordered_map::iterator shared_unordered_map::find(T key) { - std::unique_lock mlock(mutex_); - typename std::unordered_map::iterator index = unordered_map1->find(key); - mlock.unlock(); - return index; -} - -template -void shared_unordered_map::rangeEnd() { - delete unordered_map2; -} - -template -typename std::unordered_map *shared_unordered_map::rangeStart() { - unordered_map2 = new std::unordered_map(); - std::unique_lock mlock(mutex_); - iterator_ index = unordered_map1->begin(); - while (index != unordered_map1->end()) { - unordered_map2->insert({index->first, index->second}); - index++; - } - mlock.unlock(); - return unordered_map2; -} - -template -void shared_unordered_map::erase(T key) { - std::unique_lock mlock(mutex_); - while (unordered_map1->empty()) { - cond_.wait(mlock); - } - unordered_map1->erase(key); -} - - -#endif //SHAREDUNORDERMAP_H diff --git a/probe/src/probe/utils/termination_handler.h b/probe/src/probe/utils/termination_handler.h deleted file mode 100644 index 0956e5918..000000000 --- a/probe/src/probe/utils/termination_handler.h +++ /dev/null @@ -1,46 +0,0 @@ -// -// Created by 千陆 on 2022/1/6. -// - -#ifndef KINDLING_PROBE_KINDLING_MANAGER_H -#define KINDLING_PROBE_KINDLING_MANAGER_H - -#include -#include -#include -#include "sinsp.h" -#include - -class TerminationHandler { -public: - static constexpr auto kSignals = px::MakeArray(SIGINT, SIGQUIT, SIGTERM, SIGHUP); - - static void InstallSignalHandlers() { - for (size_t i = 0; i < kSignals.size(); ++i) { - signal(kSignals[i], TerminationHandler::OnTerminate); - } - } - - static void set_stirling(px::stirling::Stirling* stirling_) { m_stirling_ = stirling_; } - static void set_sinsp(sinsp* sinsp_) { m_sinsp_ = sinsp_; } - - static void OnTerminate(int signum) { - if (m_sinsp_ != nullptr) { - LOG(INFO) << "Trying to gracefully stop sinsp"; - m_sinsp_->close(); - } - if (m_stirling_ != nullptr) { - LOG(INFO) << "Trying to gracefully stop stirling"; - m_stirling_->Stop(); - } - exit(signum); - } - -private: - inline static px::stirling::Stirling* m_stirling_ = nullptr; - inline static sinsp* m_sinsp_ = nullptr; -}; - - - -#endif //KINDLING_PROBE_KINDLING_MANAGER_H diff --git a/probe/third_party/BUILD.bazel b/probe/third_party/BUILD.bazel deleted file mode 100644 index ec3f36a6f..000000000 --- a/probe/third_party/BUILD.bazel +++ /dev/null @@ -1,71 +0,0 @@ -load("@rules_cc//cc:defs.bzl", "cc_library") -load("@rules_foreign_cc//foreign_cc:defs.bzl", "cmake", "configure_make", "make") - -package(default_visibility = ["//visibility:public"]) - - -configure_make( - name = "zmq_build", - autogen = True, - configure_in_place = True, - args = ["-j$(nproc)","-l$(nproc)"], - lib_source = "@lib_zmq//:all", - out_static_libs = ["libzmq.a"], -) - -cmake( - name = "agent-libs_build", - tags = ["requires-network","--sandbox_default_allow_network"], - cache_entries = { - "BUILD_LIBSCAP_EXAMPLES": "OFF", - "MINIMAL_BUILD": "ON", - "CREATE_TEST_TARGETS": "OFF", - "BUILD_LIBSINSP_EXAMPLES": "ON", - "CMAKE_C_COMPILER": "/usr/bin/gcc-10", - "CMAKE_CXX_COMPILER": "/usr/bin/g++-10", - "BUILD_DRIVER": "OFF", - "CMAKE_TOOLCHAIN_FILE" : "", - }, - lib_source = "@agent-libs//:all", - postfix_script = "cp ./libsinsp/libsinsp.a $INSTALLDIR/lib/libsinsp.a && cp ./tbb-prefix/src/tbb/build/lib_release/libtbb.a $INSTALLDIR/lib/libtbb.a && cp ./tbb-prefix/src/tbb/build/lib_release/libtbbmalloc.a $INSTALLDIR/lib/libtbbmalloc.a && cp ./libscap/libscap.a $INSTALLDIR/lib/libscap.a && mkdir $INSTALLDIR/include/userspace \ - && mkdir $INSTALLDIR/include/userspace/async \ - && mkdir $INSTALLDIR/include/userspace/common \ - && mkdir $INSTALLDIR/include/userspace/libscap \ - && mkdir $INSTALLDIR/include/userspace/libsinsp \ - && cp $EXT_BUILD_ROOT/external/agent-libs/userspace/async/*.h $INSTALLDIR/include/userspace/async \ - && cp $EXT_BUILD_ROOT/external/agent-libs/userspace/common/*.h $INSTALLDIR/include/userspace/common \ - && cp $EXT_BUILD_ROOT/external/agent-libs/userspace/libscap/*.h $INSTALLDIR/include/userspace/libscap \ - && cp $EXT_BUILD_ROOT/external/agent-libs/userspace/libsinsp/*.h $INSTALLDIR/include/userspace/libsinsp \ - && mkdir $INSTALLDIR/include/userspace/libsinsp/container_engine \ - && cp $EXT_BUILD_ROOT/external/agent-libs/userspace/libsinsp/container_engine/*.h $INSTALLDIR/include/userspace/libsinsp/container_engine \ - && mkdir $INSTALLDIR/include/userspace/libsinsp/container_engine/docker \ - && cp $EXT_BUILD_ROOT/external/agent-libs/userspace/libsinsp/container_engine/docker/*.h $INSTALLDIR/include/userspace/libsinsp/container_engine/docker \ - && mkdir $INSTALLDIR/include/userspace/libsinsp/include \ - && cp $EXT_BUILD_ROOT/external/agent-libs/userspace/libsinsp/include/*.h $INSTALLDIR/include/userspace/libsinsp/include \ - && mkdir $INSTALLDIR/include/userspace/libsinsp/third-party \ - && cp $EXT_BUILD_ROOT/external/agent-libs/userspace/libsinsp/third-party/*.h $INSTALLDIR/include/userspace/libsinsp/third-party \ - && mkdir $INSTALLDIR/include/userspace/libsinsp/third-party/jsoncpp \ - && mkdir $INSTALLDIR/include/userspace/libsinsp/third-party/jsoncpp/json \ - && cp $EXT_BUILD_ROOT/external/agent-libs/userspace/libsinsp/third-party/jsoncpp/json/*.h $INSTALLDIR/include/userspace/libsinsp/third-party/jsoncpp/json \ - && mkdir $INSTALLDIR/include/userspace/libscap/compat \ - && cp $EXT_BUILD_ROOT/external/agent-libs/userspace/libscap/compat/*.h $INSTALLDIR/include/userspace/libscap/compat \ - && mkdir $INSTALLDIR/include/common \ - && cp $EXT_BUILD_ROOT/external/agent-libs/common/*.h $INSTALLDIR/include/common \ - && mkdir $INSTALLDIR/include/tbb \ - && cp ./tbb-prefix/src/tbb/include/tbb/*.h $INSTALLDIR/include/tbb \ - && mkdir $INSTALLDIR/include/tbb/compat \ - && cp ./tbb-prefix/src/tbb/include/tbb/compat/*.h $INSTALLDIR/include/tbb/compat \ - && mkdir $INSTALLDIR/include/tbb/internal \ - && cp ./tbb-prefix/src/tbb/include/tbb/internal/*.h $INSTALLDIR/include/tbb/internal \ - && mkdir $INSTALLDIR/include/tbb/machine \ - && cp ./tbb-prefix/src/tbb/include/tbb/machine/*.h $INSTALLDIR/include/tbb/machine \ - && mkdir $INSTALLDIR/include/driver \ - && mkdir $INSTALLDIR/include/driver/bpf \ - && cp $EXT_BUILD_ROOT/external/agent-libs/driver/*.h $INSTALLDIR/include/driver \ - && cp $EXT_BUILD_ROOT/external/agent-libs/driver/bpf/*.h $INSTALLDIR/include/driver/bpf \ - ", - out_static_libs = ["libsinsp.a", "libscap.a", "libtbb.a", "libtbbmalloc.a"], -) - - -