From 0b53deb60e5b7f7d245a80cff39cdd96d1d58272 Mon Sep 17 00:00:00 2001 From: Paladz Date: Mon, 26 Nov 2018 18:21:36 +0800 Subject: [PATCH] delete the vendor (#1495) --- p2p/connection/connection_test.go | 3 - vendor/github.com/go-kit/kit/.gitignore | 45 - vendor/github.com/go-kit/kit/.travis.yml | 16 - vendor/github.com/go-kit/kit/CONTRIBUTING.md | 18 - vendor/github.com/go-kit/kit/LICENSE | 22 - vendor/github.com/go-kit/kit/README.md | 119 --- vendor/github.com/go-kit/kit/ROADMAP.md | 17 - vendor/github.com/go-kit/kit/auth/basic/README.md | 20 - .../github.com/go-kit/kit/auth/basic/middleware.go | 94 -- .../go-kit/kit/auth/basic/middleware_test.go | 52 - vendor/github.com/go-kit/kit/auth/jwt/README.md | 122 --- .../github.com/go-kit/kit/auth/jwt/middleware.go | 143 --- .../go-kit/kit/auth/jwt/middleware_test.go | 221 ---- vendor/github.com/go-kit/kit/auth/jwt/transport.go | 89 -- .../go-kit/kit/auth/jwt/transport_test.go | 125 --- vendor/github.com/go-kit/kit/circle.yml | 27 - vendor/github.com/go-kit/kit/circuitbreaker/doc.go | 10 - .../go-kit/kit/circuitbreaker/gobreaker.go | 22 - .../go-kit/kit/circuitbreaker/gobreaker_test.go | 19 - .../go-kit/kit/circuitbreaker/handy_breaker.go | 38 - .../kit/circuitbreaker/handy_breaker_test.go | 20 - .../go-kit/kit/circuitbreaker/hystrix.go | 31 - .../go-kit/kit/circuitbreaker/hystrix_test.go | 40 - .../go-kit/kit/circuitbreaker/util_test.go | 75 -- vendor/github.com/go-kit/kit/coveralls.bash | 31 - .../go-kit/kit/docker-compose-integration.yml | 22 - vendor/github.com/go-kit/kit/endpoint/doc.go | 5 - vendor/github.com/go-kit/kit/endpoint/endpoint.go | 28 - .../go-kit/kit/endpoint/endpoint_example_test.go | 49 - vendor/github.com/go-kit/kit/examples/README.md | 5 - .../go-kit/kit/examples/addsvc/README.md | 17 - .../kit/examples/addsvc/cmd/addcli/addcli.go | 198 ---- .../kit/examples/addsvc/cmd/addsvc/addsvc.go | 279 ----- .../kit/examples/addsvc/cmd/addsvc/pact_test.go | 55 - .../kit/examples/addsvc/cmd/addsvc/wiring_test.go | 40 - .../go-kit/kit/examples/addsvc/pb/addsvc.pb.go | 270 ----- .../go-kit/kit/examples/addsvc/pb/addsvc.proto | 36 - .../go-kit/kit/examples/addsvc/pb/compile.sh | 14 - .../examples/addsvc/pkg/addendpoint/middleware.go | 43 - .../kit/examples/addsvc/pkg/addendpoint/set.go | 130 --- .../examples/addsvc/pkg/addservice/middleware.go | 69 -- .../kit/examples/addsvc/pkg/addservice/service.go | 71 -- .../kit/examples/addsvc/pkg/addtransport/grpc.go | 210 ---- .../kit/examples/addsvc/pkg/addtransport/http.go | 220 ---- .../kit/examples/addsvc/pkg/addtransport/thrift.go | 120 --- .../kit/examples/addsvc/thrift/addsvc.thrift | 14 - .../go-kit/kit/examples/addsvc/thrift/compile.sh | 5 - .../thrift/gen-go/addsvc/GoUnusedProtection__.go | 7 - .../add_service-remote/add_service-remote.go | 159 --- .../addsvc/thrift/gen-go/addsvc/addsvc-consts.go | 24 - .../examples/addsvc/thrift/gen-go/addsvc/addsvc.go | 1065 -------------------- .../go-kit/kit/examples/apigateway/main.go | 285 ------ .../go-kit/kit/examples/profilesvc/README.md | 4 - .../kit/examples/profilesvc/client/client.go | 121 --- .../kit/examples/profilesvc/cmd/profilesvc/main.go | 52 - .../go-kit/kit/examples/profilesvc/endpoints.go | 387 ------- .../go-kit/kit/examples/profilesvc/middlewares.go | 88 -- .../go-kit/kit/examples/profilesvc/service.go | 185 ---- .../go-kit/kit/examples/profilesvc/transport.go | 400 -------- .../go-kit/kit/examples/shipping/README.md | 25 - .../kit/examples/shipping/booking/endpoint.go | 139 --- .../kit/examples/shipping/booking/instrumenting.go | 88 -- .../kit/examples/shipping/booking/logging.go | 102 -- .../kit/examples/shipping/booking/service.go | 197 ---- .../kit/examples/shipping/booking/transport.go | 194 ---- .../go-kit/kit/examples/shipping/cargo/cargo.go | 137 --- .../go-kit/kit/examples/shipping/cargo/delivery.go | 174 ---- .../go-kit/kit/examples/shipping/cargo/handling.go | 121 --- .../kit/examples/shipping/cargo/itinerary.go | 91 -- .../kit/examples/shipping/handling/endpoint.go | 34 - .../examples/shipping/handling/instrumenting.go | 37 - .../kit/examples/shipping/handling/logging.go | 38 - .../kit/examples/shipping/handling/service.go | 76 -- .../kit/examples/shipping/handling/transport.go | 100 -- .../go-kit/kit/examples/shipping/inmem/inmem.go | 142 --- .../kit/examples/shipping/inspection/inspection.go | 53 - .../kit/examples/shipping/location/location.go | 29 - .../examples/shipping/location/sample_locations.go | 27 - .../go-kit/kit/examples/shipping/main.go | 200 ---- .../kit/examples/shipping/routing/proxying.go | 117 --- .../kit/examples/shipping/routing/routing.go | 15 - .../kit/examples/shipping/tracking/endpoint.go | 26 - .../examples/shipping/tracking/instrumenting.go | 31 - .../kit/examples/shipping/tracking/logging.go | 24 - .../kit/examples/shipping/tracking/service.go | 163 --- .../kit/examples/shipping/tracking/transport.go | 74 -- .../kit/examples/shipping/voyage/sample_voyages.go | 40 - .../go-kit/kit/examples/shipping/voyage/voyage.go | 44 - .../go-kit/kit/examples/stringsvc1/main.go | 111 -- .../kit/examples/stringsvc2/instrumenting.go | 38 - .../go-kit/kit/examples/stringsvc2/logging.go | 41 - .../go-kit/kit/examples/stringsvc2/main.go | 60 -- .../go-kit/kit/examples/stringsvc2/service.go | 28 - .../go-kit/kit/examples/stringsvc2/transport.go | 65 -- .../kit/examples/stringsvc3/instrumenting.go | 48 - .../go-kit/kit/examples/stringsvc3/logging.go | 47 - .../go-kit/kit/examples/stringsvc3/main.go | 70 -- .../go-kit/kit/examples/stringsvc3/proxying.go | 117 --- .../go-kit/kit/examples/stringsvc3/service.go | 31 - .../go-kit/kit/examples/stringsvc3/transport.go | 84 -- vendor/github.com/go-kit/kit/lint | 26 - vendor/github.com/go-kit/kit/log/README.md | 147 --- vendor/github.com/go-kit/kit/log/benchmark_test.go | 21 - .../github.com/go-kit/kit/log/concurrency_test.go | 40 - .../go-kit/kit/log/deprecated_levels/levels.go | 127 --- .../kit/log/deprecated_levels/levels_test.go | 65 -- vendor/github.com/go-kit/kit/log/doc.go | 116 --- vendor/github.com/go-kit/kit/log/example_test.go | 137 --- vendor/github.com/go-kit/kit/log/json_logger.go | 89 -- .../github.com/go-kit/kit/log/json_logger_test.go | 162 --- .../go-kit/kit/log/level/benchmark_test.go | 72 -- vendor/github.com/go-kit/kit/log/level/doc.go | 22 - .../go-kit/kit/log/level/example_test.go | 25 - vendor/github.com/go-kit/kit/log/level/level.go | 205 ---- .../github.com/go-kit/kit/log/level/level_test.go | 235 ----- vendor/github.com/go-kit/kit/log/log.go | 135 --- vendor/github.com/go-kit/kit/log/log_test.go | 191 ---- vendor/github.com/go-kit/kit/log/logfmt_logger.go | 62 -- .../go-kit/kit/log/logfmt_logger_test.go | 57 -- vendor/github.com/go-kit/kit/log/nop_logger.go | 8 - .../github.com/go-kit/kit/log/nop_logger_test.go | 26 - vendor/github.com/go-kit/kit/log/stdlib.go | 116 --- vendor/github.com/go-kit/kit/log/stdlib_test.go | 205 ---- vendor/github.com/go-kit/kit/log/sync.go | 116 --- vendor/github.com/go-kit/kit/log/sync_test.go | 83 -- vendor/github.com/go-kit/kit/log/term/LICENSE | 21 - .../github.com/go-kit/kit/log/term/colorlogger.go | 144 --- .../go-kit/kit/log/term/colorlogger_test.go | 88 -- .../go-kit/kit/log/term/colorwriter_others.go | 12 - .../go-kit/kit/log/term/colorwriter_windows.go | 190 ---- .../github.com/go-kit/kit/log/term/example_test.go | 57 -- vendor/github.com/go-kit/kit/log/term/term.go | 22 - .../go-kit/kit/log/term/terminal_appengine.go | 15 - .../go-kit/kit/log/term/terminal_darwin.go | 10 - .../go-kit/kit/log/term/terminal_freebsd.go | 7 - .../go-kit/kit/log/term/terminal_linux.go | 12 - .../go-kit/kit/log/term/terminal_notwindows.go | 25 - .../go-kit/kit/log/term/terminal_openbsd.go | 5 - .../go-kit/kit/log/term/terminal_windows.go | 102 -- .../go-kit/kit/log/term/terminal_windows_test.go | 71 -- vendor/github.com/go-kit/kit/log/value.go | 102 -- vendor/github.com/go-kit/kit/log/value_test.go | 150 --- vendor/github.com/go-kit/kit/metrics/README.md | 97 -- .../go-kit/kit/metrics/cloudwatch/cloudwatch.go | 343 ------- .../kit/metrics/cloudwatch/cloudwatch_test.go | 244 ----- vendor/github.com/go-kit/kit/metrics/debug.test | Bin 3346464 -> 0 bytes .../go-kit/kit/metrics/discard/discard.go | 40 - vendor/github.com/go-kit/kit/metrics/doc.go | 97 -- .../go-kit/kit/metrics/dogstatsd/dogstatsd.go | 389 ------- .../go-kit/kit/metrics/dogstatsd/dogstatsd_test.go | 90 -- .../github.com/go-kit/kit/metrics/expvar/expvar.go | 94 -- .../go-kit/kit/metrics/expvar/expvar_test.go | 38 - .../go-kit/kit/metrics/generic/generic.go | 247 ----- .../go-kit/kit/metrics/generic/generic_test.go | 109 -- .../go-kit/kit/metrics/graphite/graphite.go | 203 ---- .../go-kit/kit/metrics/graphite/graphite_test.go | 63 -- .../go-kit/kit/metrics/influx/example_test.go | 108 -- .../github.com/go-kit/kit/metrics/influx/influx.go | 267 ----- .../go-kit/kit/metrics/influx/influx_test.go | 125 --- .../go-kit/kit/metrics/internal/lv/labelvalues.go | 14 - .../kit/metrics/internal/lv/labelvalues_test.go | 22 - .../go-kit/kit/metrics/internal/lv/space.go | 145 --- .../go-kit/kit/metrics/internal/lv/space_test.go | 86 -- .../go-kit/kit/metrics/internal/ratemap/ratemap.go | 40 - vendor/github.com/go-kit/kit/metrics/metrics.go | 25 - .../github.com/go-kit/kit/metrics/multi/multi.go | 86 -- .../go-kit/kit/metrics/multi/multi_test.go | 96 -- vendor/github.com/go-kit/kit/metrics/pcp/pcp.go | 125 --- .../github.com/go-kit/kit/metrics/pcp/pcp_test.go | 72 -- .../go-kit/kit/metrics/prometheus/prometheus.go | 165 --- .../kit/metrics/prometheus/prometheus_test.go | 214 ---- .../go-kit/kit/metrics/provider/discard.go | 24 - .../go-kit/kit/metrics/provider/dogstatsd.go | 43 - .../go-kit/kit/metrics/provider/expvar.go | 31 - .../go-kit/kit/metrics/provider/graphite.go | 41 - .../go-kit/kit/metrics/provider/influx.go | 40 - .../go-kit/kit/metrics/provider/prometheus.go | 63 -- .../go-kit/kit/metrics/provider/provider.go | 42 - .../go-kit/kit/metrics/provider/statsd.go | 43 - .../github.com/go-kit/kit/metrics/statsd/statsd.go | 239 ----- .../go-kit/kit/metrics/statsd/statsd_test.go | 66 -- .../go-kit/kit/metrics/teststat/buffers.go | 65 -- .../go-kit/kit/metrics/teststat/populate.go | 72 -- .../go-kit/kit/metrics/teststat/teststat.go | 119 --- vendor/github.com/go-kit/kit/metrics/timer.go | 36 - vendor/github.com/go-kit/kit/metrics/timer_test.go | 58 -- .../go-kit/kit/ratelimit/token_bucket.go | 72 -- .../go-kit/kit/ratelimit/token_bucket_test.go | 46 - vendor/github.com/go-kit/kit/sd/benchmark_test.go | 29 - vendor/github.com/go-kit/kit/sd/consul/client.go | 39 - .../github.com/go-kit/kit/sd/consul/client_test.go | 156 --- vendor/github.com/go-kit/kit/sd/consul/doc.go | 2 - .../github.com/go-kit/kit/sd/consul/instancer.go | 167 --- .../go-kit/kit/sd/consul/instancer_test.go | 133 --- .../go-kit/kit/sd/consul/integration_test.go | 86 -- .../github.com/go-kit/kit/sd/consul/registrar.go | 44 - .../go-kit/kit/sd/consul/registrar_test.go | 27 - vendor/github.com/go-kit/kit/sd/dnssrv/doc.go | 2 - .../github.com/go-kit/kit/sd/dnssrv/instancer.go | 103 -- .../go-kit/kit/sd/dnssrv/instancer_test.go | 73 -- vendor/github.com/go-kit/kit/sd/dnssrv/lookup.go | 7 - vendor/github.com/go-kit/kit/sd/doc.go | 6 - vendor/github.com/go-kit/kit/sd/endpoint_cache.go | 143 --- .../go-kit/kit/sd/endpoint_cache_test.go | 180 ---- vendor/github.com/go-kit/kit/sd/endpointer.go | 90 -- vendor/github.com/go-kit/kit/sd/endpointer_test.go | 85 -- vendor/github.com/go-kit/kit/sd/etcd/client.go | 177 ---- .../github.com/go-kit/kit/sd/etcd/client_test.go | 314 ------ vendor/github.com/go-kit/kit/sd/etcd/doc.go | 4 - .../github.com/go-kit/kit/sd/etcd/example_test.go | 69 -- vendor/github.com/go-kit/kit/sd/etcd/instancer.go | 75 -- .../go-kit/kit/sd/etcd/instancer_test.go | 70 -- .../go-kit/kit/sd/etcd/integration_test.go | 124 --- vendor/github.com/go-kit/kit/sd/etcd/registrar.go | 120 --- .../go-kit/kit/sd/etcd/registrar_test.go | 111 -- vendor/github.com/go-kit/kit/sd/eureka/doc.go | 2 - .../github.com/go-kit/kit/sd/eureka/instancer.go | 105 -- .../go-kit/kit/sd/eureka/instancer_test.go | 92 -- .../go-kit/kit/sd/eureka/integration_test.go | 91 -- .../github.com/go-kit/kit/sd/eureka/registrar.go | 143 --- .../go-kit/kit/sd/eureka/registrar_test.go | 102 -- .../github.com/go-kit/kit/sd/eureka/util_test.go | 152 --- vendor/github.com/go-kit/kit/sd/factory.go | 17 - vendor/github.com/go-kit/kit/sd/instancer.go | 38 - .../go-kit/kit/sd/internal/instance/cache.go | 83 -- .../go-kit/kit/sd/internal/instance/cache_test.go | 77 -- vendor/github.com/go-kit/kit/sd/lb/balancer.go | 15 - vendor/github.com/go-kit/kit/sd/lb/doc.go | 4 - vendor/github.com/go-kit/kit/sd/lb/random.go | 32 - vendor/github.com/go-kit/kit/sd/lb/random_test.go | 52 - vendor/github.com/go-kit/kit/sd/lb/retry.go | 117 --- vendor/github.com/go-kit/kit/sd/lb/retry_test.go | 141 --- vendor/github.com/go-kit/kit/sd/lb/round_robin.go | 34 - .../go-kit/kit/sd/lb/round_robin_test.go | 95 -- vendor/github.com/go-kit/kit/sd/registrar.go | 13 - vendor/github.com/go-kit/kit/sd/zk/client.go | 273 ----- vendor/github.com/go-kit/kit/sd/zk/client_test.go | 157 --- vendor/github.com/go-kit/kit/sd/zk/doc.go | 2 - vendor/github.com/go-kit/kit/sd/zk/instancer.go | 95 -- .../github.com/go-kit/kit/sd/zk/instancer_test.go | 125 --- .../go-kit/kit/sd/zk/integration_test.go | 201 ---- vendor/github.com/go-kit/kit/sd/zk/logwrapper.go | 27 - vendor/github.com/go-kit/kit/sd/zk/registrar.go | 51 - vendor/github.com/go-kit/kit/sd/zk/util_test.go | 134 --- vendor/github.com/go-kit/kit/tracing/README.md | 60 -- vendor/github.com/go-kit/kit/tracing/doc.go | 8 - .../go-kit/kit/tracing/opentracing/doc.go | 4 - .../go-kit/kit/tracing/opentracing/endpoint.go | 55 - .../kit/tracing/opentracing/endpoint_test.go | 117 --- .../go-kit/kit/tracing/opentracing/grpc.go | 70 -- .../go-kit/kit/tracing/opentracing/grpc_test.go | 64 -- .../go-kit/kit/tracing/opentracing/http.go | 71 -- .../go-kit/kit/tracing/opentracing/http_test.go | 109 -- .../github.com/go-kit/kit/tracing/zipkin/README.md | 178 ---- vendor/github.com/go-kit/kit/transport/doc.go | 2 - .../github.com/go-kit/kit/transport/grpc/README.md | 54 - .../go-kit/kit/transport/grpc/_grpc_test/client.go | 50 - .../transport/grpc/_grpc_test/context_metadata.go | 141 --- .../kit/transport/grpc/_grpc_test/pb/generate.go | 3 - .../kit/transport/grpc/_grpc_test/pb/test.pb.go | 167 --- .../kit/transport/grpc/_grpc_test/pb/test.proto | 16 - .../transport/grpc/_grpc_test/request_response.go | 27 - .../go-kit/kit/transport/grpc/_grpc_test/server.go | 70 -- .../kit/transport/grpc/_grpc_test/service.go | 17 - .../github.com/go-kit/kit/transport/grpc/client.go | 115 --- .../go-kit/kit/transport/grpc/client_test.go | 61 -- vendor/github.com/go-kit/kit/transport/grpc/doc.go | 2 - .../go-kit/kit/transport/grpc/encode_decode.go | 29 - .../kit/transport/grpc/request_response_funcs.go | 76 -- .../github.com/go-kit/kit/transport/grpc/server.go | 123 --- .../github.com/go-kit/kit/transport/http/client.go | 179 ---- .../go-kit/kit/transport/http/client_test.go | 267 ----- vendor/github.com/go-kit/kit/transport/http/doc.go | 2 - .../go-kit/kit/transport/http/encode_decode.go | 30 - .../go-kit/kit/transport/http/example_test.go | 36 - .../kit/transport/http/request_response_funcs.go | 133 --- .../transport/http/request_response_funcs_test.go | 30 - .../github.com/go-kit/kit/transport/http/server.go | 221 ---- .../go-kit/kit/transport/http/server_test.go | 349 ------- .../github.com/go-kit/kit/transport/httprp/doc.go | 4 - .../go-kit/kit/transport/httprp/server.go | 57 -- .../go-kit/kit/transport/httprp/server_test.go | 158 --- .../go-kit/kit/transport/netrpc/README.md | 14 - .../go-kit/kit/transport/thrift/README.md | 32 - vendor/github.com/go-kit/kit/update_deps.bash | 28 - vendor/github.com/go-kit/kit/util/README.md | 5 - vendor/github.com/go-kit/kit/util/conn/doc.go | 2 - vendor/github.com/go-kit/kit/util/conn/manager.go | 145 --- .../go-kit/kit/util/conn/manager_test.go | 159 --- vendor/github.com/tendermint/tmlibs/log/logger.go | 20 - .../tendermint/tmlibs/log/testing_logger.go | 49 - .../tendermint/tmlibs/log/tm_json_logger.go | 15 - .../github.com/tendermint/tmlibs/log/tm_logger.go | 83 -- .../tendermint/tmlibs/log/tmfmt_logger.go | 127 --- 294 files changed, 26379 deletions(-) delete mode 100644 vendor/github.com/go-kit/kit/.gitignore delete mode 100644 vendor/github.com/go-kit/kit/.travis.yml delete mode 100644 vendor/github.com/go-kit/kit/CONTRIBUTING.md delete mode 100644 vendor/github.com/go-kit/kit/LICENSE delete mode 100644 vendor/github.com/go-kit/kit/README.md delete mode 100644 vendor/github.com/go-kit/kit/ROADMAP.md delete mode 100644 vendor/github.com/go-kit/kit/auth/basic/README.md delete mode 100644 vendor/github.com/go-kit/kit/auth/basic/middleware.go delete mode 100644 vendor/github.com/go-kit/kit/auth/basic/middleware_test.go delete mode 100644 vendor/github.com/go-kit/kit/auth/jwt/README.md delete mode 100644 vendor/github.com/go-kit/kit/auth/jwt/middleware.go delete mode 100644 vendor/github.com/go-kit/kit/auth/jwt/middleware_test.go delete mode 100644 vendor/github.com/go-kit/kit/auth/jwt/transport.go delete mode 100644 vendor/github.com/go-kit/kit/auth/jwt/transport_test.go delete mode 100644 vendor/github.com/go-kit/kit/circle.yml delete mode 100644 vendor/github.com/go-kit/kit/circuitbreaker/doc.go delete mode 100644 vendor/github.com/go-kit/kit/circuitbreaker/gobreaker.go delete mode 100644 vendor/github.com/go-kit/kit/circuitbreaker/gobreaker_test.go delete mode 100644 vendor/github.com/go-kit/kit/circuitbreaker/handy_breaker.go delete mode 100644 vendor/github.com/go-kit/kit/circuitbreaker/handy_breaker_test.go delete mode 100644 vendor/github.com/go-kit/kit/circuitbreaker/hystrix.go delete mode 100644 vendor/github.com/go-kit/kit/circuitbreaker/hystrix_test.go delete mode 100644 vendor/github.com/go-kit/kit/circuitbreaker/util_test.go delete mode 100755 vendor/github.com/go-kit/kit/coveralls.bash delete mode 100644 vendor/github.com/go-kit/kit/docker-compose-integration.yml delete mode 100644 vendor/github.com/go-kit/kit/endpoint/doc.go delete mode 100644 vendor/github.com/go-kit/kit/endpoint/endpoint.go delete mode 100644 vendor/github.com/go-kit/kit/endpoint/endpoint_example_test.go delete mode 100644 vendor/github.com/go-kit/kit/examples/README.md delete mode 100644 vendor/github.com/go-kit/kit/examples/addsvc/README.md delete mode 100644 vendor/github.com/go-kit/kit/examples/addsvc/cmd/addcli/addcli.go delete mode 100644 vendor/github.com/go-kit/kit/examples/addsvc/cmd/addsvc/addsvc.go delete mode 100644 vendor/github.com/go-kit/kit/examples/addsvc/cmd/addsvc/pact_test.go delete mode 100644 vendor/github.com/go-kit/kit/examples/addsvc/cmd/addsvc/wiring_test.go delete mode 100644 vendor/github.com/go-kit/kit/examples/addsvc/pb/addsvc.pb.go delete mode 100644 vendor/github.com/go-kit/kit/examples/addsvc/pb/addsvc.proto delete mode 100755 vendor/github.com/go-kit/kit/examples/addsvc/pb/compile.sh delete mode 100644 vendor/github.com/go-kit/kit/examples/addsvc/pkg/addendpoint/middleware.go delete mode 100644 vendor/github.com/go-kit/kit/examples/addsvc/pkg/addendpoint/set.go delete mode 100644 vendor/github.com/go-kit/kit/examples/addsvc/pkg/addservice/middleware.go delete mode 100644 vendor/github.com/go-kit/kit/examples/addsvc/pkg/addservice/service.go delete mode 100644 vendor/github.com/go-kit/kit/examples/addsvc/pkg/addtransport/grpc.go delete mode 100644 vendor/github.com/go-kit/kit/examples/addsvc/pkg/addtransport/http.go delete mode 100644 vendor/github.com/go-kit/kit/examples/addsvc/pkg/addtransport/thrift.go delete mode 100644 vendor/github.com/go-kit/kit/examples/addsvc/thrift/addsvc.thrift delete mode 100755 vendor/github.com/go-kit/kit/examples/addsvc/thrift/compile.sh delete mode 100644 vendor/github.com/go-kit/kit/examples/addsvc/thrift/gen-go/addsvc/GoUnusedProtection__.go delete mode 100644 vendor/github.com/go-kit/kit/examples/addsvc/thrift/gen-go/addsvc/add_service-remote/add_service-remote.go delete mode 100644 vendor/github.com/go-kit/kit/examples/addsvc/thrift/gen-go/addsvc/addsvc-consts.go delete mode 100644 vendor/github.com/go-kit/kit/examples/addsvc/thrift/gen-go/addsvc/addsvc.go delete mode 100644 vendor/github.com/go-kit/kit/examples/apigateway/main.go delete mode 100644 vendor/github.com/go-kit/kit/examples/profilesvc/README.md delete mode 100644 vendor/github.com/go-kit/kit/examples/profilesvc/client/client.go delete mode 100644 vendor/github.com/go-kit/kit/examples/profilesvc/cmd/profilesvc/main.go delete mode 100644 vendor/github.com/go-kit/kit/examples/profilesvc/endpoints.go delete mode 100644 vendor/github.com/go-kit/kit/examples/profilesvc/middlewares.go delete mode 100644 vendor/github.com/go-kit/kit/examples/profilesvc/service.go delete mode 100644 vendor/github.com/go-kit/kit/examples/profilesvc/transport.go delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/README.md delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/booking/endpoint.go delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/booking/instrumenting.go delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/booking/logging.go delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/booking/service.go delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/booking/transport.go delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/cargo/cargo.go delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/cargo/delivery.go delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/cargo/handling.go delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/cargo/itinerary.go delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/handling/endpoint.go delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/handling/instrumenting.go delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/handling/logging.go delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/handling/service.go delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/handling/transport.go delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/inmem/inmem.go delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/inspection/inspection.go delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/location/location.go delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/location/sample_locations.go delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/main.go delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/routing/proxying.go delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/routing/routing.go delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/tracking/endpoint.go delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/tracking/instrumenting.go delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/tracking/logging.go delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/tracking/service.go delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/tracking/transport.go delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/voyage/sample_voyages.go delete mode 100644 vendor/github.com/go-kit/kit/examples/shipping/voyage/voyage.go delete mode 100644 vendor/github.com/go-kit/kit/examples/stringsvc1/main.go delete mode 100644 vendor/github.com/go-kit/kit/examples/stringsvc2/instrumenting.go delete mode 100644 vendor/github.com/go-kit/kit/examples/stringsvc2/logging.go delete mode 100644 vendor/github.com/go-kit/kit/examples/stringsvc2/main.go delete mode 100644 vendor/github.com/go-kit/kit/examples/stringsvc2/service.go delete mode 100644 vendor/github.com/go-kit/kit/examples/stringsvc2/transport.go delete mode 100644 vendor/github.com/go-kit/kit/examples/stringsvc3/instrumenting.go delete mode 100644 vendor/github.com/go-kit/kit/examples/stringsvc3/logging.go delete mode 100644 vendor/github.com/go-kit/kit/examples/stringsvc3/main.go delete mode 100644 vendor/github.com/go-kit/kit/examples/stringsvc3/proxying.go delete mode 100644 vendor/github.com/go-kit/kit/examples/stringsvc3/service.go delete mode 100644 vendor/github.com/go-kit/kit/examples/stringsvc3/transport.go delete mode 100755 vendor/github.com/go-kit/kit/lint delete mode 100644 vendor/github.com/go-kit/kit/log/README.md delete mode 100644 vendor/github.com/go-kit/kit/log/benchmark_test.go delete mode 100644 vendor/github.com/go-kit/kit/log/concurrency_test.go delete mode 100644 vendor/github.com/go-kit/kit/log/deprecated_levels/levels.go delete mode 100644 vendor/github.com/go-kit/kit/log/deprecated_levels/levels_test.go delete mode 100644 vendor/github.com/go-kit/kit/log/doc.go delete mode 100644 vendor/github.com/go-kit/kit/log/example_test.go delete mode 100644 vendor/github.com/go-kit/kit/log/json_logger.go delete mode 100644 vendor/github.com/go-kit/kit/log/json_logger_test.go delete mode 100644 vendor/github.com/go-kit/kit/log/level/benchmark_test.go delete mode 100644 vendor/github.com/go-kit/kit/log/level/doc.go delete mode 100644 vendor/github.com/go-kit/kit/log/level/example_test.go delete mode 100644 vendor/github.com/go-kit/kit/log/level/level.go delete mode 100644 vendor/github.com/go-kit/kit/log/level/level_test.go delete mode 100644 vendor/github.com/go-kit/kit/log/log.go delete mode 100644 vendor/github.com/go-kit/kit/log/log_test.go delete mode 100644 vendor/github.com/go-kit/kit/log/logfmt_logger.go delete mode 100644 vendor/github.com/go-kit/kit/log/logfmt_logger_test.go delete mode 100644 vendor/github.com/go-kit/kit/log/nop_logger.go delete mode 100644 vendor/github.com/go-kit/kit/log/nop_logger_test.go delete mode 100644 vendor/github.com/go-kit/kit/log/stdlib.go delete mode 100644 vendor/github.com/go-kit/kit/log/stdlib_test.go delete mode 100644 vendor/github.com/go-kit/kit/log/sync.go delete mode 100644 vendor/github.com/go-kit/kit/log/sync_test.go delete mode 100644 vendor/github.com/go-kit/kit/log/term/LICENSE delete mode 100644 vendor/github.com/go-kit/kit/log/term/colorlogger.go delete mode 100644 vendor/github.com/go-kit/kit/log/term/colorlogger_test.go delete mode 100644 vendor/github.com/go-kit/kit/log/term/colorwriter_others.go delete mode 100644 vendor/github.com/go-kit/kit/log/term/colorwriter_windows.go delete mode 100644 vendor/github.com/go-kit/kit/log/term/example_test.go delete mode 100644 vendor/github.com/go-kit/kit/log/term/term.go delete mode 100644 vendor/github.com/go-kit/kit/log/term/terminal_appengine.go delete mode 100644 vendor/github.com/go-kit/kit/log/term/terminal_darwin.go delete mode 100644 vendor/github.com/go-kit/kit/log/term/terminal_freebsd.go delete mode 100644 vendor/github.com/go-kit/kit/log/term/terminal_linux.go delete mode 100644 vendor/github.com/go-kit/kit/log/term/terminal_notwindows.go delete mode 100644 vendor/github.com/go-kit/kit/log/term/terminal_openbsd.go delete mode 100644 vendor/github.com/go-kit/kit/log/term/terminal_windows.go delete mode 100644 vendor/github.com/go-kit/kit/log/term/terminal_windows_test.go delete mode 100644 vendor/github.com/go-kit/kit/log/value.go delete mode 100644 vendor/github.com/go-kit/kit/log/value_test.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/README.md delete mode 100644 vendor/github.com/go-kit/kit/metrics/cloudwatch/cloudwatch.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/cloudwatch/cloudwatch_test.go delete mode 100755 vendor/github.com/go-kit/kit/metrics/debug.test delete mode 100644 vendor/github.com/go-kit/kit/metrics/discard/discard.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/doc.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/dogstatsd/dogstatsd.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/dogstatsd/dogstatsd_test.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/expvar/expvar.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/expvar/expvar_test.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/generic/generic.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/generic/generic_test.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/graphite/graphite.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/graphite/graphite_test.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/influx/example_test.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/influx/influx.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/influx/influx_test.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/internal/lv/labelvalues.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/internal/lv/labelvalues_test.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/internal/lv/space.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/internal/lv/space_test.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/internal/ratemap/ratemap.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/metrics.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/multi/multi.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/multi/multi_test.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/pcp/pcp.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/pcp/pcp_test.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/prometheus/prometheus.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/prometheus/prometheus_test.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/provider/discard.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/provider/dogstatsd.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/provider/expvar.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/provider/graphite.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/provider/influx.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/provider/prometheus.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/provider/provider.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/provider/statsd.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/statsd/statsd.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/statsd/statsd_test.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/teststat/buffers.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/teststat/populate.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/teststat/teststat.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/timer.go delete mode 100644 vendor/github.com/go-kit/kit/metrics/timer_test.go delete mode 100644 vendor/github.com/go-kit/kit/ratelimit/token_bucket.go delete mode 100644 vendor/github.com/go-kit/kit/ratelimit/token_bucket_test.go delete mode 100644 vendor/github.com/go-kit/kit/sd/benchmark_test.go delete mode 100644 vendor/github.com/go-kit/kit/sd/consul/client.go delete mode 100644 vendor/github.com/go-kit/kit/sd/consul/client_test.go delete mode 100644 vendor/github.com/go-kit/kit/sd/consul/doc.go delete mode 100644 vendor/github.com/go-kit/kit/sd/consul/instancer.go delete mode 100644 vendor/github.com/go-kit/kit/sd/consul/instancer_test.go delete mode 100644 vendor/github.com/go-kit/kit/sd/consul/integration_test.go delete mode 100644 vendor/github.com/go-kit/kit/sd/consul/registrar.go delete mode 100644 vendor/github.com/go-kit/kit/sd/consul/registrar_test.go delete mode 100644 vendor/github.com/go-kit/kit/sd/dnssrv/doc.go delete mode 100644 vendor/github.com/go-kit/kit/sd/dnssrv/instancer.go delete mode 100644 vendor/github.com/go-kit/kit/sd/dnssrv/instancer_test.go delete mode 100644 vendor/github.com/go-kit/kit/sd/dnssrv/lookup.go delete mode 100644 vendor/github.com/go-kit/kit/sd/doc.go delete mode 100644 vendor/github.com/go-kit/kit/sd/endpoint_cache.go delete mode 100644 vendor/github.com/go-kit/kit/sd/endpoint_cache_test.go delete mode 100644 vendor/github.com/go-kit/kit/sd/endpointer.go delete mode 100644 vendor/github.com/go-kit/kit/sd/endpointer_test.go delete mode 100644 vendor/github.com/go-kit/kit/sd/etcd/client.go delete mode 100644 vendor/github.com/go-kit/kit/sd/etcd/client_test.go delete mode 100644 vendor/github.com/go-kit/kit/sd/etcd/doc.go delete mode 100644 vendor/github.com/go-kit/kit/sd/etcd/example_test.go delete mode 100644 vendor/github.com/go-kit/kit/sd/etcd/instancer.go delete mode 100644 vendor/github.com/go-kit/kit/sd/etcd/instancer_test.go delete mode 100644 vendor/github.com/go-kit/kit/sd/etcd/integration_test.go delete mode 100644 vendor/github.com/go-kit/kit/sd/etcd/registrar.go delete mode 100644 vendor/github.com/go-kit/kit/sd/etcd/registrar_test.go delete mode 100644 vendor/github.com/go-kit/kit/sd/eureka/doc.go delete mode 100644 vendor/github.com/go-kit/kit/sd/eureka/instancer.go delete mode 100644 vendor/github.com/go-kit/kit/sd/eureka/instancer_test.go delete mode 100644 vendor/github.com/go-kit/kit/sd/eureka/integration_test.go delete mode 100644 vendor/github.com/go-kit/kit/sd/eureka/registrar.go delete mode 100644 vendor/github.com/go-kit/kit/sd/eureka/registrar_test.go delete mode 100644 vendor/github.com/go-kit/kit/sd/eureka/util_test.go delete mode 100644 vendor/github.com/go-kit/kit/sd/factory.go delete mode 100644 vendor/github.com/go-kit/kit/sd/instancer.go delete mode 100644 vendor/github.com/go-kit/kit/sd/internal/instance/cache.go delete mode 100644 vendor/github.com/go-kit/kit/sd/internal/instance/cache_test.go delete mode 100644 vendor/github.com/go-kit/kit/sd/lb/balancer.go delete mode 100644 vendor/github.com/go-kit/kit/sd/lb/doc.go delete mode 100644 vendor/github.com/go-kit/kit/sd/lb/random.go delete mode 100644 vendor/github.com/go-kit/kit/sd/lb/random_test.go delete mode 100644 vendor/github.com/go-kit/kit/sd/lb/retry.go delete mode 100644 vendor/github.com/go-kit/kit/sd/lb/retry_test.go delete mode 100644 vendor/github.com/go-kit/kit/sd/lb/round_robin.go delete mode 100644 vendor/github.com/go-kit/kit/sd/lb/round_robin_test.go delete mode 100644 vendor/github.com/go-kit/kit/sd/registrar.go delete mode 100644 vendor/github.com/go-kit/kit/sd/zk/client.go delete mode 100644 vendor/github.com/go-kit/kit/sd/zk/client_test.go delete mode 100644 vendor/github.com/go-kit/kit/sd/zk/doc.go delete mode 100644 vendor/github.com/go-kit/kit/sd/zk/instancer.go delete mode 100644 vendor/github.com/go-kit/kit/sd/zk/instancer_test.go delete mode 100644 vendor/github.com/go-kit/kit/sd/zk/integration_test.go delete mode 100644 vendor/github.com/go-kit/kit/sd/zk/logwrapper.go delete mode 100644 vendor/github.com/go-kit/kit/sd/zk/registrar.go delete mode 100644 vendor/github.com/go-kit/kit/sd/zk/util_test.go delete mode 100644 vendor/github.com/go-kit/kit/tracing/README.md delete mode 100644 vendor/github.com/go-kit/kit/tracing/doc.go delete mode 100644 vendor/github.com/go-kit/kit/tracing/opentracing/doc.go delete mode 100644 vendor/github.com/go-kit/kit/tracing/opentracing/endpoint.go delete mode 100644 vendor/github.com/go-kit/kit/tracing/opentracing/endpoint_test.go delete mode 100644 vendor/github.com/go-kit/kit/tracing/opentracing/grpc.go delete mode 100644 vendor/github.com/go-kit/kit/tracing/opentracing/grpc_test.go delete mode 100644 vendor/github.com/go-kit/kit/tracing/opentracing/http.go delete mode 100644 vendor/github.com/go-kit/kit/tracing/opentracing/http_test.go delete mode 100644 vendor/github.com/go-kit/kit/tracing/zipkin/README.md delete mode 100644 vendor/github.com/go-kit/kit/transport/doc.go delete mode 100644 vendor/github.com/go-kit/kit/transport/grpc/README.md delete mode 100644 vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/client.go delete mode 100644 vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/context_metadata.go delete mode 100644 vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/pb/generate.go delete mode 100644 vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/pb/test.pb.go delete mode 100644 vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/pb/test.proto delete mode 100644 vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/request_response.go delete mode 100644 vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/server.go delete mode 100644 vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/service.go delete mode 100644 vendor/github.com/go-kit/kit/transport/grpc/client.go delete mode 100644 vendor/github.com/go-kit/kit/transport/grpc/client_test.go delete mode 100644 vendor/github.com/go-kit/kit/transport/grpc/doc.go delete mode 100644 vendor/github.com/go-kit/kit/transport/grpc/encode_decode.go delete mode 100644 vendor/github.com/go-kit/kit/transport/grpc/request_response_funcs.go delete mode 100644 vendor/github.com/go-kit/kit/transport/grpc/server.go delete mode 100644 vendor/github.com/go-kit/kit/transport/http/client.go delete mode 100644 vendor/github.com/go-kit/kit/transport/http/client_test.go delete mode 100644 vendor/github.com/go-kit/kit/transport/http/doc.go delete mode 100644 vendor/github.com/go-kit/kit/transport/http/encode_decode.go delete mode 100644 vendor/github.com/go-kit/kit/transport/http/example_test.go delete mode 100644 vendor/github.com/go-kit/kit/transport/http/request_response_funcs.go delete mode 100644 vendor/github.com/go-kit/kit/transport/http/request_response_funcs_test.go delete mode 100644 vendor/github.com/go-kit/kit/transport/http/server.go delete mode 100644 vendor/github.com/go-kit/kit/transport/http/server_test.go delete mode 100644 vendor/github.com/go-kit/kit/transport/httprp/doc.go delete mode 100644 vendor/github.com/go-kit/kit/transport/httprp/server.go delete mode 100644 vendor/github.com/go-kit/kit/transport/httprp/server_test.go delete mode 100644 vendor/github.com/go-kit/kit/transport/netrpc/README.md delete mode 100644 vendor/github.com/go-kit/kit/transport/thrift/README.md delete mode 100755 vendor/github.com/go-kit/kit/update_deps.bash delete mode 100644 vendor/github.com/go-kit/kit/util/README.md delete mode 100644 vendor/github.com/go-kit/kit/util/conn/doc.go delete mode 100644 vendor/github.com/go-kit/kit/util/conn/manager.go delete mode 100644 vendor/github.com/go-kit/kit/util/conn/manager_test.go delete mode 100644 vendor/github.com/tendermint/tmlibs/log/testing_logger.go delete mode 100644 vendor/github.com/tendermint/tmlibs/log/tm_json_logger.go delete mode 100644 vendor/github.com/tendermint/tmlibs/log/tm_logger.go delete mode 100644 vendor/github.com/tendermint/tmlibs/log/tmfmt_logger.go diff --git a/p2p/connection/connection_test.go b/p2p/connection/connection_test.go index 1a221260..a2983674 100644 --- a/p2p/connection/connection_test.go +++ b/p2p/connection/connection_test.go @@ -7,7 +7,6 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/tendermint/tmlibs/log" ) func createMConnection(conn net.Conn) *MConnection { @@ -16,14 +15,12 @@ func createMConnection(conn net.Conn) *MConnection { onError := func(r interface{}) { } c := createMConnectionWithCallbacks(conn, onReceive, onError) - c.SetLogger(log.TestingLogger()) return c } func createMConnectionWithCallbacks(conn net.Conn, onReceive func(chID byte, msgBytes []byte), onError func(r interface{})) *MConnection { chDescs := []*ChannelDescriptor{&ChannelDescriptor{ID: 0x01, Priority: 1, SendQueueCapacity: 1}} c := NewMConnectionWithConfig(conn, chDescs, onReceive, onError, DefaultMConnConfig()) - c.SetLogger(log.TestingLogger()) return c } diff --git a/vendor/github.com/go-kit/kit/.gitignore b/vendor/github.com/go-kit/kit/.gitignore deleted file mode 100644 index 6062401c..00000000 --- a/vendor/github.com/go-kit/kit/.gitignore +++ /dev/null @@ -1,45 +0,0 @@ -examples/addsvc/addsvc -examples/addsvc/client/client -examples/apigateway/apigateway -examples/profilesvc/profilesvc -examples/stringsvc1/stringsvc1 -examples/stringsvc2/stringsvc2 -examples/stringsvc3/stringsvc3 -*.coverprofile - -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test -_old* - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe - -# https://github.com/github/gitignore/blob/master/Global/Vim.gitignore -# swap -[._]*.s[a-w][a-z] -[._]s[a-w][a-z] -# session -Session.vim -# temporary -.netrwhist -*~ -# auto-generated tag files -tags - diff --git a/vendor/github.com/go-kit/kit/.travis.yml b/vendor/github.com/go-kit/kit/.travis.yml deleted file mode 100644 index 31624b2b..00000000 --- a/vendor/github.com/go-kit/kit/.travis.yml +++ /dev/null @@ -1,16 +0,0 @@ -language: go - -env: - - COVERALLS_TOKEN=MYSkSqcsWXd6DmP6TnSeiDhtvuL4u6ndp - -before_install: - - go get github.com/mattn/goveralls - - go get github.com/modocache/gover - -script: - - go test -race -v ./... - - ./coveralls.bash - -go: - - 1.9.x - - tip diff --git a/vendor/github.com/go-kit/kit/CONTRIBUTING.md b/vendor/github.com/go-kit/kit/CONTRIBUTING.md deleted file mode 100644 index c0751f85..00000000 --- a/vendor/github.com/go-kit/kit/CONTRIBUTING.md +++ /dev/null @@ -1,18 +0,0 @@ -# Contributing - -First, thank you for contributing! We love and encourage pull requests from everyone. - -Before submitting major changes, here are a few guidelines to follow: - -1. Check the [open issues][issues] and [pull requests][prs] for existing discussions. -1. Open an [issue][issues] first, to discuss a new feature or enhancement. -1. Write tests, and make sure the test suite passes locally and on CI. -1. Open a pull request, and reference the relevant issue(s). -1. After receiving feedback, [squash your commits][squash] and add a [great commit message][message]. -1. Have fun! - -[issues]: https://github.com/go-kit/kit/issues -[prs]: https://github.com/go-kit/kit/pulls -[squash]: http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html -[message]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html - diff --git a/vendor/github.com/go-kit/kit/LICENSE b/vendor/github.com/go-kit/kit/LICENSE deleted file mode 100644 index 9d83342a..00000000 --- a/vendor/github.com/go-kit/kit/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 Peter Bourgon - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/vendor/github.com/go-kit/kit/README.md b/vendor/github.com/go-kit/kit/README.md deleted file mode 100644 index 2d9a2b4d..00000000 --- a/vendor/github.com/go-kit/kit/README.md +++ /dev/null @@ -1,119 +0,0 @@ -# Go kit [![Circle CI](https://circleci.com/gh/go-kit/kit.svg?style=shield)](https://circleci.com/gh/go-kit/kit) [![Travis CI](https://travis-ci.org/go-kit/kit.svg?branch=master)](https://travis-ci.org/go-kit/kit) [![GoDoc](https://godoc.org/github.com/go-kit/kit?status.svg)](https://godoc.org/github.com/go-kit/kit) [![Coverage Status](https://coveralls.io/repos/go-kit/kit/badge.svg?branch=master&service=github)](https://coveralls.io/github/go-kit/kit?branch=master) [![Go Report Card](https://goreportcard.com/badge/go-kit/kit)](https://goreportcard.com/report/go-kit/kit) [![Sourcegraph](https://sourcegraph.com/github.com/go-kit/kit/-/badge.svg)](https://sourcegraph.com/github.com/go-kit/kit?badge) - -**Go kit** is a **programming toolkit** for building microservices -(or elegant monoliths) in Go. We solve common problems in distributed -systems and application architecture so you can focus on delivering -business value. - -- Website: [gokit.io](https://gokit.io) -- Mailing list: [go-kit](https://groups.google.com/forum/#!forum/go-kit) -- Slack: [gophers.slack.com](https://gophers.slack.com) **#go-kit** ([invite](https://gophersinvite.herokuapp.com/)) - -## Motivation - -Go has emerged as the language of the server, but it remains underrepresented -in so-called "modern enterprise" companies like Facebook, Twitter, Netflix, and -SoundCloud. Many of these organizations have turned to JVM-based stacks for -their business logic, owing in large part to libraries and ecosystems that -directly support their microservice architectures. - -To reach its next level of success, Go needs more than simple primitives and -idioms. It needs a comprehensive toolkit, for coherent distributed programming -in the large. Go kit is a set of packages and best practices, which provide a -comprehensive, robust, and trustable way of building microservices for -organizations of any size. - -For more details, see - [the website](https://gokit.io), - [the motivating blog post](http://peter.bourgon.org/go-kit/) and - [the video of the talk](https://www.youtube.com/watch?v=iFR_7AKkJFU). -See also the - [Go kit talk at GopherCon 2015](https://www.youtube.com/watch?v=1AjaZi4QuGo). - -## Goals - -- Operate in a heterogeneous SOA — expect to interact with mostly non-Go-kit services -- RPC as the primary messaging pattern -- Pluggable serialization and transport — not just JSON over HTTP -- Operate within existing infrastructures — no mandates for specific tools or technologies - -## Non-goals - -- Supporting messaging patterns other than RPC (for now) — e.g. MPI, pub/sub, CQRS, etc. -- Re-implementing functionality that can be provided by adapting existing software -- Having opinions on operational concerns: deployment, configuration, process supervision, orchestration, etc. - -## Contributing - -Please see [CONTRIBUTING.md](/CONTRIBUTING.md). -Thank you, [contributors](https://github.com/go-kit/kit/graphs/contributors)! - -## Dependency management - -Go kit is a library, designed to be imported into a binary package. Vendoring -is currently the best way for binary package authors to ensure reliable, -reproducible builds. Therefore, we strongly recommend our users use vendoring -for all of their dependencies, including Go kit. To avoid compatibility and -availability issues, Go kit doesn't vendor its own dependencies, and -doesn't recommend use of third-party import proxies. - -There are several tools which make vendoring easier, including - [dep](https://github.com/golang/dep), - [gb](http://getgb.io), - [glide](https://github.com/Masterminds/glide), - [gvt](https://github.com/FiloSottile/gvt), and - [govendor](https://github.com/kardianos/govendor). -In addition, Go kit uses a variety of continuous integration providers - to find and fix compatibility problems as soon as they occur. - -## Related projects - -Projects with a ★ have had particular influence on Go kit's design (or vice-versa). - -### Service frameworks - -- [gizmo](https://github.com/nytimes/gizmo), a microservice toolkit from The New York Times ★ -- [go-micro](https://github.com/myodc/go-micro), a microservices client/server library ★ -- [gotalk](https://github.com/rsms/gotalk), async peer communication protocol & library -- [Kite](https://github.com/koding/kite), a micro-service framework -- [gocircuit](https://github.com/gocircuit/circuit), dynamic cloud orchestration - -### Individual components - -- [afex/hystrix-go](https://github.com/afex/hystrix-go), client-side latency and fault tolerance library -- [armon/go-metrics](https://github.com/armon/go-metrics), library for exporting performance and runtime metrics to external metrics systems -- [codahale/lunk](https://github.com/codahale/lunk), structured logging in the style of Google's Dapper or Twitter's Zipkin -- [eapache/go-resiliency](https://github.com/eapache/go-resiliency), resiliency patterns -- [sasbury/logging](https://github.com/sasbury/logging), a tagged style of logging -- [grpc/grpc-go](https://github.com/grpc/grpc-go), HTTP/2 based RPC -- [inconshreveable/log15](https://github.com/inconshreveable/log15), simple, powerful logging for Go ★ -- [mailgun/vulcand](https://github.com/vulcand/vulcand), programmatic load balancer backed by etcd -- [mattheath/phosphor](https://github.com/mondough/phosphor), distributed system tracing -- [pivotal-golang/lager](https://github.com/pivotal-golang/lager), an opinionated logging library -- [rubyist/circuitbreaker](https://github.com/rubyist/circuitbreaker), circuit breaker library -- [Sirupsen/logrus](https://github.com/Sirupsen/logrus), structured, pluggable logging for Go ★ -- [sourcegraph/appdash](https://github.com/sourcegraph/appdash), application tracing system based on Google's Dapper -- [spacemonkeygo/monitor](https://github.com/spacemonkeygo/monitor), data collection, monitoring, instrumentation, and Zipkin client library -- [streadway/handy](https://github.com/streadway/handy), net/http handler filters -- [vitess/rpcplus](https://godoc.org/github.com/youtube/vitess/go/rpcplus), package rpc + context.Context -- [gdamore/mangos](https://github.com/gdamore/mangos), nanomsg implementation in pure Go - -### Web frameworks - -- [Gorilla](http://www.gorillatoolkit.org) -- [Gin](https://gin-gonic.github.io/gin/) -- [Negroni](https://github.com/codegangsta/negroni) -- [Goji](https://github.com/zenazn/goji) -- [Martini](https://github.com/go-martini/martini) -- [Beego](http://beego.me/) -- [Revel](https://revel.github.io/) (considered [harmful](https://github.com/go-kit/kit/issues/350)) - -## Additional reading - -- [Architecting for the Cloud](http://fr.slideshare.net/stonse/architecting-for-the-cloud-using-netflixoss-codemash-workshop-29852233) — Netflix -- [Dapper, a Large-Scale Distributed Systems Tracing Infrastructure](http://research.google.com/pubs/pub36356.html) — Google -- [Your Server as a Function](http://monkey.org/~marius/funsrv.pdf) (PDF) — Twitter - ---- - -Development supported by [DigitalOcean](https://digitalocean.com). diff --git a/vendor/github.com/go-kit/kit/ROADMAP.md b/vendor/github.com/go-kit/kit/ROADMAP.md deleted file mode 100644 index 5c462aa2..00000000 --- a/vendor/github.com/go-kit/kit/ROADMAP.md +++ /dev/null @@ -1,17 +0,0 @@ -# Roadmap - -This is a coarse-grained roadmap of Go kit development direction in the short -to mid-term future. It will be kept reasonably up-to-date by the project -maintainers. Suggest new ideas, enhancements, and features using the standard -[issues](https://github.com/go-kit/kit/issues) model. - -## Prioritized - -1. kitgen code generation (#308, #70) -1. package pubsub (#298, #295) - -## Unprioritized - -- package log/levels refactor (#250, #269, #252) -- package auth/jwt (#255) - diff --git a/vendor/github.com/go-kit/kit/auth/basic/README.md b/vendor/github.com/go-kit/kit/auth/basic/README.md deleted file mode 100644 index 26d6c4b3..00000000 --- a/vendor/github.com/go-kit/kit/auth/basic/README.md +++ /dev/null @@ -1,20 +0,0 @@ -This package provides a Basic Authentication middleware. - -It'll try to compare credentials from Authentication request header to a username/password pair in middleware constructor. - -More details about this type of authentication can be found in [Mozilla article](https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication). - -## Usage - -```go -import httptransport "github.com/go-kit/kit/transport/http" - -httptransport.NewServer( - AuthMiddleware(cfg.auth.user, cfg.auth.password, "Example Realm")(makeUppercaseEndpoint()), - decodeMappingsRequest, - httptransport.EncodeJSONResponse, - httptransport.ServerBefore(httptransport.PopulateRequestContext), - ) -``` - -For AuthMiddleware to be able to pick up the Authentication header from an HTTP request we need to pass it through the context with something like ```httptransport.ServerBefore(httptransport.PopulateRequestContext)```. \ No newline at end of file diff --git a/vendor/github.com/go-kit/kit/auth/basic/middleware.go b/vendor/github.com/go-kit/kit/auth/basic/middleware.go deleted file mode 100644 index ad7e4085..00000000 --- a/vendor/github.com/go-kit/kit/auth/basic/middleware.go +++ /dev/null @@ -1,94 +0,0 @@ -package basic - -import ( - "bytes" - "context" - "crypto/sha256" - "crypto/subtle" - "encoding/base64" - "fmt" - "net/http" - "strings" - - "github.com/go-kit/kit/endpoint" - httptransport "github.com/go-kit/kit/transport/http" -) - -// AuthError represents an authorization error. -type AuthError struct { - Realm string -} - -// StatusCode is an implementation of the StatusCoder interface in go-kit/http. -func (AuthError) StatusCode() int { - return http.StatusUnauthorized -} - -// Error is an implementation of the Error interface. -func (AuthError) Error() string { - return http.StatusText(http.StatusUnauthorized) -} - -// Headers is an implementation of the Headerer interface in go-kit/http. -func (e AuthError) Headers() http.Header { - return http.Header{ - "Content-Type": []string{"text/plain; charset=utf-8"}, - "X-Content-Type-Options": []string{"nosniff"}, - "WWW-Authenticate": []string{fmt.Sprintf(`Basic realm=%q`, e.Realm)}, - } -} - -// parseBasicAuth parses an HTTP Basic Authentication string. -// "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==" returns ([]byte("Aladdin"), []byte("open sesame"), true). -func parseBasicAuth(auth string) (username, password []byte, ok bool) { - const prefix = "Basic " - if !strings.HasPrefix(auth, prefix) { - return - } - c, err := base64.StdEncoding.DecodeString(auth[len(prefix):]) - if err != nil { - return - } - - s := bytes.IndexByte(c, ':') - if s < 0 { - return - } - return c[:s], c[s+1:], true -} - -// Returns a hash of a given slice. -func toHashSlice(s []byte) []byte { - hash := sha256.Sum256(s) - return hash[:] -} - -// AuthMiddleware returns a Basic Authentication middleware for a particular user and password. -func AuthMiddleware(requiredUser, requiredPassword, realm string) endpoint.Middleware { - requiredUserBytes := toHashSlice([]byte(requiredUser)) - requiredPasswordBytes := toHashSlice([]byte(requiredPassword)) - - return func(next endpoint.Endpoint) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - auth, ok := ctx.Value(httptransport.ContextKeyRequestAuthorization).(string) - if !ok { - return nil, AuthError{realm} - } - - givenUser, givenPassword, ok := parseBasicAuth(auth) - if !ok { - return nil, AuthError{realm} - } - - givenUserBytes := toHashSlice(givenUser) - givenPasswordBytes := toHashSlice(givenPassword) - - if subtle.ConstantTimeCompare(givenUserBytes, requiredUserBytes) == 0 || - subtle.ConstantTimeCompare(givenPasswordBytes, requiredPasswordBytes) == 0 { - return nil, AuthError{realm} - } - - return next(ctx, request) - } - } -} diff --git a/vendor/github.com/go-kit/kit/auth/basic/middleware_test.go b/vendor/github.com/go-kit/kit/auth/basic/middleware_test.go deleted file mode 100644 index 9ad330eb..00000000 --- a/vendor/github.com/go-kit/kit/auth/basic/middleware_test.go +++ /dev/null @@ -1,52 +0,0 @@ -package basic - -import ( - "context" - "encoding/base64" - "fmt" - "testing" - - httptransport "github.com/go-kit/kit/transport/http" -) - -func TestWithBasicAuth(t *testing.T) { - requiredUser := "test-user" - requiredPassword := "test-pass" - realm := "test realm" - - type want struct { - result interface{} - err error - } - tests := []struct { - name string - authHeader interface{} - want want - }{ - {"Isn't valid with nil header", nil, want{nil, AuthError{realm}}}, - {"Isn't valid with non-string header", 42, want{nil, AuthError{realm}}}, - {"Isn't valid without authHeader", "", want{nil, AuthError{realm}}}, - {"Isn't valid for wrong user", makeAuthString("wrong-user", requiredPassword), want{nil, AuthError{realm}}}, - {"Isn't valid for wrong password", makeAuthString(requiredUser, "wrong-password"), want{nil, AuthError{realm}}}, - {"Is valid for correct creds", makeAuthString(requiredUser, requiredPassword), want{true, nil}}, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - ctx := context.WithValue(context.TODO(), httptransport.ContextKeyRequestAuthorization, tt.authHeader) - - result, err := AuthMiddleware(requiredUser, requiredPassword, realm)(passedValidation)(ctx, nil) - if result != tt.want.result || err != tt.want.err { - t.Errorf("WithBasicAuth() = result: %v, err: %v, want result: %v, want error: %v", result, err, tt.want.result, tt.want.err) - } - }) - } -} - -func makeAuthString(user string, password string) string { - data := []byte(fmt.Sprintf("%s:%s", user, password)) - return fmt.Sprintf("Basic %s", base64.StdEncoding.EncodeToString(data)) -} - -func passedValidation(ctx context.Context, request interface{}) (response interface{}, err error) { - return true, nil -} diff --git a/vendor/github.com/go-kit/kit/auth/jwt/README.md b/vendor/github.com/go-kit/kit/auth/jwt/README.md deleted file mode 100644 index d2430bd2..00000000 --- a/vendor/github.com/go-kit/kit/auth/jwt/README.md +++ /dev/null @@ -1,122 +0,0 @@ -# package auth/jwt - -`package auth/jwt` provides a set of interfaces for service authorization -through [JSON Web Tokens](https://jwt.io/). - -## Usage - -NewParser takes a key function and an expected signing method and returns an -`endpoint.Middleware`. The middleware will parse a token passed into the -context via the `jwt.JWTTokenContextKey`. If the token is valid, any claims -will be added to the context via the `jwt.JWTClaimsContextKey`. - -```go -import ( - stdjwt "github.com/dgrijalva/jwt-go" - - "github.com/go-kit/kit/auth/jwt" - "github.com/go-kit/kit/endpoint" -) - -func main() { - var exampleEndpoint endpoint.Endpoint - { - kf := func(token *stdjwt.Token) (interface{}, error) { return []byte("SigningString"), nil } - exampleEndpoint = MakeExampleEndpoint(service) - exampleEndpoint = jwt.NewParser(kf, stdjwt.SigningMethodHS256, jwt.StandardClaimsFactory)(exampleEndpoint) - } -} -``` - -NewSigner takes a JWT key ID header, the signing key, signing method, and a -claims object. It returns an `endpoint.Middleware`. The middleware will build -the token string and add it to the context via the `jwt.JWTTokenContextKey`. - -```go -import ( - stdjwt "github.com/dgrijalva/jwt-go" - - "github.com/go-kit/kit/auth/jwt" - "github.com/go-kit/kit/endpoint" -) - -func main() { - var exampleEndpoint endpoint.Endpoint - { - exampleEndpoint = grpctransport.NewClient(...).Endpoint() - exampleEndpoint = jwt.NewSigner( - "kid-header", - []byte("SigningString"), - stdjwt.SigningMethodHS256, - jwt.Claims{}, - )(exampleEndpoint) - } -} -``` - -In order for the parser and the signer to work, the authorization headers need -to be passed between the request and the context. `ToHTTPContext()`, -`FromHTTPContext()`, `ToGRPCContext()`, and `FromGRPCContext()` are given as -helpers to do this. These functions implement the correlating transport's -RequestFunc interface and can be passed as ClientBefore or ServerBefore -options. - -Example of use in a client: - -```go -import ( - stdjwt "github.com/dgrijalva/jwt-go" - - grpctransport "github.com/go-kit/kit/transport/grpc" - "github.com/go-kit/kit/auth/jwt" - "github.com/go-kit/kit/endpoint" -) - -func main() { - - options := []httptransport.ClientOption{} - var exampleEndpoint endpoint.Endpoint - { - exampleEndpoint = grpctransport.NewClient(..., grpctransport.ClientBefore(jwt.FromGRPCContext())).Endpoint() - exampleEndpoint = jwt.NewSigner( - "kid-header", - []byte("SigningString"), - stdjwt.SigningMethodHS256, - jwt.Claims{}, - )(exampleEndpoint) - } -} -``` - -Example of use in a server: - -```go -import ( - "context" - - "github.com/go-kit/kit/auth/jwt" - "github.com/go-kit/kit/log" - grpctransport "github.com/go-kit/kit/transport/grpc" -) - -func MakeGRPCServer(ctx context.Context, endpoints Endpoints, logger log.Logger) pb.ExampleServer { - options := []grpctransport.ServerOption{grpctransport.ServerErrorLogger(logger)} - - return &grpcServer{ - createUser: grpctransport.NewServer( - ctx, - endpoints.CreateUserEndpoint, - DecodeGRPCCreateUserRequest, - EncodeGRPCCreateUserResponse, - append(options, grpctransport.ServerBefore(jwt.ToGRPCContext()))..., - ), - getUser: grpctransport.NewServer( - ctx, - endpoints.GetUserEndpoint, - DecodeGRPCGetUserRequest, - EncodeGRPCGetUserResponse, - options..., - ), - } -} -``` diff --git a/vendor/github.com/go-kit/kit/auth/jwt/middleware.go b/vendor/github.com/go-kit/kit/auth/jwt/middleware.go deleted file mode 100644 index 0e29e6d6..00000000 --- a/vendor/github.com/go-kit/kit/auth/jwt/middleware.go +++ /dev/null @@ -1,143 +0,0 @@ -package jwt - -import ( - "context" - "errors" - - jwt "github.com/dgrijalva/jwt-go" - - "github.com/go-kit/kit/endpoint" -) - -type contextKey string - -const ( - // JWTTokenContextKey holds the key used to store a JWT Token in the - // context. - JWTTokenContextKey contextKey = "JWTToken" - - // JWTClaimsContextKey holds the key used to store the JWT Claims in the - // context. - JWTClaimsContextKey contextKey = "JWTClaims" -) - -var ( - // ErrTokenContextMissing denotes a token was not passed into the parsing - // middleware's context. - ErrTokenContextMissing = errors.New("token up for parsing was not passed through the context") - - // ErrTokenInvalid denotes a token was not able to be validated. - ErrTokenInvalid = errors.New("JWT Token was invalid") - - // ErrTokenExpired denotes a token's expire header (exp) has since passed. - ErrTokenExpired = errors.New("JWT Token is expired") - - // ErrTokenMalformed denotes a token was not formatted as a JWT token. - ErrTokenMalformed = errors.New("JWT Token is malformed") - - // ErrTokenNotActive denotes a token's not before header (nbf) is in the - // future. - ErrTokenNotActive = errors.New("token is not valid yet") - - // ErrUnexpectedSigningMethod denotes a token was signed with an unexpected - // signing method. - ErrUnexpectedSigningMethod = errors.New("unexpected signing method") -) - -// NewSigner creates a new JWT token generating middleware, specifying key ID, -// signing string, signing method and the claims you would like it to contain. -// Tokens are signed with a Key ID header (kid) which is useful for determining -// the key to use for parsing. Particularly useful for clients. -func NewSigner(kid string, key []byte, method jwt.SigningMethod, claims jwt.Claims) endpoint.Middleware { - return func(next endpoint.Endpoint) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (response interface{}, err error) { - token := jwt.NewWithClaims(method, claims) - token.Header["kid"] = kid - - // Sign and get the complete encoded token as a string using the secret - tokenString, err := token.SignedString(key) - if err != nil { - return nil, err - } - ctx = context.WithValue(ctx, JWTTokenContextKey, tokenString) - - return next(ctx, request) - } - } -} - -// ClaimsFactory is a factory for jwt.Claims. -// Useful in NewParser middleware. -type ClaimsFactory func() jwt.Claims - -// MapClaimsFactory is a ClaimsFactory that returns -// an empty jwt.MapClaims. -func MapClaimsFactory() jwt.Claims { - return jwt.MapClaims{} -} - -// StandardClaimsFactory is a ClaimsFactory that returns -// an empty jwt.StandardClaims. -func StandardClaimsFactory() jwt.Claims { - return &jwt.StandardClaims{} -} - -// NewParser creates a new JWT token parsing middleware, specifying a -// jwt.Keyfunc interface, the signing method and the claims type to be used. NewParser -// adds the resulting claims to endpoint context or returns error on invalid token. -// Particularly useful for servers. -func NewParser(keyFunc jwt.Keyfunc, method jwt.SigningMethod, newClaims ClaimsFactory) endpoint.Middleware { - return func(next endpoint.Endpoint) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (response interface{}, err error) { - // tokenString is stored in the context from the transport handlers. - tokenString, ok := ctx.Value(JWTTokenContextKey).(string) - if !ok { - return nil, ErrTokenContextMissing - } - - // Parse takes the token string and a function for looking up the - // key. The latter is especially useful if you use multiple keys - // for your application. The standard is to use 'kid' in the head - // of the token to identify which key to use, but the parsed token - // (head and claims) is provided to the callback, providing - // flexibility. - token, err := jwt.ParseWithClaims(tokenString, newClaims(), func(token *jwt.Token) (interface{}, error) { - // Don't forget to validate the alg is what you expect: - if token.Method != method { - return nil, ErrUnexpectedSigningMethod - } - - return keyFunc(token) - }) - if err != nil { - if e, ok := err.(*jwt.ValidationError); ok { - switch { - case e.Errors&jwt.ValidationErrorMalformed != 0: - // Token is malformed - return nil, ErrTokenMalformed - case e.Errors&jwt.ValidationErrorExpired != 0: - // Token is expired - return nil, ErrTokenExpired - case e.Errors&jwt.ValidationErrorNotValidYet != 0: - // Token is not active yet - return nil, ErrTokenNotActive - case e.Inner != nil: - // report e.Inner - return nil, e.Inner - } - // We have a ValidationError but have no specific Go kit error for it. - // Fall through to return original error. - } - return nil, err - } - - if !token.Valid { - return nil, ErrTokenInvalid - } - - ctx = context.WithValue(ctx, JWTClaimsContextKey, token.Claims) - - return next(ctx, request) - } - } -} diff --git a/vendor/github.com/go-kit/kit/auth/jwt/middleware_test.go b/vendor/github.com/go-kit/kit/auth/jwt/middleware_test.go deleted file mode 100644 index 3278e13a..00000000 --- a/vendor/github.com/go-kit/kit/auth/jwt/middleware_test.go +++ /dev/null @@ -1,221 +0,0 @@ -package jwt - -import ( - "context" - "sync" - "testing" - "time" - - "crypto/subtle" - - jwt "github.com/dgrijalva/jwt-go" - "github.com/go-kit/kit/endpoint" -) - -type customClaims struct { - MyProperty string `json:"my_property"` - jwt.StandardClaims -} - -func (c customClaims) VerifyMyProperty(p string) bool { - return subtle.ConstantTimeCompare([]byte(c.MyProperty), []byte(p)) != 0 -} - -var ( - kid = "kid" - key = []byte("test_signing_key") - myProperty = "some value" - method = jwt.SigningMethodHS256 - invalidMethod = jwt.SigningMethodRS256 - mapClaims = jwt.MapClaims{"user": "go-kit"} - standardClaims = jwt.StandardClaims{Audience: "go-kit"} - myCustomClaims = customClaims{MyProperty: myProperty, StandardClaims: standardClaims} - // Signed tokens generated at https://jwt.io/ - signedKey = "eyJhbGciOiJIUzI1NiIsImtpZCI6ImtpZCIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiZ28ta2l0In0.14M2VmYyApdSlV_LZ88ajjwuaLeIFplB8JpyNy0A19E" - standardSignedKey = "eyJhbGciOiJIUzI1NiIsImtpZCI6ImtpZCIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJnby1raXQifQ.L5ypIJjCOOv3jJ8G5SelaHvR04UJuxmcBN5QW3m_aoY" - customSignedKey = "eyJhbGciOiJIUzI1NiIsImtpZCI6ImtpZCIsInR5cCI6IkpXVCJ9.eyJteV9wcm9wZXJ0eSI6InNvbWUgdmFsdWUiLCJhdWQiOiJnby1raXQifQ.s8F-IDrV4WPJUsqr7qfDi-3GRlcKR0SRnkTeUT_U-i0" - invalidKey = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.e30.vKVCKto-Wn6rgz3vBdaZaCBGfCBDTXOENSo_X2Gq7qA" - malformedKey = "malformed.jwt.token" -) - -func signingValidator(t *testing.T, signer endpoint.Endpoint, expectedKey string) { - ctx, err := signer(context.Background(), struct{}{}) - if err != nil { - t.Fatalf("Signer returned error: %s", err) - } - - token, ok := ctx.(context.Context).Value(JWTTokenContextKey).(string) - if !ok { - t.Fatal("Token did not exist in context") - } - - if token != expectedKey { - t.Fatalf("JWT tokens did not match: expecting %s got %s", expectedKey, token) - } -} - -func TestNewSigner(t *testing.T) { - e := func(ctx context.Context, i interface{}) (interface{}, error) { return ctx, nil } - - signer := NewSigner(kid, key, method, mapClaims)(e) - signingValidator(t, signer, signedKey) - - signer = NewSigner(kid, key, method, standardClaims)(e) - signingValidator(t, signer, standardSignedKey) - - signer = NewSigner(kid, key, method, myCustomClaims)(e) - signingValidator(t, signer, customSignedKey) -} - -func TestJWTParser(t *testing.T) { - e := func(ctx context.Context, i interface{}) (interface{}, error) { return ctx, nil } - - keys := func(token *jwt.Token) (interface{}, error) { - return key, nil - } - - parser := NewParser(keys, method, MapClaimsFactory)(e) - - // No Token is passed into the parser - _, err := parser(context.Background(), struct{}{}) - if err == nil { - t.Error("Parser should have returned an error") - } - - if err != ErrTokenContextMissing { - t.Errorf("unexpected error returned, expected: %s got: %s", ErrTokenContextMissing, err) - } - - // Invalid Token is passed into the parser - ctx := context.WithValue(context.Background(), JWTTokenContextKey, invalidKey) - _, err = parser(ctx, struct{}{}) - if err == nil { - t.Error("Parser should have returned an error") - } - - // Invalid Method is used in the parser - badParser := NewParser(keys, invalidMethod, MapClaimsFactory)(e) - ctx = context.WithValue(context.Background(), JWTTokenContextKey, signedKey) - _, err = badParser(ctx, struct{}{}) - if err == nil { - t.Error("Parser should have returned an error") - } - - if err != ErrUnexpectedSigningMethod { - t.Errorf("unexpected error returned, expected: %s got: %s", ErrUnexpectedSigningMethod, err) - } - - // Invalid key is used in the parser - invalidKeys := func(token *jwt.Token) (interface{}, error) { - return []byte("bad"), nil - } - - badParser = NewParser(invalidKeys, method, MapClaimsFactory)(e) - ctx = context.WithValue(context.Background(), JWTTokenContextKey, signedKey) - _, err = badParser(ctx, struct{}{}) - if err == nil { - t.Error("Parser should have returned an error") - } - - // Correct token is passed into the parser - ctx = context.WithValue(context.Background(), JWTTokenContextKey, signedKey) - ctx1, err := parser(ctx, struct{}{}) - if err != nil { - t.Fatalf("Parser returned error: %s", err) - } - - cl, ok := ctx1.(context.Context).Value(JWTClaimsContextKey).(jwt.MapClaims) - if !ok { - t.Fatal("Claims were not passed into context correctly") - } - - if cl["user"] != mapClaims["user"] { - t.Fatalf("JWT Claims.user did not match: expecting %s got %s", mapClaims["user"], cl["user"]) - } - - // Test for malformed token error response - parser = NewParser(keys, method, StandardClaimsFactory)(e) - ctx = context.WithValue(context.Background(), JWTTokenContextKey, malformedKey) - ctx1, err = parser(ctx, struct{}{}) - if want, have := ErrTokenMalformed, err; want != have { - t.Fatalf("Expected %+v, got %+v", want, have) - } - - // Test for expired token error response - parser = NewParser(keys, method, StandardClaimsFactory)(e) - expired := jwt.NewWithClaims(method, jwt.StandardClaims{ExpiresAt: time.Now().Unix() - 100}) - token, err := expired.SignedString(key) - if err != nil { - t.Fatalf("Unable to Sign Token: %+v", err) - } - ctx = context.WithValue(context.Background(), JWTTokenContextKey, token) - ctx1, err = parser(ctx, struct{}{}) - if want, have := ErrTokenExpired, err; want != have { - t.Fatalf("Expected %+v, got %+v", want, have) - } - - // Test for not activated token error response - parser = NewParser(keys, method, StandardClaimsFactory)(e) - notactive := jwt.NewWithClaims(method, jwt.StandardClaims{NotBefore: time.Now().Unix() + 100}) - token, err = notactive.SignedString(key) - if err != nil { - t.Fatalf("Unable to Sign Token: %+v", err) - } - ctx = context.WithValue(context.Background(), JWTTokenContextKey, token) - ctx1, err = parser(ctx, struct{}{}) - if want, have := ErrTokenNotActive, err; want != have { - t.Fatalf("Expected %+v, got %+v", want, have) - } - - // test valid standard claims token - parser = NewParser(keys, method, StandardClaimsFactory)(e) - ctx = context.WithValue(context.Background(), JWTTokenContextKey, standardSignedKey) - ctx1, err = parser(ctx, struct{}{}) - if err != nil { - t.Fatalf("Parser returned error: %s", err) - } - stdCl, ok := ctx1.(context.Context).Value(JWTClaimsContextKey).(*jwt.StandardClaims) - if !ok { - t.Fatal("Claims were not passed into context correctly") - } - if !stdCl.VerifyAudience("go-kit", true) { - t.Fatalf("JWT jwt.StandardClaims.Audience did not match: expecting %s got %s", standardClaims.Audience, stdCl.Audience) - } - - // test valid customized claims token - parser = NewParser(keys, method, func() jwt.Claims { return &customClaims{} })(e) - ctx = context.WithValue(context.Background(), JWTTokenContextKey, customSignedKey) - ctx1, err = parser(ctx, struct{}{}) - if err != nil { - t.Fatalf("Parser returned error: %s", err) - } - custCl, ok := ctx1.(context.Context).Value(JWTClaimsContextKey).(*customClaims) - if !ok { - t.Fatal("Claims were not passed into context correctly") - } - if !custCl.VerifyAudience("go-kit", true) { - t.Fatalf("JWT customClaims.Audience did not match: expecting %s got %s", standardClaims.Audience, custCl.Audience) - } - if !custCl.VerifyMyProperty(myProperty) { - t.Fatalf("JWT customClaims.MyProperty did not match: expecting %s got %s", myProperty, custCl.MyProperty) - } -} - -func TestIssue562(t *testing.T) { - var ( - kf = func(token *jwt.Token) (interface{}, error) { return []byte("secret"), nil } - e = NewParser(kf, jwt.SigningMethodHS256, MapClaimsFactory)(endpoint.Nop) - key = JWTTokenContextKey - val = "eyJhbGciOiJIUzI1NiIsImtpZCI6ImtpZCIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiZ28ta2l0In0.14M2VmYyApdSlV_LZ88ajjwuaLeIFplB8JpyNy0A19E" - ctx = context.WithValue(context.Background(), key, val) - ) - wg := sync.WaitGroup{} - for i := 0; i < 100; i++ { - wg.Add(1) - go func() { - defer wg.Done() - e(ctx, struct{}{}) // fatal error: concurrent map read and map write - }() - } - wg.Wait() -} diff --git a/vendor/github.com/go-kit/kit/auth/jwt/transport.go b/vendor/github.com/go-kit/kit/auth/jwt/transport.go deleted file mode 100644 index 57b3aaee..00000000 --- a/vendor/github.com/go-kit/kit/auth/jwt/transport.go +++ /dev/null @@ -1,89 +0,0 @@ -package jwt - -import ( - "context" - "fmt" - stdhttp "net/http" - "strings" - - "google.golang.org/grpc/metadata" - - "github.com/go-kit/kit/transport/grpc" - "github.com/go-kit/kit/transport/http" -) - -const ( - bearer string = "bearer" - bearerFormat string = "Bearer %s" -) - -// HTTPToContext moves a JWT from request header to context. Particularly -// useful for servers. -func HTTPToContext() http.RequestFunc { - return func(ctx context.Context, r *stdhttp.Request) context.Context { - token, ok := extractTokenFromAuthHeader(r.Header.Get("Authorization")) - if !ok { - return ctx - } - - return context.WithValue(ctx, JWTTokenContextKey, token) - } -} - -// ContextToHTTP moves a JWT from context to request header. Particularly -// useful for clients. -func ContextToHTTP() http.RequestFunc { - return func(ctx context.Context, r *stdhttp.Request) context.Context { - token, ok := ctx.Value(JWTTokenContextKey).(string) - if ok { - r.Header.Add("Authorization", generateAuthHeaderFromToken(token)) - } - return ctx - } -} - -// GRPCToContext moves a JWT from grpc metadata to context. Particularly -// userful for servers. -func GRPCToContext() grpc.ServerRequestFunc { - return func(ctx context.Context, md metadata.MD) context.Context { - // capital "Key" is illegal in HTTP/2. - authHeader, ok := md["authorization"] - if !ok { - return ctx - } - - token, ok := extractTokenFromAuthHeader(authHeader[0]) - if ok { - ctx = context.WithValue(ctx, JWTTokenContextKey, token) - } - - return ctx - } -} - -// ContextToGRPC moves a JWT from context to grpc metadata. Particularly -// useful for clients. -func ContextToGRPC() grpc.ClientRequestFunc { - return func(ctx context.Context, md *metadata.MD) context.Context { - token, ok := ctx.Value(JWTTokenContextKey).(string) - if ok { - // capital "Key" is illegal in HTTP/2. - (*md)["authorization"] = []string{generateAuthHeaderFromToken(token)} - } - - return ctx - } -} - -func extractTokenFromAuthHeader(val string) (token string, ok bool) { - authHeaderParts := strings.Split(val, " ") - if len(authHeaderParts) != 2 || strings.ToLower(authHeaderParts[0]) != bearer { - return "", false - } - - return authHeaderParts[1], true -} - -func generateAuthHeaderFromToken(token string) string { - return fmt.Sprintf(bearerFormat, token) -} diff --git a/vendor/github.com/go-kit/kit/auth/jwt/transport_test.go b/vendor/github.com/go-kit/kit/auth/jwt/transport_test.go deleted file mode 100644 index 83d0f17f..00000000 --- a/vendor/github.com/go-kit/kit/auth/jwt/transport_test.go +++ /dev/null @@ -1,125 +0,0 @@ -package jwt - -import ( - "context" - "fmt" - "net/http" - "testing" - - "google.golang.org/grpc/metadata" -) - -func TestHTTPToContext(t *testing.T) { - reqFunc := HTTPToContext() - - // When the header doesn't exist - ctx := reqFunc(context.Background(), &http.Request{}) - - if ctx.Value(JWTTokenContextKey) != nil { - t.Error("Context shouldn't contain the encoded JWT") - } - - // Authorization header value has invalid format - header := http.Header{} - header.Set("Authorization", "no expected auth header format value") - ctx = reqFunc(context.Background(), &http.Request{Header: header}) - - if ctx.Value(JWTTokenContextKey) != nil { - t.Error("Context shouldn't contain the encoded JWT") - } - - // Authorization header is correct - header.Set("Authorization", generateAuthHeaderFromToken(signedKey)) - ctx = reqFunc(context.Background(), &http.Request{Header: header}) - - token := ctx.Value(JWTTokenContextKey).(string) - if token != signedKey { - t.Errorf("Context doesn't contain the expected encoded token value; expected: %s, got: %s", signedKey, token) - } -} - -func TestContextToHTTP(t *testing.T) { - reqFunc := ContextToHTTP() - - // No JWT Token is passed in the context - ctx := context.Background() - r := http.Request{} - reqFunc(ctx, &r) - - token := r.Header.Get("Authorization") - if token != "" { - t.Error("authorization key should not exist in metadata") - } - - // Correct JWT Token is passed in the context - ctx = context.WithValue(context.Background(), JWTTokenContextKey, signedKey) - r = http.Request{Header: http.Header{}} - reqFunc(ctx, &r) - - token = r.Header.Get("Authorization") - expected := generateAuthHeaderFromToken(signedKey) - - if token != expected { - t.Errorf("Authorization header does not contain the expected JWT token; expected %s, got %s", expected, token) - } -} - -func TestGRPCToContext(t *testing.T) { - md := metadata.MD{} - reqFunc := GRPCToContext() - - // No Authorization header is passed - ctx := reqFunc(context.Background(), md) - token := ctx.Value(JWTTokenContextKey) - if token != nil { - t.Error("Context should not contain a JWT Token") - } - - // Invalid Authorization header is passed - md["authorization"] = []string{fmt.Sprintf("%s", signedKey)} - ctx = reqFunc(context.Background(), md) - token = ctx.Value(JWTTokenContextKey) - if token != nil { - t.Error("Context should not contain a JWT Token") - } - - // Authorization header is correct - md["authorization"] = []string{fmt.Sprintf("Bearer %s", signedKey)} - ctx = reqFunc(context.Background(), md) - token, ok := ctx.Value(JWTTokenContextKey).(string) - if !ok { - t.Fatal("JWT Token not passed to context correctly") - } - - if token != signedKey { - t.Errorf("JWT tokens did not match: expecting %s got %s", signedKey, token) - } -} - -func TestContextToGRPC(t *testing.T) { - reqFunc := ContextToGRPC() - - // No JWT Token is passed in the context - ctx := context.Background() - md := metadata.MD{} - reqFunc(ctx, &md) - - _, ok := md["authorization"] - if ok { - t.Error("authorization key should not exist in metadata") - } - - // Correct JWT Token is passed in the context - ctx = context.WithValue(context.Background(), JWTTokenContextKey, signedKey) - md = metadata.MD{} - reqFunc(ctx, &md) - - token, ok := md["authorization"] - if !ok { - t.Fatal("JWT Token not passed to metadata correctly") - } - - if token[0] != generateAuthHeaderFromToken(signedKey) { - t.Errorf("JWT tokens did not match: expecting %s got %s", signedKey, token[0]) - } -} diff --git a/vendor/github.com/go-kit/kit/circle.yml b/vendor/github.com/go-kit/kit/circle.yml deleted file mode 100644 index 35ace2ce..00000000 --- a/vendor/github.com/go-kit/kit/circle.yml +++ /dev/null @@ -1,27 +0,0 @@ -machine: - pre: - - curl -sSL https://s3.amazonaws.com/circle-downloads/install-circleci-docker.sh | bash -s -- 1.10.0 - - sudo rm -rf /usr/local/go - - curl -sSL https://storage.googleapis.com/golang/go1.9.linux-amd64.tar.gz | sudo tar xz -C /usr/local - services: - - docker - -dependencies: - pre: - - sudo curl -L "https://github.com/docker/compose/releases/download/1.10.0/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose - - sudo chmod +x /usr/local/bin/docker-compose - - docker-compose -f docker-compose-integration.yml up -d --force-recreate - -test: - pre: - - mkdir -p /home/ubuntu/.go_workspace/src/github.com/go-kit - - mv /home/ubuntu/kit /home/ubuntu/.go_workspace/src/github.com/go-kit - - ln -s /home/ubuntu/.go_workspace/src/github.com/go-kit/kit /home/ubuntu/kit - - go get -t github.com/go-kit/kit/... - override: - - go test -v -race -tags integration github.com/go-kit/kit/...: - environment: - ETCD_ADDR: http://localhost:2379 - CONSUL_ADDR: localhost:8500 - ZK_ADDR: localhost:2181 - EUREKA_ADDR: http://localhost:8761/eureka diff --git a/vendor/github.com/go-kit/kit/circuitbreaker/doc.go b/vendor/github.com/go-kit/kit/circuitbreaker/doc.go deleted file mode 100644 index fe749575..00000000 --- a/vendor/github.com/go-kit/kit/circuitbreaker/doc.go +++ /dev/null @@ -1,10 +0,0 @@ -// Package circuitbreaker implements the circuit breaker pattern. -// -// Circuit breakers prevent thundering herds, and improve resiliency against -// intermittent errors. Every client-side endpoint should be wrapped in a -// circuit breaker. -// -// We provide several implementations in this package, but if you're looking -// for guidance, Gobreaker is probably the best place to start. It has a -// simple and intuitive API, and is well-tested. -package circuitbreaker diff --git a/vendor/github.com/go-kit/kit/circuitbreaker/gobreaker.go b/vendor/github.com/go-kit/kit/circuitbreaker/gobreaker.go deleted file mode 100644 index cf06304f..00000000 --- a/vendor/github.com/go-kit/kit/circuitbreaker/gobreaker.go +++ /dev/null @@ -1,22 +0,0 @@ -package circuitbreaker - -import ( - "context" - - "github.com/sony/gobreaker" - - "github.com/go-kit/kit/endpoint" -) - -// Gobreaker returns an endpoint.Middleware that implements the circuit -// breaker pattern using the sony/gobreaker package. Only errors returned by -// the wrapped endpoint count against the circuit breaker's error count. -// -// See http://godoc.org/github.com/sony/gobreaker for more information. -func Gobreaker(cb *gobreaker.CircuitBreaker) endpoint.Middleware { - return func(next endpoint.Endpoint) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - return cb.Execute(func() (interface{}, error) { return next(ctx, request) }) - } - } -} diff --git a/vendor/github.com/go-kit/kit/circuitbreaker/gobreaker_test.go b/vendor/github.com/go-kit/kit/circuitbreaker/gobreaker_test.go deleted file mode 100644 index b581cfe5..00000000 --- a/vendor/github.com/go-kit/kit/circuitbreaker/gobreaker_test.go +++ /dev/null @@ -1,19 +0,0 @@ -package circuitbreaker_test - -import ( - "testing" - - "github.com/sony/gobreaker" - - "github.com/go-kit/kit/circuitbreaker" -) - -func TestGobreaker(t *testing.T) { - var ( - breaker = circuitbreaker.Gobreaker(gobreaker.NewCircuitBreaker(gobreaker.Settings{})) - primeWith = 100 - shouldPass = func(n int) bool { return n <= 5 } // https://github.com/sony/gobreaker/blob/bfa846d/gobreaker.go#L76 - circuitOpenError = "circuit breaker is open" - ) - testFailingEndpoint(t, breaker, primeWith, shouldPass, 0, circuitOpenError) -} diff --git a/vendor/github.com/go-kit/kit/circuitbreaker/handy_breaker.go b/vendor/github.com/go-kit/kit/circuitbreaker/handy_breaker.go deleted file mode 100644 index a5b60be2..00000000 --- a/vendor/github.com/go-kit/kit/circuitbreaker/handy_breaker.go +++ /dev/null @@ -1,38 +0,0 @@ -package circuitbreaker - -import ( - "context" - "time" - - "github.com/streadway/handy/breaker" - - "github.com/go-kit/kit/endpoint" -) - -// HandyBreaker returns an endpoint.Middleware that implements the circuit -// breaker pattern using the streadway/handy/breaker package. Only errors -// returned by the wrapped endpoint count against the circuit breaker's error -// count. -// -// See http://godoc.org/github.com/streadway/handy/breaker for more -// information. -func HandyBreaker(cb breaker.Breaker) endpoint.Middleware { - return func(next endpoint.Endpoint) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (response interface{}, err error) { - if !cb.Allow() { - return nil, breaker.ErrCircuitOpen - } - - defer func(begin time.Time) { - if err == nil { - cb.Success(time.Since(begin)) - } else { - cb.Failure(time.Since(begin)) - } - }(time.Now()) - - response, err = next(ctx, request) - return - } - } -} diff --git a/vendor/github.com/go-kit/kit/circuitbreaker/handy_breaker_test.go b/vendor/github.com/go-kit/kit/circuitbreaker/handy_breaker_test.go deleted file mode 100644 index f3642a10..00000000 --- a/vendor/github.com/go-kit/kit/circuitbreaker/handy_breaker_test.go +++ /dev/null @@ -1,20 +0,0 @@ -package circuitbreaker_test - -import ( - "testing" - - handybreaker "github.com/streadway/handy/breaker" - - "github.com/go-kit/kit/circuitbreaker" -) - -func TestHandyBreaker(t *testing.T) { - var ( - failureRatio = 0.05 - breaker = circuitbreaker.HandyBreaker(handybreaker.NewBreaker(failureRatio)) - primeWith = handybreaker.DefaultMinObservations * 10 - shouldPass = func(n int) bool { return (float64(n) / float64(primeWith+n)) <= failureRatio } - openCircuitError = handybreaker.ErrCircuitOpen.Error() - ) - testFailingEndpoint(t, breaker, primeWith, shouldPass, 0, openCircuitError) -} diff --git a/vendor/github.com/go-kit/kit/circuitbreaker/hystrix.go b/vendor/github.com/go-kit/kit/circuitbreaker/hystrix.go deleted file mode 100644 index 3c59ec41..00000000 --- a/vendor/github.com/go-kit/kit/circuitbreaker/hystrix.go +++ /dev/null @@ -1,31 +0,0 @@ -package circuitbreaker - -import ( - "context" - - "github.com/afex/hystrix-go/hystrix" - - "github.com/go-kit/kit/endpoint" -) - -// Hystrix returns an endpoint.Middleware that implements the circuit -// breaker pattern using the afex/hystrix-go package. -// -// When using this circuit breaker, please configure your commands separately. -// -// See https://godoc.org/github.com/afex/hystrix-go/hystrix for more -// information. -func Hystrix(commandName string) endpoint.Middleware { - return func(next endpoint.Endpoint) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (response interface{}, err error) { - var resp interface{} - if err := hystrix.Do(commandName, func() (err error) { - resp, err = next(ctx, request) - return err - }, nil); err != nil { - return nil, err - } - return resp, nil - } - } -} diff --git a/vendor/github.com/go-kit/kit/circuitbreaker/hystrix_test.go b/vendor/github.com/go-kit/kit/circuitbreaker/hystrix_test.go deleted file mode 100644 index da527576..00000000 --- a/vendor/github.com/go-kit/kit/circuitbreaker/hystrix_test.go +++ /dev/null @@ -1,40 +0,0 @@ -package circuitbreaker_test - -import ( - "io/ioutil" - stdlog "log" - "testing" - "time" - - "github.com/afex/hystrix-go/hystrix" - - "github.com/go-kit/kit/circuitbreaker" -) - -func TestHystrix(t *testing.T) { - stdlog.SetOutput(ioutil.Discard) - - const ( - commandName = "my-endpoint" - errorPercent = 5 - maxConcurrent = 1000 - ) - hystrix.ConfigureCommand(commandName, hystrix.CommandConfig{ - ErrorPercentThreshold: errorPercent, - MaxConcurrentRequests: maxConcurrent, - }) - - var ( - breaker = circuitbreaker.Hystrix(commandName) - primeWith = hystrix.DefaultVolumeThreshold * 2 - shouldPass = func(n int) bool { return (float64(n) / float64(primeWith+n)) <= (float64(errorPercent-1) / 100.0) } - openCircuitError = hystrix.ErrCircuitOpen.Error() - ) - - // hystrix-go uses buffered channels to receive reports on request success/failure, - // and so is basically impossible to test deterministically. We have to make sure - // the report buffer is emptied, by injecting a sleep between each invocation. - requestDelay := 5 * time.Millisecond - - testFailingEndpoint(t, breaker, primeWith, shouldPass, requestDelay, openCircuitError) -} diff --git a/vendor/github.com/go-kit/kit/circuitbreaker/util_test.go b/vendor/github.com/go-kit/kit/circuitbreaker/util_test.go deleted file mode 100644 index 25123805..00000000 --- a/vendor/github.com/go-kit/kit/circuitbreaker/util_test.go +++ /dev/null @@ -1,75 +0,0 @@ -package circuitbreaker_test - -import ( - "context" - "errors" - "fmt" - "path/filepath" - "runtime" - "testing" - "time" - - "github.com/go-kit/kit/endpoint" -) - -func testFailingEndpoint( - t *testing.T, - breaker endpoint.Middleware, - primeWith int, - shouldPass func(int) bool, - requestDelay time.Duration, - openCircuitError string, -) { - _, file, line, _ := runtime.Caller(1) - caller := fmt.Sprintf("%s:%d", filepath.Base(file), line) - - // Create a mock endpoint and wrap it with the breaker. - m := mock{} - var e endpoint.Endpoint - e = m.endpoint - e = breaker(e) - - // Prime the endpoint with successful requests. - for i := 0; i < primeWith; i++ { - if _, err := e(context.Background(), struct{}{}); err != nil { - t.Fatalf("%s: during priming, got error: %v", caller, err) - } - time.Sleep(requestDelay) - } - - // Switch the endpoint to start throwing errors. - m.err = errors.New("tragedy+disaster") - m.through = 0 - - // The first several should be allowed through and yield our error. - for i := 0; shouldPass(i); i++ { - if _, err := e(context.Background(), struct{}{}); err != m.err { - t.Fatalf("%s: want %v, have %v", caller, m.err, err) - } - time.Sleep(requestDelay) - } - through := m.through - - // But the rest should be blocked by an open circuit. - for i := 0; i < 10; i++ { - if _, err := e(context.Background(), struct{}{}); err.Error() != openCircuitError { - t.Fatalf("%s: want %q, have %q", caller, openCircuitError, err.Error()) - } - time.Sleep(requestDelay) - } - - // Make sure none of those got through. - if want, have := through, m.through; want != have { - t.Errorf("%s: want %d, have %d", caller, want, have) - } -} - -type mock struct { - through int - err error -} - -func (m *mock) endpoint(context.Context, interface{}) (interface{}, error) { - m.through++ - return struct{}{}, m.err -} diff --git a/vendor/github.com/go-kit/kit/coveralls.bash b/vendor/github.com/go-kit/kit/coveralls.bash deleted file mode 100755 index cf8fee93..00000000 --- a/vendor/github.com/go-kit/kit/coveralls.bash +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env bash - -if ! type -P gover -then - echo gover missing: go get github.com/modocache/gover - exit 1 -fi - -if ! type -P goveralls -then - echo goveralls missing: go get github.com/mattn/goveralls - exit 1 -fi - -if [[ "$COVERALLS_TOKEN" == "" ]] -then - echo COVERALLS_TOKEN not set - exit 1 -fi - -go list ./... | grep -v '/examples/' | cut -d'/' -f 4- | while read d -do - cd $d - go test -covermode count -coverprofile coverage.coverprofile - cd - -done - -gover -goveralls -coverprofile gover.coverprofile -service travis-ci -repotoken $COVERALLS_TOKEN -find . -name '*.coverprofile' -delete - diff --git a/vendor/github.com/go-kit/kit/docker-compose-integration.yml b/vendor/github.com/go-kit/kit/docker-compose-integration.yml deleted file mode 100644 index 287d97db..00000000 --- a/vendor/github.com/go-kit/kit/docker-compose-integration.yml +++ /dev/null @@ -1,22 +0,0 @@ -version: '2' -services: - etcd: - image: quay.io/coreos/etcd - ports: - - "2379:2379" - command: /usr/local/bin/etcd -advertise-client-urls http://0.0.0.0:2379,http://0.0.0.0:4001 -listen-client-urls "http://0.0.0.0:2379,http://0.0.0.0:4001" - consul: - image: progrium/consul - ports: - - "8500:8500" - command: -server -bootstrap - zk: - image: zookeeper - ports: - - "2181:2181" - eureka: - image: springcloud/eureka - environment: - eureka.server.responseCacheUpdateIntervalMs: 1000 - ports: - - "8761:8761" diff --git a/vendor/github.com/go-kit/kit/endpoint/doc.go b/vendor/github.com/go-kit/kit/endpoint/doc.go deleted file mode 100644 index 84e27b95..00000000 --- a/vendor/github.com/go-kit/kit/endpoint/doc.go +++ /dev/null @@ -1,5 +0,0 @@ -// Package endpoint defines an abstraction for RPCs. -// -// Endpoints are a fundamental building block for many Go kit components. -// Endpoints are implemented by servers, and called by clients. -package endpoint diff --git a/vendor/github.com/go-kit/kit/endpoint/endpoint.go b/vendor/github.com/go-kit/kit/endpoint/endpoint.go deleted file mode 100644 index 1b64f50e..00000000 --- a/vendor/github.com/go-kit/kit/endpoint/endpoint.go +++ /dev/null @@ -1,28 +0,0 @@ -package endpoint - -import ( - "context" -) - -// Endpoint is the fundamental building block of servers and clients. -// It represents a single RPC method. -type Endpoint func(ctx context.Context, request interface{}) (response interface{}, err error) - -// Nop is an endpoint that does nothing and returns a nil error. -// Useful for tests. -func Nop(context.Context, interface{}) (interface{}, error) { return struct{}{}, nil } - -// Middleware is a chainable behavior modifier for endpoints. -type Middleware func(Endpoint) Endpoint - -// Chain is a helper function for composing middlewares. Requests will -// traverse them in the order they're declared. That is, the first middleware -// is treated as the outermost middleware. -func Chain(outer Middleware, others ...Middleware) Middleware { - return func(next Endpoint) Endpoint { - for i := len(others) - 1; i >= 0; i-- { // reverse - next = others[i](next) - } - return outer(next) - } -} diff --git a/vendor/github.com/go-kit/kit/endpoint/endpoint_example_test.go b/vendor/github.com/go-kit/kit/endpoint/endpoint_example_test.go deleted file mode 100644 index e9506230..00000000 --- a/vendor/github.com/go-kit/kit/endpoint/endpoint_example_test.go +++ /dev/null @@ -1,49 +0,0 @@ -package endpoint_test - -import ( - "context" - "fmt" - - "github.com/go-kit/kit/endpoint" -) - -func ExampleChain() { - e := endpoint.Chain( - annotate("first"), - annotate("second"), - annotate("third"), - )(myEndpoint) - - if _, err := e(ctx, req); err != nil { - panic(err) - } - - // Output: - // first pre - // second pre - // third pre - // my endpoint! - // third post - // second post - // first post -} - -var ( - ctx = context.Background() - req = struct{}{} -) - -func annotate(s string) endpoint.Middleware { - return func(next endpoint.Endpoint) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - fmt.Println(s, "pre") - defer fmt.Println(s, "post") - return next(ctx, request) - } - } -} - -func myEndpoint(context.Context, interface{}) (interface{}, error) { - fmt.Println("my endpoint!") - return struct{}{}, nil -} diff --git a/vendor/github.com/go-kit/kit/examples/README.md b/vendor/github.com/go-kit/kit/examples/README.md deleted file mode 100644 index 2891d788..00000000 --- a/vendor/github.com/go-kit/kit/examples/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Examples - -For more information about these examples, - including a walkthrough of the stringsvc example, - see [gokit.io/examples](https://gokit.io/examples). diff --git a/vendor/github.com/go-kit/kit/examples/addsvc/README.md b/vendor/github.com/go-kit/kit/examples/addsvc/README.md deleted file mode 100644 index 08080060..00000000 --- a/vendor/github.com/go-kit/kit/examples/addsvc/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# addsvc - -addsvc is an example microservice which takes full advantage of most of Go -kit's features, including both service- and transport-level middlewares, -speaking multiple transports simultaneously, distributed tracing, and rich -error definitions. The server binary is available in cmd/addsvc. The client -binary is available in cmd/addcli. - -Finally, the addtransport package provides both server and clients for each -supported transport. The client structs bake-in certain middlewares, in order to -demonstrate the _client library pattern_. But beware: client libraries are -generally a bad idea, because they easily lead to the - [distributed monolith antipattern](https://www.microservices.com/talks/dont-build-a-distributed-monolith/). -If you don't _know_ you need to use one in your organization, it's probably best -avoided: prefer moving that logic to consumers, and relying on - [contract testing](https://docs.pact.io/best_practices/contract_tests_not_functional_tests.html) -to detect incompatibilities. diff --git a/vendor/github.com/go-kit/kit/examples/addsvc/cmd/addcli/addcli.go b/vendor/github.com/go-kit/kit/examples/addsvc/cmd/addcli/addcli.go deleted file mode 100644 index fe24fc27..00000000 --- a/vendor/github.com/go-kit/kit/examples/addsvc/cmd/addcli/addcli.go +++ /dev/null @@ -1,198 +0,0 @@ -package main - -import ( - "context" - "flag" - "fmt" - "os" - "strconv" - "text/tabwriter" - "time" - - "google.golang.org/grpc" - - "github.com/apache/thrift/lib/go/thrift" - lightstep "github.com/lightstep/lightstep-tracer-go" - stdopentracing "github.com/opentracing/opentracing-go" - zipkin "github.com/openzipkin/zipkin-go-opentracing" - "sourcegraph.com/sourcegraph/appdash" - appdashot "sourcegraph.com/sourcegraph/appdash/opentracing" - - "github.com/go-kit/kit/log" - - "github.com/go-kit/kit/examples/addsvc/pkg/addservice" - "github.com/go-kit/kit/examples/addsvc/pkg/addtransport" - addthrift "github.com/go-kit/kit/examples/addsvc/thrift/gen-go/addsvc" -) - -func main() { - // The addcli presumes no service discovery system, and expects users to - // provide the direct address of an addsvc. This presumption is reflected in - // the addcli binary and the client packages: the -transport.addr flags - // and various client constructors both expect host:port strings. For an - // example service with a client built on top of a service discovery system, - // see profilesvc. - fs := flag.NewFlagSet("addcli", flag.ExitOnError) - var ( - httpAddr = fs.String("http-addr", "", "HTTP address of addsvc") - grpcAddr = fs.String("grpc-addr", "", "gRPC address of addsvc") - thriftAddr = fs.String("thrift-addr", "", "Thrift address of addsvc") - thriftProtocol = fs.String("thrift-protocol", "binary", "binary, compact, json, simplejson") - thriftBuffer = fs.Int("thrift-buffer", 0, "0 for unbuffered") - thriftFramed = fs.Bool("thrift-framed", false, "true to enable framing") - zipkinURL = fs.String("zipkin-url", "", "Enable Zipkin tracing via a collector URL e.g. http://localhost:9411/api/v1/spans") - lightstepToken = flag.String("lightstep-token", "", "Enable LightStep tracing via a LightStep access token") - appdashAddr = flag.String("appdash-addr", "", "Enable Appdash tracing via an Appdash server host:port") - method = fs.String("method", "sum", "sum, concat") - ) - fs.Usage = usageFor(fs, os.Args[0]+" [flags] ") - fs.Parse(os.Args[1:]) - if len(fs.Args()) != 2 { - fs.Usage() - os.Exit(1) - } - - // This is a demonstration client, which supports multiple tracers. - // Your clients will probably just use one tracer. - var tracer stdopentracing.Tracer - { - if *zipkinURL != "" { - collector, err := zipkin.NewHTTPCollector(*zipkinURL) - if err != nil { - fmt.Fprintln(os.Stderr, err.Error()) - os.Exit(1) - } - defer collector.Close() - var ( - debug = false - hostPort = "localhost:80" - serviceName = "addsvc" - ) - recorder := zipkin.NewRecorder(collector, debug, hostPort, serviceName) - tracer, err = zipkin.NewTracer(recorder) - if err != nil { - fmt.Fprintln(os.Stderr, err.Error()) - os.Exit(1) - } - } else if *lightstepToken != "" { - tracer = lightstep.NewTracer(lightstep.Options{ - AccessToken: *lightstepToken, - }) - defer lightstep.FlushLightStepTracer(tracer) - } else if *appdashAddr != "" { - tracer = appdashot.NewTracer(appdash.NewRemoteCollector(*appdashAddr)) - } else { - tracer = stdopentracing.GlobalTracer() // no-op - } - } - - // This is a demonstration client, which supports multiple transports. - // Your clients will probably just define and stick with 1 transport. - var ( - svc addservice.Service - err error - ) - if *httpAddr != "" { - svc, err = addtransport.NewHTTPClient(*httpAddr, tracer, log.NewNopLogger()) - } else if *grpcAddr != "" { - conn, err := grpc.Dial(*grpcAddr, grpc.WithInsecure(), grpc.WithTimeout(time.Second)) - if err != nil { - fmt.Fprintf(os.Stderr, "error: %v", err) - os.Exit(1) - } - defer conn.Close() - svc = addtransport.NewGRPCClient(conn, tracer, log.NewNopLogger()) - } else if *thriftAddr != "" { - // It's necessary to do all of this construction in the func main, - // because (among other reasons) we need to control the lifecycle of the - // Thrift transport, i.e. close it eventually. - var protocolFactory thrift.TProtocolFactory - switch *thriftProtocol { - case "compact": - protocolFactory = thrift.NewTCompactProtocolFactory() - case "simplejson": - protocolFactory = thrift.NewTSimpleJSONProtocolFactory() - case "json": - protocolFactory = thrift.NewTJSONProtocolFactory() - case "binary", "": - protocolFactory = thrift.NewTBinaryProtocolFactoryDefault() - default: - fmt.Fprintf(os.Stderr, "error: invalid protocol %q\n", *thriftProtocol) - os.Exit(1) - } - var transportFactory thrift.TTransportFactory - if *thriftBuffer > 0 { - transportFactory = thrift.NewTBufferedTransportFactory(*thriftBuffer) - } else { - transportFactory = thrift.NewTTransportFactory() - } - if *thriftFramed { - transportFactory = thrift.NewTFramedTransportFactory(transportFactory) - } - transportSocket, err := thrift.NewTSocket(*thriftAddr) - if err != nil { - fmt.Fprintf(os.Stderr, "error: %v\n", err) - os.Exit(1) - } - transport, err := transportFactory.GetTransport(transportSocket) - if err != nil { - fmt.Fprintf(os.Stderr, "error: %v\n", err) - os.Exit(1) - } - if err := transport.Open(); err != nil { - fmt.Fprintf(os.Stderr, "error: %v\n", err) - os.Exit(1) - } - defer transport.Close() - client := addthrift.NewAddServiceClientFactory(transport, protocolFactory) - svc = addtransport.NewThriftClient(client) - } else { - fmt.Fprintf(os.Stderr, "error: no remote address specified\n") - os.Exit(1) - } - if err != nil { - fmt.Fprintf(os.Stderr, "error: %v\n", err) - os.Exit(1) - } - - switch *method { - case "sum": - a, _ := strconv.ParseInt(fs.Args()[0], 10, 64) - b, _ := strconv.ParseInt(fs.Args()[1], 10, 64) - v, err := svc.Sum(context.Background(), int(a), int(b)) - if err != nil { - fmt.Fprintf(os.Stderr, "error: %v\n", err) - os.Exit(1) - } - fmt.Fprintf(os.Stdout, "%d + %d = %d\n", a, b, v) - - case "concat": - a := fs.Args()[0] - b := fs.Args()[1] - v, err := svc.Concat(context.Background(), a, b) - if err != nil { - fmt.Fprintf(os.Stderr, "error: %v\n", err) - os.Exit(1) - } - fmt.Fprintf(os.Stdout, "%q + %q = %q\n", a, b, v) - - default: - fmt.Fprintf(os.Stderr, "error: invalid method %q\n", method) - os.Exit(1) - } -} - -func usageFor(fs *flag.FlagSet, short string) func() { - return func() { - fmt.Fprintf(os.Stderr, "USAGE\n") - fmt.Fprintf(os.Stderr, " %s\n", short) - fmt.Fprintf(os.Stderr, "\n") - fmt.Fprintf(os.Stderr, "FLAGS\n") - w := tabwriter.NewWriter(os.Stderr, 0, 2, 2, ' ', 0) - fs.VisitAll(func(f *flag.Flag) { - fmt.Fprintf(w, "\t-%s %s\t%s\n", f.Name, f.DefValue, f.Usage) - }) - w.Flush() - fmt.Fprintf(os.Stderr, "\n") - } -} diff --git a/vendor/github.com/go-kit/kit/examples/addsvc/cmd/addsvc/addsvc.go b/vendor/github.com/go-kit/kit/examples/addsvc/cmd/addsvc/addsvc.go deleted file mode 100644 index b1886e2f..00000000 --- a/vendor/github.com/go-kit/kit/examples/addsvc/cmd/addsvc/addsvc.go +++ /dev/null @@ -1,279 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "net" - "net/http" - "os" - "os/signal" - "syscall" - "text/tabwriter" - - "github.com/apache/thrift/lib/go/thrift" - lightstep "github.com/lightstep/lightstep-tracer-go" - "github.com/oklog/oklog/pkg/group" - stdopentracing "github.com/opentracing/opentracing-go" - zipkin "github.com/openzipkin/zipkin-go-opentracing" - stdprometheus "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promhttp" - "google.golang.org/grpc" - "sourcegraph.com/sourcegraph/appdash" - appdashot "sourcegraph.com/sourcegraph/appdash/opentracing" - - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/metrics" - "github.com/go-kit/kit/metrics/prometheus" - - addpb "github.com/go-kit/kit/examples/addsvc/pb" - "github.com/go-kit/kit/examples/addsvc/pkg/addendpoint" - "github.com/go-kit/kit/examples/addsvc/pkg/addservice" - "github.com/go-kit/kit/examples/addsvc/pkg/addtransport" - addthrift "github.com/go-kit/kit/examples/addsvc/thrift/gen-go/addsvc" -) - -func main() { - // Define our flags. Your service probably won't need to bind listeners for - // *all* supported transports, or support both Zipkin and LightStep, and so - // on, but we do it here for demonstration purposes. - fs := flag.NewFlagSet("addsvc", flag.ExitOnError) - var ( - debugAddr = fs.String("debug.addr", ":8080", "Debug and metrics listen address") - httpAddr = fs.String("http-addr", ":8081", "HTTP listen address") - grpcAddr = fs.String("grpc-addr", ":8082", "gRPC listen address") - thriftAddr = fs.String("thrift-addr", ":8083", "Thrift listen address") - thriftProtocol = fs.String("thrift-protocol", "binary", "binary, compact, json, simplejson") - thriftBuffer = fs.Int("thrift-buffer", 0, "0 for unbuffered") - thriftFramed = fs.Bool("thrift-framed", false, "true to enable framing") - zipkinURL = fs.String("zipkin-url", "", "Enable Zipkin tracing via a collector URL e.g. http://localhost:9411/api/v1/spans") - lightstepToken = flag.String("lightstep-token", "", "Enable LightStep tracing via a LightStep access token") - appdashAddr = flag.String("appdash-addr", "", "Enable Appdash tracing via an Appdash server host:port") - ) - fs.Usage = usageFor(fs, os.Args[0]+" [flags]") - fs.Parse(os.Args[1:]) - - // Create a single logger, which we'll use and give to other components. - var logger log.Logger - { - logger = log.NewLogfmtLogger(os.Stderr) - logger = log.With(logger, "ts", log.DefaultTimestampUTC) - logger = log.With(logger, "caller", log.DefaultCaller) - } - - // Determine which tracer to use. We'll pass the tracer to all the - // components that use it, as a dependency. - var tracer stdopentracing.Tracer - { - if *zipkinURL != "" { - logger.Log("tracer", "Zipkin", "URL", *zipkinURL) - collector, err := zipkin.NewHTTPCollector(*zipkinURL) - if err != nil { - logger.Log("err", err) - os.Exit(1) - } - defer collector.Close() - var ( - debug = false - hostPort = "localhost:80" - serviceName = "addsvc" - ) - recorder := zipkin.NewRecorder(collector, debug, hostPort, serviceName) - tracer, err = zipkin.NewTracer(recorder) - if err != nil { - logger.Log("err", err) - os.Exit(1) - } - } else if *lightstepToken != "" { - logger.Log("tracer", "LightStep") // probably don't want to print out the token :) - tracer = lightstep.NewTracer(lightstep.Options{ - AccessToken: *lightstepToken, - }) - defer lightstep.FlushLightStepTracer(tracer) - } else if *appdashAddr != "" { - logger.Log("tracer", "Appdash", "addr", *appdashAddr) - tracer = appdashot.NewTracer(appdash.NewRemoteCollector(*appdashAddr)) - } else { - logger.Log("tracer", "none") - tracer = stdopentracing.GlobalTracer() // no-op - } - } - - // Create the (sparse) metrics we'll use in the service. They, too, are - // dependencies that we pass to components that use them. - var ints, chars metrics.Counter - { - // Business-level metrics. - ints = prometheus.NewCounterFrom(stdprometheus.CounterOpts{ - Namespace: "example", - Subsystem: "addsvc", - Name: "integers_summed", - Help: "Total count of integers summed via the Sum method.", - }, []string{}) - chars = prometheus.NewCounterFrom(stdprometheus.CounterOpts{ - Namespace: "example", - Subsystem: "addsvc", - Name: "characters_concatenated", - Help: "Total count of characters concatenated via the Concat method.", - }, []string{}) - } - var duration metrics.Histogram - { - // Endpoint-level metrics. - duration = prometheus.NewSummaryFrom(stdprometheus.SummaryOpts{ - Namespace: "example", - Subsystem: "addsvc", - Name: "request_duration_seconds", - Help: "Request duration in seconds.", - }, []string{"method", "success"}) - } - http.DefaultServeMux.Handle("/metrics", promhttp.Handler()) - - // Build the layers of the service "onion" from the inside out. First, the - // business logic service; then, the set of endpoints that wrap the service; - // and finally, a series of concrete transport adapters. The adapters, like - // the HTTP handler or the gRPC server, are the bridge between Go kit and - // the interfaces that the transports expect. Note that we're not binding - // them to ports or anything yet; we'll do that next. - var ( - service = addservice.New(logger, ints, chars) - endpoints = addendpoint.New(service, logger, duration, tracer) - httpHandler = addtransport.NewHTTPHandler(endpoints, tracer, logger) - grpcServer = addtransport.NewGRPCServer(endpoints, tracer, logger) - thriftServer = addtransport.NewThriftServer(endpoints) - ) - - // Now we're to the part of the func main where we want to start actually - // running things, like servers bound to listeners to receive connections. - // - // The method is the same for each component: add a new actor to the group - // struct, which is a combination of 2 anonymous functions: the first - // function actually runs the component, and the second function should - // interrupt the first function and cause it to return. It's in these - // functions that we actually bind the Go kit server/handler structs to the - // concrete transports and run them. - // - // Putting each component into its own block is mostly for aesthetics: it - // clearly demarcates the scope in which each listener/socket may be used. - var g group.Group - { - // The debug listener mounts the http.DefaultServeMux, and serves up - // stuff like the Prometheus metrics route, the Go debug and profiling - // routes, and so on. - debugListener, err := net.Listen("tcp", *debugAddr) - if err != nil { - logger.Log("transport", "debug/HTTP", "during", "Listen", "err", err) - os.Exit(1) - } - g.Add(func() error { - logger.Log("transport", "debug/HTTP", "addr", *debugAddr) - return http.Serve(debugListener, http.DefaultServeMux) - }, func(error) { - debugListener.Close() - }) - } - { - // The HTTP listener mounts the Go kit HTTP handler we created. - httpListener, err := net.Listen("tcp", *httpAddr) - if err != nil { - logger.Log("transport", "HTTP", "during", "Listen", "err", err) - os.Exit(1) - } - g.Add(func() error { - logger.Log("transport", "HTTP", "addr", *httpAddr) - return http.Serve(httpListener, httpHandler) - }, func(error) { - httpListener.Close() - }) - } - { - // The gRPC listener mounts the Go kit gRPC server we created. - grpcListener, err := net.Listen("tcp", *grpcAddr) - if err != nil { - logger.Log("transport", "gRPC", "during", "Listen", "err", err) - os.Exit(1) - } - g.Add(func() error { - logger.Log("transport", "gRPC", "addr", *grpcAddr) - baseServer := grpc.NewServer() - addpb.RegisterAddServer(baseServer, grpcServer) - return baseServer.Serve(grpcListener) - }, func(error) { - grpcListener.Close() - }) - } - { - // The Thrift socket mounts the Go kit Thrift server we created earlier. - // There's a lot of boilerplate involved here, related to configuring - // the protocol and transport; blame Thrift. - thriftSocket, err := thrift.NewTServerSocket(*thriftAddr) - if err != nil { - logger.Log("transport", "Thrift", "during", "Listen", "err", err) - os.Exit(1) - } - g.Add(func() error { - logger.Log("transport", "Thrift", "addr", *thriftAddr) - var protocolFactory thrift.TProtocolFactory - switch *thriftProtocol { - case "binary": - protocolFactory = thrift.NewTBinaryProtocolFactoryDefault() - case "compact": - protocolFactory = thrift.NewTCompactProtocolFactory() - case "json": - protocolFactory = thrift.NewTJSONProtocolFactory() - case "simplejson": - protocolFactory = thrift.NewTSimpleJSONProtocolFactory() - default: - return fmt.Errorf("invalid Thrift protocol %q", *thriftProtocol) - } - var transportFactory thrift.TTransportFactory - if *thriftBuffer > 0 { - transportFactory = thrift.NewTBufferedTransportFactory(*thriftBuffer) - } else { - transportFactory = thrift.NewTTransportFactory() - } - if *thriftFramed { - transportFactory = thrift.NewTFramedTransportFactory(transportFactory) - } - return thrift.NewTSimpleServer4( - addthrift.NewAddServiceProcessor(thriftServer), - thriftSocket, - transportFactory, - protocolFactory, - ).Serve() - }, func(error) { - thriftSocket.Close() - }) - } - { - // This function just sits and waits for ctrl-C. - cancelInterrupt := make(chan struct{}) - g.Add(func() error { - c := make(chan os.Signal, 1) - signal.Notify(c, syscall.SIGINT, syscall.SIGTERM) - select { - case sig := <-c: - return fmt.Errorf("received signal %s", sig) - case <-cancelInterrupt: - return nil - } - }, func(error) { - close(cancelInterrupt) - }) - } - logger.Log("exit", g.Run()) -} - -func usageFor(fs *flag.FlagSet, short string) func() { - return func() { - fmt.Fprintf(os.Stderr, "USAGE\n") - fmt.Fprintf(os.Stderr, " %s\n", short) - fmt.Fprintf(os.Stderr, "\n") - fmt.Fprintf(os.Stderr, "FLAGS\n") - w := tabwriter.NewWriter(os.Stderr, 0, 2, 2, ' ', 0) - fs.VisitAll(func(f *flag.Flag) { - fmt.Fprintf(w, "\t-%s %s\t%s\n", f.Name, f.DefValue, f.Usage) - }) - w.Flush() - fmt.Fprintf(os.Stderr, "\n") - } -} diff --git a/vendor/github.com/go-kit/kit/examples/addsvc/cmd/addsvc/pact_test.go b/vendor/github.com/go-kit/kit/examples/addsvc/cmd/addsvc/pact_test.go deleted file mode 100644 index 2c709b58..00000000 --- a/vendor/github.com/go-kit/kit/examples/addsvc/cmd/addsvc/pact_test.go +++ /dev/null @@ -1,55 +0,0 @@ -package main - -import ( - "fmt" - "net/http" - "os" - "strings" - "testing" - - "github.com/pact-foundation/pact-go/dsl" -) - -func TestPactStringsvcUppercase(t *testing.T) { - if os.Getenv("WRITE_PACTS") == "" { - t.Skip("skipping Pact contracts; set WRITE_PACTS environment variable to enable") - } - - pact := dsl.Pact{ - Port: 6666, - Consumer: "addsvc", - Provider: "stringsvc", - } - defer pact.Teardown() - - pact.AddInteraction(). - UponReceiving("stringsvc uppercase"). - WithRequest(dsl.Request{ - Headers: map[string]string{"Content-Type": "application/json; charset=utf-8"}, - Method: "POST", - Path: "/uppercase", - Body: `{"s":"foo"}`, - }). - WillRespondWith(dsl.Response{ - Status: 200, - Headers: map[string]string{"Content-Type": "application/json; charset=utf-8"}, - Body: `{"v":"FOO"}`, - }) - - if err := pact.Verify(func() error { - u := fmt.Sprintf("http://localhost:%d/uppercase", pact.Server.Port) - req, err := http.NewRequest("POST", u, strings.NewReader(`{"s":"foo"}`)) - if err != nil { - return err - } - req.Header.Set("Content-Type", "application/json; charset=utf-8") - if _, err = http.DefaultClient.Do(req); err != nil { - return err - } - return nil - }); err != nil { - t.Fatal(err) - } - - pact.WritePact() -} diff --git a/vendor/github.com/go-kit/kit/examples/addsvc/cmd/addsvc/wiring_test.go b/vendor/github.com/go-kit/kit/examples/addsvc/cmd/addsvc/wiring_test.go deleted file mode 100644 index ca64bac1..00000000 --- a/vendor/github.com/go-kit/kit/examples/addsvc/cmd/addsvc/wiring_test.go +++ /dev/null @@ -1,40 +0,0 @@ -package main - -import ( - "io/ioutil" - "net/http" - "net/http/httptest" - "strings" - "testing" - - "github.com/opentracing/opentracing-go" - - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/metrics/discard" - - "github.com/go-kit/kit/examples/addsvc/pkg/addendpoint" - "github.com/go-kit/kit/examples/addsvc/pkg/addservice" - "github.com/go-kit/kit/examples/addsvc/pkg/addtransport" -) - -func TestHTTP(t *testing.T) { - svc := addservice.New(log.NewNopLogger(), discard.NewCounter(), discard.NewCounter()) - eps := addendpoint.New(svc, log.NewNopLogger(), discard.NewHistogram(), opentracing.GlobalTracer()) - mux := addtransport.NewHTTPHandler(eps, opentracing.GlobalTracer(), log.NewNopLogger()) - srv := httptest.NewServer(mux) - defer srv.Close() - - for _, testcase := range []struct { - method, url, body, want string - }{ - {"GET", srv.URL + "/concat", `{"a":"1","b":"2"}`, `{"v":"12"}`}, - {"GET", srv.URL + "/sum", `{"a":1,"b":2}`, `{"v":3}`}, - } { - req, _ := http.NewRequest(testcase.method, testcase.url, strings.NewReader(testcase.body)) - resp, _ := http.DefaultClient.Do(req) - body, _ := ioutil.ReadAll(resp.Body) - if want, have := testcase.want, strings.TrimSpace(string(body)); want != have { - t.Errorf("%s %s %s: want %q, have %q", testcase.method, testcase.url, testcase.body, want, have) - } - } -} diff --git a/vendor/github.com/go-kit/kit/examples/addsvc/pb/addsvc.pb.go b/vendor/github.com/go-kit/kit/examples/addsvc/pb/addsvc.pb.go deleted file mode 100644 index 781b50b7..00000000 --- a/vendor/github.com/go-kit/kit/examples/addsvc/pb/addsvc.pb.go +++ /dev/null @@ -1,270 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: addsvc.proto - -/* -Package pb is a generated protocol buffer package. - -It is generated from these files: - addsvc.proto - -It has these top-level messages: - SumRequest - SumReply - ConcatRequest - ConcatReply -*/ -package pb - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" - -import ( - context "golang.org/x/net/context" - grpc "google.golang.org/grpc" -) - -// 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.ProtoPackageIsVersion2 // please upgrade the proto package - -// The sum request contains two parameters. -type SumRequest struct { - A int64 `protobuf:"varint,1,opt,name=a" json:"a,omitempty"` - B int64 `protobuf:"varint,2,opt,name=b" json:"b,omitempty"` -} - -func (m *SumRequest) Reset() { *m = SumRequest{} } -func (m *SumRequest) String() string { return proto.CompactTextString(m) } -func (*SumRequest) ProtoMessage() {} -func (*SumRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } - -func (m *SumRequest) GetA() int64 { - if m != nil { - return m.A - } - return 0 -} - -func (m *SumRequest) GetB() int64 { - if m != nil { - return m.B - } - return 0 -} - -// The sum response contains the result of the calculation. -type SumReply struct { - V int64 `protobuf:"varint,1,opt,name=v" json:"v,omitempty"` - Err string `protobuf:"bytes,2,opt,name=err" json:"err,omitempty"` -} - -func (m *SumReply) Reset() { *m = SumReply{} } -func (m *SumReply) String() string { return proto.CompactTextString(m) } -func (*SumReply) ProtoMessage() {} -func (*SumReply) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } - -func (m *SumReply) GetV() int64 { - if m != nil { - return m.V - } - return 0 -} - -func (m *SumReply) GetErr() string { - if m != nil { - return m.Err - } - return "" -} - -// The Concat request contains two parameters. -type ConcatRequest struct { - A string `protobuf:"bytes,1,opt,name=a" json:"a,omitempty"` - B string `protobuf:"bytes,2,opt,name=b" json:"b,omitempty"` -} - -func (m *ConcatRequest) Reset() { *m = ConcatRequest{} } -func (m *ConcatRequest) String() string { return proto.CompactTextString(m) } -func (*ConcatRequest) ProtoMessage() {} -func (*ConcatRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } - -func (m *ConcatRequest) GetA() string { - if m != nil { - return m.A - } - return "" -} - -func (m *ConcatRequest) GetB() string { - if m != nil { - return m.B - } - return "" -} - -// The Concat response contains the result of the concatenation. -type ConcatReply struct { - V string `protobuf:"bytes,1,opt,name=v" json:"v,omitempty"` - Err string `protobuf:"bytes,2,opt,name=err" json:"err,omitempty"` -} - -func (m *ConcatReply) Reset() { *m = ConcatReply{} } -func (m *ConcatReply) String() string { return proto.CompactTextString(m) } -func (*ConcatReply) ProtoMessage() {} -func (*ConcatReply) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } - -func (m *ConcatReply) GetV() string { - if m != nil { - return m.V - } - return "" -} - -func (m *ConcatReply) GetErr() string { - if m != nil { - return m.Err - } - return "" -} - -func init() { - proto.RegisterType((*SumRequest)(nil), "pb.SumRequest") - proto.RegisterType((*SumReply)(nil), "pb.SumReply") - proto.RegisterType((*ConcatRequest)(nil), "pb.ConcatRequest") - proto.RegisterType((*ConcatReply)(nil), "pb.ConcatReply") -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// Client API for Add service - -type AddClient interface { - // Sums two integers. - Sum(ctx context.Context, in *SumRequest, opts ...grpc.CallOption) (*SumReply, error) - // Concatenates two strings - Concat(ctx context.Context, in *ConcatRequest, opts ...grpc.CallOption) (*ConcatReply, error) -} - -type addClient struct { - cc *grpc.ClientConn -} - -func NewAddClient(cc *grpc.ClientConn) AddClient { - return &addClient{cc} -} - -func (c *addClient) Sum(ctx context.Context, in *SumRequest, opts ...grpc.CallOption) (*SumReply, error) { - out := new(SumReply) - err := grpc.Invoke(ctx, "/pb.Add/Sum", in, out, c.cc, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *addClient) Concat(ctx context.Context, in *ConcatRequest, opts ...grpc.CallOption) (*ConcatReply, error) { - out := new(ConcatReply) - err := grpc.Invoke(ctx, "/pb.Add/Concat", in, out, c.cc, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// Server API for Add service - -type AddServer interface { - // Sums two integers. - Sum(context.Context, *SumRequest) (*SumReply, error) - // Concatenates two strings - Concat(context.Context, *ConcatRequest) (*ConcatReply, error) -} - -func RegisterAddServer(s *grpc.Server, srv AddServer) { - s.RegisterService(&_Add_serviceDesc, srv) -} - -func _Add_Sum_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SumRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(AddServer).Sum(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/pb.Add/Sum", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AddServer).Sum(ctx, req.(*SumRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Add_Concat_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ConcatRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(AddServer).Concat(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/pb.Add/Concat", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AddServer).Concat(ctx, req.(*ConcatRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _Add_serviceDesc = grpc.ServiceDesc{ - ServiceName: "pb.Add", - HandlerType: (*AddServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "Sum", - Handler: _Add_Sum_Handler, - }, - { - MethodName: "Concat", - Handler: _Add_Concat_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "addsvc.proto", -} - -func init() { proto.RegisterFile("addsvc.proto", fileDescriptor0) } - -var fileDescriptor0 = []byte{ - // 189 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x49, 0x4c, 0x49, 0x29, - 0x2e, 0x4b, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x2a, 0x48, 0x52, 0xd2, 0xe0, 0xe2, - 0x0a, 0x2e, 0xcd, 0x0d, 0x4a, 0x2d, 0x2c, 0x4d, 0x2d, 0x2e, 0x11, 0xe2, 0xe1, 0x62, 0x4c, 0x94, - 0x60, 0x54, 0x60, 0xd4, 0x60, 0x0e, 0x62, 0x4c, 0x04, 0xf1, 0x92, 0x24, 0x98, 0x20, 0xbc, 0x24, - 0x25, 0x2d, 0x2e, 0x0e, 0xb0, 0xca, 0x82, 0x9c, 0x4a, 0x90, 0x4c, 0x19, 0x4c, 0x5d, 0x99, 0x90, - 0x00, 0x17, 0x73, 0x6a, 0x51, 0x11, 0x58, 0x25, 0x67, 0x10, 0x88, 0xa9, 0xa4, 0xcd, 0xc5, 0xeb, - 0x9c, 0x9f, 0x97, 0x9c, 0x58, 0x82, 0x61, 0x30, 0x27, 0x8a, 0xc1, 0x9c, 0x20, 0x83, 0x75, 0xb9, - 0xb8, 0x61, 0x8a, 0x51, 0xcc, 0xe6, 0xc4, 0x6a, 0xb6, 0x51, 0x0c, 0x17, 0xb3, 0x63, 0x4a, 0x8a, - 0x90, 0x2a, 0x17, 0x73, 0x70, 0x69, 0xae, 0x10, 0x9f, 0x5e, 0x41, 0x92, 0x1e, 0xc2, 0x07, 0x52, - 0x3c, 0x70, 0x7e, 0x41, 0x4e, 0xa5, 0x12, 0x83, 0x90, 0x1e, 0x17, 0x1b, 0xc4, 0x70, 0x21, 0x41, - 0x90, 0x0c, 0x8a, 0xab, 0xa4, 0xf8, 0x91, 0x85, 0xc0, 0xea, 0x93, 0xd8, 0xc0, 0x41, 0x63, 0x0c, - 0x08, 0x00, 0x00, 0xff, 0xff, 0xdc, 0x37, 0x81, 0x99, 0x2a, 0x01, 0x00, 0x00, -} diff --git a/vendor/github.com/go-kit/kit/examples/addsvc/pb/addsvc.proto b/vendor/github.com/go-kit/kit/examples/addsvc/pb/addsvc.proto deleted file mode 100644 index cf61532f..00000000 --- a/vendor/github.com/go-kit/kit/examples/addsvc/pb/addsvc.proto +++ /dev/null @@ -1,36 +0,0 @@ -syntax = "proto3"; - -package pb; - -// The Add service definition. -service Add { - // Sums two integers. - rpc Sum (SumRequest) returns (SumReply) {} - - // Concatenates two strings - rpc Concat (ConcatRequest) returns (ConcatReply) {} -} - -// The sum request contains two parameters. -message SumRequest { - int64 a = 1; - int64 b = 2; -} - -// The sum response contains the result of the calculation. -message SumReply { - int64 v = 1; - string err = 2; -} - -// The Concat request contains two parameters. -message ConcatRequest { - string a = 1; - string b = 2; -} - -// The Concat response contains the result of the concatenation. -message ConcatReply { - string v = 1; - string err = 2; -} diff --git a/vendor/github.com/go-kit/kit/examples/addsvc/pb/compile.sh b/vendor/github.com/go-kit/kit/examples/addsvc/pb/compile.sh deleted file mode 100755 index c0268442..00000000 --- a/vendor/github.com/go-kit/kit/examples/addsvc/pb/compile.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env sh - -# Install proto3 from source -# brew install autoconf automake libtool -# git clone https://github.com/google/protobuf -# ./autogen.sh ; ./configure ; make ; make install -# -# Update protoc Go bindings via -# go get -u github.com/golang/protobuf/{proto,protoc-gen-go} -# -# See also -# https://github.com/grpc/grpc-go/tree/master/examples - -protoc addsvc.proto --go_out=plugins=grpc:. diff --git a/vendor/github.com/go-kit/kit/examples/addsvc/pkg/addendpoint/middleware.go b/vendor/github.com/go-kit/kit/examples/addsvc/pkg/addendpoint/middleware.go deleted file mode 100644 index c83047b7..00000000 --- a/vendor/github.com/go-kit/kit/examples/addsvc/pkg/addendpoint/middleware.go +++ /dev/null @@ -1,43 +0,0 @@ -package addendpoint - -import ( - "context" - "fmt" - "time" - - "github.com/go-kit/kit/endpoint" - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/metrics" -) - -// InstrumentingMiddleware returns an endpoint middleware that records -// the duration of each invocation to the passed histogram. The middleware adds -// a single field: "success", which is "true" if no error is returned, and -// "false" otherwise. -func InstrumentingMiddleware(duration metrics.Histogram) endpoint.Middleware { - return func(next endpoint.Endpoint) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (response interface{}, err error) { - - defer func(begin time.Time) { - duration.With("success", fmt.Sprint(err == nil)).Observe(time.Since(begin).Seconds()) - }(time.Now()) - return next(ctx, request) - - } - } -} - -// LoggingMiddleware returns an endpoint middleware that logs the -// duration of each invocation, and the resulting error, if any. -func LoggingMiddleware(logger log.Logger) endpoint.Middleware { - return func(next endpoint.Endpoint) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (response interface{}, err error) { - - defer func(begin time.Time) { - logger.Log("transport_error", err, "took", time.Since(begin)) - }(time.Now()) - return next(ctx, request) - - } - } -} diff --git a/vendor/github.com/go-kit/kit/examples/addsvc/pkg/addendpoint/set.go b/vendor/github.com/go-kit/kit/examples/addsvc/pkg/addendpoint/set.go deleted file mode 100644 index e4acaff4..00000000 --- a/vendor/github.com/go-kit/kit/examples/addsvc/pkg/addendpoint/set.go +++ /dev/null @@ -1,130 +0,0 @@ -package addendpoint - -import ( - "context" - "time" - - "golang.org/x/time/rate" - - stdopentracing "github.com/opentracing/opentracing-go" - "github.com/sony/gobreaker" - - "github.com/go-kit/kit/circuitbreaker" - "github.com/go-kit/kit/endpoint" - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/metrics" - "github.com/go-kit/kit/ratelimit" - "github.com/go-kit/kit/tracing/opentracing" - - "github.com/go-kit/kit/examples/addsvc/pkg/addservice" -) - -// Set collects all of the endpoints that compose an add service. It's meant to -// be used as a helper struct, to collect all of the endpoints into a single -// parameter. -type Set struct { - SumEndpoint endpoint.Endpoint - ConcatEndpoint endpoint.Endpoint -} - -// New returns a Set that wraps the provided server, and wires in all of the -// expected endpoint middlewares via the various parameters. -func New(svc addservice.Service, logger log.Logger, duration metrics.Histogram, trace stdopentracing.Tracer) Set { - var sumEndpoint endpoint.Endpoint - { - sumEndpoint = MakeSumEndpoint(svc) - sumEndpoint = ratelimit.NewErroringLimiter(rate.NewLimiter(rate.Every(time.Second), 1))(sumEndpoint) - sumEndpoint = circuitbreaker.Gobreaker(gobreaker.NewCircuitBreaker(gobreaker.Settings{}))(sumEndpoint) - sumEndpoint = opentracing.TraceServer(trace, "Sum")(sumEndpoint) - sumEndpoint = LoggingMiddleware(log.With(logger, "method", "Sum"))(sumEndpoint) - sumEndpoint = InstrumentingMiddleware(duration.With("method", "Sum"))(sumEndpoint) - } - var concatEndpoint endpoint.Endpoint - { - concatEndpoint = MakeConcatEndpoint(svc) - concatEndpoint = ratelimit.NewErroringLimiter(rate.NewLimiter(rate.Every(time.Second), 100))(concatEndpoint) - concatEndpoint = circuitbreaker.Gobreaker(gobreaker.NewCircuitBreaker(gobreaker.Settings{}))(concatEndpoint) - concatEndpoint = opentracing.TraceServer(trace, "Concat")(concatEndpoint) - concatEndpoint = LoggingMiddleware(log.With(logger, "method", "Concat"))(concatEndpoint) - concatEndpoint = InstrumentingMiddleware(duration.With("method", "Concat"))(concatEndpoint) - } - return Set{ - SumEndpoint: sumEndpoint, - ConcatEndpoint: concatEndpoint, - } -} - -// Sum implements the service interface, so Set may be used as a service. -// This is primarily useful in the context of a client library. -func (s Set) Sum(ctx context.Context, a, b int) (int, error) { - resp, err := s.SumEndpoint(ctx, SumRequest{A: a, B: b}) - if err != nil { - return 0, err - } - response := resp.(SumResponse) - return response.V, response.Err -} - -// Concat implements the service interface, so Set may be used as a -// service. This is primarily useful in the context of a client library. -func (s Set) Concat(ctx context.Context, a, b string) (string, error) { - resp, err := s.ConcatEndpoint(ctx, ConcatRequest{A: a, B: b}) - if err != nil { - return "", err - } - response := resp.(ConcatResponse) - return response.V, response.Err -} - -// MakeSumEndpoint constructs a Sum endpoint wrapping the service. -func MakeSumEndpoint(s addservice.Service) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (response interface{}, err error) { - req := request.(SumRequest) - v, err := s.Sum(ctx, req.A, req.B) - return SumResponse{V: v, Err: err}, nil - } -} - -// MakeConcatEndpoint constructs a Concat endpoint wrapping the service. -func MakeConcatEndpoint(s addservice.Service) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (response interface{}, err error) { - req := request.(ConcatRequest) - v, err := s.Concat(ctx, req.A, req.B) - return ConcatResponse{V: v, Err: err}, nil - } -} - -// Failer is an interface that should be implemented by response types. -// Response encoders can check if responses are Failer, and if so if they've -// failed, and if so encode them using a separate write path based on the error. -type Failer interface { - Failed() error -} - -// SumRequest collects the request parameters for the Sum method. -type SumRequest struct { - A, B int -} - -// SumResponse collects the response values for the Sum method. -type SumResponse struct { - V int `json:"v"` - Err error `json:"-"` // should be intercepted by Failed/errorEncoder -} - -// Failed implements Failer. -func (r SumResponse) Failed() error { return r.Err } - -// ConcatRequest collects the request parameters for the Concat method. -type ConcatRequest struct { - A, B string -} - -// ConcatResponse collects the response values for the Concat method. -type ConcatResponse struct { - V string `json:"v"` - Err error `json:"-"` -} - -// Failed implements Failer. -func (r ConcatResponse) Failed() error { return r.Err } diff --git a/vendor/github.com/go-kit/kit/examples/addsvc/pkg/addservice/middleware.go b/vendor/github.com/go-kit/kit/examples/addsvc/pkg/addservice/middleware.go deleted file mode 100644 index 5a1d6ee5..00000000 --- a/vendor/github.com/go-kit/kit/examples/addsvc/pkg/addservice/middleware.go +++ /dev/null @@ -1,69 +0,0 @@ -package addservice - -import ( - "context" - - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/metrics" -) - -// Middleware describes a service (as opposed to endpoint) middleware. -type Middleware func(Service) Service - -// LoggingMiddleware takes a logger as a dependency -// and returns a ServiceMiddleware. -func LoggingMiddleware(logger log.Logger) Middleware { - return func(next Service) Service { - return loggingMiddleware{logger, next} - } -} - -type loggingMiddleware struct { - logger log.Logger - next Service -} - -func (mw loggingMiddleware) Sum(ctx context.Context, a, b int) (v int, err error) { - defer func() { - mw.logger.Log("method", "Sum", "a", a, "b", b, "v", v, "err", err) - }() - return mw.next.Sum(ctx, a, b) -} - -func (mw loggingMiddleware) Concat(ctx context.Context, a, b string) (v string, err error) { - defer func() { - mw.logger.Log("method", "Concat", "a", a, "b", b, "v", v, "err", err) - }() - return mw.next.Concat(ctx, a, b) -} - -// InstrumentingMiddleware returns a service middleware that instruments -// the number of integers summed and characters concatenated over the lifetime of -// the service. -func InstrumentingMiddleware(ints, chars metrics.Counter) Middleware { - return func(next Service) Service { - return instrumentingMiddleware{ - ints: ints, - chars: chars, - next: next, - } - } -} - -type instrumentingMiddleware struct { - ints metrics.Counter - chars metrics.Counter - next Service -} - -func (mw instrumentingMiddleware) Sum(ctx context.Context, a, b int) (int, error) { - v, err := mw.next.Sum(ctx, a, b) - mw.ints.Add(float64(v)) - return v, err -} - -func (mw instrumentingMiddleware) Concat(ctx context.Context, a, b string) (string, error) { - v, err := mw.next.Concat(ctx, a, b) - mw.chars.Add(float64(len(v))) - return v, err -} diff --git a/vendor/github.com/go-kit/kit/examples/addsvc/pkg/addservice/service.go b/vendor/github.com/go-kit/kit/examples/addsvc/pkg/addservice/service.go deleted file mode 100644 index d884373b..00000000 --- a/vendor/github.com/go-kit/kit/examples/addsvc/pkg/addservice/service.go +++ /dev/null @@ -1,71 +0,0 @@ -package addservice - -import ( - "context" - "errors" - - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/metrics" -) - -// Service describes a service that adds things together. -type Service interface { - Sum(ctx context.Context, a, b int) (int, error) - Concat(ctx context.Context, a, b string) (string, error) -} - -// New returns a basic Service with all of the expected middlewares wired in. -func New(logger log.Logger, ints, chars metrics.Counter) Service { - var svc Service - { - svc = NewBasicService() - svc = LoggingMiddleware(logger)(svc) - svc = InstrumentingMiddleware(ints, chars)(svc) - } - return svc -} - -var ( - // ErrTwoZeroes is an arbitrary business rule for the Add method. - ErrTwoZeroes = errors.New("can't sum two zeroes") - - // ErrIntOverflow protects the Add method. We've decided that this error - // indicates a misbehaving service and should count against e.g. circuit - // breakers. So, we return it directly in endpoints, to illustrate the - // difference. In a real service, this probably wouldn't be the case. - ErrIntOverflow = errors.New("integer overflow") - - // ErrMaxSizeExceeded protects the Concat method. - ErrMaxSizeExceeded = errors.New("result exceeds maximum size") -) - -// NewBasicService returns a naïve, stateless implementation of Service. -func NewBasicService() Service { - return basicService{} -} - -type basicService struct{} - -const ( - intMax = 1<<31 - 1 - intMin = -(intMax + 1) - maxLen = 10 -) - -func (s basicService) Sum(_ context.Context, a, b int) (int, error) { - if a == 0 && b == 0 { - return 0, ErrTwoZeroes - } - if (b > 0 && a > (intMax-b)) || (b < 0 && a < (intMin-b)) { - return 0, ErrIntOverflow - } - return a + b, nil -} - -// Concat implements Service. -func (s basicService) Concat(_ context.Context, a, b string) (string, error) { - if len(a)+len(b) > maxLen { - return "", ErrMaxSizeExceeded - } - return a + b, nil -} diff --git a/vendor/github.com/go-kit/kit/examples/addsvc/pkg/addtransport/grpc.go b/vendor/github.com/go-kit/kit/examples/addsvc/pkg/addtransport/grpc.go deleted file mode 100644 index 6ec58d7f..00000000 --- a/vendor/github.com/go-kit/kit/examples/addsvc/pkg/addtransport/grpc.go +++ /dev/null @@ -1,210 +0,0 @@ -package addtransport - -import ( - "context" - "errors" - "time" - - "google.golang.org/grpc" - - stdopentracing "github.com/opentracing/opentracing-go" - "github.com/sony/gobreaker" - oldcontext "golang.org/x/net/context" - "golang.org/x/time/rate" - - "github.com/go-kit/kit/circuitbreaker" - "github.com/go-kit/kit/endpoint" - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/ratelimit" - "github.com/go-kit/kit/tracing/opentracing" - grpctransport "github.com/go-kit/kit/transport/grpc" - - "github.com/go-kit/kit/examples/addsvc/pb" - "github.com/go-kit/kit/examples/addsvc/pkg/addendpoint" - "github.com/go-kit/kit/examples/addsvc/pkg/addservice" -) - -type grpcServer struct { - sum grpctransport.Handler - concat grpctransport.Handler -} - -// NewGRPCServer makes a set of endpoints available as a gRPC AddServer. -func NewGRPCServer(endpoints addendpoint.Set, tracer stdopentracing.Tracer, logger log.Logger) pb.AddServer { - options := []grpctransport.ServerOption{ - grpctransport.ServerErrorLogger(logger), - } - return &grpcServer{ - sum: grpctransport.NewServer( - endpoints.SumEndpoint, - decodeGRPCSumRequest, - encodeGRPCSumResponse, - append(options, grpctransport.ServerBefore(opentracing.GRPCToContext(tracer, "Sum", logger)))..., - ), - concat: grpctransport.NewServer( - endpoints.ConcatEndpoint, - decodeGRPCConcatRequest, - encodeGRPCConcatResponse, - append(options, grpctransport.ServerBefore(opentracing.GRPCToContext(tracer, "Concat", logger)))..., - ), - } -} - -func (s *grpcServer) Sum(ctx oldcontext.Context, req *pb.SumRequest) (*pb.SumReply, error) { - _, rep, err := s.sum.ServeGRPC(ctx, req) - if err != nil { - return nil, err - } - return rep.(*pb.SumReply), nil -} - -func (s *grpcServer) Concat(ctx oldcontext.Context, req *pb.ConcatRequest) (*pb.ConcatReply, error) { - _, rep, err := s.concat.ServeGRPC(ctx, req) - if err != nil { - return nil, err - } - return rep.(*pb.ConcatReply), nil -} - -// NewGRPCClient returns an AddService backed by a gRPC server at the other end -// of the conn. The caller is responsible for constructing the conn, and -// eventually closing the underlying transport. We bake-in certain middlewares, -// implementing the client library pattern. -func NewGRPCClient(conn *grpc.ClientConn, tracer stdopentracing.Tracer, logger log.Logger) addservice.Service { - // We construct a single ratelimiter middleware, to limit the total outgoing - // QPS from this client to all methods on the remote instance. We also - // construct per-endpoint circuitbreaker middlewares to demonstrate how - // that's done, although they could easily be combined into a single breaker - // for the entire remote instance, too. - limiter := ratelimit.NewErroringLimiter(rate.NewLimiter(rate.Every(time.Second), 100)) - - // Each individual endpoint is an http/transport.Client (which implements - // endpoint.Endpoint) that gets wrapped with various middlewares. If you - // made your own client library, you'd do this work there, so your server - // could rely on a consistent set of client behavior. - var sumEndpoint endpoint.Endpoint - { - sumEndpoint = grpctransport.NewClient( - conn, - "pb.Add", - "Sum", - encodeGRPCSumRequest, - decodeGRPCSumResponse, - pb.SumReply{}, - grpctransport.ClientBefore(opentracing.ContextToGRPC(tracer, logger)), - ).Endpoint() - sumEndpoint = opentracing.TraceClient(tracer, "Sum")(sumEndpoint) - sumEndpoint = limiter(sumEndpoint) - sumEndpoint = circuitbreaker.Gobreaker(gobreaker.NewCircuitBreaker(gobreaker.Settings{ - Name: "Sum", - Timeout: 30 * time.Second, - }))(sumEndpoint) - } - - // The Concat endpoint is the same thing, with slightly different - // middlewares to demonstrate how to specialize per-endpoint. - var concatEndpoint endpoint.Endpoint - { - concatEndpoint = grpctransport.NewClient( - conn, - "pb.Add", - "Concat", - encodeGRPCConcatRequest, - decodeGRPCConcatResponse, - pb.ConcatReply{}, - grpctransport.ClientBefore(opentracing.ContextToGRPC(tracer, logger)), - ).Endpoint() - concatEndpoint = opentracing.TraceClient(tracer, "Concat")(concatEndpoint) - concatEndpoint = limiter(concatEndpoint) - concatEndpoint = circuitbreaker.Gobreaker(gobreaker.NewCircuitBreaker(gobreaker.Settings{ - Name: "Concat", - Timeout: 10 * time.Second, - }))(concatEndpoint) - } - - // Returning the endpoint.Set as a service.Service relies on the - // endpoint.Set implementing the Service methods. That's just a simple bit - // of glue code. - return addendpoint.Set{ - SumEndpoint: sumEndpoint, - ConcatEndpoint: concatEndpoint, - } -} - -// decodeGRPCSumRequest is a transport/grpc.DecodeRequestFunc that converts a -// gRPC sum request to a user-domain sum request. Primarily useful in a server. -func decodeGRPCSumRequest(_ context.Context, grpcReq interface{}) (interface{}, error) { - req := grpcReq.(*pb.SumRequest) - return addendpoint.SumRequest{A: int(req.A), B: int(req.B)}, nil -} - -// decodeGRPCConcatRequest is a transport/grpc.DecodeRequestFunc that converts a -// gRPC concat request to a user-domain concat request. Primarily useful in a -// server. -func decodeGRPCConcatRequest(_ context.Context, grpcReq interface{}) (interface{}, error) { - req := grpcReq.(*pb.ConcatRequest) - return addendpoint.ConcatRequest{A: req.A, B: req.B}, nil -} - -// decodeGRPCSumResponse is a transport/grpc.DecodeResponseFunc that converts a -// gRPC sum reply to a user-domain sum response. Primarily useful in a client. -func decodeGRPCSumResponse(_ context.Context, grpcReply interface{}) (interface{}, error) { - reply := grpcReply.(*pb.SumReply) - return addendpoint.SumResponse{V: int(reply.V), Err: str2err(reply.Err)}, nil -} - -// decodeGRPCConcatResponse is a transport/grpc.DecodeResponseFunc that converts -// a gRPC concat reply to a user-domain concat response. Primarily useful in a -// client. -func decodeGRPCConcatResponse(_ context.Context, grpcReply interface{}) (interface{}, error) { - reply := grpcReply.(*pb.ConcatReply) - return addendpoint.ConcatResponse{V: reply.V, Err: str2err(reply.Err)}, nil -} - -// encodeGRPCSumResponse is a transport/grpc.EncodeResponseFunc that converts a -// user-domain sum response to a gRPC sum reply. Primarily useful in a server. -func encodeGRPCSumResponse(_ context.Context, response interface{}) (interface{}, error) { - resp := response.(addendpoint.SumResponse) - return &pb.SumReply{V: int64(resp.V), Err: err2str(resp.Err)}, nil -} - -// encodeGRPCConcatResponse is a transport/grpc.EncodeResponseFunc that converts -// a user-domain concat response to a gRPC concat reply. Primarily useful in a -// server. -func encodeGRPCConcatResponse(_ context.Context, response interface{}) (interface{}, error) { - resp := response.(addendpoint.ConcatResponse) - return &pb.ConcatReply{V: resp.V, Err: err2str(resp.Err)}, nil -} - -// encodeGRPCSumRequest is a transport/grpc.EncodeRequestFunc that converts a -// user-domain sum request to a gRPC sum request. Primarily useful in a client. -func encodeGRPCSumRequest(_ context.Context, request interface{}) (interface{}, error) { - req := request.(addendpoint.SumRequest) - return &pb.SumRequest{A: int64(req.A), B: int64(req.B)}, nil -} - -// encodeGRPCConcatRequest is a transport/grpc.EncodeRequestFunc that converts a -// user-domain concat request to a gRPC concat request. Primarily useful in a -// client. -func encodeGRPCConcatRequest(_ context.Context, request interface{}) (interface{}, error) { - req := request.(addendpoint.ConcatRequest) - return &pb.ConcatRequest{A: req.A, B: req.B}, nil -} - -// These annoying helper functions are required to translate Go error types to -// and from strings, which is the type we use in our IDLs to represent errors. -// There is special casing to treat empty strings as nil errors. - -func str2err(s string) error { - if s == "" { - return nil - } - return errors.New(s) -} - -func err2str(err error) string { - if err == nil { - return "" - } - return err.Error() -} diff --git a/vendor/github.com/go-kit/kit/examples/addsvc/pkg/addtransport/http.go b/vendor/github.com/go-kit/kit/examples/addsvc/pkg/addtransport/http.go deleted file mode 100644 index 3819c6d8..00000000 --- a/vendor/github.com/go-kit/kit/examples/addsvc/pkg/addtransport/http.go +++ /dev/null @@ -1,220 +0,0 @@ -package addtransport - -import ( - "bytes" - "context" - "encoding/json" - "errors" - "io/ioutil" - "net/http" - "net/url" - "strings" - "time" - - "golang.org/x/time/rate" - - stdopentracing "github.com/opentracing/opentracing-go" - "github.com/sony/gobreaker" - - "github.com/go-kit/kit/circuitbreaker" - "github.com/go-kit/kit/endpoint" - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/ratelimit" - "github.com/go-kit/kit/tracing/opentracing" - httptransport "github.com/go-kit/kit/transport/http" - - "github.com/go-kit/kit/examples/addsvc/pkg/addendpoint" - "github.com/go-kit/kit/examples/addsvc/pkg/addservice" -) - -// NewHTTPHandler returns an HTTP handler that makes a set of endpoints -// available on predefined paths. -func NewHTTPHandler(endpoints addendpoint.Set, tracer stdopentracing.Tracer, logger log.Logger) http.Handler { - options := []httptransport.ServerOption{ - httptransport.ServerErrorEncoder(errorEncoder), - httptransport.ServerErrorLogger(logger), - } - m := http.NewServeMux() - m.Handle("/sum", httptransport.NewServer( - endpoints.SumEndpoint, - decodeHTTPSumRequest, - encodeHTTPGenericResponse, - append(options, httptransport.ServerBefore(opentracing.HTTPToContext(tracer, "Sum", logger)))..., - )) - m.Handle("/concat", httptransport.NewServer( - endpoints.ConcatEndpoint, - decodeHTTPConcatRequest, - encodeHTTPGenericResponse, - append(options, httptransport.ServerBefore(opentracing.HTTPToContext(tracer, "Concat", logger)))..., - )) - return m -} - -// NewHTTPClient returns an AddService backed by an HTTP server living at the -// remote instance. We expect instance to come from a service discovery system, -// so likely of the form "host:port". We bake-in certain middlewares, -// implementing the client library pattern. -func NewHTTPClient(instance string, tracer stdopentracing.Tracer, logger log.Logger) (addservice.Service, error) { - // Quickly sanitize the instance string. - if !strings.HasPrefix(instance, "http") { - instance = "http://" + instance - } - u, err := url.Parse(instance) - if err != nil { - return nil, err - } - - // We construct a single ratelimiter middleware, to limit the total outgoing - // QPS from this client to all methods on the remote instance. We also - // construct per-endpoint circuitbreaker middlewares to demonstrate how - // that's done, although they could easily be combined into a single breaker - // for the entire remote instance, too. - limiter := ratelimit.NewErroringLimiter(rate.NewLimiter(rate.Every(time.Second), 100)) - - // Each individual endpoint is an http/transport.Client (which implements - // endpoint.Endpoint) that gets wrapped with various middlewares. If you - // made your own client library, you'd do this work there, so your server - // could rely on a consistent set of client behavior. - var sumEndpoint endpoint.Endpoint - { - sumEndpoint = httptransport.NewClient( - "POST", - copyURL(u, "/sum"), - encodeHTTPGenericRequest, - decodeHTTPSumResponse, - httptransport.ClientBefore(opentracing.ContextToHTTP(tracer, logger)), - ).Endpoint() - sumEndpoint = opentracing.TraceClient(tracer, "Sum")(sumEndpoint) - sumEndpoint = limiter(sumEndpoint) - sumEndpoint = circuitbreaker.Gobreaker(gobreaker.NewCircuitBreaker(gobreaker.Settings{ - Name: "Sum", - Timeout: 30 * time.Second, - }))(sumEndpoint) - } - - // The Concat endpoint is the same thing, with slightly different - // middlewares to demonstrate how to specialize per-endpoint. - var concatEndpoint endpoint.Endpoint - { - concatEndpoint = httptransport.NewClient( - "POST", - copyURL(u, "/concat"), - encodeHTTPGenericRequest, - decodeHTTPConcatResponse, - httptransport.ClientBefore(opentracing.ContextToHTTP(tracer, logger)), - ).Endpoint() - concatEndpoint = opentracing.TraceClient(tracer, "Concat")(concatEndpoint) - concatEndpoint = limiter(concatEndpoint) - concatEndpoint = circuitbreaker.Gobreaker(gobreaker.NewCircuitBreaker(gobreaker.Settings{ - Name: "Concat", - Timeout: 10 * time.Second, - }))(concatEndpoint) - } - - // Returning the endpoint.Set as a service.Service relies on the - // endpoint.Set implementing the Service methods. That's just a simple bit - // of glue code. - return addendpoint.Set{ - SumEndpoint: sumEndpoint, - ConcatEndpoint: concatEndpoint, - }, nil -} - -func copyURL(base *url.URL, path string) *url.URL { - next := *base - next.Path = path - return &next -} - -func errorEncoder(_ context.Context, err error, w http.ResponseWriter) { - w.WriteHeader(err2code(err)) - json.NewEncoder(w).Encode(errorWrapper{Error: err.Error()}) -} - -func err2code(err error) int { - switch err { - case addservice.ErrTwoZeroes, addservice.ErrMaxSizeExceeded, addservice.ErrIntOverflow: - return http.StatusBadRequest - } - return http.StatusInternalServerError -} - -func errorDecoder(r *http.Response) error { - var w errorWrapper - if err := json.NewDecoder(r.Body).Decode(&w); err != nil { - return err - } - return errors.New(w.Error) -} - -type errorWrapper struct { - Error string `json:"error"` -} - -// decodeHTTPSumRequest is a transport/http.DecodeRequestFunc that decodes a -// JSON-encoded sum request from the HTTP request body. Primarily useful in a -// server. -func decodeHTTPSumRequest(_ context.Context, r *http.Request) (interface{}, error) { - var req addendpoint.SumRequest - err := json.NewDecoder(r.Body).Decode(&req) - return req, err -} - -// decodeHTTPConcatRequest is a transport/http.DecodeRequestFunc that decodes a -// JSON-encoded concat request from the HTTP request body. Primarily useful in a -// server. -func decodeHTTPConcatRequest(_ context.Context, r *http.Request) (interface{}, error) { - var req addendpoint.ConcatRequest - err := json.NewDecoder(r.Body).Decode(&req) - return req, err -} - -// decodeHTTPSumResponse is a transport/http.DecodeResponseFunc that decodes a -// JSON-encoded sum response from the HTTP response body. If the response has a -// non-200 status code, we will interpret that as an error and attempt to decode -// the specific error message from the response body. Primarily useful in a -// client. -func decodeHTTPSumResponse(_ context.Context, r *http.Response) (interface{}, error) { - if r.StatusCode != http.StatusOK { - return nil, errors.New(r.Status) - } - var resp addendpoint.SumResponse - err := json.NewDecoder(r.Body).Decode(&resp) - return resp, err -} - -// decodeHTTPConcatResponse is a transport/http.DecodeResponseFunc that decodes -// a JSON-encoded concat response from the HTTP response body. If the response -// has a non-200 status code, we will interpret that as an error and attempt to -// decode the specific error message from the response body. Primarily useful in -// a client. -func decodeHTTPConcatResponse(_ context.Context, r *http.Response) (interface{}, error) { - if r.StatusCode != http.StatusOK { - return nil, errors.New(r.Status) - } - var resp addendpoint.ConcatResponse - err := json.NewDecoder(r.Body).Decode(&resp) - return resp, err -} - -// encodeHTTPGenericRequest is a transport/http.EncodeRequestFunc that -// JSON-encodes any request to the request body. Primarily useful in a client. -func encodeHTTPGenericRequest(_ context.Context, r *http.Request, request interface{}) error { - var buf bytes.Buffer - if err := json.NewEncoder(&buf).Encode(request); err != nil { - return err - } - r.Body = ioutil.NopCloser(&buf) - return nil -} - -// encodeHTTPGenericResponse is a transport/http.EncodeResponseFunc that encodes -// the response as JSON to the response writer. Primarily useful in a server. -func encodeHTTPGenericResponse(ctx context.Context, w http.ResponseWriter, response interface{}) error { - if f, ok := response.(addendpoint.Failer); ok && f.Failed() != nil { - errorEncoder(ctx, f.Failed(), w) - return nil - } - w.Header().Set("Content-Type", "application/json; charset=utf-8") - return json.NewEncoder(w).Encode(response) -} diff --git a/vendor/github.com/go-kit/kit/examples/addsvc/pkg/addtransport/thrift.go b/vendor/github.com/go-kit/kit/examples/addsvc/pkg/addtransport/thrift.go deleted file mode 100644 index 485840fe..00000000 --- a/vendor/github.com/go-kit/kit/examples/addsvc/pkg/addtransport/thrift.go +++ /dev/null @@ -1,120 +0,0 @@ -package addtransport - -import ( - "context" - "time" - - "golang.org/x/time/rate" - - "github.com/sony/gobreaker" - - "github.com/go-kit/kit/circuitbreaker" - "github.com/go-kit/kit/endpoint" - "github.com/go-kit/kit/ratelimit" - - "github.com/go-kit/kit/examples/addsvc/pkg/addendpoint" - "github.com/go-kit/kit/examples/addsvc/pkg/addservice" - addthrift "github.com/go-kit/kit/examples/addsvc/thrift/gen-go/addsvc" -) - -type thriftServer struct { - ctx context.Context - endpoints addendpoint.Set -} - -// NewThriftServer makes a set of endpoints available as a Thrift service. -func NewThriftServer(endpoints addendpoint.Set) addthrift.AddService { - return &thriftServer{ - endpoints: endpoints, - } -} - -func (s *thriftServer) Sum(ctx context.Context, a int64, b int64) (*addthrift.SumReply, error) { - request := addendpoint.SumRequest{A: int(a), B: int(b)} - response, err := s.endpoints.SumEndpoint(ctx, request) - if err != nil { - return nil, err - } - resp := response.(addendpoint.SumResponse) - return &addthrift.SumReply{Value: int64(resp.V), Err: err2str(resp.Err)}, nil -} - -func (s *thriftServer) Concat(ctx context.Context, a string, b string) (*addthrift.ConcatReply, error) { - request := addendpoint.ConcatRequest{A: a, B: b} - response, err := s.endpoints.ConcatEndpoint(ctx, request) - if err != nil { - return nil, err - } - resp := response.(addendpoint.ConcatResponse) - return &addthrift.ConcatReply{Value: resp.V, Err: err2str(resp.Err)}, nil -} - -// NewThriftClient returns an AddService backed by a Thrift server described by -// the provided client. The caller is responsible for constructing the client, -// and eventually closing the underlying transport. We bake-in certain middlewares, -// implementing the client library pattern. -func NewThriftClient(client *addthrift.AddServiceClient) addservice.Service { - // We construct a single ratelimiter middleware, to limit the total outgoing - // QPS from this client to all methods on the remote instance. We also - // construct per-endpoint circuitbreaker middlewares to demonstrate how - // that's done, although they could easily be combined into a single breaker - // for the entire remote instance, too. - limiter := ratelimit.NewErroringLimiter(rate.NewLimiter(rate.Every(time.Second), 100)) - - // Each individual endpoint is an http/transport.Client (which implements - // endpoint.Endpoint) that gets wrapped with various middlewares. If you - // could rely on a consistent set of client behavior. - var sumEndpoint endpoint.Endpoint - { - sumEndpoint = MakeThriftSumEndpoint(client) - sumEndpoint = limiter(sumEndpoint) - sumEndpoint = circuitbreaker.Gobreaker(gobreaker.NewCircuitBreaker(gobreaker.Settings{ - Name: "Sum", - Timeout: 30 * time.Second, - }))(sumEndpoint) - } - - // The Concat endpoint is the same thing, with slightly different - // middlewares to demonstrate how to specialize per-endpoint. - var concatEndpoint endpoint.Endpoint - { - concatEndpoint = MakeThriftConcatEndpoint(client) - concatEndpoint = limiter(concatEndpoint) - concatEndpoint = circuitbreaker.Gobreaker(gobreaker.NewCircuitBreaker(gobreaker.Settings{ - Name: "Concat", - Timeout: 10 * time.Second, - }))(concatEndpoint) - } - - // Returning the endpoint.Set as a service.Service relies on the - // endpoint.Set implementing the Service methods. That's just a simple bit - // of glue code. - return addendpoint.Set{ - SumEndpoint: sumEndpoint, - ConcatEndpoint: concatEndpoint, - } -} - -// MakeThriftSumEndpoint returns an endpoint that invokes the passed Thrift client. -// Useful only in clients, and only until a proper transport/thrift.Client exists. -func MakeThriftSumEndpoint(client *addthrift.AddServiceClient) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - req := request.(addendpoint.SumRequest) - reply, err := client.Sum(ctx, int64(req.A), int64(req.B)) - if err == addservice.ErrIntOverflow { - return nil, err // special case; see comment on ErrIntOverflow - } - return addendpoint.SumResponse{V: int(reply.Value), Err: err}, nil - } -} - -// MakeThriftConcatEndpoint returns an endpoint that invokes the passed Thrift -// client. Useful only in clients, and only until a proper -// transport/thrift.Client exists. -func MakeThriftConcatEndpoint(client *addthrift.AddServiceClient) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - req := request.(addendpoint.ConcatRequest) - reply, err := client.Concat(ctx, req.A, req.B) - return addendpoint.ConcatResponse{V: reply.Value, Err: err}, nil - } -} diff --git a/vendor/github.com/go-kit/kit/examples/addsvc/thrift/addsvc.thrift b/vendor/github.com/go-kit/kit/examples/addsvc/thrift/addsvc.thrift deleted file mode 100644 index e67ce1b2..00000000 --- a/vendor/github.com/go-kit/kit/examples/addsvc/thrift/addsvc.thrift +++ /dev/null @@ -1,14 +0,0 @@ -struct SumReply { - 1: i64 value - 2: string err -} - -struct ConcatReply { - 1: string value - 2: string err -} - -service AddService { - SumReply Sum(1: i64 a, 2: i64 b) - ConcatReply Concat(1: string a, 2: string b) -} diff --git a/vendor/github.com/go-kit/kit/examples/addsvc/thrift/compile.sh b/vendor/github.com/go-kit/kit/examples/addsvc/thrift/compile.sh deleted file mode 100755 index 2ecce5b2..00000000 --- a/vendor/github.com/go-kit/kit/examples/addsvc/thrift/compile.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env sh - -# See also https://thrift.apache.org/tutorial/go - -thrift -r --gen "go:package_prefix=github.com/go-kit/kit/examples/addsvc/thrift/gen-go/,thrift_import=github.com/apache/thrift/lib/go/thrift" addsvc.thrift diff --git a/vendor/github.com/go-kit/kit/examples/addsvc/thrift/gen-go/addsvc/GoUnusedProtection__.go b/vendor/github.com/go-kit/kit/examples/addsvc/thrift/gen-go/addsvc/GoUnusedProtection__.go deleted file mode 100644 index 88387e14..00000000 --- a/vendor/github.com/go-kit/kit/examples/addsvc/thrift/gen-go/addsvc/GoUnusedProtection__.go +++ /dev/null @@ -1,7 +0,0 @@ -// Autogenerated by Thrift Compiler (1.0.0-dev) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package addsvc - -var GoUnusedProtection__ int; - diff --git a/vendor/github.com/go-kit/kit/examples/addsvc/thrift/gen-go/addsvc/add_service-remote/add_service-remote.go b/vendor/github.com/go-kit/kit/examples/addsvc/thrift/gen-go/addsvc/add_service-remote/add_service-remote.go deleted file mode 100644 index 2063763a..00000000 --- a/vendor/github.com/go-kit/kit/examples/addsvc/thrift/gen-go/addsvc/add_service-remote/add_service-remote.go +++ /dev/null @@ -1,159 +0,0 @@ -// Autogenerated by Thrift Compiler (1.0.0-dev) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package main - -import ( - "context" - "flag" - "fmt" - "math" - "net" - "net/url" - "os" - "strconv" - "strings" - "github.com/apache/thrift/lib/go/thrift" - "github.com/go-kit/kit/examples/addsvc/thrift/gen-go/addsvc" -) - - -func Usage() { - fmt.Fprintln(os.Stderr, "Usage of ", os.Args[0], " [-h host:port] [-u url] [-f[ramed]] function [arg1 [arg2...]]:") - flag.PrintDefaults() - fmt.Fprintln(os.Stderr, "\nFunctions:") - fmt.Fprintln(os.Stderr, " SumReply Sum(i64 a, i64 b)") - fmt.Fprintln(os.Stderr, " ConcatReply Concat(string a, string b)") - fmt.Fprintln(os.Stderr) - os.Exit(0) -} - -func main() { - flag.Usage = Usage - var host string - var port int - var protocol string - var urlString string - var framed bool - var useHttp bool - var parsedUrl url.URL - var trans thrift.TTransport - _ = strconv.Atoi - _ = math.Abs - flag.Usage = Usage - flag.StringVar(&host, "h", "localhost", "Specify host and port") - flag.IntVar(&port, "p", 9090, "Specify port") - flag.StringVar(&protocol, "P", "binary", "Specify the protocol (binary, compact, simplejson, json)") - flag.StringVar(&urlString, "u", "", "Specify the url") - flag.BoolVar(&framed, "framed", false, "Use framed transport") - flag.BoolVar(&useHttp, "http", false, "Use http") - flag.Parse() - - if len(urlString) > 0 { - parsedUrl, err := url.Parse(urlString) - if err != nil { - fmt.Fprintln(os.Stderr, "Error parsing URL: ", err) - flag.Usage() - } - host = parsedUrl.Host - useHttp = len(parsedUrl.Scheme) <= 0 || parsedUrl.Scheme == "http" - } else if useHttp { - _, err := url.Parse(fmt.Sprint("http://", host, ":", port)) - if err != nil { - fmt.Fprintln(os.Stderr, "Error parsing URL: ", err) - flag.Usage() - } - } - - cmd := flag.Arg(0) - var err error - if useHttp { - trans, err = thrift.NewTHttpClient(parsedUrl.String()) - } else { - portStr := fmt.Sprint(port) - if strings.Contains(host, ":") { - host, portStr, err = net.SplitHostPort(host) - if err != nil { - fmt.Fprintln(os.Stderr, "error with host:", err) - os.Exit(1) - } - } - trans, err = thrift.NewTSocket(net.JoinHostPort(host, portStr)) - if err != nil { - fmt.Fprintln(os.Stderr, "error resolving address:", err) - os.Exit(1) - } - if framed { - trans = thrift.NewTFramedTransport(trans) - } - } - if err != nil { - fmt.Fprintln(os.Stderr, "Error creating transport", err) - os.Exit(1) - } - defer trans.Close() - var protocolFactory thrift.TProtocolFactory - switch protocol { - case "compact": - protocolFactory = thrift.NewTCompactProtocolFactory() - break - case "simplejson": - protocolFactory = thrift.NewTSimpleJSONProtocolFactory() - break - case "json": - protocolFactory = thrift.NewTJSONProtocolFactory() - break - case "binary", "": - protocolFactory = thrift.NewTBinaryProtocolFactoryDefault() - break - default: - fmt.Fprintln(os.Stderr, "Invalid protocol specified: ", protocol) - Usage() - os.Exit(1) - } - client := addsvc.NewAddServiceClientFactory(trans, protocolFactory) - if err := trans.Open(); err != nil { - fmt.Fprintln(os.Stderr, "Error opening socket to ", host, ":", port, " ", err) - os.Exit(1) - } - - switch cmd { - case "Sum": - if flag.NArg() - 1 != 2 { - fmt.Fprintln(os.Stderr, "Sum requires 2 args") - flag.Usage() - } - argvalue0, err6 := (strconv.ParseInt(flag.Arg(1), 10, 64)) - if err6 != nil { - Usage() - return - } - value0 := argvalue0 - argvalue1, err7 := (strconv.ParseInt(flag.Arg(2), 10, 64)) - if err7 != nil { - Usage() - return - } - value1 := argvalue1 - fmt.Print(client.Sum(context.Background(), value0, value1)) - fmt.Print("\n") - break - case "Concat": - if flag.NArg() - 1 != 2 { - fmt.Fprintln(os.Stderr, "Concat requires 2 args") - flag.Usage() - } - argvalue0 := flag.Arg(1) - value0 := argvalue0 - argvalue1 := flag.Arg(2) - value1 := argvalue1 - fmt.Print(client.Concat(context.Background(), value0, value1)) - fmt.Print("\n") - break - case "": - Usage() - break - default: - fmt.Fprintln(os.Stderr, "Invalid function ", cmd) - } -} diff --git a/vendor/github.com/go-kit/kit/examples/addsvc/thrift/gen-go/addsvc/addsvc-consts.go b/vendor/github.com/go-kit/kit/examples/addsvc/thrift/gen-go/addsvc/addsvc-consts.go deleted file mode 100644 index 3222f510..00000000 --- a/vendor/github.com/go-kit/kit/examples/addsvc/thrift/gen-go/addsvc/addsvc-consts.go +++ /dev/null @@ -1,24 +0,0 @@ -// Autogenerated by Thrift Compiler (1.0.0-dev) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package addsvc - -import ( - "bytes" - "reflect" - "context" - "fmt" - "github.com/apache/thrift/lib/go/thrift" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = context.Background -var _ = reflect.DeepEqual -var _ = bytes.Equal - - -func init() { -} - diff --git a/vendor/github.com/go-kit/kit/examples/addsvc/thrift/gen-go/addsvc/addsvc.go b/vendor/github.com/go-kit/kit/examples/addsvc/thrift/gen-go/addsvc/addsvc.go deleted file mode 100644 index 4f695b93..00000000 --- a/vendor/github.com/go-kit/kit/examples/addsvc/thrift/gen-go/addsvc/addsvc.go +++ /dev/null @@ -1,1065 +0,0 @@ -// Autogenerated by Thrift Compiler (1.0.0-dev) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package addsvc - -import ( - "bytes" - "reflect" - "context" - "fmt" - "github.com/apache/thrift/lib/go/thrift" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = context.Background -var _ = reflect.DeepEqual -var _ = bytes.Equal - -// Attributes: -// - Value -// - Err -type SumReply struct { - Value int64 `thrift:"value,1" db:"value" json:"value"` - Err string `thrift:"err,2" db:"err" json:"err"` -} - -func NewSumReply() *SumReply { - return &SumReply{} -} - - -func (p *SumReply) GetValue() int64 { - return p.Value -} - -func (p *SumReply) GetErr() string { - return p.Err -} -func (p *SumReply) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { break; } - switch fieldId { - case 1: - if fieldTypeId == thrift.I64 { - if err := p.ReadField1(iprot); err != nil { - return err - } - } else { - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - case 2: - if fieldTypeId == thrift.STRING { - if err := p.ReadField2(iprot); err != nil { - return err - } - } else { - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *SumReply) ReadField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 1: ", err) -} else { - p.Value = v -} - return nil -} - -func (p *SumReply) ReadField2(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 2: ", err) -} else { - p.Err = v -} - return nil -} - -func (p *SumReply) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("SumReply"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) } - if p != nil { - if err := p.writeField1(oprot); err != nil { return err } - if err := p.writeField2(oprot); err != nil { return err } - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) } - return nil -} - -func (p *SumReply) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("value", thrift.I64, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:value: ", p), err) } - if err := oprot.WriteI64(int64(p.Value)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.value (1) field write error: ", p), err) } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:value: ", p), err) } - return err -} - -func (p *SumReply) writeField2(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("err", thrift.STRING, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:err: ", p), err) } - if err := oprot.WriteString(string(p.Err)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.err (2) field write error: ", p), err) } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:err: ", p), err) } - return err -} - -func (p *SumReply) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("SumReply(%+v)", *p) -} - -// Attributes: -// - Value -// - Err -type ConcatReply struct { - Value string `thrift:"value,1" db:"value" json:"value"` - Err string `thrift:"err,2" db:"err" json:"err"` -} - -func NewConcatReply() *ConcatReply { - return &ConcatReply{} -} - - -func (p *ConcatReply) GetValue() string { - return p.Value -} - -func (p *ConcatReply) GetErr() string { - return p.Err -} -func (p *ConcatReply) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { break; } - switch fieldId { - case 1: - if fieldTypeId == thrift.STRING { - if err := p.ReadField1(iprot); err != nil { - return err - } - } else { - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - case 2: - if fieldTypeId == thrift.STRING { - if err := p.ReadField2(iprot); err != nil { - return err - } - } else { - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *ConcatReply) ReadField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 1: ", err) -} else { - p.Value = v -} - return nil -} - -func (p *ConcatReply) ReadField2(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 2: ", err) -} else { - p.Err = v -} - return nil -} - -func (p *ConcatReply) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("ConcatReply"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) } - if p != nil { - if err := p.writeField1(oprot); err != nil { return err } - if err := p.writeField2(oprot); err != nil { return err } - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) } - return nil -} - -func (p *ConcatReply) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("value", thrift.STRING, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:value: ", p), err) } - if err := oprot.WriteString(string(p.Value)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.value (1) field write error: ", p), err) } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:value: ", p), err) } - return err -} - -func (p *ConcatReply) writeField2(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("err", thrift.STRING, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:err: ", p), err) } - if err := oprot.WriteString(string(p.Err)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.err (2) field write error: ", p), err) } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:err: ", p), err) } - return err -} - -func (p *ConcatReply) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("ConcatReply(%+v)", *p) -} - -type AddService interface { - // Parameters: - // - A - // - B - Sum(ctx context.Context, a int64, b int64) (r *SumReply, err error) - // Parameters: - // - A - // - B - Concat(ctx context.Context, a string, b string) (r *ConcatReply, err error) -} - -type AddServiceClient struct { - Transport thrift.TTransport - ProtocolFactory thrift.TProtocolFactory - InputProtocol thrift.TProtocol - OutputProtocol thrift.TProtocol - SeqId int32 -} - -func NewAddServiceClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *AddServiceClient { - return &AddServiceClient{Transport: t, - ProtocolFactory: f, - InputProtocol: f.GetProtocol(t), - OutputProtocol: f.GetProtocol(t), - SeqId: 0, - } -} - -func NewAddServiceClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *AddServiceClient { - return &AddServiceClient{Transport: t, - ProtocolFactory: nil, - InputProtocol: iprot, - OutputProtocol: oprot, - SeqId: 0, - } -} - -// Parameters: -// - A -// - B -func (p *AddServiceClient) Sum(ctx context.Context, a int64, b int64) (r *SumReply, err error) { - if err = p.sendSum(a, b); err != nil { return } - return p.recvSum() -} - -func (p *AddServiceClient) sendSum(a int64, b int64)(err error) { - oprot := p.OutputProtocol - if oprot == nil { - oprot = p.ProtocolFactory.GetProtocol(p.Transport) - p.OutputProtocol = oprot - } - p.SeqId++ - if err = oprot.WriteMessageBegin("Sum", thrift.CALL, p.SeqId); err != nil { - return - } - args := AddServiceSumArgs{ - A : a, - B : b, - } - if err = args.Write(oprot); err != nil { - return - } - if err = oprot.WriteMessageEnd(); err != nil { - return - } - return oprot.Flush() -} - - -func (p *AddServiceClient) recvSum() (value *SumReply, err error) { - iprot := p.InputProtocol - if iprot == nil { - iprot = p.ProtocolFactory.GetProtocol(p.Transport) - p.InputProtocol = iprot - } - method, mTypeId, seqId, err := iprot.ReadMessageBegin() - if err != nil { - return - } - if method != "Sum" { - err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "Sum failed: wrong method name") - return - } - if p.SeqId != seqId { - err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "Sum failed: out of sequence response") - return - } - if mTypeId == thrift.EXCEPTION { - error0 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error1 error - error1, err = error0.Read(iprot) - if err != nil { - return - } - if err = iprot.ReadMessageEnd(); err != nil { - return - } - err = error1 - return - } - if mTypeId != thrift.REPLY { - err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "Sum failed: invalid message type") - return - } - result := AddServiceSumResult{} - if err = result.Read(iprot); err != nil { - return - } - if err = iprot.ReadMessageEnd(); err != nil { - return - } - value = result.GetSuccess() - return -} - -// Parameters: -// - A -// - B -func (p *AddServiceClient) Concat(ctx context.Context, a string, b string) (r *ConcatReply, err error) { - if err = p.sendConcat(a, b); err != nil { return } - return p.recvConcat() -} - -func (p *AddServiceClient) sendConcat(a string, b string)(err error) { - oprot := p.OutputProtocol - if oprot == nil { - oprot = p.ProtocolFactory.GetProtocol(p.Transport) - p.OutputProtocol = oprot - } - p.SeqId++ - if err = oprot.WriteMessageBegin("Concat", thrift.CALL, p.SeqId); err != nil { - return - } - args := AddServiceConcatArgs{ - A : a, - B : b, - } - if err = args.Write(oprot); err != nil { - return - } - if err = oprot.WriteMessageEnd(); err != nil { - return - } - return oprot.Flush() -} - - -func (p *AddServiceClient) recvConcat() (value *ConcatReply, err error) { - iprot := p.InputProtocol - if iprot == nil { - iprot = p.ProtocolFactory.GetProtocol(p.Transport) - p.InputProtocol = iprot - } - method, mTypeId, seqId, err := iprot.ReadMessageBegin() - if err != nil { - return - } - if method != "Concat" { - err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "Concat failed: wrong method name") - return - } - if p.SeqId != seqId { - err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "Concat failed: out of sequence response") - return - } - if mTypeId == thrift.EXCEPTION { - error2 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error3 error - error3, err = error2.Read(iprot) - if err != nil { - return - } - if err = iprot.ReadMessageEnd(); err != nil { - return - } - err = error3 - return - } - if mTypeId != thrift.REPLY { - err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "Concat failed: invalid message type") - return - } - result := AddServiceConcatResult{} - if err = result.Read(iprot); err != nil { - return - } - if err = iprot.ReadMessageEnd(); err != nil { - return - } - value = result.GetSuccess() - return -} - - -type AddServiceProcessor struct { - processorMap map[string]thrift.TProcessorFunction - handler AddService -} - -func (p *AddServiceProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) { - p.processorMap[key] = processor -} - -func (p *AddServiceProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) { - processor, ok = p.processorMap[key] - return processor, ok -} - -func (p *AddServiceProcessor) ProcessorMap() map[string]thrift.TProcessorFunction { - return p.processorMap -} - -func NewAddServiceProcessor(handler AddService) *AddServiceProcessor { - - self4 := &AddServiceProcessor{handler:handler, processorMap:make(map[string]thrift.TProcessorFunction)} - self4.processorMap["Sum"] = &addServiceProcessorSum{handler:handler} - self4.processorMap["Concat"] = &addServiceProcessorConcat{handler:handler} -return self4 -} - -func (p *AddServiceProcessor) Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { - name, _, seqId, err := iprot.ReadMessageBegin() - if err != nil { return false, err } - if processor, ok := p.GetProcessorFunction(name); ok { - return processor.Process(ctx, seqId, iprot, oprot) - } - iprot.Skip(thrift.STRUCT) - iprot.ReadMessageEnd() - x5 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, "Unknown function " + name) - oprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId) - x5.Write(oprot) - oprot.WriteMessageEnd() - oprot.Flush() - return false, x5 - -} - -type addServiceProcessorSum struct { - handler AddService -} - -func (p *addServiceProcessorSum) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { - args := AddServiceSumArgs{} - if err = args.Read(iprot); err != nil { - iprot.ReadMessageEnd() - x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) - oprot.WriteMessageBegin("Sum", thrift.EXCEPTION, seqId) - x.Write(oprot) - oprot.WriteMessageEnd() - oprot.Flush() - return false, err - } - - iprot.ReadMessageEnd() - result := AddServiceSumResult{} -var retval *SumReply - var err2 error - if retval, err2 = p.handler.Sum(ctx, args.A, args.B); err2 != nil { - x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing Sum: " + err2.Error()) - oprot.WriteMessageBegin("Sum", thrift.EXCEPTION, seqId) - x.Write(oprot) - oprot.WriteMessageEnd() - oprot.Flush() - return true, err2 - } else { - result.Success = retval -} - if err2 = oprot.WriteMessageBegin("Sum", thrift.REPLY, seqId); err2 != nil { - err = err2 - } - if err2 = result.Write(oprot); err == nil && err2 != nil { - err = err2 - } - if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { - err = err2 - } - if err2 = oprot.Flush(); err == nil && err2 != nil { - err = err2 - } - if err != nil { - return - } - return true, err -} - -type addServiceProcessorConcat struct { - handler AddService -} - -func (p *addServiceProcessorConcat) Process(ctx context.Context, seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { - args := AddServiceConcatArgs{} - if err = args.Read(iprot); err != nil { - iprot.ReadMessageEnd() - x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) - oprot.WriteMessageBegin("Concat", thrift.EXCEPTION, seqId) - x.Write(oprot) - oprot.WriteMessageEnd() - oprot.Flush() - return false, err - } - - iprot.ReadMessageEnd() - result := AddServiceConcatResult{} -var retval *ConcatReply - var err2 error - if retval, err2 = p.handler.Concat(ctx, args.A, args.B); err2 != nil { - x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing Concat: " + err2.Error()) - oprot.WriteMessageBegin("Concat", thrift.EXCEPTION, seqId) - x.Write(oprot) - oprot.WriteMessageEnd() - oprot.Flush() - return true, err2 - } else { - result.Success = retval -} - if err2 = oprot.WriteMessageBegin("Concat", thrift.REPLY, seqId); err2 != nil { - err = err2 - } - if err2 = result.Write(oprot); err == nil && err2 != nil { - err = err2 - } - if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { - err = err2 - } - if err2 = oprot.Flush(); err == nil && err2 != nil { - err = err2 - } - if err != nil { - return - } - return true, err -} - - -// HELPER FUNCTIONS AND STRUCTURES - -// Attributes: -// - A -// - B -type AddServiceSumArgs struct { - A int64 `thrift:"a,1" db:"a" json:"a"` - B int64 `thrift:"b,2" db:"b" json:"b"` -} - -func NewAddServiceSumArgs() *AddServiceSumArgs { - return &AddServiceSumArgs{} -} - - -func (p *AddServiceSumArgs) GetA() int64 { - return p.A -} - -func (p *AddServiceSumArgs) GetB() int64 { - return p.B -} -func (p *AddServiceSumArgs) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { break; } - switch fieldId { - case 1: - if fieldTypeId == thrift.I64 { - if err := p.ReadField1(iprot); err != nil { - return err - } - } else { - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - case 2: - if fieldTypeId == thrift.I64 { - if err := p.ReadField2(iprot); err != nil { - return err - } - } else { - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *AddServiceSumArgs) ReadField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 1: ", err) -} else { - p.A = v -} - return nil -} - -func (p *AddServiceSumArgs) ReadField2(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 2: ", err) -} else { - p.B = v -} - return nil -} - -func (p *AddServiceSumArgs) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("Sum_args"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) } - if p != nil { - if err := p.writeField1(oprot); err != nil { return err } - if err := p.writeField2(oprot); err != nil { return err } - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) } - return nil -} - -func (p *AddServiceSumArgs) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("a", thrift.I64, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:a: ", p), err) } - if err := oprot.WriteI64(int64(p.A)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.a (1) field write error: ", p), err) } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:a: ", p), err) } - return err -} - -func (p *AddServiceSumArgs) writeField2(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("b", thrift.I64, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:b: ", p), err) } - if err := oprot.WriteI64(int64(p.B)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.b (2) field write error: ", p), err) } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:b: ", p), err) } - return err -} - -func (p *AddServiceSumArgs) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("AddServiceSumArgs(%+v)", *p) -} - -// Attributes: -// - Success -type AddServiceSumResult struct { - Success *SumReply `thrift:"success,0" db:"success" json:"success,omitempty"` -} - -func NewAddServiceSumResult() *AddServiceSumResult { - return &AddServiceSumResult{} -} - -var AddServiceSumResult_Success_DEFAULT *SumReply -func (p *AddServiceSumResult) GetSuccess() *SumReply { - if !p.IsSetSuccess() { - return AddServiceSumResult_Success_DEFAULT - } -return p.Success -} -func (p *AddServiceSumResult) IsSetSuccess() bool { - return p.Success != nil -} - -func (p *AddServiceSumResult) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { break; } - switch fieldId { - case 0: - if fieldTypeId == thrift.STRUCT { - if err := p.ReadField0(iprot); err != nil { - return err - } - } else { - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *AddServiceSumResult) ReadField0(iprot thrift.TProtocol) error { - p.Success = &SumReply{} - if err := p.Success.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) - } - return nil -} - -func (p *AddServiceSumResult) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("Sum_result"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) } - if p != nil { - if err := p.writeField0(oprot); err != nil { return err } - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) } - return nil -} - -func (p *AddServiceSumResult) writeField0(oprot thrift.TProtocol) (err error) { - if p.IsSetSuccess() { - if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) } - if err := p.Success.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) } - } - return err -} - -func (p *AddServiceSumResult) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("AddServiceSumResult(%+v)", *p) -} - -// Attributes: -// - A -// - B -type AddServiceConcatArgs struct { - A string `thrift:"a,1" db:"a" json:"a"` - B string `thrift:"b,2" db:"b" json:"b"` -} - -func NewAddServiceConcatArgs() *AddServiceConcatArgs { - return &AddServiceConcatArgs{} -} - - -func (p *AddServiceConcatArgs) GetA() string { - return p.A -} - -func (p *AddServiceConcatArgs) GetB() string { - return p.B -} -func (p *AddServiceConcatArgs) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { break; } - switch fieldId { - case 1: - if fieldTypeId == thrift.STRING { - if err := p.ReadField1(iprot); err != nil { - return err - } - } else { - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - case 2: - if fieldTypeId == thrift.STRING { - if err := p.ReadField2(iprot); err != nil { - return err - } - } else { - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *AddServiceConcatArgs) ReadField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 1: ", err) -} else { - p.A = v -} - return nil -} - -func (p *AddServiceConcatArgs) ReadField2(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 2: ", err) -} else { - p.B = v -} - return nil -} - -func (p *AddServiceConcatArgs) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("Concat_args"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) } - if p != nil { - if err := p.writeField1(oprot); err != nil { return err } - if err := p.writeField2(oprot); err != nil { return err } - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) } - return nil -} - -func (p *AddServiceConcatArgs) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("a", thrift.STRING, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:a: ", p), err) } - if err := oprot.WriteString(string(p.A)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.a (1) field write error: ", p), err) } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:a: ", p), err) } - return err -} - -func (p *AddServiceConcatArgs) writeField2(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("b", thrift.STRING, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:b: ", p), err) } - if err := oprot.WriteString(string(p.B)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.b (2) field write error: ", p), err) } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:b: ", p), err) } - return err -} - -func (p *AddServiceConcatArgs) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("AddServiceConcatArgs(%+v)", *p) -} - -// Attributes: -// - Success -type AddServiceConcatResult struct { - Success *ConcatReply `thrift:"success,0" db:"success" json:"success,omitempty"` -} - -func NewAddServiceConcatResult() *AddServiceConcatResult { - return &AddServiceConcatResult{} -} - -var AddServiceConcatResult_Success_DEFAULT *ConcatReply -func (p *AddServiceConcatResult) GetSuccess() *ConcatReply { - if !p.IsSetSuccess() { - return AddServiceConcatResult_Success_DEFAULT - } -return p.Success -} -func (p *AddServiceConcatResult) IsSetSuccess() bool { - return p.Success != nil -} - -func (p *AddServiceConcatResult) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { break; } - switch fieldId { - case 0: - if fieldTypeId == thrift.STRUCT { - if err := p.ReadField0(iprot); err != nil { - return err - } - } else { - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *AddServiceConcatResult) ReadField0(iprot thrift.TProtocol) error { - p.Success = &ConcatReply{} - if err := p.Success.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) - } - return nil -} - -func (p *AddServiceConcatResult) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("Concat_result"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) } - if p != nil { - if err := p.writeField0(oprot); err != nil { return err } - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) } - return nil -} - -func (p *AddServiceConcatResult) writeField0(oprot thrift.TProtocol) (err error) { - if p.IsSetSuccess() { - if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) } - if err := p.Success.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) } - } - return err -} - -func (p *AddServiceConcatResult) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("AddServiceConcatResult(%+v)", *p) -} - - diff --git a/vendor/github.com/go-kit/kit/examples/apigateway/main.go b/vendor/github.com/go-kit/kit/examples/apigateway/main.go deleted file mode 100644 index 3b4cd675..00000000 --- a/vendor/github.com/go-kit/kit/examples/apigateway/main.go +++ /dev/null @@ -1,285 +0,0 @@ -package main - -import ( - "bytes" - "context" - "encoding/json" - "flag" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/url" - "os" - "os/signal" - "strings" - "syscall" - "time" - - consulsd "github.com/go-kit/kit/sd/consul" - "github.com/gorilla/mux" - "github.com/hashicorp/consul/api" - stdopentracing "github.com/opentracing/opentracing-go" - "google.golang.org/grpc" - - "github.com/go-kit/kit/endpoint" - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/sd" - "github.com/go-kit/kit/sd/lb" - httptransport "github.com/go-kit/kit/transport/http" - - "github.com/go-kit/kit/examples/addsvc/pkg/addendpoint" - "github.com/go-kit/kit/examples/addsvc/pkg/addservice" - "github.com/go-kit/kit/examples/addsvc/pkg/addtransport" -) - -func main() { - var ( - httpAddr = flag.String("http.addr", ":8000", "Address for HTTP (JSON) server") - consulAddr = flag.String("consul.addr", "", "Consul agent address") - retryMax = flag.Int("retry.max", 3, "per-request retries to different instances") - retryTimeout = flag.Duration("retry.timeout", 500*time.Millisecond, "per-request timeout, including retries") - ) - flag.Parse() - - // Logging domain. - var logger log.Logger - { - logger = log.NewLogfmtLogger(os.Stderr) - logger = log.With(logger, "ts", log.DefaultTimestampUTC) - logger = log.With(logger, "caller", log.DefaultCaller) - } - - // Service discovery domain. In this example we use Consul. - var client consulsd.Client - { - consulConfig := api.DefaultConfig() - if len(*consulAddr) > 0 { - consulConfig.Address = *consulAddr - } - consulClient, err := api.NewClient(consulConfig) - if err != nil { - logger.Log("err", err) - os.Exit(1) - } - client = consulsd.NewClient(consulClient) - } - - // Transport domain. - tracer := stdopentracing.GlobalTracer() // no-op - ctx := context.Background() - r := mux.NewRouter() - - // Now we begin installing the routes. Each route corresponds to a single - // method: sum, concat, uppercase, and count. - - // addsvc routes. - { - // Each method gets constructed with a factory. Factories take an - // instance string, and return a specific endpoint. In the factory we - // dial the instance string we get from Consul, and then leverage an - // addsvc client package to construct a complete service. We can then - // leverage the addsvc.Make{Sum,Concat}Endpoint constructors to convert - // the complete service to specific endpoint. - var ( - tags = []string{} - passingOnly = true - endpoints = addendpoint.Set{} - instancer = consulsd.NewInstancer(client, logger, "addsvc", tags, passingOnly) - ) - { - factory := addsvcFactory(addendpoint.MakeSumEndpoint, tracer, logger) - endpointer := sd.NewEndpointer(instancer, factory, logger) - balancer := lb.NewRoundRobin(endpointer) - retry := lb.Retry(*retryMax, *retryTimeout, balancer) - endpoints.SumEndpoint = retry - } - { - factory := addsvcFactory(addendpoint.MakeConcatEndpoint, tracer, logger) - endpointer := sd.NewEndpointer(instancer, factory, logger) - balancer := lb.NewRoundRobin(endpointer) - retry := lb.Retry(*retryMax, *retryTimeout, balancer) - endpoints.ConcatEndpoint = retry - } - - // Here we leverage the fact that addsvc comes with a constructor for an - // HTTP handler, and just install it under a particular path prefix in - // our router. - - r.PathPrefix("/addsvc").Handler(http.StripPrefix("/addsvc", addtransport.NewHTTPHandler(endpoints, tracer, logger))) - } - - // stringsvc routes. - { - // addsvc had lots of nice importable Go packages we could leverage. - // With stringsvc we are not so fortunate, it just has some endpoints - // that we assume will exist. So we have to write that logic here. This - // is by design, so you can see two totally different methods of - // proxying to a remote service. - - var ( - tags = []string{} - passingOnly = true - uppercase endpoint.Endpoint - count endpoint.Endpoint - instancer = consulsd.NewInstancer(client, logger, "stringsvc", tags, passingOnly) - ) - { - factory := stringsvcFactory(ctx, "GET", "/uppercase") - endpointer := sd.NewEndpointer(instancer, factory, logger) - balancer := lb.NewRoundRobin(endpointer) - retry := lb.Retry(*retryMax, *retryTimeout, balancer) - uppercase = retry - } - { - factory := stringsvcFactory(ctx, "GET", "/count") - endpointer := sd.NewEndpointer(instancer, factory, logger) - balancer := lb.NewRoundRobin(endpointer) - retry := lb.Retry(*retryMax, *retryTimeout, balancer) - count = retry - } - - // We can use the transport/http.Server to act as our handler, all we - // have to do provide it with the encode and decode functions for our - // stringsvc methods. - - r.Handle("/stringsvc/uppercase", httptransport.NewServer(uppercase, decodeUppercaseRequest, encodeJSONResponse)) - r.Handle("/stringsvc/count", httptransport.NewServer(count, decodeCountRequest, encodeJSONResponse)) - } - - // Interrupt handler. - errc := make(chan error) - go func() { - c := make(chan os.Signal) - signal.Notify(c, syscall.SIGINT, syscall.SIGTERM) - errc <- fmt.Errorf("%s", <-c) - }() - - // HTTP transport. - go func() { - logger.Log("transport", "HTTP", "addr", *httpAddr) - errc <- http.ListenAndServe(*httpAddr, r) - }() - - // Run! - logger.Log("exit", <-errc) -} - -func addsvcFactory(makeEndpoint func(addservice.Service) endpoint.Endpoint, tracer stdopentracing.Tracer, logger log.Logger) sd.Factory { - return func(instance string) (endpoint.Endpoint, io.Closer, error) { - // We could just as easily use the HTTP or Thrift client package to make - // the connection to addsvc. We've chosen gRPC arbitrarily. Note that - // the transport is an implementation detail: it doesn't leak out of - // this function. Nice! - - conn, err := grpc.Dial(instance, grpc.WithInsecure()) - if err != nil { - return nil, nil, err - } - service := addtransport.NewGRPCClient(conn, tracer, logger) - endpoint := makeEndpoint(service) - - // Notice that the addsvc gRPC client converts the connection to a - // complete addsvc, and we just throw away everything except the method - // we're interested in. A smarter factory would mux multiple methods - // over the same connection. But that would require more work to manage - // the returned io.Closer, e.g. reference counting. Since this is for - // the purposes of demonstration, we'll just keep it simple. - - return endpoint, conn, nil - } -} - -func stringsvcFactory(ctx context.Context, method, path string) sd.Factory { - return func(instance string) (endpoint.Endpoint, io.Closer, error) { - if !strings.HasPrefix(instance, "http") { - instance = "http://" + instance - } - tgt, err := url.Parse(instance) - if err != nil { - return nil, nil, err - } - tgt.Path = path - - // Since stringsvc doesn't have any kind of package we can import, or - // any formal spec, we are forced to just assert where the endpoints - // live, and write our own code to encode and decode requests and - // responses. Ideally, if you write the service, you will want to - // provide stronger guarantees to your clients. - - var ( - enc httptransport.EncodeRequestFunc - dec httptransport.DecodeResponseFunc - ) - switch path { - case "/uppercase": - enc, dec = encodeJSONRequest, decodeUppercaseResponse - case "/count": - enc, dec = encodeJSONRequest, decodeCountResponse - default: - return nil, nil, fmt.Errorf("unknown stringsvc path %q", path) - } - - return httptransport.NewClient(method, tgt, enc, dec).Endpoint(), nil, nil - } -} - -func encodeJSONRequest(_ context.Context, req *http.Request, request interface{}) error { - // Both uppercase and count requests are encoded in the same way: - // simple JSON serialization to the request body. - var buf bytes.Buffer - if err := json.NewEncoder(&buf).Encode(request); err != nil { - return err - } - req.Body = ioutil.NopCloser(&buf) - return nil -} - -func encodeJSONResponse(_ context.Context, w http.ResponseWriter, response interface{}) error { - w.Header().Set("Content-Type", "application/json; charset=utf-8") - return json.NewEncoder(w).Encode(response) -} - -// I've just copied these functions from stringsvc3/transport.go, inlining the -// struct definitions. - -func decodeUppercaseResponse(ctx context.Context, resp *http.Response) (interface{}, error) { - var response struct { - V string `json:"v"` - Err string `json:"err,omitempty"` - } - if err := json.NewDecoder(resp.Body).Decode(&response); err != nil { - return nil, err - } - return response, nil -} - -func decodeCountResponse(ctx context.Context, resp *http.Response) (interface{}, error) { - var response struct { - V int `json:"v"` - } - if err := json.NewDecoder(resp.Body).Decode(&response); err != nil { - return nil, err - } - return response, nil -} - -func decodeUppercaseRequest(ctx context.Context, req *http.Request) (interface{}, error) { - var request struct { - S string `json:"s"` - } - if err := json.NewDecoder(req.Body).Decode(&request); err != nil { - return nil, err - } - return request, nil -} - -func decodeCountRequest(ctx context.Context, req *http.Request) (interface{}, error) { - var request struct { - S string `json:"s"` - } - if err := json.NewDecoder(req.Body).Decode(&request); err != nil { - return nil, err - } - return request, nil -} diff --git a/vendor/github.com/go-kit/kit/examples/profilesvc/README.md b/vendor/github.com/go-kit/kit/examples/profilesvc/README.md deleted file mode 100644 index 68c41252..00000000 --- a/vendor/github.com/go-kit/kit/examples/profilesvc/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# profilesvc - -This example demonstrates how to use Go kit to implement a REST-y HTTP service. -It leverages the excellent [gorilla mux package](https://github.com/gorilla/mux) for routing. diff --git a/vendor/github.com/go-kit/kit/examples/profilesvc/client/client.go b/vendor/github.com/go-kit/kit/examples/profilesvc/client/client.go deleted file mode 100644 index 03c1dc7a..00000000 --- a/vendor/github.com/go-kit/kit/examples/profilesvc/client/client.go +++ /dev/null @@ -1,121 +0,0 @@ -// Package client provides a profilesvc client based on a predefined Consul -// service name and relevant tags. Users must only provide the address of a -// Consul server. -package client - -import ( - "io" - "time" - - consulapi "github.com/hashicorp/consul/api" - - "github.com/go-kit/kit/endpoint" - "github.com/go-kit/kit/examples/profilesvc" - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/sd" - "github.com/go-kit/kit/sd/consul" - "github.com/go-kit/kit/sd/lb" -) - -// New returns a service that's load-balanced over instances of profilesvc found -// in the provided Consul server. The mechanism of looking up profilesvc -// instances in Consul is hard-coded into the client. -func New(consulAddr string, logger log.Logger) (profilesvc.Service, error) { - apiclient, err := consulapi.NewClient(&consulapi.Config{ - Address: consulAddr, - }) - if err != nil { - return nil, err - } - - // As the implementer of profilesvc, we declare and enforce these - // parameters for all of the profilesvc consumers. - var ( - consulService = "profilesvc" - consulTags = []string{"prod"} - passingOnly = true - retryMax = 3 - retryTimeout = 500 * time.Millisecond - ) - - var ( - sdclient = consul.NewClient(apiclient) - instancer = consul.NewInstancer(sdclient, logger, consulService, consulTags, passingOnly) - endpoints profilesvc.Endpoints - ) - { - factory := factoryFor(profilesvc.MakePostProfileEndpoint) - endpointer := sd.NewEndpointer(instancer, factory, logger) - balancer := lb.NewRoundRobin(endpointer) - retry := lb.Retry(retryMax, retryTimeout, balancer) - endpoints.PostProfileEndpoint = retry - } - { - factory := factoryFor(profilesvc.MakeGetProfileEndpoint) - endpointer := sd.NewEndpointer(instancer, factory, logger) - balancer := lb.NewRoundRobin(endpointer) - retry := lb.Retry(retryMax, retryTimeout, balancer) - endpoints.GetProfileEndpoint = retry - } - { - factory := factoryFor(profilesvc.MakePutProfileEndpoint) - endpointer := sd.NewEndpointer(instancer, factory, logger) - balancer := lb.NewRoundRobin(endpointer) - retry := lb.Retry(retryMax, retryTimeout, balancer) - endpoints.PutProfileEndpoint = retry - } - { - factory := factoryFor(profilesvc.MakePatchProfileEndpoint) - endpointer := sd.NewEndpointer(instancer, factory, logger) - balancer := lb.NewRoundRobin(endpointer) - retry := lb.Retry(retryMax, retryTimeout, balancer) - endpoints.PatchProfileEndpoint = retry - } - { - factory := factoryFor(profilesvc.MakeDeleteProfileEndpoint) - endpointer := sd.NewEndpointer(instancer, factory, logger) - balancer := lb.NewRoundRobin(endpointer) - retry := lb.Retry(retryMax, retryTimeout, balancer) - endpoints.DeleteProfileEndpoint = retry - } - { - factory := factoryFor(profilesvc.MakeGetAddressesEndpoint) - endpointer := sd.NewEndpointer(instancer, factory, logger) - balancer := lb.NewRoundRobin(endpointer) - retry := lb.Retry(retryMax, retryTimeout, balancer) - endpoints.GetAddressesEndpoint = retry - } - { - factory := factoryFor(profilesvc.MakeGetAddressEndpoint) - endpointer := sd.NewEndpointer(instancer, factory, logger) - balancer := lb.NewRoundRobin(endpointer) - retry := lb.Retry(retryMax, retryTimeout, balancer) - endpoints.GetAddressEndpoint = retry - } - { - factory := factoryFor(profilesvc.MakePostAddressEndpoint) - endpointer := sd.NewEndpointer(instancer, factory, logger) - balancer := lb.NewRoundRobin(endpointer) - retry := lb.Retry(retryMax, retryTimeout, balancer) - endpoints.PostAddressEndpoint = retry - } - { - factory := factoryFor(profilesvc.MakeDeleteAddressEndpoint) - endpointer := sd.NewEndpointer(instancer, factory, logger) - balancer := lb.NewRoundRobin(endpointer) - retry := lb.Retry(retryMax, retryTimeout, balancer) - endpoints.DeleteAddressEndpoint = retry - } - - return endpoints, nil -} - -func factoryFor(makeEndpoint func(profilesvc.Service) endpoint.Endpoint) sd.Factory { - return func(instance string) (endpoint.Endpoint, io.Closer, error) { - service, err := profilesvc.MakeClientEndpoints(instance) - if err != nil { - return nil, nil, err - } - return makeEndpoint(service), nil, nil - } -} diff --git a/vendor/github.com/go-kit/kit/examples/profilesvc/cmd/profilesvc/main.go b/vendor/github.com/go-kit/kit/examples/profilesvc/cmd/profilesvc/main.go deleted file mode 100644 index fda75295..00000000 --- a/vendor/github.com/go-kit/kit/examples/profilesvc/cmd/profilesvc/main.go +++ /dev/null @@ -1,52 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "net/http" - "os" - "os/signal" - "syscall" - - "github.com/go-kit/kit/examples/profilesvc" - "github.com/go-kit/kit/log" -) - -func main() { - var ( - httpAddr = flag.String("http.addr", ":8080", "HTTP listen address") - ) - flag.Parse() - - var logger log.Logger - { - logger = log.NewLogfmtLogger(os.Stderr) - logger = log.With(logger, "ts", log.DefaultTimestampUTC) - logger = log.With(logger, "caller", log.DefaultCaller) - } - - var s profilesvc.Service - { - s = profilesvc.NewInmemService() - s = profilesvc.LoggingMiddleware(logger)(s) - } - - var h http.Handler - { - h = profilesvc.MakeHTTPHandler(s, log.With(logger, "component", "HTTP")) - } - - errs := make(chan error) - go func() { - c := make(chan os.Signal) - signal.Notify(c, syscall.SIGINT, syscall.SIGTERM) - errs <- fmt.Errorf("%s", <-c) - }() - - go func() { - logger.Log("transport", "HTTP", "addr", *httpAddr) - errs <- http.ListenAndServe(*httpAddr, h) - }() - - logger.Log("exit", <-errs) -} diff --git a/vendor/github.com/go-kit/kit/examples/profilesvc/endpoints.go b/vendor/github.com/go-kit/kit/examples/profilesvc/endpoints.go deleted file mode 100644 index 3da29b4a..00000000 --- a/vendor/github.com/go-kit/kit/examples/profilesvc/endpoints.go +++ /dev/null @@ -1,387 +0,0 @@ -package profilesvc - -import ( - "context" - "net/url" - "strings" - - "github.com/go-kit/kit/endpoint" - httptransport "github.com/go-kit/kit/transport/http" -) - -// Endpoints collects all of the endpoints that compose a profile service. It's -// meant to be used as a helper struct, to collect all of the endpoints into a -// single parameter. -// -// In a server, it's useful for functions that need to operate on a per-endpoint -// basis. For example, you might pass an Endpoints to a function that produces -// an http.Handler, with each method (endpoint) wired up to a specific path. (It -// is probably a mistake in design to invoke the Service methods on the -// Endpoints struct in a server.) -// -// In a client, it's useful to collect individually constructed endpoints into a -// single type that implements the Service interface. For example, you might -// construct individual endpoints using transport/http.NewClient, combine them -// into an Endpoints, and return it to the caller as a Service. -type Endpoints struct { - PostProfileEndpoint endpoint.Endpoint - GetProfileEndpoint endpoint.Endpoint - PutProfileEndpoint endpoint.Endpoint - PatchProfileEndpoint endpoint.Endpoint - DeleteProfileEndpoint endpoint.Endpoint - GetAddressesEndpoint endpoint.Endpoint - GetAddressEndpoint endpoint.Endpoint - PostAddressEndpoint endpoint.Endpoint - DeleteAddressEndpoint endpoint.Endpoint -} - -// MakeServerEndpoints returns an Endpoints struct where each endpoint invokes -// the corresponding method on the provided service. Useful in a profilesvc -// server. -func MakeServerEndpoints(s Service) Endpoints { - return Endpoints{ - PostProfileEndpoint: MakePostProfileEndpoint(s), - GetProfileEndpoint: MakeGetProfileEndpoint(s), - PutProfileEndpoint: MakePutProfileEndpoint(s), - PatchProfileEndpoint: MakePatchProfileEndpoint(s), - DeleteProfileEndpoint: MakeDeleteProfileEndpoint(s), - GetAddressesEndpoint: MakeGetAddressesEndpoint(s), - GetAddressEndpoint: MakeGetAddressEndpoint(s), - PostAddressEndpoint: MakePostAddressEndpoint(s), - DeleteAddressEndpoint: MakeDeleteAddressEndpoint(s), - } -} - -// MakeClientEndpoints returns an Endpoints struct where each endpoint invokes -// the corresponding method on the remote instance, via a transport/http.Client. -// Useful in a profilesvc client. -func MakeClientEndpoints(instance string) (Endpoints, error) { - if !strings.HasPrefix(instance, "http") { - instance = "http://" + instance - } - tgt, err := url.Parse(instance) - if err != nil { - return Endpoints{}, err - } - tgt.Path = "" - - options := []httptransport.ClientOption{} - - // Note that the request encoders need to modify the request URL, changing - // the path and method. That's fine: we simply need to provide specific - // encoders for each endpoint. - - return Endpoints{ - PostProfileEndpoint: httptransport.NewClient("POST", tgt, encodePostProfileRequest, decodePostProfileResponse, options...).Endpoint(), - GetProfileEndpoint: httptransport.NewClient("GET", tgt, encodeGetProfileRequest, decodeGetProfileResponse, options...).Endpoint(), - PutProfileEndpoint: httptransport.NewClient("PUT", tgt, encodePutProfileRequest, decodePutProfileResponse, options...).Endpoint(), - PatchProfileEndpoint: httptransport.NewClient("PATCH", tgt, encodePatchProfileRequest, decodePatchProfileResponse, options...).Endpoint(), - DeleteProfileEndpoint: httptransport.NewClient("DELETE", tgt, encodeDeleteProfileRequest, decodeDeleteProfileResponse, options...).Endpoint(), - GetAddressesEndpoint: httptransport.NewClient("GET", tgt, encodeGetAddressesRequest, decodeGetAddressesResponse, options...).Endpoint(), - GetAddressEndpoint: httptransport.NewClient("GET", tgt, encodeGetAddressRequest, decodeGetAddressResponse, options...).Endpoint(), - PostAddressEndpoint: httptransport.NewClient("POST", tgt, encodePostAddressRequest, decodePostAddressResponse, options...).Endpoint(), - DeleteAddressEndpoint: httptransport.NewClient("DELETE", tgt, encodeDeleteAddressRequest, decodeDeleteAddressResponse, options...).Endpoint(), - }, nil -} - -// PostProfile implements Service. Primarily useful in a client. -func (e Endpoints) PostProfile(ctx context.Context, p Profile) error { - request := postProfileRequest{Profile: p} - response, err := e.PostProfileEndpoint(ctx, request) - if err != nil { - return err - } - resp := response.(postProfileResponse) - return resp.Err -} - -// GetProfile implements Service. Primarily useful in a client. -func (e Endpoints) GetProfile(ctx context.Context, id string) (Profile, error) { - request := getProfileRequest{ID: id} - response, err := e.GetProfileEndpoint(ctx, request) - if err != nil { - return Profile{}, err - } - resp := response.(getProfileResponse) - return resp.Profile, resp.Err -} - -// PutProfile implements Service. Primarily useful in a client. -func (e Endpoints) PutProfile(ctx context.Context, id string, p Profile) error { - request := putProfileRequest{ID: id, Profile: p} - response, err := e.PutProfileEndpoint(ctx, request) - if err != nil { - return err - } - resp := response.(putProfileResponse) - return resp.Err -} - -// PatchProfile implements Service. Primarily useful in a client. -func (e Endpoints) PatchProfile(ctx context.Context, id string, p Profile) error { - request := patchProfileRequest{ID: id, Profile: p} - response, err := e.PatchProfileEndpoint(ctx, request) - if err != nil { - return err - } - resp := response.(patchProfileResponse) - return resp.Err -} - -// DeleteProfile implements Service. Primarily useful in a client. -func (e Endpoints) DeleteProfile(ctx context.Context, id string) error { - request := deleteProfileRequest{ID: id} - response, err := e.DeleteProfileEndpoint(ctx, request) - if err != nil { - return err - } - resp := response.(deleteProfileResponse) - return resp.Err -} - -// GetAddresses implements Service. Primarily useful in a client. -func (e Endpoints) GetAddresses(ctx context.Context, profileID string) ([]Address, error) { - request := getAddressesRequest{ProfileID: profileID} - response, err := e.GetAddressesEndpoint(ctx, request) - if err != nil { - return nil, err - } - resp := response.(getAddressesResponse) - return resp.Addresses, resp.Err -} - -// GetAddress implements Service. Primarily useful in a client. -func (e Endpoints) GetAddress(ctx context.Context, profileID string, addressID string) (Address, error) { - request := getAddressRequest{ProfileID: profileID, AddressID: addressID} - response, err := e.GetAddressEndpoint(ctx, request) - if err != nil { - return Address{}, err - } - resp := response.(getAddressResponse) - return resp.Address, resp.Err -} - -// PostAddress implements Service. Primarily useful in a client. -func (e Endpoints) PostAddress(ctx context.Context, profileID string, a Address) error { - request := postAddressRequest{ProfileID: profileID, Address: a} - response, err := e.PostAddressEndpoint(ctx, request) - if err != nil { - return err - } - resp := response.(postAddressResponse) - return resp.Err -} - -// DeleteAddress implements Service. Primarily useful in a client. -func (e Endpoints) DeleteAddress(ctx context.Context, profileID string, addressID string) error { - request := deleteAddressRequest{ProfileID: profileID, AddressID: addressID} - response, err := e.DeleteAddressEndpoint(ctx, request) - if err != nil { - return err - } - resp := response.(deleteAddressResponse) - return resp.Err -} - -// MakePostProfileEndpoint returns an endpoint via the passed service. -// Primarily useful in a server. -func MakePostProfileEndpoint(s Service) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (response interface{}, err error) { - req := request.(postProfileRequest) - e := s.PostProfile(ctx, req.Profile) - return postProfileResponse{Err: e}, nil - } -} - -// MakeGetProfileEndpoint returns an endpoint via the passed service. -// Primarily useful in a server. -func MakeGetProfileEndpoint(s Service) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (response interface{}, err error) { - req := request.(getProfileRequest) - p, e := s.GetProfile(ctx, req.ID) - return getProfileResponse{Profile: p, Err: e}, nil - } -} - -// MakePutProfileEndpoint returns an endpoint via the passed service. -// Primarily useful in a server. -func MakePutProfileEndpoint(s Service) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (response interface{}, err error) { - req := request.(putProfileRequest) - e := s.PutProfile(ctx, req.ID, req.Profile) - return putProfileResponse{Err: e}, nil - } -} - -// MakePatchProfileEndpoint returns an endpoint via the passed service. -// Primarily useful in a server. -func MakePatchProfileEndpoint(s Service) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (response interface{}, err error) { - req := request.(patchProfileRequest) - e := s.PatchProfile(ctx, req.ID, req.Profile) - return patchProfileResponse{Err: e}, nil - } -} - -// MakeDeleteProfileEndpoint returns an endpoint via the passed service. -// Primarily useful in a server. -func MakeDeleteProfileEndpoint(s Service) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (response interface{}, err error) { - req := request.(deleteProfileRequest) - e := s.DeleteProfile(ctx, req.ID) - return deleteProfileResponse{Err: e}, nil - } -} - -// MakeGetAddressesEndpoint returns an endpoint via the passed service. -// Primarily useful in a server. -func MakeGetAddressesEndpoint(s Service) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (response interface{}, err error) { - req := request.(getAddressesRequest) - a, e := s.GetAddresses(ctx, req.ProfileID) - return getAddressesResponse{Addresses: a, Err: e}, nil - } -} - -// MakeGetAddressEndpoint returns an endpoint via the passed service. -// Primarily useful in a server. -func MakeGetAddressEndpoint(s Service) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (response interface{}, err error) { - req := request.(getAddressRequest) - a, e := s.GetAddress(ctx, req.ProfileID, req.AddressID) - return getAddressResponse{Address: a, Err: e}, nil - } -} - -// MakePostAddressEndpoint returns an endpoint via the passed service. -// Primarily useful in a server. -func MakePostAddressEndpoint(s Service) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (response interface{}, err error) { - req := request.(postAddressRequest) - e := s.PostAddress(ctx, req.ProfileID, req.Address) - return postAddressResponse{Err: e}, nil - } -} - -// MakeDeleteAddressEndpoint returns an endpoint via the passed service. -// Primarily useful in a server. -func MakeDeleteAddressEndpoint(s Service) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (response interface{}, err error) { - req := request.(deleteAddressRequest) - e := s.DeleteAddress(ctx, req.ProfileID, req.AddressID) - return deleteAddressResponse{Err: e}, nil - } -} - -// We have two options to return errors from the business logic. -// -// We could return the error via the endpoint itself. That makes certain things -// a little bit easier, like providing non-200 HTTP responses to the client. But -// Go kit assumes that endpoint errors are (or may be treated as) -// transport-domain errors. For example, an endpoint error will count against a -// circuit breaker error count. -// -// Therefore, it's often better to return service (business logic) errors in the -// response object. This means we have to do a bit more work in the HTTP -// response encoder to detect e.g. a not-found error and provide a proper HTTP -// status code. That work is done with the errorer interface, in transport.go. -// Response types that may contain business-logic errors implement that -// interface. - -type postProfileRequest struct { - Profile Profile -} - -type postProfileResponse struct { - Err error `json:"err,omitempty"` -} - -func (r postProfileResponse) error() error { return r.Err } - -type getProfileRequest struct { - ID string -} - -type getProfileResponse struct { - Profile Profile `json:"profile,omitempty"` - Err error `json:"err,omitempty"` -} - -func (r getProfileResponse) error() error { return r.Err } - -type putProfileRequest struct { - ID string - Profile Profile -} - -type putProfileResponse struct { - Err error `json:"err,omitempty"` -} - -func (r putProfileResponse) error() error { return nil } - -type patchProfileRequest struct { - ID string - Profile Profile -} - -type patchProfileResponse struct { - Err error `json:"err,omitempty"` -} - -func (r patchProfileResponse) error() error { return r.Err } - -type deleteProfileRequest struct { - ID string -} - -type deleteProfileResponse struct { - Err error `json:"err,omitempty"` -} - -func (r deleteProfileResponse) error() error { return r.Err } - -type getAddressesRequest struct { - ProfileID string -} - -type getAddressesResponse struct { - Addresses []Address `json:"addresses,omitempty"` - Err error `json:"err,omitempty"` -} - -func (r getAddressesResponse) error() error { return r.Err } - -type getAddressRequest struct { - ProfileID string - AddressID string -} - -type getAddressResponse struct { - Address Address `json:"address,omitempty"` - Err error `json:"err,omitempty"` -} - -func (r getAddressResponse) error() error { return r.Err } - -type postAddressRequest struct { - ProfileID string - Address Address -} - -type postAddressResponse struct { - Err error `json:"err,omitempty"` -} - -func (r postAddressResponse) error() error { return r.Err } - -type deleteAddressRequest struct { - ProfileID string - AddressID string -} - -type deleteAddressResponse struct { - Err error `json:"err,omitempty"` -} - -func (r deleteAddressResponse) error() error { return r.Err } diff --git a/vendor/github.com/go-kit/kit/examples/profilesvc/middlewares.go b/vendor/github.com/go-kit/kit/examples/profilesvc/middlewares.go deleted file mode 100644 index 1b738f5b..00000000 --- a/vendor/github.com/go-kit/kit/examples/profilesvc/middlewares.go +++ /dev/null @@ -1,88 +0,0 @@ -package profilesvc - -import ( - "context" - "time" - - "github.com/go-kit/kit/log" -) - -// Middleware describes a service (as opposed to endpoint) middleware. -type Middleware func(Service) Service - -func LoggingMiddleware(logger log.Logger) Middleware { - return func(next Service) Service { - return &loggingMiddleware{ - next: next, - logger: logger, - } - } -} - -type loggingMiddleware struct { - next Service - logger log.Logger -} - -func (mw loggingMiddleware) PostProfile(ctx context.Context, p Profile) (err error) { - defer func(begin time.Time) { - mw.logger.Log("method", "PostProfile", "id", p.ID, "took", time.Since(begin), "err", err) - }(time.Now()) - return mw.next.PostProfile(ctx, p) -} - -func (mw loggingMiddleware) GetProfile(ctx context.Context, id string) (p Profile, err error) { - defer func(begin time.Time) { - mw.logger.Log("method", "GetProfile", "id", id, "took", time.Since(begin), "err", err) - }(time.Now()) - return mw.next.GetProfile(ctx, id) -} - -func (mw loggingMiddleware) PutProfile(ctx context.Context, id string, p Profile) (err error) { - defer func(begin time.Time) { - mw.logger.Log("method", "PutProfile", "id", id, "took", time.Since(begin), "err", err) - }(time.Now()) - return mw.next.PutProfile(ctx, id, p) -} - -func (mw loggingMiddleware) PatchProfile(ctx context.Context, id string, p Profile) (err error) { - defer func(begin time.Time) { - mw.logger.Log("method", "PatchProfile", "id", id, "took", time.Since(begin), "err", err) - }(time.Now()) - return mw.next.PatchProfile(ctx, id, p) -} - -func (mw loggingMiddleware) DeleteProfile(ctx context.Context, id string) (err error) { - defer func(begin time.Time) { - mw.logger.Log("method", "DeleteProfile", "id", id, "took", time.Since(begin), "err", err) - }(time.Now()) - return mw.next.DeleteProfile(ctx, id) -} - -func (mw loggingMiddleware) GetAddresses(ctx context.Context, profileID string) (addresses []Address, err error) { - defer func(begin time.Time) { - mw.logger.Log("method", "GetAddresses", "profileID", profileID, "took", time.Since(begin), "err", err) - }(time.Now()) - return mw.next.GetAddresses(ctx, profileID) -} - -func (mw loggingMiddleware) GetAddress(ctx context.Context, profileID string, addressID string) (a Address, err error) { - defer func(begin time.Time) { - mw.logger.Log("method", "GetAddress", "profileID", profileID, "addressID", addressID, "took", time.Since(begin), "err", err) - }(time.Now()) - return mw.next.GetAddress(ctx, profileID, addressID) -} - -func (mw loggingMiddleware) PostAddress(ctx context.Context, profileID string, a Address) (err error) { - defer func(begin time.Time) { - mw.logger.Log("method", "PostAddress", "profileID", profileID, "took", time.Since(begin), "err", err) - }(time.Now()) - return mw.next.PostAddress(ctx, profileID, a) -} - -func (mw loggingMiddleware) DeleteAddress(ctx context.Context, profileID string, addressID string) (err error) { - defer func(begin time.Time) { - mw.logger.Log("method", "DeleteAddress", "profileID", profileID, "addressID", addressID, "took", time.Since(begin), "err", err) - }(time.Now()) - return mw.next.DeleteAddress(ctx, profileID, addressID) -} diff --git a/vendor/github.com/go-kit/kit/examples/profilesvc/service.go b/vendor/github.com/go-kit/kit/examples/profilesvc/service.go deleted file mode 100644 index cd34ecd9..00000000 --- a/vendor/github.com/go-kit/kit/examples/profilesvc/service.go +++ /dev/null @@ -1,185 +0,0 @@ -package profilesvc - -import ( - "context" - "errors" - "sync" -) - -// Service is a simple CRUD interface for user profiles. -type Service interface { - PostProfile(ctx context.Context, p Profile) error - GetProfile(ctx context.Context, id string) (Profile, error) - PutProfile(ctx context.Context, id string, p Profile) error - PatchProfile(ctx context.Context, id string, p Profile) error - DeleteProfile(ctx context.Context, id string) error - GetAddresses(ctx context.Context, profileID string) ([]Address, error) - GetAddress(ctx context.Context, profileID string, addressID string) (Address, error) - PostAddress(ctx context.Context, profileID string, a Address) error - DeleteAddress(ctx context.Context, profileID string, addressID string) error -} - -// Profile represents a single user profile. -// ID should be globally unique. -type Profile struct { - ID string `json:"id"` - Name string `json:"name,omitempty"` - Addresses []Address `json:"addresses,omitempty"` -} - -// Address is a field of a user profile. -// ID should be unique within the profile (at a minimum). -type Address struct { - ID string `json:"id"` - Location string `json:"location,omitempty"` -} - -var ( - ErrInconsistentIDs = errors.New("inconsistent IDs") - ErrAlreadyExists = errors.New("already exists") - ErrNotFound = errors.New("not found") -) - -type inmemService struct { - mtx sync.RWMutex - m map[string]Profile -} - -func NewInmemService() Service { - return &inmemService{ - m: map[string]Profile{}, - } -} - -func (s *inmemService) PostProfile(ctx context.Context, p Profile) error { - s.mtx.Lock() - defer s.mtx.Unlock() - if _, ok := s.m[p.ID]; ok { - return ErrAlreadyExists // POST = create, don't overwrite - } - s.m[p.ID] = p - return nil -} - -func (s *inmemService) GetProfile(ctx context.Context, id string) (Profile, error) { - s.mtx.RLock() - defer s.mtx.RUnlock() - p, ok := s.m[id] - if !ok { - return Profile{}, ErrNotFound - } - return p, nil -} - -func (s *inmemService) PutProfile(ctx context.Context, id string, p Profile) error { - if id != p.ID { - return ErrInconsistentIDs - } - s.mtx.Lock() - defer s.mtx.Unlock() - s.m[id] = p // PUT = create or update - return nil -} - -func (s *inmemService) PatchProfile(ctx context.Context, id string, p Profile) error { - if p.ID != "" && id != p.ID { - return ErrInconsistentIDs - } - - s.mtx.Lock() - defer s.mtx.Unlock() - - existing, ok := s.m[id] - if !ok { - return ErrNotFound // PATCH = update existing, don't create - } - - // We assume that it's not possible to PATCH the ID, and that it's not - // possible to PATCH any field to its zero value. That is, the zero value - // means not specified. The way around this is to use e.g. Name *string in - // the Profile definition. But since this is just a demonstrative example, - // I'm leaving that out. - - if p.Name != "" { - existing.Name = p.Name - } - if len(p.Addresses) > 0 { - existing.Addresses = p.Addresses - } - s.m[id] = existing - return nil -} - -func (s *inmemService) DeleteProfile(ctx context.Context, id string) error { - s.mtx.Lock() - defer s.mtx.Unlock() - if _, ok := s.m[id]; !ok { - return ErrNotFound - } - delete(s.m, id) - return nil -} - -func (s *inmemService) GetAddresses(ctx context.Context, profileID string) ([]Address, error) { - s.mtx.RLock() - defer s.mtx.RUnlock() - p, ok := s.m[profileID] - if !ok { - return []Address{}, ErrNotFound - } - return p.Addresses, nil -} - -func (s *inmemService) GetAddress(ctx context.Context, profileID string, addressID string) (Address, error) { - s.mtx.RLock() - defer s.mtx.RUnlock() - p, ok := s.m[profileID] - if !ok { - return Address{}, ErrNotFound - } - for _, address := range p.Addresses { - if address.ID == addressID { - return address, nil - } - } - return Address{}, ErrNotFound -} - -func (s *inmemService) PostAddress(ctx context.Context, profileID string, a Address) error { - s.mtx.Lock() - defer s.mtx.Unlock() - p, ok := s.m[profileID] - if !ok { - return ErrNotFound - } - for _, address := range p.Addresses { - if address.ID == a.ID { - return ErrAlreadyExists - } - } - p.Addresses = append(p.Addresses, a) - s.m[profileID] = p - return nil -} - -func (s *inmemService) DeleteAddress(ctx context.Context, profileID string, addressID string) error { - s.mtx.Lock() - defer s.mtx.Unlock() - p, ok := s.m[profileID] - if !ok { - return ErrNotFound - } - newAddresses := make([]Address, 0, len(p.Addresses)) - for _, address := range p.Addresses { - if address.ID == addressID { - continue // delete - } - newAddresses = append(newAddresses, address) - } - if len(newAddresses) == len(p.Addresses) { - return ErrNotFound - } - p.Addresses = newAddresses - s.m[profileID] = p - return nil -} diff --git a/vendor/github.com/go-kit/kit/examples/profilesvc/transport.go b/vendor/github.com/go-kit/kit/examples/profilesvc/transport.go deleted file mode 100644 index a0136ee4..00000000 --- a/vendor/github.com/go-kit/kit/examples/profilesvc/transport.go +++ /dev/null @@ -1,400 +0,0 @@ -package profilesvc - -// The profilesvc is just over HTTP, so we just have a single transport.go. - -import ( - "bytes" - "context" - "encoding/json" - "errors" - "io/ioutil" - "net/http" - "net/url" - - "github.com/gorilla/mux" - - "github.com/go-kit/kit/log" - httptransport "github.com/go-kit/kit/transport/http" -) - -var ( - // ErrBadRouting is returned when an expected path variable is missing. - // It always indicates programmer error. - ErrBadRouting = errors.New("inconsistent mapping between route and handler (programmer error)") -) - -// MakeHTTPHandler mounts all of the service endpoints into an http.Handler. -// Useful in a profilesvc server. -func MakeHTTPHandler(s Service, logger log.Logger) http.Handler { - r := mux.NewRouter() - e := MakeServerEndpoints(s) - options := []httptransport.ServerOption{ - httptransport.ServerErrorLogger(logger), - httptransport.ServerErrorEncoder(encodeError), - } - - // POST /profiles/ adds another profile - // GET /profiles/:id retrieves the given profile by id - // PUT /profiles/:id post updated profile information about the profile - // PATCH /profiles/:id partial updated profile information - // DELETE /profiles/:id remove the given profile - // GET /profiles/:id/addresses/ retrieve addresses associated with the profile - // GET /profiles/:id/addresses/:addressID retrieve a particular profile address - // POST /profiles/:id/addresses/ add a new address - // DELETE /profiles/:id/addresses/:addressID remove an address - - r.Methods("POST").Path("/profiles/").Handler(httptransport.NewServer( - e.PostProfileEndpoint, - decodePostProfileRequest, - encodeResponse, - options..., - )) - r.Methods("GET").Path("/profiles/{id}").Handler(httptransport.NewServer( - e.GetProfileEndpoint, - decodeGetProfileRequest, - encodeResponse, - options..., - )) - r.Methods("PUT").Path("/profiles/{id}").Handler(httptransport.NewServer( - e.PutProfileEndpoint, - decodePutProfileRequest, - encodeResponse, - options..., - )) - r.Methods("PATCH").Path("/profiles/{id}").Handler(httptransport.NewServer( - e.PatchProfileEndpoint, - decodePatchProfileRequest, - encodeResponse, - options..., - )) - r.Methods("DELETE").Path("/profiles/{id}").Handler(httptransport.NewServer( - e.DeleteProfileEndpoint, - decodeDeleteProfileRequest, - encodeResponse, - options..., - )) - r.Methods("GET").Path("/profiles/{id}/addresses/").Handler(httptransport.NewServer( - e.GetAddressesEndpoint, - decodeGetAddressesRequest, - encodeResponse, - options..., - )) - r.Methods("GET").Path("/profiles/{id}/addresses/{addressID}").Handler(httptransport.NewServer( - e.GetAddressEndpoint, - decodeGetAddressRequest, - encodeResponse, - options..., - )) - r.Methods("POST").Path("/profiles/{id}/addresses/").Handler(httptransport.NewServer( - e.PostAddressEndpoint, - decodePostAddressRequest, - encodeResponse, - options..., - )) - r.Methods("DELETE").Path("/profiles/{id}/addresses/{addressID}").Handler(httptransport.NewServer( - e.DeleteAddressEndpoint, - decodeDeleteAddressRequest, - encodeResponse, - options..., - )) - return r -} - -func decodePostProfileRequest(_ context.Context, r *http.Request) (request interface{}, err error) { - var req postProfileRequest - if e := json.NewDecoder(r.Body).Decode(&req.Profile); e != nil { - return nil, e - } - return req, nil -} - -func decodeGetProfileRequest(_ context.Context, r *http.Request) (request interface{}, err error) { - vars := mux.Vars(r) - id, ok := vars["id"] - if !ok { - return nil, ErrBadRouting - } - return getProfileRequest{ID: id}, nil -} - -func decodePutProfileRequest(_ context.Context, r *http.Request) (request interface{}, err error) { - vars := mux.Vars(r) - id, ok := vars["id"] - if !ok { - return nil, ErrBadRouting - } - var profile Profile - if err := json.NewDecoder(r.Body).Decode(&profile); err != nil { - return nil, err - } - return putProfileRequest{ - ID: id, - Profile: profile, - }, nil -} - -func decodePatchProfileRequest(_ context.Context, r *http.Request) (request interface{}, err error) { - vars := mux.Vars(r) - id, ok := vars["id"] - if !ok { - return nil, ErrBadRouting - } - var profile Profile - if err := json.NewDecoder(r.Body).Decode(&profile); err != nil { - return nil, err - } - return patchProfileRequest{ - ID: id, - Profile: profile, - }, nil -} - -func decodeDeleteProfileRequest(_ context.Context, r *http.Request) (request interface{}, err error) { - vars := mux.Vars(r) - id, ok := vars["id"] - if !ok { - return nil, ErrBadRouting - } - return deleteProfileRequest{ID: id}, nil -} - -func decodeGetAddressesRequest(_ context.Context, r *http.Request) (request interface{}, err error) { - vars := mux.Vars(r) - id, ok := vars["id"] - if !ok { - return nil, ErrBadRouting - } - return getAddressesRequest{ProfileID: id}, nil -} - -func decodeGetAddressRequest(_ context.Context, r *http.Request) (request interface{}, err error) { - vars := mux.Vars(r) - id, ok := vars["id"] - if !ok { - return nil, ErrBadRouting - } - addressID, ok := vars["addressID"] - if !ok { - return nil, ErrBadRouting - } - return getAddressRequest{ - ProfileID: id, - AddressID: addressID, - }, nil -} - -func decodePostAddressRequest(_ context.Context, r *http.Request) (request interface{}, err error) { - vars := mux.Vars(r) - id, ok := vars["id"] - if !ok { - return nil, ErrBadRouting - } - var address Address - if err := json.NewDecoder(r.Body).Decode(&address); err != nil { - return nil, err - } - return postAddressRequest{ - ProfileID: id, - Address: address, - }, nil -} - -func decodeDeleteAddressRequest(_ context.Context, r *http.Request) (request interface{}, err error) { - vars := mux.Vars(r) - id, ok := vars["id"] - if !ok { - return nil, ErrBadRouting - } - addressID, ok := vars["addressID"] - if !ok { - return nil, ErrBadRouting - } - return deleteAddressRequest{ - ProfileID: id, - AddressID: addressID, - }, nil -} - -func encodePostProfileRequest(ctx context.Context, req *http.Request, request interface{}) error { - // r.Methods("POST").Path("/profiles/") - req.Method, req.URL.Path = "POST", "/profiles/" - return encodeRequest(ctx, req, request) -} - -func encodeGetProfileRequest(ctx context.Context, req *http.Request, request interface{}) error { - // r.Methods("GET").Path("/profiles/{id}") - r := request.(getProfileRequest) - profileID := url.QueryEscape(r.ID) - req.Method, req.URL.Path = "GET", "/profiles/"+profileID - return encodeRequest(ctx, req, request) -} - -func encodePutProfileRequest(ctx context.Context, req *http.Request, request interface{}) error { - // r.Methods("PUT").Path("/profiles/{id}") - r := request.(putProfileRequest) - profileID := url.QueryEscape(r.ID) - req.Method, req.URL.Path = "PUT", "/profiles/"+profileID - return encodeRequest(ctx, req, request) -} - -func encodePatchProfileRequest(ctx context.Context, req *http.Request, request interface{}) error { - // r.Methods("PATCH").Path("/profiles/{id}") - r := request.(patchProfileRequest) - profileID := url.QueryEscape(r.ID) - req.Method, req.URL.Path = "PATCH", "/profiles/"+profileID - return encodeRequest(ctx, req, request) -} - -func encodeDeleteProfileRequest(ctx context.Context, req *http.Request, request interface{}) error { - // r.Methods("DELETE").Path("/profiles/{id}") - r := request.(deleteProfileRequest) - profileID := url.QueryEscape(r.ID) - req.Method, req.URL.Path = "DELETE", "/profiles/"+profileID - return encodeRequest(ctx, req, request) -} - -func encodeGetAddressesRequest(ctx context.Context, req *http.Request, request interface{}) error { - // r.Methods("GET").Path("/profiles/{id}/addresses/") - r := request.(getAddressesRequest) - profileID := url.QueryEscape(r.ProfileID) - req.Method, req.URL.Path = "GET", "/profiles/"+profileID+"/addresses/" - return encodeRequest(ctx, req, request) -} - -func encodeGetAddressRequest(ctx context.Context, req *http.Request, request interface{}) error { - // r.Methods("GET").Path("/profiles/{id}/addresses/{addressID}") - r := request.(getAddressRequest) - profileID := url.QueryEscape(r.ProfileID) - addressID := url.QueryEscape(r.AddressID) - req.Method, req.URL.Path = "GET", "/profiles/"+profileID+"/addresses/"+addressID - return encodeRequest(ctx, req, request) -} - -func encodePostAddressRequest(ctx context.Context, req *http.Request, request interface{}) error { - // r.Methods("POST").Path("/profiles/{id}/addresses/") - r := request.(postAddressRequest) - profileID := url.QueryEscape(r.ProfileID) - req.Method, req.URL.Path = "POST", "/profiles/"+profileID+"/addresses/" - return encodeRequest(ctx, req, request) -} - -func encodeDeleteAddressRequest(ctx context.Context, req *http.Request, request interface{}) error { - // r.Methods("DELETE").Path("/profiles/{id}/addresses/{addressID}") - r := request.(deleteAddressRequest) - profileID := url.QueryEscape(r.ProfileID) - addressID := url.QueryEscape(r.AddressID) - req.Method, req.URL.Path = "DELETE", "/profiles/"+profileID+"/addresses/"+addressID - return encodeRequest(ctx, req, request) -} - -func decodePostProfileResponse(_ context.Context, resp *http.Response) (interface{}, error) { - var response postProfileResponse - err := json.NewDecoder(resp.Body).Decode(&response) - return response, err -} - -func decodeGetProfileResponse(_ context.Context, resp *http.Response) (interface{}, error) { - var response getProfileResponse - err := json.NewDecoder(resp.Body).Decode(&response) - return response, err -} - -func decodePutProfileResponse(_ context.Context, resp *http.Response) (interface{}, error) { - var response putProfileResponse - err := json.NewDecoder(resp.Body).Decode(&response) - return response, err -} - -func decodePatchProfileResponse(_ context.Context, resp *http.Response) (interface{}, error) { - var response patchProfileResponse - err := json.NewDecoder(resp.Body).Decode(&response) - return response, err -} - -func decodeDeleteProfileResponse(_ context.Context, resp *http.Response) (interface{}, error) { - var response deleteProfileResponse - err := json.NewDecoder(resp.Body).Decode(&response) - return response, err -} - -func decodeGetAddressesResponse(_ context.Context, resp *http.Response) (interface{}, error) { - var response getAddressesResponse - err := json.NewDecoder(resp.Body).Decode(&response) - return response, err -} - -func decodeGetAddressResponse(_ context.Context, resp *http.Response) (interface{}, error) { - var response getAddressResponse - err := json.NewDecoder(resp.Body).Decode(&response) - return response, err -} - -func decodePostAddressResponse(_ context.Context, resp *http.Response) (interface{}, error) { - var response postAddressResponse - err := json.NewDecoder(resp.Body).Decode(&response) - return response, err -} - -func decodeDeleteAddressResponse(_ context.Context, resp *http.Response) (interface{}, error) { - var response deleteAddressResponse - err := json.NewDecoder(resp.Body).Decode(&response) - return response, err -} - -// errorer is implemented by all concrete response types that may contain -// errors. It allows us to change the HTTP response code without needing to -// trigger an endpoint (transport-level) error. For more information, read the -// big comment in endpoints.go. -type errorer interface { - error() error -} - -// encodeResponse is the common method to encode all response types to the -// client. I chose to do it this way because, since we're using JSON, there's no -// reason to provide anything more specific. It's certainly possible to -// specialize on a per-response (per-method) basis. -func encodeResponse(ctx context.Context, w http.ResponseWriter, response interface{}) error { - if e, ok := response.(errorer); ok && e.error() != nil { - // Not a Go kit transport error, but a business-logic error. - // Provide those as HTTP errors. - encodeError(ctx, e.error(), w) - return nil - } - w.Header().Set("Content-Type", "application/json; charset=utf-8") - return json.NewEncoder(w).Encode(response) -} - -// encodeRequest likewise JSON-encodes the request to the HTTP request body. -// Don't use it directly as a transport/http.Client EncodeRequestFunc: -// profilesvc endpoints require mutating the HTTP method and request path. -func encodeRequest(_ context.Context, req *http.Request, request interface{}) error { - var buf bytes.Buffer - err := json.NewEncoder(&buf).Encode(request) - if err != nil { - return err - } - req.Body = ioutil.NopCloser(&buf) - return nil -} - -func encodeError(_ context.Context, err error, w http.ResponseWriter) { - if err == nil { - panic("encodeError with nil error") - } - w.Header().Set("Content-Type", "application/json; charset=utf-8") - w.WriteHeader(codeFrom(err)) - json.NewEncoder(w).Encode(map[string]interface{}{ - "error": err.Error(), - }) -} - -func codeFrom(err error) int { - switch err { - case ErrNotFound: - return http.StatusNotFound - case ErrAlreadyExists, ErrInconsistentIDs: - return http.StatusBadRequest - default: - return http.StatusInternalServerError - } -} diff --git a/vendor/github.com/go-kit/kit/examples/shipping/README.md b/vendor/github.com/go-kit/kit/examples/shipping/README.md deleted file mode 100644 index 1a9a14ee..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# shipping - -This example demonstrates a more real-world application consisting of multiple services. - -## Description - -The implementation is based on the container shipping domain from the [Domain Driven Design](http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215) book by Eric Evans, which was [originally](http://dddsample.sourceforge.net/) implemented in Java but has since been ported to Go. This example is a somewhat stripped down version to demonstrate the use of Go kit. The [original Go application](https://github.com/marcusolsson/goddd) is maintained separately and accompanied by an [AngularJS application](https://github.com/marcusolsson/dddelivery-angularjs) as well as a mock [routing service](https://github.com/marcusolsson/pathfinder). - -### Organization - -The application consists of three application services, `booking`, `handling` and `tracking`. Each of these is an individual Go kit service as seen in previous examples. - -- __booking__ - used by the shipping company to book and route cargos. -- __handling__ - used by our staff around the world to register whenever the cargo has been received, loaded etc. -- __tracking__ - used by the customer to track the cargo along the route - -There are also a few pure domain packages that contain some intricate business-logic. They provide domain objects and services that are used by each application service to provide interesting use-cases for the user. - -`inmem` contains in-memory implementations for the repositories found in the domain packages. - -The `routing` package provides a _domain service_ that is used to query an external application for possible routes. - -## Contributing - -As with all Go kit examples you are more than welcome to contribute. If you do however, please consider contributing back to the original project as well. diff --git a/vendor/github.com/go-kit/kit/examples/shipping/booking/endpoint.go b/vendor/github.com/go-kit/kit/examples/shipping/booking/endpoint.go deleted file mode 100644 index abe83f75..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/booking/endpoint.go +++ /dev/null @@ -1,139 +0,0 @@ -package booking - -import ( - "context" - "time" - - "github.com/go-kit/kit/endpoint" - - "github.com/go-kit/kit/examples/shipping/cargo" - "github.com/go-kit/kit/examples/shipping/location" -) - -type bookCargoRequest struct { - Origin location.UNLocode - Destination location.UNLocode - ArrivalDeadline time.Time -} - -type bookCargoResponse struct { - ID cargo.TrackingID `json:"tracking_id,omitempty"` - Err error `json:"error,omitempty"` -} - -func (r bookCargoResponse) error() error { return r.Err } - -func makeBookCargoEndpoint(s Service) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - req := request.(bookCargoRequest) - id, err := s.BookNewCargo(req.Origin, req.Destination, req.ArrivalDeadline) - return bookCargoResponse{ID: id, Err: err}, nil - } -} - -type loadCargoRequest struct { - ID cargo.TrackingID -} - -type loadCargoResponse struct { - Cargo *Cargo `json:"cargo,omitempty"` - Err error `json:"error,omitempty"` -} - -func (r loadCargoResponse) error() error { return r.Err } - -func makeLoadCargoEndpoint(s Service) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - req := request.(loadCargoRequest) - c, err := s.LoadCargo(req.ID) - return loadCargoResponse{Cargo: &c, Err: err}, nil - } -} - -type requestRoutesRequest struct { - ID cargo.TrackingID -} - -type requestRoutesResponse struct { - Routes []cargo.Itinerary `json:"routes,omitempty"` - Err error `json:"error,omitempty"` -} - -func (r requestRoutesResponse) error() error { return r.Err } - -func makeRequestRoutesEndpoint(s Service) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - req := request.(requestRoutesRequest) - itin := s.RequestPossibleRoutesForCargo(req.ID) - return requestRoutesResponse{Routes: itin, Err: nil}, nil - } -} - -type assignToRouteRequest struct { - ID cargo.TrackingID - Itinerary cargo.Itinerary -} - -type assignToRouteResponse struct { - Err error `json:"error,omitempty"` -} - -func (r assignToRouteResponse) error() error { return r.Err } - -func makeAssignToRouteEndpoint(s Service) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - req := request.(assignToRouteRequest) - err := s.AssignCargoToRoute(req.ID, req.Itinerary) - return assignToRouteResponse{Err: err}, nil - } -} - -type changeDestinationRequest struct { - ID cargo.TrackingID - Destination location.UNLocode -} - -type changeDestinationResponse struct { - Err error `json:"error,omitempty"` -} - -func (r changeDestinationResponse) error() error { return r.Err } - -func makeChangeDestinationEndpoint(s Service) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - req := request.(changeDestinationRequest) - err := s.ChangeDestination(req.ID, req.Destination) - return changeDestinationResponse{Err: err}, nil - } -} - -type listCargosRequest struct{} - -type listCargosResponse struct { - Cargos []Cargo `json:"cargos,omitempty"` - Err error `json:"error,omitempty"` -} - -func (r listCargosResponse) error() error { return r.Err } - -func makeListCargosEndpoint(s Service) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - _ = request.(listCargosRequest) - return listCargosResponse{Cargos: s.Cargos(), Err: nil}, nil - } -} - -type listLocationsRequest struct { -} - -type listLocationsResponse struct { - Locations []Location `json:"locations,omitempty"` - Err error `json:"error,omitempty"` -} - -func makeListLocationsEndpoint(s Service) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - _ = request.(listLocationsRequest) - return listLocationsResponse{Locations: s.Locations(), Err: nil}, nil - } -} diff --git a/vendor/github.com/go-kit/kit/examples/shipping/booking/instrumenting.go b/vendor/github.com/go-kit/kit/examples/shipping/booking/instrumenting.go deleted file mode 100644 index b9b03b91..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/booking/instrumenting.go +++ /dev/null @@ -1,88 +0,0 @@ -package booking - -import ( - "time" - - "github.com/go-kit/kit/metrics" - - "github.com/go-kit/kit/examples/shipping/cargo" - "github.com/go-kit/kit/examples/shipping/location" -) - -type instrumentingService struct { - requestCount metrics.Counter - requestLatency metrics.Histogram - Service -} - -// NewInstrumentingService returns an instance of an instrumenting Service. -func NewInstrumentingService(counter metrics.Counter, latency metrics.Histogram, s Service) Service { - return &instrumentingService{ - requestCount: counter, - requestLatency: latency, - Service: s, - } -} - -func (s *instrumentingService) BookNewCargo(origin, destination location.UNLocode, deadline time.Time) (cargo.TrackingID, error) { - defer func(begin time.Time) { - s.requestCount.With("method", "book").Add(1) - s.requestLatency.With("method", "book").Observe(time.Since(begin).Seconds()) - }(time.Now()) - - return s.Service.BookNewCargo(origin, destination, deadline) -} - -func (s *instrumentingService) LoadCargo(id cargo.TrackingID) (c Cargo, err error) { - defer func(begin time.Time) { - s.requestCount.With("method", "load").Add(1) - s.requestLatency.With("method", "load").Observe(time.Since(begin).Seconds()) - }(time.Now()) - - return s.Service.LoadCargo(id) -} - -func (s *instrumentingService) RequestPossibleRoutesForCargo(id cargo.TrackingID) []cargo.Itinerary { - defer func(begin time.Time) { - s.requestCount.With("method", "request_routes").Add(1) - s.requestLatency.With("method", "request_routes").Observe(time.Since(begin).Seconds()) - }(time.Now()) - - return s.Service.RequestPossibleRoutesForCargo(id) -} - -func (s *instrumentingService) AssignCargoToRoute(id cargo.TrackingID, itinerary cargo.Itinerary) (err error) { - defer func(begin time.Time) { - s.requestCount.With("method", "assign_to_route").Add(1) - s.requestLatency.With("method", "assign_to_route").Observe(time.Since(begin).Seconds()) - }(time.Now()) - - return s.Service.AssignCargoToRoute(id, itinerary) -} - -func (s *instrumentingService) ChangeDestination(id cargo.TrackingID, l location.UNLocode) (err error) { - defer func(begin time.Time) { - s.requestCount.With("method", "change_destination").Add(1) - s.requestLatency.With("method", "change_destination").Observe(time.Since(begin).Seconds()) - }(time.Now()) - - return s.Service.ChangeDestination(id, l) -} - -func (s *instrumentingService) Cargos() []Cargo { - defer func(begin time.Time) { - s.requestCount.With("method", "list_cargos").Add(1) - s.requestLatency.With("method", "list_cargos").Observe(time.Since(begin).Seconds()) - }(time.Now()) - - return s.Service.Cargos() -} - -func (s *instrumentingService) Locations() []Location { - defer func(begin time.Time) { - s.requestCount.With("method", "list_locations").Add(1) - s.requestLatency.With("method", "list_locations").Observe(time.Since(begin).Seconds()) - }(time.Now()) - - return s.Service.Locations() -} diff --git a/vendor/github.com/go-kit/kit/examples/shipping/booking/logging.go b/vendor/github.com/go-kit/kit/examples/shipping/booking/logging.go deleted file mode 100644 index 931d4307..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/booking/logging.go +++ /dev/null @@ -1,102 +0,0 @@ -package booking - -import ( - "time" - - "github.com/go-kit/kit/log" - - "github.com/go-kit/kit/examples/shipping/cargo" - "github.com/go-kit/kit/examples/shipping/location" -) - -type loggingService struct { - logger log.Logger - Service -} - -// NewLoggingService returns a new instance of a logging Service. -func NewLoggingService(logger log.Logger, s Service) Service { - return &loggingService{logger, s} -} - -func (s *loggingService) BookNewCargo(origin location.UNLocode, destination location.UNLocode, deadline time.Time) (id cargo.TrackingID, err error) { - defer func(begin time.Time) { - s.logger.Log( - "method", "book", - "origin", origin, - "destination", destination, - "arrival_deadline", deadline, - "took", time.Since(begin), - "err", err, - ) - }(time.Now()) - return s.Service.BookNewCargo(origin, destination, deadline) -} - -func (s *loggingService) LoadCargo(id cargo.TrackingID) (c Cargo, err error) { - defer func(begin time.Time) { - s.logger.Log( - "method", "load", - "tracking_id", id, - "took", time.Since(begin), - "err", err, - ) - }(time.Now()) - return s.Service.LoadCargo(id) -} - -func (s *loggingService) RequestPossibleRoutesForCargo(id cargo.TrackingID) []cargo.Itinerary { - defer func(begin time.Time) { - s.logger.Log( - "method", "request_routes", - "tracking_id", id, - "took", time.Since(begin), - ) - }(time.Now()) - return s.Service.RequestPossibleRoutesForCargo(id) -} - -func (s *loggingService) AssignCargoToRoute(id cargo.TrackingID, itinerary cargo.Itinerary) (err error) { - defer func(begin time.Time) { - s.logger.Log( - "method", "assign_to_route", - "tracking_id", id, - "took", time.Since(begin), - "err", err, - ) - }(time.Now()) - return s.Service.AssignCargoToRoute(id, itinerary) -} - -func (s *loggingService) ChangeDestination(id cargo.TrackingID, l location.UNLocode) (err error) { - defer func(begin time.Time) { - s.logger.Log( - "method", "change_destination", - "tracking_id", id, - "destination", l, - "took", time.Since(begin), - "err", err, - ) - }(time.Now()) - return s.Service.ChangeDestination(id, l) -} - -func (s *loggingService) Cargos() []Cargo { - defer func(begin time.Time) { - s.logger.Log( - "method", "list_cargos", - "took", time.Since(begin), - ) - }(time.Now()) - return s.Service.Cargos() -} - -func (s *loggingService) Locations() []Location { - defer func(begin time.Time) { - s.logger.Log( - "method", "list_locations", - "took", time.Since(begin), - ) - }(time.Now()) - return s.Service.Locations() -} diff --git a/vendor/github.com/go-kit/kit/examples/shipping/booking/service.go b/vendor/github.com/go-kit/kit/examples/shipping/booking/service.go deleted file mode 100644 index 8689a5a5..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/booking/service.go +++ /dev/null @@ -1,197 +0,0 @@ -// Package booking provides the use-case of booking a cargo. Used by views -// facing an administrator. -package booking - -import ( - "errors" - "time" - - "github.com/go-kit/kit/examples/shipping/cargo" - "github.com/go-kit/kit/examples/shipping/location" - "github.com/go-kit/kit/examples/shipping/routing" -) - -// ErrInvalidArgument is returned when one or more arguments are invalid. -var ErrInvalidArgument = errors.New("invalid argument") - -// Service is the interface that provides booking methods. -type Service interface { - // BookNewCargo registers a new cargo in the tracking system, not yet - // routed. - BookNewCargo(origin location.UNLocode, destination location.UNLocode, deadline time.Time) (cargo.TrackingID, error) - - // LoadCargo returns a read model of a cargo. - LoadCargo(id cargo.TrackingID) (Cargo, error) - - // RequestPossibleRoutesForCargo requests a list of itineraries describing - // possible routes for this cargo. - RequestPossibleRoutesForCargo(id cargo.TrackingID) []cargo.Itinerary - - // AssignCargoToRoute assigns a cargo to the route specified by the - // itinerary. - AssignCargoToRoute(id cargo.TrackingID, itinerary cargo.Itinerary) error - - // ChangeDestination changes the destination of a cargo. - ChangeDestination(id cargo.TrackingID, destination location.UNLocode) error - - // Cargos returns a list of all cargos that have been booked. - Cargos() []Cargo - - // Locations returns a list of registered locations. - Locations() []Location -} - -type service struct { - cargos cargo.Repository - locations location.Repository - handlingEvents cargo.HandlingEventRepository - routingService routing.Service -} - -func (s *service) AssignCargoToRoute(id cargo.TrackingID, itinerary cargo.Itinerary) error { - if id == "" || len(itinerary.Legs) == 0 { - return ErrInvalidArgument - } - - c, err := s.cargos.Find(id) - if err != nil { - return err - } - - c.AssignToRoute(itinerary) - - return s.cargos.Store(c) -} - -func (s *service) BookNewCargo(origin, destination location.UNLocode, deadline time.Time) (cargo.TrackingID, error) { - if origin == "" || destination == "" || deadline.IsZero() { - return "", ErrInvalidArgument - } - - id := cargo.NextTrackingID() - rs := cargo.RouteSpecification{ - Origin: origin, - Destination: destination, - ArrivalDeadline: deadline, - } - - c := cargo.New(id, rs) - - if err := s.cargos.Store(c); err != nil { - return "", err - } - - return c.TrackingID, nil -} - -func (s *service) LoadCargo(id cargo.TrackingID) (Cargo, error) { - if id == "" { - return Cargo{}, ErrInvalidArgument - } - - c, err := s.cargos.Find(id) - if err != nil { - return Cargo{}, err - } - - return assemble(c, s.handlingEvents), nil -} - -func (s *service) ChangeDestination(id cargo.TrackingID, destination location.UNLocode) error { - if id == "" || destination == "" { - return ErrInvalidArgument - } - - c, err := s.cargos.Find(id) - if err != nil { - return err - } - - l, err := s.locations.Find(destination) - if err != nil { - return err - } - - c.SpecifyNewRoute(cargo.RouteSpecification{ - Origin: c.Origin, - Destination: l.UNLocode, - ArrivalDeadline: c.RouteSpecification.ArrivalDeadline, - }) - - if err := s.cargos.Store(c); err != nil { - return err - } - - return nil -} - -func (s *service) RequestPossibleRoutesForCargo(id cargo.TrackingID) []cargo.Itinerary { - if id == "" { - return nil - } - - c, err := s.cargos.Find(id) - if err != nil { - return []cargo.Itinerary{} - } - - return s.routingService.FetchRoutesForSpecification(c.RouteSpecification) -} - -func (s *service) Cargos() []Cargo { - var result []Cargo - for _, c := range s.cargos.FindAll() { - result = append(result, assemble(c, s.handlingEvents)) - } - return result -} - -func (s *service) Locations() []Location { - var result []Location - for _, v := range s.locations.FindAll() { - result = append(result, Location{ - UNLocode: string(v.UNLocode), - Name: v.Name, - }) - } - return result -} - -// NewService creates a booking service with necessary dependencies. -func NewService(cargos cargo.Repository, locations location.Repository, events cargo.HandlingEventRepository, rs routing.Service) Service { - return &service{ - cargos: cargos, - locations: locations, - handlingEvents: events, - routingService: rs, - } -} - -// Location is a read model for booking views. -type Location struct { - UNLocode string `json:"locode"` - Name string `json:"name"` -} - -// Cargo is a read model for booking views. -type Cargo struct { - ArrivalDeadline time.Time `json:"arrival_deadline"` - Destination string `json:"destination"` - Legs []cargo.Leg `json:"legs,omitempty"` - Misrouted bool `json:"misrouted"` - Origin string `json:"origin"` - Routed bool `json:"routed"` - TrackingID string `json:"tracking_id"` -} - -func assemble(c *cargo.Cargo, events cargo.HandlingEventRepository) Cargo { - return Cargo{ - TrackingID: string(c.TrackingID), - Origin: string(c.Origin), - Destination: string(c.RouteSpecification.Destination), - Misrouted: c.Delivery.RoutingStatus == cargo.Misrouted, - Routed: !c.Itinerary.IsEmpty(), - ArrivalDeadline: c.RouteSpecification.ArrivalDeadline, - Legs: c.Itinerary.Legs, - } -} diff --git a/vendor/github.com/go-kit/kit/examples/shipping/booking/transport.go b/vendor/github.com/go-kit/kit/examples/shipping/booking/transport.go deleted file mode 100644 index 8cf11a26..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/booking/transport.go +++ /dev/null @@ -1,194 +0,0 @@ -package booking - -import ( - "context" - "encoding/json" - "errors" - "net/http" - "time" - - "github.com/gorilla/mux" - - kitlog "github.com/go-kit/kit/log" - kithttp "github.com/go-kit/kit/transport/http" - - "github.com/go-kit/kit/examples/shipping/cargo" - "github.com/go-kit/kit/examples/shipping/location" -) - -// MakeHandler returns a handler for the booking service. -func MakeHandler(bs Service, logger kitlog.Logger) http.Handler { - opts := []kithttp.ServerOption{ - kithttp.ServerErrorLogger(logger), - kithttp.ServerErrorEncoder(encodeError), - } - - bookCargoHandler := kithttp.NewServer( - makeBookCargoEndpoint(bs), - decodeBookCargoRequest, - encodeResponse, - opts..., - ) - loadCargoHandler := kithttp.NewServer( - makeLoadCargoEndpoint(bs), - decodeLoadCargoRequest, - encodeResponse, - opts..., - ) - requestRoutesHandler := kithttp.NewServer( - makeRequestRoutesEndpoint(bs), - decodeRequestRoutesRequest, - encodeResponse, - opts..., - ) - assignToRouteHandler := kithttp.NewServer( - makeAssignToRouteEndpoint(bs), - decodeAssignToRouteRequest, - encodeResponse, - opts..., - ) - changeDestinationHandler := kithttp.NewServer( - makeChangeDestinationEndpoint(bs), - decodeChangeDestinationRequest, - encodeResponse, - opts..., - ) - listCargosHandler := kithttp.NewServer( - makeListCargosEndpoint(bs), - decodeListCargosRequest, - encodeResponse, - opts..., - ) - listLocationsHandler := kithttp.NewServer( - makeListLocationsEndpoint(bs), - decodeListLocationsRequest, - encodeResponse, - opts..., - ) - - r := mux.NewRouter() - - r.Handle("/booking/v1/cargos", bookCargoHandler).Methods("POST") - r.Handle("/booking/v1/cargos", listCargosHandler).Methods("GET") - r.Handle("/booking/v1/cargos/{id}", loadCargoHandler).Methods("GET") - r.Handle("/booking/v1/cargos/{id}/request_routes", requestRoutesHandler).Methods("GET") - r.Handle("/booking/v1/cargos/{id}/assign_to_route", assignToRouteHandler).Methods("POST") - r.Handle("/booking/v1/cargos/{id}/change_destination", changeDestinationHandler).Methods("POST") - r.Handle("/booking/v1/locations", listLocationsHandler).Methods("GET") - - return r -} - -var errBadRoute = errors.New("bad route") - -func decodeBookCargoRequest(_ context.Context, r *http.Request) (interface{}, error) { - var body struct { - Origin string `json:"origin"` - Destination string `json:"destination"` - ArrivalDeadline time.Time `json:"arrival_deadline"` - } - - if err := json.NewDecoder(r.Body).Decode(&body); err != nil { - return nil, err - } - - return bookCargoRequest{ - Origin: location.UNLocode(body.Origin), - Destination: location.UNLocode(body.Destination), - ArrivalDeadline: body.ArrivalDeadline, - }, nil -} - -func decodeLoadCargoRequest(_ context.Context, r *http.Request) (interface{}, error) { - vars := mux.Vars(r) - id, ok := vars["id"] - if !ok { - return nil, errBadRoute - } - return loadCargoRequest{ID: cargo.TrackingID(id)}, nil -} - -func decodeRequestRoutesRequest(_ context.Context, r *http.Request) (interface{}, error) { - vars := mux.Vars(r) - id, ok := vars["id"] - if !ok { - return nil, errBadRoute - } - return requestRoutesRequest{ID: cargo.TrackingID(id)}, nil -} - -func decodeAssignToRouteRequest(_ context.Context, r *http.Request) (interface{}, error) { - vars := mux.Vars(r) - id, ok := vars["id"] - if !ok { - return nil, errBadRoute - } - - var itinerary cargo.Itinerary - if err := json.NewDecoder(r.Body).Decode(&itinerary); err != nil { - return nil, err - } - - return assignToRouteRequest{ - ID: cargo.TrackingID(id), - Itinerary: itinerary, - }, nil -} - -func decodeChangeDestinationRequest(_ context.Context, r *http.Request) (interface{}, error) { - vars := mux.Vars(r) - id, ok := vars["id"] - if !ok { - return nil, errBadRoute - } - - var body struct { - Destination string `json:"destination"` - } - - if err := json.NewDecoder(r.Body).Decode(&body); err != nil { - return nil, err - } - - return changeDestinationRequest{ - ID: cargo.TrackingID(id), - Destination: location.UNLocode(body.Destination), - }, nil -} - -func decodeListCargosRequest(_ context.Context, r *http.Request) (interface{}, error) { - return listCargosRequest{}, nil -} - -func decodeListLocationsRequest(_ context.Context, r *http.Request) (interface{}, error) { - return listLocationsRequest{}, nil -} - -func encodeResponse(ctx context.Context, w http.ResponseWriter, response interface{}) error { - if e, ok := response.(errorer); ok && e.error() != nil { - encodeError(ctx, e.error(), w) - return nil - } - w.Header().Set("Content-Type", "application/json; charset=utf-8") - return json.NewEncoder(w).Encode(response) -} - -type errorer interface { - error() error -} - -// encode errors from business-logic -func encodeError(_ context.Context, err error, w http.ResponseWriter) { - w.Header().Set("Content-Type", "application/json; charset=utf-8") - switch err { - case cargo.ErrUnknown: - w.WriteHeader(http.StatusNotFound) - case ErrInvalidArgument: - w.WriteHeader(http.StatusBadRequest) - default: - w.WriteHeader(http.StatusInternalServerError) - } - json.NewEncoder(w).Encode(map[string]interface{}{ - "error": err.Error(), - }) -} diff --git a/vendor/github.com/go-kit/kit/examples/shipping/cargo/cargo.go b/vendor/github.com/go-kit/kit/examples/shipping/cargo/cargo.go deleted file mode 100644 index a9440f51..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/cargo/cargo.go +++ /dev/null @@ -1,137 +0,0 @@ -// Package cargo contains the heart of the domain model. -package cargo - -import ( - "errors" - "strings" - "time" - - "github.com/pborman/uuid" - - "github.com/go-kit/kit/examples/shipping/location" -) - -// TrackingID uniquely identifies a particular cargo. -type TrackingID string - -// Cargo is the central class in the domain model. -type Cargo struct { - TrackingID TrackingID - Origin location.UNLocode - RouteSpecification RouteSpecification - Itinerary Itinerary - Delivery Delivery -} - -// SpecifyNewRoute specifies a new route for this cargo. -func (c *Cargo) SpecifyNewRoute(rs RouteSpecification) { - c.RouteSpecification = rs - c.Delivery = c.Delivery.UpdateOnRouting(c.RouteSpecification, c.Itinerary) -} - -// AssignToRoute attaches a new itinerary to this cargo. -func (c *Cargo) AssignToRoute(itinerary Itinerary) { - c.Itinerary = itinerary - c.Delivery = c.Delivery.UpdateOnRouting(c.RouteSpecification, c.Itinerary) -} - -// DeriveDeliveryProgress updates all aspects of the cargo aggregate status -// based on the current route specification, itinerary and handling of the cargo. -func (c *Cargo) DeriveDeliveryProgress(history HandlingHistory) { - c.Delivery = DeriveDeliveryFrom(c.RouteSpecification, c.Itinerary, history) -} - -// New creates a new, unrouted cargo. -func New(id TrackingID, rs RouteSpecification) *Cargo { - itinerary := Itinerary{} - history := HandlingHistory{make([]HandlingEvent, 0)} - - return &Cargo{ - TrackingID: id, - Origin: rs.Origin, - RouteSpecification: rs, - Delivery: DeriveDeliveryFrom(rs, itinerary, history), - } -} - -// Repository provides access a cargo store. -type Repository interface { - Store(cargo *Cargo) error - Find(id TrackingID) (*Cargo, error) - FindAll() []*Cargo -} - -// ErrUnknown is used when a cargo could not be found. -var ErrUnknown = errors.New("unknown cargo") - -// NextTrackingID generates a new tracking ID. -// TODO: Move to infrastructure(?) -func NextTrackingID() TrackingID { - return TrackingID(strings.Split(strings.ToUpper(uuid.New()), "-")[0]) -} - -// RouteSpecification Contains information about a route: its origin, -// destination and arrival deadline. -type RouteSpecification struct { - Origin location.UNLocode - Destination location.UNLocode - ArrivalDeadline time.Time -} - -// IsSatisfiedBy checks whether provided itinerary satisfies this -// specification. -func (s RouteSpecification) IsSatisfiedBy(itinerary Itinerary) bool { - return itinerary.Legs != nil && - s.Origin == itinerary.InitialDepartureLocation() && - s.Destination == itinerary.FinalArrivalLocation() -} - -// RoutingStatus describes status of cargo routing. -type RoutingStatus int - -// Valid routing statuses. -const ( - NotRouted RoutingStatus = iota - Misrouted - Routed -) - -func (s RoutingStatus) String() string { - switch s { - case NotRouted: - return "Not routed" - case Misrouted: - return "Misrouted" - case Routed: - return "Routed" - } - return "" -} - -// TransportStatus describes status of cargo transportation. -type TransportStatus int - -// Valid transport statuses. -const ( - NotReceived TransportStatus = iota - InPort - OnboardCarrier - Claimed - Unknown -) - -func (s TransportStatus) String() string { - switch s { - case NotReceived: - return "Not received" - case InPort: - return "In port" - case OnboardCarrier: - return "Onboard carrier" - case Claimed: - return "Claimed" - case Unknown: - return "Unknown" - } - return "" -} diff --git a/vendor/github.com/go-kit/kit/examples/shipping/cargo/delivery.go b/vendor/github.com/go-kit/kit/examples/shipping/cargo/delivery.go deleted file mode 100644 index 34f079dc..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/cargo/delivery.go +++ /dev/null @@ -1,174 +0,0 @@ -package cargo - -import ( - "time" - - "github.com/go-kit/kit/examples/shipping/location" - "github.com/go-kit/kit/examples/shipping/voyage" -) - -// Delivery is the actual transportation of the cargo, as opposed to the -// customer requirement (RouteSpecification) and the plan (Itinerary). -type Delivery struct { - Itinerary Itinerary - RouteSpecification RouteSpecification - RoutingStatus RoutingStatus - TransportStatus TransportStatus - NextExpectedActivity HandlingActivity - LastEvent HandlingEvent - LastKnownLocation location.UNLocode - CurrentVoyage voyage.Number - ETA time.Time - IsMisdirected bool - IsUnloadedAtDestination bool -} - -// UpdateOnRouting creates a new delivery snapshot to reflect changes in -// routing, i.e. when the route specification or the itinerary has changed but -// no additional handling of the cargo has been performed. -func (d Delivery) UpdateOnRouting(rs RouteSpecification, itinerary Itinerary) Delivery { - return newDelivery(d.LastEvent, itinerary, rs) -} - -// IsOnTrack checks if the delivery is on track. -func (d Delivery) IsOnTrack() bool { - return d.RoutingStatus == Routed && !d.IsMisdirected -} - -// DeriveDeliveryFrom creates a new delivery snapshot based on the complete -// handling history of a cargo, as well as its route specification and -// itinerary. -func DeriveDeliveryFrom(rs RouteSpecification, itinerary Itinerary, history HandlingHistory) Delivery { - lastEvent, _ := history.MostRecentlyCompletedEvent() - return newDelivery(lastEvent, itinerary, rs) -} - -// newDelivery creates a up-to-date delivery based on an handling event, -// itinerary and a route specification. -func newDelivery(lastEvent HandlingEvent, itinerary Itinerary, rs RouteSpecification) Delivery { - var ( - routingStatus = calculateRoutingStatus(itinerary, rs) - transportStatus = calculateTransportStatus(lastEvent) - lastKnownLocation = calculateLastKnownLocation(lastEvent) - isMisdirected = calculateMisdirectedStatus(lastEvent, itinerary) - isUnloadedAtDestination = calculateUnloadedAtDestination(lastEvent, rs) - currentVoyage = calculateCurrentVoyage(transportStatus, lastEvent) - ) - - d := Delivery{ - LastEvent: lastEvent, - Itinerary: itinerary, - RouteSpecification: rs, - RoutingStatus: routingStatus, - TransportStatus: transportStatus, - LastKnownLocation: lastKnownLocation, - IsMisdirected: isMisdirected, - IsUnloadedAtDestination: isUnloadedAtDestination, - CurrentVoyage: currentVoyage, - } - - d.NextExpectedActivity = calculateNextExpectedActivity(d) - d.ETA = calculateETA(d) - - return d -} - -// Below are internal functions used when creating a new delivery. - -func calculateRoutingStatus(itinerary Itinerary, rs RouteSpecification) RoutingStatus { - if itinerary.Legs == nil { - return NotRouted - } - - if rs.IsSatisfiedBy(itinerary) { - return Routed - } - - return Misrouted -} - -func calculateMisdirectedStatus(event HandlingEvent, itinerary Itinerary) bool { - if event.Activity.Type == NotHandled { - return false - } - - return !itinerary.IsExpected(event) -} - -func calculateUnloadedAtDestination(event HandlingEvent, rs RouteSpecification) bool { - if event.Activity.Type == NotHandled { - return false - } - - return event.Activity.Type == Unload && rs.Destination == event.Activity.Location -} - -func calculateTransportStatus(event HandlingEvent) TransportStatus { - switch event.Activity.Type { - case NotHandled: - return NotReceived - case Load: - return OnboardCarrier - case Unload: - return InPort - case Receive: - return InPort - case Customs: - return InPort - case Claim: - return Claimed - } - return Unknown -} - -func calculateLastKnownLocation(event HandlingEvent) location.UNLocode { - return event.Activity.Location -} - -func calculateNextExpectedActivity(d Delivery) HandlingActivity { - if !d.IsOnTrack() { - return HandlingActivity{} - } - - switch d.LastEvent.Activity.Type { - case NotHandled: - return HandlingActivity{Type: Receive, Location: d.RouteSpecification.Origin} - case Receive: - l := d.Itinerary.Legs[0] - return HandlingActivity{Type: Load, Location: l.LoadLocation, VoyageNumber: l.VoyageNumber} - case Load: - for _, l := range d.Itinerary.Legs { - if l.LoadLocation == d.LastEvent.Activity.Location { - return HandlingActivity{Type: Unload, Location: l.UnloadLocation, VoyageNumber: l.VoyageNumber} - } - } - case Unload: - for i, l := range d.Itinerary.Legs { - if l.UnloadLocation == d.LastEvent.Activity.Location { - if i < len(d.Itinerary.Legs)-1 { - return HandlingActivity{Type: Load, Location: d.Itinerary.Legs[i+1].LoadLocation, VoyageNumber: d.Itinerary.Legs[i+1].VoyageNumber} - } - - return HandlingActivity{Type: Claim, Location: l.UnloadLocation} - } - } - } - - return HandlingActivity{} -} - -func calculateCurrentVoyage(transportStatus TransportStatus, event HandlingEvent) voyage.Number { - if transportStatus == OnboardCarrier && event.Activity.Type != NotHandled { - return event.Activity.VoyageNumber - } - - return voyage.Number("") -} - -func calculateETA(d Delivery) time.Time { - if !d.IsOnTrack() { - return time.Time{} - } - - return d.Itinerary.FinalArrivalTime() -} diff --git a/vendor/github.com/go-kit/kit/examples/shipping/cargo/handling.go b/vendor/github.com/go-kit/kit/examples/shipping/cargo/handling.go deleted file mode 100644 index bec8509f..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/cargo/handling.go +++ /dev/null @@ -1,121 +0,0 @@ -package cargo - -// TODO: It would make sense to have this in its own package. Unfortunately, -// then there would be a circular dependency between the cargo and handling -// packages since cargo.Delivery would use handling.HandlingEvent and -// handling.HandlingEvent would use cargo.TrackingID. Also, -// HandlingEventFactory depends on the cargo repository. -// -// It would make sense not having the cargo package depend on handling. - -import ( - "errors" - "time" - - "github.com/go-kit/kit/examples/shipping/location" - "github.com/go-kit/kit/examples/shipping/voyage" -) - -// HandlingActivity represents how and where a cargo can be handled, and can -// be used to express predictions about what is expected to happen to a cargo -// in the future. -type HandlingActivity struct { - Type HandlingEventType - Location location.UNLocode - VoyageNumber voyage.Number -} - -// HandlingEvent is used to register the event when, for instance, a cargo is -// unloaded from a carrier at a some location at a given time. -type HandlingEvent struct { - TrackingID TrackingID - Activity HandlingActivity -} - -// HandlingEventType describes type of a handling event. -type HandlingEventType int - -// Valid handling event types. -const ( - NotHandled HandlingEventType = iota - Load - Unload - Receive - Claim - Customs -) - -func (t HandlingEventType) String() string { - switch t { - case NotHandled: - return "Not Handled" - case Load: - return "Load" - case Unload: - return "Unload" - case Receive: - return "Receive" - case Claim: - return "Claim" - case Customs: - return "Customs" - } - - return "" -} - -// HandlingHistory is the handling history of a cargo. -type HandlingHistory struct { - HandlingEvents []HandlingEvent -} - -// MostRecentlyCompletedEvent returns most recently completed handling event. -func (h HandlingHistory) MostRecentlyCompletedEvent() (HandlingEvent, error) { - if len(h.HandlingEvents) == 0 { - return HandlingEvent{}, errors.New("delivery history is empty") - } - - return h.HandlingEvents[len(h.HandlingEvents)-1], nil -} - -// HandlingEventRepository provides access a handling event store. -type HandlingEventRepository interface { - Store(e HandlingEvent) - QueryHandlingHistory(TrackingID) HandlingHistory -} - -// HandlingEventFactory creates handling events. -type HandlingEventFactory struct { - CargoRepository Repository - VoyageRepository voyage.Repository - LocationRepository location.Repository -} - -// CreateHandlingEvent creates a validated handling event. -func (f *HandlingEventFactory) CreateHandlingEvent(registered time.Time, completed time.Time, id TrackingID, - voyageNumber voyage.Number, unLocode location.UNLocode, eventType HandlingEventType) (HandlingEvent, error) { - - if _, err := f.CargoRepository.Find(id); err != nil { - return HandlingEvent{}, err - } - - if _, err := f.VoyageRepository.Find(voyageNumber); err != nil { - // TODO: This is pretty ugly, but when creating a Receive event, the voyage number is not known. - if len(voyageNumber) > 0 { - return HandlingEvent{}, err - } - } - - if _, err := f.LocationRepository.Find(unLocode); err != nil { - return HandlingEvent{}, err - } - - return HandlingEvent{ - TrackingID: id, - Activity: HandlingActivity{ - Type: eventType, - Location: unLocode, - VoyageNumber: voyageNumber, - }, - }, nil -} diff --git a/vendor/github.com/go-kit/kit/examples/shipping/cargo/itinerary.go b/vendor/github.com/go-kit/kit/examples/shipping/cargo/itinerary.go deleted file mode 100644 index 6b5088ea..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/cargo/itinerary.go +++ /dev/null @@ -1,91 +0,0 @@ -package cargo - -import ( - "time" - - "github.com/go-kit/kit/examples/shipping/location" - "github.com/go-kit/kit/examples/shipping/voyage" -) - -// Leg describes the transportation between two locations on a voyage. -type Leg struct { - VoyageNumber voyage.Number `json:"voyage_number"` - LoadLocation location.UNLocode `json:"from"` - UnloadLocation location.UNLocode `json:"to"` - LoadTime time.Time `json:"load_time"` - UnloadTime time.Time `json:"unload_time"` -} - -// NewLeg creates a new itinerary leg. -func NewLeg(voyageNumber voyage.Number, loadLocation, unloadLocation location.UNLocode, loadTime, unloadTime time.Time) Leg { - return Leg{ - VoyageNumber: voyageNumber, - LoadLocation: loadLocation, - UnloadLocation: unloadLocation, - LoadTime: loadTime, - UnloadTime: unloadTime, - } -} - -// Itinerary specifies steps required to transport a cargo from its origin to -// destination. -type Itinerary struct { - Legs []Leg `json:"legs"` -} - -// InitialDepartureLocation returns the start of the itinerary. -func (i Itinerary) InitialDepartureLocation() location.UNLocode { - if i.IsEmpty() { - return location.UNLocode("") - } - return i.Legs[0].LoadLocation -} - -// FinalArrivalLocation returns the end of the itinerary. -func (i Itinerary) FinalArrivalLocation() location.UNLocode { - if i.IsEmpty() { - return location.UNLocode("") - } - return i.Legs[len(i.Legs)-1].UnloadLocation -} - -// FinalArrivalTime returns the expected arrival time at final destination. -func (i Itinerary) FinalArrivalTime() time.Time { - return i.Legs[len(i.Legs)-1].UnloadTime -} - -// IsEmpty checks if the itinerary contains at least one leg. -func (i Itinerary) IsEmpty() bool { - return i.Legs == nil || len(i.Legs) == 0 -} - -// IsExpected checks if the given handling event is expected when executing -// this itinerary. -func (i Itinerary) IsExpected(event HandlingEvent) bool { - if i.IsEmpty() { - return true - } - - switch event.Activity.Type { - case Receive: - return i.InitialDepartureLocation() == event.Activity.Location - case Load: - for _, l := range i.Legs { - if l.LoadLocation == event.Activity.Location && l.VoyageNumber == event.Activity.VoyageNumber { - return true - } - } - return false - case Unload: - for _, l := range i.Legs { - if l.UnloadLocation == event.Activity.Location && l.VoyageNumber == event.Activity.VoyageNumber { - return true - } - } - return false - case Claim: - return i.FinalArrivalLocation() == event.Activity.Location - } - - return true -} diff --git a/vendor/github.com/go-kit/kit/examples/shipping/handling/endpoint.go b/vendor/github.com/go-kit/kit/examples/shipping/handling/endpoint.go deleted file mode 100644 index 555d0873..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/handling/endpoint.go +++ /dev/null @@ -1,34 +0,0 @@ -package handling - -import ( - "context" - "time" - - "github.com/go-kit/kit/endpoint" - - "github.com/go-kit/kit/examples/shipping/cargo" - "github.com/go-kit/kit/examples/shipping/location" - "github.com/go-kit/kit/examples/shipping/voyage" -) - -type registerIncidentRequest struct { - ID cargo.TrackingID - Location location.UNLocode - Voyage voyage.Number - EventType cargo.HandlingEventType - CompletionTime time.Time -} - -type registerIncidentResponse struct { - Err error `json:"error,omitempty"` -} - -func (r registerIncidentResponse) error() error { return r.Err } - -func makeRegisterIncidentEndpoint(hs Service) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - req := request.(registerIncidentRequest) - err := hs.RegisterHandlingEvent(req.CompletionTime, req.ID, req.Voyage, req.Location, req.EventType) - return registerIncidentResponse{Err: err}, nil - } -} diff --git a/vendor/github.com/go-kit/kit/examples/shipping/handling/instrumenting.go b/vendor/github.com/go-kit/kit/examples/shipping/handling/instrumenting.go deleted file mode 100644 index fecce04e..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/handling/instrumenting.go +++ /dev/null @@ -1,37 +0,0 @@ -package handling - -import ( - "time" - - "github.com/go-kit/kit/metrics" - - "github.com/go-kit/kit/examples/shipping/cargo" - "github.com/go-kit/kit/examples/shipping/location" - "github.com/go-kit/kit/examples/shipping/voyage" -) - -type instrumentingService struct { - requestCount metrics.Counter - requestLatency metrics.Histogram - Service -} - -// NewInstrumentingService returns an instance of an instrumenting Service. -func NewInstrumentingService(counter metrics.Counter, latency metrics.Histogram, s Service) Service { - return &instrumentingService{ - requestCount: counter, - requestLatency: latency, - Service: s, - } -} - -func (s *instrumentingService) RegisterHandlingEvent(completed time.Time, id cargo.TrackingID, voyageNumber voyage.Number, - loc location.UNLocode, eventType cargo.HandlingEventType) error { - - defer func(begin time.Time) { - s.requestCount.With("method", "register_incident").Add(1) - s.requestLatency.With("method", "register_incident").Observe(time.Since(begin).Seconds()) - }(time.Now()) - - return s.Service.RegisterHandlingEvent(completed, id, voyageNumber, loc, eventType) -} diff --git a/vendor/github.com/go-kit/kit/examples/shipping/handling/logging.go b/vendor/github.com/go-kit/kit/examples/shipping/handling/logging.go deleted file mode 100644 index 84722fb4..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/handling/logging.go +++ /dev/null @@ -1,38 +0,0 @@ -package handling - -import ( - "time" - - "github.com/go-kit/kit/log" - - "github.com/go-kit/kit/examples/shipping/cargo" - "github.com/go-kit/kit/examples/shipping/location" - "github.com/go-kit/kit/examples/shipping/voyage" -) - -type loggingService struct { - logger log.Logger - Service -} - -// NewLoggingService returns a new instance of a logging Service. -func NewLoggingService(logger log.Logger, s Service) Service { - return &loggingService{logger, s} -} - -func (s *loggingService) RegisterHandlingEvent(completed time.Time, id cargo.TrackingID, voyageNumber voyage.Number, - unLocode location.UNLocode, eventType cargo.HandlingEventType) (err error) { - defer func(begin time.Time) { - s.logger.Log( - "method", "register_incident", - "tracking_id", id, - "location", unLocode, - "voyage", voyageNumber, - "event_type", eventType, - "completion_time", completed, - "took", time.Since(begin), - "err", err, - ) - }(time.Now()) - return s.Service.RegisterHandlingEvent(completed, id, voyageNumber, unLocode, eventType) -} diff --git a/vendor/github.com/go-kit/kit/examples/shipping/handling/service.go b/vendor/github.com/go-kit/kit/examples/shipping/handling/service.go deleted file mode 100644 index 83d503a2..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/handling/service.go +++ /dev/null @@ -1,76 +0,0 @@ -// Package handling provides the use-case for registering incidents. Used by -// views facing the people handling the cargo along its route. -package handling - -import ( - "errors" - "time" - - "github.com/go-kit/kit/examples/shipping/cargo" - "github.com/go-kit/kit/examples/shipping/inspection" - "github.com/go-kit/kit/examples/shipping/location" - "github.com/go-kit/kit/examples/shipping/voyage" -) - -// ErrInvalidArgument is returned when one or more arguments are invalid. -var ErrInvalidArgument = errors.New("invalid argument") - -// EventHandler provides a means of subscribing to registered handling events. -type EventHandler interface { - CargoWasHandled(cargo.HandlingEvent) -} - -// Service provides handling operations. -type Service interface { - // RegisterHandlingEvent registers a handling event in the system, and - // notifies interested parties that a cargo has been handled. - RegisterHandlingEvent(completed time.Time, id cargo.TrackingID, voyageNumber voyage.Number, - unLocode location.UNLocode, eventType cargo.HandlingEventType) error -} - -type service struct { - handlingEventRepository cargo.HandlingEventRepository - handlingEventFactory cargo.HandlingEventFactory - handlingEventHandler EventHandler -} - -func (s *service) RegisterHandlingEvent(completed time.Time, id cargo.TrackingID, voyageNumber voyage.Number, - loc location.UNLocode, eventType cargo.HandlingEventType) error { - if completed.IsZero() || id == "" || loc == "" || eventType == cargo.NotHandled { - return ErrInvalidArgument - } - - e, err := s.handlingEventFactory.CreateHandlingEvent(time.Now(), completed, id, voyageNumber, loc, eventType) - if err != nil { - return err - } - - s.handlingEventRepository.Store(e) - s.handlingEventHandler.CargoWasHandled(e) - - return nil -} - -// NewService creates a handling event service with necessary dependencies. -func NewService(r cargo.HandlingEventRepository, f cargo.HandlingEventFactory, h EventHandler) Service { - return &service{ - handlingEventRepository: r, - handlingEventFactory: f, - handlingEventHandler: h, - } -} - -type handlingEventHandler struct { - InspectionService inspection.Service -} - -func (h *handlingEventHandler) CargoWasHandled(event cargo.HandlingEvent) { - h.InspectionService.InspectCargo(event.TrackingID) -} - -// NewEventHandler returns a new instance of a EventHandler. -func NewEventHandler(s inspection.Service) EventHandler { - return &handlingEventHandler{ - InspectionService: s, - } -} diff --git a/vendor/github.com/go-kit/kit/examples/shipping/handling/transport.go b/vendor/github.com/go-kit/kit/examples/shipping/handling/transport.go deleted file mode 100644 index 0e21365b..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/handling/transport.go +++ /dev/null @@ -1,100 +0,0 @@ -package handling - -import ( - "context" - "encoding/json" - "net/http" - "time" - - "github.com/gorilla/mux" - - kitlog "github.com/go-kit/kit/log" - kithttp "github.com/go-kit/kit/transport/http" - - "github.com/go-kit/kit/examples/shipping/cargo" - "github.com/go-kit/kit/examples/shipping/location" - "github.com/go-kit/kit/examples/shipping/voyage" -) - -// MakeHandler returns a handler for the handling service. -func MakeHandler(hs Service, logger kitlog.Logger) http.Handler { - r := mux.NewRouter() - - opts := []kithttp.ServerOption{ - kithttp.ServerErrorLogger(logger), - kithttp.ServerErrorEncoder(encodeError), - } - - registerIncidentHandler := kithttp.NewServer( - makeRegisterIncidentEndpoint(hs), - decodeRegisterIncidentRequest, - encodeResponse, - opts..., - ) - - r.Handle("/handling/v1/incidents", registerIncidentHandler).Methods("POST") - - return r -} - -func decodeRegisterIncidentRequest(_ context.Context, r *http.Request) (interface{}, error) { - var body struct { - CompletionTime time.Time `json:"completion_time"` - TrackingID string `json:"tracking_id"` - VoyageNumber string `json:"voyage"` - Location string `json:"location"` - EventType string `json:"event_type"` - } - - if err := json.NewDecoder(r.Body).Decode(&body); err != nil { - return nil, err - } - - return registerIncidentRequest{ - CompletionTime: body.CompletionTime, - ID: cargo.TrackingID(body.TrackingID), - Voyage: voyage.Number(body.VoyageNumber), - Location: location.UNLocode(body.Location), - EventType: stringToEventType(body.EventType), - }, nil -} - -func stringToEventType(s string) cargo.HandlingEventType { - types := map[string]cargo.HandlingEventType{ - cargo.Receive.String(): cargo.Receive, - cargo.Load.String(): cargo.Load, - cargo.Unload.String(): cargo.Unload, - cargo.Customs.String(): cargo.Customs, - cargo.Claim.String(): cargo.Claim, - } - return types[s] -} - -func encodeResponse(ctx context.Context, w http.ResponseWriter, response interface{}) error { - if e, ok := response.(errorer); ok && e.error() != nil { - encodeError(ctx, e.error(), w) - return nil - } - w.Header().Set("Content-Type", "application/json; charset=utf-8") - return json.NewEncoder(w).Encode(response) -} - -type errorer interface { - error() error -} - -// encode errors from business-logic -func encodeError(_ context.Context, err error, w http.ResponseWriter) { - w.Header().Set("Content-Type", "application/json; charset=utf-8") - switch err { - case cargo.ErrUnknown: - w.WriteHeader(http.StatusNotFound) - case ErrInvalidArgument: - w.WriteHeader(http.StatusBadRequest) - default: - w.WriteHeader(http.StatusInternalServerError) - } - json.NewEncoder(w).Encode(map[string]interface{}{ - "error": err.Error(), - }) -} diff --git a/vendor/github.com/go-kit/kit/examples/shipping/inmem/inmem.go b/vendor/github.com/go-kit/kit/examples/shipping/inmem/inmem.go deleted file mode 100644 index f941b7eb..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/inmem/inmem.go +++ /dev/null @@ -1,142 +0,0 @@ -// Package inmem provides in-memory implementations of all the domain repositories. -package inmem - -import ( - "sync" - - "github.com/go-kit/kit/examples/shipping/cargo" - "github.com/go-kit/kit/examples/shipping/location" - "github.com/go-kit/kit/examples/shipping/voyage" -) - -type cargoRepository struct { - mtx sync.RWMutex - cargos map[cargo.TrackingID]*cargo.Cargo -} - -func (r *cargoRepository) Store(c *cargo.Cargo) error { - r.mtx.Lock() - defer r.mtx.Unlock() - r.cargos[c.TrackingID] = c - return nil -} - -func (r *cargoRepository) Find(id cargo.TrackingID) (*cargo.Cargo, error) { - r.mtx.RLock() - defer r.mtx.RUnlock() - if val, ok := r.cargos[id]; ok { - return val, nil - } - return nil, cargo.ErrUnknown -} - -func (r *cargoRepository) FindAll() []*cargo.Cargo { - r.mtx.RLock() - defer r.mtx.RUnlock() - c := make([]*cargo.Cargo, 0, len(r.cargos)) - for _, val := range r.cargos { - c = append(c, val) - } - return c -} - -// NewCargoRepository returns a new instance of a in-memory cargo repository. -func NewCargoRepository() cargo.Repository { - return &cargoRepository{ - cargos: make(map[cargo.TrackingID]*cargo.Cargo), - } -} - -type locationRepository struct { - locations map[location.UNLocode]*location.Location -} - -func (r *locationRepository) Find(locode location.UNLocode) (*location.Location, error) { - if l, ok := r.locations[locode]; ok { - return l, nil - } - return nil, location.ErrUnknown -} - -func (r *locationRepository) FindAll() []*location.Location { - l := make([]*location.Location, 0, len(r.locations)) - for _, val := range r.locations { - l = append(l, val) - } - return l -} - -// NewLocationRepository returns a new instance of a in-memory location repository. -func NewLocationRepository() location.Repository { - r := &locationRepository{ - locations: make(map[location.UNLocode]*location.Location), - } - - r.locations[location.SESTO] = location.Stockholm - r.locations[location.AUMEL] = location.Melbourne - r.locations[location.CNHKG] = location.Hongkong - r.locations[location.JNTKO] = location.Tokyo - r.locations[location.NLRTM] = location.Rotterdam - r.locations[location.DEHAM] = location.Hamburg - - return r -} - -type voyageRepository struct { - voyages map[voyage.Number]*voyage.Voyage -} - -func (r *voyageRepository) Find(voyageNumber voyage.Number) (*voyage.Voyage, error) { - if v, ok := r.voyages[voyageNumber]; ok { - return v, nil - } - - return nil, voyage.ErrUnknown -} - -// NewVoyageRepository returns a new instance of a in-memory voyage repository. -func NewVoyageRepository() voyage.Repository { - r := &voyageRepository{ - voyages: make(map[voyage.Number]*voyage.Voyage), - } - - r.voyages[voyage.V100.Number] = voyage.V100 - r.voyages[voyage.V300.Number] = voyage.V300 - r.voyages[voyage.V400.Number] = voyage.V400 - - r.voyages[voyage.V0100S.Number] = voyage.V0100S - r.voyages[voyage.V0200T.Number] = voyage.V0200T - r.voyages[voyage.V0300A.Number] = voyage.V0300A - r.voyages[voyage.V0301S.Number] = voyage.V0301S - r.voyages[voyage.V0400S.Number] = voyage.V0400S - - return r -} - -type handlingEventRepository struct { - mtx sync.RWMutex - events map[cargo.TrackingID][]cargo.HandlingEvent -} - -func (r *handlingEventRepository) Store(e cargo.HandlingEvent) { - r.mtx.Lock() - defer r.mtx.Unlock() - // Make array if it's the first event with this tracking ID. - if _, ok := r.events[e.TrackingID]; !ok { - r.events[e.TrackingID] = make([]cargo.HandlingEvent, 0) - } - r.events[e.TrackingID] = append(r.events[e.TrackingID], e) -} - -func (r *handlingEventRepository) QueryHandlingHistory(id cargo.TrackingID) cargo.HandlingHistory { - r.mtx.RLock() - defer r.mtx.RUnlock() - return cargo.HandlingHistory{HandlingEvents: r.events[id]} -} - -// NewHandlingEventRepository returns a new instance of a in-memory handling event repository. -func NewHandlingEventRepository() cargo.HandlingEventRepository { - return &handlingEventRepository{ - events: make(map[cargo.TrackingID][]cargo.HandlingEvent), - } -} diff --git a/vendor/github.com/go-kit/kit/examples/shipping/inspection/inspection.go b/vendor/github.com/go-kit/kit/examples/shipping/inspection/inspection.go deleted file mode 100644 index 2ebf73d4..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/inspection/inspection.go +++ /dev/null @@ -1,53 +0,0 @@ -// Package inspection provides means to inspect cargos. -package inspection - -import ( - "github.com/go-kit/kit/examples/shipping/cargo" -) - -// EventHandler provides means of subscribing to inspection events. -type EventHandler interface { - CargoWasMisdirected(*cargo.Cargo) - CargoHasArrived(*cargo.Cargo) -} - -// Service provides cargo inspection operations. -type Service interface { - // InspectCargo inspects cargo and send relevant notifications to - // interested parties, for example if a cargo has been misdirected, or - // unloaded at the final destination. - InspectCargo(id cargo.TrackingID) -} - -type service struct { - cargos cargo.Repository - events cargo.HandlingEventRepository - handler EventHandler -} - -// TODO: Should be transactional -func (s *service) InspectCargo(id cargo.TrackingID) { - c, err := s.cargos.Find(id) - if err != nil { - return - } - - h := s.events.QueryHandlingHistory(id) - - c.DeriveDeliveryProgress(h) - - if c.Delivery.IsMisdirected { - s.handler.CargoWasMisdirected(c) - } - - if c.Delivery.IsUnloadedAtDestination { - s.handler.CargoHasArrived(c) - } - - s.cargos.Store(c) -} - -// NewService creates a inspection service with necessary dependencies. -func NewService(cargos cargo.Repository, events cargo.HandlingEventRepository, handler EventHandler) Service { - return &service{cargos, events, handler} -} diff --git a/vendor/github.com/go-kit/kit/examples/shipping/location/location.go b/vendor/github.com/go-kit/kit/examples/shipping/location/location.go deleted file mode 100644 index ee2e5d45..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/location/location.go +++ /dev/null @@ -1,29 +0,0 @@ -// Package location provides the Location aggregate. -package location - -import ( - "errors" -) - -// UNLocode is the United Nations location code that uniquely identifies a -// particular location. -// -// http://www.unece.org/cefact/locode/ -// http://www.unece.org/cefact/locode/DocColumnDescription.htm#LOCODE -type UNLocode string - -// Location is a location is our model is stops on a journey, such as cargo -// origin or destination, or carrier movement endpoints. -type Location struct { - UNLocode UNLocode - Name string -} - -// ErrUnknown is used when a location could not be found. -var ErrUnknown = errors.New("unknown location") - -// Repository provides access a location store. -type Repository interface { - Find(locode UNLocode) (*Location, error) - FindAll() []*Location -} diff --git a/vendor/github.com/go-kit/kit/examples/shipping/location/sample_locations.go b/vendor/github.com/go-kit/kit/examples/shipping/location/sample_locations.go deleted file mode 100644 index 7fd34efa..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/location/sample_locations.go +++ /dev/null @@ -1,27 +0,0 @@ -package location - -// Sample UN locodes. -var ( - SESTO UNLocode = "SESTO" - AUMEL UNLocode = "AUMEL" - CNHKG UNLocode = "CNHKG" - USNYC UNLocode = "USNYC" - USCHI UNLocode = "USCHI" - JNTKO UNLocode = "JNTKO" - DEHAM UNLocode = "DEHAM" - NLRTM UNLocode = "NLRTM" - FIHEL UNLocode = "FIHEL" -) - -// Sample locations. -var ( - Stockholm = &Location{SESTO, "Stockholm"} - Melbourne = &Location{AUMEL, "Melbourne"} - Hongkong = &Location{CNHKG, "Hongkong"} - NewYork = &Location{USNYC, "New York"} - Chicago = &Location{USCHI, "Chicago"} - Tokyo = &Location{JNTKO, "Tokyo"} - Hamburg = &Location{DEHAM, "Hamburg"} - Rotterdam = &Location{NLRTM, "Rotterdam"} - Helsinki = &Location{FIHEL, "Helsinki"} -) diff --git a/vendor/github.com/go-kit/kit/examples/shipping/main.go b/vendor/github.com/go-kit/kit/examples/shipping/main.go deleted file mode 100644 index 8337d61d..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/main.go +++ /dev/null @@ -1,200 +0,0 @@ -package main - -import ( - "context" - "flag" - "fmt" - "net/http" - "os" - "os/signal" - "syscall" - "time" - - stdprometheus "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promhttp" - - "github.com/go-kit/kit/log" - kitprometheus "github.com/go-kit/kit/metrics/prometheus" - - "github.com/go-kit/kit/examples/shipping/booking" - "github.com/go-kit/kit/examples/shipping/cargo" - "github.com/go-kit/kit/examples/shipping/handling" - "github.com/go-kit/kit/examples/shipping/inmem" - "github.com/go-kit/kit/examples/shipping/inspection" - "github.com/go-kit/kit/examples/shipping/location" - "github.com/go-kit/kit/examples/shipping/routing" - "github.com/go-kit/kit/examples/shipping/tracking" -) - -const ( - defaultPort = "8080" - defaultRoutingServiceURL = "http://localhost:7878" -) - -func main() { - var ( - addr = envString("PORT", defaultPort) - rsurl = envString("ROUTINGSERVICE_URL", defaultRoutingServiceURL) - - httpAddr = flag.String("http.addr", ":"+addr, "HTTP listen address") - routingServiceURL = flag.String("service.routing", rsurl, "routing service URL") - - ctx = context.Background() - ) - - flag.Parse() - - var logger log.Logger - logger = log.NewLogfmtLogger(log.NewSyncWriter(os.Stderr)) - logger = log.With(logger, "ts", log.DefaultTimestampUTC) - - var ( - cargos = inmem.NewCargoRepository() - locations = inmem.NewLocationRepository() - voyages = inmem.NewVoyageRepository() - handlingEvents = inmem.NewHandlingEventRepository() - ) - - // Configure some questionable dependencies. - var ( - handlingEventFactory = cargo.HandlingEventFactory{ - CargoRepository: cargos, - VoyageRepository: voyages, - LocationRepository: locations, - } - handlingEventHandler = handling.NewEventHandler( - inspection.NewService(cargos, handlingEvents, nil), - ) - ) - - // Facilitate testing by adding some cargos. - storeTestData(cargos) - - fieldKeys := []string{"method"} - - var rs routing.Service - rs = routing.NewProxyingMiddleware(ctx, *routingServiceURL)(rs) - - var bs booking.Service - bs = booking.NewService(cargos, locations, handlingEvents, rs) - bs = booking.NewLoggingService(log.With(logger, "component", "booking"), bs) - bs = booking.NewInstrumentingService( - kitprometheus.NewCounterFrom(stdprometheus.CounterOpts{ - Namespace: "api", - Subsystem: "booking_service", - Name: "request_count", - Help: "Number of requests received.", - }, fieldKeys), - kitprometheus.NewSummaryFrom(stdprometheus.SummaryOpts{ - Namespace: "api", - Subsystem: "booking_service", - Name: "request_latency_microseconds", - Help: "Total duration of requests in microseconds.", - }, fieldKeys), - bs, - ) - - var ts tracking.Service - ts = tracking.NewService(cargos, handlingEvents) - ts = tracking.NewLoggingService(log.With(logger, "component", "tracking"), ts) - ts = tracking.NewInstrumentingService( - kitprometheus.NewCounterFrom(stdprometheus.CounterOpts{ - Namespace: "api", - Subsystem: "tracking_service", - Name: "request_count", - Help: "Number of requests received.", - }, fieldKeys), - kitprometheus.NewSummaryFrom(stdprometheus.SummaryOpts{ - Namespace: "api", - Subsystem: "tracking_service", - Name: "request_latency_microseconds", - Help: "Total duration of requests in microseconds.", - }, fieldKeys), - ts, - ) - - var hs handling.Service - hs = handling.NewService(handlingEvents, handlingEventFactory, handlingEventHandler) - hs = handling.NewLoggingService(log.With(logger, "component", "handling"), hs) - hs = handling.NewInstrumentingService( - kitprometheus.NewCounterFrom(stdprometheus.CounterOpts{ - Namespace: "api", - Subsystem: "handling_service", - Name: "request_count", - Help: "Number of requests received.", - }, fieldKeys), - kitprometheus.NewSummaryFrom(stdprometheus.SummaryOpts{ - Namespace: "api", - Subsystem: "handling_service", - Name: "request_latency_microseconds", - Help: "Total duration of requests in microseconds.", - }, fieldKeys), - hs, - ) - - httpLogger := log.With(logger, "component", "http") - - mux := http.NewServeMux() - - mux.Handle("/booking/v1/", booking.MakeHandler(bs, httpLogger)) - mux.Handle("/tracking/v1/", tracking.MakeHandler(ts, httpLogger)) - mux.Handle("/handling/v1/", handling.MakeHandler(hs, httpLogger)) - - http.Handle("/", accessControl(mux)) - http.Handle("/metrics", promhttp.Handler()) - - errs := make(chan error, 2) - go func() { - logger.Log("transport", "http", "address", *httpAddr, "msg", "listening") - errs <- http.ListenAndServe(*httpAddr, nil) - }() - go func() { - c := make(chan os.Signal) - signal.Notify(c, syscall.SIGINT) - errs <- fmt.Errorf("%s", <-c) - }() - - logger.Log("terminated", <-errs) -} - -func accessControl(h http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Access-Control-Allow-Origin", "*") - w.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS") - w.Header().Set("Access-Control-Allow-Headers", "Origin, Content-Type") - - if r.Method == "OPTIONS" { - return - } - - h.ServeHTTP(w, r) - }) -} - -func envString(env, fallback string) string { - e := os.Getenv(env) - if e == "" { - return fallback - } - return e -} - -func storeTestData(r cargo.Repository) { - test1 := cargo.New("FTL456", cargo.RouteSpecification{ - Origin: location.AUMEL, - Destination: location.SESTO, - ArrivalDeadline: time.Now().AddDate(0, 0, 7), - }) - if err := r.Store(test1); err != nil { - panic(err) - } - - test2 := cargo.New("ABC123", cargo.RouteSpecification{ - Origin: location.SESTO, - Destination: location.CNHKG, - ArrivalDeadline: time.Now().AddDate(0, 0, 14), - }) - if err := r.Store(test2); err != nil { - panic(err) - } -} diff --git a/vendor/github.com/go-kit/kit/examples/shipping/routing/proxying.go b/vendor/github.com/go-kit/kit/examples/shipping/routing/proxying.go deleted file mode 100644 index 0c9150b1..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/routing/proxying.go +++ /dev/null @@ -1,117 +0,0 @@ -package routing - -import ( - "context" - "encoding/json" - "net/http" - "net/url" - "time" - - "github.com/go-kit/kit/circuitbreaker" - "github.com/go-kit/kit/endpoint" - kithttp "github.com/go-kit/kit/transport/http" - - "github.com/go-kit/kit/examples/shipping/cargo" - "github.com/go-kit/kit/examples/shipping/location" - "github.com/go-kit/kit/examples/shipping/voyage" -) - -type proxyService struct { - context.Context - FetchRoutesEndpoint endpoint.Endpoint - Service -} - -func (s proxyService) FetchRoutesForSpecification(rs cargo.RouteSpecification) []cargo.Itinerary { - response, err := s.FetchRoutesEndpoint(s.Context, fetchRoutesRequest{ - From: string(rs.Origin), - To: string(rs.Destination), - }) - if err != nil { - return []cargo.Itinerary{} - } - - resp := response.(fetchRoutesResponse) - - var itineraries []cargo.Itinerary - for _, r := range resp.Paths { - var legs []cargo.Leg - for _, e := range r.Edges { - legs = append(legs, cargo.Leg{ - VoyageNumber: voyage.Number(e.Voyage), - LoadLocation: location.UNLocode(e.Origin), - UnloadLocation: location.UNLocode(e.Destination), - LoadTime: e.Departure, - UnloadTime: e.Arrival, - }) - } - - itineraries = append(itineraries, cargo.Itinerary{Legs: legs}) - } - - return itineraries -} - -// ServiceMiddleware defines a middleware for a routing service. -type ServiceMiddleware func(Service) Service - -// NewProxyingMiddleware returns a new instance of a proxying middleware. -func NewProxyingMiddleware(ctx context.Context, proxyURL string) ServiceMiddleware { - return func(next Service) Service { - var e endpoint.Endpoint - e = makeFetchRoutesEndpoint(ctx, proxyURL) - e = circuitbreaker.Hystrix("fetch-routes")(e) - return proxyService{ctx, e, next} - } -} - -type fetchRoutesRequest struct { - From string - To string -} - -type fetchRoutesResponse struct { - Paths []struct { - Edges []struct { - Origin string `json:"origin"` - Destination string `json:"destination"` - Voyage string `json:"voyage"` - Departure time.Time `json:"departure"` - Arrival time.Time `json:"arrival"` - } `json:"edges"` - } `json:"paths"` -} - -func makeFetchRoutesEndpoint(ctx context.Context, instance string) endpoint.Endpoint { - u, err := url.Parse(instance) - if err != nil { - panic(err) - } - if u.Path == "" { - u.Path = "/paths" - } - return kithttp.NewClient( - "GET", u, - encodeFetchRoutesRequest, - decodeFetchRoutesResponse, - ).Endpoint() -} - -func decodeFetchRoutesResponse(_ context.Context, resp *http.Response) (interface{}, error) { - var response fetchRoutesResponse - if err := json.NewDecoder(resp.Body).Decode(&response); err != nil { - return nil, err - } - return response, nil -} - -func encodeFetchRoutesRequest(_ context.Context, r *http.Request, request interface{}) error { - req := request.(fetchRoutesRequest) - - vals := r.URL.Query() - vals.Add("from", req.From) - vals.Add("to", req.To) - r.URL.RawQuery = vals.Encode() - - return nil -} diff --git a/vendor/github.com/go-kit/kit/examples/shipping/routing/routing.go b/vendor/github.com/go-kit/kit/examples/shipping/routing/routing.go deleted file mode 100644 index 50496f2b..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/routing/routing.go +++ /dev/null @@ -1,15 +0,0 @@ -// Package routing provides the routing domain service. It does not actually -// implement the routing service but merely acts as a proxy for a separate -// bounded context. -package routing - -import ( - "github.com/go-kit/kit/examples/shipping/cargo" -) - -// Service provides access to an external routing service. -type Service interface { - // FetchRoutesForSpecification finds all possible routes that satisfy a - // given specification. - FetchRoutesForSpecification(rs cargo.RouteSpecification) []cargo.Itinerary -} diff --git a/vendor/github.com/go-kit/kit/examples/shipping/tracking/endpoint.go b/vendor/github.com/go-kit/kit/examples/shipping/tracking/endpoint.go deleted file mode 100644 index ddb13172..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/tracking/endpoint.go +++ /dev/null @@ -1,26 +0,0 @@ -package tracking - -import ( - "context" - - "github.com/go-kit/kit/endpoint" -) - -type trackCargoRequest struct { - ID string -} - -type trackCargoResponse struct { - Cargo *Cargo `json:"cargo,omitempty"` - Err error `json:"error,omitempty"` -} - -func (r trackCargoResponse) error() error { return r.Err } - -func makeTrackCargoEndpoint(ts Service) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - req := request.(trackCargoRequest) - c, err := ts.Track(req.ID) - return trackCargoResponse{Cargo: &c, Err: err}, nil - } -} diff --git a/vendor/github.com/go-kit/kit/examples/shipping/tracking/instrumenting.go b/vendor/github.com/go-kit/kit/examples/shipping/tracking/instrumenting.go deleted file mode 100644 index f5dc018b..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/tracking/instrumenting.go +++ /dev/null @@ -1,31 +0,0 @@ -package tracking - -import ( - "time" - - "github.com/go-kit/kit/metrics" -) - -type instrumentingService struct { - requestCount metrics.Counter - requestLatency metrics.Histogram - Service -} - -// NewInstrumentingService returns an instance of an instrumenting Service. -func NewInstrumentingService(counter metrics.Counter, latency metrics.Histogram, s Service) Service { - return &instrumentingService{ - requestCount: counter, - requestLatency: latency, - Service: s, - } -} - -func (s *instrumentingService) Track(id string) (Cargo, error) { - defer func(begin time.Time) { - s.requestCount.With("method", "track").Add(1) - s.requestLatency.With("method", "track").Observe(time.Since(begin).Seconds()) - }(time.Now()) - - return s.Service.Track(id) -} diff --git a/vendor/github.com/go-kit/kit/examples/shipping/tracking/logging.go b/vendor/github.com/go-kit/kit/examples/shipping/tracking/logging.go deleted file mode 100644 index 584aeaa4..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/tracking/logging.go +++ /dev/null @@ -1,24 +0,0 @@ -package tracking - -import ( - "time" - - "github.com/go-kit/kit/log" -) - -type loggingService struct { - logger log.Logger - Service -} - -// NewLoggingService returns a new instance of a logging Service. -func NewLoggingService(logger log.Logger, s Service) Service { - return &loggingService{logger, s} -} - -func (s *loggingService) Track(id string) (c Cargo, err error) { - defer func(begin time.Time) { - s.logger.Log("method", "track", "tracking_id", id, "took", time.Since(begin), "err", err) - }(time.Now()) - return s.Service.Track(id) -} diff --git a/vendor/github.com/go-kit/kit/examples/shipping/tracking/service.go b/vendor/github.com/go-kit/kit/examples/shipping/tracking/service.go deleted file mode 100644 index b0e360b2..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/tracking/service.go +++ /dev/null @@ -1,163 +0,0 @@ -// Package tracking provides the use-case of tracking a cargo. Used by views -// facing the end-user. -package tracking - -import ( - "errors" - "fmt" - "strings" - "time" - - "github.com/go-kit/kit/examples/shipping/cargo" -) - -// ErrInvalidArgument is returned when one or more arguments are invalid. -var ErrInvalidArgument = errors.New("invalid argument") - -// Service is the interface that provides the basic Track method. -type Service interface { - // Track returns a cargo matching a tracking ID. - Track(id string) (Cargo, error) -} - -type service struct { - cargos cargo.Repository - handlingEvents cargo.HandlingEventRepository -} - -func (s *service) Track(id string) (Cargo, error) { - if id == "" { - return Cargo{}, ErrInvalidArgument - } - c, err := s.cargos.Find(cargo.TrackingID(id)) - if err != nil { - return Cargo{}, err - } - return assemble(c, s.handlingEvents), nil -} - -// NewService returns a new instance of the default Service. -func NewService(cargos cargo.Repository, events cargo.HandlingEventRepository) Service { - return &service{ - cargos: cargos, - handlingEvents: events, - } -} - -// Cargo is a read model for tracking views. -type Cargo struct { - TrackingID string `json:"tracking_id"` - StatusText string `json:"status_text"` - Origin string `json:"origin"` - Destination string `json:"destination"` - ETA time.Time `json:"eta"` - NextExpectedActivity string `json:"next_expected_activity"` - ArrivalDeadline time.Time `json:"arrival_deadline"` - Events []Event `json:"events"` -} - -// Leg is a read model for booking views. -type Leg struct { - VoyageNumber string `json:"voyage_number"` - From string `json:"from"` - To string `json:"to"` - LoadTime time.Time `json:"load_time"` - UnloadTime time.Time `json:"unload_time"` -} - -// Event is a read model for tracking views. -type Event struct { - Description string `json:"description"` - Expected bool `json:"expected"` -} - -func assemble(c *cargo.Cargo, events cargo.HandlingEventRepository) Cargo { - return Cargo{ - TrackingID: string(c.TrackingID), - Origin: string(c.Origin), - Destination: string(c.RouteSpecification.Destination), - ETA: c.Delivery.ETA, - NextExpectedActivity: nextExpectedActivity(c), - ArrivalDeadline: c.RouteSpecification.ArrivalDeadline, - StatusText: assembleStatusText(c), - Events: assembleEvents(c, events), - } -} - -func assembleLegs(c cargo.Cargo) []Leg { - var legs []Leg - for _, l := range c.Itinerary.Legs { - legs = append(legs, Leg{ - VoyageNumber: string(l.VoyageNumber), - From: string(l.LoadLocation), - To: string(l.UnloadLocation), - LoadTime: l.LoadTime, - UnloadTime: l.UnloadTime, - }) - } - return legs -} - -func nextExpectedActivity(c *cargo.Cargo) string { - a := c.Delivery.NextExpectedActivity - prefix := "Next expected activity is to" - - switch a.Type { - case cargo.Load: - return fmt.Sprintf("%s %s cargo onto voyage %s in %s.", prefix, strings.ToLower(a.Type.String()), a.VoyageNumber, a.Location) - case cargo.Unload: - return fmt.Sprintf("%s %s cargo off of voyage %s in %s.", prefix, strings.ToLower(a.Type.String()), a.VoyageNumber, a.Location) - case cargo.NotHandled: - return "There are currently no expected activities for this cargo." - } - - return fmt.Sprintf("%s %s cargo in %s.", prefix, strings.ToLower(a.Type.String()), a.Location) -} - -func assembleStatusText(c *cargo.Cargo) string { - switch c.Delivery.TransportStatus { - case cargo.NotReceived: - return "Not received" - case cargo.InPort: - return fmt.Sprintf("In port %s", c.Delivery.LastKnownLocation) - case cargo.OnboardCarrier: - return fmt.Sprintf("Onboard voyage %s", c.Delivery.CurrentVoyage) - case cargo.Claimed: - return "Claimed" - default: - return "Unknown" - } -} - -func assembleEvents(c *cargo.Cargo, handlingEvents cargo.HandlingEventRepository) []Event { - h := handlingEvents.QueryHandlingHistory(c.TrackingID) - - var events []Event - for _, e := range h.HandlingEvents { - var description string - - switch e.Activity.Type { - case cargo.NotHandled: - description = "Cargo has not yet been received." - case cargo.Receive: - description = fmt.Sprintf("Received in %s, at %s", e.Activity.Location, time.Now().Format(time.RFC3339)) - case cargo.Load: - description = fmt.Sprintf("Loaded onto voyage %s in %s, at %s.", e.Activity.VoyageNumber, e.Activity.Location, time.Now().Format(time.RFC3339)) - case cargo.Unload: - description = fmt.Sprintf("Unloaded off voyage %s in %s, at %s.", e.Activity.VoyageNumber, e.Activity.Location, time.Now().Format(time.RFC3339)) - case cargo.Claim: - description = fmt.Sprintf("Claimed in %s, at %s.", e.Activity.Location, time.Now().Format(time.RFC3339)) - case cargo.Customs: - description = fmt.Sprintf("Cleared customs in %s, at %s.", e.Activity.Location, time.Now().Format(time.RFC3339)) - default: - description = "[Unknown status]" - } - - events = append(events, Event{ - Description: description, - Expected: c.Itinerary.IsExpected(e), - }) - } - - return events -} diff --git a/vendor/github.com/go-kit/kit/examples/shipping/tracking/transport.go b/vendor/github.com/go-kit/kit/examples/shipping/tracking/transport.go deleted file mode 100644 index 32db9716..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/tracking/transport.go +++ /dev/null @@ -1,74 +0,0 @@ -package tracking - -import ( - "context" - "encoding/json" - "errors" - "net/http" - - "github.com/gorilla/mux" - - kitlog "github.com/go-kit/kit/log" - kithttp "github.com/go-kit/kit/transport/http" - - "github.com/go-kit/kit/examples/shipping/cargo" -) - -// MakeHandler returns a handler for the tracking service. -func MakeHandler(ts Service, logger kitlog.Logger) http.Handler { - r := mux.NewRouter() - - opts := []kithttp.ServerOption{ - kithttp.ServerErrorLogger(logger), - kithttp.ServerErrorEncoder(encodeError), - } - - trackCargoHandler := kithttp.NewServer( - makeTrackCargoEndpoint(ts), - decodeTrackCargoRequest, - encodeResponse, - opts..., - ) - - r.Handle("/tracking/v1/cargos/{id}", trackCargoHandler).Methods("GET") - - return r -} - -func decodeTrackCargoRequest(_ context.Context, r *http.Request) (interface{}, error) { - vars := mux.Vars(r) - id, ok := vars["id"] - if !ok { - return nil, errors.New("bad route") - } - return trackCargoRequest{ID: id}, nil -} - -func encodeResponse(ctx context.Context, w http.ResponseWriter, response interface{}) error { - if e, ok := response.(errorer); ok && e.error() != nil { - encodeError(ctx, e.error(), w) - return nil - } - w.Header().Set("Content-Type", "application/json; charset=utf-8") - return json.NewEncoder(w).Encode(response) -} - -type errorer interface { - error() error -} - -// encode errors from business-logic -func encodeError(_ context.Context, err error, w http.ResponseWriter) { - w.Header().Set("Content-Type", "application/json; charset=utf-8") - switch err { - case cargo.ErrUnknown: - w.WriteHeader(http.StatusNotFound) - case ErrInvalidArgument: - w.WriteHeader(http.StatusBadRequest) - default: - w.WriteHeader(http.StatusInternalServerError) - } - json.NewEncoder(w).Encode(map[string]interface{}{ - "error": err.Error(), - }) -} diff --git a/vendor/github.com/go-kit/kit/examples/shipping/voyage/sample_voyages.go b/vendor/github.com/go-kit/kit/examples/shipping/voyage/sample_voyages.go deleted file mode 100644 index 751f5885..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/voyage/sample_voyages.go +++ /dev/null @@ -1,40 +0,0 @@ -package voyage - -import "github.com/go-kit/kit/examples/shipping/location" - -// A set of sample voyages. -var ( - V100 = New("V100", Schedule{ - []CarrierMovement{ - {DepartureLocation: location.CNHKG, ArrivalLocation: location.JNTKO}, - {DepartureLocation: location.JNTKO, ArrivalLocation: location.USNYC}, - }, - }) - - V300 = New("V300", Schedule{ - []CarrierMovement{ - {DepartureLocation: location.JNTKO, ArrivalLocation: location.NLRTM}, - {DepartureLocation: location.NLRTM, ArrivalLocation: location.DEHAM}, - {DepartureLocation: location.DEHAM, ArrivalLocation: location.AUMEL}, - {DepartureLocation: location.AUMEL, ArrivalLocation: location.JNTKO}, - }, - }) - - V400 = New("V400", Schedule{ - []CarrierMovement{ - {DepartureLocation: location.DEHAM, ArrivalLocation: location.SESTO}, - {DepartureLocation: location.SESTO, ArrivalLocation: location.FIHEL}, - {DepartureLocation: location.FIHEL, ArrivalLocation: location.DEHAM}, - }, - }) -) - -// These voyages are hard-coded into the current pathfinder. Make sure -// they exist. -var ( - V0100S = New("0100S", Schedule{[]CarrierMovement{}}) - V0200T = New("0200T", Schedule{[]CarrierMovement{}}) - V0300A = New("0300A", Schedule{[]CarrierMovement{}}) - V0301S = New("0301S", Schedule{[]CarrierMovement{}}) - V0400S = New("0400S", Schedule{[]CarrierMovement{}}) -) diff --git a/vendor/github.com/go-kit/kit/examples/shipping/voyage/voyage.go b/vendor/github.com/go-kit/kit/examples/shipping/voyage/voyage.go deleted file mode 100644 index 37366af4..00000000 --- a/vendor/github.com/go-kit/kit/examples/shipping/voyage/voyage.go +++ /dev/null @@ -1,44 +0,0 @@ -// Package voyage provides the Voyage aggregate. -package voyage - -import ( - "errors" - "time" - - "github.com/go-kit/kit/examples/shipping/location" -) - -// Number uniquely identifies a particular Voyage. -type Number string - -// Voyage is a uniquely identifiable series of carrier movements. -type Voyage struct { - Number Number - Schedule Schedule -} - -// New creates a voyage with a voyage number and a provided schedule. -func New(n Number, s Schedule) *Voyage { - return &Voyage{Number: n, Schedule: s} -} - -// Schedule describes a voyage schedule. -type Schedule struct { - CarrierMovements []CarrierMovement -} - -// CarrierMovement is a vessel voyage from one location to another. -type CarrierMovement struct { - DepartureLocation location.UNLocode - ArrivalLocation location.UNLocode - DepartureTime time.Time - ArrivalTime time.Time -} - -// ErrUnknown is used when a voyage could not be found. -var ErrUnknown = errors.New("unknown voyage") - -// Repository provides access a voyage store. -type Repository interface { - Find(Number) (*Voyage, error) -} diff --git a/vendor/github.com/go-kit/kit/examples/stringsvc1/main.go b/vendor/github.com/go-kit/kit/examples/stringsvc1/main.go deleted file mode 100644 index 03fc7939..00000000 --- a/vendor/github.com/go-kit/kit/examples/stringsvc1/main.go +++ /dev/null @@ -1,111 +0,0 @@ -package main - -import ( - "context" - "encoding/json" - "errors" - "log" - "net/http" - "strings" - - "github.com/go-kit/kit/endpoint" - httptransport "github.com/go-kit/kit/transport/http" -) - -// StringService provides operations on strings. -type StringService interface { - Uppercase(string) (string, error) - Count(string) int -} - -type stringService struct{} - -func (stringService) Uppercase(s string) (string, error) { - if s == "" { - return "", ErrEmpty - } - return strings.ToUpper(s), nil -} - -func (stringService) Count(s string) int { - return len(s) -} - -func main() { - svc := stringService{} - - uppercaseHandler := httptransport.NewServer( - makeUppercaseEndpoint(svc), - decodeUppercaseRequest, - encodeResponse, - ) - - countHandler := httptransport.NewServer( - makeCountEndpoint(svc), - decodeCountRequest, - encodeResponse, - ) - - http.Handle("/uppercase", uppercaseHandler) - http.Handle("/count", countHandler) - log.Fatal(http.ListenAndServe(":8080", nil)) -} - -func makeUppercaseEndpoint(svc StringService) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - req := request.(uppercaseRequest) - v, err := svc.Uppercase(req.S) - if err != nil { - return uppercaseResponse{v, err.Error()}, nil - } - return uppercaseResponse{v, ""}, nil - } -} - -func makeCountEndpoint(svc StringService) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - req := request.(countRequest) - v := svc.Count(req.S) - return countResponse{v}, nil - } -} - -func decodeUppercaseRequest(_ context.Context, r *http.Request) (interface{}, error) { - var request uppercaseRequest - if err := json.NewDecoder(r.Body).Decode(&request); err != nil { - return nil, err - } - return request, nil -} - -func decodeCountRequest(_ context.Context, r *http.Request) (interface{}, error) { - var request countRequest - if err := json.NewDecoder(r.Body).Decode(&request); err != nil { - return nil, err - } - return request, nil -} - -func encodeResponse(_ context.Context, w http.ResponseWriter, response interface{}) error { - return json.NewEncoder(w).Encode(response) -} - -type uppercaseRequest struct { - S string `json:"s"` -} - -type uppercaseResponse struct { - V string `json:"v"` - Err string `json:"err,omitempty"` // errors don't define JSON marshaling -} - -type countRequest struct { - S string `json:"s"` -} - -type countResponse struct { - V int `json:"v"` -} - -// ErrEmpty is returned when an input string is empty. -var ErrEmpty = errors.New("empty string") diff --git a/vendor/github.com/go-kit/kit/examples/stringsvc2/instrumenting.go b/vendor/github.com/go-kit/kit/examples/stringsvc2/instrumenting.go deleted file mode 100644 index 675617d9..00000000 --- a/vendor/github.com/go-kit/kit/examples/stringsvc2/instrumenting.go +++ /dev/null @@ -1,38 +0,0 @@ -package main - -import ( - "fmt" - "time" - - "github.com/go-kit/kit/metrics" -) - -type instrumentingMiddleware struct { - requestCount metrics.Counter - requestLatency metrics.Histogram - countResult metrics.Histogram - next StringService -} - -func (mw instrumentingMiddleware) Uppercase(s string) (output string, err error) { - defer func(begin time.Time) { - lvs := []string{"method", "uppercase", "error", fmt.Sprint(err != nil)} - mw.requestCount.With(lvs...).Add(1) - mw.requestLatency.With(lvs...).Observe(time.Since(begin).Seconds()) - }(time.Now()) - - output, err = mw.next.Uppercase(s) - return -} - -func (mw instrumentingMiddleware) Count(s string) (n int) { - defer func(begin time.Time) { - lvs := []string{"method", "count", "error", "false"} - mw.requestCount.With(lvs...).Add(1) - mw.requestLatency.With(lvs...).Observe(time.Since(begin).Seconds()) - mw.countResult.Observe(float64(n)) - }(time.Now()) - - n = mw.next.Count(s) - return -} diff --git a/vendor/github.com/go-kit/kit/examples/stringsvc2/logging.go b/vendor/github.com/go-kit/kit/examples/stringsvc2/logging.go deleted file mode 100644 index b958f3b6..00000000 --- a/vendor/github.com/go-kit/kit/examples/stringsvc2/logging.go +++ /dev/null @@ -1,41 +0,0 @@ -package main - -import ( - "time" - - "github.com/go-kit/kit/log" -) - -type loggingMiddleware struct { - logger log.Logger - next StringService -} - -func (mw loggingMiddleware) Uppercase(s string) (output string, err error) { - defer func(begin time.Time) { - _ = mw.logger.Log( - "method", "uppercase", - "input", s, - "output", output, - "err", err, - "took", time.Since(begin), - ) - }(time.Now()) - - output, err = mw.next.Uppercase(s) - return -} - -func (mw loggingMiddleware) Count(s string) (n int) { - defer func(begin time.Time) { - _ = mw.logger.Log( - "method", "count", - "input", s, - "n", n, - "took", time.Since(begin), - ) - }(time.Now()) - - n = mw.next.Count(s) - return -} diff --git a/vendor/github.com/go-kit/kit/examples/stringsvc2/main.go b/vendor/github.com/go-kit/kit/examples/stringsvc2/main.go deleted file mode 100644 index 60544f27..00000000 --- a/vendor/github.com/go-kit/kit/examples/stringsvc2/main.go +++ /dev/null @@ -1,60 +0,0 @@ -package main - -import ( - "net/http" - "os" - - stdprometheus "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promhttp" - - "github.com/go-kit/kit/log" - kitprometheus "github.com/go-kit/kit/metrics/prometheus" - httptransport "github.com/go-kit/kit/transport/http" -) - -func main() { - logger := log.NewLogfmtLogger(os.Stderr) - - fieldKeys := []string{"method", "error"} - requestCount := kitprometheus.NewCounterFrom(stdprometheus.CounterOpts{ - Namespace: "my_group", - Subsystem: "string_service", - Name: "request_count", - Help: "Number of requests received.", - }, fieldKeys) - requestLatency := kitprometheus.NewSummaryFrom(stdprometheus.SummaryOpts{ - Namespace: "my_group", - Subsystem: "string_service", - Name: "request_latency_microseconds", - Help: "Total duration of requests in microseconds.", - }, fieldKeys) - countResult := kitprometheus.NewSummaryFrom(stdprometheus.SummaryOpts{ - Namespace: "my_group", - Subsystem: "string_service", - Name: "count_result", - Help: "The result of each count method.", - }, []string{}) // no fields here - - var svc StringService - svc = stringService{} - svc = loggingMiddleware{logger, svc} - svc = instrumentingMiddleware{requestCount, requestLatency, countResult, svc} - - uppercaseHandler := httptransport.NewServer( - makeUppercaseEndpoint(svc), - decodeUppercaseRequest, - encodeResponse, - ) - - countHandler := httptransport.NewServer( - makeCountEndpoint(svc), - decodeCountRequest, - encodeResponse, - ) - - http.Handle("/uppercase", uppercaseHandler) - http.Handle("/count", countHandler) - http.Handle("/metrics", promhttp.Handler()) - logger.Log("msg", "HTTP", "addr", ":8080") - logger.Log("err", http.ListenAndServe(":8080", nil)) -} diff --git a/vendor/github.com/go-kit/kit/examples/stringsvc2/service.go b/vendor/github.com/go-kit/kit/examples/stringsvc2/service.go deleted file mode 100644 index 1da2f3eb..00000000 --- a/vendor/github.com/go-kit/kit/examples/stringsvc2/service.go +++ /dev/null @@ -1,28 +0,0 @@ -package main - -import ( - "errors" - "strings" -) - -// StringService provides operations on strings. -type StringService interface { - Uppercase(string) (string, error) - Count(string) int -} - -type stringService struct{} - -func (stringService) Uppercase(s string) (string, error) { - if s == "" { - return "", ErrEmpty - } - return strings.ToUpper(s), nil -} - -func (stringService) Count(s string) int { - return len(s) -} - -// ErrEmpty is returned when an input string is empty. -var ErrEmpty = errors.New("empty string") diff --git a/vendor/github.com/go-kit/kit/examples/stringsvc2/transport.go b/vendor/github.com/go-kit/kit/examples/stringsvc2/transport.go deleted file mode 100644 index 297b3ffe..00000000 --- a/vendor/github.com/go-kit/kit/examples/stringsvc2/transport.go +++ /dev/null @@ -1,65 +0,0 @@ -package main - -import ( - "context" - "encoding/json" - "net/http" - - "github.com/go-kit/kit/endpoint" -) - -func makeUppercaseEndpoint(svc StringService) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - req := request.(uppercaseRequest) - v, err := svc.Uppercase(req.S) - if err != nil { - return uppercaseResponse{v, err.Error()}, nil - } - return uppercaseResponse{v, ""}, nil - } -} - -func makeCountEndpoint(svc StringService) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - req := request.(countRequest) - v := svc.Count(req.S) - return countResponse{v}, nil - } -} - -func decodeUppercaseRequest(_ context.Context, r *http.Request) (interface{}, error) { - var request uppercaseRequest - if err := json.NewDecoder(r.Body).Decode(&request); err != nil { - return nil, err - } - return request, nil -} - -func decodeCountRequest(_ context.Context, r *http.Request) (interface{}, error) { - var request countRequest - if err := json.NewDecoder(r.Body).Decode(&request); err != nil { - return nil, err - } - return request, nil -} - -func encodeResponse(_ context.Context, w http.ResponseWriter, response interface{}) error { - return json.NewEncoder(w).Encode(response) -} - -type uppercaseRequest struct { - S string `json:"s"` -} - -type uppercaseResponse struct { - V string `json:"v"` - Err string `json:"err,omitempty"` -} - -type countRequest struct { - S string `json:"s"` -} - -type countResponse struct { - V int `json:"v"` -} diff --git a/vendor/github.com/go-kit/kit/examples/stringsvc3/instrumenting.go b/vendor/github.com/go-kit/kit/examples/stringsvc3/instrumenting.go deleted file mode 100644 index b21c016c..00000000 --- a/vendor/github.com/go-kit/kit/examples/stringsvc3/instrumenting.go +++ /dev/null @@ -1,48 +0,0 @@ -package main - -import ( - "fmt" - "time" - - "github.com/go-kit/kit/metrics" -) - -func instrumentingMiddleware( - requestCount metrics.Counter, - requestLatency metrics.Histogram, - countResult metrics.Histogram, -) ServiceMiddleware { - return func(next StringService) StringService { - return instrmw{requestCount, requestLatency, countResult, next} - } -} - -type instrmw struct { - requestCount metrics.Counter - requestLatency metrics.Histogram - countResult metrics.Histogram - StringService -} - -func (mw instrmw) Uppercase(s string) (output string, err error) { - defer func(begin time.Time) { - lvs := []string{"method", "uppercase", "error", fmt.Sprint(err != nil)} - mw.requestCount.With(lvs...).Add(1) - mw.requestLatency.With(lvs...).Observe(time.Since(begin).Seconds()) - }(time.Now()) - - output, err = mw.StringService.Uppercase(s) - return -} - -func (mw instrmw) Count(s string) (n int) { - defer func(begin time.Time) { - lvs := []string{"method", "count", "error", "false"} - mw.requestCount.With(lvs...).Add(1) - mw.requestLatency.With(lvs...).Observe(time.Since(begin).Seconds()) - mw.countResult.Observe(float64(n)) - }(time.Now()) - - n = mw.StringService.Count(s) - return -} diff --git a/vendor/github.com/go-kit/kit/examples/stringsvc3/logging.go b/vendor/github.com/go-kit/kit/examples/stringsvc3/logging.go deleted file mode 100644 index 72a2709d..00000000 --- a/vendor/github.com/go-kit/kit/examples/stringsvc3/logging.go +++ /dev/null @@ -1,47 +0,0 @@ -package main - -import ( - "time" - - "github.com/go-kit/kit/log" -) - -func loggingMiddleware(logger log.Logger) ServiceMiddleware { - return func(next StringService) StringService { - return logmw{logger, next} - } -} - -type logmw struct { - logger log.Logger - StringService -} - -func (mw logmw) Uppercase(s string) (output string, err error) { - defer func(begin time.Time) { - _ = mw.logger.Log( - "method", "uppercase", - "input", s, - "output", output, - "err", err, - "took", time.Since(begin), - ) - }(time.Now()) - - output, err = mw.StringService.Uppercase(s) - return -} - -func (mw logmw) Count(s string) (n int) { - defer func(begin time.Time) { - _ = mw.logger.Log( - "method", "count", - "input", s, - "n", n, - "took", time.Since(begin), - ) - }(time.Now()) - - n = mw.StringService.Count(s) - return -} diff --git a/vendor/github.com/go-kit/kit/examples/stringsvc3/main.go b/vendor/github.com/go-kit/kit/examples/stringsvc3/main.go deleted file mode 100644 index 5cdb43b1..00000000 --- a/vendor/github.com/go-kit/kit/examples/stringsvc3/main.go +++ /dev/null @@ -1,70 +0,0 @@ -package main - -import ( - "context" - "flag" - "net/http" - "os" - - stdprometheus "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promhttp" - - "github.com/go-kit/kit/log" - kitprometheus "github.com/go-kit/kit/metrics/prometheus" - httptransport "github.com/go-kit/kit/transport/http" -) - -func main() { - var ( - listen = flag.String("listen", ":8080", "HTTP listen address") - proxy = flag.String("proxy", "", "Optional comma-separated list of URLs to proxy uppercase requests") - ) - flag.Parse() - - var logger log.Logger - logger = log.NewLogfmtLogger(os.Stderr) - logger = log.With(logger, "listen", *listen, "caller", log.DefaultCaller) - - fieldKeys := []string{"method", "error"} - requestCount := kitprometheus.NewCounterFrom(stdprometheus.CounterOpts{ - Namespace: "my_group", - Subsystem: "string_service", - Name: "request_count", - Help: "Number of requests received.", - }, fieldKeys) - requestLatency := kitprometheus.NewSummaryFrom(stdprometheus.SummaryOpts{ - Namespace: "my_group", - Subsystem: "string_service", - Name: "request_latency_microseconds", - Help: "Total duration of requests in microseconds.", - }, fieldKeys) - countResult := kitprometheus.NewSummaryFrom(stdprometheus.SummaryOpts{ - Namespace: "my_group", - Subsystem: "string_service", - Name: "count_result", - Help: "The result of each count method.", - }, []string{}) - - var svc StringService - svc = stringService{} - svc = proxyingMiddleware(context.Background(), *proxy, logger)(svc) - svc = loggingMiddleware(logger)(svc) - svc = instrumentingMiddleware(requestCount, requestLatency, countResult)(svc) - - uppercaseHandler := httptransport.NewServer( - makeUppercaseEndpoint(svc), - decodeUppercaseRequest, - encodeResponse, - ) - countHandler := httptransport.NewServer( - makeCountEndpoint(svc), - decodeCountRequest, - encodeResponse, - ) - - http.Handle("/uppercase", uppercaseHandler) - http.Handle("/count", countHandler) - http.Handle("/metrics", promhttp.Handler()) - logger.Log("msg", "HTTP", "addr", *listen) - logger.Log("err", http.ListenAndServe(*listen, nil)) -} diff --git a/vendor/github.com/go-kit/kit/examples/stringsvc3/proxying.go b/vendor/github.com/go-kit/kit/examples/stringsvc3/proxying.go deleted file mode 100644 index 0f678077..00000000 --- a/vendor/github.com/go-kit/kit/examples/stringsvc3/proxying.go +++ /dev/null @@ -1,117 +0,0 @@ -package main - -import ( - "context" - "errors" - "fmt" - "net/url" - "strings" - "time" - - "golang.org/x/time/rate" - - "github.com/sony/gobreaker" - - "github.com/go-kit/kit/circuitbreaker" - "github.com/go-kit/kit/endpoint" - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/ratelimit" - "github.com/go-kit/kit/sd" - "github.com/go-kit/kit/sd/lb" - httptransport "github.com/go-kit/kit/transport/http" -) - -func proxyingMiddleware(ctx context.Context, instances string, logger log.Logger) ServiceMiddleware { - // If instances is empty, don't proxy. - if instances == "" { - logger.Log("proxy_to", "none") - return func(next StringService) StringService { return next } - } - - // Set some parameters for our client. - var ( - qps = 100 // beyond which we will return an error - maxAttempts = 3 // per request, before giving up - maxTime = 250 * time.Millisecond // wallclock time, before giving up - ) - - // Otherwise, construct an endpoint for each instance in the list, and add - // it to a fixed set of endpoints. In a real service, rather than doing this - // by hand, you'd probably use package sd's support for your service - // discovery system. - var ( - instanceList = split(instances) - endpointer sd.FixedEndpointer - ) - logger.Log("proxy_to", fmt.Sprint(instanceList)) - for _, instance := range instanceList { - var e endpoint.Endpoint - e = makeUppercaseProxy(ctx, instance) - e = circuitbreaker.Gobreaker(gobreaker.NewCircuitBreaker(gobreaker.Settings{}))(e) - e = ratelimit.NewErroringLimiter(rate.NewLimiter(rate.Every(time.Second), qps))(e) - endpointer = append(endpointer, e) - } - - // Now, build a single, retrying, load-balancing endpoint out of all of - // those individual endpoints. - balancer := lb.NewRoundRobin(endpointer) - retry := lb.Retry(maxAttempts, maxTime, balancer) - - // And finally, return the ServiceMiddleware, implemented by proxymw. - return func(next StringService) StringService { - return proxymw{ctx, next, retry} - } -} - -// proxymw implements StringService, forwarding Uppercase requests to the -// provided endpoint, and serving all other (i.e. Count) requests via the -// next StringService. -type proxymw struct { - ctx context.Context - next StringService // Serve most requests via this service... - uppercase endpoint.Endpoint // ...except Uppercase, which gets served by this endpoint -} - -func (mw proxymw) Count(s string) int { - return mw.next.Count(s) -} - -func (mw proxymw) Uppercase(s string) (string, error) { - response, err := mw.uppercase(mw.ctx, uppercaseRequest{S: s}) - if err != nil { - return "", err - } - - resp := response.(uppercaseResponse) - if resp.Err != "" { - return resp.V, errors.New(resp.Err) - } - return resp.V, nil -} - -func makeUppercaseProxy(ctx context.Context, instance string) endpoint.Endpoint { - if !strings.HasPrefix(instance, "http") { - instance = "http://" + instance - } - u, err := url.Parse(instance) - if err != nil { - panic(err) - } - if u.Path == "" { - u.Path = "/uppercase" - } - return httptransport.NewClient( - "GET", - u, - encodeRequest, - decodeUppercaseResponse, - ).Endpoint() -} - -func split(s string) []string { - a := strings.Split(s, ",") - for i := range a { - a[i] = strings.TrimSpace(a[i]) - } - return a -} diff --git a/vendor/github.com/go-kit/kit/examples/stringsvc3/service.go b/vendor/github.com/go-kit/kit/examples/stringsvc3/service.go deleted file mode 100644 index 7e1773a9..00000000 --- a/vendor/github.com/go-kit/kit/examples/stringsvc3/service.go +++ /dev/null @@ -1,31 +0,0 @@ -package main - -import ( - "errors" - "strings" -) - -// StringService provides operations on strings. -type StringService interface { - Uppercase(string) (string, error) - Count(string) int -} - -type stringService struct{} - -func (stringService) Uppercase(s string) (string, error) { - if s == "" { - return "", ErrEmpty - } - return strings.ToUpper(s), nil -} - -func (stringService) Count(s string) int { - return len(s) -} - -// ErrEmpty is returned when an input string is empty. -var ErrEmpty = errors.New("empty string") - -// ServiceMiddleware is a chainable behavior modifier for StringService. -type ServiceMiddleware func(StringService) StringService diff --git a/vendor/github.com/go-kit/kit/examples/stringsvc3/transport.go b/vendor/github.com/go-kit/kit/examples/stringsvc3/transport.go deleted file mode 100644 index c17a055c..00000000 --- a/vendor/github.com/go-kit/kit/examples/stringsvc3/transport.go +++ /dev/null @@ -1,84 +0,0 @@ -package main - -import ( - "bytes" - "context" - "encoding/json" - "io/ioutil" - "net/http" - - "github.com/go-kit/kit/endpoint" -) - -func makeUppercaseEndpoint(svc StringService) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - req := request.(uppercaseRequest) - v, err := svc.Uppercase(req.S) - if err != nil { - return uppercaseResponse{v, err.Error()}, nil - } - return uppercaseResponse{v, ""}, nil - } -} - -func makeCountEndpoint(svc StringService) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - req := request.(countRequest) - v := svc.Count(req.S) - return countResponse{v}, nil - } -} - -func decodeUppercaseRequest(_ context.Context, r *http.Request) (interface{}, error) { - var request uppercaseRequest - if err := json.NewDecoder(r.Body).Decode(&request); err != nil { - return nil, err - } - return request, nil -} - -func decodeCountRequest(_ context.Context, r *http.Request) (interface{}, error) { - var request countRequest - if err := json.NewDecoder(r.Body).Decode(&request); err != nil { - return nil, err - } - return request, nil -} - -func decodeUppercaseResponse(_ context.Context, r *http.Response) (interface{}, error) { - var response uppercaseResponse - if err := json.NewDecoder(r.Body).Decode(&response); err != nil { - return nil, err - } - return response, nil -} - -func encodeResponse(_ context.Context, w http.ResponseWriter, response interface{}) error { - return json.NewEncoder(w).Encode(response) -} - -func encodeRequest(_ context.Context, r *http.Request, request interface{}) error { - var buf bytes.Buffer - if err := json.NewEncoder(&buf).Encode(request); err != nil { - return err - } - r.Body = ioutil.NopCloser(&buf) - return nil -} - -type uppercaseRequest struct { - S string `json:"s"` -} - -type uppercaseResponse struct { - V string `json:"v"` - Err string `json:"err,omitempty"` -} - -type countRequest struct { - S string `json:"s"` -} - -type countResponse struct { - V int `json:"v"` -} diff --git a/vendor/github.com/go-kit/kit/lint b/vendor/github.com/go-kit/kit/lint deleted file mode 100755 index 12e30727..00000000 --- a/vendor/github.com/go-kit/kit/lint +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env bash - -set -o errexit -set -o nounset -set -o pipefail - -if [ ! $(command -v gometalinter) ] -then - go get github.com/alecthomas/gometalinter - gometalinter --update --install -fi - -time gometalinter \ - --exclude='error return value not checked.*(Close|Log|Print).*\(errcheck\)$' \ - --exclude='.*_test\.go:.*error return value not checked.*\(errcheck\)$' \ - --exclude='/thrift/' \ - --exclude='/pb/' \ - --exclude='no args in Log call \(vet\)' \ - --disable=dupl \ - --disable=aligncheck \ - --disable=gotype \ - --cyclo-over=20 \ - --tests \ - --concurrency=2 \ - --deadline=300s \ - ./... diff --git a/vendor/github.com/go-kit/kit/log/README.md b/vendor/github.com/go-kit/kit/log/README.md deleted file mode 100644 index 7222f800..00000000 --- a/vendor/github.com/go-kit/kit/log/README.md +++ /dev/null @@ -1,147 +0,0 @@ -# package log - -`package log` provides a minimal interface for structured logging in services. -It may be wrapped to encode conventions, enforce type-safety, provide leveled -logging, and so on. It can be used for both typical application log events, -and log-structured data streams. - -## Structured logging - -Structured logging is, basically, conceding to the reality that logs are -_data_, and warrant some level of schematic rigor. Using a stricter, -key/value-oriented message format for our logs, containing contextual and -semantic information, makes it much easier to get insight into the -operational activity of the systems we build. Consequently, `package log` is -of the strong belief that "[the benefits of structured logging outweigh the -minimal effort involved](https://www.thoughtworks.com/radar/techniques/structured-logging)". - -Migrating from unstructured to structured logging is probably a lot easier -than you'd expect. - -```go -// Unstructured -log.Printf("HTTP server listening on %s", addr) - -// Structured -logger.Log("transport", "HTTP", "addr", addr, "msg", "listening") -``` - -## Usage - -### Typical application logging - -```go -w := log.NewSyncWriter(os.Stderr) -logger := log.NewLogfmtLogger(w) -logger.Log("question", "what is the meaning of life?", "answer", 42) - -// Output: -// question="what is the meaning of life?" answer=42 -``` - -### Contextual Loggers - -```go -func main() { - var logger log.Logger - logger = log.NewLogfmtLogger(log.NewSyncWriter(os.Stderr)) - logger = log.With(logger, "instance_id", 123) - - logger.Log("msg", "starting") - NewWorker(log.With(logger, "component", "worker")).Run() - NewSlacker(log.With(logger, "component", "slacker")).Run() -} - -// Output: -// instance_id=123 msg=starting -// instance_id=123 component=worker msg=running -// instance_id=123 component=slacker msg=running -``` - -### Interact with stdlib logger - -Redirect stdlib logger to Go kit logger. - -```go -import ( - "os" - stdlog "log" - kitlog "github.com/go-kit/kit/log" -) - -func main() { - logger := kitlog.NewJSONLogger(kitlog.NewSyncWriter(os.Stdout)) - stdlog.SetOutput(kitlog.NewStdlibAdapter(logger)) - stdlog.Print("I sure like pie") -} - -// Output: -// {"msg":"I sure like pie","ts":"2016/01/01 12:34:56"} -``` - -Or, if, for legacy reasons, you need to pipe all of your logging through the -stdlib log package, you can redirect Go kit logger to the stdlib logger. - -```go -logger := kitlog.NewLogfmtLogger(kitlog.StdlibWriter{}) -logger.Log("legacy", true, "msg", "at least it's something") - -// Output: -// 2016/01/01 12:34:56 legacy=true msg="at least it's something" -``` - -### Timestamps and callers - -```go -var logger log.Logger -logger = log.NewLogfmtLogger(log.NewSyncWriter(os.Stderr)) -logger = log.With(logger, "ts", log.DefaultTimestampUTC, "caller", log.DefaultCaller) - -logger.Log("msg", "hello") - -// Output: -// ts=2016-01-01T12:34:56Z caller=main.go:15 msg=hello -``` - -## Supported output formats - -- [Logfmt](https://brandur.org/logfmt) ([see also](https://blog.codeship.com/logfmt-a-log-format-thats-easy-to-read-and-write)) -- JSON - -## Enhancements - -`package log` is centered on the one-method Logger interface. - -```go -type Logger interface { - Log(keyvals ...interface{}) error -} -``` - -This interface, and its supporting code like is the product of much iteration -and evaluation. For more details on the evolution of the Logger interface, -see [The Hunt for a Logger Interface](http://go-talks.appspot.com/github.com/ChrisHines/talks/structured-logging/structured-logging.slide#1), -a talk by [Chris Hines](https://github.com/ChrisHines). -Also, please see -[#63](https://github.com/go-kit/kit/issues/63), -[#76](https://github.com/go-kit/kit/pull/76), -[#131](https://github.com/go-kit/kit/issues/131), -[#157](https://github.com/go-kit/kit/pull/157), -[#164](https://github.com/go-kit/kit/issues/164), and -[#252](https://github.com/go-kit/kit/pull/252) -to review historical conversations about package log and the Logger interface. - -Value-add packages and suggestions, -like improvements to [the leveled logger](https://godoc.org/github.com/go-kit/kit/log/level), -are of course welcome. Good proposals should - -- Be composable with [contextual loggers](https://godoc.org/github.com/go-kit/kit/log#With), -- Not break the behavior of [log.Caller](https://godoc.org/github.com/go-kit/kit/log#Caller) in any wrapped contextual loggers, and -- Be friendly to packages that accept only an unadorned log.Logger. - -## Benchmarks & comparisons - -There are a few Go logging benchmarks and comparisons that include Go kit's package log. - -- [imkira/go-loggers-bench](https://github.com/imkira/go-loggers-bench) includes kit/log -- [uber-common/zap](https://github.com/uber-common/zap), a zero-alloc logging library, includes a comparison with kit/log diff --git a/vendor/github.com/go-kit/kit/log/benchmark_test.go b/vendor/github.com/go-kit/kit/log/benchmark_test.go deleted file mode 100644 index 126bfa5a..00000000 --- a/vendor/github.com/go-kit/kit/log/benchmark_test.go +++ /dev/null @@ -1,21 +0,0 @@ -package log_test - -import ( - "testing" - - "github.com/go-kit/kit/log" -) - -func benchmarkRunner(b *testing.B, logger log.Logger, f func(log.Logger)) { - lc := log.With(logger, "common_key", "common_value") - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - f(lc) - } -} - -var ( - baseMessage = func(logger log.Logger) { logger.Log("foo_key", "foo_value") } - withMessage = func(logger log.Logger) { log.With(logger, "a", "b").Log("c", "d") } -) diff --git a/vendor/github.com/go-kit/kit/log/concurrency_test.go b/vendor/github.com/go-kit/kit/log/concurrency_test.go deleted file mode 100644 index 95a749e7..00000000 --- a/vendor/github.com/go-kit/kit/log/concurrency_test.go +++ /dev/null @@ -1,40 +0,0 @@ -package log_test - -import ( - "math" - "testing" - - "github.com/go-kit/kit/log" -) - -// These test are designed to be run with the race detector. - -func testConcurrency(t *testing.T, logger log.Logger, total int) { - n := int(math.Sqrt(float64(total))) - share := total / n - - errC := make(chan error, n) - - for i := 0; i < n; i++ { - go func() { - errC <- spam(logger, share) - }() - } - - for i := 0; i < n; i++ { - err := <-errC - if err != nil { - t.Fatalf("concurrent logging error: %v", err) - } - } -} - -func spam(logger log.Logger, count int) error { - for i := 0; i < count; i++ { - err := logger.Log("key", i) - if err != nil { - return err - } - } - return nil -} diff --git a/vendor/github.com/go-kit/kit/log/deprecated_levels/levels.go b/vendor/github.com/go-kit/kit/log/deprecated_levels/levels.go deleted file mode 100644 index a0342127..00000000 --- a/vendor/github.com/go-kit/kit/log/deprecated_levels/levels.go +++ /dev/null @@ -1,127 +0,0 @@ -package levels - -import "github.com/go-kit/kit/log" - -// Levels provides a leveled logging wrapper around a logger. It has five -// levels: debug, info, warning (warn), error, and critical (crit). If you -// want a different set of levels, you can create your own levels type very -// easily, and you can elide the configuration. -type Levels struct { - logger log.Logger - levelKey string - - // We have a choice between storing level values in string fields or - // making a separate context for each level. When using string fields the - // Log method must combine the base context, the level data, and the - // logged keyvals; but the With method only requires updating one context. - // If we instead keep a separate context for each level the Log method - // must only append the new keyvals; but the With method would have to - // update all five contexts. - - // Roughly speaking, storing multiple contexts breaks even if the ratio of - // Log/With calls is more than the number of levels. We have chosen to - // make the With method cheap and the Log method a bit more costly because - // we do not expect most applications to Log more than five times for each - // call to With. - - debugValue string - infoValue string - warnValue string - errorValue string - critValue string -} - -// New creates a new leveled logger, wrapping the passed logger. -func New(logger log.Logger, options ...Option) Levels { - l := Levels{ - logger: logger, - levelKey: "level", - - debugValue: "debug", - infoValue: "info", - warnValue: "warn", - errorValue: "error", - critValue: "crit", - } - for _, option := range options { - option(&l) - } - return l -} - -// With returns a new leveled logger that includes keyvals in all log events. -func (l Levels) With(keyvals ...interface{}) Levels { - return Levels{ - logger: log.With(l.logger, keyvals...), - levelKey: l.levelKey, - debugValue: l.debugValue, - infoValue: l.infoValue, - warnValue: l.warnValue, - errorValue: l.errorValue, - critValue: l.critValue, - } -} - -// Debug returns a debug level logger. -func (l Levels) Debug() log.Logger { - return log.WithPrefix(l.logger, l.levelKey, l.debugValue) -} - -// Info returns an info level logger. -func (l Levels) Info() log.Logger { - return log.WithPrefix(l.logger, l.levelKey, l.infoValue) -} - -// Warn returns a warning level logger. -func (l Levels) Warn() log.Logger { - return log.WithPrefix(l.logger, l.levelKey, l.warnValue) -} - -// Error returns an error level logger. -func (l Levels) Error() log.Logger { - return log.WithPrefix(l.logger, l.levelKey, l.errorValue) -} - -// Crit returns a critical level logger. -func (l Levels) Crit() log.Logger { - return log.WithPrefix(l.logger, l.levelKey, l.critValue) -} - -// Option sets a parameter for leveled loggers. -type Option func(*Levels) - -// Key sets the key for the field used to indicate log level. By default, -// the key is "level". -func Key(key string) Option { - return func(l *Levels) { l.levelKey = key } -} - -// DebugValue sets the value for the field used to indicate the debug log -// level. By default, the value is "debug". -func DebugValue(value string) Option { - return func(l *Levels) { l.debugValue = value } -} - -// InfoValue sets the value for the field used to indicate the info log level. -// By default, the value is "info". -func InfoValue(value string) Option { - return func(l *Levels) { l.infoValue = value } -} - -// WarnValue sets the value for the field used to indicate the warning log -// level. By default, the value is "warn". -func WarnValue(value string) Option { - return func(l *Levels) { l.warnValue = value } -} - -// ErrorValue sets the value for the field used to indicate the error log -// level. By default, the value is "error". -func ErrorValue(value string) Option { - return func(l *Levels) { l.errorValue = value } -} - -// CritValue sets the value for the field used to indicate the critical log -// level. By default, the value is "crit". -func CritValue(value string) Option { - return func(l *Levels) { l.critValue = value } -} diff --git a/vendor/github.com/go-kit/kit/log/deprecated_levels/levels_test.go b/vendor/github.com/go-kit/kit/log/deprecated_levels/levels_test.go deleted file mode 100644 index 8d4a7f55..00000000 --- a/vendor/github.com/go-kit/kit/log/deprecated_levels/levels_test.go +++ /dev/null @@ -1,65 +0,0 @@ -package levels_test - -import ( - "bytes" - "os" - "testing" - - "github.com/go-kit/kit/log" - levels "github.com/go-kit/kit/log/deprecated_levels" -) - -func TestDefaultLevels(t *testing.T) { - buf := bytes.Buffer{} - logger := levels.New(log.NewLogfmtLogger(&buf)) - - logger.Debug().Log("msg", "résumé") // of course you'd want to do this - if want, have := "level=debug msg=résumé\n", buf.String(); want != have { - t.Errorf("want %#v, have %#v", want, have) - } - - buf.Reset() - logger.Info().Log("msg", "Åhus") - if want, have := "level=info msg=Åhus\n", buf.String(); want != have { - t.Errorf("want %#v, have %#v", want, have) - } - - buf.Reset() - logger.Error().Log("msg", "© violation") - if want, have := "level=error msg=\"© violation\"\n", buf.String(); want != have { - t.Errorf("want %#v, have %#v", want, have) - } - - buf.Reset() - logger.Crit().Log("msg", " ") - if want, have := "level=crit msg=\"\\t\"\n", buf.String(); want != have { - t.Errorf("want %#v, have %#v", want, have) - } -} - -func TestModifiedLevels(t *testing.T) { - buf := bytes.Buffer{} - logger := levels.New( - log.NewJSONLogger(&buf), - levels.Key("l"), - levels.DebugValue("dbg"), - levels.InfoValue("nfo"), - levels.WarnValue("wrn"), - levels.ErrorValue("err"), - levels.CritValue("crt"), - ) - logger.With("easter_island", "176°").Debug().Log("msg", "moai") - if want, have := `{"easter_island":"176°","l":"dbg","msg":"moai"}`+"\n", buf.String(); want != have { - t.Errorf("want %#v, have %#v", want, have) - } -} - -func ExampleLevels() { - logger := levels.New(log.NewLogfmtLogger(os.Stdout)) - logger.Debug().Log("msg", "hello") - logger.With("context", "foo").Warn().Log("err", "error") - - // Output: - // level=debug msg=hello - // level=warn context=foo err=error -} diff --git a/vendor/github.com/go-kit/kit/log/doc.go b/vendor/github.com/go-kit/kit/log/doc.go deleted file mode 100644 index 918c0af4..00000000 --- a/vendor/github.com/go-kit/kit/log/doc.go +++ /dev/null @@ -1,116 +0,0 @@ -// Package log provides a structured logger. -// -// Structured logging produces logs easily consumed later by humans or -// machines. Humans might be interested in debugging errors, or tracing -// specific requests. Machines might be interested in counting interesting -// events, or aggregating information for off-line processing. In both cases, -// it is important that the log messages are structured and actionable. -// Package log is designed to encourage both of these best practices. -// -// Basic Usage -// -// The fundamental interface is Logger. Loggers create log events from -// key/value data. The Logger interface has a single method, Log, which -// accepts a sequence of alternating key/value pairs, which this package names -// keyvals. -// -// type Logger interface { -// Log(keyvals ...interface{}) error -// } -// -// Here is an example of a function using a Logger to create log events. -// -// func RunTask(task Task, logger log.Logger) string { -// logger.Log("taskID", task.ID, "event", "starting task") -// ... -// logger.Log("taskID", task.ID, "event", "task complete") -// } -// -// The keys in the above example are "taskID" and "event". The values are -// task.ID, "starting task", and "task complete". Every key is followed -// immediately by its value. -// -// Keys are usually plain strings. Values may be any type that has a sensible -// encoding in the chosen log format. With structured logging it is a good -// idea to log simple values without formatting them. This practice allows -// the chosen logger to encode values in the most appropriate way. -// -// Contextual Loggers -// -// A contextual logger stores keyvals that it includes in all log events. -// Building appropriate contextual loggers reduces repetition and aids -// consistency in the resulting log output. With and WithPrefix add context to -// a logger. We can use With to improve the RunTask example. -// -// func RunTask(task Task, logger log.Logger) string { -// logger = log.With(logger, "taskID", task.ID) -// logger.Log("event", "starting task") -// ... -// taskHelper(task.Cmd, logger) -// ... -// logger.Log("event", "task complete") -// } -// -// The improved version emits the same log events as the original for the -// first and last calls to Log. Passing the contextual logger to taskHelper -// enables each log event created by taskHelper to include the task.ID even -// though taskHelper does not have access to that value. Using contextual -// loggers this way simplifies producing log output that enables tracing the -// life cycle of individual tasks. (See the Contextual example for the full -// code of the above snippet.) -// -// Dynamic Contextual Values -// -// A Valuer function stored in a contextual logger generates a new value each -// time an event is logged. The Valuer example demonstrates how this feature -// works. -// -// Valuers provide the basis for consistently logging timestamps and source -// code location. The log package defines several valuers for that purpose. -// See Timestamp, DefaultTimestamp, DefaultTimestampUTC, Caller, and -// DefaultCaller. A common logger initialization sequence that ensures all log -// entries contain a timestamp and source location looks like this: -// -// logger := log.NewLogfmtLogger(log.NewSyncWriter(os.Stdout)) -// logger = log.With(logger, "ts", log.DefaultTimestampUTC, "caller", log.DefaultCaller) -// -// Concurrent Safety -// -// Applications with multiple goroutines want each log event written to the -// same logger to remain separate from other log events. Package log provides -// two simple solutions for concurrent safe logging. -// -// NewSyncWriter wraps an io.Writer and serializes each call to its Write -// method. Using a SyncWriter has the benefit that the smallest practical -// portion of the logging logic is performed within a mutex, but it requires -// the formatting Logger to make only one call to Write per log event. -// -// NewSyncLogger wraps any Logger and serializes each call to its Log method. -// Using a SyncLogger has the benefit that it guarantees each log event is -// handled atomically within the wrapped logger, but it typically serializes -// both the formatting and output logic. Use a SyncLogger if the formatting -// logger may perform multiple writes per log event. -// -// Error Handling -// -// This package relies on the practice of wrapping or decorating loggers with -// other loggers to provide composable pieces of functionality. It also means -// that Logger.Log must return an error because some -// implementations—especially those that output log data to an io.Writer—may -// encounter errors that cannot be handled locally. This in turn means that -// Loggers that wrap other loggers should return errors from the wrapped -// logger up the stack. -// -// Fortunately, the decorator pattern also provides a way to avoid the -// necessity to check for errors every time an application calls Logger.Log. -// An application required to panic whenever its Logger encounters -// an error could initialize its logger as follows. -// -// fmtlogger := log.NewLogfmtLogger(log.NewSyncWriter(os.Stdout)) -// logger := log.LoggerFunc(func(keyvals ...interface{}) error { -// if err := fmtlogger.Log(keyvals...); err != nil { -// panic(err) -// } -// return nil -// }) -package log diff --git a/vendor/github.com/go-kit/kit/log/example_test.go b/vendor/github.com/go-kit/kit/log/example_test.go deleted file mode 100644 index 97667748..00000000 --- a/vendor/github.com/go-kit/kit/log/example_test.go +++ /dev/null @@ -1,137 +0,0 @@ -package log_test - -import ( - "math/rand" - "os" - "sync" - "time" - - "github.com/go-kit/kit/log" -) - -func Example_basic() { - logger := log.NewLogfmtLogger(os.Stdout) - - type Task struct { - ID int - } - - RunTask := func(task Task, logger log.Logger) { - logger.Log("taskID", task.ID, "event", "starting task") - - logger.Log("taskID", task.ID, "event", "task complete") - } - - RunTask(Task{ID: 1}, logger) - - // Output: - // taskID=1 event="starting task" - // taskID=1 event="task complete" -} - -func Example_contextual() { - logger := log.NewLogfmtLogger(os.Stdout) - - type Task struct { - ID int - Cmd string - } - - taskHelper := func(cmd string, logger log.Logger) { - // execute(cmd) - logger.Log("cmd", cmd, "dur", 42*time.Millisecond) - } - - RunTask := func(task Task, logger log.Logger) { - logger = log.With(logger, "taskID", task.ID) - logger.Log("event", "starting task") - - taskHelper(task.Cmd, logger) - - logger.Log("event", "task complete") - } - - RunTask(Task{ID: 1, Cmd: "echo Hello, world!"}, logger) - - // Output: - // taskID=1 event="starting task" - // taskID=1 cmd="echo Hello, world!" dur=42ms - // taskID=1 event="task complete" -} - -func Example_valuer() { - logger := log.NewLogfmtLogger(os.Stdout) - - count := 0 - counter := func() interface{} { - count++ - return count - } - - logger = log.With(logger, "count", log.Valuer(counter)) - - logger.Log("call", "first") - logger.Log("call", "second") - - // Output: - // count=1 call=first - // count=2 call=second -} - -func Example_debugInfo() { - logger := log.NewLogfmtLogger(os.Stdout) - - // make time predictable for this test - baseTime := time.Date(2015, time.February, 3, 10, 0, 0, 0, time.UTC) - mockTime := func() time.Time { - baseTime = baseTime.Add(time.Second) - return baseTime - } - - logger = log.With(logger, "time", log.Timestamp(mockTime), "caller", log.DefaultCaller) - - logger.Log("call", "first") - logger.Log("call", "second") - - // ... - - logger.Log("call", "third") - - // Output: - // time=2015-02-03T10:00:01Z caller=example_test.go:93 call=first - // time=2015-02-03T10:00:02Z caller=example_test.go:94 call=second - // time=2015-02-03T10:00:03Z caller=example_test.go:98 call=third -} - -func Example_syncWriter() { - w := log.NewSyncWriter(os.Stdout) - logger := log.NewLogfmtLogger(w) - - type Task struct { - ID int - } - - var wg sync.WaitGroup - - RunTask := func(task Task, logger log.Logger) { - logger.Log("taskID", task.ID, "event", "starting task") - - time.Sleep(time.Duration(rand.Intn(200)) * time.Millisecond) - - logger.Log("taskID", task.ID, "event", "task complete") - wg.Done() - } - - wg.Add(2) - - go RunTask(Task{ID: 1}, logger) - go RunTask(Task{ID: 2}, logger) - - wg.Wait() - - // Unordered output: - // taskID=1 event="starting task" - // taskID=2 event="starting task" - // taskID=1 event="task complete" - // taskID=2 event="task complete" -} diff --git a/vendor/github.com/go-kit/kit/log/json_logger.go b/vendor/github.com/go-kit/kit/log/json_logger.go deleted file mode 100644 index 66094b4d..00000000 --- a/vendor/github.com/go-kit/kit/log/json_logger.go +++ /dev/null @@ -1,89 +0,0 @@ -package log - -import ( - "encoding" - "encoding/json" - "fmt" - "io" - "reflect" -) - -type jsonLogger struct { - io.Writer -} - -// NewJSONLogger returns a Logger that encodes keyvals to the Writer as a -// single JSON object. Each log event produces no more than one call to -// w.Write. The passed Writer must be safe for concurrent use by multiple -// goroutines if the returned Logger will be used concurrently. -func NewJSONLogger(w io.Writer) Logger { - return &jsonLogger{w} -} - -func (l *jsonLogger) Log(keyvals ...interface{}) error { - n := (len(keyvals) + 1) / 2 // +1 to handle case when len is odd - m := make(map[string]interface{}, n) - for i := 0; i < len(keyvals); i += 2 { - k := keyvals[i] - var v interface{} = ErrMissingValue - if i+1 < len(keyvals) { - v = keyvals[i+1] - } - merge(m, k, v) - } - return json.NewEncoder(l.Writer).Encode(m) -} - -func merge(dst map[string]interface{}, k, v interface{}) { - var key string - switch x := k.(type) { - case string: - key = x - case fmt.Stringer: - key = safeString(x) - default: - key = fmt.Sprint(x) - } - - // We want json.Marshaler and encoding.TextMarshaller to take priority over - // err.Error() and v.String(). But json.Marshall (called later) does that by - // default so we force a no-op if it's one of those 2 case. - switch x := v.(type) { - case json.Marshaler: - case encoding.TextMarshaler: - case error: - v = safeError(x) - case fmt.Stringer: - v = safeString(x) - } - - dst[key] = v -} - -func safeString(str fmt.Stringer) (s string) { - defer func() { - if panicVal := recover(); panicVal != nil { - if v := reflect.ValueOf(str); v.Kind() == reflect.Ptr && v.IsNil() { - s = "NULL" - } else { - panic(panicVal) - } - } - }() - s = str.String() - return -} - -func safeError(err error) (s interface{}) { - defer func() { - if panicVal := recover(); panicVal != nil { - if v := reflect.ValueOf(err); v.Kind() == reflect.Ptr && v.IsNil() { - s = nil - } else { - panic(panicVal) - } - } - }() - s = err.Error() - return -} diff --git a/vendor/github.com/go-kit/kit/log/json_logger_test.go b/vendor/github.com/go-kit/kit/log/json_logger_test.go deleted file mode 100644 index e3e30909..00000000 --- a/vendor/github.com/go-kit/kit/log/json_logger_test.go +++ /dev/null @@ -1,162 +0,0 @@ -package log_test - -import ( - "bytes" - "errors" - "io/ioutil" - "testing" - - "github.com/go-kit/kit/log" -) - -func TestJSONLoggerCaller(t *testing.T) { - t.Parallel() - buf := &bytes.Buffer{} - logger := log.NewJSONLogger(buf) - logger = log.With(logger, "caller", log.DefaultCaller) - - if err := logger.Log(); err != nil { - t.Fatal(err) - } - if want, have := `{"caller":"json_logger_test.go:18"}`+"\n", buf.String(); want != have { - t.Errorf("\nwant %#v\nhave %#v", want, have) - } -} - -func TestJSONLogger(t *testing.T) { - t.Parallel() - buf := &bytes.Buffer{} - logger := log.NewJSONLogger(buf) - if err := logger.Log("err", errors.New("err"), "m", map[string]int{"0": 0}, "a", []int{1, 2, 3}); err != nil { - t.Fatal(err) - } - if want, have := `{"a":[1,2,3],"err":"err","m":{"0":0}}`+"\n", buf.String(); want != have { - t.Errorf("\nwant %#v\nhave %#v", want, have) - } -} - -func TestJSONLoggerMissingValue(t *testing.T) { - t.Parallel() - buf := &bytes.Buffer{} - logger := log.NewJSONLogger(buf) - if err := logger.Log("k"); err != nil { - t.Fatal(err) - } - if want, have := `{"k":"(MISSING)"}`+"\n", buf.String(); want != have { - t.Errorf("\nwant %#v\nhave %#v", want, have) - } -} - -func TestJSONLoggerNilStringerKey(t *testing.T) { - t.Parallel() - - buf := &bytes.Buffer{} - logger := log.NewJSONLogger(buf) - if err := logger.Log((*stringer)(nil), "v"); err != nil { - t.Fatal(err) - } - if want, have := `{"NULL":"v"}`+"\n", buf.String(); want != have { - t.Errorf("\nwant %#v\nhave %#v", want, have) - } -} - -func TestJSONLoggerNilErrorValue(t *testing.T) { - t.Parallel() - - buf := &bytes.Buffer{} - logger := log.NewJSONLogger(buf) - if err := logger.Log("err", (*stringError)(nil)); err != nil { - t.Fatal(err) - } - if want, have := `{"err":null}`+"\n", buf.String(); want != have { - t.Errorf("\nwant %#v\nhave %#v", want, have) - } -} - -// aller implements json.Marshaler, encoding.TextMarshaler, and fmt.Stringer. -type aller struct{} - -func (aller) MarshalJSON() ([]byte, error) { - return []byte("\"json\""), nil -} - -func (aller) MarshalText() ([]byte, error) { - return []byte("text"), nil -} - -func (aller) String() string { - return "string" -} - -func (aller) Error() string { - return "error" -} - -// textstringer implements encoding.TextMarshaler and fmt.Stringer. -type textstringer struct{} - -func (textstringer) MarshalText() ([]byte, error) { - return []byte("text"), nil -} - -func (textstringer) String() string { - return "string" -} - -func TestJSONLoggerStringValue(t *testing.T) { - t.Parallel() - tests := []struct { - v interface{} - expected string - }{ - { - v: aller{}, - expected: `{"v":"json"}`, - }, - { - v: textstringer{}, - expected: `{"v":"text"}`, - }, - { - v: stringer("string"), - expected: `{"v":"string"}`, - }, - } - - for _, test := range tests { - buf := &bytes.Buffer{} - logger := log.NewJSONLogger(buf) - if err := logger.Log("v", test.v); err != nil { - t.Fatal(err) - } - - if want, have := test.expected+"\n", buf.String(); want != have { - t.Errorf("\nwant %#v\nhave %#v", want, have) - } - } -} - -type stringer string - -func (s stringer) String() string { - return string(s) -} - -type stringError string - -func (s stringError) Error() string { - return string(s) -} - -func BenchmarkJSONLoggerSimple(b *testing.B) { - benchmarkRunner(b, log.NewJSONLogger(ioutil.Discard), baseMessage) -} - -func BenchmarkJSONLoggerContextual(b *testing.B) { - benchmarkRunner(b, log.NewJSONLogger(ioutil.Discard), withMessage) -} - -func TestJSONLoggerConcurrency(t *testing.T) { - t.Parallel() - testConcurrency(t, log.NewJSONLogger(ioutil.Discard), 10000) -} diff --git a/vendor/github.com/go-kit/kit/log/level/benchmark_test.go b/vendor/github.com/go-kit/kit/log/level/benchmark_test.go deleted file mode 100644 index 4fca6f08..00000000 --- a/vendor/github.com/go-kit/kit/log/level/benchmark_test.go +++ /dev/null @@ -1,72 +0,0 @@ -package level_test - -import ( - "io/ioutil" - "testing" - - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/log/level" -) - -func Benchmark(b *testing.B) { - contexts := []struct { - name string - context func(log.Logger) log.Logger - }{ - {"NoContext", func(l log.Logger) log.Logger { - return l - }}, - {"TimeContext", func(l log.Logger) log.Logger { - return log.With(l, "time", log.DefaultTimestampUTC) - }}, - {"CallerContext", func(l log.Logger) log.Logger { - return log.With(l, "caller", log.DefaultCaller) - }}, - {"TimeCallerReqIDContext", func(l log.Logger) log.Logger { - return log.With(l, "time", log.DefaultTimestampUTC, "caller", log.DefaultCaller, "reqID", 29) - }}, - } - - loggers := []struct { - name string - logger log.Logger - }{ - {"Nop", log.NewNopLogger()}, - {"Logfmt", log.NewLogfmtLogger(ioutil.Discard)}, - {"JSON", log.NewJSONLogger(ioutil.Discard)}, - } - - filters := []struct { - name string - filter func(log.Logger) log.Logger - }{ - {"Baseline", func(l log.Logger) log.Logger { - return l - }}, - {"DisallowedLevel", func(l log.Logger) log.Logger { - return level.NewFilter(l, level.AllowInfo()) - }}, - {"AllowedLevel", func(l log.Logger) log.Logger { - return level.NewFilter(l, level.AllowAll()) - }}, - } - - for _, c := range contexts { - b.Run(c.name, func(b *testing.B) { - for _, f := range filters { - b.Run(f.name, func(b *testing.B) { - for _, l := range loggers { - b.Run(l.name, func(b *testing.B) { - logger := c.context(f.filter(l.logger)) - b.ResetTimer() - b.ReportAllocs() - for i := 0; i < b.N; i++ { - level.Debug(logger).Log("foo", "bar") - } - }) - } - }) - } - }) - } -} diff --git a/vendor/github.com/go-kit/kit/log/level/doc.go b/vendor/github.com/go-kit/kit/log/level/doc.go deleted file mode 100644 index 5e9df7fa..00000000 --- a/vendor/github.com/go-kit/kit/log/level/doc.go +++ /dev/null @@ -1,22 +0,0 @@ -// Package level implements leveled logging on top of package log. To use the -// level package, create a logger as per normal in your func main, and wrap it -// with level.NewFilter. -// -// var logger log.Logger -// logger = log.NewLogfmtLogger(os.Stderr) -// logger = level.NewFilter(logger, level.AllowInfoAndAbove()) // <-- -// logger = log.With(logger, "ts", log.DefaultTimestampUTC) -// -// Then, at the callsites, use one of the level.Debug, Info, Warn, or Error -// helper methods to emit leveled log events. -// -// logger.Log("foo", "bar") // as normal, no level -// level.Debug(logger).Log("request_id", reqID, "trace_data", trace.Get()) -// if value > 100 { -// level.Error(logger).Log("value", value) -// } -// -// NewFilter allows precise control over what happens when a log event is -// emitted without a level key, or if a squelched level is used. Check the -// Option functions for details. -package level diff --git a/vendor/github.com/go-kit/kit/log/level/example_test.go b/vendor/github.com/go-kit/kit/log/level/example_test.go deleted file mode 100644 index fed52e51..00000000 --- a/vendor/github.com/go-kit/kit/log/level/example_test.go +++ /dev/null @@ -1,25 +0,0 @@ -package level_test - -import ( - "errors" - "os" - - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/log/level" -) - -func Example_basic() { - // setup logger with level filter - logger := log.NewLogfmtLogger(os.Stdout) - logger = level.NewFilter(logger, level.AllowInfo()) - logger = log.With(logger, "caller", log.DefaultCaller) - - // use level helpers to log at different levels - level.Error(logger).Log("err", errors.New("bad data")) - level.Info(logger).Log("event", "data saved") - level.Debug(logger).Log("next item", 17) // filtered - - // Output: - // level=error caller=example_test.go:18 err="bad data" - // level=info caller=example_test.go:19 event="data saved" -} diff --git a/vendor/github.com/go-kit/kit/log/level/level.go b/vendor/github.com/go-kit/kit/log/level/level.go deleted file mode 100644 index 6833b0dc..00000000 --- a/vendor/github.com/go-kit/kit/log/level/level.go +++ /dev/null @@ -1,205 +0,0 @@ -package level - -import "github.com/go-kit/kit/log" - -// Error returns a logger that includes a Key/ErrorValue pair. -func Error(logger log.Logger) log.Logger { - return log.WithPrefix(logger, Key(), ErrorValue()) -} - -// Warn returns a logger that includes a Key/WarnValue pair. -func Warn(logger log.Logger) log.Logger { - return log.WithPrefix(logger, Key(), WarnValue()) -} - -// Info returns a logger that includes a Key/InfoValue pair. -func Info(logger log.Logger) log.Logger { - return log.WithPrefix(logger, Key(), InfoValue()) -} - -// Debug returns a logger that includes a Key/DebugValue pair. -func Debug(logger log.Logger) log.Logger { - return log.WithPrefix(logger, Key(), DebugValue()) -} - -// NewFilter wraps next and implements level filtering. See the commentary on -// the Option functions for a detailed description of how to configure levels. -// If no options are provided, all leveled log events created with Debug, -// Info, Warn or Error helper methods are squelched and non-leveled log -// events are passed to next unmodified. -func NewFilter(next log.Logger, options ...Option) log.Logger { - l := &logger{ - next: next, - } - for _, option := range options { - option(l) - } - return l -} - -type logger struct { - next log.Logger - allowed level - squelchNoLevel bool - errNotAllowed error - errNoLevel error -} - -func (l *logger) Log(keyvals ...interface{}) error { - var hasLevel, levelAllowed bool - for i := 1; i < len(keyvals); i += 2 { - if v, ok := keyvals[i].(*levelValue); ok { - hasLevel = true - levelAllowed = l.allowed&v.level != 0 - break - } - } - if !hasLevel && l.squelchNoLevel { - return l.errNoLevel - } - if hasLevel && !levelAllowed { - return l.errNotAllowed - } - return l.next.Log(keyvals...) -} - -// Option sets a parameter for the leveled logger. -type Option func(*logger) - -// AllowAll is an alias for AllowDebug. -func AllowAll() Option { - return AllowDebug() -} - -// AllowDebug allows error, warn, info and debug level log events to pass. -func AllowDebug() Option { - return allowed(levelError | levelWarn | levelInfo | levelDebug) -} - -// AllowInfo allows error, warn and info level log events to pass. -func AllowInfo() Option { - return allowed(levelError | levelWarn | levelInfo) -} - -// AllowWarn allows error and warn level log events to pass. -func AllowWarn() Option { - return allowed(levelError | levelWarn) -} - -// AllowError allows only error level log events to pass. -func AllowError() Option { - return allowed(levelError) -} - -// AllowNone allows no leveled log events to pass. -func AllowNone() Option { - return allowed(0) -} - -func allowed(allowed level) Option { - return func(l *logger) { l.allowed = allowed } -} - -// ErrNotAllowed sets the error to return from Log when it squelches a log -// event disallowed by the configured Allow[Level] option. By default, -// ErrNotAllowed is nil; in this case the log event is squelched with no -// error. -func ErrNotAllowed(err error) Option { - return func(l *logger) { l.errNotAllowed = err } -} - -// SquelchNoLevel instructs Log to squelch log events with no level, so that -// they don't proceed through to the wrapped logger. If SquelchNoLevel is set -// to true and a log event is squelched in this way, the error value -// configured with ErrNoLevel is returned to the caller. -func SquelchNoLevel(squelch bool) Option { - return func(l *logger) { l.squelchNoLevel = squelch } -} - -// ErrNoLevel sets the error to return from Log when it squelches a log event -// with no level. By default, ErrNoLevel is nil; in this case the log event is -// squelched with no error. -func ErrNoLevel(err error) Option { - return func(l *logger) { l.errNoLevel = err } -} - -// NewInjector wraps next and returns a logger that adds a Key/level pair to -// the beginning of log events that don't already contain a level. In effect, -// this gives a default level to logs without a level. -func NewInjector(next log.Logger, level Value) log.Logger { - return &injector{ - next: next, - level: level, - } -} - -type injector struct { - next log.Logger - level interface{} -} - -func (l *injector) Log(keyvals ...interface{}) error { - for i := 1; i < len(keyvals); i += 2 { - if _, ok := keyvals[i].(*levelValue); ok { - return l.next.Log(keyvals...) - } - } - kvs := make([]interface{}, len(keyvals)+2) - kvs[0], kvs[1] = key, l.level - copy(kvs[2:], keyvals) - return l.next.Log(kvs...) -} - -// Value is the interface that each of the canonical level values implement. -// It contains unexported methods that prevent types from other packages from -// implementing it and guaranteeing that NewFilter can distinguish the levels -// defined in this package from all other values. -type Value interface { - String() string - levelVal() -} - -// Key returns the unique key added to log events by the loggers in this -// package. -func Key() interface{} { return key } - -// ErrorValue returns the unique value added to log events by Error. -func ErrorValue() Value { return errorValue } - -// WarnValue returns the unique value added to log events by Warn. -func WarnValue() Value { return warnValue } - -// InfoValue returns the unique value added to log events by Info. -func InfoValue() Value { return infoValue } - -// DebugValue returns the unique value added to log events by Warn. -func DebugValue() Value { return debugValue } - -var ( - // key is of type interfae{} so that it allocates once during package - // initialization and avoids allocating every type the value is added to a - // []interface{} later. - key interface{} = "level" - - errorValue = &levelValue{level: levelError, name: "error"} - warnValue = &levelValue{level: levelWarn, name: "warn"} - infoValue = &levelValue{level: levelInfo, name: "info"} - debugValue = &levelValue{level: levelDebug, name: "debug"} -) - -type level byte - -const ( - levelDebug level = 1 << iota - levelInfo - levelWarn - levelError -) - -type levelValue struct { - name string - level -} - -func (v *levelValue) String() string { return v.name } -func (v *levelValue) levelVal() {} diff --git a/vendor/github.com/go-kit/kit/log/level/level_test.go b/vendor/github.com/go-kit/kit/log/level/level_test.go deleted file mode 100644 index e362effc..00000000 --- a/vendor/github.com/go-kit/kit/log/level/level_test.go +++ /dev/null @@ -1,235 +0,0 @@ -package level_test - -import ( - "bytes" - "errors" - "io" - "strings" - "testing" - - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/log/level" -) - -func TestVariousLevels(t *testing.T) { - testCases := []struct { - name string - allowed level.Option - want string - }{ - { - "AllowAll", - level.AllowAll(), - strings.Join([]string{ - `{"level":"debug","this is":"debug log"}`, - `{"level":"info","this is":"info log"}`, - `{"level":"warn","this is":"warn log"}`, - `{"level":"error","this is":"error log"}`, - }, "\n"), - }, - { - "AllowDebug", - level.AllowDebug(), - strings.Join([]string{ - `{"level":"debug","this is":"debug log"}`, - `{"level":"info","this is":"info log"}`, - `{"level":"warn","this is":"warn log"}`, - `{"level":"error","this is":"error log"}`, - }, "\n"), - }, - { - "AllowInfo", - level.AllowInfo(), - strings.Join([]string{ - `{"level":"info","this is":"info log"}`, - `{"level":"warn","this is":"warn log"}`, - `{"level":"error","this is":"error log"}`, - }, "\n"), - }, - { - "AllowWarn", - level.AllowWarn(), - strings.Join([]string{ - `{"level":"warn","this is":"warn log"}`, - `{"level":"error","this is":"error log"}`, - }, "\n"), - }, - { - "AllowError", - level.AllowError(), - strings.Join([]string{ - `{"level":"error","this is":"error log"}`, - }, "\n"), - }, - { - "AllowNone", - level.AllowNone(), - ``, - }, - } - - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - var buf bytes.Buffer - logger := level.NewFilter(log.NewJSONLogger(&buf), tc.allowed) - - level.Debug(logger).Log("this is", "debug log") - level.Info(logger).Log("this is", "info log") - level.Warn(logger).Log("this is", "warn log") - level.Error(logger).Log("this is", "error log") - - if want, have := tc.want, strings.TrimSpace(buf.String()); want != have { - t.Errorf("\nwant:\n%s\nhave:\n%s", want, have) - } - }) - } -} - -func TestErrNotAllowed(t *testing.T) { - myError := errors.New("squelched!") - opts := []level.Option{ - level.AllowWarn(), - level.ErrNotAllowed(myError), - } - logger := level.NewFilter(log.NewNopLogger(), opts...) - - if want, have := myError, level.Info(logger).Log("foo", "bar"); want != have { - t.Errorf("want %#+v, have %#+v", want, have) - } - - if want, have := error(nil), level.Warn(logger).Log("foo", "bar"); want != have { - t.Errorf("want %#+v, have %#+v", want, have) - } -} - -func TestErrNoLevel(t *testing.T) { - myError := errors.New("no level specified") - - var buf bytes.Buffer - opts := []level.Option{ - level.SquelchNoLevel(true), - level.ErrNoLevel(myError), - } - logger := level.NewFilter(log.NewJSONLogger(&buf), opts...) - - if want, have := myError, logger.Log("foo", "bar"); want != have { - t.Errorf("want %v, have %v", want, have) - } - if want, have := ``, strings.TrimSpace(buf.String()); want != have { - t.Errorf("\nwant '%s'\nhave '%s'", want, have) - } -} - -func TestAllowNoLevel(t *testing.T) { - var buf bytes.Buffer - opts := []level.Option{ - level.SquelchNoLevel(false), - level.ErrNoLevel(errors.New("I should never be returned!")), - } - logger := level.NewFilter(log.NewJSONLogger(&buf), opts...) - - if want, have := error(nil), logger.Log("foo", "bar"); want != have { - t.Errorf("want %v, have %v", want, have) - } - if want, have := `{"foo":"bar"}`, strings.TrimSpace(buf.String()); want != have { - t.Errorf("\nwant '%s'\nhave '%s'", want, have) - } -} - -func TestLevelContext(t *testing.T) { - var buf bytes.Buffer - - // Wrapping the level logger with a context allows users to use - // log.DefaultCaller as per normal. - var logger log.Logger - logger = log.NewLogfmtLogger(&buf) - logger = level.NewFilter(logger, level.AllowAll()) - logger = log.With(logger, "caller", log.DefaultCaller) - - level.Info(logger).Log("foo", "bar") - if want, have := `level=info caller=level_test.go:149 foo=bar`, strings.TrimSpace(buf.String()); want != have { - t.Errorf("\nwant '%s'\nhave '%s'", want, have) - } -} - -func TestContextLevel(t *testing.T) { - var buf bytes.Buffer - - // Wrapping a context with the level logger still works, but requires users - // to specify a higher callstack depth value. - var logger log.Logger - logger = log.NewLogfmtLogger(&buf) - logger = log.With(logger, "caller", log.Caller(5)) - logger = level.NewFilter(logger, level.AllowAll()) - - level.Info(logger).Log("foo", "bar") - if want, have := `caller=level_test.go:165 level=info foo=bar`, strings.TrimSpace(buf.String()); want != have { - t.Errorf("\nwant '%s'\nhave '%s'", want, have) - } -} - -func TestLevelFormatting(t *testing.T) { - testCases := []struct { - name string - format func(io.Writer) log.Logger - output string - }{ - { - name: "logfmt", - format: log.NewLogfmtLogger, - output: `level=info foo=bar`, - }, - { - name: "JSON", - format: log.NewJSONLogger, - output: `{"foo":"bar","level":"info"}`, - }, - } - - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - var buf bytes.Buffer - - logger := tc.format(&buf) - level.Info(logger).Log("foo", "bar") - if want, have := tc.output, strings.TrimSpace(buf.String()); want != have { - t.Errorf("\nwant: '%s'\nhave '%s'", want, have) - } - }) - } -} - -func TestInjector(t *testing.T) { - var ( - output []interface{} - logger log.Logger - ) - - logger = log.LoggerFunc(func(keyvals ...interface{}) error { - output = keyvals - return nil - }) - logger = level.NewInjector(logger, level.InfoValue()) - - logger.Log("foo", "bar") - if got, want := len(output), 4; got != want { - t.Errorf("missing level not injected: got len==%d, want len==%d", got, want) - } - if got, want := output[0], level.Key(); got != want { - t.Errorf("wrong level key: got %#v, want %#v", got, want) - } - if got, want := output[1], level.InfoValue(); got != want { - t.Errorf("wrong level value: got %#v, want %#v", got, want) - } - - level.Error(logger).Log("foo", "bar") - if got, want := len(output), 4; got != want { - t.Errorf("leveled record modified: got len==%d, want len==%d", got, want) - } - if got, want := output[0], level.Key(); got != want { - t.Errorf("wrong level key: got %#v, want %#v", got, want) - } - if got, want := output[1], level.ErrorValue(); got != want { - t.Errorf("wrong level value: got %#v, want %#v", got, want) - } -} diff --git a/vendor/github.com/go-kit/kit/log/log.go b/vendor/github.com/go-kit/kit/log/log.go deleted file mode 100644 index 66a9e2fd..00000000 --- a/vendor/github.com/go-kit/kit/log/log.go +++ /dev/null @@ -1,135 +0,0 @@ -package log - -import "errors" - -// Logger is the fundamental interface for all log operations. Log creates a -// log event from keyvals, a variadic sequence of alternating keys and values. -// Implementations must be safe for concurrent use by multiple goroutines. In -// particular, any implementation of Logger that appends to keyvals or -// modifies or retains any of its elements must make a copy first. -type Logger interface { - Log(keyvals ...interface{}) error -} - -// ErrMissingValue is appended to keyvals slices with odd length to substitute -// the missing value. -var ErrMissingValue = errors.New("(MISSING)") - -// With returns a new contextual logger with keyvals prepended to those passed -// to calls to Log. If logger is also a contextual logger created by With or -// WithPrefix, keyvals is appended to the existing context. -// -// The returned Logger replaces all value elements (odd indexes) containing a -// Valuer with their generated value for each call to its Log method. -func With(logger Logger, keyvals ...interface{}) Logger { - if len(keyvals) == 0 { - return logger - } - l := newContext(logger) - kvs := append(l.keyvals, keyvals...) - if len(kvs)%2 != 0 { - kvs = append(kvs, ErrMissingValue) - } - return &context{ - logger: l.logger, - // Limiting the capacity of the stored keyvals ensures that a new - // backing array is created if the slice must grow in Log or With. - // Using the extra capacity without copying risks a data race that - // would violate the Logger interface contract. - keyvals: kvs[:len(kvs):len(kvs)], - hasValuer: l.hasValuer || containsValuer(keyvals), - } -} - -// WithPrefix returns a new contextual logger with keyvals prepended to those -// passed to calls to Log. If logger is also a contextual logger created by -// With or WithPrefix, keyvals is prepended to the existing context. -// -// The returned Logger replaces all value elements (odd indexes) containing a -// Valuer with their generated value for each call to its Log method. -func WithPrefix(logger Logger, keyvals ...interface{}) Logger { - if len(keyvals) == 0 { - return logger - } - l := newContext(logger) - // Limiting the capacity of the stored keyvals ensures that a new - // backing array is created if the slice must grow in Log or With. - // Using the extra capacity without copying risks a data race that - // would violate the Logger interface contract. - n := len(l.keyvals) + len(keyvals) - if len(keyvals)%2 != 0 { - n++ - } - kvs := make([]interface{}, 0, n) - kvs = append(kvs, keyvals...) - if len(kvs)%2 != 0 { - kvs = append(kvs, ErrMissingValue) - } - kvs = append(kvs, l.keyvals...) - return &context{ - logger: l.logger, - keyvals: kvs, - hasValuer: l.hasValuer || containsValuer(keyvals), - } -} - -// context is the Logger implementation returned by With and WithPrefix. It -// wraps a Logger and holds keyvals that it includes in all log events. Its -// Log method calls bindValues to generate values for each Valuer in the -// context keyvals. -// -// A context must always have the same number of stack frames between calls to -// its Log method and the eventual binding of Valuers to their value. This -// requirement comes from the functional requirement to allow a context to -// resolve application call site information for a Caller stored in the -// context. To do this we must be able to predict the number of logging -// functions on the stack when bindValues is called. -// -// Two implementation details provide the needed stack depth consistency. -// -// 1. newContext avoids introducing an additional layer when asked to -// wrap another context. -// 2. With and WithPrefix avoid introducing an additional layer by -// returning a newly constructed context with a merged keyvals rather -// than simply wrapping the existing context. -type context struct { - logger Logger - keyvals []interface{} - hasValuer bool -} - -func newContext(logger Logger) *context { - if c, ok := logger.(*context); ok { - return c - } - return &context{logger: logger} -} - -// Log replaces all value elements (odd indexes) containing a Valuer in the -// stored context with their generated value, appends keyvals, and passes the -// result to the wrapped Logger. -func (l *context) Log(keyvals ...interface{}) error { - kvs := append(l.keyvals, keyvals...) - if len(kvs)%2 != 0 { - kvs = append(kvs, ErrMissingValue) - } - if l.hasValuer { - // If no keyvals were appended above then we must copy l.keyvals so - // that future log events will reevaluate the stored Valuers. - if len(keyvals) == 0 { - kvs = append([]interface{}{}, l.keyvals...) - } - bindValues(kvs[:len(l.keyvals)]) - } - return l.logger.Log(kvs...) -} - -// LoggerFunc is an adapter to allow use of ordinary functions as Loggers. If -// f is a function with the appropriate signature, LoggerFunc(f) is a Logger -// object that calls f. -type LoggerFunc func(...interface{}) error - -// Log implements Logger by calling f(keyvals...). -func (f LoggerFunc) Log(keyvals ...interface{}) error { - return f(keyvals...) -} diff --git a/vendor/github.com/go-kit/kit/log/log_test.go b/vendor/github.com/go-kit/kit/log/log_test.go deleted file mode 100644 index 1bf29727..00000000 --- a/vendor/github.com/go-kit/kit/log/log_test.go +++ /dev/null @@ -1,191 +0,0 @@ -package log_test - -import ( - "bytes" - "fmt" - "sync" - "testing" - - "github.com/go-kit/kit/log" - "github.com/go-stack/stack" -) - -func TestContext(t *testing.T) { - t.Parallel() - buf := &bytes.Buffer{} - logger := log.NewLogfmtLogger(buf) - - kvs := []interface{}{"a", 123} - lc := log.With(logger, kvs...) - kvs[1] = 0 // With should copy its key values - - lc = log.With(lc, "b", "c") // With should stack - if err := lc.Log("msg", "message"); err != nil { - t.Fatal(err) - } - if want, have := "a=123 b=c msg=message\n", buf.String(); want != have { - t.Errorf("\nwant: %shave: %s", want, have) - } - - buf.Reset() - lc = log.WithPrefix(lc, "p", "first") - if err := lc.Log("msg", "message"); err != nil { - t.Fatal(err) - } - if want, have := "p=first a=123 b=c msg=message\n", buf.String(); want != have { - t.Errorf("\nwant: %shave: %s", want, have) - } -} - -func TestContextMissingValue(t *testing.T) { - t.Parallel() - var output []interface{} - logger := log.Logger(log.LoggerFunc(func(keyvals ...interface{}) error { - output = keyvals - return nil - })) - - log.WithPrefix(log.With(logger, "k1"), "k0").Log("k2") - if want, have := 6, len(output); want != have { - t.Errorf("want len(output) == %v, have %v", want, have) - } - for i := 1; i < 6; i += 2 { - if want, have := log.ErrMissingValue, output[i]; want != have { - t.Errorf("want output[%d] == %#v, have %#v", i, want, have) - } - } -} - -// Test that context.Log has a consistent function stack depth when binding -// Valuers, regardless of how many times With has been called. -func TestContextStackDepth(t *testing.T) { - t.Parallel() - fn := fmt.Sprintf("%n", stack.Caller(0)) - - var output []interface{} - - logger := log.Logger(log.LoggerFunc(func(keyvals ...interface{}) error { - output = keyvals - return nil - })) - - stackValuer := log.Valuer(func() interface{} { - for i, c := range stack.Trace() { - if fmt.Sprintf("%n", c) == fn { - return i - } - } - t.Fatal("Test function not found in stack trace.") - return nil - }) - - logger = log.With(logger, "stack", stackValuer) - - // Call through interface to get baseline. - logger.Log("k", "v") - want := output[1].(int) - - for len(output) < 10 { - logger.Log("k", "v") - if have := output[1]; have != want { - t.Errorf("%d Withs: have %v, want %v", len(output)/2-1, have, want) - } - - wrapped := log.With(logger) - wrapped.Log("k", "v") - if have := output[1]; have != want { - t.Errorf("%d Withs: have %v, want %v", len(output)/2-1, have, want) - } - - logger = log.With(logger, "k", "v") - } -} - -// Test that With returns a Logger safe for concurrent use. This test -// validates that the stored logging context does not get corrupted when -// multiple clients concurrently log additional keyvals. -// -// This test must be run with go test -cpu 2 (or more) to achieve its goal. -func TestWithConcurrent(t *testing.T) { - // Create some buckets to count how many events each goroutine logs. - const goroutines = 8 - counts := [goroutines]int{} - - // This logger extracts a goroutine id from the last value field and - // increments the referenced bucket. - logger := log.LoggerFunc(func(kv ...interface{}) error { - goroutine := kv[len(kv)-1].(int) - counts[goroutine]++ - return nil - }) - - // With must be careful about handling slices that can grow without - // copying the underlying array, so give it a challenge. - l := log.With(logger, make([]interface{}, 0, 2)...) - - // Start logging concurrently. Each goroutine logs its id so the logger - // can bucket the event counts. - var wg sync.WaitGroup - wg.Add(goroutines) - const n = 10000 - for i := 0; i < goroutines; i++ { - go func(idx int) { - defer wg.Done() - for j := 0; j < n; j++ { - l.Log("goroutineIdx", idx) - } - }(i) - } - wg.Wait() - - for bucket, have := range counts { - if want := n; want != have { - t.Errorf("bucket %d: want %d, have %d", bucket, want, have) // note Errorf - } - } -} - -func BenchmarkDiscard(b *testing.B) { - logger := log.NewNopLogger() - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - logger.Log("k", "v") - } -} - -func BenchmarkOneWith(b *testing.B) { - logger := log.NewNopLogger() - lc := log.With(logger, "k", "v") - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - lc.Log("k", "v") - } -} - -func BenchmarkTwoWith(b *testing.B) { - logger := log.NewNopLogger() - lc := log.With(logger, "k", "v") - for i := 1; i < 2; i++ { - lc = log.With(lc, "k", "v") - } - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - lc.Log("k", "v") - } -} - -func BenchmarkTenWith(b *testing.B) { - logger := log.NewNopLogger() - lc := log.With(logger, "k", "v") - for i := 1; i < 10; i++ { - lc = log.With(lc, "k", "v") - } - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - lc.Log("k", "v") - } -} diff --git a/vendor/github.com/go-kit/kit/log/logfmt_logger.go b/vendor/github.com/go-kit/kit/log/logfmt_logger.go deleted file mode 100644 index a0030529..00000000 --- a/vendor/github.com/go-kit/kit/log/logfmt_logger.go +++ /dev/null @@ -1,62 +0,0 @@ -package log - -import ( - "bytes" - "io" - "sync" - - "github.com/go-logfmt/logfmt" -) - -type logfmtEncoder struct { - *logfmt.Encoder - buf bytes.Buffer -} - -func (l *logfmtEncoder) Reset() { - l.Encoder.Reset() - l.buf.Reset() -} - -var logfmtEncoderPool = sync.Pool{ - New: func() interface{} { - var enc logfmtEncoder - enc.Encoder = logfmt.NewEncoder(&enc.buf) - return &enc - }, -} - -type logfmtLogger struct { - w io.Writer -} - -// NewLogfmtLogger returns a logger that encodes keyvals to the Writer in -// logfmt format. Each log event produces no more than one call to w.Write. -// The passed Writer must be safe for concurrent use by multiple goroutines if -// the returned Logger will be used concurrently. -func NewLogfmtLogger(w io.Writer) Logger { - return &logfmtLogger{w} -} - -func (l logfmtLogger) Log(keyvals ...interface{}) error { - enc := logfmtEncoderPool.Get().(*logfmtEncoder) - enc.Reset() - defer logfmtEncoderPool.Put(enc) - - if err := enc.EncodeKeyvals(keyvals...); err != nil { - return err - } - - // Add newline to the end of the buffer - if err := enc.EndRecord(); err != nil { - return err - } - - // The Logger interface requires implementations to be safe for concurrent - // use by multiple goroutines. For this implementation that means making - // only one call to l.w.Write() for each call to Log. - if _, err := l.w.Write(enc.buf.Bytes()); err != nil { - return err - } - return nil -} diff --git a/vendor/github.com/go-kit/kit/log/logfmt_logger_test.go b/vendor/github.com/go-kit/kit/log/logfmt_logger_test.go deleted file mode 100644 index 91bbca15..00000000 --- a/vendor/github.com/go-kit/kit/log/logfmt_logger_test.go +++ /dev/null @@ -1,57 +0,0 @@ -package log_test - -import ( - "bytes" - "errors" - "io/ioutil" - "testing" - - "github.com/go-kit/kit/log" - "github.com/go-logfmt/logfmt" -) - -func TestLogfmtLogger(t *testing.T) { - t.Parallel() - buf := &bytes.Buffer{} - logger := log.NewLogfmtLogger(buf) - - if err := logger.Log("hello", "world"); err != nil { - t.Fatal(err) - } - if want, have := "hello=world\n", buf.String(); want != have { - t.Errorf("want %#v, have %#v", want, have) - } - - buf.Reset() - if err := logger.Log("a", 1, "err", errors.New("error")); err != nil { - t.Fatal(err) - } - if want, have := "a=1 err=error\n", buf.String(); want != have { - t.Errorf("want %#v, have %#v", want, have) - } - - buf.Reset() - if err := logger.Log("std_map", map[int]int{1: 2}, "my_map", mymap{0: 0}); err != nil { - t.Fatal(err) - } - if want, have := "std_map=\""+logfmt.ErrUnsupportedValueType.Error()+"\" my_map=special_behavior\n", buf.String(); want != have { - t.Errorf("want %#v, have %#v", want, have) - } -} - -func BenchmarkLogfmtLoggerSimple(b *testing.B) { - benchmarkRunner(b, log.NewLogfmtLogger(ioutil.Discard), baseMessage) -} - -func BenchmarkLogfmtLoggerContextual(b *testing.B) { - benchmarkRunner(b, log.NewLogfmtLogger(ioutil.Discard), withMessage) -} - -func TestLogfmtLoggerConcurrency(t *testing.T) { - t.Parallel() - testConcurrency(t, log.NewLogfmtLogger(ioutil.Discard), 10000) -} - -type mymap map[int]int - -func (m mymap) String() string { return "special_behavior" } diff --git a/vendor/github.com/go-kit/kit/log/nop_logger.go b/vendor/github.com/go-kit/kit/log/nop_logger.go deleted file mode 100644 index 1047d626..00000000 --- a/vendor/github.com/go-kit/kit/log/nop_logger.go +++ /dev/null @@ -1,8 +0,0 @@ -package log - -type nopLogger struct{} - -// NewNopLogger returns a logger that doesn't do anything. -func NewNopLogger() Logger { return nopLogger{} } - -func (nopLogger) Log(...interface{}) error { return nil } diff --git a/vendor/github.com/go-kit/kit/log/nop_logger_test.go b/vendor/github.com/go-kit/kit/log/nop_logger_test.go deleted file mode 100644 index 908ddd81..00000000 --- a/vendor/github.com/go-kit/kit/log/nop_logger_test.go +++ /dev/null @@ -1,26 +0,0 @@ -package log_test - -import ( - "testing" - - "github.com/go-kit/kit/log" -) - -func TestNopLogger(t *testing.T) { - t.Parallel() - logger := log.NewNopLogger() - if err := logger.Log("abc", 123); err != nil { - t.Error(err) - } - if err := log.With(logger, "def", "ghi").Log(); err != nil { - t.Error(err) - } -} - -func BenchmarkNopLoggerSimple(b *testing.B) { - benchmarkRunner(b, log.NewNopLogger(), baseMessage) -} - -func BenchmarkNopLoggerContextual(b *testing.B) { - benchmarkRunner(b, log.NewNopLogger(), withMessage) -} diff --git a/vendor/github.com/go-kit/kit/log/stdlib.go b/vendor/github.com/go-kit/kit/log/stdlib.go deleted file mode 100644 index ff96b5de..00000000 --- a/vendor/github.com/go-kit/kit/log/stdlib.go +++ /dev/null @@ -1,116 +0,0 @@ -package log - -import ( - "io" - "log" - "regexp" - "strings" -) - -// StdlibWriter implements io.Writer by invoking the stdlib log.Print. It's -// designed to be passed to a Go kit logger as the writer, for cases where -// it's necessary to redirect all Go kit log output to the stdlib logger. -// -// If you have any choice in the matter, you shouldn't use this. Prefer to -// redirect the stdlib log to the Go kit logger via NewStdlibAdapter. -type StdlibWriter struct{} - -// Write implements io.Writer. -func (w StdlibWriter) Write(p []byte) (int, error) { - log.Print(strings.TrimSpace(string(p))) - return len(p), nil -} - -// StdlibAdapter wraps a Logger and allows it to be passed to the stdlib -// logger's SetOutput. It will extract date/timestamps, filenames, and -// messages, and place them under relevant keys. -type StdlibAdapter struct { - Logger - timestampKey string - fileKey string - messageKey string -} - -// StdlibAdapterOption sets a parameter for the StdlibAdapter. -type StdlibAdapterOption func(*StdlibAdapter) - -// TimestampKey sets the key for the timestamp field. By default, it's "ts". -func TimestampKey(key string) StdlibAdapterOption { - return func(a *StdlibAdapter) { a.timestampKey = key } -} - -// FileKey sets the key for the file and line field. By default, it's "caller". -func FileKey(key string) StdlibAdapterOption { - return func(a *StdlibAdapter) { a.fileKey = key } -} - -// MessageKey sets the key for the actual log message. By default, it's "msg". -func MessageKey(key string) StdlibAdapterOption { - return func(a *StdlibAdapter) { a.messageKey = key } -} - -// NewStdlibAdapter returns a new StdlibAdapter wrapper around the passed -// logger. It's designed to be passed to log.SetOutput. -func NewStdlibAdapter(logger Logger, options ...StdlibAdapterOption) io.Writer { - a := StdlibAdapter{ - Logger: logger, - timestampKey: "ts", - fileKey: "caller", - messageKey: "msg", - } - for _, option := range options { - option(&a) - } - return a -} - -func (a StdlibAdapter) Write(p []byte) (int, error) { - result := subexps(p) - keyvals := []interface{}{} - var timestamp string - if date, ok := result["date"]; ok && date != "" { - timestamp = date - } - if time, ok := result["time"]; ok && time != "" { - if timestamp != "" { - timestamp += " " - } - timestamp += time - } - if timestamp != "" { - keyvals = append(keyvals, a.timestampKey, timestamp) - } - if file, ok := result["file"]; ok && file != "" { - keyvals = append(keyvals, a.fileKey, file) - } - if msg, ok := result["msg"]; ok { - keyvals = append(keyvals, a.messageKey, msg) - } - if err := a.Logger.Log(keyvals...); err != nil { - return 0, err - } - return len(p), nil -} - -const ( - logRegexpDate = `(?P[0-9]{4}/[0-9]{2}/[0-9]{2})?[ ]?` - logRegexpTime = `(?P&!_m)ASP-*eqr>Jb(sLnFNxT>MZ(LvQ?pz z9E-p%nqb9>qzLRb^$ar3Oe4&#rX(7HnF$VamV>cKQ^-Eq{VQY-Aqi!pkW`WFc&@vcQ|Rp zk2+@s2b&|6o0`H_owRsmm6{!54AmY^5t|phfIsn-IVNzsF!^QTQH*=ZDT#|12tgZD z9FwS}KiqXzs+4GiKokF@RL3U|PMi)T69yl+g|jbl9Am|Jn9Is#_#1JS1be7phzhb) zu)P4lpXpB<9phn1ew$hx&1RQt+RPDz`zh@VF&L`QxBL0}bgE2}nJ1HE9mzwOWj^?Q zwIdXY4U5&P$>v<>H;9e;9*N2{FXlV{7EB3Z!=_3w;v@#(*-};nqLoq8`w%Ig)ykkH zrOF93R=3DU85zouAwBa;Q4(bF_=7$Ls@2xEJuHDf8fH~XSQX5_C^odQ-eNuJD?+C3 zmW_l%AuQMM%$uCxi0QV9m{xBela&J$%a9jXk()hn5_(!`MnE7hBiD7z1#&IYgx+O{ z`xc+4IUXBU*FrAI%De{S%9?=N{U?f#c{vjBbMT|_&v7Tg4P+9i9rpJ)c|YP627=`_ z*3rRZ9{Mzg5g(o%+yD8Qklq`0KLm#Q{0F<2bTQOagY8OmT1JHV>X3wyxCV+XBbcQk z=E*p-o_q#A+jHmIv^;dY^s|M8wh3qBYh06Moh@QHvgB&Ymp2rAGyqsbKwqsOU}fDX07Bm|w;1^L^WBy8A!h z*M`>l$AP9@VltZ}Qs`H{A6x??6wT!~8y6pId9kZrRK9`g1*A{hh99$zudA=s-0%GK z16g2H+;_Ha$K3uF>W=$Ply`U+FwcI4%45e^?Vo(6I#&1zG*U_r*PFdqR{MB9#;ymy-GtMyihtJ1i!8dN>2o)A`J# zp2lzt$%y63gcMy>A54eBg@K8ut5z$uk*@kE5d|9PrFzznIaOGlpXG`vx@r(zH78j| zDC@vcr4yP%KRlDotcf0y?U;=1mdU>MprY2Eisc#JE8@pQo}$lgHES@Dp=-RD73m|C zN~gnQTZPu?Z~}7~oJsyB$&bxY-8Yv?o|}$DtNHf~sb>3W(oITLaH0x+KMvjGeY=~a z#uJ_&D#F?W`sWNxTCo;`$v8P0g|5>upx3Ce16e`5ijR1x@g#beQo~IxnzP$`2dif$m zt*)dzphbGT5JE($kfF~WV#pFXq7kvjvbrswW5Y^z)nfrysfDaS%Ng!MRvI=U-Ec>+ z)&j``<#OV}NQFeaC}S2O+AC#)<{3B~Myx_qaJWh|6hOCvLziFy>=ahy6wx5G6ozPe zzEBO{Xugk`aN<^2&J5?bLV}1k5=1gLpI9hG&cetHk{f<9 zLTn5s-ue_m+;_lIuE^4Mq1qr7j|B`C0Ov&bSl%~3|J>!zA)|)X!Dh_h%n9F~vRJjW zdW^2b&q{)<1R5`+RC+0M?ieuIkM3-7AVq)N-rxTdmAwD`eF~I+)b=G3V;oed#55g3 zR;86yI0i9_PHSys`|kKibuLkdQfpVD?Rkxz5#3;H-DGrpI0)XrZN^KRjPVKf#cNWmf#8r_sadAbu6kn&Ec?4#40)*J<@AzKhbm0;IWg%5QbGytb+UZhiDIDA9DV=ET6;Q4rg4Em2faOUm*;}K%b!OaS zA)%8?$OxM|*0!VQlPHd*6*Bi=N^v)Km0P8h^mSw?vsg()Dp;4~Mswwh3aFi?pn|cW zc|1NKp;|k9krZ}hJx7;y5-w7k+z?3*-uXxI*rJCQv6N|=(TUk$s=4GuQPbV_gJROp zrCz%9u~+HiTxD+*s>{^u1Nzva8)3!#V}r|8RN_=3{?Yc-Sdn@aQ6sIDXjqYQiGVGO z5uuS-!jSAiU-X+V!i^w5f>hZ&TcYU7G9A-C9snS1DleF5Fb^tD{v!>Xv_4U!0FVb! zu)_mD>{K}mL6vB%kjC%Mv287WwN0m_qp~pdm=seCs>^7uG(a@Hp%(8RN#qfUnaEy+Zwu&F7r@BoY@hgcM*6RV+QB7`J-#^`QN(2Jw6pX|lRC?s#d>{J&L z|4&50H00JWx1J1cWaTIXiCPBA*)x#XP6$AD3#5mW2jFm*+`Z|vzAk-l&aa@Uk^5qn zt0fLujsi=C!(gd|kR2D{_(wK!iOPzH9dS-mBt7n%{afd`0YA$@iL($fpL@h%q(W3_ zut%R*0VzGGf%eK|h{pU@rHG4rqSNyn=^5pX&(iO6Y&H`dQ?<9c)Pyb=2>M<}Jg_HS z97wiD^7UQkknBdjL#QGL`8p2458i*@#C!Q1waijo6u9bG5 zu>^-!1rohpK`ydu=#|#JXO=82une)a+M~~=puVLnCmr}SS(4~aa&h0^4_AW}1&DEF zR+}26C_~P`MD9&p1$afLwh*EEMX(?0OH>M6>WcVn(lFOuRSv%7ff~cZ-j;*2;D_}K zeTd}vjaWJU;nPj<86~AJQ83zBG0*!*DGl@`lRF{{zRv&!F8Ce+^r#W!w^#_EznJfk z>Jo<$hAwGdD*<}wNyIqSfnhV`kOj^Yrj9ZiwJtoFZ{>& z2U!X6=M39?{jKi||EF;!$^QcW_=x}q{@?%Z@bANg*Ztxj#}11a~uqv-BD|zR?lyal}nWyw{4ObG9MQ{<2&|y)74?_}s`SE@XewVZr4$$ZlAy zWCxoqbCre4QlT_W6?@n>VuBV07F{|dEyL(*42Tu2pHS7*MPlKiSE1I$i29`dHlW5o zwzW}3B_0F>|CpX<#nDzP;xr#E46UwZE|A|yr(*}ySq-~Nh(zVlgs?K^up*izfxtT( z=etU`;JgID4Q4qR2aX&VPuw)Ki8hUb3@LnP(?CJ298_bm&hOSJ2|VaruA0V3aFLHC z^k4-`{tpeQ?4&sUYCgrG0v@jA&%ogDMH)s9xB@U~jeah=aUm+oGS9)xT^ktfn8}C( zKGu+QUt+Pe$5)^&FLB>n2XokiGe-)Tk1~Fj7O;LL>OX%8xhlFA( z2d@q+*NV#r`IIAF&5%_+x?T*I2J4M%&&B@p98?0JNIO=pI<2!@5iC1ruOoW}GJXOw zn>AMVN_&vjG$5nvXG?@=QTR<$`1Nx35B#JKP%BVqUGSZj52&@kmIt?h!1&jV=qtw7 z*Nu)HIK=R}ZoZHe^ElZ;y@C3uy|dkjwm^d)i(}`&q#XIG!=&I4L6&*QB4tvbfztat z`^rGq6tr=YoMD=IAnMXSP%k2ccq7LFU3~-E^fU;t6#YXkK#Uu?ka##3BCm$(PM1}@ zpMcP~Z{BtXs`*5<@pdn&y`&CQZ_$@ zlyQvEo7I6^?gSy?y6O${6O7CQGp@3;=?Y5Y|Jwh0>2bS6s31N(07VzlHc=k8<9u*ol(6;DHxkNyOh#*9L zfkj}a1=(05Ro5S+!Ox&-VHb<=fXXK$d_UNe{2R6(gB1DDFa;}Cz-kGfyZgq4tg)M_ zL%x_#+dm)%o&+=1f)@9&TU-*97JtnEl? zqPmPpH-+0lfwDWB!Ql?lpqLb%=qY05jEO*@w(NgMbBR$Ko+Ft7X~M*eb*>)!(*^7> zOrM#b4FdUrH1fUli=*MbpAeF)w+L=z1b<)0h#yEkx~~HKf6ToLd|XwzKAeV3o0gUY zxrK5YAaGJp2nd=&ktr4&ph(0j0V@PS3{W8|U{r*}Nii`UsmG#KdL-xIrAX1DSc->( z39Th9r~woT2n0~vo2gJPNGt7TNpo`db@&|gboP^#Zsi7Gs$qTSXZ(@*VxD-RcN8W>R6Bp`2FH^wRwb&9{ zoF@;#AgUckZdEGkbg&Y2sMma2O(JS=Q5Gz~_&kzOiVvl%ZaqO9hq{8}J$Uzv1uKbB zbumWl8OXE@mgd3n3nqc%--&a)h~HYk8x`L)6D8tiTm%We_Y_C0L-l10|7FgtNW(_q zuWwQs{tqF}BK|O3x2WDsYITxQ6dk=8d>?Zs;n@?|)3tNqJJHx8FbleZDdvh=D3BN_ z_Lsu+Wr%}J!iI(Qsdd4LXef7kq>)AZxs}k0{Bx=J52`_lqx}z4gF&CDf{>gd#6*3W z5OBsg9;pS3AqvYeynMyUMgL z>rz{A2`}=XzNXEk7@w!cbiu+)h$U>xdjP^~?lc&_`$Fx||b}F0_)BZA4rS zP^^?wY$T3k0t+;mi^FGcWd1O?neL=audsdv)uxq5mt$qedUAMO?iB=EpFEwL@C^MB zZf|>V@nMP}AO0tVb#C4wi}dXR6IDC0fm*jwt=kISo^culL~`0^nti6lXIhm3vz8*G zIW(r--UXiWg4Zsv1Ojp6h8pvJxF?2*<#K^7G+1!W3uuW=F#&!r;mQThpkcLP)wmtE zw45o{gU#M?I+wUWN+TA_l{x1avy%7g165;L$$N>fIg~H*ZB<-BU7SPgMdNhQE0LP5 zL@4E63(oilB(T^^AkY77v|r|C6GE53tg3Bi3VTrs8=->pk78MCS>^kpJm_McD%tEa zCJo$a)18=Ds5R;C3b$r`$563Ypzy9|0{1m$bKXVT3n}p)#6nz1b{|u~*R{j~)ph8* zqb0iJ)92wBEI=2u%5c^`^^eI{0;1mbv%WpP_5 zqWjTfiDMI=Kr0nmGAw>!9_$5;KY6f2%&2*slejUBc*5<$+g zzk}?F$5;Ok`_J;HJ^EmdR3b@NT=V~=|J1%^Xk1eyEji#=|G5jiI)x>TO|h7i)eR_O z{pSgPE!N6jifqjObK2h^i4y(i|F7)ZwhrgrYiav_PD?xg$LxEn`(z#(bCJln_C5FH z0{cE?KiT&kZ;WT(JTrB)|D^li-`EjJMeVQo9DcH$DYOAd=EG<>y}W}&ypivupwszq zppF+t6BH|`cI<=Oqw|Ea$tgB7CpRJ=(afg`RiL8zc))c;a*xnr!~=J|>bvU?XpA+Nfxzu4C zSkLoZ%5)nuuv3C>NtZSxww%E8T+%;5|9soa|Joj0e<0_&5o$_7v2sv}1Dp?T;(YFm zLy+{$c;`v>dL55`2g|z?+s@VNb%NEvx!*;xL2^yOINZGyX$J7 zsbMDg^9%OzGrYjJ3AJ!yt_~MTTrwK3Jd`hSzV>EzV*Vmj#HuG@N9!L&$e*2#b?Oc7PoUmJ(N^=xxiV*x`6HZ#% zHMsc|h_{uZ$zBJzvroKcNxJ*c+*gb3r5#8B$2!_elJ=6!qecM`0ii>2+UyWkn#+R4 zzc>A?;eAO6YZ`rck!DnJ%rTb*A1y47Iw|6ugelgo3xdA_*^7Z}u{~e=CEx~c$rTge zR*zFz8|73|crltbnXbBL>ZP*>@aZ#{@q8khGBl`rxJvu0N?w6Vpa+g~;v47nPPb1? z>7(oVRu%lOU!2Kp4L(G)78zQR(iX_K>PDJa3f& z4lP8BTIIunIJDPzm=?=}Gp{jDSMxIMLD=T~y4+6)KqX_i2jAWT%+C?#MfjGPe{3O7 zo5|DWXj>l8m6a0j`aHT2?tHLcuk@}aHE0kbAst+o1jengZ=N>tNt03K9=Anr|B5&W zjgOlE5mV!P;-n<&V*!{bW!AT79t7lYv6j5R7+&H_N#bk(ynqn|?Yo))lX|BMpbR(v zChGgZfZTsN@K`qW;Da{IsfRC`?}PB5!;1hC%&3Nf)e8z#h5D{VMt+QscUdUI6Q*4W zAP8&j!*cNfI6np(5T|7NZk@Al)wlYPug{kcmcN6Mim6au9@);?8qQ5?KlGC0!C9P# z$pI9G;LS|4F2%sE9oPJ0z|s}VFOB87WzLuBjq*;Y#JRJ!4Yx@cBu2lgS5ode7WX7m z3FtMfkSjv&uO>?M0)Ed0FsIpcE zBWhPx8!y37YEZhzX&_Fb#O1p1-ea(*%d+!&H>JW^Oi8gRsDyCB8~@iSVCEs=;a{gX|M zk3=KZOy6XRvAGmwIDQYE3HR!)V0rntEOR`GuRn6uI02$!CV_0F0b#zx3~6LC#CRTy zYZmeh=IjKV6D&(H9${IEaVD}o6*K9qPe9Gd_Jm^mJCVzb(4t>L7S4L6ch)aBUbQ*C zjw#b2;f5E2m^z;<%9|YJR@3!V&{(-;oM(kMb=@w}L3hOKpg^st-7HX@4kR}0>V9dN z9_aA2I#@b$Wydwm7jeL5_$+=#%d}Bgn_J$+WV+D}%;|J?p*YfxGUJWw{PQwh#`2Qs zV&=w>>1v1QTBeziT_72)SxKg+DrV5BM#m#tbx+02OCdj$vGMu{MZ71UteH2ne9n9E zV21_PtA_Dz98)JSk(DY%7U&qeA6+U?I3Zb}Fmt06TNiY{w7_^QD1E8b!F0MSJFdVE zI06Ez!H)@yzlJ)bv6Q^>A?ydRmKy$j779KQzKSG#nfZs5gnwqfKitCmf8oz|>>~}I zVQw>j9^=n%`NPlmg%2^efj>|3auahS_$ox$$J~GOXAOVu;?EEt{DisN`STbr?_{ow z#~t0q-1qqN9sVri&rSUK8h;k^ryW1}jx*edNH_c(A6!}Z;Aec$!UsRb>V0?tbLa8r z7G9ps+!_2il|L!|e1#8AVy=Nd*KpB4Gkg?u<|#fAYbJV|K_S7@;}r>>0Ylc#Al_$2ayCnJoUUTMwRg~GE|Ltc%V z@BuPZjUt@zv(OEVT$5vY%skbP9PSx48{DrVMjZ1VjG9D;LquS@TtspViD?~t$mxOf ztVeJ@rOx?8>|YlROg!E!hWhGie?ctJRkX7kN7UEF)Q@Ch705C4KOHPSYcTfCz`+ls z-FM=e1p)^ZIuHiRgD$dekNi^g7oD!sl3D{YK_C0G!=RUU@&{{AnAyM&akier2Y2L! zRPG^s^lu;NTlu6pvms)B7ey7`15T&Ls^BFzlLa8TR)$%STpLs8pD~*3j9x}9 z=yuf4JS8cXJlLmM&>%!X8;7Tf@FqYJTQhyXgIOM4wWbd&oD6P%4)da&Z_fle6=a2B;UcGJ^53GpCZ$Hi>~lrwYVRIZ!vkksKDc# zF31cYi}Cg_o6HO!1BE!G&_Mw|?IUtSZl@5#V~Hzo%~zpGQ;6dM^##fxQd$NOE^eoM zABlqC&e}#|0y#G^jmuY4O)$}7`HtQHrUYt5ZCao@9Z0;PrfwWN4b&4) ztAlZmD?4ug`{hF+fj0bz!4Z`nSLc5=fy)0T8_;CEz%Hw85NZtd>EGRp$~#45Qjk{E z)(Mh>3`mSpUW$AaV(RYA_K-y@6Qo1-lBp z$5sj2BE$;w9yf`nHlD$hE+W^cOv%BUKH;dr+nKC6#^9~mv9N|I#$CW>9~Rf(t&%w# zyh&BPcyhL#HVyUi%SX zh)T$@f+^_cohEZokT7f!Bo7h87TqsR<`hS!)xogEl^xd#e~)>H@OS*#%%8{j^IQIG z?(6Y452#cE?n7hnUlpxFzmt)s6B2pwee9XRi0l@F;#%O6nwZ(wU<|gr8`Y+ zN|4}?1<6D7EtIBqhNIT%z#$991RB2_!>I6^{F%vMDKmT)`nd1l8yd*6H+pf$WnHiK zI%^w*bDsLHou)o1NbuBxa88?4TfT7xkG_21kdgnu1Bp!N(<+X06{ z&35q{9PmmpwO|;3e$1h1yxSI)De0v7vajjM-pq~Rr28~{T~<556rLB@{F&s+Nk7h< zIq40^Vi>>cr6-+n5z73+o^Tld13tlATKSwS@!;!x5F;cRAsMX(T&f}zlxDv%JtSx1 zLJm{(6&6M4J>p|ne)eW4{2|PdkmwCz95aq@Q?kqIOW+xt^#Ie%HZBOf!nPMb4IH0i zF0+l(#J{sFG5?ii+1vaS*`A7NAnwX*Q1cdh!a1fM%W{tCOUPo5X&UC3F8VA=U22aw zi~LbO!Vq%uoG;+P3sOB&I6-ICDx@KHrY@Gk0ts%2B|FnuH9Gp61PXz&Qb5rC&XQrq zBUo}Gc!%B`^*ShU-6LPs;fML%}9hYT6Ej!KSq{FpNpb*R{MKGuPoh7-R*27`i(Hj-b#NH4Fa&U-Y8LHWL;no1!u$ebG-? zUVYZB%#GoTs>PUPwKYu57hTD$e9?t=lO}vNvgV7-GMP+OlzNk`|ZR33R7g$`r=yK-F7s;h( zwh{9)>@I!L3CPkHopsffm!Rh1_JqDjjy$uCzGyP;dS5ik<;2a;2MZP-BOoO>c$i_P z&KN|w4e)oyY&4Xvr_MJo_{Xya%$mn65;&-KB~pK@l`~V=IXAlWx+AJt6qn}N~W1@ z>~}S3E){tXE1HTNjx2P2+NCF*^2K!OZ^Y?Pbmr4B5x!{46$XLVw>o52oH#Wm|LsgX`ZYWC@jqj z6qe?dVrgFYOWVX`wSt|WuB__9M8_TNzkoxV!e{vNSN;V2c@8h+hR-thB!7O-pWpFk z10Ouh+=KkN7nkT14(GDK|KLXM&2SCx-^F~OB*c*n*6pC+W!wRs89pB|`k=+=jZith zidxuHv`e_wQ@DAkLmh2xnz4xKWquy&`rS>DC(U91^V~$S)4eQ!`Ne7mgWyt4ES%J? zmA0MJ;xfU3vlbi=4=b^{Us_^&F!DpsVs$Vh;L46W!n>&&9Q_)8f=Ej(KxLB_;MNTlkqBo7@HA}K>Dsp42=(TGofQcv#1x6S_ zKgi-*(Ob)$t&%d*$%LYAwv=i8Q=tL+JUtxGJ+UTXoe@m1QB?GYpBqxlG{ zfwrY)huvALkcL?^jkBb#6idc+XUzhIp}s)Dl`4hG>V9cO*hkump}s3?FeY$kZ_j`t z{0%?Ooy9_wnwYTNu9_*uyK1USQI;3B_R>h$>u7Uh2)oe{)x?prF*z#Db2kt%Uv~-nT2Mg?}uu{cGZN|GI!NHi7aIw-&L~% zU0F&r;20^UPWIYWqshgc>dNW`3cG3q3bV^fF`1$JrDcy14VuNU!j&}`6UaV<{|x_x zpV6`}i^<;Ys`+n4u+|}Iqsefo4k<5t?WK|IKhK(D$UfPr8bIN{C%To3g$i@tPD?2SaaB2uyig9Om)d(Gg{o-ScSj`6Slo-nd3cg&R;LDZ5 zm+O9MF(S5<7_AO`xhp%aFP{OA8dl0z%bUkcct|2Lf9-bFJfN<{C{wJxd3-TyFO9@_ zJ!_63#;ueIch#6|ILgpo8j0~lRx}en(y|oeewL*ecSY8Tk-KW%qVky-|6*BM^b^R& z{q+luSEG7!MpW^gQbWQGyK0y^(-h@{r6?cQEe{G5rl$o8BL}4zIp}_AnPQ+TnOYr8 zPrI_?%9QVBga_egv}q2+Wa@U+{8G0}rWykGm7*+fnl>!pN`(yzO7E0f?GRnd)OOX_ zuz*M3+OR;T>4pW^RdYVqh;3LPOLfD7o!(WWhOw)LsS}vUT3d>&aRs(ips=e(pfH!I z6pL26Us_<8fsnwg4tCYJvf~Qu0$6Hz9)6s_@*&lK{1K7uX?*fh$S*yHCoun%lJI!u z2g5nM|6cy=#>tU)F-MOW9?G8s`SUjh$onz3H-7?N&Sb8V@id)ExGR4q^Jfx&Ugf@- ze*yV$gg-Cv@}JCAaU0DW%)P>&kUxLo&vX2Fia&qgk2E#vDZ|ZNB3{P__v0tug@*ln zKrIRH<@Oj(u!OhsN4sh`%MyN-lAGZ-ST4(47k@f&iO@dD!vQkG7ea~V!Xp%h zo`aG~K|IgRc+s3nG^~pDHgKcCO90P->7+SafaLeM{`PT?b!+Nzt(tM*$9?>nv7bjN>0h~M_F2*QaS)%gzgYRB}T2Z@F zpgc(I>(>3!R^}Hctqv^Gl^xg0%F(Nb|3pde7KwIIuUt&$QUS&YmZ|e5+5^(N({#2A z)QZ|Jf$|{XA#}eqot5%g*f*d$DC5eGOXnUa6z;~KefaYZ{>E(DpFFTp54( z^=Ebbd7m?Dvm3^>LhC;O4C1ylkFS3g7}5?5jH$|INS_AC9Ud5OrS@`$k7=Iy^Y{*S z(GYQ5KRzTlnBEf{4-eCOx?h^}G9m;+RtKH5D?2XdTfnUFVsQ*S%X9RJ$H~#K2~ITf zAl~J0ix>wMpfkR40_vrmB5cp+xmiN_qPH7@i=NxYSLa@SR>_N&{Lzv>Sn@tA@}OPS z+tn;fer7lKv#UKV`477}*{-(RRhK2NS>oFJoLv>RcY)n>?e*E!>6W?&th3x0uj#LnJS{JL@M{mJaS+NJjL*2Nt2bZprQt>VjD0aLuZr4;)> zIFrghZds~}D^m1RP zf5Jxd+8uC@|E-qDL zesi30iF?|NmFIEq?+r&78|Q+Jb}aLTifQ~VoS*@fHbo?C;d?lpchX#cIA4 z=ix<8tXC$3d1v#@aemMPh-2$3dr1J5AQ5t~)!fbLtjWVZt_2!~_r!o;HF3_SK~C}a zwK|Pnz)>g$IGafo(xLIF!}DI1bBFJszC|bQr1weUb1V6!`?Ciyx;RW&B=%3aPpiO- zTP1&vl?Pf#JP2(i8$7ix5E{H}RD)3~(3`C|T^m&)2tP6~z@GjRHoj`p!~ZBS-VVCUHzqbFsAAC-&No-tqJyBotO0kQhD(E@(UQsa zOwnt|ushaoMX`1Gj4)qD&z*%A`?tQ&@ro+N=8r8o*OI=~@JU}n_ZPj596$dcJFj-7`J?^K9~rw=8B5@g#2R=2 z`UL*b8_+&{KJrsw5%rVEr?{j024A9`8T|2P8WXgUk666%hVtBJ%psswlXDU9W^!r# zz-Qi1jQvr&sW9v&`i2G5Z(!9FQD}@+_1~`pK$vQVLY4e8!&7mz(KJ*gQM_f?@uQD4 zIj!FDogmXR)zRTpzhOY)p=8q-`-~8Yhj}|YzxD>iTb0}K9zc0+|EL&rs?~k0g@Ay_ z9R*-fIK{$J6Yz3~9D}E!zEGXylVOAMO;D>OfKaU@pN{nuo8B=V146b5zUr~6n>Jb7 zz_Stl%06MVp<>ceX(+-C^eAQPC?y5vKGq7Xb05v-KK8}2DP)eXV(>iv z&aHqsD^)k|R!q*W4;o9(7nu7v7yZdyC;0xPkSFR--b|An^XWeL1_3`rzYM~HN{KUN=yp33hj>H0?M(PVM9|_ZIm;d1I z_sqSpwL2}>vOjrha#mQfsjv(^7r&snfBLdV%Qk)YM1GDF`#Rc1uv2WgKOmu-a$jhx zsSu8DYXKq(J;i4<3y>+<&_a7}zm5ECW<7MY1Pw8)1_u0No+`{g=KGYh{6H)}7|U;t z@~}O4P%sA{OJIr#NBF|O;T{CHM?>C{S)HW_l9EXP;Kml2thhWvod`M*Vwq zsrix)qTq`{)2vm#p$!$4IL&EC(P%U@KtYn7PO!=yYPlm=ppm7-3W8kD6xjAE zb-ve~ximI1^y^Sl>uZ9~w3}Wg$pA20u{+Q7h`|wjw6{|2`1-*|ueYiWYak-Tz&0Wl z?~i<+>Bev;89D}xqUp;Wh)PL*&6Ki2))3k@d&=9(-at7lT3j_aa$?0VImx4YmokC zr9K=g=+R0jzThgFp`B6TpeFfX&XZ8jCk;VPur*wDu`*1gaCk&BBopF_sYZYrk*5pR zbF>#%@TFfaRB&TGjaywabg+-LJJt^%fet2)KGykom}e#K0kU%()j{TD0|pmD8?oVB zX*|O|sABMr??X?XfgZ(1D+S|~&e|lkRp;N#J&cHKX_lj3Wv?zEJowH&jY4cyiq!(91@19;?^!HDVS%<9GKjz^1_I&}xCb~JsuwOG zIfTHv@Fjc==nC)S`H*|AN)QZsdRGY#O`6~>V;K_FF4R$z#K!Wy$on!~(R~a+m^UTu zB|YkZ?mE-}q&@Wj))>n-#PTVh2Udar4lNgFrlX^R_=9uqu?`8nm6+0L2L*sRglX&o zDN7ww@~)80kcVu7L|gGCQS|}Gp+UzXK|qr&ENqpQ)OsK*UE$TPuquh#`wubj?Zg_` zYXtz7&?PDWNh!92C27@f!|{H)240ieYLzcICiptA}M`SAVsu zPrKxhwux!S`er0J)eGKA*rPmCcs0{FxAKJ6aL6U6J^z?wbu?b}%jYW*g8o|9e&||J zi;%u@QqX?^OEH`RU%CWYT{x`CT_pLWO&6{NxY0z`s01Fiml1|5glpO!Nd-!LB5Y1g z=CR@Az)`x+V-u`A(-490#fuiMZDG~oF5pw(DI6jyforvZwp9q%v~S{~azGR(U{>9u zuV~<%Bi8L0sYHTZmuF#q7FT?e09TWFet%})SQjTqCc?{^ zBlQwbUW^heFleF0!g5=c!c{Uwc|o9(bw;7L9?4{?2{fB{nm?92{S6IFRhPWe>xrcAd0Yz)oVU6oP$5+G3QJps# zbJ)&gR8}T)=9xf!DycU*{YlP`8x}~aZ&|_oix@B6}y)n+m7F? z*k7`-Zn}R3jSFE|4Aa5kvLK=FzbKN?>?Ke9fua}_yw7#`f^5v$l_0zOAy4@gkIvE9 z*(t)#VDhDxjI-!(Cc-4V5^)GrvuT!7%_0@-=Dh4J@1^SHDRUF`W)enW_%*_T!j{C- z#B;;GB}8*%c$H!Bc-=S{>^m_AxgX+ehnL+%-ft6T+0-sLXMBDdH_TUOM)t;a2P9@@ zVh9%*x((($!ZwgIU8+1kJkbUahY8{1EELF(nQU#NwVpIX`=p*Sn$32kV@X-#_=V2T=xNir^o?%Y!AYnechdLO|$Bz zAIl(0v%(4W|C+yg==mKMCOVJ%Fs_Ej`eE%j{vtefVvog7On63_Ej zxZ|8uqW#cuxU}w=iMcc#6C4vb2k#~eZ0N|af;F>=e;qOo26HFIAos)YKup8a_dxi+ z!XCVIcJ2_?fhS?XhOcPR01yW$EEsnPTX72Q*u}qTm<8*p6NB5LcjqL5x`Xb*nMe#V zSQ;@8{M0-+lm20ZuITr%(U-1e_+Xr_jF)cff^Wzz&BLl39CCvj*La|=5x9Rg8otSo zKy{4pjbfPTH=UWHZvai{?uy#r>Jy2Q=0X)0VkJgs_}9P3Lf*gVgJl&Gh4zvn&efZw zAhm{|K(`(#NS)3**~AAAcJji*YR448L9C_1MG*pu36{onpMf?KWsn}9p%ol-2yuK& zY;iPjM?vcQ8M*^&Yt>dA2pkhhU@upp=myLDN zVG}+EA1AaO<p`52$P^piYF9b8h zAPB9J7fEpq%nj~)z$B>BK-Qq*pdmsBE+r-SElk~qWqc#=T!=CJJKmTJf5~le9U}=q z#z63AWM#()4-SHBy~?N&EVQvynER+5=vlzeiE-f8F8b&W82#g-EST~%V2{@PLfo9? zzs(8#juC!%Bj2*MIFTc2M_cBIqH#y|sU2^*-C8CGpwhP^F|uuH6h5cj`5X*GF)M}V zluhtd12P4QzE+PgaAX?OW8beFi@jF{OavoV{ol_~hEdgh6SNfK`9QQQ-)-#@R% zL#l@re5EVgj>=KPWxP@>z$-l9NtGHt#)3E+)MIW!zN3m*JM2NF zu*S9Kr*Umqjq*gs9H+-BD^K($z9m6k`C3Mc;|ZV^>WcG3zuoFQ5jwwr3`=kL@++kG zdn85Dd%!s)Nv}yFg7o%(FBvR!w6N1zTj{t^jT9iTh#9#lOn|c<+*BDJ!U|B;p#~Xs zIkS+m0_9-`hy^L$NF-Rtb}i)*M~V~o!S@Fq7|QvlDqEz|dqL+kJ~{(Oa@Y{$rSXgfNN7fFA| z$UDFzT-`@y=@^;%zb!HVFAMs9Z*&#~P=$25Zsg}%gcW;zD9a+_@Q!pNZo$fWFAV<6 zg41`R**VrM$%m%gEqPPHnkYo9^K*9kJGkp61)7N$AFSQ=iQ8IFn)bwP(JUWcZ;MTL zT@s(}l0e}Qj2!GAA?-8>cZO4e=<<1f#5D_tw%c4hioR|yorLEjI z!XXZ-J4Sd^8BF}MX5uqQUlb|sn3{Bvq6i&alm*YY&t2_^i4Wqi4&bp{LCZU0;%=!V zYFUi9INmZmA18<5JPQrQIhT)G%jCe$I+xZWg17w6_`f3rKZi+lL^_`^hs*dR-@50x z(eFpq9IDGO6`Ny8DBrq>zS6Z`;OWOu<%>9l-!a0oDxk=BATg)fODSfCr{lvc^QjBt zL_`CqM5YcZbzfV_&ef}20l~l=H}jc7p%LE6CZ5_o9|{QoY*hdd3aN0ud&JnShA;$6 zq0m1MD$$i;6{-XxMokI3ZSOf;=#x#nylZ^>7#b)G4#GX!Wgnl3mv0#_zh0f^r2qh+ z0DzY&Jerq+C0^d8kJ*j#d!-ODUdGYzy!@0p9xQ$mHL%98C>$kZ6W320#mmQjZoKpr z3_$)PIE6il3*7GF%;RTls)Fy5{jVzSaxob_kW#EaGj+_~?3k^4am78jD$i^I0J8-E z%vRyi%oZ#$dmbh#OLQ`&5HV)Q(eTWEgZ2o;wN|lxglKzRiWIkd>L_Mk`ZHs;uV4Ti z-D8C7P~7)nhHpZ}ZFjuva=cs`{^rS8QQ_YX7jyc7WNQUJh96&}q?!4fZr_bbWE zQivEY<7jwZ_7XLaZmq&DOY-vFm7{n$6G|wj=qo6Nf-)V0mtmy1;S4MXgSE#FAsIoY z_c><5if6&^<1KPoW}&DBssRIn}9Wv833X%oGlpy)mzH6sJ-m;Zk}|XotGXY@K$UMyUv;opI5U_ zF+qzdKGtV4$B_t{O_7eYOh?UPuu;&gu@i#_&K2|BcL*X}K*xPEeu7=UFU?+dn<)nL z0k9SUD)b>mqMHG&3>!9IuiBlmEukR*%rdW6RVPk8;2lU=5c)dVDFhUZTm+icrVw_- zrklHNq>S;o!9nh2XH#n`^s&B3A^ zvh!;vcW%VD4Y4DDidIeR>KtdPL%+)1T&x*WNYSL+!$hMwT_i?+iV$LSWmXboGxz~M zh#NJ?&p2;?^5(pL<4-OV9*&MP==m@4e@`Vv`!Bm7AlrXAn|p{lw%F{?Dm#KV>ryCs zHGCcaXq7dweA4F;2~^S_qH`)^3MI8w3Y4c^q26)>!S^v1qM)mwt$eMV8S-~L2z*&F z5q=j>?Bj|bpTmy}z6aO2vN`XvHK~Q8Dq-aevwa^YJia{|eJL6o4ESKc-P}k z5)=2p665B4#K+Y2;17DeG@AYDb|d)UH{01+apW#*fEb3ze)x*Oi6O!obn6~~TN$^A zgR&GWx9@Fbol@9iqrh1>v??;+xVNU6es5oArmcLE1Q`A?U+43l?FHg~14k%9+;jLf zAD*d13v!CWp4P$W^DqE!AeLVp%dho$U*ESAvFa0CYB&4zlirSRN%D)0P>tCDi@AA5 z++i~;!6t~_R-#3NDK6F(N!5Fe9Gh!}s(8l?|0H?zlD4^1YUSaX{n{>*se_ZEI3Saoe-D5SPvxri0; z7Hsf=JKWdbsXoJCB*k3^Bf5}s;|+Zq+;2ff6u<%(qQJ+P`Ir>rA9CU@#>F=7M`3W& ziSb&51^l~#r>|$WZNGX-`a9{jw&fByKjD~1p(A*ey2$x#J}xd=-#3jR+S#X<7VR-3 z#iDI=qHQW6T0H}c^lU=W()*&&YO#icfU2MNM?QHe@9K5$7bR0yc%=&aaCQMhDFjrl zRp)MeJzaIg#;S84W%}srRTm5*tlET&cWzV=Ay>~I#AKsbb?3Wxf>pcet=`dodh&2F zt5S|t=@P8cGq6g}CSa902gYLLSFcz=9hrn^$zn9Bn4XuS?so<6SWch_^&cp$2zB@@ zn)STC7piyEHI$%E&p@4?O-Nn%QEZ~JFCO{V__B$29~zelj)9i{lc58!8K3VvVXZwg zthmNx^$7b^yqdV7c#Ux7N(cv0!I6&0G<|eqI&x(1|9df!&5p>H5=815fa}==L~7`b zbGQ@X6`EU!d^zg%5m`HcjJ_^>9X(ih8j8^`oDaXiYQJN*mgmm4`Z#wckm zg&bX2ef_-B)Ln}MzDQj@tR56~=+jG3r)L1JXA@8t-bOKfPefo~Bnh1rnIOJ%j{3C5 zLc3)U&%UtqSga^;-w<|UDR9n_SZqjy{n#WEPR4b(3x0xUmT7c&sU;U$5`0rPKV(-= z+0|o~JZ#DF_UwMU`Zw$f4gc#k&O7Db2R-qk>Z%*R4%9K^M|`vhkrIadNsbvBa2K}3 zpn7p1CZ7%nPW?6+&oEVXsC7mb&aAIn7u3ZbDsruNZWw*&JWStcXna__U&CE8j1K{@ zfunPSm3uk(;uS#lBk2D$F;jr=wO0byByp`Ft~Cf*>jkEc=V_#pXbA>{GX~(XaVOIU z@YsXW()~}_S0y^&eefSc1wzQIPx7V8@4htyz80iq6Svm916g1d+^p%4;1ztJBm9EL zg$NbkQ*|R>xCTz}HH!ciIMtJXjh=rgwXb2kCl(Bv$LSh&D%r%xkFQeW!TL8DQd~!d zTvwayoYIr{?3x407WY*xegeP{P@dbzHryMtFJkJ3Z_FAKlcZk3Nm|fx-819esE(sY zl6bM`dKAmf_;EYkNIF?i2RQ8YooC5_#=4%pw*P{4n(7gYa2tAe+8wTxG_eEmniyLj z`KlSCY_pL(tp`sV)n>a%4letZ}9ey5M#odL+83RamW$?X8 zZ*LE0;Yo1yW#IfxnE!Cob3Q5H|Fs`4)CaP*j;w$v_IltMkTrV{R<)n^rEnyb!KP#X z0p3Ll&`qW0Bx5$w`Xxqzm=OvN-!Q_X=3d1++qtZ7T4}!hp3hXLJO1@7eRtji(f0^A3;Bw5H#Mxk*MoIZ-utr0Arpwpzr0=V7r zB@ouTlI<#qxAd6G2G6JWn~*+$w5lG|l3LQs#!2ha;L2OJ0ZqrTj`d_Drfr@5R70$! z29kT3bu62a#F}9Qnt5Uo1ZmSh|zX zP&IIkY-I`xhmnd}G(+Bz0P>9l3@}BVL8a(WmEt{oJ;%%oQ%0_e$T5$_Yb`sSAWRY$ zyy1K=fC>nJ3J8{+RG1cP+g@z#nV~T5C4Xw`|Z)VlS|=c*qf0%Bs>xwLvFwD9wbYH(@PW%j_Xm3^e%kdIZVSxdncav-->_s zvHlyDv zEYhOl!D|fLEX1SFrr&xx-M{VR^ug=W zlk|3|>Tqh%pEY&2s=>ot0EH*}hX9R#1zJ}m%kUO#)eAP>C|C0UYKDCM&AS?<7^2hw zJE|ALlAFo46LhH&3!=^$C;S3Y=j;KjnB{m5VtKBH&#Uy^sl5deJ_yN4)aq~P@bDjb*}H6#6{`) z&hm86JJKC^A9g#>wmUFA^?@{92mji6(Y-tIPih#fmPB(JkFAFnV#Yv7H3HnA^G)W$ zfq@vFK~rzK^!)U!Xu*b+Z5fEG!iA)RISbm$}~T>PX!Y+4~ADe?!~00ydV z<#H69DIsLm*JF$>VL_R&*)UH@lK0Ww;r^8PeNmX?V$7}m*w9g(E9;`i&Vxfcdc2Im z*NJ)P|B2XwYyvO#%){=<->pW?JqZ_<+TEX9nR`3<&G}#oCW9lP709dV#{HpLkXefS z00Zy?ezb`nY4W3aOn$&?6K(Kg1^LlN0`Ljm^(pZqExN0?QWg`LTjq6v&S;!1cweiM-eHcRl}BfPWhQ=SG4h z=YfF_<{4PTKWFd%Tl%EeW8(@C>C^8J7)E@G>C-*&`$Ytwnpc=s6pIsV%6NYMt|yqT zy-=rfTZ4aZ8sFZ5<&eck4^fFaw)DcSFg{|Ckj}akJ=JPl^N&51_fF{^_a+N=S!9NH zMPGPE;jQV|ZL^4Q`-dvf3H{jdrZ>#pOEoF$<7U zeAVPL&B_4l1vX%&4WnQyWs?^gP|oG3v9vG;C*kb7Og*Ce$%P3?v9FJQd2 zkOsj|so#N0?Ax)1^jp8OjBiU@-`-A$*0)MQArbrMl8#pu&hJ zR3DK~4U0f464Rcu;`E#FHekQs@DyzA`!^@5BYG*SJ<&tWgSfaJX?XSkKxTdAx?tm% z*_i7^itLGRo1n=y`lD9*BW(boaMfHq>_mQL?0%$WkkwM$XQPS({ekE+KJ+UfHhTaI z&))@)ARfp%*m3}hf(p5)Cfv;WFd7ek$`|VW!xUNBgo(TGdxY}{mP3!Fg7Pl=xh`nzXP=?Qx`^Hh6%%4*;i)JS zwgGL$xxsGO2N*sXk6ED{Kw=T(1?7-^Bn@-gLq~u6hb95AorZhKN7{b$o%?dn=p*4g zcK01PcDMb6sW3hqyNlPQ*4}eQ_h%=cdK7kf<woCSJtJ_kFB_`c99>BabKKB z*`3UA5=9RMtPPzN#PoAf$>w-T&X*w4dlwqXCa!zZEQ1u2DpJeIf^?7LM#p+G$;~pK z6aW!4!Z(r3pko+W`zx?z!?k}UTfjshz|q~<1Z!p_i4N-`ZtS3;iZ5<^8Jb^<>m-|p ztW6a`b+zt5>S;0uj=>GmlfefG2A9x{PB-3V;D?Jo0s-R(1dJXD7rIIQj)fLKRmR#& z9a_to0-U)J1^{0AwY^Zjd4|I+c8d}$urKC0o(q> zH-ob2A-&ES?IAmO0Q5-W#JxtiyJPwhvDAr%idr-)j_4ZxJIVW)Cb05c@qy{X*MY;q zRo>LAayYDG2?n(FxG_(!zk)1B@fZ$kW%f z1N8L~1I|;pRIAs(tjt|ky0n^UHt}yyI0YvfRB)uG;GNM<3dB?H6!zHz7$TiUU12$5 z+6FQ}S{w5SxqLfNPvp0{LhzV;iXxc*z5#tm1^STOgN_4GQpW+4^c7%ove(;S9auyklO&D6jbQz(UaZ$L@TiuyBKq1W-@A~1ih?2gWRSo>1|xK=oRi$p zIi23@)9I|8&2IA|41Y3j)2(?b(*y_|ZDa}=G$Boje>*}gOVct{8`K)K0&4$2wvMKD zDchKc+HVOF3J}`T#fuUecN6YA9c?MCapk#B5kNhW1*037g47h!B!PC1t!}~ILf-{+ zU?0Z6zr`>y_g3z$upFCbg2kWJ0AV*vK5t2xC6`(9`e#(+V|KN`l4tDZX?At8B?ETz z7`ytVUH#mW{m+24K7qJ9A8$c#7J)ekKvL{;+dzycYi9<3e`yj2D}#a2$b}vsGjONZdb#lg;*l!`;8|~A9BF^>)1T#u|0TO&FHV+E7t_6oI?a@U0yA zLQ_Z@Lp2x_-aE-X6V$g#g0qx(6bmOa!P`bu6K4^dT40F)=1~MN?<39#6z6W2uJu6Q zfJ=jgo_e3^2dKHBqFlQ+sErytL{oSI3RoNQk`?$2*yMrO%y!5ZkOg?KJTMtvD&k}J z6X~~Jf}`3c?dAA*_M;HNHZb6wU3>1!+G&ETj8)1rAMsu8D`5+m9lY}@@!&8e;6bEK z5d-6+0X#1l5BS%R>ewKn|A)^x|CZjP*Uq!(e*Y-C$A**A1@b2u#J&)+5NLxP1da`* z{ceNlL)dP**KdN|v8numO|Mrq*?T)^c~LyD&&S)EpMI8JVbm*BtrF>2wgqb$iw+J; zvRc%ej*uE}#e=F!u(^hkir3=@NnXYP2Omgz)`nP5Mc+Vqe9~(aG^$o(wI2aC-Xt$0 zo>0^}Dv5o_6&JWsjca^8{5_vsj|}DtS*S667zpS~UrcqGI$(O0RZwa=2q?fSXyj}A zDqlFmn+WM$`J{=1m&Hkq8#4D z7wpK)(2fBHuzi>(U^G&m`w>8+W>fAb@VigueoSh$HBGB`;siW{$n%`oKS6#OC&Je- zn!=3bQ}f_K6UfVg^YRDQfep6wovV&5%ZXU`Dw{3AU`w49dW=Eb=O5#VUZz<$Ycy(V z+i*qh`T4IiSN&dIVVPVxK>I5NtRkzV*)9=Ws{(bgUi>L~W-q{-_iUlkM2JU(p5~+X#~-N+?)8r< z@racm2Xs@hIB}}!a+n3Y_yIR*(?r&(IRsdJgzeW1(YzFx z{X{j&Oa)#(t6zFG&j!ZvtvNFN&Z!>haV9O8?0i4(y=9Nj6#+ zByjWx`<{AC6LSnzo;%2F52%#pdZaz0AQw_I7R`n2pNhjLeEaWH`?Y9)M?@ccTcI?f z!R>QlFuw;cX)t+vk-z*VIhNVd%n$@~fBb=kkdOQeuH^Wr$D9m&G{qw&0OQhR9Lzz1 zxh@Oo))Ep`0=3#C<N;bCN}%ueGIoXN`|Mu5Vr!{4E8X8_{9q@r8YFHv8Vd(7R)c zjRjUY8+IwM?-TAQg8V=%AK5+bZ}#^gz17H%p2z}q_35>D_dI{-8#7n^IsMiP=ze!6 z%}F@+rF7rOqaR?m4f9)0ARv`b@51gXHv?901^Dr*jpy%H_I3wBaZIqAfkMo_R5huI z{UHwa(Xr>!c<85lm057Fc=VF=Bn#i7R@-B(uEJj8!dBOQ=47vbuihGRG-ShdC$NEFHbyJX@Wq4(18 zY_l;Qrfq5avF1lU!J?47d}e0kMC<^m#w}XBy9r_%6`9$!b%O5M+NlS3R-aONaA$Nv zQ$-Z`xa|!5(rjjA1_IEj9y-x)~9dfE-<*IfO~@C*czaQHJGxd1p;bT||n zaw{TkfJKOZ@%2}4QW#DtPX=QC9M}{>4}Zfc?oFKjEP4{$aft%Z?^`nCB-nY4^GzlE zlZ4u_rJZfSMYYjI=|#mZ+~FTFq6P7fdD6fYG!>2JhVh`W|yEq`G5$I{<6-FRd1$!3r`>x+BE7 zQ39c24MW9yc^iM&EukS-nnXy4;JOoMI~1CT0v^$!d!I8N3c*KDgxEgB7;N+ex~Vl# zO0i)w#$oHG1aYI%KdDv*oPrO9sMeOf^^MPC4WNu+s<5mCmbcF_MpdVKrej>;W?&lV zKvQHO5MKmpGkBe#sDHcmeWTG!smZM1!#S+_V=N+)YNYbuf-6tJ^!_U9rT@$KM_fO+ z6!3xPB1jdAnamRl_#!EoABT^@qrZRm(^2TOr#WMbm}q^I1|qVOAPaAJyfhnlbP|Vx z_N#9EFx^XLODl1J4f6*^&_x>YHy+UM8(RW z&22w{f~X5)hlU4@M6-!%(#(2LcwM?VDCjx;24~H@iP<*I-16M=;F<;~_);i1rd%+e zi<*^OcH`1hfA~I9-9J)pC-H5<>_FABemKZ$tlSQrb-4KHs+;=}W=(Akz*Ub|8A?_9o;i;o_AY8mm+D5_;kUvo28N2X#1=eZa~uf2oQsT!B7unB!DaM0wRemCo3MH{zP6NxaU2<@n*3lZ!a*tVT&I_ zMztMVXeAsUwll@}P${gZ7uWow^{lk4@~d5bgN5|E*B5&};PcQ;Q!Sv)?*TZp?JhA- zA@ri((z@8i;Mys_vPFYlfbh*C$SvLMTGviHZKaQ;3dR6LgS~D$(~k9|(rtPrQfeNS z!9f-_ktV`BHIHq^pk@9P$7M2!*^gjlKRS4im9Y)Lo6G4K+-|}E^^1g#i36fSQ;n6yf`(qrKAE7ilppOFRQ*!#) z>(LK6Cc@uBRr5TPSivS&0jzDID{ZAy#aEkPjr_wq@=i9e*cxC4#N5hM9bwUWk7OW} z8J-0Cz7V_9-H%Txz@1_Z!m{iu6?%{OwbRl*vvj9jS#HSZ6~Ua7$eW5LQc;?nT_C}k>?PC zcmh>*EXX^V^4uqR@)Dd3FqveS>~5GK*y$q@^|@6pZt?BM#NuyZ5sOp$xp!h@_O}wx zgVedwk=d3UYsrz8EIS%n@hUV)T9N;OGC=5y5G_F&_{nhFJS-=dE^r48E&!izI#cOc z11HY-j2smuQU+Md^jb~?J9{F3DZxL4UOb+!1&T(*GdNq$voq5N8>KAJAQVQ-tqd;*+Z<`W zg6BX!UXXq0jf+wC(IQ%5D6N)pBb#iZdL#RBHid`PI04Emfpj$UJ`{$tBzPI)VJoPK z03D$a{ClEsOQRgFCStt6gXi7_p`8!pJ+`C91Nz*^81F*^r6!Mfvoc^xN{Vbj712bm z&e{4_GK|k2OqpOGOjWZ=&y0_K0k1`Gyyir3_(9%regI`Rq-rLS?nd5arnt35kV8f< zC__Q;T#$oJ_v0ny`%GZMhA&ZrZ7>kXzWvLui0RSJ3|jtpg&(o>>t8j zTW$n`PfvADPIIf<2P@OFHmAE!tL~ZcA8iO}vFV9D4_-#eR?Gw~N27T6WY(dCsB>(+ zjxEA5=Eo3u{EySLLS?WUaUTdiut0{EvSjuVLi(^9U;J9+l(K33ycA|9quA0x)8PPf6g>0aa_x z*k$SfFncHd^BlrOal@RPtH4?izUO|9cs3oc5{6GWW{u|8?Ua0h{Q+Jx&&az-%xa35 zg-)R?c*V^t7cmR2n8X4daE!`>)3Ly;gUBp&Q&ikISZ{B}DX@h66{q&Lv-Xq=o5von!)<{kXJ2iGy-?99Rcpx^;NNEGK>!G0 z`q9k|;{gt*nkK)fEx7e8(#p`i9nV0O_Hb`Rp4@=`NY8l)q~D?qxM@~uq+r2gMa^7& zgyz)*P37jP#ATRC(TEyOxEXfd5;2!XyqloAPpNsl=q}%%aMK9vb!MrD`b1hPg-#PWtRdY z9MmJF0KGtye?*}rmT&d>VxF*53WkSE@`S*|T%};HyRIRPnUU&<7Xv-w#YQIJ!Dh#^ zp%T2%J@CSp8J8E}9f_deg^P~Kd;loJizvjs3wf%?=u$UZsX51Dgx={&2?k)Pv_^$3 zDpfY;-D2XgV4^0;viE716!uf3GY@X1tJz9dvo$yxQ?@*|B<^#l4bFfw!;=x8JwyJ- z_#Di}1}SJcQ7otKfJwIUPHdiSZe9wBc)#%Pc0)(E-T?%NZr)qI=+tm6h=7)MZN(ojv@T-+#0?Rd1UlPbgaUeig zxMJ2xl`)Oxfb=4*T4SAs?1x8SpY&C!{!vVz`fJqy=wu3}uk=g@1$qVs>lt`qE(vu| zW|VtIc_{+Q4LAYWHGAA_;+13FX+S8a=j2hgCGJ>Ohxf$`YZut;(oGnqaWIZ^s>`dX*J)0`)5V?fl8SrO~=gH9>clT4sgT~4W% zmQX4^1MYe@fl`@V&E%klqSj1N1gB>|h9TU3c3LsVVH=_W*k;YLqQ_;OSx+%w8Dh5k zZugD83XHR~-gh-Ny5AMICz$;bJ3SQGReKJnv3uFreYc5w_UqvD@~MvZx63o;+Fw@FR)Hx;Q8suXgJpH350I_QM36h96EIhUI;v<|u+8=# zy*zLGdM?{vwbpDOW}jbMLsum+VavEu^l?n-m;ji61n!^p;@WhCPicv~W0OHoupY|l z2^wsL0iH_Rx48otMatX$&+susm~tgbEu<+h3^^S)7UD(|Z=8-Br!sS@Z2u5}21vFj ze9`*|C)hqVC33d^^Hb0~XO_G7$8aw1uFA+45Ug=Yy#TGyp(g3sPommvRI6GueVQ2; z{q^DwX~T_7ppY%%>k@m9pvYhA8Bl6fneqKK+2$xPEN~bRu@Ulfgrr`~UEv74TLkiG z;PZq(%au*dJ^sQ!P;Kwnd(WkLwpi9@#N|B3ga#2I;^>~biI(e#wwf1e6v(~Vz z$@Z4J_O`~`!&kH-s+PLOR1j3@;Dm`<;t3ko%rtMg(jT*2X2Y*@qMXOSg>CrBJ*6c4 z9B*8L;4*Aw?h5=sb{lVy>^3n0Z`z#f+L;!~PR}4aJww?E`&vi87_5b<)m(c7)Fhzu z41vg?ma^Z;m;H6A~uz)$SLVnKIPvS+W?F41X- z)mUC%Tw#rLr?n+I4x_-b;r_*tZme2$H#PL^b*I6oBaAx%9f)?PHDhluNDzam;7z>9 zneL&h_Xp|B!}<(_vRq=KqU1f=QrvS2jvOiB9rI`hi59nS2f*50i2^)jzgxw9Eo;H~ za5)HHnn{FD@OG@R%?^M7;l+vB{aD|;2!#xTvEjE06MWPN^x-5GTR_9%0;i-1UU$pv z_!U?L7V^@V^2yUUsAk>v?(GjCV!_z(&${Wg(797ET}W(4So0XX<7*-y-|mZC*Mdw> z;e2ks<(@{w#8?UU)qC!C%6*?Hw_a}eY+8$P3lFSJ&t3=b@bNr=p5q5UK?P}RL>a8t zK860An`XNk8)*YE`IujzAj32}@9sGeGs24C?3K`K9Y8}4|%ansd= zh1nvFLl)L1gTA|BeS1CQ`UZwzW@UW4N)q~bX8=~%we=b@%_mSiY)Bo9|$ zUGr^7iQ4DyW1*?YqhDh#vyHQ7U$!h~&sr_Z*)tB9a7@TaM}6_KR@D3xfgogRLn`X} zn86<@9k8r0Hyklg6J-^qTO_GL$S-m4)=5dQ5)v#W6A^zTNhO9*T1VsbIpWkp>9Y=+T5x11urDhRU4 zDcCj`I}8x~W4?^=T)r}vUv0NlX06YI>cVE7AcBK$hxUR&aEtj++r?^VnvGC**Z_;w zu^75J_!2ga5^RD@C2C}XYCtDd1LcNXxj-qVVpPu6M|sspxwKmHLU7kQaSo^z%7l8? z0x%+RDKq#ZOO{(!_zdwL;HzEWqjtN!{=pwr2On{-E}@%{&!y6VJjlb%^n*NtB;hSA z(@H|wAOY(MO7`*^C0DwVt#MV;LloA-QB)R^74l>e9M!a2ZhCH7xR}A@SMU?O@?LqV za~qU2R>Kp03BFOD$bPU`1sA)Bb9MXyd+LFV@J^;lGn@%}i9KRZST2J@IM`!3y1AJF zOKDeOqL^$*+MEk#)XQ@i>tJ^|*50_kH?Jv~x4AAio9l9TsQ1L;54kdj_43nq!9(o~ z1`px#qqhCB+;mZxCuj%gDc@mwjwwYCu*%a@gcTPGzxW<9+hbJV?+2sxoWRy|EFNE_ z;D+lt405QAn~_Qk$PdNxK`dVnSK`Yw_&k)Xk1%K*OuKz2d)yt~SfNU0Xp!uofdoe7 zBOq$38L!h&TN(00DQYeeVtHN5!|4SAe}`wRqn1hmmFJZ9R{{n-YQp9R;iuI!SH9u(yMb_5tZIz{NxAV}G1w2~%{@dUzpf1#JC z0Z|@AUCDelagzU%MQ|t-nFmqhqdU%H^Sk!^qe4{2^6Xr6KigT$GXA{jCWmM<(!E{1 z7M};wy}Z{AlSZERDH)b!7@)c~btT!55%2{`d@g%?(Dq}~9oV1iO;c!=0+i>~DN8>C zaCS5mwaAdN8`s2z2%;nv2@ma>aPgj2wbaON*(*H)u*tW=2~?TlPQf`*z?Mh8Lmc?+we97 zxRL4K$}Qm0H@vE~?;h%=Cj0OZ>~c*iQ0#Vo%9{LCyvbH5)1}{@;Z#@gn0$!KRR{Ne zKc+m%Xu982+Nn6(ldA8$8T7F8mX@~u$T*RYWSV6M-~>~-ztt2=-U`}(z7tk3_?!{q z?ace`0esh>&^K*$_BYJ5$O?21R$yg{tzbR|B@BuRd=nt}_{UV)LKpWopB6oS?!Kew z)lJ-m?4=8mp60!2Ew{T<+GH(?onS4K%CR#1JeX79ByReCoIPklhBQFU00o265V|7g z>3{cwxTl}tiWheb4J@7tKH<2Trq^neRBM-pdqp?=z1@8>fvJrCzjm}1zlopuf9&s*P zVCkl{fvs8SGSm6YNDVCW!@kv^pw$}Z4C<{_JVYn&T1|~^^*3%k6MUP;xrQ;D+#gLo zX=^B%2mVyhS78fy{{(M!7~>qa+ugj+Y3sM?*($6)V)Xmz1)^@V~~4|J`TS*v)s z#4TvAaEs&x?7cfqXwx`^Ceh>zSg?^qhYFfZx+Vj9o=iU;!Yb8&t+3_gLiav5-=te$ z7@NIEpw&i8}&hl z3p|W(S~C?Fpgpj=^hw>SW~X_YZ@N43{6Yng(+;I}XZKx9;mhQ2aF8VC>;1^xkJQ$Z z53zYUMFf%fKu)pGs-_dF3GO`PUs@SWYKiBQT)shJnX9^s=Lk37T`c{5+#l}ml)V@> zEWsk*y_dxOA!a`WeGGqi4o=ddpo{(C<=w^paLDl`U|Qr4^$a}JGfGPa>;2&?$B*`h zk+3s;2U5Q3A+w2Z-sHP~+ zo+3vGmsLsDK{lLI1TWgGWB>N8#T|R2V?h&BNorJp`-3~;vho3LG4oAU!QY;U#VGZ{ zQk~IXzgo=vLD%wTrbW!xGcaGzMlt_0$CYM&XXci1MSRJUdUYbO!Pjn=onoS4jw?XB~0KR9A?Xv=2u?Zs1lK% z8Wbj1Xp-GW&p@fzSvW^jdtlrVJqE}S*w|8K_x-dL8ms$mC3cy9b>D5m6zeKV3wU|O zE0I*`?D74y9&h-JAY_x!Jmso`zb^m3Z}RAGBsXc=NDH0^0mp&Qn}`T$HLzsa%GX7AS~Xt`<-z_kBDt zl#9}GvG4cythM&p`y?r?Gw=I= zb=Smt;Ebl_?%~e{F+BH0b2R?|hqTvpU=T+orihNKB9qW@Ry=Y31eVPS4 z9{=p!Fq-Ukep{>r5$&{PL~4ZBp9ogqq(4EWLr}rcJ*c7vQ#4aXb>6NLex!$DixS|# z0xxpfRVHt+u-1GIH@ifCw`zBZMqUHKv)!F}H&4Z3qJ#OSv7di?5S!1)2QoHonjYD z=+iE<>hT8V)$f-^+;ZzGSjlj%kpFFJ&XjiYj25Jn3yyW$JLXa$DCXskSTQdu znb=wWzF0ALXYL~}L$!g-fodc`Wub%0wd4*9l`E`Cz+B9HE{4kWeFl|c-FvrIQ_}ovWav< zoK8Gz?XjYgdglDGh-9GdD|VT9jxGpXhM>oG7Jy-ZYprFpql(gy%kakNN`o~?$W*8Y zkhWsf3Z*vDS+@$-c;4I<$Xq@E+?QrWy;x;Bh%X*{9pG^#e z@FbdbeQ#X?dgfRvqq+l@_k6T!jsy(3$`3E~A0R?xsPA$w`6>;H1Sb@ApE(5Z+s6)^4 z6oD-Up54c2dsLZDghDA>2$YXqr~9GN%4|2fDj7fRphCmwv{5?EMZdmx`1t9%uT;lR z%Z-W!@%ULG(+x)&_Xe%Z<|&PGuVI?!@XRhe%;TD}Pyao-hjhyN@ZY1WUzRy<>h3jD z^&pf5$Lk&b{iof?Jk>IJA$VN$^ltJ8cV(t=YgF`l4G&(vdBfi~MSm&t_8QMqu1yU0 z`Upz&%P*&g`?|#+e=m;k3mZ`fFiLCTMTWZP@jY>qz zp4q^-so*jU0mV$$S46$H2+$`3QrM&F3em;k9-(b;)T3LNURIz|Vd>q>2|SsFHbzez z$v+hua$X7S{RtR)#3VJb`ogLv?mkUT z%=Jy^%s5d|x18H-z}V#hIS**Sn29<3z|L^An1XTe3Nsc8;1ujW!lJM|LoxH}5|I#| zf$Ld%bm*$|@Kd+#;c~X`v`P~0y^PHI!_@y>nXewcdktR#OgnqFJ+2|Y&>x=aU3!U& z6f>hB+hj)X+2|Z@ms+*vR?O_2$~jdzk1LEQ)_v{6$)=7_&LuAA!BdktyDR5%J-#m1 zU6aZgt(<*b&KFZTrLU3mJ08JClU`&1+=f(T0IZCEI#2E*w%fEQtZpt8_0PZ=Iraq3 z{(^jR9tu{wF+0pcJ$@%yJ*cG$e9ip^3C_#X0{oc7^v}HzU>#i zc=rZ0;WQa@6bvh5o(DmnX*OKwq=y%Za{Rg)At5Zec`ZN%zsOE^uRx z4Gpcz;E)1^a>-IQR`J}WCi=+zuDH=^P2@#p4l+3a@43Ht`cm?$pZ`b6r22dScVr21 zsy~*>ND}YR(2=+cC)z>BU4__u=abEp^VA@BAlRe@v4W9qp$^+{7l*~UZTuRb|8VGu zDn++Ci^67>I#eq0VbS+nzD@$Nd}f-BtuC7=wNu=>;{?j<%YP{UJbHx>N0ug_lL}gr z@sjj$D!gx@K1|X)v#g0qf7qO)ze=y=@5f!HxD=(EJA7M+% zcjD?tc#1`=*KcQ?uo~g@{rul1e%*N>(Kz*4eO_C@+yB@e_F1?U_VA}wW)HKYEwP9C z`TY)m@IMR4AQN!oZ1!TY-bS|BY`Y~)K4!Ca&bJM+$f}M1!Hjvb_^E&IQI6`Iu!2$8 zOy8``p1vE<)Lk!Mq>SF@sJ{ILsQ!evVqX0_s{XP$`qjTz={%34v_Ah={LOE+M!pxX zH2F>xrSIx*>gV@Je(CdUynHW^e4Q(d1&w_3&L_?g0$E&&t=-#kv>PXvDbGyQd`&Kv zE!dT8E4ci_9Y$>D^AM}^3k$`I+L+OpFBhhRyAd%DF3%z+`0WsWJ9ycsCs5fM5-k;S%`vvPC5ffvt3z|w&4J>s_^`YRQbnU@s5{n) zF*j4gk$&sOM@C(-|yJ_lxPy*~f=%>PuM6>|T7tk1#P ze@vgtpRVZB2A}|An+$6$K5I)td^RQX>~Vy519cDU0*F8owg=)e54wzpEF%p0D-+*K z!HTUt;>u+gyZF|v)@rzmzdBfDZ&%4;QZXK5XddJUtW588Sl)O;bN$Uv)$qcT4mQh^ z7Xmh(5N4I1E4;B{!=|s-TzHsj^5%}dl?_Gf3-!O;hI3*2W;X3S?;fHw&MLp&BZtO~ zH2V{^b>hsZ)m3dxu(oz}Z7q{vOzw_x$-VT5%_%ZJn-z zKeMxuKUL(PU_*_?kX879$l<3=_$dfK1;j+Wjxoi9O*}}pz^rBEmC$hp9Y8u$+F6aL zMp*KoMh`FC#hM34EjC_YP9AG{qaGmo;~0m4RFekL)XQOyYCNYtRlKpVmtc9>JgWI3>Azk2ZAwIcrvFaU zzrEGICHn8E=$}X_C`Na^lQqvN;b~*eMv2XPRsAmMw=Aac#sl(2Nh<;r`aTFx1pI-P zlA;PXhmT%35LjO$g5cN~1Ug?1Z-rtk(8DD?xR10xtW9eUH;}) zDBnrOlwYvW2lZ~>8LRh^xk338b~N>V?s3%Hf_kg$d68t4j?Yny=}XkO`Hzr{v+akg zmvEdm0OMLF*&w_JOb$~e%nc;~Dl=)`w~zV<$nkQkK~{k8)<9@ePf`V?+9Vr4tz7yT zM1QE_iv-Fl`oF!E^q-G7jNEU&v=asA{YB+qhE61 zqO@fXVzi!tz3%?Rn|2RVwOGOeX^nZ5%R9>@W%EZv1IwNAgXbxqbE1{*aA~!6`%|tp zAjGdxPrey@NQ>`^nSXhC7f+Y1lxP`pKmS;R(9y#C_z^jB@yl(ust5l(ho;5r-N@8pM`4z-z@9k`oZ@A!Kh9t-bT(T3wZUlhd4{T9OmVu(sxV9 zR0>6-=wY<>U5D~?f5-o${mot{Nya_QR}WXKhgAFZ^M4^qdS66Uv(OSewF(a%MqmsK zSh1xn&*g5z6;aJzma4?JFAU%MMJy;iUEn2v_-w6uOp{Eo9ha4jPSDdAikd++I@sXw zTa@b1AkZmZ{94$}522vLf&)tNGpBPXFYSRB$CSt`h%&g#eu+F$(FPR_(Nl_%$j`Y5 zjBWvoUy&oAv9;xxibJ8Id})R_QvH8sYx=+O!D0HZpZ_2&A_HVD^rO#$7iVmmrF7=Y=AiDDbl-_{S{}=VWVr%3*0|Ne+^*w!S`d@Xw>z{EH zO(C{y@H-sOB>4IjiIjZm=TCI;II2_B1Rh$12N$-HaK=Gvs8vy{c`-j2Ru>9km*$T6 zx+B~N=?jY5F7kVphZ_)qBK-&}E^4ECE!B0B%Rpw%qq}mc`)6Iycy(DGPX38q9^mtn z=O^%~C&bZb-}lz0XuC<;)N15I#=<6UeUe+z;k#R{NuP=%-q+`Zhw+|J zD>Iu~R+eus-&XC9j~rHC9f2S>YSAsTgAF=WMBhOX8Ex`e1t{bAkTRwHz0-Ao;dp6` z`}bGwpQ-z&jau<^c0BW*4LX11m*mzjJGOSkx&}TaMw2Ytp00l0)R81w_lBj>93wt{ z#oUc&e}2~IP~ulqj_Cca{Jx_c9NLX%K6r2US%1NsJC9%p%SN;OYj_o_&q*5QX*-lM zSMQ;M3OeZ6LKDw=fDzN8ZJJ1&E@CCAU= zjHcCY|K=B2;9!5)a`E1Oy?+79U)jjCPD_w<8AETDmC2B8HZ8ka>TG$AoUbHbnJuHl-)X3?0dgiVYnFuEIi8R=;msO2o=6!z- z!SjUxRQosP5b8)Hm3^UY&g&kTB4PyA7Dl&j(ukVw+_g7ImjSi*xY<$UwFM-ksZJBh z-SI1;E@rOmMC=pY!wbc-5K51V3=vAxFmwf>7zxdI241meNiWHKp)if+@*KZ(y3bk5 zZy2)Myi{|hZX=B~+~zOumwC9e*lxJoB_ZwAAWID<8crtiCl&EN&}vHC0b#;vgAm&o z-MG?)J30MixRRGfIN;g!6z|0)$Do}T8=^r#QU9vgr51@>lwy>~l)fzg9D5jlpAnm^ z5dU-;u}moH7HUUVWkW&6PAXGl-711Z+OQXkwze4|Q?f5jRM-v9>QC5qZ~)pEn<@Rt zXbfO*Ud@a;+%jwS_~HJxQk=+5Tue0w<9mtN&@C-zwco+8&jY zeXmMwTp0BX(@1pAdK)?ZX*J&Ii}AMd*g;jskKzoDS+|c1oFYulebIS`>)js7qQ3&n zL3q)hU@NHUF9Bgx>9wJiC_Fys*W zbe+3OM42~|4@(%HeQ1@A15(>!!#m$X2)DyLVR)Z4E|Gn&)t__GWQAgky7q&=>#Oh=cK3OtREC1MRcbG`R)X7`=k~3mB=xW`+GV4&RikI_s&y1L zM7ll^Yh`@g?vXG)p8m2MAK%B=@6@H@pvoMZY1>hq9?!rAOkA|y8BwD&gx12y?d@!M zCd_<+&>}H|7H#u=%*5#%hGC+DCr9E2t7_4=3lipyV$)Z%J;eAV1HH(}7xq~l+uG4~ zQ)oklHGqe@YRVw3`46^YTQ+zfcD)*(vYPV(#;Mkn`$@ee&!d<1ABoQ#yn~Z5_5R7A zitocmfEW1j?MCMs0EDbje*(vHmyAJ>w%au-g-izR8b->Q#149)QRFs8U$`wXQsR%i zsbUxl{99<@wE+t^WU@d;G^l0uFKPGK)o(DT4b5GM0w#(<69;{DNPY$X999m9c7n*w zO7l7_wYGe$ui>DtQr0@X^;s{~y6q+wlgnJITn|v!y4530vjO^RpgA;VV$vA>A}?#D z#%MQ;yKVL=RW(c>>>Ej<8N?n2V$;L4o5=-?2iP+nhFi&Dn$eR+y8LU`Hg+@)k*W>W zOW-lZ8>7nB%B#TF1*_#HkxOTYe|nYpGi#e{y8EauLk#P!*M~O77=0bDjg&W%IMt2i zx4W_YYdbTRbJWg6G~q)V zRfAU()&w8g@E7Mp{{-ejoV>+Dwtyl7b%vT6vT@lijC=AY3Dd8P(wM%5d%^Cue3WjH zbp)>}7-{r&*5|%h&7Iiv&YxIidQTb2_=#ccZl&cp#gJ{I2}fVgQ1{# z^iVfxcWtKQZi^oz75o!+7l$9VFf`r8#uidkJYk3`LdfjA^up-HSB5GYh-+<-c9xaj zE**eD;CL?B5lhI(IR0Z{v}~AK(T{Hf^1D@q5S94Bo-e*2u?$%s?&PlNq017c2Z8zJ zr>en>s^#x(MBPUt{h)Y0I%FI zq$ii3L!V0t-7AaG3!}xU-_aGfB9FHbWYPsx$zyu~F!jumm&|^X@o%8n^PC(jAI&Sd zeU;tD;f;&VeqK)IuFSu1YgE+8D_zkA_wvtn_wW|L_vb-+F>_7w)vp|ajarUP^Hg`r zB)t<+8fWiBdLsbFpsR>^^0CP##Iln%hafP=2}%BoV}Z>*Zp-5 z_e#ZI$Ji?s;ZZ8>Jx-3bhtjgqVJGu4#adwXklmiZE_k|$_R#H1qmSQ$3lwu-TnzDA ze=^@rd~Mfc2sP4pzykE3n3uJIc?a+Ms%#H!ce{#s(U54f1WwATo1ug^ zf~7UR%_m#&z+l-nCv{>bHdo}!G|Fw3w`x&FK^bkjNBE{9)F6NKGCuCmT&7y~AbfL3W zQJhbWnSq+Y(tojJf&W4VaG*Wf3OyTa zr>j%$NX=rvMfBQnrK4+48eAwDZSQeEifhm zp)u|#Z~2ICe;*E1o&2ajF)C+SYt>}4l6;7&MOO&Vay61jHzd-HAq`Ph9fet4 zrs`G~gvn23-4vNpooW%G8f?1sgDUb8n%(#KOqez0vdb`v{EYtwH-(u#%eA3-DAP2zK zP(vcR=j36%U8@&j-mdf9*~~zygWvN;7Y5#|e?FP#-~JCl(y=_;Hm6><8!0?`Ca-9{x}- z&RQvFEaoi%Uc&h5(HK2Akd7ApW4XNW(Jb(_$j4NIf==B7I3a|OPWvU)ehTuF;d64l zjMu~WmIOzhKQ9)E{K?8>-ueq@m6s}jqCAA0m=g>(-7mVb@_oz+gj?ZQWU#KGCWxh&`P~so5d>}vl2x0^HjCAk=z;l;)mCK~jF6<}{XnLj zIa0^UXp-35HwBq0{{H6pqe)Fo;4dfs+Kep{?SVfZ7G0;}#mr47c^C0_|Ej&?K{7BL z+lOs*ip!7Q#6TaI{m(K`e~L?kE0tH2Q{W>=d?db`QiWoBBeU28RI;s+f02{nt&vI5 z&+gPVL(e{{ji*uebspLJUysJte_QAe*7lr!FC31SP&cam1;TkLse2h#NvVUMu+$5f3*XQB<$ zH-gEO{!M;x)WGycZjG6?_S*iN*l#jdrjDW-gQA+H0yH`CkX6WR%Kel%oie}Se{;{8 zfX!?g&5}4@QgUK$Oc;Gi$Zpq1xdv5?nfA~*KPb~!t?v*=?vNjMc&DihIvG&wH|@Cx5yZTZuQ-m=xb*~Y9w?1kvfoU^3g zyQ($*%8e;)rXV?#qJswyzNdUu`4L@9`(RJ@B-4If3xMoUgYwO$;uL;(|3Xq4vY)fl zc!8;|z!bivZn|k~HF4j?%bmJF(h>ZBxS(~o?d0i@U9?HZ5bDvVTilln5oCiHXpDB$ zr#i^UDWlo(Om2r$Invg&k&>ON(p9p(8|nEHtB}wv}wFttOba2P5+AW zP5rCO8~X1r|EzpPwBZ_>Pqd1omW1^#JVj5%S-i|VJwest9~&P0f9yTq6#iBe6PJ8e^g7)TsyFh6aKF1gr^ zp%7IN~DX!8QyIx@aRKT(Hnt;az~Z`O5mvTps9 zTT$=N03F-o(&1cU`~g239Dc5m&z<{XpZEbkJ-UJ)yMmde{MMiFv)m;uJs8qxeWCJY z8^z4``8K?hgP_jBKuz=lh?k^H42?on-pSS0m2J~Q+({59B`Qx3)l~s$_2|mi^tjkd zeO)AMeCoDDk`U61lt~P?*sgrQP}eFA-Nzw3jx;hrMKVP05~ba`he1|W61t?!ZZ*`V z0__5ElK+-!{?!8bFb9f%P^DaSfuHr;_=e}Q#TpB6os`A?pb?&CJG%BKDE6=rSET&G zQm4-*t;WoKagDKiy<0;;pR4s79oC?3{VA=PWk_qTXleKn9t-`Z&wCE4<|o>j52uK! zoR~6x5Qm=-no6sVzpKm@DYw8+XXp9JsV8jiD$#4p85`93WrKX5@+*)8q^>$qBtQ*_ z%F=gD^zeS^*-n@Xdu1~}{H_lnZ#giYWilRO{decHEcUSu|C#mpBR+Wg7QZm`V%_Ku zs2htTodo17%qug5nKJ_*iYZQQ9GJKlwed~%HPfHE7W$_%fJiRtCV@M{VSgK+K>hER zEfVGPrL#XL-{L-9N(Je^6B7P>vm(*TPK%|qoYEP(v3oS{;QTJ)j9tnhhY_)UyE0qd zi{GVF%%7N=#|E>F#w%wd024F8V+o%2#QqkkWHX*1Mh;ciiFzoF>>554mvWKn!Ssy) za?ydisDe#FEQs>UcCA9!ay1egg|exVSAEN&n?WnV`jjuZP*?Kpw=K=h($AQ}V&O}K>ku%39Omr>XT zvSvVK#F+brgNc@9t@WPQAWIvRLWjD^^2LGZwDd7l9-V!UEl_;=$GDQ4 zQ=8x_{>0WN4tAkMk6LHE?^a0GE%h(qj{cMuAoZ7mMUcD9wwO8UfTW-^6pkK9E_<4Y z3r|A#vy%&;S)sy z(QAyZ-I;rInDh8bjtHGX0{&mRL;n(jesszYnhgU=|GdQV%!x%tQAK3VtQPsMaVg%E zr>r1oU1m*YW{VeE%P#P0lxA{@&6*`g zC$(VNSNcbMC{RtOP~#--`mkETAAp*mIwx(18jip7^C9|2r^BPBHO5p0GTl;akNT&Q z!Ab(qk8Uw$Igl<%sHCJIPqSFpxvQ3NSs8uzhY0)%#RL_3oBckoQoS#N%~={>^bb-M zL;6#Cp-Wm?jOkC3Xbp)%NVHiZO&0<(p)1r=HrGa7qeHi)8Or9wag{t!p4M8(t;oat zRhtU8dlT})5UncOE=_hwiK1AN5Ve}B@e<&wu9eZZet-<#32{+a5Ba|+k6OkH$zvIC zkD6j{_y3hVF8#MHkjH5G_aRG0ok%um4w62eBvbkWtaxSAee3VM7&B!xODH$Scl%{9 z7Rkz|^1heKz;Hu!=z)HAY|9KeIkDubLZ?dMSSzb0p_^^vZVDrI^YS~Po8NJufK9?} zE4=OY7|3+0iGjM$dtw~GprDxf@B$wtey1rBCFa~55lHHVC_66tu;<;}^?C$D&9K;* zPeh10ix6Af^nH5cKxPzmEJ7Td-KjdK`smO%51>yMpbNQyx<{V#abZ}YY<2?5Ni5C8 zg?BD>E0oo8s>}~RvY%U_)D%)HmdEP%!h$p+3ylupcc~y3Jx2d*QY^4Y|6IU7(MP`z zSk~dOQ}#04`>h=T8xACB5lc=k7jdWER36?{Yji%?IDwQF@dV$R>!5G{mhVH0-20BH z{_E#oBOs>U-@>BuB7v*T!0E0PCZh`uC#DB=G@gT=rtvH2A+Ox}o7e5k$xELmohNs< zx|(cF4T-$1JSux9vOnmv8|!MAKBcmEBzt$Cy<=SsCgZY2zI&ys{CfGp@~@(Ln6No| z@IJ}$&;0Q{!fa9$Kr+KFs>5DDcXy$3-}iD7@4 zkSPbm`zE-vKUodY)yeO<8qD%)56sK&nz3tMgpKUm?``D#$q5_LI?CPotRlIAx}BeK zGpQT+CA+Ho!=CX>DqeDd8QXT!#^mYwrw#8+o@SpX((YHP=UD3CO&KzPe_t|U-B${=Bn0+NWoy&wbvwoxbr>As52RSo( zzwoE_Y(%XzZ0!LI01)OTl~ux&{ml9JP~YAjXv!PwG#2bP1W&BEHr7OYi3f5WHR=k7 z72I>Q_jfSYZ^L$~zxw%e-gUkJR-L9awpFA-V%sgFuPU(8I{&!g|PJrd~4 zgUb)x=W`yloQoCuUCi5x;|4O9uLF-P{^=77yr=r{!9wrdYZB{~FW&CfE1i>VbM78M zX%!!N=mpni)-HW=pO92I=7Nr}{i)D8P`4|c@pP$0O9>}ghk&%jHErVqvChE6*PnC) zh+fbZjBS-criNf!S$>9b{nL+~Vsd*V19UB+)h}~T8d($f&+2tiS)X_&`UBAH1{>yYT;3<0S%TCa(inXMclu802HjLW= zxyWry6PV#(n%le58y@|N7b^!MY`pf5lsaTuh}O|0Q5Qy)Unsv|tV2aM>Sru2J&9FS zYs6Ti?PM&#hkYtiq>1&l9NZkD&PbKK2sSsXydv!K@|OV zZ{_;wPEK*T>R00Q7@U-02(X`_?#oYC4(2(^BDQUyLGest@HNbFI9 zKhHov1K&zsgrtishG4tyWvKd7@x_)Bog;7&WK&?`Tr*0>)IeKPxi&^`e%pZ>-e$P* z(d-V`S1meHgE31sO*hU@EU>P1lTo}f%j*{6GNp^0FQA^k@fmJNmfbN5&wbvZFjLA~ zo@3qc1m?zoq;c5P6W|{Saen?>?-TFbCE+dQ;25jrM+WN7dEAZFkMK)%>YmyqF;=T+ zm`yX&9i$N6j1l`#s^R5qxl;3axNBVv4csTGbQrkXB#sWLB?c}m zcR&NoC9J8kP}hL*6JLOfl2C*HsZ-pf_*545>wT=1Mh&j*6a) zUxS5Zf-t}K2~7I71gr0|+8ByI$FGH|RU9Z#)>WOIsCiOCll?^Km(Iu0T)5)`}c4qQ=<9Y{OOe7R- zlPP63ea)NS@jE5VPeVr>D!=$gXMS%(xa!nhvvb1yZ08OUVD(gT8MWM0vi>q3WLHlo zk-N=SWqOxe@phTsg-O%Pi7R%7)XlldO(z-SfwDt%r_!2hp7FC}kbtxsg0vfzh<t$n5#Yk`44I`ab`TcW#+v#W~^kU|^oqVJdeOoyjWS_s*KflmF zT2Vx-eg7e9)eYaD+uxn*lISg3^bKJ4A8zEY!k0fEsUwN65k@#Hagq4ruVN~2-)48f zhbbonY5ca)EaCKm?YjlR_uS@yXfkgVzM5rJEn>t&l6xq?k)r~r(DoozFL7ysnOgaZ zfTN%E!*T=Ssp9t;QQuoVzpU_;7z^Q7j#Yo+*Re^W-R_7#jRgsQVKoe4SH>}XR;tHS zuyQURx=^h_E8n9Ubo@7a(kqX0%+eGZ(nmfXMfqV95p$D^t(gTr{4{`h&(dMDy67i; z@UPA9Rs8?o)AzA={J*L1|Ga#NzKiG*%)2G^8G0f+_r-N`r~SO?sw*L)T{Xn;TYnmE z)+f>%5^4JyBxUdhl zHo%e{XpXsOuwAQaybsJppSJu)k_TFOriN@a($%f@hv50NUDc;X=s=v>l|8A= zw1CyJa@4BmbR`z}PlPXMvfz?@x5PTne}sO4|CIPVzwvxQyzyKQJl%+T0$&nPOyolJ zc};nG2)q>%>6S#g)u*FB%yOYMgRZ!O4st}NYNmNpedVaGIB+FGjqpS##NDAB(6M?8 zhJ0+d*~W5ze_-OnmuWEfqP1h56d!84<%casv~x#`nMn-^m}lTqq~v^4)+Cs~8-n=g zRS%w=^n(|qpr@tT^I*;rw8%XxKl1tOeZG|^-^!D}!RI@er}1m@FJ=xXi4WqSG5big znZ5OUpzeKkyQ&A`mB^Q#zrRX*{KA65EnxjQJ+#2+8|YYnN;f9bHHmaKq-n+&fpB9) zUIBq*qaXVRs}+x+cBOW;DRoywrIwYWRz;YVq(v);08o=XmT%>JdGgnZTIwsd zR(<i(IifVxCdg|*>oNY*?*Co@q986ffYW@FXZVp*kH*{;=1nsE57T;g1^%n#A9zHTA zYtYA$XWF{Yv3Sc5jh86Au92Q}O+6<`()yEB!?2>+&01;6J6t!+2q~eYTCg`9p=Biv%8K6B%ekKO52ZRH(>kqMtM}Y+p2H#gT`V zqx=R@i5iACGqu!5_xe+MjhOc7wINNbgStnnj?`cSpJK(s!9|2w5%0lsB2|s4Yc(W| zSPA&-)(^|1Ma!h{dQ}(DtQr5?Mm;txj?AuAqZzCAuIxHB4F=WF?&?H(O(H!Qm{*yQ z#xlAK!kFTMe}d5HtE++p%wU+b80YFi%&2wyysoa)4nZ>l^|Ddh5{K20fUP7SEa538t|FA8mD}5j?5r5hg^7=CFQ6U3B^i6 zw3Q@(sd|@mbtT`*lW*n8H$OqX`3dsv_y4YYso2?JFUc!-q9DSEN~(0RQ5goUSfvNB zVKAulBvWaTf{2(gWStLgHcoQEjnh_$O6qnXf1vKnyR;rN`&g>nS6BCW5(T=C z&fSZ;s7Pai{*)eRL}Te>nbivs`rx)Ke*97fTFsb;DAH|3J3>T^!9Uj~F{o*XkTz)7 z$^lIdgVBGrIiw}LqzclmY*Zfx^b3~G8*nU&fu_e=(~{(-LD_A4X*sKkEHrMX7aXCs z#V`{LC}CM`KBHaNie>$j&@QOqWD5~&;Xf7M z6SUW0s>x10$bA7QoE+_XgrQb3wE6eN&@|tqTP+p@XBe^h!8k($zvwydp4m@X!;_@( z+^=6YMzdaf$=sDFP}N@8e#S65qe(Z^7Om$(>sM9oHHLekM-CeJwnuKkce!IzVagr! zsC938+}?Wpgth9RZE<-_8@p;hX&YxBjL%bB6V4ke^m9tGdWSIAI>Skuh+}Y-fO_q1 zu0V0tQ&;*lt5D^8Y*91Xjt@9+Eb;e#=-&TzzxwUh5IhxUg!3g2((p0z`?QPTO@Hz| zi!J5SOA={0bNy-HY6*!}OB6FpRY^_mgg2w#mU;3yaMq>r-STZ}yoal$DXWaE z%K$-2M5E4;AN8{|te_$tg(X;lS5Gl>MCkB5>o9ZaCca=D8YMb0A^VVpX7EYiH(GJ0 ziww<~<uFYrIV&<=J4`1WqClWRC>Z2f{ z#g=~LZ7A0dcpX-+RUAcEUx1(D_1oa5g8xYStAED4A#xUB0se|N)1q5{tiz0<6}e?) zvIxKK$+dD%6W4JWs5|L)8xbc8A(`8_C7VzSy{mHgvbt-na2VtMGzKU3WHb?S%DoVg z?*AzIr-NB^MgR1No`SD`=jniY}s>emR|lt<7+N z1~1C@w>J;eEx*m4z1j|w%Rr$hayv{aeFl>1Z#r@6+^06-fc-fpvIEZ0yeU6*?;3`+ zvq9{>XHTo?;0O&xf+TY!k8sHbRw-YhLXutHuBQ&4%nMx*gVxmcPq&w-0|9FP>}zVq z-~+Tpvciw6Ju_81Uo(8|EQ8q>tE(1LReMILT1(XrR9Bsms@f2$CN>zAUn$>Mx)290 zF@VZ_hcZ4j)ktm(q}vWkEk%^x;wcqX^TStdO;xSwQPq1~jgH}K{Rb#u`s5m%$MYatlH9bld-{ZPkM~#eq4X}K3 z<(b~2H9WcN(xZrehGQ_DjqcK|dwFUdy?q{j>I725+wY|UOYe&~!&x{%d_-QZwu8Gi zly!zgmnE>FHu(w}Q@c6l=+;A>MOWEYv*>7%ZJ~t9Dngafsk>f|xsN_3Ds^;6+JDv0 ze;9LvK8#VD{-CeJModSR8!5;#*l%! z2Y(~CTYuREXW)0cwu;?ZZC|7J_3C|n^d2_q>Q!3-mA2zYbjG7bmEJ+dA`Mx_c0Z1_ zbi)Wvk9kj~^gb*fx@LUZ(>3r$g039x-yL?29PBB44ASVnSa-`C8tnW|wwM$=t9yQp z*aH(d6FI z*p^O59YGG6AKMoz>b|ARh?0mtdk&D_Zb$%;8o%r3|C7UihY(oVpV1BFM!Hzg--v7! zGw1x)1M35SO#mxDQ1|pQ2ly8NAW9wy@O!eywgPzU)#2Nu+~uRcAe#CMUHq2QeWHq) zPG1D4Li%nF>7O{$6ZGTP69hFUk$!?FZ4Im$((ivgfpit6eL6qgM(M_Zx}B(CyQ47R zfbTZHr`Z>09ECQ&-(hQ1^Sk5w)}G<ve!b`JKe~rq=?# zcU4Z4$9KMf#}H%*Vf-s?fSOn->h*`JQ9=Q7v2KU&ZUvS-dBwUj?~(L_!v3ytqKUyJ zdZ-gPetifWtNro+9FLE$_Ugat)r9)N<7qc;5gxzw?JdXS(O=jCJl=bTCusX5K^~78 z5I9hG)2|(AF&>wi_PpmE29NWpuoZaxxGVmT;Bo&;whWIqGTa4!D?DD!?<5|dcs1bh z8_IciJif-VjrX(;kC%S?AHm~&cO~(7o<;$~cJHTWI<$w_7t={QK>zNQiSQ<=q;nlVLbhU#l=h0rg@Q+_qKc?wTmMkSTO zWnsbiC%;}eWeu;=|3xM2Huj5k`vQa9X5plkn^ULt@PnedxB{C7W$j(A!A_;ysHlCh z%m?JoiYGnAp?f!rs|TNE*(tZnq=WRX7sKtAEt76?Kg9*(p<@C(l>8MF|PJ; zC2sWd%aD1Csq?rZeHGa;reJhX<%7?Nd1#2*4t_^lelZhRq9^nNLN?li}A3 z*)<7+dYlz=S2{L!_D&)Zqy&kSe<#TsM@U|TrzCHTHAIgb6ieRX>zumiC>^DSi#$r8 znj0h~Oi;nh8f%Y7n7Sg>bzF0n_UqsDt$WhCl|gu}4nD)iA$7#}WsXX$d($}& zYo%p+kbxBjyz$LlwVuXSme}2}Df-ekY*Fs5e!INxE-$&u^X_uWSs4AUmB|Wo7F$0> z9ocJWsfR^XmRgf5s9G2z$6h_#+os*=d>N$`P@+*KrQEEfLx}DUwPPWIJogSyD*l>7 zIGFL5STYv0VK-3_$jq**lVPXG4d(3a3lhnnf6 znMaFiW({-6uPS&}AeRG6eTn6+WbYGV?&-mAoJw$A+_CEshwgH+IjpoF0>8wvO- zqFp$2T)M*<*~`mz2=@332WwM*g|FiLA(8R}G z6R5#iJqhPUNaSe9{EERgI`mfLH;E51$Z47X_RA7)vtFA;nH zp4)#+-JZD>;5y9Gfp|XSx)BHxBEwzs3#k}^ddR_TP<@fCv@_la=wcHM4qRl z>ikAIFKEG{n0fBMlCAx_a@f32PTgCU6I#1WIS06$6{(zal(U90TKuGPPF2nYF6W1- zoFkO86FJejpTNtvCtjgRjkopl{rBa;&n%FH%gsrjdDO|^VIUP`wbTS;v(fK=1Reae zA;BUc9up1%g z?+ncGw;h%B8hmrN(cbB-3~IZS@@C~Jg<C4i zO5TRfnFRFQ)-EK53ZjJhzJ5U_*=FntL@I==RGdx`9d0SQn&*jq&z!DP3#) zvDKCn<3Y&s->-H$`C5xL-^GWx3a#-N)h&s+MTheG@*m3Am9LA=X9OwTS2eC zCASz!&01`(W!pQlX$~Z{@3U;;!B~_|@*i!JBD)oV3OVLrP)P$t1 z85KY+=JvdgA!r@2>WnAFAM<(tzU^6zXFOC~Dqj1qcTbj!?t0fen{FfPFiFxE2`J_# zvdlyl8al#mIiGF&2^Tc=_&h5U%;djiv$W?bhNWxo2_-YY?5kGn<-*yqy_l_D?HgHc zJyedP?UW+0)R>+IEDFz}1$S~foNY~6;VkwHYo)UKhiHSvwyR`^>NFUrqgOACDKLxW zD-dZKa`XfsW`;%B3Jq~i@NRMsfrj522Qy?R@9H(q8$!c?m++vI1DJECsX~YWKUSO1 zVZWP7qQAvfLkM-0)RyywezXADmPLJ3twtn+=(8`pVMfJcQ1;(ASQG|4TKvnZ<>$)J zl|BpH?5+3G!}uQi%ueYRsK~e--rl0ehbxt< zvZOnnNR^_&q$M?pcpV=YTarsu=r6|mTW%LFhTq?UJuN}*hJRDU!0-lR8mP>e1FF4Q z1n8XV0oY?L+GCc48Ff0WOM4E%Eo?CGV~*KSov-c*8Dc2`BNgi^NX~7}G6E5ISm(C< zV+ND3p#bTaf?u2;Q{ZjrQmY;JG{jQE&IW&oKGqeGE&T-KPIJihU^UnRX2JIQXVb8i z^aa~KUHx_$gY7KA_VfB@oxpnNspy-Hlq2h#{TOr3+lsN_tVdJ$0=2`94O7#Iu0r9D z+Mw#oNfcJ_XZu4Mq|(&+XCO|z!n8To7;d;jsS9iGvD`QV9s7W%BaUot^bG{3xH%o) z`^8wt7Povk(MJri;0PT}@$KPsd&G#kUBlQXJO`I#I%V+dWT@|2S>~_w6=W54o`TdK zbh@mP*H6V*>icMw(8u{cSS4ZfW}_edF`+};g8-Kp-(4w-Y_&ig9er3Tvh~Gd$CD^7 zSVj%$;^;oFu{;Mm1j1K+7%rwIbuSN8#m~Pw{dWu-4_ACmMaNwPwb)CItOa_8#I!Ta zM|h*BTEf3ToXt^f#Q`luYdDQ0>0d_sx;P>hktj@OeAdRVte6XW+ykpqgS1NUiKS%z zZ$iGWZXaRF#kh2yD;~eyXEqqnTwHAMn^<; z{mr>(%du!E%ZiFeKQJ81vIS4Hhwd{ErJ!2{uH!^l7j&lRsh_V?GoYzWcw%9me+a!h z&6zk~FioLg*WBMp>G@Z_N_<+=9b z@47nFC4h*MZ1YPz%$&fpeh);`4C)v8y{p<*mjAo_-=*_lG&=1=uv|wf*2OUPG=()Q z_)pkV*t#A)Ko;a>A$BJJw~%h(SRBqyv(GB}C%|lU#|mnqt6k{^N{Xo+xz6BfX2*2~ zzYkT@yyU7@59N0@`U8Qv_|OV(t}k=O_gTU5JLf5*CnnkGxq?%+ZN5`}bw;^JRFErBdd-i8A~3Wv=mM*tcFO z^9IxfzV_|Q^!PHo+fXUndo?k z8W_`rz)t7?yoAVYHIz3Yo}Fmu{Z{R8?x+|QE5(jZ6k~A;txRHxic(rNjHR?oqSW5j z*t2AdUrP672EMnO%7T?~L$NZBl2JDeP+|h4wedg4`;2JAI2#6yKbrb5ZLedRvk>3$N)X2WN-Q0Tr!S~dUS|cTJYXY}Y{&LPoH|xK92lHvC zY(9KDWExH698dX$Mn4XlON@v9pB)d0)!*|}{P`*R!@tkMQ{tOj5N@0K<~-vUefjYV z&*y&Obj`Cenz4$}U_IaRIX{MhrT6oHn-uCc|3?R@-(p31q}ZMJYW?<9ezm> z;0hjW?7}Z(!oPK|z0go|cKypMT&b0DvDLG;{VI<-Dz~k?TJle7TsLWXcBkbTI=3xx z4am)yZD9?FH)4+}EZ3cyn)N(-rCBT!ZW&{EQaBci3MA5HqfyZ+PIDGq#Z}qUsj7EI zhaLxXzgRswRO|bA=*vm|Zhb1y*IY1g*VJr)6uQ40suJBJJBVP^iq~oGnt`CNmIS01 zF;QST$x|sf$cmy^Ms)F-$=?@v%>?gmsgNl)(ST%N1FCN#kl5hsC&^O%wERB}e@T1m zEe>aI=h|Jfw*$^|_I3uhMny+sZ`kA2-`WkoSK!uNnLPg{jPG~H!uWs~_kRVpf@cfM z5xo8o-(!Wzcf{)XI?qw-|3$w0>_Yu{0$1H9pA+5=T2X(wZtKo??z~!m#_Ct=4|w#| z`h9=Py@?M$YxnMdwf@XI^!rn(-)CgLW4{~fKI-mMx4rJvMEc}J`ou&!dH;;Wec!&d zbH2NeMKsiX&C>1MKf`{XTlL%3tK_@(!|(RY-jrXyiNRph%1aKK`_?ALi?1E@n?nVd z2cMBl;8rc0UBzPCRG6}M_6`RR8n{;$ZV^75ot&9~mT3Tmw+PT~K^Qc)si;uZZVBLI zjs?5fFp9%0->V|;un#0rBrNv|dwKbKEgWCO`nZJ#qi`}~>z57kJmc%%+=Ve}jP8t? zy8eRN^2yv^v2N0e4U+)<1XZQJ_B3C15A|L6u}%LSZ>*WTV(!!Gb^QIf=iT_f&H4uc zSbgZfcilKz&S=;hGZ>9gpS>G0Y>BaBweDXB1@Fud1v`$S%&1X)r#Edwg>6N5u726f zrVOFy5FXQgBzQz15V?T-`eoC_(|EP9P3vkMr(4zmz7;{G8&SD!TUSu7w!GFl?%AkQ z6ZcbkZ0}Q(Ry;Mfciqu;#BXEFtU{9tvnfJqAw(x`K}aoxWQ&EKo{dN2sMG2iN=2q; z<7hf=wT|nTo!&IQ_o@07Pfh53`sfu;j~#!1phBaf6S)GDG!^(&>8*F;Xgd574=hGQ z!niFa0c_B1{WAPO?^EMeJhg-MJ%PTTIeNu2W5+)lXlRIOaIaVewMW^1wksd3h%HZynl1S{~F#4!n@v1O$dJr z@LqS!7UI3aW4aIV7%RAf_q_0)6>5@rAE^r+(d{Vg z^PpbS?JV?P$l_T)aXY^V$S!1M`!rs5hfD1SsXRV*kX$opwFxS)#tkXeo>i zKjfgNtmet-a2gy&;0bk>_b=~T+MVD`4}xMj7lNEi-_i8%8U1sS=78nT7yvJHmvi0a zktsyiJPR1|{?W<8V`}{xgh?^_(+*1EM}JaWkFFj9fN`=f8o*d78kU3$MTbN}Z+~(t z3h8z*ywB9_V5klQ40j5>2C2B!Wij5$yvi`B83-8E?wk|^Y_i27kC#oelNY_q7z~3S zR27=Cd)+Zv_Ez~JMiJ2w06dOqcmSYg^O=(H7TUAkACxozU^7?C2`l@0E(EOU;!H?3 z^!-F-4SnBNN+?@fc;oTHinl=DWA-ue_TVlgPwK zn*isGTwDP-_d`LT0d6=gRf{(0%b<2h0&309_vp=hT6c$L>dRfFg@RhorwwZ3-KExD z&N%|8@lK6jgOG$8pw(tp$gQ@luU+e=<{K;FAltj)>z7n+i#EGGO~G~|L&K3}WNMl> zZL(ap{SIl375h{*jUT?fO%2KR_p-n-8Af95d#i@qcY2YV8RCsKWA({$gdwMJwZ&toE2NS(2CGNq4#i~d1VBht#) zL*NR@qiOC}#-|o<5Lr&rU-9M+z4xwnvz8*ceGOtMnXic2q_$BTLqFHoW{2+QV*MqV zs-?tK(K|dx3Ojb{J9V_N6G8*WPV~+v%_RQjE-$-Fkn6tyVX*rc2wV)O=C6p zQKvAWfqdXXx+q>UsxakAxXBndGsY@<9<2~?Z0lNh+6NIKEx|OF76h6H&lX0l6}7q2 z&H&TG#@3ZKbG%R8p!W@$I*vgIcMa{g*7d8MYEU>CW=os%pArAQDP?SGBK<&N{=O`AK&<-Ca(0 zm*edsh!G4hq|EXUpG0A&FyuHx3>ADiSecD^SUoDOSl584U0UsMAbQ@!ZtD)CrwT+! z)>9ZjWN-V6VTszSzB9n;Ze9ZOAWXo@I1I3AEDt7O)i?~StbBk~V|n3FSm~4k2dj@B zx;a?E+l5+!6s+zBRvVmp_YkZ=;>fTv5>l{gEM>MFR&l?;N=Ud^ND!t*K!T(!fTl1- zBOX)Y08BkeORRj%7%NPT85vUoMK6!^qQ;LKlD2o3ZQNzFyS)7|<#}htg(Y%-K2Yzv z!Kp)EaIt)mIjv@GO%0Ur(xL8+@v{mz~9>!Q8To8owa*=r& z>oDtfI0n#N0nkW7t132C0(OL#EU{%udNSw09qxPtTqN$W^>nI-I&&;rZqss^-gK{D zRx`B)3*O6U9KK^w*2}2?=@y^yR@SN(72wk1y@sn%QxC4RXd`_!E5o<=jUg@C^3bTM z$J1P=dLfM&j~t;MLJ2$-2@w=wvC#pCxQv{BHapo;j@8S$V~*2i zb-jW^R+k)4V6*g02Kjxb^e`7YuD|?JX%xMy2NN*@wdtJwHun2{5DZ~6|5Jno&x4F> zq7&Gfp~^YLM1+_reTHx}Eza)^VV+QjdpaxmbmLzqz$fd}md|no1^L&OXR7qsR+^K0 zs!H3-eHH!JmM2R27h37ltaRze?(%1Xgz~E;yWGZh;Q{*=i_iw+w~$##uzT)}L)dLU zxr$w0B}x!82F%L!R+t$>yLWI${8T99=oGtWD+4U@LN4!3Dv10R_u1b(YQS?E+_R-@^0xZ2INrWIhE~qAGJG(cO zpw~@PBN6nF%N>EB8(nT7=u5LdX9V5Ovyrrf`YD(usJ6`Rm1=7EvfD_qsVyHfl3;4f zIkG$v7X~7ZG$J@6rQZ^zm2x#3%WstbTK)@X#k^d8i9J;9GR$YoPnXw~pD5i7gd8mO zIhIUGTMH6I_hYcw9J7_o6)E5-E{!I!@0|5frX!-gB|U3}WA!99Ke-(lv! zfG?PX^>(EiWyU$StFq!&??)-s>2*i!X^5ju?=h`zgKA`{fit~^EHzbd_i%+Q-mM_c z)9yv$P(8HD6brZaY}|#grHBU52bb&tUpZeAFQk zwktkr4-crj*|^#Rf5v&2`pPr9f}_OlD#u=z*wYE_80$;s5)}9DKlMbGSx@8l)cvrN z+h{3OyuUJ{?|eg2yXL9(22YZLq^Jeo+Oj^z$Q~Okv?lualbbg2G#44TjRf{@AlR61 zN3|XHF*HwIqPvYZCA(8-6D6o*Vfbn;9}WkxcJmBlFb?ypH4Kp zPm&9CwJEydi4+$tTgSzRhjOu=K_qa|T;aktK~6pKUC7`4=SlLlDibYEw0B^Vd{e>$ ze@>BK*gEpNQ&F6(FFH8U-2n;myX9yMJh3i53=Yp72~KBTKZKJ@^acgCj8wZCQt5wC^f%jVM$H9YDy&YnvoQ+So zU=7~t*}Bd{W6hO~GGlGzhm)>3nK1u$6RxqEkBzhZd9DFgoEM1z-!~rf0bH~^<_Mjg z5jr~%Np?7YH`dfLglPI2i$w>XMZAfFd;K{%ul~MfE-|&vX~kYqvD0P-53tX-3nb~DZ?&#tQeLY5%c}hDV&?&Dl&?7P{ zi}NuXT1%g+Jo}KZ_^57cnp#At^Nk8G^J=PC!%Wuvfs@i``c>`vWfQh9SUZe9NAykL zeswSLGlU9dgHWd0n81&~eW{33EA{cuW+ZwR*^=ng7JT-^N;h})2(0?d;;+kZ+tQg# zS~fWj#b-(jjY^blzdmWbs&+tjcLH5UksFiXbmTuBIAt}X^3K-Om|CK*OzA-epcovQ zhq}d0fLUp~GqgQ|)hJ|<%ZvMTcu1Phr(B=Te0HEuR~D1(2t7L027cNSeexO4YFmxT ztJZU-iPFln#0QFuZ@pY(184XjX5bf2L|CN41)Rm^D5U2rW z$5E-$y@DVdg>_&tk302Z%r;Y7F36PXec2KEFV}?riHmGD-B_5`@P5!-TRv41V#R4p zk8C=nMb@KW;I}aF7h_<;u7%=^>1!;Ia|3~oe!^m5wsa77PH<|3S6Q6a6zCy%4f}8y z+pY@rH$13CL1%nvakK<+fZ-t?3IE^@mcd1&9c<|s$hFslN_yO5+ZRiRDHWWAV{?d1 z8;wn5dI0`#&lo!G0Xh~mD`vnFZ(=YiZ;YXs5*+Zis2=RQ$R~7w!r#eu)4TQRp5sHYYmJQqlFD#n7XmZI&1+f=8G*Ud5~d!d z|KOkK569S8y4qb;f1h9W)Z>Vtkpd}Rl~(E1Ttq?;J+ut7ax>u1NB~E>{L|U$4DeO%aUl=RN|lB z*f5sSSUuLLXrKj4WJ97w38y7%o(2SpKpCz;JKA02kYZ(U1(C{_qy2^(2esflZmNdz zf}grnhVmp^kdiS7*xI4r5Mp%qsYy?FNiPD1@pz+AXfc2d6*l5NX+&xP&_>yvMPZBB zUuw-Tp7OhF2fM2f8A~edW6r{0?}qo_gFYjzNS!LQSXa3to+I(oZYQ!Ak*z7&xZV|O z>X+SPr?`hw9@Pugf*)V7y4_(!9hksO-AK=*X!~xCb0cNeM#>2uI2s`DVt|}(#$Jhx zP_>OPh|mVebNH23U5`5Vph9&83dER;fh6Z=A&lNjQ?7>PFY9+g)`T%Vg= zq3sa>%eay=z#A5ah0F1-&sqyHC;2hbdh856CRy^U&E81-7@5S=W{`O+q`+QnWsI~n zfZ^=P?H46rNsW=sNHZm1?X0LsSBspnbcRazK-WD(G-Kp$zN~{mup`ri#%STpjnQF@ zY)+4ntfi0XkuOLYAY&ww(HQAo)Jcqy&0&l**~X7^6Jw;=i{BgE?4G*T-*B)0Fo79n za8@>WI!_hG!lVkEzQh8yNCCgbw4XN!c}E*A&D!VeYZ38C5tZ^8SWz*=F6A!}1~$5A#I z-r_Ddy35bq<)`lQ@9wh5U9NDKZ@5dZyS(@w#=V^xT>YSz8t)=E-ffVZpZlU%)p%!a zjPcH{jB!i3uRjQ1uB(LG5)x)8GKIz5(Gg$q{3la7R7#|9TxN+cQkzl{C;N(9<*t*j# z5TK3u?1iSqzZE9GR@n60!sI6l{r49he8JtNpFbAHZ*X12eAF+q*|rU2=Sln4eSY}v zSrPk4c9_1@i|?CW9xRMsYrV*5tU*6w5k;D)=dO|lR+gViiPNTy)ATwV+aW$o-QfgU z5lW#-jE@&4uPux|rXg$(^hz96nhV5->1Y|Z85t)J+l|*-={VI5C~!Vtu~)5|=Gxa< zej(vgs(~vkXEx?^7E{=&<~~(#-!w25EfhM*%Ih7&N~?u_o@toLjTw9CxSEqU9(8fu3^CIazzoVWQwC?&kDXJtnliIU=}1^`zs@p^U){=^bK^^^G##31sO$fQ$h7w@waYZ7s8Zr`S7NoTws68UPbl(q zpR<1LVdTUKO4~w;#!`w*xHsvWH!g^J(ydZ<~cX20sndw^t)u!Ov9FYYsgu*>ME?G@xO9SB&5d^@E@5P>k(4d3Kh_@VmrkXe_t@G4O_-Oz?PsI3X=FT?Y=Wg!U zTb-@e-UJkQ^e!gh7Q1LCckvT{bNJD?OyQYVtbL95{u}`UPxCg`ZfK{WuKhZ;JteW@ zsHqe<+6p-6Jn3%J^PP?Ad8VAw#9u0H(D{ucal$v^PP49Si8;Y*>0%oQWwpJ7+lW6< zabnrCNAqV}^K~D$ix>;g`3MwDxZ*XSV-1fPwt0sg$4Ke&VXz~;(E!+)F6^vtG3=Dw zd~5-|j-vW-T@olIC3O?r4PbjKYy9JQYoX}ZPoQo+H46PMW@}fsMB-WoC)J={j-tCpB@QLA3lI0d-+((HHy7Q0 zg66`&l^i!jJg&xJA#Svo`GPN=jh0SRrk79;B~@3N{Gh7nhMMKbM(%Kzqv81lWzi9L zY~p(qdVU=1PlXOM9e*B@j{Tt?A;JTuoRul7!8D*0angEYbW)w8A}7^krP5;E@q37+ z1%^%C7A|EiX)JISikGd;tJF>L)}}$OV7$U=^qcv>R*JnuzMZZcX>V_f8 zLYRi=GEQp^(wJt7{3FdmLb7@>vq!xXeKvYFK1LFzx1HmPNk;s!yeSXZ@cbXFNx>!oZ>lXAQc-?jtk^ixAWEzPU-H|P6 z=e~KJOzC0obzNk0(ErHm77TA5g0P}qj-Wg9x;pn>Uia8-o$2SI6OXBQUFY=e)G1g< zc-)a;#4Q14vt;L1K%6QRg7T2 zk81k_P3IC0_upQ#mkt`3I)8hFk-okRzTc`Q?=lwDI)!SzVEyCK6{^>l-8N&|NlMDFVEAieb!#< zUGIIp>$(#~3*J>d7fY3z2*6)hx7AJ-y9oGYZ2a*LsdHxw;TNy`qR7zP3@2 zxenbtiMzdIzq+x^Vb z{B*w?kC{^bcX7*v2ftrpP{DkxJCGY&gqwn2rSwULh5|6Te~Z4ta}q?rxl!fuwH0P6 zGPFqQmGU-&ktvQ>i+LMRzswZ+KSA&W$Qh93Fz!c2(-o?b~pODf7X-^M&Kz#VkxJ z;Jo(v!T+T&VG2VNwvE88=Yxt(Be}wv+(1^iP&bEN{SWXZ!W=%oQK7B|=_Epq4JmNC zvwdXl8?1O&+tqxR@du%JKCA?X;_WKlLGiAUxi9qMoqXBpgMyszOd#v0LM$mZj?5L? zAL?58Z5VW^{cZs?-2`W20Bdj21;5aDiPecvq*aoRR0)-o2&9rGo@MJLwRQR7!-B$H zw4AH``!uXhvd&W0iAff_Z=#nfYeHk*%br3-^f7{7ZXv1_gAy&et~41?Ktsk=c8l;oqmwN1nu)Ac0UaVQJII+=pH!fps;)($^VF z(?w^0^9`DAnENdyd=7YI_J4YDeW~p*6_39hh}wZ>c@E6EA<|D8;o}bvmANxtzdx5B zmiFrXq5Ljh47Z~5cfgvh8S6>g&u;MNlw9D?83ViK&tr>smp?zGp(BzVy-vOu`$?~-FUDS=I{wAj z(Ca7rIRKfYA9uLt>Ee7$)aOsbHZdyPoN zyGP@Cvya|@>NX)TaN9GS**cPG&M&cy;oAbjD{QfccQX;+0(+NV`I*Qfd%EtFo`$0Z+Yc4)hg@Tpk5hL`(gyxHE4^4c}0gO=ck*5lfcFn`;Ucn^5LP4 zS9%+Zt&OaP7Z0^Ibmnw{PyF6)ZdJUu=>x?oJI9pQRs0x^vXH;Q&zS5h27OHoDn4ZS z;p~a!-)Z^l$q$&obRg#L?=n{1rKG~viXYR=tFbE9*QuOEWzRV9R3r232hxrub_!;V2dDbFQuDDIZS4t|UgQCtw zZQ2!Kyyio5$&o!&wJBKa$Np_?( zjWOUXFZQMgO%$lCuvbT7R4!XD;%zT!B?7)-K{Zwb9VdN?i8F(xo#uKUgzLz&wwk`* zW)Uhtab%etZcD@;?HIT%zCmk%1;lA&gw73P5^(7!zLGYLBy~~x6M52b{YkAdcnk;a z(TirI)6_MH2lh8b#qgzQ*rwaSb(syUk7Y|ZA*d?h}E!-wTtqhett(B>r2zOLq| z+fQAf668pYMrI#*q6az4`2{Bnv%j}A737!>pc95^`*F#33Z_<97hSA+uiO4_Bg*&P>!twq{wGuRSuGdNM=iaLCYzF z>P(I_mC~NvQwH_Db&sPouw5`t2Vti+3%P4QRK*}i1sZNS7o<^gU(wR=jpt_Zf5^&c zT`MYESNtGg)sT3=~Lks$a;x>fQPXFnodcRvup;o*JXoS9w5aiqWiTtEN05f%!r3%S(OXd8bnJsttUz zI2l`PKaWlo6>=T#lnk9sF^i~7rNBZqTfixH5=|!TL%HJHc;{4G(-3B;m`C{w=fQ8E zMgRdGreWpXe9ED$*9qv`-pgB6r>^$cq*A=+z6_=#jf$)zoClr9XfnhA;A$K|nBGHZ z)8m4>84-Vvz7Y@3(^vE~Z*%&t(#>{=ZLp;tqVn_Z7q~_}4&T($WGO;HN$UO5(iecL z&_n>RMhwRqJL2t^fq>8lCkPq7D+A%zJ9Y~;fllbOr3mHAQ#aTJX^b)q*SjR?2|a>P zjSx!9!~_c_&4x*=V1t~3@zbib@io1IsLck08E&PRMMP@Vf#-0UuFyO9XHC;?jn!G+ zQg7*COQXH_x)P-#uAvgHT2>a) z+>e5z!H|W}zQI?A!VfEeg*8Tv2Wo&+oZ=wloLKec&C&b2MS^0d4Q$fV~GkYLZNmfBT1(Q{)~?(yYlbYiq^5aeT#5 z+An@q|9wvXtr9vk7yGSP!m;{?Gu(Cw;YNT$2BK|*I{m4pQ#z#ve#$FV*T69mKhHF9 zgYn^}mW@hN2>IS<#8e+R>P|AFfiDoX@N{+HgiN|ER^36%E$GsH>RGwHx0bTS|qj#HB`ct#Cz^IkmcB+ zm2eI8c7g^DiPxrqALX=&*b`T+vF5|THE5ta32^AJm%%UCcKVg{x3||#iydJYWbGU? z%}t!kHWO{|rWqhidYHTyY($lB1U!VyWAWwJ$=$f?^3%-4tq|4o*zL}=va$N6meIh7 zSl1HKMnRR57bY}hzQta|I;rtdn4>XMdcMfBGxH#GpneoSvqdvG+|!%Fh(pANQJ-P7 zQGT^QU^EmkGGt+xVM-f@Ddk25RElLO)5}WXzJa2=!J)jtq5M!Nzao@h70P@4FiUAK z(Tv*Cn@o~cmUq$#6+zCudf|<`HaK9@1`FEcj0X1e*&1rZaH&~Px zEHSPtlvjYFS%XWB z8s*`Z_#gKli50F50*N^nvr6F^7nQHDIB@>Q+*ZQUhXqAY*bJ2RXU{9RP1LCt#}gu zMYTB_JN>=RlD~NJ2T!i_eA~r)TWlgz0Ts6w=({B^6tf%i!xESEV7fyOM_F4s7B6XCx!${fY%Gnb zxWQ@?z`Ryho7oZ1wa}cU$*Lkg@BNzJg6tk6TO2hE$w53C1N#(7qjOA0)j6PaxoWUqexeEXU!oRzBpa6E zbe_@fUqB{x9rfc)~+X-T= zkA>KzhoDP}f=2n7IZ(uWv#yJg$5VJLJ=T@bfddO}<7mij@*i-fNz?DOrK3}2@37%9 z^(b(o&*Q~k8V*&ewpm+xz5^`O`6U1XZUV!X_6u5UsWqjw!oG}Lh&8Nh^@VN;RJV+9 z-c+60Rpw4ZvujbYikVHzBcQmttn0hHiHw5KnK>fl^ao{F?1M$P_ILk?!XetidlhitcrGU;KYH(20-cf zK9k1cfmly0e;anQrD;mhICiZG(w!AZ3m3m5skZd0EPsp!4!@*n_#c`|(-05VV`myu zA&y|^n$JA?_jz1Vp?V(`UAN{4Gz@+ zMK>rVaNS56Yg=gi9p3mGtZ`k6)u+1F_>$XXt+zF*C$m7KS$G&MniVXKgT|B&BOhZO zMH{0{=$5uU=yZ;bL*Kos4m2 zVBN;#OupR*Fzo>$+~eR}hfw%~0EeuO#~8v({x| z_2m~(!!6#9JNpEB6(TJ#p!hWXubS@Lzbd|3 z?bg!Ms;*geyHfVM#vA=iQIpu@lpp3H)v3@!u z;7~s6WOYHu&|#du6ufQ$VJK7lSM#N^e5T`#h8WK6%VHXS?!GhvK*lcmg-@p4UcbI8 z*8FS@>kx2DZ%G-M#|0`cyi&GjoimEwSG57}y1lqL@;-(Ka^#zZQhaCAH;XgmduL6U z7s+|@%y#>=-IH$5Ec&lkY{V0PjxluNYxGbNAKUz5#zo6Dwv{qPBEj=3R)txm*YS(C^eQJf4tL zx4&kJF))Zj(s5$Yw}qEn9wKeF)u?@i0o`2+17X*2gQRmp23lrt_G%lP5k#$?#y6Sm zTi4AA6s`u(B9e?3IN~E@8$O}FFjZkwbopOR6)*GT&6Z5oH?6i+40++1edEo)t&~wR z(?jzQ-hBmLJ|ME%^1~Uec_orl@1bvI|BJE4bgHtLPVZOha%Gt&m3b)I?`J5)LR6!y z4Hfot@=7#buUcMSH?XV zJ`qnk9vW%ct*B+M7Jd6k)8MaL63e{8Uw%TN!N69!(#wbgm?E)HB89ku@rpT4bLayT zbFjbzEbIVJ6JsY{qRY;ow1S?^Ks3h>mg8g^6g!jeh+AAdTP-7u)JyA`cu6#$dc#c8 ztYP(=tudQ9{YNW^q7i$y4=2^-Lqm)+Duh`+H8Z)A-F*~u-tV$h3eDP2= z4GeXHzeIAS?JuLns4drx>TC zH@3s+EQZ|Untsa_e@5^pKKCgGeFgcq*%YLWs(~j6HL7fZTdxXfk|(~`#4b)6CNrTI zP+T&!(b{v#7>v*W(Du(4&K}qPk{E{FPD2ZHHiWr8CD1oWka}poa1NX0?yqub)KQ1z zuYQo&dZw_Ki~^q-iwc)Mp{)VoNc~z$l&294-vzhPP2C+d5f`QLkl#;3g+NGWR&W8J zG3g>i`)t?j4HbDz5;(`d91&Tg?ZS?H*j*?#c>?1goeSCbTL^q-v~Jmhvv>3i`A9^+|~ z@wCc#TIJ2U!Q5Pzc|F39Ui;PO*^Z)~)5g{ATGheHA>kW-cDcsp^YahM4|kbg;Egum zbq;lw3u1asFPMl@0R^SDm$OPDstX@3t?#^1fH^ zd4;v<8(z&4OP>aP{Qw^dpU_3p%rC8P3zxQbIU`{i3>s$mj6j~9^Y)Q3cc*;`Qm|FC zf@K{w-gh((#VfiPcPuuXfotRzXJv2(jIl048>di;m^bG|Os1iMv1imcy+^jCPZht0*2g`)rxpFjOQdtlwn`$h zf<9S6pSlo@o%JVMRv#ixK@-h%q_e2yQEG=?p=JCsdptM`L{OKl?*|Zr2+E8{&H1k> zY(QK6A~Z6A(4HUPf}%J~YmOPzu`LE%oU^KJN!7QRtM;m`R7Gb}Rhy~0EnBrcscK$W z@MyJ(sx+3W+DO%jY}JKH)yE;jP@!rsRqHZUd#Gw()wN&~nB&pON!72Xs&-SgHdB?= z0~ckv>M5aWZ3%O7Y&-3S-4wFKHl}@6Di16{&a<`5j15nu?+>f^wg}U zPCe1H1{;-9kdgf68D%3wxi}L25;6 zYcXUEtXM)f%dfLoJqu@IrgN3lIHWkg(U`E(~2H1Jril@#3O2huPal^`+Z%$=yf8KJhGP8S>@ekuw&oN(=FW88ho$eWSx{$jzYfDX2X33GFv4fn zI_z^^#X(fMY)2-s8^T_0lxL!zS%Wv`wPH}1{hohFXZAq!UkNfZN%bXiEq(!yTUuT` z1wC7wD4`O)sEOcCQ1wx|ih+?8tU5=Y%naJ} z)UCW$JvHme3FjLzg5tD)d3g6|M*(T@pyZ5#bMW*4<>K9h(rHjOZ5P@iX<&WFy6DI) z#+ySu8C(l*{*>iSMSnQh(ndJqTPDuj8&Z~SwcT*TH~MZkx9Q3w{mS_Az(u z7L>k5dD<;T-W?rb{GG~arkd3YW$3@URC*d818f}1w+7JWD{KSavh~7%kan=ecBU~g zJ@`@f?7Cl2U8DRXw&3CDSjMHnwIjj7a4auA?^H(GM|_wMF;qFXywO808xeP?n{_m~ zZ&z_l*YH?=_-?zTdy9`}%)4uAncw*>XD-BzRzn;(7WStj1u?AilnX)o6~7?Nrc0Ctym)pihuXHI(VVVXy)gVj(K@QGxz#JXBD@{CuV= z=+)JCpCH(U!(aKN`B2smIqQs4cYyK|wb^Yaqi3p=jzn+&vv@-OLJBJQgFjbrb>p{w zJ?{avjA)36T1AE$;<+vL+@5;wNS<+w%@hu;varKbyKQH9tDe5Ety9DU8;SmoqK)H} z2^NdN;<&fpGjrZXe$b(*+eY5?zzq>QzJg4Owc7@&iDu|s03U`{)(Jyi9;d2!utHK@ zVW8`m1%zBugme6NsfhiaA6glsn7HhPo@&PNovAzDO|_W-U`_XRjOka-QA7C!`fU4= zLv!{@K?cNJ{U_X{EzwSaX^MGuE2nVPc(Lz5_z_ z`&4lvAlk2V-bQ(?K7VOp&zFgyD7w(TkH7|fi^t^R7&kLM_t;KYtD4o&*CWJ^)dENZ z+myx=xgnd8`;C6Xd<|n;CfPiz*<%9idoEfXF|fE z5pJA*1s&l{E&W1pV2phl_aXn;P&ibFc*+!PQ2}JR)>4BVF4VTEGchfuD+q$$n^kzH z$*$k(1%7X|{0+uu)|A&-XOcKUTCvi@oi<_W`T60x78rxoTHC>?*zD{+F_tzilU$Hr zqu6M}Je0sVO(zt60l8>4T>Bq%9bvBcZNsbFc89Nhc!24eII1GHT60xJVU3=QD^|q5 z*X73<`CgYko@N}3^)Kv^)9One!lrWMsW#!@2DRvONNU4Av{70=mGFx{hm&|nEeY2Y zKW%HmVUIiVHlbUP1=8SLC^{%9g&-S+#FAmDwGVvnh z%aozOf*x%@K`Z)_E8a~b7i?_!$b70gKl@c&HZ^tOE$~2v1#^1P;a%0hTkRh(p*M~f zO}zg6-Kb9ob%xkZgC3E_t8S+C8i|?C`MnsSOi(z@6PUIg4FD}VEnL9-on7l1gF-HC z;)CdS^b?TZVGnORG{F+KD<6K))y(mEk)h0%^oqe+T+o##;pTHBg&}<6vW6`pqpL|%3VL`IHRe;zMh4*?M6>d>9wBc_7-#6|b_>q3jb9aB8e{ zP)sNg!|m@EBV0IT8D^8zdD!&{$4*g7NHyI2ipKU$G*>sN&7hH&!iXv zH!xNV13`?S%fsHxEryCetkz#Aj{EiXkO~;qJJ3v1!s^*tS+$9ctTPxO-QF z;WZWbmVF;X&}pK`qUAuaS}Z$qFQGUW-=@G#e|lc+k32IJgDlh8upO5nEyLwE*ie^f zh)#8(50~v4U!jLsWqY| zks6EQ6;0ya?huT=jM13>q&q{TV2ADqp)kdSR&Ue$c-UK>c~WsHeUyD|*>P=pknTxC z+c8y0>CW{oNPJMxqSrO~0Qb+xTGy=*K*qw6Rngnf?3OGPISQXeSfdvd*c=LsS!#$( z9tT_D1Y3@fTj8+XKnr_znBY3gb%l%7!<$Le1A2_|hHoJ`8`Q?`Ao~Kf0hP7lbK>yh zolB;j21Q>*MS~(Aqq_E-IHmR!mzauZz=YD&OT)_JN83YCb`_Fv(5}_sP`s9*XYn@u zw?HGwFEepn)WOf<-x=c-|EB+*(0^O?-|zV^`t)5Et*`Lpt#{k6tNhpdJ-Nb@cX)E& ze-Mo?(5tp)L0l>-ySx5bZc*wEz(2$RtaPUXc4XrnNtYIdKhiO(EhH-}iC=bg>%EPY1iZ271O@v8jVy8_zu~XZi zX|ItMdr^oy7TiyPBf|MWLOYYNbZVLn&RAKqvrG1cqvHJmqrC7n;y|8{#46_GzaH@B z_--YcLNV{0uyK`tO)1TYq(oPKzJsxEU)`T3&NqmhpJYLX4-RWfT-(E!;)#^(sI1s^ zM@JK=!Zv445;aKxbctmFl>Sh9I{N$u6ZNMpv5{4IJ)*EUKA-q%DcDr!6TQ>7Hq*`r z1C%mi^}ag-?^!R*qLG(4c8%gVTTFAWJvNL9Rm9+cJCVGCi*KIfS7?}tHA}j!dVx_W zq{cG(sgNHgKr!i~8{A{w=n=48SkBHP??KT4>X#?0TFdSbTa4Z<5^1+x((3Tx0}XWv zZnt%r@u@DA>N1O0sUD$IuTs#%%s}+RzRF8K+--+bM=Ua$Hwfn`qrwds(h#;D4{OW( zxA~V}h`#I=3%D#tr9ZiNf!Cj&$Lz@|=}QJPu^*evrWKSgvuPE-Vm6KPEYgfkCP;p? zMdvAdGMkW=CI(>uyo!67_~N#377Eq#oet4;pNHl-4522C-&bivi5-dkAiOzM={FNM!>J z>QB!b<7dDcc)J#IHMx{6tC z0QO-g*KGx26t;saBaI9jm{3$nSQ?jLt1#pVz_6&^NTTB0sPlTDf@3Tz#+lo6Sw%gtL!*v{saRoTpU?Y{HbCf~Moj25@~ zlGz&SPyUkG4}7A+|j8?I2!J@ zhL_vSETww&6N36I^~x+#+FXH(*M#Erq!e!q#SIFI(Zg>QH!u{BL?)8iMoRGs{e%-M zD5gI>uSz|Srk+>F&u~fQ2c?UE?37Tc*G1YKV06dNyqD1Qer=q`^H}^0WeKN&Yh{ho z{BY6~h4RA@MGP)e>rdc{-B=N8*Z7QUG>x#BcEUdrQ3Q^n`g(O9!-U3ltwj%T6^ z#U}{E7QThLwWUv%zAma<`sGg8wO|%nV9~D*1yD+gq@4dX>+C`lSl5}bu0!2adthCM zrGw!DDlXr%c4Gx#DqO!Sy0KWn7GBD_^PLh>g0K%4;sTh{Rk1ng1IuPk9XvQ66(ma; zHz@UfN?ECw0}~DGhMc7)F#R@C{pq28BH1+;S&^aN(pLqWOwX#se8QgPRxwd|uPmozb%xO$o(&I^ zK0w3)3BEBp_W}1-O~G5quN1$?TtsQRDR0n5(-hm1b(DzJPa)`BbTx9Q#V<>G)h>mCP=*t5CKhV&ev2T)w$}fw7y_V9AS-N`~>cq$L*=+JE4<2Tg z!+d>6-B#KC$dqan@6#Rb0}~x?@TtKI->r^TFYyi<*(L*)!OxTjEX5_<+g;i_s<|~R z#D3)PWSMr!qIjA1syl72;K3D)-p=4!Yag+e$EzqsySBC2_${aSW7$^!#OICvtzpJ* z@i#A5C{pB4!e5no9!)*>TM5b#35mwZk&qV5zVQzEL{+6 zC}q4NiqdbiHvTYcv%Qboj}LUi+}6q$?s@TGypY4_B~=7!!N`8th58BI}PsgmM%-#A*ED~CKF_QFb*>Qo!2~jkRcifGMt7a$T;ao6>@^h7GwkryQ0fY zIFo{m4aO7haS6QHY$+k2p~M}OmNJx5N*~jqblLhm$+~p+Y?KBv!*xx?21Zh$d)7|Z zboXq<=Q|^f@+4GyU9%brp;`~k6gQOJAKi0`?H@9>>yzrn_JJF3*~1$fhe}J=1VOrH5b48RPXAk7E8eaUMbXe=N8hNj z4&_C{TR+Pk$|Um5C!F?QOn*;9B&7%GUi7iKAe*}?WaF&C3{2ZuxVOdxBW>K#lRpC9 zw`1Alif%jWntE^5K9Sw zJZ!&}C zTKuCshOVe(FG75$*!4d40I7`usTC$h_6k|bR#%fk)`VnY7U36;FV0bPcO1Q|&2n1T zVpo~5E*2eglx8=z&Vu?dqSgGC5JLj0UVIZY1wVNsVLg4AA2k_wI0?vSJ zKmhUK`TFRr^{4o^pXbT(@9?*ReBg#kORd%jMHz5RI7{75L49;ChrH9o#kg=7_EbDa z=tE-&(aDO_@dM3<1rKfZkm3$g;%aV$7CCx0UcLY%EPkx>?KDfk%~jHhyPIqlCdN=2 zZWGDO&R7F>Cs%S^&C76Y zksX*z)YHHu#a>e`HkStXw+1DsY7MS4MRQe%-zSjvDnr`ezejnXKG8InDpR_y@Qm}8%?T2C&oYfF+Y3=$VzHDPWd zt-Or}D-9rq@+_4ftWx>en>_w|5_)BmLQ;sKj>(lm#b@X#ith}atuY)EmqTU)QT)A! zyO`-O?!;{wBX^E#I(`54OH4TEogQx~C6Oi>p#DR^=iH zRN^WKW;rN{Hi;8?=Zc@RQ*6Q8$r>yeX->-e@3!Jf$`!B2(?-XxwmF37dD863a6g`R zW$?VI`GmzS8{OHyPUGQaTh}05Ios7rakiG?wVKch{mFwhr=DBGvrevWWOm?GN!sD4(Y01IbmWD9r_oCRteZ0{NY4mz)RQINw zI&>JO1KPKCks51mZMQfGtpa!McWPUzC75)iyGY(dO-SGmn*@=@e%K!KetX zyPnL%M7|foAwsalzJ-OYIr=Q^FJ)0+V^pf=F-Ud??K&19ZqjS}{KOaaG>_Xs@5^uJ zzJ;ew(Ir3AxFj>oH0oC8c;@h?meGJvRg#EP*zCb#kP1<0C=|BnO^c(8*;)WjmT&94 zN2u{aZs$JbbzZL&fM8ERtXSj~6hJjct%p=u;k6AX1oMW2Zvb=iO`7JXt?k~R*Z?%G zC`>jq0o*N)kEuRJ)R$Z(5#llm)XN)m3x~#Nv30aD5S547Mgxp6{hRVn%v}722idFXg^p>SndxT&eA?*Ol)&LB)^K=V9;Y%)nl*FQ^wg z(H09NuYie;pwdnB|c_U+ffjGsHcD_ME>i9T2r|=C&T4a&slDzP# zL$eNWSOYs|(!hP8MH(L%(^gU2%Ez~<;h2T5XK zPeY}|9A*D-wsCA=$0bl%1hAMU9;S|E6!X)#wBxDi;f{d9*=;z%Go~)aX=PpU!EFMC zS$tvOxA}Q@7tT?gmr0&e$OESReCczmF^y{(sXA15z|fKdrWN%iXSDUny?3Fl#~=9Y z+In3==sv&tV(+4vzxtwXLNG%2$`HDEYC@gLhMVtt>z$uLMB~L-Z@+Wqyt|x1r%zpP zN(P-K2AMyIwTXR3#<0S>rqi!1#eAi#r*RQOS*sSSV>!Ly<||rG&yBhL6h29oVCgvda`J;4rNAV7RVIp_uViPID zPfTRr-GD!$ZM8?!2*`fOfH5>m^)(5y;|GWbyGHg;+?h}u*To5i+=~)mRTz4O0o$d! zExtg&PUOGnz#A+MyW#Ve)W3%SY=9Lc2ECd1YlFvMcdA2Mw$-$3_(q?>BmR<8QOx!1 z@t4n|Sls?L!J;4BsLH7Bn5Cf$E4K5i3jDmp7v<>-T^p@;?Ws9ML*zM8DSH7Z= z@l^N+sm6f`?Md2>QeG&TjO>ol6#@>RF-yy?-qgcF*?Z%l^dbL(;chXWII|DIkuShFg^%gq$sw zh5+1-G=wjhOjE4kmNFK~x?}^LfvYd7#8zX-Gl%BbL9~EGe9Kgq-FO6Zzge>j=036S zvorUj_}e!!w$)VVlsrWe*?4AU63?s=Ma$N&B~d){oL%Abug{K8@mvjfFV{S+ZXqh( zp^ip(mJ2u2L3kf?Z%p|sw=}q8cfE1=3DWfMnf)>G6jR$fQusfw=h`_BL^jW@}TEn$JtZ)ua zUwy9_v%vt$;Gke5KeVxRMqXd!j9qd_%^_R{C{;5&QvA%cw-YdF^A7FJcYb#B))?Cp zKlIweR8Z9q;74($8sVi-E^{);jrX9o;??F&i=MIGK3Pbh$Lf$!=tY*OQwtmWMuktp z)4;nav2g`d`7Ks2o`VPq8eb<^IDXpGu^A?6Q0@s9&#daKjEyi}C>4Js=b+VK%<-nb z?*iEN8P5((7Z3yIvII_*@bX&*XHrDyNV)D6H_Ju+j{l`7VL`)bQXXsuRvPQ*)Y8+o?1*9qef8%(9a>lRJL|+N0 zbqck7@FwA0n1xT>QWae4?npqNStznaj{A1riWuG}F(iLwedj#Zl^17^J4$)-vGR1f z^4L-l9#eXyP9}Q34Bre6Y?`Da%|f_UPlh@~Tt+xQz`4ligJ4h^Nm{q>Rni$-s==WUbGB=xYC0&OW^TtBw{-Mz;6uX#nFWp%DvZ_(WCy}+K(~0;v1$04=;jp)HAF_4 ze+8zS#R}UW*oDo>Wk`<0ScFoBl$PQqHVAwEi$vwX<`(zVG{((t```|xHi z|Mq(>$!nO0s9U*r8i&M0KFHzgsVuNI+eT&@`aVgFU<@kpv_y;g?IDajZpcy+$_*) zmFFA)g{r$Rcd2;%QJgNrI*qCL;v)TbivBy1|D=N*(m@ocM?b*aL&>m&1mb$5yHS?y zu%>dwi!G28QH8nRd$;gi+^DNlPNnlWnRi2j)~v(E4q&#XY7_9AMZT{{1@NZq)b=ao z9P;Z7a$Rizd>@@o0IYaQk*(>3mMy;*IwV7Wbp`ZZOi`HS2!L)MtP?|sW>tS&I;Hxy z2_2)*JFS_D4OC(g#V$lIr*PL4$BaPl=jMIEUeckT z$}d=-xkCIPr#X7C#$%&4=~1gDE!w50R=)xtnMxK7a%|q>qXsT+ovjB(MR_GCrrMy2 z8b{WdWKJ%g*a68X`lQcZRHuajUx2>R(r_e@$@C%p=HxEPx?&5;WxYo65UE*JLGF-> zJc}T^LL=QF?NJ&BC$PhQ!*F|#K)rk>c#O_mn2JA}Ei^W0Y${P&iTb;>!hAir6+f;2 zTJ&?Jp7aIslt()n1^zc>6%K#*t>xP{xsUoDRyP|AG($aWieZ|BXFuG^Y%zt1&x&a@ zwO}JQIVee*t|R=7`jOaVD0`GT?tzIGd@53U{Al&AV5Si*sKC(8o2Iyih<- zFglrwSBir716K-7*k^CT4C8`LFyUIYX|O4{RzH083da;PEG$&o3iB^1@uGY3+n?3e~{NU^iKV}7f6#qc~Zl4$boo8`mI)6&&X+)zZ5?UzUwXVE!C3!?1oHVpT?c!QEHoOAPLccEG~xcQkQ@0!KuiIk!0^4lrz`-( zF)kr$LZw?(xW~I_JZ7KyD|ez{h;9B8-HF>I;-aqlk5ND}!`G_kFZlC3J^zP4KRU%!{F7bDk2 zx4i+b7c#+fhW~b-!JVp+xld9dZ4bGyn;y^~rW%@Iv)v%c`Le|=m%xO>^zddL4%fq_ zJUl1*K?pDc))3YvZnujtq^4*!@vh2-whob>SE)4lPrfuuej+h~-A;ntu65BbUJuEK zU_pv>{Vx^oE{^ZdXb?(MkB>KqX#OnN^+$VF#G*gxo^c+17`5MF&fn)E8?IeUkddB` zR3WLv7^&_zfw7%Dnmh8TInl~OxIQazy4F8v!Q7C%6$N>NgFhdz+%G~=SOy66N;mQ5 z7xnYN+;m;Fn#18xVDzTL?Y4wQs&h@VjTzt|4@(Rn4?V(y-3odOL-`C&uJ{f5Qhw$a z{R98b?|KX2rl22T_DZbSPnZZOoN9xbZuv-IN%R0A|7Cqx?ulZs%=jfzr_;JfK(Z@p z=tQ>wH%Et0xb2#r5W<-4RyHdV0s^YZ&jsUzaWlmqLl27Zr9pZjJSpTZeso{nOX=Wl zBRJMX=M@y0Sn06k!>E8fcLebwPq_StR^1dsFJkv3>hom{H`k0sb=U(J;EciAMtbsZ z$}bdV4^1=QtyKaR#()J6!0)RiW(H2fzsYZZFhBlx-*NP$4c0^)`_!f6#qCU) zfziXi59)v#VfXq<4C~uCT8>XdNB>Q7x0yJ7H3pI3Kw<|Nn_q5W4MXC>?Bhu+6y$li zLCu_u1vF5#bpDIKx;9xD3{-8d#+@3=V;L7_Kelt0JTdgwyJuRxTX>v)}CkPUCLC>C=MCElVwC>F{KMC;#Eed{0)s zhOXlm>?e;qj!FH8^_M?F`1F^ZnyDb}(0@3KK8Uw2qF)dEsp}9&^e1IyR4o^V0(T{g zENy@)3xS?gedZPP5Arv|%&?C0Wq0N2tEXq$5Oo{iq;;CH2Ov-d(3CCiE3I=r&eJP* zYFTjaM|UB`v!AS@4Z;D{=_*|XdwbRS6mzIHuzv8!E?_*er^&L zrQ(CZmM*eABz^oqShQ@bPJJsRwNv1Pr15F+PW2A_NzPrV=kD;V?pg0Kq&!*L@w$YR zeY&~g%T4aGPdh(PH`K-}`QQ$vg)V&Vy$#oHp}KRw(-zuQ`1ZPK7X^?Al5Tv^>j1-H zae&NV*q+m+jQG%&uqdhm(xxSL!`c)T5uQksFuN=rY!OKsu^Q=||Kg`adfdai5W{=6 zRS`pIk|u;>@e&v3*5Af(Vs|OIL zmYnLjv}1PDwtpfD3znE|Zz^XEV{3ms%()|5d%4xo4VYzKpYts8ig{g@m6q?%8Jfd% z-Cz(flPt!|_~L}Y!0VNP*UP8k^@c6G;L$#R60dj7Bk@|gz=twiA?c1T8km^DF4X_v zV(x*7z0u3zL@!N;QaWX5(;tq>Z@~8rma=_8sfBnR+bX28Jd5&=lm#U6-ur>H$wnqcvlcV9*SYg?ebmMZLAy3(D3XwIg;&Die z?^PiZofmR|t~nKE4uI7riZG`E3O3sjM55qIBC$LZi5>ncl-AVjjp z0Gch@{$ULi;H$whk$iS*RgqLf#8FS9L5_*!N^NHcU26^S-g+P}5y|&APZG(Gmbpk` zv>iaqhw36Jz72m+{CDH(jNRgDK5(_uQpBY+aCKGSs^z7*dgT9k z58+cC?cl!>MRx~WoTF(D!*J<2%mSk6z)$xXxag^4B0bhHPMyP{2 zi~VJxo#AmGA?62u>m$TJJ!uVC^!Y3eEd7^iz#Qd<0BDW@K!2@p1!oY9!7}}A`F#}*RY$~8PoqJO zx!pVH?B#a7)lhqq{+@sDB>g?(1FpZ-(XOt)8W?qRcc-yZBNp5E@E{pM<9q}$u%kJD zFq7%`8PW}m0vG9xI}YAW*-uHsj; zoKc>q=vJ4z1q4`*=8M40yxQJJT+5}u+6TrU8XvA^=N`WHJF$M!+=F$=A({om*q`>T zDP2{ZEwA{2l!EEv3-$oyiZ>=x22*KOB-C)T8s-Vr38ki0wwjadI%Nv&F;}T?-WTwO zrB)kZT5ULGwJTLhfJ~qM`_ZcUR1F1qN(jcxoFl+bQ>M#x3J_)T_R8&Ndz)<=Cn?j8 z_qsAwM|f&w>LErC%G6U;nYhoksxn;=E7M_rOqA(m|CBPltgK9oPs8j-P^O+(nGXKt zE|lq_M|MYS5QY%+zdLFN=sYDvL&}R4>=Y4p8(~2a|gz zvr6^VpHEV%FL7oL!p=BNE`Ch=Su>O`{QW_0gPj)mw!b zLR(m%Q1Q9PLhf}xo5a=gu5_*@6|7>6_7q(GJC~7#z_9r6U!}aWsxsGFk6k)6tPpTS zw93-3bs}`CYXWme^)Aia8#k4iYXBh23IW&wS-4?i8EyAMMGTfX!C(BQs>)VF#F?8$ zBWCUwZCQa}-gr}<)iEeZ)cxe$lbHL&70z5ox4cEfo1bDV^Z6$dm7Sg8s&jMlkh42* zv&YhvzEQ#Z^kB@`)>RoT(ICUNz%mpfPE3R$$LP}%&pz}4c}>c8*#V=|{iP+<3; z#uKsU+2qhk7B1!sO!LJTMb^uf2p}6t(Fl8Pik}r)5DwM*3s#r(fGR55gq2Ovn`dgu z9yhAqnH?4eSOHQm3>nx_$8ySTCP4aIOX-W1(qK*82=JzwCfFS6YzZ(TrIa@q($Vti z3VUT1X1A3Ta%ca%tP5U`o!(YI?8NbyDLGXE*o}!UyyGF)h4NH$yG-2iVUL;N!;W!M z*9EJJoI{R98vkYBLg^T5P~MoTf> zQ@2b&lOg)k^Qb-fvw{=-$+CKd0YPkhvM^w)h`&+d9kO!aoS|$|*!dQ7Bj))v(VE{l zF{aFfITvUHgXpIu^s`(cLlQF5hfz!8m0@8zu)b$qG=GuS9}*%n^!+dRJ_&&gG+(-=tk4;GH+)zc3JxgFWvCE1bV`T& z$-PTu`14BI+iZX$eQ$bkYDX}2V;9jDwJD$-;O0?~Ui63(-i(A@wXd$OrIVK21 zqKk*DF2d1wm+10;EdH~VklO~zn~tY#l%jQNg{;eKu~mlyLPr6idC|^i*r(%PKI%5v zb)biNKJZjL8^Ku-+sZS!h~D|f%TM&j8FWtmg`_Mbf7?wfwWWvs$5Q+8%hG2`4~su6 zdWl_XI6A4@x~t>b;q?s+Wy_{uPcWAr;WAhObDL#=ol+@N^OZMg7a-?%$wdI-t@-RWDzP!Mz2TNwr#0My=3i=`rrI~YYe$nv zrO#PIfAfZn-B8pFMXl?i9d8gtfsX$R{9pag;D7wctgFxz|E^XR`O#e0+99nTzR`!P1y8xXypwDTUr84+Sz7a<+S2bjsKdwz%HEgW9n8+$*U5eTaD+!zWskv7}{c(sA$ z4mub@R|89&Vc-C7UNi{|;+ff))Y)+z=5sHI^KD&-yS9FMw8 z$AwR;@M(&^WP5^+n!!3244Y$wwU2yFP=7&LM;e8@GiQg2k9niYqH z?d<+)bO_2$m4g7&O(-n{JhSQn;yGOjPNwpgU5x0$|64;@9}@20$#TVN47r&*p(3>Nxz|&Yc*U z#3_o#j17TDU}-!W&alG^yO}N04WyuHT1fXYm<%+#yu;Z&Eu?0})hlQrpB9k{f`pI@ zO8EWK489C-WtVlT@ARa{lYjN(t~PqwqnSCj9;)o$ZU5RPkyjbdbScd3T(lEUP8^|+ zCU(J#xChre5qm6}e)1`%>1SFpw_SKV?tFUVkS?h$YF=C}{(Z9XM`0%S2Lh}A}C+Yso z=&hAlGa&{ab~^68ht@2d#)lob$1m>H$v)h&iDdSUZoW`(Z_mvjYg*J^dPW;mfAnij zHlYfNNZ3A96J2|=rVvf z*F>G6y2U1hHo2Xjpn7hGs*k<#xauaEYv^*)}UsxRP z=l`*UTzx-3A%l7qGi~p{_}bqHd`r7dtajAO@QN>a(%bZ?KyTs}(bbjuJenO;p>)5M zwvFzA(c+QyJH4t2Lzruh8qa;&HgGnVd>h(q;Ysy?2x8ZFc5S#|E;L3%Us&}wc|q%x zc6G~O42j#UakB(vi>cN>f@>` z;80sylplt0T5Qux*rvKXHAc&S{5PYyNnteouJ`HL{lTT*m3~*e4A~ans{gj2m(iSK zkoUh#9v_tDt@)_)v$k9wuRAKPUq*^=;(sx-$kB}bw+AZ)!VdI(V>drs z+|et)lX54Mr2M^ks8=uAmXUA6hi{TOWcG6-;~tYSJq@W$jO$;l1HuEi`IzyUm4by~ zpnwxxC@cTMmEo8a3Sov5f>DgOw#1c!Di2uf1$Bun7hO`PC=*g%Q}o~Yl;xs6JyIV+ zX*N`s{#g2B^k^#ty>M6l(fYrSIejS|mWFncYja$!@k28^L)1-youSg~BkNN=1GJj* z<6CO=v1P}ba(Q7}AD#5=6yNzsv)9-;rnjx7Z|bL&%;>+6e}y3r^P9_^56o{j#2RD7 z>dT1X6*Ug9A^*z-7gmXd9Q^AOcKqFS@AH@jz)APwXvP=2 zH0t^-A=%G39RfeQ+QHdg8= zU(~CjqXS37)AJ@7SOxz2xDWXENQHepf{3FZTuqBTj>6#D%IKT%YYvKyl8>nzjhnk- z3VIe4ILBE6oWqZYA;%8I&B%}J&r}aHa&v6R?oFW2-MEAvHsqIy@5KipS_Lxdb?_#5 zGI1$YrY~Ivi(Z0_Ql<;EXrh+sFMgpD>8VU*QOZ15JntR7U~zC$wpayjDiz5{rRs85W1t6g{6N1+p0sFU*38{`fBl?ZUKEuJ9L+IKEkbyn;*`EwAzR+iy8m zU-=4yrY`k89uk2tu2b_mJmvM&Fsp)LciJZ<(twt{f9 zgobzQ&pyaUX%1F72wAH7MvcVX69 z_}Fu#3LS&B4Yyp;(%W#$!gDTN@C-9>nhX;LaqOKG_`o@}lz?j|4Av?Wi8tIb=bU*P zncF_6?ozuaVSrOS5g)D>Vk z>r9<&`Jgh{47I%{fx0Fq+pno*9Fd=|E{40UbYszYk-ITAnM(TScM1 z6gXd2s2;z>%M|M7vOq)w<~Q45E!!1FI@S&X7B#PIsK8KAcGR(|#ItHXZH7rprc1?Ja6t!d5Fq=H(X zfZ3vLh03%|R+){H84)#|X6o{yQ!Sb4zmBqBmE*k|B+zABB{XRfX!0K*HH8P8yh~9J zpkY7$MI(Qi6ePo7%^~vC!6z=*BG4gN&}uK*nebOXAPWp^EcEWoFSrl4bd+gPT?by} z^rsh$>o%2U#2j66JWHu()N5FJ>QB z3!j&59fb%jX4~{@!Bd)9OSUm&HR&W#A}rmp1mgH^pUza7jy7e{)0l|WcSE>FbucS+ zofTaja$aK%NNnhQPd<_J2P@>9D_Xb=Oxg$r|j>l(d0^W3`b=<$YDmtu=~! z^{UhD%wlOXSA1Lu6zclpnXVD8L!=ysmKR@B$HYv-eng7^ZV?+7Y#>1T95u-3B%_s# z+S2P20)VHzs3VI9wWeFgq95nqYD=o$30^G&Tb@z-5c}I{Gd6&e_9>x+F{x@}+JiRLqw#4~VZd)EB_rF7?6 z@pQ#($8lNUEvT?CcW8?ZG-g>ccdimSB5@8!$91XEe&7Wft>hfXKh!WLGWzfVOkfWR zhiv;xv$6FZ*tgmTO54E1QW*UbdmOuAVB%o@EPM5-lo}v&b%8dz(=@$lZI3cqWt+`acaf1R%^8_pD;Ohl|9k|A*{AQ@u~}$Zuf@x8 zwIVCq4SBnI1AsDv(nqC#t);($#*bAOaBVU*rmFNIHw(Q-a$nLb%N?1!!kQR|z|RYP zCbxkmKDOoSj$%Pb+|j8>nYLbAc?&8 z&6bbL>V~FJc22fL>6_8xCz#nj;>kmv{L+(?8&TIC=2(NmmhGv)t`^O^+5N*;(phK; z*N%U&TBx+(DJ%2KFANLz_|x!`tA;4Ej+gJWm$q!bbAeE~J@-1Yrm;l+r<22{T~LAg z7V(e=cho#INhzXlO!L(xUhBx*{E;*=_kU_KX96-0G-fz+`J(b?b#{j{-|b3q zMkhJaocS996=x32AamZ-$h;$q%wr4p44LPqk?F5M=B)vlD?gm(%sMUysMMLjnTduB zXD-}BWUhNniZiVh$UM~LoVoAnG%`C@PDUmu@Pk>-{Pd(f+g~TpT-@Z@k($b72OV*;6AkGmFe; z7wj2l9=ssMnLZ{0)0}xuK<3t~(ww>K<5P0x>U}e&wC^4wb6y&m<_cs!_A2Mh!5L(} z^|8sw1XF6vBD1W0&p0#w$`ofdneWcdaON*3>=`o0rIG2a zK;}IcIA`wfPb2f26_Ys=kU2Js%v<&lnXkSg#hIoGWFCK|BeNib%mq^;vuRd_GY`CU z&p2~P8kw=Wte9ROkhyMYnlm4`b~0yz&Rmg2=G;9*rf`0WGd&f^Y{V=qr3(_MkgynxKX8D!2XOy*3`nbs^a2k#*=7p9SE ztU%`aPUp;fKal23V-;kAnC_mL(V68h*)z`k^t=>j#(BeO7z%bXPh}Yjm&5TGCcvA9q&ye^XN5Ga^{Zu3}?Fb5Sdj=Qk+>;fy{&F zI%h7-Aami=$efl%=I*vVB%DV?HBGDXP!7ag-l-sGRFmE-us?3XKt>73>7uD{qtTK z&a~_yGMA*0>8(KKtLHdp?!PjP%>1d5`Fs|cPanHyocYyRDbDm%Aah7SW=`m`X=HS*LmHXO&kBAfgUqxl$OJLHF^kNb_7Isbo|)oI zz5-IND5-j+6t^?wmwJqh$B0*jDPm~FJC(GPNG?H{P8DG~ zl<5$oi07ma74LW#gP=H9szT9F^#A>?z0Ns%pLm?%5e}GD+5_8Ql$mdTaF`j9A(-QB zFkS@Atiud5cb{i7^V~J54y;Z40vAl1ORA(;EiEoQnRV7?w}z%2c<4d(bXK~EjH zXSKu3N5z>jvz-m5GXmyJ1+$|A=D%qiSj}{j3+A{C!OT3wVx}Vk=IwIB%#3qwX8x_i zfi$h@gYO+?o*kJPGwa)6+9P0or(ixi#|D$1#%DAF|Ir0=K!#v0JJ@1oUIffjhZts# zaKMzLY1-;DZ+z!4^Y865W9G|)EHG^mFr^CS?rNKvp=lgggWmtSV2UyXQ)Pph6#?^) zgAFt5Ibc4xa=@nj{I?D>H*J?0Gp`?LG1D3Wv#ElabhgdRo_D2!*~A3Bqg*iSWeDa7 z8%$#aOw&OcXC~QTj=L%qj5=`FDu@E>JKt&a#;)PvbMn%*)?6%$%Abm^%)zn5m9{`FMX9#BcXp5Q32$-$|3^RA1 zVKZ~b<*8uQOh>w4I=0S?nf@{hOhp9D7zMMQ1Ez3bFpK&eW_HaG%%5#A@d%jvM;m4) zoo+L;WtzT8d+ozrFt=}&88aX3Z!uFI0kfTgS$dicW_B88v~TMC%3)?$hF~VzV9Fw3 zW|nE3all-YrfI7Kk8!~?Y?&D|OZKyvDUEb2cmK&|=DRd~({RJgAugDT48gSSYcZ1>0rUDO!_0aPm=kLU^qI$3 zILs_A%#4}AHkhmkm?IR-q*H8WCZus-HPa{;%zhbynYxd~Oh3rBC;pG^YnWMjvJK|# zG##aa>F9Nsxp%Y7m`Uz!f$58Y*-gRh=zuvT&EQH~(>^Yktuh32vJJ+IfVpEI!_176 zY-X;zIMrvgqrCqMhned)&5W5>_Oh7iiGbNy!F+b24d$LHsbDnd?d*cd&JfI@Hkf4* zFw^(eIOBkM{=!r+x+F3;=`b^8L}tu9Txv1X6#>(~mjQG4A8lr~xg-^gI`FnG7;kuH zU`lK-oe?m9Rxs;1VE#UJKrpjChnbTy1as@27Bd|YFdvi}W+qkI%&a&s6$~Exb4_oA z3+ClbGGk__4W>N;W}<>widWpjZEi=T@fmGRt)Dy0jLi_tv^^|l=0(6P+0!tyqXVYu zFR9FEYZ~H$S+H?t%zV4M1*RU}g`?jG1?LvzTd(fZ1BX9N~aD_M%iU+O!)!b(qP^5X@0Fn8pa0 z*4;JE9A`7LQ<^os0;EK1+SUbASCAPqox57h)J4DyRxs;1U~Ws(H|bPm_Hu`rRr#5L z*(U^p7k=#V!=<|!TFyDvrX}(BR2%8@okADMIT<3kcb9+`y!2=z`D#~#$;1isZWr8%aT$&PYRUp^Ic}hDfHB zSe(RdB+u?_IH`1yY@H^=sdaAo$l>JCjWXk8^-dO&avRA(isXs^vpKo-{8a1se&Qn8 zJwqht*+|N4BoCDsPPTE7tW47(>cIQP9*2{E49Sd>Pj<98DYcR8tVpIEZF6$b*{Pi9 z*s{PyvU!F`{%9j9v60-dli_6fQ8tqQRHq`*wsYNw4ky=dm>DOp>=1C$P+WvoV1wCM z!Hjdjbf<9@4fq?lV6rm=bEplbFal=!j)s}J6KrN~IU|)B9ay$};4m{~gUpzDxY%N* zAOfa;2LmR@0dwS8sbJJ$)_1{pxtW0}vBBgdEa5?qzu8_ zI?`e$D+1<&V#Cam-`QaHJ~I`JGV}BQ9564hpBXblZ7}_)pzXjD6-==M=FxLf!Dy_j zb-|3y5X`jgEoS;6V3v$D%ruO5m>C$%s`ngb7Oa;UGv97!f$<_>_E#{=<2IO*(^8qy zM-}J0V0Ow7%-J@Wo(P!xwl~a-bHF^8rfDM~2T_~5U}ncMW9Ho=iNk?8k`xJeQYot5inDWG|n7ugE=sbnGm4pGkGqUNg0BB zX^Vh)WgElH^22N}E7J@iHZo?q?rn#e{|?HGnYCM4U}i-*mtfW(cOz22&RSbL&=ynKQ@Q%*;G7)q%Bdy37UBymkoovgY7ZV!v%)>kC_0 z%+y4{3{@~o%55-11_tx<8xAwS{E``%gKaR?5irxX)HvgSnV2T%X#}oy!CaUjm41FI>kc!^f6k1VVjE0l1kBkAX8FN3m@%iMg3+LNz6<7r z48i=Z&|;<{0_NS#4Kw2$Fb|(RAeiK94l~dHlo>M{+F;@lFh?nvxd++I?3iYxr#>^; z1#{3qU}O^?mRe-DIJS=CLpJ!bkay)~7Bl4$Fr9^lnH&eqr)lO*{Kz(X?XO;Sm}y@# z05b!C>D$x-Qx*ZUkAgY#K%1F;|Bz}XjWg%EU`A#L<_sH5X#~vOn;B-7jIqHiJ}woE zwx&uT#<$uoy66;U^d7Q%y=72VFXOerW$7su$kF7 zO>5FI@TylFX0G@lGiII~ZZT630kd|50keFx4W=l~Budy?!o;H}=2$;Vp zm~jr6g{P+aj1D`KFFVYfo*|gKHnEt=ih%iaxM5~)na#|jX;$-wnWlZF3+Bz$nK3iM z2Gb8ev?u)dURxcw z!Uc2ZcbPHsk^XLnyf3vZ0;X8OG>o#DX_=U6CM0Cv^uh}cGs80kbDRyPI|Al!!!*w9 zYlF!d7|anan7@9T88gr3TRzhn0kffk8Rvjmb!;j#I=EW+yu-|ot1<&~fDNW20_MsB zjWhe$%*;#Ensi3l;DR|XLoojyYBAFu0n?Xnz~ne!UOOR`868}$ea>N~=bOx!DYC)L zi-0*p!JN6b&CKm-I!cW**ScVi%@E8@c@{Hm5ioBJHOws8%LX$!&3Hz8?Hyb&OTW&H zne}Wivm#)|E0|&j%=2lcDjH|nx*Ri&&JfI{8(GY>M!-CoXP9XywVByJ&2oLdi8Etd zF!TE|V`jw=3ru4K%$^En`JOhIs-sgK7~MUC-qL3sX12``%&9h*x(JxNHZshNbHEIr zkO~F~31+Md=EkowW9GFDEoN#XU`8mIxqH~mY@Eh{wP`O|>M#?_5X|8=nCb|a#vvMK z959=t8IY?3AL4?kU6~m(9UEB8R7Jq7+0cMFb9bAWZ;nbelXeHsKjSdd`(n8-(sdb0_NFV!_4wsY%uTsen6jjWU<4{qrI6i zvwA%XOj!iX0SacE1Lnds-GL4vCc0pD$q>xBHki@~n18Qtn3=n?&CHYkm&%OBnHLv1 z%-r@xX3V@FvzRG~fGJWiIS!aJ(u`-6nIl~=1sQ^=u)!2Xz}&Q+#+eeEnYWHiWk&m^ zMGGBf>XVr}-r^SzfDnEh-pxe+jz#x%}2V75)u znsjj0(djUAPKIFa9c(d^6#=s%$AD?r(Pn1U5vk0mnf7tP{O|M3nAyq((~qS&d*Xkp zf?2+U4JPk*sbG|u`~T}O^M4tFxjx%srY{2KwZVp&aSoWqG(MwXc6Pxm`YbbMvTZP4 z1kB+IW^S>~%)&!cnSp&dxSIR4!_24*!Au!sG1C(P(~)hM$#KAp9vIBFE|__rX2y({ zWr0~10kf-uIdi1V%w>nAGNTSW`zeQ+Ei(jjk`1Oi0_OHXhM6VX+hA6uVMf7>aKT)+ zJTqoqUTb|qrYizwn1U&Gz)T((%&aFJW(H*lW~>dSBLb!&OXJLTHZwOIoN6W{qyul_ zg1PvU%$Qm5i^WWP1kCESTgd01mlxS!woT(R+8tc?gu~3|A7=(;CmYPX2$*vf%s2;3 z>EWr&Xq?%=1#@DCU}pbpG1C?S^ZqY}nYr8A%xsj#XOx+S#~o%~`Y1DI@@z1(B48>M zOpXI)n{fj&v-U9uOnHW2>VC4AX^ntc{Ig-^%x!FDRveHDMj!E9P)B%GMQyYBUFaud4<}UHCciK~u{rqxsMWVJ#)G|Gh3riYKv5%8z*Ilh{>1Sfy14 zwPbG1BlcrO@csG=w+w5Ui0z<5NE?if^hdd1cFYjWBpXac1kAlZ8ZfVJVS|}bX6$c+ zK|+T1N*B!E-_MMhcls@6;t?=gDVV(+Fnemuu)*kB%j@lqnKsH0%mf=uc?8V$KNx0i z*xY6&Ha3+RogMzk1#|WPGGpeyt1V{AB4Dx=%-4lBm;&vAZDzEe`QZVFnQz|949wm( zn9>NCDgB0-i4K_c$_HfT4HwK=8G`xe_ZBlH5is6r1LncaY-YYnGy3V8*Y0=B^!p6KG=FC?QxF03^7n?B3-SI_FQSwA1(8ei z8MW;*y0h#k7tGV|WX8-d-&$aDBVfiVm{;*ySP15D9ktnDwA1VQx5La{8G^ac29p&5 zv*0_!%w7(dCv? z5iqO1F<^!{V7AgHu{Ice3vB&$jpfqsX571P=WD~vt8j@B%z3(UX)`m_w5E=KIm|rwMrO=xV1sFofSI6R_Hw}7 ztE*5p7#()*;h5V^YnegRA@RbC`MH^~{+0YNZ9H zEdpk51@kqm5Q4cqo(e{p+1UlNeTHC8x53PcfcfWFh8b+}u)rLdraMrddGcO|nVVnB zjF~s>ZwI$Vz!WN&2eFGSWaeDm@nQRn4k7k;!Q^HLCT@dijDTrgsd2^ulYe2VnJ_71 z-}K`=hndS?&5W5RR#-k$7XkCjmj=v*=#)cd?oTs>P%}+;!L01g49p%jnA!-K3l$71 zXn{GcG?f`$YsqrKoR%S&J9{l=Y9e5kuQ1H)<$&2e&5Tkb@W1YH%=E@9nK3im22&jY zbAp1o0bwLG)62W2GNY^A+qhtk%n;09zp$98jDUH**D&)n=4c_9Ep>UrZcRGueCKY5 zna5wwjF}&k7MO|%n1d9|LFl{eo#!QcAF;gA^Gg83}bHJRI#(^>5VVwEmpN^R}$q>x3Hkh&qm|Kz>XV7v( zW`5o;)q&M#&U3-ccri0(mVRzAQyKxYfr5DzvsWJsmc+OS)ttA&15zxB&DNW-RlgKc z3rkx*1}=%o#1|(VCCl0v=I!{g%crli$}K^;NcU2)sbwYCv#=yqg(E&^M#^8AYbY-= znr$zHwUosEl9(jLk{FX(OJY5rS)~;QwPbG1BSx|!SQ2|0A;GU@B6f8eFuDr)I~U9* z8GK)Wt_YZ~J~3c=L0br> zNyiyB7+s%T&js`0(#)9I)&|oN0du;5nR1K|1hyyJ&3WT_;kMYmFP4u4`j zk@vQIec#WF-^WQ_iyvPOmCvW>502<0iXOoaJcn9wiZ*pbqbQoX#@5=NqPKpuMfnu% zM^Pg0BnQiP_%2QIgdc3>k0~1Ih+d(no<9oB7fOYJCn@@5wJo}rqQe}~EfoFZdt0lX zqQQ=+hN3gRv$am4Xz{nU=yw#2bVU18RKLpBDyHa@Z*0*piVkx`zu?m|$$xxpYxPnz z*byzG=!`yF>lum`e`SmQL(xb_bO%NCD{ZY7iaz<$7F|lwVUB1LMgLe~YaL6`U`JF= z(HXtA*6tK7{=yb*LD5J@v_3`kNn7h%d~GKAiD!#GqUbP3^fE>N_}tcdf}+8WXdXpp zd}eFiOwr;`ZP7IpjdVm8P*lGhT8X^H@@;*;tsKugb3d`u^ZPi-8b`DzMcp6UT3b<6 z>WDU=sP!XT>wA1rCfV0xi$0;K!Vz^-)c&EZ^%O+~j_5v$YCf>F{zg&v`?jcoqEbh6 zAw{kKv$g(2QQv#E==T&=IHEF&+TXRccA%)h5p7IS%{#W%+K~`-FSA7}C@OVC?@-kG zwym|4qQ19m(L)qfIHER++TXOb5)>6UqRS|%dBfH^o1*U5ZP9TQl{%ua6t%u)YwbZ% z->bH0ONuHSQ7%R8-L}?u_*PA_z!7~+QOzs1)+-cszif-1q^Q&p-AhsHOSaZ66!pDm zi|Q$=a6~l}wZC9%okCH8Bl;ahHP72x`%~2YoGmJ*sMHY+qo}pZ*7^k>qDl5WYm0g* zs&GWhC~9A7Ydu3zfg}14MK#aZT6a*?y~Gx^P*m!OE~Th-v8^?UqP|78=vay>98oz% z?F((K-6<+?L|af)(`jq1Pf_=OZPB;*@JzDQ5q(5a>(jQ@%M|rJWs9DmsKOD=qp1B! zTkB?u3LMcj6xBRoYh6H5_v5zcWQs~1(RhklAG5Xgqo}XL7LBB+!Vwiv)c&Zg^)tRI zlPqvVUrDsV){ zP;}9Qw$>pOz141ucB5#tBifvzIS<%c>ru4!ep|E(Uy(_k?udFQdgkA@)=LzXIHJcX zYMyUv-9ypJf7zm$6dmn|rcreNeYV#56b*GmCsB0%y|z}IqL=5{qEQs>;fS`U=(>As zt$d1B-ffG1!uM*DM?0b3ii{7H>BuBKEqNgvjwc07##u42{(N&k) zTGvwaL9H#igrb8T(U}z8e#zRk-s~A`)+W!Ix_0f0{5vb&ywMJASd)(@8j6u(ZG6nw zg8UiZVx=lRZ3TaHBi=N>mbJ!2Jyta%mvWvN}xmQf{Yp-sPVM zc^O^iT_Slm6jPsBqtu3CCI||~5}7D9&lJ$XVnn>@xZ(nDmu&}0x+0<}j5oCu&tqa_ z(#~UI#AEMnmK7iU>cz3-l~@lV@LH_jjr^NgzpH~17TCb9o;AmE<<_|33RbBN_xVR? zwNf+}3MuhAJB_%6g|$J#ysMG-Jx`mjlX*k+U4GEjP&^A7T*{k(jGJ;hGMo0E(S_Fnzketmy6>~PZqZ_ z9rPOIxUa5(b;xIF8uTt!#!#}+fM$cp|F1k`%T|<# zjXBPo7kGDm^!?iWArO`155aBZn~3ecbH35^Mn2JxyWSPoAUb@$Mx#R{K6orb;zJ1* zToE5;N&V&*xAKViAV)CUj%)rA`8?hOM{T0(FTm`(ooQ8YGPbH_*ocH0Ur^U#JIDqo$=IZ^+7jqmI}v7#D_K!aa6Q0T}4sL3RG6|mw%Uttn zo>X+6U(pl7imD71m8?)v$*OsdhS>^J(Gh1p@An?2qJGc8^y{uDpKE-EeyX>-S6cv0 zMpM^@HUDRblOZ<|oBOhMal3|hf-W?Xx5M#)sp_Ow&3TKS146_RbiU~1@GS11xMADG zDAGeq{oc(_J44f=bFD1Ivz${TT_OHO?D3UOQzgKwEP|3Txb|;US~m|g_y_pH3=AGP zz{|Y8HN1Wr*U1Ww!o<_TQ5n1-dulBC01eBw9ZPnhD1(edvd3pv9k@iTxWdfhI(3Og z;}Q?)2b8>b*Rx!r(d3ZG%Q-e6RAq1pNeY*ctl$zRYq~@nzCW>xE>Qul4HcE@`%FJD z6~hs`PX-mQ9o+xRfZ}_R;ZF> zfhw6SD^aD2!sZcIJ)7RknSS6Z`Q31qREb`m9Pu-3Sl^$Mwr;2zIBYIQqiiul14N1n zsoTurN>jHSzizw6EOX8B>-Nn51?Ey2>Ly81H^~Zhi%XWix$at;-ds#SaNT@!72~5j zVlKwsU-7_FtxB03@eNB;r3dv3NM2=*Ri!q+O4}bDR7qv1k|afyBr8n%fY>5pK(d5{Ap#%+YFo9_%q zT+jW^A93xuj3X|uf<<%;h>_K ziRzb>EcO~|*R1Wm%Pl|uk*s-x@^20ccjk*M|7w(vawcPdj`B;K@=+|x=VS)v&+-n_ zs3yf1DK1q&*Pi8VZ!2I#IH9Vf`@fpdeUlAw9a$+neqDn}Gqly3{CEgw43Nmp3Z7e%$UN%Nkn^=jMMg5Za zVn$$2;ZRBMb4`Z^J&uHS4mKS73e*(FbG-xYB1(fSjK{>k}9n4#4phqcUnFb}BSO>aEfxU_SLr z$`@1FB+aptqP2 z!BC;bZ)(Gd7oSiB7TXQ*YbBjnq?+u3prGtw!$MfP4mqp6_c|bUSo3BPj>Lf z^DMSao+AME@d&fWl9$U^TO}Zl6y;LQyAm@))>Nv6-=$&;$w3R*1$7xPYb|=(5+ag@ z6K3uGOLG*Ppzfya!09cWos>+`DFVi;W69UpsQ^g{`4)m{l|k9O#K;VYxnDhtmfEU8 z#(`!eN0^Pcfz5UTnO(b_TLlLB=6WqZS{1JLGwRaB-F{+Zy39XEMl67HUS`g9fjS;B zOmCN?u1%ry@8mV~nbuxMko=)POY|{!mLulUqUWcl=b;d}Il2p+Jf^or0v_VV!{EUZ zHFd>`21S`BZ#D+7hz10sdPmP)BYj~XGlCxOY=s-S-r)k0j`#`*p zuK7SK2OSou!`;hvsK{y=f7SKU7;>d?WS52S>vTzuK zx9C#ixLk2>lx4C$xV|ep%({ozrTu<^1y^6^p!%*H)k(z8|7An5YhZHQ_zQ>pC^kmh zL*FZLn?7rXTrIk$)gVJM$vi&&xl3ZnPf%7PcDnh*>PjX2QWE-Ow}t(=@%kSJA;G_x zVC*0}g}5S8m{Fb7h5xo**kz#N?zXl+nhhu-&SFytjo1GTLdIhQb? zBtmI|=Q^Piw@nkQW+SO$olSYB37R~$309dV_(Gd$g1#rV29A=aS$9gw8f3)%G_nDR z!#T#w!rACy979SHBluxaN@fc8lYK-XST4%yQ>NGnkNJ7dD4APsJ&%x#*X8 z)9dlo@5UGY2y1?vt=6m+&4swxqLbV?W~K`3#CZ?$3OUZvDG}N;uYt*Db(vVRrMQPj zSjFheBL@|VHE-72q6Q0A8f#W+$n(oH)--vlH4zILP=CH1!)hs^hX~L*&&DMpQa5tu z9}6#4aAl(M+$Gt)W9VsA5s#DG8qB6GX~*T_yvU=pK_lBJ3t-;~#JQ zOqrM@V&y+*Yfr?^8t$+2j`^po^Uf3{Z) z5sItgqZeM0-Fq;Dc2&GN?^WJx9X%gNe5EShgmLgaS!Pg!=&xOLIg{WKTVUOxxzd`63c`oQ#xsLIx@FOFb0p@D}QYHKZjB(7-kR=N#G(9h+ewW}I&Afug za8Pd4@*geFnS|?YBG+3KqN!#`i>j3HDTCCkj5UMhjx$3Z z1pZ*|b%d$oA?KiuyM&XK=zMhQ0kC}$ZI9^`{y{}bjm2dg3(H*D{=-_p%>~Zk_#e%M zy7fzn7JDC8Bb2l|^Pj1IM1H_#&%fh-hJY&rxN_u^>+So1HGnIkuNC@=0Ho8?IE&Mn z^+hc125Wx7`Th~9bH{Q&8{m-g%A~yEc6o3X@g0A@=WWW&=W<}@*5|k9pR>;VA2~a1 z{`oVWW&XL`%h5sI2_pvD~kzqR7poIw=4j^xi!Sjcf-$kU0L6KjVEN zKmB@75I<d7077T8xn9vTro)zU#h_Hq z^~&bR=phl?Hb@g&FvK4qZ6SBPi_QSgPy24hP$hp+zTpBRY{Jvr-}G1RZ&u&4ZJ=VW z|Jsj0eS^CB2g!VRRy<8$xq!sW{Mh4z>1ivL(UeW|%_uFQM~p^2$oa>SX`gl8@1J92 zCj(fFk@{4x(7%T?MgDmrHbj09!iXE_;6c1Gi3hdntxo54KiDSql}X|SA`VX5u57AM7_G^W;Nc0d#t$fVQIT97 z^ZDAfG<`07;0TysMr?$x8x!g~3uvPr$(SQ&v$|fD+!n!;?6ID3kP_6Ke>^X>&dcby7?y(^L<2cU3gkddrmRuDS~=>2 zSK!LUHUEgQz&}U)TI|QX22D!3lAZ26#gCo{lIJhwyuvh2!IH>(Z-&!2pZwM|PU*}_ zNg&H6HkQk4X)w6X;x+J8`gm|&Wt~_1=cuowL474nV#L{t*x0xmWEd81;?3~miRg&O zi@}&5*<)TTm-%GU*y5sZHsL*ei~fu!{61F*MBJ&BsOi1dZ$`w@){5BHN?1&Z7Aq!F zBd*KnjjG=&M=aU$h~g?tak}^fKaMjOqiq&^O*5-tGmD#Mb{W$`YZ=l;n^_xVfHRke zIkFH8uzZ{YT6qs%#CvFF^Kbxfbv(>0Zr}k6Bs??}x8T4MdIT-T>t^Xln%SMJtY+3t zMK-hEPr_z)xHN;;G!J14r3+KO6DR&SC_ei2tIv_~YGUFbT9OL5Ux##nM?lRB1W@yn z2GGKfa+-$cHl3WC({yoeZqpUH8=2v*E{tnSCM$8+4@0X?ny@1IB>T6-sAV&0W$vDX zmD$n2kMPim`wWV__f{J-t3$)gWq#ZA&7C|J5ux`w@?xwm6X)=vnkK5@I(`{y0<(=? zh#~Se@L(L!`}-}vLGCAqU>wa0IR6;ozVt(~Ys&ugdk4t2P9L%P) z9A8UwL}o{5iB7+F9G^r1Y=sj9Z3{V7S~aNCLyW9;@|tL77rByj3*Wt)lj9w zSD^<{1%nP8^ckBe9hg7=&TrXpWCU7i9N5PU|6?uM%&s+n3#L*CnTZ$`$5A1DHeyWt8GL@IBJkBG6Bs(kqv9A8TI=wb&8f4C3 zoR8XcP0^6y>L}%@5JxjTMFk6#oj$7Lx`fw>yfyb3@~ZT9HIFFQ@S&uk+Y&MpHR#bF=wjn?&AWz}@=U%fKN|v$|l-?u!z}Y|2-KY^~FH+-`sL@LGx|Qh?u@`no zsC{$iQP3mJTV&UDuo3b=X7xO~_MZ8Yr{d=DArV71X$sw(_-I;WCVrRUMwH_`^vy%TnYDmNUDIE zOVtv24hx^IGYQ#wFLTZH^s%8}>gT^cYP*pWc~2ontK8hOY*oCUOr&dh`?ow`Itc ze?0H8&OQGeY09N!g`XI4!rlJv`S+L*xS0tvmrRj4Ga>`ktUPlfDx)-02m39>@>wsm zdh;zWjBit9PgU z&!7Fq_UqT>L+|89StWh=|1dJ_!?4F056%kK!-nUuiYtVvChS8YV;B#b8Y#9&R?04=rjOaMAyMt=Z%{I)8&ZxL zm0J^{@t21)65kO-HFSg>RYltfR(7IJU`9SP04h|+g8V)zj^^3h)B8c_XQQtCg$+BH zk#(iCKsR?QS6ql=hN>HZ~cmLVp`{ZQ=R&9 zZ{%;>VS0@EISfu`M2GMGxcJYSV7>#jA`unBrKo_8Q~X7rAeFL5tzd4I zoSEav4R^F+5LAIm$Y`iiPJ(;h)xSgKH$;fn$~*IEssB#&)dAKI!r>KSOSJwqewnp? znP#PcxY22$o$nnq7rz!5s*W=|6HDc38fam|Htbv(OJ2)r$R$#gaV%MmHJQI;_g-q~;So!IV53ob}$~9de=gP*;r{_8Jd1xkMGRX|GT4dHU3KJ&P7rUi{S9 zR=k2e$;MMg`Yi|sM)8br>8%6FumdY;x@WLLXQ|!bpDVy^ z{;@ME#JL&M^;q55tQze{;b2+JjIHZq4ea8TXo&rrAzzhbfK4A6qYS|&?jOaEms*^nLg}w#|25WlGB#3?hG>TcZYm_ z;q$rd3KRdvtuy{58m#Y496|&Ge{Z4`xA{kqWjIfz^zaM9YDslS>GeH9@KjQSRWA1V ztQuW2YNHv*Dvid`VTm05EwOCxGCM_6FZ33SppNvw+IA8bqe}q3HsTD)TmLU1Fw@2` z@nXhW74jWP@&emvUk%C6mzTq2XB*{u^{GW zZy9KkHb!pXuY(?DFV|5W#kBE=?P3(51kHY?aRAyz3H_`s@TlSYABlh1NioX4guC_aR zoRnuuY{PkKiDzhuEXf2YV}IjGu)9~JZL)wi6Bj|7lo-eyErVTjz5&m9SS`4o!Q05z zZ=YEJ%BmZ?r?k&~gXAVDa`>y}ASqEg3G~UMy(Op6-ruM%)80&q9LOTO^=clcEum#- z?<-yi?7i1#zP&GzB@nOsVAy-hf$S~g^-qW^WxQSsskHMtp5TuS1;ZDZ?&S9Z(=oW! z_ivIvy$%}2ZlcAZFI8XV8VVBXUSJj{!pOLe10(h9Sbt&2gB0N56TV2_WWS`5YYMopsfv{sRsg3n)$)y;1brF%$|<_ zV9HkxhJ}YRp>Qi34=LQ79|thAFlhJ`3Ldmm&hG%q>^X*w6I}sI*L>o$)OfM5^wAiA znk+1ZBeXES{kHkk70V)gZIa3t<}m7#HecU78$etAu@CJ_vubbzp{4SbKSQ=P4Y1!I zzEdTfd2d^oKt=y1Q^xz8K?5UrQJaWhPIABjfn7m0g#0$B$`@bgA`0Rn{3l4w&L3^P3!KNFP5AI8Ecn zUP}W5PWs3<;BJ2r-B^2DbDAgX3gHTt-V zUlZ_sq4zp(P8ll72a4K+BK9s}>HpvLeTy6nR9~sh-aD+lIxCA++JbeDlJJOF%UQkZ7k`PYH-a^`*>FGiQ(C6k&yCH;!bjXJzk%FBCMfdu$aCMs3Rn+Z z*6SSwl9vV~hx{eR6?_*Dn<<;&emi0J0G#yZ1$=GSdZW>CNVfa#@)h{VLzlqM;Kx zU92}8I#9+Xv}BPcTk1TdG%0p_ zGJM>ytvqhvs;Pq)8DMl~Ae86e3L_dBkDb*pCGIyJ{G%~6i>MYKaLF8x)s+^0-V;mE9l z4Z4!k0+UmVJW;`_*>`ZP-XFY8Pm%_G^*->m+0F_Of+6^y3{EiM5pOO622=}e+V=>= zZvZV~oXtg_>u=SMw0HPxo$*(Bv^8yonJdgUw7_459?Uw5;3}#9TK%VB!o|6P5G%8a z1V^9p$ZQdP3~Y%V5ENlBeUymivp;jUXuM*SuU|~^0**Y^r2DRani*UN;9sHbcW2n{vm3UO;6TZ|~ z9#8${mQKI{qL2lqf8JFfh+B*b@W5JJpJ|ww^1Msff(NsH;##@h{oJ7m%IC2>?6wf* z!fDzct29QaRnpA;_fr+jgJ~9d-X(^dwuJV@Lr;GsSFO*vK({eb@@hI?595uUB6{sz zS}D%?aVebh-;Q%S{R#Z5+xQoMU<&cj1O&V{%*w&Py?*IMG5x#8J#FkuyG?*a$D4 z%diHPS(Ga-ar~cg6L#{03}1zUaU~ddLcQnAtUdd;*TA|A>rr0~Zzh)wdn#(JK zsL~XsFdkw;7&Go>j%hO%FUINvGJac>{DINBGqw>M#tfWr2qJYv(X^M*FtskPBw%Aj zeuUC&gYu!HS8C8@e_fI+V|Bx>rUzTuxt?mWq%r)xd~)vF!t4rd!|mkmYz$e+O0>}4 zACebILv^1Qcn|D?Hn5@7WjOxdh+C%1I03(>3;*wDGibt79*NC*gp+Z*9RJv5aLZh3 zm+{Q;20!}2S}MmA^b%B>jQF2TYG<91T?dZ*lP9#+c{hsn<;$$|9_yT&)kG(OP>yq! zK?~4#v1*R8DUmz4Hg`ZOWOZ74BaSSTrMFt=BBVSK`|P+ONP?jP22Z(C8cquQlR}<& zr*CQEaS`+Gfy9`Oxl^(X5`=zym1+4#I0F``J-bS1nAtnnVGV$z%C8kXtC}+C6B~U> zazrE${Al@-5A?_)OJaW1H|bg=FOJ+KZ|IwJnh*3%zTpGK0;UIsEFAgAyiA^22J$jx z;!Q+h92*nm2!44)+D=Jn()#yI%V`L9aL19q;fUI-nP^B9`a6DSmE}^0mgE=0(f8xK zobq)C0MG(Ec_cu&#&()7NB#zgGrW7N<<(?e9~ zdC;->;g%1QE<4uPxe(tvlg(3mm`V^T+NhXc&Pf}yFm05l$$YlTMC@ z7Z#RcGzn_i{`p6Gh??|Z3)sy+&(U#gy@AJj!Y z+kk~8lv|^_@G+`cOq7T<%+sNve-k*eB>f!C7w=Mp&-0mwtMSn_);$uX5F72|EGRX8~FYc07ZOk1Nt4NDv!;bIo+r{7j6 z@E$mh{(&~8M3}5G7F1v~ptMgpqJ8pcUii8CVDbKhdD(~7Wkz+(zA5KCx9g+1;OY(z#z1Vzgx$%0$)!Rrk(!gaUV`|Lc z3!3~hPy0)#lEKQLm--}>PvS<*g$pu(O1;RvZ)r4O~RAgsd>Sv52 z(?4XTA0Ya4Pw;^?o9Giu_KF9@rdo*wn;*JDI{tB%pBS|&@e60I03QKi7IEN@=WW*c zJpUZku2sLRlOulCf=6W610DLMCr5od2l`AaEl-a6b_~3wOZB_uh_RI1NB760Y51*# z0^`apY4~ecSR&RuH*ENl4;sGYgO_SVS*mU}^6)h&1~v>xOvBe&n^F}ua%mLEnj7N{bCo4w`l-*7HhfVI8vY{{rs10k>HAx#n5mF4 z4hfblLEt>eT3*G@zkar$1v-5lTa=Kvj(D1echRD)z|23fv~}KQozL^nfz|kpNk{Cn zSfF1g+pcDO}jcJLcHTn~OK5k|VJ2Hv#yH zSUz_37s~NK^Y)6j{{w6b{#|1oqrtv)bKLEH3IVb6i6KZlz^2`rNk=Hcn-rMgBfq(PmGMa;h35Y8m>Z@mirnVWK4Y{oy5Nr zG-$k6#T+7I>is3~hGXhB}csJltJ_oLR#UqxyMe@->mh^-gfv|j&>pg?l*W%3>CY6*ZYUYv z7OMp@Cb8^cMkO>&l3$hTUEceU8BfsIQtx}o7ED}@BmW3Aj`LKP*%4Ty$~=y5>O!he^bWzJU@1om57J^aduIfXeCTRAW(a-iY)Aj7tM_%kPO-;4JKvvtMFR!Qy! zqk4^pNZj~(GsKM-5tD+&TjzNP_xoI!y0@zm0AM;i;*pcYxMJBqjspX61-UI`qbZ{M z;|%`i9Ye5e3}%8mfzM9m0f9U;L{@yXho|p&f5tnBsHOtDLFL4=_8^}1a_~QGg$x0j z=9>Wo;#n6>0JrMFQQ*OA*oWg`S@~{=P}#lm*{eWAN1$g>AW+Y{-)gr#$b$aI+(@?M zK5YpLm8aGwm9|@yT7w(>BZ6B0JQ4f*RpCd0Oen}(dT<_cmf1dN@&0-TTM8lz2?A#= zW}`5QW;XP@;EP=pa3H|4sF)?k23Z!MBEQ&mI8XR38Gh&%wae8sqMI0T?-&#=pW6*z>E2=VyG6pzK?hbd2yA#fSSWAT7r>J zzb2HC5GpL!EP=Fn(|2UH0b_W;ib(4(qeYhPAfF|r`r|ikvVdot8SvT^Rt2#dZ4)aP z8=+@>TY9O3r6%Ss`!!V7kF^+f5H+sZ%}J++iUosc*kcD1YZ=M>^=CPkG8lYOR&OG7 zNnNM`DCWqVyLg0yRR9M6cwXtBCt|x@5jq=#D_%bTlEuk=Hib+>|A`;Su@BHR>nVi4hgdPrB6M=$+AHBWaJQ&X2U6*gqe}dQBql zm$NxCLp;|4%6Lqem3-1?&RBG#)Ft-iqeGAY{&?|iW^{$|T!VRb0~}Q1uRv^eDt`qc ze>z`eBH_d0O?bJ#7JCdXgnqCb^!-@VK^dDEhw~lK9}dumkt=A1&-y1t{z(Z>@D^8T zmbbXgM2<27>V#Neo^mfvjcMj{E#0__%+b zh+TPU=&q79k$0bZB`hUfhUSsT`+7geUH@`V)LmHyy@~m=>;k_oQZG-Z60u*l zryi=|EjW)a*W33#4(`p;d-S>E5H}OCrNO-`$y4e1r9PxZwKue?8ocpYz;J zgR%zYKhn9^LgXB$*%`)7(84^Q#xfTLz4LL!+^fTmT?ZLqe=hsSSJEY%J2{zu%O47Td=n@7wWCK$Oty^Y;iB6dO#KY&IvK4namh>g2dmq8M-dmr&1 zjURF(2UbY1V|e%S;O=&E*Sl;eOv!yw!bpUVH-D9nn?pWGL}JA3Gt9>;vU^XY$zfIC z4{LfWp8Nzgl`%mQ`<7qylN&h_!%;U1)%_tPh zMiTMRJ$^UO^hO9yI@4wg$?h!-wcR)SO%ylj%}TL=EN6NdddU6~Ke@~~dstZb?Fkg$ z?-xJSF1}HGTE5>_#AS#;Q3p2&V&zbgF1Cy(1`9_oA%;3!(dc-j#;;8Lm(zb{q)PJE zxxF8BMlKW*+z;vx4+3RK{2qb5l)aHo5W_VWkg4 z%}!>Sjpeez%{jReKZ5!q-`nhbrNd)skKW{$h8n_TkpV0+ScY8L2ECRP)p_MN!TvadPqi64}S|yK*FP~{(=U6yH;Xawds!FuH&#R z!gNFBwuA7AE_P(nh04JWzOT0qUp7l3+FAJf3d@p{*t^@t_%Ov7wL-CuyU=7}$(Yt& z`SAD9F1aCUayzMM0Uf^4FG(q60QOdcM$^hp(sqX$dIi(yssVS#UAnIf1(On1= z>to4r4JX^k(7$W&S>7XM!>vq)f%lxdQ|LYXis6~ar}x3$Tar5?Mk3!kdHqB0>UBq= zeyJdQuFyp)jyks}U?)LU-RnKr!5VHV>d^a?Fz0s?RBmW*|29~qP~ z1H%KeV8p?Ca`-)){**|A;f3A!hZ2cKnmz>+I)AQkYZmnFNF#E>Z4Tf9T#uyZkPW;F zQjFQVn1y^iN0wL9emtiQ39-yRmk0CyEOMJKxrGfC#uPmcfQH+}wo{Q{_PE~R4z$e@ zx^#k!40?Rk!6~YZs@lpU@VD_O4fsDALPUZ)CR59mBq?r4QnXV90(9oywmXEb6ifO) z{p7m_&`5n*ormZ6z)|l~0bqxqES1ncoF3^ee0`9}nqO>ZP@*-EjHCviYX(8}_iYJ7 z&>nUOiZjmmAH#;L1TbV%i7qAJd&Ivn1eG#7|BJk($>TKy1vpMlF+(+>f`u9$B{b}y z;3FYuY{KWv?{(~?rbz^z@$Gd{<+zqp5tJie_dtbBJMv$*2>s8yW450O@D)jVQ2!XH zG<~g)!_L~^kjlV8q_7}Fy{92caO19M!J71*Tv9I?`N=}RdUpHJuNb2Eqj(acHZUP- z+OLGDfkKzJ$1XA?+{qk@%wcnLxF#Fp#I5nn#~=Ep8~+a@DbD-E7*N)tImujV0^j!S z!gMB|QVhZ-W5QRD?*W_p^yB#{yM5u1T$jbKNXL?5PUKZ1t-UTq7qcVwkI>ET#pm_3 zY`+wmf;d>t%-fC85SAre`FUPp%S$Ad!q<^qHV6*WGb4aN)8&A9kT(Spg42yc%uIH| z|FvP=daw1490clKgHcl6@7jftrG7;%S9NOQ3H$@w%tI?jZYJ7E+dP%d&fBoC6pyX6Z$NmoxJ_dH93*GM3+20uk1L{o2L7Uj~^p*LBJ* zvlbO^@~5c|~jp8&;ck6OW0nAeke@%-U1j8-zl!24B9Bj#Ze5;H@#?Eq^> z+jqOwYnJh7nqMr*?|lYDvig(tJq^FXz!`-ZI3JHTQ)5$9YgM&QRZS8<3v0X~iVOvk zz#nfgWOP7+_*3NFga>1ECq8*OL>fKWOd8MEa8$#}k@<2w6F39iEW<0wIR22DMpoF0#2Y9TJwSH80Sb_aiq66cR9d~K;xZ^ zB5iO8(Xq(OhyGqmU2+ZDHB{g2Fn$vTqh+ibIPTFZ_Q}!D!U{&B2s?@*e5rs<0`Emw z-O^9rhITvvc1#mEcMkS2puy&*tbN#6f5AHhY_nl^(ji!N6%ndkinUwhRwETfVC|F} zX|YyVSVylTaAHxYlOwN0{0sa-@gR5#hXoM}9IH@6TIWg0{=%o#NtUFj&QjGj9!Y>4 z@ji#hEejZh7G0r88+tBV6yD`abXa zQkfG4lb2r^45AmPMjldEJ8R4lNGqoj@Qo@AS+SP>H!fg_3@%r}?nRQI%b$o*|M+rf z;U$)v%`z7rtL5Nz;s)JRVpdRyk#kJv{o_+i0=$205_pP-gL@`0-O`g+L_M&Plwjql zl}Ff$=|cUM6#ZJ&uTyoV>M{>js$uVe#-VGbuQ>T-$E@)iT zuTVK273OUe#{(&#j|(acJR-HA(umKGq>}7e!IYPk6m|b+2?PsXpKu!fU~KU81Ni>Z z@E5`H%;vlfoQdc@@kL{tkh78$&Z?EOng}{$lm5%2HmOwoD%F>CzlCEd2vkY}n`6ll zHzdc9x zXN+U5sDx`pMO-T?;^40w;RRm9MJ!h8j9`nvjk-F9PMD1p|CDpNr3gztC5ycUD}P+u zdzYPm0-*|3H0uX55&5xxFiR{p--H;fAGGosJ7C&zlyY(2VV!qc=e5>(ops)5omW}s z)z*29o_kxD@`Vf3ONIhwn_Po=jSoSJ+47ksvm^y2R4d{Z64W>K7Xq0p8-*l;!A&x} zf2P@VlSy<9GQ&sqJ-mj#NvH1t;(-QHGyg0(VmvEHGt?tHYzO?~IY)T><2i@T{9~Sy z78oQg@+{Ci;+kiL9Pwflk1%tMpU~Wp9#F$B5Vzqjn+5bp0TnI(FiZrW6APc5^gen36(Cs;utPSQYtd0D1Gm44Fca^!_!uZ1eL*fg)L-@we ztNr|xmdyC7{1E{6i%CHOV*$FB=A3EB8x;5}qZsbqDv?sge>&}Ig7lf`(QwyEsNk(j zj_^pow`~)8{IQrnko0cCwhHoDgl8CdTDu9)tJn%rH4GTH!P24;=`64J3tmbMDolj) zNvdOs;Gx3I-TWV@2u3M^YySiq#EFLodwg=y!oZjKms8r&w@>p?;!K!TPy)ymbNBPZ`UT&AxCVw5FgU` zitmcyaraU|BcbOku<9};Li^krH9UChsY<9iKkdrk9;`*=kB zmLnoj8OFB!V^k{FbB@+ZaV`U~J2u8mR3MjwU;xe{K$)7xlH=u5;^93p4?`JsVXiD5 zv63sp?h#bxFP$|{$VS7Oq zuv%vHNE!DCuiD$}5uQ8L=%8H>izhC{@Vo|d=E?qVRKA8c+01uC(1}z?O~6ipmSd{!VWfii@)F(q2vhv<&jXC5PxLazh?pjdP~(^7J%&(P5bi=+px+=OC9ZrFp)qs zt>z8Xv__8pGA5jo*NG8Vjp6pVS1~MYDKLr!$bmW07PO<8z2di{CBcRG!L+6M*H;M? zn#H`%Y?QQvPVD!Z(=+ z{JSk?iDwYT@(Ys%jd6_Z2e_Hr7>E0(z1bKa9NqzNlwPRZ7vU(b0XvlFIUKM8zQ!aJ zkqD}>^+__>hKmjgPJywX_t!UM7dLlEYu`dcz$>LQkaOfDW@B$;PUT&jARc;$O@&)0 zMywc(pK;@(Oq_Ra#DK|N#PY7ZU!3`6!TLG|%#+QStdt!@8FLo9VW)?&*NEGg-SNoI zi9RpzYafYm#YagBu>$s#CmUo>`BAKOmk13}S*$t8$;A<3Ip-%0cy19TUpZiyQlcbT zgs4Bg?hpkC6NC;Q!r2A_w!(uW3xY@Q1B5;teF*(}Zb6_(IyO1Z)E`#kmg&$|@4Xg6 zU@;Q70J~6|YKb=0PF912$`S7{^9Ts-bYc7nOR6(Zul+O~z-ZzMwTVbHWSHeQRqC** z#u2rpph|*9ldX~?98a%Hc}$FWeSfo)HI{su-?M>YA#xBDR6rTOxv4hCHr<0=`T~L({HM2Zfa9CcZ>&i zvxeY)8IFEa?a_0~{GtXTc#BPy>TIAezpSN9KvVr+cW8cNA{xSPs&dW>(QKxv@>H8D zUr)XmBbr%%k)}F!zp$x}*kBz^b=eiarKx^1N}DPf6kA!;*hiB&=%9HL zIxsKrZmaf3^{5Yqzi2sPM3@9ee|_us1V({0Em3g4Rzk(!qaz94bc-cl;&W=^Lz@lo zS?3-8IkL{uto!L2i4h&6091O(4dhceWSJ8^pf~w(vf3`O0G+ZNF$It#UM*938;>Zz z%@i-(ntS22&7?t|DAzbAwOPqoJWBj{S|mn?@k2ng5h%bE@fa9Q<_NeFDTy|FX?Fh5 zEO4=>{hcgu9mF(7OCMMy^3K@DEL3tR%dE?BZ1vtB){kCC2fBFu9F+>*Cnjn%B(yez zj+qL6(~x+YEHOJi60zbVj30PI>S6IjY`9!wc86~m=dy~4*w|HUQ-JNgy?*~%hNxA* z5O`Y^*_;JS@lTl5b9h@7k{yREmL48>+ePPE-gX@GE%5f76!kXdNBnI#`rbBPD#9By zgeahwQ^f*R91k*&V2UGTd_Rt?0beZ$^6}MK=Z*e3IARveTCz-x_}xCfw_Qz_bypRb zAH9uv5hwGJPDAC@DzD)Y<+qyR#VP!IjgYZQRjNA+b~D~aZ6Xm3$J?kAcv~wCjlxTK zL`Eh=_}(Vc(A%E)U+8V|(A$g_M!?J?k@sC`I&Zrme_(GTBH!EO96$uW@iv}@-nO59 z0L(i@zp^4u+K4PrsYKo-_(h^PKjR5PMP`C&AYf%{Se{l^<{__f2@k%8U@(DQ3_3sc zi6S}bQzP%kUd~m=6&Fzt%DUe;t`@6MD^$u6>qaUsQ+YX$uw)%7#6Q6x_vDEWW@M^Z z2Y|+mb)v>kc!~|*)l^gnY*@?cpjx?BwQ#e^40=Tx+Hm!|p$(4|8~%~~t51p1W=edz zi&X`2GFSzjLIs|oC^aUUV3Am&$@O^y+m~p4`^q`Emx>wt^3;6Z4RRqKert#a5Lr9I ze4_wbU=L$-|D?!2Dd7nMB3{ib!OsU0whW+qgc!^-7hNDDg`5=8cQ!cXn z*E7{ENUpLXJf^Twt8CPzWneRAGd7fUX|T@I@|=mPk0%%QPJ_ITNCOER3G*DO%rN~)2O?q zfj5zslWLZv?iN(+oq-kVtND_jvQ_gT+_5?D#%LaVIzjfV4Ky{}6e?tC*m z$9i8UuMwP=;mALp_xR`d@QDW*KYS9d7ww#7){ElEo_E7#t47#Px@;Wz$Mab@FXuU| zBO#PBKmY&7+?N1GRbBmukkMg@iB&Kz)Ul$*J!-|EqJyFiikiALTKtTqV%kDYt72+h zf(e)yrqWg|wbiCt5fv1zBCZWWF`_8gYN^&5wc;BGEp-K4`2T+A-22{rGcPl^{l71* zyf^Qjd+yopIp;3#KHPWVUdnOb12}{v(J7y!v&XP5e*|}`rep6}Awc6&3Xeui^jPYg zL&Ibm1`#q(N_g8e>EtYy`^WL!lT-NOu&rlvBE_4P_N6LXU`u!+$8!A#6KUi_TLnMl z7ckN~X9~qsCY)uGK6>p+^5cz+QDl9QZC0lcegz>L5X6`UB74B<&H0UXSre&k1YSWn zz^{^P@R|07=6Sby-oq;d+zn#*M_RND7Gi$eI&_69f^I2sC+U7H>74H_JEidykrN@o zA?y@?$U{(8Eron22ifjv5GaF&Vd$@&V9-aiFl=|Nn&6urT}meB8*(Hd%Xw|9AY2&6 zi)WcG1XV~O5VjBzX8aXl-a(Cm3o$0)eL7hU12(~z$st+9P#gm)gdkqaRnMVQskmfV z!+1vKGYmAim)bN8vgI4bL#Mlj0mLO_nv;ScQCkiAr(p5bkga#s07;a1 zzrouVl!uaS_y+mfe6$(}PwQsNWHu$-^ZigSr5TA`!!UR)An=qCc%59^%uZ%gkCelA z7`fLIMC2~Vou^~}l$8&-9vGb90pWrNau;CDrDXod99Jl~MD81ZpmK-h8^0(iWSAa3 z2wLUtl40fk80Qo~qPA+N#%~$&gKMQK+#T>(g(JDPfra;|^ae|O32G@;dlW?eF@3fFP23@X!B4b}MFE+k`!CfwwyP=#YuD6pc!v3LoEyxUre)t>zwt-{Q~ zToxTqz5IZ8GdVWEel$T8>8SKr+KQ`RKu{3_Fl#w9jHP7*cP9laL>o}-X}{9GX%wpw z6uru5caB_xtr?=NQ-^|tCVSxIEi$hIX_|Fsr6HbBiAyV}Dy^XE zd}$57RH!pA*C6~YfHKqiw&GCf!*Vs^BOu`OI45e|oVlxV_5|}x?4%Xy>*z~WYD0WnRVAE0? zd`oTEv;gPYG&iM)LH}@Kq(MiKpknX|z)wlkcA&~YwYC?`hEgj*Jl^vpHxPj85^v^5 zYPd?Una~2^N^rE{k_MQ%$Q6b*Z$ik>Kt;V2nT>!2Wb7HZwQ@CQG6TMWzv)3RD@akV z<8Kl5&b&*>7QZfH$tEz5~1XJePW}*Tc0oYV()bL=pdQru;D>I zjGB2C-ahj!u1liQ96<;FApIQ2tlQl~1^fBs7pR}nLuF?I$I`O+?hu9jY#lHQp_XST zVwSW-W}yYFregBUJH1QAp3tNd?5&c1Wfy+Tux#p*9z4ePHxFEQ3N_rv#*;%PL@3cV ztOR9J^s9VX5yP?jE_=THv+P|Z4;?7qx8^EfttW-xoVG5a1Aw&5hJ{qP7Ei|Pq))Y()R$FrKj znMpu3J560PuX2iQSInV#FR$U0g11U9EA_HWFN^i^uwL%d%bj|;bqQt}Zo*8?Q%_-o zDa?2hB#sTH&iCvPx2ho~Xa|#(h$`5qgWk@2cKdYs-?rrhImTSE=H-@?^a8;z}T+V&3bMHC#YwbOZryKVq z+WSR=_2tlgFVJB|0$;QKgKVf#Yw01ZoY!%6Iqpzfp0M`GZf(;?wytQq18{UBbQ^$% z1@TX4w)Z{_S{`5pU(&&5NIho3_0o~xcXfrC{G9Juj_2ld5oHa6i+zpXJwd|&oMSlWD36Xk$u9fS(xm9j+st72m(C8=tse<1$JpNuMf-oDS z@Vi7>M-!$zZhq4Uxi&eU*QrZr+wxYm8l*`w(y?RzhZ-sy?tSaHoT=JS^4LQxVw(Rk zpK_5WtQdz>r~pnG{795=lPu1YSc#zk!pcItpZ6)o)U6 zSt!kMz3jt(q*`Cu+_vV!_tF+zWgR_Tl_lL-lm(q$qZ6y_vPMbsjdI%M3Nf4Kvv_5n zMZ^3fZd=x3erugJ8Rx6A2u)=PL`Yf9Q~}CFNllavlvT^C<#@iS%ZHy=S%OfMwGF3= zEb2KqsB@G>+N`qV9=r-Csx036o3*8rbP2u)ZKPw*{DLb0=z-TA!>)S?jHu&b`Fv2@ z=AE(81F+{1y97Rx5v`s#zSeP5cVla>Zq=l`8z~9wp&25EsK4l(L4!PDN2W|MpCvMb zaOHClqkVV^xf*5Ej=uJSeWL@WJ%NwloGvr9_90%BgN=;Efqu`TY$?iMkwbnNmlMeo zJS}yokc^Yc6B5}#o;DA9nm`WwH5%d{@4M_h-~u;wfEj7~ZtCpQ)JW0xI7%vK_a`c= zXM{XQibPF+foX z43HW^uf0jwn`++Z67Vi#RaPLw%zV1!z@wZn(m)6_ zmy8p4XZgI%sN}lJX-`y4J6*lb<18VFPzLJpeX;`wsa-!h#=%vuxYFgRUz1z0JM+xY z(mCXK!H;9@VMMDTTcGPm#Z@GR7QnJr=a8Kgwvw>7TG+|}maJ~Ti@{Mvm@P2vh?~Pt!IvmY|qVsFuw*+@!kec`{E*8I=jH^u=_-6B4 z2t#=bf1?kqL%GUPCn)4T9h)~^B`GE=G{X$ME2~tj(i5sk#wtN?-lR^)Mr^OjWHsT5 z*5lRXRFiC+>03H>PQqk-WQDjODd)bQDp@|L5)-?RHNUIPZ_oU$F~8T!@0=7) zPFRKq^AcmRnc)Pk$@-7V`KUr3VcuTk2_J>tF8$AYJ4MAKr_L++8%i=$IUYiBw=|Cq zzYjWms*@^&&M-~`C&us-yuvy>C@2Nr02}zzajqZ4EWWZX@-{CeF% z$g2TCCEkudSH~vns!29CO9<7o@iN0XQ{c1u4O09vhPFI;Ik^pTPi&L7KB={*rG4}^ zna5BJ%5J^Nm~#h0q&M~iR2;w(u-ao;-Rk6E-D|S!>4B}hkCE;P{O4@`GwU6;4_?g% zfVv)zq?xU4wiVaty|Z4DCH4-wTiqkDw-55#*JK&rZF0qlqyhE)fYdC~MX%=7P6MT5 zUH7<>-OET;fWWaEDcO}wUK4~#YwAW)wcv2(W$Ri9u|IN^cM zfBTl%HgJVsEq3mic5lI@QtCZ_F9!5~;Jc*UQVG4IrmAI50>{-rH})g+&ig}S@Xm;A zCXn+=r>>EtyJN0qLl}Iw8$Ox8GG)CDs|qE2HG?(*IqGw4J%#-0K{nn)!I|~r(ns_g zJ91UU)hhw56KrRox7SxLEgNcLqhAq~>=!*bD~=hEX4y=b)9@m%KeUWZ_(F%pTlEr_D?g5gaS3mzWcg=d`ukwE|TjREUWd0cAb3#hkW zd)d%{emV9pC83%q`fcp)z~I4fKXnO(vN&@i{>}Ub|IpkT@kuGn-KJwTRwLYnO^ZVh z#hTnWz$Co$PgFB7?iS70k~&mAxvF!>E*rPSiT@YkP3~03k&KTW%TgUnQyr@^%Q>eB z4E5}%b+n;|ly3}ons{8#=O_fe?2^nJRPiRfAag-a-2+S51`qPy7nAeL|4tJOoj*rO zkV#`MEtu#T=pNJNmbUipNYd&sak4c|z38MN=uumL1O|=VYDJ_UZY6=o@*KaJywdaV zWE31qQ<^=OW-5=9^4WALEJ;<|)syOv@jYr%1W=6+C7qoFw@4v80m@Q*8uzy1{F+#P zf)B7f-py+wdj+3Pg3+|%=sTR*@wS}VQJOu)rnW>z`=$*@tBW%I@h%$m(;tkw#`NVvPAe^^n4(k*w%*WvA71(g?HK(7CNv4m zVoJ0sB&upML7R`Go0Mk1L;C~KVEB}ALHOE6!q=fH%i4+udpCzMZA)0O^Ad6i5fgdq zk_6_2Xs+RBsGE+>Jj4cy*fe~QTZPm4hA{i@JHhPX;NE2x_kn*Geq!3+;Y=o>+k&4u z^3yB=L5A1D8~l-k2I5Zy>;f(&Woc52vKm4qQXSy-Iz(?f2BKyZ)$~S-ic{cddo*EtQ1r$eh9U*{BP^G z1s9w+myc>)SdTLKpq39K-lucO9RP&qW!(-Ln9zg3s*`j!&CGdPggT0(}lqFOh0|vjct}XPipKdRFAo)Ts{hCZ0D-D#BpS8tEI%_fEA2 zbH?jpFn^j0gZWoZ@5r;4v&5yl=aX_EK%dS(-ZRkhkM~`2hx@ec&rlh=Nbs{p=Pc#i zL`c#bYzDS*H40b;e2UmV3J*7@q;VpXohX*Mf-RxEir|SDFyB&fQ%8~v zM(JgSBEEhqnl`v3vLO4Ri?>8#S`OVq^7!8aEC0rcrJ{p2Xt@R#Ze7 z_oFBzB0mIqyWas#w3!f{(_h;t|EX(QSQ}lonO(NIPZdDU?SK@|S_wfT^8A#-w-3#` ze8MuLYmm`i9GWxPlFg-KQ_KKDM+8_FDe=m$$Q==c7z9(znA&aus7!6!hI!-!^jUGZ zb`4mt3|}NVaF2sSBg&{7n?5@5d3xi2}0=V#t( z24*ShHI0Ofin?6{mRP ztq{k0SIdEZ(_@CO(D6|NgXq*X^C_E-xw>aEZLYB7g?uiZ?>z4%4*k(AteQ<3KVTgS z_KzQF*#6#r4%;cRjX^dMnX!yA|LHp}^Z4YJW&Re#%_6h!_K=dht z?fFOWx1n|F60#s-VvCO_EAbP>^owFp>GDSwyHeWmWsy=`m_pNPe||3x+(`>R(MQ43 z<|=jSfncc6#OH9|I_a?gkKFFN9h&!UzclP(=uH9L03*42e;d!_Ar&`%bCsKP2B4)t z7(6fdmymj5+WD91#4>!TAK6JQRwUDU}?ukGaVun-c)uyYdpP7&#pdm~5uL zTUa$6dv3pgay%#HH*FS8`GYcP;caybO!2b9@p;M-=$l}A5=NTno0S*`)QbMlS0D(; zK92ZN;_YUnfOJ(qiiHlvI;~5p7JIk<5hp>->7)NYMeP!$yn|bxVI&^|fvQs#(wu%Xy!Zej`5B$`CpIUmn z#u_W^*rnra+B4ywVh|7C46$w#IJ}^LOMd)C`F#ZY8rgwh0O0qm?|fE%W1olL=6!vB zZ#d5Kd;W{U?^8F0`Gtuj#6+s-4k~`hxuC>it9>{BOScVgVp=IvLVt|G4yLZDWI6(u zN3%-7<;fL^Uy5diKV~MJ%e43P_8u-sXUrKq@S~atD5AlBN`Ow$0F7^r5$X?E>O*Pr zNbT#Ow4QE+hapw8{>N_21aJ!)B@oL(A2?YIpj28vr6k=y0Je@8Pc&5tKKjrFbVA|n z2#-`LLWp@yfpouzH-+tp=R`?OAH>Y1I$KVjS|3A-u&~CD7kr4Y!JqOEa~zc$85IZ9 z8E@;ya*AkF*YtiR7#TgxP?H|BC_!jSlh7?74S;weS!FZuy_|Dw35 zOQ=st)Knhf{9?AE3h6^ zZWLd-nVDV?9nFz;Ku6tffsRfP9nD4&1dxu!_R%imt=Zj=yC!yq@w3giHwE}RV=Y;Z zDa|W0;HnZy8RKaOJ~ctIB=kCZvO)xzlLXB(MleDqm62&;qSV3E07CL!u0a&PFLN6i z2x8L#-;9b)36b6mJt6}_LKt9nlaB5GZ8tUz0WR;`Q#7O|sSx;bEW@w~klMp5)|d9Q z9t4XGQbevxN>nyRk3uG&SLyspzoqmrsJ(6vTRV2)0&dPR3A>vb zw3&keBDm>)smskypv~*JFqfMZLNb=`mYcMELt})NDI9Q#e)#b>zKx|IZ}v z$IP&#n(?+qm!1>fcB0j^uBl@@PcfdS*aPd;b~?~!E*YtP*Ch2ieTh>w%zO|+ zHOChqH>n<=n)4awdh8fuvC4blR_qU$l3 ziBtz#KjDp_$Lg$^nSqohWn$-}H*{jB0X}sQ8^a1Q{`U*k*Ix7+HnN6DrIt)U$Sh^& zkVmC5CtU_uI{%^-nKL%9;@jD)yjPhELiu|9H>d$v@tA%Uu{F zht)EgiS4ipZ59$>&Znc`Hf;j_N}9kpVjWST0&0oBz(-a+ytpmVt%lw}`Vr&?7hzlj zekA#Wt&YF z(U#$Y*ab}w@IoOmu{G;zTjV!kfvlcj4ZMR@+gNS0cysN5mDS7l=qU%dLl`>FJtG>l z-^(k`H{K21Q#KfS>@O&oCGGSjQd*v1;*t+q7HE)Bt8ToD^FfugOA?{bs<^aH28jiT6W(yzs*i`}Rl){y5sNlZAV@7)pb;X%(;d7= zW^s|+PboS}c(^8C=LDgzn^w_@wbi+X%O1+2P!-tawd2PRjOZX2*GuUw;$VMJgF>M&t+p%+I2(IdI1Aigo z2}ycGpFGCCuXif8gq_O2jZ_8PFL?Yed>?nEwKggq{}mPbVc#(HslKR{~^EG)k~^X)mj^UFJWh8 zs>v?Km*vO*iE=$Lo#+gfdJg$++Y~fP+UMVOQcG@4Ms<_dud%1|)wx*g;Z@4uxUOGpqn0 z_6`XM=o#SFnzc^&06##8)2=}W@;J*=q~f^H*X1kO)*0HQ4j)`(WyHAB?Ef$#HV~n3 z*V@~V8i3R96+~NFXjkml73Fh_lA; zcK$}VF3ldur9$jbL?It41yYPKrQl&{Wc~xS<0DV4>xM#rmw^VYBMt^OgE%xpc&m8u z6{Zv4281|68dNi32_xI2|0xVw6(JB2j_>wLq;Vuv-XbhZ#4$mok+$qL)Hph=WALa? z4ZtGjIL?ZMBljva#y>vql{-pL;#3f35dlrkiV_KL1SLl+CRuOK*+LN?)Sndq<5u8Fo%hN)N`jF!+(^ zQ_y#?wPs8YIU zOIDLQD%}l?;v!nuV7h$2xvq)->TxmgOBR?x;rZLMRE)tp$PNmBq(G1V9Q~kF=8}W> zDfx+pg*70KxdX<7wSIm=av(VvY|pB8 zCGWHO$G$Sd;kBnBzQyoV{qbP0<{uiC=4u*%@t~vwu*M`h0sm;3Dd)b< z-ovSCpoO?kf5{Pd1I5k!gC8*50^pRD^}uS#G?^JDB;do&BUe_m9sqK(5(qWGiCI|~ z-BN|9l^`Z@|JtFNs7qKJXt)qN3i!+PaNrm6roPe(5=?ilB{%DoG2yJla)ak_d#@B5-y2AhP`Nyf4ukfR_@o@dmpoPPR6|v zn5|TkB|=lYy>i8&!@O>~c&i}Zk5DBn-dT9!iWi$wXm^)`e6>3?ks}t4WT`rwXSchO zS4HyXkQ^|gazKJw-p(fwq$E{6_`yHQfDV~|ykDias2V%{O}=_+rXzq!FygoPZ%9ED zOL$6w_-JHOxQS9w)`dXo@PU6gI%LwbZkIvAuJ?OvJ2u+Y>=z(2dR{?ll1TrS?%UEUB2UNHzG`3WI{pX5I+=@?{7oF1Y3G+Q2O$I zw)7}lx>rzow_m!OlzJ`g@Pjx*!AYkae<<OS3x!AQg{_1vxNw6|o`J z0SZ3&yF&qk%z?v=3jevKuR>Uk>W^DZI?J#4tCNClBeU4?%yd!+j6hLlC$_z+ZK1;R zKvh`|Re#Q<3NW!Sa}y#!HVcDv=7Q+vPDqFJy4eFPpD9MV{DYfaL#h9>qz-pahdK|{ zu;wSoL3|T^%4xo#Zw_GrF(s-ymsfc7Pm_|w!Ee)6e! zRuOUybs?z(!w_ScR7I-5s@XsoXvrIdZy(T}B$L5ZrcC76nHZ^$s37(Ira_;tWA91q zm|}edD;lN9cRz}ob=cqh1M;aC64T8q@)XgRd1F9{>OzTAMWVIY5yO*uFlIQ2#hgV! zQq4LtS`!ePZ1jQuZ`#5pF!UzAaX`cg+AFwnce#Rk<-&xR94<09!CPc@!aqcyw&eH1 zdJ^3LXVdX}*V$wrG*Riw?!pg)NJ`8n+-)JM_j8bvS- zsSc=jFMKY6#E8iJ;K8>MHc}12_WtoI&IU2a(rksn9ZyZX%_ME zQ;r{9t5GO>Fe{;cuOEW0#oJBUoxwie0O%)g0DMZdFX>&EzlJ|*&!|rVoZoSs>tuPx!Xy?`kZnYbeZ5-Gh#1&t#Cemg(DNuXOe=(R5*6V zd!Js8y-IVf@8mVdUJj%83ct?+FUelPKXzO7s*v$J&p0iCC>>^f4VE)Vj1D8N((G>3 zsLkII`J{U$nSyCgn*{IP%J)e474_1r7?~YK$4x^Ld?V!1BShwnP zP~&odJ&m#Rwm0@Obbw<&jUXCXsAe$_FLQkUclS`A|98qpP3S~ zpM|%DPpf2wH*_ip`!9cVctd>5<;@u8H&op8oFZxT>IldxP_qe;`sx(yn*xBZtG25R zjg)yEJk`tByY@X=rc%7?FNJ;IVmICe_LUwpe5TG9KGz>YnYw1JNNuhTs1Tn${)V-2 z2+BX+bI@S#gNfBP9rIG+41}_0pjG0O87G528M5o>9WJR&N4*GDGR1&Um7tLlgCDA3 z0BN(0QQlHX3>6~Kze$02MFJHdjateg$q<^NbU7qr)DpZ1p@J8bx1bLH*fyV;_4+03 zV0fh93Z_b1C%`kz8u&EZLX3`T%eIu)3Y^G6F2;zyAi1D_MImKe7huW%SMZ2uwO9&UfDwvu<)(gQY|3VoZp7-cuVXleF zB4B{e25GWX-ohe)unq^h3W`t5$@9LK5ImMoT|#5VVNIIW;9h8%!yEkZ`Fy<%Xz5~s z(E~e}w9Xn78f0wNfAX@cO($iAZ4%9|a_)QWJz6IW*=0G~)cGGXU4?oicx6A}ysson#@{q8l8c~|rBlNQr5vzwVW)Dx{HxzWlp-=c7kp>JWRI6n1m-MOm z^l?xm%nl82_It;D%a$BVCHt*F!MMF0Z&WbEZPP!~v7fzf-t`8UbWQYab64s8Xe-?) z1rNuu6MRw?XZ*y9;FD-`L?yNiB9lU-y-~NLFtj*vYj~41mie!7QteV7^p7xvN$+go zQ(^M^0%zwuS3VYW@q?s`bE6}vZ5AQyRO$y+)1z%s&?WO+*Ivxz`m$d<_sA0dOfzce z0lr{jFBNog)}hUdm>{zx4`CKL;FDR>5jr2%={~&Q9LuaD7wN4}g4!`9f@0<5%lk}T){u`K=GoQql+`32& zj=7m7R|X`!{p@WWr?AwWPeelc^pi!i?w`i z`RX6J-BsQ~u%)@&#>wp?YOZ3+uI})7fgpVAk{X$mLFb0K%-z;;QSbvYfc3%Bv8O5rfdc@ZZ#Fxk zOO6>{1&uzQjO(<-w%yJU=c)rGMfG=+Tr9t7L-)iWRiRRAS6ZUsLO8ljmzVs)P4B)t zSLE{0`H;j1cK8w=KTJ6ZvZ$skP@Vrk7AcE1NwWDQzAYYke_f`GLUc;M*_|#t!w<81 zE5EdTEE>$tvSXGU`O9oe>zYQk*}yg%*b&;u*0!_h-iQ*)O>I7n**ENH$TH}C!=Ms_ z!d{}-*;@=!$;Cf*q8Ep7Fg4w{bmt?EsU5YKnp%S>8gs((o2GV5f0!B;zn#(ab@YBZ zn*O>{DcL6)%#(qAL45+MWRBsIAs8kZkPECw-%CqTq8yVP_jA{1=iMeoyV;Lnw2L?< z$+4eTp(NOBlJ=wPw?q!5!eB<5ATPhfaOIVp?RpFa0`#z1kg6m#5ZyRf6)3?JTSpgh z1JTBn#3^FMFdVPsoMb1{>j;`qPN3#fI4M6KR)iO=$yaCj2@m_D%?_-6vsaj9Vc?a| zhI-k4knL)y>zp>v9CIqc_C8WU44kq>s|08P;{O%k!>7YpdYw~79B4ij<;*n_%&m%Vq z3|AJfXq^$W&m@Qfx}NgTSBzl(_BSLbG0cvX(XyiApcvs12baV${eg_=CDlfBmogle z!Lm0vRPf8#z7oPWA7)+7xL9)z8R6(f)ErQ$75a=!6}=S-^?w5xWxNA zo@I6mBFrIban?}l$X6w`1YtK(OLB*JZ+_}~0X3OZ5i!sOxP*VNT8vY%kqoO5KOu%X zUPeR4bnFb%$dyu-M44k)T%s7cNUV5Q*24E;Y+mH);WUj@4WAahr z4Z&g%Yl*?kqI99gg%k$!XxqM$DL4_!4_dN2LPg}Om|`SzOU*bUl`$Zu%O zI}5F9g9d?whnx+UUBHbz<>qN_o)Y^5;}qyw^PV5Y`hCqtu{XL*>C-{!U$?ZSPuSA= zLFp}i=^aw)l{F&X{C>Szb+FlV-uyq_nq;UU`3#HAOsVC(3{uTMs(6mxirUnc;9y?6 zKO|Z7EH24mrg;xYBpq8eh(a?XJc9#glmiDFut#37ubKV&>i5`Z`~|`;!ecbY_Cxhl z=I!#>yloD%wWK+zyMA03IT!sY`bx0E+(BQ&4ra48094XH)Dx<~dA)7*+nkVL2erMA z9j}2H1r})8Ksxr@_Y_cugf*LkI&X`^a$jugBGHgb9#7s$6QQv);lu)E;VzUPnEkg~ zbFQiH{kJ`6f`3%q3cZE+Og9IuT$6*;x#<0)QqvoTto3_?`b2aE-Fy7d-O?3wC+!cm zmadS|QxxHya8|lJVsH2s;&J9vh?Qd>yy3bp8=X%=(&eu|I8;fXN_FP$4K*|_ zS~pN-YU@Ky-d3fKz2Vh$S(pB!ps~)yrXWeyuBCz!vWaaeXtF7|BrPlm?bp45#$fj9 zHej#rqF4HNj)|9v)?FeF`&gINVJSMy18V~}fi*Q)kp+3V-=LAqOIEUDnZ;m*)(_g; zmxNyzfuYXM8*I}6LGEBaJ1d<4#LN^p(+N-r&L6{E*6;av(W_;hWm|TR-x4ngZyE0# zx8-0kmc&cKV=x&*bH~wuR)%H6VccWLxc9A(Y>W5_&rqItptusV2eEfB$Ud$~nEa$d z8iC=)7S{=u=v+(YD&y^X|Kt0@Ap@rY0F5Iy(CeAjC&-ST_I@2`{o*>$=U+n~LnWiibdO zsDw%c&M=8N1lf``APjPUE{L_@hExa4;d}QuG}8Or{3%6?l4I96UAac1ns(*2^PH}H zccpgaHu8XaKyjlyqUxt3IA$kHAfsG z%Vvht7Abcbuz0+u&w@xZu1Is_lcA%`+b=-p!#|3JQJ8Ibzh{R!^ zbhb#Mh}2qGg4FCMr@=C4hCy%Zddq5xB04fPh6gl-r!9SnQ$+hmz<#d zZ&HGWyq1j9Q?NT5@dHI7y9RsHC^y<1lLOqW8lbAFJ`qJGG z=ul`ZY1>HIo4QbANdjq^w1rk-62V$@u~sNN^y*`$+x#URyKG;*uk`-?FkjO|@ekkh zo$iV<>rW?MCq3-XXTlsd*rk2ROLFYtXtf9UN1peG;_ zHQ+7cMfXrcD>3-G3-w98_pdh`4JC-WN*3t_i!~k7+w$z@?xP$RDM^|3hAt_}ZCX&t&Ck2yqtPsd(r3xvJpK33QlJ!FLaspkv( z{Qg$h>#q@EpEMrAzQOH#VgHnFbJkNm&V}@SzDym|qB>}kQ&8-EgME(v!MPWirH*C3 z&x8_>YN<_hMICz?2gU*!PubxwQf=0ya4PAnASUD+Ug>j@TMl(7W=78NT&$|;P*RY< zMr{K?i2dC4+Mz3P(2jnLWhJQB8q(}8y{7S|Knrc=sLd3+#% z^JH1I2lZ3{DPj;O`V0SAv~D0)s0Kp7EB4%XTjD)tHg-xhfRX2%t>!Zg8E&)Dm!XCU zw25xnYlI_In4FUlJJ=6O=Z_O6I)_ZVg{y=59fRxe5ai2|ow!2MtMG(>yziAez4z?B zPmG;vYV+S}Aw265_8Q&;miS0UFRvhs=1&Gi0f245Z-vcKf`4}CwQpkVa+ahaR{3g} zT?VysCK9FDqfwOtMC+~VM&;o-mA!Ag=KC%M&YXbGjd{!x&N2ak_6&%-{T-WV!_`1# zGjv`JjI5B>1B$#e^FS9Gp1XOq$HoAAEoA_iXkYdTPsc9$RNa#9d8#xmXiK(be^nzL z`*{w#&`8SiXi^LAI2$jIdALhaiE{Nrdbp}S3fhGHdh$HOg!fw z#ojJ35c{HcbFCb7wh*dy-4@91*U-nNQ=ei-Xc>Nvhm+J^*kUnU9$*+_lQgX`5G&Mt z*)JX2vyt*s5;)>*V&$nzNGVU#e%I_bRp7VJEdZ>OB?`E_0HB>AwqyoO!@t58RF-%j zoTfge3Ql%6_?Xh{jvzHv5Gm1El-@LBhp<+Y+~^zU`^%iD12}k)24Tr^#kMO&ddB?4 zudL$}S2Mf0*rn$w_GP(%cMi812ajBo?t|CIK5!20B9-<5bAef!`Clx9*ORoIgI~|WJgY? z)}u4T(ADOGkesfzbwDWG5GB@R`exA8)_t#UG39l&hYA6^UG4e;fLNXQC8is2;0yZk zx_%&?elCaf({UyP(@9vr89ZPr#JCmfC7zp5kaQJ{1)g6B*pgy_I|~4V{J&z43ocK| zNiC`W8gF!34hz@4?XZA>7nAtbZa{-)+fZrYhJL^n^zGCA(IayjI523y#0p)8iJ8vp zJMBZwx>n#%k_15)O$lg+_GR071F#wcCUH?5!!0y-*X{Hoo~WWU4B52LF7dQwAc2psHfWSx_IjTrqlaSIe*IyF0cs_7tPE>8zv6FcIWli=ZD z&d1Tw>x-V|hywwZ-8~8n*j*Kfx^^)p1KzPPoGBs3JH73XhgwJY!{#7A6n&no`fQ*+ z>#5Ir>ad-Hz#s3aDE@`?Eb_4P3uXivrOdN6qr9C zTxdc;ijxg>oNN$ZB6DW=i4@nLgz$c1=DTH(mta-pk07nmTjJSS&9w>)2+uT{TFd0zIV$g}q7 zKIQo@Nd=$8kA?QS{KYSJZKVi-r69@Bo z_{X;vDX1@t|1kylU;P#6f53ekH%iEA9#hd!fh&X+@Eqa{0Sori9+9 z7{5pr!*gKx*OD60levib+WVs+ycPNJ?F~SE+5Tf&v*)g_{=*Z~QWbmXd8~yTNzIpQ zK>tlb23SiD8Bk8X#1q55Y$@}O({vs@9Ad-TUZnqh^((NS4g}_+{S7Aq7n0EX|NSz1mbc(A$RO%{ zivDUZIr9ZwkP83$&JW$CNvx+zB<%=A;n!vxDI_2ZWV`Ui7|Dr8PWi#tgk_OdO5g~A z#U6n}l5U51HV^gF<}vT6fU4>CY?{nT0c6(oObZ(r!s=LxpJt99L0VJ3Yy6Z?$N%27 zqadK(eE%Y|PpSQ|R28vQno)>ZxND(i z{DdZVq~lBIo@fd6G1M`FhJ?C^-X_OEQhffQkkG$uHnoDi2dj$6>%Q&3 zu)MA?T`tF>KCirvJY-Ykb%6H2W{z*MAi#h68k6DqLa2s+!C123nInnooIZkVPR2?y zAI2TRi0zmhEE}!}O#*>lBLLWwPNRe6ae??E^V&9Wn3YviYRB1*HQI4w7wKee;=%d# zYaLpG{+eVdM4XpYYd^KGgquD6utwd0Z+-=IOS1E zImFZdw-h$RH}e9Bu6EnnQ8hu{+~|I7A#lR3rbGuiVEU;F=T&y(K%3hepU2li#p zvMBet<|mrf`N5)E#E1AREA9N*5tH!!n)uq3!lzOjhS?@vfYnI6Xq$uIxxOdQt| z4wf69(vVH1$P&ESJqlY(A`~a@5@wE(W{lBY{zgJPsY9bB2D_P_uVLL3pXo%(Ao1!Z zyGqiD!Nu7Ot*@!!>`brbn-KGF!zo1IKhk4{uhY#ia;VqTH7cmN!&^vD+Facz*q1Md z%*9^^v+?2_!!oa<@VrrvhJ_krQyRzYf|2X_bvxPtcRCIrLH7YaB+E{I>#IbPHim^X zUZV?^yA8-VBIk#rIpH68eC0KN*9Ub5g*Kw1=(@?? zG|LT|h1w+U8v>e$wTsa7f90~{3;@jx4vnM=Vaf&=d(e=E&=ev>3oA}tLakvpDNo8k z)bl=GjJ;*!Fb*SbrPK%{J!IyUx}~`^yB9kI4GheSAZ@_pGZ9XechdF1R7Ol4&<4JH zc1EyObz*<3fp!m??|zIxTZUf2Afiv)Mf)%UJoU!rl?)CxT3AM*pM zkbk`Il{?($a)SI|Az?@tnPyn6^uBRduodPQ*#|j;K&ad!S97o<8HbQ@{+h`rDk%bl zbh9)8JM~92z>98ZmY%7j0r z&-Ie>fSJ1pXzj^x4=jbk9_IX zDT+g35#t8pHSeX6@>PO)bs0!FAf8H>9ne{RezVyA1d8;~15~6y?z<`xDU^ZZ4%R}h zBl&4hbld*%&LOp^no57OKVFKLQV7xlk@l7Mn6^~c}(`Q@)kw3~O*ZKm! z{A3YuYEKB*d>;zN2N_L*I?;jgj~XAu5f)}8g&BwjPB!=-d={j8)05`b$RBM`@Y~A z>c8vRh3eRa>ddH4q;}!Det*>3wWYtdSOLSRly!3XQoHo^&fzvqG&!p7deGjaGVB<2|Mj zgglq#tF`&bxe)SPAOu^bcbq^_P_2AzDjj?CPkzL{`e_?GUq4Gc)s4HtQ+2o_o=`lP zatX`}co}OTdkPp9b1dXP4$cDdsKHpHUZNND!e}tE2d7bEU)gAp44>5rx2Ry)5HN~T zJf1fLYwt9jM79LRS5G_9xRzb(m5{n0BBKt>-La4KnBnc3FOR{S1DH=+M-3uhUdwA* zuP_$0g>gokyd8uRNtG*MR`#CxrM;i;+%sk7A5{z-#9nQ*T*54&|`U*p)wL zb_L5x$G$02r|p1F$bh!9_D+7>(xeRuW~iE(>d=%@sD=!1xLq*HQvhe~jZnt`>S*2^ zEouAkQYEO{5Jcj7oO`C){A1J2%zIn-BRyoxOJErC#^xLBWu5pG-nXEnvCxd2XS1K* zvmc)_LnP$ul$0H9Wvz@(A?b5if>s2==IiOx`=v(ywc={snv4nuE^b25#kr6rXnS0` ztY_K>71LfrRf*p{{MT%p#gUG^(wO;FOggseZfntFhMz*wVm+cwdk)M~;%LrtK{_`4 zXSR+-%W6NG9NJbM9?D0Rvm=R-+ zxIAk!$0Qr0oVtWIij0B-1)LAiz;Q$UI9iOP6X)Hh}`B#$4S@NW9^y1W4j#SVcqWM%+M<}^XY#yEYRj?F)iZ++7;C$`9_^y+V* z!(HF^`~6eK!ylmIPojkQ54x8i;5fbptf6DTzsU`Z4Tgj%jEm3>$&!rjKr@bwy@CU= zrLmD{9G|Hp;iM3__eF^`Lw$Nb{u7ePRoZOqy|KaULG``!`BHz{m00MUZt3WepDb zkHPwbh^aZ~+nkqp2pvr=!!M|Y0X$$f-Adnt75IrR?vmsyMT#`}^ag+O9yI0Mk^qNI zoJ>hy0=yt`21&f~tDtYdeYz!eljxiDvCtRWB>F0*x3Euy`wV(W()JL@7Tr-qM-!k} zD>p--_kK(}4f;0a3J4fYH-wi5j+f|4yrp4q)JamNreD?X2w_gpI4YBa#21HlXvCcZ zY|K7P9#`C-l+3!a;{LH^6QvAa(BcqXK7$jNF)izjjhjM5qpHQ(_1PEl?dQkQ_Vc~K zeuQ@!^Gow$HV8r-`0&&)&Q!=+AFV%mqfWtyP+-u8OJh0DZV=7<@atf9ifcK)q~)YZ z9R9-g{pHeEQjos=mA)s3{jbqCb50@o{c^p?Z_ocd`busqMBh8>guc!lHeG%d(>u^R zV1sZoK@O{)@eMzAt0k%50H95EO@IGh+I;I@%`Ux6Ng} z5lZ_r2t1iHjBTdi)hecmrQ(a-Kho|Qw$F;`i;aFxbLxX9l8ZC(@tYw9yLtO$TFdN@2K?CCGA`Z`DnO8_BdB;;|l%WTA z=p}Ts-=B+)hS3F<;7p^M%3BTC;|TC2fX=aY$QR2(=MW| zhGa5wV|wq7aE-q-3jpzHFl<0J$T-pJLDoG;VC#~)#o4vlr@hyQf}a}jBLV;uC9EDt zQb=RV487}9GpG;BA?vC|RQg&feXX}0_7|r*Cx@ljjatl)6Z!COVlOV?VJ%JJO27S!ZAv5>$SYF* z^PUJnKlM}*_)C}d2_MqelNJmFR)z`O?kQVF0*kbl4gni@HKRZXfqp)$g4|o^sc^@p$r(1sX^A=5X`O+fg zBmVBzS9wM9x7-IbRKxxfVWHiQgD?Y@^2@L9U%32Y>;VYX&#~`4@UBfz9?kCux4HZj zkpH|pETBOdjc@u~3-8O&_(^#nPKni!n^%p`cjKF-#>2f%SdLR&&d8c`EiTL@I?4R{$$?4 z5rVumhytu%$Ujbws(*hF6F5A_q=BK*zs0gXKJ`}bArU6JLNUyOsaO=Vp2%g^{Ir#!d+;}yc7 zerP;AX zjJ7eJhWS)Vt0(WK<7YVn4pZcHoDS5LAMf$a(dM<%X0$#(_`Q`uQ0^P1YZ&wXU;zyW z0lW(~9Usb8fX`RH0K1tA)&HX9&lkbJ+D~))@NXNipEl3Gbs_8R!@n&v@X%;eIQ{<_ zl13v-UIKYV%0K;J2)ZcznPKng!iV&Qxhf?B1m^UQ4Sv}s&^P%Ji%8K4KLzu@ng~JO z8hCNaqhS6QRsa6LtFwN={Lj>n&i_KLT{t4XLj1ghovnT6e~WXZqxvZ1|NGA0eL`GC z4htpgpg6E67i@tK7G1uppTs)H7(ULzNk`0QI%^^D=6Un8C0IlCTD?M1Vn}K9 z{H*LK3+p(Xas>RMs#??Sd73nRAzg2A=3k((AAoi+WgL zz+!AoXfgHzTfV<7-#=7-l9Xf37)^4603@W+28OL9 zCU#St*!^Sn3U6RPhyprPB}d!ih~HQp2IZ0c&tDvjEyH>7s~5HUh+hK@JghAzem&$*tqVZ`J(2QXj$?#^ z&WgJt@HgDsCwxd>{(KDx%<10;hXQPo_U46v4Sj|D{ad?72=a}EKGkfmQ2d$~RsX{W zLiG#9ugRuMZ{J_up1^9c*2UKz+;?uGv0ug} zi_rI02-v_EieG#093jZv?(w-~dxhfHTi8RJmq;8GM0wUvz+YgOYvlal~!{P;9*wJU=B@(o4GUw9*@eolUNmFJd!{`hsonoS;mVNa9S|HVS_ z>)Q9e+W2+LR{s~`7hfdswzH(j8!`FgudCiI9={fJS{(-V80ilur!Am%567Rm_J8!x zEm(l>vy@M{x^Vq3T7F#-{Ih@Uw;vt99>lKKJh#~}tIzm#m4VNXUx)Zpts>DtUXk)Y zezqknPyUhc!~BJ+Jou14{2-bizaI3q%j$dzKi!Ixaj9kik~0^`gF@z7b&0UCkWB?pAVH6h+mU)Glcy3bnMH%G9iQf@`HN| zmv8qSi6G9fr1TNLmaQos zzdmTQIu7hH(jU&7ZUOW9lWYIeue4wRzRyy=puKSYFIxV55&WxX`t3)@uMOC5o9A}B ze$i+AT4vz$z||j{k$O&g1pt=Zc;RUO^&L6zd!ve_1R7O8h`C=>PN<}mvgg);{3d{wI2^#q*+(Y zSBFvoQ6S}6z`q}VyH$*;yO{ik1(9DX1p0CbS>S_3m+$H)0MX^Mil(0U0x`D4SD0MjbFQL z_J1LMi6E|z6`nsFxVm`!8gZG`VPLO*$8rt-t;;Q7UVn1ImbO^10N-aR|6pq2`d_qs z=oN+W?|PMA9v#09u8eTIy{Og4{NX?YpC7*-3eU&}@`{xIat!f|WA(=@UMr z4}V!RKYkq?3a~}!n->BGiG(jS{(5VR2tmH#FHaVYU-P2sf9OyD7L8w%P5sFDwPSAd zFV4@f0AGImdM1<#hynxoKv0Rih?n*^8X2t@k^h-N1uOmJew7%a2dXR=OsfU;f~;h0Cx1YfgDi{5tk;Zu#erU!~?u?c(cSNvPRd zytGjKI<@z!jbG<%T>pPy{YwP#!l#CmKE_|izFa(hO}WVGFtAtO@wkS)_fIWgUVn1I zHoMq@1^7No`G}ttuKz{LPb-3dVyoYNbo{z_K!n>(U=-U&{5saa=f|&)!ZWggydvda z{!2?(p8O->U+Nn^qz^xc=Etv#{W3OLgub^zzy`ih{MsAaaq|YUyZO_%MdR07*jk%c z|DYhslimdUMPK8ud8U43{5mT)`WKI1X9oCMq*+(Y6}i#f#pe_1)>!UuWZE=+-w;H8 ztq|zTMLWU|@X_V7iV0^iEZibK_p9VhZntXowh9c!JJe5;FCw^VE z+%1ph=d_<#n4mnezm;EL0rT|b%73*F7U26V3D$@5{n4BL+7D3#{72GvrazJ9v{%R<-OxY6pZq%TqHM3wdd8Vi^>6)^Raen` zdYGvn>5rbt^{%e}h@RhCj*YBleI(x>UG8rKG177Ifzd>s2OAZ5R;^M*{^hwIG=O*Q zeYOu4T|U$wUqzQ+SEPJ1-|@130e^IZ4`?Kk?{6+%>MIj4`Q<A-r_6qsOOEKEW6XZof6rel``NvUF^{)(~0_&^Wfg&T`7yjfEZ9mdK z-W3WBB5~p?#Lv6{U%r1l3kxbnZ}t-4^9gkoGc54*T7&Qf)_dRT8{S1b-FN%}KDYdX zBIQ$x>_=Q3Dlgz4FU^e@`Tp&UMXu2D%a47maQPmgmvr*&`-M<>v^-`v+BSl6-w<5E zo%sU`XcQd4yI>=JXu&>T`NTwnSm=|%8g7v!7K{_%EflFjSZbr<&OA1^lWP*0A3 z+%r7G9mp$E{-gYXcAoqr;mgC`w=e%VVw#nAzWv7%GqEXZi$-BPjO`!4=%7b1a}^|M~B;51nYi0(>r-V&zAlTe$ugEuUBf z{}ew>?jwJ^>ivjrU4yK-kNoir0}u7&_{Ty1)TrP83gidFF0+EklYgYX-s&4Zqz`|6 zG2ec!^2^v{pwGzmJ_!LE_(J|<6gKwe1)76`D8Tj#`NvPN8#b^0F+o&d{X+in5mP@h ze>^V~8bsp6SBRg<0ls|yxTC)fNpSI>0H05&tC*L9NTF2-U%)=*1(6{a-bH(~@Aw0J zZux>D6QH+B2b4T68?XA}c*Oz!X^lmWT!xCn z^nQl-qeXFX(%W%Ih+a@0an`i=tK${QEXRR0m#g=eM6a*iiw62Wzfu@(2pEoKt{^-p z;Ng~#1U}uNGL*AT{nIUZxN2~)Da-U=)6(pbth_15TWVsL;K7O#g-Q2QAw(LMYcdJe8yH)pN0DZ;vNgVGZwM^EmdAJ(rlz zWZ+F~8VkQi)L#x^)fd!L@?N&L{WwSNDT`ubH%qItcamR$taHv6Id?ILKS_wsp;tat z(7L9P^fvHl$p$#S7SQIL+z)bV0&+!|JmvM0SY|%qM8Is^Qrwj4jH{}GlaHO^X6Kwz zoSQNZ)O&z>DUMi&+kKnu zz%MJ!f+q8L>Jmc3INQueJ>qTsNb6{T@VhAkcph~ZdA1)X#}`bb$KV8eXux3Yw}R45 z^0yX>vr`{-c`P%VXJI>Kb*YuTss5%e5Vo*^bnMjQ&F4%2DvwlS!H-JsrZb%Hfh71v z5lGs8FVuc$-hQRiUd?lSwxx>=0e*#C?S~rmE0cv~u+Y@(mTQ~&oMiCX6*vU*ZOM^6 z;P@`e8f+*y&h=JRH&aYaEKmw)n&!)r);gOAQt6Fd3w`sX+k?QRDyOZaVnK2XIZNX> zpl4Z)bq}!lBtMzmMe;g-r&<`eOwgzppk^QVeJ^m<~G2HK%;i-xRc4@O`_vK-50C)K*uI)|kDAl|j5c3R^$J1E`TJrr_Ixq{$PS+VmqxAa|XR^gA)x zw*INk?eR~?k?~Z=$(5b4!v~;;bzdmoiyXwpa!g%5Ey$kr{0Zn;z1bbJ!!pRmHfFxV ze~=??^gjOg2mD^gG`+m7mp2}UH@HH+BNOyLoUdImeIf-LI#Wwn5`D!*UxyQdY_f0R zeD!JkoYW|lggk@D)lJn?taUW(l=(;mvnNQl$~(G-NbGrAM2Dbbfa|5c1Qm45N^g($ zkArkgTw<~f(PC_sXqll}sewfelt6Q;d0@V8l82qX6X-z-x}5jWzJ?!Z7N`;=G44&k z_e9B+OJp(!=5X`P(JF;)fX1?SWL8i!-+c&5xDMs%K5&`I?8#& z1CaAAR?Z>$PMHi_hrTDl^&-Ai@q~mLv7vp*ShWzCj(vNK{nif$ck)4(Q-M!utwNAX zNJ?bE&pyfpkD-HmyAph*cOFT(7(p&jc|cFPZFr*}{~ka!#6O91_+%QthsO9PSNPBb zexv`jc2~DCYen4Yp&!AA#a7@t#@w&+@6laJHr=mQMQ0fx-8s&N{Kx3giB#*lGPr#Y z6>C}h+NG)2A;I=5$51)XVq0wS@e6;x*O^FcPG(}>E zmGAIez%0#BL{B@;kOU@84&n1@BfrpPNRjX8?gkQ;mc;`;=TP`gJ*CwfPu`k1k5wkcd`(tpcA_d+@Bm$QO3_IwCY$`59Vi z-vJ-$qBVl4SpjiL%Q~OWrD(dr(h|%22x{npj0cf|is|V*>cv z8@}*x;NC(^*=DJcPXcl-Alu8f^NDE*kS1xkq;XpJ<)vA1jACicfh40?7alu+7M50H z@G{X-c>!tmHa-ta6wsbXZsZHFXY<|p-B+YKmZm;jm0Gk8_Pj#A*k+Q|-T#`xHv~OO4)(m3SJP|? zor?ETh9-KY>>86i**Ksps{+-u~1v7@%;oA1Zg|SS3!h!Q70jE7t@w-Ks4MAEeg|Eb& zLbwVz2*T0sW(=<-ihilqMb&Nn@WeU~goqN9jG-iPAGh~@jfw?h2IBOytR z(RoQP=_jq?S`dYkpxjZ2B8TOh(7oPzN+&cKHcUB6M5@IT8uCy0}^ZC z`otQz{*q)@fz^phr!Jv}7pp_GGLk%Z#_*J|#eqlb`uJtB%ts7Z zt?Nrc=>OnW>$IunTi2E1Be+sp)($vVO(fVZoX)iOWX&v2SEOU-jvpTlliK52fjOtSG8b~TivxoW=Io@74*LG~X ztTS>M+KNNfOUo)TsLcL?{5V?HoZ$^Kj#n+n;fw3y5dE%rt`+*gd@B+r@Kkwd4Z7#M zA_pU^nK{Dh1HoB9U`RttOgS|jp?MoN`SC1Y>M}EA88q4zk@pisrF-Y_M>l<7z_GPr zMW2HQF%1HH5^nnUVsfe7SGjI_Rf@AAI%H4nE)J%ORKiUsgxa7dut9w`LuY4T9pZR3 zEs^0C^N|^O9p*sermKn3beMpAB&vfXBey0H#6m~^#_~&uLQg~q&8OyK1prvM9?^bIFZ@FV15IwJ3Xd7#|X5i%+Q{K8u$t- zLW1bjmJq%^ZQ)}{y-I5`wwrUqREKdnb#4~AvkLN zk02pOa7=SW`&Mmjn@TVOlHX8}4gi6}yU61ddxW zER)_66No&IMDBt6%r5)~p9t8P!G8UXnagC)1JMizbYhW@DK)q;r|Cp)|8E@8bB!t9e$EvjQRjp_z$R7oPBs_jB}C!V)b;W^;5n{$19GE7iv`90vt8d^C%-Au0(oP)j3e zYvM9TiulwAiN!bRYS0@}!3-6W?9x)&i0IW1Rreaz0syQU1!FUv$25yrN#d_%wHh^H zjYyz{Po{Nac?|dj#1I8llSoj4`Oa8I2nM0`tlmJo=|U;{KLx;}ZyeEb$_S5AysPwHxnTW9{Hnr_z4$o6$EggHYBHZIp+e2A^#1*fsPv^$2U=!wtzv!DXfQU$|M)g$WJLN}?d?5Bf3j(MPR8 zats?=XkAjX*c(TJE&@x2pn#tAnBl#;II<^`+^K82AUO^mM9vsIsDYSKJz9q|F;f(n zLyl#-krJt#D1OK0ZjrQDwIY+c2{M4ZfJ=%~^9zYutqr;8BCdbnNh*bp!*1M&l&-(j zxJH!RW_x`svq&bIoX3OV3}TsE_!#vYQj1%wQ5p1&(k{;6!pIAp5*5mpN=#=z$ zLG3Ug8sKLrLC(RULNiGm%e?QT*lLbZ%SA0BVzUAO!-8 z24WzGrIOKbB1l+K(RBKHM_=zTl)4l$+lggfl*deSCGGx;fwI&H6`-bFs5zsbP*V>e zk$C!uewG?e?}X5+0ICf>VH^VJB_2dd2%rf(LFyF1(M1I?3+_*w3=81sKmcmO-E2V2 zdZc(vnS->`7}pG!Vo8$UMB>IF2$~7M-qQS zOU(BHb|k@i*|O0w!NxFr$1=1CfNcq|BZ{zj`N2^v9$B$q{O}{%%LcZOr=ICZ#Bm}! z?WXb9XSQV0nLcns4I|Vy?S!ArtWzE1hbO#IhjS=>3P;ggItCJW9=qVB)|Q=?c^vA> zJZ5yZ&@eP#uBV_?Vd!=g8-_+_mT1$L7i#*k!-_VY8P06vU`4jSk4z?Vu+&2~tCWum z1(}%*$mK&nE1dZr{4D~%h)H79$g5iZA9Zg67*|#P{ikV1BBeA4 zg@B*~6b*Y2kQ7=Npy~hxqErow8aIeqHHg$8TWZ?cm=0DcSP_3z+^T}~hlo{CQd*&) zU<-(4FCuuyDNtF%B7HyK=bUqw$)pYX*Z2KL?7egEInR0a=Q+mGsykvm_SvEwY4t#E7*_H%K2j}+RgwTsqHqZGV zk!hE23)iBb++uMC-6u}n zDFl|2Gb_vT2t55iAkdT0Uz$2`z~vJ^lqZb5PZ)#AC!Avl`GlB~ILX!4Hn1jo z{#gx`q&{K2CRylMMF-0UT-e`VLyFO2Z*&W$EO#s?d!ogwFAF{xI%$-0XT2r8riRNm zV_j=UU#AC>sZ^dUeyVTYtVpR69Pdv$+Z7oRGSW$j6{>`su!%1Ci|FvA&ssUabzi)5 zjgmDtxeT9vchk!9`W}u`b&i!7y|R+AR+s#NE{oobU|r*+3UBlP)=4&6+VM~0YH;Q% zs^ZKS8?3NH#O*PVYyuTJw>I8bH3c*04rH941q`ixkHX01^s?l>W-KrJU`;INc`O&$ z(aj91v9vZRPrb<6X0bdKpHO~3sb!g`TQ)}fT#hXtg3GU!9}hZxek%e;pB)BQP3#d= z^x2N^Mx($A<`90$Fhxs-q$-bc1NrRp&y6m#a&fa-=B<)pfu`mNijtwlb3k_LmJ%Mj z)otPpLJwCPb+w;SBJZ|Ntujix zAWvo0s;Y9^E)O|{?h#J2R*EGn%DchM=+T?ZZ$5At{M4S2TKwGL_&L|{(+%mrmgZv^l@X6DeX)^un(HKGKeU5isYTPXovAeWSo5({C1QW6GXRQ|>^ zK^Pv`E|L@;$WFz6kReof&GSf9IrcOLr-4EFT&X{gp=^xy{U+jSPsEjqCnYu&al?u1 z9(Foo0t+NLT>3m6B{Cf~ILFis@IbYWFT1J(iwrb!Ns((Fwj0Rx&7RmLP!uz|Ir5*K z_i&O?dUpfIuB%UvZ$v@3^z`^`(0#^R$`4#VjB=xiO)!jHi5vRS65T-EQaWyCQ4lln zfeT$09x72_vq2cpF|uQrfDDeps;7@tB75Yh$@@~b+qh+*$@TEHEX2P~J$qjqMHR1~ z9uTQ|$BM9I*}HC(FNRyg(vi$a{ctQ^3Rs#|q&#lk^%ce&g4dh@&}uTYMor!utUlyh z#bQy(o3#i-*1@eoSUtCmuwwvm0355rKnnry*5D3oSO};A=?ekU2|)Ub7!mjKl+;%~ zXim;wHw)n0c!9AxW-j!LxMo9^&l8fP%kGs63Rq}U-Mf9o-?R~%0(CafBrSZ!zrJ#j zt_DH5vHTdlFG*0#SRJh?C?w~RD;+gNQ02GFoV0gb;A^nsdkvnkC$L1AEB{bdl}69a zdC#L2SEa+fgC9X$ALD|2Stkq(chKSKy@T(9t$T9U322#D?oLVs8@aP(=ttp%CKdV2 zQw4*${)a3JI#s)T=nPS-xGu9>tp@z*d@V=H3~K)#!=Qr^)IN|$zh!ERtLtDvjk3-s zlz)ZWb~%`UEfltc5|h6z(V&wi?*|ulv&zGJn3xKzmGk_J#?4MUDqo-c4ruv1BfEju z*?_^mrYmYWJ7HQ)aqtG$P;39m9?rXpqt=SZc5!IWHS*aaMe9wSI)bp#kH(2+d2R7Q zT^g<3Lbvurzr1g6{YR}~!8WyKRKMx0t9bBeka@>t_;Y~{K z3>H7~(eL+nd1Y%l>V&l~zZS;e8q_f+jRse2XY2Po6-{ZZ>D6N>CkdiqGYaii@bY{@ z#TxX(+VZ0@TFbK$y5gYCcQn8&BOKls4}tD@x6t!4SQSF%pO zOYM}Ret#iLoWL&?DMLAh3VUO0yv1ti$D`qQsgd0C=FD^%rZ~x2jbuj_9b9$*#^eb$ z9qHE`@*}i3G9_L%rZT`&_+Cy5vV$x@rAm6paxL!1-7(j$I2 zB)qXE`sEbG^vm)nDc89?oRRKgc!R&u14`?RIUW=!ZQ!?1s&enS@@*d1)D5>IJZv~$ zL<37wT$OjBaXG|XdTAiIY|Y$;VB3IbS{@H)n}Cy@dWIdHOtf=u#RnXVXn0ZsPiIy% zAgGvE^r&f77QKEZR)dbLc+T3^G6pfG6TULvB9SoYw*2rWaDkczPpMq+*e%w z(h)2JhV-H!NItzN8q~{eJ5a(wBgrX|HHI8($S7^r!QyW`&AZQBz0du8v~_OWab9Q( zcukDWx!~upA59tWSR?9&z`C~b$`A;~+-JcD=1$(5Qd+Lu=mTlZkzDHaQ#uUKn`V*c zdDCK~UT%wvfj5B^YX@7b4Qy$(wpq4}u0cxqCKkyBELgt7)JxBt(Onnr=$ug-&d4Pr zH;);$U%6SOwbH>Kcw=xpX36GwV4N#zF5Xi{Y(-6TJU*8-)xeEtu*wh0uTZw>9X!K4 z>+NH#a~RIve&^_3YnkJ`Ju9Z)J=mCuyd@d>=>vg>Rjd9gd}><$y$;R1K~ zf;)7%!;3$&4j*y9D(=@`-QhuZxW^s-=nk!}<#P9HulY=Ya*S*<)=WLi&;LI!aSuQL zmnEzEsi&=|2KQsQ7P+Qts;J2zKij15?QX_~J}efGl|@W-6A`i~S1r`29W9#qV^_oY+%czHs7;2gN?T zg$Rp2va_B!DNk21;nHhOq+k6CqWL6N?u!W={$G&KsvQ#fbcj{Ztes+r7^2O&spe)3 zH~GA<$NvTS?8fsTBaqMDe;T2DZrUl4&+|)7K2OctgnVrO!fI)B?|SrM23(>h4y!PZ zw7Kx8#OKJ$?zr$x&JiAqBP=#3$LpFmW?L1U`H=C-4yq(l%u?>y?LGIksFBK|`#z5) zlqL@4v~5b$^G_3wxZ7x*fCco8)<1;In~QyGi+#^j<~n0Ue1&4)&Tg|nbjOa*!9#C2 zm~IjwBaZ9pm&({gyN&G=}OFu3a5hC>2yA@clj8%d-H<$ zCNWv=M-#VsI+jk>QuBpi4TRE>w#=*sEcbGy@?#?E*zLrYVU{~j*iCF1vfSwqabr|| zD1~UFcr`{mF#E?}hJy6v4iTH~JSLQE>&m@4+Y@cOCnRXQ-sYb#TxPdcNpJ%?Wp294 zj@vmMETY$qUTqk!DZ1^1REf9fkl{Jnk5pacO*H3Jn2U_p?bq z`^PQ#Bd>}mwdJ*}{1dJqidzbK-IGv4-&S4dANNt$n1}k>Tjtz)_6gRwS@-DFqNDHR zI8n-7S#r!4q z+-Me>4T!9fr_M(P@0cvSj*-HP(K5}U-nKiBjDLn>9(~kiMyZiue0&x$HKmD`VB#jz zY)3$&y^bP9gH*n0HY*iJwpAXJBlCj>8UdxOIs@vs&4D_x@)-U0t;X`$Ay~FlH#s5O zq&y?5^GQBt`u-(kSEcWWv|S>VY&*h9r=55m?n8e##q<<>T`DyViOSw&fKAcqem&Tn z9K4sOs{t-(YxKSz)a=8;vwHbt8yxy#mK$#5Zdj%T98lo6m=hycctbK0Yckde<}J z46wij7R99=uIf+c^W14&bgk|Ga5~sh?Bm3c0evtRcR-MMsi`N|&>LH&%gTOa4QH5eKh_<$U+NOJ!H+!Q9sU3c~ zh+l475&iBw7*K~nCi-LkLO~n)p&)IK3p~xDU*@Afp$$>hdwCH_ScnbVDr2R9qI|@g zsZ8X}>I>GfWq`k^X^2j?S8l5pEwIv_K;KhC?+k!Z&47Z0nLJ1NBX<4th^m8=8c@$~*-|-^G4g^sYUMOwI(ZdTW zf){z-=!w~N%NJqSo#sWVjzeMdaeBGI_v*ce%);J#QgfkIm7YmSxLHgeYfnT zOa6il`zaeq>6EU^73wdEFlbA=UFpwVcCUHZUw^gA!}h2HMkU81&2uJ@HLADAMuoK$ z%%eyna1Z7^r#bJ5CY!35tJO7rV(H$?7Gw26p*qyPQ&$#iSS(JsE3soM;L7e5(d=$m z@|3AiI^C|0?;mvb2c#Lmgg+hP!{+QS_AO>=J%)jl%gjw~F@$vpXo@C1&TAjRIWL@X zD}Fx)^q5Vk&X+QgG@R%&FSxGeWeQ|u+p)&!C^b&SHMG7=w=&r;7j1ddbsaLJ?D|MR4!R)D?{`VjRVh{aqL*eO30{=wigF~U z{{4EzT;Ztkyf2|=_M7U)e`5etm5*21`xl&ink6459r`C^KR{|XP3?gHh(3he(6Oqs#l56a}S><-CCyY^Y1e#(QiYpqUZwx8Q?$F85;!utR3hHLd> zZm@n`KY0=>U-k|-#=`#*0$+v`nu+K=5IdM`Mu4hAkZRVL9%nbEL{>QEH30P$Hj{6) zQ}6QCo{ivm zQFN-BIz&FZIr*SVGoTOow27;oLXzNX8AV2C&VM%1%>ALB_f5bm&wr8(I0W7eM?`9XT<#fQX!;PiW7ROO;H|Ta_bZglG z_H7(K(+wZd*SoUaR40Ha<&N7p7R=Qj-E7Q3P&CJ2gyzxnXTi!^`J5h-Bo*$Vk67rR z*YfT|RSMN5SX^{@okzNqd-mn@h`^|ewzUz{?dT*&Cd8sShJO04$ZC$x|GQ|7ue%p2 zA(hd{RZ>ar6ydY>OnY%gNAr#+u@7hGv!G6~52^P!_HQ+D<7zcX*pHSd`AmQc7%jMD z-ace2(YvAyRx}f~Q=&g+Y3wgHfm2>k5uKsp@D-MbqG_fWbK9G$Nb%tIjCwNQ9Iv5S zV(`y}rEu*pHk1FNEQQu$-&Qz#E8a6`^rL?yI_(~%t}t#D_lE0y`B1+W)h!!oCQGJLmPEr4bQ0BSLIJ;eu`WLCd^=Hd`S~T9RwcR^$vcX zGQ-{)hrzJ|E6|OZC_l<`N$B_YuMaNGy$`8(P>YuJl{!dae+C5g6SprTkZWiJ8k(#sU2f)%Zb!KV zwB~KZ(6$?#E*N-TvSIK-buqg3v!MHdDs-#krFIi!@dbm^K;WR>!H@EihyAhZ-obXx zzQc&UgYSh)`#2sk>QJx!Iorpqy#=n_*Z>9oTmWSRRy(-3Mu@@pXfKzWG= z=4B*o8=|}Q5XU?=wlUhY&5b4pm>zAXp`$(fE41%mxCb8qxyL3zM$LE9_Vu(acUXtd z!mg{0T^}0>Hf(0hU^9P*A+(<^Y_zYhckr_#0ohOma?((c+Y01#v&QmI4Dy*kR$13{ z(Dp=A*xzGV4UJ|&Hf#HCmjqg!k;ha$|MIBJDpxLnP0T;4t!xEF3SAUYVyp4A*0^D3@&cX zn6@W9I(!B;_f1BLJw%m%uzfd~_Z7nJb}-zBU6-iMs|?vY_ztl1CZl?t_g?HrhRe1Y znHcFEMWgTEBtGTY15_7%)8wMK)I##nx}taRoxnT7Nno?^6bDZSOakv1!CR_bq4kxc zMhGQ?6-Kc!8Z9Hy3$23v7QDWQ`i5vb?G`DT`J7J8duM0K^_8#n4t$FZA82B(yxz36 zG7xr~e9oH7agP)&5qCx)j@}!i8EmVu_ZwDz81;M-=^e))vGl6q&G@-zyZja0Ea_F3CyJ`&^RJ9PP#9btc+26D=8oG8`UM z)|;o6M@MLz#F{~$uXr=F_AO2oJOWM8*MjPk2NsSSWo_E64avj^VK!I6oRYv4#(3s~ zpB@YHAwpRyx$2=z9NK+e@i?hTh(u15ysN^A&m2r}7GhmPv;*ad${nTRx5PI|dKFDw zNM`4)y4@N*+KF&J!+AUkqKR5Ut$t@l;(6v zhFHq2-^N+JvoH(1XRMMMr!7pr)5pclK#cafmCpVtEt^nUrs1q$Yt|tuKkOYm3vl}n zF*PAr6oNiQ0L#Yccc0s`InPA)MUh7O?*rQY}BhKhdkFBji2PLQdpcnmsXjAK6>+bj*X?rn;*# z?;|4zZAS}GEOHphT(69DX~-GEbhdwiR)Q>mr8d;0!oEb?r|2?vKNVC`@|W>L{QrYD zJ5BH?_}2mT4t|WVcL2FndO$CbT=_RPT8u{@b_G@)9*0gH&A?2)pSs^A<%W_yLH^Dm z-8I`eH+tlORLc}GMjW-9b#i=Ez9KvNO@esD4t^V7+zsqS=&aL4dJS-N0`8FN@wBz- z9pBYmTIsHmTkS_ZP-5>8>aB{J2Xg5EU24@c{PmSHQ>+)srCjF|V?Cu{(P*yZ{QDd~ z9dnAb6Q~1>A1;RX%S7U_tw!O{aHEHs#c?QdXrr#2S4ClpG#Ki}P8fQqHrz6pGbKD;u##~-_CEcU4gpzD)HNu$ts*%NbSR*__A zgN99ZZ+u`?pxD}=Ty^FG7Wz%>5|Vs{tz|=(cYkiC2-Ldh@i#N|e&5StuR_ZgYq58! z#)p7;hKJ+u2>fDn?4iSR*kFpo?{RYC)n&VAn+?t=MO5#~F6IH69M@Mk(Y&<2@~e=FcNdXSGFn44m-1ib zcfEsM40@ECbJkb-`Axt5{OGQx(Ys+3o(5GOf=~3wlK|;qjLY0K@P{aEy04~zx$-`y z%JfdWQggKZJ6pi3V+c%764ia4`OG^k&+>j$vI^U{;!q51m-a20z* zA+<7xJ@St?Lx4vYeEa#tb*5#>jvYTt7He2 z>5wgV>MpsD{mj_-4iBUa6VkUQy}Q;cuJ3^x?~Dg?uA%Y1q|mFyi~0&d+EL^6jz_FA zDq;dV$DZ^M>AkE>hL9vvko0UH;_QL(bMzu1F+K*^Up$6tvnlrxBC3$O=QSj{`m)5Z zVjS*yG_5qI*Uzo4ZkHD98K(8|z+!PJ_w{lb$`(@gYcf#W7D`*35HZFqI9@#!!T-8K z{E@&&NQgIJriXRL6B)ze>j)6ir%!|lZE&M#m6X8F@=wv`%2N_`u=o&{cfHtFv%Yu= zYWi`s+9sMwyeLhbxWMhdzSK=VHW(3CxqQ0hj(i=c0l6673f3kut;v}9w_gzLe33NR zcbc_QFji;@Svsq~%yKe3cR+afBX7$or3w8%)K1ZO^DbdO>Rj$Vr_(ImrJX&%6Sj0X zGr&hvdiLwLn1&1Terr(=<0{`fgjNUY>n2 zGuwRffIu~__=Jnm4N>P=uhYC?2PkTe82byL-@Yo#+rN=NM-s02S@EK zLORz3)7_gUSHX58@%rsFIY=i58Pgx5;r};G->Wk)z3EHFbW5sjv6VG27*5g?*4)e| zHVEleLX>QDwILkqUx+Yp#@z`mLpm0n#S~ycG^M|mOx{}KD*H~ott^PPsBu40q{(g? z{}PT#`A@FAjgbMTMobo;`}sD#7v8Zt(QfYmpJ_HyM>CEcxyb zQRjY}5_Je3mM`#N4iY@rgts0zFO>nu;WsVS&ZLIAx+yp8v{f7DAIWk4@`YFK$N8SP*eSnz z-NtR9y@_+uvcpY}3?AdG7TnT=&)!CzglB7V9NOK5rUZ&-9k(Nr@_n zXobeZY0!XZyhdylJ^!$qbYz*&j9JJEDTbJ(A>Kd0f<~ATB(clzDowcJ4&k$!#>dl` z1(Q+B971s?26h|b4$ERiTL;yxmspLg04)iUyszx9OrF|R@`A+hKUr6XE5TVKg;nB` z*Fce;0BeXo&k~7Pp;yioEScN_U-6R77ei0)_KE6J(1vLBlQq?>0FCl$MLYW9R%%$G zU~LebwTTO088u6=%Zq%o=;-`$6q-H`%?Av)FT2&-dEfGK6R4I?*EZvVI( zYIG5(k+ttuqncN79!<5Z@wX=v)}t+>dABuosBfn8l{Y7ykFw5g#1VCV$1P4(^YY%L zNdApj$T1SbK(_}>X7kR@W1ITN{dti>&?)xd+9K{lVBb-BN2c0U8_yw6C&qK684sSf z+IM8TOC@S^Z1YCY&31+Ihp4tD5Bfg#;InQs4t`(}uT8BhSGa$`{RiB7z@3=N!J3q= z*H4}q=J#RfQ2CeqGi84L9_Qd;<)5Z}=%~X_N1Y~fj)$ELTZULh>E2)&<7k!fu#;mC z`?f5pax0U~W2nxQa$(y=cd)2YzJyAucdfz(46cFaxYlR%UbIg8cSa3dj=b67QeQdu znemNa;EwU(#cil-&?J~RFlxpWYf*)dM?s1FISWN}+gGeZZO%te|rF1cKa+V(^&|)k=x3H9Fpah?$=noHo4-b!nj};yd z7^wWH@|?+TM?#6cS<`-9AW7b&crqnARZC;&H1TtamuHs@ANZBIhON~ z2gq4iY+uYt4YE#H;mG18XY?Y-AKAb^ulHI@PdCAgLBymUnE;FMC~z>4PW%do@GR+c?xxhh1)W>QG;q9_uA?ZW~q;KB~G`O-=aA zpF!Y9JXqsWmGTMTB2HJXsXS#yRDMM){}57`^7TI-`x}t^mRHv9VX!;mPeEBb)iTCV z2y_pNBII|+D5iL{U37#{e4U|aJbLTE>;3>5uLC&tHKi7V&ig|^;m;tMafnl54D1_E zDZ?HATcE`#WbEYzRwl~5+OOi0O(`E%a4s^MHVhZexhu%%#FzsxU|Kx<0a@jNv}y6+ zS^72j>um7yDG0;Fb6w>bGl;!p9-aJSzrHD1{aNO5-Dw-wVG<|8q$zLs!m>ZXF#Ad? z7R^O0L+O;46{Qn8{o&F~p|m z$BKF1dB)j6`8np*F!WCBV3F*A81lSWtEKEIcl7*ez32dq(_!aSfgTc)54|;L;JLIL z|BK+UPluUPV`dIf!5j6Of10?hiwT0;MU(Dk{5nI>xVd=ir=J1~<#od1oeqmCkzTht zi1cqzKK>U$q{8BzF&0%K9sdh`1R)@iQN`<60w|wLUghoJr87@@0VL*$t%z{}NBz~{ z$KNe<=miTDUjj1}OVuaFq(&^&{TP{yQNC5kJjraApmA)li>tg{>?FI;G|YrISHk<9 z{^ur95o!RX+@jmZy0LAhmjjci{>vJ#I*)XovBPsiA!&$c8 zlSg@7z2_z#YM|cJVK3FYYGS*N)O+m6a0~R?_K7S|L$28C_pp<0-BJ2&J*hz?vxP?n zl7#<4H(MBa=g3o589yjvNJN!CT>&ct$Xo|(GVUf)TDT{!vW(!9(_2+&x-_I6U zG`nOM=P-`VJNc-cm(M&-rRve^dGH`iwa-sx3&yKiE5*WiQO<@z;R{WYQUAEZZ7BCf zjcwgfw-oZamkj6XYL34PJ%4#Kjv>Iu^ii+3aWs`b1y3PIe^zczyIdMhQ(MvnS4` znX@a~dobHc*W?Dsf8Lq~X{LFI1NoDL>D4m+{%s8U5cG@!%?{Vjn1{+6^H6zXp3qKI z{)2>7sYVlt-+5xJh!bpGJdcYF0qdy~w~E?s$Ia}4=W!WT78~`hJ)*e7kks=j=0(3| zV`h0B4vQuDS6PA|!v@(;j~L-8KTk>3C1DBDMu170AvHmfQ#GFR3{7;Wus=fs_YS-W zr*f}p;Dhc<4cwtYQryzHT}y|Sc;J&Yu->FlrlO#Y23wF3^KywH4Xl`?BH#+2G_;Z;DxHeZ{+2i z<-e-3Ust}t;V>RkyO?Gp=D~41aRs5&g!z}+3d6b5xv^wHEv$5r#&I)ZjUkzta(i** zqx;06BNS=e2PR(=c2|Elkr3E{Bh}h&$CdeRCY{n76PTvghMjMg#jYpA!n~8;cc`_L z2{=M=0?HIMnlf$6=|pNZT-^q?{>t9Y9fVKX2q?GoIF~za>G2cp4c;`WZMzw7vEi;@ z0~EFL@~2D1ZoRXeRzZU?w-Y9k!}W*R`u?+&%YiZ|3ki2$K+Rk zI&VmwH-__(VZ7fj1I7%~;)dA))(i^t$UuB+p##yZN?tzRj35L>xsVelgqYJ|;|Xrp z@ua8DSQOZjEKF~(>nzjg2r9wz>RiB-)EjU-w;Qawb{jNSJscE#y+NJk-agV2U1U2+ zvTk%lb3FuD{gW@gYw^O_UyMyBCX#1)kvMa8iam@eTysc}5Fh6OE zezC++2gjsZ2%tsay1f8;ya48T0oZi};I3x`@C0u)iTTuIs-L`)(5d_7PTlP@!gs%c zDb$#;Df+ba+7VRN>Tmh|ctMwKITK24iFw&4i<_r5+WwCz0$sV@3<+MxH=2Dfc(jH_|_%TQ^zZBq;PG(mH;jZOFyZ2SxEoyH5n@()n<@>@~+ zEDI!r^P_8xNCZBC6Yl28%UVxZ}7q%4ZwffB`na?#V(f!*gUa$Zo2 zf$8SmPwH$42Ki{K*C-f+2oIa0w~_b>g(@dh^nz*gf@!ZI7;A%ItPO&(HX|2I_ftWc z95((-4Nfq+RK9+A!F(XvaS0On7%jpcn37d|%g2z#g>5ij$+?u4lr)%xe;#^hNVYrvzn@SJ8Q;5V09N`yVPA=MEF?zPxM*KmWu- z1w*4$AvT}!@vSPqTV~|3y~Q(Ql^uD8&ik@;c0@gO#9gmOUG=9?!@Z!w zt`89`wq&)|?7>=C9(au4(^qX&u4@RpE@ZYXHW(ji@Pig~q_KfPu#5b_)()`N4uiCI z++Xd9S?h^d=LfTX7PNooqeGRteJyj@>-xm&(y{?mT{P)C()C1RgNLwzLC6LMAscw) z9^%S!wW&$Khen??RTznHFfJLjLy^E!*c_Rcf<>KFPUJ$Ex=ds0Li${=B-R*?oV);5 zd&Z~z{D58aZJ^QGjGV^bMq*tMJs}0OoEpRuc2P{iF5jqXR^wwR^1e*)|M9XklCtMKMQXO5P=iBad8wz*lCkEl7ie&Yc=qi{Mm>LWv zGayQ2h>To`&SCwa+BaG#(c@CxL?BlVF1NG5F6n?=&fXluj~(sDNosUI&F<$zHKD~v zU4;IO>(xYH`V!PRsz$){pZWTJUPcAKm~Ki^@N1q)%&Bo;fx8ykgusHX&qKvvMN`!K zTNJE_y%^TH@*1R-W^o)Pf9AzF0vvB-MM`WrEmFG{EVMY9P1tc}gj`aODr>(c(uXAq8g<}gls z7EFE8PsbuJ<*b@?(y=Z&;ag6df(F}c-hGky;n>PY!1#9#QH~ZNhH|tTg2%8_8y+aK zvRZgo9*Y!Y_mXhw^JrD+hKYmv(Kln_hGL0-qK4`EO30_pr`j##VC_-B0WpaFtGw&5 zqd60M<8#Kdib88oe`}Y>@tDhGZ)s+^z_cdCoXzt<5KJzn-MOm-bI9ari4n){0Xr_7 zxJ*YsbTA!j1D4hXu34KHTU*r8P|l9fbieu-VMmwBU4$K5Rth7> zH5@sTEfsfOj{`~W3Nsg(ehaJY6L;m?YR0bfqs!IeOzm8L)RpwzQ=V5b1uFM20W0?1 zVBbX5*4jlTzk}QYSycaXw{*SOuDVHyYk|r}f4z>i>LVW&fb@Fz?YjIINKRI@f2B(u z#)a}C9bT-w5S@LjJ)8H?Zme_f_(xeGun#sg|Pu0_j>4|%jw^wV<9g`74UZCcaR(~#6u2+lY>&B3_j3RFwGm5v2zwiTX zzF39J{-ddSeQG~Vfh`a24J{ge32>B-??2DsIsSTgw9Nc8=Z9=;rw;*Jb(55%+bNZ) zzup$QpLNUwGnpQ8WSX%diIQpb_+E%J( zeq*mQV4si@x=yKkR}n+%P}t#TCVbzxI3xntN4tDmTWXclzX8kl1a4PV_l`xW?yWG# zGtg6MAO9@hrW7n$!8~3(jM1q9^xWU1fa*bOUJko`P1xVlKHkdz*tU|l$?AU0Khf{s zWtzIu9rn$murJkGSGfrUn=@=efa=C-%J~3-)*mFU z(os^gdQv=pLvN;+9w@u z*6vDOwc`0a>ycF13uXs*UI$Q}x`ToS4>DECo`J>lfLU1f)~0|EZF?BkBi3dwzRY0f zg)hbphg@{xJ52YM?Sj%>?3Av`KknmH&4waKcPmI|xiE~9Ef#X7WI>*jR`GI(L!82x z!-#43N|GfXai{!^WM=vuprK4QgelX7L77fPX7!bCyFnylz2a6%XAf6e2LL!g3!R$r z1^Qh15C9bST%GzJ_O3S-OJlYX1<2*J;7WM9IQpdG9KvhVO*GzSHfW|aDUW`cb2jJH zs+(4OKaBechR#k_VVp^9Lh~_PDpds4+;>>lD-OAE*XTAS1 z`mlA@Fug1DE22Ah0<%w(=mghl$Jc=0!&jz8T?AKCl(c(?0L+6c`%X?VA*!xRTC}yCIr|KQMSo!kzNnu$ScSc^hZ{A zqDfy9hF}|V;`s9}HQ*E?@Kj9Y`0188&u-)lsG*Z|2pu#3g?-fQGuirhP=*c`YZEHV z5A?{Uy}*1AEOti^3l)?dy3DqVSoy;kv~qz-t9UQf!{ddEtP(E`o;;2wTKQ_22aYxW zQf(%!;p}Ri=`*&s6<@fwxctQ^3s{LQbOYm-?M!cHc6u_C|U4)!e|P>NJk1n zEPC_%rB?A};abWy{A6s(Y)rGxD7ki>24?=mb~`R~1Hvjd&|NU-3Le`8?>*P*!-FrZ zwRcGNJzQM==$PWJD~hEtJ4%ZziQV%haVsxKd=jqNj;x^Bkrzw(>y0|1aB{Kw6SnT2 z_b>c*eP{#c9nXSiU!WdVQFVE*Yom&4v4Oq6!eyz6E$sgAK>^uxYb3jg>MpZJFxEF- zq9aPv?IzKmwx3mO9D7BYjgV0n<>!Z~l>xGu<`%xMU12B#EkTgIHbfV_`cI1ucsARR z7nY{k8EO5h3K9@y&4~ND%@o(Bs#yv1%Uul<;80zOditx?L9@0gQG*x1>@_HK7GIj# zLKbH4-kp-WNu+vd2$$Xg;+x~YIBODea|oT5-ziU&#j}+A?&35HZ5`#ouK;(6eX%Lq zT$t_|eGm@YclpZq`Ka2ZQRfK*?*>xcf*CYT56EWikoOG!Vk|w8w0W?hZs!qh%k2<} z^&PRc$-83%HqmD!W^`Ls7=J4_o@`JoQp{KMs3J92RP6XMBI{m}&EhZ3#PWE=)7P zH5wi_uXtj*;c;HFHYN}a7hI?L1@p(tg=KcW7IY*4k|r6NSX)zc_l-^g3?$s?4&3p% zwaI|%UEw-1VL|PGs4)9HHmI8+L(2|hjI+w1wGO&4frCz*p)6;Hquk4lWTh7m1O%I- z19|L4_sE(2lk)tqw5g4OL`VS*c)tL*Yh+qE_ArqB24S^&KdoSnWaw;bq;VLZN za3;Gy_fbvB;BI>#s#J|^7;gZ>P`FsN~|bnqw& zh>p#SQYYyDh7Ml8KBa?$*o0`24xSW~yFr!`OIw0fJ2avrxhfqzX`Ws~=C^#L7!Y)~ z(BV|=d|x{C*Ka9w04_Dc&4pt!N{aR#W7@lerDk5yoO5>i@NP6Is9vIXly7)XUTiy3 zf>Q3B?~OHSxT%TFE=JGBlZ|C7iDPQa{W#0T_n#>FDE<6>I{jQN!(C_cz1;18(;#|t zRrJsuFK5+=&(fsb+$c#f3M^bnS+l{g&*kyqJF+`PoPu>U5w+ zfKy=v40`;CP0?2tI<)iRWW?p*E8Y_mvrdiaIQK-D}@L31em~|JdGtjG9+Gp?n!l%d7OyQ+iPOn994#m$Rv?JX-(!gnyzP z53mB$l`VD{>wYbCze?^f*Bvf&hi-Rx#2r5A4tF(B{`sjMdCdGJ^`BB)U%y4Xu3cXz zjJ(AZX}}c9Zw4ooHvh;3xkuNT$j!5(pY$@#YT>tabT_6_T|*W$^^CJV+KL}p>#3pAhQUqPc8XY%5HedQBk zgH$NZhNko7!onS~M^FlqLa~MvcD&X#SMc!6Z&imDpAoi{kA#zzYXZPzs4b(b&l8Wu zs97s}Kx0L8ZVm=(#0 z>c(;>JZz(3eJOVf#;jao17^k>Ki6J|(!0J{HRim8nIC_BZvPXS>L!o+LVaaR!N^k% zZeGFVCcBK2+9G;OwkB|nF7`f`_Xi4*o^+?(po zL%(&=8NPck&D{IcJ(pMafwOm3_i@Kr_nUJcKEA1rd?wHVyaTvn=)kIm=qHyv%ZvTs z-d=Xu2j^&^E`KSyeKgWy$89i&)brnF4?Pl2hJPZmz*Y3ibkr$VtJ5p)HEzSb=y&C3 zJOiZsu4%7!!wqRZUCl4eHm48T8c2$oh2%%kK_pxy-`j*p?|RgF23?SE0gv2axZ!m; z%JKBS9*e_wk$gJyl}qX!FugL|+QY9FVG1n{%a(*FE2B2Ddq6&@sp1N`_VqPEf-Z0D zf@HriXk8K{F~z7{y{qq!yL+oS(hgBsKmm&@DjO<4jt;Mf(j6V8HSA~n+$$Wtpg05j zgkBbFp@yqwLwP%4F*=uf?eky@0AgOe8ooIiDgE}TYrr_J$&t=)l@-72Bsv( zFf6-Awc~)EI@@@geh`hcTPX}}y18+cv9A0XIYx_k9>dl^N%=tCdQ5EbpBVp09c+0b zWootj)rpEf8GUvrO25KDpt!uaW?iw=HcI$`_G#kAeaykO5|%-uP(>VrUMoInHMNpMq5N$UOu8&n%c0@e`m`Fdt1omYl4zs zmq_ZCCV5tyo3Xi3Fjh4yO0DwI-(IY{qpj|s06uwfkc ziV`s6d9fCYCe}ozYTWGv-seMtE}>c;C*x|9u6dkJigB`A>|0o+#x1rZRc!CT`a6mL z|AgC@#%f;0Z@o+l{RYGg27}*diUkN~yoNTu%cI>ktQP*$Yhi0pmre9^oGgf1nmgTW zkIfwNYHFl=3v0kGQON{5dd4=QcG(dOZiB=C6+=eY!*rfkdpqI{{3b~d5#m zsJsC{}kR&v!-J zF~M9tT~6nLmHbXYOfH(Lt$C!lr`bq8dOj|d3=2OHF(YkVCev_<1QCtO{s z2f3wjqf@tj+jV|)iV1iHT#7RaF38hbq`g1qIy(%VJ#s(17u1`isefa!FC9$v5n@*D z14zm`gF?h*37wTo;~NB91u^%#BQ^FZHO7Xxsf6ixdBK37)7L023wlTwG1(h}|nR7TsqQ|s^B|`ofiRf2LQ4odK}K4j6EzG;0GEu2 zE)64ZCQUc#wAv5v>SnE!2ei!=Ud_$(4y6ZpY2gc+QLrFUE;?Ds#Mf}$_#LDj@4z3I zcg6MEw?fMM$O&hJk9)BK-QM%P8@tVC5r-E?t>LuZiTYk)9%uJJNLyyLzIu=utb>gl zWIClyl}-&4IDx~;m|eDO3=X;@?gk+4n;!ZUi33tg0gG`|4G@$$2MBL7eb~XN7}KV~ zQRA;L6DW_a<-+@2LY}}3C?fXo_y8Wk?>6=9mrUApaY-Vmw#r4Zs0Qq^sY*xOc3G-z zIq$`l){pioS5%AHf@TW0I)O$%kIt&(Vq3Xe3Np_7^7J^MRORxjoKQ^1x&)rlVI!}# zi$)y&y?il?Ipxn%$1cC9vu^!!4)yG4?K5NzckvuhCSS1m{=HfS$$US_N!u)UZ(qLT zEnWoti_NfnWz4=_b(GY6o{&JpdvwG;6>U%|-<2O0Jq;c|nxaop>Q!pfMQYP+mbut^ z%C;obPc{7q683IXu;Sp!V ze58C>!(tYW5pr~8-d$v#VHlQK^J;zxkHDaObhwAxD!4*fGX(Ev12Nbc(h4tfFbCE< z@H%nASDA}(UDNUaYXOiRz=cUQO~T_l@rVPjwI7v-95}9T?{(eSSmT*{k3A77Dhwye>RdN%(`Ln5KEu1|5;4Q+ax8hhK@T=(f z;~UIrl)M@wFB5)C z0AvazV5o`i^{#AOQO(~U(KxGv)HAzGcVL(mS5&QIj}{*}9kM|SR8_r!s!laV6E*wf zv7-7)(KX&q`*cUa9Lo(oUCnB2N@To^2Df(AYppT3EVWA*I~`>|eO>gH3AXn3)h8hR z(6qW%)3d$P7Z8h880^eM&^Q&ZY`fXxBD;FK8GJO=G3E56(_UMBu2Xvl=rj@hd5~NF z$e3dPWJ>zewrnU)+CZzX1gL$}Mk9}{M)yy6u$2<}oo9a(bLg8qT1MgZt5MjXr!hDn z@GTKTs&D$}hW-gx(zRGRXf)lm&#!MQ>mH1z*mscA%;?YysH{KE+Nx>Od6eLrb>$Kq z+!#Ia6P33$=DlY<%)344O)$EQz0E|$s{N7iu1(ltMz|0$3HFMWrQFty`sNunQnEWZ zf#}z5ZWRRr#ZBF$M?*AP597sBjaF6$Sr4eP_t!lBMdOEzf7meN_mYmJ#-Cbi{PA-i zboNk`{!nkzKS+$sU_iuI*Mpf$UFkIgmcRlh;JirJ6oWX}WA|kiz=3(N!%kfO*bvvi z^_`SATf$0_#%iU*HV=a^V5^^o@3&SgHO}FwQ%YV&j}Pt{-QLsNO#AM zP8CL|e;bpB@+4Q*qOZDTi4!B_oeUljV)lA?FenS`O~&9uT|bkEwH&rzJS2iGZ!}LI zyQR9ymnyGB|BT=!FT;xiXca$?aQy5PKRcvP9dQ@}yW;<)dhZq>?6jy=YD?0;O2KV5M1}%Gem4^*CJ8l0@+A?wIha zl&;UdN7d8+Xnj_jcBSjC@-W+19+uk^9?PR4^;tJ9_4NU9$Z1dL=d*1qM1~@&DbmpT z?0uWAtWK5w8aSQp?GrMulmT=;TDWN_o-SuM=yviu1u?mZO@L@ppMAU6``Nz6vT3?K z%HWtlgoJ$b)PJ%*yNA_C7kUikvL%*&vy^Ik+Dt|Ed(OszFl@m;yVi2&IW(*}s`OE7%SlLWRln5StS3W-6<(cs&6m0w=p6eRatxjYHp6 zS%LydpTd=6B;m2B=5THuuVJdRI ztbZ=nKY9JLKl6*|$%hESeQaorgK!dmt={>of4knRM9^$}_gu4Sw8=WIeC+K_a+rGONDxTkbwbGI>Yc;D z^^we?x0PQZ!(!~>I>(^bQty0NePFIhVH5Sv`pV~}jXl;pWo1QXOVl@mUsRCLl+Xp% zBhon;hlbLziV(0qi=&vHmXcPMCX{Q&yCC!V6Ve$RXl^@E0D z-#!!s_Tgc@+$Z+%J0D+P?B`XdeZsX$-TpAUP=XLHk=MLnYjYPhE zblLq>3KoR{Gxjv|OvY=`+$!wtIGGyK{bzqn^Qr z`+@tww$o!v9q+KSXM=6|Jgzu|v-p0xHa`Izv+-y_EBgvAdlkPN=#=jx+&;0#k$&qf}d+5#k}slUvV`;gG?F2XlE!M*lyGBo

Q2BUd&f1=pzUw> z*#80kBlxe!e(LzX>G=9b_D`t(S@yi^|IzT{!0|v9*?-copDLnvY(%t9tw-l+__JVJ zW;(4#^f9fIv&}u;gWyBJ-awW#&j;TL@3^*K>9K!4d>yzXE&ElgSG5wyS8My*uw}-J zkKvzz&pq~2j~7k$edG8#ZNKCNw|yqV_Xh`pJ-3f*-!G1@*Y?+W?B4>v9sDsf`@V5} zqqe`(W8Z#}Jzzi%$iRQ!I6k~poe$HoWyZS`;lBaPGqdj-$49mOjUM|?!Jh%oXJ+3w zjxX2tb6#@&?++gc27?UR$2X3z()KGo_Ah{61TM|YzHb~~qwR0QRvc&Lc=|E?Gw`{` ze(E^Bsek&$@d<6ekg0?5Bw1#gnQZ)nL<{$M?b?01tU|(m0QO zj>-spIUXcJhtmtF`?)kNwx+ zuY)%;v+o3?BwYfDGElH;%8@_N%aE;`oc<>p_jje(E^BseOFo_;5n? zpL%SWbueGSzXd;d?5B?7o7+zn$CqoJve#Ulx$tAbd|=useI5TezEVr zX`FAqaeTS9pTL$m-?qcw10Q(or*Xdd#_?6!e&nyN{R!|Gm z{!{C*|0Mir@T|vv>Nwl&mwpRcBHF%q!}Y%}d@nEvnB$v<{Z`}nnAWNE=v)k64{9>g zX*G_IYn^&*n)6{7{A=)?M<Kn&bYx~i^x%Owmj{rvk(_X3VpR{aAD{EG2wf!1w znepO2cpdnY$A0SZ!eiejlCRhH8?j~DC+|(3g9V*HM*jOOp>Ndo%dutbFNLoFzs=OX zPb44yi#i|bJof(&XIBCkRgtt`*L!cSWG0hLj>$a<5W*G0DTiR>200>!;++8DP)K4D z6z{00crEch7A33bqN2o`^;qJHh{{4_Q4w93Rdmr+iLR@z>+yfp{W_C`fcm$7^J$m3L#Yn!`$v^mZO#T6&2Ls0dzezt`j^t$)MybPRMLRyXfW95L z>$mdhVnko<fsdZni(hfgE& zEW?l3zrF~%8F;xJpCga!+qH)-M)pxBe`8N#IRu3*69-&#!9NU5xBYo&2}8%l|{r9|NEK*8IB|+1ESy7rq;-?+KtM15*L5 zr(fmw#x5?e9Jizfn$0jg8HSYs{W|%tYM1{*pf>;;e{23-j_jp~Mzh1G6?y7WDxjua{zo3)x3i}%M)<|AIQ|cL>GA#FK)(&V z+b;hjkGnhP-}MN;+Tjy^FUDsC=utokp!M`y_;fYGZ+7_9BhPwAUk`$Q2-wh$&ymOX zhnJ_T5q@y1(%V7g8FBcC_YnsQxB*Vw&W}7!YsaU<2w(nFqr}O767te^H4k(Ju()0R zzsjz<80l9#`L9P_x?lYZ=vRPk?ehOs?XQcGeuI<0=kKxndxGu_^aD5@ef_hYe!3Xx zH#zw)ZkPW`(ANOh{Xg>WJkoD*^551j|BpZ)1pf8^$iMSQztzdVa9_-R#(*9VOaioi zewF=nG18B`s_b)ByZj#ly#d(RF8?Es!`tb<>lJ$`V~NA3wH=?(e(d=G>3}ZBui|r* z5r3J(XD;%LAXD~(7lXbGxZ=0+Im(E?-r>`XJaxPH2j~O9Kil#7Rqdk75x-Q4(dh6g zj>g*eLeR^AYCz!6xP8=u=5&;E#kF-c%jefcE{aTuEJqL(=4T@#H5Ch&R?M#}T3lYc zSpIa-z{n-YF;qHrhR5(MGOR_0F~-U<-7#$AP%O>#C{^m2#hk&mf8Cag#4}@7X zWA44`S$9EoMNv`3xkbN4icyAVlwpnHd`ca@!~PNDTM2qOZ~>t8a0zHm|4%(smM^P_ zK*S}LiyS@F%!o5Q4Z^ShV+<8gj_E`GQAeI_;HUNQ1L*h0i&7*LjpWsSNvL#pXT=w=>Gu!1vI}OL37e}vB$BG zHoNG^twpR6JB4TwXYLf>dJh>EV7w=2m}F}-yrK9``Y^`#YS1?VHvyXOZJ;^*8hg-< zVP0fjRn^j1<5&@Ci#d#3bji`}BC=h{6$M|dkE{b&#|4T3E!SYsoPOCZeuGpvqJO7Y zEkuKGt!DdZMr8rUt-{K8>?7*Pw*ve<;LrYXHRzjx+Z~y>{jTiPeitsQD=O@b&t66I zmsXV5EL>W?s1|k+HnsrOX~YHN^jD|+$V>ahFG2snd4CiuzaKQG=Es$PSmF4Ic6^pp zE~#TzR6M%BC=T{_gVPe@yll#*0Qto0q&PBeO@429_0d4@a-d_XF zY3WmnZ}nF7Y{&Qfnk97=rR572zzKkVeuGuC+7b=cr?z|yTW$Fu%1jbt)Slq-UGB;{{ziw+!IHv zPslY(dRCUMY~ER-tU=&o!dWccdt~gD()EONLm*wxHtBk5>CUn8#T+SJPe(fV;lC;Q zO8*(F_r;)Vffaz3?>f+&ZvCT@Z}H*w1`{}o8-7K3C7WHz*yBV=kKhuI&?vAlB0{Hg^N zY<^AFcHc%zG+7lJrQz+1Ga6_h4fJ`bm_nA9y3sg6Zc6sMrc)BWjiB==1y3M>Qd968 z4rICA@hMb7DON!KRg!JR^Irp25?a)10W#Rl>gG?h-QF|ZZkVap`HxN3boW7-zZO(S zQMZ_2O<=1 zq2CoQgsDRd11ZzCdeMj!nnXibL#8V}jr{npulzS25QRtk;ef0|+^`4Vkm$DtwRYGzrsmF*sE5AfqJQYZ%%;fG%Bp!z<6vTV2IOY!xz z1BDcV5J3R}LUy>wboI3D96$1l3b&tKhdWMIh$+AM@eTh4`lhj;H|{5TUeMYp>3w|m31tuo-Tx*;%SmyVp3ASMDn@gAm68CO@p772J^9!%lKE!pCo}!2XX){ zS8vdq4mk33(LZoI;VvjtcFtLGkm6cl{Lap%p_C6F3|=Fwp_HKY(cti1fqYAlFWc!2 zpzjCP1Dfyf&lKMmHadR7(M!AjLGqoq0-ST3>9x4cB%0|il8=(j#QOMaz_{D)kNQmZ z4VFe41f6E3Q2+*;9tRUEnBf_SpH!ISu_+hkJ6wH3N0LN61;wuy*^!({c27IrKHiKM z$D7{BIBN{`666Zn9y6oo@uuzWB@%LNU$PZ2$#0`mOs4Mg_ted6`%QZ(tj0t`PIR9D zbv)*wbtc?@FY`4)Cu`3Y{an>Y1In%K&m7R(OsjDUScJ*O(Tr5FBD(T=P|#L3A#Jb3($NAf#wwa1;6d^tx$aHg|Qxt zXDY^Lw__Z2_|_v|-JjhI`e9%rp!vQDnv=G_=o^Q%3$}xE*$V2-o9Sl~_2w5sKJLYX z%>W@k&$#;2csiD9C}>)qA~ca(1^SSnd8@E(ug$eE$2v|dpdR!)AoM6BzaSg*W=uO2>eeT{Fh2+H$BA)zK9C^9NPEA6?x2@jj%RFSG=Sla((UT_S zd2LUEh;tF8`0eDNE0Mb@Gmb{P{z?;Rdb;Z*JdUB81z}hjKa7HYmtB}~BfjR@aYIBr zjqY#TVPTuzbe}t0B=~!}GHkEcUdLStI|SRE<`#Gkk)Lk)Y2uTseZQbTcX<{`H-(H3Q*S!|+P>2}jtBl^?hgsw4*ySk@@wVX;R&TmOTUb@ z=W{?`1k?jsjvGO9+VspX%F#ARMT0p^nsrB&2IF{3$rA-X-A?`s+WQsO`T;FZ253%; zoqlGvGoDxdOb5M;xj^bBtyzrOEJU-oR&0hQw$kUq*nlB(e^}ooteQ)$8I-EqYt&Y9 zECwGf$K{~!0M-Cnj;)|MMYbrtWbHX({mfimDeI`otlDUbCi6o}KJquBDQ=~;F4Rqb zi~vSauDDuw`eERei>3;*wP2d_c@iWnf|aE})@Ot@hi6OcgzI`i>0YNcA&6JW9r<@` zep(EAG%yy>a?b(HY4?Ll-uEAl$z54-ekoRPa7_bDDy?4JFD?`HBI`01^B=;v4l|%) zj1L27ugPv{RYPbQ6$v-A*y`|aME-hy+ywds;3Yuwe+#tazd`X`^H_|3VejhdUPTLQ zDp*}U#i3+fi*kF3b#TmjzGjfa71C*KwA^1TuCt-zhXD&NwYiup@w zmsIg2DVFzR$eUBMlmDJ}`5y#r{|9GY08U4jdjeJ#WY%MHMWi>7>pc78nGfJ%db*8_ zCtz!d0UxE?J}Qc{!U>6Zf==h3g%l^u595^{tHFC1c(b3n9P}#SMnKo+9iTbYJ*4Wf zAE)A3PhWtU*M34<5L+vwSgs1Mg*g;gwjq?YB0%$B37XUP^@{HePPy5BN;P{pz}w)Cnf+!men8jzfnXDTQCKTvX)!Jf zDt;}ser#XP@ijG7HIAAeg;Qm=JB4vK*xn$^ zS#8a6ifKe0ew&bA3G!n*+5&n9@Has7I{=!~L8qTPyk1qc-r!X0V`OYFxmx>msMevK zs?`XFRC$Me7vnzxbSW?g(EJyIK05!U+;Cx7?Iif@mnA4kR{S?1|6(xU^1lLlC$JmP z{QnM`)A}RXm15s24&gsm_)TP7VU0&$z=n03uxgaX%Tg4-!vDtVcPQuyzzKlncN%C; zD;>KkZD&`DD(du3c3O+L4RwnJ<#9W~Xe<4XjCEjJN{d_r%o1TS*BWai-6KR#rlYBf zelh@~x#JFZQFL}gJt=e%CLX@H9%{Benogif8r?R2 zNq6f1e=+@!1U(fv5zz9~gXX07*;cKK`B5d$yz&JnRn*LbELgp`#gyw7Z($LGHFcxQ z_}c0YO%-BsCTwNU#T2F?ZVHF-Gk@YJx=P>&6BFztqQa2PK4>mI!b_#CSxUZb;IHlD zJca%=5*xo0^}%Oppn9Wp$I=R{bzqo6Cc>&uuwc z`=`s;0{&S8y_7SEj`d}GX?(70C^T^lC4mmv`S?w@P%v0rPfSeKNhwXkH=qBK4K$qhq(3}dpXpe2> znBdGF)2h$Gvio|%y8Bjo+BB|nR)W`Z#hdsU zreTn-#`+VfDlY4$x$;~|vZhmLGG?fgu_Td@NEtpjEJ}u)DMXoqxP6w>l|>E31jWl_7&Rvvr!>g$#vGdjv9?rt)LUtLyzv8kZpyJ;|@@`cl-)D%pWze=Dmel<@0s*jC-UwyoL9MK*z-X83w+95W@4@IWKW%=$E z);#(GlPmLNdRAE12>TRI5BEtvOsP(%9{!6_MaBJ8xvNnwy}oxf=sSQlfG+p{Ky!*Z z^U=foI?7#I)i$e&iVwwpA)?|ZYrpjCE8WI+cOGhD1nOdliFM50sGB}C*yl~^g;6r4 z_xJYp!o+*`bU_2j@ck;Syr0G{YW7c&<_Y( zSwm=qZ-9;dBqJU2_rr8yB*Z?(I^EnLT-8{D!B15x8>Hk9ldH|24gh^2a2cTG-wT>k z*!D=_@xYKF7)Qx};L`UnsWQ0i3?I?pxP&wF zt$yY9;+ur+F26@iAeuYz7BPif7h>_DkJ|c)pL&`-GbCIyE<=Oq)BkL!Y<$9nBZ!Jd zo?3vP^gIQNf5Hl!EUAE_@!6+ts2yC z*0aL=GRc+U&E`LnDL7T>e;f3x=L7pdC)q9|4bb|3+okj$*{Ag0SETc=j97b<`ah|B z>GBHpsLhEl)8<6cocN)7T;rGDp7Y4Z=jz+l?xV^cb|F4{ z#rO4NX4cOx=Es1@Gs2G%VLYY|ld-`#mSzgdxD_>?Hi|yQ%0Bk?t`%5Ee@ci9KN`Lp z`lh=CT>`JbI{;yti#1_(|4#^aK6+F5|Br_!UQ z3+6LvU~pCf{Xt+kS7wa@Vb`zFP3K^biFu8XyvPHiOrA-9<$c{WW{KhcEXclHgo=D& z8(WL1$(;8hyE1H3HoDQ_!Q092noYOCA>$8cQPB1a3;*8sXW*Z^D*R6i_h3I=G{mk^ zydbO+TQf-KjmUl!=55sYCq!m`k}Yy<$t@@Rdtukv&k6sdSj`?F(!3!N_o;Ay&Ng*6 z?J(&A+90qDccq|_Vl*&?#)=WZI4T#TfQv;>*A4;2*SSYp=;Q7eSS@h2~Z>@{Esqi?1m7lAvZGhWaOqe~IKVG%Iwwpi(hgTH+w(F2b+4UA@AG`g$6P@IQnyO{Wr(n{t0kaKknZDyp zI@a69CjU72idUXK47RHyZP7f>P}x6rH6mWBiAJU?p5CtQJWr0cX9oB zcwZPo|BeunMaPNzW8I7m01?~rQIbH_MsjG3LoM)mG2&D>;K+moW))@c6L@=;MJ2fR=L+XihCoypH9}KVyCbGwwD)q4bNT&Yx4NKUIE7 zQj@;dETbtf4juInQH;HnRp@=_cvx~GO>$ejEy4!*2eKN70?H=9x4K5jxe0RU`QBea z?*`rlw4DD0&FRSVJ_%|Vc?dP|Eehb(OX#SJp9Xoni z`T14*JNL5-s@m2S^IJVnn}_%K>2whC-4Qe;!{1pGKa ziI8T!fb*As6Gn@~2D}GtG6nm4LxY}Vh-af)&v2oyFzG+S{y}6|d4!$+Kv46=uy!V8 z=Gi$Y4W+y7l=VW`X@wXZpxfZhywprPN9LT#d!OD++snVCeEcexMd)UCcXhM-*&!4v z&JN&{0*N+?nB(@DcDjWPW~2?|PI32ek3_gge|M&P0Dyo17}$*_T}Fq9{w2^vhq|xw zW0&$apJ#%z6%)Kl+1+~7YXr8y?eclhuK=$Dy52tlEt9i(NUUZ>B-Xi)$Sm+5#MK?9%yGF?~%pa3y8t9XO(*Z5d za?qS2Pb)dLZ90NHavc(W;%RsYZi0Ks*pt{@P0zR!?uYIf(=+n3$NHPF`eX2()NZ`K zO3AYg{IoxK7jzUj0BCs*g65>x3AeOcpIWrEYF<&%LPXaLkiMYwI1dCl$G8G8Mxfh5 z&_s*Fr#PVU;d&SWdJ1p~p!qCyey`)L^^^Uh6G)j>8o?6btGrfNgmpsCie@^0GliR} zC%bNIMU(qD8uqw5{DeDA1UGU~$0I_~8Sw?LQ{~+RK6<@pJLtaw?*Lkk_ds*%yx!9; zu9!svP~^1Ii#WRa9)zg^#sutTs_1I?9fx0GLX6)C&{KfvfaW(7G$$QLd%Ck9*cMmZ zj$4CxNyz9}OGd~36KnzFA}XPLJ+ElIUX`;E`RZ~$3i@f_IY9IM8)#0qI`ygbU0YRy z4Gjdy&gZ?iwCcM#YWj70K^QA~yF%EqO0u$D2obd{j~^XfBL34`lihu2rg>~bw2F$D*#8|2GAC>C8 ztorTr85vXa;NUGR1Yj_p>PtM8lF;hLV%5Z#=1%gty*%T`B1875 z6M>TeE!VlAW$H?<#TDh%S|u%F8#V-3C7+T}oreG|FS?ALG*qPeGBJc5YNmU9*^ptK zK<&lqr$Ncl3_e;vyFo{Rj{q%)ouuUWuG4;^te<5S3zn2u&R95mvECzofv`vH#UAl? z`X?E8i#!XXcucDCX&u89Rzt9WXd{Y_Ep;OOh+T80T5eMEl!Bk`pU(tc1=Imro^L>N zI=w4-&^0ePuS&+fG+0;oWSH|$h<0Xi9t|2>F%l0`rqvTY)&x4!OM&r8ei~s_T3msZ z*0~ne2b01SR}}DBbS{359z2B#2hc$O01zoDZWltIOC}H?37{3T#&m}xhI8U^)MH7B~T0Kaz6r^QU&gqB4&#C@c zm4~k+U?&m9DjP2&Zbx{j(Q4))P__r=4olUJ!!h{U7eURu%U!xw@g0^D^8?dC&jC&W zIB~f;pNCWYWcc|k=31oAB3c|_0Ji;&`|SSwZ|j}>8Fz@t`?v zX;OOBaVLlIoppYBHS;Zva)&EG#V!jiEn>nl0@CU{JPUNrab0g?y zf#(6ue=}%Kx_@tQ_8Si8ueu)C>io+*;C-pF!M+sbw0g=Q(BOTFpC>KGFBNnSkPm2n z1)zU{pNs*HvDwm|jnUxnsYX5#WW?>@TF|!ucLJKvBcNsKs^93)pPt17Hr8x|*n>VT z&e%cU3nP^~)fp5K;aI17g`i5^aWveo%KIJo=zb$U>@sqJ?tqqKB4|!W?N{4Gs25`| z!y?D~(z0BztQ{ODQrNL)ogsVHVd&db&+6iy6{{bZaQKYqIwe;F_(s5&^|KE2W5APu zmTL!SnYz-C?pNF7Y7x)L&UFX9PsVhobHz*yovSMobGxBtst0lJvU7b*cCIB4DmlXG zG5rhxJqj2DXgSJ3bL!Hccj#B!gem=&TYwiWU|}S)w*lj3 z)yYChvXgaF{CJE>Mo^jTWXr7i+{t1(8rMC5PItal#+|I6vbxd0I6mu<5|W*)X?GhA zH$B34jAwu^m}`gS?=ap}oos>XWKG-K?%%lWMBT}5aAO+yKTBIJ;u#-v%8&ACyL|=p zdq5P>1;7BdR)o9*pZ9vx)$`Mz~z9Jd!_SxJ$~0u>Cf~Dv|x6E2=-6Ff!M`{ zwb(F5;~)^`W}Hf%P<&dDkM3tb0sRf|J)rsg1e#Olbs@>8u(#Uzls!`~r)vt8RbWi$ zKFe2@V0iArTm>*rvwD~^k|gTzos<=8xAQ>P0OtXk?}eZ_b>6q`ny>7t;IeDktGF-o z)r%wpfz5^m80T2s%q*E1J{q1><=%$;b${^z=tIE20nPtg(42ICq4#~e;_q}>p|bK= z!EXa|z*uOd%7Pa^rT7lZj`2MK^mJe*z=`|+&hxT`h$<{XU?_)Lv~4yREtGFOEHI$O zqJ&CiPX3L^OWXUipkD&E0=itgK+DuQ&WZUH_U3bBk`3M~Tp_1mP2zFH!Nh^(-w;$G zhSCCXmErZLS(UMVxa4V7zDQ22d?P>~4~z#i|H+^^X}#+4hb(7D{`$;asBF$z9`LU= zwg?Ojj1& z_CmQX!v?$nr=!&yLPT`6bwl3W5WvK79&P!zI{D8Zkh@b!Rd&^z z6#r)Augm)$=nsI80nPtY(43B3-WdP35?7y9#RhtzaW8=Lm299+YIXP)=f(Jr1w8?n z0&qH-{mjuC#-AwzT90lrW!4-oTCaSu!co-v#F5l$ zM4nUp!}+oD4Fo+L7zJql$Aji{1iiNBf4Exz5>soV!*3Px)8+jG=tqDiK=XS6v`j}X zZ>%Dfr|ZyU-abN!8=qI@^>mAsw>#)QKz~5<9|W4yQOXMeA>(TZCl3Md)p9bmpoEF8Hp zj7Ep=cgR=kJF&aV$O7^J&9@(DPMycMj=!yyMeJZ}So!>*W$N0Vb1~~ICNv;!#D}v395}ce77NA&38ZO4}gyy zUPtpwq(43B-*UtRg6kDb{xfV0l z$swQWW>xOOp0Rd14D=*m8ld@}4_YQ?U-;sGI{Q6rw>-$?0f~&&YqGbyH`=1fPT7d= zyM=y-RSD}PT7+)kcLJv>lFTp#aR_oQZ9*W4$j6lqV{oV&8)v)~a+AO<0CWIB1oEsk zB0G559Mg_1O3rPNL+j`7prgP6N4BH1E0zue#9l>J%XyS|GUPhh_!NsXh_;dA-Kdj) zabawHHU;!-;1odXVKHb<$2xKF#rnLeYQJrKPQuZhy5pB}xG^@rb_m}5YN3A%V-=#Y zRtan@=DPe`;Gq@*nQ)#)<_bH1MU`_C_(bqC_M5MR{tEaO&~gm!rR1n{&V81?*RDR6 z)Sg;VQ>9Hkx53wLhreaD_qBTmLcG#FO?y#;2UiC z3d<8g5N#MUL~Pf&u|mxeF2S%r;Nj`)aW+<*!)}keCrWU=ux28x@I~7SaM3t5zoyEw z3i4`y^?T4y0-FF`o|N9IJZqeL3!0s$^v825&s|ntlDbJxBI^XN;bP%C5=2;wvmcI3%KGpv!n`s= zH38c{6megf?h_Hem6?f`W8?g!0jw-d*|&58e%p3s+)7W1 zLnK=1DQuo|;cv2xuigD&hf83Xi3pimgLNdAJfAv?&Y?VUlJ&H}B>?hD0`$XwQ}P*o zWAR1lpt}KufR=9{Xin>#`v)fJ^M#$-vzpJ!gN_Y|oKl_C1H$;slSkE13@TxebxQ0W zgs8*69{CSL{#+logKh*K05t!{L38TstZVPq=fk?-4_|`C(A5s}$Az)di)#-Mrb~F;)&tqHmLbDR`YzRW~2BW#is@N=yHAn`rp8JfaXK} zf1RGyJne8rukv-R=%~ZL6!~lZ3qe-{%K^>*a?qT9NzcsxFhw`=H6A#T=h$<5MK|to z%8&fDp5Fs~0QdyZ{J#XvsY^XOOgkvL$=5;A#qTOU!-}yVgnYQ&&H{Y~Fb~jtmV)L~ z=EUP1$#3ZSi=*kA9IJX#7_HFsrOKp7Tc>N!(dzKug#1g8Kl5(^y%*RIX#W2K&FP?X z&f`daL-A)#H{v=wj!kI689-xI9BcYit?31ACf&T(DgS_2J&y-H1DFkH{-=ZHbg^?z zr-R>U&$QlQdY>@vjO$0|uuY$D}w$1;(`tPc|;X$$T_5(c{7z=2A7l7sz`9Ss8EC1Vdzpb2g ze!csF_@7;(-hGAnGp_7tq1_3_n)rd%eT3#5K(8I9`!Q_veJI=^>mCz5cY!a%br!~E zY36i+po{dWNfmT*8jNEKMsL3-dQ{LKImG#5T3}x#JU9u}PgGeY)GuLL636$1=xn|M zArJq8Q|U*lT&@Z8x%z?TRPu@{&-Qn^F4w~HB}*5g5_6;UCv!iE zDB1hvIOL#dydOUiBg>yKh^OAB+|jv4;BKtX`3HlYxW1BqDtYR`Pmho80DT|uAfV;h z1e#O5)Bo#rd)fcC8y_uq#=fD*5FE`9=DMNdGUJQ*Y)W+DV3yD44q#l41(1>I646G7 zzcC~>kH`RB1=InWf1ja>f7ZuJ4+j#Qa|4~mA2LRHhP;>}zcK0JwMn8eX}SDtBKdg7 zl#fGk^3f{fW0x%-YhCj3r23Opmi)F+eR~0a$p-U4kx}oTiLF8eG$U>_5zpf>?Y|BQV0Bka7+iA9cJ=fz<^El5+)191>V~22T z5T|PT$V*)~ZrO|Z0AKDRFLZ(Z?X;{v3&NE-W#Su?k4KzOv&C1!dXuOOK`AR-3lsY# z?Re}V63`@a&&&hM@fF8S~3Dg71U-YW{^xA9h}*J;W_w)~{*XdCKD`-lCY{{wsv z=z8pXjH<`)oN?^zBaCB9`AjoArzmbbkO#{yke~hb!!fteA>0EK7>@AT$oy_BTx9sDe;n!}HNRUZCxaW{I$=FW>f*6x!_Oia)sQEMC%3~@psxp3 zJ2LV-U7sWFF#l+0?@~^_Uoizzr5M{08O+%kQ78XBPF|e<0nlFq{{^%@>|shDI{)s@ ze!6T|ZAxgw4JvE-o>%u;S^SN{*b~UJYRRW!HgH*ADt>{~AXK?Zk*{vgXMkP+ECw{+ zYS5f?{Hf+2!i!T?vjFcUpz zVu?6n_TxFy5W@Nr4t@l2HH#?f?Dp#u9RrMW zo2ZdCl4zogjk3!)KsdzMpMH?hg=PjDRIT+SzL^Muckb(Jz!4xWXA}5n`+5uX$H2b; zEk~b`O3ua3IWObKuKTYJQ~9>o=lrPmAHMxw5%s?4*^i#8h299^YORs)|=jD6V#cf-7legA{50xsE^|qupSd_;pv}{`vIJG$MyEVn|Brxv9(V)L<^9n4y|y>~ zY_oIrWisIULykTf#sSxtY{MOeuTu6l8t^JdTwk(A9J|Xu?ejqP7lE`l{h?ic_vZmr z!g$=dqFOiBse($L;$vfWFcbQFut-rwu0UP>;g3Zw?T8#>%V%u&_3>)yKZh5teTRi z1x~(r-of@hfa5MTD)c+*@QaL!@f!?!954yc{HB8Dq~pFDo%_XNao_E@VX)L}$-z=K z50*UF;Qb4L@vK0fO=Gx6t4>zsyc7BAay|w61)v$we7At+)OnwzT{%x1cm^hs6*UXX z=U3pqXfADa*OzA_pGb=08yp?u+Z*%<8g%P0W)0Gi)$(42HTIugIwRJKWM zRTr$}Y~*WJ+#6B1yWlvDnn9G{StHC`%guxT=W(=J&u*~}m#*Zg2R}U?x()OipwW?` ztMO3ha_cbK(Fmj6MPrSt#aJnStCN2edFg)RThQMFKefxh^F8C8^PgE!D>ng$BlqFP zCXs=GUIH!~FV0Z%PdYwUe`kYU0bBxTeclL~ldeDQmpb#QtGQreP1X5hE&xL(D%mQz zUf>GobbzZ9>zdm{7Is(V@m5cmuN{Awt5&8~N1i?4r|b6%(D7qjMk1i)nFE?rgVRs1 z*{k}=&hjjRFz_6B4dgo<^xk4OSn?57j}bdDY}iFjamGFzmCeM~LLyEJ%%E&nx@WX+ zCx*qiym$m(6mduY1YAglq-j!$Dm z>32Qk9R_*1eQXB36W9&t@_YiC(>iCKsPFsiT%NWY9-}x^E?sd6yW(B6-ZGl8LYzd? zvHNxpnFGnPRAm{iyw?XKi%0bh)4rJg=z8O9;D3D9!Q2F)qr z#KA9c_Qg8OHM6380UsXbx^J~#@*U#a2ukE9t~h0d{TyffgnL?(tUmG}qJ@L*{V3v^ zfeFzA#P@Y#86x}?;Y>g_bV~8K`P!90#Xa2-96GW?0>dM|O*J3GY#ZPsE;xjDlSP-C z;=cli=FJ>e+cuKX+FO;c3GzoEKik1epx*@E26Xv80L^KGv+mZ>Z!If7r$Poda%b2m z?pKqW1YY*rMQ;h?FXpjU58tWYAUmiT7GGTAq?SI4fARR3ekX&j0L}(9|64$FYTT^a zQ`wfT+m*D#*;SAOb$+!a>wL8Q%$J`%RsH`7Z!tC5D*IrT|2-}warHv5Z9Mh%BvMf( zb;m|e53eUp?Y^xM)+>T;#@!0Id&ZHxp-9Pn5OPHz7wgTO0AB#40$T3ApgH}Lf0A;K zac%;w7f;BD@7{>`-h~Ap<8}+a9?MRCS3d3(&%;WEY(lg7Isg>`($HVYvjY4I9eHj6 z{V=c*(DLj8%}JjJ?^utq{!Yr{+z5&}`$}~g%#&*BK8z>ryXa=icmfwC1aSzr$YSw= zF6=1}z+pSf%;V$hSagHBmRPgJi#Tg7E4^uek~1q|3Z5Z9zaaStsM=m*8+$BS+X$*o=Bqed(-B#W$wyzPmCvOGaSlJ8g+*O| zOSFRY)h(rimAoyGN9*-d(4I*y!w+bA2ZQFM^?HNjFT0Yr?V?p&x44n#Yfq@hwQBYj z;MvvN+?eR90T8$Al6Bl&_B@V-`&?l9h7Zha z8+iWaT&`dkkztCjF*#PhiJwG2d;8{#^W75f6`A?&bEb%LfrXT zXuze$VLmF%IGg_sr&1^XJ;+Pi~ zY5QFw>bg*V-Xr8ATYe6gpAV`ZU1iE|pQ>+IIpcqnDL)6u&+pZbURHnCSN`mj{a6Zr zn_f&dhK@?@piK}0YJj6_U#I_{~DLzl#N)~8GN^^&k|chL=&cv6VhTr`{Ov0<#L$C49b zb~^*~=|DN4^?W&KPF?#|e!meqe^?J*>vSuv=2zypp^`>24u~Aco`+TaR96ryxqiOD zAN%tX%+W0?;D zi-XgkJLcLK@dD!&pTemzKBGa82POlYehnYzmAO`=7z6b^G{l%PME=`qC;tZIrS0}X z&@Tdi0kl5%fac_J)^Q_S+uLnnZ(SaKLLwaXe@MuCLH@3;3i0w8^F8#OWlW!i#q;SX zT@tVE^u@I}UhXvCHLcQ^n=qOtI^~`g^Q&V(mjM-kmg{QJoJt+JaBzu#WoWhbMhqL0ln?riJZOIpzC?ET~vsV$wQQ$+-e@L?8(JziUC?2HXv3 zIoE>bq}z?&zispPN};IYw31cq?}PC7s8?Y;#vkzab#lbfG)?h4=;X)zeg++w;W9#i z=GP50C+%+=o%8gHU)#8`ZKV)_Cg;lLn!yLjcVRou*lHG_h6X_wJ~M-TL~pu)UB66a z)0G_64j-1|V$jzEcLQ3E2b|w)IrLM>(cuP#OEJGs*doey z@+DPE%r zx!@mxyj*XUpqB#|09wAwL37gWyR&?Fm+JNR)2bz=ChrWMX+sV}O+B!Yz$!#)E*~o7eSSCMj7xIxU zKS#>X8%_E6oaCcKeh%jM5A3DC;X{m+!x>!2h|^Vh*e8_38Jj#9(BMkR(U=i?FryoU zuKi9Pz*w#vc=-XCnQW9_-RT~WCo9Dlz>q`@N;0Ll$9?C|kl5hDwtAaiIo&Bg$`?WT zSl{n~{t=+rvGV7G=9KKjSGJwkcG`(7yPik2ilv8mAd3(~e$0@cb@DUq5a!CTS<85s z`oR*$WB>Uw49(Ka5x!K)vD{Q@;~ouO%$aW?K6bb{1@Ia5XDT_XAx8vqu$|$W*o+L?hh9_i2|dQ{@Yu9P=aH zKo0_j0lIw0gXX0Dh(7PA%hzE>*d!iQOX7ZB4ByKuO#9ru=swveuN78btzG!_O2xkc z`D;J+An50TW0eZ?lne<6xDNBRn@IM}N@A0pkEI$2`#O<`1W#X-871uWboZy#8MmIK_TZsGTaQ&m*i%+%%|*J#kcU37~heg zPXI~*&37JXPAi;s-mjhY0?l^`&!{zHb&v?X?a4c(H{D9cy@>t00A`(rD5Vl#Dv#~) zilJ3)Hz_vNIOPW)UH(@={~h=M&~khan$wZ&bE)p7d>!*R94=e_>T-BgCX}{jN-LT!xs>V(w zoC6MiFT%YtdvS%W@pgQFn#$EOU7d5Pu5?JT(Nq1eNmQeaQW0e$aMNz(7LcwSy&3CjV z6xi}xHoa@&Vr7BjA#w>t+C$`0RiCS%Pi@zCfPNHs0?_*20-BSy>%+&37|-%-umLv) zNMAQee#(2k-seNp+i@FlK5WV2YxtG@UT9To4;;Bn$q_t5@nO5l0o@De3urm|JHOZS zGW~3CUu?qis)o^gRm1s)g&nlfxR?pU5TnuIv%<-T`P=~d4&ZJ;^SQ_Qz0O}hYf#K3 z%PRUWsF=5Wk-kyyh};Y#Qm@K&5cx&GpZWa=+H)q>g#pbk3p6KvFTQS{nqOTF+Gf$L zx^i`qTlI9@i$4)p%I%{~!YCSqt00q;lM}*8S$x6xAPjk(2DMmB2NC z=HKA_UYAopJM*uqmfB5$X7^FCF*6eZcrtbh*J!eWgO{uF?m>QfJ?!70e_&o`#rP$I z=Jb>k_on0DI`cz$+vfbCCb48A9QHnhNEt)3F(1k&x2qdonSk5tcnX_Gr?ac#)ab}j z=J4Ti*MYtaxB}4SzRLN%F0X!el%vB1AcNVemKhfI=0@X6Hnu91`wCU=7Ubu_cjosA z=>GuU1Dan_nJTy5@7Co;6hR$sW#vc$9LwZto((gTG2+#|P}k3iDqPY-h}*bbB4uEA0`6@L{!7F~8a}@aT{;o>5J{O@Rw{W~!B5NMEq56yKn9@Y83y_n z<&nVvZ30#QS3p5YQa_IpHs|v&0dcg0>vM31694(ULG{vJP)9v0=Luy5e^Qt&e3Gxpu^GUJq<=Wa55a+plgn zS})7wG@}?o6dO&bjYNvG_>zuhC*Rg~`TofH&373V!0D*@mao7csC@t2F5gxs-$}?r z*XJ3aD}b}x<*V;s?JRE%)?*g%U6lihk-t^F6*k2h#9Ry`Fb}4XJ^12w+`X8IklR#O zvXm6%xmM|ETRXn*f^G%=1L%58T%gK!RQ_|62~C9g^Z>d$NJE5Nl)e@YVXL1$`56JD}y-1DaEVvyR{Ti5f@gdX)YM z_Qf~T=GVLKwSTrnz3ZTQtQPW{?`MpHqO>F4xY-;*5p4A)b1Zz8AN^4`XzvyihjI&i zIZ$01zdHsm?n$KoAY#)KHiw(JIH8-F8Xkpnx-9-Xc;l#`$A}7W+8^(&x)$#$#yo)? z9H-z-s$9b=V(X|=K%WYn1?X}u2hAzo*{9U!Sv!{t#o}fIo`|yU#!=Q$zN_qjc_N)1 zNWnQE3LIsW;0<=8eg66cs>F+w* zpVae$sxcLn^B1#BB~Ni&WR%{G8 z*MjEM`TRx)JuEH9Y?ayKDELG6&wNRJmi%=8EEU4<3bnfX{ANDZnC9U6OTMDK7`uH7 zu{oHT?)Kn5>YN=o-J0u*3#GdGF57Xq0iKT0qdUy%ZddZQLLRNB#6=hr0X+aM?*P!8 zHgvjASIa9Ew5+`59P|M=f?PDco$DQd_A(Aot{3lRJYe<4a5`j7W!F0sZxFz`wj;+1 z@X>PI4f+A#VL;2V3G{D~W7#}(0kbOPg@7f+5TaIA-&TP)qW6Zs#cOL_b6JdKG=nR! z`3|KIV{uH59-s#TLjf&E3FzM<2afbt&2Q6*6)eJyWyOFSwuBp{as697LWZznwSeTn zrT9)I$13pA`gjs_Gq45Fa_j*8o8_ojz^jBul;-Bcq`|n&kte()w$3#S^kiTLCK65R+N|f$RG#c$GSo{s+R@2*XD#s<` z&GWJCyA|JTO4?_6L)KP#o;%JfLL5BBZSg$5C;_46)9_|vhA-vl06V6a%_^$Ajji&&gCf_c$D>9ZaiO)>cHk zhrkc-@|8ohQcOrU$W%3Rsp}e(~Seg2sq!d~Ld4$<+Y9h2YEM z*FS=O7I*>Ba=iwc)1A&fYuRfZ^*)as7`M;q<;!?20e2yMXs+hV9p1=-}3K{a-hp=72?91u6@r7Jmv!NwX;A8hkaqgRC)^mNDF(^w zaTfCTrj_a{h`(HTC!@5PcoSxRLNGZog)&A{n&%OdsDD9Gf$Ic_`-VVMxeG5aLvQ{F z_vQukn2Fc2*i#G8{TGxwV9R{csgW!PMX^XyX-Oy@*Rk@ghZR!`y0$-NHg| zKU7RMYdqEN%Z2YL#D>LP62K1=67CmC>#ztZ3e7&|;CQ^YCev9OYGXG%o>n@~n4U1-nz@|U#POEfFFdPBG|QKJ&1ssck0I5dv5N{|ItC`zZCeHm}GKu#sAbt$*JxRcHDa&;xzWLk*0vC1j zGH5;Ohffc($Aes3lw6y@SI^_#1pN=-V?fL0tx|IBan|RmcXe!^a=Zhdyllqux@vjn z4ZPO%%4c?L}ICUj)j?RcO5}TV7i?regXMzF&faSXA_in?o-? z;CDpafOniH;k5{S1Goq0GT}17{{gc6l*5_|Zc}nZ9X>3_e?Z4oLoPteQ4g9^gL7`H z#d$B5mScX^c@;G?E2`Bk%K43f_tVw}L}Q>tehyxXb3z}`PhrF(4ut0lqglQQ7ejZW zo#Mq-{Ei^F_><{4w6+Wc10o(AhM7dgR*H#pq(5T&#x$=KzMMGnXC$8_is82q791BY zNFXo%^7lAKDGF@6e=52?yEis-um&w-g|8OOX*Ld~;_YUa3)eP*H(b&WF2o!6M%Ly= z;kzEEGefya`H8t!0^VH|;H9aC-AXUtq1?Kk@t=$RVjv69dYJ^8Q?c_t?8X1+Xg~1p z<5!gPYb>2honCWowBw8e^bO8ekHLg3pRE>4t4V}&UtCFXcKHt)&T774?@ouc~|ib*2Ma~?x05i#{rt}C7?MqIPd){ z>oi}B>4m*~tNnp`WnGGl96y#L#}CjyyawJS7hmVE_2SGg0vHqM0an!ilr{ID+~kbJ zaB3g&jJarJ&KN(Xj?K}T3 zlb?b9fy+=EE5{JfoL0TB>h-|49qSiYv`*s}Fv=yc{HW((V82I1J*V%-Yl1$eFB5Pu z3Y*Nl|Bcz=LV-mN*Rz53z zeHex8aUK}*rDz@r93>;Af*pLU%Fzfp^*HTC&{5zcK-WjOPL-qSRVDvt&N&Wk2Zg^9H$#sf)5{)X;mMdyr_m71ATU4mde8xR zPR0Aou-Z%Ury!nxg*)F@fP;>yUay&o7l}gpYlU?QE;D=5#O-)f#mRc!T=uCdPc`J# z?d~ejw*$Wiba`mGQy%Ain78ifSTD7_`98B^5#o^8z#6Q_J@N+Yb%I|L@iATDgK?b1 zXIQ=XuO}7bg+%e_z@glMDTCZegclRZ?`d#WzBsrlgsn}(pW60Z`7R?wAHiuQnRbqc zQc!Prj}dz!oa)3&^oITsN4y2zW5mT;DQKUCe)Dsp33j0;MHaRCkSga~ltb5BE$AzO zRe&z%2GE>ZoOZP4^N!_gS8vNJmz=9!O4w@OuMT1qa6|f-zQG5s>weaRAzHZPDHuQ7 zbuaD@PjjahBnI(P@#44wZZ7-r3M0Zx32!H=$15O3g>|Br2i-`mUn_Y%=f(U@I_O?N z5uoKQ2hFL>iHmsQe}2`7PF;<91r2#R}|{Rr23BoMxVa)xNs~#<_SU zs|dJ8<88=p`kwrD0CRUJ@jlaQ`$BQ!Q_tkMTV71RgRJu~cX?M>I7>3gzKT4k)LQTK z_)+}Z*6)?vn;@6&XI}%o5BSiLmDll(wBEI(R_``ik@2`OA{)Tju}D9lFI0OuVc9T* z7Mft;-Hmt~l!b0BAr0#>@%*zO>?uLS2`gl$rV3{CgOaE8{MdTsGSCgcZGhI}YoIxm zIO|>SchX~FZ$2zuRf*C29G5i8GviuqNzV^W$( zgF70x+ASK~SJP_rdI#y2fUyH};O-oc5wIp=`bwrZH5F@(n@wyc9nY_xaiObEunN$X z_VE_M0j1IjDPFT6G>*pOuWgI(uk$9#2$~ew5SQXC9O}hor2M{KoJkr)H<~y#H^EGF zo#;Kmyio+Q_$Y-;5!?^LMDT)GzcB#xL|`hQ%expfrOX z6|;khdX$`-AcyuZEuf>oM}U?y@j|Cw9RJe#_m1_#@d$i4xJU;2@*p#6e&pG2;{CjM zF)vriI)pO&NHS(q{7Ou!i2Zm6r-h$JXETER!l;kgLoVjuzF#LfAz^TloZ zW4eBwu5=){4#Wg4i6Z=O%bfh@A}>8ZsR4Zja1Ef#xfV31Bd?2UJ~($evs}Kys^n@8 zbWQ*Wn>#Qagz>oZ;QN!&ID%N4$5|oM*=8Dp=^VdIED}`ZJqUhU9^+z+cY!QG%QGA_ zr@}{-zIA-y;dVU%H~&CKY0ctpv030$cY^$E#1|F{Z`9fcp;EL^R-y}H#X&5*HkLj2 zcU=Ls*YZ`!`DV#nsH(eE)xEfo*j)f) zP5_SMf%X8r#R-q%B*ouzNz5K{K@R~&0Gj^{(41PGbA83mxxT~sFRfa{&8Z15u9nf! zz2&D{+2`|E3By$vA@qjdVBbWfh*TAKH41M^zYh)=A-0paomVF-xf;Q@7<{?CJO_FU z@EV}ydJ8nCYA4=F$AcX%*Z7*6s+xsdbB%}x;|;ole0kqbo;<3;0hM&6Gow9y~-j zNOxPt4ZagCZ0GxI?=tk9rO-*Si5`;cVh*pfmeFIv?7=1@Q)`;iPswF5{hSDT5wH}{ za;*Z*X|B_*^tli%R~^=V5QMF&l+!kKM)+S$dx{@yn{(8Lq6=<^_egM$&odB9sv(rD+w|4Zm zg}rCDtxrYG-}z(@@x0iNwbX<3b)4~O+%a%K&){ULuNxJ_e9}>+h}2&h)yIJH#l&L8TN*P zAq)*e=nnIF9g|aat}53i$gS<61@!yCKLA~>R?wUpUQy*KcHRf8^^W=7Y`Ao1eUjB* zc1YlQoDpZS(%&E>8b83*%~~tm$(|8x1fwCvCcYU5>!kSJ9C7OZ@|a((09_3%2eceF zg64E&KhF}iEt8&KzN8K#1~yjdWJ}M(A&@wP>|c zC+@hZlUnPlm1xycr4p;Pl)u&g?>pz7yaXBA1K+#f8@bCEr0Pv4_ak>rK*aqUg3Mjm&-PcCvhUXXoZ`G5By`G~oF7DY%r?Zaw*O%lUDT zn;-q!VxL4FkEyoU^Ko-|K$**f`f(%UzLxf`EZEDhAe5^a>ol4!7F}Xy17y2*l|*-A z>WPy040*hW@M)cgRX*~T}O$2*Z?TvU5U9NFGy;b?dv}e=^ktWk4E&r?GuMz%a{Ja4EXP_N${0}(S z^53xD^8La8b?1NH+(nCJ0WjLTj#PWm#+2$v)oo}@JINcsU)4ceUKbCRWr z1KqW%_35_w6P@pC%=>${c%SaSvsG06Qi-A+HD`Y0VjVqBqchk`U8H@3)vK?S!}|M~ z(h@qhag43s3ix;H_U+*J0uKVNejC80)Q9?>ueR7nqK9+UBTnJn_+4hfUY6kS*sb(=m;$N%ck-B{6njwh#MVVNYs){!BOpm0|2}EFDHh|UUxd=1- z6tg4`WkIYG!QYhj2FrKjdAV^l3;Z(RYQXWm8C*&>)W@H`h25-XF!O2VtP>Y3w7P`& z8vm8JS{wg)#9r*X&$M}Wt-TC<1*P12{dSS}W#I^HsPqtLZa*U`MNa1?-3UnzkGgMraK_!Z5dA?qv^zS2>TpyIb zTY;B>z7s5XQ_EwbZ9m%%Q_jz|!#waafU^MC4yDU%J1h?EXJdjb?Ps*Zj1$?R@od6c zb|Ka>)tvu=`X*26dR8y*#qKM{Ean zynq}X-}-Ku8T9760&{B|v=TeBJjvP<1(Sy0C~(10WaBs^MVe-&zSc(=xmepFpN`z% zG~x-QaUz>k0CR|4gPtI=U$8xqe{OnXtMNo4RHfxvTGzEkL*F7|UnF1(pxt^9b;1zzKlk^GD(L&fmse z9iNND)pFdt84D%TN_oTaJjW{Cj%7npUuN1Kn1qWGX=~tVbVoF&kG1sM!ut#TKZ3st zybn0~{|vu(blo*ae?gNYpQ)=S`WwRyjdG;dT-*!l(3NAN#mjULCYE(JmHLPD8!pV% ze=_)NU>@M;-x7Y`8rqk}Y+)~Gl6;%vo0c5NdMqQoCHjx}@~CQw-k_IbAYZQ^OnDa< zkC5ZxYf!-IU`UcRv_yJDM)Cj*w^@B!X;6?+W$83N=mYfOs#>2J2_&J+bTJQ|tFWWX za*!W&G233*UA1#m zh}RnFl}tu@$IEr7P$C->7Bd>hlJ?zI7VSYt7j+~!f zr?YgQX8+~jn}}-mOTU3yyS@YiZKPhhg8vm{i(zD?5oxq20yZn3PbbUDkX3ms1a&7` zzFMK{+UH^LCxK@H$JbhLDckKA>tEK%TBfsKZo-pni+%~|R=}>Ky9@YOU?0HIJse!h zSD`=Mq%cm}wFg5X=l{`38LhyD=&Ph_?$w;dQ7`#6hbdfrWbON0`JEnXYiEb`hmPap zVelt`X935@^Waik{hi;w0k-z(|MAX_y-&YtBALx4noXJPC-eGNvkgAxz=y1VZ-ajVbO4Ue z3Ck^?*>GRm9_#*`-Ga{%vIcde?oSwT@S1#)2S3pNE%WZhzI~IzN1?Ai+|M#-b|G-B zNMFe)E-ulZM05(vKqi_l+>K+YOZ9)maVv;dlPPG4z zY&)!>o^G711MdL-1-N$Dza{LiP+z@v3%gpVhsbqSN92R(#)#^Oyh+kyS%^PMcwZ!k zVZ$Gf0E`n&weAtk@%gvs$Ku4`NMizFS8KK&P`oEMEo82*)(C&G9%{Wo&jlI|nR zktr=_T0UwnxAhf1MuQ&&oB%jJo)5ow@`bxPK3wLC7L{Et@uQV9xSE)>2>bb9eutb&`Q?eJ>`lheQ>6fa(2LOWrDciRXurChP zjMZMe+ViW;-!z8zozvyMr-7dd{Omj37x`i<_iYaEyM}wzLrMDQ6Yzfln*rB9-+)VT zao{fhf$N_dLH3!|v}jPR@q4h&oHivddDYhOPqy`#MQC(v`XP zItlzt;4Hw=KM!1r%hR#ta|-#vd2U+IYKcNxNJJ9Njl%jO6xQfOW9UR%Rhbumo_xIk zho6p$WaYloFS2~Bg^tq;ZUp}l*bF#6z6O`#_~=|GPHmc1TPxW@YF(3z7uTn~ac4eB zcxXHgRag9a=mOpZ@^8xVJ|un%>wi^_?kw!~I?V{}ud8U^C$8e+@3h<;VP1{||N+!9krSLHhkH zBIQ-Pimg-0c4_w~$lVJ__n>{?f4iSLf<~0{A?j32^imgG>3AT`kw{$Bg+iS0KL$Pp9Nm9{OWAhb-fvU=E_r*~mfLza{5(hhSnv~oIe?=-4_wOj>b>jt zsCQF~rMsH@x_Z9~{yy*#;OKq~E@j*G{x;R`Qt#%=EdBZwIr=AqF9wzZj{fQ3QnoYC z7A;=5{r55BZu7 zUB}m%;1>bQ0ms*M;8N0Iz5ur_EHo}o!xo)N8l0uIP2$5PTV#$7Un=`#KYJ{WDj6W= zeXLLShLjPdpQlUw5=nWo#AO3!UA)4!&wA)MK4RC9_X#Ki93R8MzYiaVBg4qWD&%5? z^2QXvgfPNU7!e)u^SCB-Iw|?;O!{dIg_fVC(91$lo>wct?*M)WIDXy%m(qS)_w{mH z?J@(~;(TNEoj#Nmvj=d#ESal%m@4)GT)KR;n4Dyo93rfuhA)nw7Ax;ww)7o6NQcb;fA%bVU( z3oxJI^yuBB#-K?oK*2GFUC;n=TsfG)ri;YoIeWFGzmoeq`F9QYAAvUkM}IxI6es^~ zeHV8liT5v>4ZYM8C$BqqgM+qHdo~{-9L;SQL;Ml4Z`ui)CK26m| z2b`^fsW?1IPQYCY7M5QieRZaPjZfA-eP2xd)W1|I^1w~z*OM99yj&dd38i>g1>>9~ zk-gQ9v-B@>{aOb;4wwMAew_?1Wy5{8Kbu1R>$dxqBwn&&vH$snb=A3@EV9zH|A>(3 zat}7MI7$yyzcLQ~IMeTpEwik1|B+r9j(_Mn|B&avUj|+U9AEE(OWD#7VcUGox2Xgg zk31v}Gfiys2Z%06mq|kPQT{GgC(<0!&)$%u-vB-lAfU(4L>~HgiDVdABDwnEb9+I+j^V>NWL(2?iI8{iv(F963! z$&KCl*ztNeW1iuoS&jZFDMYH}#b&pT{ZvNl{TeOqV4fdU0?}$#Nv-fXWZfR7$zv#H z_-3VlqDPo1)%F|9=XCgReEtl4IdCQ5_`DljifgYO^NBC8nNa1;>JKLScGmEB1(^pT z(w8Gx8Dgnrh3t{9S~0V_B$+p-c33Fvfx92;eg}s5b*EEpJ*IRhdv|E z->iB5o-Yy2-I=T23Ug!KYJ{KFotD2==x1R-`ne7KIp9UW@%I{dSN?W9-kR{sguhJF zQuF-1T6xX>09^R#ze)Z+j)RupTKd^v<>uiy@PmNE07ri&xRmcc4`-d+wD?pr6VEXx zbeNfVr-WHc0}Z3^%2>%N?FLi8q zj`FtWADSv7khH0{i4eq}?>t{T`99WX#mMJA6rO5%KoQyFb1-zAOcrq@DLl@zg$MaZ z5vUbJwYaDzQ$dnovt$`wQw2r)M>4(5BdJL8C{vj|^dAEbH?MY@y|s7S`ZU9@TjzcW zz7n_-aP_$lyleY9y}_3CG2U&1YR!elC6N5z>KjxR8}xPB8#0DCcIn{BxBmkx7L5akUwiDT&au}Nq%)$Ue<(Um78e$z}Y!FA;Sc^#A3XtevO%(@d_;eB8u)=j$;C zVU2o(Y@X>+Br1tv1CIHPkyx}bNEDkNV%+A3eNbnob-XYZi4{V6+Tw31<*fUhpS@=Kxo)_rRsN zdD0sCRc@Ur5GEq`^l<>tu&;FE!40LR~t!KG{&cha3dveQghFzlFLZfR}K1FA>3aeAMpE&Vp`k6de>hwb3`zlnOqfTKST zT*}%{?K;sB`muHIkK8=KrEQj(0{vQo)&BB8wFH0H=5lVtTrRgCw%QM0R?AsRH|RHt zy{98HF{D&zobw4Eqr2j-Vd1J^BaJ&L&(Q)d%##9fP|_#r-Sol!;qghq3tIIS$3B%A zmQcYM9+!&4kYqQP;6PQ*#-Y^+QRj{d;8c{*>BP08T00bq1;Dolt}J<%%gA@$Nx9rQr!3+73$Ht^PlVA<2#qQ7IF=kF#FS8u)VPT zj_V95zq9OysB-o6>%=eoX5rs=p3*&~1OP{5Ia1<98AG zg}`#a@%sq4lzCxXdVLuGy)Ay(mCRZ=--b=Gg?`n>6r9BtTCLIpWFx&n-x7FV`FnJ7 ze6${lw+D@!S7P}78KKjKL9xlJ%HxI6v03{=RDXYJq`!YqCa$^fe_8R*HDjo>LL4r z^-`x*$OC|@=aS#qdhYWNyAHmVuznERs^^I_j$gdM`W_Zsq`t{l%?1D2)m(1mo%Gxv zclYjyPL>4^;eRJ4c|z9_ZYx+na&w?VOvou#$(Cv1B{HIdaf$tY@GC=!H^u0G_DJ>ghu+|u&~Nez$?L07@CO$ zlj>0FNhPM^p^z=`^D685=`-lY^dZ54ga_|jrGFxh%h4(EB$CS%(H+C^M=HKXv4@;N zrgM(4i4M^}sSb9UlD}L3V1m8lB=IHIkqYfc&!G3G1O>@Dzedi;&X{Q_vY$wPDbAi5 z%F>_Wi= zxWkF<7ZKyc_Egkd#)vQ52K`jhdnmDo9?AT!CzOlC_soMNg8nErSvs4|5TAk2GKi4j zpjeX^Q%@+B{Bj(XKB7$H;$J24lx)tjB!x^cpMz2MVb6H5XSqF0+^Qz{M?ay-KIadX zRZdDrq)?jPTTT7kbA2877r=i2*DslSZT+`zSIX5t?3csbp3<+|g?-yhpa3Wb64YCy z(I}XI@b+ed(76a;l5n`jsu?$ECO8p zt_7FU@RD73SB7y`-Rl=h-MRX-Meg$-kC30Cod9U5$>TBawdCGxtP1o@i6R(A$dr!v z;-o^I9GU8!cd<(CqpA=j87C9;4H0peJqCNyV1``R#xo_dE>l$1fc?3vm1% zvfA?7^Fzz;hUC_s6OH1v%Z937d-@5rF0I`q%VlE`Rmaks&&E-*hS!FLP z0`uVp`v-5@53fm>58tzYeuFme?y>I{nKy59OKFZr$9rETCo}xU>M{NTGG$e;Sqg|d z%dlh4^6X*5q(@FjF*V2Wcp58tV6!jj*b!xc-Yun%_TN?fVZhiGPrk8zgLJac=TH77 zA6F)V+7w%jG5*+Hf*%%gzrH-60v^$0#g}~y{(o75ZWcok@toIGvNDC7OCo^e*lEGB z&^WT-hpAXf!g|Kc3RbBUi-eev%Ge#qUzjTyNw3$veB55Eby0L*eMF#QMSCQ#xqTyYG?0NVq>=qn9fvA*sLl^PW1JiXkRV)Q6IoH(4DL z8y#K`z_apqDpudg@A#krejBMDRDVzOeO|f$f{sj#-xt>OP8IwTKmSU$HNldwS$0mo z%#^D3$Ft8V;(VB5{h{*r&jfGjs{G7X8o6vdPqIoYE!%?^c!Cx2EUV2Nzr7rRP_jKehN_M|Iw#5n#k~hh2CP{sDtl1p>%I=g7 zGjEodSBw8knKv9A$gXO*-9l}QdDj#iO+zQ~t)%tE0kx3F433q!NxP5ZI$1rAv6ZAB z^2Eu#n3E;QT7hgO(iKL@UdcMs`XX->0~N+7^i{Z;o0$`d@`0w3{J z2fJ|4=016Q@TaT;v7QO;6!amUP_FsWw7HTB#9S+B=kWzARqSLl-Z@+}R!xhar~MI{ z^F_<$FjOK*|1P`W4`e{EQ<+;L7~4uljffX zx>lo;g<_3+Ncjux9BSIr@;B*`+_?E6__@G^fa7lsxRll5{(MJzATxjVGl?_&RyEOh z|2=A*03WhZ(pM;k!ke6ri*lCmb+uRgN4)yz7!KAW*>p(Oiwd^*M+2}AI4;17nc#)fbmcr>?vuLd6i3j0PH`giMcw#oGr zY8CzIr(=J+MvQQEKrzqXll7tbY9e{W+!%ru^WrMeXR z*ap(qcx#J>@o?%B?@3^Qmgt>&Iyz?`8*lkq3tgu#`V{;dz<)f)*Ad`STs-~={&;QNn`jAocGnv!H~4d z#0ra8QaDVB5P+a8?Y~6STr^!7i^lyL5&kii=~$c$o@OMbObV5MX;~GHMFYaV?F8Md z)J#2C?M5tc=X%gO$<}i<^>Fok5BzH&(w3{|RB$Qj=WPAjLpwnC@tSM@ML(X=)V=xf z{=CsQ-k%>^Cs0mPR_$skuAo%^nYj1c;z4ZD*r*I)pH_jyvJVSr1*3+{gb8-j9Mr@P zj(-GRM(a2jcpp6ul^TYh1Ua927WdFS%Ic`SXgcMTGbv&Skq6SXO1Ek335WPkD~V<% z^g~S$14ze#Vg0F}n=kK4U7tYT0l4vZ0JtgPzOO#a-?y#$+vl|$ScGgl%cSFM)t}=g z&z@qVy{xcXi!ZoH3tW@%zAT>DMGVUDFnErw8ucHI)cu@_R-o=g>r-5lND|vb>dyQi zkLnK%>SE=ls+f$Z)8QnsVIn@DB0S*B5$Sj;qzUb=##YjDsIBix>eE1lL_T>5eC(4^ zZy&(bH}#aQZ&SF>_#%vZ-fn&OU4&DJk>gvUXGNAv*xl2F-Ep~7naeugT$bAp_cd?E zo7cm-;QM#M@3B99$zEoeZ_c*2US{t(Oyc@B=#P4M4`og^&tx)vy(+@%NL=!I_RAyb zQxBR|Cnu#2ijLG{6X;Y_P*jL~qwi2(lj?YX5`HHuMP45g2?`ERkn=c!@&mX>72fag zhgIw`ho7(HNgqg#tC4;I&+QaGfSn(t7;5sUpHx|bTVTK@0x`iat&WX0g2G6VtO$gS zM~}T;1#497DjB9COAR%$)KkjesPxH*EYZ(N>!{Dr7X+#Eg1oy`>Q$9@zDned>+_nY z+5TKge>H~v*$Vy`@D$+s^G$FmQ^Gi%)!Xo&GvgL}u(_HCk1Sg}e9*f-VHK`l*vlRE z60>^OE92fxr9VWadXY{JKuV6@iG(Ao>iNq5t5gE5WwUQgj)src<1OEHPjmh`pU60z z3Vs^U3^=~80hcm8oOg{o(7PDEMLsmVcMeFBu`V;X8wXM-EQL%Fu+ z-?sK#$gP)#ZxNtQa8G+45f|D=#OwC*o^Ku)H)wO|Wgi=N;#pBj+Y0Xo$4_Qlr5SE$ z^Ny!4?$!S1D&ZITqO4~zq&wcy{=J&TgOKVf0`IS+R)u`*wVq__)dt_LKRyKi68JyB z)ob9hwqAAN`tS1NY-?SxezX%gj-rV{#HoO1iK=j|dd+{utoxgy-lb)7=wq>7gt(yl z?OM6WI3ym6wrd1E@k2Nadj1fNc1B#HII-Yit&Z^*sax>CkQ&*NU10fdhQBNy$#}XB z{9&LCaQwdsF6FDxuh!)^>drqY5|76V%m-Zu}e$ehF|n;P|Xr zWBJ_li5)k2-(_EPq-DEv1T{x5v?p5p%>PD?x%j{ybMeQRdH0z8?h1|udyhNnsjkoQjSiOUL3r%?=%!( z#U&%~X`RTEYA?Pym2<&@olcdWtjr7U#gn_2-ENgLB>l&vordXjpP;9&{GEeT{((Hn z#bTKOWSfb#pY}Z8_gDLpo_?d|&Oc}=SBxr>Pxn;)ny-h4DxZ$4EdQI}&yB0n7dQh1 z7z{Z6M}tdQ8`?EWZr$3rva4km2a|S1ZY-tR)fo~mhpIw*n=1FEYtQu06j6_8-lvTA zsqyEQk7npNKCT778+ZV4e0&Ptm5*b$!v|>sXNxq~r(J&(S*KMy;*z;cUFWpn%c>5? zXQ>AYkkeQqO4uk%#BIHdoj~$?pfe)v3pyi?`g=;{Ggc6D;QNih-`%ue(=}oLznJ6u zXz(8crvr}f)!<$E-d_8OE6l7D9QU~H{R!7S&VX5AFP8`AUEw$80d!y7d%kLtzmtEC zV!M%%ODQ_YSvtiIBV(@xeVHF6v^uZo@JrKs_QJ!U&?HVGa&1|l4yWczWO-WkOIx4# zOSyA_tHDPC^?<9-0pL>Fp0(p(X&7(Y{W)aEgB#E&R>=J%E|oFysNA66*IrAHeX%$Y z1YMyHEWx()wqIF3--Hi0uRaI=FQ8w^@i_`y%Dtgnaq(9D zWNm*sv4U*V&nK31jMxVK?}YbikI91Z^NGckV+$*W+Iu1p0bsGfKG)`ty)V6%m= z3t!(Y886yaT0WcM!|{0&_}#z*fNRgpTFYn019sebVLtk;jk~ZtyRiFa$|T3uk{cW2 zYMysa&&jlB$aY4bAWceYg&|R$*MlZD?@{%mvdD(j*#3{0Vs`BqPxbDM_+R*9D{GRa z&X%>mwe_4sJ?i*K#`D?WR{$#jSI?KhrK}9k&)vFyYrYvVZX{#%Tj}2*JM_7BOa5@+ zz1j0{Dkz!1XHcI3h@=_Tg=D@NHtD_?TCnaVCq~Ax*o99CVfJsnzrR`ET7GBwt@uOk z`8E=KFJL_2_-zE2;+}6?UzZokioB@yKu$hkUG}H{O0;n+L~+@sy~}%LbYGs_MJRnd z??G$fUVFEt-@^T!e&=@Z-vRf9GbdC1M9fEUuqmUD5~E!?qsORbyyp8Ye>H#1&C>?(qkv-p$KNU7 zQoaiFzXS@23)vH}$C5CX(TkU%<_BvMYjXd+YFgFKBVUuotpRzuf~lUKlB1zrz%k#VwpKh(L4X3U$vL{d+Ur)9=_@AL}vUZx)D2kreU zUd!EoD0m$(3Xrnn`!AV4XVy}FIE}kc^FHV$(K4dnv5?>%O(C6S+_QrB(*L)B-wiwf zxb}S#T*{W`J$7&3{fIR?q$%f&?`IE213w0cad;t0)x6OTzkfttKMH_#qP-0)8&|-gzn$K%h1K1e^n2@n2lVJ<{ zJ!alC9I;L%@L7uKBszhVZ}7n2CN=M_YzYt|rax@?T?Id`-=7D63HU?Eujl$>H2B`YM8LJjk>FCM+;5*tPlwm;{ZTWxap8j5 zT~j$U-LDp?rt$^S92=F_p?1g5vO@0}G0^~fu?H;RBs4qsH3vGrXEy)5r#d^`vK z2jF$U@$)gb6t^C4%g@>Jvxr>82OC#oKYO3}9~HpP8X|#k{HWo%k*}+fDtn0gl`(b| zc+HPmK5E{`wfo-S2LOivQl#CtZy%}|EF*MKZAf}wC~GJm=v@iX0#uU5%^*&whPfdx zYeTv#p^@di)c;xVzX0z8uKxN>%Yzrnr;XvcXj|`(#)Y#^oGTL(Vf#5NWnU99Qg(ll zvOm>#1l}EbAH7GkkKRXBC-=v;x+}*iCgO8qDV6bK;);F}p7W>|5WEKHMUiCGxb`=< z*>;)&KW==U3VuFtG2r-p3|xxy+ueSDnM|+DD)Bw`>((jUk;;G`aC)`&UZwE@w%7wv z2>ZGu$vJ8z1$w7)9~b&c%vOAy%w(`-X$~#scu4wmnKsre^k`35e&cWD#`_@fI$#vw z_#Fc-#XSeNE}yvmH7QiWg+9|b9zXg|$+mS~q#tfbP#@{<6yajZla~H6?(f#WJHX!q zJ^~#5-QVs`f9ucTZ_#gDAc6W8j}iXpuVI zA0rR$YPu3@mK?QK8L7Zaq%t2NtKTS;ewBW$-Z{||zsxLtE&Y+WYH{Jr#}O`;CRVz* za%j+-op^@1)Ym-79#j79W-BK3Z+<4MKlO9GpZl7w7UwX_R zrcc%VRUe!44aZR%*ZQ2L+roX_yjcmp8h8|NbUy)?vMRLmj0yd;y3g|ymYm!qD;?DP zwfZkaZ}3&CUqCWW;UVTdk0-(y7CKT-=~H<0^wLeda(+<{eW@xfDdw!DASg+@*ggD7 zR&cTdT429NaH)#-ldu%A6;RSISiUE{lk2}@z-Iy{0*>$b;8NW4+dW6S^Sxx`2w2WE z9lbzi%wq3j8f!0^F%3kBn;Fv*(p$~_Tsy4=e-HQwaP)ro7fbJp(BJvkqOJL{Nju4i zG3``(TjYjP)mr*NuNzq2KGhHPEHdevMwDRX_SWqViwq+t$sz}f$HX@~4A|r!Q^7o&s zU4wf0i;vYF!I<!x<2&K_e>c~kyMmt& zTnxDORqJf~z8J=fEc=s{1G@KT&EUg~Ln(oorz|lcSp8P{i|+E(Du1DQeMOneIP-dt zdEL*vc90C7Up;TXzsbJ4)n4k&SN-o|ICtn93%xUU*E>bCIR8}@aLN-_V;#L1oi=`P zHKqE9ibLb9P!%z~e~N~wV4*u8II!e^*yut+xGU6bTD&lxB95;@{Z5Sw_AcyGfG$^V zLUSF+L0%O@>1)QHp2CJvg4i;#{18-aR=~BK<4)Et?OMy=XE|q9rOnr~#*OiQQ^h5YpSM~`ixMqUC`E+B?PxL!YVSP2wh`V*452MM;H?d33r=uE4 z@SB0#05?7!05{`k2lBO>Ut4?Pb%=z$A+p^kUiM#>pZNQ^@!A`F7hre5@pC1(l&`}1 zzV*1vS( zx;o`ok)WH^cV}b|`E5VEZ8gj7LArXlc-mE$2SjUB#{y1AuP#iATUrgLc5G7WV1Fky zST*4;nVXkQn`}KhsE3=E>A&)f2l@l9p5wu#IJtD6F#piD*0qCXEXA9S$w`fWW=*Am zSV}wCt@E56OvP*xzDwvjPY&t2SFcDn7{Z zu{-$wz#)L+V=lOq4Pl;vt;Y@K)_)vLI{8?uersE*k8P=qng?xP+UW?o`9xOQKInNl z>Ct+3t{W{?I`x@Nvw;|l0#<%wT&+&KoT+Z^G zd!i&}=(j5QN$ReoT9v$8nM<{K{jGiTs=drJpFJ9w3yD4D=dJdy7MVByvcFqk-jv>z z#9d6kQ{(l>$CMKbkE&^r11GZn++IaZv< z(379kn4j>KE*^l1aSR`}D?Jti?&&HMFOD8b_$a$55^Qs%QzTm$u@|F(R73`XL|6omRGs`AcK z`ETg7M6{n0IV^g=B2iLo*CZjm48uEB^{E5WD9&f-{mZMWCJikW?*aA)>9lmIxALRh zczgo<1K{s~>+kg6Y=1Y0``@Om?td4By)4O){_ND04Yio6F3*n8W|n zmj>RYdN3QHlISibLVN+QiTGTZE+uM|c=_SgXL7&Xrv0-xDVnD4t<6qYxJEwCSpMgP z{K>pN9sCO57Qpd8d%fk~<=1Ww{Rq0x>o8|mzxL>mby3wG-8{)$?hV%AQx(5ZZP2$( z`b78MpzjPm!Q_WS%BbNQhhmKFUH+$Pu2Z#LKltDA3p57m@c+4b*Q!@k@3ksjkN@NU z@UQB6mC5V!hr2KWj@4Ib{Z2};R=%(s2L`P0gG_vG7r&(4ZTqgF{oMZX6Yx#ISAc6@ z@9(yK-Tr-B{>PmeJ-R8a7NfI@El4&Md-1zS_6KmZ;HXGX&uiSn(x1fr9sN1r3xGv{ zqyJ-YDUQC=AK3h#ChutXu6CJBG7WP{48Yl!9$A(>Z#R)!Sg6}Wx^3Lo(R~;EQ{bO~ zqx&Velx3kEdtUgw=*&C1b*k9nuC&@|qn3_8PTo&|Bz~MjUjzN@p0?f%ALr;#2R|7& z1#tA2fJ<@p-d4L?&25)P&rJUzwvyPiPGUL?e4ckGjgIwz(iYNhij~;&vJIBrD(>g%`waM>fVTig?=Rp|ww?F18@09SIxD75 zeFecNem%n+@Q9_VH)Oqrah7h)KXUy%7W`n~aKO=>4lZTu{akzUjHP?eU5pxYF)^mn z!{v?hu?rLfF-!wrvS0J2a|B*=&j{L8u}F?2M?|N0JN+H(Wy2bAby1$NzQUQrx=KU7y>Hf7^DG=PsHnweXu} z^DsICD5eHqDerZfPrRQbOot?5nszsmzaAQAE8G|7OA?9()+vzK z{`CqUuAMtAJ*)P&e73+xeaPo3@IL`>1CGy*&n%zyp}$7Do16!qC(k&34(Hwvs$IPB z)UM;LUwhD+S{JDH;IoLi3^A`)M9t+zwT?mlrGBy8yAT^xxh_KU*H8DxadH?crJ=>T z;0V8WGF6;rLpKBkogO|aiuR;Bn4HA-kM~7r{D?P7p|OvvuY+q)E#T0v zNBalsA-Es#aVlDn^oMX%chE16B+kw-%BOiLbg@M|U^T7^qPbb1-&9;ULp52YYvMss zO)5}m4?p1y?bI4nDE!eGDcl76$)-Z$QIC$Dm?AI+-3}XQK0zIMuw3oCKJqRfa{2c6 z=c?cuT{DnzyqoxI7L=7A8XHy+>pir$U!IEfLG>a3!~^VhrJs!G3ybj4lO1F8WZPd2 zSP5Kz9S431a5>=m>q~GcSBB@4cF$|pwZCR|SsZW${E2Y^9A;i0j+o0M);sVMd-5HYHlmFt$8gfST&AWe47u>I9+hOjOz~dz72kE=OT^xLBxAn4P~Ltl8j{! zg4?sCrY#RL=xvFbOG}0FTEny$|qSunSHR%j#f~EFQ=@kIjKm zcr<-ZmI?Zs$ZTrT%h!#)bN%0jZ`5A?*&LEv7jM#fQj6>CE_#QZdPh_+?OUXW!1^H zUDi`?H-6M6^5X+(z_rU@a4F599Mut?`}ysD6Q6ApVALGB+W!W#<|f_dqbnIE=B1=~ zX{vtyooKMcrCqFqf5Bu=)ebN$bu6&_EQMYj^kjW%0dECv0USTO{m1fC@rIp;9UHfh z?>e9Jix$snl5ScXy+89xRIQCpdIe?3CjFZdvIxr&iFGL02%C>yDxsCSu&UrmrTlm) zE(2BAea==$eQ$~{ak{vuTJK(UDXnu+TPsVYCB5`j-+(?j6qc}Pc+2<%t1L|lE z;&#x$ft(!ror!Re(4aN;lMQBDq7#BCEKN(R-VFTy0s+bng*q+Fb7u zG>W^lB)j3e1CTvQIA21lgJ4{Wo~UN5lM^;x6GK$eHMkF+fis(P)k*I8(3B+RzOKH3$od2}D^KZW#{5s%9!1c@R;8G@q>-4wwM~8)m(7z;T1*MUn} z_JN&G^TKQAdYGfX@6uVvFIj8?FFN#P(T!Slu&S8LyY}*gyuhuo-jEYnH*jH%HFmvMOSO%Q}mg2FPki` zMVs}zaqqB0SO&F{<6@6fg~ZMerYVZ_;E12ZT48+74#Vf{AbienP9X8_$cP{1Sli^- zL_AicG6lvkD_%t`uhitKh`-S!JDZ}Cx-(st*Z2!tzxD9%46w`D*R%*+>hZLh%S1Z>@}93 zCg`Q1C*$vQ@NXAuQjAI$-|d6tj{d)`M^TJweOkWQk;CcMf+|^PaLJ0 z()O5}7)0lIucg1-lR7}AvXJSRM-)16D#Igh*7 z(+M}dAlb`%ACb5~OBKAjkWL+LNNyY*3O*G$9&q(+0++IlakOPUNk_Vvlk8=G=VwRb z4tgd~2=U)@HUvFeiAqPjSv(H|h`IB1w!W*OT=dDMRw%eziyftnYH)rjU;Y@uB9ujN_T$3xLIdNz@t{-;3(xRD@S-6Fe`y6bJbtc9NA=RNSxfG+{Z57~PR zKhr}yVe50<E_2*YZ8!%1L@(j%n|i{S|XoCmq%1f z9;!#-FQfIS!XTMURrYQgc|c*=h=OtDBBYbVqAwENemq5<)C3$Hsb1B%{O!rX z1ihoi^%uY7n{7QC7?rNQj{=_!%mZ9KTfwE2g!_uu!aS?t{FC`Me@Rog&d}<8+9Q7t z)vC{I}0Y8pkj`;StjaLaceyig9T!cZ|6s^(_#7C&pvia&G{-N= z|0brI5 zJRqI73#NS$^H4bDrR3Oo!mxNfNUNX`Nh`)TdMA0j`+8sok#B#E_5dLP3 za@aUZ$=Z15&vG2q&FDY%ra$9Z+5 zV`HY$jfE>~W!tZg^VQt=*$4awz%;)4>!grpYnrzd}Mu4BndvVU26vX0%TJ%a| z^lVHvRVX~O2^>++)eElCu?LVeJ^b7TF_t!IJl5oOyx5dPnM?4?eYQScJXfD`@Cm>H zfUD0n;8IqGeqXCXy_lQ7_Ry{_^S4bO^0-!Q`WW;2hCOuQ=l0Nrq2{ys=C$|ZaJZSg z&ECq`9^y9<-P7-*c308lZDhA3Wm^i#u#Xy<(vf~;vg^plxxY^jO-boKK~U2>T83u~ zPo`)(z%kb5^pdf@Sq>Vh43j3MAGGysrylOP{U7kJq+SVIHyQU^+9x~ZgTumoMyL97 zXYVV$Ggg;kEtcqp@cxsymm7yuz-I!p0oRUA;8NT;+(JLsMcx?DX4HX+=Y5y ziBY3gKeZXx8XmIsSk8n8ATT+OAAc`bO{aM-TB zm;GIM#P&zo&lI!$mEPvCX@A~yT@C$%TLY`#)xp;tY$>-hp zI)29d@e<Z*uR>`3|o0V;*ZnXL}TaOIh}7+dtcH5BzgF zNoHEq{N-kTB9?FP`|0U2Jx?SLITw;3+xkx7{#o8ie=Gq%7q}2`x974dsC4PUVRGyxoaJw$(htFZ2D6w(H zu9ei-3Dl+~h$;y{L`@POVGBOlaSh*VZ2PT%uPl5?``rV+7Wfn3`2G}JiW|@0(hnKF zjqNNqoZGQ>7@mJ+Fa6A$0$YLeBiI!q? z`AG07z_Eao9gpXbuWbzHCxg!6>`f2pt>oUWAJ>4t3cLZh_E-ll#f|6fwnx|D%p50e zl^M@>a6VHoK%XvS={#izbovEb-D23rox{ zDIY2C)nKT`1rrwTRlazdh2=%d$13Q!c6b^5UEr^P&(}$bk+#kbno<7+OXOroD%i;VF#fD3QA-#r| zEx*&@CksC^j!y?)0bCC_ejfmr;^gi(Lp??J`DbmOT?g_9b_DNZMlc&xCSqX6G0(P3 zqxHIsbg1H(&=(t1zf2Vl7$%tLMQ`U6sSJdPb-+Zf2V zqrwi?<@S)?9PaJYxo4I-NW1?7yaV{6 z3mw~nJRhS8RH3bUD2YVloW@^jYGN5oi|a}ejb zhZ*Z}NWZ4U-e2hN3ce4pAK>U86@Ks9b6)pxEJo*A3Q%1f zsQRL2g2Y!6luudv2iv}_+}DklN5G#0UIZN7c5o^2@Eo0`-SYBu*Q3;)xMcqE#`U|d z8m-cq!(;>UltRAktJCphFc|H#_DfWWtUA9`WPLP(pt*nRtCpX-(p*0r2z~-E7jXPs z1TLjvjg>2=zt~Og?xxo<{7Aqf37gt%rlx!JI!)fDN4N-cZ{z5Wuy?WvN4r&Fzv+WF z(m=IB1!o3q+ik+bhkbvFZs2_4YF*IjIPkjVw;g`mzGO3aaaqhO2OPhzms@_vd}R6D zC%$j?eu)Gqrs^o%*x!gbgt`gz)fl1z%{*Q>!8pS%9W@FY9j#309 z;uA&gUM11l#HPKY((6#`GX+h4-IN{ zq?&^aFn5zYHXvs5a6Q?-$Jftuq^TaF%Etu_8PzY6+$}N5e5dVqljOTYgGRn1YY?X` zADtPU8X$pyy^POQKNN}hG-CwD5Q)orBDps{YyAj)AE+CM)!ECRmC_~Cg^amXH2*Rc z;IOEw3diB3wLC)LCyAvN5$%<`=^(v3o20GY#PAx;e?kQh*_-4MY>}6qL=FhY(jfg> z1co^E=2cj#;N-yEH!nqOg$JqfzpCJUZc(vL1?YXnOo|c+K>TI{BboR}F58K77y-CZ z5*0{DoBUpmnTf;*Rv@ZFp*WIJ|9eF)#HIRZ*`U2H@mEVR0$!t|MB{B#!TDO9uH=2v zyic5?)x8lme|hQDAO*KSSB3LQ!C!cpR#)p1e)EVbeL+?HT$RtS`b?EysnvUa&#NWV ze-HCVBshLnW%*#E>chQC3NF*)PHE=P=5YR3*zqar&Yj?^fkyy0e%r$D-MZth;qx>;y=Wb$pxpflwnT{_9=5*Q>pF zwdYr}|NB2%k2ziL|5NbufC~Xvk4wR&IJw2G-`|Q4sQuxBnXpvecp6^2@$0D#;7wqH znUnEWh4j{PKeujv2)-WpB%~qrasJV+y|#!42&qi-;?q2T8oy6}6|R3(x%=)1-Uu84 zxOz+hm$Kt}%$kpf=5}ggZsV;A>9%rTSDy#K9|9f?X?>UaIBI)(@jX3%Pp>1quSYfr zci%qX1A(0ZSD#_v->p7o!;y1NYrIiO2l03zR zj_#e{Qd~bdd1cFf+Jb6}ddTh%qq0AYzYlf5JC!t_c4Dpi+S1>|{hi!b)HCMw2KoVx z{s3?(+qBzsYEC6)!o)00pOp)l_yvRk?-+KZCSarS8%wu|`)0YX%;yWiuK|7uIJ!51 zOL6-;HxD}H;cj$|ia67(7D;Yb&gpJeMCjm3?*raRgliC?<4Tc`@H)7^YxiU?o`paU zz|rpmE@jK{yEXbQR$^J_791aVmuyC@sFb@_aBYeX84-*dW z+vAWqBHi+{6na_c2|w3^{~EXhaQxg4F6DdiBg~i#5`OwJ1vh1I!>0C3Nd@^cB~5}< zS77d2r!5~|pBx`G;3I%t0msLo;NP2%uw6n{E)rI%VFeTBGV+j%t+1#07dDSHlBA=O z=S4@z*9z!nAuR3lDEM>0i-6g5;KTJKPy%nkyrhbg?XG9-` z$vch&21~-!Z*|yl4Zdx!x@?ZGDd01K*?{BgGVt%sSJ+-5YgY?vV`1%W?cHqJs|NzQ z{NtoV^RG+0*#Rc3UaS4F%(uYuxfVX$`t~pIO~6+nZ}Pm@Qs21UdDgjIs)4H-?-5nw ztqtka_s!9n20jxw5s>n|=}cU(1*JA9g(Yh1wTgRZ`AEjatKfeI)&Z{l{|+u?NAqUp z+}Yb(MAqPY&}9|D-XGGh>zAW{B=}TdCgA8V2LFEax3!3nIv*A|4st82h=-lewnrQE zvJjN^cprQN@EPFv`3n5|@w1IZ%p1?Rj%6FOHxp}t5)V_{|gi;sMY3@SjX7FDFzxki&d}|SD6-v`X zIvwFXrQM?gVqPh*6X4o?B)Al}FL2i_*T-;URoU&XF3L=wos&tgMJ@!quXIM#Hs#y)Xn~GvkNd!%1fB&PAJ2n-Z$3Jgw9M9I^r?Qo&ah@LT@a4@ znj9Yu;0FPR0*;R(!M`^jU6-^>+sQI6fAGOZi@WbXmG~#7Vly^3etzH$K*b{|opJ;Q072xRf2w+pasS@4ker3i+6{ zbB>Qi;LX4}fa7Bs`2WJkcU?jnifwzWg^p{FP2j{SdkMhtkq`dA@bO)jkoJ&|DbR6z zoDJRrTnRWnR)GI6e0q$y+Dqa8YqkN8lYcR(fJ_~-@xzwq&0mymRcUx83K1Rcjm$*`DL4b%WqM80!+-=}Z3_L0z1hr^6mP_&w*k{U+xn#KkC{tOoV%bFhw-Bp z&Rslf;o)+VHNx*@CS}j#@u<~@m_v*FQ(Tyk@4Q;iSf3%yrz)Onl5zS2mcWG z`}d%;_mUG&oV9S4gi2OHqRLy5s1gz_;r;7I#yayIOaz|_91pnuXa$$DIJ8I43-fz! zSs&9c(jRTX1F^>g)fQY7F_%7%<9v8dWO>TFIWd_)zXS=G+laR*&g!G^&d>NalVMF4 zJ3i%*QL|4!^=!a)j!npXJqW>AkG{<3VX2+EsVEds1{;`s%##KHX#2nitAjw<_!wAzZ-2O!WCQ2e=!+P^z%lAt7a(q7t{x@I);P@W9i{-l| z^s{UT{a&|hcQMdRShzrrJm}ZvzZH4h=SAg-B`b(bk zzoH-|H>Hn@*a)39c(Eqq9U-pqd|iwCTQ7Y1b@X7o0(TZKp>#T^;QTayXsoy-TAauu zG&bmI66nqJf2PTQr`Bk7zZlBX@o|!ZECXppK@B90&6TbI6$>p5qndQv#%rnpPGO+n| z4mA0-{j(61K4_h(q&u+gD-Gb%x+wOo5!vlUE95vxT)m^u8&TULJ^1KN@E6*fnI5WjXg|38dwvX{8SrsfCp8OueE5`_=OTp38{Hx4xNtbpHKewX^Z9QrzN6R`3; z3$0Ud9%+4G$Ff&>j>e*f!YQbI1D{2;(`%$$9`cxPOdyVG5kr^!6sv*wFv|4v<#@ZF z<8xdzJ3p3_t$mrirZ|u?(sU2b{Aotc__WkGJQ4bEa3rvDo&hb%`u%(}h@Z4qId#SI z=1MibXR2|nsm04Y=M_%&a6ENPIExtS{WxuYy4bH=jPpnr8-FRl?FSpVw!*iN-=+M1 z4*eVOHn4Ji3N6X5^Q`^hzU4YzO0dQKU0{*)01bMBcbRgwV|hK0{%W-6M^6!N7%~Z{ zU=N8SP`X;3_UT5h(t}gwwH*3VumM=P?uC|Q^_bn0Yd)<%@Q2py&e-C*&F&vueK}u$ zj^Cms{lIfRN74en7w!#CLR+30UaevU@kBX?(Q-VF&C9s_J>@@=^n|;8hLL+0a@q16 zJU!w}0F!`~`wnPHOIyr)8V}|b`z}v;W92O4@Ye7>xlf1P*6_rqamKL0yFBjP?a!n| zj#4M$xb&ACcJ`;zf%d|_@>J<5GYgrrhB&tIkyts66oX4bI)wV-eL7437RF&zqED!I zEEF1@F}*O{PP2)qqxv83N2d}YF`g|JELgTk+{uA@7`fc{-;BB+)5>W{?Xyk3+sT*B zcith`d4N&C=KEr3N!JJGoU?-QWUu*NR#S(k5NY4--fuH@dTzTnNJ8vx@S0=J4WUEG zGybpDiT=P|N2u(uM5^e|a5&JP=Z}_gFq$Wyxyl>VyH|w&oHbh9#bh1J$wF%MR23>& zbd#HzF*-CjwB+|z@;Jc2V) zh?VVSiahhM46Afk8qdKc^Gx~dfUlj0<{ZlYKNtuk?P(smS9$6i%Ig}E@rt!KyTl|4 zXQlH9rxG*pNRB)5cr1f!gz16G@qFRY9LTXAp0<2$h29E&0BrgE8d_4Z)u# z&XiYTW@`O07y2}CHn4KmLrZE7{OI(4Y(L{Vi?mgkGBi}qs;sV-*QS}UNLwU`+pRjV z`UY>4?|dFU1p9$wIA}DQs59SW>t4ED!sngL%cEO=+X+U#R`}cX(Ob}e1G|8gFZVDb zUn1}qSMu;4Cel8dB@K@=gP=I$aF5FY@8J>;oQB; zTp6C7(nvwP*gELcbu)c!;!9{C`*MtX&d zJ?H+2_==f9-1`DQhbc!s?kx^g!}C};hKPGFEo;9278aYqqyxUq3yho_kYgIZOTV=h z`g!mYuyUSrcui2O^khyNz8A1D}TuOs-`z`c);LpI8+o#Zy z{u1n;+5Lbn<(5>SP-2`2`K~?@vcY@7<)GvgapeQcX$&^Qg6WS_a;D*5dW3nt)Z59> zWuO9B{>y^z?KoqvUHAtJ7GtM5B{%9sS2;e5w3({V)eM>gel0xDw&ynJ{{g=Rmf!E8 zCE52WIj=vjwz8;*a|0`iy0ES={ZRh=d4y?-E_eLp9ThS0vrIkF$3I;nDPWnF!xwhx=(Ts_#Uv89d*aoth7gg`N%$12$h8P^yRGE>>q0C#uP29s;-`0slP$W;mwhkvbRLs=E$NgG~JEfHayO` zGjXo@fMW4hf=N#a$4BMbpV51Kl%}2|>u0wxS{PDUE%Ixj{&i%CRaPH08y(0bHP{PH z2!;CKo{K|ev-OcOIaWqQ2pTJ{bgqcWI&7@zYvPrr9^1)}?PvPWi8#ez3b6S-30jiX z->eAcCpLR~%&%VK9DzGKacs*`&fRL8OSGi1`ZKbPmuI8*E6;fm)AC-dD-x;-O^HH-B3YYl9bBlWSo*c^ZL!l{snE}V=pxYUXReJxNi~<=jKk@wMJaH*H zSufpNs!e{I$WLjI-^ZYT4qgQ|zXu&<@_XxprX4m0=PdSFKg-B#(o0mE_ilKb=eBt_ zsBQFS8@)R-oY%b*P*U~b%z=uYNG1oXd|IT0S?VVz%%hXk=_=nJLjB=vWDLE1AF`R} zt3mOCVqEsALD2qWN(N77qx(lkGMnO5KsGoMA7&&uW&^!K1qlFzbpO};mf zFRR~r6#6;vBCz>>16q>x8*2Ntedb%Y%LNTJ=rfb8v+P=lL0h&slbka(d;+oOs$#s| z7Rws<43xJf9$B4{D=|0K{tkpL1#^IvYaX;DyT09vT+;Cx!^10Gtow3djz9M|IASB) z{x=4`ZFo+i-tfJN=i2gk2)Y$K4=mq5Lrc1~i(iK><*{T<^~$-HckM_fD-X%6Wd!`0 zulx}Q0xX?r$!loW`507s~VhvPhI zOfuIRd0OFT*AX8;XB~rm7qIdyg_dOXT#Y~PM*oemz=GOJtpp$56x!%+3b{=o+yltv z?ufozX?`o*q&th&Z0EMnBwmn$*bp2I$C3P(xU1{c2jy-&JC4r=&e9*79mgTghx=~L{ zQ)6sXYC1hY`m)*AmzA4{LbK8P**NEt@FX>tU8nKtIqHEkS-zTp z+t+MW5S|c@`2+BKg6~F!6VmsXl==s-afySo_%E2l_Yd7pXt6w1G@f$}EQ3(vE1WyV zrIYW&&rn>>Wbw?2_)_3DeBQq3Qeb_FC8pvBY+i8d1u*zI^ z0yzih`F&Y z*ZX6y@Hy(B$T!{CQq`m~H~2Z{h-Pb<^>*PjU2ob&BlTWLJJIVN=*Pg5z_yE5pe5P) z*Y?2w%0An%%)fNE&+yLr`VVG(oh3oiH+naE&b84))aT-5Ww4he&Gc^NmjyGAk{gU% z{fGi{oOw0s+Xb2Op&fIQ>4k}&3aoow?&8HiQ@;f4Hk|u zmWzXo+q_m+cCnHk^qOuA-hcSp_h~!yKfu3%m9NhUo#nH7*Zs>kmmNTnvBh2afP@En z%P5D3iE?akaUqAHO|L73*(0uj}ZMD30lfmi0md72?lGX=$CA)94&+;BE{=`!yu`w~4*87qPnJDzu%>&;UT^ptOQ38zi6Yk(R04cm`np4!--Z2&^U&Zro~JEi=}4pRJBtp z8EU_0_A?nn4_km9;pIqk7I7@M1Z$keOd;qK*?aFq__P`iRemCldePj`7 zuJh!`SknVRIlw25Tr$5|1zigo0^WPlUv;S;SvT@x41nzbXL?lik}{Lj5c@ULGI_zCPHPvO{LZZG2C zepgO`O3ymHCH%2^Andk;cZBujy37aIV7p^tO^DgGdt(BeXJJX2>Tv#M7=LIXz? zn~=Vri26}x-Qt3Q9Uz(eD)!!osy61(;ZkPtZ@9QTz(dnj#9lZ=RpJwE7-K4ngJGdT z`Aq76?e_Mwda<;dA6`QLEsqJYrx{nv^%T2MRm%6MYIr1-urwsm;5+ot?4l=_|8VKX_G)_km6h(Xe!QlXE# zvIkJ1U+K~(jU0uirN*QA(BA}C0V{`lx{+g1VE5+-`(a(==u)p8)Bso`y=ttH4%aqG z3-#x7=1*n%mme9!B=h|;F;BY2`*yZ-gLf#pi=m>tip5b>Emk8?>dZiEkf&nN(YdjH zqp0tJ(Zw7=AB#T>G2%;ppOZ)bHIRswhwHx$#&fA39h>bRfY*(Qp)wZYZlph-^5e?J zx_-;W%H`24f1zEK)9*YNw13LMzK?658^Je#EvL=UlI*%+Fa2JZa!O8^O3tGbQpJ*U zj%#eB!438gK$VJfkuc^1qF8KnF?Zo=QsYmJTsz=v<%*vXaRz{)z{)idT2c?>I$ZB# z`lUCzOm=wVy*pj!K0ha%$F!`7`DLE*Y;&tta+N%9UN$%5cr(Vv=^LCLc8@^sQp&`+fS>og z?7=ykU8%@L%$iG?QOlnPs2wOT_z_>i@`JzS!BUvUDI`lHI5?Hyv1}$lQ z;4gHq^}C{r*r_;e1to1V)QzT=o4n0RTUixh=76(EuQ&63#QD4H4={CH@{*D3MflqK z{Z#0)B2G52avcIK$=2^)*Mnb`E4ky@>K>%mS8tldmUe^KX|v?M#<+pE59FY?iR#c*h7i#q55<+iB5g!HBK0o{DB z!9ao;dOyaoqZr)!(=bQ!(^plX+cC#FL{*mMP{%`_eaPO% zFfD$X)Ie>U$zODFs{9XvUH}#Wo4+feC0YMkX|x|*{>dm_c9CACo6?7-DaD`GRq=rD zyd6|UJ{2-e)QVx#poXem5gHSb5hONEv6!KX=N{1~Fj4Z0Hb3pqk`@N~^EB#fdF5)xQ4Bbkl0Z{yD2ZRm)oS4@&=pIgx+KrJ!<)pU zBHrTYtcx%Sx~Hi!Pd^oLD*X3B)^0%1ApkFV#DV9G3L8R^SdgD3;)6`>W+XQeNVu*!f!QIZ3In!I>hKq0A*%cV-4s#|YGby!F0F8{c8% zT#p>3$RXp?_n@B#F99oO(Q+ea;u)jY%L?K~ba%dE_q!RI4$>pjdog|am)XqR8jMpP z0@LZZ!VK^&VjzuEMxB_;{`m6rT z?1ro94Ab~K&*?9b{&KKYiD%3VvGt!FIwULO@C40l7@7aMt3LMC6F&cWE_+b!@ytHP zbT}sEH10Iz(nP*(x%>?JU9bb#a>-v|%4LPMvkb0jl}qsQN&nLB9i(lRo5T8YjnbFn z#DbZ=Im2m;>TX6#N9X=ZH%w3|o9RQs&ywLjS^0-ci~O0Z-j^I6Cn4SrcE?ELEc?vl zYXx%K{`)5At>6d1<}14@c%K6OO!MCKB46#twUgF`H7hH17@gs5{u`Owe7DU%VjC;u zChz$yrO3N7jPhdy)95V&;n&z>h;f*$KbafINre9NE(6_g zxR->gVz=eZRofgcNzJz`k*H0yTSK? z&G+A-C6xu|J{}9~th!sD$$Vq8dXP3&eJ!Lf6F2FZ^ZQ}v`V2EttYk{HkW44CWPx`y zeP|3EfEB)YwwVnbVUoq~BXI(q7a9~d76&pFa>=v2!>_vjTfP!|`oxzef2HRb`Q<%6 z6}kef05*RY2H)F$=Jmi1u}l7Bhe-Q}EvS7`OqYk$NY#DeI&ZQYlHg~w;^deYH-^BI z2yb#0sw3(Id*&-a? z7CLBK$ZZS#IHE5XXPAqtFJ;@zOgNvo47!J5FOJ3+JIybNl|?i7?Q5#GE%$yROY_J`%-;z+?+Ctm4=!6$*2FB zOy$Y4^M^{kLQFt+OVq#Fb=R1oqb1r)ipGgnr{2%u&_!S}u;q3Xv?Ob9vlqLT6;;ft zme-Zb`8pyK@yL$@hiokwMve{evE$cwp|^tj z0^Tyu>v~SKOFN?8L{o~VY#sg~;auw_oa#6QrgOn(H|7II%n%;aMc&$9VAANoqL3E1+y5n9q;g8qB&dTD8F z=y&F56|e+eMK%2=qnaKqs_ARJ2b8mZBC!wUT{s$*Qf{N zKNt(FJWHV^y&mjC&kf#>F6C?2etH@ZC{(p%!D*!?!eVcdpu&+&TC^8XuexIqhuwUJ zOco}7FLt9j5s_F?+^<)zp9{@FpWv$GyOE)y-X6g`CENx3f}ddhZ{KptH{0arG32%R zc@O$C@GoHVlUMr(zh!j6PxT1gv0F}Mo{VUCoyk0UyE6m z6VyNaZ9jAw^tZqbz{+=X1mQw={bHVAXfS<$1(KT!h1r=c(D6V45n_Ky{ms+@dvXlT)B)WpO>D_~o<*8u(3-palbTtj=xwH z9DYtD6pa^AV@oCuWh?^_XnJ#iJ)q)=6OqMfL<3^)0V)~ED;W1**l>A>c5F0`b6 zf!*=kJ?}H&hU~ncTVxEXF(DPTB}Du%Y5$uDnudE0Y&XPgNV>IUxC+-6>-zCd=>bNb zCio@zlf0kzL;nc;IFLccCmSzfFXK~Eicay`uJwwY%R)L{TW!F{X-JLxL!k@7cwqBA z30hLucx_$kwPCGZ zSyy@P-YWa1&|WILbfl4EJ$w@I5jn1dz8TyW@a|SU3-_;7@*Spo0#T zaR5L8u=yPWEor~?9PkS&`A)IsJ`oJ2z;9H}-Bk5lwZK0q1Cr0-yJ;H&d2<95hoMm0?W4mT2j~ZG+o+x zojFt!>{jHL9&=cfj8{63g+>?`E~OHuo9DCze9L%lg5RZnFN59)z6C7bZ$nGkkNy17 z#0RNcU0yw>uCAu8NPp6C;`zD;CF=Fw)vj|2z@MNslrAeY`F@k<+kF2WdKdUlz*E}S ze)5ZxC)qRCt4tW?vDuu5r{X-PF?jy8^{MACfIbDB4kUHs`FaD~K7BAx2Y4Uu<1`1) zzp2CXAA$Zcc(VJ?ZxFSBIL!`r{!Ip&$v}`=13u1qseBBEPJj_WQaAEp_|)hLBscUW zCw-l}-M-HD;Q3`8p8qxIMsQiW&#$%G7Y04v89Xi59kr*|la?)cw# zCK&!Zc)qQN@Yh)Dg92dr4}_M~je0QSeRqN$@Vw@L{|cU;;CHEq%b{-sw*bq33$&ze z)Pv>UtxA|*6y%@h+wzZmoqYk&4_N+#pe1#q{0;wZ6+U{lfd2~N$MYrso1kw6&A{@% z3%Vo!z1oX*8VScFhr)u|2GoX;npiCnARfSTDR371Q)~o?=3-M0?eMX36kLSwJ1`tr zIYvQul*8&RJH%n>(p3b5OP~(gTU?gXlHfhy`Ii6H&`sdFfTxTzHr|Krmy+j)_sP{p zHDP@p@Od+Mrj+-)(0>J=0GrRxg6}OKd(|hTgWk`a#x9oA*ee`=g&b`OvvpwKb z+Gxs4_?!$~4weDSXG8G4eZIX4pW=$Tipi6Tswyihj}E*Ul^jb~d$~(rdz1GW2Lv&! z$@6_VVMzeL8krB(m243aT;SOU-N5|Vf(Ufl+{7R5d=Noz#_ySmY@-H^> zZV&e3?K-Z5JSS^UBXn>W%;50^-#csc=kenGLFlNP_lr!IGC!q*}Gr1#D}Q? z92v`FMv#eZA^AN*ElDcoN~W0n&WDek->-ze7@Bw=gg z3#B(Tmgvu^vbAwDmXSn;pRN*7&gf#NR?F^-%IeMhTZPN>LJ>cXrY2JhN>I7&t~yO* zu07DmxeGb$c+mS&e87OAz{)umT9WOD?7l?@IqR!d)mB#?M})M6fn&n_(oIdib@2i9Dy_8xQw;g24C3;!v{TT*5 z78Chg;eQR#AUB1f!qjwExsT;WDAd`w0};uB`Y@>E|=NYc_z z8ptlP7`RCmUJBu-gexg=sF8m=^4a(C-_YJSBTfWZ`E#Kq+4pe|?acPi$pC;%{LZ>4 zN>{kv+2M{Pb|a5C#UJR&lbQp*i-PA$e^dp%9$XGA-y4GOZ9inM9m=iK9K4Las6eLR zOPahMpRf-ia29rcXc?^!qgj8xnlwbImI*-VrFHp8b;TGFoIoXq^Ldg&u!56gC7Db*Ds(Y zT^5|LE9trqq2)@sjSL#i&}Q8DarUj*8?}XI((JvioQ-ZV?|)3T7Q%)8Vcv{*LGAz! z{375v{_B_oh#_3-EF)LHD^le(19~Ai4OqGApe3Cd>}M|x{8=WaXV6VD&>+|01{?TQtmiX0ZtQK!lmhY}5Drh8cU8${IZm5ahYPyK{lpWF+xLt=}& z)AjjJCwte4TYxp{V>fbz8=WG}MpE0cCZAi$$25MIcJc!Bza?K+rSjPXE$OjfziP+p z`_AX7fl)N(BAZ-oF7k}0FMo^Z%iql(|7tEDo6BoTOiG%)8~Zpnv5VDD&1PSs|B{0+ zLw?3pbKH1E4i*&s#90kKuu`8}-0)qT#=*9P<2kV*>PwgZGzZ21#hPG9?nlr~{-mjO z0ab8X=*&i!`{J4TZYU!FHspQfF&=wh*_fk9%A>G;sc=fr=5cC?-H>1E(`iy3wWpZ! z+d=u*bw^}l#F+>V1h$=2KufacJx2uN+1}c-J+3#jO|9Fe+%`2+fBu?7J^b>9r!Tje z-$L7%uhF=p&P(1=WNsP;RE7A~>Ys(_D!;8^?)JFLSwAwGF<$-@3dz*|THHp2O?U3J zoNn^b638j-;HS{9gLi?=$EU&fc094y&iSxIi;iCNidfwhoxs@gwVSkb7kLkyTNqJV^>K&%0eaGu}n}>es7LjRn;;_&CX`4g+ZVnav%a0G$a$y#1p7#At0eC-V>DZ>n9k}4Nlu=cZ!9A)sa?`;G0RiFvj z@_7haQZzW%@Mf@on36+#Y^I=O_0#G`bHVpb8FauaQPl1;7W-tzo z55~!qoI!adXGt99y+=_q+udRMbAXs_Z}l$c^yDa}nz3*zPEhF%V)&DYda>95Y4T&S z(7Ff%I^z@xeoae_d|LzlQlF1OKL=g_R=$^m?``|C*OYug8#9aglX8hoinXQ>Sk@nz zYCn~RU%#f*_%{jq7SIeVzs7Hw@P#o__sOf`gayyEalX!gmkXFO8# z{BLnYVbn<6d~*}t_*6zBrw@Lgn2KK`hbaeR!Lm)hTPd@1{*9m>u`Baf!^}i~(?=T}N=v!OuTpoqcnP>xxexmOM=mDo{u@d@pA31c{LLYcBbIB`wQd-v z8q3gPxVSGT{^eiw|2)zAm6Er%_JW}OUz@7$G0=yDBY~~&9ng}d1mkMkjy=_P;aI8m zX_@esCj^aoJh0B>F}vWnZD5a1^SHAI)ZSbq$Q96$lx z?)k*HUZ7UEXL%b`l(M{BM;(v5l{k>N%5_h4M@4euV`U5`m3-5b=c4OOdCB|Q0DT#_ z0@(6=F!+9b;ODy~@N3!m{SlXP^C?lfKhd}sw7Zjcijn-r@J`;?`@KJeomVgqlt$9Q=`$~5{o^tJkeX_~(&T>^&$s*wzRkH% zFa$^veTSV7?K$6tV}sfmQ*?a!DjA~2!FL?V{*FD*rART%hUV4+cTW^{9`y@)km$0%7Oi- zUA4;Xrxy7I;Y$BAH!mw!YsVgN{kiUou79iI*!OYbz-EEM)3mHISZ8c9<&?M~wN5LA zJ_;NQBuP1SwMXe(KR8QHHsnsm3io4?a=jQUv;=&bc&42%JOup{@HDXH^c=LLw&0w# z)mQ9;-vVKdlzx1P-p;%q-x4>3IJdUkCr?c#f6*IL>!>l%Q^9m#`5p!>>8F8x_D#Wj zWnX;Pl}rCuQ1+!X$%%`lPJW4->JT5!7KPJxUI$akl=HWY98K`C?c_n|7r-mP%JDI@ zBx|S9@{>KalP=}0cZ!(B{nNP2UZCf419$5#fc{!#pr*FxTqI-O}^V86Y{z6q5pQa|#tBgQ3#+>hHtfg0Y8PV(A z%t6sJysR9?xL*9XUwX2B{+B22xQf)M@Ua=AdW} zSE+XGqzYmMju%#`8Iduuxw!{=$M3=9C`v4(NNp4}c_jzq;BzcP_`mu`4Ujt3TpAU6gi%*iV#TnS8%D)p<2+-M%{U z?;3u)c((2L2Hs4c4~l@Tzsb;&wg&cYukW$Fci|iC2^KVBmMVtd6EBjA+pe6pFdq_3 zI@#uH?+)?}p9FlQU%V6g$KWYo<#-KRQZ%rad_9ixM4_B9CAE@U=TaA2)TT<_1DfFq}Okm}^8Cp_X zpf76)+IwgDbUWAm&`FgQHFXkQXn0HXvCsoiwq}LDm2j&dfSq#Usb4_+Zr8s2d*$p>+x6ERK9n$t;8{%vPMmK_$_k z)_Yss@cllz;s*Z`71Dt$MBYS;$)9s;s{9ksgxH#iSPMseO4BW+o|YfsXN2ZQ#{bFJPi?>p>qfGNQ8opzhyyW=y{e@*GV zr~XT8^#Z=r8n1A#^LKAxoqUD6Ye7KV5rU9<{p2j?sYqGQ2xhl_bO|+-!$t%y0@PJ* zc(?11W6&M#59iqH1SWK2J&Xy= z_1MF*NI70z;^whI=Z@+-oC(+Qid8NOln(#=4z&5ZzsXblyUybw=AUngFh?o_$oP`xI*gJ}U7B#|(!@rS*a1#ypjG zu{-xd)(T(w8Rf~(SO2d6lDn9A*Ajv&vE8)0+AXQ}{w?Uu;5)#!yYE4Fv%N1|Au5Mi zd}#L$yl@Nk3s>W8$QZ>j5Z&xcO|y5J0{-nhKiTe^+4lqqVEGq9OS0z@_WZuA0_e()4M^^j)|8Nf8WTPxFe-UoCUoAECN>EHPDjc!TQzt>7M4Jy4+4O zs-e^nF|?f%u{)L9u5xy2X+QIw?HNbWM;=EXd0MiMe9i42$%#nk!O5oEaazeNz1`D_jNO}jI-PB|0$98d#n zximmavg;IU=g_$xyYRIu6(&#@>yvX4J%PH{b#99BLFDpTcD+!$Bgi*=67Z3HzXSbu z@Hwz@47kh4F+P~TS^pEA<$!Tr!>suyr|O2cIf#l?t~aSG%$xn3=R6gg-Y?D>oBU{R zbq3BRvgJ5_-b5GAUtU~%InMO)r+Wlj*@w8L9F68Lq|y(A_K!UAK;EmNZv%G%EAK1N zlHLr?le7f-;Lh^a8lA|gI%phYK0!WOeI3{1C07D_u=Wo-m*79J5d9qcBx<8#W{0j% zg|ozTNX3UmqD-%P|HzeQHP@e@9{2F{>JOEdR#M}~LHqx%kw?mRCiL-O0kHC}48FJe z0ekH%FQ@%$I~Q;1)#5EGS3|nYZCJQw7SeGX;AgXmCg;oJ8S#+TT8yW~OIIps{$Gt; zkHOdWqpv~#7Q79tTsxp8b)z4(N98*VAg^Y29Y9(Gz9o03_#Oj&5;z4|zGcwe@15G--~77P>xFf@b4X_4@u->p(3f4vRw7dp zcA&T7u|mDC=Q=aor-(F=`yDqtEh}Fglh-dJZ&1##m{az7Q2*rDmd9(*e*_-@TOKED zHRZAKT~iJl{JqX!Z9NQc%zD3Icc$Bzb@FbuU+?!m=;u6%6mVwBpc_<_E-Cp zH|dnE*+o(@(hP5*k8JUN=Q>}y#B0KR!(j0w9tq2k$>G5%x(lt18M$`B*Xr3uejnWj zm<+63v!EqC9E?L-13mrzhAN_q8~%7ug*q8b^ODQ(9$1nVv;9JU7>i2QzpMjTwmFswJufWRH2U=2BJNy0DYY>gLVEzN{2~wk2SH7gBlEr$mMnxVyN6R(xl)-O)AkS6M z*MrT#%JU$!q_#FwpWQDfcG+r!Q}>PT!=7$sZ+OmclQM~1i_{s!b%=?b%_Q|JmykoI zxjEb8Mm}P;CHt$f&~w3Yz{>Y4Xf5AcM!tl%r*Y(~{R#U)N7mHozHE3~?nT>j-L~A{ zhV|v(g#xIR}NhV)&X07w?Rwt|HqVHY2e4Rb9=*$XE4kJ9Wt-!Q2g&i zHhFH7_kb&=jxFA!8P3iAA?mQ`r05rJ2<7%mF3#Uh%#PtVZ!i%PME^1>yg+n-%W!IQ zAc3A0Q9@S|*TNs?9Zg~8N3};!u_hZ8)PGA#k3SyzG;lVs^1lQvsVRsX)BK{zM`!uJ zTK@#FWx_kVyrG<|5FY$JV>q_WT>fIh&R=4FyTM#uR$^4v;{7n!c}n)JX2^PVxqC>s zh|d!CdDo*M%3_i=5^FIPLtEw-xqa2Nh{`!{LL`wv)Q%W2rV6VD@&A>+Yh3I^I zLNWgo?HMJM<1%22$?wRBmxBW^N`kGgH^Z!cz2{h6`ugRipPOLHC-Gpaevg7a6`Tod z`TPW0QroMhT>AaFd*!o4%p#;{+Cz`W^|tsZ*%fc`uFi8F37w^u`%9S%&gO>`>$BAy zws>XJVl3MihvBBGACWS!S%~B71Mi|ZQ3&fzjDiV+rVq>*G&4KYtNM_^S+m^G%rg3b z0jjW^06Rn2&k<*?XQ>Zks@cUffT!K;sycN@W-Kd5=BCd415LjBJ(L=^=RltfP6syM zE1)G62K%zxgZ8n%b|EUORL_Nm{@=vbL^mH7-F%DpBjwyjWP@^QT6XD?=xnvsMNMdr z$TuBiE+|@|6Vj@^Jf}>ZP`v2zk7D6$`LbK`c?C3~!3Q z72gzfo1!x}p^C-8JKruM@}QVxa#S#8=)nCTp+9Qm7i{Nk9 z`R7Al1)6}B?`~*GO+g%y?LnO7J;>KkLs0uMMQh7tvycj6BlFj0BlA*M_AnpvzVMtO zBY0g7=bS~Hox1Q$0{*O%84E}MPZDX5R@wv%`DPpWcER7y(+B*BIM84uu=15aOX_+a zZtwCX59j7{h$)Ix%bcRYO!#nJ7~)yeAaXtPP@cOzkfRYkR*pNM?*TsmR*uJ@)01Nj zrKDZ<=a(F%(rZ z9tVQ@GIHoQsx|sR=F?HPHM&vhOP{BCu^#fi%ywqu84Ek{O)kFH#t|G_j?KKS)TN$! z3st3?#fX-hrv^2OsocnLJd+;G)lP5mDzH+uMb!@Wt=&G-@=TgP&*bM#?74&Jy>SWY~I8&c<6jzs<}0gqYOS)j*Fo; zfQ`V)aU*nkawMyF{$VEw|I?lGu_mND(#>qP=I%I&<4ieh=lPbu{}?_GKt8bihe7v% z|DKBBGItN<&=knA0zOt>aV7Na;BH{$cn4Zi_uH2)hy66KYu*3r_SLk|lhY9ZacD``-)qLhdBJt>{hE^N-!-!^#I_Wlp(@K5md0c^cYf|g|8`}f}5)4ZT# zKSp5n6!+n+;pa1+4!f=4iBA)E<00?Pm~$mI&)M`_(sylB>T{)jgMl&H@UWZhX85|x zlCkJ~btNXJQhSolGUe2WJf-|9^O)P9?*~5wR^HK11n)&~?&Zag_av|0UkUc#8?;SW zQ~b-kO>ws=e!!-9%z4;*wU?7PhUwl6)%wB+ug%Uj>z|X%qM*pA6?359E`7~fyZ2o0w4B%L#R1dLbVQZbE4VdA>r}Z1I-pUzyv0* z*E%BM)3V&im3T5G*HO?Xf>VH%s~TETZLt3}|Lr~1&sXf6l2+oxM0+Z<2`l#dy^lg1 z;5&t_=94A%)UAX+W?TPQS)nZPA5@Cf$$@TP|1hJ7X+Fou*9w2z-rs@#2($w$-`}An z+5IPbj_dUY90?7~1Bw5hYpFU7suG z?a<+3Lps;(7uG={zT^78vM%w!7az*8wZnGtiR$64))?v`2fcudK_G z5;6JT$*iBVC?A_Oz(iRBpfm_!HgzIBaSW@#u_$|c6IS4CjPy=$Q3ugkO$jMC-*m<} z{pY1>Am)&|OR1AWgLp#XTqA${86%&R>lEl&U@oxopBj8`_Y3x1zsdKBwPiz1QuzF4 zcdgb{V+tsp@(r%DzL>e=EaZzJA5xu132CO`nKufwQIJa*7iFTIftL?wA^M6P!L&r>5CeCCjx^u<^cN!Ab1C^k(30%@p0|LNqo6?Vsmc{`Jt8g3Ey|pR1rHZ3yg_tAlfPNk1R^;=bK|%$z97d51<4 z-Ju*GI6rjN*VP157VT?{9B;zM&cD8Zj{P*^;#gU(6WvT<0Ot&UBu=S<)U?*fQ3fA7u3rv)Gq?>{Iqra#Wc|I_acX~ZBuyn+ z+CJ^^f!t`su7I)){%);b+Sw|9R%{U<9!86hcedU%AwG zuxRg2sU+4L{cmdCfDw}ShC<=+A=X@BL>nSb|7BYvKdV;6jEJ00{h?0>-oVC9$y zEvf5!(zRZ?$YD(0^UKOp&Ewlt2f)!~Uz$ftz<)i@Pw;%{*KUQr53~Tw|6yoJ``f4K z%)k4dsmjhb<>0)~p&Xz`fI?v97!NI}>p74P{lytm&tffFS+}gbqB3#8*QA@M-RRcP zO<)J-1E)6FeB?Rt3k=`&JlB^0wa|BfyMg6RayaBX#OaG!SFR(Iah z^psJ;cltow@=w)ciaalIVNm}(-||nqNS?uXVELCoOWIeyr=8WgHFWMOYnyZ#JVY4) zr@@rL_JIF-o^Scz2K@l|A+Y=(g_dOVzag0Sr}Do~?kJXcj#bc-y1oY;>YoMjnu>Gfb9xHZsI zH&oVR(z(1?zfm~6ES5hkt*ostS_m;)h~vr|DpoAe_6qW@HM_Snox%WMq5k~3OsyXA zZt$H0XR_WMD~gg_RG%v6^b8JkxW`E4KkrI}``K!MHx+NOGKna?#K;|gIn^)ChCUXY z0Ib}nKuhXs58n;B>7=_D+2z-sQ4>Yjwa&a^RqFEOBdmpdYamZ^z)#BYSJ1x&Zv!jO z2f_EYp6#_;@^mpuGo~$%VA`^9AUc5z4}q+KOM4(s$t$Vysf4ZuwZO`=4!VcsbE;VL z1xgG#@kr&S3h2x(1yp;fsjpV}*>?6f=r4f!MM|CwXi3e1UkGde*p2eh@&pqfebA1k zb`!QHnba7QzoiGOb<%WXdwOzU<;XnwG9%Y~_}Y2KMbMXkZw9i+`)SvQY1G%zt7>s5 zJs*Dol*~AU80Xa4V}?#yz_%^nA?>9d`rqJ7VC%t56;CIT%F?+ zhhV0fK#ScT@SV$ZOUak;y#V?ea4oQWZ-ACGD9|@r`|7>(EgZWrc;m-(edXKSFI;VP z9ogo_+GNi61Y;e*<*L8dOTZ`bO;Zos;cMqx1=|?kK_Remjfa+07|3Pq-Mc5(S6}IZ z+I1;Egm&y(lJY~iJ&&%rIMUbGnSZ${r)XQMoJygO11AD2&&kk|dR9(*c(wOaQ1J~$u4ed_ z!dJ@a4d_3EkAaoz6KF{bgLoC`)!&|8@vX+3EW$X_EKTbJ#$e!F?fTPo)6)E$D~x=l zzf6t8bJ%MfdW8OyP3>k~b*ae~9;e>3%jYSWxJsoI|WKPSKrkqy5*S7a&==;Ef zz{>SgXh~h$`@ZF(&5KxLicVNkUs<=da`qYmQ&!bTOv-}V&DP58G4Dy&nKX>?K1*ew zY8fZf0a-2|!Lgtq4r}dI!F%wlRKGnHdK#DkBq`8!-=drHooxJD=22pK&XI8&jfVa2 zfbWKYhqUwipdST~16w{%2H)HM+Ftj~zf<46XGfkJgM7c9YB$rM4+FD+<$n~kB-@UY z{Sk(aMMdI0t!Uq(*!Gh@zfNYhO|)NtOKCH+Z3^UQf{$&#PeH#5UISK+H=rfib-`EG zMctDE2Z6iYO%kXkcN2qnw1x2lI2Up_P0t5guQuh9__g6D^>Q@yLU1au@|+%gZ|lQe zJBV>g)!M41vlzN7*Yj>ABP3a;Kl}2s%6#G)Bga=&e9;R zd^FIjc97$%?{#XHUA?wQ+g)no)%v1S=?!S_tfGGAYxA6SVxIH3_d&?%y?~=-6}&}P zc-|5>6xOf#J4!v_s-^B2zbFVil=zmByDX4P6R#+_wkc+j6tl?#sRJHr^D- zu>(G~{~7*2=sLh8VC9$&Ey?OD?LNuA<CC~krTx-f{1N=*Z`h5ZVf52P7%J)}jNsWQOrm|;E|J^hw)D|o1l(>RBy6Ny2Q z?+$badcpab4+HP7sA9ft&57X&8Rp0ZJyia6>g(Ep7OSaoI%Cx8U-xIOe-oj`+@Zx|qVcar<*kW(UZkHBmo2icc*kX?4BMD_v>mJD)VcEd*gq=8fX)}a28&&vNH^ygqV zu<{Rn>whnQFlnLOFAH@n_cub$Tq{3vcFBP_r!qMhxrZFI-)7`rAIK-|_jc&}zyrX_ z|4{I~ZMXK?jq>l*cxTCi^+LzLP@3*RqGBP_7 z{3#s8IyvgB0W(1uYzsx5P2f~81nls6E?5gn0SAi#xdk{Ki~t|Evu6M<0`tHC@cvHxhl6!sHpl_L`73gQ6`&Zjf6RSgJvbah!7u-U z+~71Y2yFj|JsGeB3>q4-N+|c;?U8bAkn6DER#j&hvvxFbur$0kNLIi69^R z=1-jc0jGj~;H~$O3zUPA;G_580oH(N;NS0}7XlZ6$>8^YqtuDp#LhQ&GOUvc9qyHRm~%6%F;p^=k+)Su>$>^;+n(`o;yn5kz&&8o^(-Irqz_hW_s zzq-H2HzR$IIj<_O?I~Z5gmnMbq@PvmKDXO7)yWfZv33XC!+UiwweE}D$t7~}@-?f) z!+W<`cey*QdsEK#O$eC9<*Sw+IHd?1!m)D(FY|dcy{C@M8?%!Wmxx8|HZLzteeH&&KwS-Mh`#u?r)4pj5PDUH*_(=Os z%tji@*B94T)>SWFj!P>{9J<{h1O*g4LPsR3T6SJf@9$wb+YHpzEbl32ZSdREo26I8 zUZDH8+eub%P5;I;M_S9Ta=rG!kUqbP8kB|U-?oJJcg3pmx^&uP;J;m(GQ*R6cAsx> zRH!((2E%%{8*`W2yU%yYd6Y1{METNmO3B=%Khu@8!>#E`N!PtB9VryZBR+CZ<{uZm?>kHIYiNBZnm5w=cRNcZntv${&=i89f_8-4osRaZ7( zB%A(y%j?Q(SFp#{?Xsa8VWP9P_}n!$4e51W`Zm-b<>@n9)}y3`YN~p4R~n09DB2x z((<}>?2x2;_hK5s`n2wnezU%Zx2461lLigx^U-(ppfJ#RrP1Y4_O(^Dm5Z0uFHI{? zqHRh)Ps=MC)-CNx4eJ}z5>V`b(-%b>e(vq&Su8yuF?Ivq(OJ6>HUwQ(r zUYpkcUs~0J>~K@}nI!v|+M4R>;$=(IEWNMXo@OcT;r{CC#euT>f02t-;>)z>_jmtJ z*-j`vAI%23znU})uk*dKT?SA2)OO{DMS~pbHbpOB0@wVc+b!m2W<}RaEN|RSD zXXVnorDk}X6^rd2+}E&XN&Vv0HLE$1ye5rVYm%?r-xIdtV!S8!^{5W( ztEWqaE(#?MQR5?{af})pE{(FRe~TQQGAZo#v$Jw<+FkGNJq1 zo-~chRcRkG>Dv~#vSAA0YjVgFT54y47&K|I=tS(=_xSp3M{d>g(s%Q3BY3Y${ zxu&_%lDw^)J%aQzS7WCr>EF7#vOyFHi&ysWoel0!pYbYD?De1%TvcCneh>PVRXwwT zTeSjTcsYHC20akL2yyE;lT(!(85z3R&KRhQ4Z9)p}G1 z>1cNCtHrJK%RMNX%2jD=YLh%GSbx^_h-*c8#fqMkD*Gd8t*w%xE-A08tLn+9$tGHl zDukO>F0SvTV0l8n(F-IZ77t|)Oy=nv9Gj4ZLlm(yL6XUE?Luq zIXqjDJsZKeQH)>edn&KERZ71NRV=Te|LV!gQSPKiNuMQq<*TYHs9CKp>cRchrdno{ zuW6{!2GQ6TFP+&xM0{<<6|CYdiOW?mH@ZSlCLF5KNAi7x{=lRja>gxCc;pZw?B`oHepEq`mi`=58q)hXOvDA&@01qE_V6im_A zw!3!UrN7_4dzZexx%(ZtwnjdW$hEQWt$pP>f6zsPH3chp>Fuyv%*V=cL{3#BddLf8`j~(bb z^9NqYr%o$eXWBWb?^_4{jc@)laJT(_z`y~nGi1O}K6UDS5p~eg@9)N)20}D{2p?h(IEN#_@eQyQ!@T+J|&eR1qvj8zh}Zdu2XzZF`p(4<-3cVEy4e2L{>sFB>(^XJl9zZ?Efx}o)N_tL-cGu zB{gQa&K6+5FC+KW!2a$a>j53)ZH)2%f&G3y-<{v#`!c?}sKfV8mg~#~_Wzf`_ab0_ zZ>8LK0sDK&JqyU$;(Hbc`D^a`A=3P{?=C)dica9}lITn;|JLWXy3VUxf5WGw`P9ut z9qQ)~{!60_b0z_To=?M?Wk6w|-NJzxTz?FNhOC zk7E9R*{~X3lt)Hv8)1HblDZcJPj@o=WlKx^GWW~iFK&*r6WH%Jdq3t~e`@Gc|Bt=* zfRC!`_Wt+GB$G@@GK7)}Ged6)6M9eRC?a5?h(G|vE&jpQi7u-_sf+ zGtx3FDlg+TuyV<({VNGT{-}Kn%qdx0Qg!=o+fTHv+}4M9eh#+|>Zj<$IdY3O(^ATc zJ^{Zh+NoR3iR~)26Tft~)HA@rsYA?P{rC>$#lP{(mX`d;l@F90KI!_(vxr}#yr_aR zXBSV?t>F0KN=3!cC&xvd2@Z}L66&ABHfJYXNz1xAAqTuB;ac6wPV5j!yClt`Ca2|q z)6%Aal}mtL*`j)>{@{2u39MXl(-)*$)Z^)gK-FfOZe=I-k>5k|thk}@-^JX+?B{z? z5&k<@x4l1=T7pj~AZ(_WJqn2=Alid_KooET0XvA z#i?V#IDJkJa@f0FcB0?!tKUaM;iI%{9-kX+QBOj0{sQ=mT0Xu#sf4?+BTk)|0i@^9=xc^cE$Zl(f7;? z7m{2!)t+kSo#>16SyW43 zIylL98EBT5)ywQZ%QlPiURGNcllj#6mCWrk6Yt`TiT*_1lIi|*@bSRHz=`9PJ(BZ( zVgCY*BX6)p?T+3}8!*e!L;Plt)cgq#YT4Xwatp;uu~8x@krdhHBfC*9BXbhQJ1jmY zpS+E4oR3~JphBM_sR6CYm(&UjBy|I`lCr?QNkc%6PaezYCOi37a9Z*laDMUvFfaLe zP~Mj@d^R6{7B!PU^IkRAWA)h)b7)a(lE3hI?O*!JeSAOP*I-WmHTiPT@$$X5jcZzZbIf z|Kl``hs*ok54C~1LRrvgC>y#3l6gSY_ea&^xqI9@i;vWRz6f8WkL0_)XrF^SDff}X z>9LX^`7ZV0t+X6~XKI;EHI|IX;q>^UBFBN_BWHngBj|m2g!bUa3SNE4=t)6^jF81(^h}hebz7VU$uM`9@O$FKD{Cd zm+DBXm+NG~&)0G`{1Ppn>i8T+MDrjy{sDM_mW$vkwS21M^XSiB)_vM4_!cdH2oGxc zRL85yJS&h~e<=KREzg55(();fPqffKL?lLl_QY7wlb8hh5^n%=6Lq@u8c&gRIkO>1 zuAdFROv_ipCu_OJgJlE#_Z;_8J{0MO3P#6yZ zA9P}idHt*ceIC8(%asSbC-ypp^qD@cu=4SBekq%Eila_!(#MzYt9*Q;=Vsk_Vy9C` z`uk_itNi`@t~k{06h|H3bo~4Oo5w5t`Ae&O|E*Un{QmewP9^B$eMObO|Hs91UOv@f z$G7R@bE_Qh{_5pp$M-pvU|#>Z%GZDB*{6G->agS6%;T3;KEBuRZlFE+*oQ z^`>;4C^4!jivvdj7IiET1P^2cGnnPIt!PV^)NVvO<{H7tyg#M{pQ!OIvYy<4ax!keB-=^ImGvsAZ#?j<*M*_~!mV z3$SybE2!G97!01hZ4r3*sw2!5j(h@EU$SERqRA|ceG6QX^fGgn*OFcXR}`--wy0N& zUj<(;UIkWPhS-KMa~oGHyOu@0l(2%&e6jChKJ!Hx7x7!<1@nUZF2O&*>dXFm2WWWN z{^@?^KmOTZRKOodRt>|x(VqODjJZzrXFvzT%uQx(k&$-N{6|MS98Rap<#xx!#Ky+O zc|5gh#mCpKU8hd<$LD4$!u0H#) zweHYrkKe7^eQM?BXXn}$r}h3*`uOZURi2-R>lapgy{eV^`0^^p556x`rfq*+%kqqQ1=vD}NFFM|wpY(}ogu zjy%tL4;nDfMsTxdGg#(10{-aE$2UuB24e9AtCp-QI6ov?dcpf>`N7F2=C76J zNL5dOy+|20BNCXyy;{zN2eo_vdrvU#gw3b&DXeOHzBP3J3aqOA%ON=nUjLPl?1L|U zU++`-U?uvCsgUvc>B+@5DK>)-;Ky~L+<)_TsdBjSuNUkF$qQcw&5uAUpsmm$h*yK5 zEIS*1m0T#S+#k7-U#=|jJMci{FJS$n9nslzKH44Zd9){(b+i}Q=V)KB|Is1fiDHSd z#b95Gaf7ij9xy(pE7&8ZFW5h3Ab4iX5b(U1iQuG|X<%3hdt1gHiQ_$4>qsrI_K`ZE z_lOttAMt~Yjx+|F9cclcC~uMC-l{fQ-Ui>Xyayh%90GH_vluhX_dWvVc?-bh-ZvRb z9P%DQK2gdmLeG6}Qsw9O@$>KQdt$GeCG&V+a^>R(dggbi`KS|H%;U3vuH64z|KsYq zC-$mYGLJ9+qw?{!zPb6d<`3raxpOLi{&~p{@2vT%C$^Z!|GWL4d3@=`m9PKl1>2uE zag|d@s~Dw0@|)(sZ`E=xe72V7!xw0IA$*aRjkA`cw}RyOXn3NQQ{a9rH-b0Ta#MIq zEr&kU-+cc6pkFw0qAw6za~_}Ps}iLa!=Kil?b;8p>qGLn#HQ_o}lr|Eu4uAj?` z;Vww_n++Edc`p23Ezg5Lq2)#JA}!1DivF^n?lXtNM`?L9e7u$?!f(*>ZSZ+omcz%? zM$ZPxH8;=%H$fuzW*@UJ4)1^aqEqP~rdLT*Y3%qOX?Eq7u>*(y<=| zjs~zYR!rpm5fh9FGR6&F3`#j!f1iiNfOkG;B!kLkQc~N85M151tVz-F5MPRK4+yG%U>0%MgDA7n@|MStSEbA zge@}4>WGSrwmGB3N>g(wZLIsPF_rtT`Hx*Brka0T%=70}Ie+BAsXhPk$vJ^}{;aW; zKYz)SeMozlLP}e~k9^%Qozr`5B3ig}SP`>pC{#~}xOp5vhNH+9&R8Qb6b zSwfy~ee`1A8Xw=I@Xup!oqt(HMDTG{9^A$A^-XZkDW0-*+wq=)OaNs>vGv<3Oy zWojd%Z#jP)RBdtFu);*T-C(TS1ID|XgDu@%z#i_tV1KuGxSi=944&^E4vutR0A{-< zf|J~n!5iJvz>`Zu)sX8q0ynrff$z9CgWKHO!7trkg5~b7z&-Atz=LkF&sHuL`j*gV7Eg|* zT5b;Ss^#wR9$L#%?SZE=lb4LwGvC+X?x$=w@a+|@O%HOM<$JHR*GZ_p}2 zZKh{TPu{j8Vn%>lVzz)gjd!uz=k}TXz>~p6$Dd-0(?*XG>2!i|P7hey*&J-?41jH& z?Z6Jsj$mhJ7qGjtJJ{3N8yw&q2o7=%28TI^fuo!kf@7Uy!AZ{RKn2Ma0CWUJ5>8eF9u&T?QVq9YPy7JYqO=y^#?k!3p&zpxu19{=?ui z^`8L?>lcD)4bmF$4r%Z%IK?-`hwr`r3_n_l*0;8<{`&HnWQ&Z2WLzX;BpENs*h$7w zGM+O1hh?lJ<76?U$lBMbkPm7Oi62;JC<_upNj8)Nr19om5O@p>dC~hS(il6LrC1g7{a@pct65*+ZkJluf#ue(!B9la z%{GZ}XkGtu&K=S#KVE+=a_A0E^G)MA^L-1!9RD=#c3I;Q4%PLlq5>BE-AXC>QY~q233l; zN--Nk4ZH&8w^~Oc@_ucO6tnTwU8r@=bVVU)+%bH!+%&Imt`?i^1 z?Q8ZE@{AUbwy>&CT6_i`YtbmZX+)Fs7UESDs1>lPx`7n1fiaTrc`UKwQ`M32yj2aX zxS%3lU05*|*%9m!Y_G;JsyAn@HGDvxP>&Kv$}FC{Y@WGXHJ>ML2~S)ZPuv0Su+NfZ z$+qNL@+_s6a;6Pg)?90;RoQZFDk3*RMdn8GxXUuVj$Eg5=el!aIAv{BS0&~qTB0|@~%{SuODdWh&<13-7Ej+U2}G#D3!8q_8byJ zSnh^rZogM9vTpLvcQt~~9dl#9iCpBOg5@jAQ9taR6VYhnT(@e5?X0JoXL-`*i0&9Y zJo->{gtHEh#A;86TIF~y%!;2Ae_#BQ@e#FK)Xu2gzV-!mF0A7qs;Mw_a^rEAUvR~Q zE6(5g#MbAxzP5GM*0;9Wx7FQNe_PjWncMnp8@4U))2Q->X_WSlX+TVPCyZxQ_ zcilg5|C#&G+COyvx%)@%zhM7``^WCj-am2w75lHrh z9sKbd^CuekWRs>yZD7@su@wn9#y##_e{u+b|-2Yg`Y z-P7|}Chxm`75&5B_f@~hGPRs*y{c9zn_8{bAphbx%*f*!W2SV#^)qA88{M}vz8@Jg zmeG7p%#C2nxOVvHTvq#5Mx&vqn@^K+d=J~F`flPA=KAJ9u$uGbA+53h_}Po;5GTXTKTZm;Yh#+!^V;6s0VFqQPhEc*NirZ{952 zH!jcG8%__?N%&L$O1=u7_07V-Q}Fo>-deRC-oELtSGfDA-11I0z1gde%KLcci1yd_ zQJc=bP8v%em>t54QFD{id+V%@$&f7-qM>*PUwAJ{h7zU4q}U(RckURdoV zvhZdwd@Nk5wo~)5`VIU;$+$Q)B3AXA)R(dFh2Vtx7lT*SzX80d{u)p<2sWs0T-?&% zif5s%zb$yS|7GWdHz5Db)Dz)1PRl8a=#eALdE z)*tN3+oxCXf=cfozDVx6DshMU>*c*wef_45)z=?+r`r0gh3{8eKlIHHs;zJQ%hu}Z zd8vF{wLX4eJi6of!QjyN;o!*lk>CaKW5Dcqv8T?B7fb5=c!||p7QX^~C4LQ98ea;& z5x*YX6u%w(INn1Wjjvr7OsstYIL7Fsa%(R@&P{tbjS+cTK3JIc0=Oh?CHP9(8n85N z1Gp*eeXuNTJNR+hm!PG@&i!|k#DcX->VdwJreO1ubg+V7LSmWug^;btA=`2V+il=9+caUCC zZM(n&wjkKFeoI>ZnEKE7V-VV-hEM zPQ*8b#|lbZY$hb2Jv>YA}I6DL zQIN>lm!F8Y3Ag>fj|Myl8T;>Je@Nu&N+^CL+kP1{iv#wWyGEjO_gu$%Wsj-nM2tMiX27AM&$Z| zqQl6c_~TF%dMFA8J(r=4*kH_`LOt*g*8R*zrlOOu6Ze*7|5klt-^2I*CF)nc_mQaN zXrF2v-8?!%O>y*(-4?MS_D@eo>yCsziB~eax-s7~rTG6JntTVn>+E$~EOf_gIWXJ9N|*P(gXAJ2Rharl{I&&X_STK=_K z=aEq0r4P?3m|c*lH6L4;pCvFq`=aK6Kta=c_mtF3eKeQ~cB^7kyplU*~OY|I*Z7-1nUIUhC(s{2_JWg`am{b?cwj>Al}*_|$~m z@eiEyVcTWb{Op{2<~uEmFaIw2u?s%!`r6G$?05Cw&@_M2o_Y@t-`;WM^}og5clP_~ zFI>I9!INXZ?78Ol3do6kWD2X~C#Zy1aVR;mDc& z);D?f;&19cbpEyuE3W%B=H9`Z)1JTT$NEo<`J%__+m6}p?DJ-$rzd_@`@wTRYPbB_ zL$13Az1ynfitke%AN^Uk*Kau*HEY1eW(AjgoAAhp9i3jj;rF^zMdNm6 zuALSX=WcQD77|U7$wd~I@2dZs^|DPI!vAV})&0%mvBRd1}Siu2Z*OLSj;KN^1QEp~s_1(`Gyuty-t0x8V_J*S;3>|jPx#yife8k967mU7e%-C_+<0nic-R32i zUUvBvS6+4X~5B&7L#&?tAXNZ{Ga-A9(Oz z4?XFsykeQ)#oTgpE8@T0BUw(t1(lTSbU{EIJlmhamA)z{zb`F8KV@4o-x z$NfJYIQa9SUw-}V_dgCFIr`_Z3e?3YteDxLrZSaO=%ZcCZDP>k$1%UDh3&sKO3S+B z5K3UKlZ3B93cBg~ssSErKIK;pRU_5dP+>JgSKUIjRIOBN{Jzqey9QK-YKw-YJ&LW4 zsuRksF3e`TsqR?pda6v7rN*lXYNEPGT}ik9 z*Qx8(4fwy_#8`T?x)8nLSfZ)3RWH?B^-+CQKXP~sPy^K&>P*$re->82v(*rkXv5Sw zYMSLdlxf4&2sKiTVnlw6x)q({?N}-P%6n-3^y$-QLnfPXyih-zEqOH-!r<@yJ!U&g|Lc(`PFYXUv#g%C%>dPv@i5botr(Q`L0w;~(q5f4Cg{$3?OV)Ld#y z!U3~1vf0{`d!TRFHCxdVYZ+}3ivlgeiWX%l&%zFLBtG?<&2INtqwLYV|NHvR;q861 z?^Yi(2H!nkqCd;uT=nwzWt=$3Ki}U^-S7Vw@?-wT!90Jy-=<#hzwh^{E&dOYxB7oU z{?#9BXi>gK{zhD}(c@?q7dBds{CT5Y;LAKfz74G4)F69N5P5~!IsSDTJ>#(6|vP>V2h&@D!SM%s+fds#uZEr)>8F@ z4T8+}f@7IM><;c@F7RFO2Wn2Q%s+PDbsxQ!pP5+u?IXWUT$%axO`qN~@}APnd$u3# zl3cnz^U)t(N*lZ7olN(o)>rGT+LGBdDz+r5?}wRlQ#KE}@v*I$U%H>z?BBgT)0yC% z^IFO$nR(MY|Ni}e&oVvVwJksQk}opL?C)MW^X8qI`CYfG$aUqJv1Jc6$XL58^TV4n z2iRWOoq35r@5u6!uQKm8&i8d@`zIc4I(^1BneWXWaG$z-Pv&`1XK(io`Zn|0oHg4V z&G%+*wyJu2)V|D@JVTFtvTa}H);hVrMi+dS`Dxqp=lyHy_nGJC?Rsiq&mS@$j&6EY zX5^2VSN@t=vS8DXnb%%EVflvH`!mnCZ@Ig?-%ncaVCo-EzE^s>X|QQ*7C{awrnJ=m zd*KTxN$~S2;`n{W1C7rRpDNj3G@_mF`>M0p|K6jBUMc;xy-$fxm7GU(s~^vK;$u;N zHs(O#(i4adN{$yh;w*~r)QwY8g*Sh3@hZ_%O`-@-ylZ@-@Psi_KM;j$?|RGT3zyF$ z{QF_AG!Xv7TW9|uI<8CGEM6^~kNJS`{v-EaCcH02xTkltU$|Uf^kOv?zw+~jN#~C_ z5PxXwBIjTQ^V+>UQ(Ns@K^0|Ii ziVqfB)b}Odmsr#}73c7j4X+phT7vwk*kCN^4SK=x!SSbf%7!y%8Ue|3IDqdw5E6L} ze4UniF<1Nj8@_R>y6Q+u%7Penk8ztO!fv*T%1l-w|J{c5c0xgsT#!BzTj? zCI6l}(tCmTLho4b3h#RF=iXnv^L)WZZ?|gGdR*(KX$5I7roEiDHf>|tmb4vdJJTLZ z&kD@T@U{)MeX-#EqF_<8k~Srsj`ld3d9?S@en-!(xTNB`if@A_?pF3VeiVvtWr&+w zw!hu(D^vb|{KOro+SaTmHdQN~s&A|IfGU;JNB$>^^y&Yk3}P&PF5~Yj7*k)%IC=%y zPuHt&)K2wegKtzTf4~y3Wbil5a;|#IvYx*U{Jmw_XxYTy+x%^`yh9B5yToq2hjh^L zGk=HpJ80==TVQ*@w#@dBZH4Vo+bjI{s_ik`Yc|QRnrACT6S&UywCxRBzHNi8$o4jS zma*rr?D+wEuJOKRJHVbRRH3*Izw8E2HrPo9$$osI zB3n!UAnw|Fb!Pq`{${6!`(%E@d%(=~_9}hCO8=NcQg!7ZUjm_?uc@%e$gfzb`U*R|v^I zE8%8dG|4$-=AFvqy&)v~9N=B?i+*2(=OYUDO}*-a6Mki<4dqEa5G1*<`j&g&47~}a+ zCgD&%XCo1^j?hrEyno2!WjR@=<&Z~7(aRBzcFm&zthN796tUZYK;HS z3mgBtgYM(AfaG9GmASx0!HbU12>xz-Ve(d<7f61`v*G7yS$u;o(eiZo<62$`e^tw` z!&gHx<`JKvH+B7b_!cdH2e)ktoxcIRla|kcU!mo@;ES~U8vG+I?}tZi4;|YO-c8HH z;ghvI7yhi4-++Ir<cLaA+!21ZmWRU6*K!VgwwC9@=V`eZ{)U#{ zg1@chci|GJIfB5ZM)2@>P4l@hdC2~CvKPy#En*=bmy_*cA+MJ`hS!T3wz;ZD*2`^>l1!IligB2z6a051UZdm^pqd<<)rD zLBZQ zBb=L&BaNB}7m77}5xFPqBN_Q4jja*x>!`O!wW1~><^~>-NMp~4m`2EktvncM>~D8m zB1akfM;ZG^I)_kWcRncft~sD#Pp_~W`$ySvMpJf|gkwZUicTjgx(R65+5e0(_K7z3 zi8A(a82dyU`xy53KcYkDaZ13KGjs-L3ptNNqA3l#{DEjk3Uaiuk1MoK%wpLm=5eVv z_B5>a<x?$Nbbw$^wJ}Rb@>=P-vrD$XS7-Rpa z*uhdCC7;Bw{^ufumGF0*+E3pCaidiv+^c0jyrGsG!-Zs@W^f^qTfp0Dxjnp-mb<`( zWS?$uA(4B-g+v|z7ZUjlxRA($;6fq~h7Zy5F!(uIJ`XM=`;34Ki98A}B=TsukjP`; zLL!fY3yC})K0(VD!G)y$68Pm>z7l?omZ!pR(DF_2TeW;UTu6@1h0oFQ-SEe?ycqtp zmY;542W98Qw3$4=Qq405YR;?4du&Kz`L2@rdFZQ;UMJM(dB>L1Z;Ng0) z9(rCRdN9#}J;lMI2O9#(d1MSd29kH=2Kc(Vj6IQMJRPnV>r*eZe>U7)&!MW0%*@Xt zIbcs`JS{r2-ds!cX5GTZ)1ogMJq#T$<7YFM=;`LKlmtY7EC0b(@&!Y3FWSQgYxz?6 z9a>%pe-e^=v-?~KVQo^ z@Htv8gqLc0H~ff}QyEjV*W-)f@T;{vA6}^Cci@WgM#ow_R`BpV6I`;|GS=|d zbGHpmhImCC1b;z;VNvyb^?dY;zV=|2FAE%RWNEm~cRTXEzWcy3-{;^i-!AYQ-yZOL z-%p^`Z}l@?^GAVBe{Ha?zb=^MuMal%HwK&gTY#0?(+}&h1 z_;r)7!Ec-V07f>oH{~uh%>sKj?G0u(od{ml^lET@vklD{hY?+3!LR?(7I^0oT|z8G zi(}yUit*_7LyN{Yv53hJW8DB!C5e}3rrta%NM?IzFr zG4#L5qj%uyPVs5}N<2-RVsc+v=z66sLOfSr@5mVazogQq7!bzQ*igMkD~?T`bxo)~ zT@Ip{JoMlH9yIUA>3$=52TG}`=a;wuDWO)wcsKN~@tzd1>i#~x-Q;4cm16E!m7C`` zIc8WfKOeu2d0lh6Pc~9~1{!u-V}J8HRrk-;`3 zV&?v0+m_-pP|;t81d|&97gU-1E5?XcA?l{Xmq5}sm%^7pa`?;eSG3%k@!)i5IQ7fn zD{{#S7l5*r~_ zZkZQKTttUD#Ks|agm;4EJX!EwTJ8s50$oA9_7 zUkb@NWv!FfwY&x%sK?xc`V4qmNcQOl@2=&Z@aLebseb|fqOKP`zb}C~4E26^Q%Kr+ z8^*jnA@OaHwGNg-(iUEV51UM+;W_9$;pTb-5=TA>lIw=+{Q36OjaJ#B;EwQ&VQhdI+W6FFRyDgK8iG?}uBN=TELWkgYiRy+xM#Gf>#2 zkmso=y@;`y5l1?@WONCw!-yX9R3tH)3TO?gcq?66aRnHx2!fWNkMUJEqBv;-Mozd; ztZ692L%ER|X>V{pTMq}1RXY+3w=ZN_{+@lI7cHi`e4XJw|Nq-;5a#+UrxU*rZm0OC zu?(h-Lt+_B8%L$QwzO|EM`}%R4K>+8!s8vnZ6ZVWg~dJ`tlmCib98fbRy`eA4)jKj zv%s?*L%``q-lR1Su^pK?k={ez;jlSdlRrdkM|V2cIJ>E}&Qj#Jo$orW>OH5`)lu2V zbJ9&^xdynR)IirDmrb2T&J!2;I@Y?-I8@5o@g6ngKykNJRwGkZFC!z?bR+A|8h0t_ zgx49_bvEkkI`5)Q4rNNQ8kt*r#$*w9VdiN)3wcD$^q5xaPI9N5rOIMHpeB^f?B|$6 z$UWmS>EEWswemctT6;1W{&n_r^Vn2(&u~w&8sVAXajA)(i#%8xJXe8tdS-yLJokX} zJdd&UanC~Jl?iJSqSe}j^}G)@CTs#5B{gLT*+Q@6l!4qXsWT`U2AFFnk4Uzv@yQdx zi;}NOcBre9uc1C7r9(=F>XyI9F69U0 z{V6}EM5se4jZ-sJlhju9x9w9qfV)zEPOYU5rKShE)ov4LRQSscjSHI<+Ei}g9rR8w z6}}0cW2}vNXVFVV8EQq*YekXj^`g~9R<)+6w21j{aiEybT-+WUTzpG$y1K3S`{JwB z{^Fmg`L+0~lKtxIl079>^=-*M@Vk;9!0YKl%=J4hw1b**#l*3Vev|n@XgniwXXJj6 z$TGGO5?RJL=6FWcVt+{Lo59;^ITtSD9I2Oaj*M?ama$EHJ#Og)7m|8ew@ygpo$$R{ zR*Xr)$2K*MXU<|jIW|1jQ^qxBtf!1?%rQ(KWEscE{xX)4F^b4CP6=O&O~xfs|2bTi z0TEfoDKZujISVc%atVBemSvr*mXOrTI3zr0wv0)nzNWR90#~pTuX#T=hJxeA>Z zB=xGC_a!89G(1tur;}55z&>=*kQ{qDYwP4Q=D~}Yh;FNz9&vA^%W_|2tUXu7*}t@J zQTy!2>~&Oy{kNz;)DcIH>w3!}*B|s4M_kj~Gu4oon_^ljOPq}-x^`UMI9y`m5|ESQ zykPsd&eW`lTaUa^ucojCIW)p~(pZ;sz7f}$mGouOlWM22?&0{9%X!MChSvY}TNsDf z{B|(f?*Qxg>-nuJ!Qa3irM&(|)HGoXV`XKzu70=b=0DRPr_S<+Mly5#-PGOwhx|_U zaE%%y(H*^5Nnf;$vu*buqFyzMV*KN7M zqYT~AD~9gqjV8a#)Y;Gi zOTbdS2FHmJS7?RY=Eh3a9Sb|rn{_F?p}42@#^RgkosJ#*I{2++Z}3N~WBY@D60>z9`Opm>j=`?UOq{JZ53ZNEAKM)2Q`>&(f3f|J zo$Ije2=&KoZ6X+DN90EEts_dobrGAvvWWCZs|u}@XXd-#?6IrR+PkX3zZzKama71x zy>VVMX0^Gu4RU91CK!rb9pxS8wW>?Klc||~(po96cvn%si4{|LV;eE6d%Zs(|6#12 z($wG5AAx6CTb{f-{i-$oD#ps#*{vtEwyKG(FQQdm()udot6S$FU(@=!);4u}>s;jN zt#?!Zed`~=pIc|;pM6vB{42?MpPT;}*svhIfc8*uHF#6OZQ$(%cY${o+zZYxcmRC3 zpcpLC5#}!y@cu9G2d@~>(1<6etE;huBI8%!PuLP&StuGlNGr6EvCE2QP$#gfWgs}n zaszm?<#uoy*>)IvSY{&6w%kLzdBF0J#ikZm9;5zA%VOlGEzh#G(DJ+`QZ2E(#6Bx6 zuTsC-vX*-BQ{-;qpGZD0JQG<<#_~D!Us!$u#Y2&Iy5%rO9kqCALyfHM!0y&et4(ED zdm|694grT+&!e3Uw~hcuSw~ZIp*7nYp~hP;MxI2jF{`@FdL>&YTc;pjW4(?u+-AKK zoMpX-`Ul8F=2A~u``HTA6r!cA>IT~_wA5RTXzAx{FVgas+TI7t@Mffcw(S5vVclkO z<`|jFezhH?jRqpd(K^RR+(C=HJ7O*PM#THz7S?WHWEFW=ByGi52RgKl!%g*Xt53{$ zgNJCBk2hG{z^jU-cDea5o0}!=xVFV_Fh6wjuBD4#Jd!E zjknAjuRidWd*jqD?>F8E@(|4MchoDhk8gc(>j*We^_8@+Yg=DW%e$lXSI9rK-VYuk zSPa{=UJD{E&8~XoUq#EiBmZ%*Q9&EpR=a}9;LQcMg44)nU{&`N++Pr>9xQmIAVMuD zD57Qsxecu9+>)G<`f7@?)^#iWO`RL{4W*14rpZ}$r|znykJmt(tzHgP@i z^$sHIXCu$ik@Yq8b05-fKC*44J$?Ki?d@LizD^t38r;qdwqo2lmv~sXP6o(EcCZ3;I1!?ethLrzwhJOZvWzxXWt|gQ8rey`8Mz_SrVbe^d^qe* zL$ehFrjYHJD%M3tEkyZE;79RjCIw2ujHe5k;87e*pcIKVYUAyCc-u(_JUZK z8XX%ESEM2hPrW*EGvlVHvanUR&h!jnHgeRHUHf9|sXh2UHaz&0p&^ShGLnU2cN!#n zndjvt=YxgDs=XJaWHZM6GbIRiOFiMuSDLz!(fdcK^?ZG72|l0Cq5Qs34x`RK_Vo1x zd-?i+1AN24bA9LgtZKNC)#z~RKY7zt7%SZ85SlulVU9gLQbnalqX~1R$C8acF1;Rd zVtNvolHPzCZ+gpgmuh9i3t)T*e5 zJ}jvsP?4ZBE}c%@u+l{-kYeKL>0N3;!S`iF+}vXWnS9Gclw;%OJF#LyNWkA8WB)CPum>}nnQ>)tgVYD7Y`v<^RrRj2US03; zdTDB5z3=M{Q9qpIi)yxH$*TA7wqcL2hpm=wz0zX)=@vT{Iox_5vV@0LsJoOrh<|0N zuCAR+#9P47_?kJqYBBSuW8_B+1bQ$R$)oj-{%>l%J&&C`Ec2MB;saHylCC#oQNOez zQeAFnd@Z`II%%=)U>s2ziqJD*>o)f92kjO3I7isx&_?23|6Fx)B_rQy^`~rNhmeq&!GLUgCxcW$J9!$>Q z!y)5ZAEPJ#BqVqGlqVCC`m5kmwR}DNPA$)b-=$@BfcY{c`v>3;YB>-7f|i%U*J^nk ze2bPpfd8sx&p~wikZ~UP6Z_$V!B!)IxEKKywtdk&K+ z7LsFq@Mc;Lz}rFM@6;aNQ`cv~2WfdIe5{sp;rDB~6fR_ZFOHW|^ZZ9t~~!K<~$|Lf~=KhL9ba>GqzmATnO(O=0CPd^PdCEe{9F+ zKQi-aZ|%ZdrMmgggVaA{eGxo)_A=l0oGn#7e;TuwKW%}C_A28q<}kCW%wd$V7M+

SA=a1S*O_|OjwF9}_ z`z>f@k@_9k>5pZk8i#*X1Rhjf7{_+^_wb{UH+-jRnj=kVeJ%5%smzp^4Yt08kxOX4 z^mXeWT1Tt>tq--v#(K*6QlKD%S$MmGDa?qjDYy~2^4#e@>hCXj5d2rcLu`E{YzB3t zAW+iLmSJRv%Qo^~#6TM-z_HH|ZR4A^)^&!#-O`o>%mB{Gos258o{^zGAPo zp3MwnsBHu|#x?<*YP${$<$a!ESZ42xn8oaMROBdr;rk;OgHK1U2G>Te1=mHs0lpRa z7C6X$4x`u+_L1ODdpQ`&&-9)B2joE1nNb#%AGHMh-pJUL7@b64{#A4Z*xk|HfgaB> z7#!v}51itd0%z@FF4OL4}8q?IQVwLM+xY~6TSeuB#ArEb;-9TW4lS7 z1};fn4Yp5d<L|VKKQP z%ARw2nZAFsO*wAann(X`H?r-x?6K%APPTG|R?j+OtTS}bnd6$K4jJoMOmh#3DN{Ga zWX5jzFR*xhmXMWnvE|E?EMBX~`hbgg`vX8`LzNux2!~8q(5E7qxI`I$^6Cu}< zxCk>ILgG2iILz>vhN>}{W_&}{m`pR)p=wN~8TU{%Cew_8s2YxDY>=WF|2dxcKi%8xVh&{#u>}5BGO5 zb755VcL~pnAwDk>Yk3De-1nuF|K>oy4)CGq?m^UCwjyk1_LWh)>L$kbLH^lsOkq}=HRHw4<F4lC$FhNIvHi=)z3@81dyb*Om+SZP z6}qa9kjUNOS8Dk>_zXyViywzC()EksFKYRp_~?}Ft(-&Tc-|08HEZDUe3&sk;l8Hf z^M-Jpqv#t=J>xE(D>JW!tPyRl4Sgzo;w0{^+z-(wn(IfOmOk;L6MDmJWHU#E;++$o zL*Rew`>opd%z^)!c}93{jnmbK1`mdQM;u!Iwr=!)+WbRwqS7WsFZ%E5LnT@_L`sFP z9~W97Y)Lh`p!LiZHb!m)J;u6TgX|;hXprpVz|b0J+l>{ycG-Vel;8h@lk*bDUFS0rAI(+IN^9(%MNMdp-3i9( zx_4+#@DQKA|>m%C-sZz;hDL1+PiC7F=ogEzeB6 zD-jz_ViD-m-pk^*oRFN7EPl&l!STscL6s7LZmmN~A22s%I=DEc2z)N(dGOnmgJ5IB z8~JA=9^~8lzo1)NX?P@-rv=l{i{{^w&wDg~5!eX-WX==jpS-?sJvB{>S{7l;C^`qs zExHqYsc0?OqPSx*-qFQEspz!m zK=kNn$@-JW>UmqE?{Uc5!Vj{Vu&gC4D+$ZfA*%?>%AcR}To@|{vr4C|(OH|7IJ>g~ zr>wszt8dDaF^V-eWyQ@qSSxrH`dC>TSXKs>b%Bjlfmy*-)^DxNTCK8DtE|&1tF+3~ za3Rlvtjs!{RW$Eo^~?pVmno}d%37JSQl>l~8_?*=>X@=NrmT#qSbw?)`rY$cX=Wev=KvC?HRYg?Amx@AQKS;Dugo(z zekkjeWV24meAXvgg)D1KwPSWULG=El#gwIM4}1@O|y@l7EI%|f5(OJsFP z<-glM-`}*cL^owOzP6RbG)Y9$Y9g5=j!9t$Io!ILtWl5_NV_C$a#~K>G}d6rOY57S zn|_G&#0}BGdKx9T*Mn=YK84|m6AY;Yg(!tvnsl0oh5#QOeXIkZF;j5wW zA^W|cRiQ*JW#P4v%QN>r>q(Rs9z)r6F8&&~7Ui<0#Fs@Ki?evjWKD?+(Kml4+U62_ ziLB!ytGM{Eo8+K%menR?{b^Z!TGpOchp#%4bL5jFVoMQAN`15yA05p+ChJJbDw48> zq{2?_!zP|1Ye=$EwX9Put5nMx)v`i$IT25yqmYO7ziWOb^Rg7?XI1B9cTg|y`sMJI zS`N=uSap8Zs#a+KGTvGth#wvXXag*dhR8;5Bq9a=4Q*Gt2p*0_$#{p zHTYUcVjfH3k{eMzo6O&qF<1Kuc{$vSYgmQ6TF>Fab0>z+=i1d{oB_#a?g5vaigHew z<4K%@#C|>xUjoUTaw*)5eUQ1I%=;!$-vI7~*nz_1BYN<^>@V{} znH!#q{2;tQ*B8T=Xn7fYxt3SJS8BPYxnoW9#Y;XoF<<=OI7gKGDZiimR?_yQtw`Lp zv|EXZ6_U7TA<6YEB=NvPl3pO3M86SEvHTxSGA9lviT^$ok&1-;_cc>I+fGH2_vut5 zYZ?C&l3eNkgz9npKOtFz@}H2b4fvlV$vOX@q-3uDpCrkO_MakIzgtSx=ilrD%zi-n z0+Xaq2q&|DsEM2XMorx8PyStQ_Cx})ypvud9Y)cBSM{1Nq@D<(M_#melFfnyB&4a zR}PD_fwD3m@2Yw+Cr9(ZtQ;>a!#`@6Gso#wQ<#@Ws5_j~sbA$>=ZsWuXq}aK&u(_^ zc5)u4#nnJ{cV!ao-pkNg$=uwbOg&YptEbw`th*ihs4VnL{oMn>GYt=`%KE5PZer@) z8{ARqJ;Ue9)Is%%$x^*zL@H|0yZLHUy!qLpfv)EsP^)FmlObv3-g5|R_qO{F9cPwu8h8rrJtB;vkPN>}9WDZNwdD&#+wn{o#=Po+Ey78=^E5<|PS zCuJ}D?@RfS==+}xO;_vGcFYGto@QmKA0lr}EeCgNf3sg$r{)hd1bA>6-epG(?=mx6 z-8a4nwFeylGbqECY+71*+IY3g(2}(bqy^Ca1s($@=TFU#RM#24WFfs-$cxNcXfKRV zuEHjT$*L*-V^6B}%;8hiF2jqgX;B&)vjIiJz}%wg;PRrCMK<+v(W}U-@Fi=3J}teN zd1rB3u!GjEomK2mx1v>RUq!37mVMS0|4`gY{fHjGp}r~ETVhi`mNYn;F+^3w5vLLI zI+M{rm7@EHIe0(*r~8MHep@^wdm1?|hE?hr?xcQ|V-3B>TBCn3_1oezxr4sKb-b^T z90%QILo$R@aEE$}$l9qcj_2F9X?qtm1Y?XA~gHO_RuW@x(Yb#~X*vvjV z=v7)MOEtRg!PV-zSGm`?`8-BejSV`h#^%$|c#G%f2znm!W1t1}l40YWm;uVvcz+yY zRiB^>#5>r?vyltqvUZ%T13!_k!|aPf-lU;?9ij;z z^A~;5NAyBpB-GUNw4%=u?O|oDcy^_}WzBI7dHXPbR8vnb8uC5p5Jf{SzNu!9u^0JA za(6_MyWUxZtdWkk+y~H(W)Th?iOEfA>RFV(mguY!g?IDj-v#&Upo*|@fU#>k) zTNL+IEyH?-P*#vz4Ik7c#mkDVYI!Byd#IQAo^`=~&>DDjhFSw}dZ?<3-BwGb9)tH8 zGl-#(#9HM-M>pO=XR*q0seE zE+l!3WxeQMAcam-be*}7Eo6Eb&!&jAkV7Q&3YWy~Q8WWAMyN9%VBZR1WeyNOY5;Z&W^h zn?~@)d|oIQ>eGb(1H>h@hxcVH*&lu>ZQ^p;BXk*Lu4Ph&{39efOIf>2UBUGrSugtr z=r(8`q$czIprMfDgfZ8vDMuDkIm9N-g3soA%!MyOj|!<(+?pj)9_Xf`w-S^!B5 zndEmieLl?iF^L_!1`>U!#DqyaSU*U86!POReK^E_L;Mg;A4JptP<#(1pR(jq7XLr- z{S$vb@%0m52=TX*T+-q{BR(_YFC%$uB!^8)NbM!w0@?^|ha_*Y_`wW?WW8`R|Frn( zNxt@GP&cTzrU7utn=bj%#gFY0Nb-|QZgR;%Zu)zhacE`?ni+p4v1bxvX8Kl$Uxmb$ znQ>)iOqm%^X2z14abyxhCVmoT%$ON3X2yz{abjkSm>C~t#)g@3VP;I2#Dhr;nD{yf ziLZmidkuvo*2|3ZGGn|%g1&Rop_Agsi7F7QgtMWmM->3c${yzfOK1EeVg~$Ib zRZ_=ax%UTxM-Sz?YSMFlu&!EqqNpIWBekOReeKI)3{t>v%zTcjt zezG62yD&HXNlno1iDEt9s5bP(gQK1Wmqxu4m89N{`p)Q^>qhg0L`zP)yy%y}l~`}F zmpG*7?co^8Dgq-N!r8C+Dl*MY!0?`2EevX>AgERJA$3D1Jl}^7lLD**Es8_Yn@Y(XFBf% z=Q-~OA9NOi#m*(*GUsw|1r}nii+#AZDtGQeKFp#CZdPD$ySO4YVy@_F4z_d!z_zY- zUUNy!wj?reeYdkemTz9(S)l4kM#E`n?gAZUqmiNJ9;6m4v>?zjd2qpI9 z2vvklnFva(%Jh}4NOuQice{Bn#JW9Tyt_Hr65BG@a*uSUs8QIL=`G#k!Cd!Dcci+@ zeGl?|?)l&Y?n1EGy&PPD^_lO5<=L;w-Mf$viv3wd#<&?(#>RNSc&yQ!Ip*w`TI#%* z;mG4+#)CIwndZJ>nnr%oD#I{5W3TpYgTpf?{Fkcd0!OwA7LJ+2nfDz&q+a2IkfK4m^mp zozI`(<}DVRPz&@WWPn)-!@%r>E5WN1a=_e#<>2QDzQn%DpV*r>U0*El)F;jWXC)Sb zVvV<}rC8)SXHtVCz7f`V`aSIN?1@F5cRx0HwkFr({pd?R4~$G{$H=)Kws>?+DS6-v zDKCPrrF;Xb)JCa1@2Nw;3sP?Y&8(yckwaNYI~aN0#fr{Vu%Ywq((=K=v=_i7X)D23 z($;{bX&b;zY43w&Y1_e%)4l}lf$o8hsu#9)-bjJP0jqi{a0FTG?sjFz_RefN<32DC z8$A6$Mi5l(R}2Qv-nIzLtCNQ=3yVBwe&%;jJ?qM6Jd^JQTjsX{ug=fQZ>tvPe}g;^ zOZ}zlXn~~=J7{4f7**&5-GvRotio%->4nR|p9_Bnk7C2ODrZrXBKq*6{$MuNd|G(X zGO)bp|6}h>;G-&%`0>f>fDL$nq6kPB43G$h0D==B5GD}RMJ0%X!pcrUE{2?Ba&b%& z5Dgf1H6SQE#EeG-qHaLEqJppiK`~tFqJlbzcx-ls)kR2vo!__Sbwg;KB{SLm|Np=L zXCKt7SM{oo*RQ*}s=DXpYn;Dbe;nuL_5Z@zP!nE*d}?BG9$zyN=Y*PUoafXO;5@IU zxCY;os;R~G#+p}g{aQ_34Kuu1vl*PN*b|@`4%HmSwY%o8IRA+K0aqC`>=D4_fvo0ldK%`r{n_!XTWtzVH>!v|j*ijvWIuSD(R|b`78pVBY{Nr!&3JU>-RWegwg`R#aDlik1ty<}}@H^t#&=KQ_0Q@e%*8oW7THtQtx;rqbWOfeuDB+j=|KRk@hk>@S@5?3Zx`2}0Urj?dm(?S3xM*u26&*jCjaVT zajnlAx_mi!G=q@*qrjEox(axmxTd+~3vt~JGY0u%Brkn3Z&~1l3;qD$!Qy%-@Gatc zI57EcBtIIMd^K8QCm$_Q@X0S51|XT+fPW*d$xo{l*V}=2h->oQ$Y-mA{6gSA0VwS! zz=y;&`EZc{;*&2&zFRcO1J?+?^xsH^d^PgZwt?6NO#T}2$!FsLy6y-(NL-Hv&IJqw z-wsTEoLAnc`*3tE{WmXvuqb^0t-mpXgfpP;@Q*D6fq0 zrM%a;*Ya4R-N0QRKiV9927fUChrCzt&X{LPj{ND(`&9mmmchm|*Olig{J#$0GvhZ) zWA`po_z|O0EHxX_|F~A+e;LEo}U%| z<$p;xAFr6YrOVli>mPl##E1TQTRJYF6y`Yp}d3m5UKZ&@8zFQyz@lE-iKX175=do2XuR~^(esArmN?+kp_=~G&I{Ie3c<4=q z|MO?oEACHy;n|NBe*b^ef3f29S3ezB_-~YYYSz8<>Z=|9b@B6-|7Jl(JL}A{ehPoe z;BCVaJa4}jqwp>L->g{n(A}%1EBwvHH|6v#Z2B@!;XnGuu{WwVfBF2Q3jc9O-jco6 z^{3Y>{JqX~kFLlWU$DEuqmH$3>`t7Yes6nCKkM;tr3W zE*cTDFr+0D*PE`r?7jJWp4b|t@N*vc>-;@Kiyx)^l`W51rQg5sT-1S&Gg~ro9e3j& zyY&y7RJBCmhn?B}(U517{{D=@U-#0kWltBDL(*yIwXJHEeH-*Rlxcb@5XJQrpL+OrJ<`;GN@d1Tj zc>U*dpZ@yZR|*yWpLaNayZqtbKD=DvkDjq=*N!Q}cfF|aH@Ti@e&Ce>D|agVqgL1I z%~cb=IHK_TEgNxY*q@!%XBGYfRZl*f`^R^GzK$lb7RR0~-`_jsox`sWQTSh(Z~U>_ zPiL3hsqm|d9{A9?$M`|2!vAtgpZPyczwXI}3V-C_-cKBU)%BHA;jh|s^noe+KVA2l z!jB%m_PI|NIM3`;_?^c;xAx9E3*Kr}_&wH)eeL)kUMR;$6)rk%UVPv4osak4XH@t% z4XOD4*mIqoqZEGSKqwpWvyLR61CXO#HSNIX1zsSaZ z-RGTZh5x8${O=;yr2S#5!Z*LMY)xgiTR!?s;jiy`^p)j@x<7SN;eT5A<(paWtZKZ9 zHrus0(tkMN9Ho`j4p8_lL@v72zYm*em4c_Xz z+J2nf+SfS$P5S}g%*yfp{h0z*2w!ua_iMht_Vwwfaras8U-LV~7Q!2S1mEjLq@>+c zoTs%*Y{v~V+m+#(esOal;`_^3@3Hos4c{Q*%l(M>{?q$~B>KfpdqWVX=x-0+mv=OT z^RfJTgSi!v;5q+`1pog$5YDx;drpC^VNo@JMZX>xCDMP)gCLX z6dOMK|43|D|I)kub?yIDocLh3!`<2$=r>yM#M>MpUfZKx&)*r^`w=I0z&qE!6#mO- zv7y&Hy)bcxT-zHla{RIjQB3dG!S(Oh>)+JVzh>+N^;xClm-RHqR!wrk^ zReVIUyx)T!eDm*aMl|>4uW@d~H^|}R z?FSDTJkT(7@bJM{Aw`TFD|Ox&dF9|LTtDrNk)Oq{)8M$pDkABvjqUGHAs#c;$MJOAbqvGdkP z%|EZX5HBQ-!c4eMAQ3t|LTGMg~ZfLM$`ZAj-MM^ z#Lwm4ATp`t{vfY;4ZG!kadj-`b^L!Pt}gc|(YuiQl<4|@@pe5v`F~5io%Tq537~iP ze@pCrEaL9tMC`q_arhO8#gD@?J`P+Z;`4Hkl@a{^N__sK)_n(u_E(Xs`8+V~v7&4B zZ{4^2&KrH-ja>09!2j*E0GdyTb%|E-B&!vor3y;wJS z0hsp6dD{oQi1w3tuiLmLg6??!Fym^vpo{`10?z}u5&I+-;a7nPz7=sL!dpTA1we<< zd&ayE{DrudJU8f{0WI@84faQcxGuj z$ZZ7uvXJ{!7dLDI{hA{8I%onq4(SMgNzY)YQ{>(Ty;U6mS zCjtxukGO@u8DQ`Ny1TdE)4iSG5zryi?gC9f_r)#4d$=HInf86q1TE9<22Id1?FXO< zTBdCPeHhU4eS8j@U?URK9l~FLKCa0912h30vd%w(CTLmiPoN1}mitf8Cjl+X{TVa? z9aW<2Q=kdx*d=(ULE}@xI4<-dBWMCTiiO;bpl?y+MuH}wW8eTCj{+U7$c+X~K*tP` z-x$yYbcBnvF`&l+Vk8Z01|92_yHLMzpb6+0E%F-=nt+Zt9U0<46VP#+jtmn(PxA6E zgHwYf#dq5L}2p-`npb2Olk%}OEFKB|Hf=75N==%V-2p-{Spb2gj zJi@;PO)y;W2tNRtU{baI5QGyz6ST}P5j4R>AxAg~G{F#&AK?_x1mQxCFs%;}j2Aq@ zvp^F>inN4npa~)bkML~J1TE91gC;n2lU`@S8K4Qwq71^>pb1*$HwQGqIgyrdE@*;* zqFloHpa}*D9$^P)f^S7y!lj@I`U^S24}vCW$twd*FhJCg@Dk7jE#;PiCU{HaNB9xY z<$y53BfJbWL7m_cUJja|pWqR$1Wj8IhkNxVH4vtCE<2#*_$>fk zsPN{4b^sQMw1i7Q6VQ>TBmBKS%=?1ZU+|WIenjy43Enc$1ayq`o-x0JepK*c1g`@0 z(}HIdyk|kp|~U;16sbz6QBudgdE|2fF{@=c!YlhO+er5po8#Fpb3@o!){9(X4r(6S#*KZlHq23TF)<2Dc zHyHFJfLr8GI3BbW(DHc`KraNeY^z5=zoYQBf+nDYzWYGOHqd(%xxJtX{vpaGybp9_ zJ4$h(4TgZ8>gB=qr&~A@K|c)GC(;sjVPoqK038Y911vj16SU+tfF@|kb77O^aR43r zp3w0L&?f~?_Q}(r@uj_s`cNs#B3S;dJ|7WY2%2Dp;1ON~nqZCK5q=Q#V!%^^NBAMo z1eJnE_+iil&j}vkGSCEv1ds3%&;);8sy_qaxxI7type64<&;%`c z(?AonY=hr|CTPi<0h*vC&kCBLB`*PV8lYtvvp{Dnayg*q0Dhw<_u^d8`GBc{N4NlV zAs|`s2p55#3n&#l!t+4S2jmDI;RT=_fMUTTTnf4j(6W9@KtBqgL-vEmKtG|#Jqfx> zk#m7wtH`YbU8~4#0KHL>+XR}RgI=^3zX7@qK!>c$o1otkyw^nEe;YIb9j63u3uuBv zM?D_m6RrnM(6WqOpmzi4kn_q1pb6-Z`RxO}AJDR`J^}rykdyWM4D=zvTO;b?27Lt3 zGVL+Y1TE*N??8VKphM>OSI~`u_n64T) zS9U1n4{vPm+NbAKn!w&(_F<3|V`_~4; z?*KG65sPpF=tQsFg)(M>CZMCkUv$|d&;)e!z{E&688iVM-Gy8VXo8PF)@2B%f+qMx z@Cc`Y&H%KWS2IBq(DAj9%>qq82NPvvgC?Nkh>*(xO+d$2f|m>0?&V#0wtUb93a=P+ ziI)evK%^}NeN>Ta1pR};`w=w$W;l)uWf&r0+XGx;3=$3lP0*4T0h*vCZ|w7E13=6C zNQ9&j4D=4F#R8@aBSEpzs`^3FtVRufL~a&}E8TIp}2y@Asey==fy1p7t@& zD-^j^pw}zB8qfrEye-nc0Gfb~je_?gXaYK36}*=~6VUOF;Qa|S0Ua{G4WJ3=_(8~R z1WiE4Uj*-E&;)ce3f?Br1a!EB?fMGn*S)+8?{~@zm}>zE*hfyXgmXZ@0~kC@=MnCM zyCc04h^3Gq4m0TKfR?tc0qfRb06N0GXJF8i0H27lN?5LGx0I7>+b!kf8Y{_-r4tUh z*1A>XN0`>|-T}~I^qwIHn%4C$s^9lPhCTo~ZWMAif~NJ7FGPNX$3CTJw(D6PUtgu; z1lNt;#Bcmv$L=Z}8wGYrTF4~`I^mR%dsn3USkQkF_-P#{2<#HrEwJ$!abIAUz;1z! z&x-pJi*j6oHa;ir3+xiuE%`6#_l?y;PGFa$|D^L>8+7azeB<*%USRhoAtz~xU(@-< zwc@_OZb`qZ^W6d)*XeYEz{Z^-ouJ*4zh1~mEae347T8!L=xK4p5G;~TeioG zBAvi4iA6bXLAwQQ+$H1%b_;BLN$>@B3G5cwDB9Qfo-XGSv|I9PMS6i<0=oq^iuaNr zuuJqmx1fz1MS6i<0=oq^zAWwwY^>91_ggwPz9a67`nmrs_&ap$66xGB{Z?^b^oIo5 zF9bHeBJva1CEIJa$WQRy0vlfy@&daAHtx~+Zb^%NmLRZ8_Pf`G+yRk~pcD4%v`gL> z*!YIvi~DXVC!Rk+-WS*{aDr$zmux?Qjc9&O3*GryJdeDwDDt+ zpTI6juhsdkeL8jvY!v<2xL2eT*d?%AV55*vkm;Yr=1&~PgMGdDi@WsskiOwe$D$cJ zEq#S|yX&+FEg2G?*V7xG5akNmsL+EI`oyY>ehxPmPjcGb0)+yNQkLmT-1VdtZ-~G6LKUgp%miL22dfgJ# z*JI^9!k4W7CCWc>iSoa@M0$hhNAkHOmUZNpxZn8__YIYL`?QQ_$h-*;Uit6a@A^yR zZ@fhQh9~s=+lxXamUY;=>fhgYule`&cV8mC;S$ex;u7zt^Ci+7FLD3$CGy|;iQfM^ zi3X8awvX|UeqV%`y??7f-Xol_R&SpHf+?|-Nf6^tjthz9{e7bUULhC~%lmGjKV-cm zmiLW&^z!BWAhEnZR`d_4k0qA(jbG{M%LPMXc|YNO{r)|IA+fygxi6e~`x49hV~^_3~TB>f}Ab*NgWn+f`yIqlx>z^iPo(U%tjCyF_}| zCEjmoq5gbwzn8?aey*qV`*Qx4`2782`t#o}7!u3-D*i4e9<@ic>h~l z*?zw2U)sw0?`vcIOW)Gplhhv)`+8oL@2mdCm-Kw)xRzK=KUUZW((aX5mGecrLiPS% zA_OFM8Fl^`!IxO|4}8_%E&8RbkHl&{hWU8^s+=#{-NyG9-Ny1yw6T0&?Ppl7zyC|= zKVRuxt?d84(r;~Ldbg01{ZnFJ?@Q$;w6Xsh4SGMFAu^VD>&-g*{f(`xzpwOzTbVv#pI%R+sF=iRJ$=#cHom{HqMmZzmN=n} z?HAw5=l9iq2@QI?NIP6&wH@61b-6y`hQ!9FbiSN-B>qMEHqPG(TlI3J-zl+LjxXBv zww_+v4H6qR>wKxNB$n?-=4X6Wmy>p>#I9Dpzp=i`mjzq`k8k7r>GS=!^8F>$>d!Cz zGl?%z?en)2eDr^#&`YwtB|e`}T==U0*jA=bsMqT+6CX)Dva z+Bko@e6+v%oRU`GgRlDMv{L_U740m?oy4-dOJSFYkIC^VacL{df6UM4SL@^J`L_za zbg6mWCEl~N+ay-Y@kRSAzm@&RS9*6V)0g_tf9{v{aV6({iPh(DZ`0-EdX2=YoG;of z;*-6FfW*G!RXc2J8^@2)Py11=m#_ABwNn53N^jhvx2qfv607Ck`CpnpHnej5`KrHR zwO)UzZzNXh?<@V*R+jH-{sG zBkfL!Tibu!t?WO(`d>mD%P(!^^SeYjQm;vTqK)-;x3T`lO?vxFy)Uua{tx)*|Eio% zTC5Ms_bahadF6($_vdP5`)?I;a^99$DaI%1t9+xYb^SNFjqR7w#`Jk@Oz-RY6I%KF zhMszyDPOd(#D>4??I-J$;bKS7P-=`byuqjp>bTOz&=G|MgY>!EG#m zY%9~33OhyG{SvF~?2GnQf5RX3_b2TJiPe03r8l-QeZnTae5v;&R?9E_NS6y2HzYRx zN$1P{DzTd0SN-E#+5W!LC$uvCg8$O^AKS+EcePS~Ti5nAD7Y} zkoXt*ys68{eQ^^1Le2+cSsVL*=eEATb$b0}d`Ds*)%^uKp^g3DSNpqL+kbrc{|2#d zTJ~p&)dwi;tn0ZnaYN#SlX|;^3ckc@KX|;2@6Xrs8(Ud_V;kRpsh{speg3hcp3=UQ zSZ!xtw0pbW&T`+B#J=R!`8UBw{~avaMaoO8=DW3*{{AoeCLRfWtJh1$gC&;n5t+}} zow}Ud*DA4Vlg^iRyToce5`>#AE-Zx1aQ9B$m%1vCGH%cegTr{ahRC@Agr?tly<@ypQ%bigj^0A4;s|XB@1z z-*Rz7Vt0F;KUnZ3{zZDRe_QH(i4$7sKN_~`?@6xjOI#}EbuJ2&SS>%nPyL~epHe^5 ztL3|Wtlz3~l2*r$@s$4j6NG@ouKs%aj}?50)%qv+c>k_e+8?EDwEv8|_4>=-Ye_7s z{R<@Due_1qXZfoBa`||FIjz*+34YpN>ip#LbN-XhEwTGcz5Q+$42ca#biVxEnZ)Yz zCy3vF$#qMKjqmB{r9COJ+J8zLb-5T(zQm>9>3lhFNi64~^YxF_`{_%9A@Nv~&c93W zC6?(VcKcZWarZpx?DnyL zl(eDnc{}T z?$i2n^%Z=HRXeJ5mo6uNpDgh&$`K5;{oFp{kG|5Y`oZnP|Jf?$btx~g+W$%q>-8Tf z3Y2(koz8DB_!3J!D(h$LptoO&U`RandYwN~@FkY@IG_HRUoS`ASFzfD+uNvrK4@cl zU-5$k@m#XKC03uuXZlwD{^MLa^T9xg}nw zuNM`4ceGB+-_NV{9~GhBze3#DAby{IyTX4%@GS~|tMYqxHUG=I>G}I=KULmeI<%*r zzwF;#6#9l<`hDq_{Y&{h<8!_B`%*8w*W=>+7AyDF`i)b5e;91MIKPe|7ngs%LPsdH zn*Ts0fAzlW62HHE?1qcWKXQ{!%l>q-zfQ~k_B-YGpi7nZ>Z`QJ6H5L!EBBWx=?zN% z{{1k$d|&?gQ%e44MSIEjHD3AsGb7tmh;5F?=HUH!A$YfH(@*@=edYf{8w=y2~DfGt*ZCBD?F2;kj8#XEL zuTG)gQRv=^e!EL~o_iJgi5vBHlzv=4rJd$0^$k<%Yf|V2CBMN+d&Ma9IVFFm@;px~ zbn=jk`lOf=cGP*<^esuj2lUQNR-Z(evfSbKFa*NSQOy6UzeBPcai+xjnVmX z{+IbYr;J;v562hj@_j|VO9Z~nrt^)0mZ+;zA1Qx@Qh&*RGgZ$=`ctyp^t*JvjQ>kJ zvC*pYdx-)ie|N0Tmv)bAw=WgGl&{Ox(Q|2-f1e5>$9vR@#XPxG~U{*sn>sF=5E@|zXA zPuk1x`QU$evtF+B3#9z@ir$cRb$=iH%arelNcp=IeJJ^PCcRuae&l@mkPrS3BXxNh z_m%RWj@J27@5y%kn-6}BqBo@c^Aq%ZkJ@*NcNuy;`v}b<*HtvX+;ljSK7b3;!pkNc0GUD{x>W6ZBU*!Y_=|M z6g?y2R-Kmh->KYxOnD!-CF=6>`Is2@(oRX8q2HJKr$K3-%oP2;l%FzDr=^`{Q|S9G z`hD3ye^lBdS*g$BKj`u@-u;uJ&&^8vzpuRCE=u`p3iSM>e)%?Cr)B#UPu6J}ult?S zUhRb5m3IB{NxHloe>)ZZ_|hExzU+U7u{tgLPw^<7mg8@kBL9qX|B8XSyqq8YuDp-f zn2YoOMj4MImHuQ=VCqu;ellti)r9b~- zg8Cohe=YDIY=NLIL5yG1sY}q+L7ltxxA5{h9}Ffz^y1GdGH>j>Cnz_2d2-Cq=Gv2!LE)v!VlZ6M z7idhUPMu2cfu(x6DQg;t%;e*w+-Y>SbD$CsbtUOz0N@QY2 znm;u;pUnFt)|_lxR$fYOAUPzZQHx~+nsio5QhGpXXC-C@lrASfH6t<2F52FYmnWMn zDJMTCH#;?u!jn^G<_Gkel2cOc*5t(8LR(hg6;H`3z>BuqiUO&6N^Wj;K>Z`72pub+ zSCyJ*&&$Y88yZM;Q!}y?^8!gYE73j+V={n#K`Ap6bJ~#9N>3a}dRuB@l3$8Q_T`LJ zdtPE-15hNj-a2fiEucz6)23VPDVd3ZJaHyePIgj2DQ70;=Gp?&b(wh70AF!tQex7q zfZkDNQc6}{ZelUjEEL zDlFQ$4M~TzA#FfLNp4|geqKsI=2xKeq}`SV6|UQiffcN0&{o@1)B^~1dvZo#)33-R zKPxa37Rdu1&GrmiU=~)u_LV&kLpdO4fksq7`qG=wnw6cEVav)7thda~%u5VtINRsi ztwm9{1~Mec{|zWzZh%%Ztg)n&nE~3(d2@3Dt1Z%{+p>}adD4970F2|5Rz|7{ancBC!aua}k`nPc-$`=M`9bTKm7 zmJ2V~pTcBHihB8LF`Q3}sBgfDbF3_CX8%AQRwQpj(ts4SQq&b$deVJ$b5kM%o~bN&CbpAFZk$9X3y|5ilC>0^7XgHyb0;#Pe1V{ znwOoGV#`YPYt&zq(3+c)=+}U_IJLh|dVZRqI6!2oUnQ$)t$sUizsP}VVGTe-|4K%F zhVg%qgTF1AZ6_V!~X@5^C<&p!Bks@Ut7vb0Gw6I1;f_ugb!!i0VzZ`KbR#+x#wD93Mq5ZyE>J2@qioPF=fpHgA1CS_+8 z(7p)2f;!4Ki8-_UTY!*BGg9*W+(;r*dUc6kqboNhm4ZZ(nThEssrgy{EtrV3_QJ%R96!U+ zBB|ezJdw`tZA0=ol`TW93eu!z=0*DNkWebWmy#$Eymi0!df2mbktiiGH))n%qtTlT zC%+TTqmELLl54kR`&CieG!#iEe@dJ=H!sB=iRH0W|9Y56N2voSj*r~)RZ@1x%*;3~Qo&%h3PH!b)GI$fLzh`Bs^|=Q~E)JX=mAo&0G8C3Sw5pXn*6<&E5VFZ`aZFHTOB zKb7|`%jM_UGO#*F$e*;*pvs|bU6CmnetG2=C-!r3_2R_d@&m6pYMwhrc^AC_w5SfuU zGbO|8@cuWRKxh`kpYgky3mWD>_$=NwveKInFW}!dsaG=6d(KR>Nu`aSNoj`8_=OP; zcKtP4PmkUH36H9^^H6S|^Aanr8O<&~#BFQsc2hO$G_90ng|Mz+M|mU5$}(#=H1S4W zXJ(EpGwW2&S?YuzgSC1Vw8?BXcQ>2ah)HHs1PdBvHk(X8vsDzd@{570-Jymfz0WE#%IrQ!QHP&%BwRV3(DHOt79O3whq{vD%GiGtc8S z5$PsNo6T=#T|68&&hzIte+K@7W_CsS1~VVj;{P5q_x{)V{%i(t zyB2xwK5j3w@PCv`88#$Y=9o7H)Cg zb3cz@C9iN3H+{jhavo8SgXLrew_~Nns~U!z>l>Hu8#=yT8^tbbBC>&9v7YeO*x>e@ zUAy1;8EcnmuCH_6$2wKjAv0bcYvb&mt~{Kx;Ynr-3#u~T;B+$W5NAQ_ZMM1%Yc}xC zyn z(1v)lNuG6VzRShgm6OcDmvL4#e^&#)iv{hpmCa#6nf84C1DYV4^<3Xjd8+<-Ud@U@ zU0&X>gGcfk>UbF+FlbBxI$Cx%yQ+y#J^C37Iz}1yZPNOCcz3PWIR_6#L!ZCoo>~*y zrqjxUtlcy=?;F-`6q}dK8~DVAMs7}HERJQ@XtPeSiu8d>Bhq!a)j?Xe8H?R(ctY8thEaiQN#cqsn z*f3z?`5e|Oj?KxM%~^*{tl$8zNaTZB+_Z&o$SoVgO0wAHg`CX^59X}7_yl*3*tkRM z*~Ee{lIDKHE*r9+1s$@~k7C6KICF&XcX5NPtMGs*eS9-Kime9Lk?l7tFvRJc5!{g(H}f_3@f(~r2d}qfqw`v{KAr|`qKD0$&aRkdV{>2G=O}a9 zYN#T{m3($+48NhFe)dkyLJIk^%urU8#T^wh~O*Od&NVcB{%Yk z+Fc$L$Zv_~Hw9nGu58k7^jMCrK*{qx+O6mKXS;d5cFQ?*r0H5#^BB%L_u^(AV~#QN zmstDtz)XX7bn>lCJC4z)4LYq2XQ55({u5ed5bM{ZEeT@Nn`xqBGou;X%od!`7O>t; zoF#n2x@_hwD_kpJS2SUCv2L5$tY&Q<>w~+$Tg7^!ZzfOB76!5IV5Ek#PMbIswPs`2 zf}Y)#T?V>nsPufLlA2RdR{oY2Ki@%vkpK7Lox0SdDVI>pBKXh z7veo?eLdXv7Iexz9zNcaUa#GKirYNtTK`kLvlf1?L3=3Z>|~2J?u<4PFTkRWIs1%e z#%y~a_$t?KqtfpcV=%CPv`62O?+khR}L-i9Ge>-+=cb_Ksg0p&C+UMnc!8jo(s7ZFW7=J zX4n>IX#Bl<_nPdi(8W3yvipK6e4JZb>)QSuE^< zEhM1dV)@fCW$;j~$GM0jXuIj-tSI?KtA%vP^kpzT*r-G1;A_|(!$NZe@51emn)!@J zyvRQ1ORoxJ?N(;*Ez3iHw_|!^S8n2KFvU({`CBj%)P3#YL!H{qXJfUcLD1|pA7k2M zMak?kjOyZKEs6{kjC<#brLSo>pV0=M#SGJnJCDB%73{fV;vIKuH+ZH@oC3|YVg(rDmbJng`r6r=#RBInzVYS}LN=|rw>dmuw8e5Qc^64L({GO?tO$@=Df`M=o z#)#^3Y^*euG)0ZhirKeG*-K+qburp)EGOrR^zcuwt*we6>GUA##}aV zoYsSC3SHC~W3~?BqghEbYai!fxyvl<3Oq~JA~ayv)7*}H$Oq~!}CsAW!-&p1-F>Y18D*cS;;X?1;-tGTkGzzufdd5-^aYQFRBoIq>uT> zJTz7`uMe%Cfk!M^#wKU+FM+i|=PEenk!hT*r%ACW{73c{T62xnX0q9ACgvDgZS@{h zhYoQSb=I7d+ZYSu-A7m&S-ayED|r1WtLfc?kv3RUoGmEg-B6@cyOk^-7!(csS(bU= zq<+9?Xdc5xY~m-&k7f=vnarjo7%9+S4X8A_N*_D7v!1X(I`pa^1e=jpRK(I_^Q1a% zUQ=IJ!}4pO*yb(c?DCzMHwI~a&R`DB2|)+0AH=&`2WdAo^AFj~Eoh1%b%Wl*6y6(c zWgp5e+lh`nM7znu@}~a-jWLup7~-^E><=Z)tVa_|%|hp#1hctAlh)_-qY*secC_{) z)-{O+rJZ9;IciwDIL&y5%?&|ccwXM|_`5b9W6HBl95}uXrl84sC-3`KJ*@n6ehu2{N50x}n6JhI9`NuO zJW~$qQqF8JqMBm0ds$FZoEdY`)n+~z|GC|Iia$BfNXDO?&v=Sgri|ljcRYhhvp9sc zKMrOcAC^f9KFm`$+x3-GoN(U$BThR1&Qjf5r%} z)%wEd(E6OxUJ3F{G*67>_g4&jnX~TYM_|=!qj;l}k9YD+hz=Ws!Ly39`=>KgoHqDp z{$VuE+AU`=7i!&4@iJtE7Vff>687Q^-h^?KFp9JLRSD!qs_3-fb2C#wlaQchgk`a;>w z$A6KswPjXm#-^i3dBl>k4ZON>DYx$64O-MG{uKIDqb-kHPsXmRSfQCcc`T<03J9+6 z1NC_Fde&|yw9*K>hexDC3Q7o%fUz_D6x^TuEDP(1mP&i&v}W}1ZwIin5KJVU;AKpr z85ZNcK{K(5&AgJ5ePh`FYtHMgk8*z@&(KY@D0P(A)G>cI~( zE%PXzLMZR&8=<>RUfpem#*RgIWj&#_+04VFv~r=VuhVt)^ow?U z=^2OVP_#ocwL=!#p@-fMQ!j3Zo@fVBUuOFfOdXD_3+-@k%XZjG)6;9BA%d@E+vl$u zw}u}@b$BnvR$}Ha8edVzX4kOmV8(^8pdpys`|-uALs%i)sv+P_0yq<45}jjR3o+kV zheP{vTb&hFv)8}jcQDH`rop+1;x=ug#&{F-+DB{{S;!73ub?3|I1bIo87^3GA#6Gm zKd2RZ8W0VDuecIQ0R1H##w_Lv`iEHn_eh?VOy?gn+cFj!hB?i|EYn#;SY-o@S(Eb& z9MKxqH>^Z^PCJ{%vX}h?N1XL2XB|9GuvrJ#{P@YRFgd%m7q7LQMC{}s|DHVW?oe5i zY#2C zlFU=s-$-bR{2*z)L;v z7r`n)qGOY>?Jr%*hyb#_khR=w8kL*cDG+f3H*{!hnDkCabhpPI@iUgLw z%mmL0CWDg&g^^Rmx*sxIqIkZ8+9Eg(17Z>y54ZBd+11lf?ol`vY@ve%ZLZ)?COO!= ztZnEE>91i@3;&Q^-&B>3M&B7r0(>~{?|?=2DC1#`c@9iKLC1KP;)5_#2EAGKe7=SE zbFdWGHdq}cEZLRLOvm{U&dks@^@d(3i+6Ft)`8*OekG`-wmRNOF)6s5-AN~&eEYso zo|gIYBN%|=`3_FrqK$kJrZv5ZhzNoiqdk12jpog{F1Sz*i=`N&D6FB5o1oPWqyL8S zrP|HZUr*W)c7v%&{zdnvm}3>MVMWuKC7OM1Sg$=#*8Qw-R*rzfD0)d+qK6!S!tjsS zCfHtRbc~NocExd)-^`CRzP*$cyLPkNLb$_$4se*U^=8D=Sk>DWR#Jp2XoJvJW|m6s zIi@0vWD6@QV&R+E8|VQ)84$>=vs<0!$|ELjgF4h%}P9HO$+OYg(&3HNw z9@Svne*|`77VI?bcc`X=>NNqEFbt=#kaA25>)zgOj?(&`LF8nO?a-SnxXM<^Bl9cX z3it%nA^J{ik8tJ@?$hUN2ciPTCB-og=W|EBC?^gB`V98|=x4+YY6T zHYx}|z9z z)@gmv#Sy5y#<})obX!jZO!Z;|}MmtBp_ZW*tX0Ao9$uCC@-(!^cP z_@)4U_jsDh#-nM+LzPgQIZm<#hf$Y4=CZYz!7VhW^s8!^VMdk+*TXAi!RsT+C?s}8 zCU=@l=}$#fu;6LKqN+`Z3WwZjHJezw^`9a&`q&SD9H0JGVAs1h24_A{dWZ5HW=O zW-`$#`20BS(;$ycOYra~N25z;M{CgtUM=_7c2}d}E-$RtZbTHQ;Z1&IGMhI6+L_ry zV6`UERE*)Uza9zzy%OGMb!sd^Xe?>mO(R%`Lk;xQ+DbE2P7r2OEy-M67mJwnwJSZR z);3aGPUB7wEWUh!m_3VKwf>}I8rozOMzDulOugwdGC$rR6+!(gX z8utmT`8@c>1>vOO*C2pnu|63!rr;|JI_H3>Ckvng*fslkp1f1Y3bWYIX?#tcg%6M7 z4-_DThbr+hbLa_l33g*SBHHbn$bS#TS`#dS<81KpL+Aqw%N$RZ9nt!n%|NTyIR=_+ z_aJUWp^*8z*z9;VXeUCsOVF|y(eULLvW`hm+}|12BcxR@l6N=#%@KjBu@38PEV_`h z4JAWaVKh9yXj6lY_0ELvck8s!M$T^QiXmXK@Kd3D;-^)NVU``rZWw}S8%?~^mpQ)o zU=eDumE@E?{ zF$p4SSQ72f%x78pVb(crcyB`%_5`>y-HwYqu$4l6|1Hg56ug zJ_~9>=vSNJwMA0n**mZvj#+e(}xs|T4MqO0nN ziRL*`w_8h`Cf*Z~DXnP_KSG+t!|rpD6_U4%ANhz4j=N`a{N#8zT9a8;{30=HeaPO2 zf8ng--^JEfVEHPY8$X&ddEQt2 z29}(>k^LC7vYuP2t3#iRsz~uVc=M+d?FfBhL`5=1-ZvCu9RbTRj_bDmbiw{ zM&#B=xphq9Nm*!N`&`VE)eXp+Ov0UwbW!#LYhMmkTkqNKc&#j=Vko<6rEL=|3s?`= zHLZ_mwDCm~xV4szU&Nv@Dh@dt%lIOwxVpyLTi_yKKD&1rG~9A4`qVITGwsx+@+PoO z3t3h)LI~cBEy#GUp{X_xc6@KdKVTm6Zm4SLs*x3#Z-*klU%{&fa8^^?m344Zs^fJ`eI$CUcslzS0f;Y)jnF6wb^#bai|gW7cx4$~uS{siL_wD5KV zCWEEPFv|M<-T5iYt6^7$vEWH-oVHI-) zyBVvCB?mm7_ZLGcU}}J=wE)55<9vy&(PEigjs?|kZX>@WmY3w5!y;Zeyqcha1(7&LGwusDY}*P}uE(J}IQ zXJW|C`ozpj`Z%)7Le%bx0<*)U;#haWFXp2)DVGrI_$$w^7Z$?FV zpNcQX@e#3FQ4>q5ffA1WT8qGXz%;CJb!^gB24TJT87v*0(Q1O4wHaiEdkx`P;m~Af zD0uP@EXTur4&H1jv+_sBLH9;f{wmuQV5z znS%SUU4~64By&fS7JB+q3zilT;w@;V8Ow%9RZkwVhLvo2hjloP(4dK%>)|3~!Low0 z?M$D@^LTf3*)42Xxg*q5(JhTV9E2`tp@29h{s!&lCfc7uc53J}h#s`hhm!7JR1b%D zHaX7@m!qt#3>{^WHq0}eKR=AGy+tcH$MU1+vf0tFe)5~yCx-HBm~(X$R4}2mp|CsQ zu3WPo`vwMhUa#F`Kg=dJ+z?>pl>FYz02do{l zcMX{P+E+ck*2XJO@=%YdZ(|}Ehpb&#KBn@lEY_)z&5CECh1|9m?jklo48clA1fIcD z!mr!L?m?ct%fB-5&1^~$yQ$E|9@xdQcVWCE{}5R9hMjyn3`@+!PHZ*7wAy~i(oCow zC-&fIn=R|BYFYOrsD`q^mZvOs>x_Qf^c2P~%ScX(o`V&F#jIc%S>BDbrhw^uUI-TM z&?fmDFDMxe8_jx6)BdD+*l!Oo4=opU%{*$eujQdfU_c*2=-S51DO$$EoMT|#IxRC2}e1C z-4_pw2kReMHfJS^-@-COVn)Z1io`5avdhM1V>8l%EVc@6xy_P};AXp~##q?F`${*k zD>L7!dvhXZq2(+&%Vx1)@6Q$jOP7=-eZV9jm9=oP1(^ z=90|uOEVkaw{(6QiHU`l=w4?TUM15SIXIN(}GC%d{ed8Q!(6CoDO*OcVMAif{Na+BdBM~{wvhdCD6o*W%Bn&rf!OUGc9 zshr>R5i7(R$sOS|<9%aT&uw4ZsuAD~s;XbJqO5v$=<0Rmoo4gfws&n=7MPxCus7#n zz8iduZ?t`7o4bFu!)bwgPYV;~#@D~RpF_Je&91X*J%8rbmmTBHR&CJFY{55Q^ZxvK z8?(QHz-P=D)(3l1oQ~M_P*A1yZ#iB~Lq+Gu!>-we;8JqjI~dL}7>KOLPHvvPHj(B( zgd6J0Dli32G@0$gCc|nfquo1XEpqJDSb4Cj-ZHEdaq$Jsup^33XcMtHB|i8@wj+C& z*{c{WY#0R7`JgqS!&Cd84VwrPW`BdT;)u;Qh=*=YPec?cbT_O#+F`>Mbk(MLv`oB- z^l+AUfDNGyA(#~o^3c`yJ<$hm7xM;7vQ|4Wk4z@V$PtgdULUbO*mGhvr`rZj{Q}~! z9g23rmASeQK4OH;Hn4B#@V-_$_jh`YD9jn@aFSO)&mWC>=6$lTDhHZOQ%$A_bCk&( z6=5D>ibb#rj#w5d7(QhnGNq^!RADb(IouR+AB3=A>02^5ls#U&3~nK7SLG?FXbuMfO>5B4-#wyP4JisF2Xl*-T3xz1kv=QepLZ|B&w>-)E#jRm? zVZG`LLod9G&Gmc)k2*P+HcEw%9=moS-(W*T3USNzmeqI?j}y+I+4dSMJpAejb{(da z4w>uhn3A-nBl(Qe3_OJQJ%T`;*0+gw!H~i>u`99pp?N&(w~5BTtw@`RK9C#E@=@-4 zD7O-mb9uS_$abjwu&LMq_atH;&ksU<*?@)2f++ubs+;r6LH%J{IjXTG0jh8WhGTNb zoGH-n2;L8fV|R!20}C-`1hWciu)8Tci~WEgbR~Zt6SSl7tBI&SYX1Yq^tjKUalKcDH4`(0KtJmm<@>g zcPFa>yD2&x^29Tpoc*@>WAZEH{m&dFGXE2o5>O`o&h2+0ZNt;%Ub#`?G=e z0y#Ef^97c_Gk8A}f+y?It3K22MsGxvv*vY{8I8A*2$RH2)-O6Zw&QF-9AKpPEGU@O zoJI74VP-L*y4Hbfq5T=#kD-VeYqpJbn8f$6g2R}A?#JsboWOEU&}0-eZ4(czhK&Wo zCOw+na!mUNvS!6ywF89hU3D6xem~;vi3iwMWErkQ!b#*p&wVAz#2D~0cG)PHRwnGg z*n&tJ%Y_!k`2fxqHaxBtk=iWScBA?wWPJ$*j@V}W6xMYV^+lFi!$PLfE6m{6cvyTE z8$9ZM)1&OpaCYk`HX)vk81?)%#8}ygs(dys8YC1qBAjsI5$$xYrkNuJE!!Qd zN7Gr_qL0|uh9+`J*KeI#hILvNyvdmn$4#c{dUh2Iu7Ysh<)GR0=m0hok&;4|9lshj z*J_v{AF*h}*|f~EHGDaglW8_03!yOcc*J%KKdFs97YplW3V(tYv$5Z`Ll{fRVmG35 zw`(e+0Gz{V%HYfx$Mbd`--s#We(lDewP9z+A=N#Y`8~A`Jn?rAu$gd@u#eX6-K0k* zU?yx%ZrP0xV=c=+!Lkm(a@)-7Ff4{deT+GYD#C_FO*NF9?R&IHo<+5K+7=QdzJU zx^L2Mg~7YDo^L|Dc@w)5BOoKhmX6?|1sxH4O%7tqJL|O&J@0WeNyK(O`!m`O7m93Q zM)YgIyMTk3yJ{M{p}Z1W13H57!a7#43L#hY5r>n{AEWhyorBlbm|n5c#H+2)uU2e_ z)|xh=^Hw1rSjm`pvALC9J_(VLRD?O}c;qO45B~>Vz&F_Oii!Cf>^8T3L>C!db(K`_|X zv<{Ye!#Z@r`=DAq2?%?V)m4NDMDvW%*}?q~+Fr%?j2~*xghv2<2GcLI(it~9VlUKe z&`KL?KMLB5FSnLG#qLDAmz!9+i~k;>AJfU3Xl{t!&l@Z@DBh+S|A)MHkB_Rn_kYQH z27R>NMQykQaB@L$!o8D_K)Mn_We-Ro9j?*=g2a`3974EFB3RFe*t$mqr2{6)9ud?t zgit*Zp?XGy>KQF)cT{XWQL*ig7Iyt5kU*T@`@4eH?)}^6^*iVF`|sp3vu4e@KI?hD zm(Ta}{XVX^Yrjv`HN!(R35e~|&?6Kw__qe`L zRR9TLN%=yhh4b82Y2ngVb7|CE%3!#M>%V8J8rG`A%eMN@G`_?&H&$7%0r_0Jjl2SN zV~_Ti*XY}Yr`NyWXvN-4I<^xP)hZGotX;l>Cs2^8vRQBb9OOy@%o{dY!H0?6Jxr8E ztz989^tvso98=>o*nd|wQH1_?@c&@gZ+#&6%XK9>8b0kg&;_wxFPrJfOM77CgCmr` z*YkP!RgYTJjGSRO)ehq2`W)M0Uwg@Lx7F@CxKX4rggd-$NS!dHz&U?#1~m*y5fgWM z198_Yd$3p9tUtfWxIBh#o|>s@wqt)DZ&+hCnm%_R{|~VAjIrmCTYJcf2pnps>vtF< zkXXYKUmL40z{$Er{{~X6hz9H_LPn{y&ZFk*t2qLJl(@ND-=IC_?+N5IBX_?0tOe}I z6j1LfWV87;eF#tda1a1xEZ7s?p5aWuX_db;1hc>&S7ms$_2*+Tzg~X;@@N##T!iqw zAFFiHB)|$pN(=WO`@=T+en#&aUf}g6L2 zhO;f!wm(GLz&)I|@DCCz_q6#epKz#ZbMvOus=5U1hEKrzOfhlGxyT}_`){{ zYzv%Gc2d6#dVpBd;pjv{f$hk(G7MX{&m+MMAw3S7qHcr&rQIVv+M`Jsy86V{b4Ug7 z>!rHgImxHXLx;W+Ap}-FHeqQ`kZ$19L9g45(y2p95y8%dOXqo>6bek;@`QCi#lGhRN6!l8qJ3fF|^Ekcg=aL{qhi~e#^w>BAMob09P1rdpqOY^uF)l?_4XOyk z9zS_eEDXkMDUI9u%7}a~fF40{Ld}u4H`Ay3q)!#$maVt@aXVUh1mIb6U6P1-i`Z7`Xat!e`cNY6^ko zBGJn$i;RCZ5a>eHaf}o6@x*|`5>{?8LwfLMItB4M|AnPIoE`{wiExZA5mNc;v+yjl zCp7NS(H7C!m(`boF0-MfO3x)e5(&OLUt1G=U zmFdHZOh+&A!@*!s4Mw3>c%}nhfFikIF>h#w z#xcI^q`HQC?lO`usw4u^;EhkC=g8dgw_I8js}Jii=n2fh6jd9xd;Igf-R+pl|16dY zQOM+sjS1{r%iR(4K-2+`IN}M+g=<3;MvQ}8Rr&?KTvrP@^G0n%q zuH`yBe?I%Pk$?p!jYJdn#J~*cKbIiHa88FE)5{QuT&R)uz17L5@Qfws0%nDK@6FT` zaCHz-?_$orL;?ulY=(C<{ZJ=&r0dz`!sGCLp+=H6#$M~B`(Cz@N44e=<JI2RR-Wk%;Wlj}&gdz%irrbwsiIPe97V0z=sMi#Qfr&+kq&l-g5SyGJ8DcyXwT?M%#1Yc3LC4=8RO59HK>#K;v?N5fn#vKn{wdl z-FsYJmm${zSbxW9-BxT)GIwC1B|LA`%wbIH_+2*4a7#wo-||#-N<0xZ%E@#AY1pJk z=Bbe~e8Ov&mm7PMF2K$R^S!OwqcPbJS7!a$Tw`Hht{NnF8V(pPK;U+JvvXQD;!5Dd z$yXRq3?*4dVDUEf(%O%8IOsF(=*H0qK8u6DeeN8`?do4(jgL)4#7^9>5BrG$M=yWl zfr8)J066S;GmkE$p9)I%2J5rJL=!(*AR{^u2oaCRt!OQ$BXbiRb(8R27&@ON67Mh5 zVq&ZO#^Tm7}0e(ZslAl+oD=YQ5$Dan1{5fLaj2>z)I!3GK;Y+#N zocGA3k;4>?zhCg~hi-QOy%F7og0Fu>z|$Lvc5dFYr#*fUE)l5j6;0Z|K0k;ZN{5AR zgPaW41(yFduq5SaNo^zc7{;*Dp)Q<{y{hi`)9MpohOkcF><)yxP`;s8^$pgZf|}Py zyj~O{M$yktb$x9K!A?RRA4`I$pg?zUb zUXsLRPyckdu_LH3mWwe5J*cY3UayOdyb?hGw*Z zTge`)QvEC^RON8!~XTl;@=j|ZOUk!hbIB+3Pja}oq5k)~D^XgVz>BH6~ zIS_WMOE*leHtvJ`kIo{T_8>W*?X{m^*bpQgDZRevjiBh^^ODE_WEJL27&cF-zK__%$TE1S8{Thna zHlf45Kj*)zCx_j^Z1Hsk)4MW54+#g=ZD+*eix8BAgCH6%DM!0r4ZohnW2b?AVeREx z*PHelo#S_rp5h$LHSN`pIX$EGR%5K43h@S#9jmLM*O96IwEnpG5!e5jv@v3OxDamr zj52Vf|7RCu)6ocU|393`RB3c6EgHw&C42;)s#;xped@Q2J;LOWl6o@dZjIatok+jPwJ||VjxL~;#;@2spQ$J^kaAnYS3wv zuklF|fP2jmfN+4B#@t7zKB`hHVG7({A}`Rf!5Lbt;7QdW>o4gNvIl; z*io^y(|3jdgm!1?F>U%UV?4Fu4@d~Vri)Pgx?GiUBJ^rm2+TPuN%}eU!7%ZQdq=6C zp49P9NM&p6cXSG8{qAE7WeMM;{?ay}UmKIQyaR4lXt^Ih9uhC6zQa0-rbB9-^PUrd z`e0?ae{`XzR+*fT``ziCF9BRPW_<{BM2t7_)~-WfhFd=J`}~|VVEN0;st1%hMRza2 zf_nHN;1NHT)GHuE`j)9W`s7qHuXI=qZ0fYyS{}A-}es;Zl@0@H(4c`Kq~1>d&` zTg2~Onfvcx8DRQ#xv{w6>?<_>MWUwlP=BYWJB~eNRkl4F-K~#?{J%$uIL4@7tvgQA zK-fosi(tVGTwDJB@R!~^kFL4huXnrX9R@UIOhq)@O?3BAIGP>)6Il%da7U5SboBv zHxd!+H18hMj#D(-D)8p#jozk1uF=|$cd33_mHOx;#*))DvDGzEU6wE>&BCdlsLH0R zn@ZGjnATM~@XM*Zp?)zX^$bs~M@MTO#}a;VD?QXd8_6mPnU2~3ihx}6PqV1~a68vh zsk?Q{qezw_pH80b4!8rl{e`&_=)Gr^ZmIEzsM)#W-Rm2$_tq(1z!U3&c9ZbD5#TeO# z?Sx+>S9iSxL~fIy2$852C)HO2fIrPd&8wV@Bt-1ZlQ4hNEd4ihm&!3z;8@?*8gp6?nN-Lh$ck$Is88$pg2 zES^V98i!gijTel^l6pJdMq$lstD2cRoGOY_5OZs_{rCgJ|1ix15Gz0)Fl2&=+ z6rd{H)?|xVW`|X6Y)a~VUk%!;%bQl2rs)syvMTl%uldn72nw6u+^icA_4T8`VU_Qs zx*bgvH=avM7`u}aJh~oTcHjx9{3ivJvY;gSytND9MES!O8Im34jV}R(ttZ-0o2$Qu zor{S3sN5PqnF|3Ah9#WPLjd!a(k^)b>2K5BqoRUuKCL%fp1L}4K+FbgiK{o_VtMLz zwOJFFk_a$iI6Pf#b*#kRB(?Md+2^u_YV9Z=ha6pCl?TqqLwiCV7(H*uVcjuVklqak zcXp-%83iFB*H#fNH^q-+5NE&Iz8OCE!3@zIQB0=(cO=bCTl8bA+u>m@x6%G<&j9A_ zz)Xd=TB)vC_%a=AyNn3kTGw&F^)V|q-Sc8=&*NlNWGj@lTIF<`YM3)ZqheFTg2&dIn(6QynSNql}!k?c}bnJ=na235&?S%w_}W=lOV1U(b9Z;t`6Z+?g1f#)t!;6w1t5rJ%2W_g@%KaGForHR7E4z50f8K6b59%p~u?LYWy($ zPGhW^1Qx_inLgC|3XSSY?A6>sU6naSl03lLR2^9`w-8m{>D{WQ1;gx0aosBIu}(x zI2_@*o+9>yLx$;kN*#gVlI#!7Ytb1ebPi>i1ljid6@KTo5BJ20ElAUo0k8tXZ~!*p zYp<)4lwt`r2+Et`@0utTEF}G?;Uw`#Txv=r^>24?)w`ejb?`ZATX?(lzUnTjagZiZ zmm8lr1zl8`OTWK#$l4X)S^^rvFh@{-o%?qF+YHy|s8V#Bx*HsRyDiap;0F-nCm@QD zapgZs_udG-iw+FO>lsNvun4qy@Mbm>P9%*GLHC}z7K5)m?EP9lwV$#)+T>W!i@aYS zMfBIGLF`m^UQIZr=5F`*5y?}1HE*#H9_aa2xRckM)lziJ(~R)Uhs6C)_EL-+giSnFVE zO87}p9@icV?~D=uihK1ThFRF>+n;6JX_x!pv@bJ84nbsz3D0O9dB%fgYx918m8stv zNhb*J>;myE2>>Yl@J!%9E#rLLXL<-&-67A!+qR>R+Hym<$q#$_{lZa zleNf&Thy<%%|lEw zIUfvUR=-xW}qSd>YjHr6;;H}I-8dQ#9PfXDd*q7_#tuCQQwI!b}?*@ ztCh`EFndA`+#H65RZDXGmO@leK7jZbQ?%poFwy zo_83b0Y*~G@VXg-Oc+^Vet`|wBxW+P+=@lO|AlpPBpyttKVknWEy%oNimJSga8w!$ zA;A%69R02_GVwcONsojAuMc%ml1&xX8>6~WWvljmrmG(yfKmxLo3tYgp{whS`F)h9 zGCb-zAc9BXeJr!xq3uXCl3oQhJg7(LEU;Iqxqz~U6FSEg+|8X6R&Q*UDEMReIN@Ut zQNn7-fwEBOv5HvL5&}@cUrN>((I3mBkM6bFb!K^-Naw)9Fqi}WpFk%2)VhORE-#>c z(3siH<32cz(A{h<-meF9N^D0wEtp>ekLg)#mC!AE@iM44F<-bz6|I5Xt5Qx2Ga=Ek zi_TK_x&#Q^>yYPEEu7}xuEu7BPkk7Pczs^$3^-@%|bs^!&cu_?6hx8xXeFV$z|RGB5B4Sy)ERdcE7M56Sxa^ZKz8gjMqi#NjZ4Y-QjfdTp9;QN9P zaFVVpImu<%(uE$6*H6f7wr*{R>q8ad2*I$r9Dg*|<5nK!8VXwLhcT?m9mc~g^3UnFq1_snNk7pS-;)ZwDtA2<* zWO_V6rO7$(rjCsM{H{*5;5ZicOl&{NYS6J&v7^*bQez+q`G1~&cYf$$9k25r_1Krv zjDul&_Y=>Att_ep^jNWJI2=j!=KcL|8$k~}yLBTeD`2|EfRL{}Lv4=`ScONw7&fY5 z;W0)Ao_Hm7N%T*;V8usLS(mJ!z=b4cWci`;Zi_Av9D>HJapJ208-{8~YDJPAK zbL9gw+zjcgg+$aaeg^UM^Czo;IRzi7y6Nt?#8$(ia~|HK$0hvVgJ6 z<7unViOz0gL&8}a)JugTB7A8d?xlWnVef8b%bm8f#n z>jPTn%$*C=+z71JK+4@>u9orp0n)|4*#*XiloJ0{H|(GY+`{JFa#uI@aAg(XGjTQH zgho`%Cs~sdwsD2C52(vd>@o&lG^kwBOWbBdE=&I2SZlC7$|de>Hx}czz(lvU{MFLG zW4CvWd@x9EF`YWHqlnHSExBcq!l zi;3;lPba*wSE!ZA+ltEv)=mE zvaiUWxb!O^;%$Pn3F@4RDoCna9*LBxNyiLlPuHHuWA@*wooLOlUiLffbdiSCAura^ z*7LuCe;W6;@4cd8M9tXelJCF&9m^;nAyuBB)w=z!NX_6V z@-4bcpD{8ebIq8O(4mo12rgHW5o&?BRfS9@Pw`Ex7TqRD`P|Z!9q8 zF{eb*sDZ^O@$3-3Wnc!vU{DTVMWp~1j@ex8ngV@4>SkYoxLoUtjN2|^4ea-K_W995-Z4r2Dsa$L85>(#pxzuN zE!1D%(h8$mGDQ7q7g!|ai&e(xOxJ_};%QF{a$^yahS5Ej0qFRV+P3}?M6?9J>fsB( zz0-5W|M+2(jt5?)&vatOhhuek>KQW1sFmWDie~<<8j9fBFOy8GMsCE6)o>d&u1%eW zPpD=9Al?ODj)OA{c|j(Z&ll8_W97n9@_tIhmq@r&$Z zP%-b3rHES$+8<7U1kv(363>5PtkYc}4{}IG+8fw~T?mTp?A}n6D+y}^wd^vTw{C=3 za4z4O9sP;W*4o^mLNV|_pIb&gGPnJTkZ1?Jp7?nH=MFMcBI*q~+>JJP+VzSyUe*4#_-#3zb zHK?Qtf&GW*-;d}gbv1_7GqU4F=o6qT&WlpB z@7|MYI4MS@V&A}yymW;Ba`%($n0&E@-hOS5?0W=sH+)yM;e%ZUU6wMiS?a)g3Kkjv zl=%PtSD2tgI@vpv5I`A5jqG!JTj#tpUF&(u*nTI(_kbCX=T_woNPrxIHr$xrCuSjc zAb%G*vek<1dMP{qzxc~OZ`>y5`|ghif9VjigqL!4p%DKXn-g8o`igeBKcz=EJ0`2j zO**(^>C~lD7cl4vp_ikanoyz{dhF`w!n#2%!oM5mG4AT)28^S`7c$Q4hR`J9*3K|w ztAe1~@Q4lsRsANMgs@RWBcFc`_Y-AJ2s8zcJ{eXcjGpK^N?HGiINiccDs3Fr^2rA` z(F~8gge;pL073OjDlp|eX&Nc+letaJ6T#@nfq{ghP*V{t&==wPj%>vjB+-eI5>S^j zmeYL%?kJ=7Y1+!&fQlr3i=77Dv%HF2SlNiaI9IZl1|81v=^TK%%D?_(hS(Mj)9(^( z_-~l%p*JX@B-o-Kf|h~MjX*`t6|>6H4`#WM4rF#>TJE+8G%&bFNC{00&Q(FNO)hW3 zbgcE|`OaA^>rY>FwW+HU&^!SI4u`Ce6+xtxh%3L6h|2JsFJIN(cGP+}`;Wj2DZB0R zJ`IEH?Jx#zO-M8uZNbKbYMpIe`#aP+qP%Yo$N_PnGS+poE$^yX>RwU{3!gK7g09a^ zoeF+n>S+<-_u{?l$$>mTyBk`cBs4$BD8!CK`^Z~8DBK-qVja-9N=&mL2t9^2k!m~& z1ZY|bzy)~oea-P&Ree(5l#44Y_L2LT*sGS1EN+ElA)%#jm*K^Jx9q47m*yWfpZ*O- zVyv9J(JLrH*LvbhJq#^fV(DXdJ*`X0Cu%171&V_3UDh?5%b%h0()yHV)nq^wA9Oi5 z57@6ZgmpL^nwS;jvmlCq(_Inm-uN`$*qRh|9S?{a7JfZ4oei*g$*|WqRO{$#>W0~2 zvojif_feNC9_L>7zMKzo6&M=Uqs^dp#T0`sH4%!)xeqwB=g z+I=L<14pNje8Ckrs~ae$Z1a$RMO?S*ZO0T9YdC3!K7eb+?w!v)huA)%DfxC*VT##& zwt>Tfhg!_vJqn-K_3v`6SS zL8-u2_r)~b%*Fgxt^2qTz++_3S*ZoR_N-&7$~&bOPza{c%kY)JlioPb>AL+cJShz? z^V%j0CXCa6Uf=u{>EY;-qk3x>)d93u3U}N`L>6RijTkn!VH*~!5qpIa8#{{8;6+A} zx6~Qo8IsOHg9;59);O7=!ezssab<-ZFbHqk3RiKay8BJQv zfwT$Mq&YGzBAi=+I|gP%bz0bPo!^PfQ9s?T(zf6+!bL?3N8VEND6kR0P{}+c9tno4 z1>8)DIk{PitV<*!;F6M7_^3yn&fA*;Fq)I$x2ok;R2@F2qdYGNe}!)=)f9jHkcJRY z55T9X%f5nA98ZxQf%yzqQOLFAv)v}B+?fHV@|U;O6VN_1JX`0D)@94vj8WndfXyrw zJ_1SbPDnfSmY^9m$TsMK6E;X)J1$j!j+8kmY$-%o?LO!rM?f>k@))((7~SozKvbVF zN1xL%J5})dN(9Yb$=^^nlvvPBt~yQj8fbDZqTfy&{8-Ja0%r4R5(h&cQHPwG;cIye1 ztOJA9b!(+U0EST=AtpVsLQL5!Pv>h-WRLHxNMcdDKw5VdnPC{bpezFk(I%ej|40UJ zU2|~WgT7{>5pSu?Ey$Uz-ghxc9637Dp;mtZ=~3O3!2p)%qG&4Ii?_E0BVI7FC6dI1 zGo%k7;d)igCQX8OY`~eBK!X$~MnJ!!zcQS{{9g)SoT1~vV30D9tn0H_EK$aLmQh`2r`6)d}NXKGuy=3uyKrs>0sqm^yD{ zu)cb{u?eWGOW3Tq87I{*l3Jav`>8xRx-kB0T@5+{2b*x0QBu_fl(9%T7H(d>OISr? z5IeL5C06R=QUePk6uH<~C4nz82Bx4~8uLwLVnkm^iBYhywIwhQ(015`ycqXPRC6VS zz+)Zdjy%=9`iSwP^KTS9E~A~wR&bc6o`a>(t^W)h8+jSA7x)-QR1o9KTT!OPSTQof z)UXrOq8r@@uY_8w6osJ%!sqrYeP05+gxJA%V0HPc|A7Su#uQtM6L2cwALu9EJ1m6zrnz2H5WQZpHqS9tD&}$E@V1>tkstrM)_3+b0aWZ zt_4pQT8z5pa0n8gXZfzh*&y*v`J|w4G}Xk7eul5ZRG$a-Ir1?xgn)auUHp${wfm2B zYct~VR(jmtce2&mkBwx}PuFdf-Z|Q5JOJoBqi-*Trr&v$`q?v}kPPX|>T>STUo9o( zAz_o%Br`C7NjCdY+h9%aqZnmw!^d>lyJc8 zGSYg0eLut2Yb;9V3FqqZOXxC02A)Q!qP$tzP$XrjNA?&$PTc<~)cw&Q>q9Q;8yk$2 z^ZEfEUUtlS$Qar?Ip%fg3&0FxP$r9YOdn!0oQ7sls+GOGP?naC!$>BH1a6hjPiEdJ zK@HdRKBq&y#+)8l6(4gCs)vvYoT7A!^FYH1^u7Z58-B=bTj)m=+j|ZDa@boST>cYf$XM&8AIJ@O))A&McR0+{_rpTfALG{1HVBBLO72E98r19}|>&lsHv1tAGe z>x@;e5S_UK%b}7~6bdBybd!;mAWX>hRFm6VqO9D6eggv{jPNjx`=LR)jp|;wR4LFg z`eqAJ&zRY>&uBxbP(gDiB_Za}$9D=W1jYrF5at^|l{e@Ee(HPUMHd(u7b(AbLsKvu zn}r?(Fl?l6H%)%Tm#rr@BEy4OV#181n-9#Pd=gVsq)^u(M}Q_hiWiP6@ybaFngDWL z1klgj#;gxwX?FVV{%Sw*Tfo+PQq=Hq*seU`Q90rf&Ss-+McKwUFsv+?va9_}!Epm^WWA4^^*hBoQaOgn3Q8wTx~S*L6=R&qifqG$*F#;FKb~hGBTKpF(}LJs3HmpQu}c#H z2&^~ru>Rxo^$6oBqi-tDjkw>}^GR#DT}Fz64dw1@WG1NcZYeKCH6FMGS8mh0+E%3B zwMR$%Igd34ViP}{GR7`8rT@b47(PY6K7~XR`Zva>^vO9=hAd0eX2bM=*TM%nA|)fO zJ>Wn3c1MAFbnQv)AIIDm8%7}k-Cea9jE-q)DAr&_^eN$WIS~gPFh$#|Uc|Q^9@a0d zqC3}!9ZeP@t_;AOAA%|D59-L)>PesLU}=67txgutu6PzQJ<+!G{*CundoNP%@aEy+ zl_~wzYt#@@&&!^2g@e}9ZvD84$uX1QD;Pu4xC*N|ymEwIt5+8TIdVHR;1EKOl2vWR zqEA8iUbg+b%a8ur29WB-Ccm_2nmo)a3cntqpJ#|S>(FnAm*fKu;~!eyo$#*E(%!ac zRNZx)pq6Ca+;T!rQeLDG+SYl3+1Bsk-hg+mT`_DTM6S0$M}%ce)Rb7tbgKiP-|sRe zTqHS{@_-FhbBg9di5(`f`^RKjpnIpgmX-q=<1#vOtcZTRvK+DKGJbSvkJbCu{CN%3 zb^5s69l;zP)onJcP^kXauqGNcVG9|<&!Jw2m0^6$ZfleMq zFWQVT7pPDj(5uKCH}00+b4{UH7~L;C-atGsA9wK0PI{d#coteZUV%=$Buq(FltRngSOEcudT4*cvQV}H6tUlR9l z!Bh^mj6&80#uJQMEBUL#PpAb&OfUc`F8H>dWyP(x&eN-t!RlaRV02JJ_DhL_WA@;R z`#ahec&qhdN@8N{d+QSB`hpH5-)|+*2QgvbxR03gi%7wfg)u+9@1eHQg)NqzNBFA! zZR}_mp5tcD5AMmobFxnq-`KudBCSPOEyk_qbw1cLo?bkWFiH~rrP^K>HF=Xz zyG114xP{Sg&OjSXqM+D%BNg_>wl+%&T3U@!m-`+n5gj9^Ft8FVu|>QUXwUi$463Lx zy2mHY>egODC(j0ALVknc1rm&tMIcv7;0*0UGg+ zN?_wheRS8Q-Bizxa;3)jzElsw%P5n6enk_?5u^V0Wg|^e7S#H)bh`|IYXO!(oTV(3 zM9%4WOr542}i<{i5ZTDbQ`&nIEa8!SC-^b1Hu0Yd0(AV)lCb@Ev6c@3k*f% zLOSI>SJ4OsB=13$nunqsPN{0DgOJ`TF&^bSOyB_rItZ-fc~^TAOLeR`U#)J&$~__U zCkb$qF6@jWtA4UgLejW}W+^d`gs{PZ;%X{%c{r{b#}`UTX7YCEkGQO+$j@q_jd#>M z{JmGf1-YKB+N?&-j8a$7hq$~$JDaH?g40Qt0W8?;eVQ4OMqtQa21EUOhaiD$6~P~( zL~<>Jt}UGmS9oZ58zuCry~dAwi;c!Ug0YfM_wAlmOn2a|5rO?~DV(hn)tu2zu;CbO z7WkC7`;V~p+{>6ot7FV+mAT2b`> z@t1rN$-ZU|2kft<6l^N9V!zMI0bh9bSO(j!-HtNPu_%mbTd8f-Yr~H5!nnul;aZ(sijRf5W z@m-lax<5UY36RoMrx1a*CV>M;L4rZ!ux%cA6ru`KL|z0#2?ZPFnUGR6beo!glKOMV z0t5>%^4dq>g)m8we-kOj<3C~f2=hqN=*^h1?+DeTVU!AkxWH(}Y-Z$wQ?l@rW}_7| z_9aT$&t#(_f_Q%X?)TNp@Ls~}r7AopM5nxcdzvx$JO;)Ax2jk~T9_L!Y?G080rZ7w zZv=P2z9tQ9^irbyUotcoouZ~N`FkC@&V1SSipRx2({XA}fQqd>zKU8pxQ&x9v{S4r zMJ^|~M}H6`#Dil|e?+W*tGg|Wc-+FoR(4nesAZ5LLClNCcg=S$VZ27Tt+s`kXU1zj z67e=s+=T{rkhzvH_!IB$vYyxLYmDMP?9xY&FCHC=y`t6}d`%6<;3I{{GJZ^3mT++U zAAsVlsKGYl-oEn^2!qWuzm3sQh~WcdqBB+-Zzo+q%z+A`QKYAb_e=}Wf3_IIQTe*S zSR{VN^*N1=o9$eu5lHZ;ydtTbU=@VN158S`3n+#kB(3R9792@p6=I*I7H4M_7QsYpd znD8~I8f_gAZ(!v+e(*d(Yg`0`m^DR?pQtzLn-TsUmj3enISgoXE0F^!wl#R1x*bf)P`*whIEjS`C`mwoHJ7*khi0VCTEh(fK0fEe>zm-aqQ z?IZ5*mO|Op241R(jG=J*cMscp-%tny>@%a-@Q+LF!hy5J0Iw?gj|T$GG@g*dtQpUr={iRCg)|vijwZc}T$zypBZsPT_#*?U*1(|-^lO#h_>_S>%`W} zlaZ{p5$Gsj-o;%6k)`z~ilQg>Vd|al^sf>$hmVtVV`7IpoF77qcJk~nFLH&AG&s=$ zLm-Z*ynIWXxyhK{H(E<90fkp+e4Rw_LstuqP;=ZEio67tpyJDfgcp@aT0HZfC3m+l zc$j)HB@sg&3D_D~BhFl5r=DR1$kV4Zc&psgYXe$klBK0@0TCKo;FFd^7T{QV3Cved zCrHv}!ONISVSEA!kG5I%-O}|^_x2jD6~99^Z$y7FI~q`J^TSxQrRR)_b3A#PCrZ0q zP*)}xOR!~2m@RllFZuZyyCBsvMJB3Xa>-^R>pTJ0-!%5R@x>D@9Im}XcN&f7Y?Q~3#=xGf{!8n6&uruwMq zaHsmkhBc;R1|It;+76R-S3gFvZ;Q*gqeSQeUs1}* zF;ab#w8f0P$+SJw)$0WKUFJ$OG|4D!H3Z;Af|k?YaHVk9Z9f%juu_hESyOPolu56v zdetm!!_J|I;<^;mA4DHaRewxs0_PUm2gNcj-$sxjabAB$StvDD$_QcTQK1vtfJv1J zbFMJMTLft%-dlM@{g9Y*L)A==vU*Y4s=T+1-6^8^DTU-T1zE>w_#}@U3$_WcTYns| zCG8oCh^1ho4h5i^zzA$se?T0Bc2%jUaYBdk%+RSN${B zX+7!-pXgw(P4B0Myb6nCT@_@-KLOYPdoRiW% zGL590B3qQ;6S0AB} zi*Za}#C2fbTv5d_?7ZZ}?iWb!Fh+J8<0J<#USN#A@C>L9Ie>UnOXgWm$KS>?lZja_ z;*|Q|mC9ak5|VCN)RBSDwndo^5f zY(~})m|~J|^VFk;gzwR)s{_JSwNv9#CF+ zEVTGR;!LD+)IhCy_}=Y07M&+W;_)G45uCVWCK??<2=U*wJ?I?M)vq@!;-+x77^X`7 zdfgGn^$a`Jueo$KvLdhRPtRMpm-L>@bDhTUB;i2=v^+U-a3tPKWsRS zv0?w?|Np_d{}umjN$0YhTsMP|-~iW4Wh1*4?A9`o&}Kf!jpcT7TeO-h&1G6SazieY zJ7)(g)2;L{X-@8+c2?IeL~q+Wr24$hEK5O$2id2g)m1q(lslV~xH8$b&>U+?Z^)50 zbGs+Io!&GivADd@%CHu41TM_EG|Yw{d7ZA*OwMi&+r>rNtz(|2i4MtifG&Ah>&s^k zuG8c76u45|?sU`T&6iCn$1}|1@_M-1A?|cvfqRx*0zU<4Mr|M6|+w`bVQhLi#D>@q!Gc~`e?^D;n8m6}6qJLRSxmjyQqpv>Q{ zBcM(CxW}8$tDKde{`<9GJxu_r zS0=Lr$qzNcTprnWCQsJG`vl(eFmrqV3Lz}~;^X_IoR@YFUE6qM$ z=9vDsOunHD@YN8OT=YM?Sv|A?NBxIa`#gpH7jDW8a5A^sneLj#?`Cb=PR1x3!YO#;XhXalnp4wg ze3EyUcZmIrTy?Y-{Yd)HWw3!b&1K)7=G*gRWoB{Qbg#?n8p}|ko%&Cd&NXJsb!58+ zdxy%`V`gS$jd6c>I=t7*8=R8KlWpaL<>00*fpJTRqzjBe>j?@AF zU-i<$2|3>XfBzjt>WdBgOmi%q*8Y_jTR0$4y|XV#2eV%e!t(TboduJ6dc$0?W3@lRX@BK)<*Wav;8cEh48p z-dWz+F7Pql)10VTmvg9`68%N5&TzSgx!hT9cV;r{Tm_;H1`nodI|qxv;0oj#QWn^uiT77X$xeA+zK*ro_C>aYM<8YMGb$q`4A4|GTD-? zJ)X==)0OFU&XbGt+Am(@3A@^d8#2$^zq0=uCx`j=E5}^5X~T4r6s@VPUPrN-v4Y_r zsF#;I{#uTR0ve40)xNHgBSpc&m^Xpm6q|XF5OZzaDn5 z&+{-BU@xzhmXt%WezKcqG7zs&{;2JZXIU z)q-z~JHNpa{05Fb>-qnH@8n&!V|V`KQMqwFv41AlD59}E45V1Ylm z4UQz|=acMm=@W04zLT@?X_WnXY2APM_U(ns!4$`J*vDnxJHI_U-}Ep4#PI;b+!69T`6q%&y!3*3SjQaJT+(|E^ikO+|xLE#)^ayNKi~L@#5sTECmE! zT66(uuwfKzm^igNo<~SR>j03JEF<_y03gJ_0C^mR&$k&&xk~0>V{U1lwxj-$@Uw0( zr`>5x?}0bpI9?ddej}AUJ<{d0vj!tuidu292XH<9w|(X%I3@X{T9^lCyEaXNCsw59i>Xvz0_5pvk@j0`Uz#5Isqxc3vqgfY zGXxuCQmJr6CM?^X)(mF~Twsx7zWO8JO_}zl0lsEfrfG$;f%soFV(knH%PMns+Aa<&WO2$@>eIMUPC@O&WX{wSH zYDtQ^qfl=GX;I4_AuDzYi78X07{j?%{kR&;gTB$mulWVA( z|AL-Mfcx{X)1aocn*_f(Ym5F#jLc5|`1V9Z=pR2%Zzp?{2M5)d z2gsk%!y|x=(Mqr|`Yb4{7v4bx?i5=G+tZnk5g<5eT(QlGy0KNqnxc_5riYVBhp#wo zq@D{#b!2BeMq#3EJ(PzC_?SwfmkUM|^}J1EopjD0oSAD!p_>>eJw`2A9KcF&vLf80 zaa&*82ZYfiN|ZG0q{JD>JtWi$9>4zN*GexWBjam88Hrv(%(~@-oeCFQd_f3<>3)Ps9(bjQueC;=fOW z2}1P(%59wzfG&edBeI)Y-}2XJnqAl+1quFm;~K|2<4%>=<4{`tc%O)Xyn4Q1@op97 z)^ZX|S#JFAN!`Y;j9$Wqt+M7d@?s(8=AC2ir-bn)Sy%G@T2l9iZk``c<~T1pFD(MS zl<6tf>;uFhsKIgsC^>D4F%n6#VCp90_CE3GR~2!_ErElMySbE`dyG5Ik>by}?>H~> zrQM;PL0pYaIF=9#JiMXTp^OpC7UEa}P|QXCpQ`6;t^TkfMNmb}D``~2Ii7Xg@iR<+ zdF&oNBQ4D!%ZgOiCLQbWlcXvnWx#xj8wPSiQP``zK#?8kGV=N&OWlT1UBK^I4F#>T{;wjaGCdjL`Xri#@cNo zcLN#;yeVOL1S;fI0z^NUt?oN3LH!Lybn%oPV``#67J@g|_4~rbvWvF3b_>P6R)L z#_(=Cb$6dVTSn z;yE&R3>2j0eINb98|hy>Hgv?jeQB$L@;ne6C_qJ(!R0z-|J?-Qt^`uC7p3qyoC-hZIV?;mK`VXn&R z(#(P7xpW&T4{(C_kvji)YfmN(`!7%VKRm=$_7Tc29hJtpY?$2J$V>Nzym$?f;xnd0 zrE@F;2VU3fSfSMxM+xF4U7cRfNA;8=!I1n0y{1(8amT&XQyV5mvG@xfr_(|?4@N(m z&&f*p`Tj~ZvXV7_-&D5bIFB}Nw{1kR6XhQ>&|yg~@;3u|;%&Rr5`TfjB^@|I@Qe(@ zkntx(?Xjf3S;j>c-jao5-!8oW?Ltfc0y7#=_Yn1IHF~PXNQEJ z#06wC8Ow#j5K7|G_3%-vpY2m)7KZq~JH+=)GpZ)F+Dre$(d7ER`gU_~@6RP<{}xk$ z-iG1nXbnL*A^K~4cRLHD_=CNQ)2a32g*SIyp`K#zGrUhfC{ws(9kVZprcu+ktL#FE zw4uMBxr31ij;I8=ngdyub81>0=}`6+KV-bf;*{f5z(7NnFbli{iR$>&~% z6*spp11UbMFCFns&1+ia4HUv=OunuG3z>GpPb>XW4o)cIJ{97*{dvF^$?6@}`!GXz zLGK~1by(s-BfZaeFdngIKFls!jRIN~DpOeihhQxiuLPQpLQkYmRpT!FW`IlA|rl_1t zt5kk2V*uA_Mc!1q{?5{(xs+yDignY#zeOWRVWLy<&fRI+^A~kq9mCXSa#SWZAX;YJ zMVozT6m)maGx8yHA!}z#SGu+m?QUV#+uL28K}za_MxZem*V$g8%nd^bWAkxa_lr_lNSy==>%rD z=6-~P6)Ux!+&7>djU85-aw5@{m^-1 zAvHC$x3is@?N(E2)~*i$dub$o07eKC>gc)Yd`f}21vRw+N32*Hc_1aK<+Bk*O4%vO46ts6Y%@it5L@|jZTz>V%|s7k6KJNPbJ?E zpb-Nu)Ef}u3sf27CL`Q&v7TAnMC9I``#~AadnAb-jktBDQcR4zqrwhIF0f##DG?Is zKn}5RzrFC|3t}++EJfXhY)(;&Qq<(aIY{_o`=5a{cTVwKn*`HuY91eOSU313;~><@ zq(Q$Vk0`K64;cxZ6Nu>%>3T(~a0_IbppdFofIePgb)RpzyqM+AsNt0@NqWT z&|P|e=&@IQy7AKsBd7^U+xx9{s5M*}sU-Vg+t;VO0nuc`zNxv)3oQ3HqX?Yhn2-}w z6J2p*NjLLc$k5z~VN)a}y5ryl6eWs7_hXjjjdbo#=2U>$pk1$l17#R9d0Z(Y;i;L9 zO2)W)Z*{MZZPw0D(%u{KXLUJTUUV<>U;yRlnd}wx#bN@euxmbZbHrnvo&6utT%&O$ z;;|SE`P~^W{DxMdOTl~$#Vmh29mjNc|ooYwa<_W$eJ5iE%3%pRH()eA{`A+F3KNkN7!^Uvh z8n&Sqvzgxhz!ZZpCG@&g`;0M|HW$=WD0?1F?|>3U9+`eJ03jc47n_MZ4%qlot^C2H zz0xLhc;o-VVvHFJIP7}}$Nk1{l8~`esM~zQ>8>_p|AzDSTkbj8p$^;UA_|2^-U#{>;|)bDlbNDK>%oCkTjR$#ODokm z0gKcY`*piRmdEvQ+s6F=^tU8IUNsmJLVn+xeU2*Jn>Z*#HRRw$f-K!j!nK2pg<-Q9 zF=;)r-GQVG2Z=4ezZ`jY7wz~L(pJ=e3kZDnP~iB#+Fsk5Z{Q5sXg;vMxN*<@-JP>R z|A+dc9gZ4t?QZOe1*9nAzzjz%hz$%%cf|Ls)u=tYVO}Ash1X0ea#_76^jsGc?RC6A znGyT`WI-uGn&6DDKdT0lQ|yj3N+HT6NENg))#s=uVZoG+>;oIL5BovAS#>L9-h?ifStKqB%FPFvP%VwJjF7?kwCmDWlH(EFkycG&kU$RqdA;L4)zWaB zVcda)3I@YZrW?0YtssM3wYB33Q7~)fD(XPPS9UOI0LwNdSwP}83Nu7dSSVTQ-*l1J zRMG#+cc8P~-+fvCy)WU8!SZDbvS!>QhbDktB;AA@9casE9e$~$8PjQhXw$biRtYJ2 zXt&`{tWRq+GB4`!e^mMe4Bd7ndbb-8w2_;_g7^>t4@gC8FcUpe5j$jbHyMD?JZ}}L z$_a3tM|aal_4+iogef8x))mugkB~1%CkQZbCk>RHpmIhoyf)IAkv5FtVMZ>Qn*x{F zJIhSCky0Ex_8HDT6ltR5hRPfEz4P{;%yNfx`-^FG)I{X#G>o;;$fWZB&fdGnM_Jwb z{>)kJ`x*Td(UwsX@^o_(MPfkO7kdpC zi}LBY(qs7tbX{x|z`eZ(IiyAXhm~knlUj)b5(lS^k)gw) zgq2f}e{q2r{xbpdfIS_9F%8M3x}sIh=p46I=j_w7CPOrxYa?i>%DUcJsV5y(NhP_k zw~<%_tiu>-QWq>;&gfKl>SheFQp;tQtKn@fQ>liwW41`UKnTlLmOGcxoRTVQIvP{{ z>NeNi;9S0x#nYsgbvak){_7b}C^B%O--b4!w?yW|&EvU|EubP7`%l7SBGA!wIqCx? zzX|ikrRd4wr8kl2Wii3wi^Y2Gw_g+$hhPpawokF zvKCy6T(N49p&6i^J+BC^53o=)1jIR5=3dgZoeLLZfH_wp`u+{p13<%(SKanMPkDYm z2A61j6qEW8y;Lq#AgM?8IKxJNQ8hVb^fi+RCR6?km4Ou%W(jd4;y z6GN$zWeed{G}zMfo_v0j*(T5bQj(Jx(WNc$PPxgZ#MM=8Mc4(T62aigSy2&orQZzu zOi<495eyK$9X&E)@EcbuyoMxT=_0V!hB zi}6)jJ}N9NWIj6Dci`!ik($?4S-*=h9E61`+&%*dzC3ffvUC4~S{<9zX(Y7QtuyLaY^g)A@))9kMALf~J3XDTwQbvGh;= z|KYKTZE9GjEQj1yK9R%2XHD^ug?Oi;LRK^7{^OEE53% z`-&zG2n}(&eEpaBod4+1xizLV6cCQ`)c2#1(3Ns`Nj7Old+C!ALl1?JxjX`Pp7JAe zIrM$FS^OhF!(R^+y#F7*jN6R-d^pG$nA}*1aAX2|*^O>jl{l2<;kCnx3(a-NPdOPG zZf2ot6V)H=CVt|AxIfLixivsvg+^*Z z5D<;YJ6!T2O6QT4^=%m4_NH*!l{SdMkMTc^)AK@KSVN;#18G+9M%-TvQ*UZwYEYml zHHe`@a?M3d>U)k7$9&?)ZqqWi(9NHwxrHvOJKmXs>x5z(u&RY4+eaX#rS|`gBLuOB z?IZBjla5f{eT3XMuy|&TjZbWvz}$2ajecNdxkT|OpK3943*;9U#Kc{%Mt9CxGDV!L zT;cpVcNzs;{*cQ*{bpO|zOFBU9J1YX>kJHXa zQplBh*-Xd}F32TQ8%(}#a_T&$`Avq==K}@O7~bZS$ASxTis&;RBFCi1c)%%O)WB;a z|^3{B|C|el+`g#XFM@|K00yBS|J7}7A@+mWn?n*NYd%P?eEnV->)4YVR9@ zD^~`OPXQjmsqMR2RYT0gFGYa5t?^ikSC}M;47Wv`mB3bmd$ip9Qt0_8y%<-5$i%efs9rFoV1#;r#3h4bhzx+0E3Rl^=XSgFyd@m;7 zbMw8{MN)*<{jDp6JB)BtOSE`n9OgTb+*BIL#y=Z;+@e00mJc44r|KNB%`%fHi{MW}L$v=wt z?hGosTP5vO-QgrUw|eC}qJFpO%r8am>~v(l=>99*RwSXVw^FM;^CW`HV_l%0QIgdZ zl>^OfH2Py1{Ut(qy(tdd!`p~UJ?=GrjWw6YpXD!Xmo-#&W8CIOCi^2IdzIhC8*~&$ z0he}!UhuoHY<3VHd7o4n0lzUGD&A&`!%XiUAr^tu93)w9uZ!%Z3qAywU=j4}Vsb4a z(V2w&Cc<}^Iatz`TFrz~OUQWzeApJ=43jD-jv`q&vbJFJ%s9>E5zl<7w)RA$A z!ne7ZYkB$2vMC-A#adyXWIf<|fWzBwR`5Rtn9zR{Y8hOkid)qj`)C{8JhQKsIe+A! ziV}cp0varSRlj(!}UGD$#VUqJ0&ejg&9m)7rg-u#>cM{i`T2LhjEB+O78@}Ai-LS z8igN|mE}u`r|&FFVNQYQd8l~=O`v2KGKYWPAs!o)!a);wIK9mTk{^xq3gP`ybQYhb2!+Qs)5hoj`0;P^XfNA70#~VbP(~J)p z1#0~}j*onC8dXRrm9(mJSRZ?uxlEo>5uw{A_zQM=DHP<9kBYonFbJWR%gbgp@Mnq~<#gb6vBi*O#xveUok$-^*s$FlKG`2*V-zDBn#g@M zFB&EmS13gnj%DRj^_iPZs(CN<_8^b)GDxYSLx+vEldMx!o{xFzT<_2=;c_0uv+ol* zZ~T(mWHbs|B>`(1Q!=^)U7${xDXw}Gu%9Gz*u4;?WVUT30_7KnPG%_K)M9<9xOj0g z3n&dzE^$Rh(&2qiLg^`WO$Mb_{+znDQ-tH$`@rSEklH_;+~fK7Pb%@Ihxx(+U7J_T zf8r76S4d%_>faXo9bx~6UqgpSb?@D(pe^{?N8WVmQSIr!48{+!yUYn)Q9BuVh9L?q; z=WUR%DFjy3m||z0{1D)79u>-A7xGWZ-A>xm$00Wa2rJwm?0hc6x1SUUSlu$k*hu3 zf4yRfN6n99j35@Fb2CX=28kg;0ymmLn1BqyL_&ObWmCvBAc~kPBN3>7_&>x){XDqOd#!4GZ<9@pa;$Wz zsoJ#n$LQn!t??I`t5Dmnb%OGXuOI-0X-Tf!Vdqa*J2KCs4#`!$-)lSgg0)2CUX=Mp z-hzPOfYt;NhCWRc+!Cz#QZbGRGuT!vg9&~-Od4V^ir2iJloZNOP3Vr)bd>X6WHGib zfuzf=8CDpgK9<%+-q*=}b^*!(JP;sU5UC27qfF45`Q%J-yk1N2QObV3ds&`*S9nE; zAY+3PQR@#BE-w&YjS*QpKCiUumVDYH%CRat1`)yp>#+=Pp2NO?9uyOT#yZQ6Vm@sb zZSN70fR%dTZhg<%A<`v+08DE-yeAK2Fjs|k_{J46nbTo2M+V}br1BPTLC#Ik2y`(aCsarm!*ElW@uFby`8=d*!0MUCxP&$rd58_#SRagIg0$dbtOR-Y zxX(tsc#fyk&@P@OwjJ=4i^(Fbb_nXla!GQCh%Qv+=w(n|i11amWqU4Ua4QL~h%Q|ubfP0X7kttj4% zO~ma&IDyQu_w})HKpcJG=ANSyU}}@lC-$$vTAl!6EGf3k186h3iOd*%?vY@!s+u3? zQx5&xm6a0aiW1s)WB-{QC6ak$edPm*WfuH!57$4sekAYBJBpD=W5J<-iTqP+ zzg-X>jD;Oanj#`)8r=bpIiGgWPjRi>(xWPK9Myq=3!0T6@nFWB(*Fd2X@M!N!l=S( zyOnFoBg9I4cT5JJ9xly`0S>gl;UA6JDM7R=G7RTZhSS1&vfcJ6cK8d$PUPlJ$;MA) zX5sMOwwmN8)HJNF02qZrTcXI`?nZ*+Qrntzzz6jj%o-(;`IJ79;N)J77I%v7_CBRHc$cDh9GI`anz|s1me!G`dNA zZ#rvkvNl3S4!x1r0|^lW-|WbRLj^0#1aB)CMRywFjIE1ctMWa>aTD zS&IU=tG2O4?51F9QzMI0a2v3lOLaz&=Hd(;GC<&4bI}Y;>IZQZBmgs&G`u{>oSNpe z{q^`;32dIYBb}7Z$@xQOumWF5<4%4 zVi%)?hg~Ig6t9HqoiPWzR;Sr1a1uA)`gh-7?fKRR{)?M7U)nSMw~OQbUp&PBu`hDZ z|H;4q*RJ;e;PvQEsY?3G+5gv`k`UPIgXjFs^NHi3|52Uv-r`OP^M5?Pm?>=Z3!^5z zTt_PB3#6%IUxWN-^wX@R-0X(E=Rf#m^rP6Z4|RX-Klsr9&D};H5IX3;f8`Agtm38h z&SxFEi3*A_*8WCZ>yd40e0v=3E@Bn!pqkY8I^j=Hvs;M?iD3uGXDN}36+4bOfg!(A z{R%dSs3vUhWk9Ac!jzFnH9TH1CMWllcww zLro2CFxasBqn^Yyeq;$wgh?#I7+wU5lRc1}T?>nx$6_Z1a%W(`NQ#V-5^>wjh3=?Y zk1EGyzND+TxI~~#80_QBT|T%y`H;)BZ1tq-Bw&@42urj2AAk;BV*bJF#0E;!`x8(< z;f~@$f)7B{FYrHgl!OK$F~M`GrJZVN7l==}7{F1$s=B6%pTNJ$j8xM_NmchL!}3jigZCkKy0sNa&uMn5mVFewLC@b^yH1CsOfGX5^k3z-5? z)SEdOcbO!ZW3GpyZ##MP)JxVQW(?(Y9mn+P7CW;4-z5$fDdU)0)@CLyHDmyO&K)Lc z?fSBhL5i6SXdgi{D>4ai(_7u|4^h`cwAzN{<*_Yw!K2?dv>1!%{C0pk!O1i&D1c4M z1VUz!C%G514lAPfegPreIHob7e$eHS*+iUV1n1+5gC-duL`-@L@?vwD_}IlXk6O_RO&nZc^=dq!aBjYGN~sPX)wvZEf0`R5u~kvbd4B8Yy5GJt zzJHCJDP#c>9cD(1#PbwX&2drm=g4dU^kdzuMu2ms)xznL@)sCTD4H|@pa)$$qze!h z0ddvSsjM|iLm!kLBg}{`y)Y9d@=MGGRmQ8UWYhk2Ddw|2lfKMH zAr&WVVqQndm2gKH4b5+kKD9z_WYNq|B4U1X|ldio5 zTj19hCofH&ef*Pmr`WAr_Q&5~{-1m(im$+E0dxU{AenR7N~`q_>~RbO=Ye1wBf~+b zgv`y7e}@d-OVt@G+EDIiCF=lU+0G2!ilc(dPO$b^J#icYBFEKvll9sA)x~WX(pt>| z(Y{M8NemeJ((-7oHrL{n*8Wru{BMA)De?2Pi4}mLz+fUR0va;MVs+9fj#@r)OX3u} zdyZd~H-)<`v?JS)lRiNKhzW>)gONu}Vy3v@Bbbcl@EnY4s!64!4|-?YzL|?8fq9M4 z3t-Pmt{hL7LY)?2K?P_#Py`LpKPJ+9CK)kRFy-NYh{;GRWt9gDTGvk{s1#Ap5xl0U z&%NTcm$C9CGef6NV+VXZD+AmC6!gX9$t;O$Ro4G`KCR8^S(NJg0OZH%<>f|Te@>?W#- z5!N#J^dCCHNH(jyE&y;yyGHu#*uaxP$6<6;&r^k%&Nr(7FCnC`wsBbr>H{SKH&fLL z<+Z#~(1{~L@RT4=`A`AVVQ>zG9jBNU-(ll=#)29MZ ze1xqWdrNPo@!xUrIbs<%kyC+sB;h=@aZvm!EMj8(BO@ampE;JmZ{@zU%4L~x40q3; zoD!BBbI|F}2fB3jDxvkuA?dLc%5_i~%t*%C766a_ouiH5pnr9=dk|jMR5ECE^_Kp< z?dI9!X2jt}b!j`(0u_W5K4XnZ#?Sea3(&4%++a+63HAJp}HUTtw?kUr<0^is-l-sv?;*KxLitN1MMWoUef zjG=7o9Rd4 zH0_|pfV#3RAgHF4D4@O6%YCk!o5ShRab*EU-4=9XfC{ zc8oCaZW#fpfu6xC!55Dc(%>F3yd>z+qPiGJ$B~i}57*T(zIaRtYFC6w0n3XT3h#jV&nhiW+ z9-`r}PLdtm+zv7U%8C4BL*TTScC2h7D1JGX`fo0cN@pE+=5oKjV6iZDuYx-ho$g!De5 zW@X%q*dYx2EpehZhhIira#2#%-^pl-(SfZRqMIc$n~D{f4@`aOm$YF%dF!+{7{7Ju zD%Nn6W>Q$aX*HoO@lqpp*TrI_4BU3GK{ zFFIrc`-_PGMGQS?rVv`^1pZTp%vXzkZuDBfwk7WCA_VD)Saee;3IOSR4@;?H0?h)bmLp2) zd;_$c&{O2d_xf%28JsieKei9AXhZ;%ny#T$$=O zr+A%_#yT%ba~JV$T!uTDa|yK+Y&^pa=kpd30fY9*qjg2A%qA?bU>t?T#KvoglO7?4 zp8XPOGS17y1GcK+ZT(yxspJk0AZZWEy-pB+lv&u%k1D^1rb`tRVnuPbst;0xWEVlS zgpfXasEnddRw9JRj1szykPvJuUF`l+!fyTKAy7rz=MA1f`OtM7jlsZ1_)9Nf1~D$I z4TZCKODTl%-`=r~{(nA5jT#qku~&F;YcM#^+!cL48cvYu6Kyv_f~e7ECdCg3%z0Y` zJR9!#ohcqKS%XDKL(ymmv^$BdXjEKz@t2ll^n!X9nK3DK6g)0`>ADgHa~SLtRzQHx zG$A8$51T^_rCdRiM`O&5J4`#N;V2RyUPuEJ887m|-RpiRiCnbKg_gb6OLgd|G&4Cd zA!Q0y_0y+y&q_)jWKSh~x~Iq6y^a9neL0J|roBKP#5@6pD*@Z?V|DH_aJU3i1iXp5 z5zni7$1#1{egwozrWq3VF0mN#%EzGKet?7+(AJ1ZRQI*wPrQ$=WS)50y`*C=HtA?+ zk5&{DdGJ$KF81HW>oIUyTsUyRHuxtOJGnq#W5Xrjg_uA=VW~MZ9i7rOf<`su`O-|~ zX>Oz~`8a9AJn5Zpep~F`KK>K?VzvWRPL6X;OwKY@ob^ixYb+3vX*)?%3-u4Eg$AN9 zAu1;J*Sl}elLk$FQlfB-SDoU*3#x3iS1`MFVAlFyqn!L_U4Zq(xlG9 z0LuOa>~BN;-*#l|Z$IbA9Fh0m>VBVMGP@`s+5P_OSghyC2Tr^=B=3-LdPHT&(^%kv zzp)*nv)48>6$+FpW3MgPh-C;SOUz!3M=aL?Jl}|e2Rx*69D`j+NvXV#+r+HSfrrAb zSVQMY(K685XWT!pE0n0!zs#=$D2+NE@pEDxo3W{mtGAWJyP*H2_@mAKn{II3fCU^P>bnGzu#Yh^EA=I{O z?gy9+M5T8123Aad@&7+Ib^rcY{M8*~NASd)|KAx-RsyS( zX)Mdz&VQ2kto(Q9iw-0db*C+YGKCreR7#D+(6;f*w~gQwVV+t?m)F;VGdLdEgC=_& zeO6aHw0I247c}I36u$~_U;?4G1dWOX$ScwA*hk@VWF26Qyb^tuw8O$DUV>dER$~0? zkHEWVe}Xo6VY9-!$Sf-)d&(sM6eUKp7p#@KEFO=( z6%b?qWfFn;B*uq+g`O4Ir>RQCpf5~8oJj1LCOyUak_A|0#29-1N#6h(7G1N3bDDT* zgGZ2A{W0#JRhM-Ne(!KamE`$h}A-B0qr363pZhy`;SR z48!!&q4ZCq`%P4!bKL6Msd#;C0G=|#rb|iEB9Lf)XuhI#wEn|>_nXi3q6y&Q!sz|x zUieazZO}#*^v;F^n2CL6|D9VygDt_y!6hi%19w@e2+beVV8Q2L(|&-DMbom~1k{M) zQg6lsY>Dp2`fTtdqOC2@P@GlOuTY=um4+$(tyV$-9wBsimW!1Q*c7}eG2SIqf)_z? z`z%giUIfh3wVEHCXc7qkD$T3zEw@rNlP9nr%H@{4;D7IFfhH)wx5=yq$$ekm-H+?5 zz#!SkpW7$v(UjE^5?(~R5&(GA(UoDeqibZxb5Q45(8&Flv~ zYj)E~BOG}mJXh)~AVe68pAip?DKrDaDn_UlZkh2Lt6kFj>l8l?{&KC4!phsGex^u7 z1AoIwBi2RsD4#TzMU%ZzXnfq@>p1pyk`!W&SCRh6fY!k?7!BO0Vs^PHfu#j_Bf*T> zAjRcort*O4gGsA(ehFkm$Q7J;?Q8jDiv)h^%K?TiZ46rWXFwlr>9&4^- ze3P^&`T@Xx0f*79N1T5k)8X>FfT2Kc8dUkm)6mbQ2{V}JLg~#KNg~N;uY{{R+hWxN z9P-jYbOn9ZEKG8qpo9sW0)oVoBAVBS8H#H(hWXE}&2t?r)V(=!JdWEJmz%Yl1>*4G z#LSx@F_ER^g#3kP<$_5reUAjeWE+gonSMTV-vmmIWQSzC{PKbj+u3V^z*=qChX2oq zl?eUVhjbQoI!!=#o#A+LA=VMYbkYUHs?FFWWmmr_{)@wv+3K;by_ZCrT- zu>@L`pwX}7KnourlxS|G{V9`17fSb+pWsX2H7*iY?<#Yx;GgNXmNe<4#KVK4FZ8`| zW(hq5@umTrS@11~C9oPmf}z1aBLLeX%tQep2ENYv^PlxVKD%&2dJQB!F8fnATA%${ zO~kJ_u_?g^l8X3_G#{$YTU|ufmu7*N?Pi3%d_vpS-cRs(KP!88;PgIg{-;tej4ie}-TVByBY;2oLS~25CIr-S7Ob9ia zT4CP2uU-Xoe|a^#UX7s(9t5Qd0B?F^IT@=LPAsxa1Fx7(25lK`gVXQQ|7$Pio}_) zkO_G8;i_7y9JivmnI}V;1|iM?C-aXSt6YS%{*4878pP7yml)X@_6x#RXB`OPZxRbS zhYqCErB>}+D9M&cX~}uG?@Is<8~Rbridqkgd}4t`Na{-aLV`%ZH|eU0NO{L0wc36u z!bfA_Fr(J<2to8EXhS`Yx|_MSm3i}Bj3dy*|3p+bL}I!FLb*I?uSw3pev?(x{T|Dv zym)nKh9E_ZVgH)GBw$v-sXLpz*oyZ=4Q--$4dZ@pXA~BHyxT5+W9NV81_;}bNQ$EVt zvTnF-FBY4^LOo@I-b|P0^IJQOda`Hzf8m*R+oR;f@H$n zK4m?Mww(gFxB^fP{=yx<|)n2KpSkrLGvcwp=) z)KW1ui&&lM*sE?kyOsTfm3rD^21xxQG0zLUKW#FJaYzT_j&^AwJ8UPjG6)+%f_MtD zXF2b)F6IpYoWb(6D)U?vrz|Vxm>D3rrmnbHRsa^y{ReqJ^)wk-j4|4(p`Pm`$IW}D z^i`ge$U5}lf?`1P0l69F55!<)8y7GW7J<$fPKkHaL0rr(jGAMcyz_17EGgFe(eZ$q zw=k1hd?K_-Lz7ufQw3+1Ml*9*b;7C+MU6Jji{1WyUScAGwafCHIm@FuU?kK2W zGrC-YUSulT^+MqomQQ`i3`u`fjOUR45T^Fx6W=V>i+R9yOL60iqpgs}H^8&U+<#ma z9t7lt2S!-Pi=Q@a-g>AU=xw2Kv~>vneK<+-2RP+P$Unbu#FYf^9&~F zv&or7X<;wV;4sf1#54Fp+%jo#O3hsf_2XPt6P!>;tMY>U68uMd^oM*s`ar=YlN1&2 z_68aG8(P(kjJ$)9KWkO2hz)in#TT;kRpbdfaDnx5#@*)A5SnCHyDGo~YZn4ToWOAU z!+eI@#L^#*k)_l9agxgn_9$$@6Jrf3C_C01zV}IEEfYpK1vi&y;TOg5W<^YWW1l|809VQkp!q*r@^&eSq zh?k(9zrR)u6Ke%(bg!6BsFA@?YhWGWOAN-SRqe8B@*(#bj4_n8Y~&NY+hs|j1Q!4c zr1>uiQm9YQZ>JM(oxYUbf{8^7B#S*I<4tZ+55a#5^0ElWjf@yL#sjR#M(mF-1zra5 zVk{66<~;!*-V{e4)INqZvILuc_jBAc z9~5)%EI-GUg*w(pDO%?^3ekl$Uvy^@ApyS>?^Buf4t0pt_4L=KnT0OjATB)KyG_b2 zZv5Le3wju-SH!Wy`QDd6FGWJq?*ct3?)A|E!NN#mPhoa3d|CUvlW(r>;T84%WXQLEDpiN-mQCooGpnh;alN?P-WJjAHTE3B*%yk;ob_a_0*?(?%14DY{IuL;{I> zS*=!GXe9VVi6lwrBD?n(<&52X&pv?sdCN4u3V9lBOyR;-MWmG;W5VA@QPd7*j(V1j zD}`|M8VkA4sMfmUI7)aFW%!Qu(;09BU$>Qi9sf--OK=Eb$*3}K$&16ZPHhy01P`ykyJ#D85d6gFQeVebdDr*x@eht+>*-@jEe75#( zm%MNyrF>l;0`1sll#^u#tZA!#hKmKeAmxleN(CDew#>~uRrCH!jc zSW0O=tQH5MRaw=-IU;-Z*9%N!6w4#GH4d9-if$?M(E^}9au}76m}f|aDVbVHco!3w z-2p8n5UidhNj>q%&C)j@PWBhn0HFo}b`TdB#RS8S8lEvflzcM;3^pwANml!ls>^&{ zGA?U;FD-sjO6Hza&)emQed*>x_!eoylgfls5 zbL>V7T%B>&IrQOWAN0LkFPyYGJ=|3h zPZ;|VtljVt@G@kda9W6IrD4+0GM=%l&5HkUZSG<%q?l7zXGRbKbxmc)zknX2kJ!Hm zfma`!;hBYj0CbTfhG$`R7Ti0{%iBO$b4Z*kZl2rFIn zN|4-(A5UV#c$op_0CK=30>~zx5I^M=aqPm7fKxR9<%<1zG4N9<@&)C!g}N_g3+cUT z0>X5=0g(F={CABhLh41aMn*t{5)6%ilJd6dKAXEsihtO0N8CiW5+)vU=rA02Dbptw zhj^he)hKh>=(BP~iQU0mf44x)N&HmqFWjO!m6gGSnrMc!m`mN*=1KLT?(%f0!Y(sq z47k3l2)=^!9E9Su?5N!*6t|=02T^8&Ig;0aqsjC~Z3NUH%6RshHIEyh*rNem5w)O# zgINd5C4)J5hSbnX2?y-X;>PygCkxR<{v@(jU5$@PTklvMJRslY?)Rr7Zz<1l`*$15 z1{DOBEF(~ztl?pnCe**EOuoqY-#F3Ld)WkJS5-gv?S|31&l+g)nA)^}2qwA*#O!zq^5H(vQAA{GBUub^%CKUoD z`rI;*#2`k=BjL+@uMKV14uTSM^Yra0f??2jKPA;&H1oa}WBUFb`eLjp=|2~g`*=vV z9wu}mt_O%y*fMxBmvc{;^mz8$^|Dta#Nn}yt0%Pu8zd0^8hWk|!^+w&cmDw7nt>#5 zq99^wgU;xHL}$!11?K6|Z*#ucZ#Q7-t@wb)S6HKG(z|3c1R*9TVK(7r48cUoxIv_y zvWi#u$e0GUp6R1*Zzb*}wX?u_o_o=2e9yQE^_Y5M#$(<#Pwf$=+ri>XOc)JdO?&VY z4@Xf~yOJ;PlzDCw2o_l7<{6Sv@(*r#yS;of?b3d$ERT%L`8bS)9;p*|Zgc2bF)CAP zpTm0Gvjw6|Edv$dPLnL^iQK9s9M0ZU0OYRSo(k+{f|OD+XbMrAIjtYr(WV0;ICYnr z5BLo7UwBz0{5U3KGE4+6q_5D*st2`o$UFtB(V@2iQAwfcRLmvk%MLxA?p@X$l&^QiZTY0CNpCE&>op32Q89~df`e^8PfrhDqrbN{sQw7JI4&5S z6oqGeo!M{q3?NED(Nm)yIE%RD9Kw+UCq?yLtjbXF+a+9HLy7aJXyDoXM3aeqWZ4m? z?^AU2vZ~>VXtI}aT8|eJs{u@mRYOwr2srdRp(k0=F%D4h*?sDq-Q!3XWFa&GdxX@=6155{?V#B_E6nn2B@q#@p-|>lEjlCcH!F zDOL-UzeZcBBG_@o!5H19{(%{e^DW`omefOj5NIc=nbU&c{16DhtESpN@+x{3@()WKuML+hQ(HLjK5 ziJmu;Nbans^$H5UBv^*DSYkaZp5~PVdKu(u1%rv%<A3B{8$&0I_~ z(qdW1946NWkxoM>Ov2aKD`txgPe9V<=A=tRFcAhrIvysKX5lt)ZQ+8pNN#kLnB~m8 z@H#QM-&COHIG^qDGL#oGD35WWTQPPpqt3B?;O8K28L~fR4pWN$uA2^q;jL(!Q}E@} zvia8QVbVVK?UK(Sa7KhGmWTsz1QxtTvcEixkCb)jZ!{G(==$Be@FX5`fJDfs4XMeNAg?quG{F$50=96T7cJ8jLaI5cOmB)c>C3#IlYK zea#U(0E+ZM?fo&!q3z^yCCoOlX$e2ZXER#SOe6@>qI+LJqJ-DHp>o^77j{75&k*WU z_7S%?eVKosA%})Hc*iCs^ZgrEB%YLS7lg~QHj`lRSYL~IfuC;f#-OWlWEM5(iu#f< zdLWl$QGL^##*%&*VJ-FjwFU@oly7GW3&sP6cvu1%8xRFsrJn&hh!wwDTaSBDMzr3r z@IQ!YehvUdv{KLZHnyMr<~Ht}X(-VH*DJ3TfJG#zX0>7dKMzWwQ!Kqpa2~D1o z=fPVTz=+JAw@ex`F!{mOLJ-zocQ<$h+~v_F+9MKPY>k$ZlMep4$0tXZd!`MM-8m(l zJv=9*VH3%q?0d^MAcZhh?Ngt4@2HaR+3&?lFpj9vYRG5st0$O-(eih;X(%okGn(@w zR=}j2%A1iw>bf{n^01`Bo?DXUY~&>@8Ob7Ye2OesANOrkU&n|VHc zW}c99B7^W41ITqEgo-4mKC+#Mt43uA7SHJ-FM^4v_f-mwad^?6jen8(ev7?|^K8(j zJYIezK9zBAZOGR-AOiTLe$;V9GP4w%er1-{imFV852C857a$jk*};93TgkWtwiutw zt=f{i8>kFraA^n8mSnw=u?TP#6b!=T3DSj`*QEZSEr3Yg-!TVOVdnj`N@GEdrvVJ) zD_tt%Gta1Njw7gW5&Y^Io!uc8L0?RYduEE{-0y^-4xi&vif`$q$r`*u!1s5O$r&WZ z`K9JbR^?DYKfjC_rjUt2VmZMSjBf*pLIE8#Ckyf#DHHUGj_K`hWZm396V1OLbwnKAbyCzTe95*o z(*66yX70djuuJCrivfSYBdt3UA6-Qwv{!jkTM^oi-Ax6jH;^UKCTB!cl z=HEGj(T|@hc-!L;%Mqgb1!1Y~P`LU90K1byRd&b@X3~9Vk1v8V0oEix9jn5`lV}4O#F!Bk6{#!0?!35@Ty2Gkg%K?hVCqv7z^&!S z?%P!sU~Id8Fl9)@_iWtNq4O5VMp$MiCd@^adeNb8>Co<)upC}~X?hY}T$bJJIXMx} zh&fbfzEHEUr~I55G%yX+SA}xs@|fW7uis;|8HGaDfDl;r|RvVuNsAoxTsi;R@QYIO!L_UqE>$eq_Rg7T48L4KA(`GztW;hf_V2CIlv^AvB7) zP5ra*g^9f&L9I+FCI8dawOuz06(Mbb5hc0~6^BeU`C6)w)s3G-=BF-A)Pa6(r zbE9;jDTIl%m39;YZ``gj=K6*Pa4K^_5fN0SK+y(<(yMBUz69!@md4Vzh~zcBC7C@* zu;ABDf#c6i-=$aV5SIh{n$R^d!G7z-x4RQwTWjY{c$DVTr1B#=MP-cVaNO-VH8cn6 z{s1QEpD^M@3&AwW=YkS#Ccf-su5fx_wFltY3`uAS2PWZOi`u-2 z<~lGY%-yQu!Uj9xx=$90_)ht6;5Eox@|p+~!PxG-F@>Qb#80)Ff<&)BzV{I#Ba66% z-m?mX)Aw8`^)3DVa;W1_7I$?OjEA|IF3^;S3w=j8gUL6DfQf8~FIFT_w=?K2oIyTz zN``h`$G?t2CP-?JQ%3Nx_!Sa2nyw^Q-(*K4d(ZmubTf6j8qoE)IBn+~iRxQwX-D|= zDHA+GwXlm&@F3zxU!Top;p#ctg7Q5&pX@YgA^YAaFK1co=J9Zttn#7{2c!U zVNWPOVcsL=RMjz2_|T9K@Q6zu9fKaONoxrlC>?eyGQE6e6UMw)u@eNOX!GJ;&MYPT zQ(X@Tu~`gWLel8PD5N{Y>{ z1^y-04rRIn5jrxdIHj~2*Wtm7hn46vM#ZF?2Q364R|DHXwrh&+D}1U*ikJku!QHiz zx)NWicqYo zOi3epMM2eYJNm<_nc7|UXFWF$tVOGB7zh<;Qs zi@uO^c?FborJqLO^k<~RoWol-!wa7b(2;y5z@tDhUNYhV9`(jUa{eEn5&eJGWqJC_ zn#!|5o-d>4gTy1{Dtu( z5AD-amYn^2dvOW9WM}IO%erp@HSb2{Fl~_EYNxZoMnR{FA;C9UPc+dkJ z0cyYS!3`hiJ}hcm5RrYjaI^H&3tazP-Oimz#l{xf{=+mIZEY+xuJ6mSPbbsx0tTe6 zcmXcwGeKuCH_Qw}){;>^Q$W7b(XNU_s#p>vHls8qmL|m67P58q9HpvRs`{jWp*Njh zf94>{TTy%S9VS6eF3+EL8zEVe;mAV59YE3`wb{t9HktP%h+r{T1B?aL{^ZA{e>{TLo?oO{bp8QWLeJDB?XV3|ju9i`#KlG% zxm%&0MHtkEkUSh7X@(_Rrx(3d|rY3TVUUg6j^9Id+MRpXq0IMoL0v31v_d??D!qs=_S~mYj zugyK1o7ntgud<%a?{-AuV`ak8b*Uy8E;_Lh#wv=8<@6ODO%um92FL3AKF}AG*^`sc zHbqMAgy-mI9PMLZlSwf{va4#Ev{1qlVL|@|eG|h)YeVAMtwdmYnP#=rDasfsq;lv< z)iGt7-O8q1b{8FIFe2L;L4;Zo+{!^tv^rP(IzA4oQ@yXafUC$&UP~c}be7_Ap1gCs z+JFeYmL3g(ggPqM(0Ye_5ABrQN=oz>>BI%Yg{r=n(KkWl53~6qVkjsZz;#_)#u%U>JIJ$hoyB)Uonc#xvYhU;r3N!68{eF! z_j8ZMZSe5NfwpBR1c(S8=M$vnPB*f_^c6EBU{dt|fs>8#Ae3wyKqBn>?`B>k)La<< z(aP}fw$r1v3G4}ZYsqydVf?U(7fK2UYZWe*cp)kHa0mEY6avh>KrJ3t^SeBI`SqvQ zh(0az?v>x-_651wrUbwK6#}yZz*3OHm;x({$LKsENyUJw${5$Rl#D>7Demq!_5dLq zVg=YWfh@rUEX3+^Gl(csMM90|s`5cS6t`@Tn!YPfyY~@h zrZ^>z)!N9??r*&V?6cxlu0tF2elFA#h6?rQ8uVDQ0n;|snl}H8NFL6uf z{ZvB1dG0_fuRa$@|lUqg#L0O}fonzGR`-c&A-7icO8*4Uqrbb+>CuM~@| z_r5T7Ah_}d3l@QH`&48yJYox51R~wC7ygR#{98))sFhtpYSfRY&~YU_rq8#J#3vxM zxX_;nGo2)EkppjXZHe<$hkmrGmS<@mK{oWk86)M^U$~~0FoU{4dC=EQtol1lvlI=5 zO*Eta>=1U7LdXu@L9NA2V}?$9_ThgLHt7r=pp*#>q_6i2F(fSq1D`}_48x3qjH+^% z`B;0=$o60}WwE6ePd56>Tp6VI14QmSdU^Gu)wNjpRT}~>qU~7K{xHxfGN^<^Z!o`W zCaaYVej>k}j112^Mz5nB;=RuZa8Q@_6C#i4(m4?WfM`M-`ZM$6d^4^90RnfOp-lo3 z>g4@!{@nYHzH}8Qp0+>ob7_{oIw zchmyj8Mi@?mXG>2=#uTgi71sb=gaI&*+Bv{e?M?Ueo(Kx=uHg^a82pV@RWSUB@_QF zZ!>A9e_|#dz(QD>7cl)MaX^9f%P@$l=4R4}KihfKON2MZu1KXs>J5%NfvS?p`m

?hU#37QFk`QN_3FOh%u=BUQ#I_CCP66MaH(6(T9r@Nu4}wi- zJmhXJ--w(@1u43vnB%^3st%S{O8FV24rUZx!3YJyEM?&0L41ZKW~T3D6-!-RW#zb_ zspMXGO<^&S*o*d=RFLEVp(9fYbf6SW$U9i&yG5(w8Z?==iA+dBp_u8!hdwqp^AsC= zQ=PwX=s$)l(VV-Ct12P+>t@WAW=XK&E4(O3276qA1rcvS6dWORml;EF>4r{WV!p#} z0Ww20z=yqvLnNzbR*Q(5k3XA7eR5iTmp;(f9hYds_2iueUQ|R%N(!0mFkpuPegb`y zWCS8ey6oo?+0XqmtfB}Ry7V9i0i0VPEHM>2!4%ET{C*e7P?q?q-niMU=CknCOF%1$ zYvP0$;zPI~Gy%G|_!;bgf#l=t2SZTet6nu`SK@uVg?HUJAMef=`{N$#T`+9*FOFkD z5k0r69&jcd(C(aXlOeWo+Q0nOkL~ZjO&h7^zwzeZ`oe#0-D6JYb6ENJyLK=Mjj<)nzgxx4lP zR^86)U#gojP3FbV&|shu9K`-U$55JX!)nMbC)LgJ7?IhOCSxs_)vx12?WH~GN@&c| zvgfu}Fva$oTL^$jb+-*v?7xP}CX*6JaN{!SW%+)gwOx%oPH~x;tM2K9E30^#+2mT;q( zxuA3ktgybdxJU@q!c-d4J{I86AG~Cq3A0RE0#hAWfHVC8CSHj)|PD1k5?Bzhi9@X5Y~QT3bKUJkYT_-++e4&|T^7PSywwFCZkm6b>--6j2qiRpiZ5asrek zhKO99vWDA$`In|69r_+Rosb)o3z*8;N{=~Tcj$-FcBq5FNRYbi@(R82aow8iD<}j$ z#G0|onSrf{fez=WvKqs*TtxZYt8N2aw`KH02#;F{)ao;6O9c?B5X5K-__un)q_Hzl zD^wXE%L8A1*{D_^fc#r9)Xxw}DmR&wG2Gck-YAhKf*n)7jN6woCEg;wJC?8yxOGcYcyT{1wc2wurpzQ1#!w@EQAy}RDjtm}+jRmM+TDEW(IaYkBRB?>& z4%B)HjAuqtukHyG&1SK@>FDy%Kv3WJ3Z=HtKM3}Ad`1Y32m29anbFdJmg)_#rjl@% zuaCz@n>mJp|9vR5g=6JqC&&_;{3aM$u7~1gq7YcbPwACM`8!2l zy&3mB3i|FI7UM{pLW;m%s1Z8T0;{m-jj$AOE*9@AkAYe^GmHx)0aJB{1xgLKvJWMm zVsM3v=?SJ5i(0^h;J2$p_gxU)WnT1>RFaFO(WajD0KvGeC0qBH2D%{KLcW9(NY!Uw zCYKHT2}1$60HI4>=Kc*|P9>ft$o1j7Pdx7K+5CDUMM5toNMHMLqsSq3PMRA^&AOXW zVDgVtD+`XK&Cz@e6cFqZlkYc)o|}43o^~--;AS)Ke0_Uf5v_OvO&C?Pio;1BcG4X4 z0GI3QWjtwUm{SwrdJ%Haka;lU#ncVcIobqLtW~>K^a?*%H`FmP&awbTf;iGr<~Nf% z+5pKt%C;%Sw~OmvkjXQ~&k|_9r3Tq@w1`Fq zQo#0wvgTtSU(snEDq&9Wk`|j33h-jEXh3B98A5M45CghRm2}vzJ3tTMjZ_xnj$4wu zm98a{y~W_5WA`r|`jPNaaVYY5>`}5iFGb;tpe{ukUfs~`Z;Zs*AX?Eizj3u>Fh<-W zQR3>3nXgi}hF}t_U)-LDeCCaHLQDy;2_ zAkYhR5!Dho(p`r7I@n2|1)RZJ$Byan%Z#u)RVY#j1KA5ci)V6rE+3gk083;-zax4U zk7S5oiC+Rla$BKU8df7a$NizSn&}2cvb)g_90k=!nd@8Zn4E219apoun$)$IqOG_eB7R@05+kaAD?Xf72h_0EZLr7bvv*5=F;`eve5n$QyYR=hgZ#0+Ew7Ln ziZh;<@|lOQuovYuvhs#nTgD}LiZ1O&DNLNH3-{S_pS5g5izNb040Lo2pS>P>F^80^ zffVwYY0w7~Uscz&!#F2YwM=u#agveGA+b0kF0JaZswSb*3z**3GbPo!3dGb5G*G+# z4Ci7a70AN+!UAiBZ{woOB%vTTEepa?HYMSK9p1Yl5RSs?dH-aWD-3nqIev4~=dnXT zUuYDNjn6VmoNqv3A1)_(+;0*Q3Guykfw1rct0QFOZe=F&bGN((IYDw3^rU(Uq*(6? zOva@d@29}xKwtuI%I(~ew-->A9eSmj9j|WCZW`-x*TV17{9ZG{%z77%jOI8C#8orr zXq_6 z&N>YTaf9;45E!w!YVg0#%jJ~vk%`FGwRYr?ugsCd?&GjA4A$qlxTmD=P`Wk6K}-Mf1P|}ef~ZU`~|V_NSHRY$Q4>3y3E`XecEPUwXd3%0QyV{r%3vf zmOwrRY-jP_MY6(wwelSk{OLk0w>Jm9`>#?5HBRUQZ~`9ZDTZ0-SWp{*7j~*So%bSo zA7XOeP8bKhjz2*H2A`S^W6bK7XIw=ALiS#YV!-M-yrnY9FY&}o)b5l8`0h}Ef9s0Y zsa1p*FR=)SP}$NKPc2NSMv~BY)>u8G00*|JnA4{91@2+q)w7PGB^u})Ket@x0J-?cVpcz(4#93*u#eO~F17JdP(#%s_$2gdNnOJNkssKaA(kGy2h;XW zYTj=WtpyU7RYIMdR4~2U28;7r8qacI=DslekSA+XA{8XLR;<5QOvAylo|7bjX#c&# z%KfzIjU1M${_J5d5g?HGCnDjm;wgN6ykBarS;v@zf9mD0Gkv~(=V!blm&x&7)lVRI zKId>!kfgupWf%NxK=f`vYf8KptuT!ZCVA9$YAD&k%Tn+;eU2v zhpPSQ1QX8`QlgQG-4>WOZGS}Qa)b8&@K4MC_DAiH1E9=lRXN9d4$XmFCm);nEeFpz z>EL(T2Os_Q!D(xK(!u5H+5ZHcnbRuXQEOF)^H)+^l8NA7KlTi%d%Xze4e2}GgnCJn-D_f=Klt7`<1g(r!`+PUw5jn^&PtJacKZ-ViWOuD3@Ih|4BfbFv$71EqC1Vs~)f~knoOp z>-(4QVDwnwRL#IllKpp?9x9{%f^K*I+MzDhzav19eP^(~B0D42F(ZEMfU4HglLcbO zL5$ue0F#deTXB<(rL)m=3+tUJ2hXrZJ)$Z22do>3p>2FI!58i7bpX*mu+20lD3SqB z`g+wK&$eg9s!GO+Ms1Y1)} zNj^lYfz(L({u$c|d|BZRDts z%p)y5V{N|CJc}RNmer!!LfLVdKRYP%Imvx^0M}IDqk&}@07-&lKVgQ?nC1Pg$5-gn zcgGfhTM$MNqF8|qF33VoUm#UayD{EZK7f!Xsmh4q=ehz^Dy_>O2bsZH2e@(@XK=Tu zh5Rm6o|!5zHQeVoHRL8;_Z3$1Rzx+=<}?XC=Vg86#M;laZljArjbz@p};Epo#r|>r5QLX`TCx628iREI0RtTbmLh0ik^}O>&(Kt zC7ZOIJ-?(1W@oP>5)>fFh1&;p2r;icI2eHJ77HV5{fc@uLz>Px-;!Ff_Z{t}&Rq^t zXfH(>9g=yL z3>i9VObD7>*^a*xOt16E;t9ZB?rlt1u;ww###(#H85UX?MmUwxbl^3H72l3S<4d0A zeQgjEAy%Rn&8DL5G3K`v$jfi~Et4xnyV__c1dB`m|_ACazJKpxZDjy>%=2gwD}=Vf|M99qDL*Z!Kd`P=Sn?F3IibRw@-s zCF3T7qknWygH&EJ23H-&32TyW8y;5?eTY-hHuI@~(!$oyBnbUm2X<>EkDpMlS3g%> zTW8MyU!=VWU|d!82RwZ*Kv=|)Aj(#zY*iGD3znt8w6tYuDMNQ^X{RBCG=y}RhBS0Z zhP5aNgY0`iicnbwL7)gY3MjG;i~r(+PF>L|3?OAI=KGy{mUm~Gn0((?W#(n>@1A?^ zx#ymH?zzjugag`*LrtTxv5Rh~Sx-yQXwko+cW&5#s~~4CIe%aDpkL2C|1`SizJBL7 z=z5o6&krzR?Q+vxygg=ryxW@=T-RX%@qO4*+8?y?Z=*05JcD}k{%ik0(LB7wG+Xg$@sajIVr?RKeO-~Ui}*!%_bO$KFkA0yMA3#+KRc=ANFbpgfaE@1TR{V(DuyenZH6 z^@pENd(;=vH1Nt1*bch*?)ov)XovqI+NI~NEZe{TiOd?P6yEDYM}iO9c-aOtTo#XG z(C{Zhvv98t&f8uIHy}9heaNy2R;<1cvwOsY*1Y@fi%<%FD%v5F0#+KWpilIZgfl(i(n)B zS1&4JnJ8S`fft*PqwP4s=)G2Ba55Kag?9>+}O!xL!rac4T$zrOwv ztij-utmsB;PgzxtN zJ%0lvN8qhB*ktw)4Nx=+ucSt%NY7^$EI?xwumdo?U==oGFTuTuPsB!J8u2iqTC_<6 zv8Kl{93hAa+xHrHp7;{k$;W9rj&LK+_Q3VRTFiP}`-I(G z`(eAl@$^1qy54{0#`;C8?!9+ycn65R5<8KmLtEaA(=S+5Nq#N-057)0O$D(uG& z7x;vz*VpMSVDPZ^fg5o%Wchsk%u7e#OUJyhdHO;!LVNeWv$hK=*oRGz_17=KHIhfs z&P7ZHe+?f|5s0F!g#~J)HIOg5Kp&=chp#&XB7GcJ(H>6k8u=1UIF`~YT@jVNOO;JFZ;4^f+m zSkR=&&{n?#feo}iwLbIfXTuS=3}*f6&gXHOgRJCq>=4Fl#!kEiszrMjp2)zCk;=!h z-oL&R+h*_@40?@hf5B~hso$C2RbIS`-V&YMsaN{#={fB35Bgk zqZag!M#!De@z!@fkN2|lpYgsczJ4YZjm-uK$x@%t>@>LSiFq z4J5tqCu`3{Y(gG8v4DmPAQs`(Ppfg25kyn>A%a_U_wM>97Tt?b7p??;o-WtNfQA=X zj77|PJ$l~yU_aQXGZ%%En`yW9HcJr*tOai|v7ou>S}g=Mu@oIgtQ^|01`}D@4@bui zX;MfpUgd8{4fDWhm=(IDby%Svh3LbC{!gYt3un$urSad)gASZB{V)m>;+CxgHZ9qI z-pSb9byv9kod^x1JMO<}-2N@!Co47P+w1VMZp=vFYU1?G|NjQq6%EkexnS){G>>10 z_J0y{_iyyqFRS0V3zLKXCstGAE$P5rtxITkHFn|9U0d#PuO;9YKa9m)fe0eVJp^bi z7@X0hQk@H~2VK1KU;z&B;O$30bl zFKy|h=m+f_$I*omG#%r~9L3!6f9MC!VpD@o$E5!{C?? z+DWfa^Al@oj?w7=tV6eLB*ztl!nzG;BuqB0d>&!5d+~N|P{*DZ{@(_y;w!oZ2S$p>Yo)jd5T+_>zVdspv5 zH=4oW$IF>;0RW;LGwXMrIqS*GX3`P86zvqL@4tQZ%yIPJ-j~sF;vFWwN+*JL!y-Hd zMQ|kYli$3Gh#(I3>_sP2CkOPlttI=u9ma3QH18=WI4+>xa4Ec?`s3l@9aq1REEh(z z;0qM^T#x(3VHv_L{yGW=b(Yq@uyPEB)5j1bydFP~$5tMC?K47{HhU2rb1- z;L9JNxkx(?%K}m(!8k2kU=?C^3#rd}`udI4S^R`&rTi=oQ?(jcw$^V>Ivo!zi4=!7>!h zuMjP^V`k=V-1)q5 zExmSb?T8Pmf5WJWt(S*s^H(8|Qiq#RURn8g-7_PCv*35sFI<2#whQT% zpeS|SWjNzo|3a|KrV}uETGRV9v;=3*{({B7$rQ`Eu6GiC!TV=p6X^=Y>wDK^HGJm2 zDS|}H?Ed!`{#*Af&Ao`oqDRJz!@e^tTda8C{rXkc!Zw|b+u~@9`o>%JIRAj|{yuIs z#xa2dvCdQX+=y^zT$n|NtZ>-#p*1Vtp@<^7c@s`g?1lZISo?uw*U_;By#M7RY{fnl zUGl1T>Ym5lJ3Za?>!0873QmPW^%wMCcK)b0&jlJ&S*%@exjU9;-r9iZH^w%oB!b~+ z5Uji4dNG;?zVR>Y;`vM&1#$=SH{a93c@A)P5%lAQ8ZS*Fr zMBpWuD=PJS9FDEnWQrzZF#s1AxHqw`!oau?O1tcFx1#j*jpJ}4WHl<-JM)NwF?@kME zll$EnYwWX~wg&r<=={F^2c>!+>kJ=b#CZry-gNX9Ruc;-i--g^C1cA>I(l57kKt^* zMr$HoA`7=2huwR}y8p&Lz2PA&IjtOd*kQO}U@Weld+nolJg6aW>DjTaL^r7If=#&y!{WsJ$sgetT&njD+WnL@`MQ@V zGP>=DbuW*AgdPq!68F%`kMKi?i#d=U{&Hmn;LbI5ui#+qMf6_y$+%pZR^>@AC-Ln9 zPlqGjsk1D`z~sjI-?Y&UQ`lPhA|0)(zxN1NAG#W3(Zv|9#+^yKPV4U;-EsFktRJqR zpeurUuTsDN^oQjAA~bb2twbT@h~pxt;Fu4bx(3Z3^w;;Utj9T|(YQXdcO@{J`RT@Xz3hx*3lME z9Db#}-$dl>kjO5283QW{LLtzPT_$3y>5Pw7Qg$o6^P_Ql;pY_}Euh6R_YCODmvMjH zTVx#3@31|dM&%RmFpVzhg9+C7ZQZX&(8}a!+=JSI;{)}F*T0F+g{$_WiQ*pp39>Aw z(HJwj|M0a-pMbA>D2ymHZXUK8(L4#^giq*otx!`eT;pID+5@$KCp>>6SRnHcF^bi%y87NoAk z>k6>@2qqGf1!$lBAD26PRG+xe?Rz3M47c9Be$}E(__@>Tv4TqXgW*!5x1OlSZo%VW zL+f{4AI$o|%?Yu}i{&J672Vfdn5B~#JI;rh|wwF>{6i77h9U-X?Ig-yCEU{dN2!TK-_i>pR# ze3G)P4f#FJ>+xO2g5(CePlxIf*4>P$IU>cl#&RPq0<0o85}Tgx4f>%Xa6z1E;g%Ot zh~RXZ{$YGZ#;xB%A59}zwfHJ*ryKney$ZJ&yPsyNs0mq;3{Gdc>*jDbUhhZC!!7>` zx~s6_dd3)747{3pT(AL=989OXu>dWJFGO?Zw;NF@=*aDG z?BThthX$<0|FBj7KWQn#JU^w7#A?)*jwQ5z92`j@04#;<_6bEva2E$IwAmCK`Mx^` zxC!g*8(si^K^qvsSa>b$!p-$d7ST@|f&HlFzmMTc)c!_))9>#?K=dCjp9(hNH~Q}r z{I1UfeZM*aUdGoy;thAt;0qjFTYruFoBl-iIOA#hF~oIiOP&t*K2ah=o$w3GF|6U# zZ-B&3rkz@|KB1RXA8{oFaBuLHjln!L?Ui&Qh3>dR4;+KQHsWQcV4ykc@qITQzHe|e zd;wf!jW{n}OVG$NKM*n>r!uG4+QI3Amw|W`F0R8%R7cROT9boOBq8-Fq)KLUsixs^{byi2dJOsuBba7@P^Cp*HyP`(A|26~is@lK)So zK8ssjq}Ux!B%gmps&3tg@V{q0O$T!69mo{^nbm(~{n!okI-;>3k4M)LqKj250*#Ng%JV8^{ZGT4|_!lYmw0!JL$nj3v7O)Zcd(#60yY3Z!EI z+nE+buuQbB{yj1|OQ0)9^auZfUxB0>gT=IUev1?LMQrRo_#4>qT>mbP|rpqF97$Pz6X`}(u6r@^#MM;sR50&+M!Sm41sVKDjlkXjA%Fsx5Ji!(P6 z8*Z1~^@HHA*n@zrC2q}o0-g1QiL1lbpu;fMz(C@yESN;N`;Ee#cc)H)eJgY}Vgr5e z4DXqovXlE)Jps#q*rw62G@bSTz%~$aKXLClw$5*h0i*da+&GQ}hvU~EJbF9^FUns3 z5*Dwp(+72(818#0O&L$P_F61do`IQpo9Mg~22K<$#eK_~LliUak0fdSZ=7t4jJ^ZAc(a!lKB zAv89eLB+^-x-6hO5!RBqISsqmaF4{jFTm5lEay^$zH!CN*@$5-qN`WejR;!9XEBtn z!bJ0ZSTjU|$w_Mbr2aD$R=l5<_;-PIn2DWHyM6K-um>l66r9yhX5!evZXb_&fnuq6 zdlSTR@yZI`Q3ZX*WkqnZkA0b(>}y6~6#%1wn-QG(5q=7{ckdnOT0@rfvhZxAbcb(Z zjs6bIm|w%qG&F104JrCfvuXP81N=w03-K06;Oc%$S7z?`At~VVVDZfU)g9FD>D9Y9 z2@re@o5*NA_Y0pqN*8F(;YX^#0<0+9{{+okrr?b*yd9nhW0jP?P;TAt+;)$8ybu9K z_T-O$Q$H625;W$^{j0FC`T33n%>2EmXww?Xg{>mj1plr3J%$*D3iW><)qbor0G~?TO1FH{w7P)&tI}KMimCCS#AA)@a#)mJ{i13;W#_ z);)%6S72q%xC>;i?&+xe15IDH!pMDn{h!>G1n*!2$Xz&9gDB?~*wBc}b}zf(dNRyjPv#rbJCI*Zq-XxhGa(>sLR71@Yfu2wT3fz70bV3Z4CUY{ZCoEEem> zzc4mpMSQ!h>bHmou`lB{_b(nBLEl@t&seOXXLds-SkTZj&c04*=sCvl@y{^+4iDcF z+)DVC;70zMgbcee^;mHS#&02iH}p(!Pnuqm^j$4|ZdH0k(m!SCQ>xNq4NU*jmOiyA zJud0B3dmvQ&oCV(hs)u?yB_INapWQ zOJC-mv|W>up0V`l4cRUddlpJFDWpo9#pQ0wFC-G5CKUbCSdxPdvx##!fd>4E9y4c`$1<#qevic_WW;|O%s_%q` z?%^}Dz)(@Pk=1@1}tFH8FV9-WrppH7}Dfze&(S^1mVG0XNdJCEpQ!7o11vizB3pz@X4pXuM^2x{i)8*8B z70LH!FJC4oQjUzv5q-LR69iX2fXh3)j(>n5ZkQ8Z=j1#m_zvZt6CNOcy6!S(iTiQ3 z`<$e5Pkf!}wD|H27b2r8E~e$>zrncgd+pj1yhFrVR=UsNG5-3N`{G{dYS4mTj?w;= z9K&?J>(S{5Hd3CB@Jtj7TTlO#ztX{spT|Etd(!2Ne~N27gmK3ij@s{NtwwB${GJos z6d4E_dKNUy3)-msc|o81!nMQvy;Zm08sKl#*QTp(elCC>M?fv?RFR zs$=zuk7xX)#wYA(aE2Kctxw+&I4!^NNT#<-$ONgswT1UO&fCZi)yOk7iSY+o`4bvC zGbX0k4Ea4TxSS`aIl=2xuQ}l@tXJWm`8&AA{k+V52Iso3)A$bc<~Ryb)DjspP$9JZ&-ht+b}=e!!^wOprYb8{VUC3{8*|4{?YinY@xYvRM=;*Y&F|8otEMH$HOT`rmwL`xgaQJ1{Tjwn7B)YH`Ob9 zCfCL`F85P15o_paYB;AiTwf?fwSoUM;RYE!S#B$&R`+|J7G_cGI~px-aCeyjdA}z!ga&3wE1nUlX2S`jx|c< z9hdaM^duqa7nnUGzvMWG1%64m6RKTJuds~E8*IK?l=K~qpXu&N>s6NYZ$;^7-=wv# z;*!fZmuFWnh1lwXJ+N`QD7f!<^tuD*P<3OXbgb%2Y6a7~!P<3pLlgV2P2ua%a_P8Q zex--;>y0k@Eruf$PhPg!&2lf}_B6dhKMTL%)TI^c(@I$ND}FxXH+p~Q%zoG;jlD?)04H&xg4f}{^N z|EoxPtv+l1`1hH9gVCSno>Y$-C4GsdlRa}DdDpR?9v1|s;|GmD-5u5~%zngfJzh;uNqVin zr23nY^jmzr3f>^TTbepce2-S;dw0;7uy z->z_93?vCC-Q+Kr?r6`x%n8qCx^DcN6MjnQ@)RrhlOxs6bZ>B93?#a$mzn38?wMv+ z$$#6?*^~JpUe6;2Tk(~b8Q)!n|J&D^n;r8IG z+TV)*lksmEKbYSH&)WcC{bvK?p788ztLxv@^h*C?+(||ccFHMY7j;{+KaKxp+{GR) zJ3zd;D7Y#=hvQwaY7xEUn@n%HN3XM!#MTK7iEu^14N31UruUH1!@QG26g0Y;eT-EY z_qdPaxLp8kG+a?|ml|&1d1>lxrgwpd>+E&)z@#f`=d$1)G#t%~;s4OQ80JsyzqViB zJ52X6AMfa91H@mfzog$~+!G#-;`%h*8|S{#PB*l_H2#P2U-$H)gXYDEHv~^dd?-Hi z9^-wvc2b-h1%NVt!c|nh8#glkUXP!S06iS^5uY@^%Yy6i_{aoK0WxHMYvqytfa#uZ zbZI<=;NY0S3p!T&YejIiZv;|M z9tlKojUyQMa}SpZ&L>>P9|vLq<32IFzMx@R*yQZ=wD1hG(>kuk>KT8D@lWeyZa!dc zWuLRWT(GuJejCpBFOQ$D;5Ooi^h&fV@~d;(GX5s7oK^`ewuV!!gb6|~u|4Bgc>eLM z;6kE2D?H0pXI9wn)Mr-sC;mG?L|FA-`RvTZuNqn z)opH;_1BExCV9AS#EE3uZMdS~ZZ{mQr@8T)=C9VinVq@Zd4{97^*AG_{FMavyy2){ zT;U`>3;kJfeY-F{-~M#ax)@JS%^yqe%D9*}f9VL%ck=0A*P|mCKu+nAobO`eL-@sf zo0>uSs0i+RhMUlkalTB3;%P~3r~DpF?`aR0Wj{U3eqq*$M)Bzc!LJlG^>+>O6tMZwkDb4@P~ksce(Mm zirR|?F8N*S75f60cY@)`4x@dO{Db1sf}3wR8V`@O1|BQF7X{a8?Lg)Carp>lferR5 zoXYXoMOn3+s%B{Fj*SWrm-Q zjUSl*i$E0D_+`fV^GYWVQDkk$KEc(_^EACE>9zA$O)pFOVC`Iy^c{>}ZXx9}zCZKH ztHc}!?WXoX&Ec<2(sJ^G`?}G|x+m3_lB9pNs=eSSkiPsh>W^b3fBY+4?id>DBf( zEiWnQhgtp6Z=oPb`CH|b6CBUxNuI$Jf@pe4(kDnhq#sF-`gh`+%*Q`$oSuNHf6Nka z3fbnIUiswETN`h7Mf^qdjRIY_2)9u-sGjQA}?o?|+_<0xan}C56Q6#tiH323W&%uv`l$P6g zEYta`H(ob|%bf$%6dn!va>=SUiK&d=-IG^4El^>d8(yZ(E0V`EE)WNr;{6Zwiid@V z|J#Nss~)B1F}^mAuH~jB-S>OCg7Zw^ii@Abbf%dcVUICxiMXvDGm7)-(HXo(_2{Hw zROPL7OY@noKcDKN^|Ts0nOnd(sIL3x*0EsOwR|0y%YvI&r#R?Q_z(7z!dc=k{n;3? z_G)JOyLx5?^DP?FOn+9#3IH`H5}RpC98Z?A2NcI;?d8NE{D>|N&3-7 zhx|3zd4`$2ED4TxjqrGo4Pc3-K&98%R?9!d8Ju68#gJ@%a7l2_S-CWhyLlvSJ2L(6 zJB{g`XLbnlpzv{)AI)o|p{)Fl&CBnm2?)lmqk&djNpPoG`8MxFqek(Xr?ZkSX3HheGRPp>M^`Qe#h zA(ux3t?E@N$M{i3Kkc4WzOl18eVwI~|8x!!>ZT5&<(38afQNJYMqxirAT)i#HYnY` zbC~XT3{UZP4DdDfqw!qE-D5Z^|6;>wJ<5WcU^pIkmA}UGm`;yp*W1I(SpULj@y(J{ zdWBVtZ;I$Gq(`NfxRBEebqr|ep?L6?X#Q~x^F2GPdQiHU@ky^;I(a`-wBra;a$~Z5 z!VNw~>l43(^MByw@1poBS*i!zm$O1qZ~zHBR67Qh?|7c+%r(AgeQ>6eLu>eFjB_jp z#b>Ty{1H|CHqUY+doK!Ta=VK053^XvKXOxKqjxo@AMCY5Hay3TuUU?_IQydb!gY-Q zvR8h0_!U=vH!TT>z9_zY1LLogfs@AB@AQUGV|X2hhhVjEytnX|yMyu17{6q{?l8Jq zuhgB4tKBD{=lRm+{=#`(5_(!JI*fo6SA*Oqfhwr5RM1IKkBE0fZc$o34d_G{9 zAVwEeQCxB@<9=(n2@NZF|K5rj_)Xg-@rcm#%5M)IB7*J9+$Zl=YNyVLe5xOXpKv~< z)6lcTm89)Zk@UwrJ?>DyCY)&cq5KveXL^kuA6>!kiG!{zidMSipE9oKN@M@Kll`Ag zXAnBs2q@jYBID09Jk8Hl%Od;S_%p`&@!>4*_sD{-jsJEPA{6LXvR}-y&VLj)+b4#s1{J!Ad1fS!k zbM$?TdTr78o_<64G(91Ibrka%#FX$xFYlb_Wl(7rno}?=Jja`8%$n`t6+hKNcnMt7P6Z)<5y+GFmVCn{Q2`TZ~m<1 zrqI`^+%r9SXTurbk0q^gD%CNr&)Rb~HZrjuw}i(yeQ61PsoAXlnR?DgGNFGokM0bx zV@Kv~Iu4ZuM`zsVUqjFF?pw>RNP095(t62qC-2$rlRZ#XDedQ_t-1U&JiiJPpX;`y zJa||mUC89|S;kNCQiRdh0vzR>7kpRVI)8Q6)| zJYlWH@{)dt)tllxd{SgixWpPr>rvXD%ZuXq z&=0s5+CExt;sC~NXXQ?IPnzB+>9u@odn6@2(rc_QG?5s(c$Z5T1>x|QbTrKu`wEx) zqLsT@KJL|S(%5DD8B3C{%krUK&J1*8))(#nPBk)pKW?~U1#z;%aiVhV6I`|bd9?FG zIP%E_saz9ZXS$JHLHWTf6Rgn{+~15((zm;a0f~a3Vi*GypZ^Bao$lGucGkOgJ`~W7 zVeA<5Ybpma{vHqCLFagAed0d;O1UpL?saf!QF(o1IR8}BC!7ZlCqa+Uk;1=ircaea z7{9$&UVHE}g14XM^^4e8#{I{ucb4K`)GyFZGVGb1jvdDM$#tB8{P?zTspF$9+|RW` z+ce7FM$uOrzf$8k-(c%r8Ab z)i1y?W}>DMJ@ zc(i``Nlb6+Eg9(MNnxXl-?WAgLB8A~O1EzcYNK?wa1zlv(q@Kc=0_*y;I z`jsVpWEDNk(5XNDz{r^$iOptui7LGFGqS<$5nkInF^BQLw)#eKaQKVn&&EzBDmRs%C{K5!0(3~7iyKTUMp?u5%F1nNzLbc zR~!E{e^^WtF!T zHlnP`SFD-y%kb>@8fZUSN^p-GU$YyQ1(y@iWstM^Me$RZoZ$J@OMMj(v`!N8^s-;-@kle_VF^lVEURV$FZZ3vPwggW6#d(W7Mr!^K;f z-uYEHM0^-`jM}+A!A^*G0_*?LdzFxXZq~rkv`Bk;?~~=oCj$= zbCPeF$Ja9I7&YTV>~yAos*iKaYs;Vs(flAIINy)W&{67|xI(If>G3DePcuQ;aH_xQ z#f-Sm^s%Yo*4}WX6UeQ-GTKG@mpFs*_Zy!yue;3XYQ4*XyWDV?k1is)E~7Y{=|L{b z^nCerokh4VcpuTcHMWFt7kTu$n+ey=lQNntBTeg-7ySKRz1H-GN4k2g=_L=qskZ8M z>P)78fYCqQJ!yS%l75S&!yZAQX?UCgT3T*n7t?veaI|jA2ZkT*Ma86@wA{o}#_wQw z-Z!P`Nl71Uyh%&?M$6yS@JMfPDRK6QSDx~h?&k9D^6Yj?xYUimEz?CPpr!SWFK2v2 zpZfDJh&-*2S-s;c827lzo7VHrb>eQNiM8;je3Vu){zp~#9>&9eRJ`($?`8aTR!{1G z-yuF$kVutoV~%k%t$*YEYq+!XpHc(SJ(uxCql-8g$JJX%`IT%#IX%sqRf_bqFVA$ltLP%cBy`pOCoW^$B_6Ju_lb35 zT!cB{Pc1_EE=ax^em-<(A#eU@{CiCQHNyq#=uzoZBz>)=V;=36sk(v-JY3;&rc?BB zm{7qkR^c*NFz#@}O>bCn^5%RM1Xml6RlbUn?#Jn~e1AjL{+ZZST;A`kJn}!CVRzTB z)b`u5;O7}0-IG@{UEeR%9Z;x_`L$)iJz?}{{Be$xY&n1~qsyos7p`HtTYGwh zYZP5S>-X zNpb}gR}dWUW+xot6d3rws?W60sJMdQ;wD#G?}XjLHWdU)EM8u` zh3Rc=^f)4<{kJ6P(fq%u;ZMt5Ky4fzoH_f`aylr%Ev4l*-o|u$jV{H3;6R9g6;}}4 zmkbAaL0n1sTXAKTqp;3k!JM7Mk=<8SrocJcj8U5h=v$gg4Cfrf+q!qBAh(SBAEoPyPTc#=N?WE4ktesIPO=oy)FYkd+0 z&Ns{IL+4?@VUmAPTuyN8eX^Yz=v+lvaGHy?|KZYe;uX9dAU z{_+GY?z*b9({`U)x_v)lx^q3cSsK3uxSRZryH=f~wl|zJ%h5P3=?P0;;GQ&pqonU? z=?mSH);lffM|tg$<@?RD%RT)rJivV1ZgenS$v6%TG5eVQG2>1(9N8!6%_ROo%PkEP zmwa$|^a{hoB_0|cz5Fn7v4@#n6t_fuVQ{3nrbkJ^MeEt5A3t|}E5M+m?NwaM^lIBn z(<_ob(&T%Rds01&Kf?Jh@!GSUH#D|;?z-{S_Y=lP>+!JvrxIJ_Qb+bb_9){nwsI-n zg%J-17N6GsdBGiLe#%i8AKm)H{P3C)R&M!mrq}M_=JNTnx#6~f;Zi?i+)(n(4}nwp zlmu7Z4li&!TS0?;F=XW*1-RD_N$PNZ>h`0VH z>0j{ZEW>!IbQBkRk;^;R!*$SpX#pxOFF46DZ4IWjgL~<{^#P|lUox1qkNEcsf)fL={Y)ZfK3gf$Neogypc5v<598SRejODK5 zR%RXJpY!>Kfy6`$?jb%ohDMt;T}@Oj$=5hvm*pdSh;dQIVZ{{%w~MDYS>E5_riqFx z|Ay&(r;45%qp57`hne3puF1nKJCisiM|qO@)n&m=tSa}n1k7gKr<+H*7zvS5J{o_| z^dtR3z2LG-wG5XZCaxm5D!2-tDz>Hsp9qmQQzOdDRbt6FR5zn<#U> z?|Sm+_6}4jt{}MWOdfPkqH|~FQCLZF#q~_D!>8w_BXpcNigPypiE+_r+uC+Ck)dZh}}o8aN*hSxdVTpTe}T;e^(jk9twej_lJl)n|15!_JY zXknPRir~gux#<6xF=~5ixyg;ppN^B{XS@6Ggh9pShrp>`l?C@jD;MKmb2JXb-{RJJR?Ob-1O&caj|tyzvp^9def%A2j~B z@Itr0evubk6kj2n8v)$;FfG4v1k+pO@tX-py7Duy1GVz%3m6}b_Y`NlK*eQ#Zwh;R ziN(0_$vYji+_a?s*DKe}D=_rp{S{WQ;kRIV|1o-0?gY|WmmDrj^Vk~sr?zE$pOi=YAiCYUb+=n@(ef(;;UpgE zj}!UrnBI*(J-%n48&=8uo5oKu?p2S^w(vu#58{Brr}nFOobjKJ=(;DBXQQOg^XPSi zFFSf20Xlw7z4JRTy=c6pet#~>zjFd8E8Ro`<9vPU3Z5ZcmnTlc=XYfMb5-NeuXr4y zxJ3;g>CZF%<)~gzfGeCHzzef@Y;tGDZR6FiQ*L(a9N;`d;(?Q^af-wO%GJz+RH z#|nDX4?t7(FE@&DgT)KAy$XW6$?8q#igy=1IFjhP6YYvm?ZtHc{bF5m&ez4!q+Y6r zF}!MySgqaXqW)h((m(Xd@8t6-`q~G+RmB~CJjU+7PK;){(fzk%53o8ya>(=7D);5Q zN4Xk-uHXV-sfpF()%QiFce2S9_7c+~py4n__hrQQW8CE)zg>JkLDxX{)D*tN_zgyv z{I<)9FuhK|^ri31jH_N3yOVHTbnl9Y)%s0wf5zWd#mD=MzbL}bka9C$Vf?dO^AGO6 zyYLD(FP+Q#bLaB)NptCx9NmIPyLIW7WEgjRxmnTN;AJ7L?Uy{5>AvCBubbn4VivLP z0U`40N2H&Phj2cBz1~?+V9DyLzEuP_$E#;H{IX+>F0ofXMDeMyO!s8Zp0tO2&Zs>+ z0(ONZsr{sQ1mnMB{L{K0bf%`?rIL&r=iw;+uKul--zT`|eSZ0V)a*d}pEKi`uD>tE z`RkAa4Zq4~@<_%->p6(mJJntWrH|$(`C;P9f^$Ix)QSA{WgXO1Oi%06IDyN(!INj3 z+&j?b&IhwRwZE5+V*HUNr(iriYCRH1bNU5l7ZLZBbMD#T=Y}gB%eW~<2YxX1?JZqk#0Onr=xn5rfyy? z`O9dwES0PBOC8U+KX~*y-TFDLWZX>|I)fLY^JtCJ7=MB355*PT_|{IxSrEEsYu}E> zPe%L{@!D&u+NZsIS-t=+OJ`z~pVAD*JwjmobN&mB_uNPExzKeH#ph=-{s^N>_DlFC z!7&+Yx6&-eBLwRH5&evdQ)Fm&b0p{4jC;^` z2bcrJr%qzL|9*$g@UsptLx>}!_*k0pd21gU|4Pojba)F$s&Dxw#$WHt!`;iu219X; z&5VooeUbh`0?@Zb;6VFJQE+>j92UAKrBjjg)s{|l5QqaEgsYN@>pO+ZYxZz@j}hGw zq_}ts;|7~IDqktVMe8%cOd_r61xer5%B!w_QPLYN9qVUseAQkmKb2wP5~niXL(xkO zfzxp-C%EJ4m_a%R|Cb(_kmDiaG~h2iK(Mg9? zx_w=YKh5}nedH4r&d@8r@uiIWm8aJoypGxtZe`uf>R0Y&{KHQp{-9`sxAbE@q`-+7E1 z>G7Wl-*e?;FwBS;t=)?kFuu>^NaF__N%TX4s~pp-7Q0`on;u6;|uC)q>c#6nJ?O0xL2O6%^J!$)tB>gKMfBIgdZmNyE*9b$iQyI+{ zyN=6`;u}p3m6hSQUBxOZA<}X9I~qV$9ydeSqejQ*69ed6osI ze>e2-4RuN<*2i@AHF;y5exZ@E@ug94TN-Yndr~^dVbaMALPzDDlk_P5f_k~Qo<`Lm zm1Jc96Spw`%Ew^)3{ryg*WsI8oV$9Q?7NleEwOsi{!#4f!2Z!0_)X=Q_&(!yG~9Ie zqOQ`y!xr(O|Di`X;xzA`ig6rj))6V zv@eSGW8Y7}77G7Kb6I;O9vvQD^(FZjKde@vcTN%t5Vk?FB!kwk^aA6f^EQFo3ZUt!7dgGQ{+gbX^lzGcIC7!s zMM>Yq(od|CUs=+->li@&^zq(sYZu6SyqDfge9$#qP(c0Q?cNez*nmh{2Kg^Z*tJso$n{&`7{#s&BR1MI^o z4#7uh2tLX~;(+aY@ey4YY_JO3{Z6Bqv-)0=4JW1PXdTP?k` z;D*$9!HxCk4YWU_A~;_@w0;0{3O_s=-_pPT-}TjgQ4m~*XaCy6JJ2C0vUj2TBHvr( znD`^p9p~{$_Y`Qob^Oi#gBpm#;M(1#`xlqxj;# z89&MFI*kLgZv+FdcR`op<8L#5lPBlaa3`VvB)*v;m2><*jDObZ3H^5NKsVj)VeL^C z+)#Rxc#r8FVSWta1>x@XS}!d({R!iS>d$$>IcFX`x^W%$N%cV6t1P%$|5?kc3_(Zb zm;5jD^_-_qS$@S-HYlm|B7Zj?<2N(c&KtDcMoAYnVE#KI{uP%KoNqVi4Jler#g&GM zON?N?hN71lCayS4Ts#@zv{9dSMes0`~f8hIs zr?~NDet4dn56tIz&U{3r=#pU^W~Hyo+?TrkT5c-N^!)wJv|n1=S?yq6aHkr76rXYP zDLM|M*8oN1>1UX(m`&KZq|2%F;*#EFc9qsY4|n5|yp-LAELDE_9hlx_R(_DDN3BO= z1E>GT(lO4s?I2xl^-9Za+>vo_d$^9^OsYYLf4`d1{Vd~o_95d9FB2l#aFoRp^Mc#E zjtL_T=bF!O?U8aXLdOe!-Evh5yX%w2cX4N?|D-oQw};=i`JD2R-;Hr;+>6WQXdTzry{}GyN-rAdq@ z`N>QA8J14x-FOY3ei|#k$43i4)}EwqZrU{MQ-h#}nJ(6A@7F!X^?*xA+al^C#&$>GAIf?v@|b zu9XgC#G@u(I-mSU!p#p4lVNX}RWq{72XnriEFYcQeTnk5hB?Ppt9K05^tdpV^L^3k z%PVNgcUjUGSUQb|I7uNRq2iKr+1}?~5u9&lI_YgV zqMu5ybS%?Td+g?AP-FEY6qlIHxbwYoyJ(+pjlLHI$5JP~2%PJo@=8o$I#WIU&G0-w zL)*o5o}>88ag3i}@@;DPUT?U<3HW=x&c`B_w7(TojNi-nY;sRZuOjJlWdVuyP2AQS zp6eVjJgmXWHMN-1OU-9`5*|Q(ID(^cNlQ9M9jLyD6S;-eE?D77w%@ZXxO2RE%lmF+ z7nj@G+2w*91AKOgDrmWxH1l(E?OHKDS6FT=~tSWe!J19^C%~n0x2$i3gdXSisdxWxs{UOXfF!=BY9@% zT&F0c(o3~4y}@wW-X+0((UVh_?W;Skt@@^PW35a#@|UT99Zfawo`42bTt;xWGMnI& z?4KLjGH@d--jZ0v^xpJv9llE=e#$Dm@*(U2_ZP7Bjt?tcgpJn`89zH`C z2V%UMrk_v-l}By~;};p8?w^EUYxJ-pIA8y>Zk~}{MEzgopYE)!U+AtT)bjFYa(c8b zL;Lcv8UlX>>x)Mzop=}HYU7anJmhDa|<`baD1B=@BG zW8GYz!RW^&eH+WqlGb`8B>gcwfnz45)EVSL!& zhWGIls1*aPax1K2d~N%v{EL#_VsfSZ@RP0IDxJm)na+`h<9*)BS5DHuWPH&+#iHXY zP5Td}0kqu0MNBW+Z;JkcDZ7{pYuEV2jN4{wE|~m}cY4A{wdRCFAEC zpH!bCjj-Z!g1gwmb<&GoVLxCG?H-``RZMTJ;oLOQ>{Lq9wC^ncfPk7x{HA(%KEbWs=IPB)I?he1>~EE0&@6Q;R)Px}_g7-KaldfAT_W2CGl} zF2?cff%zP8{a0|lUrQV1p+1mLv|d{l+&r&7{{3%SpXA+Kt}pl2;6WnT>b*|P>{H@i z#=qj#-|nsbHD$}X+oZMrvHKYB-}{;lzlsjailuy{A7C7>%2E9(E`$Ye_|+5+#TPnu zv@bOCW5%E1@zE9@;@Y8&98IaW(yu(o_(QA4G4_XBslV3fdE;8f57utG3H^-VYVDn- z=OlfweH-~f@+;qcl75qC|E7j7)saM|Qh-DBP3=YUr_A>lZ(QmKzv{-N4j$k;yz1Kg zGxu}O_wOyaVs8B*c#4XdA8g>SYuuMi`sRm?PT2FqE%-aYtk&z#zhZh@dF|8X{9e6X zkT%^NYxes=qY3`uc7%E=*Nxa1P>T$vaa_G8yyFach zxG4Svdyyr<^F1h9e)46ecac|qhVPBckb%|mwVtI{7=O5@|84TVu{M@p8w|*1^P>3w zaX#OUyNj7>x=p^*<}b2@iST@R9r!Dk-Y=%EC+K_1?@kv*O*>y z|57?}Nss0ipo4g!E?jBz6SHA*Zu|@55BBt=gV#?w;BVM|(#&5OS1V_2hn%F>+A-xTFX>l%<#dLha@FV@ z;Jkg~-?==u*atb&xZD{)(QC%fqTqZ##+|gQnP(^8V0t~$PdP4xhONOB1y?W}#St#q ztlZ2$nBMt@qc{_$Mm7A!{>eB#1;F*l2FcCJO%D@S940QYfy*80oJdh{k6Jw_4z-Y! zC4=r}@tEAdnBGSouATSkw|mQhrdPRt53kQC_;^z0h_X?%z24TUQR?pC8m_QLs-Su78l+|%ze zz0Y{{Y3DdqJDJT|`77$Z$9Si%T&J4b}DVZRe7o1Pkh4p z4v-DUG@mZ@gnN97dH^0qY$Xp*I8yj!H~3bOACvmr7OrLfRMkG?DO0<<#!Cv+`X_g0 z{JF+wQ^Oy6!Y`mg0P$(QsL@#h*nEe?Ux z@*DSHdN+Ig-rg&YG#>PoW~MKr81IjRO*9{^v5VzB8RxH0xA493RrkC1?Zvn^tKo}C(hw(|PKd(b;eM*x41FH|6cjjjPA8cY?qrY!0j{;Q0?*TZ+w zc#VmtTOF0Sg~}oJHO8+od~hc{DxU>OKityc=SIV|;VMJm)IKzRoy!|(emtFDaTAUf zcik1X(M}_7TWE3Fiz9rK^G)^m@Xrs7mEZdWx5A^}%I_&{MbMH~ov(IELoZ#Rxw9)J zs&C?u|6PvOBO|zlUO8>t5!z%MwG019vzwgChcSJ>-MjeQ7QGkH=0%yq8TX>qm-ao} zKse(QCqEGFR%1`n zN#^Hu!(lw_CAQsLhb-=t9LKolJe+$|2%Rt8K1!P|7r8;riKrC!rNUu_k$i+&2FHU;Ktgz+Q6Wj{RPZlE3(E&>-c)Ncg^vN%AO! zzny;HLziQ_qF);Z&FX?&-0z;=g+ljN1F@{koa@AA`jec?a;RO0Qah8D^zE$uCc7t1 z&q#XhyhZzUPSSs2_L%0YtB6Co&H!R<(S^7jbz*`4Ooha4P4#;5J#g z6o+0w?c7b`({?s|8<+n(51-+6C3hUKcKpbk#`tJ|G|k69B>EYeZYq7XUzK*o*N($l ze*AP!A8+=D=%GUpy@w-uD*to`<9)f(MO?LVEeLM9)eGZ0>{Bf+zL@D9?cwM~;aXf; zaEmH<1f_ueq6rZ_oGrcWjxZKkWNAsYR6|D75oWZyQJo&Wq0qb`7gXR~dvcr>0 zpWq_@9`+ISg?ivKT7O9_VS0XjJNf=TXW+H{@`Ag{8Fvg7$- z;wpkW)RW_~w29Hig~l!}SM{0Z6$71H$_b8Fg?U_~{ra`~P!il=ez(dev6RbQZ1W$A z&mZnwka-v>wZEu*@@FyrHmeWWY1cqi_B^?aai21}w6B5V!L8nbccq(J!T5zn7ySVn zw0M~}YWJex{PQrhZ@jkt@s&(Ze|Pe1-yD|~oNwP&xIq01=O-wCeS%YY5WOx;UzNV% zDuVl^)r0(n+f9&)EA}vdgN;jyi}fZxz#vdF>|~7J{Eb znmS%3F091`{X|;pk@z;JNBu5*cSOUA@eRu+HLO5&bUvx{8ZTnJ6pJ`T(s8QkNl8D< z{Yv&`MOAuE(wAF0ov-OKyB52c>9<%qHhZtYz7Wx0Ehi(m!T88Y`dty7AJU`BukpKF z&J|Jm*$pc&0wwteEvF>7tqjL2Tbf>$bXopEeJ41irdK5Wch*kfZ|PC_C|$~YME)1{ z|G|zWr98#O@{H?|-#LynqoL<$-0bGj%ME~Qry1qZc$Kb)i(SU_?lyYg!g~b}Fqqsh zk0JtEZb5Jb!_BAncsk&ty(bth{XM4V<2Lm$Zc|T$i(ftfZl&N>M!4cYxaERd9^o=q zFuh+Gf1M4RmI`iZgiBsI0B*717Du@FRRiD_2yVd%)^ExK;eIND+4NILhW}|lD_lJQ z-F_8NKO|I*&s{SRUIo<;Nmb)h*A9eNf%QXT)%e791L0M0{g7NWzA_+Q1=tS>R^yA; z4@6%D*$+upaM*>xeD!%ci0r4hKm8jxlHxGz6fvQ9mUm6&1 z0#%7BzOQdU`X*47sNyrX42U;@szeo^ymdf)Bv6s4;^W^R5bp_;C8~C7Fz_CFv7oKx^m;C(xs&_ua+xzi#=8xaY z{EamFCsmc-DCq~=JS9Ac9yNdFKF&YN@~5lv_YIL=lJw|(zu~`q`o#yB{^yPU>?-=@ zA<|<%=KRsUVz{IP6qNtOgPi_Fqt82TH9aNigO#6=^bYHH;psm8@su6D z6hFXu@MV!+#hzh4_A@$*+>`Ms>3dlE{HpYnq}R5a$|EP~Nz0G%81Y;ETgxd5?wf|= z$e#Ksv1ggjX#BzY5H@2X-ghj0(wsGoyh<-A_ydgI>F!DS%1HWGE&XIS-JBqQE1iPi z2J?4{L!_4^J#OW2L{90KC4Dfv8heiGU7KI)5tnq|&!CGak~Q^63T`mJDktfK*@r$! zuhmDbM@iCUdk^e8M^co}ilkT1W221*ipxCD^}W#Kg}9E}N7{)^!_j_$*b9ssjGpq9 z6Wn0yAVo=!;sLboO(!Ur0oA|si(KBHj4z7&fPaen;HvFoBL@QI*(a8#R;$9jK8Ab_OkJb`1>C7hjsB<{wgmIkH5?-j61~2Kg&HSe+5ZjZ0RIF z#2qAXrtOe;mFe)PL-8TL=U?gMB>fjghw6Eo)l+e)Uo)N8t8m|S_7!1Pi<33}ALCr` z2Uyxy(?$1p)U<0^aIIBxyPD;8@8)t#y~cEJsVW~!%r$glzhRu4oJjd@-IMk+&_)o+ zuk|VlelUGjT=KU}cZHP?dAoJ)P8`zk;@^T>V>puMg~q40OXhb>kG(0^F0SRYyrQIY zZ>DsV=fy=8m-s!?;aQO228zcDZm@bPU$NJj-dN+GBZpdEQql*bqqw5r+KmqQck2b6 zSpAOV)%XW4Zzy^N!CmIlqYe0IS29pqZt9Q2qgN8#Q1mk8;nAxIuGi;}?PryKWY#l1 z9%ZGy=z=Ecw_1;i;4b&*xqXhXdvLF8A6x!UOfTo*I{DqUw9a-EM=PUwdi>ABt505V zL&>M{FHCPJJrUSrOdDCN~;~(8bX&kM`u2 z`{(fLSr*(-^-OMHdPDJ76x>k#GWjp2H`sWpdQuSFcdF_OM+Ei7@M7nflK*CUL-q5b z;QVsCXdNF5s}o=-wcN%xnO>%<+?ku%jXuHs*l^^JoJaKNozTW#`mO&hKh=}6;0E(U z5|#fgH>Hyo++co4MbZ!S{DID}VT5*6^#>c@;qt!g9Axy-K`4 zJpOWm8;ZZO;QVqs$zQJ--_jp&xffKmOWL)gZ#OD}8;V}$L#9{V&fG6S&+1zd+>rD> zVtT$G+e!EApr2zqgN+A?j~VCpU*8W`eaQ>%8LKbt>$#TbbyW4sO-yg7_ALvpTL0X+ zfzA$(zuYHGZz#J_5u85{aPKp&u^YwzGQAF~2lXfHfUjxa#(u{6esCsmJCNyqaCmOLd6unp-$-F@q_WH^-X_@af6M|eUd(y+_b#d_Dp9e`<@ouV0WB|kGf`Sl5Iu=;Ad#&%$OUo!n`tJ32}Ngs+%UT}l? z`NbjVXnQ6ahF8Cw;0EJM>6M2`FS#R^JD9$yyo!PwtRKWa%XFgsH`M%b|8Aw=2_+;;OU`@8)ClS_y>h$2o$!UYyvC@yBi%m2*dL z_!u1TaSeFb(G`e?$y}1=%k0VdUiIpcaq*4}-^!LjlmcTjY^CE*+dZ`x=R3vn(Z0ZA zZG2W-QE*XwjQ1JKFmC5h;(If_x3`M;zp6K!;Mm5)cl6;s=6`~e8~-xrJHWHYt$b{# z)oDd5ZMvp|Y*^gE7ypJhjo4|Gck%$HGtsmEZG7KD8(+^y*X>33iRHh-_`g`WO$`tC zVuSEFe1!`fw-5KiUzT!I9=We^zNbuX^Bsj^+|;st3t~IA7eWf7Y>;4Q?dvvTm-G#o0PHAgbI_ z2XnqXOb)n@EqIG^G`VXNc=)vaUztN0zl(=&4;~_XdpHgit7(_~VT^yqYbxLlJi~dV(i;~n#v@`A8zeE@cGcjqZoIP;jrIjiCU#7?w1kV0>e?iL+_LhrE(|vC$^#jnBX!W<2{pn8^{%=mwr-YjUC6kg)=U{d&1e6yk{AGxWFkKz!t z-+o)ejg@kX$20ERp54UtxOX|ic*yDly~1o9U7?%6FP=Wk;{3;%K42W+?iMCpmd@ZA zuikwpGTuLT-pc-HD^G)3X}hxBGhUd>_|JIsyLkTE#o4;}cF(SGKgVhpy{s>?Q>Bxn zJkPG;IDC`C;^BRLI3FtP$-CUl`S!AM7c@)>pK&#sf>BGlsoifEZ)N;09)1>&hqJ;p zu8>)L0CN_W@zJ>u^5RdXr0v#t8q=9-dV%v<=m$Dps6ONbx7f1_X*Ts~zJ@Z55~B6a zN;}hSF}mnqJi;x5VNYuL>C+kaf#K-~zG#t~l{!z*@{${Hm-Fv&g1J336&s=|Bd#01|(fKLDe;#=5 z7i#B=XEN^B)=uu8o=>}meV{iy*_H4>FY4+VM&;6X7U%Q(zq>b6?7QO9%Z7(bEdSrQ z86y9(;2!hz_oiMJ9KPQr0p8RbE_7_;;c0mY)=0|r^2185khVwPxm^DCCg0h3ue}@N z+W1u@ZIda7;tS_7KHC39dcgxSUq?poyN>RAES=BzNgjPYXXuvC)V<v{^&L5E?k`^xbd00nDO^{hqbtgz4RB^;ys`N6g?HgcnurR0T1LMYda>%;zHp^O^ zJ;ODo&f_vSGQP>^1`Fv?)60_1yGF=Q;(PoxJ#`c3pC09R6G4?T$?OHqAI-OTiEG`!4TYwT!6a90?P&M7;4lkw%2?_+xR7>?!>7hAtqK9jdF&cFYz zneWSJrVA3Jc(ZruTN&SGbTR*Q^8q?7iRtGgPS{)8p(ObGBoIsU+}l=!*9HW}!^cij z@xYT8JiMa66!hT_&WlD8Pge18kt79w5i)D_hrh`WyXg;ZD7|e3s}{08swJPIC@d|)VBzV!dl_U3VN7RCSgI8Pwl3@)G`>ImWi0)rqb zf=-ep2_b|bEFp$vGubSgWm%SCS(YVic1DPR$T4yo5r->AKp45?2sm=drH-h0;0H%k z1P>Sx6&3MURqv{PdMA1EEPh|V{bT!?r`}y%U0q#$KHb0_py|tZz@$iP|LuL|Bf$OE z*$MZnf5ZIdC;x_kzE0#{XGp-EY~s0-@=foB_&JwO@-TihdO_*$cJxkpGJ09*iyS>E zQ>K>RrqZR+A&lgM?-|jIm_6h(kmIk854Q`l|B&x-TGt--2L57)=XDLKP+~d8H}O&6 zHu3a51iO)A3ut18j|X!0liCM(|6HI!;0G~&8%(b7@VR~0mD}+@lLePyziU@=9|Qg` zP9C0jk&fa5J&AY0JmPQq%YGdAa2}e^wUN0zIUn2dSy9{vogHxh2*ZLr?}Kcy`}!xr zcf{$B$Ai>&$l`^ipW7d}r###!_cU5?nNI9&@yRRwD~`_d&zHG;o8A+%z~|piE;@fL7?tb{@cEpo_jcuzI2ibkxbY|T!!d)g zQ08VA%G%t*;Amm75T>zksr67yzRX+`MK(aW8o3bp)RfZ`FbG(>o-^ z4z{{*zNwxA|65$XsQ({K6`{J=m9+HNO7nrgz{x}3Pw<3J7B5Wh)DggSI2_ptEvK8E z7_OkWF%LJ)`fTwVO~nC z>wcMoqtlJ~KvxRHzxT`8HhlK8Se)f2*M<1ud=B>`9^iO=1u7kfTMXQ4rx%_NAit#L z?Cd=c+?Afb3+P7|_y7TFWw|+a{;skFc>i7|Tc2P@N@7Uo%J|p2fq!Iz9MbRa?~~l3 zNi}?BDey&4o*wi>dT{J~j~KSuQTkZmpJ_t^?0>Et59W&M>49fRr|}yc%tjCY5|2a= z9rj>g%s&$4Hj8wxJxn9-C2Y2%H(VfQ4~f%|e%SxzbrYSop@)lw!(BxTo$o5zl)B}& zyrNY<_c)%|$`Z z4Zfp4d1IBzyRU}n%Mt%l&(F0715#w|I2o@!`3+~z&OU3a5by8aIAOlXIY0QbWN3c! zHcHO)S-Tqe$&PpP*8pEuIdT31?YwI7pH0QR=5Sp9o)nAs*B6@Cg5NTS<9-kIVAL;K zea>G8obR6s-u@xWPhD|w`7wOqdhlKA(&znOQjrH`yg!H@fZ;Q%fuAh@y5eu~_}jQ& z_!kZrisiHPb?}cH|7X?!7dQSlzPWEqj&I_I$?@Gu^OL?2cj2~Dgc*}R=o50`g^GCmW zh&dbI%FV#N;_>arN@;&m`n~oKH57Nx1b&2|2FvGHxgGp^9FFT3Ssq3pZvSQK4&dVW)fE@V zFMB8W?eFQQAAXZB26Fi=eH*xbPd+~9j~qFDpE1kzW15QVTo*@Ogjvr2fXtvUyi|9eM_wc zza3rr7-?C%l2Q6cy>cn=J`b{+aruv>3p?}A_!jO1-xD3*7 z#QsRG6jmRy-vK{=-_KC;i>`nS*HqkZUAp1DbZqDC`o2*Ezb{R}3vO?77>DGrT_Bgd zoW;lmUDAl=c=CjPQdQupYWXNV3_d5h{wb}yVcm04aHUl5MVyhjnr`Az;HP>0;h9Kx zX7V9UVP^1*M4K7xg%GFh&xF!vwxpl?KKOb;9Ze6}25{l|S?x6c_f6(!%>%qlVX3@3R^>Cf)6XG(-IIHe&wVAo$o(<1r>5fm z;^Bs|058{iT0hnNLgTmKySKv^d(eU}_fq%m3jmMX= z_}j_T#j0jE{>Z!l{LCrf!}Wd+&KH;y%#&p11g9h9>uXJZORw~2#GmKn<8?s-@;%>( z*G0WiH-A-s3HWfI!s51$;2=t1qMc-$!1?!vbn`rBi=E_N*)Y!hcK%i1(oRlZ7rIc& zI`|+Z&vu}`gf(I1UV07j;@Y>w-+=SSsY85$CUwMo`=~4Kc~?G1we{$RhaPS;G=F9v zwSR!Gl^gXBr3j3kdL8r+qWGwO_R5pVpH=z^j?U|5G((`{1Jh4caTh!Na5+v#IbJ0C z>Eh2ito)6C?%zn??{AOcoZ2zJf0%d!xLrLvqr2l|&^RCW9?s|es>U~yzzpqbCpUlZ z)h+s5LRvEWYbfp*CpY<%;QJzQFW2Z6d&vgi>-R5ulRsDomzkn7#C|#PedR6uG8=7} z-kJiz1c1Pe>gz38V9-4=9{qUONFe=16+;W*N zT2971)Adu*?*hNO-TVO0XYM1)?~-|PSi0%2@gCsAaVz(uXq>C|VD+fhHD4UHCZou5|T;);EI#rQXh`;d`q-68i)HEhh)>)1`L5 zg>Ox9zj1cP{^&aRqa)VkTRi}L&vtw{f25BVzS#qT+r#nY^@ybK?LK&2zJ*T%|DfZ` z{obqB<@*`n!u?g;?v2A=V5_ijFuO=h1HSC|@;t`6^NwZ3{ng=kJoG4+b3cn~_F0|| zehZvGq4ZB>SZ}bqltwS6|9dCa&*njh7u8=$&jj6Xr^aMjX6!_E4px84ihGxnbCEn5 zy{h!B9Q{yvGJVvP?vJBU{9UUBvo>O|1{t6NCP0q5?PjUR| zcx99mEzgJLl$xXZbM{YL$SDq_NhHdLfG&p<(tGx&a-KF%V9IiqI~7Uh8-{Q;iaR2k zS`0#t%YV#B3?0WJ8UNC}|9|)&z=_ab;c)Q3(D@_oHPr9WRAgA%MZOn@_cM{J;ouSpf>&s{#(n=*=ta8LK9HVf zGY8{aQ+hbBL;Y6j-tn;TTM}Si4_+jZuzKEH2EP8iUc51$FC_aKfhW$j-Zj5U%w)c--p|LSRr7iKk!0EU zCQb(57dJNj(RU-*M>!K~j5C8@2&0+cJ2N-~KV{d=%;aO7*i61lO88oP-#iU`cl7u! z)Tj%C!6}x*b|jlfm4M&ZvzHO6#v^)*J9eFqU@p#HiY`Y^O}OtYa%X@~#^W<8d`7`% z6qjzgUtKK!sPGvjK66!`(n|1I;pQQ`+g@9Nq19_Eg3U$M^uRL})0iSgM&Wt*O_PM8 z5960O7yM3{$nQa*gN=>f%vOFEP2^|#EnNtHk2pWd^E!WJa3@bgX}80TZ*pG(eg~(Q z#ci{LJ0-Q*WQtY~tezJx27X(|pZiI&fX~JcQ4v{N$CblfrZ? z-{t#&_s zp=3{JPu0hP&pABzQW~ zZov7S?zS6>*z0;jF_4u^d2?6d>4O_nIzXG4Doxb=xn(L+DWZ+E&i5mp_ zxZB~=b`!Ty7&W`%U}@e0THO$3L$KUKER=2ma)NO@6M* zkx6bUIl9Kf)8~0_mqh5{Oncx@U&%oi(J&KbYkfhTabjrsYD@*c0gvC4V;EdeD31F{ zx)fG&_2igzex4kYo)(dBU%4&8cg3crFP@+H6m>Ejxd*J`% z`N~iYF}0#DtjQ_$)4PuvYmfoy-Du{ z-1ANj_6rZWdSiM>Wq{k;^<%gmc8DD;k{x7VVEEjA!2i;vPxCH1Z!X_`shydh%X|X( zt#u&9_42iGtq=5YyjVRwH0|NX+i)SgHqOJ6Q2*J(z~}QWKlEK8w+reAOh0wS{nFv6 zePXZKf~)2x$1i)h<~N34dOmRBzI2{B>)Was1LtC&#a>xVZV(bPxFb$mN6QU!}e2Zzn4=`4Yzh=dZi^-#Hqts<_J> zKi-Eg9f^^}{(kS?$?;1p1Mcz({D#;-Ch)5$?pBB6_4cx>k7hslKJYujv!9-%4B%zC zOslUOKh=%{K8|mxAGp_C`kZg+EJ={n_ok=P@ss159e8VevnK%mbtebuL9$nnafYSe zRGfbgUk}Q?hqUX~yPJdH_qfMTHkQx`hrA*Wr+E0{=KpFZ0)MdU$F`F_(d-R>E+8|C z{o>C0`EEykM@B}$(dGwJLx{hZ7rzhtsrt}c>N}QWNE^t(4Ec4mwa3|E#9!;mm&YC7 zV~}kV!DK0o+YtT>2W z27|Pi!+RO2*FwRervLhBh&Sf+%I)Bib=sNSa^SA;aKrfiiifjqUs5v$*RJu)r-R>A zmrvSn33+A0a8TFe25I$!B>wNvJH()6m^BE6_}jJnbd-!^`<#I$m4D&1da9%due z{)5HKZKrzBblb+Uqs;gel!^GlySbK`IL=DUEu z*7aBEJC9=UJLxym18)JMVsZQ{I|KiAPo6%sD}8XYIJd|2SK9^nr@ed*pg%Ogy(hy} z-Va>3|Af|6Y1pO3<@DB6T)3Z>`-L=br9k7C-xd5iUAo*an6?hC7K5|+=?{QkxQ~#^ zOTM>}(_*RAmP*-C+v=Y22GeMGmJXF7r;B2(91QqKhF(>AWPOc^-&Fdx zE`97TIzWG?c87dhdgHruiou|G6?zy5SXK1!u-N!H#o|P}P49#F{`jpIYYe^8ko8go zs?*kE;PZFo%kwmDKR((7Y6ipo$@v+;w|n(c?i=T|rz#8EdmM{u z^`qJj{DqD`*AHnUhq;+CT=pQ~CazyoqfJ)MILmiKal@`Xqy3%9n;6%D@8ddfYGX%I zs))U$dLgE0>E&m)=3{YNmhWAh)|Tb;Oh46wf$MSk<@JJK2eF5>MTSbw44*y(_`iAh zN>LAXsH_KnDDc1c@HA_OwYFd9jiL3%Kj@61x* z#&qKh`@7nBuxcZggdQ#vhgTc7ie>q!o`iV&PC-UF-s|IyoFnQTQCQKbOue5k=6$jrw4BC|G*s72p%v zH;of`VLc1J<}Y&Nz-{j8Kkq|6my;P{4`$_W_wSIFtDK`N}*7{D8`X{jrBITF#X;d#EUG zu~)9;@!(e?9z8s;DMz7)i;;lYf8rP5-`YQQ`cnFfuDKX8R z&9}>CoOV9>LkZ;bGq;Z@^(^r3boo0-6E`NNk3(7Fh-vfy^5BXQ01O94<=lPdgIA>k_Il01}UFLrW z{G*=yy_h!cC7O-)X@S)5pQQh|VVv1j>QBIJ@AzTAyOmQ$>5qB! zkj^QuOF_}YlTvF!y(eA)zwmx&p2wATpr8BUnr&wX*;j$zZ3+ZnzfJwv?}}Sq%LixA zq2CJ~zVLV8k8$P7{YM#N>QoVL{s_+vss97`{U-A77x^in^Yj6|a+>(L6*5}>Q*R*t zn_f9~1baz!?cjCs7CTM-7x-`=2g@f@eS_2t@~p)K`Em)gup4>$y^Dr(A{IS#*~3Qm zz%xqW`J(xa5dR@h9|O?$04a~R1zsvaxA&jM?N$zEf0?P^^Nh0to{y1MVZwcUsZD@8 z$Kj5kBxqc(70UTJ#cl2N(-!GIs6|lrA~c+fSUYYXOm%bczi~o-$ahdqPM813$$zd& zoCmYx{FaEfos+9Wo-BVQrQplqleqQ-@B%ff#bR>U?;6(&utQfPe z`fiB#JC_d6bBTY{^;J~Vht>2ziQTUGtL%q(Grak)N)fhKDT@9on1!devW<^sH?9z7^x_m&W~C@@q*9dm zM0zWO&2=J+mv(QJGy2iQ66Yehqylub-ET@68Z!MfKMlDb_w>^p>?wkE^E|pL)bO<| z@cuboy}|nh-%D<`RsWgk!29>-^~(Mkn(?A+8{X=FZ3ggJPo5q*KNuEaxWqxg9XbKG zJIOH-mzy~`TxAw;|91Au_V^29=loM;_9Sr!1Lv*pXm6d=K<&Yzg|8ev_-!3VZfz5e%;A8*TH3T z!1><;_DDUOSRRGLCx@%d2QKHOn-{yB$gg<>aN#+svY%%iJ187EIexVT8|G*AAiEH_ zV?FtLI6Pqf8_Hg-{5jwkZd^hJG)GG z0YB#Km%by$`7ooO^}fTcC~mrsqe1vg{cU#HRGi-q>xs%_M&W(R`Nc^0Bc2`xvCnkS zA8(ZN!1?{+0bO*Ifk|unOMrjS$;tc5zRCF?;x#Cfv(^n7#aHe5?Jy4|#m$-bfvo8Q;wDz`e(lw;=6Jfxlv;(HVTb@y!hYKiBa+ zv`x!@9=|fa6~%?$U$6gMal>a%0N*&g$Cg`e#-hAr9trRbn+%;!P(Mn zDE-Th&T<|r<;vX+JOAA9r4zw#viNl2t>J5L5uZN^{MS19xxY#Sa2m0R{Cb|7=`B43 ze8a;Jd-pL|J`*PccY)`Z76miJ-WDx!=H}{K`4r$|_e+fcSNGEIM|Vi}OIf)!71ug% zWc1Xj;IoV4(=AU%&ni7Cem;g?ilJ9x=(QMnBZi(BMgF4XPb)p+@_*ul{O6P&u4@cW zpqG^%rN3GXy{Ysl`BJAr{?_>!E1!(gqteeS{gW<#qZ8z>#Lyc`pXTBxv;64NUk>@A z=q05`$ybe`HAktN0m=KhTe>!r#^@L zNAb@nJ<9*(lpZC2DJFg;hF*)IH)80CGh)g&hMtX~=an8+zspLGs^4{`N9iwdCghKz zXOtdUK1z=&-$D%kN({XoLr<)X(SHm*8$-{>&`U~>(qC2SQTnOJ(3>&z)aTb#8;6{SbX zSC645&fTzn(lPXG3_Tx1FDX4r{;JZW%BLPfZ^qD5Uqt>}`I{feD7_4Kq5gu_iCX4$ zYl;Imtji5x`|JR1;&J;b>gR1(-%X`Q=_7sqhT~^r==m6WDTZE&q1R&QjTn030^~2s zUu2XXzL5 zeB~H=P3ckkX~fVIU)r$!reo+?rANtMPswzE7AB~v!iAy%jKOIBQ#?bRI^imAH5<{;kJ<4A+l^*3UGM6I%QTofr(924X zst;AAN7-XNhJWHR$QR`=vN80M(xd!AJ%*mXe8c+5#n4MikJ3*ihF*)IH)80CD>f{D zM(I)IlZ&AjV(8@vy7`N$(&PL^_RGiz{zvGcE=vk#l$zM=< zRQZ%+=+zi{J%VojqN(&ae^L4-^nm}-{-S*IhV@lddXzpIG4T_(Y?yyKhMtX~=VR!l z7FMzi28w%3oxv$bXdn@-g(X(xd7_Rq0XoSdZbK_!i`g@)y|{dP(U~{-7R1 zPv5#>{p4ckC8bB{rxHW2#n2lu^u%o&mOrEPsPf6h&6eurRsZTS^wgb@FRK3K zW9U_-N6FWSp{KsRVf|!c=(!krA%&z)ZH=V8$-{<&K@1+Mb9cdvV4>tRsN+I z{#B(%)$e8uJ##PQkE-9L7zL5eo9J@lD`@gzaB$x#?VvuBmYtIWn$>L7n!mNypH$G4y;4y`=Og{Zy15C4W68elv!idJy@KNO9V_&1dvRev)NL;fgwLFrNTyB0%F zJ+fi_WMk+BrAO(f97C_h(CaburqZM8NBVonUsU;IW9a!9dMSc#^Jx{ON9{Lu^RACV z&I8>(!!da>J~^eA9i7kdSa%;{LveBEs@EPvdQs=9+xLux$ANqI+mJAy%h{8>lE0Je z;p0Sg8)W!B;}gKg$(eo!Xd%(Z;KK+AXI%{us>>E*wG^E(PSo?A}Uci$VA zo&x@84{!H*^Re)JJRaxIP8Xf&b~IVSaBd2G7xl{L|X#Art7srF7B^#kBIy{0{LRb@J1>C;^`X!3SxH zzPb+fg{1-g=hxi;YH4Kxdthhs`nml~Y`C}sf0zJlbK{Bhk2){>f{001r9{&M8 zU{JruHa+HF04nc5XcN73 z(&q!Be2QZD#9x75~e^P zk0X?;d%g0jzHJLh@iH&n&L9Ul-DyIhoVnnw;hR%{|BK4a{-8HGorUS;sgR}CgDQ-KLKHoPgdRR`!w$Lena_p}@%Xw1EDWCKn94x)Y z7LY6aexLI}-=VkcFE4Eg+-#Q~={@)Wl`DY8uf7#t3jEJJd;#bC6@u9ze=DEH2Y{dJ&im@7<_rh^Q?rKCKI!3`)V^_2mXFLHh_}+q zcQ?Mz=nlpy-)hg6PAvocS6n;6=TGvbn{;BP+%rev5~r?2kLo?Y58~bBQsKIx#0H)tr*Pj`4w^z;xv9(Dvasj?2S1-J?t+W>ESQ- z=3Ua7)0>&}&|1#NgZ~<*PqzDy2-mLQC<+nb0F|eD0`Mm|JfGJy%xN#s>%tbGEnI-h zp%&1o9mK-QFI_P$xiERw&oFMWX}RAjbuRcuog-s%Ru%ULr%&$Zf0r2#uy;0G z<%{6A*25L}{+<@S=g$MK&6Be~`HI6?eoE&9H{jt0aB0r~ZrQ~JUzUFJ0^s{Se2+LF z2w;5kW#E>1xS`+x(mQoLxMQsH8@~P};P>#(v7-S;QmP6)ys0kN@QGExhv%2`d6aS@ zVLn(yU~)UtJ-sEq3Ve7^6`zAd=hwIBt)jS-oqqZLHENl%cwu@-Uj=@}YzcDkez*0rPh zw}AK0CmWN46UV6YI?J`A*;|48veVaw&wXkr{ss>}m^@h&hI5t<7mDSxd>i;*>fwj@ zek!V7f*(Q;ekY}8ZU=s6hhHL3W-ocA|Jc#FU-m6mzJ|-*0X_wX<9ty|t#)PURTa0n z!=XHlUQ_xmj@~U#mQGXYuQ@v3NBh(|@-**+JSRCE%R_z67CSF|8@M=rg}Z=T?(r+| zfwV38Ybq{E{`B3GOD}!ThSM{BR1_B{f92lE@k_4-?o=0;2cPpDj?Yo1ss;0L=PNZ77p4EycfjXY zjt`H&?{R!guBPIm?8oX`p$2|iO#wspD{FAf_cVH-3V;^P?7Q?3@Hh>g$I;0J9MjTm zDE+TaKJIt@z{%IH?;8(;&oiz+zPN2}&@PT?F8a%JX*Ow_NDHDb_|Sf=EuNa@Az`NbEeai;Tnqj)&$&z>)hQrFG>xAbS{ALPu|)$i;dfX}=9Q+=S}5lw7SwV9b% zsqZU_+w~oI!G7hJD=+|~P-6UYh2Bm=4?mL>>EUJR855+*Oz8!V@}`IP(vV)>+-BHK zq?!}y7JZXkYZ6=j>Tg2cmtFp-y_I>hY1HmgKbZouR_E_)i7f@Woy%W`JeeIglzxk& z^L+0tBVtmhfTJQ^Le5~-0|3<(+u_*-Ma(!+*SR$oH4+m0* zl;arx{MNvCdGgq}^0%zDVXV2B-fAh}vtB+&j}7x_xWqQV{mkKxqH+2it{z(Y4aJ@9 z`Q`aRRt#r8HTRZ3<6GDkeB;)|(%S*Ik(aOD!Dz0^X z+S1MJ2tHx^#rG3`ky9L@bCl^nOPO%@_%;<^_13wrD<*%&(CdmpN(zo1^7^n`i_p@m zq>W0lG_eh*X-!#Bs!KM0pnlZ6Y<^z zd*MIGmz&Tyn}+3X99iBAxVJn0JpQ2epZs93k7T=>Yoy6j-5dBT9iHzwyk11$Th&Pt zy_B+J9!q5La{D4)IQ}HRf@{kbLac>4o4QcqSw1o!M?8OhX#@+cBb;T!r9S~&*w5tg z?V~JEp2y8*pXpBm_aUd3W%6{1{>~}=z|HW2{n%Skl|o zcpH3P^hPiKs4sY3hT}=6^&;GIcTq7|uCId!^?~|l!k%h^IwH$oc?RST&xvnu8wj?Q zcmq^r3|DOjE*#gj(>di-mub91?ON7wnS+1}_sLAWug~g3L2>(g<-Gvse=pGc02i=+ zt(>c~z&D&Hr}N^IKjQQkacj)MPb83H4(($O;`w&904HZJ2)-cMT)^3A_0P?@h9>C~)8Oa09pjVt|`9%Wr-ja6k8O);>vf8>VKMgfM*eFyOED#w`nj z4@=i%A>X&yQjX2}z{izissp(9I{(b&jrCs!yYS5pK?*ZqXX;AE6j9P6Yle&u;QMZ=Gj@(fpVkl>+eoxT!xGj+=~c{v_aLdVFR6gY8kv zkXakPIt0AGZr_7>-X7_P^q|t49F3EK|Gdh__B+VsuH!QE^MzsM>u?kOd`0OeZwdhW z`D@hAQ%J6I8vm9K+%>o{=9;3EBE6OF6y1i4MKF3H6TbA~ZBmNYz|UV(6!W6j^YwLb znLZ3Ed&;3I+Vqhghup6@xp_QZLOITsfZeV0_vs?=r#k!*Z8}d&?rN69Rbp^1{Sx@y z<@g=dR=~Zn1^?b4S00MbI6S3KvqUxyFthGiGM=s|?gS5~`5`Y7<|lOq z`1$?fg7~|F+yd+Jb0%=%y-wt3f})gzESzXMCTD#m@OyanTS)$s6<^?mLF1b^3%CjG zj`R*ja6A17?AGu##XsTk?GG*&Ir1z>m%STh`PdGicQ#n%q zK8qLThihLzIxXs)w`V!bQM8Jwe{vodS(-?qc9xb?pnUhkiq(>7sEm zt@BC&Is9e7`}=N2PLix+_EF2z=~wZO_;QH59pTjsx4)xyIrtv$aP4hlQvJsSJ%(n= z`NPZ=Zw+5j{8e6i^GCWpbYm8s9-bu&V;5uj%w7%t15PiC+vWv3iC*SW!)bos@YQR9 zU+UrK2EP@%oy+SXT7RwomtGD0a!;Ocms&7uD$7ML?$M-7pOu>tZ}Y97D7K@UN&GD} z1t-s1;7;}WC7r<_%`!}D>%{$+{Rvhdy>Cfx14?f+;66Ya?rT7TNGL0d43+YjyVNcepAmP z-YZkXc(0BJeNwKk%EiQ@Qu7a~=YgN$(plU#GuU4G$1}0+KaCbmcAggYGSI(siBJsf30vybSz^ho^k)qT_LA;f8O%2K+xg{O!fye!<^fbRBpr zzvjPyf1A@U@AEr|bFf@`!aONL&(eWde!RQ)FYyNAh4(>rx2?7dsaF@1mvF4r#U2E* z`)75L9B`|BCK8yjY4h}d9^IcV^3ub`E%iM;75ICcyu2T7RP3`y#_Rllj?;Hz6X37& z%4>RXtf-qe9<|C--V*q*AIbBD2Mhm&M}+vDU@nRD*1&&Mf47ZeMas$}uk;D+D&|v1 zMBI_-!qo8T6!;Bz`RnC`}6kw>scSkYzN$>E`8olv`o_Hg0Otm6}O{Hzq^g>@=;Oj z?V)8DzWEOD_3z8-4|W!KznD|Ml!oC8I{^QhvwPZ?7HlPEG(CB*^A|3E?*;x4PtQZV z|B}|>mwS4vrGfMN6T=v14YQiHxp4MYdmr#GI(_i{Q^zyk;pEZl;;TCY@8@$Q*jn;A z;`wLuKbiLf-{G}KXBC4#Nd$VBBbI$uG5Kvyl3wr?)MVtQr}9S-f5hwG5Net<2=p+O z;&Yx1pV|lb12;v6xE-sF2aQdbeQn&eIHuR!0l=T*)wkI}mvT)c=Bi#AS>S%@<>R&S zV7ACX59mqK!#nKFNs>i+^DccLBMa|0uN@42XH0Bw&!zTu8a2Fplc`j7^Lx34!0+VR zA09u8m$PAX@Q5TdTc&9&e}$tFZ(@C;jvduEp5-!JsuQ>)ogL738#M7q(^gdBXFB~B z6zAUye%%2YY zJiuk%X_Pw3t>sWv+-E1~VXt-ckXiwLr+BzUvfWk8*3B!H$ALR%Gn13X(|NY5fnaN? zlmo$jq!q*p@3l&Q0r7Tm@^;IUwPU#mx|LH&>0v*C=hc60#p(1|J{Rdc?$Y6P09g;= z^}{)B{iqSfH~&T8tVGEC&#x?25z!^OJ4%M?DV_-@8nV!0ry>p<9U}ai=oW) z^wm(@n8R`ZPX?6Bsez@Q9|m-$ul&W}>#xTx#{`lf&A%ot0nY!vVMyHT5VeB*5zE;U z*o=|!PhX07{=K?|_1vqQz6?0u4-aF$bvQ@)dr0$BQ(V{9c)@<)_3`9aIB^Okixf&H z_w{jg`Sjv`1<2G`2*4HR^jmsZUU;J7?LE09PC$F61bkKjbq#-}A^8jeJ|HGaF;3A3 zH2!AS>D9>ZUz}aDKixsF3;Dwht?;JD)EeLmu3Xtp!ig-yl@#|0hokZ*nX>xZa5crf z=y2Sx5iJe#1fI!R{RYzY?QRGYwnO}3iB>D;&q_A{zn{w&?Vpu-#zARRZH6UK>&R=&K z#`@wg%V>JY-U8eiu7APbGcA(x>J50k69r~`>$d{GlarJ8mHoq|Z+^OY8*m?Va`wuT zrJKGTbU(i%$!j>j^4X=DN!Xvb19*R)XcS)njk10Y&~)mG`?u>i^1Q${lAi@wms}9s zB+c;xxs+ZLa`D$9o&BbOA=WEs_Kepn&XgcHU!u>(0tv6c5D(K&>br=K|5#rh#A?GJ z5917%egKH?JN?jjNb1-K?|z$OxTfMxaX79YG;-Gl+;D{l!S5muH^dUEUCh<@sfU0& zYE!&mKXX$t_=IGM9*z@D(F4{}>EZ20!e*44ioA=^>AUcK@C)lZuP1e|qVkx)b6@Mw zY%9H7AnJ1MRsM&F-|6+2I)kr>6rI?n#PdqdUTZ%B{(29;FnCJv3zKJX5({~(!@lGNZ|E31|w2ejFwLXS?#MO+mbOIe)?TlD{O$ zElR$~=tVrfu>3Tp0{IzI)QMil~cy&dv zRlME9~LV7JH$+Stb2#iuD`G2|e(DMv}rVH%dWjCxyRc znLAY8{2q|^WtTs;f9aRxgI$D2K1mB0TpdKc?$_VsCACRJq6u%cy8-2!+Z%kJ*(}rp z&8K1Ii}tnrp5xIAo_CT5O#Kk$b$x-oHuORo5rQ6I(9hC?Cg;jEa{$uw+qYg>*XhOX zm|kw@=eYK;a3JtMclEHH`p?v|(EhvReG=&BUHwV+N#>_=S;V_i^NH_&Wujy`ucfu? z`=;W)?%El?|D5JUxl6W60vglP57F(AFc>1=LT?UZ7M5ORI?}sb`Qo0r9tIAxKQ=qf z&H!${t4G~!cNUX3Gw{x0a4Ok{sLbk5Wj62!O#x%xN7Nm>Pwc5X=oeM<1|Hts*hO*8 zA2sJ9-YOT5>(9x8Ulg2(5a%x}O1>7Blhu#%;fVkImX>aJ8x6mCJLxojXx9f^DNipJ zi%9fqZ>UWQh(|UpqijEvxe$yuc|9&Sge`obgPHvEw z?K!wm0vTQml7AHjoob)ClMp}UmG4!>q{vOndT$eX>4CS>^SWN}WASAKkv=ZH*iv*# z4@3GO_Sd8Q^W)%O+BUSGJI8~U#sAU6UQoz*&?|iD&3}arJse~Y&lu)tdpL|p(1Yo% zaS_tl#OaOqt3Am=cLWXL)WKfQ@Xbqs_s{F-=J`;rKr37~#@R*ga^U@TXnyd#FrJ^h ziQ~fUWItw&L43^E@p5{Jp>*6{bJo`=6T9Uv_lfPa^%u0{a}(cXciJJnC>P=N+8x z@8bQR;LdXLb+_G93=R>mdr!FjY57h)0sOGj zKacyVr`bN|CxegDU!3kQ>mhSDyp>Dk zpTH-b{qlE!jdjYq`Y+&4^l&}Fo}!!{>b)A@m0B+8H-PW-+UcK<2Y(X3{qu2b-TwLb zQqBAT$# zhV~_ABUmXxu#u$D$D>EejFm&G4e`&>i6FMei;5y1Z^V8-$EAnctthMHt=w_W#SzS(cRtN(8^Owr;hTytdHhGPV|N1H^iuc? z`1|V->svQSXMu}5U(V#nP6Pf1CkMAzgDm&(eEE+~k;&0iygv^*oV;C-)E>I|uG9?h z4ZmZd_K2pjvYL*ipHtkPQ$Ub;y5Mdx_u0WAWQ(X#hA+(m-#47Ryf1GVr(fXyB?V$o zX1Ar;z=!>K_Tvi~*vaEE4k{ANm89C0Z*>mhJ?X9I(N0vcH;)4h)7ml0_D(gB`Uf!1P}_8vG{i?~rlZ zg#G&2PT+id8Ns-F0P z9bejiulF}|f5iAUmjd@Y&!6V;T}z(bulZ9e&&IL9Kj^h{w-)h1IvrDVo)`{2+(&|O zT+>_i1jNfa|Hu3GwkJ3oi<9R>;C9~(g0r8yq!`?}DQo1CBKt}a=>W}FdO7e5H#I!% z&w@vtnfw|@ni(t;p=JiplFPRI3~2n)nTY>A7r&d^XEH`^pMw$c^7P_iyr7|$wA<1F zqSrsy-<=w2JcE${nxN?+cRtd4kJC4w14I=;{j24xZ~<^9yYU8ne;sTiR-VHIdJbz$ zIZW#1Xm}%CjPDZPkasdM_qmA^8`+k@}C>5mUwgVoy^>0 zDZ1siejVa{$o1EFU(}0I1J<|yEwKjpExh{t=6G;EZI_tV_U1TGYKds3pVTeD@8$GE zc2ibOGx~03D^VQvwuiWDs&R1UPH+k~*@;JFAU#Ta+=lKb^`$U!8 z)3bafo&@gWUVGW8`_?Ehj6|+vPyy`z(f4+>~h@m%? z-sbW%U!E*}s=j{yR?caq`|GWJ-g>LyYKjY7xwX^C=^vc2KAsCRT>VE#??ETeQEj73 z88*uP-hJm;c?!5io?n=stTAxD&eYGBl^!)9^FxWJ5%1%gAoox1TA{=B75b&;T`Ph+ z-v>RLT-kpi-o;KX_nnh`R%ZHYC~g;ro7gU<{tZ4+`=^XgRdKEJY9>$WjY;xR+<{J> zF?ljRO{M$#9_H297Q3(g2kAZM_;7u`hxIMzW1HPq-vn;5=W*r!3;Yd^FMm%bWAZ_& zPjlJ^F}^kai3D~ih3yTGLzl1|6UL#Izl!2dbo}Z27mQ!Vn6u$hZv)@3-@rH-e~xu{ zxRT;RKf$;!ar$FNdbmsy{QUmK7#!~yTZE8m_-a{9_`0$iNFDw_fq zr?153z(wgR6G1n7%q#uJqGjxJvG27{W2vRi}yWaY0bK3p&0 zeLm6v@K|NeI{8h3|77v0ZGfMw{;P_gto+%xga2gp-%$Ky^Kf8JSLao=`+l*YTnip*F~ z(;t=@S?dRs-wD3cT>p&stE}b-c|9IF?;TI%{B>hT#DiDm`p))G(+0C3V7tnhdlzsI zPr(c6XB4sF^)B9pB-0Z|%iw_KA*3&USCQI1?XOt=(`oRT;qp)VqK;5jf16(~C~ilG z`>Z^<{3`uIZ~V2o7<^j!2Q9)^@}<6Cx64}eoT(`4kcZ?*%UcIC(4SNu|j=~Lh+;d@G6z??2#mlJgl@Nb*KVjc@qc zq2RlY!+7`}cO@Q*mTxjg^O{5xs4Bu|5{i-p737!OcBl_P-v_Efy!`TqN<`bt%xhexG^w3;TC&yhGX#&q1gtZkgl9?RDr6jbG{*@C(b4*KKL% zzv{#MSV?h~-?s77g|q3aru4&H{=3`GEe4OveAl@}?%7L*4WBv|>HgT$Z;zh8&_m;J znm(a!MR-nBvlsZ=oZa(xvSM)LCAZy(W2`RPELCWK)d9r2c1l<-?ZHxUukF%LM>&{W z`ICV6?R5y(1`P4Epbo#BJ(Y%l57*y#+(GjbH16OYpz%$g3|weWw7zpJ!wSJiVO2|6 zLc>>wfuHO2!}}LyT;4Ae4*eaHp?3LC|3-kXdGlVh5BNMzf%XAo+KV1mOU~(mKOtih z+`3D*HU>U_cj@wX!IulTCseQd{;)O<{3F{z5cXfcqD@(n%&*2}MwotQWSxN?ZjzFs zhaIG5{AyhHG+VyQmw?~pE`6^5OCI9TwFjB6Al{F?`aqM7CCLaqydrv7 z%N9JbUR;ZK;k`rL-mKvi`edt{D!|fdTo3$tPG7vvCF6t<48KQ^yAi&0Cj6ee@O8xV z&r$E^o%7UENq+hliDc#{s%wD9*XkHgb@Q5@RtUq@z5$&79hTgm(Sobr0NkM3FZyfb zSk>>CJ!EeL&cC^8563q&|Az^2{t(yg*D5^(+_kP;`TQ+e0gw|Mtz0t?1NU@b`rz+iu-d$Uzpra4 z*VJRc@8I;n>B~o8qss{G_&yF?&BOJc%314`uTO1e-SEvPfd8YDm-gwQ0$?9(KedG< zi{Tqj0)K%g_d?;nF!-~$w1vqm#jtWO)Pdj2_aAT=7@ha(X6)XH=~SLVyfeIhA$jd5 zrC&&n{R^rglPmKK@P~NmbgPr?25ZTom1pVyfPdD@_aHCT!>n9>^Uneo&aZNPqK+oj zC-E};1x7a1PvY0WPgXzW=YapG(Hd z4#PK?eoB8(xg4JQLyA9$bEA0c-=tmu{&>%S-&B->ref$3?@h(UuWVN~&B|hO;JT{x!rq$g9V6zQfa!;O#}{@eE)67x2eA{Zao{ z(&^L_kvnA!Vdb8F6Zro)J#c?q)=3Jyu+^^b)BgqTj7?4cZaP<07}Ke$cS{cF;d9ch zrGr;L$BLkk+=&#GrB~hL?NSr}?b2(fdE^%uJ;*D$JL&uCrog2g4m0e=r>^u4N9Xwo z>VjwS!f=_*z-KS7{`V!H=k)q~Kat-YxbJzmf#51B5uAwE!govH-{;}`@GXms11+^Q6B_54_Qm6>0eL4#1z_mGksqPbmj~{n_j< z@owPPc>QHE+#4kVJzznUEce?;$KjCdC!`_z8&KD8yRzX|(mvbz8mw_aUPTsXeq z{;@0&Pgt*RDDEMbE|>4koUW`_JNe!}N%?l&uzaT1g5uuc%9Z82meU>MVIc*bERv;P z{s8#K$(jEkaL2m*upZ~Q{*CdgEAD&`H@Ker9`YXozik|jSMkI8Q&Rf79bLqB^{WyS zzozu$`LgmB{jM@0> z%j8My@z&(2D1Nf?%_O~t+DaNOUci6~xhK3f|ZqM3f1dn4V&o_)wX7tg$%!qNKq>xMZd zXKo+hcXs@j$di*(={Gw%r!Nyfqo+~wmTqQW@cE4EcTxMRSN3)C%r?zHQSz>TT-XnI znIt3L@UOH{OvgQzep7Kja_RGTD-ScjA!g3@1bBxQE@vSJ%-{)!d z7}c4%hJGjiY4E+z$sMfaN8^{yg1)b({{=dZTd=-!Xr}`oo{PM=ZI0fzI|oA^$$|N+ z+6>^oaTtX;$OZQUhupMb^k781EBukcZCl<{8busqWldMTqR1s|Ds4fW0n}VE8oHb@ZEcg z@#XK{q+h4U#^YnNj^JrYq66RfbWk5zOvLnFT?9S{x^i*z|M-ed?*TM?^Jw7rTn}D) zpDp#$oULabhvdw{<{^~v>D&!Oc#eRHnV_vvGSJ4hQ;F2A$JgK?3E9%ktSj$)=4 zH;6&d!wUvEOp2D?Y-A7bGt%en;c9!pI?-9<*osWyD9e73kncXv zzUUk5pGZ>l@Tzp|>ESU-flA)=l{pLXmUw<4PxEZNJhuf!79$}Yn7%4s06uD+&~OdK z-R|_t_bi>kjEAU~@BDVN&*)t(*Du;c+|MB|n7B!Abr&wQMmr3=9~ zu0LBk#i_PH)t|F1TjGm2c{L;QalG zgF1d0l#wJDnEZv+!2iwVliNRh+S`fi5jv^WcJde20AKaS)pS_TU1I&Ok7MSNUYtbs z=gXh2B3{wS&+SW(YhNs%6~zsExB>4wG_#ZRx4`d}JppVRA8mVSFlZAw=;8GbvqI_N z8hS&582@ww@lN#k5Av*9OZ#0`oZo-w^UlLEe%arEpZPQPC!^96LIS4evf}*t*BIYzJ!spp5XmkG-`_Y&}NYr-b-OK$~S*pKG#EpD-7T|N?91NZa8Eiy~Lwg>o~@69VyE5H9HjIR`357^2hw;%8y zb9&+R^?x(Elc$x9Z~5cEeb3|j#(2;veBT(SoiWIm;qzJGH}?F^B0aBQ5zoJ<9t=-~ zFB1I6$-(X9k(4_=7~xEZH@OS#!1p@4B)`hz#}+@`P+a!}9C;?iS$mN?2>jmk=4Jmr z9^4|$Ej?@@lKg$VwO;1tt}Dlg>?#^Lo)a;7Yl>Us$uV4XVmMs-&<*o5dCQ8Mth}b@ zatHYT!0DOSU(b=;Euv|EEfyyaotGs@|NCP3zzx;V;pn4&!5!i9$Lk2xuw?PV(yuFS z7jN8jSuuE6x})pa50f|seCKTnKI~WDSP{GlyIZl;BsTuJUf{!XM7f_yqZ{g%Ntbyj zc^5keE0^jr;Q!?8RK6#&x4HaMJ;Qotm#$WJaW~N9 zOrHe&#QjCG?BCD++W6KK=YL;r`*EdL+;VSx=49}_(CO(2YF8-b7Q3n`&Yw>h=7Ulc zXX%%Q!LQHdpT85s@X)?V;iL@TJO%j4&L5UXfcMv<`fwi>uMf;=>%)Ai@h_eF*7&DK z-x~kaX~0i*ezL0g8$5llZ@<5ldwx0i`~BPXeYc%D9XNkKz=qCyO^*S8tCNH0CClrS zXG3xCaCXY=65*&_3Ob!xyZV$Uf^XdXWkqo-T>8l|el)+DE`iVXE?qv?<$dBG`?0#- zFCWBceA8F<48$98e0iT0jqF<5qnhHP`f>9dgT#PXK;s0rsNSiNZ|zT20B z+yV{1xzWa^E20@bclKN3pE?KlKREu}pIyTVOgMMh_$R&qeB3^3(_=;PTX^~z#Ai+u z&ReaX3%>Vxaujgxu=Ini+zMX=PNxHCJ{jvmmR?!uQS4A2P5wF|ZL!7nOZ(_iKS;Qrw16VD&aq~?{kZjv2nhr`lOe`&*f4Odp& z*Ia&hUlet3X&sYim|gl8f#0oOe)9VLaGp2tXneyrF9!ZJ4`0xg`~rU;-_kx6E(N|a zL5@L@gY*@iD{&ccUvRi^Uhz=ES^5>lt?~5L9xM=jwfC(nZ|=+B`<)5+6C&}cD}jG{ z0)FK>c++$9D&WOQlI;F`=nSfmhAVsxxRbs7jmm=GC~Z5K>HKt4aeh0R=liKz^xCL^ z-%5|4&BJmj{8#@{+hE0Tw&H9Z+WJd2@2g}NSp4)(I4KFcArc8Y&*8l~4)~CUE}}lP z#y?N>`IOFA{7u6hCmDb06fj<^;deERi=TQwI==T~ z{Qj$ajo)6%uUkX={ymQW*~;e?4JRAF@G0bf6P3^QwLPrA|D<73`KC0ClBawi_#LZ& zA&o!Q!apwl%82-7<#XdC`Q>In9-Bw}yUJfw{hl9Jej5L;D$l7c@$LMwsQg&^?^JpB z(fD&U{9pO?DnBb1%TJs<+1b#?E-J9~udV;~{nm`=Z}T^`!w}!TzqWIw7i<07LF-*w z!@V^e)v%~xYcj3;Q(FI9`Ij{vqHD6_o|A2e69R8kKvc^Dxd5m`Msd|xLF7Kw`q8X4g6a&*s34H zo&IhBOB$Y`VN3KxYy3}a3dDQVo_Eu5JJnlU{O*l_Xf5x7P4IqHLrcfX|J^bAsck(~ zJba%DV1D7>`ujQc|JIM+D#riUw*kN7H2!58{zk)>G_?84xGxqAHdP%>FI@ zg<77kYxstSn<$^(YiN8OBYiM_nNH;AW_|w&&Cjc*hZuXa`1>pVE)8v5?)bC_VCh$u zBK=P)-M%|srhHB@IU?exk45|klzxNaKih^EOEi33!yjqb!p`}Brv9X&a+q9k`MF)=e^CA8G!6e(e#fgE%hj)~P7}O3l|Q4PVkQj^C3J{O;9! zKcivsf8@VR^>wA@`vm1PqT$sV-l<`fyormE|J4e(UBimj`$N=ja~f`{^&yVm&lF(( z^j@u(yT|yG^yQG}?;79Y{h!9aGA4fIM#SGu<6o?yolkIw{%#G-ALVbF82=FSCmI$s zjEdj*=EV5tEAR>pZ)uIFzb*aB&4_=YzPI}(a+rmx)h!S5vntX8>h z)bODgd&&P4@$G(L+vn1+_HOfry(-5k8un=YK3>Bp`O?pU|2_)1M#Gwhk7(E$SpG6E zApR+uk1wiRU(xWxs&Bh5=YSafS6>IeS*rg_HEe2laE!hz{+o*5Q}H$rHY+B6;tiy4 z`iMwW_)PzPttrItoGEc@t@W(N`8y~TeZ7AwH>%sL*o+{-{yr||aW(lAP&7T@gW!-}tI z_=A}E<>^TOr3C_p8e9XBz$@LcTbEX!-x6#($rt zzl(;g`L%lvqU<5viSl@#0(NNOH!~)G7C)=;PuI};BPXexBO3m%{CCp$Hs2e?&+Y?L zF)%y>Hm=`J^=13)TJyVGj6Q3? zEPoc?=KEe#x~)6BRet&7A&;%YeqGz2KWliDwksde@sFKn7A0TeWVJWVkFBFyyZTkt z&x6YMM;gZQ+f4mmo65C9!xuFCvhrCQ!>@T7#-yZ~q@}-vK8@k^TS7Sutl_6%`PdojhwK3rJX5f{M7z&h*ZXJBbOvV#1si!VD5rus>;F~Pd($;NRolDV@AK#5-P`_t>%DrFtE+0N>+Y2LTN9rq zc?!w1U3&b;`uV%0elrnIlDw7Tz1t)HhI^!bhV*!TJdX0?6q5Iod$*s#?STiBhvqjq z&;PB*`AOqTm?XJZ5taNPeO`}RYZdi5-pfe855+s6oAF1e{EwvmYz@-ew43@Lk=`WA zuPn(6NOC^1-AYE#ADkbH->f45UUcGOG`p4w~L zNcz)<((?_ar;W<>DUufDZY+XMgZmAh&+fJXa z+5QIIwBHbw{tcq@PvxzoCx4M#i(e#M4sw4saDvp|kN9^;^1Y<{Q~f)TubC(#=k#%z-5OY+28!6YJ2BX06vFw1wHdV*8(=+l5DSGvb4wh zg<&d}C#ZhELeiyP*{@%illr{=$mjp|rFQDIpTYW5DS|Ia_Eewe=k9Y?JCPrIlVrQ5 z^z}^-Ok3@MDm`UK{gWV<`MfB;WGV zk4t?%uR4_W1E-QKcs&$Pxber_IMiQ$2^j&YLE3_A%ET^xx}NsaC$P759d(&A12A^GL;YO|AX|`r*^O# z$yK$-`X%zClO*3KZ}Mm9xw3pG(fY~)I#2Q-$!AG=>AykxSFfV}rnH{34)ssllU!AM zte+x(vLt7Eq^ItmGCxXG-wvm8x}4-4Bu)9j`n(U{K=tWRlB;U(cIwy4RPT==$>+1K zA;0+kc`yH1&&xly>t$~N`Qx_7?TO!WC%W>}%l^{qWqJ51{m)Q7&Y}&SYk6bG{!$^F2p+S{Gl`w`TRE~j(4 z|0KCR`4{PCe!WQcn#o>I^)Dp7=V)9%p8PnO_xCV{lTLi{X6S_PkLGE_lhLhjwwIkTN(dw3NVZ0$s~Eb%%tB0@=bpR1vroV z_>}zrourpO>+$~jQ>4dsy!2V`2TJ$Nq|bIt`tvuC{*R>qyk0kk(s3k7lm5Uhr2YdG zj`wHzy?!+Laep`cVS8MEzN7lX_Ku+RJ=#rs`JJVISxUg?B*&5+UPs=Q`hPzEWJ)jF zJC_1{N^)Qi_0OmHo2Y(s{A|Y*|J*%gdUmD!=JWdNkiGsSP5J|qQlHmD_}tLGq{sPd z($Bvr_1mdjULx5>`uu$!qyFns|0)W=>6kfHak-U-g?(xuX_*BNd*aL#?R|LeJH=`C>{HeG{ryv z2dTd?mD~PQZV%9S{3@#%Whbfm zCdm&-df6LI^X7$H%aBi!+;AJWrhMl25B6shx<_DBx({F($*)Mdt+@3M-BgA+fac9Z zNU~pE`iD`z??LV41)8_MO>zmzpGo#Kf4(RCy~%!0_1B|zyz?sRA4}zM^R_Z4?jZR* zNmKqnhpaCnslL=vJ>hfkr_%FWl9!P5vd8+fDf}@ckMq!yoe0d}Jz>Un|K!sXp~Iz5tCg$CKpq z74G=>e8Y5#XF19KlrH{mhgbR7b7CjDNg$ozhd0`NZGm6Y!(4ny>JOj*hmhp`(-Gu9k86Byfyv(D z^QFC)sod_Ndhq~BK96D2hs&k@0TiH<;^*_AuXyC=+-s}z<9V{f`SQ6tVtVHMn0sB< z`LQR(&%dKMz{8*XP0}8(7xVpNuIiubm)4LZ;)J0(v_Ub`XAdniu`V(b@O9r{9DNL z46^f*hrPvrN&n8E2v?H)jwGMg;r&d0|9YPCgV&Wz{?1)%BReFYCo58Z@w~3y>-}Xr zsZY}%xPT)1H_1EQ5z{l5|4P#DMfL4Ls;>)4zCrSQ*Er!eTd~($`or<>M|ug8H;}xQ zE+T%P0u$kNcDK(oa#o@HvEDq_=f9^(RyQ?MLm1<6p0v`cIJFK2)E7r+UnGy!`)~ z^d2F-B_x0FXb*FT$o$)bA~=)ew$vW$NSflGe~{GQgu>lUlJD*0ay01=94GacQGjcy zypN{x;QM2|^kuID!0WoaKGRcsE64wD`O#}awf-68IG#tY z-jekDdBorA1gd`&L5AdXl0|pK^vv~l;h9o@AHwe=$>|wN>2aHJ>mN=5_*^*aALyaq zbfJttMf#smedBv(cs=|hY9C*aH2K5!9-#pIKJY%-<#D~I_C6zf+<&gBy}BD^dWTUx z<$a~aRR5+?{WGPH_4#*qHt*~{KvG_P^%ujZlOut@sD@AunN{n(4-bdUPd>lsQ9g$t4&hm!v#k|zII|6VH3 z9ad3)L(2D6)jyc@Td2R_^HHm6?`yI*)n#upSNhsK@@MYrGJm(D_Q&UxM^b)y?T_{P zQ0nvVDEPehQtB_4ku;VM>EA}>yOi43x>R4Mc=S)bK9}+HdHN5?4*#x#=MR3$uSSwa zf5={x($D9L`8yu``@`o~w}K*ki0pnse(<>@lRxK{!JoJ8UIcXTVdsn5UT=k+hH7kiNYUL+47$@f-x*@r)*f1}AiUjO?C)yLB*zfAeV z`YWm2x!*pL^iJ~9hmGx+)}{C^Bk8Alw}|BLB-it(&p`H;P`sn4oYo-y4N3Cv&)BXh zeM{Gs{vAUB_9A;+|H|}y3dze!n(XDbmG<~||94RMdMdX;Bu)Cg0#bhr1vs7ZeGTe| z0wlfk`F;oX|2p!6&rNvgcaop~r2KrEB>z6pOP_zov4G}tACml@q)ESNKbiigDFF8m zZ&P_^J@S9yNU47X>EBD?`P_NR<2)AY^EsJ5l;2;`IJ`$U^(T|wsib!Y$rX)tlt1+TWV`(cfr4_ivJZm%nRtGrfC~y?)g0{-E@BSHFq$zaiO+ z?5wK2yD1&(Q^&i2{NZx&%KuZglp%6-zM({NEwcA8*;_`^%ieipZ+luuT-rnZPe|`s zI*0K*>A%y>_>1Is6NSH-BKaB$1O7ba^FOqbN%6PY?)ZdljJ(?u{evj|tFzGK{N9yysCf{E;k?eTQ-{);0 z^$(};Y05u7&-@#mkJ@$@>A~G3P5!XGhp1m#oBGQQxZfoCI>{v@Gi3MZZraaNeSd}8 z|C=PEvXTeJ0#zt`poHPyI%G-r}nf4>F-JY?AOiog-QQil1EVc z>Z!dZpDf?c$l>KwukWRNe~zRnJ^B5m{_0de_&$MQ^n4o0+ezL_(qwPtKxyw>3c%+l z_`Pr5YHm&W%#y=OaaFF5|WhsgMMrSLpI zxRjnxBtIUY@$V&)UiNt1=pY(b=aKx8q)C5XhxF$H$~XQ!#|p}qEcs>9Z<;RkucrCP z&D0KVBY7{$H%NX$(#ziZG#`AN`hllOPV{)cn|7S^XBPQir20CGnz7NwBKkIK#<+Xw&-{ZmOe|bN( zr}mpJk^W612l!kYk0+aY)d$i)kMuX8^znLegr2)=Z~oQNpJ8N=_qX{R{h=Q1y>8zB zra$)@sXvC|=l#ANC>{Jed!j3%(%wnGM9etyH$}3i_7+|z{o(cAN65}{lE;!?6-Vd~ z_J{TPzV0unJh!BNhxbd2`Zvq?`F9Zfp3C>E@P3k){)H4T-z4&$+e}W?5 z_w*|%-MoKpil6n*q5%B+uep?eJ+-&+9_i0evd8zgoJaP~CwUvmdq|r6gU6*kivsLJ z;bW9v?H=uq_4gyaJt*WvkD_fAA?Md=}gWIl`y|c)#|JB}{r)7Tm zDMDU1=5gy7kNjeNp8xMn;RliIslBH6r9bjlD**hvFkY|p`kpB3Z$aZ(m1s_NiY4gNk2{F<{2bc)!x;l&*!|?B0tzKFMnPl{eM%w@Ots8 z+KbS<^*xfm(7a?g&9_$4`2I6VlYjYNWPbC0_@@+b4QhXDd9?SsKcxOqq_;7pZ)2KA z>_GBhlH*C5{9${iP=IeJ-+HRQH~D=T)q|%=uBtsw*JG5vp{{g!rROtOzU)u>Y{yG~ zcPd9-|M`a2PhO<+vR?Z0NWX4V8FD|8&yzIiHw}?**4)oNPyNbPl%G42^wOU~{pGVH z*CoA8JoM*}lJUPn5j;TpkC1$c>i_eV(Y01y2+lcYcUQvJG% zk_<$(@n(%=4d>aj73B{0Wkqk{|Dqbem!QrIys6Ljh## z1-Og)=?6%f^jGGj{zwY&FUmi@2WJ;52QU3j3UCMc`z*;*slA^?a#ih5p!RkLmGe^a za~VmKe|58E`r0V~pY!~J?0ie|AhI*IoA$1yc5@rmk6*~n79RR@PLlpCAb+@DyMy!= zc<3*_Ug{4Z{a>lwtVjOrMADQWaI@5pa=oJPyl>3kHS*F2(&O*k^Z8@8qy>1(o6qE3U@X66()c7Cu!23d#{Y2 z=Ud-U`5aF6yynZS&+~HroeKZ%uBZ0kG3n1ha`;P(jQIXb0m-T(qAm~xqtqS?EFEJ=SB2b5ta16DfR0qo+Ong z|NfZoKWd?RaV^O|c9W*|=v^^c^@rPjGqwAVNWMe*OG#EKNFK1ufHly2(3 zMd|p1_GMPvUgqdQv@bJ(?66(0{JxRauS2wMUr+XOB=cl%W;gwdkzXrFvOiP0sei<- z(&J?$cObppJoM+*$(hDYl;Dl2es4*V*F|Phz4p3aqHYgqZ$8=M-&0H?dpvL4hx*kK zBu)7}r=PU90qOHOR^G>ICBKp+vm{OS=7yy`em~;hshmXZ`+Sf7WaU0mKS~jVDg2!z zKk(3Bx}Ve^OZvR8^a9P({`8oyv3`m4+bR4BBv;kmhh%Se8ed-{dp~*jvvR0RPmJ{E zQF-!rxOv}_=!)R}i}g<<=E*hWAH09Ds`kDodr!FRUE%U?6Oa1B{w<+$<@3eoQGL9Q zGI{p(2oAu8|lshn@~ zC~wxEK=HWm&1t3lzOje)_@2Lca(6Zezs#O-(HsV|6mHh`-hKHe)D^kNq=RV)aQKw{thtvak5waB>lmZfBb&2 zIhE_Kq`xQ0p4y+Emi}!@_KRfqB$E6ciyY$9mYW zD@uP~BL|wP94wMNk2d;OlKPV<0H1S=kUsAhoAehRC-pC(@FU4zUQfM~=6&~*jMDsS z63Kf>dfA^u<@pq~x7|svFUby)g>KqgK<$O!*B_;M+ai)){_yWm`5YGCyZ9reGvV^f z%iejkj`1a}2l2fueQBMwr}k#h{PqZ1uX~u}d6YiR|EV7N)$2N0zPyik43+c!)IJ_1 zX-XgKv)+58&-+en$D}{-78(C86oBtX8bEfYlQikCoG?Ei11_bAoV-$?Rzlf3-r@tS{E!{g%jRKCBETvhx0d+GJa zPA`&MlH~6ad3`^L)64sd-&1}2jpW}XyZgN(Sn_{cpXPon?X5%g;6ajKP(57XQ6E{q zFX>%M^3MO!-ZP}XJ=K%lNq$c9Ymy7eKYp)bzfJY0*B3IqbI3k_FXC{je=(9?`mFaS z`O!>zY{#TOXN8QP*V$&1|9l?fLXY{{v>&AYD2m_>l0m9R`;s)p&-$!)IOPN1Z^U-I z^jVM3v+y{@cD(d?-zP@-cN)pXlpk-9?5X|vzsdZWOb%>EcKVT=Lek_P>pxBb_#T8o zlusLzKKDPXYM<9pc-%jb?DF?Ny!?BD@@qrVKWfhF_rr1*<^?BiT6tXQ&i7*-pciy>#a$D?zS@j!W7^D z@@p)~I7u)4MHJvOlIv1=G_ImOzE5mz(w|6@=TjzsU`Lsr8!5nest+ep{#-)ROP}BS z9-(;ozP*x%enU{kU!Vy1TqnPu?L_{V;$In-`n+GZkODqOlFw~;>2v>ZQxEm$M`ipx zKJ}+^97u93NmKl+U!nk;ucH1x4EhIo#J}=L>Hk~`*F^b!AC=?RBu)OaK8OFD!vD9M z`Vg1#kD&;7or%Zi!^p2V$zwgzQ)fwgiz(cfl%62%r|nD9lpfZ$j4t&99f z(o6qg(m#>Lt!qhcPU|q+ko;fme?$G>H$C)^_1M2S%pycaoew&adaY znO|&=&p$09z3%D{rw*Wv_JwaI{X0D3&mS%8%WSGI1897?mDW-2_E=A0{UfQK@jVPZ z)sIs-eo68Sig&I@{BzEy`c4IQH>Klql3$SgisWx3P31fHLTQiZ^S@F%=JV~xQ2u!7 z^SwA%(K*$=RNos&dg=G4ay*>msU#PYh6^GH=}$RN#or+^)l#Ek`+bz!>!Nz#Jo?@Q~h12e~D5%c$MO1J6`eg z_sd_UcFgxF^wi$Gk7a($r3km8`o{C(sUG7w>tAKi=k-e7pZBsiaJlp+L-w|#`1yU^ z>pp$f=kEw?)IaBBtUr>*x5G%kNV2E)miCe}9-eRZr+OS986r8F>g7U`ru<@ihmzhO^j@$H z=?x?~i298Y9{mUGA^qd;x$=EQe^YtxK;?1}_1kd8=#_fgjGPvw`U^j=AFRqgTbWzM1U zTj;XK*~OB_5BBG8@`v}I|4sFCN3z$K_H(e(6&m`hl3V#ksuircOx>D+2L;AeGaXsnt_tZFEmVaLh zAcI^nY8{wx_}WmiiltOGIUtoSS%qvYJwN~nD_^W1naSr0rKVV^9nQdjg>tr(%2@R? z3#pPdI94d6tODGQL^4;OD#cps&6Xyh$)RYnKLxRa3IKjn49~U-xzVrm>*lMY`i@aD|8fL5@Xh^SSFvgicn%Cl}(irxvcg0eQ*(D#Zs)4ikC9^mIk=D z7WBcJwV)q1_jBqTd{l#EK(pf%fC?Y)^sl3 zkuT)hQfaFYD_OAVk&eHPk{?1^+y{qg@gN+l#RG5+;=S9#!TLa3TZ8%!o>nwc**5q@ zc}5T8RImM`DXfLxX}<>cfm#FhRjZ*-kn%V`VbA85Yb| zn0US{@&YbbFdMi}0c7dFp&-dzCN@jBScG2`IBU(6;I`8oN3$3QgcTr`PG_K50a~!y zv=pt9m7M`I-FP`m%vB2Glv5ZU)8Y~MOp8Zhy_n-$TdY`0=aT*jqGrMXWMoNMt!hCv zz(hqybQ6w^sm+X~#L4e4uu_w|GiR%>;9bZqP5YlN^~gxeG_)fS6eqp^{|%L;0D3|}dLD6`I# zl}^CMamU$sI#w*Ul(0Bcvn>cJOuoId*c3}z&4M^gA(Zq5;5day#`74f1y@&LgVV8i zhm{>hoypS*ImXH~$%Z{%H0*B_Dq*!*g$bQ`3wk9SZ-tY>S=;LpW zt3tG;vZ9xS7pk%8@MSd+hqc=r$1q}4gxwVgpYx?cCRXf#5!G-kjd@@2K}R*5oEht| z;OrVORf5}GAUx*+h7>GO>|eX!@#Sn5Cm674l3RD16|X9%2r@j*ih(4915&1(fhmqg zn^mQ80yDut7101UDYj6_&BKQ6jx(5}dFYD()vr(^ z2NM#;IgC#w8lcQfpxW^UxI$s9u<{QcLxyvqIMcH7utY(yx~1YBA|F>vIpNxJm>fG* zsayi~R2WQqI#IMTF&L?!$v8D%Y^PX_)16RMSc-ilP6sC7Ob@P5ILr!cC|D;SQowvJ zmyV~cShk#pr3#MY-H>)G-XZ2{uoixkhSP;@itA$^1Zwg`O` za2A6j6|j}TqZAN_;x;?W&Qd_ThlGD2BI}edo`@&HA+A2~vKqErvcxD~nJWFFkal-s zo8K<&xGZ|qTwBYKmN6nbi!fN>vQ{aNeT^tyoCUTkjDX`YoMXb73QFO526(4JbxemB zl*e)*mQCa`EeUG|tW@w~Dv6Va7OXq4dB$;4jNsWs0Ro8SiuKkkD_+JIh_q$DYfMCx zUn#iWScO8a&|E5D{qJx84W}vgQrUzxYnTWE|5o5)Iu*Ah{GtM5bx9=%|5m|qYF5DV znkhB5#xKxt?1;un65dCFu@2=5of1D%!Ic^tfs+&h?TMbSNi^l5Vn8gy?Fwx-@pK2g zq+p3uB3Eh`Ay=xX6-(GfzbWqXvX^gfDI zu8=~)&CEnqSTHX!6KwER>-?a^fs<9tlz4|dDcLsf_?&5gAU@g?&{8{&ABh$WSSZ0H zMzgt6s;#qy5~;kZoUE8h6=Q{XdkW{)H&&tPRBItt=!9n!l)6m#Lcx?0i^4|J9sgQm z2`poLdqwAy4P%N)h?rQc>-hF8g0v|?#H&?vDrt|vXDWDWIh9V(s|DPl5N!p^nk~Bd z#R`aXy%DkEF#ClJepCqgjz)8og5$RpE2KM7D~?UC6@7=nDk7fTG# zq@dg^C&ZFaQgD2q$8~@U6a-&iig1Sl#0p8f4}irAX!n~UPg-P;_lv@zLL9a%Ij$lw z1N;gg7BE_7hl9}U24^8yQouxOaz+f>?L`Xa#4TR6{-ZDjt1WHCOXJ$witwR=;|Ol| zjPSP#R;IsxAM`Fe?qVI3p@%78ynssuqDHkTVB5?DR!cZVf!eVTPh&WN|4YHqC|2y^ zxP#&OY7~|!&)CF=rLhjcx_DHYyCkPw`2(=Gp76tXJrRMKdLj&0Ruj0MfD;jT#Ep)| z;t#PA8IMa5gg;r<7I!$ten1>`3Jinyo^q zq}`n(e3c42CD#a#>xn2VQwVIt&7GOnoIPEKjbm>>y z-&>2#VkCv96hbsptlXa|P#eBE*sXW%PRGe)+{v{uxr8Oha9q<W+0% zBfP`Krs`CTaRtED$LavHT>)@~!xiFYR|tP7>38KkWAf-5%ZL3Ka4O{ZY3|pSS|~Fb_i!w^Lirsdn7o&=~QB++H2z3KjG< z1_KRlw>n*+qJd~M+~D@>7FQ@=I1-8YeQw7-bOj3pLZM)=rcQ5qLbdyU0>=7hb10}1bxw(8o%X9d3Av;x_Hw z<#YKsE(iuR6z<;n;ZQvh^uuuqgUjy9B7YukRJd%eg|^_7aqcxGfY^k?0e|OH?d1?$ zP#Bq=f$Osg*dLKpu723K;V=RJ5ta4B`^B3Wed=LW*K1 z^F#@W1~X)40waNWRR}yNADsr^gLe@UnNcV-x8tVkWU&nmzY7re;q0Ajv5Y17;kdOp zB%LdYm!3YSv(o~>sE0|wu^fbigmBf8a&=|`PL^2GD$Ps`v6sfKbt{J8F@!j$hU1%o z{R;iD3^xd;HSin$t(KZt$!o@5pg)$N@Y3E@-0KY6MP$!K}^j*k!Ss}64-@bfNjrm zJjR)6sniKk1+o({K`ba7?ncGR^cZ{n4o+0KxL9p~d2R$(%SFk-lL}$G51+V^F=EXY z);`;DtSD+L^i~mj91z{QA4VWvNueBQ2AA7#ZBR+(tlBW+aj8s(k$=I>TKfTbLDA(B z7we^>%_vd)tyK@hZs#}&!HP2mdny>BV0JFpMP(^yJ9f6i_+ZAF3gOg}DBP~a8{t(g z9)X{9JXIwVIKvdHj3}0Fja-^4b!6)M2RN^^Yla*p41Z&Sgt3c zu*vyK)1eMkRB37v`ykCVUU8ujS`Z2XVx}`g z;@I1W)ljPh7gm7D?P5j=^DCNiOm9lzxq??DsN~j)O0cmxY)wgA$1g&!i=3g=sTF<* zD!5pjZK{4QLZ%w92f%ZxF?+1MO~G&@dptHIv8alR>#;!0<2qBw+UVcKpkg$`Y)LfCf*<)2i*#@- z0h?Y9?=EsgMW9y`r-91*dYAX1si}qSGm1*yb8hiTGlGyYr{yf`g3#* ziRC(h=2O?#kdECjyi~*5quX%Y4S=6&I3??MzS^l${i<`DVpi+cVHmnPkmCd%S3tHc z9ZS|@+t1*JAg&QuaJ?FV&Dtj-!a+QSS+@Gyi2WzLTN4ta(uCXipNh-2e$hVMQDbmO zO+YkQ6RKPjDuG8*M0KtSdTUM4vfjmyv;k}EZ86WCl2+`iYl0nw!R&NmQH;Q?AxJPV zv4|%H;dp*@3Znt$F{l*wLV;yUN}t{UO9{*8hvVr1_#Gd)i|HrA=JWl9XvWu03wFOo z8W3*U^#X^ zhWbOJVfe`jD&COgU@GQE+h1F2BLw?bP;_BJE+;p4TPmpH#2f_KcRax@QZ7yo*}Iti zZD6E${T1hI;eHHjLyG>}0<%?$_4eDl?1WWpP9IudDCqy;I||B&DOy2l-FKho9i79ZFd5G z8SVZ^^lrnT!B$_iF&u4xDU8G!=~R?+c^tNIyn@RW&?)Q&ctpXmsG2*orPwT3T8)m6 z;S>p0yTNfPZMETg5S}0{LT?3@ty8)>LctNi4d`)g6R^Uh6}*_Sr%Mj`50z9FULMfm zKKMY32Vu1v9bcW~;@n(|hhU_Nx2M`LUF|AVaU~3AD|o8dB+ha9!f<;Pic73ayjDfn zXuuCYR-qgmiS2H398VPwD#Y^bcvf;h6~&Q@_Ig_s*hwXh3tBu1H)-)kcwUQREnlf8 ze6Z!sj+;)*IEUCrPXwSvPXys)JrRO`Awg$T2H5A`)VI`E71CbKQOVy0X(e%PUymo! z#3?%wqyu*TR|R*R4!~d?jO$K1xB*Vr!9KV}2M6ILgt>R?M?T>(?{aCd*rw{QBCz(q z4Pj-ERvq|2Q(#(btg<`{13MWqE{kV3@$LF@2X(R|1P|-rFf7%<5m@7vifQ{NS7US7 zT^C^w2hQfkmvLS)R7J+(K?rDd5GVd9oT9+E(2$Cy?Yx42AE0 zryW1s>NqMPY<6QuLvIIH#)#n#>iC8&;wUZdgLAdGAMVoP0eDm3@;7<|@_Agb7B8vz zMl)>maQF*3PAD#+9Yc8kS9@V%h#~Qsk370yyS2jrp;;!Qvp} z$e}O`X;TcXsidd*MK$I{67b!q2>-32lDUGttYYyZ>2|lfos-95;sx=O1P(R2CY1QK z0kbn|Sap#WuBoA`mT6x=n$urh3Ru{9EK(-MJ^R@Bj&5mH8;pw;R`&V`v`|eul`9CR zD)#$T2NS<49NcLi9djH-o8(WL=6p|OAVS)iR4W#?eE`DO<~uotqNE&W={ZI!(n z#ljRNOtp{n#FxO+U8;S3)-U@8HOWs^%1LU9n;FMzr>;S zXDUo06i8U%Seri*wc=J7zNs*6u3sQ-aSuC+zaeYzIsd^v6{gMaz!(IkIZP-V_f`Ij zz^M)s^{M~hR)>j&)PL}*!^Bl01iv8D<+^@lH$bUKjrS@olTO;z7fN^*5N8GUVdQ%I z_j(x&$AD7R;CwCahkF$qf3K8~zvy{OK^-dr_+7zq!=pV%o9#O<(8U^rAzC~PNi80N zv$S{w?$F{BmG%{oO*$$#dml>=cqpjgY-lg+Vlk0 z0X-3c`FbJ>Z)k}C=Bu7)gq{DRb2r!kLlr_C>>ZuUb(Hh+L`hoVoW$c9u=Djq1QzIt z5WJ@l=~ySuj${;nE4ULy*bluQ)HxjX!ALz3fUKSf!i9Pw4EO7a2z;O=aOq+7hjd;= z8evZ@5%s}ng%E26QM=R1DyWm}Xb3LU6G6CNPXyotJrRc0AJ+NW=z~4=gdaxhi3m*B z6JfYmPlVt>E#YhM!AAzB0oHj$=dcf(^4Sa(KAEl){&jUliD0ilN{;EUd&)Ke-)`sx60#aI7)p=!zt=x2Ii@cIe1WgEWw-VV;R0x9>>52k2_9`iNhZ1qXmQ1$1EJ7 zJdTAK>Qe&FS0B@GtNNIOr-zQA2YDtBFBs79Q0Nm4~GNPr!*X9VysPMRWOFCWmYCQ&q4KYtN+Mm})46N5tSt6)PvD(+^jH?RaYU zJp~yO%i;zxX564w%z0G7{o{3>b{rcLD~K%GqY5fxTeo%ax0`kj9-`9iG5nznCr?8Pbw7xUxrl?vhdR|-#TXJF%J6gNBbg;cHt^;K8_a|PAM zDd12n#{!<&$yH%9Fc}j2 z%H`3MT@>&jD_2O0ydA89xV4EDStQz0Vf>9XLMN+GA%39dkWTk&hc>sdQw;YoGho|z-p+R&E=q_3d42gEF7moR%^kU30J95s(|^M zjlm-dh}U=F39wkY1=}W`FptABmCWLg%I$jq)_dM@a%8p`FQl*la#&AWnquwg*o+iJ zx(HFgj6?t0lpv#GSlpsHpQeBZ<26#4BR5t-S!^3Ic&ZA+)+`dTtP1RmwYQ8;!MZOv zt{&VTE98pp!suRAF#awPMphxYqp;n#S3%`OY$mo#I8#AK$8vCE)iWO4f<-D~`4~$@_M-&XZkl4)jmJvAcB;k`PBAw~P%ULW~>s80MrdYXU2wq4xB36dJD&8K$ z--tHFU{n>D!}*2XVlpaRjHPjNztVgCL*d3-*l?0?j|zzw0eDqGnz6UUt`W2Chbk0L zlwf~Th{4vcIUYA-HzYc-NHsP?%f!xI)1OH4hm%vSoxdt7Rz82utvU!VOL(QY~~V z7<{1+L$UI~T5mZH;q{sLi))-;`F(F@Sv}PkHVWNE2$l; z5TkQ=pA$|&?5)R^VY9@0xcIHZaY~r6IlK)NO99V~7tja}NKN9ROSoMLGfv!{(=sTH z7ujKjz#@IChQy0_VmMs1j7(;+jo~Fks;$l5aS|bI+2<#$jD=2#EQNtJAw~|hla$Kh z@NtxmZMJW?IlqP)EsnH^*L--Oh8rVpVST>_o|wn-uvON4*YOm8fPi_DZK0z#dub?j zNn*0f7cA^z5>`T_LDVjM^TUkCIRM_|b+!`lkaA9(U}5TRg&L1DD{)TtH3e%HKRCj( z`z;g1?*heJ(4Q)sYb&)3&7s!`*yTMZAso1+30F=_Wjj6?s|1*sO|_-a*-8b2SqeKz zjIg$k&6c=b1*`3K3XR)}n0xjr&Ql89hAS_l;Zrw~hBe-IJhKCpU{^O(hCwc9479ir ztj7u@R(j~wyc4cd2oZ-khKcq5DHnVYp7ZN~FI?!z%A|hd4;)v8ec26xPl1&su|}Ar zC2(c%Xgv{td3quQPwI&%EY}ivcgZFnI?gIyK|qV+&mj)g6Ja=3Pc*`{S^|H=`?Q`2 z!dH3%dM(j88;n3mON1KWa6RFNC4ZL5fuz$=W7 z&=X-eK~F^CMlBI(fampuA6Dv#AZ+=O&fQ1^_R$i!q1~b-aKqqaErA;b|I!n9u1Zft z;Cn66*Z|vntaG=~5BuwhAhc=;JnVOxmS_yat$LynUeOYG!w39qU_!9tCpw4m8V4An zXRxNE3`_vdGcX~z*T6*KJw1c>SgrP{);HV=+|$5>V2pu@LQ&5I8sIVm6M#nzOb9+R zFcH|`Gp*NnV}ei5;F*QV1_rONHZa&H=o#!@o;5IjSYcqWoqewLIuwC@4NN1%^bBq# zo@QV|aGQaNz-xL2dyQWW44!RSru8}!f?)24F)CvCm5J8++<*)@S>i_E3_lu}C~W_o*6RqKcQY_SNE(f03J%eNYX9gw+ z8~md6IvfU{fr-LoJ%h7=V+~9It}`$pc-Fu~V1=H+K4i;ZwO&U9u&;p$L(IT5!fAR2 z`;glVOaNXpFd_KWz(ir^-*jGwaPB|MzyzSfz=Ys@0~3Y&^bGbP9~c-vtns_nH(v<) z8ki`I(=*splnqP}t}rkWc+9{w!ZJOBJ;g?UXuZanL%_fU;4lLdhT{!P6mHNnxEAod zfeFC31_s}M{?vMnYmoaJm_~?e8GLuw;sLlti-+K4EgpvNwRjY^{!8a;BkZfi@%3_= zp76sddLjt_))VNfo`}E?S_13cwtwrq#R=;HdLjsMJrRb}^+W`2(-U~_nU)aanV#^& z4zLcNV^!`0z|m}wo(Msko`}F%dLjz*wFHiSZ|Dgh{H7-Yu=8p4=L zTs_eUcWVh8D&N)<0r*o-1Yy_Jb?%13aFCveKw3{U!ueVPC+7?Fgdg7169IrVbY6vV zj;kjkFiKD0`C|r(pfHb^eN<0W=tx z08BD4K{&?1gyC8P6M<(8Oe1`wXRwdoVjZp5;0fSO{IJl#1mJT66M_xb*LoccgWteJ;ZOt92*>Fe?E9}bFadbZz=U9>feFJ_8)&@_ zMPWZZgZ+G~fx%C}8khjwZeW7&x`Dyprx}^D< z;X?xxfi*YM`i8r>{qzhD6HNxj4>Jr*5Uw;ZVR+oYMBobp(+C@Hto0iAg@Xph4~H9= z0L(Ek_<0ip6NVQIOccJ;GJYH}w%J7IwI8>Q4=^wRNEjHr`rg3cZz~N_Joxz=kO zF$Nl#2(%fPMmSr~;HLUr1_pn_Y+&$CK?4(p-dkwB#t~zbp1~0#Z(w|Iv4IJ|Lk1=Y z9~+o3th=Sww{R5d4NN0U&@(t<%r-E7m}g*u@RWfG!B++*0-J56^%_TvsGh+M|04~I zA5JzfxVB(mLa^At;63FArV)17TI)5A7=sOrAKDE}0M0cqA-KoDgyCHS69w2t?^`46 zp=AR2jxpN6;JccE3BsiYCIpWdm2m>`TbFd--zm4&)`_{xq3iwSmF+A3cNP!g2!> zfL^<6y$<60kAcDW9|IGG6ZH)C{x=&KKfGjMg7AZZ3Bh)IXuZaRy8{hO6x#F*zGIwi zV0>_wfeFCd1||f58JGz4-c#!}u04&?Gx#QvH!yy<*uVtgAp;YJj|~idZm*BlH+++* z*E871PcSfkm~CK!Fwek*;3)$Wfv*fq6gKOt^&0#5sDbgrkp>3u%QY}z__u+Hz+wZ_ z2tR3=5UxG#&`;-e2-ltl8<-%p8<;ShYhWU9kAZ1~cl8YR@vxWHH~fjo9tI`|qYX?L z3I-+uml~Kxctp=&@BgWR@x%K4wO-@eQ-gsC!6X9{hGPs&6t2}Xc)Rp71||sK7?==j zvA5Ri0RGO$z%;@%J%f7^ry3YP+-hKg@T!3c!!HIV3Om(ny~aL%C^GoVQ~41>alO5A zD^uFdA)iXPuBy7q9cUJQcd&JaE7Z#vO5RdD0KW@^m#Wv(Ma1&f;onR&)D3VeIzO{( zfKkX+u4t{cuU__lY>g58@nrfSyofgsH`H?Y^~G6|e5r;+w*E-t3C@!)kuB*Vyaz?}`q>aCv`e^YejMn0fkk{f^%>U36 zKKPHG@WT>45r8#AI$v>?w* zbwvkZ$Eex!KnO;3MPohbipD*!uIMN{+ZEjiKXgIk#9`+~v*)-LJE|)hKUs~m`?h@X z^;rD4%1pRgLn@urvqxv22jCT?#TTQ*S2YJDXQ%Sw%iAOD&l1D0$hG5zH3Q;>IDT1Z5;iVb{EOPwTYCC@x zRn_>bTBG)htj^bA(=$}XAqOgn!;gKH#3u%^y~V|so*N+B743)1x}trssFqG!Gw@5? zupF7n{Jl~lGJd>>MSdt<{nqoI104ldc>K_c{T72onJdu82wO3@E0~k40Gv}xiy01n ze^!1ssr5o8UtFV9ggsB}v9U?*48<$MC$`H)H=m|xAO zEXx{%H!I?0oN0Kwnv=SsbA-RD8KGrI7lq!#s@xHb{q4>X)p$(A;b;}AStkRqpD|GZ zSXfOdh5EUR!I*}O9y4*YYlR{+d>zQ+O;rQLhkL{yVobnK5YdHHa9IuC+>y$Q?~*@S z!zi(Tfu#5p2!64sRID#pGom;K!}fyrdwlMI0lPXG;LWZd@aDFw0!`&_}2aS`L1qa5cjlz?_aNMu!gKiCKV#6D6KBR)+~ z!cx3N1rk%cB3}K47nNo3a}(mMiM3hv_RVs5eclQI;Zh%#5d4mRb6sl@zQKL>xsm4(5#e#6^bLh9iBEyTG9sh! zE&j!yXQ~&b2Bnj*?){E6#u_!)Sj0qT^r`l>e;qm6m;ZoMyB+dQ4B3wpy3nXrl{tOu z#3x1Jj~<2I>wz`FRtw@E{p`O6ioZnMQ5b`Nau#P}84Jf)h$)!J7J-!&%>HDYT^x^V z(RUE7pxE16>yLO+Wm+q_EUA>l?aMN;N4C)DLhs}+xi6$I@TGx zNx`s!+2P*QVEz>uv$OQ@Tm=^S4fEZ=;|NTd%4LEd zNkxm;Z17tJ>piT*ui#AvJf+~6Px5oDwsUtFndgvkV#lv4iw_3DMvpi#Gq%458?R!b zgL=yie2GA%Zd5z9_M<8#w6{ZKihruCsXp=GvmZp?FbW^#7i1wP|HOQ%JGzcD4zE?j z_3wn;V)m_|`B_l!{FT*@x8ft_2zJd2@UJOU zkShe5qtDy{EK;8~!6z=kl>PPK{c4bLh+u=BB1?a&Y$0_=9}5K}oToYXgptGPC@Z-_ z3A-9G`_u5^>)r5r)zc?Z4~y|@TN6XnS3cdo`jezsLCQ7A>4;$I3qA2YcX*OR*iY~j zS+Jir!6zl`1l*JPArQ!#8CP!H@u06=vM7o49oFp%G63mOn^R5 zEBPYoiMSIN$8s2g1lJoCf7*aARSn@J5-&L~z|Trx#zsHm7-lSn*c4HQ_7%ArI~gf9k-^pHqrvF!aVpj&v|w_PqLZGd@)cwN?1Z z#kfcbS4C|2f@7eH*h3*Ii5hPe@$OzYy9@4L$kk@ruvszjv2*xA(c~;+ZuEj7{~rb@WooTSi-lYc57y?kWSRH+9*@m z88}8JaCmkr6kBVZ$H-^kx>8MgiPSg8a|#>JbmnEI^!mJ&D_w^!tLK#V;nXn+EVNQR`v_oIg?sGY=STtKzp2-T+j zs)iRx7nQJ#-L1i%QLxMe+^opM@>=LGgeqw)iBMy4Eey7P+wt5%=W5ZL5XC`^6Dsrf zO9A>Ttu`5No@rTm+*5&#-f>JTaHk$VA7R{DiisKARrvRmaKvup_;{aq^aX;I$wsB2 zXX1G6HZHQ(08VSS=bY4eV1?b}T}^+{b2DW$Q^^N%0zS}z-y=AMJFoTMbJTE=*zTv` z8Xb5af_DE~^U_=WP6}UkH{j;)D-|GPulw{tsFDgB8Bv2w5o$EEPAP0Y9ZO|#^$YJD zzg&Uw^bdczd6N$u>k7Ol!j(FNADU|ub>#phEMtFZu+2YoY>IG$O1TW)dfyLWIl;y1 zl8_Ho`2;t*6i4D6@U!3{1;x+aTkx(M_(~YVn+O^zBhLCuG&QJ*?kV-H*lJwgkLGZ-OU9x z$g_wz@h5PQF2E8cREvbhFH_=|P#Z!OP0^Ncc!Xn>aEx80!R}I(Gw_5GBm>|7*NH3x ztAFJ@C3CnJ4M)`=$2y3!yH@Nh)=$J7!joZewG*HoD^n4_E^;SAQ^J*c_Z&WAVElwH z{!vL6PG-cXA+16YzE(^q@Frh7?kVt|2v@9R;xQcCVSgnkL4&_>vh>r) zTj0+8&8|>l5|$RD_%({1YUV8?^PMnA!+>Z58?C_SfLxIf&wa$RPv#K5UJ991+os;d_OeiC-3*4!eHms7oY-i0t!3UgYtq;a487F5h>}4@Q1U$e9yRYmBp6#ie{-I7SCvfS?lyuER&pr99OAq&^K$p0MfQ zstImAcfiGZ_;!TRGiAO)zP%!d8jrX5Sq8`IRdI(D_7Ri@pDJ*FDD2FAxC=f>FpeEr zW1bYCc#o;rm-v^6bCT`JHI9c(SfZ=_;^24^wTP_g=fzxeS;p4-# z&?^XGR?EdcQQf~0Kv=#8;;lx%i6>si*hxG!@>4`S1p-rfZaH2&<5vV&H!Gf4gb`_y%Ba+Y(-NNOQ%UCFk@F}u=%#Os5aPXEUz-f8#_?{mlJUX zEa|{A5u7qr8hgV2yHbc^QxDesTlF=M&@dc)I$?XroN^k|< z8`i4WR^VX>_oH>EW+e!2fXUnoX1 zI1J%oiVfFP9F$NULUzLz1%ngH{lqhlLpAFR#nf!M9<9#za34;zQCg>VUPQ8DEF=`? zf>)x^|5Jn8uZ3RXOtsO;47=11M7&@1TLerLVQFN=4V;{<>Tk5?8c{e?Jo>WiW;*Sf&BgGhnFh13o#7yg`s}x$beZh^JnY9Xam10dg zvFmpmiumEPL~f>Bfpr4oDg}NhOdQL@{?xU{(3ZoO00YP7nypN%W|CjDrZONmXKv* zbq8s-rq|?+Sj!VbpH&!*UrkFF>u48AEd?C$Mt4ykk*;=fusvvFy?=Fmr$2GI54&$* z<_5btIntN(@Yz~;uxKV??r;mzQ=+~`XI;i|MeuLC)$KeM%y-DtWGZa7A=;CpFZPH1 z@TpRWak1iE$ca}FG=i_t*KgDn`vkI;CXA<5T7}E-o}yC$LmNAWD&WBgVlU^bOuCT4 zRnOTt-<@6^p3rBs=n_OLZs3H%-k1GJ*bY&Lwb3S;E=sh9O1Y=o?E31|xa#IqL*q(R zLtSOk;;7BU$|Tkti*-Hf67AuHi=nby>X>aU7oE0U;p>jwx2~n8`)bA0%|$U)#C=$I zI})v>fc@fF+?}dXWO7ulwOB)DafL>XgX;KL!d%0S($yQ{w>VR^=CcXh!mF{1F61lkRpajib@f0xnP4?ZMT>XNRZD#r7fMeRn*j%3gYRl(R!|uBXEXH#h5GQEpmX z^jR8$^J}O`m)KTwqPDX|JGclXp`ayOlVgw`k6o)%+SM5%L)bBjvQ^6hr$$z#KI6** zJ~|GS@k{5!bA>q8iE2+v_+`Yjc%yU|qBzoqALPdIB0m~W;n!3pTmi?om_y1|+3Hzc z7h|^Lr$`01S;td*vw~{_4=bXkGgcI9(vz`<;d|8oLCmV@cxOCq)z+S=*OscVEg5&Qqr=fSXToY-YOheHwSQRJ&u31RvFNj#W?VjKEJZu zl7~EkRkhrHSzV?@|FR9x__pPCXbmUitei;A7!$*f(n2E=HQ?Dg@LB|Wl!Nw=RT*~W zM%f_zNOsI=saY|~bR8sKE})KADE!^V4E(i3QELoy^VaQ^8GzynJdFgWU&S}rL67%F zd`dVJ@;6lSlC}UxBhzn+FVcwroR_lJa=ZgqcRPfdf%}J0WFIK}Er_|GEq1Jd`qV%Z z#0kCw5w0mIyXUeSs5&IHiQ$pDe9WfH6oYx3<=F!#yr4xtLA2tw2s{+GxZ!tKSR1@! zC&%?l$R`yrg9CIHmyNPJI{_Ix39%_5A0JJ-S_#r7#w*-=w`ZasnuuQ%qA=5bm4(ym zoQN2^O2uM08Og|>e7tGES0FA9$yIMXZL*6d^To8cj?2^iGL3_sd!)v_3#TtV11+56wL@ zb7tnu+2(BX#kY}HFj>?{vTKF*_9PUc^+y^Pv*#g#Ov`H~1BnfX@yTtPBK$mO>k^jl zW>UvFQL zmW4ZKqJiUc;w5p3Q3bEO3uchprq~$W_uXU^zxmsUv^5alCTo=oY#l`B51`zd$D9X5 z!VHyKH&0Y&Oz>O#ju({MPGZtbyKR?P*)j0&5XgBe%pp>)+>_2>gGYn%Jc$YEA#@9wr2J=oz1sBY8 zU_6$OZ>o1eJtIX+Ash!mgRm__&{cZ=O^;EP~E z@ce>V4}>)W_KjMw@4{MM?J_ik;78NJF9B?|wDhdyu}4`gBj9{G_yPyEWtu_94p8&c zz|g?Yc4#2)p5g>N0cafd568oi{kF*|VRQZ!Ae$2hiPZZMv*Bn*=V09_uyX)&r9CU( zVZPysDEVwO`I=8Ir~NE5?mbS90Hy-q7}7Px)#d}9MgTX(0pA3`7Ga==4ou8ePot1m z5|G+sTsCWDuBkDAdkbs!J^mI1V*k-ylNn1pYq5VOPr|ziM<}j?IbzD|K|pYm12FR!`iVupcul6dnUWLrdcy%ou_RF1qQ55vHXkq+fJ35j z>>trIf*>03?QnB7R~da7&|~N+Yr{l1=QIGgE90&LnB(A3<&hJZgp)Ek0zd(Bla+X|n84f$2O-kDn+vDv<7_^u(j& zS~xhJN9iUD~a-WPa}u;PEd?Ow#_b&nzS+XkrW!ut4O6=C}fm zA-Wp+2O|p=b+s(AE^NqA9Q+AdjKCSb7TkxVGd}~BUG^$_WnrEIDwVmJGrJt76BrW8 zeVc9$<9@LY)EJq~r9k_E$ZU!xH`}Cp2g!rC9Y=ms8T|^-Sc^&%ee0aSwBeF3S|GA@ zZ*n26hTy|Y_f`-ly&7C00(D0H`b(7Jx4!9`*NMRpOKwbg_&Xow0BmcL|_2LEc!vy440Ym~DJOzkjL{|ss zo!T4bc~%xSDFrqsfY~?yO9B|>r8ob}0~m)>_+S8N09&(r=+ac^3P7ED zE|cAwQWaN4+zY6ACvu%J!ENF^LP=cYz*_~JXpb8l=xS^NKc{-5ro|JO~v%>~$U)F2_CJp`#&n_f4r#KZt@JN6$6^Y`4zyxqcoEWexQ(#|6 z=ElVEY@8CX!xzNF1J(?fmyM7=S+Ul60j-DLnF{@70PQr-MN*~}{Ovq?lyTzjF~uro*t9 zfGLES=z4)PCS+*m4CpNJ4CfJoe3pV@CKOx>OrD^=JcT)^za-3K%7FWWgrF0JSW#alI331>aM1668o{Gr z@IQ{g6Pl9r9fTMkXM`LV5F)A1=a{}RrVs@Ggb+u^S_$CK5KN#0r5p3 zf@wOs?TuwmQNrl|4rJwU`zx0GW7gD8sP1HJ@k0{Hf}6yOm6a;w2IvdPS# z)RI^XQkz6%x49Gu)m#NC3mk_P0m84^q@y{YeQ26#Nt!vd2Zt>(*%ey@0+>ca--;xP z0NUT4<1nSzHvLSJM~vdF9SKch6i0y~QR*J@*v-0>%#8SQImEqb%=#n*D+fB*FO$$G zM4w(6y&7oDtJ;(sZa0Gl1cP!6x%D`e`54pn=~? zX$(HG%CbqB?b zu#donIRe!B@~Dl(QHo6)O*d20?rSv!FU{^I7Ix2VCf|06Tv;v^Y*jd7@Mm;pZ zs&+y*M!i8?v%oPbN4zur3CMatD#^iaLY>o(AIJIYAgn{=uA0YD$Qsqe1KoQ!Xbt_2 z>p|h2f?QY$mA5!V(8x)98m0hfB~>$CQGOr|3Ev1A$vwTF5y(lEm(;(Hz~ou&KN+U& z_|3h6rt*CHpb!*_zc-W>K=vz-(W!JGh!iUb1z(=g)?%fPo0L%2QKFkVK|Dc%A9#_XQ+ zS~6f<9559Cmj_w6TPzNNh;vpjeL+43?3wqR8E`NFAtU%O#ddRaKn6YnT#*L61VA)$ z3}lWAYkUjwjRWr@;uzts1rSE_?iT?$`I882TSpH~$Yu^eQOLOEamX}4yZ|orX%Ub$ zU!I|H{VpJ=m4QJAb4)7_Q06*dQV|c9Lu_XWHjg|o-nAI;$Ed(@Iu9VAlgf{8Cxmop z+#KwYtNmnPEYAqy3*`_$2zg0(#$SgZ`>NvkD3IUO*OUT%>4KiwKZHo=uJHg3bAXmm zAi>N~$kf@=xM)`xz&|$xOI*))2IF{A0ZY1&WoJVVrf8vf?H7*@n#)r(HQpzN*sg)F zCL~bRIe=9v9p=gCy<#sjocBDG1CpjplB?;xuTJC~sPve@!1%G3(&oKDR#K}!n7{kI z@ZtCme;k5!=x(HPh9yr~QCU6cQNeJKPyw5xZG0~n-6CiW+|QuE-Yb1Sp@(qO=nDv~ zX~13pePgnu9|%b41rz80avJbQVSb7CW*!R&6=YUvR;%L5@77aHwpKzZd2wTwAC5Y(M`cYH9=)(YL3g~i_PZp<}HQlSHB z(3225-&_VvCDq|66$j`JNgZ8W;qJW+StMbe#!u{8GsaZCpB)BC>_-U~bYvn@K{cBh zNLP|t=05k*!qT8dV8t&HUuy&xChVRNYM)1%--XZux(hjJciuL^yaI&d5x^VINr%q? z+zIW@(93$Wlwc01fpk`cgc_;vk_e%XKzJkIJ7JOT%t~(&(FJB1xn`%B(TqZ+p<#+^ z`l2EDa1<>szd#Yk2J!I>+@tqhGF`>p*9JxmGn&!BxatTvnuX;MIUp!5R$8tZ=t!R| zlaX-0t$=$q!1W+{-X7}$ol67Dy7b7A;ir~?=K-(OAPRNm zeAN!$9^~aH?E6@#7MxRrCSY5de+1$~_#x+cbwl{EfI9=?frVb-Qf}`HawU+DR6_oP z_}Wbi+IHFfe3;o;Il=7o2%4WTL{<4L2&}zR(EqHA-tU5-m?_zh1Kw*F8t7bLD%M-d zu3rh2i5Vv1hn1P|5&kGuF6#K`3(17eWT8^00#!+=h%m6ahFH03?lzl;$WOs=Aey(i z{16i1>cLnjCQ6%T0qo(}TR*zBlw+3*`hEPvTvV24u1BI$;f5B za2&Se;v}pH7@Y*hX+I9Qt6ti_q`A@D9B^>J$J2l>16a`r;gS`_pLz)wgX#-s1g9hA zq|?(4imL!my#%<`GyuQl(p2yv09VohJ%z>jhKKk%fUqC;p&>JKUa0>4Ksv&*w)2OU z2FziXd8GpI@d0=+fL~q){&~QiDM~ah511_ht%62=B#xZEBA8f@O$v3$DcB2yn+-RlJ#X*;X<0(?Q%kDjOQlvE+n~II_0|2DI*6Z`V4f* zuqiJDELq#_A+UNLgaD4 zDivpGcd$UFm$y$0k)fm!ZX%O$sUQJvV!(;Xi7X-SiYqEBm^Skzn7ld!ll-ze{<4_w z4yeZT{+-}`>BlQ8h??)N^Zme!;IWA}M(tQx{fWw~x-fw|PU_@)epqmncWP;*iI3;L z%cEYmK(^y8LAW0P$VOWumvVbZ;^L~;TuEIYp)Y-IGYYUVe9Ug!wA(b9K`0BAHY*`P z+BgpnFBp9bNiuHQ7lm+o6rl0zuLs<6B`~51(vvuf$7QyJdGyWtgMgiZ_YQ1&v)5Im zFWqH|e9Lc)f-TvxNQ25I7cp8{bW*}kC4l9qRjRRxfJvt|KS-a=+*#)7-$%qXa)OJD)bE-efDlBjC(h&G^?BLa)=KA z;q;1R`BaGEE@{3Lg4#RJ8l>-_!6ZKkxCh_^KjpOvz>@7lXm?-GJBEjz5+7P3N}J#F8X#S26jEc{NqZBeY!l=I>5@4a zuo&o~BwRQ!Q}3#Pu-)%_j#mM%`HrWU)+>DPLx3FJy3qiUK<016zX z;6BOyM4XP=9`cba9Fh6Wn*#n^7&=_82h%ZsIUJ1)YQKtgsUJ1~+T_V8bNt5V4KI*>7d=vm@H=DZ!ls6|3t=zAE2)HdW(+l{( z&!mDU157t{A&bP%M=~mnbIXOLTso4JxtQ1-$#=k6>(3$`Q9^D?Je3Zvx-KqtDg~A1 zy$Ev%kP%h^Zb=2)*}!q6GHc0CR**tv_+~oZJV1=(jtoY~r;&=f%XZthjMqH&`W?)0 zCNfl-h-7EL`x4$Y@US#btIT48{cUnLeC|SqHaXnAFHCbM-VoGKqHmuCEZZbHCnpU8 zDexCQyJO@Jf!sC#h+arvIqSd-LPO4k8_VP72ROR-O3%zPfVuWfD)Wis`vDC`8@crG zZ2)r!>e!7S421^ST|9&O3C7_B@e!Zh0pc?pFs+!E+|{XJBCg9XHb&tq2kuR^(MJ0UCyXe6mKh^>xEuT(JaaDd)Jsg&?NBY>Qv|# z0i`hf@-(=02SVUHO*wZufX)%0M{cWR@GXy7Av{Y@^jl^2?+6i*Ab)E^j6e6iG6cJG z|62(f?5G9jKR+RqGlkV{$G;5rw*Mp%|E8~%Wrii)Qj^PP*@$e2J0? zlME}y=d-C<(?6=f!4l;bWK+=icJdR>%Wg?i`v0P=^9<zpo9U^$r{n^bW-<<;K*tL*>!WUBehZ8H)6O_8wLLZ9`bHf_m)p+skdf zSq$qo{2zyuJIsUJ3AdvFyeumEQE;iwj%y38Xkt#OyOa*SFeyKLL4& za)dF3{tSTMiJ(U%(MV7s?JvGQeA*G;fFRlvRhob({4pINsQOmn&X8^P7x2)7S=HL($TK|JoGGT#t3)Uz++`F=N67 zr%B}I9{_?FW^nRwLPB4(!;$!JQee*uOrvbR;SSEFsl6p7xfkZmyJG3dA@$5+zTcdb zfSd^k9Y>0_K8Y0clo;ABLgyDlC>-~Jr32=NfLTHXz3ICN&;bExp}nm%FAbOh&`F-b z(Ysd>2zNW&viV{FY>dGsa~-AReRGrf1`>33*Dw!Z0eZ}jZ1S{hc3EfpYV#`#pvZT$ zSq2dZBKej(!DCV*MQP#Iav0J+_OWSl$+Ho37kjlioJKhqZ*wd~k_B_>f=KEUNO5=u z=6#FHC^~L&X{+Qf93-mcGXxLfX`1g*+J(&8i;~>H(<5b0OyX_)@RlSBLCAZOP!~M> ze8M4$cT4*~kJ#{PKq7$q;(#YKPpdR6$@Wj7iolNeKC_CzrU6C*=l157NzPM+$^)*B z1HK@DnW$?%hyNDRa?AlnWLq0A@X>OJzk3dI=mhpHce&{9oZcU4>>9!9W;}k{VDHou z%n3rvbx7$?#nQKE2B+S43E-A{JWP~{KL0dPx~jH;LaTou`8ks1$%Fl3rUL*4(1p%dnJ(dD{5ikt5cD&v5hk-6WK>PL zf}y=ZHoq(IIfO`yXm%wbBH>!_9Q>995a&&I5zt20lh>=Ka-`X9K%~LP|0o@PVgTp& zQ)d9cy#x(RqH3CzNzlar@q7vezi)rzDDf5ic6zZ!(hT2zj~5?+=ca=@0rp)XTxV(g zzydz`8M`fm)x)Qd4aSzUkYVTg%TU7b(1PRQVv2^4{eN6pNR+w*)D=t8OUz+vUa5a{ z2;LFmhlb0VUueAXCzaK-t56^IEz(e^>t0m#boB<9`d!xt0(BnJMqf#UMZ&KsjpTZng@1VTq zS|HNkkClP{J;I24mqaby=Vt+<0RG-G@KOM$u&L%_alj1#c%9iN);lHN4M<^J^h8Dc zwH#v4tpP9lJbxiYF*zIaKIvp`9)dGv%q+b;SqCqg9-O}{Vc3K1-1e(I-A!5%M<3?8E9dw z+1~-eh0qAu9`^@@n z0jqxD1v%h50d%T!|6m3a16mL5N`u^Cjw#*{e3F*Um*)@TQGxt9`O2F zn0YV>+ZQlb1Pof7d2B#vVM|hA#W1ssSDgQnfHnZ%pAP;Dz`mUcy^IbM9#S_#x~pEd zKP45~1E?#AZJ6r_C}FzIrTDEsKO;X~!=V7mt$5~Z?gAnS{aY$@kB39GIph)ZXa$^B z`$;}|%8`cnC}+XfthE<-X15R~3H~8x;5EZ9@RRP8I4W;&#=lwtPcJ*o=wDWzYiO9Q zlM2Ahv>enGXZ0xgXFzV%=kR)S>~@-YxIF4b5<*v*F;q2~s$XdC&YhrNCSdfPDDW2mIPDE^XO(*z|>C z73L0$sst)m8ap)3>|K@Zgy;WJAgzcv?q?NnPXR~wZ5?A7*7ta%oGf}*(*SI$FhcfK zLS6(U-vW)vyQQqWN#-Zz7)~;8{7o4}CYeKk!p-5Boaul%P{dA6ro9}qCbO|T>UNUT z6qoaGSvgo4{jD4~;3hp_KlI0g9hKfBZ_H~+P31ORQY^d6O zTY$?UR2zM|%8z6XK--*2Y)?h(1;pBw!E)&x;DCLhQxvQiD&P?LY*}nM;WKu$ce00zql+LN6TgIDXr&Oclo{ly(fM%5$*tV z;nd_{#c6U$G}-TS$}^@t|KL~&;9vmGm~8LWAB_}qFBHryCB@HQ`k%kopR@9S4LRJqTGYepo9U%<>LO0jadC<}b znPs>#B(%Uw9BGLgiSWGMl7_(h9Vw4Emcvt)HUiz{&$dXNgT;1=Kq{Q~2b@b41y2MR z>v_h^gi+0M0Q>7 zC-%0vQgI8)RW3eqhk5Yb&%i)CK))FDvcmR9=qrdv9C#@a@{yM({7)u~0q-P2{@R}> z+y)pcO1+v};$IVxnrBIBEaO20Oe@ZUM9JrZba<4P5YrC&c4osgnM5`L5&>+F19sVN zDfqTa!R!NoGSTz+!yJhM+TwsB0Cx1AI6=qn4Qap|0Zc25{h%*m1=*j|Q0q^DJk?B= zC`NzabD+1lIeO7zS~izKxK_k~JD$)L#na(M+5F^=fy3)!@Cd0OJ;chHHrl)x>h1Jh zkSz`N4VZnNN5kVl@4n%U2P}QSlRFPsSMUA8kR+2q5+B@L{zZ}e!La2hc6%|DkVY{M z6e+`+<8VrZLv*xqMBf+=(Kbhf0nKF{@mH&12ptJ1T{OU?=q);qfVN6()0wfVokDV$ zlYyk2);iQZJ^k%O8s24u!3UXZ4ERX~+Ee74D4R`eVbqb5#LlL7sDy``+sI&R4 zDD;z&e*@oPQ_m)9%f;G$Arv>Az@)LU#Pm0<&r)Wn@ttyN3^Tv^I~lh8h+qyO0;l>y zb7Xo3QpdCs&I;yFrpx2m{t)ge`aD3RA0H{S4`h1yF4m_hM-;h0zAXOjL@q^~`Es0{ zB3303_zw1^2_Q{wC36Gde2_w)F}L4!Rz}YdZagjAQjq)pBQBoSm$`sD(AqH_%&sUQTC`Ry2P}+^miR zE)H@89~-|u4sMl^{yTBF`alm8TrJU{pD}+Xpk2`r3tpzS#}Euw{VXFKblI-neO zN#HqL`5`DxG<>n5<24lJzk>0%!C2fRh#KoO!E<#Mtv=>U!=gIC>}rjL2MbwQye~}y z4gy%AG#m|FETOf8P%_=lYAbq6y#uFE#n;*D4J*gdA^2_v0g||QQXKkj4J{$0SdLJI zEP&E9$;E4<7yYNaI81+^9kHu#q=ClfPC}HGZypD_Ja*4rDq$OdmBN@V{H)YC{k-VCc+Vgw^{Sra3bjf$Z z;~dw~n`IQIy_qM-;@k_>EK zx-VLrivfuM?u`Q;qdau0WZXb|$4b6E-k_Jr{{>V!=2z9_Fn>*AGFg0xrD@kh4u+os zIQ6oa9L8PExHQaffuS?@G~8>HD;;&{8!1~EY10Ln#>F;lNxlu}^4QI9s)YR+uyNMB$z z_q$J}Bt8?ylZDA4#p9XGTut^fVc4rMAFF`dY;o~oSd-+7mKDA@23cnN4(B*zH`T4Y zjL~N9aEOW^iZkiNnFKz|H?tk^Gbbn?WeN%3#Hp|8@oF;HA> zCW9y@BET-Mh~2;fCXR2U4}MC$eUU&DCmf~67#J#lPLPBG`DNLhdB+|}*^HO~1Y+k& zOf~R08EN#qxSmYgN4QkXg((>P0c#_kj4M#g#s>Ol9?r8~1WKRk#xSSuQx3Bn7`n?vT@iaq zSi?xr>nH>1_MZi9CH#-dNs;W6-daWpK`#Uvhu!7He+C3_z{(Tcl|rCFAkE{z#dcCr zVz)1-dx^BG_TznrOZgHg-M(rWZu`G2gmM9)V?FGYKT3lBK9m`)0aSz)(W>60ds?s8(O>}YwB8b$ejNmp>ocJI~i|& zXQFg8E@1C%+F)-V#W`;PMY8t<1aIAM2!hFJ1Os^#%bZ;v^$DQDAqE}5doT_NyAB>*!v^SiYw++FY{(v_A%Iv}tI{ zcCB|DI0V5lAlNY@B|mQgGkp?lhS8BiGo|u*JfUxYsT)xTOW6VQ8gLl9qUA*_iJ7>V za_4R1&6tDYWet$|O2|ur9NGx}Ln*-|>$@Sgg(6+Qy|c4u1AfCoZ>vl8oIt-0plMLh z`P>Xp`oCJIUz3oi)`3d@3{=8EwcEkNF%tIHVjO8S!}!3?Lfl3}m=tEa9#WGGW$e0> zaB?{S`rSvVp)L0BR`8_ybhF^5K-99)Q5{A559CZ$c<8JTBP)+5)LbS{l5N-UFYJI} zbgT}iqs_sG>|lmgWEk3*^!402-EgKyan~VNYLTL*h-Z7mYBw5#F%_xFypROF@lY_2 zGSZ3U5W=`&TzjYDrUEx~K{_bn5r?y6gYI}cy^mGk<7KqP-%;wnLF(Lhg#}N{UnUpD zCx=|~QBZhyGrXE5O~@>N_Yedh1A+6VC6m3fv^kPDxPhR&vxkMellb$2Pr09yCA2Z6=jOsQdZZ)qUkjj#ThEjvK_G-$_E zW=vr|ie}`Pp%f6h_F>XpG!&h;ZQqK9xzuj>Vr0oYx6?Vt9zIlI$8~3OS(vk-wU=(c zc$@YjYeh4a&H2Di=d2y;x{rpHY30^@!f8_%%rvtrV!MH*b4^@EAJCsoWrPJ1Yp{ZFJ&_W=D-k2vo7e(kpP~t1S`#BWvH2A7BFN*d!K{k0g*9BL1QiL zy~Hvd^=F{yVOTuN6%ELehPV|7(L{a6Ddr~(B2{4BDdzV`sxT!P%kbuLUW*9g3?Nuk z1p0^{NTfCk_x<}jpH_Z0fELUbvJYzfO#eHBz(tnwshO|)ex zPqP6u6*S`Z@HgT!6w!f`D(J&(?gNFi)HHQO5=g|HwiCL*qY1)qR`VbUIcw5mT8(?5VPGWL}fzxR7=VchhTl; zn=sfZ^_4(bJH~Ne1&-y$5pC10MsdtJz(kDzrKXsNC_@VTIl#k`G4WL=SngU64BZT< zZQHtBYVbFNrdw>13@Sv)aonFvS!Bi)(Cg z_YvE2$mf8JYG$*2YF0uUi~0soIz2|7zfLiaGDbaBnm1ntKxIdt%96`U1ZT|l+ND#h z0|l#?j&7V|^-RYv0N#znB(a|Xq+>M06mvN+sw`_aHcs#Y$*M^4_7hdvbOv_=?FKf? z@Nofu243oxY(06>6tn9|PA6@`7SjogRVIe|08nAA+AN39wc=wLW&$Bbvc3(Tp=YsC zKgBF#6wg=|r+&{zfKg*ujOH2}cai={f`>^vdY&pj6w@a_D8?L$vi4+aR<-Kk0H`{C zU?6i}2!vHMin$(`(5A|1-h8V>l)M}8s084xS9>>QDvNy**icfC@#8HqX#wub!13o` z-GcRkQ+72g+j|F=JIL1n851S?F+e@E+2n{WT0lY~plbn=Y$)~=Q)sn}Ik^!@<;v+> zke2+MJZquj$LVvBb~;#-v@WtNgCd;=pjX$DehN^ho&_#F)d>k0tOQgfa?KNQ33QSKt)sleD7i>Du5ON6;ZMrJmGXJMbgWWRsjMy7XaZc>8bB^Yz1KO z-&p*=3;i%P{I97sBj`u=@_i&7`**~+!BTM?cE7PdI32ey+l$z@8#lh;=y83$9obdc z%(zl9Gfw-9{d+`rXGcR}wYl=dH<~JDSTmwKZ{FsFeR>}jN~m#*@Qk7a3B_#gY>2^K z>FhYTQfFZeT^d&!#FrxTM`Uv=@Ed|EZeN*M`MOMh=Q!F9!ns>rcOH70UC1vU*FKQ% z$ClWrF{e^k%FzvT^X;9+>a*)!VuTSJM^vpUn5vC?wbYO8sy0fwiR{z-7 zs!SC})iOoOZ6(Esi`0Q0}7rlx^)0$HMJ`9_Pyh>n?u>NIg!eKS2ACf zYSqGO#6(VqA=-=Csku&i7rzLdg>GAHQHghX$x%&{*>GgBRjL0{E*BSzWZ;h8b|rdc zNMdj{`-lbh)W4{Os6LJ}X3B4ry*n=)7yV?<4? zx`J*oMop%m41V*ItbvOzig>Gg4<@F&}q#hkb8 zT=6g&P}P|h&HsgfPdi%GaLv>;aRT$%tobi{`_AdpHF*;A*`WCgBX^EZM)}zMkM1lV z7?~B?rVLJg$IdB)ktD08Ru0d<({ZZm%26*{Tz~%U=qS{ihims-FHV;&XS1Jhyk`G@ z17~#V?DE0(zDBc2+1=>bdL4CmV13IE56r2_Y*r5UyiQKkua(7LUMDLW-jzko0nThY zRX+6WT4izg>tsb;yHR<(Zzp-7OS0Kbn=<&|&N7-jNf>QV24CJuM(C8nXp1s{>5y&Lv@GoPZ%{TgUvh1hNdOF zY|#9>9qhEK0vN+iOZ~rS*crgE^GnR@*5~6cy;@ud?cNh9HL^ZB`}eAVT4lVUzMKFY zB#zj)>m55T0^ii_&Gil#%XXahqDXYof(vcPSzNjcQ;$}KW zCevOjn1W_`B9Zm@YIwvre)U6# zvWYsgmS3~-`9eCs9Z=bNV)$$_)<}J3vvT~(yPc+0S^jbe%-31}h3{eQ(9a8rp87BS z5jBgMOl{nbuPr+pdvBDo_)5#>Iw8tzQTE%sm};;cv5|OsYSoIq<=ky7?e3$zYNhrS z+0H`7RBzntbL-ggt-CBg!-=PSZfmPHO#BGilghh`x zwJP(&W4vsvS;xX$7(QdMf`!&4xnXV)S!Vo_hW5wyi{PczZ1)x z+%;%XHYLx_XUEl`;(##V^$4n(QnDUFdx&(Ez|7O>K{7vCnuY++y}0PIUfG{?gwwjZ z6K}{yZ2Te(Tv$naF_Ff?tmb9=`*97zv}o>U0xq=N)KQNZLOmH0EKlv%`K~U)jpP

ICowBJ-4A*_EO?P?JhzC!h-ggX0#{X z9$>)j>*~3Y1ll_Db1~FZTFcf{V!5QkczRhfb*kd|lf0^=DH&?ERS~~iq(fsEr%xz~ z8A&^~kPbTC8Jn}Fo^d;-&!Q48oskvI232O_QC=zf@I4GnhJhWZQCC?I)N2+9*Y9lk z-PJ&L;`-*9^>tdUzkOMj_8m>LDs}JCUb$>vwx2{Tt|w7d+$GxT-|!slLp^124>cui zxi$5VV?6R>GEoJU0}=FCVyki=`yMByIs;bBlZ#nX|7YUw{C;WyQ9dQ~`thbwIjl+J zWED?L#!!Q@oAsLOC(TZes)0tTg-z?YAXWXVOWl;lnEx^j@EBN;!f-DmtJN8P0Su%) zobSL=x|Rp)YMSn{Ma&%lX-8jMoJ6U*n8U+LZB=F7GR-R$9nY;)sK!!BvuaU6hn2w` z-NV(PrF1XQ)SN^lO&H#kBocA?>3&wN3cNNDtYcS?cp+5X+}t9PwVR4)&lx;dDCbSe zaoluYB+XTkvr3P1&h+JRp^TbqqcS{kX26&$4Bdz;Of+qFwFiUE=E|e0M4}~3EY?IH zu2&M$PM~UVUp5j>#5pCR~#_%c3=!R^LBb1n0&D`DMnJh=`zPXpiFliAr zY+7H}j!7q$O$d5o3Yz(`Qyh~jUd=4FO-?Pt{nD{tTWlnQ#o5#HqoL7kQ)W{aIHq0& z#D<*SvPkbuEWkr|)1qX@Ep+5nxc5y0dg`wjjned-jdI1!fp3l}m(dM)S7Vwrd&i=3 zY{-i_h^%9c!!4~ez_Vm+{gKaygUP5dF##v%bF=cMpxn;`cO*-=j8|%{H(WX^|90je%BCysiFdDw8dov$Wn&QNL?xW_1R^a$B;+ z)-1jR)@in?)ZI>Z(lJFf!bCLdCAi?bs%mXht2wTHugh7L&3Dmca@#ub=?4&bjNN*` zFnY0H&oFiEwS?qU$Gm?AMHc{^k(Q-s5R2<+?N`;8=jo!Y{;=Pm!*U)a=&3*B5uR+R zBx4@spX{KItnZW*@Ao&xMuu7Q=S^MQvS9x7RSE zVt#Odg3GMejNb|vh-IUhM)CI@aVS2z0Z-YMB9eN>Y|%XT26+coK>7lzV?AezE)Ki% z-Pr*gmYJ=ZXP+fb@xs0pTOPvnYS@8P}sqaROC_k)}^Tk$voTOYfY3`A2Q7(<|_FUpx z75dtHMHj1zW(tUBlh)7cd^&8qLKm>lVFmd=yOK}MGCYwEZ4qnaF#3)eD_Dt-?% zV-*TdZ@EE$w*(6-sLm8q^;oa`E2BURJeZ!)Yj*lKz#N69)iN_C!Ruu-uwO%yB{ zgAF~>>>T||yT56IX#PXX=J8P&`+Ax+f5H6u3(b0E@mj!2hPG&z?n3YyjL{Q}DT(ao z^)Jb$UPP_S_M#eYYhIRy8RsRcftyaczeWF2{;ouRYJ`dWUHHr}^QhIl2LwDiz=Lv? z(?JhwO`Ybs5grKXLAASL5>*+xh_wBQltLeo)C5YQlSpbjrL>pu49%;o{(!Uie_w z0Nt>ro=e;zJygxf{b*#O^dc>Tp&T({tWmeCpr5aE0-Xr2D(!5boMxL+?Q))@u9`-& zXUP;oAs-!UfJNsjK;d;Fy}171JccE?JI1X~Hh6gpgiC@Td0H^u0^v&uwe@7UYRN@x zM%wNCNtCK%bf|2hJ(EF%vI(YE_1yJBukS#fhwNL|iORgYhHk^#MZCK(TULo|Q!M}v zI7I#DFi{4|60kNog2`@yjTIs^kRXUBXLb5Qf13#5-fnG7)nf&lYZ4$1U|c zRmYL$M-P|zKy163;#VJcCP{BSI6ULVGpP`c5U?$=qF!aTDU02&ajax#*xHr@g-#pH zEX(rlv9+?ds{KCY!ZtA> z%7o*NSb>%ykPN9fmA)8hYPB#oTfURGv z3=Y`|M!BGx8a4lQo=+9fT(rCt&CQ%nKN@7b32hl2S3btrtPEfFj8jS)o7==4^IA#Un&Dij&C2S)8@%O*#S+yrktD|N2Usu7)G5cm zeaUgI(#i5R9luxe0Dk*gSrM(`)D}(Qbd@L8yVuI#&B(2awDZ-&id@Yj&68_oU|!9` z^mdz~VH^uh9#U2@AqF!Z!B;UM1~N$zA?6AuWV&FcSWQSfQ=pHoqBKT5nK`Vp%zPq~ z1dl4%=?=!T*%hV)*I3B3@w)3RVFV|~zQ|?F{qpPobNWGB^|_;CyVF*z ziK}+oRLgU}_1~qfE=6^at7uKSg5_}XxT&jG$W2}R=Q2%Q z7e%_O%XL%7-NesuuI)%mr_wfSDZB6e|4C_WO~-f2sO-FYvYou3CI0<=iIQIvE(C4O z*@@Lwp12ECU$**m5ryjG$&MFM7`Swbv&$qN%9ubPJl3@YtE7L+faZ&e9=KhL*z@rJ z#-a{2+W4YUgDz+pFL^Xk*2}_bg*OxFgSNN&YPA)w)rxxe)he|v9!|8=2Gy)xH>l>> zK{e|x(?FV&x@;JoxfkJRxJ_=*lHTJ>TrIaNM{NAlcQEhKWgE1*8om#M{=uuwTE0)@ z#|9iQ5l6FCxg7eqw;x^3z}_MX4Xg1n0&l-_WK`_{d^yU_;e4~Tf(m#I*45tICypFV zZ%|4n6Uyq9!kI5C)o7LZvsVgR`z`GQJ@yb_v--c{Vrt?n($2cgy}?lfTxTu^KHuQa z5v&W%4lI1+2}KOTWIQl|m&~_`2BIZjzs{XAurhkqfVqJU5+#Q57)qaR=IH`$j+wG% zniZ{1i0Cl`Nk+S)TC5UPl?p?SP~ny-XmrS_?nh%{<7wilen zS~c%$-psx(_!y@%KS0XQFy=2(6W@Ev*GLcUoVLmtANh)+7n?c2PywKp40zRqfX?il zuWYv)lAPq*)Y3#Kovz3nvsD#1;%TRd<;s>AE>|3wuUI%?hG|qj-}3yb_)Io_^Cx;) z1}C5>Rc-y(aCGQZRi=2Qu|?S(|BP3Yx;__m2Ux*-ZdMlGe4VT?F>Fy5$3Oe}w8Fqk zdlk*f=5L$Y8qzv*kXi-OsFrG1Cj%ieWnZK6d%iXbtyJN`LcTL9&%TZ-= z*h@Rc3}<5K^G-=!Y4f?Ro#PIJ!o~mrr(4k(i%pkOTpGsn==1>AOyQFl(UD0 zM3}lgzUVqI&^+5;7{C>9<@Sb`o$Bd)qU&8Pe+ynZm|D%+5U}7fjo8R#&DaTqJUj2` zM9)f<;i4RlgqE2`Wi>ruNe*B9=$QC>gVFSAS~Sa{|8xbaDiwP50i(DVWV1GLHRM8? zUO6NI-@rv=&r+_ynnq>zwtso1L*&fm2eP>L)m}7pn&}9inXfg~ltM{FzY@ocgSe2P zgqw%VQ0mL#LZqd8;gz^{di6AiawVk=aPFn-5h5U|F|SH?9NyX!cc*7{t|U#A_v5AL zwQ^6h6HVFPiWq4xZl`XNP!UC_S+6pV7%`MA=NLyDpy$`S#%*eA-Ri+eW zIQQdrNj}4#m)S+Md*zKz%PPEN$rkCBD;%k3^-fUnsd*A@U zO%;%(frBal!on@(1aBByS048#ur{{zb{T~50=aezv@4;d-AkoG)1^w^bVrTp$0&od zdAu;1N<~5t3Ms~AZ%!!=y2NR0ExIGar*S%T6_%FtT7Dbr$-DpiqwT`1JZh2h=+->E z#V=XYW+*-;Bi~fopmNW7OGG|>wwVVpW>i93{qiq7$C~=>55|g>!MEfPRKoH$>y_Vu zdw9NG5IP5!e0bFWN1S6l9DZV&W%W|r@nUAbz4N5)v!M@I(Y+s?9 zH+|w4?WLsvSEqtEzRfE@B2c;Kt*a*)RS{l*pRe~dbNLb$0Yr&yENbFal(toDn+Dyp zv@o;~ZZ2FhGz?z;QVS#|XcMG*Rf!T;zgkG!Bb2y}65>DxE7Fnf=c4A5c zv#2uUcDp>tkf&y`^=dAg?L0eM%oDM`P;jfo=#+yXCf!+SfSc4lyNvX9!hla-Tm>6x zUQnGIgVX@EJe40xl;b(foNPSM%j(H4SZlf5zAIoZ&Ua9V6H}{_GhPEOn7aJ#C_;;% z&V$5xT6!|3^nzym+VB|YW;PVSTQMB?ZqaOA?{F3f2MZ!yxFddK6sEXqCB&lEhQj-weqXO7;`+k7FLVv9Lr(6 zU5s&YDw;NB^UMyhqs@y>TxQ{SklQuujR$*;XuC(dsJi4eJnq@Yhi=-@4jW;(Ss9u7 ze-A?h`5EXXe@XeRI>hm%3#WQNp2z5R)za%ab(-lbn(eB=qIWw@!m_%K6&*U!!jO4(dr6-gmrR@H|4P7zGTUePeqi$56T6=s zcn~gv?+-H~8*Tr^{36}gC5&f+NL#oPm>KB6GjZYc!cKC6I^&HwOqlGUf9bfHdJL=M zCbe`G@LF7R9k>Izop%W@bsE2t)y)6$Owc$m>h{FEM)qOp%>_>@@xc##$(O;yB63-Y z^UQov962*e3VDkDr9wJy(UJ?PpHG}$+PX4aZ8j1|b{wNx(gdkB zI~AX0G8>f7!DAi2h!;pLIpkMUU#2nx#-eGXa=g-W_L{o#48OGm0;b`M24<7;{dO9E zw*?c`*79iREzN@=&<(a|?uP;{{U|f#gB!>-9ly2YxZpOove~BDpGjfkn@BPvp4Uy~ zcztHO=G+C#a=mlUhZoTTph0K_((}I+?YRu%>uHXQVmW&wy^hwSk&0L9?*+Lqp3(Rl zt?w_FW7A6Oo~<_fIIngGRgbdam;usb%QBj;>jPymYm#T>njgjru65sD0GThb7sRiw zX0gEQ3vDO4uAU^L?E%*)tIM$YHSr+eE6Ey)*SMxdmHE#=DZ1XnEVX@L$&+fMhOT@O zYmZK|Su-DWq%WCc!UMGyK|3wh!08M-c(hk86VtdkmFRv?N}+n~1Zc?gXHa8ACt9y8?oDH5cQE2bEW;UnDrCJ?S-y30is_=PeQ7%e`<7{dkd|WhH1g?9 zoicdS(T-6SVkmOJ3p9*{K`;rO7I-6GXM-Mm&|dth9zJGNKb?Du3vwYT-LR43rs{-l zh?(2eswU&#<2AC;E6%hJ1fZI3{g4x>ovM<=YGQ$o0XtHI*UrEV2gy3t-fKmU9n>jJ z^Ah;+obuLp{2AX*xC~ny-vQ7;RKcknQf}c+$mn8 zfjm~cR6?yS%T2B2x)*o*_@+ceglldrt3_oTb-b4qwgmni_*F8tL@HgJP_?|%v##7Y z!#mYcC7MQv2=h{ zuA^$ZP%qDICBl%}38=3iHIlDAlr__=>3D{Y&2}}?z9)NQVJU+xDZUqheZ{GVVy1I# zANy6^t;dyCGrvlbFuBrb~#8=^_)6d5QrcLwhy2Mo+XOoivFO}9`nx$4r zJAy3s=)h;d5T*wavW7GTCBO4bC#g!$W`d9=Dd!JvnM8Zu=>o9fTcS;LvsIa|Tk3`A zbin(w>3Y&9XeinNpK7hwtiSRsI0nknRpgLfO_^cZ(##ul`&oCCC%951?qkElBtil!GaX1j_T>~Ugci$o_lwpP#ZtmO{% z)+@7pdOcG<(9%6eI{T&mRgD~WXT8Smtn1!Xbejx>i*md_Q>Q$0o;Sxv=M#ls*WR}i z%1b*t15(wE5(;pL5oV%HsR`50gV()PIc{85S*;jnYF=TnM{+g#Vsl`jF5F1$!+cvbo0R*Z zIWL9QvRr!-(YdC+i-KYz3Kcu*>JNa0`t5uV4hI$}7;dfa5l)SCR{?}@2$cQzycjwp zr#w3BQHRHFM&xu_o?$bCt(x(eywlT{2{SN=mLu4MAWs``L=xQr&m}Rb*+Wqd_@F^4 za5l;l8*RrC4R)!&w>!>%n1%rGRmc`qU3_DxnXz6nyu+E!mTf9_^*LTVTMcaN9LYl9 z<&n{xx^Be8oV+1~mZLsk;*ERch;6C*3z= zwzLd;a^j~?u(^N6*EOTYboH*{=}{+xHf6bRoo7v99v&c7?R>3HQde(LBAV6K|LNCg zHX1=yU!&V=19h=h8H!}drcGttyWYt}R1=t>O%8ROd^b}>dr`=d#&ok)89nD2a;yq2 z1pBsfT;waaTQ7KgKs0zr|6*^}(;!elCqn#W%r?bd@j<7rx)9NG&~D5$^kqA&%mxXx_HU^m4ef|r>s(nMt%HP53yFYe}{Mo3mQ0v(Z|YIy2%e3S$3 zooCH9&3EXzPBsUsi0;LV8q=Mbo`+YEr>KH7FW^E2YOpvkouXBlM$LW81)d8{;O6W= zeZ(V5;Zn@5=!G7eHRs+J?l1?eWJHTP&Aasy$D``BrR~(4uteg}IJ1}b)9E9>e#9U^ zm&&SU3kmwaCKpl;T#ev23$_^Ed8Cji-j=C_%H}AVAH8YCz-ra0z09lCzk1FIR5KcL z7&mY25a`^pVc3rP{DQ$8x1w3oRh$)5v%!mtTt0IpT3Xv}Y z-ePZeceaQqaJ_j`tBlXO!V5qFh=2@-ag*)X-<#8H1jXRV=2SxAB;jSeEoV(P1!a2c zCp>c=nik8dTF$TK1U?b~&~xd|sN4qn+?&~~oO-Tw9QpCp60}WQsqyV{6q>{R7BtUI zSG&AbIk;x1xgNQ@)=#%FM{Jxi63na-xW^IuP$$}TKLMZmHk*~#BO4vhINic*5!NGP zBTR&no&7mSUR7F&dwfJRy)a0|MLZ>L-P|J=;$>kw*CB8g_RtOxf8Bq)4 zwGNVKE|lZ|1X^$DjiWm=t(%O_qHIg0H_rP!#UyE?NThH~=GPox@9T&V`AP8rb=en+N}F4-)Fr=B=sBXz@2 zdnzrdGj#>_OL(T(s@i<;R;LxOZo>{Nm!0B#%m&T!<1e|a62#C(@6PB2Y%c9LqV zr&Ki;XeoXE3R+TWLhh~97|m8?d)`+Z`|6-?gc-PLj3vz9=EOwGU+QMZ4}BL; z_bBQv-BQ)C%s=`=$g~?v%|6^GG6iMzx!XOEdEkJyCkjUHt-oR{E z@|(Zobg3$^6VpSCTRNUh*zN~e23r7Y@INHI%yUr0-{Sp{sn z!wHHoQ^$#gxT!I*1rgzEEU!&l(s}yJi*6rLufbMk%)1bl>7n0EXI?5(`cekZvvPPD zNOm@jn)_{cdM<*Is=*~m{gwnz*L}VH65ya#T9#X=M)%-+H6j2SI`!NvVzSq%h~EaH z!s^l>ndKUUa9YsY-Gf%4EN=du*E(dyFD+}hMfkSWouL7A0UC&%05)s(NAGfM(#ZK> z!)#Nc-`(wqBLhb0Q+X~lWwK`5HQUsm`0RAtdjjs}(mY@%3xZ8+Z6(n4I)BJKiHU;e z$#A(@O~cEGjXWsxHeL#a_4;>M^5hf{~wq|Bwc+V_DJbV>?;ZMC11Nv~(#=ho7m%KhmGNaaCG8;7eUO)G2 zuz4sms!Y2?$1h2tS+ia-BQ0BGk1ViV$rhl7$-K<&%v8SBjJ;FbfUi?o*WT}CVrMji z9V@W4pT)ohY?`GBG@Ivo3R@iCz=$v&Z#F5%tq*z5p?mSIxO>4xl5-`A;TnEyTW6tEBHqgNcf9#fv*Cgn*s! zS}Ci%&C2ccCq36fh7PKz zjb5R_U9qabNGx~#vEZccR>j*Upuvd1>8=LK#a&`Hf1aYMt6^yu_PC`jFX@ANvMDuU z;~wjf5an6N-C1{W-fCkScV|w(!CTI>sfJ(vi`SHP`dfpR(JYOqx3e!RqoHqXVtd`I z3;Gm&cw9G^UW8WOQY!akvqc52d)f;o>v1EHKGmj;mrI|N;cAx)OP(m&mF`MM{ZgWo zZz8N$Y43m5OXc$_@Hjyn_Oqn#@-Zh?gUnEV%8k|I;kLxg@jYceEst;<=J&`M3_{ z5Qa~YOYwUo^!}CS2_0e*J)@@`{#CPTKloyLDZKT=n@y@NZF+*h9(1T@vzW*6m{M|q z!!B5QWP-9Pdi!=4v#YIrRio2i_L^}3+6H?mWT{+b5g_(h@GQvHbd^9UY=SmYzBNl4 zt6A)&F7@%~{FbYqZRW0c$%QE#poz~q%Fj_CZj@q#mTBUO3<{JvVX(h2Uz$vt7Uhmt zeUa?2f(0ly4PK~Ywatm3lB=<_%+gav4mv~S@Y<^G@oiywwBVn~Y*Dc{yynE~zBQLQ zwl7Rgy)|;gAC`)IwuQa9)jR_uBA>GSJs#KDxV~)n7T&e8^}d)5W}&Lw>2Dqe1j&St3smGJ_F-=3y3l*-jgTP+82uC1*?cEFR%J%LB zw!i1g-8oR$!zB(uwSHaw`>;l?8jx)`?16K#RLExVAcciv4}8&jtg018%E2vRvT&RO z7~TnAEV5st<0pXBsDRTwJQ*5k_`tRnZdg>c+j$m#KGLq*A_wLAIM1!Iqb_1+wi6$H zN3+Nltdpo!y76s6)l##W){bXoGEnmdG`|#F$PO1lb;FigoA{GDT+5e|SVD_^TPQf>SM+`y zoq%}bh||@k`4_#@De3v>%9T$#T(y7p;czUXF}nee^fY_BXA`XyT6pP(Q$cBd?rE#- zVmU2S0cT^|l=kucyqY!-&tP05(NT_yD`LT6ChbOT*W73BKNJ@Xfx6)nZRMWlKymdf zxO8pGYTf~kWfkJ)vM142|LEV*tMfM9!)aGm9%d`*Eizd37Uln4FJ}iBVJTy_YR+#T z_+OxDXK$&1&u*D5%KYksoDipGTHSWE_whS}O-jF{Zg~0Rs!p3yUy+i_TQ^>Vw30y$ zjc&m9aAsK!lOW&w*`!SV7BHjUNp%>i9?dR!&B3DfY5JF*FeUS%7F2H~8$867R$^X9 zyuN1fqBRyFsi6~dR3kKQ;ksVAJ?y!rC;{@WL0mZ7rc_ObIvrA|(E_10XJ}T!TZ0VZ zokaDq^qZA#`(aLiKbS$YZ;`3iZKeREx69m74M2LD$Rm-2_DD4XJ_FWCKCl&b{U|TA zLj$z11#PW>3xjL8Px|`BAsih+(Y_ds9cU+TZIxN;XvfrNAb+AY-=95=N!yg<_%V)@ z=1{7jUb;arVk5OiFFf8h)yLwMNwe~pAMmpN6dNIR>`)GU?W^fdL5t?SFpWpd-RC8# zUKMgT%i}8weDEz_?BvDJ2IYCr5w5Hhni}f?Lc6b3!5`uEdWh1SJXrBCihVD%{RADo z*+eOu>$?WvrC?5`)Z%)Yf~r^0Rb-x+d6^Nv2|}NCXoViraSnm~G1c*a2B$0Eg2^y; z#6}K5?!yj@uonP%%c6$;P+#R#JZ9TK78DkB%6M!jfDZ6E5`~+P@4?rJ(io}eM$LVE zWiHWH)0?9w2c}u`yyEjlUfWU2=T)9-`EfSnE6=A(BiMU0k*wb%>))Zc zk&WhenXQ_AW}~-zA)!dr<&mt5ay&f4S8vh0SM2}~tTMTzt+oCi>F42(Vrg>W z=t8ZEqo9x)bh9$@F<}O}T~6sNzCN8)oSROikS=^@vQDL5?xp)!E7AQP-HD)`YkI{4 zbI0T1I}yOQl7?oJvORy2D_mvvDf*&U<6~d_b8&i$FVG5~$B%UUXvqp)=IY|eFIjcp zNAG=5>xwivXG{CZ%$oX#9z@sm40O2By}|fk;|i<#neD36HAi{f6ert~vgnn{)ksiW zxjkIb-Y%>Gl_|M^(1z1a2MgF0*rcMKd5;$vY|2DWj>`(*?IRf}xKepk;0P+DMEt&S zv_Cj2uu5jTD)QA-EJ&vDA$1pi^EeXtdS%u7io6xwuV)Khpd81-J``zFAesG3h3+? zf>Ly1ZX-6zOuUnqNMz`@`k7kQX?$zCZnE{r{sC`^qBXLwA336Q{ghAWz5YZ+$wfgTwL#YgoufWQ@Y)7_jd zimZFDQ>bbgjvcA<&zGY}Y(l{KCxH6K)P5+b-bZ*Xns0>i3RcHj+Rn$+$G%V89gw=W znygn1o;bs6;zjEowiPYcYQ!^NtY-$ixX}1$v>;J9IWDF~l_m0-J)e{QKOo6Cm1G6=4z|M>pl4GNl#Z53_STo1PS+_Zhel^kqYxYszz z!3Q^~@d|l#gPdV+Q$~&Lo*^y6ccoUtZ7e=dMjunt-nH_hC+C*URYS3JC+K=H!XCbl zF@-HC9u6S0o{rOTm&&r%0Tse`%X{m|RxzMQU(i z>&z(RGd-q7+3b;Z1&NfHN#Wxz%3&#rc+5)nk|#$8XhaL3;`p4HZL<9fc%P1++fX#0 zPGh=6NR$30-P@7(;SW+RNMokoo)2t3O+LHWta*qOOz}cV~ck6K~rZ5=%P*_0E zpaT(8G~>rBGN?K?WB|=|sMw^ro?qs~%NHcuc!ZGOJ^Wh(+Oer(JFsfF+Is$QG_U*o z@CGyRLcB3H=46*^(EdIVy;A>D1yisH=Ee7JM+#pZ)*E?w@6FlYg24~5P*>?wvGvO5 zAD&;FnD2ub(=UR%^)Cdc66zAApk(uN-c)v0r1}YM73b5EFUb+JY0=yZ@;lCDo>;a` zv+lLrv*5N1ZxtUaX9tyP1j(&y>UXE72Ha0tq#E6<8Lh;)$}=$~m^u}4zZd0OXSw{X z*#SQ6rFy}ngvU0xt)UD`MW=Ihkr48Ub1$4vce7Z);F_A!{v*hfq1S*k8}ZdV{&qR{ zFe-G62|jCC=)>-sDT&C7^)I!rD4Q}H%O$L%0(CZM{^^6R2vyeX_#}L2cDzpVX4l>m z6&cmMn&bFUm#M9%{^d&oTh7Bd*($Z=Op4J+kG5J=iM3vt(4OdXdP*dQDXq?B8q}(q zcjsu&&iy@IAqv+eeN zm%WNFgHfNoMdNPwc5*~*d%VQgV(j`;#+{aWKkh6J#_N=^n>zjO=fi%y8}eQalr66k z#Rt>3JQAlq>6p^#nW^8SCEf&kQg3i|7sgWy!96Q}xPe^=q&8^EzKvz^RNuqYgNC_ovq6Qn zoa=;F<2suR-%}RdB{pj}lC3+k*N-8pC;M0eS-lG$GikxtcHa zvMFBZ*o(p})PcaWL_BdmWr;r@WMW(*<6r^L6|y#~*{m6^+2Eu}UpLlGJ} zNRHEdk@+!$NZO<XhIXPiO-uaQviRC>?b{I5*m(Fu+|5%~|zP zCrZXXIpOnS3xha~VI2{xip*cDIiB=6`Q~o)4sw61gwvUWR~*}w@}`eDSuRY=h>d4F z5?ywC(U!*vc-^^K^A@fc9uND~mT?6{aBvT6DbY%wCqc+$JioEbZt+aL^c=P^Ku#?Z zUfX6R+2Tprosf$tW|#8v<`-}$)@J+b$DR6B1>Nj^oECds^tmG*&YY{naJP3P)mdK5 z^gg;bWu2aj!<;n*vkf?TVYqt6frG-EuTVkYHv z;D^qpSy?<3uyQ)c8)@c7C4vogmu{%?oks7_w<*i(uJT&Ge%6ch;ml^``t_?F_o|hA zV&5VYT#*yCS#7o`mt8l;xwX|#p?Cnot%nnMenkWFJ$NV|v9>c;Z7iaR zijun>#iFTIDQ9|VUPH%44+COGw-I%eC$BLw`F?r`+otUPGhmCsUmp9h(p;6i>*=^g zH|>>cH;&85ESr_nn?B{t61+X**{qzyAL?gnHGk_hjt?Hjv0uy1Vnz|HPGeIA8zx#jqT9a)Em?U;lAR@!FK1OKi{A7Xhi}UIBYj<3>?* zIUB9L!CWt`@%yn`fGML<)wtEGQ%#>%1rvICmUynS0gr3JdtP) zi4bPCDP`jguF%yfIr8$YR7-V^r}kWN<208+fR*)%Y`)R4tkS?r?~|)bIZf)RXn!v+ zmHt2W-UPm`qq-j-!;@klP?fD_e>_UC4G77090v+f;@EM5V?UxSE&(iAdRk&h??q4Y zlEjW^0|ZDxlr4Y(u@q7uAeMyCvWTrEg$7aDBqTruln^LTQ3|9$!|!{}`OeI}SNF-1 z$bb9%>rXy;y7!**J!j7BXJ*a}luo|}mZC2;6?*~Da@L?z&VzW^!h3%Y`1G(5@aM_S z)nPqs-a_D;69P~sQ7m87Am8oBih7JWXKY1(V>3 z=!=m!LXM9Z(JVjSnnyG&gMiUd9NL)U=Xbq73YOWlwqQOUUb^H8^WNcl|G?gTvZ63e z&d((f#5XQyfy_5v(DLJ(f`y0q4bIIH;LHz1Rb*NFPo;d}NC>i$U0EHcfx-oBCmQ-_ z&w=pDE{txHS6cVL`Ea9>=q@bAYwQi~%p2@e5AS2Wnx}}UVy5qvRLdb6SEhO&zdop0 zs8wyFBWuc_mb)%%f6_J;)|fl{5gMXY;B_3A7;_fga6A^eqDf@I|TB!x-eO4J34$O1mvxE3|P0&?3LTtRbBY7AN`jS9w%p z0|?7&qr;m_*lGMtjShP&eU(w|7(4j+hED|D#KndJ!L1Z__7L7LyyC_V{(O%rKSC(Oe zn<48R-w4tzM19U78QD{o2Gc68dywYHf5{yY#}-isbh}^766N7F>orpUQ{;+-{d(!B zo8z}9e={QM5Q!REBgIHV4OB!Hw2}SA5hjXKokoV-BtL$qA<;gBqIC28T>Vy1NyBre z^GHE$=u#u$LA!@^r>_F*h|!B6^b@4KJHg?LekMgWa-ApPP5%~@)J7_&Kv(*3%+Ae_ zuW$9j#Xx2%q>$2MXLMeCJT;MAY^uUQ;$9@~UXenvCr5^KbI@2lY zMp8s&Mt*o7`dZxx6!kWh*q+Q$q1`_YikZAs$NpvjvZJuo3xwIO)wHneBDnYYmx=#@ zgq+y=r}SN&(YL$j((yrr$rM*|E%#4+Jo`0?_40#O_m zM1{4|>Wp@RgirZ(U?|8OwxO>pg7hK|SwGS|HjYiyWdHeZB1~#H}v7*VH%`HN!q%G~j?3XZWLLJ8c4Q3N*n`kCUP<%u0fzjZRtkG`khCekLZy*+8h?Ioj)J}P*9FM?c|9;Bj3R;SP+zn zYhd&YPk(S=%olOd;MhPXy!oz;l!cbSQ9x7eLj{|4{rL{mRiu=`|0HT1nH5{N8QjJ!~h$0|On>DVXTV^XhOEDm%Hb^fF2G$2}}c z@vAFbu1vMhS%7v|Bz?YHirfkm;|Bks0F?e>|(# z7IgEqkkPp&$xV~H{=|ra1Khg8Rkdv?#?5&TUJX|$FOyCT0m>M0S}w6$8EETI8d%W1m1VZf@ID-!56>jGc`BdRGI zEoyFxRQF#Ws3VCaT{9MCzJ&zudTJnS)HG_!Jl{0w-}1D`mr7q4e?__dJ!bSN@_h8^ zk(aqNplwEEsT`{G;5>$#A!+Y35-f;S35#)B8RTKhJr?{2$9(wo?DZ))?%9h5$ZqPY z5${>2MqE944qvcN%k=@iV11|{uA=nsSPd9LA*0(ElQUfnfCkq0`zI)8d!9J~-Vx~V zg3oR&@9`2STOTDRnd@Mp);=>NE_c|8ZXYYLzI3;d`g@Tp=EvZO zM6~YLBk1!a*zqR;-p0rrm?qn#vN2%7blR zj4Deb*zabDbxudbY*5j~r(uoM-X2#b{c9p$A}2D=i_p8I>#zVygdjo;pAl8C6Bhk8 zJV@yirNpElpszS(&W01v)rfN1)_}GMi);WV;j50vz&LbZnI!4AkH=DhdkWhtNY-{{ zP${Xq5Vaw+i+%jcS%JtGbRG~0H90cNnF%*bj)(0CoDGglL`Fn3F%Tfdwqn( zS<2bAJIG5|5kMNx*4K=_56rVz-;@IMX6~poLMry;(`P~GB1y(QJb42>sK#a0Fi6A zoO(6fJ=E`J$$#Xch=UPVVq>_3-NMZ;vbm9)Pr?d!dV?s~)a5WisLgvKq%LS`mnd%h zK8Jdto0K%Shj(p-h%5Dn?Mx4Mw2rw&F${AGkLC!yf-8;Qax8p zdWvs`^xutqk+K&@t5VeSqg}&o*!Yg3RI4-US4qXeGc1Px@WWRYd z%l!79NW;pSZu98?ohI4e9*2By=V9E5hv^#W<|BPnVJ{|xl~HVU+bUO{d6Hs(NNR#~ zCsLIn_hjW3YDRtN|Y2WA){OD z3apW8({P|pUc@s{(u;VarlBsSM{_{KCUP+aj#KNI`VIo_9*MxIvf4D@_jyI7q@BdT zTiVnz`CfA%^2@;sm=j&IHgGx(@plgSIZ6D2%PZr952WiSIc2|uq^_piB_I1D7T;kL zk;VgS1m)CKgltD35HWS^C@~RbnjUm8q%F~2Eo5kSEu{R$p}chEf&|k zYHp4g*Ipj6*co(i#$}yBY7~%83Y;9$V@vCV_0TCIJ?M&nsB7Wrs;>(mz3`Xg47SlV zO$2(JZb8oay(9gSP2yF6@jI;Uq`VrI6E>(|vu`Q)y;^qY$I)dA1-|a8C>UE*;huqT zlq9{sVysne2gC~u`eZe~fMK!*v$Ftd_<+KsA4dEap~jd{=fkqGdq^$|#XHP`l~As8 z)D=&8iA08%0YDR~uYFiRI&3Ye1DQ?`8&}}ca8pdjr(YV=qYfV*A6yK`1rqi6aTdz# zHY;hExa@}R^mcL1eq`g%3`KRlEQ&;x6+!!L#-=X4)RIuTtst1(pW;CtaCHDnR0MP& z+#{9-(D|O3vxST&y*2<8^s1wB1??ZC-xtpM()t z*Xt+U0QFx4W%DPWO*=Vz@bkITUuL_3QSd5t`HcD;kMFyiO zl}(Q6#1G5Bsg22fQ%rWAi*Q&*N>ikH!0UpE*fXbHko`l|eW-Sq3VsV|Z%*)_AZDEt z2^PdO>~*sw-~0L~YH_xG-D8O5)J6K@8xnkq=+7Mbs}yZ8Xz>`brz5>Kl4y@~`5ObG zxnX#qAz7=EB@UHWN^A$_Vmq!3sul^aPB7S-XS#Wne5h!I z!AVknF~JeXqm62a&&OGE{q9XcL77JSJAio%HGyY#@m7XETC9;hB1!bRY)p4=HspKX z5+!JX|K>q!O)ZB}J?=hOTKz_hdKyX7=wdv%qhfhvhmo7ImzRqYIuST#f*f)P0aJ(7R7lHcEmTCKuf$9sI`)IecmBeMa`;bN-)0d9y)J) zWEZS`mb`zsEgXb&r<-C)x3ah{sxbEUsEQiSr(D1WG#8RO)pW6Ewf6Lw!)AnA!cnet zo!7>liGqw#P8plICMfc2Q8e2WY2?!M7mUD(>gGuK+sKi*|5`>+g6*a(IVbTK9-tJq zZoq{VL;I->V^$6td(ca4Fx>j{syD}-?_|72F z4iDQEAx#oRXVtN7QXp;erUf)z%rd~X%sNHDhrKHRC&9Gi=bi*6tVP!Z7V5hViw5gj z^$xWn!8Rp8bxmQ_v6`qT?V~D~?gzbshNM-ng9u0Rks4`%og;EI963e4zsTp0nxswD z-_z?R$#Q*ybvcJ1aReN5r_;5hu4~0n9t58t)Ta}Wvby?;lu_RE?PPsR!(d?v(W+<2 ze@h+?d_rd2#c;5@!_AWW$9X6+FVid%6xogVqWeGFd`oiAmOCf)8rZGybl`?5 zV*ffLgE%Y(Y2!znvF?6@aqqU$`4Ij}10sf73`Xlg=Q!GTGOf!ni_|7PCYn9Xx}e2l zy0FVZ^{Jme(z_LLu1B}))v;{^?#c*I?erpDwWPKVNRnBSZH2bnYt*jE!Ynp8L+)h4 zJ$}3Wi7}5~Psov--%t6LHaiXKRDhD{MZlUM#t$P_AskJEx&wA?dVp7JT8U7*NmFeJ zNpGgM;;O34s=1z_4?^cD?Bu_SjZKgc?r)bNcC-bGUfGP{I>@&3y@B0FP!MbSK#6LO zf!n_`_u!}Wfdrte5%wQar(`Aeb<|X|? zm{_a%q!#&YPxKy`d3V@%GjBOT9CkrzT%urct>G*i7A1=k0jK3?x0@o<)(=OUvGvUqms|~Gx1uYP z_r^~|j4>UvW0tJ;v?t7p^~qZsQ(=7`Ess_X$b=X3U$r;-at*G7ucyb- zE(*vVa|Ezbt5cvyKk%|nn*mx&#-+6|TGa>@?r#nMk3JdX=wM{kvF`pCal6NCw6}Sa>mu>G zF9eBEHT9ahHh#L~=0H;Li+$3?7WDjZN9pedu>)sNi{P21C!8q{V&on6w|2sG7+=D2 zDhH|xdK>nhlK#D4KXlm{P+c3gz(P?aY~85i%Dj_pBm}V_V-zD#Evjf7 zD5PECTnWHdI|7a;fUP-5JLl-UA9fQYyfMK5*LXHoP=6KYMNo9y4C(Gj(3=2;?z2-L ztq4J0LD)Oo96m?NJ^viiT0nazGo)}W;Z444@b7siA#QZmT!eetXDn`W4zEasJDv5_ zaJ3gZn*!+Vnb)NDol?+2G8)Y}N|yA=xI|`5^B%8IvM#t5uRJg*QMRt{lh?h%hrZ+% z$9d(dW7@UDbJ_&6>FUsd$}Svkm4&=68svk~Fintf_Q<)K4&;HZ;o~NW zL~#hapLk3!4ShbWF3{72yf*V~^_pCW zFgaGO!sM7b<_?vi*IB!&7oFiIi8zx*e%sZsQJB1^Q&>yd$a8)P{Rmaw)Y?O9C zV-AtB(JYz2odx-bhAyts zb#`SOfy>p7?shA#ZTyw0pbC5p$L69P(+Z#(AmqU#Dz#!a773ONNS0 zmYC6l!xBOrE;?B=bw$FwJi;}N%AMT3XutCLY*U7tB**X_L6Ib9%7ZB9LhLA|tC9R~ z5^Sj2Qdxg7FJnkOWQ;u&>DZ|Wgc))^@XjbWg^(4^KFhU`;evd|CcimOE33^JvrtTh z2HAF9#Q9(YyrIE94Z`O4I5$k0S8$p@Kh6h?*`demsn7Hg zS#u&p90aWL`O-z^_a#75R`nys$kXnoN&NVK4U!9~sfPM0y6j-;Xtk=V0t2PHP_~*9 z;J7p^X(`;btlKwi_;PcqAVRvgR*^!xqwpkXDwX7EcQq3KZtnNfIH#;645UeQ-!T!V z@mK14GSQ)15_3dt<@8<5mJTxa9}gt!;}DGVVDWXWmyTD)E3QU>pZ_3{a2bYRtYW8^ zb-5Ztl<(v4wH+$9L5db5P0^}jG3T_BNR7n-V;yEHna{|qmv!y>s84UjG;(*FCLjGt zMkBaSR3ioEiRYR=>`>*J7Ez{8qJSq9qN8NtC5BO-(JBtpR(4kU5KDooH2*BBq+2pz z7BdnDZu;OaAvG>xfp-eCU#mcFUOiT@RK@pmAoM1P<` zA2fs$#j7eiRN<6(^%}3%_n9Rki#;fp<877DWUhrW?~JmW>at79V&tS+#gT5|hF^7# z#E<<&P?%HBv~N@nFppNmJ3zv{{}UNxI(=`dKEOVM{c;o=!z65S>v3HqpUh#4gROKl zpEL+|xq0SWR}6yPadTw;(aJ#jy2ppG*g)pZ_b#-;5|RT`Vj5hr05KiJIMEgKfV4C@ z-lEvk%R!{N!fk=w?kz|aMsIA*q80)@Jr6J}h`sR5$p$Q8>ruF_;9yc+Q2G|?6d<0P z3T~2w*muZHko6x{2+?!M&64%et5&83t{*9q^^%oB47wUw|7L{{^+7j7)(75iWeJf> zvdH@U6+)o;bdmLaD}>nMrpfv16(XF9AOL28bNHJo>`N$E?QO11);F&dq8*zAOp70_ z6k>y$C+jl{E6dXMjjn^NuUIJrV$+cIj+H{3?B>Y2zG-C%8ARkKvi7eKqEFX0Yvlga z%1{u7V}_g$ZeCGR`VfeboG)A%0{X`;a$dhO1nD+qANn-eKeu8S9ktGq{ktoKso;nX zGI*Zs&psi?upA&Y>PUfsh6hLd z%aAhfJaWP2LzFG-9k4ethXeqd9aP!gi)%qG?gjv&(DXJzHX+3=N%C-9gh%661*v z3s||@rYB-3vDgTJh*fE-J3ZN&KFhexcOQwU(TV?8Ne@;vbofwzF;hscz2 z>BnzD9_0ZsTiVF;^2nRY7OcV{xKPzi^83dg6=gt~PK_*$V)KKey4c1Gtipv{FdG~< zfeP!i{l_qu)CE|0$;CTZz~Mir+EH4A0JD79qYp`AE-ZC6rK9hf7X(XTv$%*<^Qy;2 zb#<(3JDOt>dj~7q5#y#)^>mXYpO0(_B_h{o_h20hHocZS=gHSTK1%cT4@n!a^JXB% zR7Qu|IyYNgN>6KS-Lj1s?GY==9jTh4X3!3j%tg{%Z6SD9b!_*Dae3;ACj@01aUtu@ z9G7@~h&Q?4d4^(famHvDPdUDTL*`lD?r)4gS{wm6J)xilqU{{>a)#IED)F^ zZIq|1&tVwgdNjF4%ax@OfYYLWmtx4XXI z)yV&(Cr6x-O#BgTGzWCGECTU{2h$0`$jE;zfs?NR5_=X55!#9=a-4Be&;YwwP<=Ec zd|0=5F&dL7omrIvDidHb3zTLx*>!Er0_jtN>`b!+J>Hs<40gHr!L^X(inW1NqwQ&> z54~5WKhR|F#s9G-ve!+J_4CVsz|nxtp~0TY*6x~{^?d813KiS|!(C)r@q#94m&h*X87Bc^55=6`|cl}{Onjv~*skBMfLQ&Vk4lCBY;r?XS^doS)LA&*)*Ds$Q^h2=C zgTR#V@8(|=wd5t2S>gTDMOo57SWet>(DJe&#&K7zY_C8QsuFb%MMw1Wx?7w`-)gKa zrFGX*p&{>FtLgk|{$hS|50O}v@Dt+{y@m>Rfz;FYl+dw8eqcP^Na7ait*E0nn zN3!0>)h6ty56xOs`7sQcZ%mOmEX`*@PY zRMi+THDuG`s$*%<-MyEL*KrM^uA8}Oiv30ukL8q0bYy^CCupIY4q!o9i$;2!*k9du zz|E2Ev}XtHoA7$ov6tE&46PL{rTuSBHe^`f$JIivgFLUw@?HgMzk7^rt*)cDWNJey zC3QDRoPX~Kx*#4NG7B3SwKddzh!YI;fpei_-SYKnzJS_DWm$D?s$;!KmeF-S)?=Sm zm+rh0ih1jRxTT~9(hVVNN@oov6KTrzVd#%D>(r>{?1W}Lx~mZi{FY}BC8|E|r_}Wi zucg+Ygpz%_pWYunm5napI5()!$jf=|f=`NM0w20cnj@yqs$&n)lvuC_Mj;McS<+pr zr9)?^HLCxUn2Z>HCutWf)Tg?3!?0U1+&sCza85Kvub7?}gy7gd?TB++4jf=zfFkp*TF#+Rs43faYhy)PgX96tIVeFsQ zsHa*(yaw4$TB8adD@Ro@EWptgsZvu%tis6~*aB~^;~NY}NHd*yV>CDUHzG!uX86ME zhgY*lN{^S;A*Kb0-U9xz0oYAam)$zAR~c_`GgSF|QFZNkWgAoM$J3jdM2Mz)o=oSw zD5e{pGic`1Gd3^?tK-GwQJb1e+)+GUd$e@+6{wC9TUp}X;}!PKT_X3&C0?Q4XJ4UG z%PVsdS&I~VG=v|NxYMpoeJ+f8MIwaIk}#SQz6BuyyGZiwNZN$9T<^l3k-av3-0zsa zmZv^|N$h^J!W>!mbp&wM_9G_}w@q<;ZejV1k z>fbx;Z+{|_9j|}fV_*Fsr%T6aQJoOgy2ll%!j7m)q{H6t9$bp7LH6seOp+h;My(I| z-H#X>=%_kua`fW@y+I?S3CmnaqEFR6!~Y!~Om^96jh4Nxg?;J0uT7R! zZ|qOLD~mCf}N^*&H%ZIbz}6OK!k$`}r$taQpp$ymb66qMnPU^d1{fb?If7CWpD0MOfyzX|i245-nm0L{r96Q1?w) zsuZk!8*+i2j&8YUDX`lxVo4nJMchqN##PlQOD8F;fI1?uE1go=s|9>brho%h?-G(c zc9TRrP>aZHo;inZBqveRQz}cbF}KYGG2d}%#HPQ6gSX>grwgTY>)ISm6YtMPBW|!f z%fD9n2Du=4EIo~HTC6U{MA&hkNupm_k5Up2%-BGw%au2oFei)J)-&~=gd#p5|3^zj5I9S7}cg#>0J+*AZO z;lN@*9C9jISNL9zuWwO30LKN!S>~)oHMRnGm zY4I|E*W88E!LWne2n^Ir<=?>wjIL6LnCLX>v@i# z2M;GIrJTWeTM`+))oMND>(f_UaOBsNUDqlxUEBoGzI<6kh03drslMiLQOu)Hf&MZH z(YastwCVztbyhP=&~F`y;Bdk=R2efDHK)uAOz)7AE{O82vhNZl4+E)Vbd2e1oL*DI zO(kE-y1x#&_|nn}*6E{~*g|-LRdY>!)IRKGllQUcRJ6=&?XPaP5;;ZvKKQbzr=o_z zn?C}_w=!CQ2D3cw#<$W;;Vn+P9eg{y0I13G2+!o7;xPtr^kr^!>FfKGTCH8b9n*Xq zFX_f*!PMk$qegne)N7=Cg;a?nFs91$i?iTtS@oSE^GR1HlErhd8WXY)xtvDK_&0H6 z@Ib}R#$lC`F!czhs;oM84bm6&;L$y;juWJP|0|;kTGcyj9!y#(Pvz3r#cDX=hlf3S zz%Pp_-c$s~kjvhu3D|s11eVVnU5VGUF*kxSlI_v2kL)9TV~7rg9J~4oQ?74A@>0x6 zzLoV$5M6tP`M+vCTlJJCUd>-oI{zq=Kt2`+luDiATT(HY(KvMQDm-0=+@|xYV`+t@ zAjsX7TV0U~9*v6Tl_bfoaii1V!b7llaMLXsjdu12PZUK{Ly#UGS4 zj`=gCC(p|1+EMGVGtET;e&?+b7+<82e1Mz8%;AqIp){j7`YiKkeD+hqnxD9`R)n+B zT{e*pX5ztAhHegv2}lHEHQR|{JQqt3Mp2YO-(Zgp*4Nshe+F}I(~yX<#Po=XbZgl> zQ*qVXLTa?QFq^p8BPBX=2j)pK-LoijrmRu2Y%h`mD`|9ZH{l=VuMA0o5k$?jA%aI? zA+q)!GlaQnDkn`sF`}oojGvHOtB$XA`@(*O_M66nWQcm?e_4P z%@i@Ke(Rv14=+)m$6upvGn^4aw+j5VnM@b_dd(KeW(fWAcZW1t?XXw_(fT>*3x#ft z6*{gg6f@##x*BG6W|Crd{#6i{6tNFoJ``ShIcKE3yc9~kc4f*Leov5>^5%uYrJYl@ zAf!j|2)GCD8-dQaE&%F0Nu7W;Xj)VH@J$%LN>iYDEnyFk^`o}4hxHMw4%%h4nfnm; zW}sbwzcW4Klv9fc)F7kvG6jAxPp}4ufv`0eGLWJlt531I>bQBhyQY?zCeHT1jtRli z6+WYFe&7^T=9DWrk!>l-N@GM!tUkChfxeOeOs+f-PHdXl6zlFMr=eOqHT3Q**}w4q zpclfzB5ebun#>B|Sg_y?=z<*LI8sYz z2ku9$j*p>Moriom?7GPMPYDPa{Mn`IP4&v9R+!V1BFwfWxi||&wm-Q(PhEdD(v$DB zc+DLoe&~l5W0Jb9GKwVo`E(!;x1Z8`q$S_HN5NW+44|MmYue-7hYj$&k40cfFiJ68 zqT1at)Gm5Iar}kzk-qb@_6Hfuiv%^3%bLjrU3K46dLm+Q%WzslT!<~LU({Dxh_zUx z`y^5E5}cQFUDT}ShNvN?*vg_y&^BY0KVyNe5B80XvxL;h_?;Ugz`=pggKMHJR)!`* z7mF01Ydsd*0^iD|t8lwgh#Z-g)>}O|a=zx(JmsLw`D0%NFV7n>HGI%18ix*zg^59Y zOrl*ldFa}RKNRI~JTFO#+G&8HGsgSMjM-2l{pAV1F=;J+_$$=QFgZDdwj+Y9U7vul zuniOBe^nOeFW&(x(bbwpNnpU4JxRv5BmgAvm+-`rD_TW8I<=XQI5KXEY|r^jv@==} zxg8dz7hAK%>r+7BUwQNqrM2xm`%HO-fxR5Jz+N&uV3wyDj{=7$lx+z_z_{iewn&Ud zki|k0=r2YumqcB^{nWNyGaDXwb6RsWS*myk6+Za6sJJ3q;OUrHX`YN_f~3PYM;56$ z*^#Keqc5B#O4@D|-W??|WYk)plw9UHAmCWlYEyb?N3%_oL2Fl|1_%EkYI5A_r~q;r zU^|wZ-2_=r{Bne#mIJC~lZMAgN3&3f?Qpg}PY-pskoQ=`;CfNIyacv0dG>mW4BNia zNVr)b2WA^W(4zw<Cpt%QpS=r4Ki3s9TiduJ2>Nkr1Yc+uxS*KeNj5Egj`cR09l=QVI zF$Pa>66>iD9kTd@w`jsMu;*dRFLpcLvO+O5j;VYHNx%H{z=C5# z8XyEJ?6t!lUWEa(HXdVZ$vvex#if%A(L{d8tw91yso``|>(*Fg(6GvruG+C(Ux#_Vj!@eO_E!r)RbegyW>2cAO_2}lT4kZm zO_TW-i-M%DDUF5FcUA6oOV@+=EAvS0s&0Rfb`fn>POe9dhz4Skv~;7V(mg>f1h_B> zBqLB^)#f^s>U^N{yD_I(*D4|ByNGe%j$m|N1o8swa@0ozJUS-0k!+x(vcyNV>e%jg zLTt@0JWlbf`e5%ORaf@FLTBJ5P)&z8w?dJ@D`4X{)p|_qw#(md@Pi^jmuG;P_Q% zF1-C{XyNb`k3YtxctHQJ?q{3P6vm1*h^FTs5xCyG<`fpKnZ0$h%p#5?)1pW)} z9pY=z6|ZmiuM-Kw>$%kHR-O0b_1$=_eTGuE%CsM?Ha^T}KEM-VAMWuVWTOcPkKKBC z>6IvQ1*$>gz+^J$#;FgTw%&A9i>Nu|Z5sg0gn)8tL232y2!rZ?CuPEz_p$a^BP$Mi z^Mtn1NQ2*x#!4kfYmByh*1&3O!$5ADQBqJv16TU7R3GVX@Hppk8^|HF;b%xY?%R?Y zx}=JR8vxTS58xMdJ>F-U!uG!gZ3uyWA#m2lg3!#Nc5X&7min=yJ%|yt89nykM10~TZh{$BtSyddcky#-Qfs?!a z?x>i3$?Z#JXor>o*MN7B;nR^ZBgJT;=?qC~KMXPw7c5F}G~T3bS5P+`6rQ!!M0=cH zM7)gXv$mcoSKhcEnZS$ri(X{`VW-?3pegDi)!!b6TA^o1^q7ASX<7(<5LXi!c9CQ^ z9hV$ScW#DMSNu4Dr!QM-(mgVr2P-vkm!#blS{-335w5CE5aqI;G(cOR__??*_Vjuk zv2slN33A>U5frgC)=z`bEK7AOykHnXbdY50e*{tq6DMvNo%SbJHWy%+f@QMq z{#k%fgQ3;HkXuVw>OQmuFxzBL0-4_*K^D+;BF-nS3n0Zw{~5$Bpe$nogj;1?8)@FN z7%lAWrb%$#&jYAMHrv)<%)dY+Zp#p$E&^QoUlB;RDyTL6P~PSZ3ovj8pspKFkonFC zl1IA@H{&R@5xWt`uz;ok#jvM9e5H zn*?yrp!=1H{49SLHVhKHRu@KRNpk(KgO(XgA?0z3X%ao|e*$pdBbAvUKxZ!lK7kfN|}Wr7vEIRy}5>EXHe?UG0XR_HKOC zQG1J?M2dR$V?G-~@)oJwu0LvuZYylv(sSkz^XtoOGE|dEf?N!Tcfa8~9jV~?x0l&f zT^7n0FD5Rx7b?b9(XPJS+=_`;lYC{n^snU;F7y+JIZ&oJh?12f@A0@U=iRh_Crmf- z0q3#?VUW)KgP1d^1!wq0hlF3EG+A@;*s~k;3VXF&iU^E>^9xh0r;S|*_Lp*+r6Z9cy9wsuAq48caPLPyvx!8Ts66WwAX$pXP9N>p9TR1i z-3^ZlWte+wc$|vENnH#bsZ@HwcrL0Pl;qN$5A#vfdf5d33HMB|waF4*$kGZJ+VrSd zR3p?R>`U2-y_2%eX`sWo0!I}&R%nr}LqTw}IpP6W4&-VeMsV^)R4jUecY zd-ol7vrNM7$H$~3s<2-yNLC~7)(Yhp%F&zUi!a{TR*}%$;Z2v_cpBQX92>hb)%a*s zC$Zv>hC~g)5-Sfm1vUp4DZ;>%m`{2_Na}ro-R{~5_|+!{V7a1JdREywDfRJ4=?{K_ z%tKSj%^6EeN|RL=q_e2CB_>VknSjqy<~K`GHrrdj&Lax&w2akd?#>PsIe046VPM54 zO6vEb<|yK|PYR+Eos(}R=%EbYEq+5EorswYiv!hz*5geP^;J&}=mqOlMGZO6BD1(jYBd|R zYZB4OPTeaICUR+@up%i}F3J)p*$=Lbi9FanIM!EHUp?=(sOxHnc27{1>wtVIO@2)3 zVs)uHHXsFLf}$Ss)F?9am$M_JpP@m;jZrv2QAMv!HZlaJ8#>XG_V@++-&_16ZM?GYJ+0z3|!P;Tg z3N-jqFMO-(%lN8eUr&WXQRLktl@$0SK|lPABslD32VfGloGo(n+FO%#&R=2Z#$^6{*g&;dh0-_y}CSt>T z0I5AD8!LAB)=oqTYuE3UNc!T8#gMMwm5KekC_|U5HR?uKfJ|=&3K$q1RfmUh(TCe$ z8orOe>KsPu(kL57lWFDFb;QxH@01|m)8zeW#E5Dqh%eAv;N3jQS~mvcB*{~E6||9N z*XBT52r+uk;=+PNYk(??V1cbmKcK7FiU6z0f-SD1+bM0h^Hp?xg=}#ut z9fRSd8A8HcnF_rvDi*EJjajQpgrxH}4ar*>{M89l1bXZlx zAi@QUBBeVy?Sf^V>$=D_o#2+U4^qsULJ>@_AIP*PrcAM7_v<_oZm#gNS2$3K7@CwE zeFSJHHiOKP@xqS90MdgJRRT9%34a&)o_+c<`31yvkn6-V0(W7A4Y!&hq$ROln6ZZ3 z_tirFTM{^9%fzYe?=N?c4Y*liJmAcPPHaO^czdmh2#N(Gr`v5Qzi8n zCt^ZBbg=Kff}R378t!M@m|#ol3j*SIUf+F1>EVB^OBp&~zM}M2@s_Bc;GQc=QiJVb z;)p%q?3rGbcJ-0a+CbbSpWx>09YmR|2-vm8674E->)S3J#}+{MT+{fp=SR)q3ep+e zT}N!${{ZTkSN-lIruu=w5&sH>mFvl1*?S3;9q(J_N+8`Ci=?lgWo`lMhpT zP-QsrhbLhkXUGZ%w8W~HSkmjA2?z8{Ec^(~=qwAOG5O#}P`+`sAlwJin- zeHxS0kp3RhkEP|nrKL`bF_i;vmdY6$gn0!C9xcnZC>TC16&!3p0hpc$Qf$b%8ZG?T zsE2xplG##v4hl#dH>GR+VExR&(Mr$Q*?qE!sDs(r8M8HlHyA}?PTYF|LbxH6S)~^T z3A@NUl)#W36Y9qZ80lr*6b3FJtC9EUq8RB#_g-9qhslB*wVoi`_7{ZG8BbQ~4PrbJ zsgr^=TGg6x>#mq9JCCbifJN9c;okAW2rDVm-33Xgu)84LKiTXQ3R6Z z;`C+&%!OrCE3V7_c3tPhNe^6RXTzW*>l;C@$og>W? zyMjd%=>RRt_yKPL(p;KHi%WiV1NgdD8J5WgEpkne`tx~Q!^o#&%F%c{$E`1RUu?g4dCHk3jwr-(V&vjCfWJ(dO+lqPPCcpr+mQ5ETfdi8L+ zoD(L;G%3H`7d1)kDNP>I(!Y0D-*b|*xv2Dr#U>rXNidB*cd3~RCm{j3W|ufIR!*qF z93>y=j~Zy5van`R|IW(T_CaYaFAFttf;^vzyo=By91!Vt4Fp+{9#?_&h`)8TDvmBJ z{EcCvDO+UVk{OX*J7;aZ2w`1=@G?PO7QuKxdG4|}7|(hR`fYuiiJv6zOvH!^_4mj^ zsVsLIb!)rxbcMl?fTq2*y=VZ_n;f&Ou7wP{B4bw2`IS+`HSLzm0jXV?#IIU96HddE z_?k_v-@eyymB{C+3pUZ!RCq6G#v13DIFQ4F67XOr@Oadq(N@vAxsO| z&l?Fah;BR7CwmD*or`SJkH}u5XIUN8g&@=1TxSJ|M5VTtKvYRv+rs@bly28T#61zYa1w5Wv}DNY zMAQn0=VkTVw_;snxjD(2+iOVk(^(y^Tm%o3?=5G^^{!e-QUSez2pHr6BwAb>K)Oeh z){csy6NKlr#(g>7W(0oBrBOhBrxw^%Pb`@dp-9eMqYq8{{u^RyksT{i=S;-1d> zT(AwUNRXFDu&4mq_3hpH3s&;X%iW<(v0Bw+R_N z&nIc+!rf{cl9tl7sid9SDD|aLdQ?-XCG)(hB)Th)_&kjN&#eqgSL4g#Jn5c#AS5k< z>!oJ8kVf=2Qe76QQ(K+VtaUk0Ma~Iwd^N#&k`BZN^tRi`iR2s7D@B!!-2L?SKl}m_H>QXf{yMer8}_{3_2FFZ@MhPoYZTDdvB_d6Z z=pe_rS47Un3WW1eWiDy^lX`pXSw(i~-_c5FFVu6dyBvIGmMQPUQEueuttu^TG((aH z9|k}Ooy0ln(jCRCFs0_#R7jJ`dcBG(TicO=C% zsr~2?a6E=O&6DcmM{{(~P-6^6s^8^NBjd2(J&MRNGJhk!yV7uf%iq+TDM_!}6Ft*} zF}>i$K`Ar}8>P6gA*k21Un*M>tfSS^ra%g0Ol&?p>`T~B{#g<}q9+irg(;n$8S?xt z^5&9DG#j6qKQ}Sg@fRitdzo;MLypC90~)*klW>3($r&i6v$+zL5%j&tbURPsXM@ue z@P}80bVc1TSL>%jMSedN=_CNTF5V63zLdy@_ciS6B#lJ^htA zG~IQ*!N9fgV|yME251Pf;X3&3NIs2RJi#x&$)mtr4?VNH#kETc3?E8gUr44 zgM(u|1FlB8OOHeECP?tKzsN~u$V%77&tF)SY%fA+VVjnlCDm;yY6h#)^vvWN@$-Re8<4ecY;QYdgPY*@?Qd#8w_)>!_D!2yncpAz<_2^pZ`ib9%NAGU_q!U= zwZpt8pR(D_liZXltxaN)o7rwOt;g*eCwrpP`NwQrHyLYiCiXr=c&JXjg(b#wgu<6N@weF$r*4jekJ-8|`jmPdcdFk*hlDN6Tl zQ}A*8RhzQ;FY?_5;aj4OLO()RyX)fjNB>n`VxvDEeUolWEt2ku@5!OZ?KZgMhhI)h zQplIR{XIRdgKy6XUlV$1UxKal*qBk~_rXAyXwgCpKFknnBzQv}VGqvh;p}bQP4VkY z9u?vk%HrZ)oPU(fo}T9Z@6AbKccrcikuCiA$BPhQw~K4z_w9?&?W-aPMVSPz|3G7@ zs7F)${Pji1P>JUF`Qg{+ps9sV?>yHP`Ssa(RImz;Ok?Gb9k?6H~#Fb0A z0ceU}zmP|zg4HIo{QQs)<)vb{Mzj`wZf!uOSZ(|`_~8VW0n}UJEv_8u9KcS#PUKmQ zB(F)5>Y{0eaEb(l6?AO3Gs$`wg^8%4$aQ+ae-J{)-LkH*+~K~vIkd+kEv#5ejZ4Yd6AK<#?RmWctV^fgHLdLbfnGA z@#FXMi2AEC*Kzaw_NzP^OxpVpg>zu6&AFRQ&;$6J>Q(|BRuTFAQH#>Sm&Nbv7Nf(` zm1`rxsd!)(4P#YEoS#2TZYd(|DFNRT`2= zukLF6{LVZwbasOpVaHAL^WWu>4I?HLu2*!k{CHO$QMhA%o?rjuO9=yLOc;sJ)4{h- zy*csKn+LbHiPCzpT^k8H8xVFQWF+=hcJcFHG$6y(g>I7HKGJ{&K2Aar5sX9E2tM)+C#&5gxXpp|{A%r-W&BbLBT$)EXuC7$XA2ES5c{Ka#y<-DX zp!V9?2j{7Nxi~e%-~FSNkl9o$vYa7 zj^R#2xO|8D+%#!E*^m}~&!NM6W$(J1A<6Ax_7lWOE2ExAaho=n#mueuDhTAiKP z(ZnS=b9NeF<oZ=$LM+Re1~)^P@BLHSjtWQp z^zX*{VStMJFp8HKJF%;zIF4hY8#g?wXv?B?ecrt3S;g&Gmhex-BW|AZM!uew`(fEE zxD->bNNSDJ-j^qpsZ|Xcr}pB_?Jr!B>}kq;!as);C-3gmM&>6=P5p|sC{p@?s6~`a z3#b;2E#OBo=W^B6O%QAQzl4-2=F?uW#JpU9SSHfbZ_PoZmWqCSEzd`5iR~JdQ5i~M z_amx#8&U7fpnq#{nfm5n&k=LS?P<*wo0{w2$JczXo%Svh>1P?l+rEz-JWHu5-nztd z-!RQS!C&8iC>}M`zn7q)xxQwI^qf1=X_mvx%hS;CI*9YhJUnWs*vHop%OW_PByJ}+ zL$pioOl$e{_boHm6PPt(-IRw(O%;C$n${{kgK+T75b9CiOsn~V+m>m}IsuCWI+O=U z9ToieI?5I+*&*vDh;?rUbMW9YZ5a^Vw=B7T!e3u16_Hx%-%HTaLMV3->C+iRy>50n z^~QEux*6g;?c3>$Q9Np>e;;4NfgWrLc5MXuU!;Uex-x-o$pGr*p3BkC;ARQaJ(t!`;i#YfeSH1kNiN$KDpw=gPcx`bSZ-UMz?>&m z^*d=z6_c9k-^bUqcVGX7-Ed+O>H8VPnKv%8z7TJoIDh`#w1$dD4fXGghQ2FUyS^el zVW*w|UDs;e;v~UZz867T<#tZ&L_13w$;_dmoGA)+`dWA^kMXJmmYh}i{DYU7;D9(u zq$mDc)Gi=0$%>vya-Npe(Vj|w51a&W^R^N1v%|31EcWAJ*`cH!ukn;_UXGNAV^ zcR&~+=Logs-_v?3B=yw4kFV!&4|eyB%EBbEKApkbduW-a42UyCI_<}4EftYk>fepE zym-S4eV3Q0=p6+7Py}8u6aUas3u(THX+l5qCqego5ln}QYn+bYaPX<|Mk;1sJS)7Z zb@vu8-tt26$83SarGuK>5H-?C`d5~k(EC7#8OnafPlHvW4zz^o)7TOhw{P4O{V&e(tWDU9JP4#e6Up1hSpKd8e8Y$&8I9Z zNWYJTiqz%RQKtn(>Jv+~)_tzsB(=ILYNr-cjc76byRpT5$&hWPa01K|>B;|@&VxVv zz!IxX2Ct1cpZa+Y9yL_#jD{WtcP0*DrCcX7eoiw(td9SRn0`+46w&kea~f`ob{^u> z2`HI>$S&w*jb}aJ41u2ai>O-wWO@}mlir-sx2y@uNjld>tWRVx?^>>s0da;%Ykry5 zQW2@8{=Eb(2m2AQ`+Qd<)ax^lr!TkQU}aJPrwH`;U!`?aKs@h?#w?aW@e)Fl4C3d~XPrT-J`5fz{fRGG#$xOl_KiIqg( zi7nF*6O=z6^;nSa|Fl%2+$S1&O>Vq5Z5h>qmeIc#vy2SPBsSd)L0W$oz!oI$@z*c0 z|HVv=ux*69Bf@I#DHL_ozZcPQW1L$0ZfK5hyIr#nd$mB@XDnIU906qlKXBD?1TYOM zY_T+Kd|}^EwR;SElv@aS`6AHgEM4~qJVC%4BCy(8!KkPHy_lXp<7NobdcVd7c;V8u z^ssG&yCcG?jtWH`_3uS=)LE&N**Svjx_@IGN0zK(fGrd5*AZ5AR4D4Ge=nlr$v(lZ zV7iU)7prXxO6rwM)-k}=2>0lwkaX2ip{S$&y@-yRy^ckKyefh%&~b9fItJKD!acJ& zt)oIwNBw&d9Z&T-b`a!)5p02u?^v>q0d|^j&p#opqe4+f{kyS_3p%)-!#zU_C;xqN z?^dO^xUX6rl1V-Vej+3IBTG%g%EZo4+}(L%nO;?48R@NPxEV`XW+1WA#u4$Yoav?! z;!7OLQM1H18f0uZ;S-ssz9XyC`Sc$vHrM|hTGy!U-FaHm+M0r8Si28*0fzD0ki`~` zhSM-3jX%Rv*;c%G^QLUJ97KGPPHcjy7Z(&OIIQ*uz~OPkcaPH4Z{^2R!ve4q`+MW} zedG1Rk=K7O9(h)A?*iwT9tx4TIw&6ENtK;!0h$44b|F&N0!AN==A7z2+w~@U;yfoV zQ=r2w`BpYfkB${HQbuII?gIFcUTkh%@D`3deIMjh$0||kKxGK=zRtwf`Voz$mMPsM z+odhoD%UB9E1@omMCOq*5h^tA{TZE|d9TH+x$k8%nDfEgOCmL86jQTw!o#s3y}~36 zxgYmwJf!m^B11HM${-#LlXW%| z<)k_`_w2x$&d$LDz6FVh-FlJF^JMSy^2$1v#(JZkk_v=ji@0OmgRxrn^Rtw6pH2-Q zbP-Az4#wXHl9SNd;Vdls^)U@(pv5a$`u%NJV!Gt}F>=SQ%v{vQ3L&vLTSS?YVC^8!rwYEr!nT(SR3YLjExr? ztI8sMcIm59ok1#TZVl`FenQH5_yQj6FDVW zytrK_2FXFe!EQvj!uE!RUl0ZwN8@roNetdR7K|^UKsFZ!B?P0N7f&&{|D8$p!#=js zT=@S$qTNHR$nD{;-;%9~W?t*xOUUc(YTwk@6qCE+`irx3zW!Qqy&s(R$AVC^{Rt_6 zdTk*nWFbuDw1Q~73ecVJ=V0OEu{L;Li+d0EHsd?kc|Hm z21>kd-cEDW;M6}%=i_5;ybsFNGW6)6{A=^{phZ-tm02VaD>rmHl=R;jiG%k=%5&to zhnj_-%3t5!t30Mq|6W-NM?;pjQNYVHg5G{#BrJ-VB>X4x#4tT7a%JhM7uScLYB*id z8&^Nv{@ZV3jZ9b8J<_8M>4K&;HXlQ{FD#5mW|*i)JuF=9W`xbDj}4T5o84*oK3c}wZmb0ieF!mM3?uEcfUSw)DTc_Li-m>{=Mk?`ZV zKuK5%qY_96&$t-r3zF<%Aiq@p*k3tpfiqMNrpx0Md0tb}XA9c9RzsKvv2sY^@VZuP zcIb5z6!`GRM!~!lL1XQUokfABfV?`1Y?qJ*WKB>fqDNF*k${(!BJfEDf@IuuR1Fl8 zHM6W_HFr4Y3P>A}{^5wlXIE?8e#8viJP`?QP7=%+LGw)f{-xyiSpvj7qOo8xOIMBQ zIrB*|U23oayB#_hOv}M)D+eL_EuIOppU}7^=}>Kaq`$Hg>v*_$xlH66qJ*Y^dazqA zb`@%k8tyLxNh8)J2Z%O9l+}M6^o?i<9n*Ozg>pBJL`qJ!c+RHKxyqa$)5^r!Z znbZmAnmeM9Ym!2)W9gWP-(Q*hj$7EY{^pgAl*MSN=d?zPX&Kp}Wdv;m@1xO1BIGS| zLo05y6l-#{l-1@YtJ>?*Ra-0I@L*l<5QSkosKHB~5i|)+M>@xQ2S>*av&>AAdTc}B z3OSywsVDrf&4^ARak|~oI*LZiEbkk>SgBZ;DR_by+crkQ`IT$2T5zr`flI?GQMZWn zv&|6^^Quu?C8xLN{xz?6=ssB8uT9AN`J#&8s3DtJlUnqW^231HrhHEMunuU4H0UCHp1`R znh--9;J!mmv|a*_OAeC;xy~DerB+4^g7@(^pxw$59E|E95Mp9_>pBX~7 zBDA)-c}i?OD@bPX)=;TvNRZ!c{5TMa3PZ`pX$Zwz$4qR;MHU8rJS?6tze;U)H3EG# z0jL+oluK{@bYhfv-bJka=V^;JOY&##2+B6$5`tC7K9bMGHlu^&e{^;ZTl2ISY1B%i zwLQM11nDZgNbXxBim~-tyR(QQ)MJjEpE)P!VF)kCAe^w16mR6O)h0Xr=WDaxdN4zR zKYwn3#PGh_sy8ln+UDs=e!FZ}plK4LImslw>8Pb7*TXhx4%o$$O_-F3N!FHRj&j2H z2=SbA4T3|DTaVfRw61ME?iu}-gT1B z`xOp|4(e5_n4UZtdb<-m)%`kC)c;6o1ak!Rbw^9j73$`BDQ+X9S}A$WEK&msTn8(* zZZ3nWFrpU4kX&j~!TM569CX5H2G;B^Gx2Zz(_jRty>+>QpjGBgXOE1zDSrIG^8-%7Kd8EWgV86a(4)3_A@x!{yzuC_4dO3B!{%}o>ivoFk%;&Ca4Ekm(nSEqV~ z%iW{(irfPWrDqBA&E5c4s3Pux!~%!0c#&_DWGrt!#agwfyGBjcBzN6v*)Ep4zXbJr zsw4GrM7ddk_8Oet_>E(5ymFD;gqj=T5`jtTX*;jtzZYOYJn-0q@VyUzQJw6 z`etxM2RXP%SRb+ED1y*wNC6aj9Y}TPV{@??GL+y>-dQ{-)R_+ zTIK!&!8*+~K~Y9r0<6VG`z^?n%H2FIpS3UW{e?RLZ)6S)S?J%Dsx0p;xp!IR_FabM zHwGypzlCzw?+^0*Y=mP-RRnhkQxRCbY>kWvq#q>AtJ(haA+oh*P|+qtQ=*Ilu_sPg zVylE8-aWES0(-Vmi=$DSCPXKWjtkShvof};%D6NWB>j(}n1H?^+|>Z zkWB{8NQuonee={}wKC+!+CS zgJV_P&rXy*BLPiZ6AM`Fs&8Lp#*LRe8*72rEQ_InW|34RD+kwIg2vcze=C6~C^4Vsk zv$?n$RS6a1oCpPJA}q(lhWGGa;Z(dq=JaMSREGuSgRFk}(r_`obCZwxCUI%Kba87QjlueaU-!Z9khI&v| zw$I!;fQ|O9g+dNq6NOpb!|){3Jt)3It6o#GvdKn$OQ96nM#WG^4Y=pb@Z0|)B?rJ= zSu0ZCZ28$H*I{&!{f!X@!%V1=9e8Y)on>x{WG{GCR_cPhQ+lYgy7Xab)f*TMorbmC zqk|agb`kaglMx=7BP|s@7rCaSA19W3>0wl~_FdA&X-z2VUF=O-6V}?mg=)2B%FRyI zzJ+SM@-q>`U)Qg+KV6_bQN>$Opgr5X*I`fGB9E?R(e@P`vJ z!&XPMJi$INO5WT!c6?=-aJe!y`Qhub8lez-jeymWvI197Vm2h3pK4zp;_90MIx${C zE~qZ^)Zv^r+-JHhp(*UFRN#E3$kX4L5{-l}-fYFRuC}T9!GQ|=vyyl=UYMmtqBU{; zuKA-AH_RMQ73wXJBn>iBLHf+hX z4ZJv{i+VovSkxC;0y%7e7ge!AbEpoHA`!da8jxcJ?KH=TtMTJMEkd-}&GGAwx8*>c z*L~2VmHGW$d30;nZ?m`y$mQO{?y!yk9QM2H_hp9`bPGBJLVz^Wl% z-y~f|GD|s5Z_%9bn7E)~0pdK7u9}M41;k6OkSKaUTyRIl#qDkJgf(HF^Ns+AVJk9u zkM$n{eMl0$6lIgZ9Rz&gJCnfZ=}^(E@%G46TBT%_#$r}0dYaL(`bC3d13Rk+E2CRw zLf1vqe@LL~nq`0K2Qsw4F)P5Q=UB9ZKw?E3t7W}g2gXPCyIEqq`1YV_(@^)}DprgL zA=hCIs^f}Ikos7%tEt1;X`k1cgJwcT#5(x@(xsZ%<{5dT-lJK*X?dW$8IZpJqnE1E z=J=W6_b&M^a>Qiz&b&N&b5VB<9jiJHC#m%#z7@1Dj0+PMHD#t^did1|PEB8TW$BfY zslmgT^vWF^#63Pz1lW@v9o;BTHWzB161^@J0k@j~cfynIFwx)VZ$bT{aFx|@uu{EtsqxR&q~hzuVvr^0&aOxc17@PybuJJkemMYZ;_Iv(#hr zADn=dWd|FrDjcpLnl==gKddF8AXz8+U1pCQAmGg;-$?X-tr6E=R{9&{d;ym>3&#|{ z4^+n$@FqU@cB@}>hL7F*G^1uOGaIS{SHxdoPR(G0eO7>U>>TaUW>nGwfeG_``QBX9 zY_)1QK{>4NLS@heHV}9-XK$Kkg-^A+$5QW_TTaBQVF8~wqOx3bm%K8ijSnthc{QNP zyw2odIU>HB_V3yr47$s3o>~CsXkl0&TJ=kww3Z~jo9g&NHCR7$uwN!h%(xp88JKEO zePgJ-14kZguKg}6EgM)Z?S&6k7Byywb;}>dLZQtf#{Jp{NVIY-g=}1P;5=I4pkBXl zAVI(5tRzKC(R;7dD&~_xskkS{u3?*{$XySMqH(p~C_?CH>vUsqfukyPETT;v%QQN& zT~m6^H&E-TU6Hl^Azq)4n?9E3=;I_QUO8Jc86VY~YF(Kseej7l+k=;h{E&cktO( z74GEI0WDism>T0)i&J7L{KvbP}F z3ydkQs}=u1bX1^wu23LU5_zY2{%t13+f}9=ZklGixD?H)qvJg`=9M)D8c0X4Hf3SU zzjnQ}{iEy9`d4eNix5AEP)*Wm{A>gI%CJ2kF^)LB54$Q4VVVx(>b?c)p+KyiPBFh`i zjwwE{g`a&<=|P`ElgkXj=s|tiGGjpgV3Ek&&rxH;K%PLUU1Q$rqX;5fvZ2qW?O}ONe;7@y65MpjN;iNVw`rW;_$%7;hdqyBF zaQ=#fPOxRtNxq6@S4=M>npf#PvO^4diux&7&e>}?5WimKc^EhSld0N+RZ;!g@{ zI#}OT9fSJ{b+bqgc`diQU7YTkT(oaEN$0Ds; zDr_v|xrKR>Og~zbSzEd^GunznodB38rRM-(ZYlg-vY@X6cBe8LI2m3c`(c3E+m z{98|60S-(vHsHs{Wg#QL7E?Sns1V;iL%j8hH|m2NwZH|UIZr;#&90GgOG2E z&`r{A-rR^^EhYQ8Fz}lq)8C&O^ce9kX{h14-4k$~L0IWJDgL+?CSC=F~5exoq*$7I6(z60ml2?bmP=qde z85rY+ZJUH*I2`6PXkD=*L|3juZx}jNDHYB0+WT`K2F4kx4b#&%JSKxXH$(BK zZi{Nvu&}M&6b50^JKF@*I~t?`=k}8WVl=LdqC3zwflWC!^WYnE9lIy+V42?B(SlZ6 zN4?fzHBZQkUL7@qYKIjKpP|rGhQ1wC@7ddfdWjY7N3EoBx=AtIC zxe1H&B9Nv-3xRlD73UegRE|l|86>cYBOuD0Nx~EtBxt7FI=l_eaGV6t5IT>u1T?q&AxggHB@3Qc zY_Pr)C)u6HEL<3|HBYm9l@ha-wd=80R_CJYTCvT-wUGDv1cvNb(w;K3(DFp1Bmw9) znn77X%FK)|Nu!hsy&xt3(mfDW-ZqP&zwGAC=~6 zOq~dON`HWdrXX8N3TUh?wAlq7>Bo)TJxe&eA)V(7J)MZ^dzR-mE2UEF@U%srn#+8#7tEQOzCC`_J*FNf$BPj zfj%G!DqyU1Q-pd#B|z#XA5O@1YC-q(lw^OhKrr2MY)eWPdZ2DsB+hRR1w0)RASZ7> zY|XX}^)D~odK!EMTJ)uQ9w}Y@MXiDI#=PZ6)M3DKaMKa3mB<=UW6zQ(SQxC2k7<_x zUl3n#z2jQG=-#()w4zR^X}%GBu_>$0%fw?bc1Wg8Di!5TUuh*R>)%acFByWXQMjc> zTQ-?{qb}Q)n&vq%&~SG@j=n)h3{-{QHMc!X?S@zM<2Kjijrqwwe%OYaBWjhI!`zG2 zJQJAcZEbcB4@@_bX`jfs>98#nD8Ls2Kv~GOt)pkRc`^dr;H3({mjcgR;Gw_W7j2)# z>Kk&0Eo)zLBxW%^9GtOXy9%r&Ep@iFRO1zG0!8Dc+&$<^Hn~XxUwAYKh|5f2_>-7t zfNO*6BK6%%Lg>Z|yqN-n0A$Uk^SZtHj^qS3Gc_ zQ%lTcgEeWkmTQs|4!+owx$V#F*E@r*zTBKaCmg-XKD_QFX@cuW&|G{(wh+|h%^~h$ zpQ84DBjj{Cr6`S-Qh4mhfwH2nhAXzpf;z3weSWLFU#PjvFP)%bixHYZN&81cg6c`vMDY&sXSqc28#}z65hBrqwwCh91B;qmLQ16 zJmG5MeezATgfvswlPp+JT$3^#6vg^qQc;X%G$~$FJ2FJgZhS}3FmzOYCMQm7yLf>_ zd*2y|!-jdQqc|*Ad*?2(Z|@jE>9*@Fiqa5of5{)3twj&F z2)xri>Elv+qwzi`HQ_-5jOvuXqt)rDEbo`&XGh9Fd@_VgM8VTIxV6c+JJ-SnH>jd7 z_*4Uh1s4j--w}mrnoCa)sSePyW0a72uPiH_2kL-BZ|SK?k3VlOw=OsND9Og1E+R-e z6HYr`C;<-8YM6WkRe)XPfpSOqY_>jDxX!6krc4ocVt<$JB5sGcdq15nws?pWtCM>2fIQWF8B=`8 zV!JA0pb151-!uf(x|k4Ly=qY#g54N!i8h8i&vo{$~`M&`d`ue>Q+^1om@}6;{~O5e$kd@dP&og6y-WclIhe*CEX6)QswD{&0L2x zWRRwS3SGkA%<~e_+~mZ{YIQIIc@I0e4!Pccu6Si@Pv=lDjbf+XY}IbAI4yWoJ7`U@ zjDpX<#RAajDYDFEx;Sg6d13=IC+JedSoA91rjtgxL-?5#MnN8eKkO867MN~J-0SyT z>F$LLeadGH;79DUR?dkKK4>M#12p#~3vOJff#ZpqGZ(UC@t=`;xs&e6b9EHW)bWkV z#TN@u=ZymSpf6kd=0pO^>exu5=^TI;#|p6Ag6lsTRkWH(`?#2?1VxnI_!XxnM>6KV zV?2TJM!Y9DQ&k4KL4JUFpNCDYe%@Yb^8R!p{M^J)<-#bY%j3%&l9p^f^*7M08Qerg?u)8MW z)NcYtB6$j>FStDp#ecj8bOY1$pv5}-)VlQRTKW_CG}h^kqM-GtZ|Lt|#;5tcggJyV z_x3U)gxx=K19kmomLVE~3m0=Wmbp(1Mxgp5-?Szu7A+gf>hTs z>OcnDuZyB=>s=6c+#M>;*aBPQHPuEP?AIbE-sx#7X5Xz_wG)(UM3lJ9g5V z=@}N@&DF@XYk>2N?|GV2n}MgZQ&#cVny$-R8Z`QtVF|je`aztI(iP*eLQAvRTdg&e z`vN{wYF}th88UYN(8{8zBscO6XQspu0X-ZMr4uu$5Ku?&;X(Q0}lAk-BWoJoQ<{#x8&gfL8&LxQ#%JfY9N&et}6gWTq zg~gL|87~bDVLSvpY83*RLg6p`G7R!SJjmLLd0poW;4@8l}rE4UoBzL}K z*&4T%atbKRryLp=kKam3W$B=k%3$vfnqN_MN+|gJUo{4hrg|rC{u4e;Q$4%D9t>Jv z{XYuQiBI!;xv=6k{{2Q=|3T#UlMC!Tt@>?)9aZ1$K^~e-dm8$a*bTgu9pQk~^~Qc( zZjxt9-WXsY)kdzrrzie8tJRFjCq(JLUfLr_ z3W^ZD^>z)2^cFMaaewvusy8w9$=Q{Id%eBNnHai-OHm!P z183xa9iD9t^eh5-X})G|xKvd##NX?}^jrpm^Q4F8n`wrjxx$UwT%@P<>_lQcjSoi% z{;W#fflodho6m}tqB1`+U)Q?X%bjvA#3XM0!e5;|&B||m+F!KLWhm^&TsTVTg_oUM zHqh}*bP^A4e)?lhV!Q`Y#h$VByymF`{hPSg3vwubyockTT44jkW)|wFWNN*H5})=; z%2-Ms91!bWHQLDHIFr;$56KJ6IEt_Qn>8fU-Q_`kH2zdzMk3ul}3sZM+D(SC=;XxZHJxn@{7t(UNJ z%ua(6V2c?G?{xF~kHmZ|^=c9k&6W|U0V}qofHv7Fg+y$VGZzeWKAR$1-?m z@{Z?Pu*@L60hjx=n=dRp<96B*)TLkdUnE~!h}Ki;lI{YvkwfT<&nXvE+3PQoYr2n? zwy-l$(E8>1D&>Ty>!&`eNjo$cjjD@toKnQls>GH4x2hU8_0A$+C_}^5Ab0<^JZCckyfE#I{oH zSUEmux?I!`UZxIxGd?-p#2{Gx*O6GZA!tW||9H8pk%27|DW~Z6&4Dcvn5XKu?wb5o z*2wOz$!{9xM0%D`eMzu&_sDHI?PEah%rT3W8mI-l=Q$XK{2QDeaR%tK2N3`v<>M&$ z&Bg$+l|TTJ2PRSWpf>A_I3>J1;3|?jfFOr*=QJ*_C+Cw9HCqcP@QF}C_NHVoIDNi2 z-HdU}Q>}!vsdr#wTU$3hX}u&E2gH{=D4Pgu{mb0v1a8^9)S4Tb`y^zxFR0@8#mCzF zWP(zNS~F9g2B-*tuH#~WF3<)J_J{DX3Tw*cnzq}ysz7<>GKXe&mT5}$l7^SK6-66P z4u#*93ZklbQ^RDHorDQSQGV0$P8r_SC$le2`pBVGf%3nvh(Uv+Fs~DGR9HJZYZ(M5 zD9&f`$?1W$lj+JPwR30_K>6sa!rBQMw8KPb1MNanbK`(I{@=rpG8NjSf+4^Xfcjn? z0|*^4&)Pso)4YQ!V3xin3@6RAN&PHX2_Szh#ehLK0Y=_5E#0eKTDu&kH*j8h!2jNw^z=(rISeY zrCmDd6HU)yOkUg018R?hjEE+W&Vh#KfiD{9WpKeMHD>E1K^{^z? zHayh5yloXdR^3%OlU|k;Ya^kY_j1orfu(S%(!F$H!hrG{O~s9{%4%x}gnPDe6{BX-d=Ha(a^ z@lVWJ%;ed_Z2pKQ?K+j-y(D#2g)RSF=WMF+frFff&B8vO)uj1XS^CAJ*R;n$rYxIq zc&u-Y4%WZHde!0l4KcbH;m`%bsYh?i}X zWqTt4C-vL7&!g-uZ*Ul~&atB<#%n!3QcRx@=rvtdC@NXqmGlM*I$I1v4u7K+mg$!{ z9OEh3+EQ0ZutnF5vh5r&-sDksj4#Nus~^RIUNQ>*IKH6eQEXgyu{J&P_!VL$8@!MJ zq|7y1CR?^wK87n}_R6(-MW*2*jEu1f4g}PO~)M#$w*s zNN<r16h*)5LDYw^4swY1@jk*fIhkz*z2qyHM5(@R>)gasL=6Kn zQ&|R0&q5TqDqwE$;J6cF@valn`3_UOasj=3a?PfGI`~HpIh{b+KWy?;;vuu7LCvXn zklnT@#?Owh@1@3dH)?i5Dnt5{Rj6_4Pfn6AR5MR8I`Euf4?U?j4Vh!3I9@p(G!KzU@)qGf6w+b~i8J@bYty27WbNJxJl7iHcH z^I8%S)jNoV$mAo|M|};lxdNG9G3Rh%zD%ccvA@hSmRCT8_yj>s75nXuI0Zixr{ITi zvA^rI4xP{+Gy8aCiv4Aod?XlO(`hv@r@WXcM!eJaS8Y&&~E8s|s!6jC}3J~tPqfB;UW%;W}56;e*y!lZ&Q3c zzx#Gz^II#Z(#N(d!Oo6xWof+9<+tK4vVgw51K)6p)I0IjRs!8}J+wq@jc=El$WAdT zo#D(?P%12>IBI=8?0o>A(CadQiUZ!iy&!{*)(w}c^1I(2GGdS3+r#f2nRyB#Y%xGLilbh! z^IF%FS|0?|`$nOzSVP&3L&~hj5<}9hnO2#Fi`NeKo#gMVEJK%`_c@(-8(Ryvz{paF zNhLH1Hq^0QV1g>jz4iUBd^f+GOlbj~d@csbH_Hnc+Y8jQ~XLh@#Sa4J@!x74%58V z3-#vJBsPQDx?>dbs=qsAj00DW75OF3>6RpTAHMX?(MJz(99*LYUy zNqGMSQZOuC7WMjKgpNdZ>j^5(M(TUzXBq>OL#W@>3N$sDYNIf`_}6fnxH)lXpeGoI zp66Zb^zB)8EDNQ0>EH9an?i{hn%gqw>uk5jDE zGYi_G%b}ljI>|bzIb>UWW{wKyUHj~!i}Xy64nrjpT8psAb1H*$)I8vCbYfcc<)$)4 z5*`c|k0gu4sb$G(-wFW{ksvkT9^ zkWzqwY>|n+`4S`9D(kjYB9pdvMk145xw(00-R7Qd+GGkDkAKn062F2z>1)GGdlM&9 zQzTA`@XFY^nk{Vnr$OcEzC2~2}5T!%Gk~_#ey`$vaL18Wz zox^A&5^cv@L+6>*YU?+5(9V*ZRrf<~u{O9PWQ6(Sv`%C%y!w3f9(6u$wAx!#ye<|wcta-$s2d$eFhf{%PD451?rFdOWi$` zXT)Q;hiWF`9>48K6^}yoo4#sIs8faYa~`hI>7l({XY!jn&#DF!DEE)A#gy0c%|LkJ zU$Z)6l8UF1U?1mrq8O_Nw)F>-D8J$BDVinYkbUhaee*X`P_k97 z2Z@-omC}s!1sPdws2dqaHLmdMH!7R>Eyoa4z0C@w_AS&@^1DdTk+^eOc`d(4qnGE8$Dv_xr_Q=8oR(ZTj90%na}tVz9$Z7m#TJMO0#d zUYknbWSx}ks?f|BsdAFeGmwdLxuffRTp<&~mBZ?oX%!b$OJvC*Hm>Z%%As*_rsHny zZQ^69dypcW@W#SP4?T#4H)Qbl>@=q- zx`|_6^NJVa(BZU>etPs5^3V8jL=Vk(l8q!7uzgtmmi(8KQ8hP0RZ(emyw$6FwpY4L zoU}vKcYp3gDodpIW(!NCC$weW=mES0m6uvMjZ#(9v3tBmnEBp+^EdNiZWm_gE2{(B zNGrNy4_YTLR@2w3(1-U|DqWOg=*pP6BHymZH%MG%CmV^VODuJp*N0G1A_UTe)CF{b zdULr6Y^|&t_-y);oHoBu;+*SEzq`3&na?UMq^cwRS-DY2koIx2qSNFp-=S~bP;X=> zcv9Y)x)dG-d71w(3Z?qB*c}PEL{6EOM<4wJx36frk5gP>m zSId6qcQzngu=;o|XuaT|iTWo%{!2K#x3N?mz~RSKzDRUv%0eSBCU3w88 zh2XarI?z~ZCHRMyTl|!#&Ep$*O4_fLPh(nD^2tNH3%pd*z>g+M5tCs@f~;e8N~)54 zj@AO+f_TE{WVtf=-Gj$VHR{XPTx`?3P-vqO5^@n1{IJzp;@7Y>N~)P-%dDP()S2MO zYjB7qR5_D@MmU>7U+)gIMeH72#$V~Z?s5|9DAx{~z$K7qD+U4#!OK>IJQgy2STF^R zPkpAiCkJhd&nkH+Se;yG&4g5pjBZQN=>!zdA) z4cbg)K$mQZuc&|Cj(r!SeCd2f!ib9-yUo+&7bwtz@NN08CcHvX%2V|_oq|9I_o7CQy#{Kzhona zdGgCl(bZ_2+#9r`#NkKUk{LY5sl&!p98J6{xVOy%(DVli@wzMJg$dDk_Rbe(ck(8S6a5CnBE^q1!bo=%IRHObm@9<`5yU3 zOqQ8_w)k({R;*k(vlxyR-ZIZ7@TPNxuLjqab#ejh}6c*`sxkN(-wjfLUHSzx2 zn+<99+852@4psP7#laZdbnw4fce#~ExlNO73M{gMe>e2 zuc~~tt>?;6dGYdC)n%3uTWYQ9hsUV?f>=Ku5mG%L;n1qkNwv<7YNbndv=yPnYfiV? zWN7P8WqqG?xMLR;?&u+U>-qNogM!(1_M-IXL@y;Rw_dhV6}otpexgyCpMQFiUjFWC z|7UtqT1va9m6!=iuSoc=f@f1%9~M1tacaBYLbK zkd_dP1Ln9h9GqQuPFKgklu-PzGabwfw30Z;1LFf8mTk{aDcUMM4++K?%2w9J>f;9v zycCVk2%<5x3c%ym&lGrNNB@eB&Mn%YN`U$3Sq`q={W1YErp=pDW?5P{Cjd^MI=Si9 z@5UOviMn(1l4Zd-Pl?m38yrJTL!L8g zkH$7+Ec@tg{lAiGDKnZm zS0RWr4FjX;mpvHF^ZSMbL;+6UU)JkFXR2cQ5>@#JfG;!pF znfWSD7|oV3Y(&_UUiIp-r?#g5wc0hF$}dRG!Nw=UwvxZztkR`QwR&3Ob#{qBo&*Wr ztX_NJdDeTOhei#@GW&XhJZ}7fDs@;JPyFs-PZJYVCXDD8t8n?Qq`HZBb5R9WCQ5u zHm$P<9Bfiuuf%7ZGXxkq%ij%jUbf^-rggar90T~7o0A>0uxagMMYIF@rXF7erDX73 zNf9E$1UAcSV90WLJB6ek+h8UDK6t(_#Py0CIVUx3N1TKaAP;RxkpL@1S|clLZCE2l z0DVkvvWSl6ji?t;0`ReYDFR@F2#eT&$5`lm3+-D=!1|5DOzg01+5TV}w@>$5Ra`OI z=qU_%e&G%Dq@alg-KyStD9Zc@pEMg;>*=a6+b9*r=zhxAR#a_WwSyM1jGTP~G4d=K z)m(4N_SA@bO`yQj25mvS-q9@O({2Wl%tWCDs?XcI;0)3m{4~tLgm6qT;gE?4GwjPR zWeUPuTxBj{bKy#=Y8w8x^K}{Qn=J+Irgq$9&F!gC8qGn~*9=8fHVC=_!!$sv^NpU) zVGbuckFzGCGfdA;M|J*;>Rde5=!_Xp&#*TZjy^L|ML`Lg{(abKJV=&^UsOyj8ASglR{vA#>O^cI(I>VLGn8FT=^Ezqs5t*t1#&^L~zJ4aVg0JNY zCGsmZm8JY`p^PoElUfmUp`=8%Q$q5Mg>TTk+5B;&r`;gvSh$+QvFS82T9Qd1dR<&01FQ z6xv1FTj?BX>+9H3IgQ?MH_$~p&FS2N5^j3KGwjWoZdrt&CHxCcqZYvru=3z&Vz<5l zke>ggSEkSfTF*J;bh@Eiw`1%s+)j-$!>7=!r}MM<4q7Pt%PDlNYq+mZ-qk$4yHLB6 z#yo?aTV=pS4d8ydp@mNL#0GuY)tl3+sO5$7&6%)n8_xyN8KF@5)6a3L(`(zxw8fuf zzX$ti%oC`iyHtG|1n|$apeU*h>0}X2jNZquHt#Oy3g6Va4~TyI_YC|Po=kOQ5&^&eqeAM7T@VCmn{>Ik=BGHJGkbHxrs;}{R6b4 z6y<-{5J&Ty2_QaTtW91rI*n3mpKJY3TYKj1ec$)FMrm&enQB)CU|mTDIU%f`+DY5_ zc#jIbQWr=)afsHg7=2hNc}^Pz=RYq-B@4j$%{fL48tT}@<#Q-^@FBK*WJ$mp*a(dw zgFG;P>tSu~lC;=fxR!iGGw0-?&4q;@CVyF6&=H-`3pt8(45k70rv*;IA;|@rDKh=? z#pD`aTr(o7TlCP^;82CX|M^Y~8+E$w7`hRss-f$lOd*pOD7}`grzS>iMMA-vW?ja{ zWyd+mk?wRSO{GYkc$HGwCNR@b;C%(Bh}jGI)?K>7DiC`xfg-CB)Gp-#2A0gSTG(~u zYdj8YtfVWtO@ue{X#~O@-R{K6W_^$up?;z6D*S=44~-4s6W$gnP)L|tQN5SPlh_G2I! zm;~WU{q3bOm^P%jPGV5j z>GM3nLM{6QK4p6eM1< zl#%CHPA*8G)}w`UrVWo1dwVv~@fd))%)!MdlmH=Jo8pY3{0%d~;Z_)oqvV|p5!l8U z*Hj01uOw}&o}%NTChwvZ=T`o zdH+SSaK<|+ZBI&EtJ=S_8MoA92*7I@e2k@C0k`0CBLN6&C7Y7iL19bk?Rs^W=o(q*4>prIo#qvzm zSUr8A7?9}$)ufGXT+JDJ{)~Jwa#7(Wckwsfje3#t&ZCC(``s56Uem(Wq?LA2;Yuz^ zuO8*1Js70#d5FbU4# zAF#fFt3Yb2*j2VI{-6LPvZryVdKU*+KZDG(Z&%%HniNe>M2>9*rQ zea%S@U0cEC!lx-3UBuW9=!0}QrbgG)HgpX3baeG}1|@*~AO@5}JO(r&WuDYaPXtZ@ zX8p-l#~1`|53Oge)?04GCqkJ9V7q=qTDO|(+1KiQ_?@Om*w~=;nYi8;{+*uF`MZ=i z*Y6DfPPFp5KjHG``b(iI@UObKa2S`5ahr5ijwF-f_4V`E!U0>vug?6 z4&`l+Bj77`tdZwn#)18uQ_^La2WRFNj#xs%AtzsGEJqtN;GcV1RLoVoBc?>!Eu<_E zDJ1h4Zn`7$r0FIb$3j>0xh{DKY&ktuFl~yZ-G7oX&iJXbFBg*hm?n)F$!lml2qC$0 zNEktuB#Woi7YAz$@F|rYfkFIU9rD={gbvxZ$OJSVw@w1(yfdPDZk8qygOnK=7K~q}8yL)2oaL~G>4j<>nkAX0k@^uYSY5YLNAAatLu58k0@T|!I7qs#hrdyK z+IO)o?;oHTR%#TGpLEc&bjIT(-FTr>OVV`7f}AiIrz-j!Gaw!Z%)_s@n$pI_d3(8k zAqdP>MY~2J;@z~Mq9bB3vT0y!ILBhSPMfkj^G5B`sVmsbO`bbpCIGaRQ}O_Zlrjfp zLQd_4iz6}}*KCKl|Kr3uU~57&S|e~FDl`V9N8jif!g-J;NW*$Zl4mmMDK0kz=kB`M z6f=vc&eZlDyh%kD+9N7ZFDLVe>^f=azUy%E5qA*T5thg^E2K9$U#iger_Nk@GEEm% zgvg^ht!VM5N{e(#B2l}f);m$~UrWb)Jf}0z9F`QOFO3(VI`i))6HU*(zHmw$jUG zBpSx~%8(wNvrCNe_2dvey*rqOGCQ|Ar7E0*xJJr_yYG=S5}mJ4=#{HOgS4nM0;thl z4w9a29vUDwR}d3SDKke^Wh64H3{#gOh)8jp%2dUan=x4LA!IH|ty~rk>W3LT7|RB) zB#SkEevgR&#kpR~QQ+_$ItIL67elfmd`T3cag*q!WoQjV-dW()ZFfH%w_?m%v)h_S zJp@iN?&bYwl5}M*7K=G~c|y1KIymHbl+<11Uo~f8dLe{~uQj~F)<+dx3(6>S?!`{3 z^@41tpDzvG@L4?-!4FGd>LdL8#%-#qcA%X(Vo@{0g0@+Pw-Su(+Li+mu~J{h-2)lG zKKd;FleJ6rY!$`Uz0>I@!AH{)l48vhvNBqi zHn(TD46rj>&B&c<{A?Y#uct^5hi%X>kiYH9Eh~|o_IMjtmQyc2@ zF4{hgHb+cZO|Z*5oBwyw1dW*IzC67!f#7L^SuMK4B}TNH&sG)06H3jxUX#c4Vko)N zN&mE-+q=UBanO!xyZl|Y`dZQ}!8MG{9a}4F=$ZAQp3aV5PKv=OkbZi37?G1+i&Se) zn_6dIb$y3ERjQk3sPSQcKsee$GR~s@Lth~)(xxEgrVm?bnJql4OCF;qU1erE)*er~ z?)5a%wduDO-=~0!KA@kvvP&T+GjS5f^vW;(()wSxb?W`NRicv~q~-VzTFvEW8zlJ| z&)w4RWnBNg`CZqLFVaS$J+gkG1u&_6HjbK?^uF@@w0_A>^Unf*J$mfot2yMP7o#X- zl7>EQO21`CB@e%9ymKp_D5B0|MZZGEjywWGR zocAY?cV){=PUrn>vgS^$wqgg?Jn}%h=i?SN15|y;2#e>KMWjB4hdjL8%1hkj6`Fhg z$(0mm_50iT#_R+e%XhEgo5!&J#~1iJH5p!h&jzodyCj8BCnq^fTuS|$d@*Kn3Ecva zEpv&@j6tnfYCSt9Z+1=~q9gE=+x0jP zWp3M5p)fnxsS&C?_GWyeLE8F(l^yi*Ns+#@aO%&s5xD@pzFhQ0A0Lewxh{ z$B^ahz7`sn&f6=q#XO#*x?P}i$6L+x9$m6aq0*F>OH*%Mf1R50b$n*%crqo%cke8G z=I7*y*6aUUZ~50R=%>47a%W-XFZh;2@Y7rBZrQ)HaJSrYDSn!+yXB#sg&Nr$wEh`C zo%hA4pb5I=mwZbXewwViWol>PAXYb9E>UHYKge4*>x_GLlrKpXj_yS5W~cZXJB#k4 zC(AhpX7eYS`>wM0Rr#7yuiNq1II$KgM5LOlB0FIVjoCuM3R~!oP@z3qf7vqMpt4P& z)&)1I*>Cwg%vU-`=K^X#+Gylppk^6NA`IKUr3H8rW{@7x7SnghqPek+BRZ5GeB!{Z%-|r(JJ#Arfcj2ErKw9`c)Ox(-THBF^0 zq_I2BLSB3-$OiM35eFaq|#b{iyziZ;szRgi5u!7u7?LsG$T!m55YZp z^I`amELWpu!!%*xV%p`gf%>3^x&VvaGkn5TV_{VFN^*vv4JhAlwd~L z*;=Aqdiv}nUy-|L(Lj2X+$y>vo$O{aKy_B|yMEh*3gw{tLeB<%c9gg3QNL`a(?Sc} zveT~(tJ^^lB_Ht+*o(3e4+sk)b9%J3dCN&M6b|lF2NeFt`j8qnIjy9PNTRu1_#?Li znK){fc%#!gtpus?1qeg7nn$#RaIy$({Ujv(9-n&R;MuB?SF^+YPOBocx$##{E8$7x zUD?DaxrufYb7f{K9I~`2nU$1hytze?^F%S-d+1!haIv^gjssrQCLh5##GLVf71zQ$ z`To&hlaG#%WZ=?{Vhew5i)X5Gs?EuomLv?$E?n_a)T!=baym&k^wH5&D`?0EkmDb; zV6qob0)qAtP#dD&S)w|;?ZE@_#t*~k!{yQGm&y3EFQbF>G3^IgI(R@4K9<-YKPX8P3*Nx?4*jP># z!-07>sz8I7qEIIubvQ$n#vZJ*L)S2JFyNqnIzvq0M#m-sRJ_qBW&ip$v?( zS}ax*dS%k?#cjsbJJrW9QD&pW z7z+N^Gh&peb#zxWwXzmwLMAV*&>=#n+S;DpU>q>#KGVYaE=#a4n_o@!4uWPlSS0Fs zOHePJEzl0+VJ9I0HL9U(-5f!&A2lo<<}hj??|_&>saNKF^C-PgH!%($Ph2-PSCZ1Sr*mH~`HsEhuc2O# zFKW=ZF-SNxWec%D2n3~WNgbr?dLGCUkZJxj8l!KNKI8^D{D@4v`d6{N3t!H*bEL7= zRF2XHm&=axHJQdDKdN!jDsjv7#;(H-v-UZ6+Qu(4dXWgWn_luLy2n8vAT~>v(Ij43 zHxdVVXo1k~vK4(&y{__uy0W8OBFtT--UTJc4G!O@m314(*`~5D6B9^BuQPPTt zz3{h~%GIX}rr?oFUTQt#s@4WRd$#rPqx6ijNkdK92{EVke}w4t`mZAnks zq~IzN$}ZU93~ga8E&fo zKZQ;zb1~L2IM}h{M0#%xuzuw*-M%LY1ZgI!d4OHABnnDISSk_SeMvHI6R6q? zcgX8pXeE6Vz#m#>1-Nje;}qy!pYfAXoC+g@HN4cHESNUn(OVy;dg1*)a?q@a#h2pI#dRSPOk=I(DMFQJ8ktOD(<&iYJ)N{ zGhel{3ty}6C26)7;fHF8xCPU|*jKVxW|7E@KrrT@=;rRs&D7BJC7%4_=+pr})>h#G zdX*86szO3_z%c=F#T9j8sY-=@gsap}7|PSO`nKn0MVj%b5%!gpGZf0hQx&?vY}dew zalM`BKqeq7ILXQ6L~?Jc52K4gfJwQz-LS6T-4 zhhE#P4DMLfj>a-Nw+?Y2jsf^TPqqSF6BJdg&t)Yy`iM2bNS+--`TtxqV;l)l(FqvW zyl!?_qS!bWr~iCk2}Z$n)3E7)*ik0C?f)GX^qEH4lhVdB#xW zEVMxbvhj==gR!@ORt3s?&zv!uG+V%p0cLvLjNueXbAf^BKWoNt(%_A;fSK4ZV>m_9 zEMj0@efEsu=-D7z9|%f7xb_VeNogH*Q^E+4V*Rc}M#RR!O)!qTa&L6nfEF;j$EaC`EGJ99-jot94|9$rF$VsSH(N1H0kw`n zua~_^3(^X@q3P0dIY|}TmrGk>f;>d*^+fSL$?*IS&b4UcRqZ9g81DU*SB4K>X3pIr zV-cmJPMTl-m|z;^&OXnX*L?Yk0Oh2v7_@-{(`|WB z2FkxyV$gOU7}_g>JW#Iec4%@wid2IvpKR^um6of`J40V(;z`@8kXgF-Y|LrV*(vm` zUD`1XTx zhi5in(d>Y{Q)y7Q=umc%T`x3nw@>7Y19VGqHg_@&(RFXn9eA1PAa;V7J<>Lvx!ozy zV;u4eTbv$}#<2UBhw9O!ASe11QDAMaE$EuPE+WbpY$Yu#1!df{H}2+zi&yF+p^MD( zIb*o(HGLMlrEO?4wWfJ{-^Brj2?TS3u9-GpxR_^cEldf;?~8%CCI*Jas+G1ju7x&( zNL6MJ!3d^+v#Z~!#iLu9N@(T~$yn48p#3}!^#Tsy`8ru)2YTVK!e)R)Z8Bp$1(Y2F zPDkUq3u%Dpxh}LH!=muS^#}?dT1^89&sD!#9CU$wU(#0;f zIG1fgXsG2JFqWobg=creSp2TZ5)jTwMdHpXK`Yto)eeN6sYuag<#|g_B^d$4)w6+; zcBOb@z}Yt&JV`(kK)5#*DZFeJa=a$pU#6uz+A1AWz?smIk8dL3nC;XF}wFb5tr`v}5(~WRpq}24v8}yXJ0L!o z1m(w%ojH#lg5W7Au;yvjF`(X)h#q;O)ovk4mmn2B1>hI$OsJzshyp+LfQ5R4SR6Cw zpa@YHB#DeZx*GDDERWGpJ?3ZyPbQrSFar2%lElPTOoRHSb?#ssV0R^f+LqP;NVXIJ z;E7bA1}V%gEe97OA>wmJ36apqZFxYPFiWV@X@RZ;jB{p##X#)9-~KK)!3j)W)|bWn~8=7DlTDq6DZ!30Zy zs3t-ANhW~_Iu%1i&_G_B1Rd#R1wHQgF`o!JS%wFW1OBcgF}9HNf(2t5cz( z)X#?!@;3&EeW_5<#_U5W{hI*By|cpd2;dZeo|qM&P{80nkhJjWC#`T*Mk%0gCrDr( zASa}PMMgs=#d*QKIG388PMM+wUS>P`i0l(U2s zRsr$8RH$eVAJUEJ2LNtO0`g7QSLO_7_XcDTe(?&=_LEehijL+mMZPZ{K2?5Lr zvxQ?C0*rHJizP$^AUkITCR79n*CZhwaEu!0qGf+I@2v8 zR#0)mNx}-Mf$|nma{ycHftm#_fEC?_0)G_gz}D&W8%02@ONEMd10IyjmH}XADo~U% zIUt=a1Hjd(K+)9WfG}GIgnhF>^2pKzVD6m-oX(a3;E7bAC{=P6n%T0qBTwVg&(q;Z zh!Q0S(L}k+rE-}MK*}vd6#p9MK;?K zSxRJEqTB2jh4d)vBtRebz)dH}Cm|-!^woocx=sV?;CDNH;~|s!Rbx8sBxVYm2ha(r zfJqeA0Sc8Z0qC4mz@*gV0F~0V18L_RAbQkx1aMc+0jyBmF#zpL1x%v2&T>%Q2|(SO z3YkQ89i*eYQ$Twn6*awzKz)PDH6Dxj^gAR8bwACfP+zBVhyokvN|J~O&uD6vu)d)g zDqMw__a%w5c`Uu92~QdW(5-U-XsGcdupUmuOrpll*&aon23+<%X;~(TB0E^2$~gcn zO$AKiJq}PQa|uX0k`VoXOQp;abVHp-0DeoNkOQU8b%G=`CJg>)g1;l7eV`ONR_bb| z(m6;xBT4dXsk9SK{IDHTE=iIWTWRSb!PI&bm^US1+xD7{#}s=4IQORFr6);CwWk2~ z#N2?AOM@#kWDdh;UE;N7H>D<1<~*QIm;*@0D*>l732%nA?osh7pf61laX@_5#cYU@ zj{^LdKbR!K#!QnGeOWLKsFC-&48}Z~PZpmALthpcz<0hc z1{efggfvOemwEhr6qq-7*oI64Gi6FyBZV+Q&&PpuS1Mv-(!hw!&ZmI$L@Himc20Og z&V%V{Ov#+00__89p%(C$b@ZOq6CRS5Yca2`#?Ys{7i zPx*N80j>X6;Il5X_>tBmA2;BJj+cPFBT>f8=(v+3K`{dOuP2F#g!IhVcvz^A@kt1L z_LT{3X>Q0kNhac$hme&?!eT2dH5!p&m(H~i%fLs0d|i?R+d`US;7gAQ#sO9Opi3Ui!1={JGiTrgYyeNWItCaFT!b{o zz?UB5G4L`l&-btmdjMuL44g5+z^g!dUn*ilh9HQ{z{h~IFBPvL17|#8;1j^PHx;j8 zGGjbt;8Os4V)lR@0}uXFEBi2f`q?5}F{x?_1J48JgjBqS44lmd11|yToK(by44e@i z18)b|&Q#D;v%$befHa|1Kb+8%Vk;~)8km9S0J$^?+VYE3IA-7_ zz?_o`mzowW18)b`&N;y(ca8w)>Nx>q$~*?7eX~boxCy}Ap9D9v`t}(3G?23&NryBh0{y0AD@VLM#I>1Gzg%f^8wqG4Nx9Dv*LP=X@sM{EE(*6YygL zgZGS&#^8c~i;U*@_pu)R&H-|<2W>iYKsH0a3DWGW2GF`xz=rIA0cC$RV0Na$H6-5z zr@O2Hb9E|Q!!$;4*lP`(eY3{%nD+$0?wvKL?z;xe6RB_wi8t8{-W_~Q!|*VC`V=4> zGYxq+0Xo{92i6Ixm}wOQ)?ETnH3`s9wau_@Qa41p4e+%|0wN6Mz)3erG@N@JLhecu zW^+|qs}goK1(>H^;}S}It51V7j5`OU#i@u588?~i5$+V_6TrpNy76(tU0=EunpUu0QBRDB4)(4ofrv+;NuzwC*rfNK}SM)Mr1oIQ@C~+ z@~%jdJ11P51QRzLgN$2~WW`oiS|G@dZXiCIglyYp8k+3uz81+9pLKO%(b5v3<=J^a zoiG=W*txzTRmYkJzyP7DU+s4xAHG z@fxyh#?u|(z&R%suVE5nJZu05(9YQddPI8!Xjji3RkwcwXJ0B_L#EAUBXlN!bZ;tR zL#oY)j%!Z=?1@y+)Y<{r4nC=ISj4B_X-S0pDYqH2%?gLuwn45WNr+IC183VT($MWH zq`WUln$29P?Mn#O7;tW#J)R-llYn|S6|y1WW~)8MJq@(%4QYv`A>(FL-SrKerKxxg zxe?N^!=}dx~S$%u-y9(q>lO!BCZ{=7G@$XS!UpKch z!UTLA;CIZm5Ie;^3FHTpB-m(aj)5-^rhzo_X_vH^C$F5EcPB(b}7cvAs{R|N{ zw_%1LIPC8R&Iz-|^O$!DVCT#lRCjj+W@jo~L*h*~gLjVr=;~C!hP;~q9qk?i*1lBC zw2A@io&eBv5}==In_=CgZisXn;3LOfqYSm22tzq=(oGT#=Pp9Xx+GyXSEaQoVOQ;d zxn$OGhH;Mq>4sFqhK!p`_6YYl!0t!|ZAiEYR5x`4=FwERhLnillx_!~)tY|=KI@W+ zA7ahXZG&ytb_vis5=G32Z96d%4kJMSdXkh#D9?y&hh^%9ZpeG~=MtLGoN#RtOx!RJ z87q@y#a32YAjo!ZAl8zQZQD#klil1vxjGdsEfHFtJqDo5l!FpLf*ayIZdkiH#**!u&SfKFhm5k!#HN#H!1iWluxqj=0!gU@T= z9fnUo@WR?fxoQMWsA?W4C#0f96F~$`nQ93z=gbz)BdYDd+BsWH;i)4)xjGds%2Oi- zgQkuFXJ0B_l%_`T3<;Y6(EX`^DbXUG?le#i{_pzEFB~l?XoiC20dzttV3dMI?DZH} z30NCaF;kkb5U_TjT#||w&BhT8m4A%_=37Z{v0ZxfShzT7L%$}0{IoA5)KSy>dE=!> zAmjjkMv{;jvae*3LcZD|?xRU!XG*>za)~gEL&RN4qGBs5B?g#!O#$$!UreYU+ry-Q zG4sj+WN|83O2W0os|cjm%>g30u?(2==Kzk0QWZFt%@&WrMgekD64*@Y*dtvN!2L-Q zep93?5}P5;H3j6q%%y}dlngJj9BS5736`tED7JXhiJO)>!?P!RtXsA z#9;ls;Tu^k7Fbq05H3kYiuQC4iTTwi%HNQR6XjPHN0`+(%6~f*C)&_0j&iC=06aW% zAdgK=1Lf(r)F-pB!xPmK9+gA+#i=+^9%an~gDL{yb*V^E24#`l3||=_=cj@tnun>q zDiFq!ko;7WFtukD49)2o#2+UiN4nys=Jc#6!y~7F{?vVG6`j}~lsKUL(wXBJ?pOlE zIjK-l?r5#^SYta-wx*&brXk^rBPf4ODo(U}w^}Jv90$N}lYsn)Nt~$*gBp%F4a`Mf zN~q1IIbsxFD!B;Q3zFa?A=&KQT%0iBg(DF3^(28a<%L!vQJG1AKbj;Ywn7qXnYm!_ zW%d7y@#*)i;q;jZ!z{3f;;&1ENla6g|CNDp{;aUbT~z>FHY*^ZX+XGP=12@Pj^cME z!5moqc|30lh<`~!Zi*t=SPL<{;42y;&%zk`!0JYTa7`*wv=?(o%<9Hb{@bZIQC4Shgw;)={KKg@(S~br zl+{fG;OSqjPv~J6B?5V@E(eswGe;9vS48>OrQ$?coiz`vt_+0pQ<0*q<NhR|Uvr zsbGoD0;?MZ!bB31pHdQ7omDWz>I~walaM1_Xj81tiZZM&_!{~jeEP{H95#vVK|6eu zUpI3c!|K`ru`?Aa%Id6j9;+Jx$_G->qO8uM39B1J`CC(Qq8+uxQC2qzfTv9)G*mxg z5?Ngs)Udi7FxMnvH@ol}#g|Gh1NMp}_((`L%j)8U39B1}p#Mn{I8#<+cQUE zm`N0WGzliQK_xogV|BqdG$Njd&${H;6!WsN7GiaIU@n^*>@ce<0d&J$fm>GB4#cfV z$TqU0>9p3{Q@1iY0+g#`&<<-jTj!yH*^L3?)>N!$Pv&DWx0?jQ!>LG7Zs#EhyPF2W z({HU$En)kj4cJ3cewPEp;@LoX46g{B*Ubh`I9?eD=cgh?Ii6=ESY8zvm!)DwS)PaG zc-|;rZb*e|;D0c^abQd(Vfkq$f$4clhPa-=eC}-taT4iRo8o$&FvIrpz+agp$F|-E zZA7U65NfkQT8S5>jsWE9RIn)H^KA4u-xzSdkc!tJNeSzl0K)yLNYVbp(@c5aG$0n; zo>0er{3PLo~pR{{LlBmt2SZI=7Rixc)YVMN`L;IWyqKTjqR znjGMlCW(oymS&LmLV(i#9U2do0%vQ(f3Da^9KQJ~x~OEhxZI3T_~ODLgm zz<78zSPV1`fP=r85Hbf^mmV9;19Mptc2jK7i@gvZECF@HT%m^A&K3-ym0)9+Te{i~+oL zzpGh(O6BACHu;!%^P+MPaax=xJh&oaBM+`LX%{ETJZaO@zlrQBL&#J_*ai2@fn8xy zM#N{o6?UPBf?e`=vR&sMbNriB^po+48n6xg-R6Dv>>=>#9RCS-&UHHux zGeKscw~PBUx^n$)smx4&WgD)H;|diMNV@5<-Gw)i*bFN{Uq>&NuTHssRgJ?fTRu4m zDE{cSn-wT*DWL|_P_Fhvr{uPtt|56HcDn|bGhDI1aBHRxXq~=rdIT^(yQ>Mfn!+iq z_G*CsJdeY%(m_W@0;u~(7SP$cRRJ`EMgWHUdpZZYDnS(m*WPOZ*yZO`1_#(NAJ|>s z;+g7TrIWvp!QrwW#dX8YOit{(y#m#C{WiTj1og*KJ zRqG$SRIUEXrjDVWtr9T*#5JSp9$!@ml(3*&41T-`PQ}q6lX^_G{}D=WH)p=yZ}Ls;+2P76}YbH6(#Q%2%Wc$Ms4?BG*JM2p&{1 z@4#oMk$d7o=|PHa+#Zag&@X;(bGTeX^=g=_u|5h)MPW;_=~BCq~_eozMiiE8ujA^ zok8%Zf?xl?5g{LkkeT3i_YQQ>B0L~JHSb^MQK(Y4G%wRX+{a4q-yLbnNP1V?Lz$?? zQ**8UfAdsNfh*JUK>U3b<`-l)OU+%p=JJonB}TUXHQ>8Z+U={6pP-6gfrC9 z)4M{un_G7k{&EoYKB!%~X>ymKXZR*AL|qmKYj%u5r3voWJ6sbaKXq3I7qz{fd&^)P zHm`oFwVk4V-ri?XFGmzZs>JVcLZ#8|lu`DP~xVJp(jW2gq0Bz)XbB*RCiDZ8b5tU;+R?{+D_iG))4< z&J#tI(s-Lf`HP>Kj3eoGurkEPY3pgJ3`*TBEIj>NrfybOxn{b95g_e9$RcXRoUIkJ zjjAPJ`rkb;NYgXwG48oqI#j^guTb>~aa*pAU||#=6M-j9!k{~tgpguGUpb3V{o?4>y`fWG=Ua|bS!M%X1_p7C6ZO_e`yudAd5p-Reom9(ic zq_d^%DEzbMS&+=uj$V$TvkUj1LNTA%$A7+A&zGaL*JRqB^{Pfz_p@Mg=7TYeOA_2y+3d^n+c>H!kklRZk7y z7b^FpgeS@u#UFkq8}8rIKd`Nzw?PGC5PRRDPCO@3NrdPj*%5yEjU8PZxPzQRncp8C zR~B99eBlj#abi;|XiySNqu9_3;)=6n>aZ5m8~;ljRB=0<#y0|p7aw7vGPTVegOb$; z)E`l+m_E1A(1^!_MR@^1&a0n=i>sXT`-awFoKXbyl`pa)Z04tM5p4z19|kC*HQ+gM z2CNq1G6vYQUYrb{&Qv09=Eop<>E#OT0R7WTlEMEmN?~tk5CYyfJ}-J_r@(v4y~C2n z&Q*U!gn~%~N2;u!9+fOpV%!K>5a%4G6g1@kjF-JU8B2N^gQW_$@SGXcq59Eu+WM@8 z3Ub6E{nWw67oJ5dC_BMFNQ`TGWM&Os&#ik&6p2`3q-?Tb6|i zeHn#nGNqzrh&KL>iCyaz$LqbjmZQv8hMe53{YC42xcr@0_&-n4sGBAF)=STSBDp#b zgP(P(7U5B_O*)P0qV=v--`tz5y?FOxAv?)ewp4aV@|e7+aP_ZRg4V~|Rn*5i^%K)c+l7|!-Q4aTx=2Y?(E5f= zdfTg@q24~Gw`X&wkpx)`rb2h`REN?0EMHdj>H5t8%Z~D88G-NLS>UD6>@;85D4h!3 zc-1Z)Vi(uaRh_6*In=^iZ+U|%a@4uL-V?Z?bt5i+?T!A=H{<7Ql_5LWv~hKgNg6cJ zSv@$=#|b0YqD8Oo(@(Ap%VjBHtW|!uKnZP>?GZ8I?C#heL863GzU(;b;HB->$zBz7 z1O#SeBuz7W(x9@z>2$wNpkIvHMNM=w z=7l|EODt4?@ zLOB%<2y(Fd@k^ckG#RrMw3A9dsVu~qC)UgtYg$*K_62xUVgxGpQ}4jWwzh6sc~}y(qwIG) zVLF>81%xxovfw0cn17koDtL;w#7zvE2VX%Bzkk}@C))F3V^in18=!FjT=`Bb&;el$ zR6rwZptXU)p|*9j_}RHR7(>}NzRO}{&gUF_w$_w1dMx$zo3TGuINwdQ(VYd)6`L)d zLGdQbgPWy1#g|Cy>917=hiJ-g9mx*bA*}XpE3~DnV~G2SFES=3XkswIn zJd~rzwwh+EELv1ALo{U9db)>J(cC~Vf?~hB+=|T%4h%?_qvnRR=pA5mWc$q`3dz2^ zXRs!vFnK=CqB}SD^a|@&ZyC!sS30U<^faWNGwP(12x=8rr_ZPi)jnfo#Aue}pI5y{ zq5lh?>YtO<9j)f-YAB$;mO}N^SLy2M=s&%C{brsSZpWS9yuzv+@=%{Fw82AtawHQx z)OQT~PThlQpzPAKm7F~Zuz!5eg3hs~I{SLM^hedVg}!T5XxG+y+Iv;g^WUeRG~-EnU9U2TyPiq4 z-!)v7tHf1V4O9CU4EJ_cNQm%uvP$Zy2RILx`jaTB6*9~N{xn1n=RYWnX&=`sw{9$WR#`0-ItxXwrx{$ro zI)S2p$ET`i+O4LHb-evO$OHV8k2oQ2trRRKQ`^=d(_*EKKoUk!a`l+i+9CLvMDi8F z&d!i4H>ydN_EcNPMwWqi$w!+aLeW1t(>kq_EW6Kr1q*_R11-}+gU+lq1;9vV{F5sv;wc^*wpiNCHi;XSf6l6fpBFAxLN1AMkz~daZo0?a++q$x zzQ)Ur^R*My#88Jr333Vmm)&HghJhqWDol$scCZX2N!^PSuc+k7Q2-zL`2!O`LrR({ zZljSaujg!#*`p#b&h)ToVusQmXKG69M0MsDj^)2C)BX~916T_e^L{mfqSMZ4-MAe% zOaI&Irc)YgF{;$nl~F zni@Mn7T68Iml^_LR1Xi*Y>ql`0)_7P3abN|4HySLc#L$f!W?sj2Yd(81e52#X}~=2 zg^2%3GU;Ph0N}qKswW0(!hfC^b>B23bbQfDYO#3n?jww4$9l?EQMBu33!#;rsO&R- z+pMxqkg8jSjE9{pQCAS-)TJ;#%NQL@qtwB-SWR2BmU!~n)YA8s`n9x-bhVMg8`3?? z^T2t|K8t58=NaXgYGSk|s>zq5hUX#TY9~qz7r;2f7cOQH=RazdV<`LnFEy*~dCjZq zB&ot<5OUa;tuRqoAmbFKn$m164i54tccoWe>q^ptq@-Noq`=kHg2KD}x~hpDUTuv5 z>FBRGjd;zTOGy}{C7&>&npp(cxpAOzX42MdUOIN};&h3^YrkqWGjYVLL6JD({m6GU zS1}P$s&W}pe&M9ahDgDTQ<-XJ)$kx~#2x6@x|u@Br+&@qi*|I|9j+anwZzp;uJDwH zy>`^)!)ce11J>^xrttxTMtsmkK48Qq+EP@OI$;`OIwqV67BtQYJXp~s)+&nZzReaT z?m^?_yRjE=uu>cD)dh^*g{7orrniS?Q|JzwlawJA_rM%_uRT#*B$EvD<<{&dGap$e zqP4&+^gAuk@FkI8b{m?t6dIvR&t?-8Ye*gNqP78g@@WJL{?sWd6@7V0q{=97ej(t& zymEqti*5N0w0&*p#NOUu3We{w-CFBFy0P8<+rOtJqYUo&GCnhGrOYE-tcE~JPmOn< zBa(3Mm%e4uGc=*dr5@TXi$9s2ObW2UM-b=jWw&s^nRPD^2I*G~Z{l0q&g#ElnC4y1 zs&&w2p9#n~bkfRd@d3rDE(Z)tA^NVnfwQ^wrWW?-#A>$8SI%c$G3zU{xh&Unq|CUl zs&scyNYsKnWPi)ofdYZ61nvnJn8b|-{lF?+Us+uWuV&_O=Zo&LC2WP&7gY{OJ05WN zk7G)ij#2oZ@lsAF`E4!e!cdF#n%xE$@dpc}#~M_(D}H2k)D3r=m1J^?lPERPu%uw6 zVW+;8rkkvZoG#^PDGCaV6@gB|CR?~eu6$~V9ZePFMW*Dx(0Cj$K^ zo)l{eNVIT3V^+Nrg)Um@Nlqkr!4!nN_b1jQ<3o{Q1sh@YJ`4+s`jAoJLzXuNIY{vNZA`;D6$Yv8KR>!qALa^*$6bm+C_n7)(LRd+)YJ87GPmE7?e^ zcVbvt)QOA&CyKx^2s-*6D=^86Vc@72Jz&p^hCz`ZA>e*bkhKPWJc-$pv8>*Yl2)xB zi`v!H^%N>Hn1-Cs-D?dqo)j@wwvkuw$*??)ebe%m7Z?Segvbeq+W0doGRc===x8N* z(4H?H=NSyD5b?a9J5kmmcvJX}v98{mLXE69)jHS{BQ(fE(hr?P<4+M}r5lO${tQcu z8qFw>Z!8U_AZ*JooSA}OpC-fL(dhKRJ>xh>Rsp^0*H%QPqj!*YbnY11Tp6rzclsn2 zpACVaohs7hTbpgVo?rMaa{=Q6s1fmUc9c8nzM7Dcn|CEqrfzzKqdO==ujRjS`e8ph zEvWKjgzZhu9&X1OWQI$Zyv;<3-ESW02UW)sq>MRf7QQ|>WJky8^st4w{q`rFlJo@2 z2BAdcz)x+{d6uYSZ^U)l+;Cb?|8T7$D>~!bbYV%>pGLPAn3Y=ccGY(Az1yd=XNNdY zrwOmZ7pVXee7%0RHjo#JI;kTQN%q+U_G5O^GOC+ZgCLtfi)u=Dj@$rUyJd^t%{vNz z{sWQBU;RNX{@o+`DdPeXeD@A)0X+Os{ozA@4&U&Qx#2eaF!@;chW)s~Gzu?n%e?J7 zn1r*x7Ch5DrR40S9RS09m41C}aDIVT4ajyO_PUupTV>N~6@AwAGuXU>t(+xQzP`pq za#t_`kw1QAU=%-0xf`U$blwm5^3s1>F);V6eo7RK59*=K zq^I`ugK3v>%iHU2U0d0Mn5su===VvS)jeDpqon3I$4|#{&G%$EFZ&>9gi|L+R z;c;&FcCOUp&;HJaJh0!|Vr9hmm>**?3>{k{Mp5A0XW4=}D0}Ea(JrISmjZ9}BCk1& z;frYwwAn>^9&ebDopd4o;|q0{kmu;29TLBqvy$soUdVuLKJ8!h^6tK10%d|{+p?L# z&aLv~&Sud&yj_DqxH zL1D{=By$U;Q>xxJl5>xF6V-^mH;Ep<52}DV;<*-5C;PDk%bI?Ql0#ElOQPU;fFAig zADk){dlp1_L5K44cLU{@hLtY@_m?4j33H*zto-~xHmiIDd6`D0hFu z^6bU>@@H0Rlw+n*a?xS+8q}8=8r<>P!GUcnc2HqinlGZ*|HKs62iCBDWBWC!QutTL zsM*{G%KLaqNp!6jyosa+(-1P2x4LF@M~F@U%->B zGKVyQ=TWm|R*W9xWX451$E7Okb~5UrZ9w*ti4H<`J`~=rf6l@>btq8uI?Q z*vfTPASrcz;i+Gv#sF~MjcXp0M3+Ct9`@@nQ((=ISgBS+myNmY*_;< zMdKA_dp2gr)b3I2K@__wqsn4lLXa^+FbX{`|2L}-2QlT#H!G#>yA~_dqUZ@ z2$5BnSj2F7VtEuIKDHzzik$uhursYXHKDHV8)R!8l}{daRY{ zfM?iP7+4G{1N5cGTX5Y*_8y$cAiKnA6eC&6IuEfd_LxV>8ks~KPP>Yr2thAcZUxHe zF!T0GgSSh#oC-{(pWIQSr=z=jwg-8XI`|c?G*604S=x=u_fTCgkOp9=UQrnnybEfY z2g1n?$%y-Z#Jvfaokf*5{wBHocB3p;5eP1Lxp87ALenft#%-E}V9+dW5+EZYz1?)T z>E+V5I~x#MMU1G}u0)O4AZl=Jmq9*7ZBfU3E@SJs#BoM@M%0Ys(u`ZiZNA?*=T}wl z``+72(Es!2d9-uutvXwsI(6#QsVYloZsmv9tnsLFW!PNw^?o}XA{PMkR7x6oezhx- z?_>O-vcuw0W#`G17By&;O7XOe3r$ykS@P%^2YODHo4WjR+XiljK=_Xf+t65ZCvg%% zz(sMJ6zLJFLoC8I15%dU8UR{fgtJE4(#b+tgi(#gD20hjgET7F39}!&Nl(f+*ljZVlkbUWV{^>Ta%~8Mle3Ro8B}vF^uPkft;Ftwi;+^&Vx~SSwH4Y}k2G zFK8}sng$bLoJKQ5^4<*|nHs#bfsoF0ZTY3K-a?$$p_@xPBS+(TSNwlVYq^TndnlcgiFp=UJ8}AE_&KG4(h$zrHnZ-{R|aa$hI9V& zy<8dT0JqZr4BE1*Z6wDNo}3nEr<`zbpCayk8K{^$K}5d`2(dd&O(J-mW4$KX!q)*? zkK-;jTSZqH$y;6+Nat*Icwex{NHT+ReZ`f?52T2z!B$4GfhuM(C+BG7qjSzZQS&f9 zV~nGv+un?uuXfW7-EE9oN59gpl4v8{H@(QyKaV7Y&iemhvu|8u&1|lFKL?Xea+r`f zqdBZzYU(|X660g9t$|sc#JnCHauby;3F5M`r4}Fqzq>TBrQC-s!U93===7j%;$%529N{aqwz*80&3?5>Z$Mm?`I@H_0zO;Q< z?+}6eCo6F_ zq|)8FrHrTAqiIr68m>W&pJgp><@n)Bq|7DLGqSxf+=DP(s^B_j*;#rtvAl^XN-D`q2BNiRG?{#Ug1+x3J1B{Oj`7 z+FZ!P(c$0^mZNFb&A()BI_Lb;-(C5gFaS`C)1QGt~|ck{fBG)il&rdaz=FQ2#7 zK&7=bw5c3Lw^-Fr@UNW2m#BtNhsl&1kG8T)(F(C_j3(LYRr{+ECWE_y&wfmnW2`-y zXytE=+9PJK!A<5mX;>g70i%6)+3>PA94COjcAO^biCWoi^_zYBobv`W;linR z-0C^z>M|ae66fo4SsTx2wF-<4qy=lPgFzOeZagU6{p~|LFcguY*tC&jtCbY|GEkyn z7h&FwtwsYkE3EzwjMFW+Sa^m&?!Dc!RRfq_d^0OB?7PhmLN=8@T$SH%4$QYpMGCXf;AeUNWpEWA>rT#6X?}hI%`sDbYQRX7C^>-h# zPp^0%t9bS}%)TJ$EiG*rkV-~L$M6Sj7cL%^awS9s3>LA36p6)?@+i6ra4!K$xg)xhEYy|&_0 zAMSwth@*B;rA{>N;}JFFjH10YalI*Qil0d3CnQbtyOGaCG8^eRc)(w+;%x<-Jx*OS%b0s#Gw_5Ej{$M5Y#sn#v z&+N55&M9R`3<(OS?CK{&qUtkqLvi9yGJ$u1?+#e_9a@Y{nMPzE$E{Lq+Z%gSGvhHS zsSNic(Fy>Ovn3S7(^5*z(}r1xP8d6|L2Gxn%f*V7XpH>EM*`m^^$jpXuKy~uB56Dp z9aPIva;;U5?vZJ52p9C@7c<{&m-1}Y&bS%(Whck}Z@2?b8pnBIU7$~nmq-E?4x*E) z)4v<2L)sI*02d?FINc$tL{sNiB2{LWEJp-zzw?tWoWroC1f?vfKD5GmXvEzw?t z?bRRnwnjd}_-_17=;Xu32KqxTJjHheExw8VsDm^Y9aKr0RNSte(?aZTZ;&hFs!V7)bxYDdXcCfaO^!2Hg&y&3^KMib_ z`bxT+-9jEAGoiGOyV?6ik}z|QD~7q;Pv-L`1zhK>Cb&M|6miCL?c$WmwOiP?bb%8y ztlzS1isXb-k;vy}JlL?i9JP_~j$Z}_Y+9UT#Gq3xJ#<0^rW-2c%!j_brs^ijm>}04 zxsTz3nli*w7T4jVPnn2+{OdqKslPm|H_`FdMSsa0o&36fCsRlU*_mdabrMJj)~k!I z*ch~&65>j`ad1lohRYFk+Ho&AV1hPZ+S}rx(k{KweTMY?=kEiZI#pqC=&o0_G<5RM zmw-@5-5d95tSWAm62*ShtyzMAaABfv##K{HU@6~=D(HLkR`73F$# znC2}zda;=PqqYCt|9UvN{z1#f{<&jb#<-6dNmHc`R$|p1unNmD#8BbDzT%`935BgK z_7(R%8FOVPI>VG&5JE@&Qdz0ArE)wWT&q?vVieCvi7DyNjFP0124=cSor5^0h}zM~ zi^Tq)T5o^l$`@;Y3puF>1)voZjcThHSow_+uD_WUh4rQ6F5s%7KK%^Vq_1$EPwcU@ zXS_eKmQXQjyQx>)yj}Qm_p6P&INGQbtDkd#MfK0k8QFK$*PIcS5mpaltlso!-%KO6_=I89 zt)?jqFV8{Nr*)&gZ?HRRCa4{c@gM^P^)+S};##}bzRae@(`tZNur39`iXAG0rDnqW zLM^znFxT1M*H;?S-koBzpPu2#ve*#3E*;!zm~{9aN?R^WLr;RrR$DGL7uld$T0e%d zlEKb%G()W2XL{^);;EhaSY+T(G9rd*tx^fcZKAvMy$@e+zIXkBry8!q7u#PIsSpeXrqF@$ zxU@1C;2V2YbchhU+CTeSw$g5vW>^$x2xmGp`=)Q^sxKjf@Dg=lDGj-Rj0-&;-#@#C zL0DLfnygw0;z-MJ$!hk6XZ`Jj_-R56v7IAk{o*zuO;>Bj_7%k{xyTx_Jan*S)wZJq zg}|;TA%5cW1g#h_qG|P8FR{X-mr|6Pyo|+DGA01$O83fI*JLVZms0hM)>@6BbxClC z(%>ctE_zO;GQq(`*VspvAHC={nj{;mw^?i1Jd)LduoI7qjFg43bXWtCErl6R`x=Ou zC7DD(%xV;R9Sj80k~OASBk05Mpv8tR?ZwM@q^IxdKo^#}KCbDPQ0eJMm*AK5wGZ`2 zWwt!|g&smcRT&;ETeUntmugkRa;Z{UQyy6_7gv;7V?~DtSbrDGrrWGcUt+-kz!WNk z#cjfUXIURjn4;(EMy*8+>OXm{HT{SKp-w+~O%6Wezxt@%Dm<2W%@028DkNMp1QIc( z&bN)yrt_m_ws=XP*vHs{Ed2HpH(1A5`}9uF=NzrrsKCnSZugCHy4-^oE0M_zI@{=B z+h(?TNoZRGAvjy@Lh=s#W*3EfnVzIC)6;qd> zGZ7*rwkfu3>hak0*)=@HQbmb~g>onq| z4uu4qW<_#AG(+J1I|Gtk?O64Ix1)?VGPHG!Kf7^9E57b$=vor7<@W*pCP{~`*ZY!l zZtlC!KG#{WYtcasbZJ)XQXSs-pfNNMU9bYjL!$=GBq)Y&%@$!?Zj;e;#2Y1KI+PuF zx{;J%nM_@IePE8{VW!dhKHXGYziYSEdG;Rr>muYcX64f|)al2NV7Rmq{09RX?^UKm zpJ*0Mu<{8v2HKVj8|qm@3!f@l=*c_E>R-Bn#)J-MI&6bi z(mUjt>1d4TUhpc9){8=SHnO4!FLXQLYh*8BwFK>>HbVJR0-Br=*djWxkOQPOU`DSt z%09@yGDCZqJkO}`{c0n--gRLL|JEWQJ@lGtp8L&as>#tX-5lBc$+M~#rH^|?w~=W6 zmC%!Bz$MPAz7!U1K|;AY1AKx&|KYWsew!1S7pvk?=oF9sJ1d^hkyl@wCVrA|2gZ`{ zA(8~~OBYOh26&l3M_!i%4!fHqUZInC{rBv|V@Xo=PWDpRP#Y?)-7u)KGZ;^Zi>JD6 zl+1yr9dR8zBoV#QSa{T%0xO!a0#dt_)FiyRzVmCb*2lam<(Yz9s*U65#h^%q27qnG zdzN{5T}`671=8@iHwRiYVzRAx%kL2b(oLA2;xq8?I;?&c9lTRy?Bk1+GHFqdKO<$0 zYY8fB16g_^F?~8<)QH<1K#`>~*%(nfrFfF<&U&|}*tZuF!E-|~No8I+iCaV}x|o@| z!AeG@L@zGGl1hR%@ub!{U*=;xqagyoe{p^X>T#p}fEDBEADy+av{Ny44B2(`Y*c^t zT}IrtyX~(bp0v;PHNKZb{I%95EpvC0t+u;DG$oyOO{T6IdUC9CBaT{-|p| zmr!wP1A%c$@}xsvqDC*g7vV057YS4<-tMObB{1>Mg=7HD@`OE_!U14C85DlLRq4;6 zOzN*XaQ6kUf!YOw>coBPlZ0^3JxL+dAW+^_Q6b3acOzkbA>iG+Xo9e>d#}e4sNJrn zs=>suog+%c???B1B5B8Ui=%{n@B2IsbS4OHGfhocs=q33>`g+ICW-Z*-~Vv24-5`; z<4KAxO(NwrbPE=MxXjTsasT84|G&^smIo$hi2IfgdKzYt_Fu%WZTyZA$+JG>ky)2# z$CewuuekVlhA$ShI5|kz4}2tv!`v28%hZe|0c$bmSjXx}x%JN&DRMW8#*GWb*Zhy- zR~>IuwX8NDYh`m~MU(!Crik@tANAPlWHS1$Ao0W8mKy0vUfZw1*+=K_&k)2JA4`L} z6t*@n=17 z+ik)$rnA~m=>nNn5%3V85R%Ta2zbcP1RbU^x^3?@=ERi7m{FLWS@h0&JSmS2l_*bY z&UzqFWfE(BICyJ`1KIGG;n~s6GDr$U^YbLSX43{eb|b0t(2YJ#Y^af+AeClk3|T13 z)eOOxKIgfrDZtqwK^e=M;ftXr9pcXFi*&$-uT_D0opq8yO9Sd!~zla zuQa5vZ|G@?*Z;g&ej-X$%frPM5}IEw*Ut5JMP;&j&DT833CCHx-{*U9l9%;*+$v6{ zo^yoPB_k%PfAK#Vh^G*g3J0XOs5ItKlujFyZESb{*F7mP(_n-c1fE*tZN+zqRr0pV zThv+#kEaPGDh@LUcLSMcl4&wY45e>oFd;nWeA?s3)QMfqflJ`ilnM4T-}T^wOlQ~f z&cVLE_Ok4YvfYYl-(GYblEBV)TC&{ixt6-3`E_ZMDDmu zxj6=WvGI`ZUs)kQkH{kza|Nvw7y7_~YKcpHZqpJ^&F4uCR_2Nf$w7iFo|I}8m*Q#^ zV(ru~rMOZHx0ry?{Up?+kHwUd%`>d{j`frZw@sSq(rlWLWFa;#rAiz2qeKGnw3c`| zUsS?5EdR9Gm^4$Y$Czh3B_%cugSt=c;hw1wQy6r_FkL)ulM=B% zsEVXuC2&H@6eMn5loCAS>WgMPZ*enH&y2NEmm@x_TfleUw=jZ9t-1ZrUVFkwPPzwS zT33IJPIaT|*6cbuRO&~3b3HEVK)94B$BF8POHR=QGZ&Jq@<{9e87;H-;#JmVVVFx* zItB5BlyUUXGk~P$lLK9`84~lU+Uj2NCO_6{n zyRK0}ny(}GsIX2IvWgIT07N`ZgztEyM@+Nk+$x`A>0POO%9UDbdS4dInzV@BarHs6 zLT}ZpKgWsansWm}SV*Y*CwHrfG$5bfZHJ6CMdQeBvsKHr-l4rkQ4-sDpWsGRdJY~- z?>~*(HgVm;Sb>gTD5lMB9;-j$L?iTO{&g7>es_98IJXI0*qAYj;%ErP^c|#_B$@Mo z0vHrsY{YF+(e|+J-)*@l;*OxoH2J1IILe;^C=Ngg40~`^TEH$D&IG##mp@_zPh+c-o|tJp$<~%T!|HPlY;`c`m9^X zx+?8@t*dkrreMuX^3&!g=a>aSzEeL84<@c z9utjV_UI928*rvIU&JSdqtjFc5cwJ&u`1XgRrSjb{a$ly*H}&6{c9%A+n?omuhXo% z>`4p}LH%{Cy@9nYro67Up$Xol%3E&SFSFgc7LN_~16;SwAt!aT+4)XpTmo2k+gXfw z$`7JL{!*2p)HXqHWlc}}&>9#ibUI1+Ss*1iqHcb5Y36A#dKN-gi8E|``)bcm0*Lk} z@4DiQX|qLK7}oI)##_yk$o5o5c2~+nyhsRLjhNUtab3J7;H-A{Yprf@{=K^tB+xzRmDJ?hl!;#& zTCqheTt=&*j=Qb-U5#zEr`U`T^=1>yez<~dhQ!_a{0xzpZPguThy#iw+$$bff{AR1 z!?RFJ+!^$1D;S};4w5K$UK>!WA;HBMYDm;@V8Jnm;gAutRBJ=q&|~gg+GXOedx4>S7SZSQun7{+6u0`jAG06zw_a^kUww`J%?laq|ee%k+9pz5+5be&^O|+XBV?!XxEqoOCW7^z??_q#e|y ziqcsyVTw%zB1CF*)rr(Pc$59QFSX4ak*vUQaH6QqmhP;pgkmj79|UKP*+vXhA$7okM?wE)HJN z-Z^iNWu#+bapIVMeGrRZ_P36d4)fZ5O%RrXl} zbJi=aH;%r^fQfsqM`~wW++QqPi%ED$M0~{o9a!A$)ImHgjH=+!7t(KWVV9TegSI5i znPg$QWDHc#8D>~q;D3hXJnwc-mWJE4qZuI9dB87>AMX~%7uw9IoM#pTh6860@Qhk3 zA@6vr$6ziCFCq!(?8RwLz4j3Fado^$F8ZtQ`usW9< zWJ{vdWt5gl;k)kelpZ&6^{2nx8gC*Hvq;EU5-RF1=GUjYubO9pYjo$L(G+NcO&&d7 zgF5z<_8M)mO_Fhbw+aiowM{jqN=L1)Ob&*rKnyRv^SCgzE)3JgQa2*uoQcPX;#2SR zs5BvG{h*BoRXw?tAgPZvxE%Ai&E=1$q`(yFQWdTY3kbojrn2*lNx`PRNfPt%L!PLh z2b6Sj)+^|stv~&4tG@c(_BXd%*YQ8YyM)h27`(6t6d@Gci|b`!>fX=MYD#-wYV6)` zzv|!nE`#(e2hrBVeq`4>RQ;rsC^530vKc7b(kNl3M4mLnA4{Q}B+75S$58e-h>8*> zkqTN{ZtPQvk4?Y$K?5b0PLiz9r{J4JEJUDZ-D3dW@IL#S5$JfDyM+k!TkkbUw>gMe zfjU(6q&*|h=`_ki3lQk#A25`Q9mIJAI-tYD2I3Ukyz0XSBP~fRpR_x57I8_DeylKd zYmReV*z2r-UGf#TNrCB}yD`=5C01eV>WodtA)@Y51$S&?c|S&iralq~OL&&J=>kKx z?~jMIS#eu=%|o^I+_CG;@U$ zAZH;s3mkV*bnduf>t(B=NrK#WuLm7sus(vWVW$ZZx@L)ZOJr^fe$EoAkb$GYkWqra z?>>*lyFBPK5kNr8t81krkx>umwY;({OTCr$K0NdlO%lVB|Kl-fN{&J!L$yOUBf5so zv)$mF?N!M#Dt0-N>^7BM0!o?f>pv0bkf+9(Q>W1)TMF*8*ETbU6oQ?{&&S}tgSpi;NxoU8zOV{6R zMD_82QZ3&6GHhJgIyBhr)9xn;;6wKZ+L!afb-tLg=pd6z=a7hlDhHD{g7*o6+x@8k zHkt4y{-;946%F9NLGSi)al5=F68klu0FhyuLOeQ(N1OrPb!0hA@Xy2v>hjhVa99etiN|qOOk}um=!sa}R z?7G_7P;ZfYYoJwK(I~OL`LhALc*p{y-IU5C*JZaN)s(GgSCp_CrwLF`f2ai*C$2vS zoccn#ijGl$q<+no{*!^*I*7>b1IEVC7XmvrIk*f6KRMWHQIdF6w(5)d4y;Lqu2Z7x z#q>3c2SAU!{*y%dgwGk$9L5|z(|^bQZ;Q0Cv}1;x<1s1HQ^~!MM z!V982@!XuiC-O+<@YXiELb9kGxm}pQa^ah`jvs#fD^^e;^2!+p z4vU7G5(_=aA=gZCJ@GdNO&rhYw0J^#NVhj>ZL4)K&;mjvl3j_$3GA-l2WlirsVwo{w;E!#3;omnQh<(46oWoN zs89T(hn`^1!1DytMxPfO*2?Eq5{4xxQMf_cl(~GKs-0(^FC9i2KAzD@r=p~ zUol(YaEF$)+yoh_j^Z4y&Qa881QE5us8kqmYHo#)b37&GEM|HWlCefZVRh~m0)PUt z{&6{@^=%FIH#cB3A*86^@2|7+xSrpYKEzmsJ_N$2PO$PPJTmzmSqAz&ZZ#rYM%Wmk z-ptznbyBhwP8&ot3;T>KizbsWIYuxojQ=TXeJl&(p)@xk3R`S^;5#9U1cU)jSkqO{`7Dc>q#WI z<%+N$oDGNXD^>E$0x-bRRr?Hql>hGd2*zRW#G%#m&%Z{(ZrEXPaL#J+@L)5bvlbfF zHNv?fh=pju)d6mS@Sb%^60WU9gv|h$nxIIyeoAXX6Vjko_YPyFF^pWofvANbe;Pp7 zmBlgit3K`zB*iJ`E*y|(hAo$@@x;}J@S9b^Cu^$o436}5t#0q!ArBDji1KWG`Fv2s z2XliO?*nv@7r8)4URZ5q`+d*x)Z}*dR*5MKk)yc+~+8mW7PEn}e zYsr%Flo&iUtVf)Omw$;Xf~%`?sY#Hrc%>kZMoG>M>jGJt8M97r7YVea*285ioz(s* zVSYV4s|fUT$tY3W{alY~LEw3u&Qf&}4E48n_TYNK6-{`KHuTp7q2F+&#{%b4B6zyD z$GfHV2Ac=5`UC|kVU@QIiF|R7j0EGiVC#SK+o(cy_P$wNtGHE!ZVL<~ZOL*0uaxN3 z4#&9rs+VSr(&rX#(AWFBYu2luMvz|*UsR(JQ81jhVYY0@4KYK zkDpQY!``b6yLiBwrmo=x@PcKp#-co6ER%(BTn+=d^c1ycN0Z{+=ue{=0!JKG1~LxV!^oYH7xbbCf&a4sLf6~p$b>nNFg z`U^d?RhpK3(66AnR!gTHTuz5A1o(?ufORY~snJKjMM84{cFztH;HR&tK`~bp8=i^r zP#dsV*%+&b}KL8qUB#(2f+kUF*4 zQTJ+w7=PU9F$b|bO|V#eTzDx)j1IY$;wPV;SoJ1*75DWG;xz_>`)0|5wU({gGN4GT z?VX(RS|x51Y`Vf>sJbQ-n)w$^6U{sO1G>~mdHX&aDdL)nQ19Sx3m=Vh(XZCvZvN0g zrO_oUS#?zTVTL8K79cFIlk>XbFQ78IVWq!Y^>-DMHAWuozum7Aj|FL6GL>brZ5 zqgTGz{w4>Po4jguu4EAmMH7_A%%GP`po)HlkY4`-R=k%Lb6p}OM4IlIt)DByrE=up zK5nmvpPVu7v^?E_(h01=1SA_3N=4p&bFQFOlCQ01r)ZfpuH0x*b@{4x5SH#7?c8`; z#AmTThB^u_Ly26m4`%LS(y-2D2=j;ro3Ihn(NLFGgDyPw&sZ>yN>eSF*+(hVR6v1V zAp5&t7Q|pDUEEY91VD`g8i-cV1kogVgA-^zHGxtnbYu#}v(88BPKhf+0IO60*tP*0 zByS087)^T24vB8^GoBQFlqhU2YxF(N-;AO`&bZ)G=e%0VG&oQyONQ1Dz&r$mnRL+Uv~S`Z6fa}}^P96{R3jc^XrvP& zQqV!iah~kv&5SN~4Qfn1Y9;3bw|NOzh~r-_1Sv_QuTwDJmDX8?$&iBFdMV@b1ypNy zmpVs=aT__2{P2w)ncu#1X|e85qZoPP0&1p)2J7ra2Nz5hwE)T^LauX@541;rBMW(r zO-ECasUFqqsQvU>1665-s&K<)hLmr7OW;5)ev1tSy{QfQ`!M!fI7sXn=q&n;Fb+{G zkv`_F0l8QW^No}(iBdPoFl5hhD})nga*wL17n5s&kopo3XWNxJU(ht@W|gO|aV0Kt z7%6Qs8Leot8wSdR_J#np?mC&$g)qPL&1g#+kg_$-_6=|I{02BY8=GP&OODMMc{V?{ z2AEknfg#dYYNKYh`kxxD>qbl_LPVJC=VT0n9f|f)bkJDp=U<68c@ZU`&Pt!b*;vB< z3qdS%TC;u67H;v-eD~d-|Zpr zeA7>O_wtau^(kw3n24h^czt+SltnbsIXmxpj1{2M%mW?0srcLfg&|lzq-o(;4*VET zoaC1G=}&m<`ct(92;iK{!zei=Ql~o1O1e2GD1~YX8EHzP(q$#8)>9D9!!l8Zg4Upojay#sbj6!)>l)PyUK zZW57MVw0;0UZ?lzDlzm74b_^#GV*f{8LAUML0efO4ulNTK$bw5Y=uLHGOsnL4AqJ-wYEF-K&c5O)i(~jxX54M8pf!f%w{J&lw*lRR zN=hjgX`CnIS3D6k<)CxYW~5Br6L_YgJfXLEX_w<<-I@o}=`0f;7dYgr3n9Gmp8y^a>Pc%QkJ9(4l})9(x)i zriVV~F(%wwh0tISLOiEeVmKCSS<$4c!szqXy6p=Aig;RgYjDt3bQV$wy`1#C%qGMw zLbYaTeC8%iuu5uT3TtQkz#7S|qu1&1?x=;|Yh}joNCE8e&x4l<CUg+~Sf;jQZH8@FiPb!NfF^ZGIu`bUO)^F#9c^qBtB*7k!zGC!V{7;^4 z_BbqjqQ~#HU-R}(tsb}7C%e3bh`#)_1VS;XPQ#LE#%fP7Tw2wfD)LVsmuh6?>qyBc z!W4=5ULYzUn^O@Sz@Q1!gz;asU@cq|9AHz083J1}<)sz~OaVO(Rd6WW=+6`Q<7y#U z*a&w435|TXy=8*?NCGTKW}u;FG(BZ!CFb1J98I$M=f3Vm5Kqd$*Ryue&!0$osPFL9 zDvI}YPqFD6zTrXC$%W^O4qk-a#Jc5N)Tn*d)yi_W_RkmF;E>G${DNqlK!5)&4?O4F zZ`1a<1ctVvV8|`UvJCiobd^sTMU7$zST=MIZp`muBpeaGNO~$2@_YP9xN;s-y zJNmX!bn)*4Wx5yYJ=5_$=9!9j=L-)d3Uz?)DN5V}&#B2T+_CeXMetphXPsBv1k|%c zK6p15_ZB^XsuF!+f*;@HQNPws|1+8$?MH`de4ZZVJv-GCva(BTGw;1thI1!UTm9Ub zo#yApdKrKrCTvA?9zV@ zUF(&!aV5Lva`dXt^q6MNC4cbB;FDZ5ti}1sC0`~o9LyPRdhuXKlxOP?B%sKa(iXAK z3(0Coz?vY8Q~nqz@~{{nQMhzvoVQd>8Qy+Fa($j~K9GT@vGe1g&7e&X%Fk;-BXtUS zUg~s$H=7&H5ZXuol;&Ayx8tBO33HOL?)q~Ln50zUXDDS?AScGH&mR-c<^LPt zxip@)VuZuBWD2D&F`Zs!;9y1HN&vr~4G=f<1Wet$hj-vdCJ5DqeH1-v5lnydCjJ%Q zI7R6!2%^P!gkVta(K@dK;h~{DO}No#xUaN!psTlipy`U&P%c<_YS?S|E4Yl5YV31sZaxM+xPe#d8s8VcaFiOi(|p z1(F0V0H6@~w2Pt{Lb)(E7lF@{*ESX;L4a%_sJGVD07(KD0FW-qIH4R)Kojk@xWYU{ zJ!gp#)*fc@By1s_IeX>Gr zl?cFsf{hW*nuZ$i=2Wl%joQ^p5N|l41}INjZDk0+NE%dYoN#{sh#K(bRILDw8WBCx zKs55Nbm&}q6##gpYG%`I3k0EVK^rSyc%o;aT8SlTjtaQK*}4`s_+Dt}E$K(Z<}-gQ zY5NMZ*uE6}pp?@D-FK3wZFUqY?gb&Bo|Xyqgp(HloyuWZXY&XssBWI1-?|VKWT5uI zNJ)s=JWi<3I^}p6sIA>8_(8#22>L4vK|uxwBKy-d6)`K6kwOo<HOKaGRBUnby_9Yv8pya@un__SHr zn0ExE!TLeaLV({{AYcY|;4y2~z?$LRVHrpe`%e!vN=)W}+>e!^&w*heW{ge#DKw21 zC+kF0{PK#W9(c4E5A5|0HeoycDtV56NVBlVSmEoB^%c3feXm_5X<4Z)#a%KMB`^}n z8bNo^5jDw%xTRJVqG+1HpYu46B!Hq80mar?StzSZ38*z$?XGmJ7@Incz7L3@!*_l>v{E0-vtYwW?dcv|8Y$s09&{{$&0Y7U(O5f80Q z5TNZ{7OVakHMs|JYDN)tJ;}wcZJNc+uX6P4_dBCmdCC&~vZ2BLXp}@8J1-Dpxl>v6 z%5p<-$!8>LXUn%AilR~&hP?g{gm=R^29K)#X6A8d;2ZfF&jS?1nv_yad!v@sf0XU& z&SiUm*Xx8?9&%^y>yL1r3GB`~~PU3o`_eXiwe)m&- zD;4t(bZpJq+)iCgu+ht(c3h1wM}#*TW1H2hs@uwid}X_nuc4?W0Jq6nYAtk)`2fO| zX6&Pg%2)cJ}{=uhvG`^?m{Jozx zLItkLWInj96xj@+e&?Arpo;|biBWF&b(Z@2^fxUsUP-|nJvu1urh_>DY8`kWV}W86 zWvoQg#Qu{@YfynLi9`UZt`9BrH;Itny1h#M;0}g~A#N3dG}`LUIFCt*qZ|?L|7D7e zz|r{kzT#VBXvDPC)2vt|&4^OjhBFM*DtwmzW*=pI!hDA8_{cN7MR4hkT; z4V87H9ZD^H$E{MLHf+l3s3_);gn7Lk2Fcyo{y@{LRnzNOTfgbnrBJ z2H71Jk(FCKCLONX3@!TPZ+%m%H9E$>oZmi3S8hONL+BJXdiR6cIme0lUE`$U#La;k zKPWQ3)vQK&ySi|Bf_UAQ8lX5$H`pvXdync|8I2RfRae&lm9pXH3)FOsrgZ#hD&M>I z=|p74=su3G{A(fH0kNyPYjuc2DsGcoUbn2lrldQJ~@=!4xsm=7MNFy3&-TG?+OR`&Z zw+w)V?3~mBnkTU9YXRlfi6Y2sonWW32U`cjm8Q)lyg6JcVY^_IFz!#llIuhyp6^Ct z14Cw#j0VrCavq$J;S#(tS0FE~ZSU>tyR@WVaM;VZJ*DKirdw^

orzF~bC6S<;VIwPfe{qyHu9L+VEP+!H~ zV$PHHA8z+N1hR(*ca#R`#ee-Ibfx7zfEOwpCC_z5S*Y5DI@m2ooo(ha%|nX_^eSsJ zLmJ-M=V>u{a-oA0NrPn_c}U3>IR#1+5zu%-$k5TqXd++oj#kxfQCq)6q!r;O6)RM-_&-(*UQk#mIi)+7c1O7ZxO4zJ{p!!6lb7Dfds?&rKQEs)J_z-G#^1I!g~ zK$#8Uk6dqgJ1~U-^-&^0A%`9S;`(oud|Z~+_!Ne`eTgUKgQ0>oR#Z44@kSJy5nJF? zB<5cSRWwFXJ^9UEWHvxKWD{dc6v-CkZtga-Fi#&>Wbj7Kgn!%Z9*+mT5CH2C*^9>5 z_;GJJZXi1OMg=xJ_ifbxur3M=&Kky>hgS3D2z|*rYhYolAd-o+51x`f*G`+8ijmEO z$)ZeoqWJE+=0+8_c^$zaB~!9-D+1FkRx%I9&c4A)DVipxzW3C?m|2Kq4CY1`@Q%uC z{LVujNN#x-{g?eG!{_kuSeDeJ@KyebYU}QWkN@aPB8_n!lx3(5VfYq~o-(Y(el58dk`RgAD82mKJ z^GL}v4sM@1qhSIKX$#YYvj0O1g=QOP8EE1mL}P^U-UO@>OtsV{$OAD$2LG z@Fw)VTz4y&CKA}UNCBL2O`=D>c~`GQsHE_~zT$P#bX1zsn?$jDgKPk68vHy=KfYtn zaH+DoG`y=+8W4`eNglDa$%6(RL27}dtAqCwp?bXJA9u;f>L>O$>#ryUmxpLXL!TzE4&MibQCf<-~wY9(%yueMfjD}#94mvOO(fU_?; zX3M$ij>wD~n9%RZ{#V2OAv1vW#eUEs0I=jZdV4t@3vWHQZqBZ;{O{!`l-*yD!+C@P5aQ3f#xp!$`ja%FQtJBn7UoM+hsG1I3YE-uZC-Z z!)C&p`Lc&=z9L-;ohKJes}d49SpV`B57UE5PPYppQ$a$w*eoHqfvMTSs`d`(l%Cf( zUEC&pr~`xEZ%zVQVuAMGq~kuP7D$9=YP&G$8ChbxqB7}u$2UA(wMAIxF}Xdks*zva zP2D8~mL*7znF9aDISj*6{9eGO2?OBhBRATT4>3@`%7C2}*AV+JBld6)HqdJ#Nl>e?uD*BxU03dQ&BWi^4I@c=m80;lw9~<#p9(HMADEIN!|)T`%t^8IQoLi2JKS( zWRwQNrUIz6EmX6h@q>r3c_-i~>3z}nJ>6kgrf6tT**H(gx^_XxbX{mS5VjG^uWDgK zkPE!kT6hAf9_VyO-4`%IbSR2+qUZ<4*=_$(gG1iH|IrRPRqplRuWuACHC2_iB# zq`dOSo}`?yWR@M&cw!1rl^j0^p7!rzGqy)j$ z5p~|iZ&I^~Xvdh8i;MdpGuK|94_d`=RS!0w+UB*DA>`^?n{W5x$1sfwNr zcRFUFdU2VkKPea`=97;G3XE|mW0nMu(Y?{JP>kFSAdc&Q8F0zya68YpaOXKOVjyA{ z9(M-a1+Wvg7PZD1D^4m0iVuZiZ!1vDjkH`C;V7JB-K1SZ@nII5D-FY~r$?mop%-G$ zD`+O*r&zKuy!sZZWqNzaZ=n2dL`b81IYzS?g{_v zC5ZeNXhKi%_|^kz5Z6hpw?I&LH9T4mwBfvnzrBqPnT)dJaH8vG4mDjqJn`A-4HL$j zc9^$5G&W|ogR!yoYdj;eP*wGgW%C^;}-8*%iZA!eznDvS_=?5@NUQlg1M zh;N8*;g=WiWhJb@Uz&&vA+fKpyQL33krn~qYf9UE*)ZWO)4%9|z;($Hr5rJBZ ze*Jx?94F6AnPIW4(+9kxW;VR`kpX}To%e@vwQP=a6+E{z(m9?h6hASw5#*Ck@}P5; z*>tHgl~ZZ9+N>r5(9yrml*yQoSuJiAK`Tv=$7*ZZAuCAyyv)QiH(@sBJYCJC=lLfG zx)w;vxR7G^W6kf2QN$~nK&;t}sEsK1oDxtE4-VVDx^q26DResDK7^-x!DNHof95w{ zW%7-ug_P|HLqhXE`!*xz<|J8bWJ!uEG)d0QX9lu#!G3qe!dkXnfD!b57O4F3d%B{o z0GtQxx#*hy&~R~Y9;fqh)$4YGM?D-azeY-R4XpJrdEWrdm%*ylgcDd2y^_sKpbx{+ zB=A+466{KOP7)eu@M{$vl7(@|#M3%qv?3Q#iX~oonFthk4m!5v2b_y{fslAgYAM&_ zY>3$Fok@U)TzPg_`Sq%oEpD5{yTnfAE*Y>D*%;;fr^g35>&OQgc=b_-zUSQwCTM^Y zN1-UHa>Dq=7=2hJ7bwuJf;ZLGFvaPv&M13TSI5nFfofHF*mddrbYL?s%Xh~WA{)Y$ zRoOqgyVkLXRtq+I5O+FGke|O>=J~3V`vwm~d65gCT_Lm*euSA>2;6R$ioO z(*KX92>+VKK)9UGS}id{s%YNclggSqu0Yk#kJ{M&x&$0n05ox^0Zp@m8`Nj7VqSMw z4Av-NygdPHH+><(+ReoZSkI}u?)qvL=)p@t z42z1QmC%25oLFjzB4w@chN2j)Xohg#ab7hSb&pDpUOV)iNb=5fBW-~$pT-I8S7Nk`KtTOJJ% zqQ&z0yw0J{3omHuEtN`_%gMGGR(SAy&qk`^6?%3hn&Ib77y4>-faJ!vKhp7iIijoQ zFSA?DW(4Gwns#IiYB+gzCBK&e&UlaDQ*mE>tK0A^70Mx3?Y8@;=ocl0gWpmffdgP7dmil zUp#JpCkmu9F)^;wiLrhe;q2vKo&+c550peZ6LRrVmM?Kx1fh~KPUDG$WGrzwo{=Jz#=6?l zFmfo4JZU)dS)P`ps`+7Kgo%vj9X4*{^8UO6As?uXVOC{Msg#Ivo8c%3R)b!@8dv9+!9Hn2c8I=Xr+`8Jg!2P`#MF^#?5ECo`z(_WxZ3(V| z(6tFI+)}HS$}UXUf5jP+$Vmkd^AN8mq-wF1L6%4+ zm?Wy}E(<6ng%r53RVhjDbskqTbJ2%qGI{Z}F!3<@C{cX%c>&cxsnmtL4m4}*-L~-% z@M-9SFGC4U;B={yRR1-CI%S=KvcZPPzs8vBpTOd^&*f*O+|n)Thxu{x@?={CBp9C# z{(pv-t0e0snj-bxS0=bny|8t6AV00hx+vi8x{u?`Ej-J?EECb4FYpKh4(}V)f}}b% z!Dc_d+Bc6Dm*t=p61efE%rK|l8Gb+OnnbIX8_x~B!8*E&;RivUo9sm zCTx1q7qn&RrbqX2U3YtD@33CDnJ?-Ie(eY*t+7j+c}y_i(i;OnTr@)@f9eRxEM~P& z!C8O=-Ts4>h<;FQr+90GuqO}Rf|~Sg<{H~hbwS*GH%#Pq4bvk+^vEv+XwwEQE=vs; zpFd#eC5RNLri9!jp`AwZE4l*dC7Y2(evCo2T&T5Upz(yjwmg5#7vebN%5r>kt?9g- zYfs_Qo*g6Tvq~NXE~`XTs<*#%UKv-ZZ*MB~ZC^do+t+pZrBQ*kO4s|^IXtC^1rNGz z{~nWPr3Z^|DHz*hk$rJ`f z7zyt=72;Pmj@S=$BFQ+8w_Di z(^w~LzX|)S?-A|tH8 zvyvGZNVOPe&F|0N!g771Y1Vk-tsZt=O-u2$=hRhE*|?H4u4vjQ)@7VPzMKFiiz;aw zf-JU7OApQjB%NBe4n|W1a@}h^WjVa&C$gQ`S1d0@w|UsfLm*wHjuGuYX5rAf@kqm} zR~xi%zQ+Dy^HC$@Fk?^s?;0I}ll#6WG&ng*ay}Hus*^LgtwIo|Am?+Wc}#)YB5^Q4ZDX9AR@+hIb>J1)hZbZ$( zO)5O|(_8f4wb@9ZbJ06XHj8IuNN7)B&!FazDC7NO+c2WiMPsDnOLqr)bV{T(%V7)T?*YSp1r)&_!Z=R;gvIf8Lvn zwG$86U$geGr6QuZ<&YQJ^%k&=>hEXGmUplPZc_mhlbE7#5lsERztxJrb_YMJ%yIHg zMym-=%fvu(fxq-X$^g?SRGv`E@2&xDmN?hEM9L-t;gt?~xVcU>=UDql zC*(SH0!EIO{@S4`-lC$*?ci!uJK6I#3pH*)*sV5M+En}1XlyQZN>X5%1QjL%VenzJ zvp>e`Wws-&0rQ7+{|&`ecfbhyg&JqPybV^^)yu3dRF5Mve-FB~U(On${XY<*P7N|9 zOkr}0K`M;zEAD$TW{51^YR!=YSayTf(ff`-cc6+Zsl2%b88fFl$O0-FXWPeoIPk7n zt!*~EEb63IBm+ZNdkUk#wvU<)FyME_c*gjCcdLl}I)Go=v$k80lBrMKRQ%VMWBA+1 z8tvDSl~XzI?=PNnD?X_q8SmGt-|X$KiCx8$Zb|k))+YF+vif^vk$$fbaEJuN6H=rj zZ>+!gOb~!X(HUQD+*NCSud8;zs@0!$zp+^SwEdOWzW{g)EyPEX|1x4yQE%-LH+~KN z4@QxQ;{QDOh8K@$7&1q7N!Cr&wyz`JBNaS(o7^r4|CbH34`YT?mcG*y!#5 z@t0DiO6CFUphYmAVC#S6!8#`JiWyHz ziOze7QmE2b^`}y_*_K0YAm&NP%|8hQ*~05JUjH$$v0bm~uX9vO@ma5!ONZ4wgn4ay zNuHEblXAxs)IHL<&8>3NR-L~{p88s2B<(YSMD_X3JZnB*D+5gXAetnY7a#Q;2XG7a zwg78rcungSPL5?lyYQz0syDN#zRPNF*&KW|kwZ}n+YkTT!!a|0ln(VrxM*@~dWR#< zzYqN{nRn=|e`LZcmN06M(0g6tndm84d`H+@Je9ar+eiy8>Z@(Qmf^v2g3VEqwdoh0 zyevOzH7o_Ym9;(-YC}b#3G-TL1+oF}&F+pS+4#I)dXx(UqWW%>G_&!Gejk9Cn!m~2 zBcSsa?+>6&zrk#}n(?t45@sB(-QORF86Oil>u5d18waMOM6EcSuE$|C)j#65M%l^7 z>@Oc@JaGMN)>*kT5w(%4FUF@X5<4zgoyOf)_wtqm;ST<-&0*#XUZ3D@>iPtCaAc2% zyTbb&ckr17LEI)K%H84Xjk~tRMp;+R{*pVm;Iqs*A)*pauUGU$OZ-bU2$N-?8owP893#dZkMNj1^!Z_wJFb+oB^tdc6T({_ z=^(sg$1!)v$60B57s0 z!!$a@MDgwXaf<|sA1LT($AuP30SS^5@%UZPWnmrSki6Zf(F!#9iSK-iyo2Fcj3iu< zsteM2dlhPN+29by{xoTCIXm#+Rxdx=ZMM+#9pI1dR&~qSusychvcg>@!e+D6bV?z(4^A7MNUk=`Mk|b3Mi&x^PQ}i@@sGE~xk7R>l?+ ziCaZt>L!TIMc_^ZnUleRpNJkw)K%)xBtvv~75rr!iL&u-I48@G;F2 zO5iu8Vn9Hwqz^eV=4Ix7?0IMQBmy7VM+|UL_hMkgHk(Fn!ey z1n$4F_^V|YEr}a$b+1X0@nS8o=jcLLEiImn264*=At+i3z&Uh-b#I^LY4DfrdGHRY z9{q&~hw6da6f`_=qs3t8H6Oast+8wi2sIFo7aNl+<1SQclHSnJ>r#o~cx!>{26Van zUVt_wIBTPDwy*X=@*>8hCg!n0DX#+`_>s3C!B#G{0%t32+Qo&=#s^xM^~`pc>cQ|J zwwqQo?QECWX;dZ&{g?6v(c4dP2b}dlpc?vCzFI}3}GU%jo z1T@NJGX%MMZ4D~Zpp|A5*jzLlU_2H^h#S{06tb?B#zi9sE)*4U*Om=jAisEDS#CgY z`@k|mIIRBwvApy$!(t(FOcpj^>o-5o%AZIo>^t@Y?fbj}+EgBnTG{sA1#_an=YVap zpCr7;ZtxNUdC;*QQ$jIrsx3A9L3S7C>IcOk4Hy_~*p(z{X4us{o?<*Ke`%Ye|LgVf#KuFW90Z8e_v3UAa&;W_6Z0whS#)DU1=($zJu}kGHhau#j$0;BqQNIPHLrt1 z%>OcKUg>P_D~Z^+8f>M!?&%J4(>lV@w&Lr)3z4<&>{cnFq)kh3T2f9LEjlO?tn8hQhJc5JaV+$3o5JS=H7e6IUik+uL3oXmq=Rh`wruk8GqYIw;$+E>OEv zM@4;Kk2SiCjT!iu+{eI2Mm}DxhpHxrxc+Z2Vap5cGU3>>mRzcH6TxK^ zrz5N(Dn=Y-!k(#tW8g2qp|L6AaInjL)qFfm9MvwaTLn74i0j`HIMs<$Mbf+wO}^^U zz-o{r7dP(KiL~^pv8oS7l+#4@f`P!MMh{)|cDb%2j_fPm^%$(-&hEErEv#-ydvGw- zBh@`wEWK)4*D61p6tof4sn-PxbfeO3O)hu7IPCVDUWrYr?K0Hp_1iXyxVQB`C!l?U z2FU8!u0)k#_G*ij!SEnSDUgJF6Ql&2sGUHQh<{rrWDUM%bxpGUc@@u6wqA9wG^V>P zxZ*3$-QFKH6Vzt{$lOrpPL1SH9om~QvczAiYu5!l-Sc)$$D(`Qu7=k}dR@DkmPYHY zd1!{7?+=m}(<-s(r#MJGx zb&TdwLOpYLHT1m;pg9fEC@v6I!=71SK5U9Dm4RU2wGi-{ZeUp@)k7mqyyoys5aSL&) z--CRd1u1$Kc%DE{yCDf&R`ZO#OHPPMe$_Rzj->)|d?SS`&B#H~p@p0m zx_S;o(?syQeHo?>B$!f6WJ>=%J5%uXM>>ZK*B2^#20EK`HhxAS&1PBm9ufR4bPNvm zWxsaedG`Vy;TX`bg&U*jCZp`_{42>iBI(a8l>NUxN#i8t38P+Ufh5XF$;-;AR6(*p z_j#(bI2wB%?hzdBDwQiuTk(%e0`)SpU08t6BNdtmXMc9=EV&YliFTxA>Mlv`2E_zn?p^bT^RV(uI?nE&IITSqVg)q z|K}n|BU28*_Ll`Q{RLzyd`=X|1uYZm%9{i9WR|Mtf9CD^HlIM^4;biNeH>kId4Cx< z0<_{dK-5fxS0@mgtE9f!91^!fENu3T(0nfOHm-CkxFV&4(`^3uTLSxT;$6A|1_(zN zY-&&HB)yZMla|=!UJi6w7_;kSlANqs7D&oBW+N$?l1nwU11k#^KqmiSnuu1vqP7ec z3bsmfTM2OS{@Q@C_n}@>Bx|jQ#Ysk)^F;K!*$}!c8g3jb{-qh^ZnU{H6#-bN2om}o zz0#Pzoqv-Dj#aa~OK1At-8MUIVah0{0`jT7Aa zZw)e)>rEy_S-sKvIetZp=LQKK6o@ODHg!}=Lpw{Cj$oPJJ2((c5On{mJc?YG^i*5% z^Z$sR5(|A?2(FNQ?J}XgBtZ3$>NFDCpy1~t+YY4=$guznT@)Orxj8pUMz1#Z#`xDw zyu#Xo{Emenalj{E<7KH+sUqQ2s{hVRr3u(q_U`QMS_89L+6~R{mulH@W(T+NHV=Ou z0fyPRZ)cP4+iNC6rRgdtVAM=FXS~kCtLxh-x3xU95@OM9HmffRvDA{WsdmjpsdGH& zwJ!@qwLhSo4~AZu)7vSdVoR@NK&^#(8E7PlbmO7sG;ev6tUiTJH93JKB z1Lb&?Phzx)8EO1ePcmU+SvyW|EBP!k3C1Mgx~tu8ltwtws|G*PYr)pXN-@v;UhkVSvAcv)VrglHI+M~?CHG2fCqW*XZ2aQhj4o~AFDHh_q} zE?0KCmF>Ve9Mm|&ezo^W>!lBA>+VjXDzxC_XVf68tHsM2H|P%#vUPAPrWO>P(=J8P z(lqUVK<0Pr6+Twekr8t%(Qr+Z+yyW>bre%Ikfihp={t=yef~2aPAW}Wy!vbyT!rBQT zr>=BesGTwk##FDb(8avNs;Dm#Db9kmR$JluBncQqix(|Ab*27GFZVEVRz=dMr+c}J zBdf&|SzUx+vQxGF@cuhfrU&EGY3!0ikr{9I)}C9`1h zvKAFU=!gJp1dT#Jn|ce_(906yP`oX3;_d1cHC&ZJ5>5~$^a%aNRnWL63>_q8P6s-xsCwi4Xp}{^ZicUw5OHOfqDQ9of*p$jeXP8 z=%#XeSK;al4Zn|3H;Kils@mB-m}#tTM}JAD+oxTGAU5W5qJe}W6CW_($D)g{-4`_& zVEoS6N5I67I{QIzC}^-ut&<&PI_oVl0W2|djXbvchDSmd8C`3-oEI@lfDa0J2k?bK zx$bxKC}eFYXEtnJz;2LW|z zD2P^~+UaNbmeJ8gXEq=b)UN|Sx(QzwHS|_m+i~Aw9}?}CEIYD@avTKryN6LSy{Pev zDf+f5R1cKkjsSB1h;a6+2c%;#Rm!^s@Dnuwvtbwh+5Ah%#caT$2|rp4(e`#6;gAl! z#D2@;X=N=~Z3VKifzNB~S5K)A$)945*KI;{FKWP)K8!nBFbNVKJbGOFArLtOV(@Jl z>A>%;dPNS6ff?AXgWmc`4;`xT4bO|*E~ZmX`QWy!M9 zMOGV|b~u!=WZBrFJG6F}i+C+rc4(1=wxWg(nDbs>Sh8$l(YLik?i_|&x@6gXt^hCRS1?JMTG)U*82rfpToebL?pui_iP&J4>KbAokuU29J1vyD_zNC~ zFN0(0raV*2y*6_4`%yV+7~Ty$ji;#Yb+&i*lyrXpWi3XCmdRV)7+Q&v7Z{M%k5VhE z$PkMug^F$I8D9Xh(5u=iHIZa|m(aA3C7=1!5RMJH-pZw0wt~8)I?yRA#VRMIBq`Y*$(PUv}?70J|8AP*xQ zG7F3OZ!F>zcf!~@pn?iwr(?AA3>i>Ce4_b7MVjkFnDeQJ%Q!39-5nF?+!SxDFLdc)AL|j@YT%(f5!7!En++MOI}WXRN#Za z3o5fZdJ?Jy1z#N#eWi>8#<(HD{KuwjJbOHG~$wF2Ns*D>F>px1Owfx zSvb$Tp-ls5cqdEb{*X)hFo|roJccF9?&242BEtn)y!0GL{A z4C#PY2o;nbS!`33mOAXyEF35e`-(?HnX5KqMPWo+CxlK>#+?EBJVYD%C-n&vrjA1y z(6m79yVt8F=K2>isQu;=*!#{YID*3KoQ{pmd$!%L#dxk z!YIKuT#t=BTLY@sm3_V(>6_LP|rBv2@Y?YPL6qX?C+{)_YtDCE8 zc^O4tknvzuBLJ+f>d06xjD(8kU*rQP5{i(Z@82TKIlaiLoGeS-3sxo8z@z*!x(J^x zO09wm)+XWI`2{XU%V6jBp%S*rB~K0}^ui0mk`^mXI8mKDvgM`i(6p-B-JM!lY-_eb zcPH+dEDhB}(%o68*vuEC+cuIjHfQT7fX zF4)_JC_%PCrK6g7AjgUS?kavOV7IHQG>p|<6&U%HK#gVosxz?*krcL!Oj}quF{31B zB_?1Qu=YD4S`?n>3WHEl%9T!5ocLnvordntq##kg)WJ!L5ao||<;npH3RV!rhO#GF znFtKO8u^Q&LdiL<#0v?9&51$>{30z2i<|x)xlC!Y?@U=Y2<#~TO&Q~&rTEpb+W+cn zAHwk+%sTnQ-;o*}Bb7b)IhMC7^3zorD;(5j6+9|l#!fY=jTdaas71O0U$X4(WSOkN zF}1J=omat~pHehYc+U~R=YAh{zXkXfR+=vSr&hXF8k}vY%Gd<1Tt09G&ZA>Ze72cd zE!?uJgcE338dnvrZm(c(Y00v~{G#Maj@x>Ktlh_{ zAPT41U?5d`l%-mz@`hKCs>#A*uCUS%h%6i}zWuw}4ZXt>#K%m(T*IyncpwA?*W!N? z^?>AAE&+)4Yjqw*>7i7qh7TdRRH38(zEmkrUZMG9stlSgc{%do@N#o3q$9qv+&ZEY zkq>!)13tp?k1NsAmk#_??<2k^jC9Hp(iI+f@ts;YjF3aw6;88Iw>I1Rw)X-C_94Ux z!I~F5?XX7tZt1Nate}5GAz%@w2H!0H9xQqCtql_AG2qG|@so%doLo z!i6*YMLE~Y8&4|I)T3k*U+e9Q3!k~TU+d9f5@^p#Z?gxuy3N@f(2EPmT8;`AH`|~mw z2xSiDXhxfgV!9P=Gn>j@jBa(g~ye&b9 z&D5%^cjtx?iGsY)wwC1Pi4E-)F=8*W5<|xww>B#iIdwv~LRH6kimrD+bq@udro0#= z8j9*#tKTIg3^kKDaLHEcK)t1>7q18`Uba15asi6Etw?#deX<^7-{SP}!*vIuRCwqdPqpOlwr4$x_wrEh@;=Ry&D~DgxGz1Xqf2 z;B-|PYVa|e2J1d14m?6d9N2a31*!+yzg4V9gn_GO1U(b|IU^;jAro5QTPy1WA!lGt z2{eXsILAZ1-96I%1`z=%RfYzIFAF0J_U7%kjiBf0zAOio2+ax#HVkq8a1aq!2|PEd zeh20PVj)O^H%|06!k3;QAcE7seRyuCU$%1`gzipEhNbdq+(>;AOmnLlsl`Evi3(WZ zRB%^JX+1p!r-gEf4a|u~LRmxCR<;jlC2Mqpk<2?QVUvAeG=WQqIca;}V7tUCa}6h- zeD%{VRyP|z#cmwP8KrB)=w5h{kFa`QyPva8RY7pLb!UlQJ$%Mf{smTgje)%dRvJMQ zJ3--Ob^IWaQs5eiu8aVKESqJawCY##Bgom;gX^l}9QB=mgT-nvi-mpGQa^V80Vi*+ zmitN1Yd|~&4ForHL78Pji8&c3Qo_a__wO14QFy%G;H=AL1i9I&;o~|_!#5OKOa=7i zKTIE|{;RNS4-op<1EC6ekkDy4wnX84;3sDcF}?V;>S}FEt7|(uK~Fqc;yKuAvMSLg zow}0Dc=>>OLw}iD>BWw}J-)MB_ z&SK4`d+$iHfkXU0q#$YR)bR8y1AZgdEOxgQ_496bA9)M3yu- zkQvITYm5!ui!XM4F+C1vuXXamQR|~pSD-RIV;3TlM{dfF6FGt_=?XSJCH?W-e_#*D zyTo8>`LVC@6H%(x9e_fHW#hz6YOP?rH3vI+Q)a|OmA)124?LlQMZs|sY6)C%(8JI> z#Duy)YUOcVNq1BKl97ZtM zAruHkI>dqC7PJ|kyWS_C4n2u&UpT5I_Vaj(OYBFOC-j=5pRMw19D%DEQxjtqJJaQ? zL4TGzNoo+iI&7OCIzf1+M=CII(gX}IIHR@jPLZ^cuZxo+zveMgKUchBRaH{iUI@+J z-rkhm;`mJ}`W`v6K=kR^A_c!3rN?HA(R*}14hf2SLq>2qv97xZzjd!2M2qa_8_5w^ zQAgmO$Xy}|Xvb6c#T!53VrLLtaynEZPK*s9mK?^(h2M|??Y?d2JSpE4qGFP=z4L^| z4e+~X93FU(ZJ#Gc>ImKqS)_DNTQz-)v>NxlQj;gK`i{9%inR*EMBR&BjGTGhB&7(U z(E@0<1&9show`FG!EBJt_bzSU2vuq5P68Y47d!&nGUcGt3Y`=%a38R}{>;$Sh#=$0 zw)KOsiYVRKy|+F2J@RY_Mvt0hJYpFIHcihy>?Ye*{~Pm-R5(v~>cW#`Z6pmCHhVta zX7vIjg9|&rwlB-111sSbVEG<)MFnU%Pq>_LOBJuw^|Tb6Y^zAkbXFDU?K)8(aaB3^ z77le9(zQNLQJnmb-UHYZmKQLZVW5Q5(2azHW)7D?&IUWIupj|!XjZ=-34jSscvF$X z6f6RcM8F^`N0K3QV~~;~$>SLLSnbs4^44#Y+44CuGguqyMVC7DiFpLL6hPCU2B1Dd z7C}0GNlFe#-{HIa)Bi|J;xPFK|0GCh9YadrU60A<-LSCHx&qL&?Jg9Ah|m~E25Rg< zk0MjpgV5SfJOAM}UF8Qw9D?M=jP5|(-~hRsIGpD!e3SJ$CpbQjw&{+CV?sAUuueoU zXzO(>V%W$#Hwcn03oo4-boOAkL|q5Dj+&!7u#7B&;;-Z1* zUI0Dbrd~0SzZJX++6&O(cI!(8Ed}UE0HL>eI;2@frsVUOOQsP(Aom-D&930UA2uR` zuoG1*JlL)x1%}l%4e{_f-Y!@3VFZ%^oje87F(b!KKytEunh$M2x~#&nRK4L&d>+Y8 zMV&T&b<_ERO(KG(VYN`=5i<>{h5U}@u*@t@t1t&`(tHQNFcA&d4TEuQgp(q%;Vl|% zX;7wX`4JMF=xl)&h zMYv?;kTFW7P{f2lM<9+4&X{w_%YZ3R=b+Ffq$2I)fXbz_RKPWn{6z}OL~`&9i> ziLR841Inp_q0%ms7B-xTDK^)ZbFLK-Q_vxGMvj<271nLVfbR)4FYSDXU}(Vf0v+>1 z@-cz2S!;k~8e=3HZK*PYF+{Pa4f`;!9+m0rCB@Cq$8{*K=hD_QHl|YpA&8cof^h%2yCqZ`>Mf)?p8!6?K@sgzhyAG z%8gKL_@&tCKXVp7W)e^2AV$%gh2JsA*yMh?p?%jr5do!tY(yvWoQ2;rs6<~fb>wlA zsxXtm_j1m{?^~W>Xoc{@A?_cT0AvoXW&k~5g47BfY*&U*C?Nw*7xWz9745oA1vttc zZvTSxA(l8UTSwYeqd+-Ze2%t9YpKDGwX60yQ8Cr({`Tj7heA!IHhcMjcI$bpY&_b; z$_VI#?dOUL1|<)w8Ub^=JpjTCZE*m(SAz^^DA9@;89rhF4jBq!E)mDiP;n>@tlZxb z_>eiS%JQ;X>;Lo_YM*35eKU%K<>50_?h$GoaUuc<0+@{kP+HB;HkL|V|JveWbu*D#<9z8Hm8)-06P##Rf$oS*) zR9Ub(0eNWNI|bRq)_ztt?+@|S7Nm;G4=;L07&DWHh#~`Roe>#m@=$iyS_hUzZZ*rw zzM5RG=z5uqr*ZCoZM(XgYl|8=LbX~C<&o1V!=+cy-t!`?4j3ie;kgVw5Fm`8jJr*+ ziKTXMy}E&$CvJXy$r){Pf`E+1`*%>?#pijGf}bGL%!BQUq$?1aDH?Fv$bUXYeURS< zeCS*?iwxA&F~Ki07+Ztm1EQ6=Rl5X5LQGlOxBT*EU(x@h{@AK|jr#n%q%bhhA{}>dz@=O=`Z|K<;^r_^jA#unQE#yM16_-KXc`3`H}N|g zgc$OD3)eGz=mZMPb=WB#{EX$ihRQI3o@d|=6f@%krC#dOu0piRJ3gND9=bZ1S#%E}!S|+V0qst$o6}XKi zWfTijTVdeDUS~>49wpuqHPXGROqLX)nwHsvql2)rp5jzsa1>SZQf(J=$Q>Z?NR`|= z&Y8u(Sn)yS-p9}0@VOVCeg7u)Gc!LoJV$mFnC>(%?-cV#7&oCwa+?l9^-Mo}$jH6) z@pg9YM487O8BmqvE1=Tstegftvka6wDZhdxPp)&ea8(Y&PPav`1o45{3d0h_-Hkbw znfI_cdgI!{*c263b1b87TYf?~pyv24zIg$w0ydiYr6<&>2K0Cz67H$OZcZdB`qY=S zNk&$D9wK#lNoOVr+9SGEf}P>qFWm&3ru*d^XzfwdzAO@G1PUCQPJRd9fjiU5Lsw?) z-=e&m3lAhD%@Xk5G0n-YR_VT44Lnptz%k7bYbWr@@j#fcL}S6gT=GM5lk<3GO7p|G zQ^n71lCfjZl}vU$Vo<|q{Cz3zLAq^!xb4Cp5i2buZq<7DY}>CPt`Y zXDgiq$)umN@LLfGi`FA&-zoT!L*x@6&s4QV4Tn(Ao~a^DzALz*0`2ITwj+!UhX*fx zxnL5}p~N4(^b-P7>9lREoWJp7ix{F;Yj3Mi%x=VwtXHc2i$CnPl_$Q+{yVEWYoY*Tc0*aEzkt~ z%rrc|gkC;)ma7P^oB1rPC{`MlUAw|7Io?Lfp7NeC?WwbEU8BmK6up7qZ_jdf70L-5 zH9fhCgeVT0x&{9muS&~+TsNOm;hrjH*&BNdL`1jA=PrWUoK$x zN6yzF`xJHV73#OEms(AUT}imRr9toJU0Prs;Md3SBjx}+9|_l7bElY7a2`nKzr(hL zx*SPMdzZzv_(51o4fPS60#XWxVg8Q8t>>j@5KLGzxbDcuRUVvk3G8&^lenfPr(=m) zgopLoTKS5n$bTM@D4_QN156Ilrl!CRDwHS2CS|v4>llv8-T;v>aLrzZqSrFN5F_M zbf0xKqDQq*d;QRL2r#+nAW92>Sz4GGfzKWbsX)u1WlO`Ti3OrAdroVy z5U==h-M`$)+o}^kX}a_2@2#en2HSDj)H2Nc+vyQ`!cJpm&Se8~n+ z2nASUL`)d)=%_EHsCoRIt$E_dTZ99rJ^JN{()q_Z%jL+TD|9H-7-GOKxvLjCF2YK> z79jq##6Dozu)6LZYwW`)o2qe-DV`3hVsk-v=Q)|E9-#>5vD_whUBl_Sb$B?aIeJ3$ ztGLGWdO08!M>rNyl3Dss#97?V2ZXc%4KdBD`Sv(iP_nV6pY+vw?$c@V1Uyk zb*DnbT2>!$j%K@3P_2DbVd75dGfu}q&3C{+6&e^VBNwq0m|3}!DUd;MICKUSe8j*b z6$2bKz!YxP)C_jaU=+#&a^iBoL1>QvWB?B^%3-X5rw8FgHy}<819EBN!Bm2Pj<lz7p7MSgxBpzwYHsC*1_Tj zdi1UZ=)#<13fEH0D??-)w>AJf9>c`+4ANs5-OXk5`LIHx>8*3*5llgnb5#3WQ|OWP^l?KgHyg3-P{ZW4xh}-` z*)ED~@AX06$lAh{#o4cXhaCQ2WArr z@}ugT*W~Ku=^zdhJwKx@dmurapIc`co*5tC09>=@+QA!!ex;>#N-YGTI?{w5ba|XH zBV>>jXUE`fpG7TSJemS@yc*}EvQY1WGVWr9(3~8zOZAEV>fRi0D79`EtCvK_t-CNu zacOMyH?>OF&HB2;&j3u5emX$H)T24pq3Q$e;ztAE``KHBX<74MraJaTC6zn&dH z=w|?r9-3<^MW&09cI?pHXPm%79l?x}8Gp&KgSpNH8$g}~ z`k9d9s*cq{7&orq@$d2@ER0!{Y?oKHCDGf?I0AqnxmVB?Z|tHHtks*%0(>=xpIPc~ zZ(-^6;Sx)rh3O|y{@_8oA98SI1{a2dM-zwW(P@`FZ<7VIApc!-FI(@+y4KAJ?Hs8v z`alh?$_R@DWxAT2gx7mykh4H9yGQzAq+0`*F$sxe2ROKd1}ozZDn9-Y2SLro5R#`l zL@S>qsZ|eGa#imd9FNj$=u>5mpf>y|AY}L(BAWuKI#htvx8RPO7!_?+C~ZvKW_MdL zLsZ?;Byrh88nb}>4Vo5cd{JWzmop`}(9Kg4Ep?k_89?rxVo}euC{0Ol7v)vbV{I85 ze4g`*F)6~P2bV*|6)E}3xo1RM9uGeGY}xdPFAs+1Um%x1!Y%2S+850>Ppa)^H*nyi ze9L*M`QS0LLK^;-`kgeA^rC9A7iAuLwhp6e7)BujHl})FuI_buj%PQkCe^n@Ee9~< ziTSf^@fT?d?fQC-q^RD&8yM)ggG|2oC!(NT8!2IDC~cU^Ic1iDZ!y?ndLY7{F zbICYK>Fx3s*HDc1ZQe?(GpJ4awiTzluTK=XP)t;1xBmKDv>~0B(L-5x?Xl}+H*^i; zRG!GDUbw>6uuyHmMl4s5vx|u@oZ4N_CE`}+R3!&(fNM~$GAq0|$>;KllX4D)3m^xd7;HF@rvOXf&- z(?c#!-wyu<9BTa>YK~D??yihi^JBl>*w4|Qiyp#bgd%uD4vKf+3GOUY8=KMng}}nx z1-lBdc5La-;t;SbjoB2id%8E*dxS16gf1(Da>=s<=+gJ&WQO7sGCFyCCs!J$RF?FU z;t`1*x-5F32++0~$0nFHW)2Xq1lu!kJX zOB(y6XDk8Z8sJmbkWC?&zI1K7oaIk${ znf)5%2J#$sLAGd3Da1>kI_oA@gf? za}S`;nhUg>b^twWpfKYAJmKy{akAn2WcCEbCFcMt@Od=)5nr%e&08cs4= zR4F>}vdAB7I-#f6VLNC)6x}kHu`TBlaDYgoq|c?98t9y_ZVzTDpw1uwGc-)@9uZ6^ zVrB!JuVO+vpn7_R9c-v}`VvvuBR$v*j^ZY8omb?C5OHL11o!T)|AjM>H(0c1m;l{U z>(l396KL^4Brr5K{QRURN1Hm|Pe|mFc6Eo0BA3h+NFdUqWR<5kl0-=kW=4tTv5G-} zf^NVAhR70Glm(Yq7|ddpTy%G36vM)77%NTZ(CDtt&1~?doD2#11R)wbw4|^&>*l z6UIn+{HHb`@B{SSvGls@@n5i++uI9!PywvsO;UdgsZV_W_6sD!`a6GeR@6`{|GO;j zN1OqBgMSP$;H-9h+_g^udfwX6eHl~jDARoF?I@tj*uuxm^G?@M?cO${upQh=7K%Ap zoJ0$X_3mNrK}@g4$S5I-Ce=uGj4C*m0RX*-7Umc4gs&0b{+#S_e!Hb_vV~#(gd)F< zglG>8RBI9GF8L3D13#Hvz{g?7amE2b=>${B)&L4u+ltehnYX7fUQINKEzKAz_XyR8 zy(Et5z26oe-5N2B>H@i+h0R-LKS$*O&9h%USTqxL3oMcks^*byqHl^H8T5poL>MRV zcVcX00QVI+zD*j94Lg8|BNxGou4nBgp->8e2d8L$2Xu}?v56X}Rpsnn0hQ6gnnCPh zkoZCwXr5+r=qUit6i^`F5&DT|ae7_5G=6HpTk#^7FgchUsX(2Bxh=QsMGJ-5W|78&edax)#5JHs9**Hb7#ek$F(2MR`tdWcyn4;%H#s}UDR zULZreM{XOe!2{&)FFzylM>+l$3bp3$K7LNP^1&HJJv>nRjM!kszb3HE^0T%Di^Y5( zcV#a=y>(a?*{tzFPJ9HI2?!DvXE@>QlWgg8Rdo%5ZR2pc zW4Q((=|fvy3(AhaOqad?C>ndGiEkyQFe*f&lSkQT3%XQZbp<)#2ZSRmFGnQi7K-c5 zkCN_(-Bb@F#3NuWxW;8I5;1GH9=ZXCd$iLLaeWVGfIE_xf|7&tw8dQ!MV5@|!pol` zv$a3XRjDLHHliTHCl#rkOV&~sr55;eTP51bd(`~Hu4I=gIY>Q6zl{h0IuyXF@pYko>4Je- zpc2Qq1L>1G=p%j0#%@B{=@IpRc=wW}Fq(_v7`%IZ7$=F4-hT>D-o*F(ywy74#?f{~ zSmtsa)k^A$ihswl;8^dmf_=0)u`v0U-nc&gi<||RxdjDv5sDnqXdS zTSJ7ZEUwp(_@&oBmmR_{aSTEas9;?WZ)4={(yvV#D6UuU39D}*?r;gJFrc-fi-0j` zYf{g90ScO$fRal}Q`3WcMR?1L8jTe-PycR z3y5u*V?qJ7qxnE1V0QTEr~{-+CnJSx_b)BtNQ&J~g)}VD4Dbue0|c%G=}=j8^C9Z95Se{xQb05Vm}N^bTX3I=ndE z_sb(Xo7Jais@{X=`Rp|a31ul6B;5a(fSEzb*rlaDq$zjH5S$XHxl00R{ zu{bG~J(ASo@peMMR%LDpMNS}MGXCS*QGvtyJebnm+z6JF+^k0 zE8(Az?~Qc`j7S*`?Rt8dTse)qbWxQ8k5;beqs0{$S>9qUpQ?DReq!-^thlZ`o)ZjOv=o%a02&@CdDs{7%e0FjJhKD=d znA=FcBwq!TN^}}p?z{{g6Q;(A*?hXw#nJfHb|XsPS=ywpDX0RE*P3+HD+R1c#u0|a zMh=T90AwgRKsPQ}!F2^K)H^Ga`ejeQ;DZ}Zee^{Jjw?q*UYWxy3jN~HeB|m&N~s2@f96dR8-VJTIT&rmthGP`+PmvvJz{#der~{tkV9zh%mgXYzL005 zhN@c`LDIg=EVUgMpe+KhxiS;FHS5WY=2iA=wBoxIqrkM*QH5;gQHjfCPRs(+T;{{P zSqv$fEgT~$lo^8u^J;i7Z-580LY)Ki&1>}A`7dv!|FVLd`|=i8*lu0}OwN0G6TFuN z@PN4|Z=-!y`eqAjbY9B>7RYgPS{8_&JsdZm6;FH~aksAd~Rt_^fIa&3F9@2+iS5bASa9OA6g zXN=^G&xtR4a!s;50x}^%ARV!=Q+o??;~$q%I5%I|@mLFVl^*|+4WC2_ue7XT94*Rv zp1zY1T|UG}q6Vvu6H8fvcr(cC{IPsX!RpX9%m>EbM^V)=!&@UT?X((Oht%AWOM(5@~@k{ZF)JjDJTass>V(Ix>%ftuNP1 zjq^)S1tgIcI$L0n$ggws5TU;@Atvne>;$2JMp7t-42dUzXb;jiJE%-1bFQIGjsVat zMbqy?0wSui+J64DchW+s^KZPm!Z*fz+2ogZ;-Rs>#W+!XwuWhmzSE6pa5+wm$X8nS z3L_dwy{S4#rv|o=02K^tQ5~rsnC{sw|0Lg&wx(gn7_L^5w{JyF$@=Bch4@k#g`>_7 zS}M7Pp=f;9b;61?4&v=JkjHfph*38gXu}(a?`%xRhHJ@LoKjD#9kG0H1pzqiK!9Vm zR%e5Li@zO!y}CjwaLv@jH12b9>Zn>}g}2Xu%=U$w)N-JC)#-JcvlEJ&?2cEn8H@;w z2Q5J)%Gmprb@|?6ubS=BXVAu{@Gy%6#5iCIQ?{|>n&b8oD65UZ13lZ=+}&s^HgCe< zR05X%jd*PaH79>6{J?@HW^!BnA=Wi^xLf`Ua1c3WWjaN$mOJNyr(srh+`#rW7grey z1qUeHO3oxB(miN_Oo z!*r^(l9iQa__L02&XqwR)lFnK70aF9O3``ioYq$p-Pr7L2!4#>p1%%w7@=7a;1h&@ znG&zW-Y?l~)-oWa&IqwcmMQy`AuQHbIC6WMvbz2 zxNWfvNPQ)chdsy4TSXvzm7Chrvt-S~b>SHwDf4*SxRey2*`DYE^S%J(hDT0}9%=gq zp>9N`+U^;G15jy6at?^~9P!Yd*zc*>N|X^*5g_U3!$d2Gw#+_ zru*HaW`$uCqBN9@KL#v}zW%4kvsq_tkCf#lc+_SKsCm$;$!U6ug!$M5I{sLQ)j7cp zYtl@WI!PTK2Xz?*LO4PuPs(R`6}!-LQ}eTnLnHJ)bGh>na)xI7!YNK7Ee&NLZU|>i z=}%HMYd+TDd(pz_Jq(!dLxXkk`EeDrDh2h;_mXs)Z%u^2A$8(fW+-Pecav@+TK;k; zNefLqaf&?_jcMqyumG{=WQFq-MOirHT{p!8AFQ&XvSOx-+T`HGNR_qe0k%k`eK&H9 z4K~(o-N7-U1_B*0I<3=Ktu!YV9}=eMH;_G{nFbPjtYuP_KDySFN)Apa<+^3YH zR|ovS6oHk?9U02~IXoH<^2~1p%ReH|tU?LEY(=_lYTN*}Dy8Ngy8(dJDmr;) z{;XJz2UN|lAHAVUW3)uOn$KQ|{_qTbK0|uN@2dLp{>Ld+#5Nbxx=7!1MPRHzO7xPe zugHG5>|`3Jr5Fgeadjzo{uHn{B z$B0aWg=NxMjqGhgb_sum&ADt`*_}Q>CI<4d*j{_w{JqZM5WmKPFHm`2uH*Y$qX*PD zhA+^u5p_+Jc-cw_8zJ4>`?&kT6ZWtJBM1On+#-1^iZ58q^S_?;_|uONfbRzA;?5Lk z*CnMF)v^0!CuqRo)DayX)pv>_Ip}Ovrb)eq*WR^4P1ozSy8Q zz-NGm7yxg0QVO97&_eLNEdfK>7g;J}F&Em9oLptnZV&K8jZ0pN@2F)w)8MuPRoHgP zHPX(MZnMMst}h8eYpcT!qQ>WlB*A@wP^fuKHb)R5!8=3XwDgQ`FddqF58>8(&w;)b z$?LF{qxenKPa8(DRqOikt?$#6_e6P~gL%){+u-XGwZ{A2Xa7_$gj`*-%Qx@{d`>pg7SnoXNuwCUEhw*q=|fNtHkW($`u+YEw${{D4DztQIb;2Hp4 z7y%S=O9WZBoJ4L)L5OCvLdb(Hb|EXrq>j}X`&f?g?D4)H@dXl_FGL6)j%#2^;~=xZ zk=Sw?z{QOm8)ULm(eh|+StD}J#ak+O@={q4avk5~$Zjs=AR?ux#8!Fs+E_le%~Dif zqe8*CbI%1DM;c%LS~H5nL7sV~5dQP0TGQg06rs2TTIM)nIe|kISa>~YrePN*O|{9_ z%UW@ktF8xjPi#4` z5<49UqTBk~7bbGPER{>RZXLWljIt84T%%8V$zZtO&eE>rGRDOX0RzgNv}J|f{kLzl z<|t!yp`@^GgEo%wxt68lb3JGjbRuc#Qa>Iz8m`hpXCp;Ty27>4Kkr4JV6Vk-{tES0 zv)~4AJ5$U5l^k4Nqah3|?akJ{*NRWUb^7j>c^f=pCg2}4%s^iX<$H|S?Ic#CPZ+{3 zt*ZkGy}s3n0(rP^xiwsYb+yloip4e*vM-NTJM+ zGhL!H*a4;42BA>T_}NWN4+WF@KE` z*uH3RxpW=LV@Si^s4xw?K3hX=?Gai!0xjjC4IF~b>#plQ`4m?_P}=0R=HOx+=5}(?_E4nA#&?XX^@MM-d%g z#BqTP=2%;^;VI!dBBBk%I9rs5^~%31 zpA%zsTp<8u&i<&30G5**xzIspUZPLo^r()35gc^omkJJgAtj=Xs-l}Nz-m)?GHS8Q zZD69z40v{ zye+GmZQC=ljUnu?7^tmUoWa4Xm)}BGiVF@j$`8nwK2`?hL{>I#r&GwEflL=TnBXyO zEd?WDPnI$qYZd%I*oq%YJ)BDzNYW&6q9b{GH;Ze7!=)uj7p)vhhhB<4dy|NV6bxda z&VxWyp<5eNA@@~KjRHn-KFVs;x{lX12Dw6B_+=o&`ZW&MG<;s9&d|eS)$yTK2D?~c z_N-~AehuRNd2ECqlhPX058qvS(hk{+kM50V5G<38+K#Cmqj<9#?!$Ky6!;q21Cy#Y zQ3*3!vw`5g&-d=H7$7+_P)5dxL5ZOrT^q-sEi&s4vnvlvJ`R3k~8L> z;bF{}g$cXh8{@0*m-S^m8I_El@}PT*bpH-veebikkUyx2k0n4w*M9P2P)(JqCZ{Iv zp1{2og>hG)&-iHJAx7u4pHS zx-zQgEns4pAW+qB(;#-eKoSN^fWzn`!R>S!xGCc8c{;X2cA^O@jBDp^=S^qrK9Dj3 z=nBG!B#AB+JSi)waD}Rua>IJS+!&vUB>_oUXOD zSuFiMD!~-a7iR6}Iq;Au{pYCCKPO}#N?0B$AVO!`){Fh(qo1|KZ5y5%hu_5*uVL)! zkDK=XQ*D~ZfIE5XYg6ihg8Guu4vq;O2Z1`Doz z2zUR|nJ|E!huXennLbR-cIkE4?G<1;X1e(U%(Nnt#}FO0dj+ctvS9L&pnFX;GRyJ| z&4%R<%?W-9so}M(B5EvP%rx>`<3+4W5JU4Gt7#$8Kt30t`LUt-HRR!zI3>f$CX)~eVyOM5d-GI}4i5sN2$?zlcPH7v_< z%d(42$`EX{oU{SURxiD-xTe?HEc~F*n<3cnIBU>m;Gw0ffWcog245*vrL!28&svrX zkcHy80L%TBz(6D^cvQPrjS{ifJvg}fp&~92h;8$n{F*6r;tv$ygmiTlX zMyb`o<}NK}$hcPW3^t{>Z~xeu!ugE@%%Y}jQ6%Rw$FgE9U$k+0H}e#?##XPhm?Oh7 zYmVz1@@(nyOdezFV>Slfz~Q<)(`bjshEgx_Wct|9{IWKQU3^_JxlZ|5k1TxeBkp3W z$6dl)Nm4RdtR8pg?9V$vQTKyZ z!fB^M*jsBi*QREslYhM4^x<#(FEO0a4c0mIgk0FS<6f$4-R;;3p}A=kDHZxMhJwTj zp2XH!v$t}!my>t2o<|KPJ19x}qB8}{ErVa2=-uV32aH>1!vKL(7`~6tBT=(>73P5f z?0V15fpKViK4_ctVa{Hb4BQ4+2{8xi+~5R!43^7%3aN0l@}0v1G{|0)G@5#%}OSXMfy2>SCv7H3=YVtf-J6rctCA3!Ftp%AFJu#WmDf+H&sC07Lp(<1}`Du!(f(-CU1WNTR0HpnB4GE(pMOu<#Vw1ZICN$)2?FR2gaRv- zXYelJ*ESsr$n4H>cbJAzKoOgXb=Re6Sdnt)uRb?ceD=SSl{FVrzNwyMjMV{tfSlw` z(2ghz2%AmDl`>D~`66s$m{MB023VK~3WFR{-wQ8#d4R4$r=(3cAKi2Gi+-3L`g6Kc zCk+;&e!61(E4$QjZtgDCFTCw&D^HgJNUDLZ5Kx#~fn3Hk>|Ne>Ee<9eQ_&OXnV~hf zE1#@IzcH|3i!2RfIe5_Tt?)L3=WmP&EcOqbtDBk|4ysTxFdv75@r1;a6Uvl8d5n@Z zi`mQ8P>Lzrkuq4LYtL?8K{$6Z?iv9>$8AhaQ{zBA$-jMBT_0=~_(A~>(1@IW10(DQ z@F>xbr_c+iH;Ut?n>2bv$o^Z;npdOR`TBE`SEk{^O5ggkRNE$9A{O=FQo}OJbkkKB z2X+BgR@fxOab<=f^xy!Xz7g1A*XViLefbn7Mc|{SIy40B(A?J}YZ%5J440gU%;a7o zlowpL2I4!OM4v>}_`<}=B?T%^x?_GH3DMe;P5uOF!HiEA!UMvnC#c->rd!YWNU@TR zWofRDZisj?$)&h&xiv{P0(;=csK9nzQrc6Elp?HyxL}6it34t5)G7=L#N`CEyi

    VE z)XMR_O-BZT8CCXp+&cvrjSt`Qh)ptR*pv+KWLmJbglGGT9UQT=E-Nb5Pq@(}zq2>y zY$^%z0^cCl-9^z@B)N5r>vM!HqE_Eeq{bIj50yo{-k$%b0`?=oKYkYFg$R<0uyxd`gFxdp2H=} z$u%@K=Jy?<{5|(O^b0@|3S<{rcca$ZL! z)hDNL0nR(E!ay49-XfZZ8=SM|7^piU$T&p?YVFpI;=%VN>R%R(I-xK5Fv7pJW+iq$ z={Ssmc-EfZ--yFu9*i4xyyB}oSg}06^ARoP1!u&~QUTyR7~R%K5us6CcYKvy5(ZuN zX+6HH*Sd8R(Z+5fYS}4lR5QIYA@u*jKgo#EeVdZ6o7S>zS|KacFRx(K#yjCcTJpnG zk(UH{N%zX?b2rOCtyNm|E0DHGouo%xAP+((8ucQ}@_h@+qV6Sr&M56{>V{?y1}=8% zio!*T>tC`pM!Df}Z9sET`%ucxpZ5IUU&OidpDA_uW2HY(Lp z*5pJSxDJYAK@ntFG)E>XRP(VL{s$)eVr~z-abBrQcs#gV*~?MD$5QtwZy7^ig;Y580x>1Z9&eO(F)Xo& z^31^VIY2_`BuPX2B(E4)uu;2~mR-9e(XHlC-6I9C-yuOASBtNj91LCt$}l|Sd56|L z*Ce*)!1O>g%+Q_SYCMVJpq9u>rt&F?)UxC3Pm8`GQ_4*a_g+%Mhc6;6hL1_m0`ajw zT9!QZlDKc<6!27>6E8$zY#|!3t58KRv64t$#6^fK9!T;$-eCjB-tIPcqzuncFjVSHlOH&ShApb%Ad zQuZR+T=SNZEFMD#^n>LP}F z@$qqAhG)!gLT80$7-ZN6Lx#5nnB0EOMLBEF#Wyd)!T(e+TjhB&XVB7=jFPQYbl7Ew<>xfC$m4rl@xgz@|tDn)XdgKmK`Nj z413%(Vnsp;lB_1%Xn~^5V)5e?6Yhc=I<-1OYw*svQL4 zR9|G9S@k7(K%S!m5vuXa8#^ARybMAxQw8e}Gt(y~uX}kRT?r%U`5-dMi;)W&=S*Wp zjvczb%I|`@1RZU^Zn*f0lncbOOZA_WDVTw^l_ANqUl9`|@5)*VW{k7m*uj-NW+OvP z*D}AWh>H&IM7N>AMlkZ;O zNY4FUO67?&5=H37&D9Az95fdF$}3~$<&uw~npF(7>jE4aAK^Pubs$rxC0huJtI7gy zkW{MyXyM8|;awTRbM=!v$TT}rqmh**;#Ws&y3|$6SAyGKWiI0p8^K=*iR2*YitxwDCbDeycT-kc8Hl5i^_3C2#s>QNI@xF>-vw54d_oM5Y$~{bdzaXJ zK-z1}7n~vUObd(2J8kBkmrr$Vu9aV!O7XAO2KRY0}s1fIwln4XfD zxfb$IQY0dqORz4oB5+LEC#QfGuRy?KJQh^{fzVqKT_m_AryyUY@j=|+S$9ChJeAr1 z%czpqwo2lBdnz0M8j*=|oY|)cGSz|osD?Yc#(YOyCU|TN`0s%kGF6W7OZCA4*kSe9 zKu=i#F@v_T1^_qAv%K*r8_CD-i@aiHq6ARdyl!VY*VDbIrmQDJjPV7pijNTW%~sD(jbq^!x4Lhg^COAetS-#BSw)ovg#eA^5%W9XQ0k0|=J9`_ zGb*+mHPg}Y&vY0%b-yHG&SeJAw9Gj%0haKBquYD59-U~oj-OD+P<(14Cb@iFD258m z(}XjmV?c~zsco>?^FIGW@E}^J2e5~PgVmS5J=n4*_rAikm^izi+uTy&}kZBDGAX(^6C6%v{q-}b0XG}ruZk>KDSiYz5jr1|`nKQcmh9g3C`5P(OJX5(u*AhM>)mrNt7>P~~M)E8~I{7F4Hj9XuURtCF zFDn9GlLzJq$?PiX(+sNUB=7VxeE11^4L;2Br1W;361}HDL`HUsEHE0hCRNN^b7pE! z*W&aOXBe2pf;-2BjF6g=(_(q-szfB@f{Jn_N4Hn4$-yib3A*%1keISUaf$P)LZJV#Lq+B zZ5}pl_D~z@ky|NF82BT$J1H`QVxTiyAFBOgm+V?}KMM7L0o8L^MV^d92t+9i4Y#T> zHGySx0sWA?y`Bj$nKS0Lyd49ReW*HmqK$?LxqO3K%bmQ<7>p4wI!f*~cm72~c~7=J zI9x?oWbhF3=zG?Zr5@{zz(SsR04uQ*QehU)Sy4N|QOn%pzK4mhrG`|C4)3f~Udq*Y zU{@Mqi^5S3A0RVhlRwx9T=H+1KJSVY&!N#(8hEMUqTeQEuA3c{0$-nYOMV#{5DSrc zQMZiFuztAw#1hpxHX^0>W^oI2l-E$Hs^h6VtSRc83P=@xEWl0OI#TPv5x8qW-e9Z^(t*ad;I-Wn-bzWV zRm8Q%K8E;V#Mg$n2zOaZogem0S#38ZtUXXx6X|b{lhyi=u+oZLkKY^Y_tIW`*fV6c zrChUix)iQiyW9uYEPHaSwsbi@?5(ld(rfW?z_Q^^0bkIuFWpOpx5e;mA1_;Ks@%ME z?}@?vnXh3;N?>)wJU=qWL{s2#2Td4_0hy@$1Q$Pqn-jQQ(C~fRA&`JD6#n1;Po&|D za1aiT_j7@uXqJ_N2tN*G9!`IRkIW3#hR7?oihCe==FX8Cd*C@Pd^a)ehfS)EId6-n zNh)asNs-`CQb11iW^$tLJb@J6?ac|2am2xutAKW z3y!wSL2KYxgppPGny~2jvsHA2oCxa~Esu!I8dP$z;LNcsF0|t9DHcTN_8=u{Y-2)B zOaEU&&vWw0fOJFiH)1@iqY`v{fkOkY@bGTQHn&NIu*VsIit6*#NAKeL z=eAJXAV-AB9g}*pg~dHz49LSPz67ezn#m>UmIz@aLpjcTA(n_p zh_2-P2~#{7(C7Q_p4dG#4(+J63eOhx@m>%IgLaZ#7%6FxN#3v!k!xdv%8o^4SA(9v zsiLFWUH<7-WY*ignW2-T;qSny&@gFj!V5YnH~#2;W4V)eY{CluL0pZTWd#q4OoZoN zT>FWbrYUm0<7(iKQe?8x!QeT^VrF_UV#dip*QII_GXNa5Whx%_Ke;5;uf9Cd1_sF1 z6k1JkBvqRSA3TWb;O=XK+7Z!#-$d>0632gri zH4Z#QAb=fX(2fDJX9VNdb07gFn&fT8l^I$RMr{%SJ}|Mo25PG0K?eU=v3z--CaY`N zBR{g}OZZX1nQhQwNnq4P(v*G?)Sm)1VZ=uXkl?O)C(h=Ov8z0`5sGyMcBlEmY8$&& zygSd(P@hEfiCUMaK;fy77fm!yNC~~5d?iRIYyewF`e;a7ntDtAP3EEZrtTncrF}YQ zu*=~L-ME$=Xp1Q>(8;&;9%nRC?G4Bv8A+QWc|Y2jAzDsc<;X8t_&Yh?MyWC~ojdKl z!eS@!??J&xqzTngN#eyYxb|8bB{~eA_^Ay8{Af-T`Nhhz%oOxVLpiB;B~2gm*M~Bu z9p^37)SPu5yoj2cvt}v&9kj8fijRFIhEUiohMi%66&=Vmv4)8uEQ=9aLc4g6iHHrv zhV+RY$9+l8+?v@A^&C$P6D7MW+U-hk!wEf;chlpcpOg46rsP%Tr*~F)&g)vdK)EiK zMA`FNY=G3ZtXbi^-Ww?>pk)U~`)(|sTmYe@SOgi)8eO=c_N~!iGh~Otv}tz118=?| zCF|IdMg1kz>$j>5U9(lAAcyJ2=_4rYUmSRt`LnNm|DI<+RVySA&Wt*2J_pLzg@eiDlFdCCrM0`$Kk{jGO zC3;7o!M&yiVF-JVkei4Qgu`9s>38>_Xj?ypN0+f;JncuD`4n`t;^0;l9${-hS4!Tj z2SAPsFk4L3`gO0-`-`bUczdZ*9jQPMY*dr4Jv)`=uL2}@!f!vS2`9&T$>qbm&w>^# z^KK_2!HM*r>5Un&#!=&Lo%pMF4iJ_Ym^Zp?j`m@NIA5=)AfDNB-;cS{IY3i%e?;%r z0>Z>zt79yb#ba=E3KIkOisccUPKX8tiEo>$oLC`ozx7&|Yw*v4_eRC*P))F->d852 z==3;ZXK4h9FnwfM!_VuoCFZ!}%^ zW8n=vFwrRPyI;CUi_54Ypk3P>cIN-68-4_kvm)~h$Mp{IECuA)B<`0oKH^ih;qjUJ zXm!Xr1i#?2VjfrJQFzUkVJ+hIVdaWksd&@VFovwq12PU$a&r>*bXZy(A*Nt-D4GSs zGjOhQ+_YP|0kK5BYo3hW@9mNRhiM}BLwD)NDRkXO#0xm!-s(RjY)q(4=9r^pf(ZB` zWk}yWQ@=Zub?IF%yP<0!$9nF9>zi@i2Fy|>1U$U{$FazVfpZ02;tTPdY%XyU_J0)) zaW^+GO>5#qoe~)gVw1-p57T7D4up=tUE_HJI?y{>9moAvxhNo;qD)^;uIDgYLo?cT zv`U;`LgC4^h!au-U)|qd1SVSx;oRyLBshMp<%2uv!#ZJ0KMn(OTwoy9|3TA$lv{?mfM+jzx7S(8*R{dlV>b4333q>5jTM(%lHDQ>NdJ5eCEF z&!OfRwYrk$`mEmA&(SZ#D<1vWniRqta=&CpwKkDuYJ>e-2rSHv7v!^&kWL-yEE^RB(=bIeZakVM^{6SzvW@e*N68W8HMpVHVG=LN~!b|4nIxZ1L(n@lJ2kgGlKtNWcb{dwLBUmy`=~u&73s zlxOPr{u5jS_$o7>sM|U@em8f?awSep54yVca(kZHw(h}Z8$y&7h5{G zZryq|fjA2R&x(BmQrT-5f*ga+e9*F}FK0Ia9T z*{xsBZozZYUUg`3Aa4Hq6eJ4E>P#@BdIKSWk!OQ5%UP_WZTejtq$n6gTDSC3;S^0p zG@dkN$Re~cW?#$9|7DgUV`a)xq_C%BDQel+l=-Y_&Xwrtm@Q_4Y?}Y!RyN50Bg4jQ zkaQKe{39GkZkXVZ>!CJjtuq`(2EL{>lEPq8jI+tZjP7(dHYcVsk*H8UJEQDYMO-@0 z!Uni`Ede_DpeSWDr}oy#N;NruDHv#gX*|oeNnTff3(A=Q2tXbr`>&0hxo}j#v`GF5 zx!V{glT+(;9|h0sK}VlEAwm@>9_BG%v`*K?_Gw5seXX)oA032x0(>1?h|j-L*Ubjt z+L$yTkBXGQq@7}5xsz|S1%tKmh=5oADS$lgi(v9}-UVli1TxM-Cmb6_q-q4p#R&uVp6ncR z-<33cn}aMhRD9V%1GggNwaP&5Jn*IQ`i#{P?p2`12F&)`_4UC2#Zh$u9)wk+i9QP} z0l+TAbMqPSCsCexxxIs5o4vIe0RL*~iUkjIg&ZFAj6aKU$WvY+mm(J63gi<%JZi>_ zf=w@w&^3BXtocx2GZ7?We7pxCIBLS#bDl39Ur%(^)i)J?95zLphRe6F{ zPwBZ8Wfy3OwJmlqY!TNsir0gknZ77K7`|CPF4T_PJ|q||yymv((!`~5X`-~s-!Ot- z)@6S#lP3c8ZWhp*2((f`tMUBoXawG-;C{Wgu}eMC#QH#GV$^**H`Zxwqq_UGFKj5e zH%mmk1NyP4&ghyb{8G((tA5i<>kl@X)JSoVZ1r5-;jUpp6X}m5_HIevv~s=R^OFgo zC)bHf-wreUE$#J|zUQ!K5pO1*{C1OsPpD{kaXloSuM=;6axVGRvl&+SQHIXZ&)cij zJwpga4Zy{cP7fEd5mh7nL(A6)5Jb3_4@k*yrAyI4JFGfL_aDK=b|rs{qYTIi0o(&K z3eFdCo#~yQ3{bK54t$K`QgX>RaYMFV;3+?8wkY z|1o&$=y2`+bOcK`{mYudrWK&t$kTq#A; zIfjQ+5)E8ckhp$r(q057?zL51)mCAj#s*G5K#Wpg zW!G7smh0-NazwRYF+lw)Ahd%2a22GW=pp-NKWRmZx+9=Yl^`C$z6pLbiu$&X8|?wK zGEMtdamTZO(OatY;q8hm>kX9!97KCAnz0_^S!CInbI&q&20+=>;T7(%s-t=?o+`OTU zc14sXLVT5f4;3Jg+|&>U7+Jt+1?M<9lJ1+2(F*d7a0+#)N-Fm(APVYF?mSSG0U3)o zbfF~P^rmeNXALkHy)`qo5zf5lK;Mew+BFUb+yeIXY?+zRZoKT1Y#55C!5D_?aflCk zZG4~r+ZOkq8;7~V#3|$o&LISb!FgBm>Qqe*`XC-lrCyNy0LchcG6W6y*gQRY#{G#o z3-7m&$ts?4UiiQ~y+jRGfVw#gKcwH#Agl!rFKeTg6-(M<_At}2c@cSXkRzkx4QUp^ zY`=bd3LSFYx)kfIhJJY!;8#8svoDnd7D~g!DU=PvVDRn2IMCm07WR)CbtT)1PzRle zB8k091?4KVBWfdAsN+N!KVBVftby9qNZz|v67bNao?F3T|6jFHd|%ETWqrv&E96iu zgW{a^ilR@Xs3dv@ebLbOQNX5?HY?6%@05bt)T>qYBvlp+dijJX!0s7kjb3}3__UwI zTextHb8k;eTw6^+7ijP%-9%&Kts1F56KxT2F{-sIYL$HyujOyvB6G3`A*=F_eM>OA zGfQWxc!B`AipCXQqa!}~V}dE9-SKI+c|cRkoxFM;RK=02T0c~yyAC*el{={!g@O_S zuZ90i;G6J8XMX2rVzxyI@VE2v`)&41Q#t)XKE#z{O;m{3A`umvK&@k@>-5k{c{V{_ zys)Sma*$nV+4lsj2LRmFk0Or&j6G73kiVo^qv< zy|B{Po<>XQ+41-(*U8+4Ro*egao)O}jCEy0R9=YLAbU+1Z5_~g?dXx4K_#56%OU|$ zLkT$YXRg?RzCZokY~A+XLMcXMpDrGguZuy6lq9rs56H}wSgP*S9 z5yO&q0!I+vaS8+xkClPIVxMn{VxO1RNMt;_9o2!GNA<$Gq|M9(U9}2Ca367s<#J%G*l@PD)38^AcPaTcnh#KE^3I42}x&dDPp0| z>5xkPJWFjz>S)EH6ltLh(S@3zM@ew^9rAR~!!ch{NvH|I-EBXTY}`!VJiXxV*6I}Y z=b>UOZ*F|p(p>KRHsE2MyY2I=wYe?DbKJ^0 zGejiAuls42S8I)B>;bMwO@YAIvj^esZ!po*m`>YTRgZpy5 zH8$x&ll7|U4YmXaStgLcA&-XG{jget_p{cH)o9WQv$F!A5b}u>As)OkM@V(N%AH!T z3M}jmWxU{SbTnRkabgXXiR_fxuKC-z*#Vw!cdEM3#88B&LKX6anpE-TR22aZ&;86q zNL5i1%xsf3P=&!twNd+3AfRJ4p?VyqNaYLuE^eQL?#xxKPn#GojSj0=Pk}(lN+m?z z1i|^8e$nMz%>mnd?D#QwJv0>KtqR=7{fp(>p3Wypz}~N5J9t!-J9LD}xIO@XA;o!{ zg%^YC9so0R#iTU3-L{r)7P!We1%WZpQG_v9eKBT?gPwA?y8=WLkn6%I`0q{Oj}lHn z{>iIzBL4mbSfb$^p&|ZAWW-Byx$~DHMkC21x=ZuLM7MRofR)n+exdy%j`@;GUIvL8 zTJ6NR9)%Lb7_lfMlskWfq`;uxKQWtV#c@%dqA3)UlcanS@h9#; zNm!E4^KRsc-@BU`8b`(C_i|>l(|-snT*Y z$n`JS+RAB-*cQi<*vK#tl%TGcbQNrd(}))RJzC>CSKMJYI?X|@4rmXnXxWbtx0u&H zB!LZyOsRJRrEply{Jf%RHz_aF7jWJ2ulWSA@jN7&VLCPTD7yD28OvP z6{dt@75hp6idw7$ns zHj;fVV~koZcl*&E)E*afoyR<`4^!nCAFJo9O=)BDgU|w9nLKf?LE&b^Iplh0))Nqs z7p~4Wp>KKe+2+(OPq2PBCvD+BG$&2*@^Q@qvP}BQ6BrJb>Re; znlQa!$ykRt`FDrqrsrhbH~DmsBX7h(FufXC@z!ebdXz6o%n{2Rfn(5LGOUVBVlC3> z+mNxBg@U``0u8o^tE0`@8M+bYpcrZJMDFE(dF%8I|0mU9|2L3)?9pEKP^>ZNhncX* zH4Gv1!vUM{VV)k!Abi_Xs$dO1x>kLI!T|HVh)H6ZJNRg?%A;fV&4b@f7>!+7uG1;B*5^ZO}tS^Jro9p-z}SS4emefKg7}2jYs`C49*_7gpbA>v5Gk z_IkbE+_Mmo5Fx$aM5nuuk@%idI)B09D1ziuM`Q}QQ-p-(f1o$>enP{%`$XlmUc1k} zgob5&xq-CC_WZxi-F*PdaSP8{SdbAWd;wi8xy(vZP6AVKGX;96XScRTvukwBYbWqX+*dzxOTR>2zPy zu$ju$`{ev@Q`7+Ne1A$4fV7qNi{Fx+tHQaQC)RedioVyv-IxEPtY!`?>%eG0jY#KH zMVABB#TP|@awm7)VFX&(nArMUNm-wxvP9+@pv2CHqukigwpz7r0jPDOPHF?NO@R}< z>wq@2TOQoG!q*)AqQfH1>2vLK8u$J2d4_)SnMZut0r@ma-iFUJqoVwFuGGd1rI5VD zq8W!OS*sIzt#JxbX>SG>wQKM}^})L4P824uc#d7B8>C&a$7i>w`s_A*tZbKzwJO$& zDjhFzns2QhnVK3x&;t4x;7H$qxC()5$Jl%W_6G*5(z{7PA65{yB5Kt*{y$m1B77cp9dhYtLN&_H^T{cHD(r0saw;sbA$0?R z0cvS`SyLTRu6s5*5$R-R2Kp}K^qBR$S!P&#=p5T8P)D5WFHyWxP>xsY_5S@B#8}Ta z;Ws)c`94yUl0Y#~_RFzbIi35gM%o5b9PC*YugdrQOY1(40#3-~1Z{1MahJb; zq2pzr-oH@9+4~pwN_A!i#bE7v?PILpJshoH&WpYm8U6?EU*wy(7wp9eg!HR$kvznJ zrc*y}SL9245bcaF8x-e)iszyci+w9RUtmv_KHWFfjgP6z7YchimoJK&m%4S4&+@;~ zu`vhix&rCP2qxsri*Kg+wI1e zBP^K|gff{i;P>w#JWP~>w5pU3K>8JN^f+HfKc*HXA42v*v!&$0T}Yp|A8)(m!f^B2 zQR#Inftn(?z!RqlnvLO?>nW{l$B_n}1R5aEp!pb)7dL!+j&+;9$H7^|qi_ z>r3Hd73V5MuFp;DDWgK{lEia?>f+86sM{{}DG?03YA;Yhcip#rW>WlFsn%drrV0|5 zS5vN8=2am2Ki`$-Fp?$W8agNb67TX{ekJS2nQbvRu16-fm zrAf`#XI~NN2`jA!GY)%kBsHq;Fa)tmtOuD{umJsDAQ09az*{=w)nwD>Fm?2SZCmJH zvmI}2a|6T!gxrL(m7d23+2o;rmzr>jN`m^55AfTC+|*k@iB3n#v^%cVe4I01(3}y3 zi_8%VE4eJ`bQ7P)!IWqTj%~!7|FBByT>5u`5q0Qo99D7t7>K#R<>S9=tMIb5g*69X z@k5q(;LXVlzHuwar0Qm#%?zmb}be%Ky&e8UV!88*rd?LjkZ$kKrP9`XhgAI5F;vD zCRiK5EX}-)t}0#Ml`qp=y2YEh#4jeUTyQhdY#yW0dxK~-rOgr$ zbDMss!|6`_*aA-gOaUu z1RJLkqF0-;jg7DsR3nIHvC*W9;c_aXLnUuS%~|p+iHF!Wk`o=t{@RL;WyUW9y;K+)CG^27HRH7WOO4;)Mt6CAAlQ|7~?wZ=2y!84AgFwDV$OV=Kufk*0+ftc= zRi6rjy+^XGW(c|DH*bg$NAf;%Br*IbE_T}9DR_f`GVv6C}6lOnb)#|aOUqu zt_?Cg=EK*nw7>R^)yFL2oy!)FE1ypShuxaS z%y5bgm9*Z(jEz~O+?E|^ENKkx-e2Q!ldJGQrNZL0Cvb)h?UYM3)+WJR!udPS>Je!J zGg%cXqBMweGr-$gRA4ZVH4CB=iS-kZZjCtaG`QYJzb~6xaboCu99Gx_;f?h1CoNm4 z;%#u;a&Psx&p|)G+F^3RC3@6*n#k;t5Y&rJdDW*te z*b3W~13Nl$%_}KIqi8XkFOCD;apzHxR)`304)clS&bNZlAT!pSIqR+FVl;gzH1C-O zjm)zmL_Y-@v8og$vX0os(xgpfy@-M$9BeL49Vu2!)phHDLx6aA=lJRJ?LzZ%gIM~D zB%*F^iQqy~UxKmKsP?!|1baD&q8E2MKtBD6-+&$8CFA6G6JAW0m|B+&iVF=oyZ5i> zvy*nujPKb1H*4%rup&*KO&9`RF!Ra>5w@EoQw5Cy)rsgKESSO)s1as33K zoi)i&8AT9r-eLr3mklrAH^}IbbBTq%*l>i|m&{%G$ic1;c^ICR;N#1Lnhc;d;Q#=S zJHUQGruGB!#KCTr7z%+D1MtWpE4Q1Ws1RHOFU8JXc+^9od9T`sKvaXfVb`0x@Yo>@ z!vLe@9;m2*+<&P1^Fj_*yb%b6xeJfG!g>=FkcS*ZT*~JzeE3keYO;t}3$?jgGj(?E z!V@kh2gKZkCl7V2#ACtDG=%{8_@VA)=Yc6n*>zaHKiS{8@i2*U33>P7;ZU9x@qdk7wv(Iwd~)M6*iSM44<+9%gy$8uf%dmiC0)*}2{pck0WV)UdL^ z&c4(V-A7%_bag0VY}0(%`KT9AK_*T-Q~5LWxzDMZL)s_azrg!v7!`_KHY;{V!4=4j zqD*tq zkf)BABL@%aLwlvl4Cm3&gZfZrZpy^ySRXysujyNUXNGR6WSv9=U4d$VU3>8$p76>_ z)hI8>Q->9cerEy!rY;FQmZK&r%4$H&HA{Q1Q+qpfL&}VUJ`mTz5;9z~>^gJF^XZ?8@NK=E3EcIaztNTJH=&w zu~M9*E1zcK>b*?NvfI**yao#xmyqNES*C`@Diq{c*F-?%SRJ9v4?>i+^z!)yRT8(Q zW9eqhDwT@4N}`NJl&ffzGAQ}*Zd3VJn3%Yam2xCTV#AJzcw-{drQ=+xB{#x2((flQ-@}w7L;lqPc>~r9tg^Swi`kjX~{^S$zNkt+$t>v&&JanS@DuLYvq| zH;Xznv1z+r&@nGL-mWvQhyl8AY#}dSToGPoQ0+!EN?BZzuQW-QmaSCB>rCN|c7~(6 z+G;E+@cEI zqb_tu+p-H?OgS4B=A5J$Ww1i8L0AZLSXL|Yx&v@A;gHZ}8PVA+q*=FyG_xa-m705N zKeFoO=V%Ts>x?~#90}S`@&t~|+`~Yb%NEW7T zxWv7XnCx9Z;fUayptbaV`Ji_V8>wHzYHTm>xR4q7)h};D+FNk$rNM&Q<;p3SeH^C3 zf>1<>E;=7xip>;{Z&_oL_Gr#eBSVu$X$BZuIi0D(qX~i#Cj@}3id(2JKX%A#c35I1 z{+LE(bv}i?5_l7K{N_}X7A!$6a+EulgK1$QGWIrgqNnMrd3`L6xtYlVlOY50C4Y^h zyVxUv5+NPuTGcEbZ13`Jr>U^tZyV;U$vUq5@FMnm%9}-DPsf|3MMG0gElu)W zjsA@pV!ka+a<_DGnfDQnsK^ENGctDEXo0MLs9oAw;NsGxK2n$Ubm36sTyE~_!W^vo zqV)Wdb453U%ALd!W~)wz=9b=!Y)IjnTQ>8M8;Ylk{DL&0B9E-Mp)Hc^6LHc!-^E$)GFYm+7Rx5t zoIr8F@O~ky$QvbHUr|}8sy&f^3pD{OX!p|I2zoTy1a7iDwLuh|G(IkwkfEz*#>N>d zyXP13+{t7)3db&VIIJmPk*@u)TjHavAESf&s@tlyu_?lORl~v4Qu^JeL7f?+X60=V z>ab{v4x`G_J^VP@wg`#|ETy~gajb2{Gx?#Xu{3->+@{^45U%!oxl{V41VazAJl^(Z zDZ~>Kem`N!6Nrrig{u7znVRj$Oe@KVyav&jB6A@NCDt+8ugZ|dIV*n-7Jja{qC%+g zsh}3c!DgkD1kCwlPOm8gR2FmVE68Va%bov;vSF^Cc?B8Ne6D6%VOTI`d?%`lvUZ}z zYtNExg;=rL3H-va$O2-(IzSOJUoLaRwhf3MpXZiKxm&oFn;*YsNjUy(x&;syflTsi zQKs0pDl?E_XE8|6=IVqAjP2D5E}Z2(tmFXi+*j!gnSItxw?=-PG&;sOBKqYqGpT=3 zS2vn`mE6^$9p(A2#yPE=*hUw^0{Kl#4qcWL<5rtB7lUKrD`QuoufKvrviac1NV5#K zzeIh-$LuM27IR1Zz)pqvFMe9gFGPRCv%r4$Cb22w6ZMg;YC*=GFNRUDrdcxHHChkp z@UcHynk;^H*n^g`b3V!kD}-D(wMWQP@m^>r7pDg25SHRkgoKry0!QJco~Ab~op7w3 zssKk)HE{^QWW!j;8Bc0GfUqr{1$hRcfsFXF*o8R>6A@bOoC2vq%6z4(wUm){#;y2E zGY>(=A#hTJ|7`8N4-{fokmg0y2DSj{SO7^FR=_tc;znWi>0YIGLW)rGAHr8QT3PPT z(ujPAaHN#pEqh8iYm>goDJ`f{mx_BJb=eHLHG@|0B?El__c!C5%RxvX`*8gw&#$0X zfCX4@A{Ax3ACgTJrr8nR@*EJOGFN+7U1C-&5C5u)aFwl46uh^hX^&@Mgc;hcpG)Gp7S3Oq% z-1xytpYK>;3`t3|r=EL9|E`G-Aug0mADMDdS z#}tuoR>}gAPJSP{EN*rBQjInI$Z1`v(K|M--?8yI+%AnNus7ssc}99}u%M#~@Qj zT+or!0xnMVHsZTr zWUMhdvzv|_OGc)y-ZR!%!v7IGw>DO(_iVruTT>&o!3pO^e5%=B58MkDx6VzweJv?3 zW~)vmC+3?Nl#c_q*+_M#KSS~I@lVRtoKr!>Dlcl8F?7TDzMf4Sbhqgp?$eGj@${;B z4Je$2eM{i*0Bc62r+Qk5vyqKI6)Ic;-L>$hS0m~9NeWJj5y~VZ^i4nSjyqx9yHQzm zlU?{v}31au|DRHpmPMk7EV5ko zTIw{jwNr$W?k#i)odN}vNoFQ96FV~rnVBvK8W*GrLKKkV2QeaG5tJYZWs`t_MG*ri zmPO1*5vwQ!_{gG&-}mx5libX`Im7Sw;qm$W@##Zbo_W8{Iq$RHbI(2Zo}1`uHd^Mi zuk8`x>LQ;Ip6)7gSKNPOxfZzV_xG&0#hIGo*5Afm+%8AY;LM>Vd)&a88{XOSEYY`| z>xO(+<$nOJf4WXX-8iAZKUJE%aldYw%Q%d?Uh3-Kv-%R}YwAmXd)M_1GCjy6j%g}iU8graPmi*zd($3G z%%i=D_5*x{f2mZae=R&7Ch3|ntB zTT5EgVV!?Li{?EmXK}Koob|W=U*#-LAJjq_LzggD{SNvRCcV&>NY4)RUr(O~pJ3WO zdW7~E=TqlWhvCgT#%#L9n0WZgF1IBVqV7QV276O|aX+|~e;Dl>yp893{8OcK)J<$Q zYqi?y>fW=e6K89xPJbJB)zx+U*PKCAACLLXO|xYeqGRd=RmQL9=zU&;)b8xSr>@(H z9)=s4sXC2g+E{tH-u&RU8C*-4lhM7-<(kyoOCK&_1R{!Hp_JJeQ+&Woq{hRRN?bF~>WUyinM zWmQ$q#)<#ppDJC-mfl4y*E+IE-?OR`musp@e;apI*?d2GR;9+=2QaSU9oMr1xyVj| z(bg{xX7oO`^hTFemYliZ%Hc8_d6%J;02 z#NnDs(%;5iNtR50k28t>Qu#9F>;Qk<(zkwiwW?tu{Y72nU0rG}4v(pm_s{XHld2?c z;y~_tsItCiWiO7^l)e7;uFJm4-6qa1t|#(E{I=P$usd4TuCa@ZyrXUG{8@w2oRvp7 zQq^6`{5Pj*t{t?j_TjnARRh+>9WLjeDg#z+^t0HkRZwes&&pq1swsc{ZQSKw>+6ps z8}8LwD!+HzipSjFZ=LX)d9Lz9r<1tPVUw%*%Fpjvxrr+^<)*)lyWFbXe}&y2ZIpPN z)=>Gz*zCX*`qatT7K%73pDe2mQuhKoW+czgCl{*Q>((6>E$}LD@5G+r;I0br*1cyn zBF@&-i2n9&YsA~}G#AEb73rPfZ27!TooX?%cUKkd3&&K&*Y26rP4vXllUr&v|hXg?^(Twdo}f__UexI6I19IGK}WkO)3Avskkl<6S_}y6?jebJG0d_9+`yS zvmzFUYKmBY8+Q@cWa6`&3AA~$;L5A%w8xrOCg>T`=!k>XZ|=j)vg}i&8B-B8F-@xt zRIeW_T*~z@IzCNVBV64N{>i^o`hhL6i&?JqWRt#U6(=s&RGj`c?uxVd{*h%`liW+t zNqBSRn7Tm&faKlvk>GN!o6)-9(-t=JPnF7W$9^;$U0nppzGnq3?$i{t{xTPl|Cp9U3zM^>{k8b%j^?Ri)6&0#_MU8Q-&V6t`;1QGa{4J2YS*lok2w(A)+l;`Vu~U%aYbwiNhN2x>#bE zwjA=2dW$Q+4AWPI=$DB8!rw?*J(0fz7TAaNXN~45$lq5=%iCgs+fJhDlg~Dge3B6L z7Izuk5|JwAU5uk~L<5t~8r|EYAL-$D)6SyL1#m>wUm(Mwe_R&$1lYcMlsLX6Kqvoc zE?L2YJ4N8|xXtA~*v;G1rf7V0cG+4+eBg}nEW)<)B@--WT&&1nUm{vP{a0KBwCl&^ z|IazdKAKPJ^s@t$q5p=8)?H5j(-kcls;=cL+pB9?Xtb6^{H>LhDmKOOzo&jv;{Is; zDtgziIR69IqjIbI_kT|n%Om>#4Sm^+@zoW5-pSP!Ei_uuRV8uGs!DZN{rtbGQ@2Z2 zMk`&>yV9$&@J$Yds^>Aafp;Ct9p`^T@4kw6XZ(*>eO0!qt3GpTb=3=vR((~Fb*EIS zzUt@yRaL)SvNBrrir!UUm4!_l3RSPW#{PRcyuM2QKRu>vj;bsCtkbG1TxhhyRh?d4 zsq4`a`QJ0F&zB60R*~m!PRiP!xeF?O1;=6?JR_3Bpfn5^uQ#LnA4!vW^&iZFcg+B}j#PT%`n!W@u6iKlo<$Q9ljPv6q+CQbMmExH39t#*kcAQ9W2 zR{KnsJu%ePncJeKMpb2xUGc=Fd` zbzpas$+W4riD#=d@~Wf05k;Tg9OhQP4W97JBNb07k#XxOdq!5#aD`?qnikTeW_dYP ziHDm{#HBgBXGTjyb5D<)GH(7N)#~XQle;q~27B1HP3xTBjH%>^a@|E=%1x$Ep&Fp~ zOXLH3lP7NWtcV01ZZJ&W!<{^Fo@Wy=Z9Yc#JCi4#;HlxZe9CHiTXuj}JVZM8 z!u3IRx*3vM{f4W?VBCy6?fSdwJegh)eN)?9+-2=e(${7=+uYzTMC$w)pi(IGR=g49 zyanVRg}&6&NS{a>AY%qC{)d06j=F=oSO?uW#|PJvrVkqaq*x_+(aTB9aQ<|%qgIw|S(1+golf6x{<&9Li-|9tUrl_%l$(O z_ePhFdJN}_BZ~f0%WXRy9bIWPi5@!Qd?_y<&}e~v!K(-r1uh_&L$pVIc&F;%+%7jH z;{80PM=w@Sk9RBRbALk}!_<7~wRQIMA@%cQmnzk_VJH&ojkl|46FhMjNmUK;;FdX7 z8=d=d)Z4``e{o71QLgUGLT}gHetJDNKDc1?VwCX|E~|XtMhAE2tLizgdsK>tzJVK0 z^BW+PVjf+N7j!BL&Nvr97ncP0mgs{TQPNceE?Hv}3p2k~;g{XQ(dkShUk8e=<|VzV zCDa_N?pCDAy2f}>b@s$(G{sw*dg48?=2>wbHj6HmX^Or5G^^{UFB~SjNE7-mt>$Z8 zPSG+UeHmLn|3!}fMjfBHb9G~h52S`S4A5aU((2#PXdZa7x~!y(xUi^uB)bMv)Fim= zhHumO4syjuuex<{v4@}3ra8l9?d_VEq&=I-em-xDhLvZv`A^-w+NGYvpiIJP!s^-h z$$l0E-inI-$sRR zFSt~uRj*6Z(X(WHTif9tdsY`LjUw@M7q3H4p7;f1O0V{CMK31C9d_6=5o!e~GCFg# zg|66-6Hz}yt+PyU{+CpnTv0&PSS@1J`mw5Jcfqi#%~KVhQT2yZ5tqu8%+R_xok2kT z>hD@KDe>A^sr%B3z1H_N-fbdDMJFZ5AEcwMg}UU20F}l?<=@{u6d&M=*9XzMeTM2t znvP}|?&o`uIj$CFe8Rs==+!ODggLM8G zP1VsWhFte?G#8!6hY!iw#giwV>gf@UhgJO>*?Y%TkOS>hl2OR&Boc+*qRSrKGC1w5Zeb>=;X zZ}~(WInW2|@dsA=Ut?EySNDuo)4fQQ_v{S=BlIRar$pac!foD0MCZQElgkm@aj^X1 zZe4tdPxf@o>sZFs&Ly)LUBg|rgYn@MUAMS7%iZ!O)PTEtu%wF)OycIA!UE70l0nlg z5KrY!`AW}-*6<~6656Qyo@Rs&?dwhsbad0X0Mww+K6(FYRr^fz(oF|nu}QK!qPdDb zNl=mS?0t|vi$=pF3g*FsxF(WA4e|Byt`S;@>Zi8`Wi88bt!0^IDw8Gp=yo#QE(iBb zlmDhTqt|IWci%C{Q6~D?ajM#{Yb)n(bywUP>Q8jVjilr$q3)FE9@S($HRd6_iK*zR zqLvyPHjxBfbY&i7!4kNp*mw!T6{&0@K8OUC#c-kZuG2t8P5Cp zN|^QRLfwh(fxeV zq{kD|y#k_h4|TGzg9InJ62v95sl{|^{+CkR=<3*_YO9v0YU@~4OQ^9nu8d1%nk6j` zP{nku;T}#2hCRFW0Q-`8M_b}+FLH&+O}m~e*+CJ|2VbeJ{!JBndoPN?srbEvt#f6@V9=(i{J%}m)RjwMVYKgK2;JObn zj&#PlsZGb@Q}GwXE7NpZoXMlGx1oze&e4e6_~|+)2Z%my~*BW zWF954*fRkNcm5#INGket4kb#=11q;@TV3MbxyR&yK9ehj? zl>S3UkIUUD@U61sL6;Eoo(&YAwcwAsQcM9foT-OamnF^E*6>XZDN3(v!FSd=)U{?QHCOJCfq$yxys;9F zWPq2mOX##UQ{Bn{(lN9yL1(YY7!W|~bq{E?CfBEY>7aV&3L$ zPV~xjMkGaVNu_o2LUCcX-c0R%luymcG8{yoc8O>pZ{IM`nUp0OiYkY$t(R?c{i`&B zX6_B)<25~ZR8=Bw1R0x%=Me#$h}&GjQ>5$0LwXJ|RiLNiJS5A2;$Wd}n=AJ{wCaRW z+d)CQNA2FON{!M%Hgu{B%>rdbyL6Q{s&hW#UFOX^4n|$gSEg*uJ+1{4E`&**ld-De zul4Sbw388*-Si51FcSTWnhk{Q&eU_PdCYhRpx3%qRpPIGnE(| zjCb?0`#>zkLvRFB)Eixu%#%cZlq@>~<{}fiGr)9E-YLo3GE#i)e$z9bEaCl^A}M=H zq#-Pi4f2EV?Z}q9KhV7$FPC)CWttxQH1Mp0XZ*a3#AT6h(t*K!4~q-3e0{GrM9?$D z*a{qzRKPP}YNV6yhH0Zjau8ca#sqZGk=#DUh6a%6m;hPNlsGr^K(01Fp+>I~U@<+l zt`+Bf#q{K4j5_P-I7i*oI%AAF;2U>q<5;&dzUszM(^$u&{;q^t#(G}zmA8aujdeZh z>r7kYtg*hAeC2YELudU(d$Ieua=r+wMjChR#z zHuNU-@FJcM7BBT$-yD_j94GqSYKg2F@wJaEIoJA-Sj+?aEiRL}AksyN?xyv8VV>7$ z#O^1#s^J}V&GJC|NxkmxFtvJyRS~uDTr_mKiu~?>T6o$QwuxlwYZLKIJ7^Pe$vPHM zGv6bWv25gayq7)6yrp@%;E&b!o>dv=x^bRS(f+Q|>F=R)7vpo|G<%D$>>eKC>Bl0> zEoyE;&A!34>)GcM>xw!D5}f;`HWA0Ptga}YmV4Xfbw$ac^+R+P6-Bn9t}c~Kb;-lj zNL?B2dSu5=vWZ$))$Xa{()CsGW1>uigDx{K zKJw%F2QP zXY=@DDur&>&oIm5fzf9l&b8GYzgo_ZQ{39pHGbNq^nR6FoAcC~FF})bFgfZ&&h`97 z^SNL>eO{fiQ*>oVZOfCx#$5I=)4^r~i6P!rNZ|u`8lM6sdmSn0D|Iq7tJAMM_ilZ#1^aXBvATj>^OIzN+R z?LvB3IFF8x)fFtqCDuYF}XS9TM+>9dFb=70+z4767 z-Sf26}hS1g|rNV_2mGTzW9^r^0;me-M4V6u9ed2X2*|7+vyTA zja=nYz}C>hoz-oRY_40gndr)TYi9gtAMTbNG>dVos*iyvtTBYly`ki;Dp+!a+umw) z{OWLOY4Zz6t&4N#5l}5tTmj9-c)GXaEOWsWp4ZjL+vzLm6U_GghSB})DAp))bfpxl ziAGL<7+OJ>1&SyK$@WlnM3w533*m7(z+5PM;q~cPV^h4XrSf!(V%qFlBr%B%#Ar=! zE?tBAcpn419(`E{Bt8M9;yUeFU5c)ZTkL}x*}li*lyipn*5m?Y^wdU%+h zH-(TApUhTCNeXF|J_!gyak8XkA{Z^kW%8huV%pa;rY?SDK-L^qI6vu%MXa=?gj*_! z!k*cd;vws5f9o>d7(kLf&&nL)(Sm*O^srKod?gEfOzTnC$VW@I`uIv$@s_Tx?o2iM zmGn3^o@TxN7sc;{bp8lsI|N*~Rx&$9;j1k45NV|+Y>v|ZO+z(iAVg=eWDR}RN&c&-<=XkDa_%`*6V~;>J<*6wzDKw0t4E>NlZ)_^`uDZ=x{?ZG0v6?|I6odsn(b#Iva7 z`4@L_a%PLCLf(X^MB`XRaA}ICOS0jn5?jVIwrbHrS}x>uEAnrncZ{QDL6Vebd~{t% zjSSDH(=ccwgr}m?m~`7M8n!;>GZoBhta^#rj7Z!gn5@B45_wo(an%{dT3S#g$zo40 z^gVQ%)WZ5`b9JRx`N)^|yFEK!m56(2$+LY`iMY*|Z6fYq_qdW99hNW=aF0ly7l^7v zxikLQ6`v_$*Tf;_nm9mGIpKzXkb{O~Kv~HxxPXFty1L-}LeLzVGw+%!`X}P@tkdOL z-D70jbD@v81L8Hk`sWS#9eOjZe!7)|b?6##WA!xx4_sois{Zgs&3#>SiMp|Oa6!4V zHqDi_s#*2iksjKlMDeFwlVMeyOkbTy(WfZl-Fk_<<`S^Y9HTfQ|$R# zHPK3 z<6NbePA^!#V!`rN6hR8hJ$f@~{G|vMELncaoTa3Q`YPrunzLj%d+Mp^;2n-^MX~7< zI+KE{6?M2;k&#r&Ll(<2ct(1hD=+Ohh^h8zNT9j0&`@bNP>)^M4SLE~#@6}8Uv{lg zdbrFtBT?Km`85W4Q?<_~;>M72iAJv@TG6}!FlGm6&Nac6^Xq8L7@;$)_!c>UZlzD= z#abzDPB2>2CkMM~mIEU71l-6|V+Axli_jj4p=Bdv54-LW#06s~YZhJmzS-JxDScOy zIkTq840cVA4JQZafHZeLvSYj$tK-#;jIVAUZM3KF@5~wOZeJHmolNT*9!vIxn&wb( zXKZlV1V3iUyXYIfeVA55IaQBm3ywXMhp!=fC@&You3$WCqoVE(@$Fs-7s@A(mzfuv zs7cO^aZ7WsETRL91fz;dEZ`nH4ANsJ|Qmez}wRf)blMKWAU#jJ`1@P7bFlLgVt6cU}HQ3y|W+twDHf@zIvk`TF)`aIEoc+BZP=1MGMJqp@CkC2m*$ z>~{4}u~#}~BabjS*AtR4%Z1D1!fkBA-9BqT-Oc!lwAAeaVgo;Kuh(F zt6!Wgq;$rm$L-myLG%f2a(Z^aDS9QDHq;|Y&^gb+tr#Dz;=S7Ush1yDK z@{LfqPTDd{9?#DX%2VXrcG2N8;1u7x_;LmHS@x-GDn3x#Jn8 zR42@k?EdmdD0)NPgginxbwYI0`zqYsJ%UB+c&8r=^$3)!lNJZ^2vVvOgum?K5yWx1 zCiOtgVKMFJ;`%G=u&C`DKBRW(yaCw0E)wT!S53`PkC_ z_Q&*&%ptDKn6jbI za&YPMc1zjfIZb|8!lMqq?9Wwlb9I%7*%j{@u6VWY(i5`UJhovB#yz5L@N^gVCu(Do zN=qfz(e7_@B>GKl-1|r$21luYDi1^w|JdbUKbjq}_oj4D2Qes%Tfh--?X@UT|# z-7XDTX$SI(o>j6S5j|6z%9Ae5(16@VRSR>!)X0`Cs7|nwb(!S2Z-CIIDjJzGVF$8K zu1w}D8kquF;*rUZMI&Q@x5jKFh(51bO8I0-MkUWE5tQ973Dlb4fo-U^!Cjc(ZexaZ(esR5q< z6mHj|x!;wkiiX#vokvyk8y^iXWtFa1&8t2d8D+x%scmrgh2Bj|9_r+pRn+Jwl8emm zHMwPeB5pa(i5gSFPsB|y`ZJB`JUuxy^V`Yk07j?VQ>};Gpp}5#z?rR^7SP=l4a{lxHsqO zOSmM9E{VCC(($p9H~L=3$ne|^w5W~46sbJu7mgYqC(+T~GhDk|8*2kb(RS+u#KYWb zA1K9uDGdzo)+eFEg-7!VaBSyKtg!^9rZ++tRE-fqh4&L%4 zO*!}q;Gn5&(Z*+*%E}SBKM7xdu9plxN zDkGSTJf;l)SY3uy8gAk{;+p@jBRuO|)*(vRO8T}>JlrR@A)dV!Nj!S=E6#0;%SzXR zrMy!u-btUYNpEQAPYe(D#}^ECCt`!sYK>e!<~`Niy*fr|Z!kko zDn%PLc!6zsaxTBkyJSA4oE=xnor&IYBpa@iET>ItW88>yNOG!2q4Xxx@(3kfd1#%& zt=TU<J5@KVW5d3MJigJA&WzCcLzB z23=bEUQbj>*zXt?~D%efom{p_)xm-5w3Z!`wl z-ZMO%ZdBwus%h+Qa_@j~-E8_fDOX@TyZYB+?o^{mbdL0l?wfMOob%k`<4yr&D#UH9 zDb8q};-p(!D#jEZLVR$^*lu4baK0?u<$5mfPPU@tt3%#ZHGWDS#S7z7@=UD=Kd(2bC1@p(Xo7{Ln)VW{o8+pu)j!!DheSA{6 z#E(zPb?W4*ebpQ2v7g9Dxo(Z2YODQ;zO>Ao(c0A6MqixcEW1>+L8H$- z!)$dGwAgv;Yx@FukT?TYy}=dh0-Ax=J{irpp5uta^s%gp!}{fqu*(%yb+)RFuI*lNHB}@eCso-?)jFfAarA%O$=>u* zwKZ1%AyvS`ubxjzHMiJf{}(QuUnph@~@xS`}M zX~{Tj(eMZys<|zw^+#9aELEZ3Pqm4-!U{GK*N5X-tCcd6J$oUWh)XhT6LFP9Y$7i2 zs7=HLp0bI!#4{FA6W;~rY$CqS!QtNuC;tNGZ#Rt>AdbU#J5SkS;pozE~J1>#Km3qbf{7%@+{1;#59Yu7Pg7FokVOR zu9J*S#I>8UiMX7i7Exn}JlR0O=ay0??Irk ziHoxA8Aqk&8g+oSjB|}LLI*unuF2di*JN(&q^q%sYvneKbNKoOMogVB$useJ^dx7@ z{QXVWOw%iFuFTA{dh>F>6bo&Nq9v&K^pWA7wgx@?jU>`~uic1dDgUG%M1d89SO zk$qK_&sIm)kV+@%>ng(uSq#cN?GagnJR%v5CX78pr$xA`kYK~9ee_As4*Kw`Jcr$O znfje`Y39-A%SWSe5KVYxbu_V|u0&#CQa-z$c}krLv{x&-D3TTFPI(19iZ~8%DO`0J zch#Zsb{-W+DC_AXZ-j|>oA^WGtG!M9Ja@gfiHkn#X_8gcuX%Z~ls{t?_BQe7^A>xX zWTURPX_!Jqy-g!z>hm=5R{=BL7A~f|w~6n8w|JZQO_uGRCffQ^Zxc6}#ond_nWEk%_Px*B#I0$)r>UJR zo4qZZt%A3SA7{PkZQ_O&@a)L#?BFC%)9GZ{?rq`9Dtnt!WO~!v#2F4?t6S}GG90HB zY8|lzB?boa+N8#$~2yCay>mt^B+Z{r|saP6nH{f@Z1p0aTZ9dkap;*T$F*#Dp zM=>1Zwy@pX8XxQ>56E8jw)e#nYlcSFu;NW`MKYBfNXovKNuGn@+;psOfWrs<%n5oe zknH<<+edm$0XaT`KKVMq6i@5C*dT34rplhvNiB+^lD*4qKH9WaW!T3&Lf0sXi#~>m zT3_rf?TgV@vM5hcKQp(_J|82s$~AE=k(9T9c1y~ugBc$)ZK~mcVWYR1o*gFW6CUiq zCU3=tR63F5>q^eYo~9a;BsO~r=2Ls7gLEl^f{%SI)e4(+BO1T^}4_;>W}r(prQpo$y-7n zrIsXu-sW_Swxi1%Yd-dPocpokZ5{a}y=yV6NIzHAx`qXvD z91={aCzwlukdI)9qi^#zZlJ9l?0U+_%vUHfulF=Bi}l4mN!J?^Z1fS(DpyP=L|Grj zV7K;+O@8(Sl^&fULW$&jB=mW9+1I$)+a9N5+!7tjVjEQ-HNv{#_bKa74Vgr}|W^XHAkI4I2>E##+ zy~Wc`m#NsgzK+E-DdcZ|Px8F!i^Tc|HqZ$=+(Lprijj_abeien7!PDqyfu9>`Uq@< za}x0pB5myTAgTwODsx|MMn^f*JCyv@AiL)M(9wVh@Hbg7r>&HE_m z%^SMbr8zTOyd`uw)C+FW&%Rb$&^B*-qPtr=PszvLJIEg(qP=J2!*(CdU>^#a-PQ*cU*y(@UyPNhCF*h?da+e&mQeFIB~|oPETAuk z(-eoV=5Klms&f+coB}VV^(dKVr990`=C^mum5r($E9kz5*0MOU^}gCw^fm?UYONM$ zyv5yd`Yecf*?Vk<$b*LdkGdulBs&t>D9*I_C7#sj1X4bonc!+AkBW8FOXf?_BnD*~wynOh9Y-gX>d2Pz>qPumgc9CfN4HFmAuHFB zoSdSzf~el~)X|57_$A+t(O0SV^}OB~nftMj4{>9W)v@8)vho<%FK)DY+%LC&#E zc?LRZB*|}dR%9DJWh?0}65k>4w72ue-{>1U9jo};oVx0_)mxeD8Sa>$q}+1_2R%nA z6G=yeb~y}>h<_x`c#2ORO!Oou(@RW;BIOoOQuh^Kkm zJ%`F3db+lh(sDc()y2w}w<-Q+?sFl3v)thNnwL@Fu)mcj+KWBS{8VrrwGLYH=O@P7 zd^5+diOa(0B+qy_hl}W4UtT2(`YM)GEduT9sbYWhvP2P;JiV!UGR@m1a(G<%xa%23 zMI=wtqc`aFEpSrxQ_m_l8~-V{{2rM^fGcPZUgUnDyUu+P@dZ~0`B zb4UG%WD8R1E{llE(z&<3NIs-oy5Ayd;g}w@h*(pwXm}4tZfku}EANUb{oEpI;^ZE! zFXGfnkJs0d$7ST*DaOa8o zMKF^KJZckhL&@1hQY{vdY>F>^$KsQ;@L$yz$>yr4O(c%nMB=zbG)oHe*Y$mxC534d ziBA@hyx1H4t|d8cDkV!yv!pPetRE8{X~J#g+cuSSDyvEwr%k0j#;W4s-nrW1SEKl4 zRf%6Vl^kwYvZ}-{OFM3C62Gh}@yn)amIio@r6lAs6Sb&UF^QTBXNYRpOUbC4N~|QeKvx-6&gZb5<4CW67#wznsmMl8~!K z)T-k0%2`$7msQ2>-nri5myYvR75B%SRV98|RpQt8EPlxj*r-({Eyt>omSa^(%dyRm zb$_c>#eS8nD!#xtH`XtSrVy7`)TYvJC|Ffok0q;0{QADdFZq;d)TWZ1wK=OwT8>pE zEys3qA|rXus*;khs@N~*CQC`^VLmpMyta_Ds>Cm=O8m0jfwf4>v8h^R|Fl)bemOT= zN{rRAl9Al`k;SiBJYq(zDybohs#)GHC|OlfLzcCN=8)8o zRmE*JXH)6h&9~PtiDr4_E^1XtNmy0Vhiobtqn#}lzvR7!s8uB`$EuQ+V^hiMP}H`l zBj?`ctST{#X7bg_xyRzyOeqPgO8l~_#4nplN8cY?{A!c?A*+h7RynIm{IaQZ z9&K69Y?jeCXH`ibvZ&~zf#iMEwxlU5A~~x{=FwIa*Q0Y^{jzV-d9+O>>n1s?itDjt zRk8QZ{T9D;Ey}8rD~wGgt1He=EGgqYqmAlGXm4RmHuwWL2?W&O^2oxwfM=m0T5aRu#{4N>-Khp`Tj(Y8Ah1DqUT% zs-$mQRpQrHi(fOi6-I3;ow-|8GB14ClHyFcqp+&vT5D6uwWDNJiC;gn_$99wN3ALu zO>8Q;c9g6t@yqhysb!XwmsQ2}n6s!_Wevu8q<%@XhS;yDRVCM2t4c;Wn@X-7&Mz!} z$z4FysuI7fD)GyvlB+`0^3;zG^5(L)s$^WXsk80-n zlsxyJKvFfmJ{tBrut+r*`e>xgKcbqOeKgYVU(%NFD<6$qdv?%x-tf`rGU(na+W%zl zCM7*E_nM|Q+fO9j;V_LU<|mSRb5wMmpNOk1aHS@<*+(ROGO;@o9^rJ}d|MBFf)AE@YnQ@smQR}D^5pN{hr@r`TYR26ml ziMY>|aDvSFej?6YCa5uO_7ichi~e05_iN*_K%CoAV|v6dCa&P{I~vo=J|dZlW-M*I zRdP31ll#DG@4}QtjPOhq&GZw=nDT`Bbh@92E4c8uiq7>D$*6*_So@W@EQXXUtw3hI zrJrkZIiKWY!6fh(75&6dB%_L@FlR{TwDjN^oV&n7n%oOM$;pyR!IIoesk?7$Op{OZ zt~;3&2lmpso9ZXxx+}e@F)jBKalgxKRnb{KBAqvHQPHJ-BDq!nsfup%6LIbe|Dhtk z@ku@ulzCP~Px-~fxeMQ+qPP7-GOA40aysyI@4{@8ez&iR=J<$oaUCB$^{bXyoVy1s z1FKBXAF+wJ(V34bcl-Ioxr@T5^L#{&vP@))N&8YIKW*hDkAbaaFPl#@Ht*#@MA7EG+^A&k(vt9-D(Tmg?0!ju{=UZLcYSYclCF4} zs{ZWPCiF%HUj*{&9F2O;gRMo&LyZ<&4e5qfTY1Uj>0@ni$t0$1i%XWmtfeY9JpoKX zeS2C9U*_y_$)(=ba%3iBkBjTEV2ev1h(opO8Q!CFqfBO^wl*OT#GQZ+;z#?&#d$1D zQ`K@`m0S~TDe8k8TPu`Zw^3WWm)VN7RCV7iF2jD8yhho0n?s6c`Q=d-^6V*cJqB&< zOXf9!P1ro~)))eJ|l4H3QYLv(M_PAusv3k#Ww8kYQ$ zOST%)v%HX^?-izv^BA?2mrQZ2d6d1u5nCQ*bFe)wo+(6sp(XJnzmkx-Q0XyMZSz%e zuXV0cmG9hS7Wdkc6sDPqb8L`+2VmvbJ>``P`({FMXJ2^-J2S<*Lxs#I>EV#>FF3&T<`U8rN*7NoGSS zOW$si*-!!H<=a+eHk7k0o;1m~d^6S*IgeRe`_d&~TdB&NsZh{15%p^mEpm5)viG}M zHMNYZ9$UB`3$}V}8P64_N#857#U&fPOZRCWKkJuAS=%W+s;ck!s$@1~YhSJ0A05l8 zMbo%uLrpRp%GpMyam|LBbT;&3&7h?xrGRCj zwn=A0*0}fzQ?UBQZ8c{b@8yHgMO%NA&Ft0@Q)WYsEsruAvd6`FEZJI)%!W#~7Co-n zP?OAt!Zz>6H5+P@g(2r#+E)E$FikQWvX;aw?zJUbZOd%P9v6>HQHx*A`WV>K3Y%rl zl(Cdob4W&Cr0BO&(=2nQvL%nrGH0^ov01hwm27#`N6NN5>I%{=T91AYYMSNcz`)m4 z<+qB_taB!7id@?{Td6kk7+rwM@0!*ub0%wf>DH!P{kGaHbEa;~xY{f)j`dqrJTeVi zRpYseHtPd0oA)vsvX+EA>JD6@CE>Ta(%d|r)s<$MGX<@2$+gzjCgku2#}?PP=1k4{ zg0-!E$(+erUb4;{aE6lI+$@C~hPzk8TwU1ze@ zP^-)yt#OU3wskAmE$Wx=m?JYQYaZp%S;SVVIKULj;(LY%*yJ$Y%2@f zN>yf7_PBU`B4-;X%ve=&r(;ve%qnM9jpsQ`v&^ibw(`<*GHkUi zGpjuO@*NAuHM44#nN`N-*SKa@%`&qp+3HbdR+%l@hx{I3Hp|SaV9VpUW>(Gex_Zu% z#}=7c6)m;hBI`_Fu=Jr8nKL<-Sx1Y^nM&3axvhq6amj3`Y>P`~Lt)GPV~fm&0yzEE zucx()YXzxAXG6BK*Vz#6r2SR`TlAG3OYdmW6(l^g_nY6h$ZRNZr?$d}eD2CyWNqj| zTW!mevY@TJbZuy}rs%inqD8m#*=l=S^PCoaQf4cAc~WK@qg!O26R>O+Xpwo&rMB{t zCuP`i8C$8!3?_^e{buehy6R(jR^FnoCE03QW-uXm?>CaSwDL8r zaG*XZ+wRv^Wo;<%Cv9JTyKGuyZ76Kn8PcL_L$_#Le)F6beG$sCJ*GwGCMCqR`zO5D zwp(OpPuNzEGB>%>*1lxbCub{rnVXa>YgR3?>T``XMOg>1rpR;5h%Jw@>f_)!OoLx} z>8eji+r&w}D%l6Lv#Qqms(2m1v1|uxk)1$M%YLvHnVSR(+H$V&O_56?gYn*Pb+|?5 zCQ(~|l(|X9s^UDBEYB!fWY*!lq2Ax+=lv}1kGUhYRG;%z$$E~Zwp-;HSk7{_YSm|8 zmTh*evYr#QT-{sc<=&j7yjo>$lCq3Ut?~>kYPpKG>i%TQ=-aBFar&K>{e&~U$B9;X z1{U~FRUPiD;{F)DUsZl9^Q}6Ad0178eB`HjA~8_1GkLzqhLQeq(g2tkm3S84FwGxm9L2?Hyn7D=(SBM3JK3 z6{c0spvWp0wUs<;*2YAY|9o7`XhCw;bQa8lN7LWn6W~%O7!$4^11QFYGrg;VSLX1OK8o`}>?292#Dc8a;#hKQt9{ z26c5gREmzL0#O{W+Sb9ttJ{x?k{2{0DCBP}si)+NYUVhtjvc1fQ_5qpaVfde1ZIyX zPQDC>$ED=qEjq3o@nD}Cmr|Zm6h5Yo)-O=m-ccH#lnXyRJ_oq;1LLYuxdMmA7c19P zcw99lJ8GTrIUsdaN9sCZ@?);?%iT=*xK7?XoU1clu!fs^;T!%V4{NxrOBRh3GCG*o z2*&ZqQwNKNn|0Wt;X;a9G%|CxXt)vQEE;XTmO_+vQ?iM;r~{T_l-ZqQ6LDdOZ6Yr1 zs7=Jhow12z9$!aP84_g~tBlL<+Y9TBbh0r<5W%?sea|x-PkJ*$eeKd z_+sT!EMU4FsXNlk9I}KvhTi&8F45BXV&!rT;K_ge!jg$+d3@R8RvjEytor4J@kx0s zd2?J2$n-aW&EoYdR#x#QjZez86&#?g0^2xVek*rvVU)Abu6*Vf^vEq(9Ox5MzLlts35X^p;0Plrtn_D=7VgBco-PT+13v?bjG^Y^wKO+&MMgUH;rwRWX4E_lihsS z({@i|SATLS-c6@5@YmW)kUZ!LPX}st(Z}lLFa(#oCIOe5hr8VD9O+3U8)!PbJl;#+ zy*6e6HhN3>F2N82fZ~*2G`Q*Qr#yHrYXg_ z8-{sW92$p|?;uDT_K;R(gAegxS=K{F`B=#353HgyJ-JjJZ_TP?a;cu*l=2ps!kE)d zrwGbf+!1df1Qg*yIaMs+A#>G{Sp(PmG;T-Jhhv@VI8W(@%Gl30JrT?vPq>#GXpNKt z4UwksO>K6!{lr64iH`eFv|e;;JH`D{z32wx>-hLwiYix6)~8Wr>S(&cKlHTi7l zO?FZX8fxGytViG0dpbWQj{^H*!0=R7%7vvnK>E&peBG{zv?Aq+<3yLViw=TH$A^Zd z_nw_dHBi%AOwCN^!Vq{<7*Sk@}p}K!_)cy1M%T>qHAdS=<-AVT6ZKzyCNCQ zP)|P{VNugv!p+rd1in(P^62=a+~gwlr2X-=@qX@xrOUM&E|79JH~mv6 zd8^b6Pw%qznpj23lg5loYMM%IJL}wl>KVJjl*?B)82<IbYN=P5D(Oh7 zo5s+2qXEc;eWCq$ZM2DaJU)j`q@}~3dD_>2YB>519v;TT$rm|NIf(57uh_&rzO@KK z^?fhZ3Y~kUo;rL&fd1^+$i-NdUW|Pr-$r8#_{CN!Y##p$u5MHnVMWG6X3J(4*CbN&6KPJnj>=U6ZLSg+;G{cg z$Zkl-*R~DEIw`8mliFY>?rdt%eVPBLD~2@Pfg}dv4XLhvdbq&h3qzI6(IPhNbP{8C z51$dHX)N&43~xxqY1YceR0YoT641G&oe+f6UV?a)BJb%(I!RrLPkhXLdoO9Ic;)~% zR}e8MXMc9DlnpU}qa9e6OA8crkm0H&uk$yZClcsk*hAiTFR4r>lqGA$Hx{ z7FXjWRIWRqc%=e!PvjQFs}x&4aD-RE%AL25tA?YA{}*?YS*Z-tL|St+!d_j5(gRoyUkOjDrCG&ggxy#CF7Jxaoo7rv<(q9gC< zpud3_KlIArUQmjJht~i5^M57qeBBf*%6+fu9AZz^{VWgC~*i?0*J)5O^cF1)K$+0NwJ`CQB*~c;9Ja`#+ z3-~lh_aOA^k{}DJdRryhH7W(JG&XH;l&}5zcH4DG{ zfP+}GI~r_OqK^lMU_Tuk29JQvdhlVoO6_)H1-DNvf=5ECtJsmMg%cJ-`ZGZE@;Tx2@z=i9TKL-wcRKtG@oCDtjjv)SL z!1=>f{}woSwDNwFHT^vJ7;to&+RrfdLzT|~m#$TRz6CCPTKNHRV6F0BjQtbJd+n;} zWiM4e23+n@?gZ!imA?cI{fF`m;KDh|zXAupqx^=^e_eThYI{6BWG`2q19q-Z?gj_r z$`^v8XDQzaF6Whh2M*t(yfd{O8GnAFJQbXIK=~waezWqh;mKN_S#anXwcl&P|5o|0 z#{M(qz4y@ca*r!721ox(c^x?TuyW4WpHqGmT>iQ88{pC-%7?#C;}33EUJ1^;tb9J$ z`M2^N;8aohPvF4sls~v9%K!JuCxA15QvS5Dzo2{zIR6jj-y8dWXsHN6!0FmU!rwa*5J4^uwF=)oJn zCGh3U)JDxChFf6I-lge3%1mv{JWhBOY@QYD{Q>nSx|^mq2OQc%xgVUpN#o0aGil|^ z!1+n4{{b_lXV&Yt!XBKe_GiJ)I~x8~W@?jWDSEfPh$%nj8Nw0FJhFX6!ynH~V?YV( z;ip4iz%z#p;1c*^gpW?q@Hc=9H){I#flJ?4{tY-kto$-KgYc6-sQwhu-yCor2}|@F3}YGoGO$@{zu7RB(|=(YOXh!Oru3soZ^sWQr@#k;GvH&uS@6ls zRKF#Z?^)m+_#$ut{5^2$6fMuK;NpqOFMy+Sl_&0_@fYSP9|_JZR6c>3+G`&3iEeNK zd=B(ZSoK$c^QSA{$V~0mJOF-xnaU%ACF$p&FYT@E;VowFABca~eU;6Amjl5i%)dj- zR6fNIY53#7S@2S3O5f~NITPW{7MV5Br-B;(tKib^%3Hv}_bLAl9NtrT=lzgAcq%xI z@XNueJyf3t=Mdl5jUM^G7o2~;>i-NbeL#7y{WZPd2bGTl=fK^@j_?ch-jzdNaZ4mdag>4QT%C|?W?@2GqmIEV008xE-b9dHKm9eSXqS4MmbnW;UN&>lNr z&+ol6kGg?Rfdk+#f(t>NzkVNFdSZ9c-wzIfp9VY6s{J)^>KWxdX+cB!|F4w~1BbxJ zfQ#>_JpwKSH2q$%Q&jtT;OtInzaCtEO6>)32>dj-^c%ImZ0z7&4p#qCzg7E(!KDY3 zTfo7`lurUj{;1pw&OrYuaPCiPzZ4t>e-E7hk=lO>j^3*LTcd~lb#U-rwFe#4FZiS2 z=sjv*2#)+%xf7haU3r7yEy|aG%Sdmt;oH<+0O#&j-UbdKz1NKWPPOlLi29eiOZiB! zbBFS=hM_;%=zpd54rXevWsHw0*h^?%pEh>1=L<~uCpG+~;Oq|CKCUt0(VlKH_6cgg z3tU9|dK6rETH|{foZF`Sys(oO_#a{3f#zqpe*YHs z`~@b|zD_)c(Xch&#Q*i*{Sneb`lSB-u@SAlbfDBlbY9i;q_;g2dm0}dRa z{4%&aS@|7sv|0H>M{53p@c(GAbBx+&8~ak_c5rTA<%F@nUwIf@0)Gaa*+cCY82w(# zo502QDSrnX{-E+rMjuqZi~02jf5qbNQaFOI@^ z@jhnmX=_w}pkb8XG;n@E?Z+GYKFUj(c|60;ty7t4Jji1_=!L%YA=M9q3t!Pk`ByTN zKV~=M!?5SStoFbZ^)GdS@-%SnOUmuwEbMEUDZY;&e^;6Cm#MxCE?=VD_z{gi^fl!q zIQv!Q&EVkIm7idy_@^TNiBl2&BDK#3I|x6(OnS4?^4qZI5Z~kA$Q2rX;?Wvk@Ji(t zaQQ0bk26zz(~$m`n5n$YbL&f(C)0S0b2DxMm%vYe9c+qx4IIVRvqPpKJa{G8Y@+;( zu_OGq!Or(|6TkyT4}Q_;!SDa5#$N)rf}I;Q{Hfq5_#AK!{B08+{D9$GHT-j6=SJlP z4M-3ECc(}%YX34g3cePc1K(%DgMVwn6Me-1czn{omixLx^c z;3)Vm!-)Sma0&Gh455Btr;i=z`T+Peu-Uo#1#tLYO|M|Wga2*xH>>@qMvc$BD%)-t zJ7Gr*qkMk^&VgSujQEadf`8y;;2h#h7(4hvuydFCv(@l-mH*64?Y+FW?$h`?GmT%) zHM;)&FK{NL_v5=XlYRFG&6-SH>&La^w5?_@9S1?ognAhp=gx!Jt5u=~0`Vuq6XWrL;1NQO) zweLDZj7B>mID;iB>|xO9*5SHPJEmA`B31?2)b@(bnPfdgBW z-vWnjQU2ge^)HO{>7yZ19x0@^%_8%x;WH_&!2WM_qE`rP8GB|vj+V`BL=?CvtrVoKh{v%tI zSAm^7l+Om|z~46ZJJntQ2k%n;12_xb8*Faz~HtrqFOzqXd{OVY62)r8l$k%l~ zb`~?Wlo0&=GT1?ReFq$QOw+%Onc8O~uHTQsUU+(CV&?G({ddx_%4P7O-~cwx9t#eFPXRmN z6gUL_GB^yrhMCeg&%=MrOgSxKed!5s8N3~wS+46*WoD|cFzV+Ga0EQ*IJHN?`+-y7 zqrn;QvEVE?!c6{TPt^1}z=ajc1JLK7KO39}pAUWH6xCnMO!;j>{a*=t`Ai*8Zvtn# zm46Jqc~|Ih*qu+P{dsVpOZjbPYR^&3$9JEtoB{98%;lTY`Q+i?)VGvF%;aAS{5u}@ zGVDv3DgM%vhe~@q9ePuLYijr$=yOQ_d}eB2nR&Wz^CD)7DZfa^=gYyt6O?mCkM;B0 zjeUvQw}M09--09Hm%u6T#N#!+;9?EGJ2(&C8=QsyU}h?hR+L8rcn0`b=ref!9AT#U zx7m^13417@=?#HPf6(#Z^Wf+U%9j}ZcI9i0{R!oJz?p+JzF!#rtJB6gFgZ;9ED|69PtziayUfg}G^{w2Z( zQQpsi9dH?X=fmpHF7vcJgUJ7fn908s+Q;Fr=h1$e!3FTgz}dYuz6Ibg>URY*#TP>Q zr-Q@bK4uzkW@3C9LHP3TH9wyR=i%Q)VCQa~FI)xAY}f1kt>7s9D}W=x9jVm?0zYTo zfvy*Gbv%9=T*7|AKZCb}-$eKT%6pgj6rN%#9i;i)4;(J3ztfoMdJ)0=>R8wVsK1q9 z2l?w^=KhHC_#D{0EVBvv@)>%)yMdX?%e*7=6K2X!1oMlB!RAGuUxLfX&lAk#f39EG zU;hRU4=C@rK<%YL<^92#r1ErdA*H+o?0~z$(X-Tk4mkh&U8VdtfivsWev7exO8M6& zJnS!n%j?y?`$F}v4E;245xfE%+MxObI12s(IEVPJF%0`d;1c*x;LzDff03r2HR*#h zu+Ikv5xyIohy7e|0qI{3F2SA$JIL=N;0X976CONivHBB$KSzQc@El`@J_-)QehxSa zz6_j&{)a{ne;)w{!P~(l@QzDRKWnwT4h1_;Y5mUz=gv|4YH%^5yaAkn{cGUhr`7%g z!=F|D1-OjxFM}h{PdY*U$$$?97ZCp(!?1UP1E10OKL?J0uLI|i-h<#A?9YNji0_}^ zBJ6vesQ#3Y{xom^@y!Q^&(-uhz$tLXga=;%b`btH6CPYNcIaOMM`5456y*ax1e}Nd zIB*pHo&pYm&jJUazYrXR{d#cji<+OGfQw&Nejc2G{a+^hMz!y^O#KU9pxg#7BmC*$ z2=qhX4EQVH0^+~XFzmko2fn27{|y`gzkj)=pGSHja1QoG;1J^L0T*HaG`NKHF9!z@ z-%a4~`I`REz$x&HCOmk@73zr3fvP%2+`y%RJ_+;fH!9j$d2abM4^BV_ezp8wZ2@m^C;NnGUf5I^I{{ZK~ho6M@ zax7$jMKZW#~z){#w0+-?MdTl*%k za2WA#Hw=656iqJ!o(V33JHa8Ow-M}IuJK<7&LjOtz!BJA1V@qnZl@wW*r$REurCFd z!NcGv;=dG}L-;KwJoqVNNBDQZCD@(SntlNJIUXEB{GH&^C7Qp_f%D*Nz!}8<5I76_ zUrhLKX!zYu)AWMhQf>wpU~dOUu2lP4!_Z#|4uKy8XQBTixB%YybmZ?pG`?wuzp1g2~95odjmN4Z7r|m;NrE) zBj60|mx6=eQTuI%uTy>oTt@hbXCgi54+UqybHN3~-)k85i@1yh*P^ z)62o`fJ2CH0k{Zz7r2DbDqjf>!+tloc)i+xXBhgO zIyJpKxB(pep6Zu_!{8)1gZM8q4EsIc0{D4w@CJ=<&n`_bh4fm%QP|tTW%#=RoP~W8 zIEVDNfD5qy1{^^6x4EpO4m<~3LU{T%pWL4Z;NKUG9qHWwc3}SnI1K(PIEDE4 zjB9)j!cPa6zpLeO61V{S5V#2Y^{)^xY z?34R6y#nl0!DaAC;3(oxfpZ9di3tzB#n=)4H{cTNZ-N8J&xaD4ehBfmflEKo{GAHU zgV%#Ii2n+37WTWr;afHQGvLzg$`d}R={c|;Z1_iN4;$X1+zk$ZF91iOzaE?gZ#8zr z|5tDk_7AMl^nE(a1>mCzh407Vb6iXi0=V#3HJX4XORBC!9m1#K)ZKNlPTN5Mt3j|?~mdk&n3 z{eGiI{X7E>+@t0DPosx@uR--Ee5cwQ3`4&Z?0^Tr8R*Xg=fPKj%ZUGO!>~UK4&4QR zz!~sCN%g06x7v>d7hzusjv~GkH~{_m;NTq^{#)P>?6-kauouBOaM^@M{F74ZPXyr) z2dBWt89TzC4$i_p49I@f8SZ^Um5jt6xg|6^S=mO zguMeCy;tpL8-{)pI1Ii6oP+)`a1s0$aPY?(-=wtq6D%lC0Y|`#z&Y?I!2zVV5nP7- zDsTqr-3@l`)A*kNhmih@;0WwH45>d^*be{~z{i3^h<_D0h43j89{eR^NBHZ&dDsi! zBKSAp0OEhu=uscL4y%6|@ZsPH;-3wU!hSk9HC4x_vyA;S$`^y3k0@UY&d*o=F*x*D z<)=;fjPhIH(gNi@N7TRQV&x;jS)@M~oL{2$DA+ks`CP-xl&=CuKCOHwIJiRjQE(XP z|HarNYX3JlkM#FmtNs;Xp9&7PsD3WknXMcJN9QT8HGGnC793cq{9O~iS^0i&7WSvX zk#@De435rKp0rN=3!pv@GCW1?Gr(o!XE``{wA$%Y)G~i8AFjL+T!j8=aAvLA?*JE$ zP<|X71-}S(j#T?j>oxx1PqaTd;P6kC=Yq@VpC1Qj9#H!R!_Z#=j)Lz77odLF;>9rk{fSKyV)R zS>O`*3~&VTkASlXe~AeX{(-S0{4c;o*#8VJgLn9p`r{z}gTY1A$1HFTd@?wN_|F1o zV87Ue|De|Y4d6WZVQ}HIT7G{t`Y$L?I!FDF3W;l!VQ&Lx!Dkpf;#&)L5dJc77<{u~gntYih5aRP20ZCA>Q52+Bf%Mz z-yCoRd?wg|{!`!(?B4(v4%70x6P!Oq`7v9|8`(s65lychUG(f>W=ny$@V`L-|uC{M*VG8~(TQcfgT=#&ct@dnoVrIrTpSJ_uX_hrr>W>K7UQpzY(F9;Lj;=h5D$Dm&n8qw-8}=s7LFWnkwo$}toE zK-I4Ym!~Oj1P2?GF9T=M{=W^5{95;`+-~&GX#7717ZBew;L=xgfB$xH_*K>a6I@;% zm=K^pyM00Pmz$yKA82@`atqj5p}YtjUafqZu`gHtqzS)7`P1P13Cfp%gCAGE+UOT4 z-wZCDsQe%}98rE6oH|+g6>zy-dD3~BpTa512ZQscDK~&~i=uV0SQnTn!GQJ=_Wo{ZYej1&3cyegT|4SNSz??qTJfzo_}ie^UK9 zn3>X#zOMW4X2M?FqWVSP?1joPaOooD^T46kwf?^j4q$)9_23ld>vtRd8cqLU=G_B< zS=ev&4D+tE9}oLg|HjPz{ayW=a6U1&v;`V|FK}qC@=@SISa}w>JX?7QIJ^t;1CA_I z`;ZAgPx*^r=N8T1CU6#fBRG7k+V2Giz)yf9;NKhjI^F;EZ)VD04*A<_qvkLAy!v+} zIE3-}IB=w2{X3a?2YR0d`>8$!dl~bguNeK_8sD{GXCLL;!711u0SER|`+tJV(7y@} zen{;*e@Xozs36Jq91I|N#Ik<3@#=n`F z@}I(fv%A3=@MGXC_)p**_+Q{W_yb?o_zK{oz(w$J;1akUTm~n=fmYqm_Ze^yd>Qku zv_JV-ZO=ErZoaa6AJ~EZNpJ}KA~*~VT%i6&z$}O2>vIy1P)%P`6+{s00(Ah{IkG8@N)1Zq~8U0 zU|$aofxiOY0{^ZChhe`BdrUXN8vp-~A0b5;vXu3-phTv9 zQ5vZfVYE}~wA?MUj5Z}S)}k;ilC+$XRKiG+M1xYcnyeu?5hBZwCHw!n=KZ?3<@@{3 z!{edn{r+6bxz3q$X1nJ$zm8dayz!B%uPXnBqs=sY>dv2M&3BIs*IoSaJLejy)|ecJ1$yU&P5fU+rF;RHT%8vE;JhJb4n% zZ;=<_@D2HST%i41I6g=DPHVG1KI`#4PGE0_$<6tuE$5q~a1x(tZOyI7n4v-CFz=kRqnkMG72UVsaDCHDABz#DN4e_(CaH^02N z%HCcaHr09^H&c1|{Ncs(c~k7YAYXyg>*Z^mpOvR!zq$Hbj`QT3U42gV-{Raea)tXe zes+y~Iu3u4FT}}h@*terD^JA!@A48H|3Th}v%kt;;Pg_h$3e3+er~aR3eGN(&vW?< zxddk(m2bsq+AqXD^)EUvQvJs`M!k2x#xFdg{A8SaSZ;w6kI6l8v`oI<)o+pK;qWSL z?~5*fPx($9Y?k+*t?}cLToo7gSNpa&^M~@GE`LG33+LC!%W>>^`EBg4kblOh7v&@8 zX#C&?jn@FDd&xa;=2AJ0Q_bc1&i&<=aoAV>2`B5wC(dQOGv#w}p}jl^C$E;L;jpE= z2Ip65{_o-30m=`Yr~bn~mDjy<6V7q}+Kdb2Ut#|q^ha1J-e5$=FJ{^s-m?BnZj0#CsKUWC*5864s~&f%Rn!h5mD-v+PnfadRGA182q z9N@M%jeFn_r>yrg*TYw}J`-?ygFF}eKgv(wSVbMbFIk)GtNZ)!+pW#)F%^a zf8;`q7jGul!?{&*I~*M(m*4{Jug8h=l+VIG=c^Ss|ETg!IQ^vjDfXu8_&DG}%_o{F zSHZzFxrMcPeAA7`GhK0jQ`F~|tN+_^=5hG}>^~tti&L+w|Mze@ruF>Jx{P_e#r6G= zMRJb6_;V_blb?$t@*X%rehv0`zCP9E&Gmfv5$uz1bUFUS+C2Voe@OjL9PxOk@(dx41G0rfARcnXa1~t0lU9le#m0xOMjpA5f(fsmhxe5+$kelK} z3$^ctqvrB3oH|FIfaAS2|GBO{ke|dM`8(L3sPTTs`N{IBk8*t7C3nNgff_G^vlEoB z!0}t;Z8)f`@%Q2cuJoAt&s0)g7l+5l7df9S55T#TF*4jdRMRKwZZ}JfeSZi|BrKC!101}9Dk4FziSI33Ds&9@1+zCg#A2!(4chvUX=JL++0_=5_U%)x?k8rG$^53xEO|GeGe@pxIL(@=-WRJ{8AXDPM}y zcmwuN(|ScXtf%^4aiM`+@kz}uQ(unbSW>q_Dyk;{yX6C4CNzm9N&X;%x{G={cXYlc>(9kYkmi< z(tHY>e@@2H^}1d+#o4sn8RzzBe_xHgdFpSnYtQ$KEyDQ+biT{sEdBuJ@Xt8;km@Tx zt@%ZZ2HtoQq@;jt?~1$Pj&1w-xfH5FUM&- z7ANPczZp1OAU}cq_vF`H{jFNx-8e&D_8HB`+ok%dIJHA=hI3!b-Er(Yd7R4+)c%}; z3x6nIit`64-{{(xmAB&n|9}&Js{K)GG{5Bjs;`AZ+!7b?WjJww>Qgv_C*TOr#o02d zUx7XPdj-cm;fVcv7Y^`4ID>PpevGz%JI-G#|BiFr^?0Gu zTFo!>sq*?b{<(Y!PLp4av+pXu!`0&lUH#L_b2zqD-sbY{^6$>?%O~WR&j)e>2ej{n zvpl{Si&IH$&r}?{M1B~1RdjxP8HYSx{L;F-c|D%@2mZhT-!B_`Uh|1vr}n4d#4z<= zAA7^)R@i6#FL&no)L@*NuIs@yIJ{i#@4#vLyAQ|H8h^Q~AFlJu7VM9Z3$Ff4)q5{! z{=pczqP5vxpXaluljpBj-U6pNK03L4vhqQ=FiPXy;_6?}{+fZKt5v@oCp&2SUc9p~_|FKYhDQR=Ue^DS~~oMHPf!y(7tV4PU1`Q6~^$E*D;T^9J(z(yus$W9u~k>{lA^6rAMq01a_CTH~FMW7o)+;rK+&f7svk z@;L1AcxocfovQV{2N$|){G~YliT1~8*Zwl)uj6Q$`rnQdkH|mbR6DucdTn0;pXi)W zUI*tdklWyFGr0%OG?zzU|3Y~pjys?exAAg zY<;lt`&ElB_mZ|JQ&sCz2^TmYoo;RR_ZaqX6Y|*4TEBMIrvDu84_}5i;wx#N<@1$e zaGL&ZwKg+JRM!5Vj)NZBpNpyY&#hLR?@DVk-az_)f%?L;YQLHKJmW=pBIA8ceMr5x zLE{H}e|AOdGUoMWzHhTWd3=)Azm@Y3TCXlR^`krp2Yck}oJVT^-i|Y)2S)BS&-h{I_!U^hswl@1Wn4$f9#71pjhWt!xlc&hrlNac(FZO-SZxqgrmM7yF z=YvJo=J?34zE6=S_t$(kSeyNoXMep%o*u6JEAp-62fnQNdLxt{=gjq`7S6rG{=kV> z)~q&w({@E zQ{+c&()@y{%Bx$O`K8HQlKUJ#oyjxgqsbEs)P6E~NS-B6v;Awyv*g>zv-hg~H{?0; z!!~PvdA7frwV7X@ybXEc9<}dE9+8hG59TPpgS(yU(oV!6DiBp{aZ*=VsRQp-3{T!Wtmtnu2&KJ+) zu$TJVhLdM1|G~A#hi%b(quR=AVvqJ0-~eBRGxb$}D^8ywFTnAh8h<@b#^n#JD|lWr z&aVZR(|-RqG#|f~`a9105Ocof{2RxMack>?&H0Y^`@7OUdy3i*!2W|8|0Zj5{CHf? zAGS90*~NS|QXieF_8;O{4SA0<+jsbzroDM2l5e8?WSnUu$8nt3W6#G)^2@Bv_yxuv zOrCD4_SfTx^`DO8-av= zy1aQj#@}mc>RhN&eEii3hcC%j(!Q{t+TVo3mAW3@gX8CE`yO)jFKK>H;rwgztFHbr z`2!roU%U4Gbbr|YZOuO@kt^doJ_{%ND{t-GNA8Z(Bjmw2{KJ zrxfSclRU@yc*s8acx!up;`~3A`s@X4FHT=5zlc5jk;~gF|Hb8L&8PDFnqP3E+yv(@ zR(*FIe_p=I+H7CJJ-@X+$n!p#p!4JH)O&-qf9}H}=jWx?W<7tsLhH5K<-N4tZ&{c9 zXFYe4_nTj_xL)7y(|*4XOub3`2i5*aoa6HV)ve8Xr@22iaQT_qp4K?S`MCqm;s7Tv zQT<5Q{wA&0U9Np+HItsr)Fq4K7}&6 ze~clo!TL?a9;VaWOXFY@dZjeqP% zYVYG(&a1V)&2i=^ts-s;`K1^W^F{u|RHsGogIG z^IW+b_Gmv6=V(9C+RQiiVfFnybGz5t?7#Fc+J6hI&GF%Hm7lgYmHrm(|IIiUs`c58 z!#9OljxjoK2CU?i#S@KXE8>IP9z&SoYwE#!! zRlnM`e^Gu57Y3{S53YW;^22s&zDfG8jWhUSoc&An191LP`DSagf1|ltzX!f2!bG+Wd@z)wp#GR@4Je@yEaCnA13j2TP{(J{c9;@}4gA=kV&Q@362zJ`S-^0R?4r&(RuQX*5-IfaQ>P~p6C762XLDASF+T%rG71*%<=OE z^*P>8`~;_7(t7W~0q+Nw`9j+p?N)v)&M?1PILZ5!XXB99>n_D9j;Fpj;QhjDasCvo z$5fnPd*-|LEwvsiUC#I$aB_)`_YZK;Q~nNTua?VvsqIOQmMi0k&u^WHQ#gTR9M6~G z1n++h!Ra4#e@wGYS(rzzi!{nNA_zgyeu zZ^O-M@~rw#N_8S57A{@On)%>^IQ-JKzMLZySxX^_Aa^ljq3GanwwH z4X5dEH%{QPUuk|x`a1#V$(!K}pV#b!V`r)Vp{}0%Hk?f;pNr!c$ZM?2oBKbH7xOOP zPwV%Qbp`W$n)}Ol4;#wHdz~-x?o=+hE_?-gEdqoH{te^{J)xf#&`*T#p|* zlE=Q({7Z1+X&rB)u*du1w^^I{2JGMa$U|PQU2JWR&vHCJeS$nq{(`GNM*Y7{ePfR2 zudPl0=d(Qr6^!lv_(k(O9>;MVoW$qg9IvN!#93eauf+NgbAI`=YVrJ%vNq!lWP5I) z-W#IhWhzeLW!UHQJ!^3=O!aT!B%e?E7N>c==b-PjJ;|Y}KiS&czkFVgYeb%%ru;%& zm@4B^}PSH1e?=Q zvHvwVwL;^)gQKVA0#2@#5BY)Zxm7+1`%lS@ab}I&0ViIPhq(3=+-|6 z@P@q3_0;|QOP3%D1~)YAG~wEU<7FOBzNUO7 z_FtE`;LIlZb8B;c%5ASwT>rh~`5M~46@F5l;CxiY+8j??IiBiT+m@3xe!|+EKT@1O zlH^(5KkMhr^Pv$q;PYvB;@Gq5Zz<06dhi;Yz^~)*1g-B!IL_;jdt7_+vOjCS1zZ`& zs6PW|$b*3cX>7W5$y5#qt!S&N%@;NHd+4K+KeA@JeB#y*vur&=Npf~@jJDBHLT6{jN$ld zMxH0{jD6m}9O!(T+TVzyB|6_t#c|eS9?n+P{GPxmybgP(Xno$nnIq*-v0qXC(b~*6 z&3w!Ls_lz-esDaFvtFlLoBD~=pGO|F(EK~&EFOXr=PDnM^W@W=TPk0IV|X z0@t69tj&C;^Z4T{@{FhLEAyMSCwaUa!}`q&)R_rbwz`FfY* zdvK2am*On>^Vkd3{%w~}mv=jp|Alk2lppoGwkMb?*TP;uIe}v(^5r56wSD|3~5UV)cKjb63?j zbmn^99w)jfzrxz=zmWYkl)RAC{bM}N9IWffbev?pmg9V7BDc1i;o;p$MdGKHVp3jNarZWGM_V4L9_q6Jp;yACL zwZjpQH!s5pexEdDZO;FB&i}VroAc`~&abnm&#ut%@Pupsq`U!pyS2R^V)MMZxIKHY z|CH*>njhQw2P@^u)@J<|vi|mCOV%0AXJ=ENp?!OtW&A!kPk*Cu{7Ul=bDMy}gw|&U zPU44g>Sg6G;LJiDukTnNWUi0A|Na@dKU2B=wOG47;c?o(_F=1aqPO;seOOl9-s6?G zwl>>0lkK~l+@GoOufpkjW&1Xy-5*I_ubk%U12eF>EyIZ>s(+UH)b~}3`DR>Te||!J z?l#r`go6pP{k1?l-#DL#I1zg|j$`;d?BgytTf_Xr-0a7aZGXuZ<=dV4JcoVR*{(-! zd-Y?{+`xl!7(cJ9ESgaGx zO~>YT6)rFz`>@QO&wbA4_G4_eKF8yubvVZJ{SR@v8taWC{3j0W9naj3F01|m9?w+6 z1wOyj6sO4BM6w;D%{ z+^Ow7<{)iPa} zKZX6a8gCQ!#+w~sZo93``Of>XYSDj@XZb#kW6NoK3b>9lkLO!k+t)LAzB7P4T}}IU zJkA$1-{~&r{f`H6G)D7#5+{4Aev_-eT;7S}yuSIXb3JX(5#=@Cu%TQ7Cl68oO`K2F z{^{)MZ&BV4N4!5Y(%Nian$IiUOrGWQNYh+Bk8kGV9FM=UF26(bUx)qMHNQ8l&HZx~ z_s^Z=iA%J8KjEN~=69(1n%Uz0b(r!KtxfwJ?a#u?INw}AeTM5@5A4lWe}i#sj%>g7 z-S(fS{!UjvOZj{p%$1+8Hsfz({8wH3^ObMK8Gaw;Tj!g#9)I8%zaL}&Y=a#?{WaT% zvpeJlI4Y<9?boaq>%UcQzh>V$yGj@{d#M2 z{|NS0H9z&dH_6j`RsSiDP1Jn$;$$C; z>vbB=aD8ZuLwg}LwbS zvit?@^PErY*OC_Jd$jTj=4;%FX1+d7^ZUMWoWDx@*M7~lt&g3i_Fb*b^S=r_-@MY= zJReJJuWG71ZyfbG`k#z5jBmg8xA^?=?JC9kRXA8LZ^mtTJ@#{JvmRU7o}a8uOMjyF zU*#h-e#G;^GptRX=kxw;aP}(AKfrO`pB#&Qe2;5?mX7CzIBB0qnA;j_d%gcn+q>D- zH&Fi{<6M3DH=L;}A9bYWm#HV$#!2pf=eoR!@{ZW6Etj|)UxTweUYcxe<`?~>`OS4X z^(%3#j{1Am+N^KH`hJ9W;qR!=*e5RLc98klaq;-!_0v;uwwCgy*yr`bb~wLD>(|41 zi+r`U8Na}IH(T4+7q;qnxYyb~e&GAx9>y8G7KivPoW)<@9R3rh`98pkN2&ijc@12H z$Lq~;9CyGG^#gDLkHcOQz2BO_G5jF*@oF5$n{fi~#A&`C?-!iIhaIi?C#kQBy%rk3 z5l-OtIE{Pb93G7W`kRCsv;Cp9xxWYR==fTR3*7%+p*}_X?d0CQs^5cSxZE-7&&Ma? zIIfEm_Cj`Y+b-9KK# z;Xoa)+i`)%!+UW2P#yoVW7R%(x?CM6tI2h7g3lA2=W;$@-Vu8PHU1DB^7(>Wus=xo zTpYVnUgga9BfNqm-hbL=ZSHUFxV{wd1^9qU$}hx~aeG`FUxd%Y7vpaD5^VmCLvg$$ zo`5gKvvCK!9CySUaVNap+U&0c`|B%fd%izF`{xhqvgUfr>t7YjZnwGLUh8uTP7l=M z5Bq00itPu<=erztb@`Rb`{Otsi+$=R;S|0f2RvSQ7$M0KIzC>;Y2I)A(Aw;; zy__HSkf+EGJ5IUxUiISnxt6v0SMa?0OOTf%zZA!CAL?VPwSHr<7t`a_+pO*Rm+x<# zL!RHP`iEUTzi;)dwY{Fu|EsQ^*Ly#9-lX|`kAoH3Kl>lA`FoGcM_ZfzD$!p}YkPnF zxoUBH8&jWMp!s&iv08e3a3wDA`(ZcIKJiYqV*9(v{Vf`ADNflJip=e09D7Ip(B)6d zKjI8N`I_>RaN-TQ4vz1X+u`t4xet!vvDo`k`JFiWT7DR(@hdn-{l_@Kzv0vu zY9BjM^G$yx*TlKqa!c&v9ysxh^5Ho7oqQ|KelOpL<2dVb>esvW->Uw7oc~e&9;bhh z%b%qAM%c%}9_0;jj_-527^ijO7B|K=6Pv&(MJzhQ~aZx7*g75N#Q=ko@yy7oN3{}^XZSAXB* zEU%B2uWI_Y&$sye*ooF=eLJ&%>)|fA4epA&Tbuc%d478(jt||hIR9}ttf~3lZf(xD zx!=t{%*{T`v&Yv_9AAs6kMnxLlh$TFd3XLN&t9SR-G(zKYdrflQE|QcC_mDimW$Uf z_IEv;V*g%_3;h1UbvV!aR|~DpeE0JH(MoGGpIlVEIREvy2J^F*0h`D1XV#{&@Y?>x z`u$9^;{5CjE9Q2TwW;sMdY(ZZ=k=TOUHu*AiIcgN;5@#~d7<)$aB7kKGLAhc?{@h( z`H)jIpZEy#M8@3OVeeFVBn}etJe)gIUXP=}@^?5>UOx6z^&iFL1Wr*u4Cg8+zZd(5 z$_@7vRLk^l?vE+n4?f-6jO5!FGR*Bf^7Qu_zdO$0(bN}Tcrf*otj&B=%y%gs zgV#}?vo9=|+q>50{(2er*Kf(=w`u%?&(M7GWmR9(+Vr2MzgFalD$4ueOe6Ug91NA0 zx_p}Ye+6d;C^w&bEN*{lvGT*uloMadwXDs0g=~LI^4Mj%9`wMO&sBdt&fyT}yQ%&q zob0dhcjENjYQKMNjh~((SHoHIR@l!d?`LhUpBbJ%kH;aer_8c8>*vqY{#=OzoW~*F zjU!z4EZT=^U&Y#t7c$=2IKk@?o$)jL{_HTErT%uD!w=v*e%9K|cOv`yBWrWygxsHg z$MJ8q{YS@@r>@d^*2fv{AD80rW7Utu{^RmwmtV>8g1sx`4X&Q!_e&i7s`mTW(f9?% zuZm-zDsP1|-2eJvKYeKN{xHVX-zZPT5&45SBwuB1?mw4v|H)gM{SmQ#Td7a*`sK&u z=~jCD^`*;~S168Ormp56;p1`U3FY;1I7v=mf3AEX_U6c)adMt~B~Ifs&dgUn!_|lK zG8|hVKaKNKuKnZk{`Ite-C4gQt<6dVla-%>GmPIHhiu=4 zu0Esso;a~c9*whRA2MY_gdqM7vGtbJ`x_bM@wYg2lg|YJEF273Nh;tj{0#4dDw$1Ix2CV1Xay{(5E+=vJ z6?rI5e%AY(Put?4r^f4HZP%avuA;rSO5@#v{j;<^vv7DO z+lMpugE;24*0moYZ^7{u@=hEbr1rmBoB0Jhbv%?mo9%f{^(W(?y6VrgHud3V)wdxp z*bfSsTNi8ldIs-zT!{-@pKq`>+nd;-?Vo0C`?D_;nA>9P+ZP_p?OEpwmA`?5SCoH_ z6LaL>tEssWU z<^K3A^|_Z-zlA*0MUQ_z!~PBO4>&nQF56uFha=^qaJ1sU;`W}3gC5Eo<77X%HTJs7 zU2(dnJOrou%HwdDk|*Q%POKZ*Tz@~b$1zPtk`+RDG+i27JU+mk+Cc{QA~AN(}8<}R-*_rS3;MeA93yijrSKWw2==vSKE`K z{#a`>UQdpXQ^{lO|N1z2p4zu|?cdkybywhk&xc;?+T*D>9jg8z?9Z2`K~D*w*fjGyE4rT%%EZ;rgBwaN43!^sPLAMGS(>K~xqr~YMfucF4=K^`YRsFlWx zk^9zWyaf6AJSC7x11>_<5P#oN)`de^ppgaxdM#=MCo{=BJnJMxboWDZO z>fgUvJ^{yHkk7=asd7u4oF;d1_5C$| z3VXLHzZJ)($TP6tSM`tJ+#Sl-;!Gdq@8UTA&ehZZ{ugTg@pWo{JkH#q_RU>hUA`FS z+R43fl#oYZpY@!8QCedA1>Fy@uTGn zv3`ru^ZL7b`$1@PyUpdlYy1VS{gKL7;eh_P;Ou1OyK(F@wLj=0%`f$>Tm|QX4wZc-gD$W`J1=~{)+lM`{OV2IQe0hX#B?b1RVaP`|s&ELEggJ zj33*m@jK%D0Q*zV8$x}a^Y`_*E$uTni63zFygv7YwdpBysQTMrZP$bI?>6$Nobo-c z{s!4gs=hb%M_QZy3cqT;Rmnrvw*h&qp4y*pZT3eu=GPeqcnBVd$6K5E4Wz%R)@Hoi zM2$C>`V{q#<1u(6?Q=V;7uWAS+GlA0DbBv6{(h!?n)Veg)qE%7n%1VL*ml)7!>N-nguKwO|_1DY0 zt?lD0{vP*VILr0*sE*2WxF*iybDVju~{3#m`dz5PlA?!5-K1JdWX= zcrEpNu}@y1lja}CK2G5J*7o?~_-KO*$7+4L;M8b&u(etL#jO8zIE(L~KG{w6bIDhc zXUV&fzV%fDi1d{!;dX`R3LL2lU^?+MGZ7aK5_M+RUfGeCFUB>#>&h;iX3u``eB) z4dvfm-cdfjo5qjTmzz0XAosvwdwIOeJIHf!p_Tj`&Nh%g#Bth}xlH5bE>d0-XBqEe zoNTOoD2|%RQ=Oa0%WT(*bilR8VT zgfqA%4(cdR-~xGPmseFj5XTqE<8jzqo`Umz@DUIF5CcPr@l&2ZxQ6x5NeV z_BcTv;AB(P55*DdF%IXOD4&EgTQ$E~*5-WY?a}%#!7=F*aD#}#@hPv8@+P0M62_1_TZ&Xdo>iPrKZ*#A)5(+dYT zC?A9~*UKYts=7QL=Vr;bV{e)~)7qSm`f)ybh&*w)@)bDfEa$M#{V$L6M=1Xk=V(Gk7uddL)@FT!pSAuMSeyA~c|3fXwLRayr@Vyr`2||9Yj9%Y zfyMom#@W*~-W@o8hCBloSiglX=l2Iz;{3z9|Eu;^?@$-)6w_k5# zbNochbo^AXHZzMYQ-8->o9*4m^|%Ikx`XD|(AxBu;CO6Fo~@$1J-Ns0BbQs7`MBTj z?@fJTzSd{7YhO~nxIUAxpNJJb562g)|0i(xjn?ykKAL~#H`&MD0QJ`Z7yeLwGfus7 zNU{HWv46B4A7^p)E7fnt@xSDcanjTL|HA40 zqw6%Ew{T*x^6zlAtolEoMB^pmM;6z&29A!MMYNY%{oNFq-hZD`^?{U1oynlb@*Fvs@y%9Pd;@BT8x5weFa(|qgBu~WYsqzw> zxKDlsd!hWLYrjZ7WPs+AenhV2JXCInv%l;9&hO^;-@suIGz5 z`L_I_tA9t{Zy@XQzFZlnUYFz8drxkQ^Le>1E=2Np=NO3pNF&C<;!v63wb0i;7QoCU#w$p58@nt)_J$`cX6;;-h<=c%ZFUa z{C<$DJO3!3gTtTXuGrrur*Qgb`3{`_NS=>_z498I`as_5{EPg9^RM#JS80CHmvS7Z zH^~<}kJSBfn5*wqzPLWO<3t~M0rvaKYn<&Dy_nm(IA*_?!Q9FZ*7&iFhZNlmM|ha? zVP%W?0Yg~N!{r`09g|Ly}2EZU7_cT{ayWngNpr+#R1Q+rr=Dd z{uX18>-k!oYN7Md+c^D@`rD1;T+h$BR`c_@p7+4X{yLsU;566s7jf=o?T`0x>L^`r ze!vN?=SPoI|G7W4ey8Jz>w7yK<9Z(8IM?%Wu044MdtA>S#u3;191gD4{`kPvb3HHM zkjE=WT&MYEIo>*BpX>SK&Rox5!nwP3|Js3*OSHZ}xqOh;@0jaZU#{oPaQZ6c-Eo5J zc?yST>3Ti`dtA>S#xbtv&$*oI`PVqtM#pFQ8#I2J>-i}-(@=SH>~THsjI+&@r*NvC ze6#a8@+|BR*YU6dXGY0y;5gUwZ=AWFA30w0D@;*+1Du^Hcf+Z9^0he5^?Z(NzfAdB z91W2_!ZEJrKf8K-bXw!bxSrR-Nv`J?V2|s0U!3Og-*_D7dj25JalKxP3$N+;--?r4 zv>-s=X!oKF5r1M%k_O74!E9wjD4=>f8jXS^GY{q zJ`s6+oZ@5xc)th3*6t{b@g1&zsCXB^TTe|e0;9wHF1vX zaVwW|Jr8h_>-kt5kev<2XUmS2f`_-B2d8gZ0Kd$F%aD)$= zpgiRI-WJE*^&IE$NfT9{=6XIGC%B&P#)UU@yw|#2^_f>S|A9E*dcFh~aLqeZU*P(l zzFUqe==%2_PH;UxEu%c-djA;?xSrRUqCDVwemnNKoEd6B zDQEiIfD1#Fzf1cp?RVi-_z#@J6=rICHsTX-9-oP~;&X6>FU7lXFI>Pw@m`$9-c%hw zci?h(29Du{xDtK>`}lcW1HXae_!Hb17jOdqhTGz@_h~(n_z2t$*TDg9h6m#FaSC_A zV{i#h<6(FrPU8%oif7^lIK(UQV!R$_aUQS2AK)A=;ElNKENy=tpNzNSW;nv_@Gjg5 z7jSR97mvW+H0}TKxE#J4$M8H{2`|Aueg@aTFX1?TA2-II;{@J=+u}cQ5|_VU>(LF@ z!~t%E2jaFkg?r*L_-dTSlkh}57iaKtJQKf$L;Mk5jK9WN{2N|{51Fm)$>HjFBfbRZ z@esTfPrwnLi+ABCaRI-K_u?Jco38!88<)f09L+C=kHnR5P3+^=xCXuq$8kU07!Sh< zd@XK^Z^cPG19!tqaDZ3ffp{%W;hi|a**nLwY_7gKL)39Z9EaT#u?lh z&&2(3h==3F_&S`$ci~ldKF;A~)@Hs1=DUV`Bl$Zxk3Yj(@lQCyW#?&ocj4o#&Gj)e zPS>w9$qVGo@m|~(d-v%0>4?kWo;Zew<4Sk}_VInV27VOB@w2!wejO+9cH9f9j^jLTg}35vIKqALE<6Mm@EE)o-;9f2#AIG?zsuUZ z-O<CRMSVd1pXBvfzoQmuz9ISP z)@J=9wl_f@k#`|)M*G3!{)3v&P2^!U`CeS0zelJKsDIJA)coJ0-kYlJ|CaiY`U4;O zcm46!_V{N1)v-3~A5nk)KJ`~npQC<+Ywv5m6KU@+lIM~~)UO~9$X_83*k2KONd6PK z@2S5Ei#6Ze8FE!?J74M>lc(wLVsif>)%U{z9&24{{qClH!147U^&$1o>{GvmdViJH z`*Z3e>i-}Q>967v&DXbIq-Sn5txJvH!rJVQ82hg?_GYX9D`_9lKJD_E%4d*=%;z|3v)=v^%|C8ks{c0B$Eoi@eL($i@*uDACz6Nc zbIBvtYXx~k{t9`5{v#Z)JwH+JFV*}iJpAwZRkb$r54m18vNr3Tq`!;E1KRi9r~O#! zgV#0xyQvSUe~>)dqWl@`&y}}OA5s6gtLOap2f6>S=3jA{<`?#tPqQ}j56GL52RZfM zfjlH1Nbavxegh6!uj$lB)GsAZtWkZA++U{g-yv_s`Rgn4fV|8jW`3oPhf3D={6c?c z;(+xy&)V(}+F#~!J`XvJJR-l<4YsozAs|ERWSCwa*E?N{=E z{P4$^4?e}Z)O^miHv1#R`dvzWMEwBr9NTw2x&N5PpGF=&r1e;W)AYBN`hfbk$us1; zU3=_hnJ@LnSeKgb8P;aLIgam^)JN2JBM(`xq2zv6^S#BoRDZLm&rzSHKA`@ked@Q7 zhveVUKBE0Wk8A!B`H9wMzR~kqpL*o}r&&LYi*Ao#_LLbK>ZN% zkn_#Wss66hyBx*`jGmb zF6a0dNgk2kVO^@fkor#SpOrYld|su!zf$wxu}}M-srTn;y$@Z<{Hd>IU2420)^`4^ z*Co`4)R*j2KaTo<{-m9Pat*H;G?@pd0znVNEpFrM&<72jUss5Lf`=REuk@o&7&38L_KidC5 z9*`frO7j~`?pxdIC3!>gk>u^kBl14hrRFn++<#i*-%0y``8_}$kUzao`_0sQ)3iOG zQXf+P+dlP2Jgxc1s6Wlx9)Hv~w=Olmj@0|q55nH@n(qy?_gBl)_i4YB`iT9NqduVi zoqg)RqCU=eWmao`A@!B4OUUUBfQvWOYbsWF3HJX1!eyVk;`8TsR^H0B}`Cp0?Z2th-`_F3r z*YDGQ8ucN^`x5E{>erH|nD5)O<=1lc!f{J)Xij=Jz`F5%r%~m)ibcs1KRX;cJ<1PV=p1ZRYD= zDmNw%$S)?(GhRRPko;QmTR0vwbFqu-LLUKr`}&*wK$*Oae$9}QS+V7_Sdks#|!y6)}`jtiF%*@ucSVrKJ9YW zYX-UhlEz;~o@V=BAP>m5x;&=(uW^F$_Fu>RsIP2o);n6K?LCV;B5zF|us^!vIP<%j zdVhn)n?RmBQJ#an&(;4E)CbhROdkBGd^=8Tkbl786Y|09nLq7)Ycv0VvB(ZRWp_ z{+p8rT)`Wr+Zl8+}(GXHz9&+By$O<;hlPCUE{o^>`_}xH#ME!^4Y4Sbf{;QgA z`Hh-y#OqxrTbui5K;D4d|5@W*h{IFWzBlzD_1BOGtoNPRJ74wlsgJ0Cl04-2e2v_H zP4yp>`}Pm%nA=|Rfc&tRHUEI?Np)*`ej#s49`@Z%5Nt3 zH)(z|UA{~CqvQekI`W9uL*BMx|enzg;ZW;I?D z@`(Hra_=zpSAr9bbZf*DX8|tqEdC2{50C_-u9eKp-pHs*~@lZW3Z zUx_20kGw*CK>bH9caINnj`LsnJoBagBx`g0q_?U6dN}d4+?M)?`YXu&@|xdpS6@k< zfP*sf{j~Srmb0$?0`zO0x8x!D0b4ZR*T^ed+w%>1ZR=8xC(olkV7zYB z`|oHzL#)k}B{8Oa@%l0br!Fm5^mOcXl2_r(g>oLJFP00~?<$vjL;dG2lTXHe5BVIN z>LPb^?kQi1Gx$bpyTAB+!2Ql2Xgwb_KHSVa{nCNO`TJh={`KnCt{?9gw>Q+MPU9vG z8>7a>#ASW|$r{$LU9Vq*di_co_U>P|QR9-nB@In``_qy>w9)_EPy6?d*ZJo^e%in8 zKR+_D`)PxQee3-FUnBR^#&t^H+)tbQuhIJVZczH>YI`>+b^Cj?|2g0OeM@)H!1bV& zaznbGmbf1j|Nr+-8`dqUU$=ir|K9b?&;R~u-_pf@|FooGshj(0|I(#@_t3vlod)$A zHEd9~Ph->j-?jgmgnnB8U+vu->c{K+>*ubv&cDjtPwW2ApVsSLx(ip^;9on#{j~8v z>(Hd6KR>Ngx1@1>cXa(dvpRkI_3hWNf$N*vdhxyu`}A*6w_&~FT-;CpwZW{;KRv1s z)%NLM@;~O#ci(<{_3ArdSg%1t2aWXf&!NLc4(dO)*YHt8M-CcNQcQaF8#c6rc;vw0 zCB6Ig8Zol>aMxn&ppwD;OgwyKyjSlb{TkNq)vx#PYX%MV`i$y7XjttUr*|DbXk^Lo znzhdz-FwjB-hBp_{3mHSs(=5I;U)e46SNsTYQ(_*{Ir9aLYv{khWsZej`Y8O+HvIY zK|=?SwH`kF+0d z4<6L7^H94SEys>@+q7@gVU$@qErf|KE*a2!HUIhH$l+tpH$QJVwnNE?!Grq#GY7jq_I^-$?cC4)wRWX{_^-LTKs%g`c0Vj` zz~7T>ef6l`<`^#4m?O^~Nxg>;aFc1%(%)X=_lXf=Y) z&E5H*l{6=$k%Rh<9Fpo)*OmSKlLlU|zP$$z?qH6pzQcy3hL?;OaaRAqy+@XqqrBZv zb80eoZ?iWr8V(+gNKbM`M+bc!~fS9u66PM|83o8Y@6XFSL?9&&;0%g zM~wKtoBqG{-nF@n97!AXPw~ff$1H8}BHJ;aY*}(^TelVE?maUx!QiDt)`(=WS)?xW z#{1vjClj{>kX2OA&N(MeoSo>gSec0gkN^^iOk9Rf<4rTRMq_B$3sTGDWn<0)uV?NF zn)3GqdJ$Z0N%B)&w31|2aI582kwnFMI@}bPN*vHPwF6LY_vLc=?KSL(aJZ|sN~@>* zenZ!XI&k2IeAlzf@ou_kCu7Cj%7`dlRRQ#Ntxr1UB#ioS{g~uu%+l@UexjNF6(nDm z)%4*NbS(K<1GViAXXASJu7hT;W=hr((TXHbI>Xi8w^2maAhMk13#^2k71Ypy5x=0a zLhf3_EFk37c>T5XOlB|Z@v5A%&d+ko$)VJX*{g}!zIp}Md9jAB*cB%zIezEW&I`gb z0h>*V=E}(%q@ELUUwm~98@go9mI)#DR~6O}>%F*%HBo;vZTTAUg)Dwn$6Zr4G~>UT zKQ-s8iEZJ3W;5p1sm`cB{=qb6-2cHu2fErRYY3>jab1`5HGjf{__A*ANOKTHdyrCw1d06=!6Z=w^vG|I@US{qg|@-lCr&*wSG8Ga2&6%m5~z=q*Z{ z;wLY5g4bCFq{h`@HO8bLA(`tf?B%o)#j4!dv?+>JpT)WMRcWs8@1cB~NL-t6&pp5{ zqHSkOc5+%8f@RILD52u!+wm%+h9WR|q!`U$u%>p>(gZa&cY;`QkNrB%4P1lKR7JpK zqr#w0pLg4_rc{^3W3kK=8H?1cwbSxd<5{npR(uKQaVEj0iJsvq_tp6MO3{Vu;^~_) z6Uod-GY6J*vz)G*N$ikM2`cW2n%E6S6MMj95;Ukrv2P*vZCz+B5>`+j(lQ3rQ41<- z8m%{QlWDMUK3Npghk7rxmcyhIIm7+*bwR2isjgB` zMR75o&|9eAVmbf3gS3j(X7_Tkdw$pP#WkoC^7<`#eP{ra@$>zcjV$q z^OWtBA@336yU(E2J}=9L1bB_`SjvA-9l${+X!Bpk%RT&M=QVYJGjtjSiGHL(P1Mik zFtc64@)Jo?Oq2{gdyH8sPn95|L=d!=Bm$=i@*KFixbkuP*PJw`kKqyjeUx>ORt(RQ z)S*OFFB@e@_{5JL;c$@ z{;~djU+oH3CKeL96>L{mLP0QJR+Ek#emr4t-=SZy`225U?wQZ}FU7WEffzhig(Qm@ z;zSTbQTrHR>Jr1KP69%q6q1xxBhvi6Uyc5Fpujk`r@%SXsKA|onLF?l ztSQD&_*{qp1!_dYwSe7h*f24JpHs**1@K@>fv7qhK~U~-F284hj2*-ir>Q4d8R`tO zUzg;2l4(sR2)s6ksteZm%;mG&B3=n^xg_M})y;TDO9BhuY~FRKDa9wEvQy|?nzlGg zBKfVH!Idb!d5sso5!b!iuO?nhlx8xXePOUj2iUL0b|N4s<8*N|Mx_OCR`DRqAyDhS zOqOUV%L(j0V<-i|Bf|g_*}|DB*+Ekx5@s zvXuN4{d$Dh-mY_pf4J+hPr9{*lLSLrqy3QthsS}*;c#^WovmlZmR9GdH}k4f?#7c2 z87|l_$Y#s-PyUy{^JXTq7pWO<_9hYD?o#snNnIk!>^A?Hz}BD0p6Z;_401olX02xG z3*)qXZGxHK2cVU;Fbie=W9F(q@$Zm78<(W-d6xMTf0_x$7m;Dn(xsV9u2q_;&?oJx zrIqGDk!oHR93T?wj^@1lT0C|>HC2{P*_DhG;zEc?-otC;Y&@M-kQ+Z*HnTvWP&OfCXGMP;<+=)M>ke<9(B)5Wvn9PRDCb1YgC+h8ZJum7;S|jsL zL8?vFX>qIAuN$-wjf@yMrH#-Q<@-`h0(*1%@UKbTFb6Q$)P%RCHr2c~V~x7vx=I?E zW^CAF7$>uWCK+Wiuq5xjHX*>Q*wj4Jf5VSIIWF{<0A3{2%V{@bK|8*Zj*Bi$Isf!# zG_UIMWATP|8yHjD|1y&?eZHS=r#KmNetLR($D8y8@W*CG>Qz9-+v&pZ=chC&^1LVt z=JP4Tz_!*>m`qa46mj?Qd|fTetW+hk_=0kr!x)yC5d7rg^2db=?2Nbbnhr2bA6D2k zE9yk)&dKmsVAd^^V6G8MOsVrqvvDL-B9Bb&HJkL8*a4l@)1Ypu&7L+bH=y$-qRr=M zf1RblDT(~9>8`98#AUZv_au1F{o=$oQI6y0^c{P;*?0cy)A5@K0AM*&KuJSIX;`Eg z1RlB!W&|CBYw|Kipl7U{CyyGesT4fpBZTqI?F#q&1m=w77Ptxw_cJXC96)d|X&9P3 z8xh~iE!2yOW}`yI%!(=I_68KRNA;rOit3&KOz`hI4HEJAhT0`~>?t(6G#c~SKB+bJe6~+}T^7`Zz7_S< zZJ1AU2>9X=3y@6I0Ur+`+cg84e(^NWoC6k9@C6kuc~}ay=ZdThAHAOjvZparb8~43 zeIO$u(Q@I&I)lqLVUJ!;MmwRQNOR;>v1`QHZkHq?6SLUT5+Okp*gvCYqcjtN617HB z>R9t=G%Qx*>F;}Jgd`I|u*Du2+Ugg}(-9Cm7D@~LdV_7?&B<^1+(9#bNNzbCqs!V< zmf^>GqKp$s@mt<0*x{#f4wIOeCs=X;bCgsmV7iT%UL&U8h#53u#O#=q?PEx@g{z`- zx{e2^0kUJ^4cs3m)du>z>YQGm@gLK}irGyG_cXzAR1mIy>@=lazXreux9n*z0kMOI z)BIRt*@wkpF|&*rX{==8GDWt51N!wf?{Fj(K7LzZ<-*yUjt$>W=*`vp66@!3$(|b; zc}V0ymRx??G2lsP3ZZy)NMs?_cw3Fjb!US77pw91p?<^P#q*easrHL=VL1JQJ>h?w z%=nZ3F^JGREM)*3r4(HQAPc^JGg^&nF2Qcm`7)u*@#FM)<9{S(2je*)((7U)x=mmK z_i*1Qz~g=fh^esNH+fx+ugniyb(DjCx$5F`Ul+sSX`d>zTVONWu15P{?A8VLr3Dza zmVVleCvV_TfLVmbbB2)sT#Z+SBw&3l@bvvlhpS}~rs;|<1v#9Un4E@gcxPtPqKV@qWi04K7*O9Tx1#F0J z>|m}353$rYJqW*`ScnY64;yCiYl1nN`ab=J+A^{%HqhYQkqL~%IG|qE3+!p7&*x&g z$2eRTQ~`qA;|L>VN*Pk5&o&VbOVHVJM}-B@)9hpnwvMZn0o|77KysO+8z!ukRC*5a~nHtLPZ|0T*up%uGb%PCQO2{4E zhxGb(`*l2npyB>mzlm|fhjK%zA%?QNbC8kdXxrT$y%}x$+aCTMym9W?fBWeKQEf2u zd!7U47r37kFuUmAbqFiiSm*`pyTHK$;T|;+W({M)>3JeM?vf-dWT(FZZoJ)&U&z&r zsOAy}wFEnf;zL~2&2i#gP5hOnNfl$o)PO{g2xFdZsn8P}3%+d0`E*&V^u(#?M1>gD zQenn_eL1J&^)1Z5zObfNi*8vE0WWq`B66k`EBF!`gm>Q1Am=sq5SC*^z4X%kQoJ-E z;?5^T5_dp>$og4^YZF7WfRxTHI0M^Md7#?L1oSoZxhn5Q#La`z&1x#1dUcH1lBePj zn^4SrdXJIzrxU`BjV!?R(n!M(BTMukP3`GMgu`IL<8c)C^At}fzt-4MDq$e z8=rw98J+==j?M&=4$cIfkIjrA>3J$X8JU4b9hd?w+f{(IVHwczs1)#cPzFRiCIdX{ z{wXROk%6F5EXsHksgmIsVOoll4aSf#9*Y5<55<5>MxsEZ12Leokrq(OFr>Rr^r0p& z`cMl5$xsW3lWeF7oHo=XS|4hGA{lA{kq)&4lMb~6oe#B)An8*o{){|+K^X=bb*Krn z9BKlr4Yh!dhnj%LLoFcUp%&m--%e54PzwZ&Vo`>gNRXd2lGMbijR$eKrbM%d7`Rk|~MoLo_96)Et5EpqN`UiQv+pQ6h?06uVKw1V*~13HWA>6KEPVk05B$K!K!D69tlk zD(3i*h9QF2C>YSS>KEV-sTU$StX-JuHOd8qt-1yHcGcnt+BJ)#I;29Hst|ytL||4R@LE%4rq=**4DRUsy4j=%EM}dh#Iv9 zArC4I5VhzG!nUXkpj$KsuaaA;TGkRAE^)i|AT}-PgU|=`2a&WX5XQG^5Ta;TAw+RVhaB>#68;q$1Y~Ur1n2|$ zgD4KF4<>qr_5fX*@&LM3cQ|~j>TpB{G)Ew7>)SC^o8AEBVYNX-jaq|{2bBhhT66|s zTT}+nEgA#Z_TlFV+Vus<4v6%Swjd5|hK9i(ENr`~0FxF?0qg-q0g5&~LFiUB0fKfd z0Rlxy@V0U~uC2#KQ?#xk5~@T)B-mU*qy(CN$Y^x+kdP(XA;G4~K|`myL8Hl4gHDxn z<7T2nF(iblUPx)AT1au4R!C@KrH~?HoseK-m5?B_L8js}g^*CS3sO-BY5GJPtNL81s!Y^nzme5M8xyrKngd{ZC)0iln4k59(Dhv%a`ptNx=u=)u1 z1j*R;@N`tih;%&1*nA|X_@wJ;=w$SI5_Q}LtQ@fcs*P2TjYnw!$K%t(NXJr)&Bs!TPr8qWPR5caQO8oi%CQun+F0_~ zcq|2QJeE8>9!nma_22}PjU|t75{5FCLYibONknr=va#fo#be2X^ReVn$yf^TbS!yH zHkLd_8B2U?O78q}V0|1}Y%+>0G#^6_p^YGq)5niRC!@zg)3GDL>By0|eB8v?q@(1> zWXxCsb;LNF94`*0jTVcG$BF~SBgI1Fabkg4-;Chd7_nHr;>!4N^vUQ5;HLbukztd> z-QDG6um~hZ^L|Aw>9xNP3L+NtAnJKG0LSPBjIDCKup?3x)Z`ft zn}9ClQ912!c0@%eLzN$B)F(cP(ub^|NQSMz~?wc#7#^&u=sl3^?`=}=Bl>2OZ* z`H;>jlHRQoBtu&esl!|1WV%ER z#HhA1W$HjAja7m`&&%r${PDyqPN%&=YAJDOd0vjZ`8EK_H@4t9n4OnNGX z1=4gl%r$YNGG@Rd+e2-Pyk1F(&3jOS%Bt{__KFHhQ zYq?!LEr{>sj$wE$>C0>uBw{E5J@*%;CJCSj=_c5i_WZ-E9sQ zy^-Ed@M&;4zWjY_ZXuPnJSeE-(LBvZba88l%bBh{jXn}_PjTXHDbBXrJDILGAGOf9|-WTT)&o$sCd)aA`jA4<;0X*-XOGZf&d}gcx%S*{3 z&%p)~cPC_Oz;QDHd>5A`Eh>Fyr6FLF?~KK>d!L9gVSf0VB_f)VLYSvQ&J2Kt!G#bm$1*>U&$mN(yuYl+K}cp~b%e3FdM1xGNAO?cW58TbUr}biRD_Z3Y6EUYa)k$kuGx;NXkicH z1_2AgRaCMhn0bQPxGGlDC2qLF02}P+)hVAD zzYY+PP4HQD$~T))9g`%piaF*8+-a5r@mxUwPDiwA;RX%_|NzH(+zVu6JS^sAc*4zStLd{F5lq^z@!!C`p1uljFu! zQdeqXe(JjkiFCMcxgBeCm&)5NFf4BCp387sh&8wroJc_4Jy#4`WzhwawnF3e3$2ur zPuxa%b>U%jDc)5DrRv2%GF$IAR)&rczE;WFekMe+$I)+G>1c~WU*?uU2dI3hY5kTk z5+J{TW|^$U&+yT(YBlQ(11+}mf~pFymahk%X$!!FONOFpm06*ey9@;AKdD#w@9N4d z4^4tf%6MJvvK|XqQoYLbPrgXm=4(NcvjxSfdV_nFFO3dyZNnq$X0V=zV znQ^jm(y~ zv%_AFpTQx^+oAbMuJZn+nZS9ob@uQf>ZP-q5EjsQ>E?qVw}1tMEN_WzO&cj+jk}zy zG(5eY-IBdf+*)c(c5TI5E3F!;wps4;HVtUZ$*s&uWwn$X>cUO%q2ySZV0Pvf!OggI zKlC;k!=8fgpZvb9_Ic|#nkl_lvB8@LO-$hE$AhVr=yrms}HGY}E7u#A~%z*Yq!p6dYxkRT}AEIB4S zW%qt#QJKd0mE(cU2=o#DOG6t^s~jv7ZvMvm6(D;}u0(vsZ&^1rJ?DK}Y;c8ndj)RG z`C@m2H&Mt9-BJ%ct4YsHzoI6;!g{6H!q+zWhNWxXM%#iM0~fFAybFxB zn4QpXxwZ+89XZMpf)~C`EZ&9Y=m39Wt#-FaCSHm z1|tC0TM`SwPVibjLW*|B(Zg%s?O7WA4SVpA7Gpt(E z(Ht;-E$j*>P|f^~(s3tJrNd94(orZ->0lJ7bW93VIy40;9ial14%C2Zt`-OMBBA@& zI5@1=fNEjbEGG{1H85to1Aq;wn&s47_Fi*W>oxbMUbCEfEqOKfCk|KY z)#9LK1FBh09KdWy)hwsx0&+-G=hxiC%_E_?;LYP8E%rWZh5dTrgDy@#?2R?AStb!k-Ih`0n)xBexe)8Y zzU!>rj*=8nTYpaq_s4%S1o-g|k`w`X*%vN6W`cc0?>bl?ZSR+r6r@2Q@~7eU(}w~f zjR{;4fs+NUG+@1xBEx&PwvlXf$umhXr_Tr_i98bYRki+(y^}t55#HU#4Kw_LQ9vRB ziJeLn`WOEZ$pYqnTfpx3`~t$*Tmb<|npT@th!)U)GMUGgSOqJIcmtk?&!_O?V=N%B zDn;kP*p!^ZzhH$ue%C?V>5B=(33jxU+rkx8;0HRLbZg6ghkr} zZS-p6caJFI?S9RVFMdDyXH&RHM_W#KQm>@NVjE4(zTT{U!>6Ly;2A~;mS516JOU1e z>{mj|F+ZOM{D%BPB6opdpMyY=9FW;~Ii~j=Wg>%_l{L&l4P$+x8843BXV9cC&ZmYw zNA)veK+o_vwNe~(9lZS3h)7e>UI=W3qabx8D-Y*Q0zQ8{FbTbahmg?$uXF8U(DQBe z#BTT`8ND&QR`iZZ1)p9s4l9NUDV16F7&vvt8!$#|u}n@#GvuYK$uN@OhADhA#diELo!iLf zEQvBcGv8ht^r)tl4nL}H6mzP41d4{4DBcFkxi7nFRl;(QZ4ZgT`6AinB&tSCGiAtj zAvOZ?qsc~9CRs)lcTbfel7ooyFjRQ9Ud;fT@f6#~rz10mADV0J(=3yAExO5>k?=q!UOKxk736o29(oa@VrkOMM42 zX)Tg%dztcSwa2>mU1yuv^xFuLY4CvFualH@u^Qi26%4ak!Q1Xcb^+In*=m+cNNCWh z?SdD4r@Lq5Ih8%iL+{6X3fFj<1Vs5vzheU{U{z*#RaoJ)f%6z)+M6+4HyVCRPT;%% z+aoyaG%%cX8n~x}`#Kn2E`6^{!pmzr(W$38cvh;sXF7GE%N>4} zaRa85S~(Q5*0ZfuYD~eStqMf*Osz1)l$z5uUo5K68Xf% zr9pao>SlIrG_ea}N2^F$ z3uflS)41IIuIXEgDAuXEeS&XgLcSc1ai?qX7>k=zVuH@RB6-)Hprbq}XdKgM#&_&1 zNrxMSH_UtneQLjrH`^y7zceh_n-dTDE`DBLe)+GP+v}5Iz+T^8U*Cn#3Y)xk*m{4H z6y|$^NM<<|9jg4jsv*44#=!;da}J#V}aZQlYBE&5ED?BqP}R_X=J^`gMhzM z=H!n|YPG92G30K6(J?#0KfA1*N3hyxH{kL_D%_FiM5BwU-sx1s7aUOtOS;i?UXAKv zSF9hsj2VVgOEGjj{e6#<>cjnvwjo&kV}XI61q4;%0KqIEfjt(N)oj0{J+h7yogxXp z1^H|?kr*hVq#-damAi37WOsbabfnS4e1bF#xQN&4#yaw)nK&9dny zd$eR~(c8B3FjK<~CD`J_T>asSv7Lu557NgGW;lvmI()st*uciZ;H?^aP8#A45<?uxNXNM0rn-`w7KyKPDg_52`JU0O}V< zA7~Sc%f|v5Mw+4Te;Rzm{)Q+C!&*~)?0xJXeaiB3;I_21^F`*?{nSR?JNoc33^*<_ zgId${yGI{Crup^KlEcU5TKR*^T(q>EQsz0 zhP9;{#0BdPj@zh@yGQ-F`dtRKruo$G4f<(5#}?X>QmA8U)n2!i_TzCZu3i_AwiLa= zpx;mPu)vmd{SS0hUUUEgw9y}Z?)N^#LhBn?OR53w;}en%?oJ zj~_m#`8a4xN?`&~yBxRm{^P-bc6EuGFrT2RCj`L|e_P zpU1dN3BIFC$?bf7Yfd(VN}t!?D|1r3S8abZoS%MrfaE z3gs~uOL+v14RTgKuEui_Kk%3uo*2OlcN_5drMRc)rgZ1Q2FA7oA(Tea5{Uu17m}l3 z8$5it3MJ62Hqlaey4ob0CZ~Lo&;Z4_6wqGaCZJ;S6wu%_lzc@k{Cy2>pjGR~yY8vX zg1)6`W+EHyfLO(AUk8kLjvDBB#_?QBe4a^ggN0i(_9^&IXYNI{ z02%Isrw02qY1I`7;2|#MX1nQDx<2?zZU{5WEjS;-$Tru;S-H+8b2!X{;Hh6nu7_DM z*^9LFmEb9;fjKTz0_VeU4L9%egL@91CtrH@5q*(P2Zlrnogq97;$#p*=&ww)EpWaj z^z&J*H=QpHxl%zP(G$U?OVK8|i+ikbure@@AC)!d~j6=ST&Q-zc=8ra>EJ z%ELI$moAKgdxR!Mkum^B^C?A0bQ}_{M3f!w56_If9BL}YB<-K2WPH$?8GZzPJ*((R z3n%aOW4VpW@+cZ~GhO03o1i3$-(&rQ?^ti4&%|;H+q{!q-bMYgiddT?t*%%*m|mhF z*6$LEojGD?mbs9wOadS}5RyF0=DI92>xrsM{H?yKtqfI#z zTfdXEBSav~Dj-a;%_Lb)&?mE#d6hVf3&bz5L!7sc2vMO!!l!6FY1Cz~a0wnNq=B`1 zLUW2t0@!cp@=^^lWzaMCy>9G{0wD56-KXv<0Ad1cl_A~h^Cht@t9j`14sZv(5R=hv zl_(tnf>!szjL!R(-l`vE zQO_5_1r4g8#_7WZreuQoEx4p)kv5`qwChNwD(eNiYsF*&vS-04c`ObZd4xUaVKy(pG^oxasT5mc;UEF7d|CAt%ZpKK6mgySCQdlHF##MP?!4T~00 zdfHv=pvh?E?W<(L4KZrtBy5m`x_}8o6b1~x7aiQu#+C);l?u^=6t-zRkJA4GcMM~z z|5hw6860&&j0-vy))}42l_d=q24jl{-E;5653rOvKBI|+lF`wzC;<$C93X}>(nP)r zVnP5i)voYYPK<=BH)QICQ%(0zGgx#!OA)G>57`AXJZ*nEl;We7HWi4Oim&_u!! zE)*RnjBrEO7O{5T3KoiB;mCe#&jZQaO(HsUBElVxmjP$_%QTD(x;0KIn#UY~;tj=7 z_Dgi(Vtty72T&UX_6NXPTL!yR9(59R{Izr zk(NHc$?cMcfq8zk&$KA!QP=@l;FG-COHf~Q!ZIrOefM%!72lj zQ|BkaQLX^6>JXSn5zTSFBau`xlenp+PAV3Kr{_~z#b9>rNRPpMx`OQJ6cwL#6=fj! z(?rbG*zzasvH27;6dgSgX*MvWWE;>zSIPuFUa=^gBQfpwiJXWy=7v>ubhsCw8~B{e zdplNp17=LhZ+vrnfFigbEFe%BAGq+Cd6@7%0~YTRbAYs06uWzAP=PGkjDqhq+#Eq7 zxY$vu^Lr2kBz>hB+;8^sJk1>6BE_=8iNZwH1BNN>_lUEFrD=%{u!*@!)yXUn!ctgNHdX#+KHvnQ!z}y~6h}Bnobb%L=FbSm%mHH#>cTf`1@{c~E zQ=bIjr#7sd@QpsfH&{CecD7=NMNMb6!R>8 z#vHwce?Ng)7mQ@W!h|VTbPbVjljTM%!1y7V$aljK;RP($KZDIR9g-LE6s*q4UqVY% zAwjI7#nv(YikFiN8ZPj93Cwk0CWg}9<0w2)u7j(r#BCa4{T@x<^g$OB+Y0h$P@nu6 z3^4xe#l-#iGlVUO*tcuwzy!uPiq_%;BUR9ec*!ZQT+^i)^QAnaiQQAhHg?M}C>nTx zBpRu#&0A9E<^>j4asMvNt$~E1)aS@3sK>G%^6s*HXL4DOx46$-sMoTV4%!l$XR;k{ z!?K~Qv4Kje0h;#X@&gdLiHQOsUNHxjyK4Nc472FpS6KaFr>U=j1BjU|*}L}eyC;5# zx5Y0pTbpwVo&u3M;VTIWZ+TzfQi87qv`%q5+ttAXWe=?1$T47HKlrhOz*{;(X?$ey z1s*ifl^v_lefeG%&y2rDyqeNrG;qc6v(%WF6XHuuaU!r{=nOEKoek;=&cpaB3-D~YS{4=Xkm=3(8CD)O~fA^>|A*E=(hUNN^GxmfDvZL&@c|V7)4VFgRv}M zzKrNaq);m2N;@|;P&EY|%8|P?IaR=tPjeQz=n?`IXJT$yj`q-d6FikRm2-!C7Est_ z&~}u6WT_CKh%Rbb;V{3v@?#}e>GYB1WI;g{5|tQF^ohN{f;z8+KGWNy5nxCg<@pYBFPZ0>te|My#wy)6w8qa41g?MrOp0)|c^ z);lZdfZ*FhMnTl%uadeg?ich0OB0jVrM!%XYiv1lW>L#!)$HB55!1r;r1G%bI9Q?A3l9$(zo@!PP>ck?8aUg*ogyju7HaJk4Xp!GTh37P^&UC5FWEH8Am zk)k%KW5cY_dpNtT04f&COJ2u-_t} z6%@<%bW_m_SgzlrGDAMA6hP&YVv6!xS$eNaEK_0m(DV>UE2Dsik^5s^VZp(~^@s~B z6~Vf47gD6WLE2r$9NtU;aF#G*tV(b*8y-lYo^gM?09*Gzfd$%|jJfWNvXc;`U zOaXHs=HjXnL*q3Or+ktNVDiWdcQ$<*kNha~Y5;Mg6m8y&c6)9(dXEr4y?EthmuxQE zOcOi;baYS;JJ2G}0RmeRo{aAV8^-x&@lt1jD&BAZDc1$P2b>j<1mo)Ub;(ggdlMCk(XJo3yke{4v*%YuxIxn38| zNW3-?=RoH`V+dw(oD>ZaFJ@{SCbLPBnm3)s$&;Z+RpYyqeRBbT|KdcLcg4t~H0z{P znLI&bm3Yi58H>bAL`1nVi9?oQWFp3ll9(CIeK%q=1%1PLm_YEzdA0qO##yzFg1tlz zQ&%1tAW*DT0SSfzeQ?9mo3@dNYjjc$Ht4)5mJ0To(lpK7?(K;#%`h_kZIBw z)%?z#o{82mm`)~QhS==kC&t4|sCatDCr34`(A))GQ7nuj$E*itn5>0y24xdRw*iR4 z*z8HhKD*?q1?-6t(R}{Gv2ZLq2M~%Vaf$($bTJRvi3@7T zEDhZ8@qlVj}Wzu`(t&qQ#aEc$~s$zPl~LV`yV5fKUG{_6&CqD1Z4eB22hw61_% zNDU+4iCJ$kkrPP38v3oEh&&9|pB!H|Vu8W1uz)b7nM-7qj?0fcrP~OhRbW`AYh*yH zVO|uvb0J z4*e~@ECs~B$J&M<(g5P`t=RKV0BI1}?^@nLPcT?&!te)#*7&p}k49hQ6QK`YzQ$KT z5ID49J=s2lW}!2v@rsuqeEZ8&yv>o|f(yQqT@6IQ>n7hQ9+C`7!1)?gzT-H$GTC9G zh^hnfty+S)ywZvHi$rS^hVXWbI0>%i34r_{a5x(rIw!-R{lt#D07~lymhpOyNEy;Z z8E2F%<&fHH0$FMcic&_dbtIz@t*ojTUv#W8QLfMy7%x~R%Otz+SJiJ{MaDaI=u?;= zCA`5T39~2MS`}8oAUEr8?k&R`$=@8?YDi_z)TO>S@Dm-AHmPBxMA?zOgH*<=FSD!T z+@aSZEPRfUivT(8#F0(xq8HbF=Q^C`kMzJU(p!-b<6NM?~ z^mG=ivhO(G%;!f!LCg6Sy;RSUutf zCz?_mL#Je(396Cvud&r*wk^KHq&;evV zODUrzGy!@Qd}RL_1eKZV7uW$O4lWYu_5F{v@e>OnQ!kINVdqW} zFIX7Fs{=?;df);A)|tHHULsgXp6tWZ{05d?l~OAvJ#UsL*GeR!z#^m1N^&h9dcZ8pM;PvbrC6Q{pvqGd zF+EY1XQWB9r z0CP&5C#o}^Rs9^V%Pa@HmopXqL{}_al9)3FQ1(>IfuI^~U5LIKJ#xSs+NIAsIVWDf z;29OZ8Z^0_69>4zL~#ND&Z5iN2@uVJFW5-53DS5$@Ca8zijAj8@nelEr^R#*Nb(&W z#6XJaPRxz*Nq=Co3l#-S8b5(@R6mt)=F4(ACKe^q(fKE{y-9f42snC90slw<9KIzx zCv=eLOg??!#usvp%19#)iHnzT_$#t2;#)-ci()kJ!U!fg@A4XK0&L0f zjYt?GYfn_7_*I3cWnQjrIL}17C3;htH=_bmybyqAr|E)O2qJ(fMiGB~F-P$c6PJ60 zdHv4a@GB{(o8&x~L2nS;4?T)uV58C+xKKk(eHz`E$)I?9t^v`RWO8ht#3et&8L4m3 zj)jQDnFK)mXAb^;LT4dk9^X$W_HB;UwPT0TCKt}<`^gYSww8?GdIFUTDGrqlA%?K? z(n9m8K`ny{r$nW@#FVo-P1^}KaG~A_+v>&y?^5s(MtIWB-zzou;Y-c^CFAf?)51pq zpUUG~wzRYfJTF{!_KKL9Laqj8L65RSYD?*=wdGh7g{{m?wX@VxVl>@{(RcK>!sBi51C1)<82|*qN z2z`uP>^>vW_-Zj%1(!u!T*tJE;jwC=c%+CJE zmxaTx2k&@%0{s1koP>Cc89JK0%kk^YIrcYdnLF>4@dR{F{nrg*GI$*4GfUSJ=?B zWfSiM@in$e!7DsXTctE?XJ&PV#QaM)y4Fi66tx$Vye1<>H(o?9j@qh%*H*l^lN6r} z@(`j-kgVouIbfxfpgFjvqo#D@NVIOTrC~&Nuva1}za%40#P9iN2peaOR%wo5xYENy zaE_5DhOmTii0$_4cy@YmmSll_{a2Nqg!XKQ6}07p{r&2@PZmw*#C4HHQ@EL82oz7@ z22KXKWs>%M967*!LOd@;t^k`ozq_dCkIn8DVQ0=n5WIaC6u6&fN%L=-bB0%^4&I8$ z27+FS4ByO!2gz-;Wy{ubV+6q6HyBYyb{3bGo>abGqF4ziR!u^nja^GJn$r9BHH@!e zSks53YY3FLj$NHXs%~?tUNg!E zLvn^bQjw#4z#>C6^J`|;%*_WuvV43fB*XZCh{eD!iq2>DAM0JvtR5{c?YX=P(Nt|f zsAGuHO`14Ha(7YlRg^U+C3thLghg$3=>ozhWn^=DZ7SfjjA%}GYa(d6kePuxm#`D0 z10jSXdG7@*$ESMfAwu#JclLXb-~s37H=G!AdwKSZQ%AzUp)UQNNTj)H|&fujNF$c*lpWOaS>ypyp3J;Q%N^w>`7qd2kOT5rr;(iV_^;Lxn zZRw#F70cHIA$r!vUaNj6Km4!Ho1+h&`xlP>un-d1f9`QGPJ=2i-!R23H8M|hR9xGK<*TCtVEBT=M$aAs$HHp7`%3$N9FYOVH8L=CvxMpg zmV+L2Uf;lRFTQaDk4GZTQlnppd>9gE!yuUp1ENe~sq$AOPllwTG6CibocH`z&T%@# zRW*Tg&kIOy*;5#JaB@d^z!L@E0O!OA+R%_BGsqaRt8hPdpySWt8T$z$7*^N5cp$+I z+7Zd5oS#X#PHLVT@ScTBWg#M~8CCi(a8G&~-b``Mn;uVS%dJbxeZSYmHCchy!Zy{D z==Kae?&pNZ{e*C}`x@AOVj-$GEOLHmc{)p*2n}w zT#@!ox-2oth2J>I<={B+Tdt&LgQOAI#{7rF<&Fq2?D!0yw9WAOyuN@V>khkOJ>qxL z6x6GuKFZJtf(XUD;2F;+CCfJ+x48Lrk<^RNOgMGxlRERrHUqXS@0T;46~+99+rJPa zbrs^T8>Oc1#EB>LtCpah#Udv#^mL*>3&JCfGK^b6+0!V)@D-E;g;Hawanu-U{DKAu z8Glsr{iMJ?2N=%}af8EBSa|~Dyz_$`F8R7cQB+*@R68wcfw0^u8GrqZt7o_`dWdnq zIy`@UrF~ctB;xoVI3DlOq|IX%9ulz`Zk9&lb208vl`}fF?{Xo)1;$_oyrn*!L9q(~ zJ4ak%<1v$kHm)+GkUSYIhGm7F`Yst1R$MCD$~Hu>%n{h{TZ9E2sHDTTQE?c;BTOcB zijQkcAGpRa@Nljv2f;;KMu-t-3`@RD5j@DlN?WvG`NDmKMGQ{YX8^j$kuFP-ggInZ zZg(#iyrDOuT$Od5fa%r~$_pWE$J2m*nCmVq@ERBEz3Y6#RAowd1M}it=Q~-b5^#e{ zeIo#3;X^v^6aneXYzmN6x4-d1H7=G1-paxTXk1fdfl+g4_ z_lvru{|$BPejB$bf5NeON@6ic+F(vcjMq3}&*-gj3XEvSxP3{n0dCw5DbgKjir}r0-YwT^O4Qz2)2zLKM#si1tW8?-t*c;cw9B%@e!`e|f+=Ip>_^8%FuUnx7 z045WXVgO(!AprbTwxhqtW7n&a1~SLg#8A#Kp?5eGt?O{N08V<7bHLsq#yRK|WU`YX ziz2iUBnMa9$!RyiL5dcRTq~{UjGz*ep(aW!;D^{M_4TQ!~#+w#k3Jk9$AgkiUrf;(B@N-$4( z!uKt?jQHz%eM(OZIv8i|ye&3o-Y(||usD6N>em$ajOymoV?MytLrSj1jv|)`P}<2Q zK5?YXeO*KhuIch7hvF3}on0i`#+K%W4s`hsGLQY&?f7YEs1#7vuBQ065d(ZA*$s<= z=0!t{{UtaT#!~>qT#dAmOW1|2`rKQPn za6tivjP`V6v?t-n!W-IY4^cw_ezn`HA_$!?;Pdd?nDTbNjsZi8L)_7B_7sj|F*z8` z8q>|Huee2e5d)WFEM!!ejc!C`T~i42dK0t26p;b6#GpIM2;G*sC>x?Q9Ppe@in)p* z(8#On{f=%U5R_C=+S3T(!qNKdKz5(-yAIiG@TH{9L6;0xYdb;Si_{Krh8K7mz}T1?a&z=hbcF&Q;t(y| zkqQRkhl;O=%z5!PGhCMg3l6iEf~S)O#96`78bfI;x1^j_x9S`SPkG~K0*y1`JvW;RblKM*Ub-*qmj1g00!=0Qin zO&B^_=L>By#|z{zU6P@qQXZhWELKU!O}Shh;BX-MYGSq|`1)MJ1H*d8LnhR7Nxj4n zsxwcDP7+K&*s!ovqd|IJPXLqZEwK~P$5UMAB%0o0GD~=&ODzByG+CvPWQxL zF7)g2;%j?u<6$abiT=W+4LsTU)aDz~4Y_RgX&x{INS>bLezn8x0ep{?hb?f6$muiR z3R!!g8wklb;3?h}Ax!ZeQX9vT`^IBkxbuK56%WF~@(z7EWW}S$XUt!|k0n%*1ensS ziyd=vIs4xQU(An9vI;0_TWnHChm$1|5?k%--PhtuXuTEra8f}_AZ`ONS4Oy^zze{G zSM&&gND5Xr_!7b-!ZZRy*+Z~ijWq%Q*fF2<2Di`L<;ZSp3dF)U9Kqn9_TT%pB4%8emU@Gk?8QMUq#F)Tj6Z@{H5GMwoI|Rk~0% z&nh%L8KU#HG#QiJQcrl^y+?5MiToH_i~+72EL(F}w-J4g6@7DJX3~ttQjkwyG;%ka z5tnNUcVJD%@l;*-AHlM)JSs@?(W2nE7>xJXTOzK*!bA>1wDuXkT zXkp6QV^C}jYW+M!O6>$SKtEZ?Q5CKb(P9)9{dM8E8qg4r2-;c<`J#I!ydy?m$f-s@ z%$IQ(g>SQu&#F2PHt)8HbmkCp;A3{i34%~<0hBGk*$?*MDSr#SR~h(Jimq(8wy3c;`U)aLCH8$XtEMh3ftUU zfufVyCZ=CfWLQSyfR160-xqK+Lt*+H31kPdp^18#>||Jf)9TPtt*~jq7TQcsL0TBs z&_5(5{IWfKUWM*y6eQv4m*{6gOEMPkA<|YsW>sSU6dddJH}-xZ{)9bZ{Ee_Q)hVo9 zDYXUqQc`R`t|>uCmjn?zh%vpHi>3JsdFBiN!vcK7m+=u068^{C!nOlFw1wEt$zs2@ z9bxST4Zp9z+;GTxJcEma64TF+F_x7C4N`>$_x@`l=kJ;}ie1poEZ#%Ne1fXS1Ys%N z2^8BdSVDZTy}gFEx&sxaF`|V^!+T%0uK0K+oJH-XzTQs@M1VNKKS+Sk%5Ug00KE3i ze>%nQoxdJ^IR0C06$;@D@aS)LGoz$DQV6>Wtk)+XZjpNXzusB_byoBwH~b74;Ljei z8PDGS_0!+><$Cw&?f;e;_y6YD%qH_+X)gCA?eEtM8?jC1WjSb~9prqES;Cl|9x;UPX(I=%3_L4?HVr_N;ah6eUiZ&$FX3v! zIPOPp}+GrILl~h4YCD(8S<#RyqVapn&T7{rwUXR0nP*yl}PT+n7C1 zpypUz;enO_TH(3Am1qBWB10lW9}>fayA-Fy1~s=(l%);!mXfyLb$H@m)vSGe>1 z39cDee2<~`JvwLK0;Z}vSS&o)nbFY$N-mEaIy8aD96@ti#FZyI3f22U*c;nBm&I;@ zJrWt5ckU#dU7CBe#~n(Sr*atH-cI+qW_)7`A(fOlvp~eQokRZsUTQTp2c?Lp9f#P` zDw1asC-rHom?#uO%QalWx0u*yesS%F%~h1*?-lH?81^3fa&R=lSsfl}=E4qNRV&h1 zFvoe=2c9ONlHw?kImeVXnoW(HU+B8AP!b2H7E!?FuG5ShFJ3(2CbvrAgpTfA?r90r zX~*dp+!$jvlw=vf+L{*gDb4b-quEkZp(#mT@cHxv*2xw_3&&{n#M;E-3N)YIVT(DP zaLP)w;HP18Fzhux!jxl3(d2w6{G}(rYnupQDk<#TuVDBwM82Og%ii7ql)<-890|#p zxj9|Ir1Pp1m)jYiWrB927wTbQrCp)k&nVEFfoZO%<)MP&s}Sk_zZ}OdWVCZT4n~30 zh_3W}&3-%&IFwTYRL(5d=BdfeOYZDmNa`>Mp7VJ$F93(g=R${3>;s_8%znlbGFHxtz7N6iy>j|FLGlYm=-I$A1f+Fn|swv11lDoxJ_&uf{$MX5)PG z_9rLwc>r&WJ;D`p=z0?>>tHZl-qI6JA?5n*Pncm}Tc~Ns-Hg7#s74uFHgrcfU+4W= zz6-&ZPN)jD0z+&A2CqHu-m;nZ+FW29%>z3jJ|2E-?foHsFq7zwj}oJWrTW@(Z2wrX z>$gAoHplCxQU=X(!xe>dV~!@BV!Y<-)$_Irl0`HNX{n#Qwni;QWU>B4_IOkfdT5k3 z8m8Tm?}h(kd6)k%@(dN235l7RT&>7IwNmh!!Ks6Zt3q+V#9ZHbrqcMenwqg2Cwzm2 zRVAVH?Da2Z%|dX=i!~`~Ll~0ty0(`p4w839I-RHT=NF}*tEjz>`>lniZ9~2nEzSL| zp%nc1O*0yW{P6a#$NjXJPf&Z>%L!OgEZoKw#Vp$Ob+E@|rlYRXX z(mMRx|NZB;qfGo9BDjRr0dW~I1U_Vp(88Xs@5~Z9*2d`%ArM2s zIXV}ClN>g`7rqJR(@T5?S>R5`Ej-HDhL)6cM;95B&x>Ry8x=Tyji|tJ zjLQh>9bW_d$NDPh-r8@V4d{ zY+a}KeKZt3^ryk08&H5$5G7q7e|XB={*zwWObY)J-=OD8CyzRpv<>giZ{fhgk&3p} zf~2;i+ODxM$-sFr!9N>Yusr^6i7r^)u?OD()d+(_DN<{WGMGe%;tY-othGpkK_{^W z1|EzyFjX3FFu*9{z@XR19GILJYI)Ql#>H_5#wn2p2Tx-U4z5HW97@C=BnZ}si$E~g ztv90>M1;wr5E0hJ60FiyaY-big~r7qnn`>#qM5|SBbq6EM539*#UvsM=a9S$4oQp8 z;t~>`MzwTM1)8p6cLWft;Q%KswhekV?>-HMqrVK+jYz&9%0g0 zMTE?v6%jUyS45a3ViDu=m_>|_qZSdaDQ=MvB_Z(y8^Ns~2pIk%91-J01S3Mw zqO~be6vc>B#c_-nmqs#TEZNAB73JplIGPb9O5zzYE{bTxs1027v?q+MyBHNmHDa8I zYs82ovJoTG*hYlSq8klZ8Q(}q(7GbR5h0yQp^7TCZHRI(3pXn!agGQVM>--@66=U? zX|%&3|46)}F^!vYh`_G6{Oa{!A}!|8oaq16sK>!#{nK%egPfZ^`0%N_QJZ-EmB`1z zeEx9k;~>Yz=*Pj7Y5e10f|l??v;6+W5s?2*A^-a^ki)tEp(seq?vKYo;`B~UyfPA! zB(@{}55z)r2LI1RL-hRrCmw?3l=S+M)kFTa|A~jhVHGUw{wE${o#7!Y@jvm9&i~Kj zA-Y=q7eqvK#{X*CD zBtpWt#u$mkM(689l*FK2P(&^_eelFYN^lxuib!>bZzmu9Ts)7=@fZ)EEyt@j{%cW* z4;<^Pmbj>Y^mB=wIP>Mp2FFx9>2^GUqbPjhsYcKSz$3QJiSMu2I)V!d3QzELyxND% zzCyo`N57620>2wSgfBd$1rFhRF)knK{eys%vvOp2s|K=aQ>`joitWnzbvs_HL?Uc` zz~0t?-p`X#?ic0Eqff%G@fyd6Ae%3f3R_%p1a>KKTPX=TWW(3F2jQI{M2WYH=w3Tl zu#@qAIjsAZ;yog*dC0Gut395palt z-~l*C_r0jLbJ;H6aliosM3(hCo`@BB;bL-}?Fxo8JMKE!g}Q&=Z&&+= zMF9LPDuUnheduKP+^?(9tUr(8-U`F-=VF2@QheF-f&X*4h2YnrY(Hao<9wE@?fJLi z=qtMQ_GN^76j4lUQkOV5M;nl{qMF-F+I@l*SilQ7`hpv)#zH{nBEvO0Ej*;5x16tQ zZUMY7f}}U&#d7=@WRqgIkh~DUdFaUQeFI+_dufmR{*N(wp;S$DUv;KRe!-?I(KNq| z*U$h#e7|5b)Pt1gFXNZ-VssG-{L5mzt?EU@WI<=>TseMORDTx=?U%)VHhzMZ@dOv) z*EqEN1-eiW<3+JS2tN>(tI1w`t?}x>=t~OtDgd=058dq|Xn_lnbu}+>vT=01#ef=} zK2Pz+3tB613!~>kuzi6?SP;FCBK2u5!>{pT{CB8A0a!w)a>BxU0yEj4@Li(%xN%q{ z!V^5AV_ybkcNrAqWr2G|%hBcdMGVkOQWT?K%7^j8UX%j5l?MIjWRKVBA0-cq(B{j_ zQZ(76C|)HR7-yzQqsY?Zu1(iJ=>3#P98ii_M0@;I_%)uOJ4z{Bg<*A7JdN(g<>&$z zw>j2;g+6oj5c0eVUEoSUD_l?p-8IEVRtyvfiSOt2?5^hvVO3l&M<fJ8cxKSHw zXBW8 z?mVGQR6b*Vt(`0>0a`DhtHXDY@i0s#!_Yj#>V7x+R-r=)Cb$}NG{lKhnE!zj9;u2a z?BUB2m$;9v#&cmw4q=_*<^fm4JD59kDW>>_oh{TJ>%`FI=o2rmgrXAQ*HT!ocjE_< z-Q9SFJM#i}SZiTy-WALJJoI4-thA?2-u|FtC<;y0juT z`LL@qRZkS)FQ>cJW_0A!3)lx0s6%xIp;(e_PvzTJp#v2f>Mr?yRB1n{(9arFtpsi{ zbg~th9qF`cg^$zwRV&<8 zE8JBpj3e)g$hvBU)q?fZ3is3si;*UJLr>?cR=B5DxTjXQr&hS9R=B5DSSRaYd| zS1XKr)iqkR!hJnAwZeV1!hN;EeYL`UwZdv<1GT~fwZa3n!UMI!1GT~fy$ouF2Wo`} zYJ~@Cg;lo4YK4#03LmQ#K2|G?os>#%I94lstd~r!@UdFqW3|F6gO6&3KdKe}s8;x+ zTH%jsg+Hnl{-{>?qh4OM!XMQNe^TrANv+!_wQir(x_wgX_DQW9E>lq&{*zj_Pioyh zsddwVYK1?m75=PN__JE!&uWD~s}=sNR`|18;m>M?KWlZOT2UQ4aB~(MJs~TF}BelY+q19Clt*&Zlb%j+O zruVLDXmwRXtE(DXs+rW)+g&xZx(yuE7FG?du4-s?RYR+*8d_b|(CVs&R#z>UYG`#; zL#wMAT3yx9>h{zwtr}Wg)zIpyhE`WKw7ROHrORA3w7ROH)m06xZeJCoYG`%)>KIlH zt*&ZlbyY*Fs~TE*cTx?lu4-s?RYR+*8d_b|(CVs&R(GH(E!EKKs)klqHMI1Rq8eIV z)zIpyhE`WKw7ROH)m06xu4-s?k5w(L8d_b|(9)HFYG`#;L#wMAT3yx9>Z*oTS2eV{ zs-e|Y4Xy4+by`vlEnUB<)>l`xzPhUQ)m5#pu4;XCRqLy(T3=n&`s%9IS68*Zbk+S? zH9S=7tE*aHUDf*Ps@7LmwZ6Kl_0?6audZr+bye$2Q>N;q)Kjgmo@#ydRO_qvLC;K^ zs(PyR)l;pno@#ydRO_p!T3_mX+f%Kto@#ydRO_p!T38Xmhr)sC3I)qg#si${zy*KD0Yv8MP zY1R7bsn%CdwZ3|)_0?0YFVz6-sn%CdwZ3|)_0?0Yubygs^;GMtr&?b<)%xnG)>lup zzI5rT)>lupzIv+l)l;pno@#ydRO_p!T3|O>Z#UOPqn^! zs`b@Vt*@SHef3o9tEXCDJ=OZs$AoHq^;GMtr&?b<)%xnG)>lupzIv+l)l;pno@#yd zRO?G0?yB|GQ?0L_YJK%o>#L_)Up>|O>Z#UOPqn^!s`b@VtuI}Zsn%CdwZ3|)_0?0Y zubygs^;GMtr&?b<)%xnG)>lupzO;El)zN*``s%CJS6{Wh`l|KSSAAc7)%xnI)>mJ( zzWS>5)mN=Ab^7V6)>mJ(zWS>5)mN>rzG{8-RqLy-T3>zD`s%CJS6{Wh)S0!fT3>zD z`s%CJS6{Wh`l|KSSFNwUYJK%p>#MI?Uwzg3QjLbbYJK%p>#MI?Uwzg3>Z_(tU$qbV z>Ll7%XPUmMj{B<4QthF>KC<=hulEsMkPW$MzOTM&ef3rAtFKyLebxF>O})Nqef3rA ztFKyLebxHvtJYUvwZ8hQ_0?CcufA%1^;PRjm!oQZ^;PSuuUcPy)%xnI)>mJ(zWS>5 z)mN>rzG{8-RqIRdBC7S(SFNwUYJK%p>#MI?Uwzg3>Z{gQU$wsas`b@ZtuMXztJYUv zwZ8hQ_0?CcufA%1^;PSuuUcPy)%xnI)>mJ(zVv~uT3>zD`s%CJS6{Wh`l|KSSFNwU zYJK%p>#MI?Uwzg3(iEhsvIeU4HBhaufogpXRO@S?T3-Xz`WmR#*Fd$t2CDTnP^~Xj z8xK_LYoJ|z6PrGHBhaufogpXRO@S?T3-Xz`WmR#*Fd$t z2CDU?ng;{b`WmR#*Fd$t2CDTnP_3_lY7h-nt6`u{tpj!b8K_EHwR{G;D$_!Nsx_n< zL#i#Lu~aP~)eutcAk_>~tsvD1Qf(mB1X3*^)d13hhpPFbT0g4squM^I>7!acs^O#B zJ*wHGT0L59P_=nflSj39RD(ygcT{snwRTivN40fSQ%Bo^qZ&G@ouisLs+FS}IjW7L znmDS3qZ&BEzS;Sc3-9;4`%j&3czkqLT#RdaFWn#0&~WGLp}FGM?rW1YO=$_Pr#r<1 zRGFmjUCx&T^J#jO)E{%rZWrWD@Yxxo<`| LVY_}K|M!0Y?P3q+ diff --git a/vendor/github.com/go-kit/kit/metrics/discard/discard.go b/vendor/github.com/go-kit/kit/metrics/discard/discard.go deleted file mode 100644 index a0d3b149..00000000 --- a/vendor/github.com/go-kit/kit/metrics/discard/discard.go +++ /dev/null @@ -1,40 +0,0 @@ -// Package discard provides a no-op metrics backend. -package discard - -import "github.com/go-kit/kit/metrics" - -type counter struct{} - -// NewCounter returns a new no-op counter. -func NewCounter() metrics.Counter { return counter{} } - -// With implements Counter. -func (c counter) With(labelValues ...string) metrics.Counter { return c } - -// Add implements Counter. -func (c counter) Add(delta float64) {} - -type gauge struct{} - -// NewGauge returns a new no-op gauge. -func NewGauge() metrics.Gauge { return gauge{} } - -// With implements Gauge. -func (g gauge) With(labelValues ...string) metrics.Gauge { return g } - -// Set implements Gauge. -func (g gauge) Set(value float64) {} - -// Add implements metrics.Gauge. -func (g gauge) Add(delta float64) {} - -type histogram struct{} - -// NewHistogram returns a new no-op histogram. -func NewHistogram() metrics.Histogram { return histogram{} } - -// With implements Histogram. -func (h histogram) With(labelValues ...string) metrics.Histogram { return h } - -// Observe implements histogram. -func (h histogram) Observe(value float64) {} diff --git a/vendor/github.com/go-kit/kit/metrics/doc.go b/vendor/github.com/go-kit/kit/metrics/doc.go deleted file mode 100644 index 25cda4f7..00000000 --- a/vendor/github.com/go-kit/kit/metrics/doc.go +++ /dev/null @@ -1,97 +0,0 @@ -// Package metrics provides a framework for application instrumentation. It's -// primarily designed to help you get started with good and robust -// instrumentation, and to help you migrate from a less-capable system like -// Graphite to a more-capable system like Prometheus. If your organization has -// already standardized on an instrumentation system like Prometheus, and has no -// plans to change, it may make sense to use that system's instrumentation -// library directly. -// -// This package provides three core metric abstractions (Counter, Gauge, and -// Histogram) and implementations for almost all common instrumentation -// backends. Each metric has an observation method (Add, Set, or Observe, -// respectively) used to record values, and a With method to "scope" the -// observation by various parameters. For example, you might have a Histogram to -// record request durations, parameterized by the method that's being called. -// -// var requestDuration metrics.Histogram -// // ... -// requestDuration.With("method", "MyMethod").Observe(time.Since(begin)) -// -// This allows a single high-level metrics object (requestDuration) to work with -// many code paths somewhat dynamically. The concept of With is fully supported -// in some backends like Prometheus, and not supported in other backends like -// Graphite. So, With may be a no-op, depending on the concrete implementation -// you choose. Please check the implementation to know for sure. For -// implementations that don't provide With, it's necessary to fully parameterize -// each metric in the metric name, e.g. -// -// // Statsd -// c := statsd.NewCounter("request_duration_MyMethod_200") -// c.Add(1) -// -// // Prometheus -// c := prometheus.NewCounter(stdprometheus.CounterOpts{ -// Name: "request_duration", -// ... -// }, []string{"method", "status_code"}) -// c.With("method", "MyMethod", "status_code", strconv.Itoa(code)).Add(1) -// -// Usage -// -// Metrics are dependencies, and should be passed to the components that need -// them in the same way you'd construct and pass a database handle, or reference -// to another component. Metrics should *not* be created in the global scope. -// Instead, instantiate metrics in your func main, using whichever concrete -// implementation is appropriate for your organization. -// -// latency := prometheus.NewSummaryFrom(stdprometheus.SummaryOpts{ -// Namespace: "myteam", -// Subsystem: "foosvc", -// Name: "request_latency_seconds", -// Help: "Incoming request latency in seconds.", -// }, []string{"method", "status_code"}) -// -// Write your components to take the metrics they will use as parameters to -// their constructors. Use the interface types, not the concrete types. That is, -// -// // NewAPI takes metrics.Histogram, not *prometheus.Summary -// func NewAPI(s Store, logger log.Logger, latency metrics.Histogram) *API { -// // ... -// } -// -// func (a *API) ServeFoo(w http.ResponseWriter, r *http.Request) { -// begin := time.Now() -// // ... -// a.latency.Observe(time.Since(begin).Seconds()) -// } -// -// Finally, pass the metrics as dependencies when building your object graph. -// This should happen in func main, not in the global scope. -// -// api := NewAPI(store, logger, latency) -// http.ListenAndServe("/", api) -// -// Note that metrics are "write-only" interfaces. -// -// Implementation details -// -// All metrics are safe for concurrent use. Considerable design influence has -// been taken from https://github.com/codahale/metrics and -// https://prometheus.io. -// -// Each telemetry system has different semantics for label values, push vs. -// pull, support for histograms, etc. These properties influence the design of -// their respective packages. This table attempts to summarize the key points of -// distinction. -// -// SYSTEM DIM COUNTERS GAUGES HISTOGRAMS -// dogstatsd n batch, push-aggregate batch, push-aggregate native, batch, push-each -// statsd 1 batch, push-aggregate batch, push-aggregate native, batch, push-each -// graphite 1 batch, push-aggregate batch, push-aggregate synthetic, batch, push-aggregate -// expvar 1 atomic atomic synthetic, batch, in-place expose -// influx n custom custom custom -// prometheus n native native native -// pcp 1 native native native -// cloudwatch n batch push-aggregate batch push-aggregate synthetic, batch, push-aggregate -// -package metrics diff --git a/vendor/github.com/go-kit/kit/metrics/dogstatsd/dogstatsd.go b/vendor/github.com/go-kit/kit/metrics/dogstatsd/dogstatsd.go deleted file mode 100644 index ccdcd57b..00000000 --- a/vendor/github.com/go-kit/kit/metrics/dogstatsd/dogstatsd.go +++ /dev/null @@ -1,389 +0,0 @@ -// Package dogstatsd provides a DogStatsD backend for package metrics. It's very -// similar to StatsD, but supports arbitrary tags per-metric, which map to Go -// kit's label values. So, while label values are no-ops in StatsD, they are -// supported here. For more details, see the documentation at -// http://docs.datadoghq.com/guides/dogstatsd/. -// -// This package batches observations and emits them on some schedule to the -// remote server. This is useful even if you connect to your DogStatsD server -// over UDP. Emitting one network packet per observation can quickly overwhelm -// even the fastest internal network. -package dogstatsd - -import ( - "fmt" - "io" - "strings" - "sync" - "sync/atomic" - "time" - - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/metrics" - "github.com/go-kit/kit/metrics/generic" - "github.com/go-kit/kit/metrics/internal/lv" - "github.com/go-kit/kit/metrics/internal/ratemap" - "github.com/go-kit/kit/util/conn" -) - -// Dogstatsd receives metrics observations and forwards them to a DogStatsD -// server. Create a Dogstatsd object, use it to create metrics, and pass those -// metrics as dependencies to the components that will use them. -// -// All metrics are buffered until WriteTo is called. Counters and gauges are -// aggregated into a single observation per timeseries per write. Timings and -// histograms are buffered but not aggregated. -// -// To regularly report metrics to an io.Writer, use the WriteLoop helper method. -// To send to a DogStatsD server, use the SendLoop helper method. -type Dogstatsd struct { - mtx sync.RWMutex - prefix string - rates *ratemap.RateMap - counters *lv.Space - gauges map[string]*gaugeNode - timings *lv.Space - histograms *lv.Space - logger log.Logger - lvs lv.LabelValues -} - -// New returns a Dogstatsd object that may be used to create metrics. Prefix is -// applied to all created metrics. Callers must ensure that regular calls to -// WriteTo are performed, either manually or with one of the helper methods. -func New(prefix string, logger log.Logger, lvs ...string) *Dogstatsd { - if len(lvs)%2 != 0 { - panic("odd number of LabelValues; programmer error!") - } - return &Dogstatsd{ - prefix: prefix, - rates: ratemap.New(), - counters: lv.NewSpace(), - gauges: map[string]*gaugeNode{}, - timings: lv.NewSpace(), - histograms: lv.NewSpace(), - logger: logger, - lvs: lvs, - } -} - -// NewCounter returns a counter, sending observations to this Dogstatsd object. -func (d *Dogstatsd) NewCounter(name string, sampleRate float64) *Counter { - d.rates.Set(name, sampleRate) - return &Counter{ - name: name, - obs: d.counters.Observe, - } -} - -// NewGauge returns a gauge, sending observations to this Dogstatsd object. -func (d *Dogstatsd) NewGauge(name string) *Gauge { - d.mtx.Lock() - n, ok := d.gauges[name] - if !ok { - n = &gaugeNode{gauge: &Gauge{g: generic.NewGauge(name), ddog: d}} - d.gauges[name] = n - } - d.mtx.Unlock() - return n.gauge -} - -// NewTiming returns a histogram whose observations are interpreted as -// millisecond durations, and are forwarded to this Dogstatsd object. -func (d *Dogstatsd) NewTiming(name string, sampleRate float64) *Timing { - d.rates.Set(name, sampleRate) - return &Timing{ - name: name, - obs: d.timings.Observe, - } -} - -// NewHistogram returns a histogram whose observations are of an unspecified -// unit, and are forwarded to this Dogstatsd object. -func (d *Dogstatsd) NewHistogram(name string, sampleRate float64) *Histogram { - d.rates.Set(name, sampleRate) - return &Histogram{ - name: name, - obs: d.histograms.Observe, - } -} - -// WriteLoop is a helper method that invokes WriteTo to the passed writer every -// time the passed channel fires. This method blocks until the channel is -// closed, so clients probably want to run it in its own goroutine. For typical -// usage, create a time.Ticker and pass its C channel to this method. -func (d *Dogstatsd) WriteLoop(c <-chan time.Time, w io.Writer) { - for range c { - if _, err := d.WriteTo(w); err != nil { - d.logger.Log("during", "WriteTo", "err", err) - } - } -} - -// SendLoop is a helper method that wraps WriteLoop, passing a managed -// connection to the network and address. Like WriteLoop, this method blocks -// until the channel is closed, so clients probably want to start it in its own -// goroutine. For typical usage, create a time.Ticker and pass its C channel to -// this method. -func (d *Dogstatsd) SendLoop(c <-chan time.Time, network, address string) { - d.WriteLoop(c, conn.NewDefaultManager(network, address, d.logger)) -} - -// WriteTo flushes the buffered content of the metrics to the writer, in -// DogStatsD format. WriteTo abides best-effort semantics, so observations are -// lost if there is a problem with the write. Clients should be sure to call -// WriteTo regularly, ideally through the WriteLoop or SendLoop helper methods. -func (d *Dogstatsd) WriteTo(w io.Writer) (count int64, err error) { - var n int - - d.counters.Reset().Walk(func(name string, lvs lv.LabelValues, values []float64) bool { - n, err = fmt.Fprintf(w, "%s%s:%f|c%s%s\n", d.prefix, name, sum(values), sampling(d.rates.Get(name)), d.tagValues(lvs)) - if err != nil { - return false - } - count += int64(n) - return true - }) - if err != nil { - return count, err - } - - d.mtx.RLock() - for _, root := range d.gauges { - root.walk(func(name string, lvs lv.LabelValues, value float64) bool { - n, err = fmt.Fprintf(w, "%s%s:%f|g%s\n", d.prefix, name, value, d.tagValues(lvs)) - if err != nil { - return false - } - count += int64(n) - return true - }) - } - d.mtx.RUnlock() - - d.timings.Reset().Walk(func(name string, lvs lv.LabelValues, values []float64) bool { - sampleRate := d.rates.Get(name) - for _, value := range values { - n, err = fmt.Fprintf(w, "%s%s:%f|ms%s%s\n", d.prefix, name, value, sampling(sampleRate), d.tagValues(lvs)) - if err != nil { - return false - } - count += int64(n) - } - return true - }) - if err != nil { - return count, err - } - - d.histograms.Reset().Walk(func(name string, lvs lv.LabelValues, values []float64) bool { - sampleRate := d.rates.Get(name) - for _, value := range values { - n, err = fmt.Fprintf(w, "%s%s:%f|h%s%s\n", d.prefix, name, value, sampling(sampleRate), d.tagValues(lvs)) - if err != nil { - return false - } - count += int64(n) - } - return true - }) - if err != nil { - return count, err - } - - return count, err -} - -func sum(a []float64) float64 { - var v float64 - for _, f := range a { - v += f - } - return v -} - -func last(a []float64) float64 { - return a[len(a)-1] -} - -func sampling(r float64) string { - var sv string - if r < 1.0 { - sv = fmt.Sprintf("|@%f", r) - } - return sv -} - -func (d *Dogstatsd) tagValues(labelValues []string) string { - if len(labelValues) == 0 && len(d.lvs) == 0 { - return "" - } - if len(labelValues)%2 != 0 { - panic("tagValues received a labelValues with an odd number of strings") - } - pairs := make([]string, 0, (len(d.lvs)+len(labelValues))/2) - for i := 0; i < len(d.lvs); i += 2 { - pairs = append(pairs, d.lvs[i]+":"+d.lvs[i+1]) - } - for i := 0; i < len(labelValues); i += 2 { - pairs = append(pairs, labelValues[i]+":"+labelValues[i+1]) - } - return "|#" + strings.Join(pairs, ",") -} - -type observeFunc func(name string, lvs lv.LabelValues, value float64) - -// Counter is a DogStatsD counter. Observations are forwarded to a Dogstatsd -// object, and aggregated (summed) per timeseries. -type Counter struct { - name string - lvs lv.LabelValues - obs observeFunc -} - -// With implements metrics.Counter. -func (c *Counter) With(labelValues ...string) metrics.Counter { - return &Counter{ - name: c.name, - lvs: c.lvs.With(labelValues...), - obs: c.obs, - } -} - -// Add implements metrics.Counter. -func (c *Counter) Add(delta float64) { - c.obs(c.name, c.lvs, delta) -} - -// Gauge is a DogStatsD gauge. Observations are forwarded to a Dogstatsd -// object, and aggregated (the last observation selected) per timeseries. -type Gauge struct { - g *generic.Gauge - ddog *Dogstatsd - set int32 -} - -// With implements metrics.Gauge. -func (g *Gauge) With(labelValues ...string) metrics.Gauge { - g.ddog.mtx.RLock() - node := g.ddog.gauges[g.g.Name] - g.ddog.mtx.RUnlock() - - ga := &Gauge{g: g.g.With(labelValues...).(*generic.Gauge), ddog: g.ddog} - return node.addGauge(ga, ga.g.LabelValues()) -} - -// Set implements metrics.Gauge. -func (g *Gauge) Set(value float64) { - g.g.Set(value) - g.touch() -} - -// Add implements metrics.Gauge. -func (g *Gauge) Add(delta float64) { - g.g.Add(delta) - g.touch() -} - -// Timing is a DogStatsD timing, or metrics.Histogram. Observations are -// forwarded to a Dogstatsd object, and collected (but not aggregated) per -// timeseries. -type Timing struct { - name string - lvs lv.LabelValues - obs observeFunc -} - -// With implements metrics.Timing. -func (t *Timing) With(labelValues ...string) metrics.Histogram { - return &Timing{ - name: t.name, - lvs: t.lvs.With(labelValues...), - obs: t.obs, - } -} - -// Observe implements metrics.Histogram. Value is interpreted as milliseconds. -func (t *Timing) Observe(value float64) { - t.obs(t.name, t.lvs, value) -} - -// Histogram is a DogStatsD histrogram. Observations are forwarded to a -// Dogstatsd object, and collected (but not aggregated) per timeseries. -type Histogram struct { - name string - lvs lv.LabelValues - obs observeFunc -} - -// With implements metrics.Histogram. -func (h *Histogram) With(labelValues ...string) metrics.Histogram { - return &Histogram{ - name: h.name, - lvs: h.lvs.With(labelValues...), - obs: h.obs, - } -} - -// Observe implements metrics.Histogram. -func (h *Histogram) Observe(value float64) { - h.obs(h.name, h.lvs, value) -} - -type pair struct{ label, value string } - -type gaugeNode struct { - mtx sync.RWMutex - gauge *Gauge - children map[pair]*gaugeNode -} - -func (n *gaugeNode) addGauge(g *Gauge, lvs lv.LabelValues) *Gauge { - n.mtx.Lock() - defer n.mtx.Unlock() - if len(lvs) == 0 { - if n.gauge == nil { - n.gauge = g - } - return n.gauge - } - if len(lvs) < 2 { - panic("too few LabelValues; programmer error!") - } - head, tail := pair{lvs[0], lvs[1]}, lvs[2:] - if n.children == nil { - n.children = map[pair]*gaugeNode{} - } - child, ok := n.children[head] - if !ok { - child = &gaugeNode{} - n.children[head] = child - } - return child.addGauge(g, tail) -} - -func (n *gaugeNode) walk(fn func(string, lv.LabelValues, float64) bool) bool { - n.mtx.RLock() - defer n.mtx.RUnlock() - if n.gauge != nil { - value, ok := n.gauge.read() - if ok && !fn(n.gauge.g.Name, n.gauge.g.LabelValues(), value) { - return false - } - } - for _, child := range n.children { - if !child.walk(fn) { - return false - } - } - return true -} - -func (g *Gauge) touch() { - atomic.StoreInt32(&(g.set), 1) -} - -func (g *Gauge) read() (float64, bool) { - set := atomic.SwapInt32(&(g.set), 0) - return g.g.Value(), set != 0 -} diff --git a/vendor/github.com/go-kit/kit/metrics/dogstatsd/dogstatsd_test.go b/vendor/github.com/go-kit/kit/metrics/dogstatsd/dogstatsd_test.go deleted file mode 100644 index ef6a5a45..00000000 --- a/vendor/github.com/go-kit/kit/metrics/dogstatsd/dogstatsd_test.go +++ /dev/null @@ -1,90 +0,0 @@ -package dogstatsd - -import ( - "testing" - - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/metrics/teststat" -) - -func TestCounter(t *testing.T) { - prefix, name := "abc.", "def" - label, value := "label", "value" - regex := `^` + prefix + name + `:([0-9\.]+)\|c\|#` + label + `:` + value + `$` - d := New(prefix, log.NewNopLogger()) - counter := d.NewCounter(name, 1.0).With(label, value) - valuef := teststat.SumLines(d, regex) - if err := teststat.TestCounter(counter, valuef); err != nil { - t.Fatal(err) - } -} - -func TestCounterSampled(t *testing.T) { - // This will involve multiplying the observed sum by the inverse of the - // sample rate and checking against the expected value within some - // tolerance. - t.Skip("TODO") -} - -func TestGauge(t *testing.T) { - prefix, name := "ghi.", "jkl" - label, value := "xyz", "abc" - regex := `^` + prefix + name + `:([0-9\.]+)\|g\|#hostname:foohost,` + label + `:` + value + `$` - d := New(prefix, log.NewNopLogger(), "hostname", "foohost") - gauge := d.NewGauge(name).With(label, value) - valuef := teststat.LastLine(d, regex) - if err := teststat.TestGauge(gauge, valuef); err != nil { - t.Fatal(err) - } -} - -// DogStatsD histograms just emit all observations. So, we collect them into -// a generic histogram, and run the statistics test on that. - -func TestHistogram(t *testing.T) { - prefix, name := "dogstatsd.", "histogram_test" - label, value := "abc", "def" - regex := `^` + prefix + name + `:([0-9\.]+)\|h\|#` + label + `:` + value + `$` - d := New(prefix, log.NewNopLogger()) - histogram := d.NewHistogram(name, 1.0).With(label, value) - quantiles := teststat.Quantiles(d, regex, 50) // no |@0.X - if err := teststat.TestHistogram(histogram, quantiles, 0.01); err != nil { - t.Fatal(err) - } -} - -func TestHistogramSampled(t *testing.T) { - prefix, name := "dogstatsd.", "sampled_histogram_test" - label, value := "foo", "bar" - regex := `^` + prefix + name + `:([0-9\.]+)\|h\|@0\.01[0]*\|#` + label + `:` + value + `$` - d := New(prefix, log.NewNopLogger()) - histogram := d.NewHistogram(name, 0.01).With(label, value) - quantiles := teststat.Quantiles(d, regex, 50) - if err := teststat.TestHistogram(histogram, quantiles, 0.02); err != nil { - t.Fatal(err) - } -} - -func TestTiming(t *testing.T) { - prefix, name := "dogstatsd.", "timing_test" - label, value := "wiggle", "bottom" - regex := `^` + prefix + name + `:([0-9\.]+)\|ms\|#` + label + `:` + value + `$` - d := New(prefix, log.NewNopLogger()) - histogram := d.NewTiming(name, 1.0).With(label, value) - quantiles := teststat.Quantiles(d, regex, 50) // no |@0.X - if err := teststat.TestHistogram(histogram, quantiles, 0.01); err != nil { - t.Fatal(err) - } -} - -func TestTimingSampled(t *testing.T) { - prefix, name := "dogstatsd.", "sampled_timing_test" - label, value := "internal", "external" - regex := `^` + prefix + name + `:([0-9\.]+)\|ms\|@0.03[0]*\|#` + label + `:` + value + `$` - d := New(prefix, log.NewNopLogger()) - histogram := d.NewTiming(name, 0.03).With(label, value) - quantiles := teststat.Quantiles(d, regex, 50) - if err := teststat.TestHistogram(histogram, quantiles, 0.02); err != nil { - t.Fatal(err) - } -} diff --git a/vendor/github.com/go-kit/kit/metrics/expvar/expvar.go b/vendor/github.com/go-kit/kit/metrics/expvar/expvar.go deleted file mode 100644 index ce6f3b83..00000000 --- a/vendor/github.com/go-kit/kit/metrics/expvar/expvar.go +++ /dev/null @@ -1,94 +0,0 @@ -// Package expvar provides expvar backends for metrics. -// Label values are not supported. -package expvar - -import ( - "expvar" - "sync" - - "github.com/go-kit/kit/metrics" - "github.com/go-kit/kit/metrics/generic" -) - -// Counter implements the counter metric with an expvar float. -// Label values are not supported. -type Counter struct { - f *expvar.Float -} - -// NewCounter creates an expvar Float with the given name, and returns an object -// that implements the Counter interface. -func NewCounter(name string) *Counter { - return &Counter{ - f: expvar.NewFloat(name), - } -} - -// With is a no-op. -func (c *Counter) With(labelValues ...string) metrics.Counter { return c } - -// Add implements Counter. -func (c *Counter) Add(delta float64) { c.f.Add(delta) } - -// Gauge implements the gauge metric with an expvar float. -// Label values are not supported. -type Gauge struct { - f *expvar.Float -} - -// NewGauge creates an expvar Float with the given name, and returns an object -// that implements the Gauge interface. -func NewGauge(name string) *Gauge { - return &Gauge{ - f: expvar.NewFloat(name), - } -} - -// With is a no-op. -func (g *Gauge) With(labelValues ...string) metrics.Gauge { return g } - -// Set implements Gauge. -func (g *Gauge) Set(value float64) { g.f.Set(value) } - -// Add implements metrics.Gauge. -func (g *Gauge) Add(delta float64) { g.f.Add(delta) } - -// Histogram implements the histogram metric with a combination of the generic -// Histogram object and several expvar Floats, one for each of the 50th, 90th, -// 95th, and 99th quantiles of observed values, with the quantile attached to -// the name as a suffix. Label values are not supported. -type Histogram struct { - mtx sync.Mutex - h *generic.Histogram - p50 *expvar.Float - p90 *expvar.Float - p95 *expvar.Float - p99 *expvar.Float -} - -// NewHistogram returns a Histogram object with the given name and number of -// buckets in the underlying histogram object. 50 is a good default number of -// buckets. -func NewHistogram(name string, buckets int) *Histogram { - return &Histogram{ - h: generic.NewHistogram(name, buckets), - p50: expvar.NewFloat(name + ".p50"), - p90: expvar.NewFloat(name + ".p90"), - p95: expvar.NewFloat(name + ".p95"), - p99: expvar.NewFloat(name + ".p99"), - } -} - -// With is a no-op. -func (h *Histogram) With(labelValues ...string) metrics.Histogram { return h } - -// Observe implements Histogram. -func (h *Histogram) Observe(value float64) { - h.mtx.Lock() - defer h.mtx.Unlock() - h.h.Observe(value) - h.p50.Set(h.h.Quantile(0.50)) - h.p90.Set(h.h.Quantile(0.90)) - h.p95.Set(h.h.Quantile(0.95)) - h.p99.Set(h.h.Quantile(0.99)) -} diff --git a/vendor/github.com/go-kit/kit/metrics/expvar/expvar_test.go b/vendor/github.com/go-kit/kit/metrics/expvar/expvar_test.go deleted file mode 100644 index 9af4ae03..00000000 --- a/vendor/github.com/go-kit/kit/metrics/expvar/expvar_test.go +++ /dev/null @@ -1,38 +0,0 @@ -package expvar - -import ( - "strconv" - "testing" - - "github.com/go-kit/kit/metrics/teststat" -) - -func TestCounter(t *testing.T) { - counter := NewCounter("expvar_counter").With("label values", "not supported").(*Counter) - value := func() float64 { f, _ := strconv.ParseFloat(counter.f.String(), 64); return f } - if err := teststat.TestCounter(counter, value); err != nil { - t.Fatal(err) - } -} - -func TestGauge(t *testing.T) { - gauge := NewGauge("expvar_gauge").With("label values", "not supported").(*Gauge) - value := func() float64 { f, _ := strconv.ParseFloat(gauge.f.String(), 64); return f } - if err := teststat.TestGauge(gauge, value); err != nil { - t.Fatal(err) - } -} - -func TestHistogram(t *testing.T) { - histogram := NewHistogram("expvar_histogram", 50).With("label values", "not supported").(*Histogram) - quantiles := func() (float64, float64, float64, float64) { - p50, _ := strconv.ParseFloat(histogram.p50.String(), 64) - p90, _ := strconv.ParseFloat(histogram.p90.String(), 64) - p95, _ := strconv.ParseFloat(histogram.p95.String(), 64) - p99, _ := strconv.ParseFloat(histogram.p99.String(), 64) - return p50, p90, p95, p99 - } - if err := teststat.TestHistogram(histogram, quantiles, 0.01); err != nil { - t.Fatal(err) - } -} diff --git a/vendor/github.com/go-kit/kit/metrics/generic/generic.go b/vendor/github.com/go-kit/kit/metrics/generic/generic.go deleted file mode 100644 index ebde9c87..00000000 --- a/vendor/github.com/go-kit/kit/metrics/generic/generic.go +++ /dev/null @@ -1,247 +0,0 @@ -// Package generic implements generic versions of each of the metric types. They -// can be embedded by other implementations, and converted to specific formats -// as necessary. -package generic - -import ( - "fmt" - "io" - "math" - "sync" - "sync/atomic" - - "github.com/VividCortex/gohistogram" - - "github.com/go-kit/kit/metrics" - "github.com/go-kit/kit/metrics/internal/lv" -) - -// Counter is an in-memory implementation of a Counter. -type Counter struct { - Name string - lvs lv.LabelValues - bits uint64 -} - -// NewCounter returns a new, usable Counter. -func NewCounter(name string) *Counter { - return &Counter{ - Name: name, - } -} - -// With implements Counter. -func (c *Counter) With(labelValues ...string) metrics.Counter { - return &Counter{ - Name: c.Name, - bits: atomic.LoadUint64(&c.bits), - lvs: c.lvs.With(labelValues...), - } -} - -// Add implements Counter. -func (c *Counter) Add(delta float64) { - for { - var ( - old = atomic.LoadUint64(&c.bits) - newf = math.Float64frombits(old) + delta - new = math.Float64bits(newf) - ) - if atomic.CompareAndSwapUint64(&c.bits, old, new) { - break - } - } -} - -// Value returns the current value of the counter. -func (c *Counter) Value() float64 { - return math.Float64frombits(atomic.LoadUint64(&c.bits)) -} - -// ValueReset returns the current value of the counter, and resets it to zero. -// This is useful for metrics backends whose counter aggregations expect deltas, -// like Graphite. -func (c *Counter) ValueReset() float64 { - for { - var ( - old = atomic.LoadUint64(&c.bits) - newf = 0.0 - new = math.Float64bits(newf) - ) - if atomic.CompareAndSwapUint64(&c.bits, old, new) { - return math.Float64frombits(old) - } - } -} - -// LabelValues returns the set of label values attached to the counter. -func (c *Counter) LabelValues() []string { - return c.lvs -} - -// Gauge is an in-memory implementation of a Gauge. -type Gauge struct { - Name string - lvs lv.LabelValues - bits uint64 -} - -// NewGauge returns a new, usable Gauge. -func NewGauge(name string) *Gauge { - return &Gauge{ - Name: name, - } -} - -// With implements Gauge. -func (g *Gauge) With(labelValues ...string) metrics.Gauge { - return &Gauge{ - Name: g.Name, - bits: atomic.LoadUint64(&g.bits), - lvs: g.lvs.With(labelValues...), - } -} - -// Set implements Gauge. -func (g *Gauge) Set(value float64) { - atomic.StoreUint64(&g.bits, math.Float64bits(value)) -} - -// Add implements metrics.Gauge. -func (g *Gauge) Add(delta float64) { - for { - var ( - old = atomic.LoadUint64(&g.bits) - newf = math.Float64frombits(old) + delta - new = math.Float64bits(newf) - ) - if atomic.CompareAndSwapUint64(&g.bits, old, new) { - break - } - } -} - -// Value returns the current value of the gauge. -func (g *Gauge) Value() float64 { - return math.Float64frombits(atomic.LoadUint64(&g.bits)) -} - -// LabelValues returns the set of label values attached to the gauge. -func (g *Gauge) LabelValues() []string { - return g.lvs -} - -// Histogram is an in-memory implementation of a streaming histogram, based on -// VividCortex/gohistogram. It dynamically computes quantiles, so it's not -// suitable for aggregation. -type Histogram struct { - Name string - lvs lv.LabelValues - h *safeHistogram -} - -// NewHistogram returns a numeric histogram based on VividCortex/gohistogram. A -// good default value for buckets is 50. -func NewHistogram(name string, buckets int) *Histogram { - return &Histogram{ - Name: name, - h: &safeHistogram{Histogram: gohistogram.NewHistogram(buckets)}, - } -} - -// With implements Histogram. -func (h *Histogram) With(labelValues ...string) metrics.Histogram { - return &Histogram{ - Name: h.Name, - lvs: h.lvs.With(labelValues...), - h: h.h, - } -} - -// Observe implements Histogram. -func (h *Histogram) Observe(value float64) { - h.h.Lock() - defer h.h.Unlock() - h.h.Add(value) -} - -// Quantile returns the value of the quantile q, 0.0 < q < 1.0. -func (h *Histogram) Quantile(q float64) float64 { - h.h.RLock() - defer h.h.RUnlock() - return h.h.Quantile(q) -} - -// LabelValues returns the set of label values attached to the histogram. -func (h *Histogram) LabelValues() []string { - return h.lvs -} - -// Print writes a string representation of the histogram to the passed writer. -// Useful for printing to a terminal. -func (h *Histogram) Print(w io.Writer) { - h.h.RLock() - defer h.h.RUnlock() - fmt.Fprintf(w, h.h.String()) -} - -// safeHistogram exists as gohistogram.Histogram is not goroutine-safe. -type safeHistogram struct { - sync.RWMutex - gohistogram.Histogram -} - -// Bucket is a range in a histogram which aggregates observations. -type Bucket struct { - From, To, Count int64 -} - -// Quantile is a pair of a quantile (0..100) and its observed maximum value. -type Quantile struct { - Quantile int // 0..100 - Value int64 -} - -// SimpleHistogram is an in-memory implementation of a Histogram. It only tracks -// an approximate moving average, so is likely too naïve for many use cases. -type SimpleHistogram struct { - mtx sync.RWMutex - lvs lv.LabelValues - avg float64 - n uint64 -} - -// NewSimpleHistogram returns a SimpleHistogram, ready for observations. -func NewSimpleHistogram() *SimpleHistogram { - return &SimpleHistogram{} -} - -// With implements Histogram. -func (h *SimpleHistogram) With(labelValues ...string) metrics.Histogram { - return &SimpleHistogram{ - lvs: h.lvs.With(labelValues...), - avg: h.avg, - n: h.n, - } -} - -// Observe implements Histogram. -func (h *SimpleHistogram) Observe(value float64) { - h.mtx.Lock() - defer h.mtx.Unlock() - h.n++ - h.avg -= h.avg / float64(h.n) - h.avg += value / float64(h.n) -} - -// ApproximateMovingAverage returns the approximate moving average of observations. -func (h *SimpleHistogram) ApproximateMovingAverage() float64 { - h.mtx.RLock() - defer h.mtx.RUnlock() - return h.avg -} - -// LabelValues returns the set of label values attached to the histogram. -func (h *SimpleHistogram) LabelValues() []string { - return h.lvs -} diff --git a/vendor/github.com/go-kit/kit/metrics/generic/generic_test.go b/vendor/github.com/go-kit/kit/metrics/generic/generic_test.go deleted file mode 100644 index 56e6a5ca..00000000 --- a/vendor/github.com/go-kit/kit/metrics/generic/generic_test.go +++ /dev/null @@ -1,109 +0,0 @@ -package generic_test - -// This is package generic_test in order to get around an import cycle: this -// package imports teststat to do its testing, but package teststat imports -// generic to use its Histogram in the Quantiles helper function. - -import ( - "math" - "math/rand" - "sync" - "testing" - - "github.com/go-kit/kit/metrics/generic" - "github.com/go-kit/kit/metrics/teststat" -) - -func TestCounter(t *testing.T) { - name := "my_counter" - counter := generic.NewCounter(name).With("label", "counter").(*generic.Counter) - if want, have := name, counter.Name; want != have { - t.Errorf("Name: want %q, have %q", want, have) - } - value := func() float64 { return counter.Value() } - if err := teststat.TestCounter(counter, value); err != nil { - t.Fatal(err) - } -} - -func TestValueReset(t *testing.T) { - counter := generic.NewCounter("test_value_reset") - counter.Add(123) - counter.Add(456) - counter.Add(789) - if want, have := float64(123+456+789), counter.ValueReset(); want != have { - t.Errorf("want %f, have %f", want, have) - } - if want, have := float64(0), counter.Value(); want != have { - t.Errorf("want %f, have %f", want, have) - } -} - -func TestGauge(t *testing.T) { - name := "my_gauge" - gauge := generic.NewGauge(name).With("label", "gauge").(*generic.Gauge) - if want, have := name, gauge.Name; want != have { - t.Errorf("Name: want %q, have %q", want, have) - } - value := func() float64 { return gauge.Value() } - if err := teststat.TestGauge(gauge, value); err != nil { - t.Fatal(err) - } -} - -func TestHistogram(t *testing.T) { - name := "my_histogram" - histogram := generic.NewHistogram(name, 50).With("label", "histogram").(*generic.Histogram) - if want, have := name, histogram.Name; want != have { - t.Errorf("Name: want %q, have %q", want, have) - } - quantiles := func() (float64, float64, float64, float64) { - return histogram.Quantile(0.50), histogram.Quantile(0.90), histogram.Quantile(0.95), histogram.Quantile(0.99) - } - if err := teststat.TestHistogram(histogram, quantiles, 0.01); err != nil { - t.Fatal(err) - } -} - -func TestIssue424(t *testing.T) { - var ( - histogram = generic.NewHistogram("dont_panic", 50) - concurrency = 100 - operations = 1000 - wg sync.WaitGroup - ) - - wg.Add(concurrency) - for i := 0; i < concurrency; i++ { - go func() { - defer wg.Done() - for j := 0; j < operations; j++ { - histogram.Observe(float64(j)) - histogram.Observe(histogram.Quantile(0.5)) - } - }() - } - wg.Wait() -} - -func TestSimpleHistogram(t *testing.T) { - histogram := generic.NewSimpleHistogram().With("label", "simple_histogram").(*generic.SimpleHistogram) - var ( - sum int - count = 1234 // not too big - ) - for i := 0; i < count; i++ { - value := rand.Intn(1000) - sum += value - histogram.Observe(float64(value)) - } - - var ( - want = float64(sum) / float64(count) - have = histogram.ApproximateMovingAverage() - tolerance = 0.001 // real real slim - ) - if math.Abs(want-have)/want > tolerance { - t.Errorf("want %f, have %f", want, have) - } -} diff --git a/vendor/github.com/go-kit/kit/metrics/graphite/graphite.go b/vendor/github.com/go-kit/kit/metrics/graphite/graphite.go deleted file mode 100644 index 9814e1f6..00000000 --- a/vendor/github.com/go-kit/kit/metrics/graphite/graphite.go +++ /dev/null @@ -1,203 +0,0 @@ -// Package graphite provides a Graphite backend for metrics. Metrics are batched -// and emitted in the plaintext protocol. For more information, see -// http://graphite.readthedocs.io/en/latest/feeding-carbon.html#the-plaintext-protocol -// -// Graphite does not have a native understanding of metric parameterization, so -// label values not supported. Use distinct metrics for each unique combination -// of label values. -package graphite - -import ( - "fmt" - "io" - "sync" - "time" - - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/metrics" - "github.com/go-kit/kit/metrics/generic" - "github.com/go-kit/kit/util/conn" -) - -// Graphite receives metrics observations and forwards them to a Graphite server. -// Create a Graphite object, use it to create metrics, and pass those metrics as -// dependencies to the components that will use them. -// -// All metrics are buffered until WriteTo is called. Counters and gauges are -// aggregated into a single observation per timeseries per write. Histograms are -// exploded into per-quantile gauges and reported once per write. -// -// To regularly report metrics to an io.Writer, use the WriteLoop helper method. -// To send to a Graphite server, use the SendLoop helper method. -type Graphite struct { - mtx sync.RWMutex - prefix string - counters map[string]*Counter - gauges map[string]*Gauge - histograms map[string]*Histogram - logger log.Logger -} - -// New returns a Graphite object that may be used to create metrics. Prefix is -// applied to all created metrics. Callers must ensure that regular calls to -// WriteTo are performed, either manually or with one of the helper methods. -func New(prefix string, logger log.Logger) *Graphite { - return &Graphite{ - prefix: prefix, - counters: map[string]*Counter{}, - gauges: map[string]*Gauge{}, - histograms: map[string]*Histogram{}, - logger: logger, - } -} - -// NewCounter returns a counter. Observations are aggregated and emitted once -// per write invocation. -func (g *Graphite) NewCounter(name string) *Counter { - c := NewCounter(g.prefix + name) - g.mtx.Lock() - g.counters[g.prefix+name] = c - g.mtx.Unlock() - return c -} - -// NewGauge returns a gauge. Observations are aggregated and emitted once per -// write invocation. -func (g *Graphite) NewGauge(name string) *Gauge { - ga := NewGauge(g.prefix + name) - g.mtx.Lock() - g.gauges[g.prefix+name] = ga - g.mtx.Unlock() - return ga -} - -// NewHistogram returns a histogram. Observations are aggregated and emitted as -// per-quantile gauges, once per write invocation. 50 is a good default value -// for buckets. -func (g *Graphite) NewHistogram(name string, buckets int) *Histogram { - h := NewHistogram(g.prefix+name, buckets) - g.mtx.Lock() - g.histograms[g.prefix+name] = h - g.mtx.Unlock() - return h -} - -// WriteLoop is a helper method that invokes WriteTo to the passed writer every -// time the passed channel fires. This method blocks until the channel is -// closed, so clients probably want to run it in its own goroutine. For typical -// usage, create a time.Ticker and pass its C channel to this method. -func (g *Graphite) WriteLoop(c <-chan time.Time, w io.Writer) { - for range c { - if _, err := g.WriteTo(w); err != nil { - g.logger.Log("during", "WriteTo", "err", err) - } - } -} - -// SendLoop is a helper method that wraps WriteLoop, passing a managed -// connection to the network and address. Like WriteLoop, this method blocks -// until the channel is closed, so clients probably want to start it in its own -// goroutine. For typical usage, create a time.Ticker and pass its C channel to -// this method. -func (g *Graphite) SendLoop(c <-chan time.Time, network, address string) { - g.WriteLoop(c, conn.NewDefaultManager(network, address, g.logger)) -} - -// WriteTo flushes the buffered content of the metrics to the writer, in -// Graphite plaintext format. WriteTo abides best-effort semantics, so -// observations are lost if there is a problem with the write. Clients should be -// sure to call WriteTo regularly, ideally through the WriteLoop or SendLoop -// helper methods. -func (g *Graphite) WriteTo(w io.Writer) (count int64, err error) { - g.mtx.RLock() - defer g.mtx.RUnlock() - now := time.Now().Unix() - - for name, c := range g.counters { - n, err := fmt.Fprintf(w, "%s %f %d\n", name, c.c.ValueReset(), now) - if err != nil { - return count, err - } - count += int64(n) - } - - for name, ga := range g.gauges { - n, err := fmt.Fprintf(w, "%s %f %d\n", name, ga.g.Value(), now) - if err != nil { - return count, err - } - count += int64(n) - } - - for name, h := range g.histograms { - for _, p := range []struct { - s string - f float64 - }{ - {"50", 0.50}, - {"90", 0.90}, - {"95", 0.95}, - {"99", 0.99}, - } { - n, err := fmt.Fprintf(w, "%s.p%s %f %d\n", name, p.s, h.h.Quantile(p.f), now) - if err != nil { - return count, err - } - count += int64(n) - } - } - - return count, err -} - -// Counter is a Graphite counter metric. -type Counter struct { - c *generic.Counter -} - -// NewCounter returns a new usable counter metric. -func NewCounter(name string) *Counter { - return &Counter{generic.NewCounter(name)} -} - -// With is a no-op. -func (c *Counter) With(...string) metrics.Counter { return c } - -// Add implements counter. -func (c *Counter) Add(delta float64) { c.c.Add(delta) } - -// Gauge is a Graphite gauge metric. -type Gauge struct { - g *generic.Gauge -} - -// NewGauge returns a new usable Gauge metric. -func NewGauge(name string) *Gauge { - return &Gauge{generic.NewGauge(name)} -} - -// With is a no-op. -func (g *Gauge) With(...string) metrics.Gauge { return g } - -// Set implements gauge. -func (g *Gauge) Set(value float64) { g.g.Set(value) } - -// Add implements metrics.Gauge. -func (g *Gauge) Add(delta float64) { g.g.Add(delta) } - -// Histogram is a Graphite histogram metric. Observations are bucketed into -// per-quantile gauges. -type Histogram struct { - h *generic.Histogram -} - -// NewHistogram returns a new usable Histogram metric. -func NewHistogram(name string, buckets int) *Histogram { - return &Histogram{generic.NewHistogram(name, buckets)} -} - -// With is a no-op. -func (h *Histogram) With(...string) metrics.Histogram { return h } - -// Observe implements histogram. -func (h *Histogram) Observe(value float64) { h.h.Observe(value) } diff --git a/vendor/github.com/go-kit/kit/metrics/graphite/graphite_test.go b/vendor/github.com/go-kit/kit/metrics/graphite/graphite_test.go deleted file mode 100644 index 6474e206..00000000 --- a/vendor/github.com/go-kit/kit/metrics/graphite/graphite_test.go +++ /dev/null @@ -1,63 +0,0 @@ -package graphite - -import ( - "bytes" - "regexp" - "strconv" - "testing" - - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/metrics/teststat" -) - -func TestCounter(t *testing.T) { - prefix, name := "abc.", "def" - label, value := "label", "value" // ignored for Graphite - regex := `^` + prefix + name + ` ([0-9\.]+) [0-9]+$` - g := New(prefix, log.NewNopLogger()) - counter := g.NewCounter(name).With(label, value) - valuef := teststat.SumLines(g, regex) - if err := teststat.TestCounter(counter, valuef); err != nil { - t.Fatal(err) - } -} - -func TestGauge(t *testing.T) { - prefix, name := "ghi.", "jkl" - label, value := "xyz", "abc" // ignored for Graphite - regex := `^` + prefix + name + ` ([0-9\.]+) [0-9]+$` - g := New(prefix, log.NewNopLogger()) - gauge := g.NewGauge(name).With(label, value) - valuef := teststat.LastLine(g, regex) - if err := teststat.TestGauge(gauge, valuef); err != nil { - t.Fatal(err) - } -} - -func TestHistogram(t *testing.T) { - // The histogram test is actually like 4 gauge tests. - prefix, name := "graphite.", "histogram_test" - label, value := "abc", "def" // ignored for Graphite - re50 := regexp.MustCompile(prefix + name + `.p50 ([0-9\.]+) [0-9]+`) - re90 := regexp.MustCompile(prefix + name + `.p90 ([0-9\.]+) [0-9]+`) - re95 := regexp.MustCompile(prefix + name + `.p95 ([0-9\.]+) [0-9]+`) - re99 := regexp.MustCompile(prefix + name + `.p99 ([0-9\.]+) [0-9]+`) - g := New(prefix, log.NewNopLogger()) - histogram := g.NewHistogram(name, 50).With(label, value) - quantiles := func() (float64, float64, float64, float64) { - var buf bytes.Buffer - g.WriteTo(&buf) - match50 := re50.FindStringSubmatch(buf.String()) - p50, _ := strconv.ParseFloat(match50[1], 64) - match90 := re90.FindStringSubmatch(buf.String()) - p90, _ := strconv.ParseFloat(match90[1], 64) - match95 := re95.FindStringSubmatch(buf.String()) - p95, _ := strconv.ParseFloat(match95[1], 64) - match99 := re99.FindStringSubmatch(buf.String()) - p99, _ := strconv.ParseFloat(match99[1], 64) - return p50, p90, p95, p99 - } - if err := teststat.TestHistogram(histogram, quantiles, 0.01); err != nil { - t.Fatal(err) - } -} diff --git a/vendor/github.com/go-kit/kit/metrics/influx/example_test.go b/vendor/github.com/go-kit/kit/metrics/influx/example_test.go deleted file mode 100644 index 7df3f383..00000000 --- a/vendor/github.com/go-kit/kit/metrics/influx/example_test.go +++ /dev/null @@ -1,108 +0,0 @@ -package influx - -import ( - "fmt" - "regexp" - - influxdb "github.com/influxdata/influxdb/client/v2" - - "github.com/go-kit/kit/log" -) - -func ExampleCounter() { - in := New(map[string]string{"a": "b"}, influxdb.BatchPointsConfig{}, log.NewNopLogger()) - counter := in.NewCounter("influx_counter") - counter.Add(10) - counter.With("error", "true").Add(1) - counter.With("error", "false").Add(2) - counter.Add(50) - - client := &bufWriter{} - in.WriteTo(client) - - expectedLines := []string{ - `(influx_counter,a=b count=60) [0-9]{19}`, - `(influx_counter,a=b,error=true count=1) [0-9]{19}`, - `(influx_counter,a=b,error=false count=2) [0-9]{19}`, - } - - if err := extractAndPrintMessage(expectedLines, client.buf.String()); err != nil { - fmt.Println(err.Error()) - } - - // Output: - // influx_counter,a=b count=60 - // influx_counter,a=b,error=true count=1 - // influx_counter,a=b,error=false count=2 -} - -func ExampleGauge() { - in := New(map[string]string{"a": "b"}, influxdb.BatchPointsConfig{}, log.NewNopLogger()) - gauge := in.NewGauge("influx_gauge") - gauge.Set(10) - gauge.With("error", "true").Set(2) - gauge.With("error", "true").Set(1) - gauge.With("error", "false").Set(2) - gauge.Set(50) - gauge.With("test", "true").Set(1) - gauge.With("test", "true").Add(1) - - client := &bufWriter{} - in.WriteTo(client) - - expectedLines := []string{ - `(influx_gauge,a=b,test=true value=2) [0-9]{19}`, - `(influx_gauge,a=b value=50) [0-9]{19}`, - `(influx_gauge,a=b,error=true value=1) [0-9]{19}`, - `(influx_gauge,a=b,error=false value=2) [0-9]{19}`, - } - - if err := extractAndPrintMessage(expectedLines, client.buf.String()); err != nil { - fmt.Println(err.Error()) - } - - // Output: - // influx_gauge,a=b,test=true value=2 - // influx_gauge,a=b value=50 - // influx_gauge,a=b,error=true value=1 - // influx_gauge,a=b,error=false value=2 -} - -func ExampleHistogram() { - in := New(map[string]string{"foo": "alpha"}, influxdb.BatchPointsConfig{}, log.NewNopLogger()) - histogram := in.NewHistogram("influx_histogram") - histogram.Observe(float64(10)) - histogram.With("error", "true").Observe(float64(1)) - histogram.With("error", "false").Observe(float64(2)) - histogram.Observe(float64(50)) - - client := &bufWriter{} - in.WriteTo(client) - - expectedLines := []string{ - `(influx_histogram,foo=alpha p50=10,p90=50,p95=50,p99=50) [0-9]{19}`, - `(influx_histogram,error=true,foo=alpha p50=1,p90=1,p95=1,p99=1) [0-9]{19}`, - `(influx_histogram,error=false,foo=alpha p50=2,p90=2,p95=2,p99=2) [0-9]{19}`, - } - - if err := extractAndPrintMessage(expectedLines, client.buf.String()); err != nil { - fmt.Println(err.Error()) - } - - // Output: - // influx_histogram,foo=alpha p50=10,p90=50,p95=50,p99=50 - // influx_histogram,error=true,foo=alpha p50=1,p90=1,p95=1,p99=1 - // influx_histogram,error=false,foo=alpha p50=2,p90=2,p95=2,p99=2 -} - -func extractAndPrintMessage(expected []string, msg string) error { - for _, pattern := range expected { - re := regexp.MustCompile(pattern) - match := re.FindStringSubmatch(msg) - if len(match) != 2 { - return fmt.Errorf("Pattern not found! {%s} [%s]: %v\n", pattern, msg, match) - } - fmt.Println(match[1]) - } - return nil -} diff --git a/vendor/github.com/go-kit/kit/metrics/influx/influx.go b/vendor/github.com/go-kit/kit/metrics/influx/influx.go deleted file mode 100644 index 1ea0cc50..00000000 --- a/vendor/github.com/go-kit/kit/metrics/influx/influx.go +++ /dev/null @@ -1,267 +0,0 @@ -// Package influx provides an InfluxDB implementation for metrics. The model is -// similar to other push-based instrumentation systems. Observations are -// aggregated locally and emitted to the Influx server on regular intervals. -package influx - -import ( - "time" - - influxdb "github.com/influxdata/influxdb/client/v2" - - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/metrics" - "github.com/go-kit/kit/metrics/generic" - "github.com/go-kit/kit/metrics/internal/lv" -) - -// Influx is a store for metrics that will be emitted to an Influx database. -// -// Influx is a general purpose time-series database, and has no native concepts -// of counters, gauges, or histograms. Counters are modeled as a timeseries with -// one data point per flush, with a "count" field that reflects all adds since -// the last flush. Gauges are modeled as a timeseries with one data point per -// flush, with a "value" field that reflects the current state of the gauge. -// Histograms are modeled as a timeseries with one data point per combination of tags, -// with a set of quantile fields that reflects the p50, p90, p95 & p99. -// -// Influx tags are attached to the Influx object, can be given to each -// metric at construction and can be updated anytime via With function. Influx fields -// are mapped to Go kit label values directly by this collector. Actual metric -// values are provided as fields with specific names depending on the metric. -// -// All observations are collected in memory locally, and flushed on demand. -type Influx struct { - counters *lv.Space - gauges *lv.Space - histograms *lv.Space - tags map[string]string - conf influxdb.BatchPointsConfig - logger log.Logger -} - -// New returns an Influx, ready to create metrics and collect observations. Tags -// are applied to all metrics created from this object. The BatchPointsConfig is -// used during flushing. -func New(tags map[string]string, conf influxdb.BatchPointsConfig, logger log.Logger) *Influx { - return &Influx{ - counters: lv.NewSpace(), - gauges: lv.NewSpace(), - histograms: lv.NewSpace(), - tags: tags, - conf: conf, - logger: logger, - } -} - -// NewCounter returns an Influx counter. -func (in *Influx) NewCounter(name string) *Counter { - return &Counter{ - name: name, - obs: in.counters.Observe, - } -} - -// NewGauge returns an Influx gauge. -func (in *Influx) NewGauge(name string) *Gauge { - return &Gauge{ - name: name, - obs: in.gauges.Observe, - add: in.gauges.Add, - } -} - -// NewHistogram returns an Influx histogram. -func (in *Influx) NewHistogram(name string) *Histogram { - return &Histogram{ - name: name, - obs: in.histograms.Observe, - } -} - -// BatchPointsWriter captures a subset of the influxdb.Client methods necessary -// for emitting metrics observations. -type BatchPointsWriter interface { - Write(influxdb.BatchPoints) error -} - -// WriteLoop is a helper method that invokes WriteTo to the passed writer every -// time the passed channel fires. This method blocks until the channel is -// closed, so clients probably want to run it in its own goroutine. For typical -// usage, create a time.Ticker and pass its C channel to this method. -func (in *Influx) WriteLoop(c <-chan time.Time, w BatchPointsWriter) { - for range c { - if err := in.WriteTo(w); err != nil { - in.logger.Log("during", "WriteTo", "err", err) - } - } -} - -// WriteTo flushes the buffered content of the metrics to the writer, in an -// Influx BatchPoints format. WriteTo abides best-effort semantics, so -// observations are lost if there is a problem with the write. Clients should be -// sure to call WriteTo regularly, ideally through the WriteLoop helper method. -func (in *Influx) WriteTo(w BatchPointsWriter) (err error) { - bp, err := influxdb.NewBatchPoints(in.conf) - if err != nil { - return err - } - - now := time.Now() - - in.counters.Reset().Walk(func(name string, lvs lv.LabelValues, values []float64) bool { - tags := mergeTags(in.tags, lvs) - var p *influxdb.Point - fields := map[string]interface{}{"count": sum(values)} - p, err = influxdb.NewPoint(name, tags, fields, now) - if err != nil { - return false - } - bp.AddPoint(p) - return true - }) - if err != nil { - return err - } - - in.gauges.Reset().Walk(func(name string, lvs lv.LabelValues, values []float64) bool { - tags := mergeTags(in.tags, lvs) - var p *influxdb.Point - fields := map[string]interface{}{"value": last(values)} - p, err = influxdb.NewPoint(name, tags, fields, now) - if err != nil { - return false - } - bp.AddPoint(p) - return true - }) - if err != nil { - return err - } - - in.histograms.Reset().Walk(func(name string, lvs lv.LabelValues, values []float64) bool { - histogram := generic.NewHistogram(name, 50) - tags := mergeTags(in.tags, lvs) - var p *influxdb.Point - for _, v := range values { - histogram.Observe(v) - } - fields := map[string]interface{}{ - "p50": histogram.Quantile(0.50), - "p90": histogram.Quantile(0.90), - "p95": histogram.Quantile(0.95), - "p99": histogram.Quantile(0.99), - } - p, err = influxdb.NewPoint(name, tags, fields, now) - if err != nil { - return false - } - bp.AddPoint(p) - return true - }) - if err != nil { - return err - } - - return w.Write(bp) -} - -func mergeTags(tags map[string]string, labelValues []string) map[string]string { - if len(labelValues)%2 != 0 { - panic("mergeTags received a labelValues with an odd number of strings") - } - ret := make(map[string]string, len(tags)+len(labelValues)/2) - for k, v := range tags { - ret[k] = v - } - for i := 0; i < len(labelValues); i += 2 { - ret[labelValues[i]] = labelValues[i+1] - } - return ret -} - -func sum(a []float64) float64 { - var v float64 - for _, f := range a { - v += f - } - return v -} - -func last(a []float64) float64 { - return a[len(a)-1] -} - -type observeFunc func(name string, lvs lv.LabelValues, value float64) - -// Counter is an Influx counter. Observations are forwarded to an Influx -// object, and aggregated (summed) per timeseries. -type Counter struct { - name string - lvs lv.LabelValues - obs observeFunc -} - -// With implements metrics.Counter. -func (c *Counter) With(labelValues ...string) metrics.Counter { - return &Counter{ - name: c.name, - lvs: c.lvs.With(labelValues...), - obs: c.obs, - } -} - -// Add implements metrics.Counter. -func (c *Counter) Add(delta float64) { - c.obs(c.name, c.lvs, delta) -} - -// Gauge is an Influx gauge. Observations are forwarded to a Dogstatsd -// object, and aggregated (the last observation selected) per timeseries. -type Gauge struct { - name string - lvs lv.LabelValues - obs observeFunc - add observeFunc -} - -// With implements metrics.Gauge. -func (g *Gauge) With(labelValues ...string) metrics.Gauge { - return &Gauge{ - name: g.name, - lvs: g.lvs.With(labelValues...), - obs: g.obs, - add: g.add, - } -} - -// Set implements metrics.Gauge. -func (g *Gauge) Set(value float64) { - g.obs(g.name, g.lvs, value) -} - -// Add implements metrics.Gauge. -func (g *Gauge) Add(delta float64) { - g.add(g.name, g.lvs, delta) -} - -// Histogram is an Influx histrogram. Observations are aggregated into a -// generic.Histogram and emitted as per-quantile gauges to the Influx server. -type Histogram struct { - name string - lvs lv.LabelValues - obs observeFunc -} - -// With implements metrics.Histogram. -func (h *Histogram) With(labelValues ...string) metrics.Histogram { - return &Histogram{ - name: h.name, - lvs: h.lvs.With(labelValues...), - obs: h.obs, - } -} - -// Observe implements metrics.Histogram. -func (h *Histogram) Observe(value float64) { - h.obs(h.name, h.lvs, value) -} diff --git a/vendor/github.com/go-kit/kit/metrics/influx/influx_test.go b/vendor/github.com/go-kit/kit/metrics/influx/influx_test.go deleted file mode 100644 index 57950f30..00000000 --- a/vendor/github.com/go-kit/kit/metrics/influx/influx_test.go +++ /dev/null @@ -1,125 +0,0 @@ -package influx - -import ( - "bytes" - "fmt" - "regexp" - "strconv" - "strings" - "testing" - - influxdb "github.com/influxdata/influxdb/client/v2" - - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/metrics/teststat" -) - -func TestCounter(t *testing.T) { - in := New(map[string]string{"a": "b"}, influxdb.BatchPointsConfig{}, log.NewNopLogger()) - re := regexp.MustCompile(`influx_counter,a=b count=([0-9\.]+) [0-9]+`) // reverse-engineered :\ - counter := in.NewCounter("influx_counter") - value := func() float64 { - client := &bufWriter{} - in.WriteTo(client) - match := re.FindStringSubmatch(client.buf.String()) - f, _ := strconv.ParseFloat(match[1], 64) - return f - } - if err := teststat.TestCounter(counter, value); err != nil { - t.Fatal(err) - } -} - -func TestGauge(t *testing.T) { - in := New(map[string]string{"foo": "alpha"}, influxdb.BatchPointsConfig{}, log.NewNopLogger()) - re := regexp.MustCompile(`influx_gauge,foo=alpha value=([0-9\.]+) [0-9]+`) - gauge := in.NewGauge("influx_gauge") - value := func() float64 { - client := &bufWriter{} - in.WriteTo(client) - match := re.FindStringSubmatch(client.buf.String()) - f, _ := strconv.ParseFloat(match[1], 64) - return f - } - if err := teststat.TestGauge(gauge, value); err != nil { - t.Fatal(err) - } -} - -func TestHistogram(t *testing.T) { - in := New(map[string]string{"foo": "alpha"}, influxdb.BatchPointsConfig{}, log.NewNopLogger()) - re := regexp.MustCompile(`influx_histogram,bar=beta,foo=alpha p50=([0-9\.]+),p90=([0-9\.]+),p95=([0-9\.]+),p99=([0-9\.]+) [0-9]+`) - histogram := in.NewHistogram("influx_histogram").With("bar", "beta") - quantiles := func() (float64, float64, float64, float64) { - w := &bufWriter{} - in.WriteTo(w) - match := re.FindStringSubmatch(w.buf.String()) - if len(match) != 5 { - t.Errorf("These are not the quantiles you're looking for: %v\n", match) - } - var result [4]float64 - for i, q := range match[1:] { - result[i], _ = strconv.ParseFloat(q, 64) - } - return result[0], result[1], result[2], result[3] - } - if err := teststat.TestHistogram(histogram, quantiles, 0.01); err != nil { - t.Fatal(err) - } -} - -func TestHistogramLabels(t *testing.T) { - in := New(map[string]string{}, influxdb.BatchPointsConfig{}, log.NewNopLogger()) - h := in.NewHistogram("foo") - h.Observe(123) - h.With("abc", "xyz").Observe(456) - w := &bufWriter{} - if err := in.WriteTo(w); err != nil { - t.Fatal(err) - } - if want, have := 2, len(strings.Split(strings.TrimSpace(w.buf.String()), "\n")); want != have { - t.Errorf("want %d, have %d", want, have) - } -} - -func TestIssue404(t *testing.T) { - in := New(map[string]string{}, influxdb.BatchPointsConfig{}, log.NewNopLogger()) - - counterOne := in.NewCounter("influx_counter_one").With("a", "b") - counterOne.Add(123) - - counterTwo := in.NewCounter("influx_counter_two").With("c", "d") - counterTwo.Add(456) - - w := &bufWriter{} - in.WriteTo(w) - - lines := strings.Split(strings.TrimSpace(w.buf.String()), "\n") - if want, have := 2, len(lines); want != have { - t.Fatalf("want %d, have %d", want, have) - } - for _, line := range lines { - if strings.HasPrefix(line, "influx_counter_one") { - if !strings.HasPrefix(line, "influx_counter_one,a=b count=123 ") { - t.Errorf("invalid influx_counter_one: %s", line) - } - } else if strings.HasPrefix(line, "influx_counter_two") { - if !strings.HasPrefix(line, "influx_counter_two,c=d count=456 ") { - t.Errorf("invalid influx_counter_two: %s", line) - } - } else { - t.Errorf("unexpected line: %s", line) - } - } -} - -type bufWriter struct { - buf bytes.Buffer -} - -func (w *bufWriter) Write(bp influxdb.BatchPoints) error { - for _, p := range bp.Points() { - fmt.Fprintf(&w.buf, p.String()+"\n") - } - return nil -} diff --git a/vendor/github.com/go-kit/kit/metrics/internal/lv/labelvalues.go b/vendor/github.com/go-kit/kit/metrics/internal/lv/labelvalues.go deleted file mode 100644 index 8bb1ba09..00000000 --- a/vendor/github.com/go-kit/kit/metrics/internal/lv/labelvalues.go +++ /dev/null @@ -1,14 +0,0 @@ -package lv - -// LabelValues is a type alias that provides validation on its With method. -// Metrics may include it as a member to help them satisfy With semantics and -// save some code duplication. -type LabelValues []string - -// With validates the input, and returns a new aggregate labelValues. -func (lvs LabelValues) With(labelValues ...string) LabelValues { - if len(labelValues)%2 != 0 { - labelValues = append(labelValues, "unknown") - } - return append(lvs, labelValues...) -} diff --git a/vendor/github.com/go-kit/kit/metrics/internal/lv/labelvalues_test.go b/vendor/github.com/go-kit/kit/metrics/internal/lv/labelvalues_test.go deleted file mode 100644 index 5e72609a..00000000 --- a/vendor/github.com/go-kit/kit/metrics/internal/lv/labelvalues_test.go +++ /dev/null @@ -1,22 +0,0 @@ -package lv - -import ( - "strings" - "testing" -) - -func TestWith(t *testing.T) { - var a LabelValues - b := a.With("a", "1") - c := a.With("b", "2", "c", "3") - - if want, have := "", strings.Join(a, ""); want != have { - t.Errorf("With appears to mutate the original LabelValues: want %q, have %q", want, have) - } - if want, have := "a1", strings.Join(b, ""); want != have { - t.Errorf("With does not appear to return the right thing: want %q, have %q", want, have) - } - if want, have := "b2c3", strings.Join(c, ""); want != have { - t.Errorf("With does not appear to return the right thing: want %q, have %q", want, have) - } -} diff --git a/vendor/github.com/go-kit/kit/metrics/internal/lv/space.go b/vendor/github.com/go-kit/kit/metrics/internal/lv/space.go deleted file mode 100644 index 672c9007..00000000 --- a/vendor/github.com/go-kit/kit/metrics/internal/lv/space.go +++ /dev/null @@ -1,145 +0,0 @@ -package lv - -import "sync" - -// NewSpace returns an N-dimensional vector space. -func NewSpace() *Space { - return &Space{} -} - -// Space represents an N-dimensional vector space. Each name and unique label -// value pair establishes a new dimension and point within that dimension. Order -// matters, i.e. [a=1 b=2] identifies a different timeseries than [b=2 a=1]. -type Space struct { - mtx sync.RWMutex - nodes map[string]*node -} - -// Observe locates the time series identified by the name and label values in -// the vector space, and appends the value to the list of observations. -func (s *Space) Observe(name string, lvs LabelValues, value float64) { - s.nodeFor(name).observe(lvs, value) -} - -// Add locates the time series identified by the name and label values in -// the vector space, and appends the delta to the last value in the list of -// observations. -func (s *Space) Add(name string, lvs LabelValues, delta float64) { - s.nodeFor(name).add(lvs, delta) -} - -// Walk traverses the vector space and invokes fn for each non-empty time series -// which is encountered. Return false to abort the traversal. -func (s *Space) Walk(fn func(name string, lvs LabelValues, observations []float64) bool) { - s.mtx.RLock() - defer s.mtx.RUnlock() - for name, node := range s.nodes { - f := func(lvs LabelValues, observations []float64) bool { return fn(name, lvs, observations) } - if !node.walk(LabelValues{}, f) { - return - } - } -} - -// Reset empties the current space and returns a new Space with the old -// contents. Reset a Space to get an immutable copy suitable for walking. -func (s *Space) Reset() *Space { - s.mtx.Lock() - defer s.mtx.Unlock() - n := NewSpace() - n.nodes, s.nodes = s.nodes, n.nodes - return n -} - -func (s *Space) nodeFor(name string) *node { - s.mtx.Lock() - defer s.mtx.Unlock() - if s.nodes == nil { - s.nodes = map[string]*node{} - } - n, ok := s.nodes[name] - if !ok { - n = &node{} - s.nodes[name] = n - } - return n -} - -// node exists at a specific point in the N-dimensional vector space of all -// possible label values. The node collects observations and has child nodes -// with greater specificity. -type node struct { - mtx sync.RWMutex - observations []float64 - children map[pair]*node -} - -type pair struct{ label, value string } - -func (n *node) observe(lvs LabelValues, value float64) { - n.mtx.Lock() - defer n.mtx.Unlock() - if len(lvs) == 0 { - n.observations = append(n.observations, value) - return - } - if len(lvs) < 2 { - panic("too few LabelValues; programmer error!") - } - head, tail := pair{lvs[0], lvs[1]}, lvs[2:] - if n.children == nil { - n.children = map[pair]*node{} - } - child, ok := n.children[head] - if !ok { - child = &node{} - n.children[head] = child - } - child.observe(tail, value) -} - -func (n *node) add(lvs LabelValues, delta float64) { - n.mtx.Lock() - defer n.mtx.Unlock() - if len(lvs) == 0 { - var value float64 - if len(n.observations) > 0 { - value = last(n.observations) + delta - } else { - value = delta - } - n.observations = append(n.observations, value) - return - } - if len(lvs) < 2 { - panic("too few LabelValues; programmer error!") - } - head, tail := pair{lvs[0], lvs[1]}, lvs[2:] - if n.children == nil { - n.children = map[pair]*node{} - } - child, ok := n.children[head] - if !ok { - child = &node{} - n.children[head] = child - } - child.add(tail, delta) -} - -func (n *node) walk(lvs LabelValues, fn func(LabelValues, []float64) bool) bool { - n.mtx.RLock() - defer n.mtx.RUnlock() - if len(n.observations) > 0 && !fn(lvs, n.observations) { - return false - } - for p, child := range n.children { - if !child.walk(append(lvs, p.label, p.value), fn) { - return false - } - } - return true -} - -func last(a []float64) float64 { - return a[len(a)-1] -} diff --git a/vendor/github.com/go-kit/kit/metrics/internal/lv/space_test.go b/vendor/github.com/go-kit/kit/metrics/internal/lv/space_test.go deleted file mode 100644 index 0ef55170..00000000 --- a/vendor/github.com/go-kit/kit/metrics/internal/lv/space_test.go +++ /dev/null @@ -1,86 +0,0 @@ -package lv - -import ( - "strings" - "testing" -) - -func TestSpaceWalkAbort(t *testing.T) { - s := NewSpace() - s.Observe("a", LabelValues{"a", "b"}, 1) - s.Observe("a", LabelValues{"c", "d"}, 2) - s.Observe("a", LabelValues{"e", "f"}, 4) - s.Observe("a", LabelValues{"g", "h"}, 8) - s.Observe("b", LabelValues{"a", "b"}, 16) - s.Observe("b", LabelValues{"c", "d"}, 32) - s.Observe("b", LabelValues{"e", "f"}, 64) - s.Observe("b", LabelValues{"g", "h"}, 128) - - var count int - s.Walk(func(name string, lvs LabelValues, obs []float64) bool { - count++ - return false - }) - if want, have := 1, count; want != have { - t.Errorf("want %d, have %d", want, have) - } -} - -func TestSpaceWalkSums(t *testing.T) { - s := NewSpace() - s.Observe("metric_one", LabelValues{}, 1) - s.Observe("metric_one", LabelValues{}, 2) - s.Observe("metric_one", LabelValues{"a", "1", "b", "2"}, 4) - s.Observe("metric_one", LabelValues{"a", "1", "b", "2"}, 8) - s.Observe("metric_one", LabelValues{}, 16) - s.Observe("metric_one", LabelValues{"a", "1", "b", "3"}, 32) - s.Observe("metric_two", LabelValues{}, 64) - s.Observe("metric_two", LabelValues{}, 128) - s.Observe("metric_two", LabelValues{"a", "1", "b", "2"}, 256) - - have := map[string]float64{} - s.Walk(func(name string, lvs LabelValues, obs []float64) bool { - //t.Logf("%s %v => %v", name, lvs, obs) - have[name+" ["+strings.Join(lvs, "")+"]"] += sum(obs) - return true - }) - - want := map[string]float64{ - "metric_one []": 1 + 2 + 16, - "metric_one [a1b2]": 4 + 8, - "metric_one [a1b3]": 32, - "metric_two []": 64 + 128, - "metric_two [a1b2]": 256, - } - for keystr, wantsum := range want { - if havesum := have[keystr]; wantsum != havesum { - t.Errorf("%q: want %.1f, have %.1f", keystr, wantsum, havesum) - } - delete(want, keystr) - delete(have, keystr) - } - for keystr, havesum := range have { - t.Errorf("%q: unexpected observations recorded: %.1f", keystr, havesum) - } -} - -func TestSpaceWalkSkipsEmptyDimensions(t *testing.T) { - s := NewSpace() - s.Observe("foo", LabelValues{"bar", "1", "baz", "2"}, 123) - - var count int - s.Walk(func(name string, lvs LabelValues, obs []float64) bool { - count++ - return true - }) - if want, have := 1, count; want != have { - t.Errorf("want %d, have %d", want, have) - } -} - -func sum(a []float64) (v float64) { - for _, f := range a { - v += f - } - return -} diff --git a/vendor/github.com/go-kit/kit/metrics/internal/ratemap/ratemap.go b/vendor/github.com/go-kit/kit/metrics/internal/ratemap/ratemap.go deleted file mode 100644 index a955c12b..00000000 --- a/vendor/github.com/go-kit/kit/metrics/internal/ratemap/ratemap.go +++ /dev/null @@ -1,40 +0,0 @@ -// Package ratemap implements a goroutine-safe map of string to float64. It can -// be embedded in implementations whose metrics support fixed sample rates, so -// that an additional parameter doesn't have to be tracked through the e.g. -// lv.Space object. -package ratemap - -import "sync" - -// RateMap is a simple goroutine-safe map of string to float64. -type RateMap struct { - mtx sync.RWMutex - m map[string]float64 -} - -// New returns a new RateMap. -func New() *RateMap { - return &RateMap{ - m: map[string]float64{}, - } -} - -// Set writes the given name/rate pair to the map. -// Set is safe for concurrent access by multiple goroutines. -func (m *RateMap) Set(name string, rate float64) { - m.mtx.Lock() - defer m.mtx.Unlock() - m.m[name] = rate -} - -// Get retrieves the rate for the given name, or 1.0 if none is set. -// Get is safe for concurrent access by multiple goroutines. -func (m *RateMap) Get(name string) float64 { - m.mtx.RLock() - defer m.mtx.RUnlock() - f, ok := m.m[name] - if !ok { - f = 1.0 - } - return f -} diff --git a/vendor/github.com/go-kit/kit/metrics/metrics.go b/vendor/github.com/go-kit/kit/metrics/metrics.go deleted file mode 100644 index a7ba1b1f..00000000 --- a/vendor/github.com/go-kit/kit/metrics/metrics.go +++ /dev/null @@ -1,25 +0,0 @@ -package metrics - -// Counter describes a metric that accumulates values monotonically. -// An example of a counter is the number of received HTTP requests. -type Counter interface { - With(labelValues ...string) Counter - Add(delta float64) -} - -// Gauge describes a metric that takes specific values over time. -// An example of a gauge is the current depth of a job queue. -type Gauge interface { - With(labelValues ...string) Gauge - Set(value float64) - Add(delta float64) -} - -// Histogram describes a metric that takes repeated observations of the same -// kind of thing, and produces a statistical summary of those observations, -// typically expressed as quantiles or buckets. An example of a histogram is -// HTTP request latencies. -type Histogram interface { - With(labelValues ...string) Histogram - Observe(value float64) -} diff --git a/vendor/github.com/go-kit/kit/metrics/multi/multi.go b/vendor/github.com/go-kit/kit/metrics/multi/multi.go deleted file mode 100644 index 0f4a9e02..00000000 --- a/vendor/github.com/go-kit/kit/metrics/multi/multi.go +++ /dev/null @@ -1,86 +0,0 @@ -// Package multi provides adapters that send observations to multiple metrics -// simultaneously. This is useful if your service needs to emit to multiple -// instrumentation systems at the same time, for example if your organization is -// transitioning from one system to another. -package multi - -import "github.com/go-kit/kit/metrics" - -// Counter collects multiple individual counters and treats them as a unit. -type Counter []metrics.Counter - -// NewCounter returns a multi-counter, wrapping the passed counters. -func NewCounter(c ...metrics.Counter) Counter { - return Counter(c) -} - -// Add implements counter. -func (c Counter) Add(delta float64) { - for _, counter := range c { - counter.Add(delta) - } -} - -// With implements counter. -func (c Counter) With(labelValues ...string) metrics.Counter { - next := make(Counter, len(c)) - for i := range c { - next[i] = c[i].With(labelValues...) - } - return next -} - -// Gauge collects multiple individual gauges and treats them as a unit. -type Gauge []metrics.Gauge - -// NewGauge returns a multi-gauge, wrapping the passed gauges. -func NewGauge(g ...metrics.Gauge) Gauge { - return Gauge(g) -} - -// Set implements Gauge. -func (g Gauge) Set(value float64) { - for _, gauge := range g { - gauge.Set(value) - } -} - -// With implements gauge. -func (g Gauge) With(labelValues ...string) metrics.Gauge { - next := make(Gauge, len(g)) - for i := range g { - next[i] = g[i].With(labelValues...) - } - return next -} - -// Add implements metrics.Gauge. -func (g Gauge) Add(delta float64) { - for _, gauge := range g { - gauge.Add(delta) - } -} - -// Histogram collects multiple individual histograms and treats them as a unit. -type Histogram []metrics.Histogram - -// NewHistogram returns a multi-histogram, wrapping the passed histograms. -func NewHistogram(h ...metrics.Histogram) Histogram { - return Histogram(h) -} - -// Observe implements Histogram. -func (h Histogram) Observe(value float64) { - for _, histogram := range h { - histogram.Observe(value) - } -} - -// With implements histogram. -func (h Histogram) With(labelValues ...string) metrics.Histogram { - next := make(Histogram, len(h)) - for i := range h { - next[i] = h[i].With(labelValues...) - } - return next -} diff --git a/vendor/github.com/go-kit/kit/metrics/multi/multi_test.go b/vendor/github.com/go-kit/kit/metrics/multi/multi_test.go deleted file mode 100644 index bc52f9d8..00000000 --- a/vendor/github.com/go-kit/kit/metrics/multi/multi_test.go +++ /dev/null @@ -1,96 +0,0 @@ -package multi - -import ( - "fmt" - "testing" - - "github.com/go-kit/kit/metrics" -) - -func TestMultiCounter(t *testing.T) { - c1 := &mockCounter{} - c2 := &mockCounter{} - c3 := &mockCounter{} - mc := NewCounter(c1, c2, c3) - - mc.Add(123) - mc.Add(456) - - want := "[123 456]" - for i, m := range []fmt.Stringer{c1, c2, c3} { - if have := m.String(); want != have { - t.Errorf("c%d: want %q, have %q", i+1, want, have) - } - } -} - -func TestMultiGauge(t *testing.T) { - g1 := &mockGauge{} - g2 := &mockGauge{} - g3 := &mockGauge{} - mg := NewGauge(g1, g2, g3) - - mg.Set(9) - mg.Set(8) - mg.Set(7) - mg.Add(3) - - want := "[9 8 7 10]" - for i, m := range []fmt.Stringer{g1, g2, g3} { - if have := m.String(); want != have { - t.Errorf("g%d: want %q, have %q", i+1, want, have) - } - } -} - -func TestMultiHistogram(t *testing.T) { - h1 := &mockHistogram{} - h2 := &mockHistogram{} - h3 := &mockHistogram{} - mh := NewHistogram(h1, h2, h3) - - mh.Observe(1) - mh.Observe(2) - mh.Observe(4) - mh.Observe(8) - - want := "[1 2 4 8]" - for i, m := range []fmt.Stringer{h1, h2, h3} { - if have := m.String(); want != have { - t.Errorf("g%d: want %q, have %q", i+1, want, have) - } - } -} - -type mockCounter struct { - obs []float64 -} - -func (c *mockCounter) Add(delta float64) { c.obs = append(c.obs, delta) } -func (c *mockCounter) With(...string) metrics.Counter { return c } -func (c *mockCounter) String() string { return fmt.Sprintf("%v", c.obs) } - -type mockGauge struct { - obs []float64 -} - -func (g *mockGauge) Set(value float64) { g.obs = append(g.obs, value) } -func (g *mockGauge) With(...string) metrics.Gauge { return g } -func (g *mockGauge) String() string { return fmt.Sprintf("%v", g.obs) } -func (g *mockGauge) Add(delta float64) { - var value float64 - if len(g.obs) > 0 { - value = g.obs[len(g.obs)-1] + delta - } else { - value = delta - } - g.obs = append(g.obs, value) -} - -type mockHistogram struct { - obs []float64 -} - -func (h *mockHistogram) Observe(value float64) { h.obs = append(h.obs, value) } -func (h *mockHistogram) With(...string) metrics.Histogram { return h } -func (h *mockHistogram) String() string { return fmt.Sprintf("%v", h.obs) } diff --git a/vendor/github.com/go-kit/kit/metrics/pcp/pcp.go b/vendor/github.com/go-kit/kit/metrics/pcp/pcp.go deleted file mode 100644 index e4521c61..00000000 --- a/vendor/github.com/go-kit/kit/metrics/pcp/pcp.go +++ /dev/null @@ -1,125 +0,0 @@ -package pcp - -import ( - "github.com/performancecopilot/speed" - - "github.com/go-kit/kit/metrics" -) - -// Reporter encapsulates a speed client. -type Reporter struct { - c *speed.PCPClient -} - -// NewReporter creates a new Reporter instance. The first parameter is the -// application name and is used to create the speed client. Hence it should be a -// valid speed parameter name and should not contain spaces or the path -// separator for your operating system. -func NewReporter(appname string) (*Reporter, error) { - c, err := speed.NewPCPClient(appname) - if err != nil { - return nil, err - } - - return &Reporter{c}, nil -} - -// Start starts the underlying speed client so it can start reporting registered -// metrics to your PCP installation. -func (r *Reporter) Start() { r.c.MustStart() } - -// Stop stops the underlying speed client so it can stop reporting registered -// metrics to your PCP installation. -func (r *Reporter) Stop() { r.c.MustStop() } - -// Counter implements metrics.Counter via a single dimensional speed.Counter. -type Counter struct { - c speed.Counter -} - -// NewCounter creates a new Counter. This requires a name parameter and can -// optionally take a couple of description strings, that are used to create the -// underlying speed.Counter and are reported by PCP. -func (r *Reporter) NewCounter(name string, desc ...string) (*Counter, error) { - c, err := speed.NewPCPCounter(0, name, desc...) - if err != nil { - return nil, err - } - - r.c.MustRegister(c) - return &Counter{c}, nil -} - -// With is a no-op. -func (c *Counter) With(labelValues ...string) metrics.Counter { return c } - -// Add increments Counter. speed.Counters only take int64, so delta is converted -// to int64 before observation. -func (c *Counter) Add(delta float64) { c.c.Inc(int64(delta)) } - -// Gauge implements metrics.Gauge via a single dimensional speed.Gauge. -type Gauge struct { - g speed.Gauge -} - -// NewGauge creates a new Gauge. This requires a name parameter and can -// optionally take a couple of description strings, that are used to create the -// underlying speed.Gauge and are reported by PCP. -func (r *Reporter) NewGauge(name string, desc ...string) (*Gauge, error) { - g, err := speed.NewPCPGauge(0, name, desc...) - if err != nil { - return nil, err - } - - r.c.MustRegister(g) - return &Gauge{g}, nil -} - -// With is a no-op. -func (g *Gauge) With(labelValues ...string) metrics.Gauge { return g } - -// Set sets the value of the gauge. -func (g *Gauge) Set(value float64) { g.g.Set(value) } - -// Add adds a value to the gauge. -func (g *Gauge) Add(delta float64) { g.g.Inc(delta) } - -// Histogram wraps a speed Histogram. -type Histogram struct { - h speed.Histogram -} - -// NewHistogram creates a new Histogram. The minimum observeable value is 0. The -// maximum observeable value is 3600000000 (3.6e9). -// -// The required parameters are a metric name, the minimum and maximum observable -// values, and a metric unit for the units of the observed values. -// -// Optionally, it can also take a couple of description strings. -func (r *Reporter) NewHistogram(name string, min, max int64, unit speed.MetricUnit, desc ...string) (*Histogram, error) { - h, err := speed.NewPCPHistogram(name, min, max, 5, unit, desc...) - if err != nil { - return nil, err - } - - r.c.MustRegister(h) - return &Histogram{h}, nil -} - -// With is a no-op. -func (h *Histogram) With(labelValues ...string) metrics.Histogram { return h } - -// Observe observes a value. -// -// This converts float64 value to int64 before observation, as the Histogram in -// speed is backed using codahale/hdrhistogram, which only observes int64 -// values. Additionally, the value is interpreted in the metric unit used to -// construct the histogram. -func (h *Histogram) Observe(value float64) { h.h.MustRecord(int64(value)) } - -// Mean returns the mean of the values observed so far by the Histogram. -func (h *Histogram) Mean() float64 { return h.h.Mean() } - -// Percentile returns a percentile value for the given percentile -// between 0 and 100 for all values observed by the histogram. -func (h *Histogram) Percentile(p float64) int64 { return h.h.Percentile(p) } diff --git a/vendor/github.com/go-kit/kit/metrics/pcp/pcp_test.go b/vendor/github.com/go-kit/kit/metrics/pcp/pcp_test.go deleted file mode 100644 index ce847a10..00000000 --- a/vendor/github.com/go-kit/kit/metrics/pcp/pcp_test.go +++ /dev/null @@ -1,72 +0,0 @@ -package pcp - -import ( - "testing" - - "github.com/performancecopilot/speed" - - "github.com/go-kit/kit/metrics/teststat" -) - -func TestCounter(t *testing.T) { - r, err := NewReporter("test_counter") - if err != nil { - t.Fatal(err) - } - - counter, err := r.NewCounter("speed_counter") - if err != nil { - t.Fatal(err) - } - - counter = counter.With("label values", "not supported").(*Counter) - - value := func() float64 { f := counter.c.Val(); return float64(f) } - if err := teststat.TestCounter(counter, value); err != nil { - t.Fatal(err) - } -} - -func TestGauge(t *testing.T) { - r, err := NewReporter("test_gauge") - if err != nil { - t.Fatal(err) - } - - gauge, err := r.NewGauge("speed_gauge") - if err != nil { - t.Fatal(err) - } - - gauge = gauge.With("label values", "not supported").(*Gauge) - - value := func() float64 { f := gauge.g.Val(); return f } - if err := teststat.TestGauge(gauge, value); err != nil { - t.Fatal(err) - } -} - -func TestHistogram(t *testing.T) { - r, err := NewReporter("test_histogram") - if err != nil { - t.Fatal(err) - } - - histogram, err := r.NewHistogram("speed_histogram", 0, 3600000000, speed.OneUnit) - if err != nil { - t.Fatal(err) - } - - histogram = histogram.With("label values", "not supported").(*Histogram) - - quantiles := func() (float64, float64, float64, float64) { - p50 := float64(histogram.Percentile(50)) - p90 := float64(histogram.Percentile(90)) - p95 := float64(histogram.Percentile(95)) - p99 := float64(histogram.Percentile(99)) - return p50, p90, p95, p99 - } - if err := teststat.TestHistogram(histogram, quantiles, 0.01); err != nil { - t.Fatal(err) - } -} diff --git a/vendor/github.com/go-kit/kit/metrics/prometheus/prometheus.go b/vendor/github.com/go-kit/kit/metrics/prometheus/prometheus.go deleted file mode 100644 index 7a364c31..00000000 --- a/vendor/github.com/go-kit/kit/metrics/prometheus/prometheus.go +++ /dev/null @@ -1,165 +0,0 @@ -// Package prometheus provides Prometheus implementations for metrics. -// Individual metrics are mapped to their Prometheus counterparts, and -// (depending on the constructor used) may be automatically registered in the -// global Prometheus metrics registry. -package prometheus - -import ( - "github.com/prometheus/client_golang/prometheus" - - "github.com/go-kit/kit/metrics" - "github.com/go-kit/kit/metrics/internal/lv" -) - -// Counter implements Counter, via a Prometheus CounterVec. -type Counter struct { - cv *prometheus.CounterVec - lvs lv.LabelValues -} - -// NewCounterFrom constructs and registers a Prometheus CounterVec, -// and returns a usable Counter object. -func NewCounterFrom(opts prometheus.CounterOpts, labelNames []string) *Counter { - cv := prometheus.NewCounterVec(opts, labelNames) - prometheus.MustRegister(cv) - return NewCounter(cv) -} - -// NewCounter wraps the CounterVec and returns a usable Counter object. -func NewCounter(cv *prometheus.CounterVec) *Counter { - return &Counter{ - cv: cv, - } -} - -// With implements Counter. -func (c *Counter) With(labelValues ...string) metrics.Counter { - return &Counter{ - cv: c.cv, - lvs: c.lvs.With(labelValues...), - } -} - -// Add implements Counter. -func (c *Counter) Add(delta float64) { - c.cv.With(makeLabels(c.lvs...)).Add(delta) -} - -// Gauge implements Gauge, via a Prometheus GaugeVec. -type Gauge struct { - gv *prometheus.GaugeVec - lvs lv.LabelValues -} - -// NewGaugeFrom construts and registers a Prometheus GaugeVec, -// and returns a usable Gauge object. -func NewGaugeFrom(opts prometheus.GaugeOpts, labelNames []string) *Gauge { - gv := prometheus.NewGaugeVec(opts, labelNames) - prometheus.MustRegister(gv) - return NewGauge(gv) -} - -// NewGauge wraps the GaugeVec and returns a usable Gauge object. -func NewGauge(gv *prometheus.GaugeVec) *Gauge { - return &Gauge{ - gv: gv, - } -} - -// With implements Gauge. -func (g *Gauge) With(labelValues ...string) metrics.Gauge { - return &Gauge{ - gv: g.gv, - lvs: g.lvs.With(labelValues...), - } -} - -// Set implements Gauge. -func (g *Gauge) Set(value float64) { - g.gv.With(makeLabels(g.lvs...)).Set(value) -} - -// Add is supported by Prometheus GaugeVecs. -func (g *Gauge) Add(delta float64) { - g.gv.With(makeLabels(g.lvs...)).Add(delta) -} - -// Summary implements Histogram, via a Prometheus SummaryVec. The difference -// between a Summary and a Histogram is that Summaries don't require predefined -// quantile buckets, but cannot be statistically aggregated. -type Summary struct { - sv *prometheus.SummaryVec - lvs lv.LabelValues -} - -// NewSummaryFrom constructs and registers a Prometheus SummaryVec, -// and returns a usable Summary object. -func NewSummaryFrom(opts prometheus.SummaryOpts, labelNames []string) *Summary { - sv := prometheus.NewSummaryVec(opts, labelNames) - prometheus.MustRegister(sv) - return NewSummary(sv) -} - -// NewSummary wraps the SummaryVec and returns a usable Summary object. -func NewSummary(sv *prometheus.SummaryVec) *Summary { - return &Summary{ - sv: sv, - } -} - -// With implements Histogram. -func (s *Summary) With(labelValues ...string) metrics.Histogram { - return &Summary{ - sv: s.sv, - lvs: s.lvs.With(labelValues...), - } -} - -// Observe implements Histogram. -func (s *Summary) Observe(value float64) { - s.sv.With(makeLabels(s.lvs...)).Observe(value) -} - -// Histogram implements Histogram via a Prometheus HistogramVec. The difference -// between a Histogram and a Summary is that Histograms require predefined -// quantile buckets, and can be statistically aggregated. -type Histogram struct { - hv *prometheus.HistogramVec - lvs lv.LabelValues -} - -// NewHistogramFrom constructs and registers a Prometheus HistogramVec, -// and returns a usable Histogram object. -func NewHistogramFrom(opts prometheus.HistogramOpts, labelNames []string) *Histogram { - hv := prometheus.NewHistogramVec(opts, labelNames) - prometheus.MustRegister(hv) - return NewHistogram(hv) -} - -// NewHistogram wraps the HistogramVec and returns a usable Histogram object. -func NewHistogram(hv *prometheus.HistogramVec) *Histogram { - return &Histogram{ - hv: hv, - } -} - -// With implements Histogram. -func (h *Histogram) With(labelValues ...string) metrics.Histogram { - return &Histogram{ - hv: h.hv, - lvs: h.lvs.With(labelValues...), - } -} - -// Observe implements Histogram. -func (h *Histogram) Observe(value float64) { - h.hv.With(makeLabels(h.lvs...)).Observe(value) -} - -func makeLabels(labelValues ...string) prometheus.Labels { - labels := prometheus.Labels{} - for i := 0; i < len(labelValues); i += 2 { - labels[labelValues[i]] = labelValues[i+1] - } - return labels -} diff --git a/vendor/github.com/go-kit/kit/metrics/prometheus/prometheus_test.go b/vendor/github.com/go-kit/kit/metrics/prometheus/prometheus_test.go deleted file mode 100644 index 9f7bf9b1..00000000 --- a/vendor/github.com/go-kit/kit/metrics/prometheus/prometheus_test.go +++ /dev/null @@ -1,214 +0,0 @@ -package prometheus - -import ( - "io/ioutil" - "math" - "math/rand" - "net/http" - "net/http/httptest" - "reflect" - "regexp" - "strconv" - "strings" - "testing" - - stdprometheus "github.com/prometheus/client_golang/prometheus" - - "github.com/go-kit/kit/metrics/teststat" -) - -func TestCounter(t *testing.T) { - s := httptest.NewServer(stdprometheus.UninstrumentedHandler()) - defer s.Close() - - scrape := func() string { - resp, _ := http.Get(s.URL) - buf, _ := ioutil.ReadAll(resp.Body) - return string(buf) - } - - namespace, subsystem, name := "ns", "ss", "foo" - re := regexp.MustCompile(namespace + `_` + subsystem + `_` + name + `{alpha="alpha-value",beta="beta-value"} ([0-9\.]+)`) - - counter := NewCounterFrom(stdprometheus.CounterOpts{ - Namespace: namespace, - Subsystem: subsystem, - Name: name, - Help: "This is the help string.", - }, []string{"alpha", "beta"}).With("beta", "beta-value", "alpha", "alpha-value") // order shouldn't matter - - value := func() float64 { - matches := re.FindStringSubmatch(scrape()) - f, _ := strconv.ParseFloat(matches[1], 64) - return f - } - - if err := teststat.TestCounter(counter, value); err != nil { - t.Fatal(err) - } -} - -func TestGauge(t *testing.T) { - s := httptest.NewServer(stdprometheus.UninstrumentedHandler()) - defer s.Close() - - scrape := func() string { - resp, _ := http.Get(s.URL) - buf, _ := ioutil.ReadAll(resp.Body) - return string(buf) - } - - namespace, subsystem, name := "aaa", "bbb", "ccc" - re := regexp.MustCompile(namespace + `_` + subsystem + `_` + name + `{foo="bar"} ([0-9\.]+)`) - - gauge := NewGaugeFrom(stdprometheus.GaugeOpts{ - Namespace: namespace, - Subsystem: subsystem, - Name: name, - Help: "This is a different help string.", - }, []string{"foo"}).With("foo", "bar") - - value := func() float64 { - matches := re.FindStringSubmatch(scrape()) - f, _ := strconv.ParseFloat(matches[1], 64) - return f - } - - if err := teststat.TestGauge(gauge, value); err != nil { - t.Fatal(err) - } -} - -func TestSummary(t *testing.T) { - s := httptest.NewServer(stdprometheus.UninstrumentedHandler()) - defer s.Close() - - scrape := func() string { - resp, _ := http.Get(s.URL) - buf, _ := ioutil.ReadAll(resp.Body) - return string(buf) - } - - namespace, subsystem, name := "test", "prometheus", "summary" - re50 := regexp.MustCompile(namespace + `_` + subsystem + `_` + name + `{a="a",b="b",quantile="0.5"} ([0-9\.]+)`) - re90 := regexp.MustCompile(namespace + `_` + subsystem + `_` + name + `{a="a",b="b",quantile="0.9"} ([0-9\.]+)`) - re99 := regexp.MustCompile(namespace + `_` + subsystem + `_` + name + `{a="a",b="b",quantile="0.99"} ([0-9\.]+)`) - - summary := NewSummaryFrom(stdprometheus.SummaryOpts{ - Namespace: namespace, - Subsystem: subsystem, - Name: name, - Help: "This is the help string for the summary.", - }, []string{"a", "b"}).With("b", "b").With("a", "a") - - quantiles := func() (float64, float64, float64, float64) { - buf := scrape() - match50 := re50.FindStringSubmatch(buf) - p50, _ := strconv.ParseFloat(match50[1], 64) - match90 := re90.FindStringSubmatch(buf) - p90, _ := strconv.ParseFloat(match90[1], 64) - match99 := re99.FindStringSubmatch(buf) - p99, _ := strconv.ParseFloat(match99[1], 64) - p95 := p90 + ((p99 - p90) / 2) // Prometheus, y u no p95??? :< #yolo - return p50, p90, p95, p99 - } - - if err := teststat.TestHistogram(summary, quantiles, 0.01); err != nil { - t.Fatal(err) - } -} - -func TestHistogram(t *testing.T) { - // Prometheus reports histograms as a count of observations that fell into - // each predefined bucket, with the bucket value representing a global upper - // limit. That is, the count monotonically increases over the buckets. This - // requires a different strategy to test. - - s := httptest.NewServer(stdprometheus.UninstrumentedHandler()) - defer s.Close() - - scrape := func() string { - resp, _ := http.Get(s.URL) - buf, _ := ioutil.ReadAll(resp.Body) - return string(buf) - } - - namespace, subsystem, name := "test", "prometheus", "histogram" - re := regexp.MustCompile(namespace + `_` + subsystem + `_` + name + `_bucket{x="1",le="([0-9]+|\+Inf)"} ([0-9\.]+)`) - - numStdev := 3 - bucketMin := (teststat.Mean - (numStdev * teststat.Stdev)) - bucketMax := (teststat.Mean + (numStdev * teststat.Stdev)) - if bucketMin < 0 { - bucketMin = 0 - } - bucketCount := 10 - bucketDelta := (bucketMax - bucketMin) / bucketCount - buckets := []float64{} - for i := bucketMin; i <= bucketMax; i += bucketDelta { - buckets = append(buckets, float64(i)) - } - - histogram := NewHistogramFrom(stdprometheus.HistogramOpts{ - Namespace: namespace, - Subsystem: subsystem, - Name: name, - Help: "This is the help string for the histogram.", - Buckets: buckets, - }, []string{"x"}).With("x", "1") - - // Can't TestHistogram, because Prometheus Histograms don't dynamically - // compute quantiles. Instead, they fill up buckets. So, let's populate the - // histogram kind of manually. - teststat.PopulateNormalHistogram(histogram, rand.Int()) - - // Then, we use ExpectedObservationsLessThan to validate. - for _, line := range strings.Split(scrape(), "\n") { - match := re.FindStringSubmatch(line) - if match == nil { - continue - } - - bucket, _ := strconv.ParseInt(match[1], 10, 64) - have, _ := strconv.ParseInt(match[2], 10, 64) - - want := teststat.ExpectedObservationsLessThan(bucket) - if match[1] == "+Inf" { - want = int64(teststat.Count) // special case - } - - // Unfortunately, we observe experimentally that Prometheus is quite - // imprecise at the extremes. I'm setting a very high tolerance for now. - // It would be great to dig in and figure out whether that's a problem - // with my Expected calculation, or in Prometheus. - tolerance := 0.25 - if delta := math.Abs(float64(want) - float64(have)); (delta / float64(want)) > tolerance { - t.Errorf("Bucket %d: want %d, have %d (%.1f%%)", bucket, want, have, (100.0 * delta / float64(want))) - } - } -} - -func TestInconsistentLabelCardinality(t *testing.T) { - defer func() { - x := recover() - if x == nil { - t.Fatal("expected panic, got none") - } - err, ok := x.(error) - if !ok { - t.Fatalf("expected error, got %s", reflect.TypeOf(x)) - } - if want, have := "inconsistent label cardinality", err.Error(); want != have { - t.Fatalf("want %q, have %q", want, have) - } - }() - - NewCounterFrom(stdprometheus.CounterOpts{ - Namespace: "test", - Subsystem: "inconsistent_label_cardinality", - Name: "foobar", - Help: "This is the help string for the metric.", - }, []string{"a", "b"}).With( - "a", "1", "b", "2", "c", "KABOOM!", - ).Add(123) -} diff --git a/vendor/github.com/go-kit/kit/metrics/provider/discard.go b/vendor/github.com/go-kit/kit/metrics/provider/discard.go deleted file mode 100644 index f263cbbf..00000000 --- a/vendor/github.com/go-kit/kit/metrics/provider/discard.go +++ /dev/null @@ -1,24 +0,0 @@ -package provider - -import ( - "github.com/go-kit/kit/metrics" - "github.com/go-kit/kit/metrics/discard" -) - -type discardProvider struct{} - -// NewDiscardProvider returns a provider that produces no-op metrics via the -// discarding backend. -func NewDiscardProvider() Provider { return discardProvider{} } - -// NewCounter implements Provider. -func (discardProvider) NewCounter(string) metrics.Counter { return discard.NewCounter() } - -// NewGauge implements Provider. -func (discardProvider) NewGauge(string) metrics.Gauge { return discard.NewGauge() } - -// NewHistogram implements Provider. -func (discardProvider) NewHistogram(string, int) metrics.Histogram { return discard.NewHistogram() } - -// Stop implements Provider. -func (discardProvider) Stop() {} diff --git a/vendor/github.com/go-kit/kit/metrics/provider/dogstatsd.go b/vendor/github.com/go-kit/kit/metrics/provider/dogstatsd.go deleted file mode 100644 index 46336216..00000000 --- a/vendor/github.com/go-kit/kit/metrics/provider/dogstatsd.go +++ /dev/null @@ -1,43 +0,0 @@ -package provider - -import ( - "github.com/go-kit/kit/metrics" - "github.com/go-kit/kit/metrics/dogstatsd" -) - -type dogstatsdProvider struct { - d *dogstatsd.Dogstatsd - stop func() -} - -// NewDogstatsdProvider wraps the given Dogstatsd object and stop func and -// returns a Provider that produces Dogstatsd metrics. A typical stop function -// would be ticker.Stop from the ticker passed to the SendLoop helper method. -func NewDogstatsdProvider(d *dogstatsd.Dogstatsd, stop func()) Provider { - return &dogstatsdProvider{ - d: d, - stop: stop, - } -} - -// NewCounter implements Provider, returning a new Dogstatsd Counter with a -// sample rate of 1.0. -func (p *dogstatsdProvider) NewCounter(name string) metrics.Counter { - return p.d.NewCounter(name, 1.0) -} - -// NewGauge implements Provider. -func (p *dogstatsdProvider) NewGauge(name string) metrics.Gauge { - return p.d.NewGauge(name) -} - -// NewHistogram implements Provider, returning a new Dogstatsd Histogram (note: -// not a Timing) with a sample rate of 1.0. The buckets argument is ignored. -func (p *dogstatsdProvider) NewHistogram(name string, _ int) metrics.Histogram { - return p.d.NewHistogram(name, 1.0) -} - -// Stop implements Provider, invoking the stop function passed at construction. -func (p *dogstatsdProvider) Stop() { - p.stop() -} diff --git a/vendor/github.com/go-kit/kit/metrics/provider/expvar.go b/vendor/github.com/go-kit/kit/metrics/provider/expvar.go deleted file mode 100644 index cccf1790..00000000 --- a/vendor/github.com/go-kit/kit/metrics/provider/expvar.go +++ /dev/null @@ -1,31 +0,0 @@ -package provider - -import ( - "github.com/go-kit/kit/metrics" - "github.com/go-kit/kit/metrics/expvar" -) - -type expvarProvider struct{} - -// NewExpvarProvider returns a Provider that produces expvar metrics. -func NewExpvarProvider() Provider { - return expvarProvider{} -} - -// NewCounter implements Provider. -func (p expvarProvider) NewCounter(name string) metrics.Counter { - return expvar.NewCounter(name) -} - -// NewGauge implements Provider. -func (p expvarProvider) NewGauge(name string) metrics.Gauge { - return expvar.NewGauge(name) -} - -// NewHistogram implements Provider. -func (p expvarProvider) NewHistogram(name string, buckets int) metrics.Histogram { - return expvar.NewHistogram(name, buckets) -} - -// Stop implements Provider, but is a no-op. -func (p expvarProvider) Stop() {} diff --git a/vendor/github.com/go-kit/kit/metrics/provider/graphite.go b/vendor/github.com/go-kit/kit/metrics/provider/graphite.go deleted file mode 100644 index b815af1b..00000000 --- a/vendor/github.com/go-kit/kit/metrics/provider/graphite.go +++ /dev/null @@ -1,41 +0,0 @@ -package provider - -import ( - "github.com/go-kit/kit/metrics" - "github.com/go-kit/kit/metrics/graphite" -) - -type graphiteProvider struct { - g *graphite.Graphite - stop func() -} - -// NewGraphiteProvider wraps the given Graphite object and stop func and returns -// a Provider that produces Graphite metrics. A typical stop function would be -// ticker.Stop from the ticker passed to the SendLoop helper method. -func NewGraphiteProvider(g *graphite.Graphite, stop func()) Provider { - return &graphiteProvider{ - g: g, - stop: stop, - } -} - -// NewCounter implements Provider. -func (p *graphiteProvider) NewCounter(name string) metrics.Counter { - return p.g.NewCounter(name) -} - -// NewGauge implements Provider. -func (p *graphiteProvider) NewGauge(name string) metrics.Gauge { - return p.g.NewGauge(name) -} - -// NewHistogram implements Provider. -func (p *graphiteProvider) NewHistogram(name string, buckets int) metrics.Histogram { - return p.g.NewHistogram(name, buckets) -} - -// Stop implements Provider, invoking the stop function passed at construction. -func (p *graphiteProvider) Stop() { - p.stop() -} diff --git a/vendor/github.com/go-kit/kit/metrics/provider/influx.go b/vendor/github.com/go-kit/kit/metrics/provider/influx.go deleted file mode 100644 index 4fd4106d..00000000 --- a/vendor/github.com/go-kit/kit/metrics/provider/influx.go +++ /dev/null @@ -1,40 +0,0 @@ -package provider - -import ( - "github.com/go-kit/kit/metrics" - "github.com/go-kit/kit/metrics/influx" -) - -type influxProvider struct { - in *influx.Influx - stop func() -} - -// NewInfluxProvider takes the given Influx object and stop func, and returns -// a Provider that produces Influx metrics. -func NewInfluxProvider(in *influx.Influx, stop func()) Provider { - return &influxProvider{ - in: in, - stop: stop, - } -} - -// NewCounter implements Provider. Per-metric tags are not supported. -func (p *influxProvider) NewCounter(name string) metrics.Counter { - return p.in.NewCounter(name) -} - -// NewGauge implements Provider. Per-metric tags are not supported. -func (p *influxProvider) NewGauge(name string) metrics.Gauge { - return p.in.NewGauge(name) -} - -// NewHistogram implements Provider. Per-metric tags are not supported. -func (p *influxProvider) NewHistogram(name string, buckets int) metrics.Histogram { - return p.in.NewHistogram(name) -} - -// Stop implements Provider, invoking the stop function passed at construction. -func (p *influxProvider) Stop() { - p.stop() -} diff --git a/vendor/github.com/go-kit/kit/metrics/provider/prometheus.go b/vendor/github.com/go-kit/kit/metrics/provider/prometheus.go deleted file mode 100644 index 48853b0c..00000000 --- a/vendor/github.com/go-kit/kit/metrics/provider/prometheus.go +++ /dev/null @@ -1,63 +0,0 @@ -package provider - -import ( - stdprometheus "github.com/prometheus/client_golang/prometheus" - - "github.com/go-kit/kit/metrics" - "github.com/go-kit/kit/metrics/prometheus" -) - -type prometheusProvider struct { - namespace string - subsystem string -} - -// NewPrometheusProvider returns a Provider that produces Prometheus metrics. -// Namespace and subsystem are applied to all produced metrics. -func NewPrometheusProvider(namespace, subsystem string) Provider { - return &prometheusProvider{ - namespace: namespace, - subsystem: subsystem, - } -} - -// NewCounter implements Provider via prometheus.NewCounterFrom, i.e. the -// counter is registered. The metric's namespace and subsystem are taken from -// the Provider. Help is set to the name of the metric, and no const label names -// are set. -func (p *prometheusProvider) NewCounter(name string) metrics.Counter { - return prometheus.NewCounterFrom(stdprometheus.CounterOpts{ - Namespace: p.namespace, - Subsystem: p.subsystem, - Name: name, - Help: name, - }, []string{}) -} - -// NewGauge implements Provider via prometheus.NewGaugeFrom, i.e. the gauge is -// registered. The metric's namespace and subsystem are taken from the Provider. -// Help is set to the name of the metric, and no const label names are set. -func (p *prometheusProvider) NewGauge(name string) metrics.Gauge { - return prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ - Namespace: p.namespace, - Subsystem: p.subsystem, - Name: name, - Help: name, - }, []string{}) -} - -// NewGauge implements Provider via prometheus.NewSummaryFrom, i.e. the summary -// is registered. The metric's namespace and subsystem are taken from the -// Provider. Help is set to the name of the metric, and no const label names are -// set. Buckets are ignored. -func (p *prometheusProvider) NewHistogram(name string, _ int) metrics.Histogram { - return prometheus.NewSummaryFrom(stdprometheus.SummaryOpts{ - Namespace: p.namespace, - Subsystem: p.subsystem, - Name: name, - Help: name, - }, []string{}) -} - -// Stop implements Provider, but is a no-op. -func (p *prometheusProvider) Stop() {} diff --git a/vendor/github.com/go-kit/kit/metrics/provider/provider.go b/vendor/github.com/go-kit/kit/metrics/provider/provider.go deleted file mode 100644 index d35d66aa..00000000 --- a/vendor/github.com/go-kit/kit/metrics/provider/provider.go +++ /dev/null @@ -1,42 +0,0 @@ -// Package provider provides a factory-like abstraction for metrics backends. -// This package is provided specifically for the needs of the NY Times framework -// Gizmo. Most normal Go kit users shouldn't need to use it. -// -// Normally, if your microservice needs to support different metrics backends, -// you can simply do different construction based on a flag. For example, -// -// var latency metrics.Histogram -// var requests metrics.Counter -// switch *metricsBackend { -// case "prometheus": -// latency = prometheus.NewSummaryVec(...) -// requests = prometheus.NewCounterVec(...) -// case "statsd": -// s := statsd.New(...) -// t := time.NewTicker(5*time.Second) -// go s.SendLoop(t.C, "tcp", "statsd.local:8125") -// latency = s.NewHistogram(...) -// requests = s.NewCounter(...) -// default: -// log.Fatal("unsupported metrics backend %q", *metricsBackend) -// } -// -package provider - -import ( - "github.com/go-kit/kit/metrics" -) - -// Provider abstracts over constructors and lifecycle management functions for -// each supported metrics backend. It should only be used by those who need to -// swap out implementations dynamically. -// -// This is primarily useful for intermediating frameworks, and is likely -// unnecessary for most Go kit services. See the package-level doc comment for -// more typical usage instructions. -type Provider interface { - NewCounter(name string) metrics.Counter - NewGauge(name string) metrics.Gauge - NewHistogram(name string, buckets int) metrics.Histogram - Stop() -} diff --git a/vendor/github.com/go-kit/kit/metrics/provider/statsd.go b/vendor/github.com/go-kit/kit/metrics/provider/statsd.go deleted file mode 100644 index 176bd14e..00000000 --- a/vendor/github.com/go-kit/kit/metrics/provider/statsd.go +++ /dev/null @@ -1,43 +0,0 @@ -package provider - -import ( - "github.com/go-kit/kit/metrics" - "github.com/go-kit/kit/metrics/statsd" -) - -type statsdProvider struct { - s *statsd.Statsd - stop func() -} - -// NewStatsdProvider wraps the given Statsd object and stop func and returns a -// Provider that produces Statsd metrics. A typical stop function would be -// ticker.Stop from the ticker passed to the SendLoop helper method. -func NewStatsdProvider(s *statsd.Statsd, stop func()) Provider { - return &statsdProvider{ - s: s, - stop: stop, - } -} - -// NewCounter implements Provider. -func (p *statsdProvider) NewCounter(name string) metrics.Counter { - return p.s.NewCounter(name, 1.0) -} - -// NewGauge implements Provider. -func (p *statsdProvider) NewGauge(name string) metrics.Gauge { - return p.s.NewGauge(name) -} - -// NewHistogram implements Provider, returning a StatsD Timing that accepts -// observations in milliseconds. The sample rate is fixed at 1.0. The bucket -// parameter is ignored. -func (p *statsdProvider) NewHistogram(name string, _ int) metrics.Histogram { - return p.s.NewTiming(name, 1.0) -} - -// Stop implements Provider, invoking the stop function passed at construction. -func (p *statsdProvider) Stop() { - p.stop() -} diff --git a/vendor/github.com/go-kit/kit/metrics/statsd/statsd.go b/vendor/github.com/go-kit/kit/metrics/statsd/statsd.go deleted file mode 100644 index 8dfbf6fd..00000000 --- a/vendor/github.com/go-kit/kit/metrics/statsd/statsd.go +++ /dev/null @@ -1,239 +0,0 @@ -// Package statsd provides a StatsD backend for package metrics. StatsD has no -// concept of arbitrary key-value tagging, so label values are not supported, -// and With is a no-op on all metrics. -// -// This package batches observations and emits them on some schedule to the -// remote server. This is useful even if you connect to your StatsD server over -// UDP. Emitting one network packet per observation can quickly overwhelm even -// the fastest internal network. -package statsd - -import ( - "fmt" - "io" - "time" - - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/metrics" - "github.com/go-kit/kit/metrics/internal/lv" - "github.com/go-kit/kit/metrics/internal/ratemap" - "github.com/go-kit/kit/util/conn" -) - -// Statsd receives metrics observations and forwards them to a StatsD server. -// Create a Statsd object, use it to create metrics, and pass those metrics as -// dependencies to the components that will use them. -// -// All metrics are buffered until WriteTo is called. Counters and gauges are -// aggregated into a single observation per timeseries per write. Timings are -// buffered but not aggregated. -// -// To regularly report metrics to an io.Writer, use the WriteLoop helper method. -// To send to a StatsD server, use the SendLoop helper method. -type Statsd struct { - prefix string - rates *ratemap.RateMap - - // The observations are collected in an N-dimensional vector space, even - // though they only take advantage of a single dimension (name). This is an - // implementation detail born purely from convenience. It would be more - // accurate to collect them in a map[string][]float64, but we already have - // this nice data structure and helper methods. - counters *lv.Space - gauges *lv.Space - timings *lv.Space - - logger log.Logger -} - -// New returns a Statsd object that may be used to create metrics. Prefix is -// applied to all created metrics. Callers must ensure that regular calls to -// WriteTo are performed, either manually or with one of the helper methods. -func New(prefix string, logger log.Logger) *Statsd { - return &Statsd{ - prefix: prefix, - rates: ratemap.New(), - counters: lv.NewSpace(), - gauges: lv.NewSpace(), - timings: lv.NewSpace(), - logger: logger, - } -} - -// NewCounter returns a counter, sending observations to this Statsd object. -func (s *Statsd) NewCounter(name string, sampleRate float64) *Counter { - s.rates.Set(s.prefix+name, sampleRate) - return &Counter{ - name: s.prefix + name, - obs: s.counters.Observe, - } -} - -// NewGauge returns a gauge, sending observations to this Statsd object. -func (s *Statsd) NewGauge(name string) *Gauge { - return &Gauge{ - name: s.prefix + name, - obs: s.gauges.Observe, - add: s.gauges.Add, - } -} - -// NewTiming returns a histogram whose observations are interpreted as -// millisecond durations, and are forwarded to this Statsd object. -func (s *Statsd) NewTiming(name string, sampleRate float64) *Timing { - s.rates.Set(s.prefix+name, sampleRate) - return &Timing{ - name: s.prefix + name, - obs: s.timings.Observe, - } -} - -// WriteLoop is a helper method that invokes WriteTo to the passed writer every -// time the passed channel fires. This method blocks until the channel is -// closed, so clients probably want to run it in its own goroutine. For typical -// usage, create a time.Ticker and pass its C channel to this method. -func (s *Statsd) WriteLoop(c <-chan time.Time, w io.Writer) { - for range c { - if _, err := s.WriteTo(w); err != nil { - s.logger.Log("during", "WriteTo", "err", err) - } - } -} - -// SendLoop is a helper method that wraps WriteLoop, passing a managed -// connection to the network and address. Like WriteLoop, this method blocks -// until the channel is closed, so clients probably want to start it in its own -// goroutine. For typical usage, create a time.Ticker and pass its C channel to -// this method. -func (s *Statsd) SendLoop(c <-chan time.Time, network, address string) { - s.WriteLoop(c, conn.NewDefaultManager(network, address, s.logger)) -} - -// WriteTo flushes the buffered content of the metrics to the writer, in -// StatsD format. WriteTo abides best-effort semantics, so observations are -// lost if there is a problem with the write. Clients should be sure to call -// WriteTo regularly, ideally through the WriteLoop or SendLoop helper methods. -func (s *Statsd) WriteTo(w io.Writer) (count int64, err error) { - var n int - - s.counters.Reset().Walk(func(name string, _ lv.LabelValues, values []float64) bool { - n, err = fmt.Fprintf(w, "%s:%f|c%s\n", name, sum(values), sampling(s.rates.Get(name))) - if err != nil { - return false - } - count += int64(n) - return true - }) - if err != nil { - return count, err - } - - s.gauges.Reset().Walk(func(name string, _ lv.LabelValues, values []float64) bool { - n, err = fmt.Fprintf(w, "%s:%f|g\n", name, last(values)) - if err != nil { - return false - } - count += int64(n) - return true - }) - if err != nil { - return count, err - } - - s.timings.Reset().Walk(func(name string, _ lv.LabelValues, values []float64) bool { - sampleRate := s.rates.Get(name) - for _, value := range values { - n, err = fmt.Fprintf(w, "%s:%f|ms%s\n", name, value, sampling(sampleRate)) - if err != nil { - return false - } - count += int64(n) - } - return true - }) - if err != nil { - return count, err - } - - return count, err -} - -func sum(a []float64) float64 { - var v float64 - for _, f := range a { - v += f - } - return v -} - -func last(a []float64) float64 { - return a[len(a)-1] -} - -func sampling(r float64) string { - var sv string - if r < 1.0 { - sv = fmt.Sprintf("|@%f", r) - } - return sv -} - -type observeFunc func(name string, lvs lv.LabelValues, value float64) - -// Counter is a StatsD counter. Observations are forwarded to a Statsd object, -// and aggregated (summed) per timeseries. -type Counter struct { - name string - obs observeFunc -} - -// With is a no-op. -func (c *Counter) With(...string) metrics.Counter { - return c -} - -// Add implements metrics.Counter. -func (c *Counter) Add(delta float64) { - c.obs(c.name, lv.LabelValues{}, delta) -} - -// Gauge is a StatsD gauge. Observations are forwarded to a Statsd object, and -// aggregated (the last observation selected) per timeseries. -type Gauge struct { - name string - obs observeFunc - add observeFunc -} - -// With is a no-op. -func (g *Gauge) With(...string) metrics.Gauge { - return g -} - -// Set implements metrics.Gauge. -func (g *Gauge) Set(value float64) { - g.obs(g.name, lv.LabelValues{}, value) -} - -// Add implements metrics.Gauge. -func (g *Gauge) Add(delta float64) { - g.add(g.name, lv.LabelValues{}, delta) -} - -// Timing is a StatsD timing, or metrics.Histogram. Observations are -// forwarded to a Statsd object, and collected (but not aggregated) per -// timeseries. -type Timing struct { - name string - obs observeFunc -} - -// With is a no-op. -func (t *Timing) With(...string) metrics.Histogram { - return t -} - -// Observe implements metrics.Histogram. Value is interpreted as milliseconds. -func (t *Timing) Observe(value float64) { - t.obs(t.name, lv.LabelValues{}, value) -} diff --git a/vendor/github.com/go-kit/kit/metrics/statsd/statsd_test.go b/vendor/github.com/go-kit/kit/metrics/statsd/statsd_test.go deleted file mode 100644 index c82c8130..00000000 --- a/vendor/github.com/go-kit/kit/metrics/statsd/statsd_test.go +++ /dev/null @@ -1,66 +0,0 @@ -package statsd - -import ( - "testing" - - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/metrics/teststat" -) - -func TestCounter(t *testing.T) { - prefix, name := "abc.", "def" - label, value := "label", "value" // ignored - regex := `^` + prefix + name + `:([0-9\.]+)\|c$` - s := New(prefix, log.NewNopLogger()) - counter := s.NewCounter(name, 1.0).With(label, value) - valuef := teststat.SumLines(s, regex) - if err := teststat.TestCounter(counter, valuef); err != nil { - t.Fatal(err) - } -} - -func TestCounterSampled(t *testing.T) { - // This will involve multiplying the observed sum by the inverse of the - // sample rate and checking against the expected value within some - // tolerance. - t.Skip("TODO") -} - -func TestGauge(t *testing.T) { - prefix, name := "ghi.", "jkl" - label, value := "xyz", "abc" // ignored - regex := `^` + prefix + name + `:([0-9\.]+)\|g$` - s := New(prefix, log.NewNopLogger()) - gauge := s.NewGauge(name).With(label, value) - valuef := teststat.LastLine(s, regex) - if err := teststat.TestGauge(gauge, valuef); err != nil { - t.Fatal(err) - } -} - -// StatsD timings just emit all observations. So, we collect them into a generic -// histogram, and run the statistics test on that. - -func TestTiming(t *testing.T) { - prefix, name := "statsd.", "timing_test" - label, value := "abc", "def" // ignored - regex := `^` + prefix + name + `:([0-9\.]+)\|ms$` - s := New(prefix, log.NewNopLogger()) - timing := s.NewTiming(name, 1.0).With(label, value) - quantiles := teststat.Quantiles(s, regex, 50) // no |@0.X - if err := teststat.TestHistogram(timing, quantiles, 0.01); err != nil { - t.Fatal(err) - } -} - -func TestTimingSampled(t *testing.T) { - prefix, name := "statsd.", "sampled_timing_test" - label, value := "foo", "bar" // ignored - regex := `^` + prefix + name + `:([0-9\.]+)\|ms\|@0\.01[0]*$` - s := New(prefix, log.NewNopLogger()) - timing := s.NewTiming(name, 0.01).With(label, value) - quantiles := teststat.Quantiles(s, regex, 50) - if err := teststat.TestHistogram(timing, quantiles, 0.02); err != nil { - t.Fatal(err) - } -} diff --git a/vendor/github.com/go-kit/kit/metrics/teststat/buffers.go b/vendor/github.com/go-kit/kit/metrics/teststat/buffers.go deleted file mode 100644 index e38b16c2..00000000 --- a/vendor/github.com/go-kit/kit/metrics/teststat/buffers.go +++ /dev/null @@ -1,65 +0,0 @@ -package teststat - -import ( - "bufio" - "bytes" - "io" - "regexp" - "strconv" - - "github.com/go-kit/kit/metrics/generic" -) - -// SumLines expects a regex whose first capture group can be parsed as a -// float64. It will dump the WriterTo and parse each line, expecting to find a -// match. It returns the sum of all captured floats. -func SumLines(w io.WriterTo, regex string) func() float64 { - return func() float64 { - sum, _ := stats(w, regex, nil) - return sum - } -} - -// LastLine expects a regex whose first capture group can be parsed as a -// float64. It will dump the WriterTo and parse each line, expecting to find a -// match. It returns the final captured float. -func LastLine(w io.WriterTo, regex string) func() float64 { - return func() float64 { - _, final := stats(w, regex, nil) - return final - } -} - -// Quantiles expects a regex whose first capture group can be parsed as a -// float64. It will dump the WriterTo and parse each line, expecting to find a -// match. It observes all captured floats into a generic.Histogram with the -// given number of buckets, and returns the 50th, 90th, 95th, and 99th quantiles -// from that histogram. -func Quantiles(w io.WriterTo, regex string, buckets int) func() (float64, float64, float64, float64) { - return func() (float64, float64, float64, float64) { - h := generic.NewHistogram("quantile-test", buckets) - stats(w, regex, h) - return h.Quantile(0.50), h.Quantile(0.90), h.Quantile(0.95), h.Quantile(0.99) - } -} - -func stats(w io.WriterTo, regex string, h *generic.Histogram) (sum, final float64) { - re := regexp.MustCompile(regex) - buf := &bytes.Buffer{} - w.WriteTo(buf) - //fmt.Fprintf(os.Stderr, "%s\n", buf.String()) - s := bufio.NewScanner(buf) - for s.Scan() { - match := re.FindStringSubmatch(s.Text()) - f, err := strconv.ParseFloat(match[1], 64) - if err != nil { - panic(err) - } - sum += f - final = f - if h != nil { - h.Observe(f) - } - } - return sum, final -} diff --git a/vendor/github.com/go-kit/kit/metrics/teststat/populate.go b/vendor/github.com/go-kit/kit/metrics/teststat/populate.go deleted file mode 100644 index 568a5691..00000000 --- a/vendor/github.com/go-kit/kit/metrics/teststat/populate.go +++ /dev/null @@ -1,72 +0,0 @@ -package teststat - -import ( - "math" - "math/rand" - - "github.com/go-kit/kit/metrics" -) - -// PopulateNormalHistogram makes a series of normal random observations into the -// histogram. The number of observations is determined by Count. The randomness -// is determined by Mean, Stdev, and the seed parameter. -// -// This is a low-level function, exported only for metrics that don't perform -// dynamic quantile computation, like a Prometheus Histogram (c.f. Summary). In -// most cases, you don't need to use this function, and can use TestHistogram -// instead. -func PopulateNormalHistogram(h metrics.Histogram, seed int) { - r := rand.New(rand.NewSource(int64(seed))) - for i := 0; i < Count; i++ { - sample := r.NormFloat64()*float64(Stdev) + float64(Mean) - if sample < 0 { - sample = 0 - } - h.Observe(sample) - } -} - -func normalQuantiles() (p50, p90, p95, p99 float64) { - return nvq(50), nvq(90), nvq(95), nvq(99) -} - -func nvq(quantile int) float64 { - // https://en.wikipedia.org/wiki/Normal_distribution#Quantile_function - return float64(Mean) + float64(Stdev)*math.Sqrt2*erfinv(2*(float64(quantile)/100)-1) -} - -func erfinv(y float64) float64 { - // https://stackoverflow.com/questions/5971830/need-code-for-inverse-error-function - if y < -1.0 || y > 1.0 { - panic("invalid input") - } - - var ( - a = [4]float64{0.886226899, -1.645349621, 0.914624893, -0.140543331} - b = [4]float64{-2.118377725, 1.442710462, -0.329097515, 0.012229801} - c = [4]float64{-1.970840454, -1.624906493, 3.429567803, 1.641345311} - d = [2]float64{3.543889200, 1.637067800} - ) - - const y0 = 0.7 - var x, z float64 - - if math.Abs(y) == 1.0 { - x = -y * math.Log(0.0) - } else if y < -y0 { - z = math.Sqrt(-math.Log((1.0 + y) / 2.0)) - x = -(((c[3]*z+c[2])*z+c[1])*z + c[0]) / ((d[1]*z+d[0])*z + 1.0) - } else { - if y < y0 { - z = y * y - x = y * (((a[3]*z+a[2])*z+a[1])*z + a[0]) / ((((b[3]*z+b[3])*z+b[1])*z+b[0])*z + 1.0) - } else { - z = math.Sqrt(-math.Log((1.0 - y) / 2.0)) - x = (((c[3]*z+c[2])*z+c[1])*z + c[0]) / ((d[1]*z+d[0])*z + 1.0) - } - x = x - (math.Erf(x)-y)/(2.0/math.SqrtPi*math.Exp(-x*x)) - x = x - (math.Erf(x)-y)/(2.0/math.SqrtPi*math.Exp(-x*x)) - } - - return x -} diff --git a/vendor/github.com/go-kit/kit/metrics/teststat/teststat.go b/vendor/github.com/go-kit/kit/metrics/teststat/teststat.go deleted file mode 100644 index 74019f5b..00000000 --- a/vendor/github.com/go-kit/kit/metrics/teststat/teststat.go +++ /dev/null @@ -1,119 +0,0 @@ -// Package teststat provides helpers for testing metrics backends. -package teststat - -import ( - "errors" - "fmt" - "math" - "math/rand" - "strings" - - "github.com/go-kit/kit/metrics" -) - -// TestCounter puts some deltas through the counter, and then calls the value -// func to check that the counter has the correct final value. -func TestCounter(counter metrics.Counter, value func() float64) error { - want := FillCounter(counter) - if have := value(); want != have { - return fmt.Errorf("want %f, have %f", want, have) - } - - return nil -} - -// FillCounter puts some deltas through the counter and returns the total value. -func FillCounter(counter metrics.Counter) float64 { - a := rand.Perm(100) - n := rand.Intn(len(a)) - - var want float64 - for i := 0; i < n; i++ { - f := float64(a[i]) - counter.Add(f) - want += f - } - return want -} - -// TestGauge puts some values through the gauge, and then calls the value func -// to check that the gauge has the correct final value. -func TestGauge(gauge metrics.Gauge, value func() float64) error { - a := rand.Perm(100) - n := rand.Intn(len(a)) - - var want float64 - for i := 0; i < n; i++ { - f := float64(a[i]) - gauge.Set(f) - want = f - } - - for i := 0; i < n; i++ { - f := float64(a[i]) - gauge.Add(f) - want += f - } - - if have := value(); want != have { - return fmt.Errorf("want %f, have %f", want, have) - } - - return nil -} - -// TestHistogram puts some observations through the histogram, and then calls -// the quantiles func to checks that the histogram has computed the correct -// quantiles within some tolerance -func TestHistogram(histogram metrics.Histogram, quantiles func() (p50, p90, p95, p99 float64), tolerance float64) error { - PopulateNormalHistogram(histogram, rand.Int()) - - want50, want90, want95, want99 := normalQuantiles() - have50, have90, have95, have99 := quantiles() - - var errs []string - if want, have := want50, have50; !cmp(want, have, tolerance) { - errs = append(errs, fmt.Sprintf("p50: want %f, have %f", want, have)) - } - if want, have := want90, have90; !cmp(want, have, tolerance) { - errs = append(errs, fmt.Sprintf("p90: want %f, have %f", want, have)) - } - if want, have := want95, have95; !cmp(want, have, tolerance) { - errs = append(errs, fmt.Sprintf("p95: want %f, have %f", want, have)) - } - if want, have := want99, have99; !cmp(want, have, tolerance) { - errs = append(errs, fmt.Sprintf("p99: want %f, have %f", want, have)) - } - if len(errs) > 0 { - return errors.New(strings.Join(errs, "; ")) - } - - return nil -} - -var ( - // Count is the number of observations. - Count = 12345 - - // Mean is the center of the normal distribution of observations. - Mean = 500 - - // Stdev of the normal distribution of observations. - Stdev = 25 -) - -// ExpectedObservationsLessThan returns the number of observations that should -// have a value less than or equal to the given value, given a normal -// distribution of observations described by Count, Mean, and Stdev. -func ExpectedObservationsLessThan(bucket int64) int64 { - // https://code.google.com/p/gostat/source/browse/stat/normal.go - cdf := ((1.0 / 2.0) * (1 + math.Erf((float64(bucket)-float64(Mean))/(float64(Stdev)*math.Sqrt2)))) - return int64(cdf * float64(Count)) -} - -func cmp(want, have, tol float64) bool { - if (math.Abs(want-have) / want) > tol { - return false - } - return true -} diff --git a/vendor/github.com/go-kit/kit/metrics/timer.go b/vendor/github.com/go-kit/kit/metrics/timer.go deleted file mode 100644 index e12d9cd5..00000000 --- a/vendor/github.com/go-kit/kit/metrics/timer.go +++ /dev/null @@ -1,36 +0,0 @@ -package metrics - -import "time" - -// Timer acts as a stopwatch, sending observations to a wrapped histogram. -// It's a bit of helpful syntax sugar for h.Observe(time.Since(x)). -type Timer struct { - h Histogram - t time.Time - u time.Duration -} - -// NewTimer wraps the given histogram and records the current time. -func NewTimer(h Histogram) *Timer { - return &Timer{ - h: h, - t: time.Now(), - u: time.Second, - } -} - -// ObserveDuration captures the number of seconds since the timer was -// constructed, and forwards that observation to the histogram. -func (t *Timer) ObserveDuration() { - d := float64(time.Since(t.t).Nanoseconds()) / float64(t.u) - if d < 0 { - d = 0 - } - t.h.Observe(d) -} - -// Unit sets the unit of the float64 emitted by the timer. -// By default, the timer emits seconds. -func (t *Timer) Unit(u time.Duration) { - t.u = u -} diff --git a/vendor/github.com/go-kit/kit/metrics/timer_test.go b/vendor/github.com/go-kit/kit/metrics/timer_test.go deleted file mode 100644 index 2743e99b..00000000 --- a/vendor/github.com/go-kit/kit/metrics/timer_test.go +++ /dev/null @@ -1,58 +0,0 @@ -package metrics_test - -import ( - "math" - "testing" - - "time" - - "github.com/go-kit/kit/metrics" - "github.com/go-kit/kit/metrics/generic" -) - -func TestTimerFast(t *testing.T) { - h := generic.NewSimpleHistogram() - metrics.NewTimer(h).ObserveDuration() - - tolerance := 0.050 - if want, have := 0.000, h.ApproximateMovingAverage(); math.Abs(want-have) > tolerance { - t.Errorf("want %.3f, have %.3f", want, have) - } -} - -func TestTimerSlow(t *testing.T) { - h := generic.NewSimpleHistogram() - timer := metrics.NewTimer(h) - time.Sleep(250 * time.Millisecond) - timer.ObserveDuration() - - tolerance := 0.050 - if want, have := 0.250, h.ApproximateMovingAverage(); math.Abs(want-have) > tolerance { - t.Errorf("want %.3f, have %.3f", want, have) - } -} - -func TestTimerUnit(t *testing.T) { - for _, tc := range []struct { - name string - unit time.Duration - tolerance float64 - want float64 - }{ - {"Seconds", time.Second, 0.010, 0.100}, - {"Milliseconds", time.Millisecond, 10, 100}, - {"Nanoseconds", time.Nanosecond, 10000000, 100000000}, - } { - t.Run(tc.name, func(t *testing.T) { - h := generic.NewSimpleHistogram() - timer := metrics.NewTimer(h) - time.Sleep(100 * time.Millisecond) - timer.Unit(tc.unit) - timer.ObserveDuration() - - if want, have := tc.want, h.ApproximateMovingAverage(); math.Abs(want-have) > tc.tolerance { - t.Errorf("want %.3f, have %.3f", want, have) - } - }) - } -} diff --git a/vendor/github.com/go-kit/kit/ratelimit/token_bucket.go b/vendor/github.com/go-kit/kit/ratelimit/token_bucket.go deleted file mode 100644 index e8a6de6f..00000000 --- a/vendor/github.com/go-kit/kit/ratelimit/token_bucket.go +++ /dev/null @@ -1,72 +0,0 @@ -package ratelimit - -import ( - "context" - "errors" - - "github.com/go-kit/kit/endpoint" -) - -// ErrLimited is returned in the request path when the rate limiter is -// triggered and the request is rejected. -var ErrLimited = errors.New("rate limit exceeded") - -// Allower dictates whether or not a request is acceptable to run. -// The Limiter from "golang.org/x/time/rate" already implements this interface, -// one is able to use that in NewErroringLimiter without any modifications. -type Allower interface { - Allow() bool -} - -// NewErroringLimiter returns an endpoint.Middleware that acts as a rate -// limiter. Requests that would exceed the -// maximum request rate are simply rejected with an error. -func NewErroringLimiter(limit Allower) endpoint.Middleware { - return func(next endpoint.Endpoint) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - if !limit.Allow() { - return nil, ErrLimited - } - return next(ctx, request) - } - } -} - -// Waiter dictates how long a request must be delayed. -// The Limiter from "golang.org/x/time/rate" already implements this interface, -// one is able to use that in NewDelayingLimiter without any modifications. -type Waiter interface { - Wait(ctx context.Context) error -} - -// NewDelayingLimiter returns an endpoint.Middleware that acts as a -// request throttler. Requests that would -// exceed the maximum request rate are delayed via the Waiter function -func NewDelayingLimiter(limit Waiter) endpoint.Middleware { - return func(next endpoint.Endpoint) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - if err := limit.Wait(ctx); err != nil { - return nil, err - } - return next(ctx, request) - } - } -} - -// AllowerFunc is an adapter that lets a function operate as if -// it implements Allower -type AllowerFunc func() bool - -// Allow makes the adapter implement Allower -func (f AllowerFunc) Allow() bool { - return f() -} - -// WaiterFunc is an adapter that lets a function operate as if -// it implements Waiter -type WaiterFunc func(ctx context.Context) error - -// Wait makes the adapter implement Waiter -func (f WaiterFunc) Wait(ctx context.Context) error { - return f(ctx) -} diff --git a/vendor/github.com/go-kit/kit/ratelimit/token_bucket_test.go b/vendor/github.com/go-kit/kit/ratelimit/token_bucket_test.go deleted file mode 100644 index 3845c9ee..00000000 --- a/vendor/github.com/go-kit/kit/ratelimit/token_bucket_test.go +++ /dev/null @@ -1,46 +0,0 @@ -package ratelimit_test - -import ( - "context" - "strings" - "testing" - "time" - - "golang.org/x/time/rate" - - "github.com/go-kit/kit/endpoint" - "github.com/go-kit/kit/ratelimit" -) - -var nopEndpoint = func(context.Context, interface{}) (interface{}, error) { return struct{}{}, nil } - -func TestXRateErroring(t *testing.T) { - limit := rate.NewLimiter(rate.Every(time.Minute), 1) - testSuccessThenFailure( - t, - ratelimit.NewErroringLimiter(limit)(nopEndpoint), - ratelimit.ErrLimited.Error()) -} - -func TestXRateDelaying(t *testing.T) { - limit := rate.NewLimiter(rate.Every(time.Minute), 1) - testSuccessThenFailure( - t, - ratelimit.NewDelayingLimiter(limit)(nopEndpoint), - "exceed context deadline") -} - -func testSuccessThenFailure(t *testing.T, e endpoint.Endpoint, failContains string) { - ctx, cxl := context.WithTimeout(context.Background(), 500*time.Millisecond) - defer cxl() - - // First request should succeed. - if _, err := e(ctx, struct{}{}); err != nil { - t.Errorf("unexpected: %v\n", err) - } - - // Next request should fail. - if _, err := e(ctx, struct{}{}); !strings.Contains(err.Error(), failContains) { - t.Errorf("expected `%s`: %v\n", failContains, err) - } -} diff --git a/vendor/github.com/go-kit/kit/sd/benchmark_test.go b/vendor/github.com/go-kit/kit/sd/benchmark_test.go deleted file mode 100644 index b548e1aa..00000000 --- a/vendor/github.com/go-kit/kit/sd/benchmark_test.go +++ /dev/null @@ -1,29 +0,0 @@ -package sd - -import ( - "io" - "testing" - - "github.com/go-kit/kit/endpoint" - "github.com/go-kit/kit/log" -) - -func BenchmarkEndpoints(b *testing.B) { - var ( - ca = make(closer) - cb = make(closer) - cmap = map[string]io.Closer{"a": ca, "b": cb} - factory = func(instance string) (endpoint.Endpoint, io.Closer, error) { return endpoint.Nop, cmap[instance], nil } - c = newEndpointCache(factory, log.NewNopLogger(), endpointerOptions{}) - ) - - b.ReportAllocs() - - c.Update(Event{Instances: []string{"a", "b"}}) - - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - c.Endpoints() - } - }) -} diff --git a/vendor/github.com/go-kit/kit/sd/consul/client.go b/vendor/github.com/go-kit/kit/sd/consul/client.go deleted file mode 100644 index fd109aa5..00000000 --- a/vendor/github.com/go-kit/kit/sd/consul/client.go +++ /dev/null @@ -1,39 +0,0 @@ -package consul - -import ( - consul "github.com/hashicorp/consul/api" -) - -// Client is a wrapper around the Consul API. -type Client interface { - // Register a service with the local agent. - Register(r *consul.AgentServiceRegistration) error - - // Deregister a service with the local agent. - Deregister(r *consul.AgentServiceRegistration) error - - // Service - Service(service, tag string, passingOnly bool, queryOpts *consul.QueryOptions) ([]*consul.ServiceEntry, *consul.QueryMeta, error) -} - -type client struct { - consul *consul.Client -} - -// NewClient returns an implementation of the Client interface, wrapping a -// concrete Consul client. -func NewClient(c *consul.Client) Client { - return &client{consul: c} -} - -func (c *client) Register(r *consul.AgentServiceRegistration) error { - return c.consul.Agent().ServiceRegister(r) -} - -func (c *client) Deregister(r *consul.AgentServiceRegistration) error { - return c.consul.Agent().ServiceDeregister(r.ID) -} - -func (c *client) Service(service, tag string, passingOnly bool, queryOpts *consul.QueryOptions) ([]*consul.ServiceEntry, *consul.QueryMeta, error) { - return c.consul.Health().Service(service, tag, passingOnly, queryOpts) -} diff --git a/vendor/github.com/go-kit/kit/sd/consul/client_test.go b/vendor/github.com/go-kit/kit/sd/consul/client_test.go deleted file mode 100644 index bc988b3e..00000000 --- a/vendor/github.com/go-kit/kit/sd/consul/client_test.go +++ /dev/null @@ -1,156 +0,0 @@ -package consul - -import ( - "context" - "errors" - "io" - "reflect" - "testing" - - stdconsul "github.com/hashicorp/consul/api" - - "github.com/go-kit/kit/endpoint" -) - -func TestClientRegistration(t *testing.T) { - c := newTestClient(nil) - - services, _, err := c.Service(testRegistration.Name, "", true, &stdconsul.QueryOptions{}) - if err != nil { - t.Error(err) - } - if want, have := 0, len(services); want != have { - t.Errorf("want %d, have %d", want, have) - } - - if err := c.Register(testRegistration); err != nil { - t.Error(err) - } - - if err := c.Register(testRegistration); err == nil { - t.Errorf("want error, have %v", err) - } - - services, _, err = c.Service(testRegistration.Name, "", true, &stdconsul.QueryOptions{}) - if err != nil { - t.Error(err) - } - if want, have := 1, len(services); want != have { - t.Errorf("want %d, have %d", want, have) - } - - if err := c.Deregister(testRegistration); err != nil { - t.Error(err) - } - - if err := c.Deregister(testRegistration); err == nil { - t.Errorf("want error, have %v", err) - } - - services, _, err = c.Service(testRegistration.Name, "", true, &stdconsul.QueryOptions{}) - if err != nil { - t.Error(err) - } - if want, have := 0, len(services); want != have { - t.Errorf("want %d, have %d", want, have) - } -} - -type testClient struct { - entries []*stdconsul.ServiceEntry -} - -func newTestClient(entries []*stdconsul.ServiceEntry) *testClient { - return &testClient{ - entries: entries, - } -} - -var _ Client = &testClient{} - -func (c *testClient) Service(service, tag string, _ bool, opts *stdconsul.QueryOptions) ([]*stdconsul.ServiceEntry, *stdconsul.QueryMeta, error) { - var results []*stdconsul.ServiceEntry - - for _, entry := range c.entries { - if entry.Service.Service != service { - continue - } - if tag != "" { - tagMap := map[string]struct{}{} - - for _, t := range entry.Service.Tags { - tagMap[t] = struct{}{} - } - - if _, ok := tagMap[tag]; !ok { - continue - } - } - - results = append(results, entry) - } - - return results, &stdconsul.QueryMeta{}, nil -} - -func (c *testClient) Register(r *stdconsul.AgentServiceRegistration) error { - toAdd := registration2entry(r) - - for _, entry := range c.entries { - if reflect.DeepEqual(*entry, *toAdd) { - return errors.New("duplicate") - } - } - - c.entries = append(c.entries, toAdd) - return nil -} - -func (c *testClient) Deregister(r *stdconsul.AgentServiceRegistration) error { - toDelete := registration2entry(r) - - var newEntries []*stdconsul.ServiceEntry - for _, entry := range c.entries { - if reflect.DeepEqual(*entry, *toDelete) { - continue - } - newEntries = append(newEntries, entry) - } - if len(newEntries) == len(c.entries) { - return errors.New("not found") - } - - c.entries = newEntries - return nil -} - -func registration2entry(r *stdconsul.AgentServiceRegistration) *stdconsul.ServiceEntry { - return &stdconsul.ServiceEntry{ - Node: &stdconsul.Node{ - Node: "some-node", - Address: r.Address, - }, - Service: &stdconsul.AgentService{ - ID: r.ID, - Service: r.Name, - Tags: r.Tags, - Port: r.Port, - Address: r.Address, - }, - // Checks ignored - } -} - -func testFactory(instance string) (endpoint.Endpoint, io.Closer, error) { - return func(context.Context, interface{}) (interface{}, error) { - return instance, nil - }, nil, nil -} - -var testRegistration = &stdconsul.AgentServiceRegistration{ - ID: "my-id", - Name: "my-name", - Tags: []string{"my-tag-1", "my-tag-2"}, - Port: 12345, - Address: "my-address", -} diff --git a/vendor/github.com/go-kit/kit/sd/consul/doc.go b/vendor/github.com/go-kit/kit/sd/consul/doc.go deleted file mode 100644 index b3b475f1..00000000 --- a/vendor/github.com/go-kit/kit/sd/consul/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package consul provides Instancer and Registrar implementations for Consul. -package consul diff --git a/vendor/github.com/go-kit/kit/sd/consul/instancer.go b/vendor/github.com/go-kit/kit/sd/consul/instancer.go deleted file mode 100644 index 38b18f0d..00000000 --- a/vendor/github.com/go-kit/kit/sd/consul/instancer.go +++ /dev/null @@ -1,167 +0,0 @@ -package consul - -import ( - "fmt" - "io" - - consul "github.com/hashicorp/consul/api" - - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/sd" - "github.com/go-kit/kit/sd/internal/instance" -) - -const defaultIndex = 0 - -// Instancer yields instances for a service in Consul. -type Instancer struct { - cache *instance.Cache - client Client - logger log.Logger - service string - tags []string - passingOnly bool - quitc chan struct{} -} - -// NewInstancer returns a Consul instancer that publishes instances for the -// requested service. It only returns instances for which all of the passed tags -// are present. -func NewInstancer(client Client, logger log.Logger, service string, tags []string, passingOnly bool) *Instancer { - s := &Instancer{ - cache: instance.NewCache(), - client: client, - logger: log.With(logger, "service", service, "tags", fmt.Sprint(tags)), - service: service, - tags: tags, - passingOnly: passingOnly, - quitc: make(chan struct{}), - } - - instances, index, err := s.getInstances(defaultIndex, nil) - if err == nil { - s.logger.Log("instances", len(instances)) - } else { - s.logger.Log("err", err) - } - - s.cache.Update(sd.Event{Instances: instances, Err: err}) - go s.loop(index) - return s -} - -// Stop terminates the instancer. -func (s *Instancer) Stop() { - close(s.quitc) -} - -func (s *Instancer) loop(lastIndex uint64) { - var ( - instances []string - err error - ) - for { - instances, lastIndex, err = s.getInstances(lastIndex, s.quitc) - switch { - case err == io.EOF: - return // stopped via quitc - case err != nil: - s.logger.Log("err", err) - s.cache.Update(sd.Event{Err: err}) - default: - s.cache.Update(sd.Event{Instances: instances}) - } - } -} - -func (s *Instancer) getInstances(lastIndex uint64, interruptc chan struct{}) ([]string, uint64, error) { - tag := "" - if len(s.tags) > 0 { - tag = s.tags[0] - } - - // Consul doesn't support more than one tag in its service query method. - // https://github.com/hashicorp/consul/issues/294 - // Hashi suggest prepared queries, but they don't support blocking. - // https://www.consul.io/docs/agent/http/query.html#execute - // If we want blocking for efficiency, we must filter tags manually. - - type response struct { - instances []string - index uint64 - } - - var ( - errc = make(chan error, 1) - resc = make(chan response, 1) - ) - - go func() { - entries, meta, err := s.client.Service(s.service, tag, s.passingOnly, &consul.QueryOptions{ - WaitIndex: lastIndex, - }) - if err != nil { - errc <- err - return - } - if len(s.tags) > 1 { - entries = filterEntries(entries, s.tags[1:]...) - } - resc <- response{ - instances: makeInstances(entries), - index: meta.LastIndex, - } - }() - - select { - case err := <-errc: - return nil, 0, err - case res := <-resc: - return res.instances, res.index, nil - case <-interruptc: - return nil, 0, io.EOF - } -} - -// Register implements Instancer. -func (s *Instancer) Register(ch chan<- sd.Event) { - s.cache.Register(ch) -} - -// Deregister implements Instancer. -func (s *Instancer) Deregister(ch chan<- sd.Event) { - s.cache.Deregister(ch) -} - -func filterEntries(entries []*consul.ServiceEntry, tags ...string) []*consul.ServiceEntry { - var es []*consul.ServiceEntry - -ENTRIES: - for _, entry := range entries { - ts := make(map[string]struct{}, len(entry.Service.Tags)) - for _, tag := range entry.Service.Tags { - ts[tag] = struct{}{} - } - - for _, tag := range tags { - if _, ok := ts[tag]; !ok { - continue ENTRIES - } - } - es = append(es, entry) - } - - return es -} - -func makeInstances(entries []*consul.ServiceEntry) []string { - instances := make([]string, len(entries)) - for i, entry := range entries { - addr := entry.Node.Address - if entry.Service.Address != "" { - addr = entry.Service.Address - } - instances[i] = fmt.Sprintf("%s:%d", addr, entry.Service.Port) - } - return instances -} diff --git a/vendor/github.com/go-kit/kit/sd/consul/instancer_test.go b/vendor/github.com/go-kit/kit/sd/consul/instancer_test.go deleted file mode 100644 index ec7dd31b..00000000 --- a/vendor/github.com/go-kit/kit/sd/consul/instancer_test.go +++ /dev/null @@ -1,133 +0,0 @@ -package consul - -import ( - "context" - "testing" - - consul "github.com/hashicorp/consul/api" - - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/sd" -) - -var _ sd.Instancer = (*Instancer)(nil) // API check - -var consulState = []*consul.ServiceEntry{ - { - Node: &consul.Node{ - Address: "10.0.0.0", - Node: "app00.local", - }, - Service: &consul.AgentService{ - ID: "search-api-0", - Port: 8000, - Service: "search", - Tags: []string{ - "api", - "v1", - }, - }, - }, - { - Node: &consul.Node{ - Address: "10.0.0.1", - Node: "app01.local", - }, - Service: &consul.AgentService{ - ID: "search-api-1", - Port: 8001, - Service: "search", - Tags: []string{ - "api", - "v2", - }, - }, - }, - { - Node: &consul.Node{ - Address: "10.0.0.1", - Node: "app01.local", - }, - Service: &consul.AgentService{ - Address: "10.0.0.10", - ID: "search-db-0", - Port: 9000, - Service: "search", - Tags: []string{ - "db", - }, - }, - }, -} - -func TestInstancer(t *testing.T) { - var ( - logger = log.NewNopLogger() - client = newTestClient(consulState) - ) - - s := NewInstancer(client, logger, "search", []string{"api"}, true) - defer s.Stop() - - state := s.cache.State() - if want, have := 2, len(state.Instances); want != have { - t.Errorf("want %d, have %d", want, have) - } -} - -func TestInstancerNoService(t *testing.T) { - var ( - logger = log.NewNopLogger() - client = newTestClient(consulState) - ) - - s := NewInstancer(client, logger, "feed", []string{}, true) - defer s.Stop() - - state := s.cache.State() - if want, have := 0, len(state.Instances); want != have { - t.Fatalf("want %d, have %d", want, have) - } -} - -func TestInstancerWithTags(t *testing.T) { - var ( - logger = log.NewNopLogger() - client = newTestClient(consulState) - ) - - s := NewInstancer(client, logger, "search", []string{"api", "v2"}, true) - defer s.Stop() - - state := s.cache.State() - if want, have := 1, len(state.Instances); want != have { - t.Fatalf("want %d, have %d", want, have) - } -} - -func TestInstancerAddressOverride(t *testing.T) { - s := NewInstancer(newTestClient(consulState), log.NewNopLogger(), "search", []string{"db"}, true) - defer s.Stop() - - state := s.cache.State() - if want, have := 1, len(state.Instances); want != have { - t.Fatalf("want %d, have %d", want, have) - } - - endpoint, closer, err := testFactory(state.Instances[0]) - if err != nil { - t.Fatal(err) - } - if closer != nil { - defer closer.Close() - } - - response, err := endpoint(context.Background(), struct{}{}) - if err != nil { - t.Fatal(err) - } - - if want, have := "10.0.0.10:9000", response.(string); want != have { - t.Errorf("want %q, have %q", want, have) - } -} diff --git a/vendor/github.com/go-kit/kit/sd/consul/integration_test.go b/vendor/github.com/go-kit/kit/sd/consul/integration_test.go deleted file mode 100644 index 95185d85..00000000 --- a/vendor/github.com/go-kit/kit/sd/consul/integration_test.go +++ /dev/null @@ -1,86 +0,0 @@ -// +build integration - -package consul - -import ( - "io" - "os" - "testing" - "time" - - "github.com/go-kit/kit/endpoint" - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/sd" - stdconsul "github.com/hashicorp/consul/api" -) - -func TestIntegration(t *testing.T) { - consulAddr := os.Getenv("CONSUL_ADDR") - if consulAddr == "" { - t.Fatal("CONSUL_ADDR is not set") - } - stdClient, err := stdconsul.NewClient(&stdconsul.Config{ - Address: consulAddr, - }) - if err != nil { - t.Fatal(err) - } - client := NewClient(stdClient) - logger := log.NewLogfmtLogger(os.Stderr) - - // Produce a fake service registration. - r := &stdconsul.AgentServiceRegistration{ - ID: "my-service-ID", - Name: "my-service-name", - Tags: []string{"alpha", "beta"}, - Port: 12345, - Address: "my-address", - EnableTagOverride: false, - // skipping check(s) - } - - // Build an Instancer on r.Name + r.Tags. - factory := func(instance string) (endpoint.Endpoint, io.Closer, error) { - t.Logf("factory invoked for %q", instance) - return endpoint.Nop, nil, nil - } - instancer := NewInstancer( - client, - log.With(logger, "component", "instancer"), - r.Name, - r.Tags, - true, - ) - endpointer := sd.NewEndpointer( - instancer, - factory, - log.With(logger, "component", "endpointer"), - ) - - time.Sleep(time.Second) - - // Before we publish, we should have no endpoints. - endpoints, err := endpointer.Endpoints() - if err != nil { - t.Error(err) - } - if want, have := 0, len(endpoints); want != have { - t.Errorf("want %d, have %d", want, have) - } - - // Build a registrar for r. - registrar := NewRegistrar(client, r, log.With(logger, "component", "registrar")) - registrar.Register() - defer registrar.Deregister() - - time.Sleep(time.Second) - - // Now we should have one active endpoints. - endpoints, err = endpointer.Endpoints() - if err != nil { - t.Error(err) - } - if want, have := 1, len(endpoints); want != have { - t.Errorf("want %d, have %d", want, have) - } -} diff --git a/vendor/github.com/go-kit/kit/sd/consul/registrar.go b/vendor/github.com/go-kit/kit/sd/consul/registrar.go deleted file mode 100644 index bf26bd2b..00000000 --- a/vendor/github.com/go-kit/kit/sd/consul/registrar.go +++ /dev/null @@ -1,44 +0,0 @@ -package consul - -import ( - "fmt" - - stdconsul "github.com/hashicorp/consul/api" - - "github.com/go-kit/kit/log" -) - -// Registrar registers service instance liveness information to Consul. -type Registrar struct { - client Client - registration *stdconsul.AgentServiceRegistration - logger log.Logger -} - -// NewRegistrar returns a Consul Registrar acting on the provided catalog -// registration. -func NewRegistrar(client Client, r *stdconsul.AgentServiceRegistration, logger log.Logger) *Registrar { - return &Registrar{ - client: client, - registration: r, - logger: log.With(logger, "service", r.Name, "tags", fmt.Sprint(r.Tags), "address", r.Address), - } -} - -// Register implements sd.Registrar interface. -func (p *Registrar) Register() { - if err := p.client.Register(p.registration); err != nil { - p.logger.Log("err", err) - } else { - p.logger.Log("action", "register") - } -} - -// Deregister implements sd.Registrar interface. -func (p *Registrar) Deregister() { - if err := p.client.Deregister(p.registration); err != nil { - p.logger.Log("err", err) - } else { - p.logger.Log("action", "deregister") - } -} diff --git a/vendor/github.com/go-kit/kit/sd/consul/registrar_test.go b/vendor/github.com/go-kit/kit/sd/consul/registrar_test.go deleted file mode 100644 index edc77232..00000000 --- a/vendor/github.com/go-kit/kit/sd/consul/registrar_test.go +++ /dev/null @@ -1,27 +0,0 @@ -package consul - -import ( - "testing" - - stdconsul "github.com/hashicorp/consul/api" - - "github.com/go-kit/kit/log" -) - -func TestRegistrar(t *testing.T) { - client := newTestClient([]*stdconsul.ServiceEntry{}) - p := NewRegistrar(client, testRegistration, log.NewNopLogger()) - if want, have := 0, len(client.entries); want != have { - t.Errorf("want %d, have %d", want, have) - } - - p.Register() - if want, have := 1, len(client.entries); want != have { - t.Errorf("want %d, have %d", want, have) - } - - p.Deregister() - if want, have := 0, len(client.entries); want != have { - t.Errorf("want %d, have %d", want, have) - } -} diff --git a/vendor/github.com/go-kit/kit/sd/dnssrv/doc.go b/vendor/github.com/go-kit/kit/sd/dnssrv/doc.go deleted file mode 100644 index 03014873..00000000 --- a/vendor/github.com/go-kit/kit/sd/dnssrv/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package dnssrv provides an Instancer implementation for DNS SRV records. -package dnssrv diff --git a/vendor/github.com/go-kit/kit/sd/dnssrv/instancer.go b/vendor/github.com/go-kit/kit/sd/dnssrv/instancer.go deleted file mode 100644 index bed2cb5b..00000000 --- a/vendor/github.com/go-kit/kit/sd/dnssrv/instancer.go +++ /dev/null @@ -1,103 +0,0 @@ -package dnssrv - -import ( - "fmt" - "net" - "time" - - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/sd" - "github.com/go-kit/kit/sd/internal/instance" -) - -// Instancer yields instances from the named DNS SRV record. The name is -// resolved on a fixed schedule. Priorities and weights are ignored. -type Instancer struct { - cache *instance.Cache - name string - logger log.Logger - quit chan struct{} -} - -// NewInstancer returns a DNS SRV instancer. -func NewInstancer( - name string, - ttl time.Duration, - logger log.Logger, -) *Instancer { - return NewInstancerDetailed(name, time.NewTicker(ttl), net.LookupSRV, logger) -} - -// NewInstancerDetailed is the same as NewInstancer, but allows users to -// provide an explicit lookup refresh ticker instead of a TTL, and specify the -// lookup function instead of using net.LookupSRV. -func NewInstancerDetailed( - name string, - refresh *time.Ticker, - lookup Lookup, - logger log.Logger, -) *Instancer { - p := &Instancer{ - cache: instance.NewCache(), - name: name, - logger: logger, - quit: make(chan struct{}), - } - - instances, err := p.resolve(lookup) - if err == nil { - logger.Log("name", name, "instances", len(instances)) - } else { - logger.Log("name", name, "err", err) - } - p.cache.Update(sd.Event{Instances: instances, Err: err}) - - go p.loop(refresh, lookup) - return p -} - -// Stop terminates the Instancer. -func (p *Instancer) Stop() { - close(p.quit) -} - -func (p *Instancer) loop(t *time.Ticker, lookup Lookup) { - defer t.Stop() - for { - select { - case <-t.C: - instances, err := p.resolve(lookup) - if err != nil { - p.logger.Log("name", p.name, "err", err) - p.cache.Update(sd.Event{Err: err}) - continue // don't replace potentially-good with bad - } - p.cache.Update(sd.Event{Instances: instances}) - - case <-p.quit: - return - } - } -} - -func (p *Instancer) resolve(lookup Lookup) ([]string, error) { - _, addrs, err := lookup("", "", p.name) - if err != nil { - return nil, err - } - instances := make([]string, len(addrs)) - for i, addr := range addrs { - instances[i] = net.JoinHostPort(addr.Target, fmt.Sprint(addr.Port)) - } - return instances, nil -} - -// Register implements Instancer. -func (s *Instancer) Register(ch chan<- sd.Event) { - s.cache.Register(ch) -} - -// Deregister implements Instancer. -func (s *Instancer) Deregister(ch chan<- sd.Event) { - s.cache.Deregister(ch) -} diff --git a/vendor/github.com/go-kit/kit/sd/dnssrv/instancer_test.go b/vendor/github.com/go-kit/kit/sd/dnssrv/instancer_test.go deleted file mode 100644 index 6c8eca50..00000000 --- a/vendor/github.com/go-kit/kit/sd/dnssrv/instancer_test.go +++ /dev/null @@ -1,73 +0,0 @@ -package dnssrv - -import ( - "net" - "sync/atomic" - "testing" - "time" - - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/sd" -) - -var _ sd.Instancer = (*Instancer)(nil) // API check - -func TestRefresh(t *testing.T) { - name := "some.service.internal" - - ticker := time.NewTicker(time.Second) - ticker.Stop() - tickc := make(chan time.Time) - ticker.C = tickc - - var lookups uint64 - records := []*net.SRV{} - lookup := func(service, proto, name string) (string, []*net.SRV, error) { - t.Logf("lookup(%q, %q, %q)", service, proto, name) - atomic.AddUint64(&lookups, 1) - return "cname", records, nil - } - - instancer := NewInstancerDetailed(name, ticker, lookup, log.NewNopLogger()) - defer instancer.Stop() - - // First lookup, empty - state := instancer.cache.State() - if state.Err != nil { - t.Error(state.Err) - } - if want, have := 0, len(state.Instances); want != have { - t.Errorf("want %d, have %d", want, have) - } - if want, have := uint64(1), atomic.LoadUint64(&lookups); want != have { - t.Errorf("want %d, have %d", want, have) - } - - // Load some records and lookup again - records = []*net.SRV{ - {Target: "1.0.0.1", Port: 1001}, - {Target: "1.0.0.2", Port: 1002}, - {Target: "1.0.0.3", Port: 1003}, - } - tickc <- time.Now() - - // There is a race condition where the instancer.State call below - // invokes the cache before it is updated by the tick above. - // TODO(pb): solve by running the read through the loop goroutine. - time.Sleep(100 * time.Millisecond) - - state = instancer.cache.State() - if state.Err != nil { - t.Error(state.Err) - } - if want, have := 3, len(state.Instances); want != have { - t.Errorf("want %d, have %d", want, have) - } - if want, have := uint64(2), atomic.LoadUint64(&lookups); want != have { - t.Errorf("want %d, have %d", want, have) - } -} - -type nopCloser struct{} - -func (nopCloser) Close() error { return nil } diff --git a/vendor/github.com/go-kit/kit/sd/dnssrv/lookup.go b/vendor/github.com/go-kit/kit/sd/dnssrv/lookup.go deleted file mode 100644 index 9d46ea6e..00000000 --- a/vendor/github.com/go-kit/kit/sd/dnssrv/lookup.go +++ /dev/null @@ -1,7 +0,0 @@ -package dnssrv - -import "net" - -// Lookup is a function that resolves a DNS SRV record to multiple addresses. -// It has the same signature as net.LookupSRV. -type Lookup func(service, proto, name string) (cname string, addrs []*net.SRV, err error) diff --git a/vendor/github.com/go-kit/kit/sd/doc.go b/vendor/github.com/go-kit/kit/sd/doc.go deleted file mode 100644 index 9bcf3bd5..00000000 --- a/vendor/github.com/go-kit/kit/sd/doc.go +++ /dev/null @@ -1,6 +0,0 @@ -// Package sd provides utilities related to service discovery. That includes the -// client-side loadbalancer pattern, where a microservice subscribes to a -// service discovery system in order to reach remote instances; as well as the -// registrator pattern, where a microservice registers itself in a service -// discovery system. Implementations are provided for most common systems. -package sd diff --git a/vendor/github.com/go-kit/kit/sd/endpoint_cache.go b/vendor/github.com/go-kit/kit/sd/endpoint_cache.go deleted file mode 100644 index 6a4938f1..00000000 --- a/vendor/github.com/go-kit/kit/sd/endpoint_cache.go +++ /dev/null @@ -1,143 +0,0 @@ -package sd - -import ( - "io" - "sort" - "sync" - "time" - - "github.com/go-kit/kit/endpoint" - "github.com/go-kit/kit/log" -) - -// endpointCache collects the most recent set of instances from a service discovery -// system, creates endpoints for them using a factory function, and makes -// them available to consumers. -type endpointCache struct { - options endpointerOptions - mtx sync.RWMutex - factory Factory - cache map[string]endpointCloser - err error - endpoints []endpoint.Endpoint - logger log.Logger - invalidateDeadline time.Time - timeNow func() time.Time -} - -type endpointCloser struct { - endpoint.Endpoint - io.Closer -} - -// newEndpointCache returns a new, empty endpointCache. -func newEndpointCache(factory Factory, logger log.Logger, options endpointerOptions) *endpointCache { - return &endpointCache{ - options: options, - factory: factory, - cache: map[string]endpointCloser{}, - logger: logger, - timeNow: time.Now, - } -} - -// Update should be invoked by clients with a complete set of current instance -// strings whenever that set changes. The cache manufactures new endpoints via -// the factory, closes old endpoints when they disappear, and persists existing -// endpoints if they survive through an update. -func (c *endpointCache) Update(event Event) { - c.mtx.Lock() - defer c.mtx.Unlock() - - // Happy path. - if event.Err == nil { - c.updateCache(event.Instances) - c.err = nil - return - } - - // Sad path. Something's gone wrong in sd. - c.logger.Log("err", event.Err) - if !c.options.invalidateOnError { - return // keep returning the last known endpoints on error - } - if c.err != nil { - return // already in the error state, do nothing & keep original error - } - c.err = event.Err - // set new deadline to invalidate Endpoints unless non-error Event is received - c.invalidateDeadline = c.timeNow().Add(c.options.invalidateTimeout) - return -} - -func (c *endpointCache) updateCache(instances []string) { - // Deterministic order (for later). - sort.Strings(instances) - - // Produce the current set of services. - cache := make(map[string]endpointCloser, len(instances)) - for _, instance := range instances { - // If it already exists, just copy it over. - if sc, ok := c.cache[instance]; ok { - cache[instance] = sc - delete(c.cache, instance) - continue - } - - // If it doesn't exist, create it. - service, closer, err := c.factory(instance) - if err != nil { - c.logger.Log("instance", instance, "err", err) - continue - } - cache[instance] = endpointCloser{service, closer} - } - - // Close any leftover endpoints. - for _, sc := range c.cache { - if sc.Closer != nil { - sc.Closer.Close() - } - } - - // Populate the slice of endpoints. - endpoints := make([]endpoint.Endpoint, 0, len(cache)) - for _, instance := range instances { - // A bad factory may mean an instance is not present. - if _, ok := cache[instance]; !ok { - continue - } - endpoints = append(endpoints, cache[instance].Endpoint) - } - - // Swap and trigger GC for old copies. - c.endpoints = endpoints - c.cache = cache -} - -// Endpoints yields the current set of (presumably identical) endpoints, ordered -// lexicographically by the corresponding instance string. -func (c *endpointCache) Endpoints() ([]endpoint.Endpoint, error) { - // in the steady state we're going to have many goroutines calling Endpoints() - // concurrently, so to minimize contention we use a shared R-lock. - c.mtx.RLock() - - if c.err == nil || c.timeNow().Before(c.invalidateDeadline) { - defer c.mtx.RUnlock() - return c.endpoints, nil - } - - c.mtx.RUnlock() - - // in case of an error, switch to an exclusive lock. - c.mtx.Lock() - defer c.mtx.Unlock() - - // re-check condition due to a race between RUnlock() and Lock(). - if c.err == nil || c.timeNow().Before(c.invalidateDeadline) { - return c.endpoints, nil - } - - c.updateCache(nil) // close any remaining active endpoints - return nil, c.err -} diff --git a/vendor/github.com/go-kit/kit/sd/endpoint_cache_test.go b/vendor/github.com/go-kit/kit/sd/endpoint_cache_test.go deleted file mode 100644 index 91eb5bed..00000000 --- a/vendor/github.com/go-kit/kit/sd/endpoint_cache_test.go +++ /dev/null @@ -1,180 +0,0 @@ -package sd - -import ( - "errors" - "io" - "testing" - "time" - - "github.com/go-kit/kit/endpoint" - "github.com/go-kit/kit/log" -) - -func TestEndpointCache(t *testing.T) { - var ( - ca = make(closer) - cb = make(closer) - c = map[string]io.Closer{"a": ca, "b": cb} - f = func(instance string) (endpoint.Endpoint, io.Closer, error) { return endpoint.Nop, c[instance], nil } - cache = newEndpointCache(f, log.NewNopLogger(), endpointerOptions{}) - ) - - // Populate - cache.Update(Event{Instances: []string{"a", "b"}}) - select { - case <-ca: - t.Errorf("endpoint a closed, not good") - case <-cb: - t.Errorf("endpoint b closed, not good") - case <-time.After(time.Millisecond): - t.Logf("no closures yet, good") - } - assertEndpointsLen(t, cache, 2) - - // Duplicate, should be no-op - cache.Update(Event{Instances: []string{"a", "b"}}) - select { - case <-ca: - t.Errorf("endpoint a closed, not good") - case <-cb: - t.Errorf("endpoint b closed, not good") - case <-time.After(time.Millisecond): - t.Logf("no closures yet, good") - } - assertEndpointsLen(t, cache, 2) - - // Error, should continue returning old endpoints - cache.Update(Event{Err: errors.New("sd error")}) - select { - case <-ca: - t.Errorf("endpoint a closed, not good") - case <-cb: - t.Errorf("endpoint b closed, not good") - case <-time.After(time.Millisecond): - t.Logf("no closures yet, good") - } - assertEndpointsLen(t, cache, 2) - - // Delete b - go cache.Update(Event{Instances: []string{"a"}}) - select { - case <-ca: - t.Errorf("endpoint a closed, not good") - case <-cb: - t.Logf("endpoint b closed, good") - case <-time.After(time.Second): - t.Errorf("didn't close the deleted instance in time") - } - assertEndpointsLen(t, cache, 1) - - // Delete a - go cache.Update(Event{Instances: []string{}}) - select { - // case <-cb: will succeed, as it's closed - case <-ca: - t.Logf("endpoint a closed, good") - case <-time.After(time.Second): - t.Errorf("didn't close the deleted instance in time") - } - assertEndpointsLen(t, cache, 0) -} - -func TestEndpointCacheErrorAndTimeout(t *testing.T) { - var ( - ca = make(closer) - cb = make(closer) - c = map[string]io.Closer{"a": ca, "b": cb} - f = func(instance string) (endpoint.Endpoint, io.Closer, error) { return endpoint.Nop, c[instance], nil } - timeOut = 100 * time.Millisecond - cache = newEndpointCache(f, log.NewNopLogger(), endpointerOptions{ - invalidateOnError: true, - invalidateTimeout: timeOut, - }) - ) - - timeNow := time.Now() - cache.timeNow = func() time.Time { return timeNow } - - // Populate - cache.Update(Event{Instances: []string{"a"}}) - select { - case <-ca: - t.Errorf("endpoint a closed, not good") - case <-time.After(time.Millisecond): - t.Logf("no closures yet, good") - } - assertEndpointsLen(t, cache, 1) - - // Send error, keep time still. - cache.Update(Event{Err: errors.New("sd error")}) - select { - case <-ca: - t.Errorf("endpoint a closed, not good") - case <-time.After(time.Millisecond): - t.Logf("no closures yet, good") - } - assertEndpointsLen(t, cache, 1) - - // Move the time, but less than the timeout - timeNow = timeNow.Add(timeOut / 2) - assertEndpointsLen(t, cache, 1) - select { - case <-ca: - t.Errorf("endpoint a closed, not good") - case <-time.After(time.Millisecond): - t.Logf("no closures yet, good") - } - - // Move the time past the timeout - timeNow = timeNow.Add(timeOut) - assertEndpointsError(t, cache, "sd error") - select { - case <-ca: - t.Logf("endpoint a closed, good") - case <-time.After(time.Millisecond): - t.Errorf("didn't close the deleted instance in time") - } - - // Send another error - cache.Update(Event{Err: errors.New("another sd error")}) - assertEndpointsError(t, cache, "sd error") // expect original error -} - -func TestBadFactory(t *testing.T) { - cache := newEndpointCache(func(string) (endpoint.Endpoint, io.Closer, error) { - return nil, nil, errors.New("bad factory") - }, log.NewNopLogger(), endpointerOptions{}) - - cache.Update(Event{Instances: []string{"foo:1234", "bar:5678"}}) - assertEndpointsLen(t, cache, 0) -} - -func assertEndpointsLen(t *testing.T, cache *endpointCache, l int) { - endpoints, err := cache.Endpoints() - if err != nil { - t.Errorf("unexpected error %v", err) - return - } - if want, have := l, len(endpoints); want != have { - t.Errorf("want %d, have %d", want, have) - } -} - -func assertEndpointsError(t *testing.T, cache *endpointCache, wantErr string) { - endpoints, err := cache.Endpoints() - if err == nil { - t.Errorf("expecting error, not good") - return - } - if want, have := wantErr, err.Error(); want != have { - t.Errorf("want %s, have %s", want, have) - return - } - if want, have := 0, len(endpoints); want != have { - t.Errorf("want %d, have %d", want, have) - } -} - -type closer chan struct{} - -func (c closer) Close() error { close(c); return nil } diff --git a/vendor/github.com/go-kit/kit/sd/endpointer.go b/vendor/github.com/go-kit/kit/sd/endpointer.go deleted file mode 100644 index 5c98fc75..00000000 --- a/vendor/github.com/go-kit/kit/sd/endpointer.go +++ /dev/null @@ -1,90 +0,0 @@ -package sd - -import ( - "time" - - "github.com/go-kit/kit/endpoint" - "github.com/go-kit/kit/log" -) - -// Endpointer listens to a service discovery system and yields a set of -// identical endpoints on demand. An error indicates a problem with connectivity -// to the service discovery system, or within the system itself; an Endpointer -// may yield no endpoints without error. -type Endpointer interface { - Endpoints() ([]endpoint.Endpoint, error) -} - -// FixedEndpointer yields a fixed set of endpoints. -type FixedEndpointer []endpoint.Endpoint - -// Endpoints implements Endpointer. -func (s FixedEndpointer) Endpoints() ([]endpoint.Endpoint, error) { return s, nil } - -// NewEndpointer creates an Endpointer that subscribes to updates from Instancer src -// and uses factory f to create Endpoints. If src notifies of an error, the Endpointer -// keeps returning previously created Endpoints assuming they are still good, unless -// this behavior is disabled via InvalidateOnError option. -func NewEndpointer(src Instancer, f Factory, logger log.Logger, options ...EndpointerOption) *DefaultEndpointer { - opts := endpointerOptions{} - for _, opt := range options { - opt(&opts) - } - se := &DefaultEndpointer{ - cache: newEndpointCache(f, logger, opts), - instancer: src, - ch: make(chan Event), - } - go se.receive() - src.Register(se.ch) - return se -} - -// EndpointerOption allows control of endpointCache behavior. -type EndpointerOption func(*endpointerOptions) - -// InvalidateOnError returns EndpointerOption that controls how the Endpointer -// behaves when then Instancer publishes an Event containing an error. -// Without this option the Endpointer continues returning the last known -// endpoints. With this option, the Endpointer continues returning the last -// known endpoints until the timeout elapses, then closes all active endpoints -// and starts returning an error. Once the Instancer sends a new update with -// valid resource instances, the normal operation is resumed. -func InvalidateOnError(timeout time.Duration) EndpointerOption { - return func(opts *endpointerOptions) { - opts.invalidateOnError = true - opts.invalidateTimeout = timeout - } -} - -type endpointerOptions struct { - invalidateOnError bool - invalidateTimeout time.Duration -} - -// DefaultEndpointer implements an Endpointer interface. -// When created with NewEndpointer function, it automatically registers -// as a subscriber to events from the Instances and maintains a list -// of active Endpoints. -type DefaultEndpointer struct { - cache *endpointCache - instancer Instancer - ch chan Event -} - -func (de *DefaultEndpointer) receive() { - for event := range de.ch { - de.cache.Update(event) - } -} - -// Close deregisters DefaultEndpointer from the Instancer and stops the internal go-routine. -func (de *DefaultEndpointer) Close() { - de.instancer.Deregister(de.ch) - close(de.ch) -} - -// Endpoints implements Endpointer. -func (de *DefaultEndpointer) Endpoints() ([]endpoint.Endpoint, error) { - return de.cache.Endpoints() -} diff --git a/vendor/github.com/go-kit/kit/sd/endpointer_test.go b/vendor/github.com/go-kit/kit/sd/endpointer_test.go deleted file mode 100644 index 671178f6..00000000 --- a/vendor/github.com/go-kit/kit/sd/endpointer_test.go +++ /dev/null @@ -1,85 +0,0 @@ -package sd_test - -import ( - "io" - "testing" - "time" - - "github.com/go-kit/kit/endpoint" - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/sd" - "github.com/go-kit/kit/sd/internal/instance" -) - -func TestDefaultEndpointer(t *testing.T) { - var ( - ca = make(closer) - cb = make(closer) - c = map[string]io.Closer{"a": ca, "b": cb} - f = func(instance string) (endpoint.Endpoint, io.Closer, error) { - return endpoint.Nop, c[instance], nil - } - instancer = &mockInstancer{instance.NewCache()} - ) - // set initial state - instancer.Update(sd.Event{Instances: []string{"a", "b"}}) - - endpointer := sd.NewEndpointer(instancer, f, log.NewNopLogger(), sd.InvalidateOnError(time.Minute)) - - var ( - endpoints []endpoint.Endpoint - err error - ) - if !within(time.Second, func() bool { - endpoints, err = endpointer.Endpoints() - return err == nil && len(endpoints) == 2 - }) { - t.Errorf("wanted 2 endpoints, got %d (%v)", len(endpoints), err) - } - - instancer.Update(sd.Event{Instances: []string{}}) - - select { - case <-ca: - t.Logf("endpoint a closed, good") - case <-time.After(time.Millisecond): - t.Errorf("didn't close the deleted instance in time") - } - - select { - case <-cb: - t.Logf("endpoint b closed, good") - case <-time.After(time.Millisecond): - t.Errorf("didn't close the deleted instance in time") - } - - if endpoints, err := endpointer.Endpoints(); err != nil { - t.Errorf("unepected error %v", err) - } else if want, have := 0, len(endpoints); want != have { - t.Errorf("want %d, have %d", want, have) - } - - endpointer.Close() - - instancer.Update(sd.Event{Instances: []string{"a"}}) - // TODO verify that on Close the endpointer fully disconnects from the instancer. - // Unfortunately, because we use instance.Cache, this test cannot be in the sd package, - // and therefore does not have access to the endpointer's private members. -} - -type mockInstancer struct{ *instance.Cache } - -type closer chan struct{} - -func (c closer) Close() error { close(c); return nil } - -func within(d time.Duration, f func() bool) bool { - deadline := time.Now().Add(d) - for time.Now().Before(deadline) { - if f() { - return true - } - time.Sleep(d / 10) - } - return false -} diff --git a/vendor/github.com/go-kit/kit/sd/etcd/client.go b/vendor/github.com/go-kit/kit/sd/etcd/client.go deleted file mode 100644 index d6899a3e..00000000 --- a/vendor/github.com/go-kit/kit/sd/etcd/client.go +++ /dev/null @@ -1,177 +0,0 @@ -package etcd - -import ( - "context" - "crypto/tls" - "crypto/x509" - "errors" - "io/ioutil" - "net" - "net/http" - "time" - - etcd "github.com/coreos/etcd/client" -) - -var ( - // ErrNoKey indicates a client method needs a key but receives none. - ErrNoKey = errors.New("no key provided") - - // ErrNoValue indicates a client method needs a value but receives none. - ErrNoValue = errors.New("no value provided") -) - -// Client is a wrapper around the etcd client. -type Client interface { - // GetEntries queries the given prefix in etcd and returns a slice - // containing the values of all keys found, recursively, underneath that - // prefix. - GetEntries(prefix string) ([]string, error) - - // WatchPrefix watches the given prefix in etcd for changes. When a change - // is detected, it will signal on the passed channel. Clients are expected - // to call GetEntries to update themselves with the latest set of complete - // values. WatchPrefix will always send an initial sentinel value on the - // channel after establishing the watch, to ensure that clients always - // receive the latest set of values. WatchPrefix will block until the - // context passed to the NewClient constructor is terminated. - WatchPrefix(prefix string, ch chan struct{}) - - // Register a service with etcd. - Register(s Service) error - - // Deregister a service with etcd. - Deregister(s Service) error -} - -type client struct { - keysAPI etcd.KeysAPI - ctx context.Context -} - -// ClientOptions defines options for the etcd client. All values are optional. -// If any duration is not specified, a default of 3 seconds will be used. -type ClientOptions struct { - Cert string - Key string - CACert string - DialTimeout time.Duration - DialKeepAlive time.Duration - HeaderTimeoutPerRequest time.Duration -} - -// NewClient returns Client with a connection to the named machines. It will -// return an error if a connection to the cluster cannot be made. The parameter -// machines needs to be a full URL with schemas. e.g. "http://localhost:2379" -// will work, but "localhost:2379" will not. -func NewClient(ctx context.Context, machines []string, options ClientOptions) (Client, error) { - if options.DialTimeout == 0 { - options.DialTimeout = 3 * time.Second - } - if options.DialKeepAlive == 0 { - options.DialKeepAlive = 3 * time.Second - } - if options.HeaderTimeoutPerRequest == 0 { - options.HeaderTimeoutPerRequest = 3 * time.Second - } - - transport := etcd.DefaultTransport - if options.Cert != "" && options.Key != "" { - tlsCert, err := tls.LoadX509KeyPair(options.Cert, options.Key) - if err != nil { - return nil, err - } - caCertCt, err := ioutil.ReadFile(options.CACert) - if err != nil { - return nil, err - } - caCertPool := x509.NewCertPool() - caCertPool.AppendCertsFromPEM(caCertCt) - transport = &http.Transport{ - TLSClientConfig: &tls.Config{ - Certificates: []tls.Certificate{tlsCert}, - RootCAs: caCertPool, - }, - Dial: func(network, address string) (net.Conn, error) { - return (&net.Dialer{ - Timeout: options.DialTimeout, - KeepAlive: options.DialKeepAlive, - }).Dial(network, address) - }, - } - } - - ce, err := etcd.New(etcd.Config{ - Endpoints: machines, - Transport: transport, - HeaderTimeoutPerRequest: options.HeaderTimeoutPerRequest, - }) - if err != nil { - return nil, err - } - - return &client{ - keysAPI: etcd.NewKeysAPI(ce), - ctx: ctx, - }, nil -} - -// GetEntries implements the etcd Client interface. -func (c *client) GetEntries(key string) ([]string, error) { - resp, err := c.keysAPI.Get(c.ctx, key, &etcd.GetOptions{Recursive: true}) - if err != nil { - return nil, err - } - - // Special case. Note that it's possible that len(resp.Node.Nodes) == 0 and - // resp.Node.Value is also empty, in which case the key is empty and we - // should not return any entries. - if len(resp.Node.Nodes) == 0 && resp.Node.Value != "" { - return []string{resp.Node.Value}, nil - } - - entries := make([]string, len(resp.Node.Nodes)) - for i, node := range resp.Node.Nodes { - entries[i] = node.Value - } - return entries, nil -} - -// WatchPrefix implements the etcd Client interface. -func (c *client) WatchPrefix(prefix string, ch chan struct{}) { - watch := c.keysAPI.Watcher(prefix, &etcd.WatcherOptions{AfterIndex: 0, Recursive: true}) - ch <- struct{}{} // make sure caller invokes GetEntries - for { - if _, err := watch.Next(c.ctx); err != nil { - return - } - ch <- struct{}{} - } -} - -func (c *client) Register(s Service) error { - if s.Key == "" { - return ErrNoKey - } - if s.Value == "" { - return ErrNoValue - } - var err error - if s.TTL != nil { - _, err = c.keysAPI.Set(c.ctx, s.Key, s.Value, &etcd.SetOptions{ - PrevExist: etcd.PrevIgnore, - TTL: s.TTL.ttl, - }) - } else { - _, err = c.keysAPI.Create(c.ctx, s.Key, s.Value) - } - return err -} - -func (c *client) Deregister(s Service) error { - if s.Key == "" { - return ErrNoKey - } - _, err := c.keysAPI.Delete(c.ctx, s.Key, s.DeleteOptions) - return err -} diff --git a/vendor/github.com/go-kit/kit/sd/etcd/client_test.go b/vendor/github.com/go-kit/kit/sd/etcd/client_test.go deleted file mode 100644 index 4c8bd91c..00000000 --- a/vendor/github.com/go-kit/kit/sd/etcd/client_test.go +++ /dev/null @@ -1,314 +0,0 @@ -package etcd - -import ( - "errors" - "reflect" - "testing" - "time" - - "golang.org/x/net/context" - - etcd "github.com/coreos/etcd/client" -) - -func TestNewClient(t *testing.T) { - client, err := NewClient( - context.Background(), - []string{"http://irrelevant:12345"}, - ClientOptions{ - DialTimeout: 2 * time.Second, - DialKeepAlive: 2 * time.Second, - HeaderTimeoutPerRequest: 2 * time.Second, - }, - ) - if err != nil { - t.Fatalf("unexpected error creating client: %v", err) - } - if client == nil { - t.Fatal("expected new Client, got nil") - } -} - -// NewClient should fail when providing invalid or missing endpoints. -func TestOptions(t *testing.T) { - a, err := NewClient( - context.Background(), - []string{}, - ClientOptions{ - Cert: "", - Key: "", - CACert: "", - DialTimeout: 2 * time.Second, - DialKeepAlive: 2 * time.Second, - HeaderTimeoutPerRequest: 2 * time.Second, - }, - ) - if err == nil { - t.Errorf("expected error: %v", err) - } - if a != nil { - t.Fatalf("expected client to be nil on failure") - } - - _, err = NewClient( - context.Background(), - []string{"http://irrelevant:12345"}, - ClientOptions{ - Cert: "blank.crt", - Key: "blank.key", - CACert: "blank.CACert", - DialTimeout: 2 * time.Second, - DialKeepAlive: 2 * time.Second, - HeaderTimeoutPerRequest: 2 * time.Second, - }, - ) - if err == nil { - t.Errorf("expected error: %v", err) - } -} - -// Mocks of the underlying etcd.KeysAPI interface that is called by the methods we want to test - -// fakeKeysAPI implements etcd.KeysAPI, event and err are channels used to emulate -// an etcd event or error, getres will be returned when etcd.KeysAPI.Get is called. -type fakeKeysAPI struct { - event chan bool - err chan bool - getres *getResult -} - -type getResult struct { - resp *etcd.Response - err error -} - -// Get return the content of getres or nil, nil -func (fka *fakeKeysAPI) Get(ctx context.Context, key string, opts *etcd.GetOptions) (*etcd.Response, error) { - if fka.getres == nil { - return nil, nil - } - return fka.getres.resp, fka.getres.err -} - -// Set is not used in the tests -func (fka *fakeKeysAPI) Set(ctx context.Context, key, value string, opts *etcd.SetOptions) (*etcd.Response, error) { - return nil, nil -} - -// Delete is not used in the tests -func (fka *fakeKeysAPI) Delete(ctx context.Context, key string, opts *etcd.DeleteOptions) (*etcd.Response, error) { - return nil, nil -} - -// Create is not used in the tests -func (fka *fakeKeysAPI) Create(ctx context.Context, key, value string) (*etcd.Response, error) { - return nil, nil -} - -// CreateInOrder is not used in the tests -func (fka *fakeKeysAPI) CreateInOrder(ctx context.Context, dir, value string, opts *etcd.CreateInOrderOptions) (*etcd.Response, error) { - return nil, nil -} - -// Update is not used in the tests -func (fka *fakeKeysAPI) Update(ctx context.Context, key, value string) (*etcd.Response, error) { - return nil, nil -} - -// Watcher return a fakeWatcher that will forward event and error received on the channels -func (fka *fakeKeysAPI) Watcher(key string, opts *etcd.WatcherOptions) etcd.Watcher { - return &fakeWatcher{fka.event, fka.err} -} - -// fakeWatcher implements etcd.Watcher -type fakeWatcher struct { - event chan bool - err chan bool -} - -// Next blocks until an etcd event or error is emulated. -// When an event occurs it just return nil response and error. -// When an error occur it return a non nil error. -func (fw *fakeWatcher) Next(context.Context) (*etcd.Response, error) { - for { - select { - case <-fw.event: - return nil, nil - case <-fw.err: - return nil, errors.New("error from underlying etcd watcher") - default: - } - } -} - -// newFakeClient return a new etcd.Client built on top of the mocked interfaces -func newFakeClient(event, err chan bool, getres *getResult) Client { - return &client{ - keysAPI: &fakeKeysAPI{event, err, getres}, - ctx: context.Background(), - } -} - -// Register should fail when the provided service has an empty key or value -func TestRegisterClient(t *testing.T) { - client := newFakeClient(nil, nil, nil) - - err := client.Register(Service{Key: "", Value: "value", DeleteOptions: nil}) - if want, have := ErrNoKey, err; want != have { - t.Fatalf("want %v, have %v", want, have) - } - - err = client.Register(Service{Key: "key", Value: "", DeleteOptions: nil}) - if want, have := ErrNoValue, err; want != have { - t.Fatalf("want %v, have %v", want, have) - } - - err = client.Register(Service{Key: "key", Value: "value", DeleteOptions: nil}) - if err != nil { - t.Fatal(err) - } -} - -// Deregister should fail if the input service has an empty key -func TestDeregisterClient(t *testing.T) { - client := newFakeClient(nil, nil, nil) - - err := client.Deregister(Service{Key: "", Value: "value", DeleteOptions: nil}) - if want, have := ErrNoKey, err; want != have { - t.Fatalf("want %v, have %v", want, have) - } - - err = client.Deregister(Service{Key: "key", Value: "", DeleteOptions: nil}) - if err != nil { - t.Fatal(err) - } -} - -// WatchPrefix notify the caller by writing on the channel if an etcd event occurs -// or return in case of an underlying error -func TestWatchPrefix(t *testing.T) { - err := make(chan bool) - event := make(chan bool) - watchPrefixReturned := make(chan bool, 1) - client := newFakeClient(event, err, nil) - - ch := make(chan struct{}) - go func() { - client.WatchPrefix("prefix", ch) // block until an etcd event or error occurs - watchPrefixReturned <- true - }() - - // WatchPrefix force the caller to read once from the channel before actually - // sending notification, emulate that first read. - <-ch - - // Emulate an etcd event - event <- true - if want, have := struct{}{}, <-ch; want != have { - t.Fatalf("want %v, have %v", want, have) - } - - // Emulate an error, WatchPrefix should return - err <- true - select { - case <-watchPrefixReturned: - break - case <-time.After(1 * time.Second): - t.Fatal("WatchPrefix not returning on errors") - } -} - -var errKeyAPI = errors.New("emulate error returned by KeysAPI.Get") - -// table of test cases for method GetEntries -var getEntriesTestTable = []struct { - input getResult // value returned by the underlying etcd.KeysAPI.Get - resp []string // response expected in output of GetEntries - err error //error expected in output of GetEntries - -}{ - // test case: an error is returned by etcd.KeysAPI.Get - {getResult{nil, errKeyAPI}, nil, errKeyAPI}, - // test case: return a single leaf node, with an empty value - {getResult{&etcd.Response{ - Action: "get", - Node: &etcd.Node{ - Key: "nodekey", - Dir: false, - Value: "", - Nodes: nil, - CreatedIndex: 0, - ModifiedIndex: 0, - Expiration: nil, - TTL: 0, - }, - PrevNode: nil, - Index: 0, - }, nil}, []string{}, nil}, - // test case: return a single leaf node, with a value - {getResult{&etcd.Response{ - Action: "get", - Node: &etcd.Node{ - Key: "nodekey", - Dir: false, - Value: "nodevalue", - Nodes: nil, - CreatedIndex: 0, - ModifiedIndex: 0, - Expiration: nil, - TTL: 0, - }, - PrevNode: nil, - Index: 0, - }, nil}, []string{"nodevalue"}, nil}, - // test case: return a node with two childs - {getResult{&etcd.Response{ - Action: "get", - Node: &etcd.Node{ - Key: "nodekey", - Dir: true, - Value: "nodevalue", - Nodes: []*etcd.Node{ - { - Key: "childnode1", - Dir: false, - Value: "childvalue1", - Nodes: nil, - CreatedIndex: 0, - ModifiedIndex: 0, - Expiration: nil, - TTL: 0, - }, - { - Key: "childnode2", - Dir: false, - Value: "childvalue2", - Nodes: nil, - CreatedIndex: 0, - ModifiedIndex: 0, - Expiration: nil, - TTL: 0, - }, - }, - CreatedIndex: 0, - ModifiedIndex: 0, - Expiration: nil, - TTL: 0, - }, - PrevNode: nil, - Index: 0, - }, nil}, []string{"childvalue1", "childvalue2"}, nil}, -} - -func TestGetEntries(t *testing.T) { - for _, et := range getEntriesTestTable { - client := newFakeClient(nil, nil, &et.input) - resp, err := client.GetEntries("prefix") - if want, have := et.resp, resp; !reflect.DeepEqual(want, have) { - t.Fatalf("want %v, have %v", want, have) - } - if want, have := et.err, err; want != have { - t.Fatalf("want %v, have %v", want, have) - } - } -} diff --git a/vendor/github.com/go-kit/kit/sd/etcd/doc.go b/vendor/github.com/go-kit/kit/sd/etcd/doc.go deleted file mode 100644 index 9bd6a5f0..00000000 --- a/vendor/github.com/go-kit/kit/sd/etcd/doc.go +++ /dev/null @@ -1,4 +0,0 @@ -// Package etcd provides an Instancer and Registrar implementation for etcd. If -// you use etcd as your service discovery system, this package will help you -// implement the registration and client-side load balancing patterns. -package etcd diff --git a/vendor/github.com/go-kit/kit/sd/etcd/example_test.go b/vendor/github.com/go-kit/kit/sd/etcd/example_test.go deleted file mode 100644 index 66db15bc..00000000 --- a/vendor/github.com/go-kit/kit/sd/etcd/example_test.go +++ /dev/null @@ -1,69 +0,0 @@ -package etcd - -import ( - "context" - "io" - "time" - - "github.com/go-kit/kit/endpoint" - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/sd" - "github.com/go-kit/kit/sd/lb" -) - -func Example() { - // Let's say this is a service that means to register itself. - // First, we will set up some context. - var ( - etcdServer = "http://10.0.0.1:2379" // don't forget schema and port! - prefix = "/services/foosvc/" // known at compile time - instance = "1.2.3.4:8080" // taken from runtime or platform, somehow - key = prefix + instance // should be globally unique - value = "http://" + instance // based on our transport - ctx = context.Background() - ) - - // Build the client. - client, err := NewClient(ctx, []string{etcdServer}, ClientOptions{}) - if err != nil { - panic(err) - } - - // Build the registrar. - registrar := NewRegistrar(client, Service{ - Key: key, - Value: value, - }, log.NewNopLogger()) - - // Register our instance. - registrar.Register() - - // At the end of our service lifecycle, for example at the end of func main, - // we should make sure to deregister ourselves. This is important! Don't - // accidentally skip this step by invoking a log.Fatal or os.Exit in the - // interim, which bypasses the defer stack. - defer registrar.Deregister() - - // It's likely that we'll also want to connect to other services and call - // their methods. We can build an Instancer to listen for changes from etcd, - // create Endpointer, wrap it with a load-balancer to pick a single - // endpoint, and finally wrap it with a retry strategy to get something that - // can be used as an endpoint directly. - barPrefix := "/services/barsvc" - logger := log.NewNopLogger() - instancer, err := NewInstancer(client, barPrefix, logger) - if err != nil { - panic(err) - } - endpointer := sd.NewEndpointer(instancer, barFactory, logger) - balancer := lb.NewRoundRobin(endpointer) - retry := lb.Retry(3, 3*time.Second, balancer) - - // And now retry can be used like any other endpoint. - req := struct{}{} - if _, err = retry(ctx, req); err != nil { - panic(err) - } -} - -func barFactory(string) (endpoint.Endpoint, io.Closer, error) { return endpoint.Nop, nil, nil } diff --git a/vendor/github.com/go-kit/kit/sd/etcd/instancer.go b/vendor/github.com/go-kit/kit/sd/etcd/instancer.go deleted file mode 100644 index 693fc7a8..00000000 --- a/vendor/github.com/go-kit/kit/sd/etcd/instancer.go +++ /dev/null @@ -1,75 +0,0 @@ -package etcd - -import ( - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/sd" - "github.com/go-kit/kit/sd/internal/instance" -) - -// Instancer yields instances stored in a certain etcd keyspace. Any kind of -// change in that keyspace is watched and will update the Instancer's Instancers. -type Instancer struct { - cache *instance.Cache - client Client - prefix string - logger log.Logger - quitc chan struct{} -} - -// NewInstancer returns an etcd instancer. It will start watching the given -// prefix for changes, and update the subscribers. -func NewInstancer(c Client, prefix string, logger log.Logger) (*Instancer, error) { - s := &Instancer{ - client: c, - prefix: prefix, - cache: instance.NewCache(), - logger: logger, - quitc: make(chan struct{}), - } - - instances, err := s.client.GetEntries(s.prefix) - if err == nil { - logger.Log("prefix", s.prefix, "instances", len(instances)) - } else { - logger.Log("prefix", s.prefix, "err", err) - } - s.cache.Update(sd.Event{Instances: instances, Err: err}) - - go s.loop() - return s, nil -} - -func (s *Instancer) loop() { - ch := make(chan struct{}) - go s.client.WatchPrefix(s.prefix, ch) - for { - select { - case <-ch: - instances, err := s.client.GetEntries(s.prefix) - if err != nil { - s.logger.Log("msg", "failed to retrieve entries", "err", err) - s.cache.Update(sd.Event{Err: err}) - continue - } - s.cache.Update(sd.Event{Instances: instances}) - - case <-s.quitc: - return - } - } -} - -// Stop terminates the Instancer. -func (s *Instancer) Stop() { - close(s.quitc) -} - -// Register implements Instancer. -func (s *Instancer) Register(ch chan<- sd.Event) { - s.cache.Register(ch) -} - -// Deregister implements Instancer. -func (s *Instancer) Deregister(ch chan<- sd.Event) { - s.cache.Deregister(ch) -} diff --git a/vendor/github.com/go-kit/kit/sd/etcd/instancer_test.go b/vendor/github.com/go-kit/kit/sd/etcd/instancer_test.go deleted file mode 100644 index 5e18e109..00000000 --- a/vendor/github.com/go-kit/kit/sd/etcd/instancer_test.go +++ /dev/null @@ -1,70 +0,0 @@ -package etcd - -import ( - "errors" - "testing" - - stdetcd "github.com/coreos/etcd/client" - - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/sd" -) - -var _ sd.Instancer = (*Instancer)(nil) // API check - -var ( - node = &stdetcd.Node{ - Key: "/foo", - Nodes: []*stdetcd.Node{ - {Key: "/foo/1", Value: "1:1"}, - {Key: "/foo/2", Value: "1:2"}, - }, - } - fakeResponse = &stdetcd.Response{ - Node: node, - } -) - -var _ sd.Instancer = &Instancer{} // API check - -func TestInstancer(t *testing.T) { - client := &fakeClient{ - responses: map[string]*stdetcd.Response{"/foo": fakeResponse}, - } - - s, err := NewInstancer(client, "/foo", log.NewNopLogger()) - if err != nil { - t.Fatal(err) - } - defer s.Stop() - - if state := s.cache.State(); state.Err != nil { - t.Fatal(state.Err) - } -} - -type fakeClient struct { - responses map[string]*stdetcd.Response -} - -func (c *fakeClient) GetEntries(prefix string) ([]string, error) { - response, ok := c.responses[prefix] - if !ok { - return nil, errors.New("key not exist") - } - - entries := make([]string, len(response.Node.Nodes)) - for i, node := range response.Node.Nodes { - entries[i] = node.Value - } - return entries, nil -} - -func (c *fakeClient) WatchPrefix(prefix string, ch chan struct{}) {} - -func (c *fakeClient) Register(Service) error { - return nil -} -func (c *fakeClient) Deregister(Service) error { - return nil -} diff --git a/vendor/github.com/go-kit/kit/sd/etcd/integration_test.go b/vendor/github.com/go-kit/kit/sd/etcd/integration_test.go deleted file mode 100644 index 5ec3baca..00000000 --- a/vendor/github.com/go-kit/kit/sd/etcd/integration_test.go +++ /dev/null @@ -1,124 +0,0 @@ -// +build integration - -package etcd - -import ( - "context" - "io" - "os" - "testing" - "time" - - "github.com/go-kit/kit/endpoint" - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/sd" -) - -// Package sd/etcd provides a wrapper around the etcd key/value store. This -// example assumes the user has an instance of etcd installed and running -// locally on port 2379. -func TestIntegration(t *testing.T) { - addr := os.Getenv("ETCD_ADDR") - if addr == "" { - t.Skip("ETCD_ADDR not set; skipping integration test") - } - - var ( - prefix = "/services/foosvc/" // known at compile time - instance = "1.2.3.4:8080" // taken from runtime or platform, somehow - key = prefix + instance - value = "http://" + instance // based on our transport - ) - - client, err := NewClient(context.Background(), []string{addr}, ClientOptions{ - DialTimeout: 2 * time.Second, - DialKeepAlive: 2 * time.Second, - HeaderTimeoutPerRequest: 2 * time.Second, - }) - if err != nil { - t.Fatalf("NewClient(%q): %v", addr, err) - } - - // Verify test data is initially empty. - entries, err := client.GetEntries(key) - if err == nil { - t.Fatalf("GetEntries(%q): expected error, got none", key) - } - t.Logf("GetEntries(%q): %v (OK)", key, err) - - // Instantiate a new Registrar, passing in test data. - registrar := NewRegistrar(client, Service{ - Key: key, - Value: value, - }, log.With(log.NewLogfmtLogger(os.Stderr), "component", "registrar")) - - // Register our instance. - registrar.Register() - t.Logf("Registered") - - // Retrieve entries from etcd manually. - entries, err = client.GetEntries(key) - if err != nil { - t.Fatalf("client.GetEntries(%q): %v", key, err) - } - if want, have := 1, len(entries); want != have { - t.Fatalf("client.GetEntries(%q): want %d, have %d", key, want, have) - } - if want, have := value, entries[0]; want != have { - t.Fatalf("want %q, have %q", want, have) - } - - instancer, err := NewInstancer( - client, - prefix, - log.With(log.NewLogfmtLogger(os.Stderr), "component", "instancer"), - ) - if err != nil { - t.Fatalf("NewInstancer: %v", err) - } - endpointer := sd.NewEndpointer( - instancer, - func(string) (endpoint.Endpoint, io.Closer, error) { return endpoint.Nop, nil, nil }, - log.With(log.NewLogfmtLogger(os.Stderr), "component", "instancer"), - ) - t.Logf("Constructed Endpointer OK") - - if !within(time.Second, func() bool { - endpoints, err := endpointer.Endpoints() - return err == nil && len(endpoints) == 1 - }) { - t.Fatalf("Endpointer didn't see Register in time") - } - t.Logf("Endpointer saw Register OK") - - // Deregister first instance of test data. - registrar.Deregister() - t.Logf("Deregistered") - - // Check it was deregistered. - if !within(time.Second, func() bool { - endpoints, err := endpointer.Endpoints() - t.Logf("Checking Deregister: len(endpoints) = %d, err = %v", len(endpoints), err) - return err == nil && len(endpoints) == 0 - }) { - t.Fatalf("Endpointer didn't see Deregister in time") - } - - // Verify test data no longer exists in etcd. - _, err = client.GetEntries(key) - if err == nil { - t.Fatalf("GetEntries(%q): expected error, got none", key) - } - t.Logf("GetEntries(%q): %v (OK)", key, err) -} - -func within(d time.Duration, f func() bool) bool { - deadline := time.Now().Add(d) - for time.Now().Before(deadline) { - if f() { - return true - } - time.Sleep(d / 10) - } - return false -} diff --git a/vendor/github.com/go-kit/kit/sd/etcd/registrar.go b/vendor/github.com/go-kit/kit/sd/etcd/registrar.go deleted file mode 100644 index e3864309..00000000 --- a/vendor/github.com/go-kit/kit/sd/etcd/registrar.go +++ /dev/null @@ -1,120 +0,0 @@ -package etcd - -import ( - "sync" - "time" - - etcd "github.com/coreos/etcd/client" - - "github.com/go-kit/kit/log" -) - -const minHeartBeatTime = 500 * time.Millisecond - -// Registrar registers service instance liveness information to etcd. -type Registrar struct { - client Client - service Service - logger log.Logger - - quitmtx sync.Mutex - quit chan struct{} -} - -// Service holds the instance identifying data you want to publish to etcd. Key -// must be unique, and value is the string returned to subscribers, typically -// called the "instance" string in other parts of package sd. -type Service struct { - Key string // unique key, e.g. "/service/foobar/1.2.3.4:8080" - Value string // returned to subscribers, e.g. "http://1.2.3.4:8080" - TTL *TTLOption - DeleteOptions *etcd.DeleteOptions -} - -// TTLOption allow setting a key with a TTL. This option will be used by a loop -// goroutine which regularly refreshes the lease of the key. -type TTLOption struct { - heartbeat time.Duration // e.g. time.Second * 3 - ttl time.Duration // e.g. time.Second * 10 -} - -// NewTTLOption returns a TTLOption that contains proper TTL settings. Heartbeat -// is used to refresh the lease of the key periodically; its value should be at -// least 500ms. TTL defines the lease of the key; its value should be -// significantly greater than heartbeat. -// -// Good default values might be 3s heartbeat, 10s TTL. -func NewTTLOption(heartbeat, ttl time.Duration) *TTLOption { - if heartbeat <= minHeartBeatTime { - heartbeat = minHeartBeatTime - } - if ttl <= heartbeat { - ttl = 3 * heartbeat - } - return &TTLOption{ - heartbeat: heartbeat, - ttl: ttl, - } -} - -// NewRegistrar returns a etcd Registrar acting on the provided catalog -// registration (service). -func NewRegistrar(client Client, service Service, logger log.Logger) *Registrar { - return &Registrar{ - client: client, - service: service, - logger: log.With(logger, "key", service.Key, "value", service.Value), - } -} - -// Register implements the sd.Registrar interface. Call it when you want your -// service to be registered in etcd, typically at startup. -func (r *Registrar) Register() { - if err := r.client.Register(r.service); err != nil { - r.logger.Log("err", err) - } else { - r.logger.Log("action", "register") - } - if r.service.TTL != nil { - go r.loop() - } -} - -func (r *Registrar) loop() { - r.quitmtx.Lock() - if r.quit != nil { - return // already running - } - r.quit = make(chan struct{}) - r.quitmtx.Unlock() - - tick := time.NewTicker(r.service.TTL.heartbeat) - defer tick.Stop() - for { - select { - case <-tick.C: - if err := r.client.Register(r.service); err != nil { - r.logger.Log("err", err) - } - case <-r.quit: - return - } - } -} - -// Deregister implements the sd.Registrar interface. Call it when you want your -// service to be deregistered from etcd, typically just prior to shutdown. -func (r *Registrar) Deregister() { - if err := r.client.Deregister(r.service); err != nil { - r.logger.Log("err", err) - } else { - r.logger.Log("action", "deregister") - } - - r.quitmtx.Lock() - defer r.quitmtx.Unlock() - if r.quit != nil { - close(r.quit) - r.quit = nil - } -} diff --git a/vendor/github.com/go-kit/kit/sd/etcd/registrar_test.go b/vendor/github.com/go-kit/kit/sd/etcd/registrar_test.go deleted file mode 100644 index 9426f0b5..00000000 --- a/vendor/github.com/go-kit/kit/sd/etcd/registrar_test.go +++ /dev/null @@ -1,111 +0,0 @@ -package etcd - -import ( - "bytes" - "errors" - "testing" - - "github.com/go-kit/kit/log" -) - -// testClient is a basic implementation of Client -type testClient struct { - registerRes error // value returned when Register or Deregister is called -} - -func (tc *testClient) GetEntries(prefix string) ([]string, error) { - return nil, nil -} - -func (tc *testClient) WatchPrefix(prefix string, ch chan struct{}) { - return -} - -func (tc *testClient) Register(s Service) error { - return tc.registerRes -} - -func (tc *testClient) Deregister(s Service) error { - return tc.registerRes -} - -// default service used to build registrar in our tests -var testService = Service{"testKey", "testValue", nil, nil} - -// NewRegistar should return a registar with a logger using the service key and value -func TestNewRegistar(t *testing.T) { - c := Client(&testClient{nil}) - buf := &bytes.Buffer{} - logger := log.NewLogfmtLogger(buf) - r := NewRegistrar( - c, - testService, - logger, - ) - - if err := r.logger.Log("msg", "message"); err != nil { - t.Fatal(err) - } - if want, have := "key=testKey value=testValue msg=message\n", buf.String(); want != have { - t.Errorf("\nwant: %shave: %s", want, have) - } -} - -// Register log the error returned by the client or log the successful registration action -// table of test cases for method Register -var registerTestTable = []struct { - registerRes error // value returned by the client on calls to Register - log string // expected log by the registrar - -}{ - // test case: an error is returned by the client - {errors.New("regError"), "key=testKey value=testValue err=regError\n"}, - // test case: registration successful - {nil, "key=testKey value=testValue action=register\n"}, -} - -func TestRegister(t *testing.T) { - for _, tc := range registerTestTable { - c := Client(&testClient{tc.registerRes}) - buf := &bytes.Buffer{} - logger := log.NewLogfmtLogger(buf) - r := NewRegistrar( - c, - testService, - logger, - ) - r.Register() - if want, have := tc.log, buf.String(); want != have { - t.Fatalf("want %v, have %v", want, have) - } - } -} - -// Deregister log the error returned by the client or log the successful deregistration action -// table of test cases for method Deregister -var deregisterTestTable = []struct { - deregisterRes error // value returned by the client on calls to Deregister - log string // expected log by the registrar -}{ - // test case: an error is returned by the client - {errors.New("deregError"), "key=testKey value=testValue err=deregError\n"}, - // test case: deregistration successful - {nil, "key=testKey value=testValue action=deregister\n"}, -} - -func TestDeregister(t *testing.T) { - for _, tc := range deregisterTestTable { - c := Client(&testClient{tc.deregisterRes}) - buf := &bytes.Buffer{} - logger := log.NewLogfmtLogger(buf) - r := NewRegistrar( - c, - testService, - logger, - ) - r.Deregister() - if want, have := tc.log, buf.String(); want != have { - t.Fatalf("want %v, have %v", want, have) - } - } -} diff --git a/vendor/github.com/go-kit/kit/sd/eureka/doc.go b/vendor/github.com/go-kit/kit/sd/eureka/doc.go deleted file mode 100644 index b153d33d..00000000 --- a/vendor/github.com/go-kit/kit/sd/eureka/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package eureka provides Instancer and Registrar implementations for Netflix OSS's Eureka -package eureka diff --git a/vendor/github.com/go-kit/kit/sd/eureka/instancer.go b/vendor/github.com/go-kit/kit/sd/eureka/instancer.go deleted file mode 100644 index d00b98c9..00000000 --- a/vendor/github.com/go-kit/kit/sd/eureka/instancer.go +++ /dev/null @@ -1,105 +0,0 @@ -package eureka - -import ( - "fmt" - - "github.com/hudl/fargo" - - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/sd" - "github.com/go-kit/kit/sd/internal/instance" -) - -// Instancer yields instances stored in the Eureka registry for the given app. -// Changes in that app are watched and will update the subscribers. -type Instancer struct { - cache *instance.Cache - conn fargoConnection - app string - logger log.Logger - quitc chan chan struct{} -} - -// NewInstancer returns a Eureka Instancer. It will start watching the given -// app string for changes, and update the subscribers accordingly. -func NewInstancer(conn fargoConnection, app string, logger log.Logger) *Instancer { - logger = log.With(logger, "app", app) - - s := &Instancer{ - cache: instance.NewCache(), - conn: conn, - app: app, - logger: logger, - quitc: make(chan chan struct{}), - } - - done := make(chan struct{}) - updates := conn.ScheduleAppUpdates(app, true, done) - s.consume(<-updates) - go s.loop(updates, done) - return s -} - -// Stop terminates the Instancer. -func (s *Instancer) Stop() { - q := make(chan struct{}) - s.quitc <- q - <-q - s.quitc = nil -} - -func (s *Instancer) consume(update fargo.AppUpdate) { - if update.Err != nil { - s.logger.Log("during", "Update", "err", update.Err) - s.cache.Update(sd.Event{Err: update.Err}) - return - } - instances := convertFargoAppToInstances(update.App) - s.logger.Log("instances", len(instances)) - s.cache.Update(sd.Event{Instances: instances}) -} - -func (s *Instancer) loop(updates <-chan fargo.AppUpdate, done chan<- struct{}) { - defer close(done) - - for { - select { - case update := <-updates: - s.consume(update) - case q := <-s.quitc: - close(q) - return - } - } -} - -func (s *Instancer) getInstances() ([]string, error) { - app, err := s.conn.GetApp(s.app) - if err != nil { - return nil, err - } - return convertFargoAppToInstances(app), nil -} - -func convertFargoAppToInstances(app *fargo.Application) []string { - instances := make([]string, len(app.Instances)) - for i, inst := range app.Instances { - instances[i] = fmt.Sprintf("%s:%d", inst.IPAddr, inst.Port) - } - return instances -} - -// Register implements Instancer. -func (s *Instancer) Register(ch chan<- sd.Event) { - s.cache.Register(ch) -} - -// Deregister implements Instancer. -func (s *Instancer) Deregister(ch chan<- sd.Event) { - s.cache.Deregister(ch) -} - -// state returns the current state of instance.Cache, only for testing -func (s *Instancer) state() sd.Event { - return s.cache.State() -} diff --git a/vendor/github.com/go-kit/kit/sd/eureka/instancer_test.go b/vendor/github.com/go-kit/kit/sd/eureka/instancer_test.go deleted file mode 100644 index 9363e505..00000000 --- a/vendor/github.com/go-kit/kit/sd/eureka/instancer_test.go +++ /dev/null @@ -1,92 +0,0 @@ -package eureka - -import ( - "testing" - "time" - - "github.com/hudl/fargo" - - "github.com/go-kit/kit/sd" -) - -var _ sd.Instancer = (*Instancer)(nil) // API check - -func TestInstancer(t *testing.T) { - connection := &testConnection{ - instances: []*fargo.Instance{instanceTest1, instanceTest2}, - errApplication: nil, - } - - instancer := NewInstancer(connection, appNameTest, loggerTest) - defer instancer.Stop() - - state := instancer.state() - if state.Err != nil { - t.Fatal(state.Err) - } - - if want, have := 2, len(state.Instances); want != have { - t.Errorf("want %d, have %d", want, have) - } -} - -func TestInstancerReceivesUpdates(t *testing.T) { - connection := &testConnection{ - instances: []*fargo.Instance{instanceTest1}, - errApplication: nil, - } - - instancer := NewInstancer(connection, appNameTest, loggerTest) - defer instancer.Stop() - - verifyCount := func(want int) (have int, converged bool) { - const maxPollAttempts = 5 - const delayPerAttempt = 200 * time.Millisecond - for i := 1; ; i++ { - state := instancer.state() - if have := len(state.Instances); want == have { - return have, true - } else if i == maxPollAttempts { - return have, false - } - time.Sleep(delayPerAttempt) - } - } - - if have, converged := verifyCount(1); !converged { - t.Fatalf("initial: want %d, have %d", 1, have) - } - - if err := connection.RegisterInstance(instanceTest2); err != nil { - t.Fatalf("failed to register an instance: %v", err) - } - if have, converged := verifyCount(2); !converged { - t.Fatalf("after registration: want %d, have %d", 2, have) - } - - if err := connection.DeregisterInstance(instanceTest1); err != nil { - t.Fatalf("failed to unregister an instance: %v", err) - } - if have, converged := verifyCount(1); !converged { - t.Fatalf("after deregistration: want %d, have %d", 1, have) - } -} - -func TestBadInstancerScheduleUpdates(t *testing.T) { - connection := &testConnection{ - instances: []*fargo.Instance{instanceTest1}, - errApplication: errTest, - } - - instancer := NewInstancer(connection, appNameTest, loggerTest) - defer instancer.Stop() - - state := instancer.state() - if state.Err == nil { - t.Fatal("expecting error") - } - - if want, have := 0, len(state.Instances); want != have { - t.Errorf("want %d, have %d", want, have) - } -} diff --git a/vendor/github.com/go-kit/kit/sd/eureka/integration_test.go b/vendor/github.com/go-kit/kit/sd/eureka/integration_test.go deleted file mode 100644 index 210882b4..00000000 --- a/vendor/github.com/go-kit/kit/sd/eureka/integration_test.go +++ /dev/null @@ -1,91 +0,0 @@ -// +build integration - -package eureka - -import ( - "os" - "testing" - "time" - - "github.com/hudl/fargo" - - "github.com/go-kit/kit/log" -) - -// Package sd/eureka provides a wrapper around the Netflix Eureka service -// registry by way of the Fargo library. This test assumes the user has an -// instance of Eureka available at the address in the environment variable. -// Example `${EUREKA_ADDR}` format: http://localhost:8761/eureka -// -// NOTE: when starting a Eureka server for integration testing, ensure -// the response cache interval is reduced to one second. This can be -// achieved with the following Java argument: -// `-Deureka.server.responseCacheUpdateIntervalMs=1000` -func TestIntegration(t *testing.T) { - eurekaAddr := os.Getenv("EUREKA_ADDR") - if eurekaAddr == "" { - t.Skip("EUREKA_ADDR is not set") - } - - logger := log.NewLogfmtLogger(os.Stderr) - logger = log.With(logger, "ts", log.DefaultTimestamp) - - var fargoConfig fargo.Config - // Target Eureka server(s). - fargoConfig.Eureka.ServiceUrls = []string{eurekaAddr} - // How often the subscriber should poll for updates. - fargoConfig.Eureka.PollIntervalSeconds = 1 - - // Create a Fargo connection and a Eureka registrar. - fargoConnection := fargo.NewConnFromConfig(fargoConfig) - registrar1 := NewRegistrar(&fargoConnection, instanceTest1, log.With(logger, "component", "registrar1")) - - // Register one instance. - registrar1.Register() - defer registrar1.Deregister() - - // Build a Eureka instancer. - instancer := NewInstancer( - &fargoConnection, - appNameTest, - log.With(logger, "component", "instancer"), - ) - defer instancer.Stop() - - // checks every 100ms (fr up to 10s) for the expected number of instances to be reported - waitForInstances := func(count int) { - for t := 0; t < 100; t++ { - state := instancer.state() - if len(state.Instances) == count { - return - } - time.Sleep(100 * time.Millisecond) - } - state := instancer.state() - if state.Err != nil { - t.Error(state.Err) - } - if want, have := 1, len(state.Instances); want != have { - t.Errorf("want %d, have %d", want, have) - } - } - - // We should have one instance immediately after subscriber instantiation. - waitForInstances(1) - - // Register a second instance - registrar2 := NewRegistrar(&fargoConnection, instanceTest2, log.With(logger, "component", "registrar2")) - registrar2.Register() - defer registrar2.Deregister() // In case of exceptional circumstances. - - // This should be enough time for a scheduled update assuming Eureka is - // configured with the properties mentioned in the function comments. - waitForInstances(2) - - // Deregister the second instance. - registrar2.Deregister() - - // Wait for another scheduled update. - // And then there was one. - waitForInstances(1) -} diff --git a/vendor/github.com/go-kit/kit/sd/eureka/registrar.go b/vendor/github.com/go-kit/kit/sd/eureka/registrar.go deleted file mode 100644 index 7af7836f..00000000 --- a/vendor/github.com/go-kit/kit/sd/eureka/registrar.go +++ /dev/null @@ -1,143 +0,0 @@ -package eureka - -import ( - "fmt" - "net/http" - "sync" - "time" - - "github.com/hudl/fargo" - - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/sd" -) - -// Matches official Netflix Java client default. -const defaultRenewalInterval = 30 * time.Second - -// The methods of fargo.Connection used in this package. -type fargoConnection interface { - RegisterInstance(instance *fargo.Instance) error - DeregisterInstance(instance *fargo.Instance) error - ReregisterInstance(instance *fargo.Instance) error - HeartBeatInstance(instance *fargo.Instance) error - ScheduleAppUpdates(name string, await bool, done <-chan struct{}) <-chan fargo.AppUpdate - GetApp(name string) (*fargo.Application, error) -} - -type fargoUnsuccessfulHTTPResponse struct { - statusCode int - messagePrefix string -} - -func (u *fargoUnsuccessfulHTTPResponse) Error() string { - return fmt.Sprintf("err=%s code=%d", u.messagePrefix, u.statusCode) -} - -// Registrar maintains service instance liveness information in Eureka. -type Registrar struct { - conn fargoConnection - instance *fargo.Instance - logger log.Logger - quitc chan chan struct{} - sync.Mutex -} - -var _ sd.Registrar = (*Registrar)(nil) - -// NewRegistrar returns an Eureka Registrar acting on behalf of the provided -// Fargo connection and instance. See the integration test for usage examples. -func NewRegistrar(conn fargoConnection, instance *fargo.Instance, logger log.Logger) *Registrar { - return &Registrar{ - conn: conn, - instance: instance, - logger: log.With(logger, "service", instance.App, "address", fmt.Sprintf("%s:%d", instance.IPAddr, instance.Port)), - } -} - -// Register implements sd.Registrar. -func (r *Registrar) Register() { - r.Lock() - defer r.Unlock() - - if r.quitc != nil { - return // Already in the registration loop. - } - - if err := r.conn.RegisterInstance(r.instance); err != nil { - r.logger.Log("during", "Register", "err", err) - } - - r.quitc = make(chan chan struct{}) - go r.loop() -} - -// Deregister implements sd.Registrar. -func (r *Registrar) Deregister() { - r.Lock() - defer r.Unlock() - - if r.quitc == nil { - return // Already deregistered. - } - - q := make(chan struct{}) - r.quitc <- q - <-q - r.quitc = nil -} - -func (r *Registrar) loop() { - var renewalInterval time.Duration - if r.instance.LeaseInfo.RenewalIntervalInSecs > 0 { - renewalInterval = time.Duration(r.instance.LeaseInfo.RenewalIntervalInSecs) * time.Second - } else { - renewalInterval = defaultRenewalInterval - } - ticker := time.NewTicker(renewalInterval) - defer ticker.Stop() - - for { - select { - case <-ticker.C: - if err := r.heartbeat(); err != nil { - r.logger.Log("during", "heartbeat", "err", err) - } - - case q := <-r.quitc: - if err := r.conn.DeregisterInstance(r.instance); err != nil { - r.logger.Log("during", "Deregister", "err", err) - } - close(q) - return - } - } -} - -func httpResponseStatusCode(err error) (code int, present bool) { - if code, ok := fargo.HTTPResponseStatusCode(err); ok { - return code, true - } - // Allow injection of errors for testing. - if u, ok := err.(*fargoUnsuccessfulHTTPResponse); ok { - return u.statusCode, true - } - return 0, false -} - -func isNotFound(err error) bool { - code, ok := httpResponseStatusCode(err) - return ok && code == http.StatusNotFound -} - -func (r *Registrar) heartbeat() error { - err := r.conn.HeartBeatInstance(r.instance) - if err == nil { - return nil - } - if isNotFound(err) { - // Instance expired (e.g. network partition). Re-register. - return r.conn.ReregisterInstance(r.instance) - } - return err -} diff --git a/vendor/github.com/go-kit/kit/sd/eureka/registrar_test.go b/vendor/github.com/go-kit/kit/sd/eureka/registrar_test.go deleted file mode 100644 index 7974e75b..00000000 --- a/vendor/github.com/go-kit/kit/sd/eureka/registrar_test.go +++ /dev/null @@ -1,102 +0,0 @@ -package eureka - -import ( - "testing" - "time" -) - -func TestRegistrar(t *testing.T) { - connection := &testConnection{ - errHeartbeat: errTest, - } - - registrar1 := NewRegistrar(connection, instanceTest1, loggerTest) - registrar2 := NewRegistrar(connection, instanceTest2, loggerTest) - - // Not registered. - registrar1.Deregister() - if want, have := 0, len(connection.instances); want != have { - t.Errorf("want %d, have %d", want, have) - } - - // Register. - registrar1.Register() - if want, have := 1, len(connection.instances); want != have { - t.Errorf("want %d, have %d", want, have) - } - - registrar2.Register() - if want, have := 2, len(connection.instances); want != have { - t.Errorf("want %d, have %d", want, have) - } - - // Deregister. - registrar1.Deregister() - if want, have := 1, len(connection.instances); want != have { - t.Errorf("want %d, have %d", want, have) - } - - // Already registered. - registrar1.Register() - if want, have := 2, len(connection.instances); want != have { - t.Errorf("want %d, have %d", want, have) - } - registrar1.Register() - if want, have := 2, len(connection.instances); want != have { - t.Errorf("want %d, have %d", want, have) - } - - // Wait for a heartbeat failure. - time.Sleep(1010 * time.Millisecond) - if want, have := 2, len(connection.instances); want != have { - t.Errorf("want %d, have %d", want, have) - } - registrar1.Deregister() - if want, have := 1, len(connection.instances); want != have { - t.Errorf("want %d, have %d", want, have) - } -} - -func TestBadRegister(t *testing.T) { - connection := &testConnection{ - errRegister: errTest, - } - - registrar := NewRegistrar(connection, instanceTest1, loggerTest) - registrar.Register() - if want, have := 0, len(connection.instances); want != have { - t.Errorf("want %d, have %d", want, have) - } -} - -func TestBadDeregister(t *testing.T) { - connection := &testConnection{ - errDeregister: errTest, - } - - registrar := NewRegistrar(connection, instanceTest1, loggerTest) - registrar.Register() - if want, have := 1, len(connection.instances); want != have { - t.Errorf("want %d, have %d", want, have) - } - registrar.Deregister() - if want, have := 1, len(connection.instances); want != have { - t.Errorf("want %d, have %d", want, have) - } -} - -func TestExpiredInstance(t *testing.T) { - connection := &testConnection{ - errHeartbeat: errNotFound, - } - - registrar := NewRegistrar(connection, instanceTest1, loggerTest) - registrar.Register() - - // Wait for a heartbeat failure. - time.Sleep(1010 * time.Millisecond) - - if want, have := 1, len(connection.instances); want != have { - t.Errorf("want %d, have %d", want, have) - } -} diff --git a/vendor/github.com/go-kit/kit/sd/eureka/util_test.go b/vendor/github.com/go-kit/kit/sd/eureka/util_test.go deleted file mode 100644 index e8a71a44..00000000 --- a/vendor/github.com/go-kit/kit/sd/eureka/util_test.go +++ /dev/null @@ -1,152 +0,0 @@ -package eureka - -import ( - "errors" - "fmt" - "reflect" - "sync" - "time" - - "github.com/go-kit/kit/log" - "github.com/hudl/fargo" -) - -type testConnection struct { - mu sync.RWMutex - instances []*fargo.Instance - - errApplication error - errHeartbeat error - errRegister error - errDeregister error -} - -var ( - errTest = errors.New("kaboom") - errNotFound = &fargoUnsuccessfulHTTPResponse{statusCode: 404, messagePrefix: "not found"} - loggerTest = log.NewNopLogger() - appNameTest = "go-kit" - instanceTest1 = &fargo.Instance{ - HostName: "serveregistrar1.acme.org", - Port: 8080, - App: appNameTest, - IPAddr: "192.168.0.1", - VipAddress: "192.168.0.1", - SecureVipAddress: "192.168.0.1", - HealthCheckUrl: "http://serveregistrar1.acme.org:8080/healthz", - StatusPageUrl: "http://serveregistrar1.acme.org:8080/status", - HomePageUrl: "http://serveregistrar1.acme.org:8080/", - Status: fargo.UP, - DataCenterInfo: fargo.DataCenterInfo{Name: fargo.MyOwn}, - LeaseInfo: fargo.LeaseInfo{RenewalIntervalInSecs: 1}, - } - instanceTest2 = &fargo.Instance{ - HostName: "serveregistrar2.acme.org", - Port: 8080, - App: appNameTest, - IPAddr: "192.168.0.2", - VipAddress: "192.168.0.2", - SecureVipAddress: "192.168.0.2", - HealthCheckUrl: "http://serveregistrar2.acme.org:8080/healthz", - StatusPageUrl: "http://serveregistrar2.acme.org:8080/status", - HomePageUrl: "http://serveregistrar2.acme.org:8080/", - Status: fargo.UP, - DataCenterInfo: fargo.DataCenterInfo{Name: fargo.MyOwn}, - } -) - -var _ fargoConnection = (*testConnection)(nil) - -func (c *testConnection) RegisterInstance(i *fargo.Instance) error { - if c.errRegister != nil { - return c.errRegister - } - c.mu.Lock() - defer c.mu.Unlock() - for _, instance := range c.instances { - if reflect.DeepEqual(*instance, *i) { - return errors.New("already registered") - } - } - c.instances = append(c.instances, i) - return nil -} - -func (c *testConnection) HeartBeatInstance(i *fargo.Instance) error { - return c.errHeartbeat -} - -func (c *testConnection) DeregisterInstance(i *fargo.Instance) error { - if c.errDeregister != nil { - return c.errDeregister - } - c.mu.Lock() - defer c.mu.Unlock() - remaining := make([]*fargo.Instance, 0, len(c.instances)) - for _, instance := range c.instances { - if reflect.DeepEqual(*instance, *i) { - continue - } - remaining = append(remaining, instance) - } - if len(remaining) == len(c.instances) { - return errors.New("not registered") - } - c.instances = remaining - return nil -} - -func (c *testConnection) ReregisterInstance(ins *fargo.Instance) error { - return nil -} - -func (c *testConnection) instancesForApplication(name string) []*fargo.Instance { - c.mu.RLock() - defer c.mu.RUnlock() - instances := make([]*fargo.Instance, 0, len(c.instances)) - for _, i := range c.instances { - if i.App == name { - instances = append(instances, i) - } - } - return instances -} - -func (c *testConnection) GetApp(name string) (*fargo.Application, error) { - if err := c.errApplication; err != nil { - return nil, err - } - instances := c.instancesForApplication(name) - if len(instances) == 0 { - return nil, fmt.Errorf("Application not found for name=%s", name) - } - return &fargo.Application{Name: name, Instances: instances}, nil -} - -func (c *testConnection) ScheduleAppUpdates(name string, await bool, done <-chan struct{}) <-chan fargo.AppUpdate { - updatec := make(chan fargo.AppUpdate, 1) - send := func() { - app, err := c.GetApp(name) - select { - case updatec <- fargo.AppUpdate{App: app, Err: err}: - default: - } - } - - if await { - send() - } - go func() { - ticker := time.NewTicker(100 * time.Millisecond) - for { - select { - case <-ticker.C: - send() - case <-done: - ticker.Stop() - return - } - } - }() - return updatec -} diff --git a/vendor/github.com/go-kit/kit/sd/factory.go b/vendor/github.com/go-kit/kit/sd/factory.go deleted file mode 100644 index af99817b..00000000 --- a/vendor/github.com/go-kit/kit/sd/factory.go +++ /dev/null @@ -1,17 +0,0 @@ -package sd - -import ( - "io" - - "github.com/go-kit/kit/endpoint" -) - -// Factory is a function that converts an instance string (e.g. host:port) to a -// specific endpoint. Instances that provide multiple endpoints require multiple -// factories. A factory also returns an io.Closer that's invoked when the -// instance goes away and needs to be cleaned up. Factories may return nil -// closers. -// -// Users are expected to provide their own factory functions that assume -// specific transports, or can deduce transports by parsing the instance string. -type Factory func(instance string) (endpoint.Endpoint, io.Closer, error) diff --git a/vendor/github.com/go-kit/kit/sd/instancer.go b/vendor/github.com/go-kit/kit/sd/instancer.go deleted file mode 100644 index 0a8e6c69..00000000 --- a/vendor/github.com/go-kit/kit/sd/instancer.go +++ /dev/null @@ -1,38 +0,0 @@ -package sd - -// Event represents a push notification generated from the underlying service discovery -// implementation. It contains either a full set of available resource instances, or -// an error indicating some issue with obtaining information from discovery backend. -// Examples of errors may include loosing connection to the discovery backend, or -// trying to look up resource instances using an incorrectly formatted key. -// After receiving an Event with an error the listenter should treat previously discovered -// resource instances as stale (although it may choose to continue using them). -// If the Instancer is able to restore connection to the discovery backend it must push -// another Event with the current set of resource instances. -type Event struct { - Instances []string - Err error -} - -// Instancer listens to a service discovery system and notifies registered -// observers of changes in the resource instances. Every event sent to the channels -// contains a complete set of instances known to the Instancer. That complete set is -// sent immediately upon registering the channel, and on any future updates from -// discovery system. -type Instancer interface { - Register(chan<- Event) - Deregister(chan<- Event) - Stop() -} - -// FixedInstancer yields a fixed set of instances. -type FixedInstancer []string - -// Register implements Instancer. -func (d FixedInstancer) Register(ch chan<- Event) { ch <- Event{Instances: d} } - -// Deregister implements Instancer. -func (d FixedInstancer) Deregister(ch chan<- Event) {} - -// Stop implements Instancer. -func (d FixedInstancer) Stop() {} diff --git a/vendor/github.com/go-kit/kit/sd/internal/instance/cache.go b/vendor/github.com/go-kit/kit/sd/internal/instance/cache.go deleted file mode 100644 index 27b2122a..00000000 --- a/vendor/github.com/go-kit/kit/sd/internal/instance/cache.go +++ /dev/null @@ -1,83 +0,0 @@ -package instance - -import ( - "reflect" - "sort" - "sync" - - "github.com/go-kit/kit/sd" -) - -// Cache keeps track of resource instances provided to it via Update method -// and implements the Instancer interface -type Cache struct { - mtx sync.RWMutex - state sd.Event - reg registry -} - -// NewCache creates a new Cache. -func NewCache() *Cache { - return &Cache{ - reg: registry{}, - } -} - -// Update receives new instances from service discovery, stores them internally, -// and notifies all registered listeners. -func (c *Cache) Update(event sd.Event) { - c.mtx.Lock() - defer c.mtx.Unlock() - - sort.Strings(event.Instances) - if reflect.DeepEqual(c.state, event) { - return // no need to broadcast the same instances - } - - c.state = event - c.reg.broadcast(event) -} - -// State returns the current state of discovery (instances or error) as sd.Event -func (c *Cache) State() sd.Event { - c.mtx.RLock() - defer c.mtx.RUnlock() - return c.state -} - -// Stop implements Instancer. Since the cache is just a plain-old store of data, -// Stop is a no-op. -func (c *Cache) Stop() {} - -// Register implements Instancer. -func (c *Cache) Register(ch chan<- sd.Event) { - c.mtx.Lock() - defer c.mtx.Unlock() - c.reg.register(ch) - // always push the current state to new channels - ch <- c.state -} - -// Deregister implements Instancer. -func (c *Cache) Deregister(ch chan<- sd.Event) { - c.mtx.Lock() - defer c.mtx.Unlock() - c.reg.deregister(ch) -} - -// registry is not goroutine-safe. -type registry map[chan<- sd.Event]struct{} - -func (r registry) broadcast(event sd.Event) { - for c := range r { - c <- event - } -} - -func (r registry) register(c chan<- sd.Event) { - r[c] = struct{}{} -} - -func (r registry) deregister(c chan<- sd.Event) { - delete(r, c) -} diff --git a/vendor/github.com/go-kit/kit/sd/internal/instance/cache_test.go b/vendor/github.com/go-kit/kit/sd/internal/instance/cache_test.go deleted file mode 100644 index 05a1cc27..00000000 --- a/vendor/github.com/go-kit/kit/sd/internal/instance/cache_test.go +++ /dev/null @@ -1,77 +0,0 @@ -package instance - -import ( - "reflect" - "testing" - "time" - - "github.com/go-kit/kit/sd" -) - -var _ sd.Instancer = (*Cache)(nil) // API check - -// The test verifies the following: -// registering causes initial notification of the current state -// instances are sorted -// different update causes new notification -// identical notifications cause no updates -// no updates after de-registering -func TestCache(t *testing.T) { - e1 := sd.Event{Instances: []string{"y", "x"}} // not sorted - e2 := sd.Event{Instances: []string{"c", "a", "b"}} - - cache := NewCache() - if want, have := 0, len(cache.State().Instances); want != have { - t.Fatalf("want %v instances, have %v", want, have) - } - - cache.Update(e1) // sets initial state - if want, have := 2, len(cache.State().Instances); want != have { - t.Fatalf("want %v instances, have %v", want, have) - } - - r1 := make(chan sd.Event) - go cache.Register(r1) - expectUpdate(t, r1, []string{"x", "y"}) - - go cache.Update(e2) // different set - expectUpdate(t, r1, []string{"a", "b", "c"}) - - cache.Deregister(r1) - close(r1) -} - -func expectUpdate(t *testing.T, r chan sd.Event, expect []string) { - select { - case e := <-r: - if want, have := expect, e.Instances; !reflect.DeepEqual(want, have) { - t.Fatalf("want: %v, have: %v", want, have) - } - case <-time.After(time.Second): - t.Fatalf("did not receive expected update %v", expect) - } -} - -func TestRegistry(t *testing.T) { - reg := make(registry) - c1 := make(chan sd.Event, 1) - c2 := make(chan sd.Event, 1) - reg.register(c1) - reg.register(c2) - - // validate that both channels receive the update - reg.broadcast(sd.Event{Instances: []string{"x", "y"}}) - if want, have := []string{"x", "y"}, (<-c1).Instances; !reflect.DeepEqual(want, have) { - t.Fatalf("want: %v, have: %v", want, have) - } - if want, have := []string{"x", "y"}, (<-c2).Instances; !reflect.DeepEqual(want, have) { - t.Fatalf("want: %v, have: %v", want, have) - } - - reg.deregister(c1) - reg.deregister(c2) - close(c1) - close(c2) - // if deregister didn't work, broadcast would panic on closed channels - reg.broadcast(sd.Event{Instances: []string{"x", "y"}}) -} diff --git a/vendor/github.com/go-kit/kit/sd/lb/balancer.go b/vendor/github.com/go-kit/kit/sd/lb/balancer.go deleted file mode 100644 index 40aa0ef2..00000000 --- a/vendor/github.com/go-kit/kit/sd/lb/balancer.go +++ /dev/null @@ -1,15 +0,0 @@ -package lb - -import ( - "errors" - - "github.com/go-kit/kit/endpoint" -) - -// Balancer yields endpoints according to some heuristic. -type Balancer interface { - Endpoint() (endpoint.Endpoint, error) -} - -// ErrNoEndpoints is returned when no qualifying endpoints are available. -var ErrNoEndpoints = errors.New("no endpoints available") diff --git a/vendor/github.com/go-kit/kit/sd/lb/doc.go b/vendor/github.com/go-kit/kit/sd/lb/doc.go deleted file mode 100644 index 92aea812..00000000 --- a/vendor/github.com/go-kit/kit/sd/lb/doc.go +++ /dev/null @@ -1,4 +0,0 @@ -// Package lb implements the client-side load balancer pattern. When combined -// with a service discovery system of record, it enables a more decentralized -// architecture, removing the need for separate load balancers like HAProxy. -package lb diff --git a/vendor/github.com/go-kit/kit/sd/lb/random.go b/vendor/github.com/go-kit/kit/sd/lb/random.go deleted file mode 100644 index b1b06fce..00000000 --- a/vendor/github.com/go-kit/kit/sd/lb/random.go +++ /dev/null @@ -1,32 +0,0 @@ -package lb - -import ( - "math/rand" - - "github.com/go-kit/kit/endpoint" - "github.com/go-kit/kit/sd" -) - -// NewRandom returns a load balancer that selects services randomly. -func NewRandom(s sd.Endpointer, seed int64) Balancer { - return &random{ - s: s, - r: rand.New(rand.NewSource(seed)), - } -} - -type random struct { - s sd.Endpointer - r *rand.Rand -} - -func (r *random) Endpoint() (endpoint.Endpoint, error) { - endpoints, err := r.s.Endpoints() - if err != nil { - return nil, err - } - if len(endpoints) <= 0 { - return nil, ErrNoEndpoints - } - return endpoints[r.r.Intn(len(endpoints))], nil -} diff --git a/vendor/github.com/go-kit/kit/sd/lb/random_test.go b/vendor/github.com/go-kit/kit/sd/lb/random_test.go deleted file mode 100644 index ff563260..00000000 --- a/vendor/github.com/go-kit/kit/sd/lb/random_test.go +++ /dev/null @@ -1,52 +0,0 @@ -package lb - -import ( - "context" - "math" - "testing" - - "github.com/go-kit/kit/endpoint" - "github.com/go-kit/kit/sd" -) - -func TestRandom(t *testing.T) { - var ( - n = 7 - endpoints = make([]endpoint.Endpoint, n) - counts = make([]int, n) - seed = int64(12345) - iterations = 1000000 - want = iterations / n - tolerance = want / 100 // 1% - ) - - for i := 0; i < n; i++ { - i0 := i - endpoints[i] = func(context.Context, interface{}) (interface{}, error) { counts[i0]++; return struct{}{}, nil } - } - - endpointer := sd.FixedEndpointer(endpoints) - balancer := NewRandom(endpointer, seed) - - for i := 0; i < iterations; i++ { - endpoint, _ := balancer.Endpoint() - endpoint(context.Background(), struct{}{}) - } - - for i, have := range counts { - delta := int(math.Abs(float64(want - have))) - if delta > tolerance { - t.Errorf("%d: want %d, have %d, delta %d > %d tolerance", i, want, have, delta, tolerance) - } - } -} - -func TestRandomNoEndpoints(t *testing.T) { - endpointer := sd.FixedEndpointer{} - balancer := NewRandom(endpointer, 1415926) - _, err := balancer.Endpoint() - if want, have := ErrNoEndpoints, err; want != have { - t.Errorf("want %v, have %v", want, have) - } - -} diff --git a/vendor/github.com/go-kit/kit/sd/lb/retry.go b/vendor/github.com/go-kit/kit/sd/lb/retry.go deleted file mode 100644 index c551b360..00000000 --- a/vendor/github.com/go-kit/kit/sd/lb/retry.go +++ /dev/null @@ -1,117 +0,0 @@ -package lb - -import ( - "context" - "fmt" - "strings" - "time" - - "github.com/go-kit/kit/endpoint" -) - -// RetryError is an error wrapper that is used by the retry mechanism. All -// errors returned by the retry mechanism via its endpoint will be RetryErrors. -type RetryError struct { - RawErrors []error // all errors encountered from endpoints directly - Final error // the final, terminating error -} - -func (e RetryError) Error() string { - var suffix string - if len(e.RawErrors) > 1 { - a := make([]string, len(e.RawErrors)-1) - for i := 0; i < len(e.RawErrors)-1; i++ { // last one is Final - a[i] = e.RawErrors[i].Error() - } - suffix = fmt.Sprintf(" (previously: %s)", strings.Join(a, "; ")) - } - return fmt.Sprintf("%v%s", e.Final, suffix) -} - -// Callback is a function that is given the current attempt count and the error -// received from the underlying endpoint. It should return whether the Retry -// function should continue trying to get a working endpoint, and a custom error -// if desired. The error message may be nil, but a true/false is always -// expected. In all cases, if the replacement error is supplied, the received -// error will be replaced in the calling context. -type Callback func(n int, received error) (keepTrying bool, replacement error) - -// Retry wraps a service load balancer and returns an endpoint oriented load -// balancer for the specified service method. Requests to the endpoint will be -// automatically load balanced via the load balancer. Requests that return -// errors will be retried until they succeed, up to max times, or until the -// timeout is elapsed, whichever comes first. -func Retry(max int, timeout time.Duration, b Balancer) endpoint.Endpoint { - return RetryWithCallback(timeout, b, maxRetries(max)) -} - -func maxRetries(max int) Callback { - return func(n int, err error) (keepTrying bool, replacement error) { - return n < max, nil - } -} - -func alwaysRetry(int, error) (keepTrying bool, replacement error) { - return true, nil -} - -// RetryWithCallback wraps a service load balancer and returns an endpoint -// oriented load balancer for the specified service method. Requests to the -// endpoint will be automatically load balanced via the load balancer. Requests -// that return errors will be retried until they succeed, up to max times, until -// the callback returns false, or until the timeout is elapsed, whichever comes -// first. -func RetryWithCallback(timeout time.Duration, b Balancer, cb Callback) endpoint.Endpoint { - if cb == nil { - cb = alwaysRetry - } - if b == nil { - panic("nil Balancer") - } - - return func(ctx context.Context, request interface{}) (response interface{}, err error) { - var ( - newctx, cancel = context.WithTimeout(ctx, timeout) - responses = make(chan interface{}, 1) - errs = make(chan error, 1) - final RetryError - ) - defer cancel() - - for i := 1; ; i++ { - go func() { - e, err := b.Endpoint() - if err != nil { - errs <- err - return - } - response, err := e(newctx, request) - if err != nil { - errs <- err - return - } - responses <- response - }() - - select { - case <-newctx.Done(): - return nil, newctx.Err() - - case response := <-responses: - return response, nil - - case err := <-errs: - final.RawErrors = append(final.RawErrors, err) - keepTrying, replacement := cb(i, err) - if replacement != nil { - err = replacement - } - if !keepTrying { - final.Final = err - return nil, final - } - continue - } - } - } -} diff --git a/vendor/github.com/go-kit/kit/sd/lb/retry_test.go b/vendor/github.com/go-kit/kit/sd/lb/retry_test.go deleted file mode 100644 index 75639804..00000000 --- a/vendor/github.com/go-kit/kit/sd/lb/retry_test.go +++ /dev/null @@ -1,141 +0,0 @@ -package lb_test - -import ( - "context" - "errors" - "testing" - "time" - - "github.com/go-kit/kit/endpoint" - "github.com/go-kit/kit/sd" - "github.com/go-kit/kit/sd/lb" -) - -func TestRetryMaxTotalFail(t *testing.T) { - var ( - endpoints = sd.FixedEndpointer{} // no endpoints - rr = lb.NewRoundRobin(endpoints) - retry = lb.Retry(999, time.Second, rr) // lots of retries - ctx = context.Background() - ) - if _, err := retry(ctx, struct{}{}); err == nil { - t.Errorf("expected error, got none") // should fail - } -} - -func TestRetryMaxPartialFail(t *testing.T) { - var ( - endpoints = []endpoint.Endpoint{ - func(context.Context, interface{}) (interface{}, error) { return nil, errors.New("error one") }, - func(context.Context, interface{}) (interface{}, error) { return nil, errors.New("error two") }, - func(context.Context, interface{}) (interface{}, error) { return struct{}{}, nil /* OK */ }, - } - endpointer = sd.FixedEndpointer{ - 0: endpoints[0], - 1: endpoints[1], - 2: endpoints[2], - } - retries = len(endpoints) - 1 // not quite enough retries - rr = lb.NewRoundRobin(endpointer) - ctx = context.Background() - ) - if _, err := lb.Retry(retries, time.Second, rr)(ctx, struct{}{}); err == nil { - t.Errorf("expected error two, got none") - } -} - -func TestRetryMaxSuccess(t *testing.T) { - var ( - endpoints = []endpoint.Endpoint{ - func(context.Context, interface{}) (interface{}, error) { return nil, errors.New("error one") }, - func(context.Context, interface{}) (interface{}, error) { return nil, errors.New("error two") }, - func(context.Context, interface{}) (interface{}, error) { return struct{}{}, nil /* OK */ }, - } - endpointer = sd.FixedEndpointer{ - 0: endpoints[0], - 1: endpoints[1], - 2: endpoints[2], - } - retries = len(endpoints) // exactly enough retries - rr = lb.NewRoundRobin(endpointer) - ctx = context.Background() - ) - if _, err := lb.Retry(retries, time.Second, rr)(ctx, struct{}{}); err != nil { - t.Error(err) - } -} - -func TestRetryTimeout(t *testing.T) { - var ( - step = make(chan struct{}) - e = func(context.Context, interface{}) (interface{}, error) { <-step; return struct{}{}, nil } - timeout = time.Millisecond - retry = lb.Retry(999, timeout, lb.NewRoundRobin(sd.FixedEndpointer{0: e})) - errs = make(chan error, 1) - invoke = func() { _, err := retry(context.Background(), struct{}{}); errs <- err } - ) - - go func() { step <- struct{}{} }() // queue up a flush of the endpoint - invoke() // invoke the endpoint and trigger the flush - if err := <-errs; err != nil { // that should succeed - t.Error(err) - } - - go func() { time.Sleep(10 * timeout); step <- struct{}{} }() // a delayed flush - invoke() // invoke the endpoint - if err := <-errs; err != context.DeadlineExceeded { // that should not succeed - t.Errorf("wanted %v, got none", context.DeadlineExceeded) - } -} - -func TestAbortEarlyCustomMessage(t *testing.T) { - var ( - myErr = errors.New("aborting early") - cb = func(int, error) (bool, error) { return false, myErr } - endpoints = sd.FixedEndpointer{} // no endpoints - rr = lb.NewRoundRobin(endpoints) - retry = lb.RetryWithCallback(time.Second, rr, cb) // lots of retries - ctx = context.Background() - ) - _, err := retry(ctx, struct{}{}) - if want, have := myErr, err.(lb.RetryError).Final; want != have { - t.Errorf("want %v, have %v", want, have) - } -} - -func TestErrorPassedUnchangedToCallback(t *testing.T) { - var ( - myErr = errors.New("my custom error") - cb = func(_ int, err error) (bool, error) { - if want, have := myErr, err; want != have { - t.Errorf("want %v, have %v", want, have) - } - return false, nil - } - endpoint = func(ctx context.Context, request interface{}) (interface{}, error) { - return nil, myErr - } - endpoints = sd.FixedEndpointer{endpoint} // no endpoints - rr = lb.NewRoundRobin(endpoints) - retry = lb.RetryWithCallback(time.Second, rr, cb) // lots of retries - ctx = context.Background() - ) - _, err := retry(ctx, struct{}{}) - if want, have := myErr, err.(lb.RetryError).Final; want != have { - t.Errorf("want %v, have %v", want, have) - } -} - -func TestHandleNilCallback(t *testing.T) { - var ( - endpointer = sd.FixedEndpointer{ - func(context.Context, interface{}) (interface{}, error) { return struct{}{}, nil /* OK */ }, - } - rr = lb.NewRoundRobin(endpointer) - ctx = context.Background() - ) - retry := lb.RetryWithCallback(time.Second, rr, nil) - if _, err := retry(ctx, struct{}{}); err != nil { - t.Error(err) - } -} diff --git a/vendor/github.com/go-kit/kit/sd/lb/round_robin.go b/vendor/github.com/go-kit/kit/sd/lb/round_robin.go deleted file mode 100644 index 1d93a3b8..00000000 --- a/vendor/github.com/go-kit/kit/sd/lb/round_robin.go +++ /dev/null @@ -1,34 +0,0 @@ -package lb - -import ( - "sync/atomic" - - "github.com/go-kit/kit/endpoint" - "github.com/go-kit/kit/sd" -) - -// NewRoundRobin returns a load balancer that returns services in sequence. -func NewRoundRobin(s sd.Endpointer) Balancer { - return &roundRobin{ - s: s, - c: 0, - } -} - -type roundRobin struct { - s sd.Endpointer - c uint64 -} - -func (rr *roundRobin) Endpoint() (endpoint.Endpoint, error) { - endpoints, err := rr.s.Endpoints() - if err != nil { - return nil, err - } - if len(endpoints) <= 0 { - return nil, ErrNoEndpoints - } - old := atomic.AddUint64(&rr.c, 1) - 1 - idx := old % uint64(len(endpoints)) - return endpoints[idx], nil -} diff --git a/vendor/github.com/go-kit/kit/sd/lb/round_robin_test.go b/vendor/github.com/go-kit/kit/sd/lb/round_robin_test.go deleted file mode 100644 index 64cd0758..00000000 --- a/vendor/github.com/go-kit/kit/sd/lb/round_robin_test.go +++ /dev/null @@ -1,95 +0,0 @@ -package lb - -import ( - "context" - "reflect" - "sync" - "sync/atomic" - "testing" - "time" - - "github.com/go-kit/kit/endpoint" - "github.com/go-kit/kit/sd" -) - -func TestRoundRobin(t *testing.T) { - var ( - counts = []int{0, 0, 0} - endpoints = []endpoint.Endpoint{ - func(context.Context, interface{}) (interface{}, error) { counts[0]++; return struct{}{}, nil }, - func(context.Context, interface{}) (interface{}, error) { counts[1]++; return struct{}{}, nil }, - func(context.Context, interface{}) (interface{}, error) { counts[2]++; return struct{}{}, nil }, - } - ) - - endpointer := sd.FixedEndpointer(endpoints) - balancer := NewRoundRobin(endpointer) - - for i, want := range [][]int{ - {1, 0, 0}, - {1, 1, 0}, - {1, 1, 1}, - {2, 1, 1}, - {2, 2, 1}, - {2, 2, 2}, - {3, 2, 2}, - } { - endpoint, err := balancer.Endpoint() - if err != nil { - t.Fatal(err) - } - endpoint(context.Background(), struct{}{}) - if have := counts; !reflect.DeepEqual(want, have) { - t.Fatalf("%d: want %v, have %v", i, want, have) - } - } -} - -func TestRoundRobinNoEndpoints(t *testing.T) { - endpointer := sd.FixedEndpointer{} - balancer := NewRoundRobin(endpointer) - _, err := balancer.Endpoint() - if want, have := ErrNoEndpoints, err; want != have { - t.Errorf("want %v, have %v", want, have) - } -} - -func TestRoundRobinNoRace(t *testing.T) { - balancer := NewRoundRobin(sd.FixedEndpointer([]endpoint.Endpoint{ - endpoint.Nop, - endpoint.Nop, - endpoint.Nop, - endpoint.Nop, - endpoint.Nop, - })) - - var ( - n = 100 - done = make(chan struct{}) - wg sync.WaitGroup - count uint64 - ) - - wg.Add(n) - - for i := 0; i < n; i++ { - go func() { - defer wg.Done() - for { - select { - case <-done: - return - default: - _, _ = balancer.Endpoint() - atomic.AddUint64(&count, 1) - } - } - }() - } - - time.Sleep(time.Second) - close(done) - wg.Wait() - - t.Logf("made %d calls", atomic.LoadUint64(&count)) -} diff --git a/vendor/github.com/go-kit/kit/sd/registrar.go b/vendor/github.com/go-kit/kit/sd/registrar.go deleted file mode 100644 index 49a0c9f2..00000000 --- a/vendor/github.com/go-kit/kit/sd/registrar.go +++ /dev/null @@ -1,13 +0,0 @@ -package sd - -// Registrar registers instance information to a service discovery system when -// an instance becomes alive and healthy, and deregisters that information when -// the service becomes unhealthy or goes away. -// -// Registrar implementations exist for various service discovery systems. Note -// that identifying instance information (e.g. host:port) must be given via the -// concrete constructor; this interface merely signals lifecycle changes. -type Registrar interface { - Register() - Deregister() -} diff --git a/vendor/github.com/go-kit/kit/sd/zk/client.go b/vendor/github.com/go-kit/kit/sd/zk/client.go deleted file mode 100644 index 70cdab33..00000000 --- a/vendor/github.com/go-kit/kit/sd/zk/client.go +++ /dev/null @@ -1,273 +0,0 @@ -package zk - -import ( - "errors" - "net" - "strings" - "time" - - "github.com/samuel/go-zookeeper/zk" - - "github.com/go-kit/kit/log" -) - -// DefaultACL is the default ACL to use for creating znodes. -var ( - DefaultACL = zk.WorldACL(zk.PermAll) - ErrInvalidCredentials = errors.New("invalid credentials provided") - ErrClientClosed = errors.New("client service closed") - ErrNotRegistered = errors.New("not registered") - ErrNodeNotFound = errors.New("node not found") -) - -const ( - // DefaultConnectTimeout is the default timeout to establish a connection to - // a ZooKeeper node. - DefaultConnectTimeout = 2 * time.Second - // DefaultSessionTimeout is the default timeout to keep the current - // ZooKeeper session alive during a temporary disconnect. - DefaultSessionTimeout = 5 * time.Second -) - -// Client is a wrapper around a lower level ZooKeeper client implementation. -type Client interface { - // GetEntries should query the provided path in ZooKeeper, place a watch on - // it and retrieve data from its current child nodes. - GetEntries(path string) ([]string, <-chan zk.Event, error) - // CreateParentNodes should try to create the path in case it does not exist - // yet on ZooKeeper. - CreateParentNodes(path string) error - // Register a service with ZooKeeper. - Register(s *Service) error - // Deregister a service with ZooKeeper. - Deregister(s *Service) error - // Stop should properly shutdown the client implementation - Stop() -} - -type clientConfig struct { - logger log.Logger - acl []zk.ACL - credentials []byte - connectTimeout time.Duration - sessionTimeout time.Duration - rootNodePayload [][]byte - eventHandler func(zk.Event) -} - -// Option functions enable friendly APIs. -type Option func(*clientConfig) error - -type client struct { - *zk.Conn - clientConfig - active bool - quit chan struct{} -} - -// ACL returns an Option specifying a non-default ACL for creating parent nodes. -func ACL(acl []zk.ACL) Option { - return func(c *clientConfig) error { - c.acl = acl - return nil - } -} - -// Credentials returns an Option specifying a user/password combination which -// the client will use to authenticate itself with. -func Credentials(user, pass string) Option { - return func(c *clientConfig) error { - if user == "" || pass == "" { - return ErrInvalidCredentials - } - c.credentials = []byte(user + ":" + pass) - return nil - } -} - -// ConnectTimeout returns an Option specifying a non-default connection timeout -// when we try to establish a connection to a ZooKeeper server. -func ConnectTimeout(t time.Duration) Option { - return func(c *clientConfig) error { - if t.Seconds() < 1 { - return errors.New("invalid connect timeout (minimum value is 1 second)") - } - c.connectTimeout = t - return nil - } -} - -// SessionTimeout returns an Option specifying a non-default session timeout. -func SessionTimeout(t time.Duration) Option { - return func(c *clientConfig) error { - if t.Seconds() < 1 { - return errors.New("invalid session timeout (minimum value is 1 second)") - } - c.sessionTimeout = t - return nil - } -} - -// Payload returns an Option specifying non-default data values for each znode -// created by CreateParentNodes. -func Payload(payload [][]byte) Option { - return func(c *clientConfig) error { - c.rootNodePayload = payload - return nil - } -} - -// EventHandler returns an Option specifying a callback function to handle -// incoming zk.Event payloads (ZooKeeper connection events). -func EventHandler(handler func(zk.Event)) Option { - return func(c *clientConfig) error { - c.eventHandler = handler - return nil - } -} - -// NewClient returns a ZooKeeper client with a connection to the server cluster. -// It will return an error if the server cluster cannot be resolved. -func NewClient(servers []string, logger log.Logger, options ...Option) (Client, error) { - defaultEventHandler := func(event zk.Event) { - logger.Log("eventtype", event.Type.String(), "server", event.Server, "state", event.State.String(), "err", event.Err) - } - config := clientConfig{ - acl: DefaultACL, - connectTimeout: DefaultConnectTimeout, - sessionTimeout: DefaultSessionTimeout, - eventHandler: defaultEventHandler, - logger: logger, - } - for _, option := range options { - if err := option(&config); err != nil { - return nil, err - } - } - // dialer overrides the default ZooKeeper library Dialer so we can configure - // the connectTimeout. The current library has a hardcoded value of 1 second - // and there are reports of race conditions, due to slow DNS resolvers and - // other network latency issues. - dialer := func(network, address string, _ time.Duration) (net.Conn, error) { - return net.DialTimeout(network, address, config.connectTimeout) - } - conn, eventc, err := zk.Connect(servers, config.sessionTimeout, withLogger(logger), zk.WithDialer(dialer)) - - if err != nil { - return nil, err - } - - if len(config.credentials) > 0 { - err = conn.AddAuth("digest", config.credentials) - if err != nil { - return nil, err - } - } - - c := &client{conn, config, true, make(chan struct{})} - - // Start listening for incoming Event payloads and callback the set - // eventHandler. - go func() { - for { - select { - case event := <-eventc: - config.eventHandler(event) - case <-c.quit: - return - } - } - }() - return c, nil -} - -// CreateParentNodes implements the ZooKeeper Client interface. -func (c *client) CreateParentNodes(path string) error { - if !c.active { - return ErrClientClosed - } - if path[0] != '/' { - return zk.ErrInvalidPath - } - payload := []byte("") - pathString := "" - pathNodes := strings.Split(path, "/") - for i := 1; i < len(pathNodes); i++ { - if i <= len(c.rootNodePayload) { - payload = c.rootNodePayload[i-1] - } else { - payload = []byte("") - } - pathString += "/" + pathNodes[i] - _, err := c.Create(pathString, payload, 0, c.acl) - // not being able to create the node because it exists or not having - // sufficient rights is not an issue. It is ok for the node to already - // exist and/or us to only have read rights - if err != nil && err != zk.ErrNodeExists && err != zk.ErrNoAuth { - return err - } - } - return nil -} - -// GetEntries implements the ZooKeeper Client interface. -func (c *client) GetEntries(path string) ([]string, <-chan zk.Event, error) { - // retrieve list of child nodes for given path and add watch to path - znodes, _, eventc, err := c.ChildrenW(path) - - if err != nil { - return nil, eventc, err - } - - var resp []string - for _, znode := range znodes { - // retrieve payload for child znode and add to response array - if data, _, err := c.Get(path + "/" + znode); err == nil { - resp = append(resp, string(data)) - } - } - return resp, eventc, nil -} - -// Register implements the ZooKeeper Client interface. -func (c *client) Register(s *Service) error { - if s.Path[len(s.Path)-1] != '/' { - s.Path += "/" - } - path := s.Path + s.Name - if err := c.CreateParentNodes(path); err != nil { - return err - } - node, err := c.CreateProtectedEphemeralSequential(path, s.Data, c.acl) - if err != nil { - return err - } - s.node = node - return nil -} - -// Deregister implements the ZooKeeper Client interface. -func (c *client) Deregister(s *Service) error { - if s.node == "" { - return ErrNotRegistered - } - path := s.Path + s.Name - found, stat, err := c.Exists(path) - if err != nil { - return err - } - if !found { - return ErrNodeNotFound - } - if err := c.Delete(path, stat.Version); err != nil { - return err - } - return nil -} - -// Stop implements the ZooKeeper Client interface. -func (c *client) Stop() { - c.active = false - close(c.quit) - c.Close() -} diff --git a/vendor/github.com/go-kit/kit/sd/zk/client_test.go b/vendor/github.com/go-kit/kit/sd/zk/client_test.go deleted file mode 100644 index e201536d..00000000 --- a/vendor/github.com/go-kit/kit/sd/zk/client_test.go +++ /dev/null @@ -1,157 +0,0 @@ -package zk - -import ( - "bytes" - "testing" - "time" - - stdzk "github.com/samuel/go-zookeeper/zk" - - "github.com/go-kit/kit/log" -) - -func TestNewClient(t *testing.T) { - var ( - acl = stdzk.WorldACL(stdzk.PermRead) - connectTimeout = 3 * time.Second - sessionTimeout = 20 * time.Second - payload = [][]byte{[]byte("Payload"), []byte("Test")} - ) - - c, err := NewClient( - []string{"FailThisInvalidHost!!!"}, - log.NewNopLogger(), - ) - if err == nil { - t.Errorf("expected error, got nil") - } - - hasFired := false - calledEventHandler := make(chan struct{}) - eventHandler := func(event stdzk.Event) { - if !hasFired { - // test is successful if this function has fired at least once - hasFired = true - close(calledEventHandler) - } - } - - c, err = NewClient( - []string{"localhost"}, - log.NewNopLogger(), - ACL(acl), - ConnectTimeout(connectTimeout), - SessionTimeout(sessionTimeout), - Payload(payload), - EventHandler(eventHandler), - ) - if err != nil { - t.Fatal(err) - } - defer c.Stop() - - clientImpl, ok := c.(*client) - if !ok { - t.Fatal("retrieved incorrect Client implementation") - } - if want, have := acl, clientImpl.acl; want[0] != have[0] { - t.Errorf("want %+v, have %+v", want, have) - } - if want, have := connectTimeout, clientImpl.connectTimeout; want != have { - t.Errorf("want %d, have %d", want, have) - } - if want, have := sessionTimeout, clientImpl.sessionTimeout; want != have { - t.Errorf("want %d, have %d", want, have) - } - if want, have := payload, clientImpl.rootNodePayload; bytes.Compare(want[0], have[0]) != 0 || bytes.Compare(want[1], have[1]) != 0 { - t.Errorf("want %s, have %s", want, have) - } - - select { - case <-calledEventHandler: - case <-time.After(100 * time.Millisecond): - t.Errorf("event handler never called") - } -} - -func TestOptions(t *testing.T) { - _, err := NewClient([]string{"localhost"}, log.NewNopLogger(), Credentials("valid", "credentials")) - if err != nil && err != stdzk.ErrNoServer { - t.Errorf("unexpected error: %v", err) - } - - _, err = NewClient([]string{"localhost"}, log.NewNopLogger(), Credentials("nopass", "")) - if want, have := err, ErrInvalidCredentials; want != have { - t.Errorf("want %v, have %v", want, have) - } - - _, err = NewClient([]string{"localhost"}, log.NewNopLogger(), ConnectTimeout(0)) - if err == nil { - t.Errorf("expected connect timeout error") - } - - _, err = NewClient([]string{"localhost"}, log.NewNopLogger(), SessionTimeout(0)) - if err == nil { - t.Errorf("expected connect timeout error") - } -} - -func TestCreateParentNodes(t *testing.T) { - payload := [][]byte{[]byte("Payload"), []byte("Test")} - - c, err := NewClient([]string{"localhost:65500"}, log.NewNopLogger()) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if c == nil { - t.Fatal("expected new Client, got nil") - } - - s, err := NewInstancer(c, "/validpath", log.NewNopLogger()) - if err != stdzk.ErrNoServer { - t.Errorf("unexpected error: %v", err) - } - if s != nil { - t.Error("expected failed new Instancer") - } - - s, err = NewInstancer(c, "invalidpath", log.NewNopLogger()) - if err != stdzk.ErrInvalidPath { - t.Errorf("unexpected error: %v", err) - } - _, _, err = c.GetEntries("/validpath") - if err != stdzk.ErrNoServer { - t.Errorf("unexpected error: %v", err) - } - - c.Stop() - - err = c.CreateParentNodes("/validpath") - if err != ErrClientClosed { - t.Errorf("unexpected error: %v", err) - } - - s, err = NewInstancer(c, "/validpath", log.NewNopLogger()) - if err != ErrClientClosed { - t.Errorf("unexpected error: %v", err) - } - if s != nil { - t.Error("expected failed new Instancer") - } - - c, err = NewClient([]string{"localhost:65500"}, log.NewNopLogger(), Payload(payload)) - if err != nil { - t.Errorf("unexpected error: %v", err) - } - if c == nil { - t.Fatal("expected new Client, got nil") - } - - s, err = NewInstancer(c, "/validpath", log.NewNopLogger()) - if err != stdzk.ErrNoServer { - t.Errorf("unexpected error: %v", err) - } - if s != nil { - t.Error("expected failed new Instancer") - } -} diff --git a/vendor/github.com/go-kit/kit/sd/zk/doc.go b/vendor/github.com/go-kit/kit/sd/zk/doc.go deleted file mode 100644 index be5a253c..00000000 --- a/vendor/github.com/go-kit/kit/sd/zk/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package zk provides Instancer and Registrar implementations for ZooKeeper. -package zk diff --git a/vendor/github.com/go-kit/kit/sd/zk/instancer.go b/vendor/github.com/go-kit/kit/sd/zk/instancer.go deleted file mode 100644 index 63199984..00000000 --- a/vendor/github.com/go-kit/kit/sd/zk/instancer.go +++ /dev/null @@ -1,95 +0,0 @@ -package zk - -import ( - "github.com/samuel/go-zookeeper/zk" - - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/sd" - "github.com/go-kit/kit/sd/internal/instance" -) - -// Instancer yield instances stored in a certain ZooKeeper path. Any kind of -// change in that path is watched and will update the subscribers. -type Instancer struct { - cache *instance.Cache - client Client - path string - logger log.Logger - quitc chan struct{} -} - -// NewInstancer returns a ZooKeeper Instancer. ZooKeeper will start watching -// the given path for changes and update the Instancer endpoints. -func NewInstancer(c Client, path string, logger log.Logger) (*Instancer, error) { - s := &Instancer{ - cache: instance.NewCache(), - client: c, - path: path, - logger: logger, - quitc: make(chan struct{}), - } - - err := s.client.CreateParentNodes(s.path) - if err != nil { - return nil, err - } - - instances, eventc, err := s.client.GetEntries(s.path) - if err != nil { - logger.Log("path", s.path, "msg", "failed to retrieve entries", "err", err) - // other implementations continue here, but we exit because we don't know if eventc is valid - return nil, err - } - logger.Log("path", s.path, "instances", len(instances)) - s.cache.Update(sd.Event{Instances: instances}) - - go s.loop(eventc) - - return s, nil -} - -func (s *Instancer) loop(eventc <-chan zk.Event) { - var ( - instances []string - err error - ) - for { - select { - case <-eventc: - // We received a path update notification. Call GetEntries to - // retrieve child node data, and set a new watch, as ZK watches are - // one-time triggers. - instances, eventc, err = s.client.GetEntries(s.path) - if err != nil { - s.logger.Log("path", s.path, "msg", "failed to retrieve entries", "err", err) - s.cache.Update(sd.Event{Err: err}) - continue - } - s.logger.Log("path", s.path, "instances", len(instances)) - s.cache.Update(sd.Event{Instances: instances}) - - case <-s.quitc: - return - } - } -} - -// Stop terminates the Instancer. -func (s *Instancer) Stop() { - close(s.quitc) -} - -// Register implements Instancer. -func (s *Instancer) Register(ch chan<- sd.Event) { - s.cache.Register(ch) -} - -// Deregister implements Instancer. -func (s *Instancer) Deregister(ch chan<- sd.Event) { - s.cache.Deregister(ch) -} - -// state returns the current state of instance.Cache, only for testing -func (s *Instancer) state() sd.Event { - return s.cache.State() -} diff --git a/vendor/github.com/go-kit/kit/sd/zk/instancer_test.go b/vendor/github.com/go-kit/kit/sd/zk/instancer_test.go deleted file mode 100644 index c450c3e6..00000000 --- a/vendor/github.com/go-kit/kit/sd/zk/instancer_test.go +++ /dev/null @@ -1,125 +0,0 @@ -package zk - -import ( - "testing" - "time" - - "github.com/go-kit/kit/sd" -) - -var _ sd.Instancer = (*Instancer)(nil) // API check - -func TestInstancer(t *testing.T) { - client := newFakeClient() - - instancer, err := NewInstancer(client, path, logger) - if err != nil { - t.Fatalf("failed to create new Instancer: %v", err) - } - defer instancer.Stop() - endpointer := sd.NewEndpointer(instancer, newFactory(""), logger) - - if _, err := endpointer.Endpoints(); err != nil { - t.Fatal(err) - } -} - -func TestBadFactory(t *testing.T) { - client := newFakeClient() - - instancer, err := NewInstancer(client, path, logger) - if err != nil { - t.Fatalf("failed to create new Instancer: %v", err) - } - defer instancer.Stop() - endpointer := sd.NewEndpointer(instancer, newFactory("kaboom"), logger) - - // instance1 came online - client.AddService(path+"/instance1", "kaboom") - - // instance2 came online - client.AddService(path+"/instance2", "zookeeper_node_data") - - if err = asyncTest(100*time.Millisecond, 1, endpointer); err != nil { - t.Error(err) - } -} - -func TestServiceUpdate(t *testing.T) { - client := newFakeClient() - - instancer, err := NewInstancer(client, path, logger) - if err != nil { - t.Fatalf("failed to create new Instancer: %v", err) - } - defer instancer.Stop() - endpointer := sd.NewEndpointer(instancer, newFactory(""), logger) - - endpoints, err := endpointer.Endpoints() - if err != nil { - t.Fatal(err) - } - if want, have := 0, len(endpoints); want != have { - t.Errorf("want %d, have %d", want, have) - } - - // instance1 came online - client.AddService(path+"/instance1", "zookeeper_node_data1") - - // instance2 came online - client.AddService(path+"/instance2", "zookeeper_node_data2") - - // we should have 2 instances - if err = asyncTest(100*time.Millisecond, 2, endpointer); err != nil { - t.Error(err) - } - - // TODO(pb): this bit is flaky - // - //// watch triggers an error... - //client.SendErrorOnWatch() - // - //// test if error was consumed - //if err = client.ErrorIsConsumedWithin(100 * time.Millisecond); err != nil { - // t.Error(err) - //} - - // instance3 came online - client.AddService(path+"/instance3", "zookeeper_node_data3") - - // we should have 3 instances - if err = asyncTest(100*time.Millisecond, 3, endpointer); err != nil { - t.Error(err) - } - - // instance1 goes offline - client.RemoveService(path + "/instance1") - - // instance2 goes offline - client.RemoveService(path + "/instance2") - - // we should have 1 instance - if err = asyncTest(100*time.Millisecond, 1, endpointer); err != nil { - t.Error(err) - } -} - -func TestBadInstancerCreate(t *testing.T) { - client := newFakeClient() - client.SendErrorOnWatch() - - instancer, err := NewInstancer(client, path, logger) - if err == nil { - t.Error("expected error on new Instancer") - } - if instancer != nil { - t.Error("expected Instancer not to be created") - } - instancer, err = NewInstancer(client, "BadPath", logger) - if err == nil { - t.Error("expected error on new Instancer") - } - if instancer != nil { - t.Error("expected Instancer not to be created") - } -} diff --git a/vendor/github.com/go-kit/kit/sd/zk/integration_test.go b/vendor/github.com/go-kit/kit/sd/zk/integration_test.go deleted file mode 100644 index e4aff659..00000000 --- a/vendor/github.com/go-kit/kit/sd/zk/integration_test.go +++ /dev/null @@ -1,201 +0,0 @@ -// +build integration - -package zk - -import ( - "bytes" - "log" - "os" - "testing" - "time" - - stdzk "github.com/samuel/go-zookeeper/zk" -) - -var ( - host []string -) - -func TestMain(m *testing.M) { - zkAddr := os.Getenv("ZK_ADDR") - if zkAddr == "" { - log.Fatal("ZK_ADDR is not set") - } - host = []string{zkAddr} -} - -func TestCreateParentNodesOnServer(t *testing.T) { - payload := [][]byte{[]byte("Payload"), []byte("Test")} - c1, err := NewClient(host, logger, Payload(payload)) - if err != nil { - t.Fatalf("Connect returned error: %v", err) - } - if c1 == nil { - t.Fatal("Expected pointer to client, got nil") - } - defer c1.Stop() - - instancer, err := NewInstancer(c1, path, logger) - if err != nil { - t.Fatalf("Unable to create Subscriber: %v", err) - } - defer instancer.Stop() - - state := instancer.state() - if state.Err != nil { - t.Fatal(err) - } - if want, have := 0, len(state.Instances); want != have { - t.Errorf("want %d, have %d", want, have) - } - - c2, err := NewClient(host, logger) - if err != nil { - t.Fatalf("Connect returned error: %v", err) - } - defer c2.Stop() - data, _, err := c2.(*client).Get(path) - if err != nil { - t.Fatal(err) - } - // test Client implementation of CreateParentNodes. It should have created - // our payload - if bytes.Compare(data, payload[1]) != 0 { - t.Errorf("want %s, have %s", payload[1], data) - } - -} - -func TestCreateBadParentNodesOnServer(t *testing.T) { - c, _ := NewClient(host, logger) - defer c.Stop() - - _, err := NewInstancer(c, "invalid/path", logger) - - if want, have := stdzk.ErrInvalidPath, err; want != have { - t.Errorf("want %v, have %v", want, have) - } -} - -func TestCredentials1(t *testing.T) { - acl := stdzk.DigestACL(stdzk.PermAll, "user", "secret") - c, _ := NewClient(host, logger, ACL(acl), Credentials("user", "secret")) - defer c.Stop() - - _, err := NewInstancer(c, "/acl-issue-test", logger) - - if err != nil { - t.Fatal(err) - } -} - -func TestCredentials2(t *testing.T) { - acl := stdzk.DigestACL(stdzk.PermAll, "user", "secret") - c, _ := NewClient(host, logger, ACL(acl)) - defer c.Stop() - - _, err := NewInstancer(c, "/acl-issue-test", logger) - - if err != stdzk.ErrNoAuth { - t.Errorf("want %v, have %v", stdzk.ErrNoAuth, err) - } -} - -func TestConnection(t *testing.T) { - c, _ := NewClient(host, logger) - c.Stop() - - _, err := NewInstancer(c, "/acl-issue-test", logger) - - if err != ErrClientClosed { - t.Errorf("want %v, have %v", ErrClientClosed, err) - } -} - -func TestGetEntriesOnServer(t *testing.T) { - var instancePayload = "10.0.3.204:8002" - - c1, err := NewClient(host, logger) - if err != nil { - t.Fatalf("Connect returned error: %v", err) - } - - defer c1.Stop() - - c2, err := NewClient(host, logger) - s, err := NewInstancer(c2, path, logger) - if err != nil { - t.Fatal(err) - } - defer c2.Stop() - - instance1 := &Service{ - Path: path, - Name: "instance1", - Data: []byte(instancePayload), - } - if err = c2.Register(instance1); err != nil { - t.Fatalf("Unable to create test ephemeral znode 1: %+v", err) - } - instance2 := &Service{ - Path: path, - Name: "instance2", - Data: []byte(instancePayload), - } - if err = c2.Register(instance2); err != nil { - t.Fatalf("Unable to create test ephemeral znode 2: %+v", err) - } - - time.Sleep(50 * time.Millisecond) - - state := s.state() - if state.Err != nil { - t.Fatal(state.Err) - } - if want, have := 2, len(state.Instances); want != have { - t.Errorf("want %d, have %d", want, have) - } -} - -func TestGetEntriesPayloadOnServer(t *testing.T) { - c, err := NewClient(host, logger) - if err != nil { - t.Fatalf("Connect returned error: %v", err) - } - _, eventc, err := c.GetEntries(path) - if err != nil { - t.Fatal(err) - } - - instance3 := Service{ - Path: path, - Name: "instance3", - Data: []byte("just some payload"), - } - registrar := NewRegistrar(c, instance3, logger) - registrar.Register() - select { - case event := <-eventc: - if want, have := stdzk.EventNodeChildrenChanged.String(), event.Type.String(); want != have { - t.Errorf("want %s, have %s", want, have) - } - case <-time.After(100 * time.Millisecond): - t.Errorf("expected incoming watch event, timeout occurred") - } - - _, eventc, err = c.GetEntries(path) - if err != nil { - t.Fatal(err) - } - - registrar.Deregister() - select { - case event := <-eventc: - if want, have := stdzk.EventNodeChildrenChanged.String(), event.Type.String(); want != have { - t.Errorf("want %s, have %s", want, have) - } - case <-time.After(100 * time.Millisecond): - t.Errorf("expected incoming watch event, timeout occurred") - } - -} diff --git a/vendor/github.com/go-kit/kit/sd/zk/logwrapper.go b/vendor/github.com/go-kit/kit/sd/zk/logwrapper.go deleted file mode 100644 index abb7b6df..00000000 --- a/vendor/github.com/go-kit/kit/sd/zk/logwrapper.go +++ /dev/null @@ -1,27 +0,0 @@ -package zk - -import ( - "fmt" - - "github.com/samuel/go-zookeeper/zk" - - "github.com/go-kit/kit/log" -) - -// wrapLogger wraps a Go kit logger so we can use it as the logging service for -// the ZooKeeper library, which expects a Printf method to be available. -type wrapLogger struct { - log.Logger -} - -func (logger wrapLogger) Printf(format string, args ...interface{}) { - logger.Log("msg", fmt.Sprintf(format, args...)) -} - -// withLogger replaces the ZooKeeper library's default logging service with our -// own Go kit logger. -func withLogger(logger log.Logger) func(c *zk.Conn) { - return func(c *zk.Conn) { - c.SetLogger(wrapLogger{logger}) - } -} diff --git a/vendor/github.com/go-kit/kit/sd/zk/registrar.go b/vendor/github.com/go-kit/kit/sd/zk/registrar.go deleted file mode 100644 index 379a4a50..00000000 --- a/vendor/github.com/go-kit/kit/sd/zk/registrar.go +++ /dev/null @@ -1,51 +0,0 @@ -package zk - -import "github.com/go-kit/kit/log" - -// Registrar registers service instance liveness information to ZooKeeper. -type Registrar struct { - client Client - service Service - logger log.Logger -} - -// Service holds the root path, service name and instance identifying data you -// want to publish to ZooKeeper. -type Service struct { - Path string // discovery namespace, example: /myorganization/myplatform/ - Name string // service name, example: addscv - Data []byte // instance data to store for discovery, example: 10.0.2.10:80 - node string // Client will record the ephemeral node name so we can deregister -} - -// NewRegistrar returns a ZooKeeper Registrar acting on the provided catalog -// registration. -func NewRegistrar(client Client, service Service, logger log.Logger) *Registrar { - return &Registrar{ - client: client, - service: service, - logger: log.With(logger, - "service", service.Name, - "path", service.Path, - "data", string(service.Data), - ), - } -} - -// Register implements sd.Registrar interface. -func (r *Registrar) Register() { - if err := r.client.Register(&r.service); err != nil { - r.logger.Log("err", err) - } else { - r.logger.Log("action", "register") - } -} - -// Deregister implements sd.Registrar interface. -func (r *Registrar) Deregister() { - if err := r.client.Deregister(&r.service); err != nil { - r.logger.Log("err", err) - } else { - r.logger.Log("action", "deregister") - } -} diff --git a/vendor/github.com/go-kit/kit/sd/zk/util_test.go b/vendor/github.com/go-kit/kit/sd/zk/util_test.go deleted file mode 100644 index 4f975a56..00000000 --- a/vendor/github.com/go-kit/kit/sd/zk/util_test.go +++ /dev/null @@ -1,134 +0,0 @@ -package zk - -import ( - "context" - "errors" - "fmt" - "io" - "sync" - "time" - - "github.com/samuel/go-zookeeper/zk" - - "github.com/go-kit/kit/endpoint" - "github.com/go-kit/kit/log" - "github.com/go-kit/kit/sd" -) - -var ( - path = "/gokit.test/service.name" - e = func(context.Context, interface{}) (interface{}, error) { return struct{}{}, nil } - logger = log.NewNopLogger() -) - -type fakeClient struct { - mtx sync.Mutex - ch chan zk.Event - responses map[string]string - result bool -} - -func newFakeClient() *fakeClient { - return &fakeClient{ - ch: make(chan zk.Event, 1), - responses: make(map[string]string), - result: true, - } -} - -func (c *fakeClient) CreateParentNodes(path string) error { - if path == "BadPath" { - return errors.New("dummy error") - } - return nil -} - -func (c *fakeClient) GetEntries(path string) ([]string, <-chan zk.Event, error) { - c.mtx.Lock() - defer c.mtx.Unlock() - if c.result == false { - c.result = true - return []string{}, c.ch, errors.New("dummy error") - } - responses := []string{} - for _, data := range c.responses { - responses = append(responses, data) - } - return responses, c.ch, nil -} - -func (c *fakeClient) AddService(node, data string) { - c.mtx.Lock() - defer c.mtx.Unlock() - c.responses[node] = data - c.ch <- zk.Event{} -} - -func (c *fakeClient) RemoveService(node string) { - c.mtx.Lock() - defer c.mtx.Unlock() - delete(c.responses, node) - c.ch <- zk.Event{} -} - -func (c *fakeClient) Register(s *Service) error { - return nil -} - -func (c *fakeClient) Deregister(s *Service) error { - return nil -} - -func (c *fakeClient) SendErrorOnWatch() { - c.mtx.Lock() - defer c.mtx.Unlock() - c.result = false - c.ch <- zk.Event{} -} - -func (c *fakeClient) ErrorIsConsumedWithin(timeout time.Duration) error { - t := time.After(timeout) - for { - select { - case <-t: - return fmt.Errorf("expected error not consumed after timeout %s", timeout) - default: - c.mtx.Lock() - if c.result == false { - c.mtx.Unlock() - return nil - } - c.mtx.Unlock() - } - } -} - -func (c *fakeClient) Stop() {} - -func newFactory(fakeError string) sd.Factory { - return func(instance string) (endpoint.Endpoint, io.Closer, error) { - if fakeError == instance { - return nil, nil, errors.New(fakeError) - } - return endpoint.Nop, nil, nil - } -} - -func asyncTest(timeout time.Duration, want int, s sd.Endpointer) (err error) { - var endpoints []endpoint.Endpoint - have := -1 // want can never be <0 - t := time.After(timeout) - for { - select { - case <-t: - return fmt.Errorf("want %d, have %d (timeout %s)", want, have, timeout.String()) - default: - endpoints, err = s.Endpoints() - have = len(endpoints) - if err != nil || want == have { - return - } - time.Sleep(timeout / 10) - } - } -} diff --git a/vendor/github.com/go-kit/kit/tracing/README.md b/vendor/github.com/go-kit/kit/tracing/README.md deleted file mode 100644 index d5e60e82..00000000 --- a/vendor/github.com/go-kit/kit/tracing/README.md +++ /dev/null @@ -1,60 +0,0 @@ -# package tracing - -`package tracing` provides [Dapper][]-style request tracing to services. - -## Rationale - -Request tracing is a fundamental building block for large distributed -applications. It's instrumental in understanding request flows, identifying -hot spots, and diagnosing errors. All microservice infrastructures will -benefit from request tracing; sufficiently large infrastructures will require -it. - -## OpenTracing - -Go kit builds on top of the [OpenTracing] API and uses the [opentracing-go] -package to provide tracing middlewares for its servers and clients. Currently -`kit/transport/http` and `kit/transport/grpc` transports are supported. - -Since [OpenTracing] is an upcoming standard API, Go kit should support a -multitude of tracing backends. If a Tracer implementation in Go for your -back-end exists, it should work out of the box. The following tracing back-ends -are known to work with Go kit through the OpenTracing interface and are -highlighted in the [addsvc] example. - - -### LightStep - -[LightStep] support is available through their standard Go package -[lightstep-tracer-go]. - -### AppDash - -[Appdash] support is available straight from their system repository in the -[appdash/opentracing] directory. - -### Zipkin - -[Zipkin] support is now available from the [zipkin-go-opentracing] package which -can be found at the [Open Zipkin GitHub] page. This means our old custom -`tracing/zipkin` package is now deprecated. In the `kit/tracing/zipkin` -directory you can still find the `docker-compose` script to bootstrap a Zipkin -development environment and a [README] detailing how to transition from the -old package to the new. - -[Dapper]: http://research.google.com/pubs/pub36356.html -[addsvc]:https://github.com/go-kit/kit/tree/master/examples/addsvc -[README]: https://github.com/go-kit/kit/blob/master/tracing/zipkin/README.md - -[OpenTracing]: http://opentracing.io -[opentracing-go]: https://github.com/opentracing/opentracing-go - -[Zipkin]: http://zipkin.io/ -[Open Zipkin GitHub]: https://github.com/openzipkin -[zipkin-go-opentracing]: https://github.com/openzipkin/zipkin-go-opentracing - -[Appdash]: https://github.com/sourcegraph/appdash -[appdash/opentracing]: https://github.com/sourcegraph/appdash/tree/master/opentracing - -[LightStep]: http://lightstep.com/ -[lightstep-tracer-go]: https://github.com/lightstep/lightstep-tracer-go diff --git a/vendor/github.com/go-kit/kit/tracing/doc.go b/vendor/github.com/go-kit/kit/tracing/doc.go deleted file mode 100644 index 8e5ec469..00000000 --- a/vendor/github.com/go-kit/kit/tracing/doc.go +++ /dev/null @@ -1,8 +0,0 @@ -// Package tracing provides helpers and bindings for distributed tracing. -// -// As your infrastructure grows, it becomes important to be able to trace a -// request, as it travels through multiple services and back to the user. -// Package tracing provides endpoints and transport helpers and middlewares to -// capture and emit request-scoped information. We use the excellent OpenTracing -// project to bind to concrete tracing systems. -package tracing diff --git a/vendor/github.com/go-kit/kit/tracing/opentracing/doc.go b/vendor/github.com/go-kit/kit/tracing/opentracing/doc.go deleted file mode 100644 index c8d32d58..00000000 --- a/vendor/github.com/go-kit/kit/tracing/opentracing/doc.go +++ /dev/null @@ -1,4 +0,0 @@ -// Package opentracing provides Go kit integration to the OpenTracing project. -// OpenTracing implements a general purpose interface that microservices can -// program against, and which adapts to all major distributed tracing systems. -package opentracing diff --git a/vendor/github.com/go-kit/kit/tracing/opentracing/endpoint.go b/vendor/github.com/go-kit/kit/tracing/opentracing/endpoint.go deleted file mode 100644 index 0482e9c0..00000000 --- a/vendor/github.com/go-kit/kit/tracing/opentracing/endpoint.go +++ /dev/null @@ -1,55 +0,0 @@ -package opentracing - -import ( - "context" - - "github.com/opentracing/opentracing-go" - otext "github.com/opentracing/opentracing-go/ext" - - "github.com/go-kit/kit/endpoint" -) - -// TraceServer returns a Middleware that wraps the `next` Endpoint in an -// OpenTracing Span called `operationName`. -// -// If `ctx` already has a Span, it is re-used and the operation name is -// overwritten. If `ctx` does not yet have a Span, one is created here. -func TraceServer(tracer opentracing.Tracer, operationName string) endpoint.Middleware { - return func(next endpoint.Endpoint) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - serverSpan := opentracing.SpanFromContext(ctx) - if serverSpan == nil { - // All we can do is create a new root span. - serverSpan = tracer.StartSpan(operationName) - } else { - serverSpan.SetOperationName(operationName) - } - defer serverSpan.Finish() - otext.SpanKindRPCServer.Set(serverSpan) - ctx = opentracing.ContextWithSpan(ctx, serverSpan) - return next(ctx, request) - } - } -} - -// TraceClient returns a Middleware that wraps the `next` Endpoint in an -// OpenTracing Span called `operationName`. -func TraceClient(tracer opentracing.Tracer, operationName string) endpoint.Middleware { - return func(next endpoint.Endpoint) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - var clientSpan opentracing.Span - if parentSpan := opentracing.SpanFromContext(ctx); parentSpan != nil { - clientSpan = tracer.StartSpan( - operationName, - opentracing.ChildOf(parentSpan.Context()), - ) - } else { - clientSpan = tracer.StartSpan(operationName) - } - defer clientSpan.Finish() - otext.SpanKindRPCClient.Set(clientSpan) - ctx = opentracing.ContextWithSpan(ctx, clientSpan) - return next(ctx, request) - } - } -} diff --git a/vendor/github.com/go-kit/kit/tracing/opentracing/endpoint_test.go b/vendor/github.com/go-kit/kit/tracing/opentracing/endpoint_test.go deleted file mode 100644 index a26f7bab..00000000 --- a/vendor/github.com/go-kit/kit/tracing/opentracing/endpoint_test.go +++ /dev/null @@ -1,117 +0,0 @@ -package opentracing_test - -import ( - "context" - "testing" - - "github.com/opentracing/opentracing-go" - "github.com/opentracing/opentracing-go/mocktracer" - - "github.com/go-kit/kit/endpoint" - kitot "github.com/go-kit/kit/tracing/opentracing" -) - -func TestTraceServer(t *testing.T) { - tracer := mocktracer.New() - - // Initialize the ctx with a nameless Span. - contextSpan := tracer.StartSpan("").(*mocktracer.MockSpan) - ctx := opentracing.ContextWithSpan(context.Background(), contextSpan) - - tracedEndpoint := kitot.TraceServer(tracer, "testOp")(endpoint.Nop) - if _, err := tracedEndpoint(ctx, struct{}{}); err != nil { - t.Fatal(err) - } - - finishedSpans := tracer.FinishedSpans() - if want, have := 1, len(finishedSpans); want != have { - t.Fatalf("Want %v span(s), found %v", want, have) - } - - // Test that the op name is updated - endpointSpan := finishedSpans[0] - if want, have := "testOp", endpointSpan.OperationName; want != have { - t.Fatalf("Want %q, have %q", want, have) - } - contextContext := contextSpan.Context().(mocktracer.MockSpanContext) - endpointContext := endpointSpan.Context().(mocktracer.MockSpanContext) - // ...and that the ID is unmodified. - if want, have := contextContext.SpanID, endpointContext.SpanID; want != have { - t.Errorf("Want SpanID %q, have %q", want, have) - } -} - -func TestTraceServerNoContextSpan(t *testing.T) { - tracer := mocktracer.New() - - // Empty/background context. - tracedEndpoint := kitot.TraceServer(tracer, "testOp")(endpoint.Nop) - if _, err := tracedEndpoint(context.Background(), struct{}{}); err != nil { - t.Fatal(err) - } - - // tracedEndpoint created a new Span. - finishedSpans := tracer.FinishedSpans() - if want, have := 1, len(finishedSpans); want != have { - t.Fatalf("Want %v span(s), found %v", want, have) - } - - endpointSpan := finishedSpans[0] - if want, have := "testOp", endpointSpan.OperationName; want != have { - t.Fatalf("Want %q, have %q", want, have) - } -} - -func TestTraceClient(t *testing.T) { - tracer := mocktracer.New() - - // Initialize the ctx with a parent Span. - parentSpan := tracer.StartSpan("parent").(*mocktracer.MockSpan) - defer parentSpan.Finish() - ctx := opentracing.ContextWithSpan(context.Background(), parentSpan) - - tracedEndpoint := kitot.TraceClient(tracer, "testOp")(endpoint.Nop) - if _, err := tracedEndpoint(ctx, struct{}{}); err != nil { - t.Fatal(err) - } - - // tracedEndpoint created a new Span. - finishedSpans := tracer.FinishedSpans() - if want, have := 1, len(finishedSpans); want != have { - t.Fatalf("Want %v span(s), found %v", want, have) - } - - endpointSpan := finishedSpans[0] - if want, have := "testOp", endpointSpan.OperationName; want != have { - t.Fatalf("Want %q, have %q", want, have) - } - - parentContext := parentSpan.Context().(mocktracer.MockSpanContext) - endpointContext := parentSpan.Context().(mocktracer.MockSpanContext) - - // ... and that the parent ID is set appropriately. - if want, have := parentContext.SpanID, endpointContext.SpanID; want != have { - t.Errorf("Want ParentID %q, have %q", want, have) - } -} - -func TestTraceClientNoContextSpan(t *testing.T) { - tracer := mocktracer.New() - - // Empty/background context. - tracedEndpoint := kitot.TraceClient(tracer, "testOp")(endpoint.Nop) - if _, err := tracedEndpoint(context.Background(), struct{}{}); err != nil { - t.Fatal(err) - } - - // tracedEndpoint created a new Span. - finishedSpans := tracer.FinishedSpans() - if want, have := 1, len(finishedSpans); want != have { - t.Fatalf("Want %v span(s), found %v", want, have) - } - - endpointSpan := finishedSpans[0] - if want, have := "testOp", endpointSpan.OperationName; want != have { - t.Fatalf("Want %q, have %q", want, have) - } -} diff --git a/vendor/github.com/go-kit/kit/tracing/opentracing/grpc.go b/vendor/github.com/go-kit/kit/tracing/opentracing/grpc.go deleted file mode 100644 index 0122d65e..00000000 --- a/vendor/github.com/go-kit/kit/tracing/opentracing/grpc.go +++ /dev/null @@ -1,70 +0,0 @@ -package opentracing - -import ( - "context" - "encoding/base64" - "strings" - - "github.com/opentracing/opentracing-go" - "github.com/opentracing/opentracing-go/ext" - "google.golang.org/grpc/metadata" - - "github.com/go-kit/kit/log" -) - -// ContextToGRPC returns a grpc RequestFunc that injects an OpenTracing Span -// found in `ctx` into the grpc Metadata. If no such Span can be found, the -// RequestFunc is a noop. -func ContextToGRPC(tracer opentracing.Tracer, logger log.Logger) func(ctx context.Context, md *metadata.MD) context.Context { - return func(ctx context.Context, md *metadata.MD) context.Context { - if span := opentracing.SpanFromContext(ctx); span != nil { - // There's nothing we can do with an error here. - if err := tracer.Inject(span.Context(), opentracing.TextMap, metadataReaderWriter{md}); err != nil { - logger.Log("err", err) - } - } - return ctx - } -} - -// GRPCToContext returns a grpc RequestFunc that tries to join with an -// OpenTracing trace found in `req` and starts a new Span called -// `operationName` accordingly. If no trace could be found in `req`, the Span -// will be a trace root. The Span is incorporated in the returned Context and -// can be retrieved with opentracing.SpanFromContext(ctx). -func GRPCToContext(tracer opentracing.Tracer, operationName string, logger log.Logger) func(ctx context.Context, md metadata.MD) context.Context { - return func(ctx context.Context, md metadata.MD) context.Context { - var span opentracing.Span - wireContext, err := tracer.Extract(opentracing.TextMap, metadataReaderWriter{&md}) - if err != nil && err != opentracing.ErrSpanContextNotFound { - logger.Log("err", err) - } - span = tracer.StartSpan(operationName, ext.RPCServerOption(wireContext)) - return opentracing.ContextWithSpan(ctx, span) - } -} - -// A type that conforms to opentracing.TextMapReader and -// opentracing.TextMapWriter. -type metadataReaderWriter struct { - *metadata.MD -} - -func (w metadataReaderWriter) Set(key, val string) { - key = strings.ToLower(key) - if strings.HasSuffix(key, "-bin") { - val = string(base64.StdEncoding.EncodeToString([]byte(val))) - } - (*w.MD)[key] = append((*w.MD)[key], val) -} - -func (w metadataReaderWriter) ForeachKey(handler func(key, val string) error) error { - for k, vals := range *w.MD { - for _, v := range vals { - if err := handler(k, v); err != nil { - return err - } - } - } - return nil -} diff --git a/vendor/github.com/go-kit/kit/tracing/opentracing/grpc_test.go b/vendor/github.com/go-kit/kit/tracing/opentracing/grpc_test.go deleted file mode 100644 index a36fa150..00000000 --- a/vendor/github.com/go-kit/kit/tracing/opentracing/grpc_test.go +++ /dev/null @@ -1,64 +0,0 @@ -package opentracing_test - -import ( - "context" - "testing" - - "github.com/opentracing/opentracing-go" - "github.com/opentracing/opentracing-go/mocktracer" - "google.golang.org/grpc/metadata" - - "github.com/go-kit/kit/log" - kitot "github.com/go-kit/kit/tracing/opentracing" -) - -func TestTraceGRPCRequestRoundtrip(t *testing.T) { - logger := log.NewNopLogger() - tracer := mocktracer.New() - - // Initialize the ctx with a Span to inject. - beforeSpan := tracer.StartSpan("to_inject").(*mocktracer.MockSpan) - defer beforeSpan.Finish() - beforeSpan.SetBaggageItem("baggage", "check") - beforeCtx := opentracing.ContextWithSpan(context.Background(), beforeSpan) - - toGRPCFunc := kitot.ContextToGRPC(tracer, logger) - md := metadata.Pairs() - // Call the RequestFunc. - afterCtx := toGRPCFunc(beforeCtx, &md) - - // The Span should not have changed. - afterSpan := opentracing.SpanFromContext(afterCtx) - if beforeSpan != afterSpan { - t.Error("Should not swap in a new span") - } - - // No spans should have finished yet. - finishedSpans := tracer.FinishedSpans() - if want, have := 0, len(finishedSpans); want != have { - t.Errorf("Want %v span(s), found %v", want, have) - } - - // Use GRPCToContext to verify that we can join with the trace given MD. - fromGRPCFunc := kitot.GRPCToContext(tracer, "joined", logger) - joinCtx := fromGRPCFunc(afterCtx, md) - joinedSpan := opentracing.SpanFromContext(joinCtx).(*mocktracer.MockSpan) - - joinedContext := joinedSpan.Context().(mocktracer.MockSpanContext) - beforeContext := beforeSpan.Context().(mocktracer.MockSpanContext) - - if joinedContext.SpanID == beforeContext.SpanID { - t.Error("SpanID should have changed", joinedContext.SpanID, beforeContext.SpanID) - } - - // Check that the parent/child relationship is as expected for the joined span. - if want, have := beforeContext.SpanID, joinedSpan.ParentID; want != have { - t.Errorf("Want ParentID %q, have %q", want, have) - } - if want, have := "joined", joinedSpan.OperationName; want != have { - t.Errorf("Want %q, have %q", want, have) - } - if want, have := "check", joinedSpan.BaggageItem("baggage"); want != have { - t.Errorf("Want %q, have %q", want, have) - } -} diff --git a/vendor/github.com/go-kit/kit/tracing/opentracing/http.go b/vendor/github.com/go-kit/kit/tracing/opentracing/http.go deleted file mode 100644 index 09dd7149..00000000 --- a/vendor/github.com/go-kit/kit/tracing/opentracing/http.go +++ /dev/null @@ -1,71 +0,0 @@ -package opentracing - -import ( - "context" - "net" - "net/http" - "strconv" - - "github.com/opentracing/opentracing-go" - "github.com/opentracing/opentracing-go/ext" - - "github.com/go-kit/kit/log" - kithttp "github.com/go-kit/kit/transport/http" -) - -// ContextToHTTP returns an http RequestFunc that injects an OpenTracing Span -// found in `ctx` into the http headers. If no such Span can be found, the -// RequestFunc is a noop. -func ContextToHTTP(tracer opentracing.Tracer, logger log.Logger) kithttp.RequestFunc { - return func(ctx context.Context, req *http.Request) context.Context { - // Try to find a Span in the Context. - if span := opentracing.SpanFromContext(ctx); span != nil { - // Add standard OpenTracing tags. - ext.HTTPMethod.Set(span, req.Method) - ext.HTTPUrl.Set(span, req.URL.String()) - host, portString, err := net.SplitHostPort(req.URL.Host) - if err == nil { - ext.PeerHostname.Set(span, host) - if port, err := strconv.Atoi(portString); err != nil { - ext.PeerPort.Set(span, uint16(port)) - } - } else { - ext.PeerHostname.Set(span, req.URL.Host) - } - - // There's nothing we can do with any errors here. - if err = tracer.Inject( - span.Context(), - opentracing.TextMap, - opentracing.HTTPHeadersCarrier(req.Header), - ); err != nil { - logger.Log("err", err) - } - } - return ctx - } -} - -// HTTPToContext returns an http RequestFunc that tries to join with an -// OpenTracing trace found in `req` and starts a new Span called -// `operationName` accordingly. If no trace could be found in `req`, the Span -// will be a trace root. The Span is incorporated in the returned Context and -// can be retrieved with opentracing.SpanFromContext(ctx). -func HTTPToContext(tracer opentracing.Tracer, operationName string, logger log.Logger) kithttp.RequestFunc { - return func(ctx context.Context, req *http.Request) context.Context { - // Try to join to a trace propagated in `req`. - var span opentracing.Span - wireContext, err := tracer.Extract( - opentracing.TextMap, - opentracing.HTTPHeadersCarrier(req.Header), - ) - if err != nil && err != opentracing.ErrSpanContextNotFound { - logger.Log("err", err) - } - - span = tracer.StartSpan(operationName, ext.RPCServerOption(wireContext)) - ext.HTTPMethod.Set(span, req.Method) - ext.HTTPUrl.Set(span, req.URL.String()) - return opentracing.ContextWithSpan(ctx, span) - } -} diff --git a/vendor/github.com/go-kit/kit/tracing/opentracing/http_test.go b/vendor/github.com/go-kit/kit/tracing/opentracing/http_test.go deleted file mode 100644 index 548777e7..00000000 --- a/vendor/github.com/go-kit/kit/tracing/opentracing/http_test.go +++ /dev/null @@ -1,109 +0,0 @@ -package opentracing_test - -import ( - "context" - "net/http" - "reflect" - "testing" - - "github.com/opentracing/opentracing-go" - "github.com/opentracing/opentracing-go/ext" - "github.com/opentracing/opentracing-go/mocktracer" - - "github.com/go-kit/kit/log" - kitot "github.com/go-kit/kit/tracing/opentracing" -) - -func TestTraceHTTPRequestRoundtrip(t *testing.T) { - logger := log.NewNopLogger() - tracer := mocktracer.New() - - // Initialize the ctx with a Span to inject. - beforeSpan := tracer.StartSpan("to_inject").(*mocktracer.MockSpan) - defer beforeSpan.Finish() - beforeSpan.SetBaggageItem("baggage", "check") - beforeCtx := opentracing.ContextWithSpan(context.Background(), beforeSpan) - - toHTTPFunc := kitot.ContextToHTTP(tracer, logger) - req, _ := http.NewRequest("GET", "http://test.biz/path", nil) - // Call the RequestFunc. - afterCtx := toHTTPFunc(beforeCtx, req) - - // The Span should not have changed. - afterSpan := opentracing.SpanFromContext(afterCtx) - if beforeSpan != afterSpan { - t.Error("Should not swap in a new span") - } - - // No spans should have finished yet. - finishedSpans := tracer.FinishedSpans() - if want, have := 0, len(finishedSpans); want != have { - t.Errorf("Want %v span(s), found %v", want, have) - } - - // Use HTTPToContext to verify that we can join with the trace given a req. - fromHTTPFunc := kitot.HTTPToContext(tracer, "joined", logger) - joinCtx := fromHTTPFunc(afterCtx, req) - joinedSpan := opentracing.SpanFromContext(joinCtx).(*mocktracer.MockSpan) - - joinedContext := joinedSpan.Context().(mocktracer.MockSpanContext) - beforeContext := beforeSpan.Context().(mocktracer.MockSpanContext) - - if joinedContext.SpanID == beforeContext.SpanID { - t.Error("SpanID should have changed", joinedContext.SpanID, beforeContext.SpanID) - } - - // Check that the parent/child relationship is as expected for the joined span. - if want, have := beforeContext.SpanID, joinedSpan.ParentID; want != have { - t.Errorf("Want ParentID %q, have %q", want, have) - } - if want, have := "joined", joinedSpan.OperationName; want != have { - t.Errorf("Want %q, have %q", want, have) - } - if want, have := "check", joinedSpan.BaggageItem("baggage"); want != have { - t.Errorf("Want %q, have %q", want, have) - } -} - -func TestContextToHTTPTags(t *testing.T) { - tracer := mocktracer.New() - span := tracer.StartSpan("to_inject").(*mocktracer.MockSpan) - defer span.Finish() - ctx := opentracing.ContextWithSpan(context.Background(), span) - req, _ := http.NewRequest("GET", "http://test.biz/path", nil) - - kitot.ContextToHTTP(tracer, log.NewNopLogger())(ctx, req) - - expectedTags := map[string]interface{}{ - string(ext.HTTPMethod): "GET", - string(ext.HTTPUrl): "http://test.biz/path", - string(ext.PeerHostname): "test.biz", - } - if !reflect.DeepEqual(expectedTags, span.Tags()) { - t.Errorf("Want %q, have %q", expectedTags, span.Tags()) - } -} - -func TestHTTPToContextTags(t *testing.T) { - tracer := mocktracer.New() - parentSpan := tracer.StartSpan("to_extract").(*mocktracer.MockSpan) - defer parentSpan.Finish() - req, _ := http.NewRequest("GET", "http://test.biz/path", nil) - tracer.Inject(parentSpan.Context(), opentracing.TextMap, opentracing.HTTPHeadersCarrier(req.Header)) - - ctx := kitot.HTTPToContext(tracer, "op", log.NewNopLogger())(context.Background(), req) - opentracing.SpanFromContext(ctx).Finish() - - childSpan := tracer.FinishedSpans()[0] - expectedTags := map[string]interface{}{ - string(ext.HTTPMethod): "GET", - string(ext.HTTPUrl): "http://test.biz/path", - string(ext.SpanKind): ext.SpanKindRPCServerEnum, - } - if !reflect.DeepEqual(expectedTags, childSpan.Tags()) { - t.Errorf("Want %q, have %q", expectedTags, childSpan.Tags()) - } - if want, have := "op", childSpan.OperationName; want != have { - t.Errorf("Want %q, have %q", want, have) - } -} diff --git a/vendor/github.com/go-kit/kit/tracing/zipkin/README.md b/vendor/github.com/go-kit/kit/tracing/zipkin/README.md deleted file mode 100644 index 36579b57..00000000 --- a/vendor/github.com/go-kit/kit/tracing/zipkin/README.md +++ /dev/null @@ -1,178 +0,0 @@ -# Zipkin - -## Development and Testing Set-up - -Great efforts have been made to make [Zipkin] easier to test, develop and -experiment against. [Zipkin] can now be run from a single Docker container or by -running its self-contained executable jar without extensive configuration. In -its default configuration you will run Zipkin with a HTTP collector, In memory -Span storage backend and web UI on port 9411. - -Example: -``` -docker run -d -p 9411:9411 openzipkin/zipkin -``` - -[zipkin]: http://zipkin.io - -Instrumenting your services with Zipkin distributed tracing using the default -configuration is now possible with the latest release of [zipkin-go-opentracing] -as it includes an HTTP transport for sending spans to the [Zipkin] HTTP -Collector. - -## Middleware Usage - -Follow the [addsvc] example to check out how to wire the Zipkin Middleware. The -changes should be relatively minor. - -The [zipkin-go-opentracing] package has support for HTTP, Kafka and Scribe -collectors as well as using Go Kit's [Log] package for logging. - -### Configuring for the Zipkin HTTP Collector - -To select the transport for the HTTP Collector, you configure the `Recorder` -with the appropriate collector like this: - -```go -var ( - debugMode = false - serviceName = "MyService" - serviceHostPort = "localhost:8000" - zipkinHTTPEndpoint = "localhost:9411" -) -collector, err = zipkin.NewHTTPCollector(zipkinHTTPEndpoint) -if err != nil { - // handle error -} -tracer, err = zipkin.NewTracer( - zipkin.NewRecorder(collector, debugMode, serviceHostPort, serviceName), - ... -) -``` - -### Span per Node vs. Span per RPC -By default Zipkin V1 considers either side of an RPC to have the same identity -and differs in that respect from many other tracing systems which consider the -caller to be the parent and the receiver to be the child. The OpenTracing -specification does not dictate one model over the other, but the Zipkin team is -looking into these [single-host-spans] to potentially bring Zipkin more in-line -with the other tracing systems. - -[single-host-spans]: https://github.com/openzipkin/zipkin/issues/963 - -In case of a `span per node` the receiver will create a child span from the -propagated parent span like this: - -``` -Span per Node propagation and identities - -CALLER: RECEIVER: ---------------------------------- -traceId -> traceId - spanId (new) -spanId -> parentSpanId -parentSpanId -``` - -**Note:** most tracing implementations supporting the `span per node` model -therefore do not propagate their `parentSpanID` as its not needed. - -A typical Zipkin implementation will use the `span per RPC` model and recreate -the span identity from the caller on the receiver's end and then annotates its -values on top of it. Propagation will happen like this: - -``` -Span per RPC propagation and identities - -CALLER: RECEIVER: ---------------------------------- -traceId -> traceId -spanId -> spanId -parentSpanId -> parentSpanId -``` - -The [zipkin-go-opentracing] implementation allows you to choose which model you -wish to use. Make sure you select the same model consistently for all your -services that are required to communicate with each other or you will have trace -propagation issues. If using non OpenTracing / legacy instrumentation, it's -probably best to use the `span per RPC call` model. - -To adhere to the more common tracing philosophy of `span per node`, the Tracer -defaults to `span per node`. To set the `span per RPC call` mode start your -tracer like this: - -```go -tracer, err = zipkin.NewTracer( - zipkin.NewRecorder(...), - zipkin.ClientServerSameSpan(true), -) -``` - -[zipkin-go-opentracing]: https://github.com/openzipkin/zipkin-go-opentracing -[addsvc]:https://github.com/go-kit/kit/tree/master/examples/addsvc -[Log]: https://github.com/go-kit/kit/tree/master/log - -### Tracing Resources - -In our legacy implementation we had the `NewChildSpan` method to allow -annotation of resources such as databases, caches and other services that do not -have server side tracing support. Since OpenTracing has no specific method of -dealing with these items explicitely that is compatible with Zipkin's `SA` -annotation, the [zipkin-go-opentracing] has implemented support using the -OpenTracing Tags system. Here is an example of how one would be able to record -a resource span compatible with standard OpenTracing and triggering an `SA` -annotation in [zipkin-go-opentracing]: - -```go -// you need to import the ext package for the Tag helper functions -import ( - "github.com/opentracing/opentracing-go" - "github.com/opentracing/opentracing-go/ext" -) - -func (svc *Service) GetMeSomeExamples(ctx context.Context, ...) ([]Examples, error) { - // Example of annotating a database query: - var ( - serviceName = "MySQL" - serviceHost = "mysql.example.com" - servicePort = uint16(3306) - queryLabel = "GetExamplesByParam" - query = "select * from example where param = 'value'" - ) - - // retrieve the parent span, if not found create a new trace - parentSpan := opentracing.SpanFromContext(ctx) - if parentSpan == nil { - parentSpan = opentracing.StartSpan(queryLabel) - defer parentSpan.Finish() - } - - // create a new span to record the resource interaction - span := opentracing.StartChildSpan(parentSpan, queryLabel) - - // span.kind "resource" triggers SA annotation - ext.SpanKind.Set(span, "resource") - - // this will label the span's service & hostPort (called Endpoint in Zipkin) - ext.PeerService.Set(span, serviceName) - ext.PeerHostname.Set(span, serviceHost) - ext.PeerPort.Set(span, servicePort) - - // a Tag is the equivalent of a Zipkin Binary Annotation (key:value pair) - span.SetTag("query", query) - - // a LogEvent is the equivalent of a Zipkin Annotation (timestamped) - span.LogEvent("query:start") - - // do the actual query... - - // let's annotate the end... - span.LogEvent("query:end") - - // we're done with this span. - span.Finish() - - // do other stuff - ... -} -``` diff --git a/vendor/github.com/go-kit/kit/transport/doc.go b/vendor/github.com/go-kit/kit/transport/doc.go deleted file mode 100644 index 6ac33ed5..00000000 --- a/vendor/github.com/go-kit/kit/transport/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package transport contains bindings to concrete transports. -package transport diff --git a/vendor/github.com/go-kit/kit/transport/grpc/README.md b/vendor/github.com/go-kit/kit/transport/grpc/README.md deleted file mode 100644 index f57dc99f..00000000 --- a/vendor/github.com/go-kit/kit/transport/grpc/README.md +++ /dev/null @@ -1,54 +0,0 @@ -# grpc - -[gRPC](http://www.grpc.io/) is an excellent, modern IDL and transport for -microservices. If you're starting a greenfield project, go-kit strongly -recommends gRPC as your default transport. - -One important note is that while gRPC supports streaming requests and replies, -go-kit does not. You can still use streams in your service, but their -implementation will not be able to take advantage of many go-kit features like middleware. - -Using gRPC and go-kit together is very simple. - -First, define your service using protobuf3. This is explained -[in gRPC documentation](http://www.grpc.io/docs/#defining-a-service). -See -[add.proto](https://github.com/go-kit/kit/blob/ec8b02591ee873433565a1ae9d317353412d1d27/examples/addsvc/pb/add.proto) -for an example. Make sure the proto definition matches your service's go-kit -(interface) definition. - -Next, get the protoc compiler. - -You can download pre-compiled binaries from the -[protobuf release page](https://github.com/google/protobuf/releases). -You will unzip a folder called `protoc3` with a subdirectory `bin` containing -an executable. Move that executable somewhere in your `$PATH` and you're good -to go! - -It can also be built from source. - -```sh -brew install autoconf automake libtool -git clone https://github.com/google/protobuf -cd protobuf -./autogen.sh ; ./configure ; make ; make install -``` - -Then, compile your service definition, from .proto to .go. - -```sh -protoc add.proto --go_out=plugins=grpc:. -``` - -Finally, write a tiny binding from your service definition to the gRPC -definition. It's a simple conversion from one domain to another. -See -[grpc_binding.go](https://github.com/go-kit/kit/blob/ec8b02591ee873433565a1ae9d317353412d1d27/examples/addsvc/grpc_binding.go) -for an example. - -That's it! -The gRPC binding can be bound to a listener and serve normal gRPC requests. -And within your service, you can use standard go-kit components and idioms. -See [addsvc](https://github.com/go-kit/kit/tree/master/examples/addsvc) for -a complete working example with gRPC support. And remember: go-kit services -can support multiple transports simultaneously. diff --git a/vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/client.go b/vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/client.go deleted file mode 100644 index 1e0c8a78..00000000 --- a/vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/client.go +++ /dev/null @@ -1,50 +0,0 @@ -package test - -import ( - "context" - - "google.golang.org/grpc" - - "github.com/go-kit/kit/endpoint" - grpctransport "github.com/go-kit/kit/transport/grpc" - "github.com/go-kit/kit/transport/grpc/_grpc_test/pb" -) - -type clientBinding struct { - test endpoint.Endpoint -} - -func (c *clientBinding) Test(ctx context.Context, a string, b int64) (context.Context, string, error) { - response, err := c.test(ctx, TestRequest{A: a, B: b}) - if err != nil { - return nil, "", err - } - r := response.(*TestResponse) - return r.Ctx, r.V, nil -} - -func NewClient(cc *grpc.ClientConn) Service { - return &clientBinding{ - test: grpctransport.NewClient( - cc, - "pb.Test", - "Test", - encodeRequest, - decodeResponse, - &pb.TestResponse{}, - grpctransport.ClientBefore( - injectCorrelationID, - ), - grpctransport.ClientBefore( - displayClientRequestHeaders, - ), - grpctransport.ClientAfter( - displayClientResponseHeaders, - displayClientResponseTrailers, - ), - grpctransport.ClientAfter( - extractConsumedCorrelationID, - ), - ).Endpoint(), - } -} diff --git a/vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/context_metadata.go b/vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/context_metadata.go deleted file mode 100644 index 0769325e..00000000 --- a/vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/context_metadata.go +++ /dev/null @@ -1,141 +0,0 @@ -package test - -import ( - "context" - "fmt" - - "google.golang.org/grpc/metadata" -) - -type metaContext string - -const ( - correlationID metaContext = "correlation-id" - responseHDR metaContext = "my-response-header" - responseTRLR metaContext = "my-response-trailer" - correlationIDTRLR metaContext = "correlation-id-consumed" -) - -/* client before functions */ - -func injectCorrelationID(ctx context.Context, md *metadata.MD) context.Context { - if hdr, ok := ctx.Value(correlationID).(string); ok { - fmt.Printf("\tClient found correlationID %q in context, set metadata header\n", hdr) - (*md)[string(correlationID)] = append((*md)[string(correlationID)], hdr) - } - return ctx -} - -func displayClientRequestHeaders(ctx context.Context, md *metadata.MD) context.Context { - if len(*md) > 0 { - fmt.Println("\tClient >> Request Headers:") - for key, val := range *md { - fmt.Printf("\t\t%s: %s\n", key, val[len(val)-1]) - } - } - return ctx -} - -/* server before functions */ - -func extractCorrelationID(ctx context.Context, md metadata.MD) context.Context { - if hdr, ok := md[string(correlationID)]; ok { - cID := hdr[len(hdr)-1] - ctx = context.WithValue(ctx, correlationID, cID) - fmt.Printf("\tServer received correlationID %q in metadata header, set context\n", cID) - } - return ctx -} - -func displayServerRequestHeaders(ctx context.Context, md metadata.MD) context.Context { - if len(md) > 0 { - fmt.Println("\tServer << Request Headers:") - for key, val := range md { - fmt.Printf("\t\t%s: %s\n", key, val[len(val)-1]) - } - } - return ctx -} - -/* server after functions */ - -func injectResponseHeader(ctx context.Context, md *metadata.MD, _ *metadata.MD) context.Context { - *md = metadata.Join(*md, metadata.Pairs(string(responseHDR), "has-a-value")) - return ctx -} - -func displayServerResponseHeaders(ctx context.Context, md *metadata.MD, _ *metadata.MD) context.Context { - if len(*md) > 0 { - fmt.Println("\tServer >> Response Headers:") - for key, val := range *md { - fmt.Printf("\t\t%s: %s\n", key, val[len(val)-1]) - } - } - return ctx -} - -func injectResponseTrailer(ctx context.Context, _ *metadata.MD, md *metadata.MD) context.Context { - *md = metadata.Join(*md, metadata.Pairs(string(responseTRLR), "has-a-value-too")) - return ctx -} - -func injectConsumedCorrelationID(ctx context.Context, _ *metadata.MD, md *metadata.MD) context.Context { - if hdr, ok := ctx.Value(correlationID).(string); ok { - fmt.Printf("\tServer found correlationID %q in context, set consumed trailer\n", hdr) - *md = metadata.Join(*md, metadata.Pairs(string(correlationIDTRLR), hdr)) - } - return ctx -} - -func displayServerResponseTrailers(ctx context.Context, _ *metadata.MD, md *metadata.MD) context.Context { - if len(*md) > 0 { - fmt.Println("\tServer >> Response Trailers:") - for key, val := range *md { - fmt.Printf("\t\t%s: %s\n", key, val[len(val)-1]) - } - } - return ctx -} - -/* client after functions */ - -func displayClientResponseHeaders(ctx context.Context, md metadata.MD, _ metadata.MD) context.Context { - if len(md) > 0 { - fmt.Println("\tClient << Response Headers:") - for key, val := range md { - fmt.Printf("\t\t%s: %s\n", key, val[len(val)-1]) - } - } - return ctx -} - -func displayClientResponseTrailers(ctx context.Context, _ metadata.MD, md metadata.MD) context.Context { - if len(md) > 0 { - fmt.Println("\tClient << Response Trailers:") - for key, val := range md { - fmt.Printf("\t\t%s: %s\n", key, val[len(val)-1]) - } - } - return ctx -} - -func extractConsumedCorrelationID(ctx context.Context, _ metadata.MD, md metadata.MD) context.Context { - if hdr, ok := md[string(correlationIDTRLR)]; ok { - fmt.Printf("\tClient received consumed correlationID %q in metadata trailer, set context\n", hdr[len(hdr)-1]) - ctx = context.WithValue(ctx, correlationIDTRLR, hdr[len(hdr)-1]) - } - return ctx -} - -/* CorrelationID context handlers */ - -func SetCorrelationID(ctx context.Context, v string) context.Context { - return context.WithValue(ctx, correlationID, v) -} - -func GetConsumedCorrelationID(ctx context.Context) string { - if trlr, ok := ctx.Value(correlationIDTRLR).(string); ok { - return trlr - } - return "" -} diff --git a/vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/pb/generate.go b/vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/pb/generate.go deleted file mode 100644 index aa20bb66..00000000 --- a/vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/pb/generate.go +++ /dev/null @@ -1,3 +0,0 @@ -package pb - -//go:generate protoc test.proto --go_out=plugins=grpc:. diff --git a/vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/pb/test.pb.go b/vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/pb/test.pb.go deleted file mode 100644 index 97d29bb1..00000000 --- a/vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/pb/test.pb.go +++ /dev/null @@ -1,167 +0,0 @@ -// Code generated by protoc-gen-go. -// source: test.proto -// DO NOT EDIT! - -/* -Package pb is a generated protocol buffer package. - -It is generated from these files: - test.proto - -It has these top-level messages: - TestRequest - TestResponse -*/ -package pb - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" - -import ( - context "golang.org/x/net/context" - grpc "google.golang.org/grpc" -) - -// 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.ProtoPackageIsVersion2 // please upgrade the proto package - -type TestRequest struct { - A string `protobuf:"bytes,1,opt,name=a" json:"a,omitempty"` - B int64 `protobuf:"varint,2,opt,name=b" json:"b,omitempty"` -} - -func (m *TestRequest) Reset() { *m = TestRequest{} } -func (m *TestRequest) String() string { return proto.CompactTextString(m) } -func (*TestRequest) ProtoMessage() {} -func (*TestRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } - -func (m *TestRequest) GetA() string { - if m != nil { - return m.A - } - return "" -} - -func (m *TestRequest) GetB() int64 { - if m != nil { - return m.B - } - return 0 -} - -type TestResponse struct { - V string `protobuf:"bytes,1,opt,name=v" json:"v,omitempty"` -} - -func (m *TestResponse) Reset() { *m = TestResponse{} } -func (m *TestResponse) String() string { return proto.CompactTextString(m) } -func (*TestResponse) ProtoMessage() {} -func (*TestResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } - -func (m *TestResponse) GetV() string { - if m != nil { - return m.V - } - return "" -} - -func init() { - proto.RegisterType((*TestRequest)(nil), "pb.TestRequest") - proto.RegisterType((*TestResponse)(nil), "pb.TestResponse") -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// Client API for Test service - -type TestClient interface { - Test(ctx context.Context, in *TestRequest, opts ...grpc.CallOption) (*TestResponse, error) -} - -type testClient struct { - cc *grpc.ClientConn -} - -func NewTestClient(cc *grpc.ClientConn) TestClient { - return &testClient{cc} -} - -func (c *testClient) Test(ctx context.Context, in *TestRequest, opts ...grpc.CallOption) (*TestResponse, error) { - out := new(TestResponse) - err := grpc.Invoke(ctx, "/pb.Test/Test", in, out, c.cc, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// Server API for Test service - -type TestServer interface { - Test(context.Context, *TestRequest) (*TestResponse, error) -} - -func RegisterTestServer(s *grpc.Server, srv TestServer) { - s.RegisterService(&_Test_serviceDesc, srv) -} - -func _Test_Test_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(TestRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(TestServer).Test(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/pb.Test/Test", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TestServer).Test(ctx, req.(*TestRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _Test_serviceDesc = grpc.ServiceDesc{ - ServiceName: "pb.Test", - HandlerType: (*TestServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "Test", - Handler: _Test_Test_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "test.proto", -} - -func init() { proto.RegisterFile("test.proto", fileDescriptor0) } - -var fileDescriptor0 = []byte{ - // 129 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xe2, 0x2a, 0x49, 0x2d, 0x2e, - 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x2a, 0x48, 0x52, 0xd2, 0xe4, 0xe2, 0x0e, 0x49, - 0x2d, 0x2e, 0x09, 0x4a, 0x2d, 0x2c, 0x4d, 0x2d, 0x2e, 0x11, 0xe2, 0xe1, 0x62, 0x4c, 0x94, 0x60, - 0x54, 0x60, 0xd4, 0xe0, 0x0c, 0x62, 0x4c, 0x04, 0xf1, 0x92, 0x24, 0x98, 0x14, 0x18, 0x35, 0x98, - 0x83, 0x18, 0x93, 0x94, 0x64, 0xb8, 0x78, 0x20, 0x4a, 0x8b, 0x0b, 0xf2, 0xf3, 0x8a, 0x53, 0x41, - 0xb2, 0x65, 0x30, 0xb5, 0x65, 0x46, 0xc6, 0x5c, 0x2c, 0x20, 0x59, 0x21, 0x6d, 0x28, 0xcd, 0xaf, - 0x57, 0x90, 0xa4, 0x87, 0x64, 0xb4, 0x94, 0x00, 0x42, 0x00, 0x62, 0x80, 0x12, 0x43, 0x12, 0x1b, - 0xd8, 0x21, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x49, 0xfc, 0xd8, 0xf1, 0x96, 0x00, 0x00, - 0x00, -} diff --git a/vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/pb/test.proto b/vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/pb/test.proto deleted file mode 100644 index 6a3555e3..00000000 --- a/vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/pb/test.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; - -package pb; - -service Test { - rpc Test (TestRequest) returns (TestResponse) {} -} - -message TestRequest { - string a = 1; - int64 b = 2; -} - -message TestResponse { - string v = 1; -} diff --git a/vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/request_response.go b/vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/request_response.go deleted file mode 100644 index 269703d3..00000000 --- a/vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/request_response.go +++ /dev/null @@ -1,27 +0,0 @@ -package test - -import ( - "context" - - "github.com/go-kit/kit/transport/grpc/_grpc_test/pb" -) - -func encodeRequest(ctx context.Context, req interface{}) (interface{}, error) { - r := req.(TestRequest) - return &pb.TestRequest{A: r.A, B: r.B}, nil -} - -func decodeRequest(ctx context.Context, req interface{}) (interface{}, error) { - r := req.(*pb.TestRequest) - return TestRequest{A: r.A, B: r.B}, nil -} - -func encodeResponse(ctx context.Context, resp interface{}) (interface{}, error) { - r := resp.(*TestResponse) - return &pb.TestResponse{V: r.V}, nil -} - -func decodeResponse(ctx context.Context, resp interface{}) (interface{}, error) { - r := resp.(*pb.TestResponse) - return &TestResponse{V: r.V, Ctx: ctx}, nil -} diff --git a/vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/server.go b/vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/server.go deleted file mode 100644 index 49e70a91..00000000 --- a/vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/server.go +++ /dev/null @@ -1,70 +0,0 @@ -package test - -import ( - "context" - "fmt" - - oldcontext "golang.org/x/net/context" - - "github.com/go-kit/kit/endpoint" - grpctransport "github.com/go-kit/kit/transport/grpc" - "github.com/go-kit/kit/transport/grpc/_grpc_test/pb" -) - -type service struct{} - -func (service) Test(ctx context.Context, a string, b int64) (context.Context, string, error) { - return nil, fmt.Sprintf("%s = %d", a, b), nil -} - -func NewService() Service { - return service{} -} - -func makeTestEndpoint(svc Service) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - req := request.(TestRequest) - newCtx, v, err := svc.Test(ctx, req.A, req.B) - return &TestResponse{ - V: v, - Ctx: newCtx, - }, err - } -} - -type serverBinding struct { - test grpctransport.Handler -} - -func (b *serverBinding) Test(ctx oldcontext.Context, req *pb.TestRequest) (*pb.TestResponse, error) { - _, response, err := b.test.ServeGRPC(ctx, req) - if err != nil { - return nil, err - } - return response.(*pb.TestResponse), nil -} - -func NewBinding(svc Service) *serverBinding { - return &serverBinding{ - test: grpctransport.NewServer( - makeTestEndpoint(svc), - decodeRequest, - encodeResponse, - grpctransport.ServerBefore( - extractCorrelationID, - ), - grpctransport.ServerBefore( - displayServerRequestHeaders, - ), - grpctransport.ServerAfter( - injectResponseHeader, - injectResponseTrailer, - injectConsumedCorrelationID, - ), - grpctransport.ServerAfter( - displayServerResponseHeaders, - displayServerResponseTrailers, - ), - ), - } -} diff --git a/vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/service.go b/vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/service.go deleted file mode 100644 index 536b27c0..00000000 --- a/vendor/github.com/go-kit/kit/transport/grpc/_grpc_test/service.go +++ /dev/null @@ -1,17 +0,0 @@ -package test - -import "context" - -type Service interface { - Test(ctx context.Context, a string, b int64) (context.Context, string, error) -} - -type TestRequest struct { - A string - B int64 -} - -type TestResponse struct { - Ctx context.Context - V string -} diff --git a/vendor/github.com/go-kit/kit/transport/grpc/client.go b/vendor/github.com/go-kit/kit/transport/grpc/client.go deleted file mode 100644 index 28c203f8..00000000 --- a/vendor/github.com/go-kit/kit/transport/grpc/client.go +++ /dev/null @@ -1,115 +0,0 @@ -package grpc - -import ( - "context" - "fmt" - "reflect" - - "google.golang.org/grpc" - "google.golang.org/grpc/metadata" - - "github.com/go-kit/kit/endpoint" -) - -// Client wraps a gRPC connection and provides a method that implements -// endpoint.Endpoint. -type Client struct { - client *grpc.ClientConn - serviceName string - method string - enc EncodeRequestFunc - dec DecodeResponseFunc - grpcReply reflect.Type - before []ClientRequestFunc - after []ClientResponseFunc -} - -// NewClient constructs a usable Client for a single remote endpoint. -// Pass an zero-value protobuf message of the RPC response type as -// the grpcReply argument. -func NewClient( - cc *grpc.ClientConn, - serviceName string, - method string, - enc EncodeRequestFunc, - dec DecodeResponseFunc, - grpcReply interface{}, - options ...ClientOption, -) *Client { - c := &Client{ - client: cc, - method: fmt.Sprintf("/%s/%s", serviceName, method), - enc: enc, - dec: dec, - // We are using reflect.Indirect here to allow both reply structs and - // pointers to these reply structs. New consumers of the client should - // use structs directly, while existing consumers will not break if they - // remain to use pointers to structs. - grpcReply: reflect.TypeOf( - reflect.Indirect( - reflect.ValueOf(grpcReply), - ).Interface(), - ), - before: []ClientRequestFunc{}, - after: []ClientResponseFunc{}, - } - for _, option := range options { - option(c) - } - return c -} - -// ClientOption sets an optional parameter for clients. -type ClientOption func(*Client) - -// ClientBefore sets the RequestFuncs that are applied to the outgoing gRPC -// request before it's invoked. -func ClientBefore(before ...ClientRequestFunc) ClientOption { - return func(c *Client) { c.before = append(c.before, before...) } -} - -// ClientAfter sets the ClientResponseFuncs that are applied to the incoming -// gRPC response prior to it being decoded. This is useful for obtaining -// response metadata and adding onto the context prior to decoding. -func ClientAfter(after ...ClientResponseFunc) ClientOption { - return func(c *Client) { c.after = append(c.after, after...) } -} - -// Endpoint returns a usable endpoint that will invoke the gRPC specified by the -// client. -func (c Client) Endpoint() endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - ctx, cancel := context.WithCancel(ctx) - defer cancel() - - req, err := c.enc(ctx, request) - if err != nil { - return nil, err - } - - md := &metadata.MD{} - for _, f := range c.before { - ctx = f(ctx, md) - } - ctx = metadata.NewOutgoingContext(ctx, *md) - - var header, trailer metadata.MD - grpcReply := reflect.New(c.grpcReply).Interface() - if err = grpc.Invoke( - ctx, c.method, req, grpcReply, c.client, - grpc.Header(&header), grpc.Trailer(&trailer), - ); err != nil { - return nil, err - } - - for _, f := range c.after { - ctx = f(ctx, header, trailer) - } - - response, err := c.dec(ctx, grpcReply) - if err != nil { - return nil, err - } - return response, nil - } -} diff --git a/vendor/github.com/go-kit/kit/transport/grpc/client_test.go b/vendor/github.com/go-kit/kit/transport/grpc/client_test.go deleted file mode 100644 index ea5dfa39..00000000 --- a/vendor/github.com/go-kit/kit/transport/grpc/client_test.go +++ /dev/null @@ -1,61 +0,0 @@ -package grpc_test - -import ( - "context" - "fmt" - "net" - "testing" - - "google.golang.org/grpc" - - test "github.com/go-kit/kit/transport/grpc/_grpc_test" - "github.com/go-kit/kit/transport/grpc/_grpc_test/pb" -) - -const ( - hostPort string = "localhost:8002" -) - -func TestGRPCClient(t *testing.T) { - var ( - server = grpc.NewServer() - service = test.NewService() - ) - - sc, err := net.Listen("tcp", hostPort) - if err != nil { - t.Fatalf("unable to listen: %+v", err) - } - defer server.GracefulStop() - - go func() { - pb.RegisterTestServer(server, test.NewBinding(service)) - _ = server.Serve(sc) - }() - - cc, err := grpc.Dial(hostPort, grpc.WithInsecure()) - if err != nil { - t.Fatalf("unable to Dial: %+v", err) - } - - client := test.NewClient(cc) - - var ( - a = "the answer to life the universe and everything" - b = int64(42) - cID = "request-1" - ctx = test.SetCorrelationID(context.Background(), cID) - ) - - responseCTX, v, err := client.Test(ctx, a, b) - if err != nil { - t.Fatalf("unable to Test: %+v", err) - } - if want, have := fmt.Sprintf("%s = %d", a, b), v; want != have { - t.Fatalf("want %q, have %q", want, have) - } - - if want, have := cID, test.GetConsumedCorrelationID(responseCTX); want != have { - t.Fatalf("want %q, have %q", want, have) - } -} diff --git a/vendor/github.com/go-kit/kit/transport/grpc/doc.go b/vendor/github.com/go-kit/kit/transport/grpc/doc.go deleted file mode 100644 index a953ba88..00000000 --- a/vendor/github.com/go-kit/kit/transport/grpc/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package grpc provides a gRPC binding for endpoints. -package grpc diff --git a/vendor/github.com/go-kit/kit/transport/grpc/encode_decode.go b/vendor/github.com/go-kit/kit/transport/grpc/encode_decode.go deleted file mode 100644 index f2900ed6..00000000 --- a/vendor/github.com/go-kit/kit/transport/grpc/encode_decode.go +++ /dev/null @@ -1,29 +0,0 @@ -package grpc - -import ( - "context" -) - -// DecodeRequestFunc extracts a user-domain request object from a gRPC request. -// It's designed to be used in gRPC servers, for server-side endpoints. One -// straightforward DecodeRequestFunc could be something that decodes from the -// gRPC request message to the concrete request type. -type DecodeRequestFunc func(context.Context, interface{}) (request interface{}, err error) - -// EncodeRequestFunc encodes the passed request object into the gRPC request -// object. It's designed to be used in gRPC clients, for client-side endpoints. -// One straightforward EncodeRequestFunc could something that encodes the object -// directly to the gRPC request message. -type EncodeRequestFunc func(context.Context, interface{}) (request interface{}, err error) - -// EncodeResponseFunc encodes the passed response object to the gRPC response -// message. It's designed to be used in gRPC servers, for server-side endpoints. -// One straightforward EncodeResponseFunc could be something that encodes the -// object directly to the gRPC response message. -type EncodeResponseFunc func(context.Context, interface{}) (response interface{}, err error) - -// DecodeResponseFunc extracts a user-domain response object from a gRPC -// response object. It's designed to be used in gRPC clients, for client-side -// endpoints. One straightforward DecodeResponseFunc could be something that -// decodes from the gRPC response message to the concrete response type. -type DecodeResponseFunc func(context.Context, interface{}) (response interface{}, err error) diff --git a/vendor/github.com/go-kit/kit/transport/grpc/request_response_funcs.go b/vendor/github.com/go-kit/kit/transport/grpc/request_response_funcs.go deleted file mode 100644 index 8d072ede..00000000 --- a/vendor/github.com/go-kit/kit/transport/grpc/request_response_funcs.go +++ /dev/null @@ -1,76 +0,0 @@ -package grpc - -import ( - "context" - "encoding/base64" - "strings" - - "google.golang.org/grpc/metadata" -) - -const ( - binHdrSuffix = "-bin" -) - -// ClientRequestFunc may take information from context and use it to construct -// metadata headers to be transported to the server. ClientRequestFuncs are -// executed after creating the request but prior to sending the gRPC request to -// the server. -type ClientRequestFunc func(context.Context, *metadata.MD) context.Context - -// ServerRequestFunc may take information from the received metadata header and -// use it to place items in the request scoped context. ServerRequestFuncs are -// executed prior to invoking the endpoint. -type ServerRequestFunc func(context.Context, metadata.MD) context.Context - -// ServerResponseFunc may take information from a request context and use it to -// manipulate the gRPC response metadata headers and trailers. ResponseFuncs are -// only executed in servers, after invoking the endpoint but prior to writing a -// response. -type ServerResponseFunc func(ctx context.Context, header *metadata.MD, trailer *metadata.MD) context.Context - -// ClientResponseFunc may take information from a gRPC metadata header and/or -// trailer and make the responses available for consumption. ClientResponseFuncs -// are only executed in clients, after a request has been made, but prior to it -// being decoded. -type ClientResponseFunc func(ctx context.Context, header metadata.MD, trailer metadata.MD) context.Context - -// SetRequestHeader returns a ClientRequestFunc that sets the specified metadata -// key-value pair. -func SetRequestHeader(key, val string) ClientRequestFunc { - return func(ctx context.Context, md *metadata.MD) context.Context { - key, val := EncodeKeyValue(key, val) - (*md)[key] = append((*md)[key], val) - return ctx - } -} - -// SetResponseHeader returns a ResponseFunc that sets the specified metadata -// key-value pair. -func SetResponseHeader(key, val string) ServerResponseFunc { - return func(ctx context.Context, md *metadata.MD, _ *metadata.MD) context.Context { - key, val := EncodeKeyValue(key, val) - (*md)[key] = append((*md)[key], val) - return ctx - } -} - -// SetResponseTrailer returns a ResponseFunc that sets the specified metadata -// key-value pair. -func SetResponseTrailer(key, val string) ServerResponseFunc { - return func(ctx context.Context, _ *metadata.MD, md *metadata.MD) context.Context { - key, val := EncodeKeyValue(key, val) - (*md)[key] = append((*md)[key], val) - return ctx - } -} - -// EncodeKeyValue sanitizes a key-value pair for use in gRPC metadata headers. -func EncodeKeyValue(key, val string) (string, string) { - key = strings.ToLower(key) - if strings.HasSuffix(key, binHdrSuffix) { - v := base64.StdEncoding.EncodeToString([]byte(val)) - val = string(v) - } - return key, val -} diff --git a/vendor/github.com/go-kit/kit/transport/grpc/server.go b/vendor/github.com/go-kit/kit/transport/grpc/server.go deleted file mode 100644 index 6da4bdb9..00000000 --- a/vendor/github.com/go-kit/kit/transport/grpc/server.go +++ /dev/null @@ -1,123 +0,0 @@ -package grpc - -import ( - oldcontext "golang.org/x/net/context" - "google.golang.org/grpc" - "google.golang.org/grpc/metadata" - - "github.com/go-kit/kit/endpoint" - "github.com/go-kit/kit/log" -) - -// Handler which should be called from the gRPC binding of the service -// implementation. The incoming request parameter, and returned response -// parameter, are both gRPC types, not user-domain. -type Handler interface { - ServeGRPC(ctx oldcontext.Context, request interface{}) (oldcontext.Context, interface{}, error) -} - -// Server wraps an endpoint and implements grpc.Handler. -type Server struct { - e endpoint.Endpoint - dec DecodeRequestFunc - enc EncodeResponseFunc - before []ServerRequestFunc - after []ServerResponseFunc - logger log.Logger -} - -// NewServer constructs a new server, which implements wraps the provided -// endpoint and implements the Handler interface. Consumers should write -// bindings that adapt the concrete gRPC methods from their compiled protobuf -// definitions to individual handlers. Request and response objects are from the -// caller business domain, not gRPC request and reply types. -func NewServer( - e endpoint.Endpoint, - dec DecodeRequestFunc, - enc EncodeResponseFunc, - options ...ServerOption, -) *Server { - s := &Server{ - e: e, - dec: dec, - enc: enc, - logger: log.NewNopLogger(), - } - for _, option := range options { - option(s) - } - return s -} - -// ServerOption sets an optional parameter for servers. -type ServerOption func(*Server) - -// ServerBefore functions are executed on the HTTP request object before the -// request is decoded. -func ServerBefore(before ...ServerRequestFunc) ServerOption { - return func(s *Server) { s.before = append(s.before, before...) } -} - -// ServerAfter functions are executed on the HTTP response writer after the -// endpoint is invoked, but before anything is written to the client. -func ServerAfter(after ...ServerResponseFunc) ServerOption { - return func(s *Server) { s.after = append(s.after, after...) } -} - -// ServerErrorLogger is used to log non-terminal errors. By default, no errors -// are logged. -func ServerErrorLogger(logger log.Logger) ServerOption { - return func(s *Server) { s.logger = logger } -} - -// ServeGRPC implements the Handler interface. -func (s Server) ServeGRPC(ctx oldcontext.Context, req interface{}) (oldcontext.Context, interface{}, error) { - // Retrieve gRPC metadata. - md, ok := metadata.FromIncomingContext(ctx) - if !ok { - md = metadata.MD{} - } - - for _, f := range s.before { - ctx = f(ctx, md) - } - - request, err := s.dec(ctx, req) - if err != nil { - s.logger.Log("err", err) - return ctx, nil, err - } - - response, err := s.e(ctx, request) - if err != nil { - s.logger.Log("err", err) - return ctx, nil, err - } - - var mdHeader, mdTrailer metadata.MD - for _, f := range s.after { - ctx = f(ctx, &mdHeader, &mdTrailer) - } - - grpcResp, err := s.enc(ctx, response) - if err != nil { - s.logger.Log("err", err) - return ctx, nil, err - } - - if len(mdHeader) > 0 { - if err = grpc.SendHeader(ctx, mdHeader); err != nil { - s.logger.Log("err", err) - return ctx, nil, err - } - } - - if len(mdTrailer) > 0 { - if err = grpc.SetTrailer(ctx, mdTrailer); err != nil { - s.logger.Log("err", err) - return ctx, nil, err - } - } - - return ctx, grpcResp, nil -} diff --git a/vendor/github.com/go-kit/kit/transport/http/client.go b/vendor/github.com/go-kit/kit/transport/http/client.go deleted file mode 100644 index f1ca9c3a..00000000 --- a/vendor/github.com/go-kit/kit/transport/http/client.go +++ /dev/null @@ -1,179 +0,0 @@ -package http - -import ( - "bytes" - "context" - "encoding/json" - "encoding/xml" - "io/ioutil" - "net/http" - "net/url" - - "github.com/go-kit/kit/endpoint" -) - -// Client wraps a URL and provides a method that implements endpoint.Endpoint. -type Client struct { - client *http.Client - method string - tgt *url.URL - enc EncodeRequestFunc - dec DecodeResponseFunc - before []RequestFunc - after []ClientResponseFunc - finalizer ClientFinalizerFunc - bufferedStream bool -} - -// NewClient constructs a usable Client for a single remote method. -func NewClient( - method string, - tgt *url.URL, - enc EncodeRequestFunc, - dec DecodeResponseFunc, - options ...ClientOption, -) *Client { - c := &Client{ - client: http.DefaultClient, - method: method, - tgt: tgt, - enc: enc, - dec: dec, - before: []RequestFunc{}, - after: []ClientResponseFunc{}, - bufferedStream: false, - } - for _, option := range options { - option(c) - } - return c -} - -// ClientOption sets an optional parameter for clients. -type ClientOption func(*Client) - -// SetClient sets the underlying HTTP client used for requests. -// By default, http.DefaultClient is used. -func SetClient(client *http.Client) ClientOption { - return func(c *Client) { c.client = client } -} - -// ClientBefore sets the RequestFuncs that are applied to the outgoing HTTP -// request before it's invoked. -func ClientBefore(before ...RequestFunc) ClientOption { - return func(c *Client) { c.before = append(c.before, before...) } -} - -// ClientAfter sets the ClientResponseFuncs applied to the incoming HTTP -// request prior to it being decoded. This is useful for obtaining anything off -// of the response and adding onto the context prior to decoding. -func ClientAfter(after ...ClientResponseFunc) ClientOption { - return func(c *Client) { c.after = append(c.after, after...) } -} - -// ClientFinalizer is executed at the end of every HTTP request. -// By default, no finalizer is registered. -func ClientFinalizer(f ClientFinalizerFunc) ClientOption { - return func(s *Client) { s.finalizer = f } -} - -// BufferedStream sets whether the Response.Body is left open, allowing it -// to be read from later. Useful for transporting a file as a buffered stream. -func BufferedStream(buffered bool) ClientOption { - return func(c *Client) { c.bufferedStream = buffered } -} - -// Endpoint returns a usable endpoint that invokes the remote endpoint. -func (c Client) Endpoint() endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - ctx, cancel := context.WithCancel(ctx) - defer cancel() - - var ( - resp *http.Response - err error - ) - if c.finalizer != nil { - defer func() { - if resp != nil { - ctx = context.WithValue(ctx, ContextKeyResponseHeaders, resp.Header) - ctx = context.WithValue(ctx, ContextKeyResponseSize, resp.ContentLength) - } - c.finalizer(ctx, err) - }() - } - - req, err := http.NewRequest(c.method, c.tgt.String(), nil) - if err != nil { - return nil, err - } - - if err = c.enc(ctx, req, request); err != nil { - return nil, err - } - - for _, f := range c.before { - ctx = f(ctx, req) - } - - resp, err = c.client.Do(req.WithContext(ctx)) - - if err != nil { - return nil, err - } - - if !c.bufferedStream { - defer resp.Body.Close() - } - - for _, f := range c.after { - ctx = f(ctx, resp) - } - - response, err := c.dec(ctx, resp) - if err != nil { - return nil, err - } - - return response, nil - } -} - -// ClientFinalizerFunc can be used to perform work at the end of a client HTTP -// request, after the response is returned. The principal -// intended use is for error logging. Additional response parameters are -// provided in the context under keys with the ContextKeyResponse prefix. -// Note: err may be nil. There maybe also no additional response parameters depending on -// when an error occurs. -type ClientFinalizerFunc func(ctx context.Context, err error) - -// EncodeJSONRequest is an EncodeRequestFunc that serializes the request as a -// JSON object to the Request body. Many JSON-over-HTTP services can use it as -// a sensible default. If the request implements Headerer, the provided headers -// will be applied to the request. -func EncodeJSONRequest(c context.Context, r *http.Request, request interface{}) error { - r.Header.Set("Content-Type", "application/json; charset=utf-8") - if headerer, ok := request.(Headerer); ok { - for k := range headerer.Headers() { - r.Header.Set(k, headerer.Headers().Get(k)) - } - } - var b bytes.Buffer - r.Body = ioutil.NopCloser(&b) - return json.NewEncoder(&b).Encode(request) -} - -// EncodeXMLRequest is an EncodeRequestFunc that serializes the request as a -// XML object to the Request body. If the request implements Headerer, -// the provided headers will be applied to the request. -func EncodeXMLRequest(c context.Context, r *http.Request, request interface{}) error { - r.Header.Set("Content-Type", "text/xml; charset=utf-8") - if headerer, ok := request.(Headerer); ok { - for k := range headerer.Headers() { - r.Header.Set(k, headerer.Headers().Get(k)) - } - } - var b bytes.Buffer - r.Body = ioutil.NopCloser(&b) - return xml.NewEncoder(&b).Encode(request) -} diff --git a/vendor/github.com/go-kit/kit/transport/http/client_test.go b/vendor/github.com/go-kit/kit/transport/http/client_test.go deleted file mode 100644 index d6638100..00000000 --- a/vendor/github.com/go-kit/kit/transport/http/client_test.go +++ /dev/null @@ -1,267 +0,0 @@ -package http_test - -import ( - "context" - "io" - "io/ioutil" - "net/http" - "net/http/httptest" - "net/url" - "testing" - "time" - - httptransport "github.com/go-kit/kit/transport/http" -) - -type TestResponse struct { - Body io.ReadCloser - String string -} - -func TestHTTPClient(t *testing.T) { - var ( - testbody = "testbody" - encode = func(context.Context, *http.Request, interface{}) error { return nil } - decode = func(_ context.Context, r *http.Response) (interface{}, error) { - buffer := make([]byte, len(testbody)) - r.Body.Read(buffer) - return TestResponse{r.Body, string(buffer)}, nil - } - headers = make(chan string, 1) - headerKey = "X-Foo" - headerVal = "abcde" - afterHeaderKey = "X-The-Dude" - afterHeaderVal = "Abides" - afterVal = "" - afterFunc = func(ctx context.Context, r *http.Response) context.Context { - afterVal = r.Header.Get(afterHeaderKey) - return ctx - } - ) - - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - headers <- r.Header.Get(headerKey) - w.Header().Set(afterHeaderKey, afterHeaderVal) - w.WriteHeader(http.StatusOK) - w.Write([]byte(testbody)) - })) - - client := httptransport.NewClient( - "GET", - mustParse(server.URL), - encode, - decode, - httptransport.ClientBefore(httptransport.SetRequestHeader(headerKey, headerVal)), - httptransport.ClientAfter(afterFunc), - ) - - res, err := client.Endpoint()(context.Background(), struct{}{}) - if err != nil { - t.Fatal(err) - } - - var have string - select { - case have = <-headers: - case <-time.After(time.Millisecond): - t.Fatalf("timeout waiting for %s", headerKey) - } - // Check that Request Header was successfully received - if want := headerVal; want != have { - t.Errorf("want %q, have %q", want, have) - } - - // Check that Response header set from server was received in SetClientAfter - if want, have := afterVal, afterHeaderVal; want != have { - t.Errorf("want %q, have %q", want, have) - } - - // Check that the response was successfully decoded - response, ok := res.(TestResponse) - if !ok { - t.Fatal("response should be TestResponse") - } - if want, have := testbody, response.String; want != have { - t.Errorf("want %q, have %q", want, have) - } - - // Check that response body was closed - b := make([]byte, 1) - _, err = response.Body.Read(b) - if err == nil { - t.Fatal("wanted error, got none") - } - if doNotWant, have := io.EOF, err; doNotWant == have { - t.Errorf("do not want %q, have %q", doNotWant, have) - } -} - -func TestHTTPClientBufferedStream(t *testing.T) { - var ( - testbody = "testbody" - encode = func(context.Context, *http.Request, interface{}) error { return nil } - decode = func(_ context.Context, r *http.Response) (interface{}, error) { - return TestResponse{r.Body, ""}, nil - } - ) - - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusOK) - w.Write([]byte(testbody)) - })) - - client := httptransport.NewClient( - "GET", - mustParse(server.URL), - encode, - decode, - httptransport.BufferedStream(true), - ) - - res, err := client.Endpoint()(context.Background(), struct{}{}) - if err != nil { - t.Fatal(err) - } - - // Check that the response was successfully decoded - response, ok := res.(TestResponse) - if !ok { - t.Fatal("response should be TestResponse") - } - - // Check that response body was NOT closed - b := make([]byte, len(testbody)) - _, err = response.Body.Read(b) - if want, have := io.EOF, err; have != want { - t.Fatalf("want %q, have %q", want, have) - } - if want, have := testbody, string(b); want != have { - t.Errorf("want %q, have %q", want, have) - } -} - -func TestClientFinalizer(t *testing.T) { - var ( - headerKey = "X-Henlo-Lizer" - headerVal = "Helllo you stinky lizard" - responseBody = "go eat a fly ugly\n" - done = make(chan struct{}) - encode = func(context.Context, *http.Request, interface{}) error { return nil } - decode = func(_ context.Context, r *http.Response) (interface{}, error) { - return TestResponse{r.Body, ""}, nil - } - ) - - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set(headerKey, headerVal) - w.Write([]byte(responseBody)) - })) - defer server.Close() - - client := httptransport.NewClient( - "GET", - mustParse(server.URL), - encode, - decode, - httptransport.ClientFinalizer(func(ctx context.Context, err error) { - responseHeader := ctx.Value(httptransport.ContextKeyResponseHeaders).(http.Header) - if want, have := headerVal, responseHeader.Get(headerKey); want != have { - t.Errorf("%s: want %q, have %q", headerKey, want, have) - } - - responseSize := ctx.Value(httptransport.ContextKeyResponseSize).(int64) - if want, have := int64(len(responseBody)), responseSize; want != have { - t.Errorf("response size: want %d, have %d", want, have) - } - - close(done) - }), - ) - - _, err := client.Endpoint()(context.Background(), struct{}{}) - if err != nil { - t.Fatal(err) - } - - select { - case <-done: - case <-time.After(time.Second): - t.Fatal("timeout waiting for finalizer") - } -} - -func TestEncodeJSONRequest(t *testing.T) { - var header http.Header - var body string - - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - b, err := ioutil.ReadAll(r.Body) - if err != nil && err != io.EOF { - t.Fatal(err) - } - header = r.Header - body = string(b) - })) - - defer server.Close() - - serverURL, err := url.Parse(server.URL) - - if err != nil { - t.Fatal(err) - } - - client := httptransport.NewClient( - "POST", - serverURL, - httptransport.EncodeJSONRequest, - func(context.Context, *http.Response) (interface{}, error) { return nil, nil }, - ).Endpoint() - - for _, test := range []struct { - value interface{} - body string - }{ - {nil, "null\n"}, - {12, "12\n"}, - {1.2, "1.2\n"}, - {true, "true\n"}, - {"test", "\"test\"\n"}, - {enhancedRequest{Foo: "foo"}, "{\"foo\":\"foo\"}\n"}, - } { - if _, err := client(context.Background(), test.value); err != nil { - t.Error(err) - continue - } - - if body != test.body { - t.Errorf("%v: actual %#v, expected %#v", test.value, body, test.body) - } - } - - if _, err := client(context.Background(), enhancedRequest{Foo: "foo"}); err != nil { - t.Fatal(err) - } - - if _, ok := header["X-Edward"]; !ok { - t.Fatalf("X-Edward value: actual %v, expected %v", nil, []string{"Snowden"}) - } - - if v := header.Get("X-Edward"); v != "Snowden" { - t.Errorf("X-Edward string: actual %v, expected %v", v, "Snowden") - } -} - -func mustParse(s string) *url.URL { - u, err := url.Parse(s) - if err != nil { - panic(err) - } - return u -} - -type enhancedRequest struct { - Foo string `json:"foo"` -} - -func (e enhancedRequest) Headers() http.Header { return http.Header{"X-Edward": []string{"Snowden"}} } diff --git a/vendor/github.com/go-kit/kit/transport/http/doc.go b/vendor/github.com/go-kit/kit/transport/http/doc.go deleted file mode 100644 index e6401035..00000000 --- a/vendor/github.com/go-kit/kit/transport/http/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package http provides a general purpose HTTP binding for endpoints. -package http diff --git a/vendor/github.com/go-kit/kit/transport/http/encode_decode.go b/vendor/github.com/go-kit/kit/transport/http/encode_decode.go deleted file mode 100644 index 3076e4d2..00000000 --- a/vendor/github.com/go-kit/kit/transport/http/encode_decode.go +++ /dev/null @@ -1,30 +0,0 @@ -package http - -import ( - "context" - "net/http" -) - -// DecodeRequestFunc extracts a user-domain request object from an HTTP -// request object. It's designed to be used in HTTP servers, for server-side -// endpoints. One straightforward DecodeRequestFunc could be something that -// JSON decodes from the request body to the concrete response type. -type DecodeRequestFunc func(context.Context, *http.Request) (request interface{}, err error) - -// EncodeRequestFunc encodes the passed request object into the HTTP request -// object. It's designed to be used in HTTP clients, for client-side -// endpoints. One straightforward EncodeRequestFunc could something that JSON -// encodes the object directly to the request body. -type EncodeRequestFunc func(context.Context, *http.Request, interface{}) error - -// EncodeResponseFunc encodes the passed response object to the HTTP response -// writer. It's designed to be used in HTTP servers, for server-side -// endpoints. One straightforward EncodeResponseFunc could be something that -// JSON encodes the object directly to the response body. -type EncodeResponseFunc func(context.Context, http.ResponseWriter, interface{}) error - -// DecodeResponseFunc extracts a user-domain response object from an HTTP -// response object. It's designed to be used in HTTP clients, for client-side -// endpoints. One straightforward DecodeResponseFunc could be something that -// JSON decodes from the response body to the concrete response type. -type DecodeResponseFunc func(context.Context, *http.Response) (response interface{}, err error) diff --git a/vendor/github.com/go-kit/kit/transport/http/example_test.go b/vendor/github.com/go-kit/kit/transport/http/example_test.go deleted file mode 100644 index 3889354a..00000000 --- a/vendor/github.com/go-kit/kit/transport/http/example_test.go +++ /dev/null @@ -1,36 +0,0 @@ -package http - -import ( - "context" - "fmt" - "net/http" - "net/http/httptest" -) - -func ExamplePopulateRequestContext() { - handler := NewServer( - func(ctx context.Context, request interface{}) (response interface{}, err error) { - fmt.Println("Method", ctx.Value(ContextKeyRequestMethod).(string)) - fmt.Println("RequestPath", ctx.Value(ContextKeyRequestPath).(string)) - fmt.Println("RequestURI", ctx.Value(ContextKeyRequestURI).(string)) - fmt.Println("X-Request-ID", ctx.Value(ContextKeyRequestXRequestID).(string)) - return struct{}{}, nil - }, - func(context.Context, *http.Request) (interface{}, error) { return struct{}{}, nil }, - func(context.Context, http.ResponseWriter, interface{}) error { return nil }, - ServerBefore(PopulateRequestContext), - ) - - server := httptest.NewServer(handler) - defer server.Close() - - req, _ := http.NewRequest("PATCH", fmt.Sprintf("%s/search?q=sympatico", server.URL), nil) - req.Header.Set("X-Request-Id", "a1b2c3d4e5") - http.DefaultClient.Do(req) - - // Output: - // Method PATCH - // RequestPath /search - // RequestURI /search?q=sympatico - // X-Request-ID a1b2c3d4e5 -} diff --git a/vendor/github.com/go-kit/kit/transport/http/request_response_funcs.go b/vendor/github.com/go-kit/kit/transport/http/request_response_funcs.go deleted file mode 100644 index 8f92b3bc..00000000 --- a/vendor/github.com/go-kit/kit/transport/http/request_response_funcs.go +++ /dev/null @@ -1,133 +0,0 @@ -package http - -import ( - "context" - "net/http" -) - -// RequestFunc may take information from an HTTP request and put it into a -// request context. In Servers, RequestFuncs are executed prior to invoking the -// endpoint. In Clients, RequestFuncs are executed after creating the request -// but prior to invoking the HTTP client. -type RequestFunc func(context.Context, *http.Request) context.Context - -// ServerResponseFunc may take information from a request context and use it to -// manipulate a ResponseWriter. ServerResponseFuncs are only executed in -// servers, after invoking the endpoint but prior to writing a response. -type ServerResponseFunc func(context.Context, http.ResponseWriter) context.Context - -// ClientResponseFunc may take information from an HTTP request and make the -// response available for consumption. ClientResponseFuncs are only executed in -// clients, after a request has been made, but prior to it being decoded. -type ClientResponseFunc func(context.Context, *http.Response) context.Context - -// SetContentType returns a ServerResponseFunc that sets the Content-Type header -// to the provided value. -func SetContentType(contentType string) ServerResponseFunc { - return SetResponseHeader("Content-Type", contentType) -} - -// SetResponseHeader returns a ServerResponseFunc that sets the given header. -func SetResponseHeader(key, val string) ServerResponseFunc { - return func(ctx context.Context, w http.ResponseWriter) context.Context { - w.Header().Set(key, val) - return ctx - } -} - -// SetRequestHeader returns a RequestFunc that sets the given header. -func SetRequestHeader(key, val string) RequestFunc { - return func(ctx context.Context, r *http.Request) context.Context { - r.Header.Set(key, val) - return ctx - } -} - -// PopulateRequestContext is a RequestFunc that populates several values into -// the context from the HTTP request. Those values may be extracted using the -// corresponding ContextKey type in this package. -func PopulateRequestContext(ctx context.Context, r *http.Request) context.Context { - for k, v := range map[contextKey]string{ - ContextKeyRequestMethod: r.Method, - ContextKeyRequestURI: r.RequestURI, - ContextKeyRequestPath: r.URL.Path, - ContextKeyRequestProto: r.Proto, - ContextKeyRequestHost: r.Host, - ContextKeyRequestRemoteAddr: r.RemoteAddr, - ContextKeyRequestXForwardedFor: r.Header.Get("X-Forwarded-For"), - ContextKeyRequestXForwardedProto: r.Header.Get("X-Forwarded-Proto"), - ContextKeyRequestAuthorization: r.Header.Get("Authorization"), - ContextKeyRequestReferer: r.Header.Get("Referer"), - ContextKeyRequestUserAgent: r.Header.Get("User-Agent"), - ContextKeyRequestXRequestID: r.Header.Get("X-Request-Id"), - ContextKeyRequestAccept: r.Header.Get("Accept"), - } { - ctx = context.WithValue(ctx, k, v) - } - return ctx -} - -type contextKey int - -const ( - // ContextKeyRequestMethod is populated in the context by - // PopulateRequestContext. Its value is r.Method. - ContextKeyRequestMethod contextKey = iota - - // ContextKeyRequestURI is populated in the context by - // PopulateRequestContext. Its value is r.RequestURI. - ContextKeyRequestURI - - // ContextKeyRequestPath is populated in the context by - // PopulateRequestContext. Its value is r.URL.Path. - ContextKeyRequestPath - - // ContextKeyRequestProto is populated in the context by - // PopulateRequestContext. Its value is r.Proto. - ContextKeyRequestProto - - // ContextKeyRequestHost is populated in the context by - // PopulateRequestContext. Its value is r.Host. - ContextKeyRequestHost - - // ContextKeyRequestRemoteAddr is populated in the context by - // PopulateRequestContext. Its value is r.RemoteAddr. - ContextKeyRequestRemoteAddr - - // ContextKeyRequestXForwardedFor is populated in the context by - // PopulateRequestContext. Its value is r.Header.Get("X-Forwarded-For"). - ContextKeyRequestXForwardedFor - - // ContextKeyRequestXForwardedProto is populated in the context by - // PopulateRequestContext. Its value is r.Header.Get("X-Forwarded-Proto"). - ContextKeyRequestXForwardedProto - - // ContextKeyRequestAuthorization is populated in the context by - // PopulateRequestContext. Its value is r.Header.Get("Authorization"). - ContextKeyRequestAuthorization - - // ContextKeyRequestReferer is populated in the context by - // PopulateRequestContext. Its value is r.Header.Get("Referer"). - ContextKeyRequestReferer - - // ContextKeyRequestUserAgent is populated in the context by - // PopulateRequestContext. Its value is r.Header.Get("User-Agent"). - ContextKeyRequestUserAgent - - // ContextKeyRequestXRequestID is populated in the context by - // PopulateRequestContext. Its value is r.Header.Get("X-Request-Id"). - ContextKeyRequestXRequestID - - // ContextKeyRequestAccept is populated in the context by - // PopulateRequestContext. Its value is r.Header.Get("Accept"). - ContextKeyRequestAccept - - // ContextKeyResponseHeaders is populated in the context whenever a - // ServerFinalizerFunc is specified. Its value is of type http.Header, and - // is captured only once the entire response has been written. - ContextKeyResponseHeaders - - // ContextKeyResponseSize is populated in the context whenever a - // ServerFinalizerFunc is specified. Its value is of type int64. - ContextKeyResponseSize -) diff --git a/vendor/github.com/go-kit/kit/transport/http/request_response_funcs_test.go b/vendor/github.com/go-kit/kit/transport/http/request_response_funcs_test.go deleted file mode 100644 index e003fc94..00000000 --- a/vendor/github.com/go-kit/kit/transport/http/request_response_funcs_test.go +++ /dev/null @@ -1,30 +0,0 @@ -package http_test - -import ( - "context" - "net/http/httptest" - "testing" - - httptransport "github.com/go-kit/kit/transport/http" -) - -func TestSetHeader(t *testing.T) { - const ( - key = "X-Foo" - val = "12345" - ) - r := httptest.NewRecorder() - httptransport.SetResponseHeader(key, val)(context.Background(), r) - if want, have := val, r.Header().Get(key); want != have { - t.Errorf("want %q, have %q", want, have) - } -} - -func TestSetContentType(t *testing.T) { - const contentType = "application/json" - r := httptest.NewRecorder() - httptransport.SetContentType(contentType)(context.Background(), r) - if want, have := contentType, r.Header().Get("Content-Type"); want != have { - t.Errorf("want %q, have %q", want, have) - } -} diff --git a/vendor/github.com/go-kit/kit/transport/http/server.go b/vendor/github.com/go-kit/kit/transport/http/server.go deleted file mode 100644 index 311f76c8..00000000 --- a/vendor/github.com/go-kit/kit/transport/http/server.go +++ /dev/null @@ -1,221 +0,0 @@ -package http - -import ( - "context" - "encoding/json" - "net/http" - - "github.com/go-kit/kit/endpoint" - "github.com/go-kit/kit/log" -) - -// Server wraps an endpoint and implements http.Handler. -type Server struct { - e endpoint.Endpoint - dec DecodeRequestFunc - enc EncodeResponseFunc - before []RequestFunc - after []ServerResponseFunc - errorEncoder ErrorEncoder - finalizer ServerFinalizerFunc - logger log.Logger -} - -// NewServer constructs a new server, which implements http.Handler and wraps -// the provided endpoint. -func NewServer( - e endpoint.Endpoint, - dec DecodeRequestFunc, - enc EncodeResponseFunc, - options ...ServerOption, -) *Server { - s := &Server{ - e: e, - dec: dec, - enc: enc, - errorEncoder: DefaultErrorEncoder, - logger: log.NewNopLogger(), - } - for _, option := range options { - option(s) - } - return s -} - -// ServerOption sets an optional parameter for servers. -type ServerOption func(*Server) - -// ServerBefore functions are executed on the HTTP request object before the -// request is decoded. -func ServerBefore(before ...RequestFunc) ServerOption { - return func(s *Server) { s.before = append(s.before, before...) } -} - -// ServerAfter functions are executed on the HTTP response writer after the -// endpoint is invoked, but before anything is written to the client. -func ServerAfter(after ...ServerResponseFunc) ServerOption { - return func(s *Server) { s.after = append(s.after, after...) } -} - -// ServerErrorEncoder is used to encode errors to the http.ResponseWriter -// whenever they're encountered in the processing of a request. Clients can -// use this to provide custom error formatting and response codes. By default, -// errors will be written with the DefaultErrorEncoder. -func ServerErrorEncoder(ee ErrorEncoder) ServerOption { - return func(s *Server) { s.errorEncoder = ee } -} - -// ServerErrorLogger is used to log non-terminal errors. By default, no errors -// are logged. This is intended as a diagnostic measure. Finer-grained control -// of error handling, including logging in more detail, should be performed in a -// custom ServerErrorEncoder or ServerFinalizer, both of which have access to -// the context. -func ServerErrorLogger(logger log.Logger) ServerOption { - return func(s *Server) { s.logger = logger } -} - -// ServerFinalizer is executed at the end of every HTTP request. -// By default, no finalizer is registered. -func ServerFinalizer(f ServerFinalizerFunc) ServerOption { - return func(s *Server) { s.finalizer = f } -} - -// ServeHTTP implements http.Handler. -func (s Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - if s.finalizer != nil { - iw := &interceptingWriter{w, http.StatusOK, 0} - defer func() { - ctx = context.WithValue(ctx, ContextKeyResponseHeaders, iw.Header()) - ctx = context.WithValue(ctx, ContextKeyResponseSize, iw.written) - s.finalizer(ctx, iw.code, r) - }() - w = iw - } - - for _, f := range s.before { - ctx = f(ctx, r) - } - - request, err := s.dec(ctx, r) - if err != nil { - s.logger.Log("err", err) - s.errorEncoder(ctx, err, w) - return - } - - response, err := s.e(ctx, request) - if err != nil { - s.logger.Log("err", err) - s.errorEncoder(ctx, err, w) - return - } - - for _, f := range s.after { - ctx = f(ctx, w) - } - - if err := s.enc(ctx, w, response); err != nil { - s.logger.Log("err", err) - s.errorEncoder(ctx, err, w) - return - } -} - -// ErrorEncoder is responsible for encoding an error to the ResponseWriter. -// Users are encouraged to use custom ErrorEncoders to encode HTTP errors to -// their clients, and will likely want to pass and check for their own error -// types. See the example shipping/handling service. -type ErrorEncoder func(ctx context.Context, err error, w http.ResponseWriter) - -// ServerFinalizerFunc can be used to perform work at the end of an HTTP -// request, after the response has been written to the client. The principal -// intended use is for request logging. In addition to the response code -// provided in the function signature, additional response parameters are -// provided in the context under keys with the ContextKeyResponse prefix. -type ServerFinalizerFunc func(ctx context.Context, code int, r *http.Request) - -// EncodeJSONResponse is a EncodeResponseFunc that serializes the response as a -// JSON object to the ResponseWriter. Many JSON-over-HTTP services can use it as -// a sensible default. If the response implements Headerer, the provided headers -// will be applied to the response. If the response implements StatusCoder, the -// provided StatusCode will be used instead of 200. -func EncodeJSONResponse(_ context.Context, w http.ResponseWriter, response interface{}) error { - w.Header().Set("Content-Type", "application/json; charset=utf-8") - if headerer, ok := response.(Headerer); ok { - for k := range headerer.Headers() { - w.Header().Set(k, headerer.Headers().Get(k)) - } - } - code := http.StatusOK - if sc, ok := response.(StatusCoder); ok { - code = sc.StatusCode() - } - w.WriteHeader(code) - if code == http.StatusNoContent { - return nil - } - return json.NewEncoder(w).Encode(response) -} - -// DefaultErrorEncoder writes the error to the ResponseWriter, by default a -// content type of text/plain, a body of the plain text of the error, and a -// status code of 500. If the error implements Headerer, the provided headers -// will be applied to the response. If the error implements json.Marshaler, and -// the marshaling succeeds, a content type of application/json and the JSON -// encoded form of the error will be used. If the error implements StatusCoder, -// the provided StatusCode will be used instead of 500. -func DefaultErrorEncoder(_ context.Context, err error, w http.ResponseWriter) { - contentType, body := "text/plain; charset=utf-8", []byte(err.Error()) - if marshaler, ok := err.(json.Marshaler); ok { - if jsonBody, marshalErr := marshaler.MarshalJSON(); marshalErr == nil { - contentType, body = "application/json; charset=utf-8", jsonBody - } - } - w.Header().Set("Content-Type", contentType) - if headerer, ok := err.(Headerer); ok { - for k := range headerer.Headers() { - w.Header().Set(k, headerer.Headers().Get(k)) - } - } - code := http.StatusInternalServerError - if sc, ok := err.(StatusCoder); ok { - code = sc.StatusCode() - } - w.WriteHeader(code) - w.Write(body) -} - -// StatusCoder is checked by DefaultErrorEncoder. If an error value implements -// StatusCoder, the StatusCode will be used when encoding the error. By default, -// StatusInternalServerError (500) is used. -type StatusCoder interface { - StatusCode() int -} - -// Headerer is checked by DefaultErrorEncoder. If an error value implements -// Headerer, the provided headers will be applied to the response writer, after -// the Content-Type is set. -type Headerer interface { - Headers() http.Header -} - -type interceptingWriter struct { - http.ResponseWriter - code int - written int64 -} - -// WriteHeader may not be explicitly called, so care must be taken to -// initialize w.code to its default value of http.StatusOK. -func (w *interceptingWriter) WriteHeader(code int) { - w.code = code - w.ResponseWriter.WriteHeader(code) -} - -func (w *interceptingWriter) Write(p []byte) (int, error) { - n, err := w.ResponseWriter.Write(p) - w.written += int64(n) - return n, err -} diff --git a/vendor/github.com/go-kit/kit/transport/http/server_test.go b/vendor/github.com/go-kit/kit/transport/http/server_test.go deleted file mode 100644 index ddc40c97..00000000 --- a/vendor/github.com/go-kit/kit/transport/http/server_test.go +++ /dev/null @@ -1,349 +0,0 @@ -package http_test - -import ( - "context" - "errors" - "io/ioutil" - "net/http" - "net/http/httptest" - "strings" - "testing" - "time" - - "github.com/go-kit/kit/endpoint" - httptransport "github.com/go-kit/kit/transport/http" -) - -func TestServerBadDecode(t *testing.T) { - handler := httptransport.NewServer( - func(context.Context, interface{}) (interface{}, error) { return struct{}{}, nil }, - func(context.Context, *http.Request) (interface{}, error) { return struct{}{}, errors.New("dang") }, - func(context.Context, http.ResponseWriter, interface{}) error { return nil }, - ) - server := httptest.NewServer(handler) - defer server.Close() - resp, _ := http.Get(server.URL) - if want, have := http.StatusInternalServerError, resp.StatusCode; want != have { - t.Errorf("want %d, have %d", want, have) - } -} - -func TestServerBadEndpoint(t *testing.T) { - handler := httptransport.NewServer( - func(context.Context, interface{}) (interface{}, error) { return struct{}{}, errors.New("dang") }, - func(context.Context, *http.Request) (interface{}, error) { return struct{}{}, nil }, - func(context.Context, http.ResponseWriter, interface{}) error { return nil }, - ) - server := httptest.NewServer(handler) - defer server.Close() - resp, _ := http.Get(server.URL) - if want, have := http.StatusInternalServerError, resp.StatusCode; want != have { - t.Errorf("want %d, have %d", want, have) - } -} - -func TestServerBadEncode(t *testing.T) { - handler := httptransport.NewServer( - func(context.Context, interface{}) (interface{}, error) { return struct{}{}, nil }, - func(context.Context, *http.Request) (interface{}, error) { return struct{}{}, nil }, - func(context.Context, http.ResponseWriter, interface{}) error { return errors.New("dang") }, - ) - server := httptest.NewServer(handler) - defer server.Close() - resp, _ := http.Get(server.URL) - if want, have := http.StatusInternalServerError, resp.StatusCode; want != have { - t.Errorf("want %d, have %d", want, have) - } -} - -func TestServerErrorEncoder(t *testing.T) { - errTeapot := errors.New("teapot") - code := func(err error) int { - if err == errTeapot { - return http.StatusTeapot - } - return http.StatusInternalServerError - } - handler := httptransport.NewServer( - func(context.Context, interface{}) (interface{}, error) { return struct{}{}, errTeapot }, - func(context.Context, *http.Request) (interface{}, error) { return struct{}{}, nil }, - func(context.Context, http.ResponseWriter, interface{}) error { return nil }, - httptransport.ServerErrorEncoder(func(_ context.Context, err error, w http.ResponseWriter) { w.WriteHeader(code(err)) }), - ) - server := httptest.NewServer(handler) - defer server.Close() - resp, _ := http.Get(server.URL) - if want, have := http.StatusTeapot, resp.StatusCode; want != have { - t.Errorf("want %d, have %d", want, have) - } -} - -func TestServerHappyPath(t *testing.T) { - step, response := testServer(t) - step() - resp := <-response - defer resp.Body.Close() - buf, _ := ioutil.ReadAll(resp.Body) - if want, have := http.StatusOK, resp.StatusCode; want != have { - t.Errorf("want %d, have %d (%s)", want, have, buf) - } -} - -func TestMultipleServerBefore(t *testing.T) { - var ( - headerKey = "X-Henlo-Lizer" - headerVal = "Helllo you stinky lizard" - statusCode = http.StatusTeapot - responseBody = "go eat a fly ugly\n" - done = make(chan struct{}) - ) - handler := httptransport.NewServer( - endpoint.Nop, - func(context.Context, *http.Request) (interface{}, error) { - return struct{}{}, nil - }, - func(_ context.Context, w http.ResponseWriter, _ interface{}) error { - w.Header().Set(headerKey, headerVal) - w.WriteHeader(statusCode) - w.Write([]byte(responseBody)) - return nil - }, - httptransport.ServerBefore(func(ctx context.Context, r *http.Request) context.Context { - ctx = context.WithValue(ctx, "one", 1) - - return ctx - }), - httptransport.ServerBefore(func(ctx context.Context, r *http.Request) context.Context { - if _, ok := ctx.Value("one").(int); !ok { - t.Error("Value was not set properly when multiple ServerBefores are used") - } - - close(done) - return ctx - }), - ) - - server := httptest.NewServer(handler) - defer server.Close() - go http.Get(server.URL) - - select { - case <-done: - case <-time.After(time.Second): - t.Fatal("timeout waiting for finalizer") - } -} - -func TestMultipleServerAfter(t *testing.T) { - var ( - headerKey = "X-Henlo-Lizer" - headerVal = "Helllo you stinky lizard" - statusCode = http.StatusTeapot - responseBody = "go eat a fly ugly\n" - done = make(chan struct{}) - ) - handler := httptransport.NewServer( - endpoint.Nop, - func(context.Context, *http.Request) (interface{}, error) { - return struct{}{}, nil - }, - func(_ context.Context, w http.ResponseWriter, _ interface{}) error { - w.Header().Set(headerKey, headerVal) - w.WriteHeader(statusCode) - w.Write([]byte(responseBody)) - return nil - }, - httptransport.ServerAfter(func(ctx context.Context, w http.ResponseWriter) context.Context { - ctx = context.WithValue(ctx, "one", 1) - - return ctx - }), - httptransport.ServerAfter(func(ctx context.Context, w http.ResponseWriter) context.Context { - if _, ok := ctx.Value("one").(int); !ok { - t.Error("Value was not set properly when multiple ServerAfters are used") - } - - close(done) - return ctx - }), - ) - - server := httptest.NewServer(handler) - defer server.Close() - go http.Get(server.URL) - - select { - case <-done: - case <-time.After(time.Second): - t.Fatal("timeout waiting for finalizer") - } -} - -func TestServerFinalizer(t *testing.T) { - var ( - headerKey = "X-Henlo-Lizer" - headerVal = "Helllo you stinky lizard" - statusCode = http.StatusTeapot - responseBody = "go eat a fly ugly\n" - done = make(chan struct{}) - ) - handler := httptransport.NewServer( - endpoint.Nop, - func(context.Context, *http.Request) (interface{}, error) { - return struct{}{}, nil - }, - func(_ context.Context, w http.ResponseWriter, _ interface{}) error { - w.Header().Set(headerKey, headerVal) - w.WriteHeader(statusCode) - w.Write([]byte(responseBody)) - return nil - }, - httptransport.ServerFinalizer(func(ctx context.Context, code int, _ *http.Request) { - if want, have := statusCode, code; want != have { - t.Errorf("StatusCode: want %d, have %d", want, have) - } - - responseHeader := ctx.Value(httptransport.ContextKeyResponseHeaders).(http.Header) - if want, have := headerVal, responseHeader.Get(headerKey); want != have { - t.Errorf("%s: want %q, have %q", headerKey, want, have) - } - - responseSize := ctx.Value(httptransport.ContextKeyResponseSize).(int64) - if want, have := int64(len(responseBody)), responseSize; want != have { - t.Errorf("response size: want %d, have %d", want, have) - } - - close(done) - }), - ) - - server := httptest.NewServer(handler) - defer server.Close() - go http.Get(server.URL) - - select { - case <-done: - case <-time.After(time.Second): - t.Fatal("timeout waiting for finalizer") - } -} - -type enhancedResponse struct { - Foo string `json:"foo"` -} - -func (e enhancedResponse) StatusCode() int { return http.StatusPaymentRequired } -func (e enhancedResponse) Headers() http.Header { return http.Header{"X-Edward": []string{"Snowden"}} } - -func TestEncodeJSONResponse(t *testing.T) { - handler := httptransport.NewServer( - func(context.Context, interface{}) (interface{}, error) { return enhancedResponse{Foo: "bar"}, nil }, - func(context.Context, *http.Request) (interface{}, error) { return struct{}{}, nil }, - httptransport.EncodeJSONResponse, - ) - - server := httptest.NewServer(handler) - defer server.Close() - - resp, err := http.Get(server.URL) - if err != nil { - t.Fatal(err) - } - if want, have := http.StatusPaymentRequired, resp.StatusCode; want != have { - t.Errorf("StatusCode: want %d, have %d", want, have) - } - if want, have := "Snowden", resp.Header.Get("X-Edward"); want != have { - t.Errorf("X-Edward: want %q, have %q", want, have) - } - buf, _ := ioutil.ReadAll(resp.Body) - if want, have := `{"foo":"bar"}`, strings.TrimSpace(string(buf)); want != have { - t.Errorf("Body: want %s, have %s", want, have) - } -} - -type noContentResponse struct{} - -func (e noContentResponse) StatusCode() int { return http.StatusNoContent } - -func TestEncodeNoContent(t *testing.T) { - handler := httptransport.NewServer( - func(context.Context, interface{}) (interface{}, error) { return noContentResponse{}, nil }, - func(context.Context, *http.Request) (interface{}, error) { return struct{}{}, nil }, - httptransport.EncodeJSONResponse, - ) - - server := httptest.NewServer(handler) - defer server.Close() - - resp, err := http.Get(server.URL) - if err != nil { - t.Fatal(err) - } - if want, have := http.StatusNoContent, resp.StatusCode; want != have { - t.Errorf("StatusCode: want %d, have %d", want, have) - } - buf, _ := ioutil.ReadAll(resp.Body) - if want, have := 0, len(buf); want != have { - t.Errorf("Body: want no content, have %d bytes", have) - } -} - -type enhancedError struct{} - -func (e enhancedError) Error() string { return "enhanced error" } -func (e enhancedError) StatusCode() int { return http.StatusTeapot } -func (e enhancedError) MarshalJSON() ([]byte, error) { return []byte(`{"err":"enhanced"}`), nil } -func (e enhancedError) Headers() http.Header { return http.Header{"X-Enhanced": []string{"1"}} } - -func TestEnhancedError(t *testing.T) { - handler := httptransport.NewServer( - func(context.Context, interface{}) (interface{}, error) { return nil, enhancedError{} }, - func(context.Context, *http.Request) (interface{}, error) { return struct{}{}, nil }, - func(_ context.Context, w http.ResponseWriter, _ interface{}) error { return nil }, - ) - - server := httptest.NewServer(handler) - defer server.Close() - - resp, err := http.Get(server.URL) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if want, have := http.StatusTeapot, resp.StatusCode; want != have { - t.Errorf("StatusCode: want %d, have %d", want, have) - } - if want, have := "1", resp.Header.Get("X-Enhanced"); want != have { - t.Errorf("X-Enhanced: want %q, have %q", want, have) - } - buf, _ := ioutil.ReadAll(resp.Body) - if want, have := `{"err":"enhanced"}`, strings.TrimSpace(string(buf)); want != have { - t.Errorf("Body: want %s, have %s", want, have) - } -} - -func testServer(t *testing.T) (step func(), resp <-chan *http.Response) { - var ( - stepch = make(chan bool) - endpoint = func(context.Context, interface{}) (interface{}, error) { <-stepch; return struct{}{}, nil } - response = make(chan *http.Response) - handler = httptransport.NewServer( - endpoint, - func(context.Context, *http.Request) (interface{}, error) { return struct{}{}, nil }, - func(context.Context, http.ResponseWriter, interface{}) error { return nil }, - httptransport.ServerBefore(func(ctx context.Context, r *http.Request) context.Context { return ctx }), - httptransport.ServerAfter(func(ctx context.Context, w http.ResponseWriter) context.Context { return ctx }), - ) - ) - go func() { - server := httptest.NewServer(handler) - defer server.Close() - resp, err := http.Get(server.URL) - if err != nil { - t.Error(err) - return - } - response <- resp - }() - return func() { stepch <- true }, response -} diff --git a/vendor/github.com/go-kit/kit/transport/httprp/doc.go b/vendor/github.com/go-kit/kit/transport/httprp/doc.go deleted file mode 100644 index 7ff3321d..00000000 --- a/vendor/github.com/go-kit/kit/transport/httprp/doc.go +++ /dev/null @@ -1,4 +0,0 @@ -// Package httprp provides an HTTP reverse-proxy transport. HTTP handlers that -// need to proxy requests to another HTTP service can do so with this package by -// specifying the URL to forward the request to. -package httprp diff --git a/vendor/github.com/go-kit/kit/transport/httprp/server.go b/vendor/github.com/go-kit/kit/transport/httprp/server.go deleted file mode 100644 index b0a1ee3c..00000000 --- a/vendor/github.com/go-kit/kit/transport/httprp/server.go +++ /dev/null @@ -1,57 +0,0 @@ -package httprp - -import ( - "context" - "net/http" - "net/http/httputil" - "net/url" -) - -// RequestFunc may take information from an HTTP request and put it into a -// request context. BeforeFuncs are executed prior to invoking the -// endpoint. -type RequestFunc func(context.Context, *http.Request) context.Context - -// Server is a proxying request handler. -type Server struct { - proxy http.Handler - before []RequestFunc - errorEncoder func(w http.ResponseWriter, err error) -} - -// NewServer constructs a new server that implements http.Server and will proxy -// requests to the given base URL using its scheme, host, and base path. -// If the target's path is "/base" and the incoming request was for "/dir", -// the target request will be for /base/dir. -func NewServer( - baseURL *url.URL, - options ...ServerOption, -) *Server { - s := &Server{ - proxy: httputil.NewSingleHostReverseProxy(baseURL), - } - for _, option := range options { - option(s) - } - return s -} - -// ServerOption sets an optional parameter for servers. -type ServerOption func(*Server) - -// ServerBefore functions are executed on the HTTP request object before the -// request is decoded. -func ServerBefore(before ...RequestFunc) ServerOption { - return func(s *Server) { s.before = append(s.before, before...) } -} - -// ServeHTTP implements http.Handler. -func (s Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - for _, f := range s.before { - ctx = f(ctx, r) - } - - s.proxy.ServeHTTP(w, r) -} diff --git a/vendor/github.com/go-kit/kit/transport/httprp/server_test.go b/vendor/github.com/go-kit/kit/transport/httprp/server_test.go deleted file mode 100644 index fc535760..00000000 --- a/vendor/github.com/go-kit/kit/transport/httprp/server_test.go +++ /dev/null @@ -1,158 +0,0 @@ -package httprp_test - -import ( - "context" - "io/ioutil" - "net/http" - "net/http/httptest" - "net/url" - "testing" - - httptransport "github.com/go-kit/kit/transport/httprp" -) - -func TestServerHappyPathSingleServer(t *testing.T) { - originServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusOK) - w.Write([]byte("hey")) - })) - defer originServer.Close() - originURL, _ := url.Parse(originServer.URL) - - handler := httptransport.NewServer( - originURL, - ) - proxyServer := httptest.NewServer(handler) - defer proxyServer.Close() - - resp, _ := http.Get(proxyServer.URL) - if want, have := http.StatusOK, resp.StatusCode; want != have { - t.Errorf("want %d, have %d", want, have) - } - - responseBody, _ := ioutil.ReadAll(resp.Body) - if want, have := "hey", string(responseBody); want != have { - t.Errorf("want %q, have %q", want, have) - } -} - -func TestServerHappyPathSingleServerWithServerOptions(t *testing.T) { - const ( - headerKey = "X-TEST-HEADER" - headerVal = "go-kit-proxy" - ) - - originServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if want, have := headerVal, r.Header.Get(headerKey); want != have { - t.Errorf("want %q, have %q", want, have) - } - - w.WriteHeader(http.StatusOK) - w.Write([]byte("hey")) - })) - defer originServer.Close() - originURL, _ := url.Parse(originServer.URL) - - handler := httptransport.NewServer( - originURL, - httptransport.ServerBefore(func(ctx context.Context, r *http.Request) context.Context { - r.Header.Add(headerKey, headerVal) - return ctx - }), - ) - proxyServer := httptest.NewServer(handler) - defer proxyServer.Close() - - resp, _ := http.Get(proxyServer.URL) - if want, have := http.StatusOK, resp.StatusCode; want != have { - t.Errorf("want %d, have %d", want, have) - } - - responseBody, _ := ioutil.ReadAll(resp.Body) - if want, have := "hey", string(responseBody); want != have { - t.Errorf("want %q, have %q", want, have) - } -} - -func TestServerOriginServerNotFoundResponse(t *testing.T) { - originServer := httptest.NewServer(http.NotFoundHandler()) - defer originServer.Close() - originURL, _ := url.Parse(originServer.URL) - - handler := httptransport.NewServer( - originURL, - ) - proxyServer := httptest.NewServer(handler) - defer proxyServer.Close() - - resp, _ := http.Get(proxyServer.URL) - if want, have := http.StatusNotFound, resp.StatusCode; want != have { - t.Errorf("want %d, have %d", want, have) - } -} - -func TestServerOriginServerUnreachable(t *testing.T) { - // create a server, then promptly shut it down - originServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusOK) - })) - originURL, _ := url.Parse(originServer.URL) - originServer.Close() - - handler := httptransport.NewServer( - originURL, - ) - proxyServer := httptest.NewServer(handler) - defer proxyServer.Close() - - resp, _ := http.Get(proxyServer.URL) - switch resp.StatusCode { - case http.StatusBadGateway: // go1.7 and beyond - break - case http.StatusInternalServerError: // to go1.7 - break - default: - t.Errorf("want %d or %d, have %d", http.StatusBadGateway, http.StatusInternalServerError, resp.StatusCode) - } -} - -func TestMultipleServerBefore(t *testing.T) { - const ( - headerKey = "X-TEST-HEADER" - headerVal = "go-kit-proxy" - ) - - originServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if want, have := headerVal, r.Header.Get(headerKey); want != have { - t.Errorf("want %q, have %q", want, have) - } - - w.WriteHeader(http.StatusOK) - w.Write([]byte("hey")) - })) - defer originServer.Close() - originURL, _ := url.Parse(originServer.URL) - - handler := httptransport.NewServer( - originURL, - httptransport.ServerBefore(func(ctx context.Context, r *http.Request) context.Context { - r.Header.Add(headerKey, headerVal) - return ctx - }), - httptransport.ServerBefore(func(ctx context.Context, r *http.Request) context.Context { - return ctx - }), - ) - proxyServer := httptest.NewServer(handler) - defer proxyServer.Close() - - resp, _ := http.Get(proxyServer.URL) - if want, have := http.StatusOK, resp.StatusCode; want != have { - t.Errorf("want %d, have %d", want, have) - } - - responseBody, _ := ioutil.ReadAll(resp.Body) - if want, have := "hey", string(responseBody); want != have { - t.Errorf("want %q, have %q", want, have) - } -} diff --git a/vendor/github.com/go-kit/kit/transport/netrpc/README.md b/vendor/github.com/go-kit/kit/transport/netrpc/README.md deleted file mode 100644 index d8995018..00000000 --- a/vendor/github.com/go-kit/kit/transport/netrpc/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# net/rpc - -[net/rpc](https://golang.org/pkg/net/rpc) is an RPC transport that's part of the Go standard library. -It's a simple and fast transport that's appropriate when all of your services are written in Go. - -Using net/rpc with Go kit is very simple. -Just write a simple binding from your service definition to the net/rpc definition. -See [netrpc_binding.go](https://github.com/go-kit/kit/blob/ec8b02591ee873433565a1ae9d317353412d1d27/examples/addsvc/netrpc_binding.go) for an example. - -That's it! -The net/rpc binding can be registered to a name, and bound to an HTTP handler, the same as any other net/rpc endpoint. -And within your service, you can use standard Go kit components and idioms. -See [addsvc](https://github.com/go-kit/kit/tree/master/examples/addsvc) for a complete working example with net/rpc support. -And remember: Go kit services can support multiple transports simultaneously. diff --git a/vendor/github.com/go-kit/kit/transport/thrift/README.md b/vendor/github.com/go-kit/kit/transport/thrift/README.md deleted file mode 100644 index 04cd5ae4..00000000 --- a/vendor/github.com/go-kit/kit/transport/thrift/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# Thrift - -[Thrift](https://thrift.apache.org/) is a large IDL and transport package from Apache, popularized by Facebook. -Thrift is well-supported in Go kit, for organizations that already have significant Thrift investment. -And using Thrift with Go kit is very simple. - -First, define your service in the Thrift IDL. -The [Thrift IDL documentation](https://thrift.apache.org/docs/idl) provides more details. -See [add.thrift](https://github.com/go-kit/kit/blob/ec8b02591ee873433565a1ae9d317353412d1d27/examples/addsvc/_thrift/add.thrift) for an example. -Make sure the Thrift definition matches your service's Go kit (interface) definition. - -Next, [download Thrift](https://thrift.apache.org/download) and [install the compiler](https://thrift.apache.org/docs/install/). -On a Mac, you may be able to `brew install thrift`. - -Then, compile your service definition, from .thrift to .go. -You'll probably want to specify the package_prefix option to the --gen go flag. -See [THRIFT-3021](https://issues.apache.org/jira/browse/THRIFT-3021) for more details. - -``` -thrift -r --gen go:package_prefix=github.com/my-org/my-repo/thrift/gen-go/ add.thrift -``` - -Finally, write a tiny binding from your service definition to the Thrift definition. -It's a straightforward conversion from one domain to the other. -See [thrift_binding.go](https://github.com/go-kit/kit/blob/ec8b02591ee873433565a1ae9d317353412d1d27/examples/addsvc/thrift_binding.go) for an example. - -That's it! -The Thrift binding can be bound to a listener and serve normal Thrift requests. -And within your service, you can use standard Go kit components and idioms. -Unfortunately, setting up a Thrift listener is rather laborious and nonidiomatic in Go. -Fortunately, [addsvc](https://github.com/go-kit/kit/tree/master/examples/addsvc) is a complete working example with Thrift support. -And remember: Go kit services can support multiple transports simultaneously. diff --git a/vendor/github.com/go-kit/kit/update_deps.bash b/vendor/github.com/go-kit/kit/update_deps.bash deleted file mode 100755 index 576e8b4a..00000000 --- a/vendor/github.com/go-kit/kit/update_deps.bash +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env bash - -# This script updates each non-stdlib, non-Go-kit dependency to its most recent -# commit. It can be invoked to aid in debugging after a dependency-related -# failure on continuous integration. - -function deps { - go list -f '{{join .Deps "\n"}}' ./... -} - -function not_stdlib { - xargs go list -f '{{if not .Standard}}{{.ImportPath}}{{end}}' -} - -function not_gokit { - grep -v 'go-kit/kit' -} - -function go_get_update { - while read d - do - echo $d - go get -u $d || echo "failed, trying again with master" && cd $GOPATH/src/$d && git checkout master && go get -u $d - done -} - -deps | not_stdlib | not_gokit | go_get_update - diff --git a/vendor/github.com/go-kit/kit/util/README.md b/vendor/github.com/go-kit/kit/util/README.md deleted file mode 100644 index 20ed85ca..00000000 --- a/vendor/github.com/go-kit/kit/util/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# util - -This directory holds packages of general utility to multiple consumers within Go kit, - and potentially other consumers in the wider Go ecosystem. -There is no `package util` and will never be. diff --git a/vendor/github.com/go-kit/kit/util/conn/doc.go b/vendor/github.com/go-kit/kit/util/conn/doc.go deleted file mode 100644 index 7ad4d96e..00000000 --- a/vendor/github.com/go-kit/kit/util/conn/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package conn provides utilities related to connections. -package conn diff --git a/vendor/github.com/go-kit/kit/util/conn/manager.go b/vendor/github.com/go-kit/kit/util/conn/manager.go deleted file mode 100644 index 0b7db628..00000000 --- a/vendor/github.com/go-kit/kit/util/conn/manager.go +++ /dev/null @@ -1,145 +0,0 @@ -package conn - -import ( - "errors" - "net" - "time" - - "github.com/go-kit/kit/log" -) - -// Dialer imitates net.Dial. Dialer is assumed to yield connections that are -// safe for use by multiple concurrent goroutines. -type Dialer func(network, address string) (net.Conn, error) - -// AfterFunc imitates time.After. -type AfterFunc func(time.Duration) <-chan time.Time - -// Manager manages a net.Conn. -// -// Clients provide a way to create the connection with a Dialer, network, and -// address. Clients should Take the connection when they want to use it, and Put -// back whatever error they receive from its use. When a non-nil error is Put, -// the connection is invalidated, and a new connection is established. -// Connection failures are retried after an exponential backoff. -type Manager struct { - dialer Dialer - network string - address string - after AfterFunc - logger log.Logger - - takec chan net.Conn - putc chan error -} - -// NewManager returns a connection manager using the passed Dialer, network, and -// address. The AfterFunc is used to control exponential backoff and retries. -// The logger is used to log errors; pass a log.NopLogger if you don't care to -// receive them. For normal use, prefer NewDefaultManager. -func NewManager(d Dialer, network, address string, after AfterFunc, logger log.Logger) *Manager { - m := &Manager{ - dialer: d, - network: network, - address: address, - after: after, - logger: logger, - - takec: make(chan net.Conn), - putc: make(chan error), - } - go m.loop() - return m -} - -// NewDefaultManager is a helper constructor, suitable for most normal use in -// real (non-test) code. It uses the real net.Dial and time.After functions. -func NewDefaultManager(network, address string, logger log.Logger) *Manager { - return NewManager(net.Dial, network, address, time.After, logger) -} - -// Take yields the current connection. It may be nil. -func (m *Manager) Take() net.Conn { - return <-m.takec -} - -// Put accepts an error that came from a previously yielded connection. If the -// error is non-nil, the manager will invalidate the current connection and try -// to reconnect, with exponential backoff. Putting a nil error is a no-op. -func (m *Manager) Put(err error) { - m.putc <- err -} - -// Write writes the passed data to the connection in a single Take/Put cycle. -func (m *Manager) Write(b []byte) (int, error) { - conn := m.Take() - if conn == nil { - return 0, ErrConnectionUnavailable - } - n, err := conn.Write(b) - defer m.Put(err) - return n, err -} - -func (m *Manager) loop() { - var ( - conn = dial(m.dialer, m.network, m.address, m.logger) // may block slightly - connc = make(chan net.Conn, 1) - reconnectc <-chan time.Time // initially nil - backoff = time.Second - ) - - // If the initial dial fails, we need to trigger a reconnect via the loop - // body, below. If we did this in a goroutine, we would race on the conn - // variable. So we use a buffered chan instead. - connc <- conn - - for { - select { - case <-reconnectc: - reconnectc = nil // one-shot - go func() { connc <- dial(m.dialer, m.network, m.address, m.logger) }() - - case conn = <-connc: - if conn == nil { - // didn't work - backoff = exponential(backoff) // wait longer - reconnectc = m.after(backoff) // try again - } else { - // worked! - backoff = time.Second // reset wait time - reconnectc = nil // no retry necessary - } - - case m.takec <- conn: - - case err := <-m.putc: - if err != nil && conn != nil { - m.logger.Log("err", err) - conn = nil // connection is bad - reconnectc = m.after(time.Nanosecond) // trigger immediately - } - } - } -} - -func dial(d Dialer, network, address string, logger log.Logger) net.Conn { - conn, err := d(network, address) - if err != nil { - logger.Log("err", err) - conn = nil // just to be sure - } - return conn -} - -func exponential(d time.Duration) time.Duration { - d *= 2 - if d > time.Minute { - d = time.Minute - } - return d -} - -// ErrConnectionUnavailable is returned by the Manager's Write method when the -// manager cannot yield a good connection. -var ErrConnectionUnavailable = errors.New("connection unavailable") diff --git a/vendor/github.com/go-kit/kit/util/conn/manager_test.go b/vendor/github.com/go-kit/kit/util/conn/manager_test.go deleted file mode 100644 index c91b7062..00000000 --- a/vendor/github.com/go-kit/kit/util/conn/manager_test.go +++ /dev/null @@ -1,159 +0,0 @@ -package conn - -import ( - "errors" - "net" - "sync/atomic" - "testing" - "time" - - "github.com/go-kit/kit/log" -) - -func TestManager(t *testing.T) { - var ( - tickc = make(chan time.Time) - after = func(time.Duration) <-chan time.Time { return tickc } - dialconn = &mockConn{} - dialerr = error(nil) - dialer = func(string, string) (net.Conn, error) { return dialconn, dialerr } - mgr = NewManager(dialer, "netw", "addr", after, log.NewNopLogger()) - ) - - // First conn should be fine. - conn := mgr.Take() - if conn == nil { - t.Fatal("nil conn") - } - - // Write and check it went through. - if _, err := conn.Write([]byte{1, 2, 3}); err != nil { - t.Fatal(err) - } - if want, have := uint64(3), atomic.LoadUint64(&dialconn.wr); want != have { - t.Errorf("want %d, have %d", want, have) - } - - // Put an error to kill the conn. - mgr.Put(errors.New("should kill the connection")) - - // First takes should fail. - for i := 0; i < 10; i++ { - if conn = mgr.Take(); conn != nil { - t.Fatalf("iteration %d: want nil conn, got real conn", i) - } - } - - // Trigger the reconnect. - tickc <- time.Now() - - // The dial should eventually succeed and yield a good conn. - if !within(100*time.Millisecond, func() bool { - conn = mgr.Take() - return conn != nil - }) { - t.Fatal("conn remained nil") - } - - // Write and check it went through. - if _, err := conn.Write([]byte{4, 5}); err != nil { - t.Fatal(err) - } - if want, have := uint64(5), atomic.LoadUint64(&dialconn.wr); want != have { - t.Errorf("want %d, have %d", want, have) - } - - // Dial starts failing. - dialconn, dialerr = nil, errors.New("oh noes") - mgr.Put(errors.New("trigger that reconnect y'all")) - if conn = mgr.Take(); conn != nil { - t.Fatalf("want nil conn, got real conn") - } - - // As many reconnects as they want. - go func() { - done := time.After(100 * time.Millisecond) - for { - select { - case tickc <- time.Now(): - case <-done: - return - } - } - }() - - // The dial should never succeed. - if within(100*time.Millisecond, func() bool { - conn = mgr.Take() - return conn != nil - }) { - t.Fatal("eventually got a good conn, despite failing dialer") - } -} - -func TestIssue292(t *testing.T) { - // The util/conn.Manager won't attempt to reconnect to the provided endpoint - // if the endpoint is initially unavailable (e.g. dial tcp :8080: - // getsockopt: connection refused). If the endpoint is up when - // conn.NewManager is called and then goes down/up, it reconnects just fine. - - var ( - tickc = make(chan time.Time) - after = func(time.Duration) <-chan time.Time { return tickc } - dialconn = net.Conn(nil) - dialerr = errors.New("fail") - dialer = func(string, string) (net.Conn, error) { return dialconn, dialerr } - mgr = NewManager(dialer, "netw", "addr", after, log.NewNopLogger()) - ) - - if conn := mgr.Take(); conn != nil { - t.Fatal("first Take should have yielded nil conn, but didn't") - } - - dialconn, dialerr = &mockConn{}, nil - select { - case tickc <- time.Now(): - case <-time.After(time.Second): - t.Fatal("manager isn't listening for a tick, despite a failed dial") - } - - if !within(time.Second, func() bool { - return mgr.Take() != nil - }) { - t.Fatal("second Take should have yielded good conn, but didn't") - } -} - -type mockConn struct { - rd, wr uint64 -} - -func (c *mockConn) Read(b []byte) (n int, err error) { - atomic.AddUint64(&c.rd, uint64(len(b))) - return len(b), nil -} - -func (c *mockConn) Write(b []byte) (n int, err error) { - atomic.AddUint64(&c.wr, uint64(len(b))) - return len(b), nil -} - -func (c *mockConn) Close() error { return nil } -func (c *mockConn) LocalAddr() net.Addr { return nil } -func (c *mockConn) RemoteAddr() net.Addr { return nil } -func (c *mockConn) SetDeadline(t time.Time) error { return nil } -func (c *mockConn) SetReadDeadline(t time.Time) error { return nil } -func (c *mockConn) SetWriteDeadline(t time.Time) error { return nil } - -func within(d time.Duration, f func() bool) bool { - deadline := time.Now().Add(d) - for { - if time.Now().After(deadline) { - return false - } - if f() { - return true - } - time.Sleep(d / 10) - } -} diff --git a/vendor/github.com/tendermint/tmlibs/log/logger.go b/vendor/github.com/tendermint/tmlibs/log/logger.go index ddb187bc..42aa61c8 100644 --- a/vendor/github.com/tendermint/tmlibs/log/logger.go +++ b/vendor/github.com/tendermint/tmlibs/log/logger.go @@ -1,11 +1,5 @@ package log -import ( - "io" - - kitlog "github.com/go-kit/kit/log" -) - // Logger is what any Tendermint library should take. type Logger interface { Debug(msg string, keyvals ...interface{}) @@ -14,17 +8,3 @@ type Logger interface { With(keyvals ...interface{}) Logger } - -// NewSyncWriter returns a new writer that is safe for concurrent use by -// multiple goroutines. Writes to the returned writer are passed on to w. If -// another write is already in progress, the calling goroutine blocks until -// the writer is available. -// -// If w implements the following interface, so does the returned writer. -// -// interface { -// Fd() uintptr -// } -func NewSyncWriter(w io.Writer) io.Writer { - return kitlog.NewSyncWriter(w) -} diff --git a/vendor/github.com/tendermint/tmlibs/log/testing_logger.go b/vendor/github.com/tendermint/tmlibs/log/testing_logger.go deleted file mode 100644 index 81482bef..00000000 --- a/vendor/github.com/tendermint/tmlibs/log/testing_logger.go +++ /dev/null @@ -1,49 +0,0 @@ -package log - -import ( - "os" - "testing" - - "github.com/go-kit/kit/log/term" -) - -var ( - // reuse the same logger across all tests - _testingLogger Logger -) - -// TestingLogger returns a TMLogger which writes to STDOUT if testing being run -// with the verbose (-v) flag, NopLogger otherwise. -// -// Note that the call to TestingLogger() must be made -// inside a test (not in the init func) because -// verbose flag only set at the time of testing. -func TestingLogger() Logger { - if _testingLogger != nil { - return _testingLogger - } - - if testing.Verbose() { - _testingLogger = NewTMLogger(NewSyncWriter(os.Stdout)) - } else { - _testingLogger = NewNopLogger() - } - - return _testingLogger -} - -// TestingLoggerWithColorFn allow you to provide your own color function. See -// TestingLogger for documentation. -func TestingLoggerWithColorFn(colorFn func(keyvals ...interface{}) term.FgBgColor) Logger { - if _testingLogger != nil { - return _testingLogger - } - - if testing.Verbose() { - _testingLogger = NewTMLoggerWithColorFn(NewSyncWriter(os.Stdout), colorFn) - } else { - _testingLogger = NewNopLogger() - } - - return _testingLogger -} diff --git a/vendor/github.com/tendermint/tmlibs/log/tm_json_logger.go b/vendor/github.com/tendermint/tmlibs/log/tm_json_logger.go deleted file mode 100644 index a71ac103..00000000 --- a/vendor/github.com/tendermint/tmlibs/log/tm_json_logger.go +++ /dev/null @@ -1,15 +0,0 @@ -package log - -import ( - "io" - - kitlog "github.com/go-kit/kit/log" -) - -// NewTMJSONLogger returns a Logger that encodes keyvals to the Writer as a -// single JSON object. Each log event produces no more than one call to -// w.Write. The passed Writer must be safe for concurrent use by multiple -// goroutines if the returned Logger will be used concurrently. -func NewTMJSONLogger(w io.Writer) Logger { - return &tmLogger{kitlog.NewJSONLogger(w)} -} diff --git a/vendor/github.com/tendermint/tmlibs/log/tm_logger.go b/vendor/github.com/tendermint/tmlibs/log/tm_logger.go deleted file mode 100644 index d49e8d22..00000000 --- a/vendor/github.com/tendermint/tmlibs/log/tm_logger.go +++ /dev/null @@ -1,83 +0,0 @@ -package log - -import ( - "fmt" - "io" - - kitlog "github.com/go-kit/kit/log" - kitlevel "github.com/go-kit/kit/log/level" - "github.com/go-kit/kit/log/term" -) - -const ( - msgKey = "_msg" // "_" prefixed to avoid collisions - moduleKey = "module" -) - -type tmLogger struct { - srcLogger kitlog.Logger -} - -// Interface assertions -var _ Logger = (*tmLogger)(nil) - -// NewTMTermLogger returns a logger that encodes msg and keyvals to the Writer -// using go-kit's log as an underlying logger and our custom formatter. Note -// that underlying logger could be swapped with something else. -func NewTMLogger(w io.Writer) Logger { - // Color by level value - colorFn := func(keyvals ...interface{}) term.FgBgColor { - if keyvals[0] != kitlevel.Key() { - panic(fmt.Sprintf("expected level key to be first, got %v", keyvals[0])) - } - switch keyvals[1].(kitlevel.Value).String() { - case "debug": - return term.FgBgColor{Fg: term.DarkGray} - case "error": - return term.FgBgColor{Fg: term.Red} - default: - return term.FgBgColor{} - } - } - - return &tmLogger{term.NewLogger(w, NewTMFmtLogger, colorFn)} -} - -// NewTMLoggerWithColorFn allows you to provide your own color function. See -// NewTMLogger for documentation. -func NewTMLoggerWithColorFn(w io.Writer, colorFn func(keyvals ...interface{}) term.FgBgColor) Logger { - return &tmLogger{term.NewLogger(w, NewTMFmtLogger, colorFn)} -} - -// Info logs a message at level Info. -func (l *tmLogger) Info(msg string, keyvals ...interface{}) { - lWithLevel := kitlevel.Info(l.srcLogger) - if err := kitlog.With(lWithLevel, msgKey, msg).Log(keyvals...); err != nil { - errLogger := kitlevel.Error(l.srcLogger) - kitlog.With(errLogger, msgKey, msg).Log("err", err) - } -} - -// Debug logs a message at level Debug. -func (l *tmLogger) Debug(msg string, keyvals ...interface{}) { - lWithLevel := kitlevel.Debug(l.srcLogger) - if err := kitlog.With(lWithLevel, msgKey, msg).Log(keyvals...); err != nil { - errLogger := kitlevel.Error(l.srcLogger) - kitlog.With(errLogger, msgKey, msg).Log("err", err) - } -} - -// Error logs a message at level Error. -func (l *tmLogger) Error(msg string, keyvals ...interface{}) { - lWithLevel := kitlevel.Error(l.srcLogger) - lWithMsg := kitlog.With(lWithLevel, msgKey, msg) - if err := lWithMsg.Log(keyvals...); err != nil { - lWithMsg.Log("err", err) - } -} - -// With returns a new contextual logger with keyvals prepended to those passed -// to calls to Info, Debug or Error. -func (l *tmLogger) With(keyvals ...interface{}) Logger { - return &tmLogger{kitlog.With(l.srcLogger, keyvals...)} -} diff --git a/vendor/github.com/tendermint/tmlibs/log/tmfmt_logger.go b/vendor/github.com/tendermint/tmlibs/log/tmfmt_logger.go deleted file mode 100644 index d0397971..00000000 --- a/vendor/github.com/tendermint/tmlibs/log/tmfmt_logger.go +++ /dev/null @@ -1,127 +0,0 @@ -package log - -import ( - "bytes" - "fmt" - "io" - "sync" - "time" - - kitlog "github.com/go-kit/kit/log" - kitlevel "github.com/go-kit/kit/log/level" - "github.com/go-logfmt/logfmt" -) - -type tmfmtEncoder struct { - *logfmt.Encoder - buf bytes.Buffer -} - -func (l *tmfmtEncoder) Reset() { - l.Encoder.Reset() - l.buf.Reset() -} - -var tmfmtEncoderPool = sync.Pool{ - New: func() interface{} { - var enc tmfmtEncoder - enc.Encoder = logfmt.NewEncoder(&enc.buf) - return &enc - }, -} - -type tmfmtLogger struct { - w io.Writer -} - -// NewTMFmtLogger returns a logger that encodes keyvals to the Writer in -// Tendermint custom format. Note complex types (structs, maps, slices) -// formatted as "%+v". -// -// Each log event produces no more than one call to w.Write. -// The passed Writer must be safe for concurrent use by multiple goroutines if -// the returned Logger will be used concurrently. -func NewTMFmtLogger(w io.Writer) kitlog.Logger { - return &tmfmtLogger{w} -} - -func (l tmfmtLogger) Log(keyvals ...interface{}) error { - enc := tmfmtEncoderPool.Get().(*tmfmtEncoder) - enc.Reset() - defer tmfmtEncoderPool.Put(enc) - - const unknown = "unknown" - lvl := "none" - msg := unknown - module := unknown - - // indexes of keys to skip while encoding later - excludeIndexes := make([]int, 0) - - for i := 0; i < len(keyvals)-1; i += 2 { - // Extract level - if keyvals[i] == kitlevel.Key() { - excludeIndexes = append(excludeIndexes, i) - switch keyvals[i+1].(type) { - case string: - lvl = keyvals[i+1].(string) - case kitlevel.Value: - lvl = keyvals[i+1].(kitlevel.Value).String() - default: - panic(fmt.Sprintf("level value of unknown type %T", keyvals[i+1])) - } - // and message - } else if keyvals[i] == msgKey { - excludeIndexes = append(excludeIndexes, i) - msg = keyvals[i+1].(string) - // and module (could be multiple keyvals; if such case last keyvalue wins) - } else if keyvals[i] == moduleKey { - excludeIndexes = append(excludeIndexes, i) - module = keyvals[i+1].(string) - } - } - - // Form a custom Tendermint line - // - // Example: - // D[05-02|11:06:44.322] Stopping AddrBook (ignoring: already stopped) - // - // Description: - // D - first character of the level, uppercase (ASCII only) - // [05-02|11:06:44.322] - our time format (see https://golang.org/src/time/format.go) - // Stopping ... - message - enc.buf.WriteString(fmt.Sprintf("%c[%s] %-44s ", lvl[0]-32, time.Now().UTC().Format("01-02|15:04:05.000"), msg)) - - if module != unknown { - enc.buf.WriteString("module=" + module + " ") - } - -KeyvalueLoop: - for i := 0; i < len(keyvals)-1; i += 2 { - for _, j := range excludeIndexes { - if i == j { - continue KeyvalueLoop - } - } - - err := enc.EncodeKeyval(keyvals[i], keyvals[i+1]) - if err == logfmt.ErrUnsupportedValueType { - enc.EncodeKeyval(keyvals[i], fmt.Sprintf("%+v", keyvals[i+1])) - } else if err != nil { - return err - } - } - - // Add newline to the end of the buffer - if err := enc.EndRecord(); err != nil { - return err - } - - // The Logger interface requires implementations to be safe for concurrent - // use by multiple goroutines. For this implementation that means making - // only one call to l.w.Write() for each call to Log. - if _, err := l.w.Write(enc.buf.Bytes()); err != nil { - return err - } - return nil -} -- 2.11.0

X`)*Pzs;lIWIKmGN;&;K+3 zv|0Xt4E|$qGgQ3RKe3r`(q#Cq(tQO497%(TV1XZ*UY^%fiY$9;Aed)|fpdBwg)rLMl@ zjEh(A-jz)&%&e92MfD$LmF$7&Fb&=pd(DjeXMS$D@j;{z5Xq+yA;7e;cK7(sw(O_J z6#KLk9^;+#%Oa%o;>?eL(B09GS0k3QLl{xlB({Yi8#E+Q$vwl>sJP`5p$z`x=dPg# zG<1rGe*J-XtEq(kvavU~Kt^$L`sTp zeE5nx_BAfD9bM&qyY3fspP0&$!EAjW3sKR`WL8ik;&50w4=;F(R|LNNM_BX*V^N0Q znV*MNI>u{vF)5sMfU|*bv+)>n8}}UF8AcM&c!zGtANJVK>2E?0lJ&_N=v)2}FR2aQ z0Xk5T+s~fhM)cXEPmWvjj=8jJt?V;)F^hK^h$N+hutelWriL9-$PTHO0axc&_YN z5tVO;9TOcpviZkr&VN35u0tPHpXT#@p=IcULN;MNlW{kZ|CA^uNyhg6va%k|pS8YS z)yBT7+#6R){s@yhxvoDkT(#J6-W|?KMLX2j-pTZ30qa-s&h)yJ`@+fL%TT80mT>#C z#%Rk<_f05MEu>-3tnh9n#t>6i*^xKF>xe#jf9JGQgA8-p@qft=zqzcAzPX z{arIxY}@a{10lOp?LJGnfx(~?^Zn;6<(on+5gslOM69Y&{A-F9zw92W1h#)CDs7h9 zsHb6r{cm({5dNyJl(t*mfACWiOu~Cf!aFYy1*vXITR^m6q6iRbzFV7QRXWhCN6tDG z$=)FfM-Hd4Lh8h{A=(oiY*eYWz_Isn9wNkdc;(&qj7by5f&uw^4#hNGG;r+Mb zk)EbX>*@)O3}6CjvJ=$M;whguv_jENQcSy|*In_dA;%Gg*kXU~qkHnSYiZoVhqnu? zies;mh)g^hKldJuH01rx5IK()FWi(fQ zqAV(T@Vb5#OdW>|7re`)H(WzO0D(mC5z;swrjKu4Udj=UN+;s7IDL0>H4!@>Q9 zynNvz-9h4u?WknV{M7q^XS_2k#^+ z>rdxWHvNfoJY3IWJGX!r_Ws+b6a@#j=K#*n9`jUOAKrquTYB1>M#X=g!-W`6r*{64K2*>WwS50v{Q&Y(XFhDrE z@UcNFu;pzZM3Ywzwh(%ynYB_nw8A+SKNNu1YDm;%o*jLC#&(GB#2dbxh7AFt=K+x4 z4eB#z;0w9(R-iln`fYk%(tATT(Gh9zG!0!Z^j+&KGX;$2`)6>h=lBthqdB(sZ!_zq z(?2}pEFd1swJ}^PjKBWKF_S;OxiMnIk$n~QAFBMNaw;pV@2|YKvbOwLEU>(ul`e6# zAd#ZvJ`6_x!)M8K-82#3Vl$=MN>*M(S-*U(oaeHNInV!fhn-ep=X-G7>^$*riG3fU ztsb-1OE%T^Et8UX^r!Q6cIM8b)cJ;Rp7sMEtm3j0paiT|a(t%C&MNE@n%OPNd9rLd zVRLSdW>DR(xMdA+bQ%r4RBFO)do^AMLOeWf>%&qOtl0=#S_Ss!rq4EqsRefTG+6hF zPodzzb_zZ0W1+`~7jHRycuUu0!L`@L?yEDsuWRV*Vx5lj5hQi1MH_feS_QPfssYh) zfgM9mki^}N8cdu-1glh018ETH`3(Yylm`}*gH`sYgik=R5e+A>dLgd}5sEQ5Qc z+`{9>!WZw2ye1+sqhvM5Y~)$2J7}D-#ez;FgUqh$FEl|Uk60)E*qW9m^zJ#tiFUo^ z*?4{CICE+HfXXlyAp)|74n5PRJhJPzvzhlQCr&x1rl!XaqoPPY{Z;y z9SxW9e;C3lg&XzF#(;yS)nDs!k2jVgC6r zx9aO=o=PU~IzjW3Xe;3>KGec@CY>^mWAx`<*_r7=9~u7c^icxcK#`O4m1bivCoMXO1`ab{njY$SOFTSovsMaad!}xH6T@Y`e+6m4 zC7qIX)5!c`k52e2!h>$%L!^x9^pg>a2)Q>G-2^sze&_5%2Bv>jlw+s;Y(Dl<-=F)) z783X=4LnmaM^9$psrrufLZ<|%pFW1+kr&fIUQ^y#KHtt!3X9uaqQqsbrQEkqNwaL6 z`he>qJNlUlQQqPPgyhw&S=o6@H0w|d;ZL7zf1qU(NzUh#&spjTeK zs^^pQG)|_*sSN;KEbbP;79*4juUZ%6&(BufATGKV?CBr(&3oL`70r<3x!s|#+o_+} zk;-da>sFr7qv5y=1uULM*YH{*=`b@y-XIj!3FlK2TM*7w_PcNhzT&XJ>JO1_b)XmN zGe@W1zEzDhDAfD?zJuOSq5U- zU*a^Nil2SrT1NgF!YQaBB2Go`-?RcO`qRIv06*2X@q~#Re*vzi#JCRO-}t$g48=Dq z|M`=H{Ez$>Z2nU>a80Btl?liCXK zD#Tg#0fZ zYENeW&hv#R6+A&>bhSQJ$4~rvtx#~sn$2s1PwR*V7JPu?-RpNq@l(q1^v}Ti_-ccy z(%?BEhX~MYOxfIlP*j>i9NCfV1zHgB~$Tf0T<~ zc|)QmhAmWtFd?Fn=zxee5qhsnT$#!|;A_%I@IC8V@crQC@EuwFI7Ht)1UZ;mOKTS0 zv3aejoj`m>nQan3Zv0tLz;GzU;m86T{v3=Zq*q|7LuNzFYQ(NgPL`U$h^)H z&G8z(srWHkxc?je8BUS#5ICn~JEeTAS*cb|}jGI!GyZ^kZHSdmWk*M3*KiRC5d- z)hmOgtr{y|-ho$>j-T^>=JQI${dNuCe$cny;MzC!k6TE4rf-ev)9CxOWji^f`O3QM zl;{1Yu2Zu*t;)H9+L{?o!giP~F*EfabL%U%_K(}kb!t(kp3uoJGIU8OMR}A}3}TZo zR7FZx%6;TP=ecy(=nQmoA45`o`-s1>Dc5h0;3$dw`gkWt zbkK_Yp@8qpvDA_~HPhO%f85}Uk_|I0IHtup$@3^b(_-_0e&T{XLi0HCpF=L3mvW0v z9ZNIpmDy&)8+2c8TYcoV?MO{i$C#a(Rpp~!@9%sSy2=#AMl#Y|xMFNCECG*R^^UE< z(=^*XVZ{u&$%Y7CHOzeGyEoT?euM7A!#qd*>AX3d!#7!QM{Vu+ z$&5>p3Ya#bXY6Hy2S3~W%yr42=jXuLe7h@|wYJZ$D<7($8_ypPKb)e(U)^uXY(IXN z=UAwyR>Ilt(JF>(6-rWvfIjDoQ|C)k=S#ymB&xkg=?E-E|5KCmFSYu}ee$?!LRX7G zMqcX)?eK)&_(C9b{G5&4i-|4e4)V~Xt1W)uhUnF;szDEU(5up*k7{I{*1>Ml^k2$u zu$!b0P!N=|Q;;EFT8ly1d3QK3<*xteSn&2rIl)Gl?UtcYO7&4eU+t@v@-6J!)XaL zuTIs1-*-R8rEQM@%X8_7sc*2O{{~Gd_r8M@58-Z!-u#wX?e=3wt&dp!^lM89?E9o2 zE@Q%)rZ##{QO6*>Bwe}j|Jg%7z#!Tnn0LNyyYwn-03j&0`b zt5F5F-v1BAHv_QTu7I|Hc@G!$r*m;xf5npLJWz`2;a5aS@xl!+67JAIdgntSP!<6J z&KbnT;hcscEljDx0yRUt>LOK8^J-PtZ6Bu!G4)4UlY|X>AT9l246&_^i_Bk*cWSYL4sJK6Mw!m zoTCAYI5!Elis6gZ!q(?oHs9F~HfyEEX6auF6~Gl+Ss`Xq$gM2jzkhpxhCQ+Keax8c zf*oU;q-;#~pS{*mHD)WSA(6M}Xd4C|A|i~xe$?cBdAO`zyJM2kOh2^2KzF_-g+<@! zXxL{UY2yGTd;@hPu&C!B#E+oW)<>N!I;BSF5ioWe(EbV!H_er{7C2KV_P#jkEIw}y zKr!xe$GFk#A)e=6y*}JZ>IBGQ?4$y|YzN5)~Uo*q(?L_iv zmmiD|9|&8)isGQ7f1%@~tyy2V9mLdLd@hLHeSBTjj;G-(=G+g>bNT6XA;V2kLfBt4ChL*OMU;0diP90vS9hPy{Nu?a zo4Jb-#XPs*;6@4lX069;9Y=Z_W>Glz+AYIWCVA3WfPjgG)@{|825Kxu3V?7hfCM^U zL7;te^jAeYtRD-pv>3%zYY1-T7|T-{<)OLzEO}#RYA5^ElC*4`EWpe!$xv1vNJ!mH z;TjMoBoHzonKgcf6rP99>|;H-@^qic3~e{nx0`~ci*D6{+EZto)~^Qt*_j-T^8z7!#um_kpTc(gG-FA0dRs7G^rj+558 z!^NnAsTK$PUXafNOYCiv9IOFyF!F4R$v3%eTTG^)tNX`oufi(zzyfh*BSv%Lxqu32t0rhi%0PHO#_2QLf~q< z&&12$@AedR>BvZpzJHT%XNic7cogXY{^wV#p>Oa64;lj!=$a``a^P*I_@)5fW{QpoDPqXccteHZS){r&%KEiibt(9J zS6vGIgeZ0=2aAF)<;Z__zAT)hX0lSL0nB>mm&bA%{QX2Vrhx$f1pyFi)LE^9zvl^p zh)JFKd*VKoZ4Eo%8M=yN+TYuCpy|4yXTt+s$D00LQ>eT54gNkZJ}lRzKg+epmwu{C zALmkewe2*40iHn1{_-xL{~>e@xnoq9ay#Fac%-a0Gq-eAv^^hBIU!}&PC)V*{S#*V z&8D%3i1n19JmI6n|JuoEb$~+-n(#%BvIDj))7;mUQYbZ=jxjlap|hFk z-ut-J_vCy$)6Fx}eKqEr6n3TttB6-^zO(Z^IPTJf);**Yau}Ll1C(E(9Gj1wMvpoo z_IWy*3GXKX12W4-^w2BDGJoHCq7c>-2h}ed$ z1nEX`DzZ-F$+sAwVq^cfDb}yONu|r!hP~|@cu@$Z3uJOow}>Nbv-8E_+^e{^;YlBp zxS+tq^+p@g1Axf_AQaTO+J;+r;YP7v>%zf?7kg1H;h45zyACv6AGr-T?lr`Q|GB5P z;qpPU+G%Xpa&M?|@$82PO}Tp#;kGgSQxQ5(az>f!7>-qO&Qz9XJ5n*ONtES> zr;esvA;#rRy7OJER7=l;P91BgbDO{4?(Z99cw><1ztoSk%#KvjB@r9ZVjM8_SdF`m zu!(WaP(3upU3pUysV+~?-tWu2I#roBbaju`U zj}EB?_R-0a|LnXgoM-LhGc(inv8x)>zyL^U0t5=`Tx}nXPgL7S!OOnLF>N1q{r@oc zHt=y3W#4~Wx)PwFK_~>|Wx=8;pacO)rNDv}7AzRvgA|O28l-B(76YPgNs%num53-s ztK^njsJDHv%8M0IQ(7SuUqX4Ycq>E{JnL316{H2F|L^abnRCu=lFI*np3mob@`29m zoSAE`x!&fQYi7;?n#y0her)8tu3OW@6WZ@oR6ED5RZ%?0Ro-9=t$|spsD<|@l4b7 ztOEnjJjOOZ;Q-Ahn8?e?GnEmB7B8A?P6pXLHnv^SBVr^kD@LNPH6zM;N!jX}I0yy! zzZzNj1UwxU6E@1F(|iZ>%TwZHM{DpL@`Pe4-Ep+r#y?%2L*+aQE3@?kjPmM++a|0%?+`IV5yZ{u zk)e1)%@enHoqEp>v{OLpGM-Mo=Y)x?MjCcll>qQ-T-|cXROX~0OugrfNvob|+Tjt& zfpwxAFqz7m9GvY|jWqADYT=fy56HOE*!CZd#0baGvH;T=r2{{MIXO${BI{ zsNqg77}IpnV>U#}pbWF&kWbMStgc(I6HUOxoRI@mnF^|`HH`p>VFs`+fOPAhoZ=<{ zqzS4`_YI^8x7=?*bI-TUFSk?>WqSAbid%heWdXiN^~~z&)%R3StsJZ$przmnn1{>3 z?UnAoBI5`0l?C_ia{)P4Kw2rUwpHI=`6^-*y>gFjmR$S;Oa9`1o#TGJ$0h4s;qmU* zTKDU4_v;Xs-0ceQaLMg1X}X?Z{C`JDFurF0#m=j*lemp~ztIxtu0M&;faOGYj>zb{ z*3Fm+%Zi45ss%?1mM-<%^u)Pk4;rukjkgB~$kFs9acIXTSa_AiK?kkq1fp3+V4Z$} zvs^fZE$my$K^()5iyqoXk%da9oU{(Dg6MYk^qd~LZzfKrqc5w9%p75fFR8nLd@irr z`bskj=D)6N!jqHGhy)V<0c$dka|gX^x>w8EP)W1uRU!FH_D@V6ZqRUR&xe&V?VHTLoo>mr zcPN1lpPW?f1ao~+DZYbc!OKT9V&3S^OeD(VQRg^VcIyUNNAL_-L!z^EG7Qwz0Ar&& z+;g?n%!w<1s_oRfY&<6}W;~~30#o~k+E021xMmgCY1Y}iW(L~=gEL3@z9Ow!gCOm} z&~f}#w|7l;b+oC({?Uq>@n6oX%xd1>Qp#+oPQ%&c{Lim-{%3)fTII(5mhQw@Y`HcM z#CyYgTFRM>J&~%PxepWF)6rt}^3`$Zefj?M$LJ5S_YbnE{Yy4hZ09RqqO6zK4@U16 zfQMoLHTX{byd6**b>E~NF3QH=@+SYO=o6=DUx05d@V zznbA}PW386#&}^^Rx&$BeAFw$i&}}^2>`pFf^O?0v{d9(GBwrn)MN*R=HfE1#L0YN ztDAJ9yLWRN6(Hnx{K}1ID8}ku*38TL zN*3v!2furH6{3lqR(H`)-T+g6n~MMF_jlcIJ^u#3?SmcQdeMQ7cp_Ot^ha6l=Mksq zUf!2#Gl20V;YWG)^vG>Ko&ZhRd~_ycxwDCEKK6?#7`rax4w-Jt(5}lPoO$lArfI)c zVqVWiwLv>{VC#`-o_NdtToTUupi+&NXB&?XNB;s z(UA>MuJEvQ+Y@5p8leSm^r{Sbh6n5gg)h)1a`atO`qTR$^imnI)L)9;xIR2|B)?5J zJr-_ozWVa%U2;|+xuvBOOv*Yn*!A?OKjlX(r;0wZgV`@oCXYi-Ju=TgMfr1g^OS$9 z{|rU|i;pHO_b!KaNhFhUDL%a=3H?;?t0 zI3ajL#^a~wqPg0rTY~|m5q(1p>PM&VkeValgWvuK=>b8Z$01VvDL?G8mS3654~D#_ zicpDeyWfE}IzU}qGpdOm0wamYdJ6f|VmuKbbLK1!EpWf|o98S1^FjYyNC4}cE!Vw35rOn)NH*N0@x9ysawGIn|kiKG|Qy9oSC$@I%~vd$PTN3 zrO7k1ZuG7T+y&q;&(}H(C>u=&3==6QYn#tzDj#R-MdgMe7`W$fK^TJZu+kK!R!%)D zH%WxIvZC`F>oJYqHP_+81ZUf)W8qWZ?=s)7EkRQKS~>k%dD1VK8!LEXtl$Y6KzJ+~ zI)7W8r_{-ov8*|z?~d#Mb?aw@>J#_5$yz?jdu)4Z5DZ02`FIk$zuoJ^u0f+j)X^C~ zhMdwdXxrkSw<<--^XQBIly6VvJ5u@1kT1LX!c@mjPj7NoAWyl2t9kwn&(<2_MQ$Sr zer{Ahm}EP4$_2lLze?;uZJY!67@KnA-=?Yu&8}x#-FA!fmVpBm%8gAkrs%PSd#wqj z&>-?-+ej+ZHMY$m4^50laLs5086Ej~U=4YohB6{*olNmQU}&-HX9S4|E?C$ruEX-EYC!>Sqr}6)( za@I~Y-hac88m%o$3`w*{DI@I@0REKk4|zDGa$(2R6r1zj!B#^Uk7H#K5KT+@=k7hw>N_~w$Kr;e~J>oZp8Y-wJPpkz`y!!6Yu`Tr_g7ayj z?8!WRY=>nmb({scu7Rk!?u_?sQUSdAQSI_3VtoSloGTis#Oce_zj?&47@# zoFE8jSGVWR8-Jc~r%IhPcQ`xmxFh`#M;b_ljq*()kB7C-7~HWoP)%*b9o4Vr&T|v% zxs$g6`n~uRcZ@(lGXm9c$6D~D-IK<1=hAbw#huFg}?|T1!ByVEu8#JFq9%+mX6_;}qsJd55nEqX2cwN}h>eEaB}W%3vw z$b6EbiBayxUVi({z4%0jUw zhBP6X?eCRyHRK8dxL|)^6f=u|Ct%Tn=ZPq0?s{Mky-7Zd5o7sL9_NGm9c|@Ee)Um` zF9e08IHI^RPoDD~|7o7{9wPBK&2vutWv!PFs$bta*BBGQ?7IJ;1ZEz#qL&42^tP*5 zcn;RIpZfWG84ED7$(mb2(MBl*(fV4pjf}Ii(axEmzQ_-;3f1V<%hhUXMU%&>MISY_ z?%#f_T69!XYiTVky2V9{*Zi-38p7x$AMuJJ8DDvJIFI~6Y53UZk%=S9(`B&X-7tBa z5qRO9BMejUQwOb@f2?_kX9X+szU<7QsW<9<2+vFAf#(_qhc_&_pczw`Z_02W9v*%) z`D^~wQ`HGJUEc12taQC%?{j8Ax}>??0zX*yq(e_SCF|Xs$8xC5H7Ig-tXQNqUkxNW zRMeRmzUb<&#u#`U_VhUTp0eP8K+I7H%+}*E$>Jw%dXke|@CHGTgMD{TB2Q^f&mpjy zlWU4T)97v_;RE?jziz{dK_g_&!K7ysxp?6INmwC-6@%Pm*Y%|88R{v_u<_XIXStXM zg_~0p=yQ@GU&&T9{#bPN+3K?vxw5-=m31g(+4c#m6u%;2zT1RK0p(_z!wO`wUZ~M1Kt5NQl+E50;o*kKx)HaFu)GafK&ZQrXKRzoDk| zhDK}osIQ%ZE}{$n-Ft%r9;wF&YOG-hlZB`xa5INE#X{>h)fP2?#82c!>`qmC! zu27~)Ro!ATOdJ_nEA5Q6dZ&O9{0_jP6`z6(ub7$r-{v2#@c)c|=cf(cYvkWcm;Z0^ zFTwTy8U8)X!=WRje>j0D6MHP~5c6oy0x z5KnK)m(D|Eci=0cm-G5OL}|wT`Qj7#mwuC9_40A~{qN6DvZ0#>JQ&kLnd-wWvqn05zDJKY9|UWp~i?hJ^ViNvmt!aP&a zYf{HWzRe@=v5nnGn{Iue*clipC3BWy`-M}T*O+x$kD7PsDJnh>``*h(MDWYLuvKAK zJ%Z%jF5VR$N5?KT|K_OqFm9769)kz^JSGYFWxIyiFlLJ)%W^pGG;53}H|J*zIRitd z4Rl(w8^Zfmp$=OmwnOEz`3G|i0VGfO*g(~BBx$e87OV)$&8fS=AdqH z&^!*YGxYpd(}Lv%ERnDBqUp_;Jr`ds!3bO;x4c{KPD7P_${MP`%UIs7R{$IxcjP(hl}F7iw)6@9=MUN%~YTGfo&F= zQ_-p-+agrPZ3pfnY@nvYS2J~|JeGxPG%R}!R6tAqJo|-fuyhF$fmJkTtWJiv%GPP^mYwtpqu%AhE~08$y6eT z-dN^kvAeAz3$xS*$?o!J3sq4C#zRUQu-cpf|c<~7Wm=;-=){9WlQF=9QXN>kK2pgqS#1CrwfZY12H zu~vKwt=PflVC%hhc6ti^Xfw9*jP{N(9-34dqIDeE=cEy_00Y{iLG^CVp_cZNucV*e zL9@b6lY!N{B?s|sCmf;;SeJeS08_Vu-#L{*SYst;VNPMg{3tVEJLjiT_Bvj_ zzD{yJ_WD)mh<*A~e#CMvFLlz=7(A{5c@<8p5&606xSqU#&4tsPB`xJ9Fys! zuwZE4<+m=vV$knC!9pjKw!tt*?g#-z;p3W_T~aafJ*j$`MoSe+g|r@$M+vMeM~qJ6 zr;75*HAQp3E}8aqF?C*h#wC5->T!vX38Zfgl*$)fZ_H(qp1dM$^kL?yrLvr$7$f}}N8 zjMd}P+4E%K8nJ41)r4bExYFE&BTeU4N9TjnbZ)8W6+zKU{U#h6yAY0QN;vQVQ}V$? z9{Yd4k$<*ugBj7{a_8eAA~Jvyg(al=Q+^8e102N? zoH$`RMl>MgB(l`|E$JSb<(((MN_D{GE_l($W60P(f`)Lj)f?q6jMZJ;D4PXPyw}8Q zIFEJ;X8@gMV>^W%@W57XOZ|n0yZq}x{H+x>Ty4a2jxefW^nOss> z@jZ8j>Pp%HqqviBk0sDMr!{3>D*Fw)xTb$=d|w^TiX`wIT7Rf==4wpa&ce`eour)R zy(F;k8w)Hfc5a}o-y;83fxFxaU|h3;Rn$oJ5epdFZ+UhhEnVthlspXPM+Tn+Es}d( z^j5F|$fH&;MEwt|1d6V=C%y)3YZIO9AsyO7Di8X~L!mMV*qVzTWpM%8X0yIbHSLTY zTGPi4zR6hf#2kEQoCE>G9U%BZkg!hKZ-0;t72A~7Wj|qO54_wNMnJ$iWDZwN@=ek6 z|Jam@Iq4p&mfxpZI>&mDSej zTa!Ju5iV6$uEd^Ke#qWmWfg8@<#YP^3o1vGN@nz5xz3UoT=Ex}Ja-W@!9;4M?7zix zSBe_7=RpZ4bW+M_A!*2TD-)tX<;+hm+sTO35dCxUi(47w2cS+l^PY{{Q|u-~Q(p+` z7l2LCH~;kyn+y>`HaN75YLUgZX{=3-Sx!GY9Vg|d^+$((@)G64++K1I#{~jkSq)6dmd>44J^2 zj>J%!HST;GO5I}dVSqv8u@{SGTHIo>AH3w_EKv#zdq_=k3(D{(;kQa)Z0)d;CI+Q5 zV9ipmF~MzOrDfWns3kb=J$>ss@ieQ#PUTv>F)*LWZ(~txe9Wl=itUSO(j^|F-R3t+ zTiGPLejQjbH1Mh=M@O0*k`K9f$0IswjX^QBIUcScj&{`s@I2d=B~-%FwM(1nS!2q zttE5bhYX*T_-KiLX8QSif$ZJDaOXiRLZEHpX$Pgo+)m3d?0nkuk|2SXYBnG>6QYw0 zLBD{o$eGSySuoAiZ}i&D1-3n4w*@ox9!{SIH~g|m)f4)5vl9dL$Oy;YH932sPaPhg zOXJZ}y(N0;8Y99<7ea(drpR^Ue-Zo{KMb7*YZ*UbW9Q`C$jM8TLwqs*d3+dTgW!r<&&mS#(`#;wLdX? z^CKk~MN~y=Byf!JMI?*??XpM0T>gTv9t&Q*@yw<%uGzH8RCIt{bIF+dRvmup2f>*y zb6U4dX0|Z93rbE(!a~~zXh0gft%;l&zDt8bd2QVtZV~zEhbK7`B}HE{m2ca)Oiy{> z6e6eQC`0H92?9Lu%vIAPa!t{Cu2AR!)q~erPYouGWPbKhp)i~HHk>w|RJCP@XFbAz zNwSD^oo)ZCg^r{Cg(k4Y^N`ewy`(1gt2{g07r5KWr>v7+R@SeS#kEq{y^KVEV!e9S zpYkhR*7AcP4=D!7r;Sitl3r(9rQnKuW>WPdBBBaSPG9N`{<4v`|;jw%CMo2I=dA zOd2JPHC9Hmfs38~U|9=1gd(>4`(dHlAu&J}6qYn8vU%K}_cep!#X%t&6MyPAtA19^ zTcTMU6_kp!qG!i(4%>?ZH0j2t=~-RoR`rr(c^wi-cZf?5bQWdtYPoj*OZu3$#)u&=$RzKufVWk+hXR z5oW#Bk(sy2b6-hFx`uDX`70`h8=Ie`R%i=Fh6TeeSS{h=5HCe!^kzGT^neP3mWDS= z)O>34zpiw%2?Si^qf@SX89GBabWMi_hk6YL5A(^&k0XCNwB|4x@g3Tz;E`dL*aNwW zfEgPt&Qy3#;z~r9akeq$r14|#Z4o9Rnh zJS^lok&}m`<&E|L!Xzg!GP2)dB2 z#YUgJ>&7+I{&InabUb#*pkK{g$Y6;f&BmIgGKLlfWUi9D9WC97ZsaVSy39IHft*&| zEUsc998XxVmBA~M6`MFD2t6W*24F`3sW1eQH2gG?W#J)_0;7KsYDV#=4Db5ALQY&Q zb|*DlV6@1+jg9R4C;2Qshb@yvC%}#|r0eGo{;&+sx25KlYB z({afZOx9S^!q)f`7T81|D);Fh?QCwlg>ZJbvNZC9F}4={TrUgS6nzV5;3l7IF6rK+ z9i($fXOni2<}e3&NNv+ipECS8z11%{9$0ssx;>i~`AY`BG;soMZ7PUn-4j4lY9F2d zGkQApo+&#{90I-_mk2(BpN5@;2z>P>0i}=G7Nx%4YdDs+mf;{|%l|%AK<4wt#YO&< zQ8?=pbM-7YzXS>efp=W3^%P!@X$=B@%xjrnoC>oVb0GysDjPf{%Zy~+54LFN0GMiw zkm4*yJQ2m0v}>FNYvU(nMIvKDLh2MDeVaK@D<{9lDTJ@jPKLobc)r;66f2GQSmWK^ zHubw}XBZp<6DVqfcZ@e_qJGf?k5x0%`(;T&u>fD zDpRzzy!0}277ujEzAm}eB~325!X=lvof&2BG`}MR-@~7Z=u71(t_$(&! za;|f7uBDP)&~O6jJfCtHi-Ay(RmRC+hlHwC+LP6cI;r|j_&6nKs9qkzf&memtLG0R z5(=ZCn0uLG>U7oIesqe{7)h(ii(zyD~*gV{&Q`NS4>b)ZqSi>Gm zz5!fz1C_~Bzq^Vo2bUOFAikO7H$~OIEu^N&IOADTi)P94QYV< zNjQgH*7EB^9u-|iK8!`;jr9vR55%DnETr9gAYGu%|8frZxm6LU1KRULYAb$RRrq)k=P zF6&A{60E1mnfc<1!kvM`q)JqG^i)MpA0Jg|PV?nP=krY*cJYfk>V7_Y+sDje9DE|i z;ej{=Q6oPao%~$krL&2|kJip9@Ym*Wv)+xSpjfVh)f?c+(_pF6ULPK(94B!>#{Pc1bkgCDOf;=%I zDLm^!ZD$~8HKDey6#nUem-RByro-c#B#K_nQ}%6;Ve3x>9&%aB%lha~xJqyl%2?Rq zl6275Dy78q2tgba2>!;0?lBt6uBGF!0eaoO^jDAvF>TC4%msDq7MXp@!aCDZ=Av$X zgA_{z%P>Z(0TZkS2CkqAxPeY9?lOhVmoA5~wmenn1PyD>7ul44!X`kmJf|EJfInG) z{nR>}vYehGeipv44GC|if}sy6Pz?o96qT6W_0oxO9L-1oPA)p#nYL!>P^`CsgNA=% zPCEinLTT?5Q-@T+wywF5CR_2^cIt3M~iy7U*@^9ZY4&bZ6C}vGuG5kKV2FRjc21{w3{9w82gjxU}1kEv#awz68$p#O;&1L#(de& zQ_&X-Iz6H;U?y%+eAa~5NlmIA4ta0+rjd6*353h4PK$E#?WmJ_m0NRl=c+l1!5V_cNoR-suFtX9#-Ees z)bDr63Q3>!H?DO;HKb`$uK}eo5+9%9Hmn(t360y*%;Jl&o+wkh~txZnw$|N~Z_Z4-ahsv0&`} z>dV^lX##EA^1)~!rIZ{&8eA)HoiI_pIW|z>7>lhd_m`W4?dwwGZiyafDEt$ayfdF? zY4d^*S@rwLRN4tAeezDFBO`cw%|E7I^Rxq2+|3_k6mWr|M?c}se1ui&cLZU^+I;cR z_)g;^{xrU|;Kq?g2llPU{A=rk2}tPYH1q<60tZ58f!fUb!KTBod1f+(eiyx`b3!Te zUa-lR_ud5!)0w(*X4TJ3db!Q(tf0n)I`N`SoAC3M>$Hu4m8b5Pt*&g`qrbo;@tzk7 zst=O+v@(NE7q!K6C(kRpBdJ2oSY@x1`j#Q-OWZ3AJ7Pf#WT>U;M#fQ8GhJCOp0yoR z-EF(lkvCi`sxCN5LN{eQhq^`el0ZhES|Lf2csb#Nmfq+LKi1x?SNx(h9}kbV{2W#L zUiEvijLlrdIx|zr;$u_}+3V#FEYMH`p_OfL zJQSAstW#E9a;-n9p3?!5%eM255}B|N3Z@pr}A}xX% zRLx8vmfFw0ac7v%0@Y+g3}AEggMEdIP4Hq_@8+%8tUXlHBK0&iBv|2k^2IXpiVK=E znG7Q*)LZ>7Mw@;x7+osDMCMB5f___o_X42!myfDA;4Hbq~^xPjXIB4K3DneCf)iFpfjY+W7w z_uIK-d2`%l(qDP@^kr^6eVCvu+_2t=xZFiSSg#E0H{6{du~Z)JZdOXydB(b4G9&`eA4VRw zN?40x^IXMIy^OcGA_`j+O?XuJ6mdhLlEY%P;L5o;WiRYy|A zL0U+)!3$d(jvjgfGn;{h_Ga%;ZQGRkrgGY4yg$B|$15Ku?5*nXNw3 zC2w`fO)km0WKWk|eHiBaf9Z}z`Y*AswqCVsJvHZtgojL!{uq8giJe1&6AQ!CK;&_hk)SSr)Yis~dtdgy> zRA{T50ZJtpImtwa%ON$LL>DJgazr?B{Vw;&&7ZjxFWP9VHP0bobmEGa7TX zfON@HgO?w6+<8-U|36(K&}AE5BFFkO@Ak3EsWnJSM%y2|99# zWHBaB7Y#wqw%On9ovy!Q1xos_4l?@12c(=^b8@;7k9H0Ht7-YGGfBh6K zMEqEYK}0pvQMg$uk}Cj3)y?W+^i*=wJ}UNdl=J?tz)CJNKm6hL^beHKmoYH)qbWLZ z$b~VG2kn6}GCZR3Ur}Kg1Et%ff}Zv#EA^)~HTJyZN0{K&?o@;Du&*)iY!ovh+1F+`c5NVBZ-(W|@Ai`mz~+B5G>ps&<|XegD<^ z@L}hIe!wJ%TtD7TjMsvMs|cDDXYZ;I&aR~+5B!t`8y47j^?8aQO!V0)riUd7M!6ON z4SiDeVvE8j0i9tV&>1nbyboqH1fW}iK~NSf8!=KQd=la4!uuF=ZzZSc@ghYc%4gX0 zxVuX}=aL4Oe8MFkIS5;KH!f$LJ+b-l9`!%|`Y|;(%9;#NTYus<9*I#irCkMkluTz$ z(mVH7Q){IKq)c7(X0Q>AR>6P?cK1+%Lw)8?J9Zmp0kcWg9_Rh_8W`%OKMitO$iw1-)DB5CX(k<3o!-q8IdyrEmOf_w!p+ps zt_H^P+BZAXmdW9rPJns@9dWT<>@&#+3(fGxJ%^Soq)?LO>r(1p675`CW;~UFT0y9# zP&TV6;3{VhoBCZ8#CsRrl$o7LMyMG;++ZQC100u#JzaupHpuaNv3r*|uB~A_a~NH@ zSO+j=8%nb$HmJUHzZbi9UMV$PTZDTH?CeB$<*A!Lncc!&j z*k%2s0hhcjSz)O^gGBcmefefzKEX)0$YY+S^{uvcr7PWNUmV}B?^Z);w*gobFHo%9 zw&@Sn^h*sZp-Y)B$57=&gF&U#aLBlsqs!pg*n;KLoVe6{N8b&)-=lUlf&sbvGzj;- z>*t6K(Am~>c)0f&K50Fyj`hlQ`(g~QyHb_~R;Q(l+?Na(XU>=Bl_IJu!Bv0i*FE!V z1%9{rwwig}2vu7mYpV&HnSQD|)KwjA+s6d$@C59%bg_S>`yzkeT_Y8{44w@eF;`87 zyTVd79+le6QGw(jFluMo-ZPRF25ytH#Sp$L{wn)=>pPsHyvv_d#$Q$e-d{ z?BCqw52%9PGC$mQ!$gNcbq!dIcu;mz$n^%@9Vatc9!LNVP;yAXUGwF=#a$sT_PyDyv|mnom$i-G!#> zt*M`CJ*gbx&4hcS0nF2nj%PGBlczopyBAOdc~3wA~5U_60| zXBRd9Gqq{eBA^2%M`Ii6$}^hn_(UGDjpU|vjf$J?|DKJ=zipL)8cpzy4Ut8)HUV3} z>#&KAJrRQVKeE0+m4-}Ym0;+$ha!Na#fS~O8-t?c9Bym14#eflW@uwp+8VOFdGb0nYV zd(OzA8)v+(jV3+5Nx?U%Az<$oeSpwYumzH2HKM%pCsHJF{e}MjJxN3?*I__FYd%2Z zxxk`2GO~5}icym4;xI%jQdwM_E{5uo;n)jD-U#b9U;f9}L+q{K|-7$AlYEt#`_yH7^=YXHq34<-t ze!f&8=cvp>t_kqAZG~)S<%`-#GX+k(L5GCHi-k714behC}jPc)L+^9OjDT{b{6-C?918bN!$muMWeHrC}!H-SW`!>Ey zB<rn|WbFMHXgwDJDq`Xl)r~&?6z3*Dzzh#+Y5{KvpcF`~YVkWf7K9E1lYNu( z2|g0TRjjLyk{H5QQ#5}AS_(&%B>qNa;D+UCYxRFs{}!F~E+hV_E_q_M{W@+RSaBsY zLb9Z&gejdLH^VrM_~kY_|I_i1bnTd*wgBi3`sonr>+5MdxNGf z3NkXRydKK5%ck1E%=LS~H_3ap`KRsm(MT+Z9{K2igTr`X3FZC-hGT1SGEtUETZd&K z>}K-Rdz_?MOf893nmjY~PKK_%NfyfQW8~^*3{5xunxb8zF#?wP%E#2u6M-y10^I1( zH$YN-3Nlc0lzrXlHPBN7b%Sn0)$k#I=;_ubT0(EOFL`cfOzzSnC(;^9Fs0GsBk=*2 zLo`ZL9BmpM0`wM@7(vkw2|8uQr&j+mW;$~8d0(?KEy1pH!1iFb(?Go=|Lk ziefeLclkVY2Sn$ABeFN%yHrFLbQ(NOAIh2IT6cmf(w>jnM^`j{>SR@xXawY%gG9hS z_X3otTgYgQnXvEY9QWF(D|MfC#l`9SwBO{{Hty3lY5aDd_B5`wDxM(r7x9afmVJsW z$>q|Y*h(lU>$T zc@FvsNZzOzUTNr+W9C{`M+@wUM&&nJ`&9r@O^>i#UV2JLq}9Z>wGDp_aFix^-W9|% zdS9W`Epx5N#z*tnTvC6XwOtGvmjc_g6B80dFH8kRF3+glMx4&k4?r4CXu_kl&CfM&K z8VvYb;5k$IGV7F$lMqZyei_x9u zekwEF6SO?iTJCmuxSxu*q=hSlHaF7|x?2!qGVAk_uGYccdh}VzXkLQdddNPY$20Zz zWP3Tf0+~<7@2&~&PHq;G@Fr`>a#u|0%tu&MLpbS?tq#W3qtjc{3^||{za<8w?Qx<3CRQ{I5mFQS1F~N{t`b3E0HsJrP0vCWW|r2VCggy*Z*t zr?Yz&aqG1T`Zi{h9$|WH&E_c`eb3t^yePjk?Ur+yW6hDbHHR8?s8M^q7`p{#Vx{Sc zNzXqaCnkzlxD0HvDrTQy7ACo$724XD18e#(SgG~DkMDn;^?&I0^#7Z~5TKv!MgN0$yiEV6*Y^LT#_{`~ z`gw~fkN>@{4hce(pXt7X(~vKTE%8FZ?w#zW0vKkjn}>Di<%?V54#s5;%O)PUd5N%L z6VTY7iVoNby<|li{qhN}v|!iU)sHgPp`^mWiT*VO9_CX#tfk*xY5qmIV}+;ZTXa87 ztHZVRKSq6)HS<82^-{akH9F;ZwL(Ziml5g>1K`%CVdZ4Abrh7lGrV1LuB83^Y#w`O zih<;W70%WQ`07f_Irx}WXD;J;Ka?^8eTeDMv8P9%l~t;VWFD0X3gOqv}Z^7n!~E6bTK zIrl|Q8hw06cLOP>jj6^@SaDy6Swi@2g|l5@Cxub&m-;|uJ!MgUlOVfn<(nyF4tcZr zVxP?s#U+}?N{z3cqoWZ^2Ka%n=}kVxe*F-Ut?2`X^~A~?Xq+$V)9g&L(X~t2*8g2J zxFgix_V>;{FXU_Ef!?1>lO$7d9~yL?p2k@)7Z5pVkKX%>u||oMnbDGi7emaK-0({M zZk8@+EUE}i_;|78u0;bgBiJcfM9#eVRE?%+pP#vJezvM^-llIr=wiIWb`yv5#f64h zIdf;HXWG3DVp2&5n! z=O9Q3@&>^g#1I_QjEUhmTlIzL^*g|=3z!XKT~Ve+f2V%F$?>ag8}gf}RKN%`^S$?Z z3as2dEw=Ysah=$fU7?9>@!_!;3X5K|*q(G&T5L~EiES*n`3Fsez%+<5B_ecfi3sOP zf=NuI{6B6+%I~P&5v^w$s66T@S4Xe0??bkRPV7T6g^m2g$nkb7d#i$fIuEJrU6VCi z?&>+2#}54Zr%nnnfHv0?UzP|K9U$FC+@J0Bt@F3f-<*GGOEtsk*~8YUF4iW1jcz#9 zX6ZKw`El<<-r@M&E`H}_ulOg^bB1T^`eR5UR) z3JB{)fgSMgP)vqG1ADcHeJ)fz3Lm~GJkirg6K~VO>Yhw9sb#Vu)1pkY>tfNbKe}|L zlu3-}B}!iXYkzcJO-XbL^HJr$Aoi zul^|KCGYT_JYA{uP4jr~mK|9D&vZXl{=%D>{7aSm#I?MpYCGOeb)227*Ct$Pig`IL zc42P{M^&r$3N7)|DAN=moA6Va=>4Rs#gT0k*?f6&L0{d1O}s888K_@mHdWWC%<5vp zgJv62b^805x*T<+)@!H*YZ1H65IY9gq%pP-V?mv{f+!qPTIU`TX#qQ{qEClD@{A^z znpy%~o^l2w1I#q)lqa7t3Y4pKL%Pxpb(O5;4W1UM9-`^nAth7Oo{{58GX655R?X@b zAD*F@+rkY6=|OS13!;==$_8w|afbP&kBm*vk?6+I_0mONF!yYRpXuj){&|-O(k)eE zSG+vCVWJwD=5%{CwDU~dSj<$uW-V*v-N* zhARyN6j72zenRxcdpE(xFo>!5euswAUq09%|h4^OC1FcNHaxr4f~(kxP_kF}rleY}5EA47r-ioC(ZoJPzwCkH!sz; zNyCIB&7?$HEH9)ipA5T{Z-bMq8muOAA$IS7x-WOyTZfvbsx9@^R&I^KC2}dasi~hq zwMKgsUfr6AofpT2YYJ2)5Fsy=p+^&M;Kr^t5R;<6evzWbO`Ow9N`6TFq{v^2lL*KOCLj+hz*NpWUmV?nprXLVWS~vEwfVBz#Kqx&hqhD@ z^z(U`v@-d4{76?{Xoxz77E%)FH)w8DTE5TXweGFA8#QHb)Ret3dXOWtdh2Z-vCJDi zwJ%!Ee7EF8L*)*V=ypYCy(~Ii2{C8h1caX|L45j@L=g2#HAzIBAZ7}Np%ca9e1FmI zqqpkpF`Lo_(M*%_1O4eI! zK8RXB^D1u(|M!C4d_7WqT8*G*RP>|-JywTJU!drs8rer2Pq!6krt$?GDGcci)qhq_ zHJ>WzN2<=VY*xnjV6tl!uW~uwSLKuZ6FtaPn#%Y2z~89#!*P&|`LsRdPhx*NAqo^F z)D$w^A=BeB&gO)|wvfqLrflH?3IqWpAgrzDi$Ut@R#>6akCmGfb>(9Aq=yJJ!|zh0>0iQs+fjxI6`+OVpz-UTCVc+n08yOD)FgWV*c4 z>9TIXCc6BmH#rphqlXT5E3_U?B@|%X>dIb>voei;`lIFb52GEkwhsT&OUVAtnBGM8 z$B_T4B?zPRJEglx7{M0?_lG|lD}|>HezEkn*B74cW4;#AH+p`53vmi znFMDs5$Yxsj#GoZ$&Rg%%tyXKw8y@pqV@Sd?5|a96H2eCzuWhT z`%Cy$UNpT`-hi#|u4q867H+Wn7RBY$?J`B#r+7U&0IffHKz$*P&UDD?6`2E2TU`3P z{OycbZ`ZxiDMj=+f^CdzF~;QtXoZ7mKsA}@&+6o0=7*-fb=89Hugp|_vwbM_B16kz zSJ_&w4|&F;a(Tl`l$JB?mj(A$;)k9$MEjiWd|M<(Hk7(K)Aq&AFUAp5Te-KB_=J7V zySK~$IncmV@#$t6EZ0Tw4Yk(MfOH!HXqMM?1k0B*bINi6{Y1Hwp3~m0D_|kjMyJ^f zhC4Eh<;?kgDN^zY2qUGQYqC)rb!#x{NV#BsJt+s&8f4u(?nT*_UperT zPHW%wVkYt#soy*D`$zcyVqvFP2VbN7f29m+w@?vRWcaW|gWfVdgaukGeltWG$}6vThA{}$~ce@yW{yYn-8)%ysiUBjx^+%s^~s&~u$ zK+|BrWEr+Qy`HQhgfMMT8kVG(h04(hO^ZB>XMuFbwiLhB|0DS_V zh%GzV&5D@&_xTo2(Q3DxnUsRvX{ZVI&)e&@aKvDvN@>`qu+BZq!EVty_d7fk-Y3+r za|Z+&L0Co_*10P}o;{td$_QsO+EYdUt*Ok`x+;2|issc6{rz(kW&F}MR^9S#Db?-# zx2ntOaS#Pz{VCrU@~E!LCE*1D1P%?$t9B zG5Zq5v6!KHR?SLK4uJrbK~ny+{7}f3Gb3q}8C2KWpm1sZoJ;w$F-K%cp z1f5)t3I65JLfwmC3$Fb^3KMK`&ot^Q^lVq+0!j4`spxL52vypM5=1v`zz@5q?!HfX z_VhvLoSb5kuwl@;U+xYz;+$v_)WD@o`cqyCr9auHA*I;o*f|-tg4j7Z(%Xlq$A9wN zrpDZBY5MYBepdYjZ<*Iz;b&DaSfcLv6E*{ub9vb|{i%F~%bLMgeUUzo$n5utL}YSK zWaiDO6&WpI@DNzBa5BP6O2<)&r04*DEGgy8FMK>K4>fJlZ;1Bt5SyI~2{7}GSTA{q zin?VSNQ=6C3k=OxSkw(n!=zCV>I|ok6c$;&Kjh1q%Wq5B3f^pDOet9E1DHsj>eox& z5Sr_V>Lv|sBYz_|K_WBWLs)rAz0Bm*Z@W00^D;C2 z$V6s#u9cZ5Kbk=FGV|QY^$=l(J9-cU)%5ktBMhodUqNha`a(r=L2M*08fh#l5W!PvwHu^ANHg=>aLyx3^k z_|+Ao#O6K~{Yf(kSgbc}7W;KZUG%*UYIOgf5VNn>FX&V9hV%%ot-sE05I!6FB{#+8 z?qo3{r|E_Gugo)K$ZX9|v#6E(X1&qC?qD?gIu?^v8-^xOoa)nZRWq%c=T4hO(s-C9 z(+*I=G5T)RhcrEwGPfv&B?TJkPXl+)Y8S&y&VE;Ksy@mP{&kY0fWKDE^dc5FslhVCU*gw{`Q?iZ zjBoPvXj->Z5F3KTgrPr}b8sKbH3@#Ham8VJTk_OvPG>V!oKdMVAn%(X;gPCNyGB*l zO}%DUSGDL@ok=xApqRIjt5l?0rWDRKfu#PFZ%*a2Ay0=ZG!VLTp1_UH697hs%8`an zOK)^8HYDmYfHZUud?d})c6Lq!k%fcF97I-3v>T1q;D%`{Q4rHWSogbctX+50al1z- zZ)tdbqu)kdTzg+1pc<@~FL<6Xk*J1;)M7)hFeai9T{cU{XNkgcKK3O3KT$tUwB5M- zt;M2v?@>gPTO>l}%jZqxy>wHrKbs%6U@0HZF14eqMrYk{wW7@$@va7IH05MIw6T_$ z$PsJtKh`$QE@i%V=pGZ^CC7d(s6(ydWL|nPcWslC00$^HNGVWMeEf9{g6P zgts7^4ALoK^0Cm3sgUkr9Ni5c3w7?Kw7MWVYh#!F&$np0>o4#_di^#BvfQ}tQcYof zDtB~ronw2aoq*9TPka03U8&ICTAH@hKyWV9i&68ckoumnU z$G3}!0bF>S0`s8}qi=*BOO1JhxkP3`Xz8Yo!1k+vOgZy|4|=n8;iV}G4f2@&%8f(p zBISz+p9=#y9E{xPgwu_sPB)6}=yJZf)cE)zqC|Ux`rG8XDRy|Hm0+tLO4Gh=b(b`N zmPRd!5PE$ouz?R9UpsJ{L>8Jd#)B_4UL-Iew2bzgQH@9lhn{UC)enJkq>{7@sFq|< zmV%BZM6Z9+P3n50!=}08dpAz(qXkd3{_Iog=TWzE(b3lBpWx8nZOKYzDZicI6?a2? zbs4;`vnQLkqEc*XPq742?CG%RPnafxI`igB`@=nFNlqVW%sTki5gpoEn%4gRj15d&4cd z`Bcdb)ie;o4wel-Mp5X>Yj6VMGz=xe& zyHh^SpARpVxzWL8@)Rr?|ExIIB0Xx24x8)zd4DRV0rVi_(dYP4hbcdL=o+`}j4AT# z!*b^Fr~Mpo)rV3RP6luh2J+1>xU*y> zKV-_<9K2$m3ILoUj9UZhpj&^9tbS3yO4GhZWwpg)H1>*r~Z*wQAj&Chx z&bIdFwMk4C`^Kl+G?MTppn$1s_Y+BATXU9P68=Rdzbv$ZTtF1Qs^U}#uAmJC^YC-!}5IGdQLPgF(`4+robt6cWNLE%k&FMD;QdQ6qe>vJI+nrexO%sX3JJb(PG#Q@hs_04)EUM{*<>}6`!{+*!X-?%HpWLx*pWC za;Cw14w~p4Xi<3G+v_Qu_uaM|I;`nw?kRla{t1N}=_yU&(H7^Xlf1=w>rwT6wD~@A zb$!U<3}>wqvp8R72-b;rCJYzP#tsb+Qgo8?pXIwkK1Kh09UIG;A6=QYI8AB`PYoVC z6+FG_7HRI2-RpdCqDOA+(#*z~F42RO3~? zJ>*N7?GM-Lx3R6F)o)PFa^~-=(_DR%+QChO1vdptpQI9;^gJ>juI_w>xLUchW}4XH zV&(+xMJ0=^e{l4@qG&5Y#CQevdlh!tYAVbyzf@7g{#9jNP5C`4|CmJuc^3xyqsifh z1E3TWgubQpG#FHFkN3DVHC?SX>$J6GJ!%>FaTQ$>7pc}<7401ti8UvyXiytVtp6Ub zS^r(alleTU{4{PMAbY6A$y(#YgPW|PU)w=Fzl>YBMytEk(Ls-}AbgQicy|6M6_1`h zeX|cnXQ1@L4QBX?%cmE_5Eg?<2{f-Dfgx_XT{Pi`5Mjc#`LmGY&b^Tm*~OQxVA|vS zjs3>PCilV?Jm*;55bgTP3wAGTowN5by!yqQ7Jo==7jJr-HIaXgPW6qW8VMOYy1xiO zTHSXWe(80n`~s~Kt#Z7&Y){4@BM@S3xDVhmAh4Jg=Rw3V#J9GnSW#pwMpk%ro1+rq zipMB(7{SHkRI5j|s9<{#tY7u;7#_}2<~TA(S1lqr%Yu-%!5xTp{>ffl#6&1`Mz3EPg+v>gGFTGKp( z+R2*4Ynr%jmx6LI#}?nE#&vsHy8@I`6zC@3&Z1)gNHKU0y-h4l`wweyUbhw)dX0yA zIo`ibBe2Y>G7~$O@OUU1u8fH`;-dULD5J?z8K4P-jPwt}bq(KjdPn5;K13)l2f zxVqY3xiB`|vTVm(h#5N|E|PgXNJT3xa3-@YySj&pF0Uz?tfEX@Bv{X1K+!F+U01`W zRP_G1NZ=n<(e5fLH(vj%wDsLZ^U5%jgExW``=h6}zA$PGl^Im&k5-TID7xceY;Tci zB0g`L*k3!p|G4Ni&VBfNIX+Y0h2TF}kUzkGM&K^#ul5D~&Wy+@4#aCA$C7v*-R8AF z`r4xm6{feSsd+*IZkj!D7=^Sju$e)&8Z(tcjiJu z&_AArZi_7sOCqz%4@v;T4JVpF>&MPy- zi%RtH&miw@v7RUPy-aYLnZdc(=P7c)c@Oz~xY&K>`}vfyh>-fzxEeGlpKl8JQsz;{ z=xx67f{%4GjLdz$*dLHUW*J38bocdosx4LY2ZgB%Wzo%ub>g~=LN}DljnbbCsn&EN z)n>}_#VKAI&ueinKL%{r{}A=)2m|jUR6G$N0T~f6ew(oH+m(lUi+$LZaILTJ(oh~c zovj&~)&>P=^29`~^#NTCDdZu&%GK+j>XkEhw}(Y>=Ff*{J4vT(dgKY*b@uI|3ff{kvP7W!>=>_QOlGVPnCg+2VU^Rf-rC z0HZ&R)Ah_;1O53~uwt1y+Y)^$<7!zkH0u%;29`k>SbJk>Lj%?LV9nGY%$~TjXxr(m zCpZjvfSvvop&fc+U>bxCU+SU$3!0fL(peL0Mu>3mB)X$iA zphq_-bvjp-52V+&vM>wM;m;LR=tW`TlfCXz&PDMCfTyV+ZU8f^D~*y{obRx z@ABPu*LUAq%6!&!Z|nI>fNR~iNnOUJ{V}QTr-ad;_-;@9efF&%eTVP9v%dQr=Ph@z z(Gy>qdd)hXTlabXEobJx(?OJANqXHh`;$@N^B#PAJ^1!gX25~(5O{TO;N={#e|<^- zKL?GlDg2pz>QQg=uyggWJ4>0_4tAGd`ww&$Pw4_ShQ{Q}dRye8s%TjUWWxlQ#&w1~ zbxn=Sjn_O{J3ZaDAU!=zQ$qx|U9`u)6)=Tt1*kq`d;To9tDloK!DDsGE=OU|hEuy! zC3H6%^l%0xka6;vZRD_Y?_jHyuQmQz``Pp*j}Jg1^B$I$`Vghy5MMv5x` zVOWQd@Q+l!7;mFetSP@$h$c+Ml2UPuC*2}kN4QNF?5?YK zX<_aXFw~#S=|C#KER|mo@}Q*p;>-%QVgG4n5XP{ik+-z&4fXQaVhrR!kW$1!&Ak!5 z`*n#CeT8C%5{|JP=yPujuGovCfH!;K**f4dlIJ?;W+bl*(3_pG8xmgF+cYj{ zkR#P_mCuKKIWzUE5^4ktf;a51=SZKmVdhmE4NCRRg|YeHq&xccJ6TLNZ-wppSt&ze`6}>Exo6bM|QU5jpyiK*gq2T{}2>wTZAFyF< zk-r|An73sqdvQuR89FF(qU2^z5UpYThR&U&MrZfH)_vYf#~Cos$XpsNCCx3m*7z`= zH?zD>7@0UELC7;XbZVF(s)G zAv8?0O(5#L!F>4EN0#9JIa1aZDQjzRaYO)hqX6wWR5@Fqgo8lofhra(4eL?=+gz;c z3>jZSi$33Cz_(atsVsz5KZojmg$Ran*cjys>gZ4Tl`d;mNaYf1i)opW3CnqJ20&f) zH7M#xf0ISm2oLDYfJPx-$~5nRI+q(y{zdKFalrS|bH_nyhhD9>bm{aFOZl{&QvB?! z4ui1_*LL52Z+FXZ^%b4*PA$Vl%CjwW-Q@)rkLyojyRj&djG50m$%w9`wOZ*M__@|n zZ7jeX8Gt(rw@O1R(df1K^>}(RUfN-AAPMZlCs;pzHp5cX?66gyV1Mru>DDl zFIoRve7B-e^=|0Wx~Vf?);}GSCQUn|!^_vX86&I8 z$Q$tr4S}guo7zyY!)%(ZW3+CGE_uk!zb@bD_poa|HSoFXiHN^JlK6%UwH<-+QhdwPmC7ZuCg-gGxzBH8;ZeaJX-fOtG&iLs zQ4%MGLEn=pjYC||Y~39^2mr9z^(^L8DiIEGsh6N65)EM^Q^J3imsPZUIrE(}Qj<=j zo?{ctYNFw4Bjqp{@uE}g%|;g;;m%NHR_*GR=LHXZkW_!_G*)r)4eHUCH~D;Y$T14u z$f@#H7qM&5kD%-OjCv;&KIt;Uhb?7pwiIQkNBm~1#b9-_%oEDd}aUFD_u0JraC9M7@N{Ho^&k<2-q z2+fqkOULZ|GHSPVL90}5^5J25X>&%e`vR-wZD`?)>aOO~2W%D}$JWe{iMRE}oM`D% zPtm%wM)%Q-YfNKg7U~zK20r7Si;P%_(cpn>?aHd*8)p+dU3yWQRf$|Oyu2bnK+?>f) zckTYUfd}^y!J~b%Z=bc)2TZN|n;C8Jon5(%?|pXMRtuoSuk8ADVxb}rXNlmKGySc> z$?zMS7RUMOl=^jZgGZxDDWq0&zi$4_OWw&KjI)Wy5=?*nW7AOybVmq{x0V{OwRT*J!?jw?Q=!$~#=r2`h+`%2MR*~n%SiG6EWaY;OPM7* z+SL5eV0vmUXBO71Ke!iccpEHYSAwP3mEhE`KW>?kT7Rs2yXI?$l=P3agH4*2HtWeoyxaD!l(G6~{VEMcZjQx{T?ldX2H^kZ=R} zONUFW^cpViWA=m3qU}qWV_(FcLHwf_3~MC>xA(z~DdD~2F(^>zpU+oERCvChC|a zY*r?^;j3Y11x@YKBV@(;;Oy83)kpcfmTT56kUSNS_fnS8`n$U>nJ+@#XvZ8+ejzsSde*JcrN6Q` z%wxAR|MSJ4ZOs3(rw_Qve}A{w88KX!JEOeDRa zyUZ}V6_HuU9?Cf!|0Z8vi&dBwA7^EwsUTTdNsoo?fFF%|5WL!}d~iz>40F3f+-4l| zu2l${*aAgsqQ9E=WB#Sq!kGRvQ5Z@&v-)`?NA&pSyX}zbo%Xwi5bJ*w2=TFDM~K6b zA4dp-2hoklfC4BYdKhz7(;su7EzJGe1I$)v;5c0?Ee&2xSpT@Y zJW`8xoLwNshBCq4EEOoO0zzd=(AJc67+rFBb% zIADIh;$cK}V>5j4zDJIOMZC=ad`A#B4DYSf*2dp3Pi58ArGo@pj`c#!MP`0*(^it) zAANPbbI?uv7p@thL%p{m)i-AYgau2EcI1cTWJWa?h%>+#Fkx%31RE$`{f2dR6R?*8h6+ z2r45~?T>yu#v=}_&zAw;(jR?ejK|TQ51U1~`c^E;kLy!J{Pms4oS{HgPFuK6GfkJvY*e z<@l-gX~$iQ{eh`tnJ$4&{W`D~x$o3tw}3m*aIi_KROfN?Od@G>LW`?+B5>yiAp; zj(d=Yi3;XdM`q2S@r)W!d&Z!aX;52-BuN5wclDpM4rN#86QGc4k*Qorfoo*DK6(F> zp?H2UB=Ltvc1mqTW5#w23O<+(DTRk4mU^PnW>~+&3oQPNA2uHU0t=%&ja*|NqF?oU z)mJAD_aC++2%br72N-`~vhlX^J#-~sl*no7J^5|S&R^!O5KV89R2@Na?MXjsWuq_6 z8uP6XMgb_JkylW4fyI7GWyovtn=a5o`L!>CcMw0y|Sww&*kynVWg0D06<>< z^Ofh(+gTS-<83Jb#EFf=tXX9%>>I9j+qs>lP`vUZ)AnlN-*V_qt1r-ZISLUNG4dK$ z=I_{0I&xlh_X%_04O~G6^Tk=>3geB0=Ksgso5$BxRsH{I=!G!E252E7Xpka7Q34L6 zQXW&S4;Sg9VGsfo34$1e+V>Yp=bgz4qGs>;qxf+cQSAE)JU?mxoXe z@8p|k1Km{Bh=YF^8{Yk4}$`uTxm<}WtVX3%! z?+R!~S)jijKr5@N5;H{b~(cOz0w88282I zX2eBVKQPU8p^f~=V(xc@-3$eKG#HpjgJCWv-8LuZ{VH8`FwMwQX=UbkpH#ayTub4e zlZsO3K`&3>0y9!5BRv_@^~tZ@^?uJ~y6zU{+T_rs>kSp%3!28@M~w*X8wtG*jneM) z?WA}8Nea6%>F!LrC#I1?)wd}M5?#Jm6qOhz(X#)Pf7MFiGQo!x%k@MGyF$R?{^u%E zxCL-CQaGa}g4QGr$s3XjU#f*W6yPq&!d0l^Ob2YCif>bBfNkZ;+!{r&P9tH|GHX!; zn_{|{o86ibL6!<&UWtpSjSjDe_%hRWZxq+iU$Bzm71&`9l9!*( z$c*-GSBnIUqqcB-dVDyoaC8GjV z1VtEueqyOlqNdr-6RuqM(L#cqEW@$Xe=jOmPO5Mh+;Gn&m>L#VQ@xFyYMb-p(|+ z=jStSYQK^nT%nIHuGsLt{J`i0`%q{MGKBE{X4q=hlK$OVhEO{7*QiGkB`m$oDKNIy zTerC{yt%?wH@UvFk?FO{W7*p0Y`vmwT((wY;_DFUSq1@TYkm2PqPbxlF$GPg^?4p9 z8q3oWqi*17uk-Zhyx@^-;_$rRSLNw+Z4^pEN+LZw%{9qcoh&BmR zpX}BB;wHw^47T>s?-up5K+py;%h}sQ#@E8Cu=$|67HnmG`P6{+#DNVhd_7}Y zG5_Mg#);?Hrx8_|V2;`jtZG_G4Hj1Q223*f?QaRIHkTea=j8FFZTw1e#jjLkHEh zh2-k;Q=8lGZIQ{g_{>8xD0A0!i?D-BedCJxP~MrQv_78tlRWg0Hn%mOFUrDM)b)SN zAnDzJVs2WGYfv)uhD^x6pXMImUy}*&pLAQ;odU3G#Cdg?v^ti6?;p}qT}xB9SBMP^ zb6t@eH&bhb)D!{(Gpsh)UJS4qBv_tII6LEubV&hqh;`DuR_@ml4dE*(`(uqR zqExcC#2|*b8O)?ChK(>Vo4~rENjb^#&$|FK4@rI5mRn19^|suDxB9@5gOBpAEEbt6 zh?VAKofqT7A{ruXWpt|BelxVy5Kww%^Q*r=kD;!1kg-VV5rv2D@SX%Y&uo8mL?~ap zF<7*;?$w#PM^o1h0Imly835B=v~jV1Ly;lNuLwk*X{w`JB@3)ZSf0Wyt2u3i$dcwX z36a47rj?`=q`;a|u*g6_QPH+JdG>}E%@=5~C@2$W5P>Z;l_|X8GAiR>GCOybL^;H1 zGZG6!w9tCbaK*^mun-v=rb`Qcb+Y5?7pzAuuXGmjNYU>|>pnzh7^&>&CWmW-I2_Odb4XqSRf;vn?KB(#!t)7cK>>bXoJ+c zs)T5ld1@D`uf16#-&HNE2+*5qpzGquXMR(O2u+UQZ8`3Ph!ah(+Cqdro>+QI_s6s(+y>lu)%U9R=x=Gx ziij`OnZXPZ-u<&@yt>@Z2wP-`sABTc)>^8wVhnZH>Y2J#Y*p-#g-jvy$q6oeESSPZ zU5i4ZUDh%j!i2~@_FJnA{04SB-=LX`o~$0k?^b#7m`(X<53}#^2bJ2kl(wWStpBuC zkeePNd`Pr_!Wxt1>%&wiK;)&M0}6EEC}70}39VdYPtJ7c36&Qx9Q~=Sm-)1>-`>X8 zG7ep}rB(fU+H!bQDe4aM)I`l%#?KRNPyuMysUrci-{xY+RZ@tgP-(3d#`Uc#*$(ks zWz%-K6=T$jxu>^xX87CmX5b3DDP~_)k2VGpR7b5X;%a_J^0Bn?unGqJ1cs#}l9dH| zN#Wu0Rawx|_-&H4tyzs{x?j!4flMRA56i7qBXo>2xWN_!)*C&7A)mWygr7``r4Ht* z>?cspc|9SNr_!j3)a@i?eMVVe>UM3crCdH~jIdtDXDx!+4wkaMJS&*VArWC5Gg)6g z>EE)ErAPEu(nc7wN0T}ZMi0Rff?|((QVg=r-myxayusE6pY+EXf867bySQ|?^rzYr z5taGT&clC4^c$!;4-egK=eh&ei{&h0I0#Et&CuzE@SEwca%|zf;rqG`$?!7Yt#1dY zM96E8`SLXReW}>fg}Xpv!{R`{MfQxb;cEMG8JEfkv~U~*v9|@p>~|GnS8%q{^`kI-}V{>rLlNK2YwfEtH1Z@opk)pMAy1~{X?DA}dv_cm3(lb7bf#{Wj1-NmW!uQ+q+B46Bm zNfY(lbtc4vOWjq#xk>0wMyXly64EW1v~*ST2ccakwz=lnD$5$f4;&X)E;azP23!|_2(E>lh!UAYG`jzd5 zHPq9@V8)32QT;Byf1)_oBZ;yM3wFFyJr#2oZXagaScnaGQ+Bz}eA@5~F)YQ^FgHD7 zWlM77n|zJat~@3tyU1|-U2`9V^{w{&oVJ36)w4F6#J%7k^EQMDBa&RuyL7v(`Gt#h z$>Y4TAreKJ#7IyDZ|i6fIt_NU7N$J@OZfpD^5R0Ox6vcLb0NG?vePBij1p>!K*Hj63a;UIPL~j)}i5;-p9s5D9e8 z%smkX?kENQ;`Y2tDk*Km)iQB7_h2-3ICT-X&lN0QfJ+W6Joc?6HBnJ9Rxq{*( zeSEacK2+*op>5Zs*kiRw^je}Qi@-QK5VLz;-V&Nf;Vc{v|B`QwR(tZcAtqago_7QX z{!8~&9Qf}6RNV6Siva8HwUinp`zd8esRwB3V(zeQq}}wZ#Uslk8-(i0r1WXI-~ttA z4%wlWnK@lK*aSC^!q-afJRgpHKAk(n7a`L` zee)!mErBpM$owwoS9Za^uTh!LR%W@G<)`}(YEu0@WWcow9R35Lv-yL+`m`<4gsXq+OfitYuRkaFYH1 z6c-v!WqX@6GeJp4ZGy&Yk_RiBf{o}Gg_#MWZRr*vu!Xv@4M0W*a`O72kAHC0+g4J7 zV(!F-=q%ZUEmsJ0XsZBbVY5;M4#f+TgO+5`PUFnN7Kkx7incD;-WO?`d2ciXg%gl$ z7VS`~J6#gMs6kOi_83eXlrouYO71YPGNm^|pxKcEHCu?rNp|%w(nbZe9BqU6Wd z`!Uh6R#U=z#I{V1kCkR26^oKDk5e@{;|de+PoInM{DOJX3`&iBe^Y}SSO?;Bpc3|k zv8UA3sH7;$GG^E$;0%+nQie8Z68P_zUN-N!Ra|Nl71~v5go0#Fopu!(VVpflnnD7_E90{^y)mZOg~#=IQ&Vx@r1VG1U897=``kSDKaE z-Fc7NqQ&o*k}gX2U0Q9d-&FNGX%dP$)ftiFS;4P3Z))Xy!`~&cuYSHkD^UGucJ7F2 z;>Y14jpVrrY4}lsxH?qsXs||*P-eUct0X;P@->A5p2P zP2AGSzIw~%!^gQLZ4os)#XBvxCe7PGTc@88fz6%#8rWEmrbR@HJDpA6m4ac3zFi+IQ871tk8N$Z4aqk=tWiE2A$cyU zUq(J`K0nr&P^Ev!D4o|OKMC4llY(hXi>QK%h0{~-@8SE;E6nNZh6(f2ds4cc6{uB} zeP2%N_^0`Tl+=`+HL+Tv#QAY6^{8 z8XAj-_>q27OFsaN!ON`zN@+aWSnxD#&*i>8iC~Wvmn0S$W1jgqn~L!;vt;fSBXc&!~2@|B;=KQ zktN9*qW+X#;z^`G*2Fa(B~x@Wk-&PUMG(WxYF}PTKz>!60>T>$nv*}>=O)q&EBueE zSMN`Lg8E8~^21%Dw*->iRN1($ zw#rv3Rl+K>n0x1!!dA(9U-tHhtVO+e|LYEa|ErxY5zSz|ihT{f|2&$}#b!?JRxTO0 zs2Ap}Fy$&haLM>G5LD#gw}eZ8G`K(+F6~y=Lj;8>=XiB#v8rDZt1F|by2Mv28z)w{ znY`Uw_p3F#A^Ffcb2GV%f~2`uHs(3!xo5`!nGFOaOKgG)w*7K18aG1ZY>IUWWjhf0m3nI)MO$mnh%CDsLZ^h`PKtBM95#-{~m7<|47 z1#sm$_Wwz36TRXvQZPGI(aJsUxnwnglXSE)SwUE2y4f`-fqd&vK zl|Q9NJjrN1Uy{_5=`Yu>iezf@#d$hK-I zZOIvbaVJXj6J=JsZ9~}EFqTq>sbF3>L4`48qG%GBV(u^Vqh){lG+mM&`Gx2#w~n&< z{n%b2Q>>yT%Yc2yP@z;U(i61^fs;ze<(WEc>f>0_%$-!wKe=D|k7=s1Q>)6lMOmj+ zWnHbTKc~SR8S#shwJgn&-R@V`2~}CADQh=n6&oM?qAbjIHj^|YKb4Vx1fMa!C02`j za>nTx|LrPAk8BR8*ngXU-=RSdtYfa50~_#vZIPLW1fuJvKh#>j;?7aVU`Gp8riXVu zlMifA2`@kBtzaLj?I=vSMeQCsdyd3V4jr;aVWIH~ z@-=1BZC4Z1EMJ3Q3Bigo)Q~x1X4Wo&wcvVn3#HpniCA8fX)Eq^TZq1h58H0yV%6L8 z2%JQ*A$f^Y{^bHA`}hmlw^(Q9Aor2@y2&o5LDrweIkkqKzY^gF)*;bzgs1)knKs5Y zpwBfU)yM7NF1hkRxJ|2F-3NY1tF{#D%hO|n5LP#zLAA6o=l8W|!QD1R;MC8+s#d#Y z-2iKWY5L+lSlcnE^jlj;&%QF8Rg<4i6+a{3Wa=D7J*nE)mq68w|Nhq=|Mr>jgQmSq z_UeNk8E??5C;wZ6R@*UyE?C>@K^JrH+HPBfN!ojvNq9Q$eNJWEJ6FbCGv468LTv>! z;CFM?)Kkp;>u13&*yHc6IYR`K@*SZ~8pl9hJgieOoY(QnLYc64yw~wE{r+aX!U)PFVq75@`0^bqyF_-?qcqcUfMOZ}deVt6u#Y1>(U$!<@)LNsdP zRMxl0+DyJ~E1Uibx!>M9*<4lsCPWW%$(gqw*_<%X&Krqk4d^NijQi>o02JM%3oR%0 zr}X&CS+65nEukLZin;So7QUf?IVlt{QH}}}6Qw$kBorF2ywM~C%QtEML^=}(-1=4U zv-lFTq|~1s4PmeFvpqRTpeMZ~JT)3k-pE6t0}*7MY_-DK2szrdwK1Qa$Wlj#Bp5?$ z!HgqiRfF>_8%o-{3EeUTN26*Xt!fS*Ki&F?{m#OY;TM1rDw_OxJ21}hPjlQ_)#tru z9vL$}b0aeIJo3PjtC>40;yBIber^|7U;pk(u14R1RLjA)Amf7E!^=lg{T;l}B6u4?_B&W6I2hkp{-iQ*o~0?ZW3 z6t{wdzCB?Z-nJS-@N8)+=T7u9$pDS5xzI-o99^P#f)cxv_?QwWkg#)RA0uJM)Kb#^i2O~$aIy!Au4kNb}v;#K=d}OJ=8l;gQA4fi0iQ~!XQerlVW0I@i=_K;= zc7HVI-p{t`Mni%$cLX+md3~R=vVrx)v(^h5- zbGR*r5)g+$%{11)oY0|Ho1~Hp&U5-|jeVSv=0Ykb?dvKb4Q(26w(AbC2LnW=jvD$? zx*?_!8Rd%%{gj!=e0;r}%TT}xn(eo>pK7DAdp(V6o}Uy0UJqpgDcHR+E!4Gm_X6ft zC6Z@KT1>bqnXDY~CU3VswyQBEj{SPt>Q6mv@FY|Y2aYfoeTMoqe{s}R8{zM3a@5rz zU$9D!cb>iksWbLTx+|u~$9tbzyf1sB!w}y3t2Ke8uV@mq=~eFR^uJ*TH?a6%H~BP~ z!;O;bE|{m!?lo9UE%%3&>0DMz4JFVG;F=09SK9R~c4N%pE<+ z37|G2y4Q0W^eGQ`{XF?+=>;)e$W6U#vV{JlecAJjfUssrr<%!psEG-s#MC7@SwmQ{ zbO4K^Qd_!c5)In<#z5%?h0{~7V^3vW!CELe^;fU3D&m+`a@dJD7faJGy?cnP;@>gu zihpsKpGO`wENc9VAZ1ci-$Tunc2M<9e!nJm6T{0#K?@m)21GLuBkDnnUfI%Dv7Hj< zt|qmpfIwQ3?q@2WA3MO*ajj9uf&&)yuAIG*IZ;e_2{k;-v_2DNdamG0FNwBlh_ZR( z?EMz(3c1BxW219+nRS%TOu2p=kA_jqT@vDBN$(1`XG~9K9IM?Vd6antAaoq|*VoB< z9cwR0ODrTS_JVXV_n{bW1GluBWbzo;YYc^W)G@+tDKwtzuv_IQeVs}MJGi$D(#5h( z141m@c@nX*bVp2AkzL%vd$#R7#fKpk9#-_(VraZ_nPW7w#5I!tTI*Zq<9RI*FS&3% zVtF#2u1l)2zM!nXOQ%yT(y-G_U|PvGd0O{uMJC>3GI6&?2F^Xg*@UZCIQK~!q*Y_3 zVeMc=8cgq~-eJ;k#~)qKEtdZ7r5s-x3f2T^{rH_O4G_yTw%XUQwTz@e?<%jp zHb?{UsJ{h{*+(0QF9dM;qHUpwLR$yG6){^DM8Rf9Es{*k5QWnnu!({+A}b1v&_$tH z1Pj(LibCsuBnk!rW7T4$=W8Q+LPSI%`m@P9e?Z(R&66dAm7IQ~z?Yz|7l#!`izjfo9 zeWx{nm*2X*R_RtAS-wwpmavcN@d-kta`Hi(~31NNAke2%s^k|Q@B3&RL4^w(gKN! zy${pO1(B?8H^?&`Tsn2Vo~&>6LGvq)lS$5mIp^PTWY5d(jVj%l(`6tQ zhR>BCdio8D{WRB~+ICwVO*{PX2EHHRp!=QuR4z-ECU6OQ{Vmm!KKA1Ty;gBy`oapm%64b3J<}Uo zhs%>b+~(Nr)PfP`dFoH;&X`8#lrNcEqOxM{b5FaJ<%^Y08j=~yYejB@s?*F3kRM46 zBKLzUqsX0ofrKQAn|g?rZ!}<)@Dwt_YJE&2E^p7v!#8x8&w*%c_X2ZSIR6o9 z4^b##(Y%kn>2XO}t})V=N=;I**pd`%SGXD&?ANFg9j^_QN9@TFa?AI%i0Us0^%hxq zZtYFgl2T(6>9yY~vdd}>WgKlal9iOIcQbRPEmadfwDZ)T(j764q$pnmU#zlX?th-D zNQ!j^e7@IvQ>`nNs5&EDuP4Sy%_S+^YxMb{ASuIVpDRg;AK9}iVUAoDuo5+ejIbJx z>G37yA~w1F{fH2H3X(Ep7>G#{6P~3*(pgcsU-v9BLL6aJncWG-8)T#-$cQ$VHU3uP z`ogJgK}Op3WajAxyfNGh%oUHdeWB?x(k&SYpFFuvqvJ}jMKtxVo(vn*IaAjwM87^c z{!7tG;_6owaVVyy%6ns#LT<&4uO$`+1BS#DKP# zMl6&svMf*;?+5>`A{N$}iACLwwPLYW)e(zPJrN5v4`OlBcgGhCs}jUwv3doQA)Z1; z=_N5ezF3^MwjvgyHwL6lh+Db<|AJU_myW6ui;KC4Clw2KWC-eRfPk5x?q^i#cdXSb zCTF&?E+(tAo|Sv)qc~5=g2Qm5R{q1>sLc9(=F}zbJe@+25$DN?v(#M>oToLQ%jT(# zl;;GEI6QGXa_`qHTWEZzJ*G_6gP6LsNE9BjXRz?dX(zv_9&`ge$m@sKb~Ea7+9^2= z7mwayI^d)pk_{Ok-wHK z8}c;-uA14_++G0^9nl8v^r(dUeV_7*Ht}@>Y|DFtyaB5LP<6@08=trJ2vq`ei@DKz zYHOXItrcWdQj)jj-LSD56^_eB)hW$8 zW2edpor)@5(l{ZaKczJW{V6?cDNm2YbTQ1;H135c#oTezsR54!MV)g%M_0vcu%F>8 zKU|ZT==b0mu=AMa!fyX<=$+9Z+^(QR1Ua|C5o2-W!qV%)@?K&ZlWuZ-!IssR&(Ki2 z=$v}VZ4XxB5eE#cpTK!g(>RGyi=30NBF_&($;hA z3d;Q2q&5lWl+ zWb;Y2gf7DCPDrGnsH9tRgnmRnccGV1V_1EFjHFxT_S=TFr?m|WN_vkqrAU(YE_(*E zY|F<#1EaEh9O4(E##ok7Q-7viFKyEVs5+VaKS{?IKv>{Uu*+2pXR)sphegc>N4YSF@e8zPJRp?r9kw`Z6mti`{8A&SaJPhB?XGbBRsCtAtNur!=dzG^NY!#QCv>1z== zHu;7cY9(B}rgLJw@_@L3C;u#6SK-8s*BU3DJ)xQt7q(~D&U>mIa19py3YOd{!IAK` zNa&eW^{Mk)NBqMg>+4c|buj9Pb<`}4&4H;S0TLn9 zkw6CoPSejZaK6_tY!$E1HN75>Q4FALNzL~qI}odUTW%3 zBkhan;=J%-lrYl_Q!P6bO+A~>~D^3A))(bqkKzB0oGN3z&BE8AuAO1o=xMFiFhSw^%$Pl#>5jdY6M zq&c8tH2~aV=qyZw()OBPuB3*M()bQe=5FfhPo(LIX~?X64aweaptjiGYI(6N1U8^C zb)3e-ssNx7p8T`)nwT!+-g>ps__*2CG@iV7RugwuJBDen=v1&oW5KDV@qWDIBPN@} zl01C#IGWfTHSsDs52H8YO*Xi>Z-s10BRA^2Xuaq9)7(K+{H=Tc&9!+&4Gg)jX!B3f z+6F_nh?9GHnkyJb?Gs=eR0Tsf?iF%hXYQtd?oKXJhq^Z;MAm11qbuKX|dCr%NKbo=+~Em8UU-Z8oe%LSI7L4N31k!S>0fS%{&O% zm^p8 zzN&@lIqX;?MD-{iraV=7wU)~B1QkoKiRnV_fGbUwd%CJ+dGL4RnN_t@zk(%|AJ(%b zaQ$B^GID*!FD2K>E_r`f%&e-JM}U}QWxSvcyr8F!78;xLf*OpRk=$8EoM0b@izO9C zEDtTrUcrdvB7!lZl@=97DBl^OAiMrVHU&;&TEWzqRv^{VFvx=PuzDF8NccXG6h2{_ zwH5!m|MeAl^6VA9*0w2~MILXf2F#Y}2|3k1#Fq05LuiN%^V7F6#0F!0*{T^IY$)P` z0n&CxleP2hj6FiTxSiqc7^0>&agO0F}tcs ztraX7YA`hn{l*(>k!awOu{)Kt-kFh#AcR_B5BVwdYF^#|~Ul50Y;1=osO)QodbS5o<%WO^eb3W0l}$tBG%oOk)1c)8)e6qRHN!2>cwfwg`sdro?yd` zBkECyT$w$Za#r)=sn(*n+vkpOOVjN3iyEy|png0~*rr*6*=}>3x;C6Cs^!#zz^O%n znu`V5IQ3atR5+!4=hOzqtv}JVE}9n74Vkp|{HzWfRDI#LNNozaPeF6Q29tByNH95{ z{f?WQim%!iFzeS7daHeiM*sRNF&aH-{&J`#X2*>Rt40GDWgUjks@bR1zGLm&6J9p|brp zvHT&Tr52V0U9AQ!dP0j{dxpIaYjGwmDuTQK#9WZqQd55#>1a$Nu*#Rf_EY92M{Oig z5w_QeYqnU^Wv4sPv4^LC3VLr$7jmDy#AN6DMBwC}Mm<>doAFGJ!J=QmlI#dht?Zn; zJR>_xe-UM;TO(Lwc#m&#u39yo$*~s2-6k4(x`oMHrp=igyF zm(iC40QO{A?e^vu{ETcOGw_HJ>(6+UNhg`~`j{5)NQ*+fSei|XvzBJRRl(9UTvBUk z@&TbvJvlMd8_dk<0~Ir)C7u`@UvyNs9IM+Ww)jBg(@eJ(ZeSh&ZMAR%14_}&%?n4Q zqLZgkSGp^v3%Sm3n}p2$pK1xYreQqmVz8jCUS65~v1nct0CBeEJ z^F6wSZ}sJ!lb>+~H>eYdvL)BtRa%LyEdSXz(sW36#}Q)K_QA&VkZhf@p3-vf1N>LM zytG(nYkOJLu{iv0`CpaBzu_|C(gKdtde$u9tyC5tN8ePsggrU?@=)nnZPDG%W*w`^ zmnn)@JgWbTRR5vBM-ce0Nx!nbLRRVNzwuw59lcWLU-_?9KM&E*?O))(KR?ep^rCmO z4n3b#n7>G=D9;@o zGKy+hyB%P5QTeu-uP@&zmIPM~5TjnijV_0Q;iQ`;EP$N{-oDZ9%h880-e;R7I0rRt zWP{a~?#Juadok!KqUQeUJSZmzhiE(YhC? zNRxueP0x06RBGJ?m9>S;hV&_OD;HZUyWAp((!F7;+i8b_cksH!#_N71t+6Zein(`$ z-t$EpkA&u>i)-<)g*E0Qa}M+r$HEQ{Ud8AQi*RtTBWktH5y-$IDxfVU4~t{Em|JnD z%q>$TwzL7y%2*la6}6G}s=f%vlFK$&h}tK6{|xOd;Pc7cw5c?&QgbOcD?O%|8sjHd zp%~m_in>kKUhlUbc1zNb{EteW*0xew`Mt{e4p~Xvv33E@r}jrvo!<%?pLC{WCumX8>`ZMDD83IFQO*LLpNJBzxxhiT#GMdmOG z4RF;HyuO3Xbka-~t>jg}C(2JGtM>!L+WVcr?;O6gv5pyR4)iSQze4V;6cNL1SF%23 zKvA8hyZwc6)f`yWyt4ea91VThZ*y-xgw=KWRrl{vKecHSbZ|{*tG}x0q8O|) zSS(jrG557w-8klpF_9;8?D;~?YDV8q9g^_xR#>$*! zFzclb{|vLfm@ef0_d;_)UYS|#f?O~)>w>hZ9Y)JwaYjI}bZ$y;+-)Q}Moi@_Vk*D7 z-dzy&m2AZ>7l>g9JNaoe%$@o**AW@Eg058MPVWb;gIt0=;UrDT9#j6Phkd>2;R`qi z0G#4seA95sy;iInaRw)kkPB1IL=FjvpDpVwe~T|Ved;HovbOZGjS^SnLl>QaY)i8A z9$f&D8e7z_9oXjpyD+8uT)SAH5#WQlBgmrnFG*~dsS5z{jzr^uLL>V1$)D~J?_#u# z8s+~jZKWu8>NMR)jncy(Z+C^&N+qTpTzJjUD zuh{Hclsx&d>I>C=S@k=)^Q{c_^AM|oRAs!ynN$0HvMRejYo>2-sT({ds|`Y^@P0%? znuBc^B13;lFYzQ8SG+sz<`r{~-6T$j++yy~M>L+u2@GqrIHLiQY@vn}ZK0)+{Z5-^ z+S%uCv!QDq0sL?7$WD!@+`qCxt{uzDxM^)2ipFQYZ+TTl#CHgD@n|swM2Eb{WvrfnnHQ)X- zpJ9@TU#*=~OpBSb77HA9FMeV2(`Qv?l*=g-8R8n4Q(I1zWrl-KWRWVvw1SB<<@mrVi0&4ArIdgSvVjdQfuCaz2)N1Z3brp_&YSKLG7R>4~s6zR-NyA>K z#b4clt?0wQtN%xjLiifZCAzakM zQNWsu&`k(obsIx93iay=OIZ>qdP2(15mFLdov`{M_lMyfI%Fq8R!LPP3DYTVNlmUlV zHso-DadO6T(Xm z7~sC1Vjenn(b;KY;Cz&k=D%1QIvEdBD zB_exVC&u|Q+#e0nND5(Sb%BX2y4E_cwk!L5KjWvKuq=kkU>THp(+z%CH+p1J=hx*4e-mto zy1_uAF^t!=mhma;j(qbWvWp5J37B@s3EN;lbbc-7@f~t5TgO-3H@oGh> z0vqC+wtD3H+pArSv02qxRIN4n)Dz)`Ch19s5$?Gw+`p|5Zn+Vvvf}e?X=r@h#gfK( zwwGOK{L^W!WB(PlhjTN(B#%&{wHDdapVFf-O+#&bt5dN+b%aGjGW9XBz-wv%UXl$u zZANl!)PPK0IZ^&s*gSzM>>~>U$SH*t{C;~H+-QlWZRLZ;oy{k$8a#hU)Uf=c+(=T_IG<7dK7)^4GWfw1P;PCZtl1+d zZL3S7kHbJ38+|7n;f=%Vq5(h>}LKi=H_Q$I{^gy zBV%C8lt>KCn4{W;_WN53xf?%ic(>|`#w(~~utUTWPf|b8W)TXxZ{P`SEZr2-#oWyg z$%>*$xE>9YRSx^C4eU`HvjBQRY>Y}8u{_{=a#`n1?FQ)G)^|llCe2?M#Adv=cCauO~^tL1RIZoWua=P0WJ+wLe?ETdS+?RbHf!n{ji?@Q?>c2%quzAoiM zzivIDL^q?+pVB>TC3D;pZM?huz3kC2E(QUn>u51)n}g^@L}3sRf~% z37@Knn#zo24JHofWI#L05{Hg4phpA}&}*`wC2Cjo7;HrCZ0)NJ+U*Dh@Q$L81Olw* zsqu*b8)CYcJL8^=DC}U+=lMZZL_uvN3aVc#3j2IVetL=f%`?1veq7V?#q3RS#cc~t2L4| z#Iv+7@sr91!Rwd8txw3KPnB^?W&I;4;~E=UJX9Da7E``ZFsx^4GLlE9Wxs`*E8VI6 zKMq2o#o@@l%{G6d6-24h_N@>t`~|ZC3v9fh1;%Z$^%71AK}7sbMUE(05K0#52?hJ1 zi2jsbkV!Afq!-6DBBlDmAICiR_*E6YdynG#)t|2wsn*bEo1XAJuCBNH#H)(b+ze<( zS)dOc1G+hYZpng{(l0wXD*dGSQKX{crz`hn4TgcY@YEQUZjI?;?qrKw1d-Zaq4EM-k~1&etVmVAJ$3iBV?^qw%8DXY&0DZBr!>RVIR7LI52zNVConvv z)v`Xt#)iIZ$nbD=@KbFdN0DMg%QV8l&_Ob((>B0*cE%AOU=JBbyb?bs&YZfyo$pmT zaD(%0ZJE{dWc{dTGV6QtO9aqDGVTRv$rQg(!uweV+JPP4i(qY}?u)raTZOQLX5Xf_ z2quYUo|b5diB=_&PkhIh;3<$oxH1YaC|UC8cng54X@~_t0vwT|4l&XS&2OkLEHX<_ z=pRyXI>l=^7z;dXYZWK6c;95?kd_U}F%M?e19>U6bpZ|VSL}mfbC(DTnxz7bKl$cS z?r1jzpE<0sFi4J0gfZ!+Lk=@P_+UgZdYzJWyv|AU^-WMW8F5hkBQ^}JOYGIS-qHv_xe&ImMmCfG+1Py3;n~^LtHAyiwnb?3=4ZGH$q2Lx<$v> zs-Hrk9PCxMU+QajFRDn4fkGkZ!-0})tXggwb?TA>{`Ywc$b_kMV3?&!NE={})%TPa zSNJ{Yrhc)~oTV#CL|UdC+2f~KdfeUd0r*#;Tm1MFMmA;^I*tU->4U>|c;V1Wfid_8 z-y9>b%js5S2>&xT#+cizVP85+ne>7;4?g%=zMIn|X;0yXcZ0k1YV>`Eg_|NGm7&#_ zcOSpiIoAlA(zbFzHfq75J(wSv)yUmqhx$NE^YTJQ7I5l&xc`BIlS<|h-aV(!B{tpuUC5|3KCE%Pi}|HqbFyX!r^zl)oxsv){++wHg)No1nmnI z+KUAh`lBzCzI-ZiD|80AnFA?`{5R>Q+_hah)lHx9x%%=p3Q%_tpw6!(`x}z5U_mV^nm5Ut1f+@Ypte3>=ryw=pCJ6JLw6b&^ev7_Y0wa$pB|xqGD3gn6&dKZ_d6c+ zU+?S!;n3eF+^^!Q1X%;b_J>D1LH>~o6y7gFU-z91bhvA58-x3cTW6uaUCZ4u}j|1Fen53k!fxfNze-cv#OzySSC5&92L4Fs8eQ-<8H zDk@9Dy2qjKBj{_7N}2h@N1Y(oFj1Ke+BHJ|@GmmZxzXGS5~TZ|ld}XlNI*|IJeBSR z0jQ2T8_)+n9Zg(lAv=%Qg%hbl7IU59jXOu##O|Pq4S90_`soO?^r{Go}8~*4f#gHQMYDhw=KqWgx28LYS}m2bE`^@ zQ;FUAU2ObZRmlvMG<%!3SC#Cgk|7VGY+F^*sFMA>96wq9~`Rms*WxtzBYfcA1#$zQ%j$$nn)*Q%0VtK=45Z=lU# zRVBBo7-;i}s*x`)QenKl`r=4V@|w?@b?@~ z*XRC{Z#E(pRBzL`S~VmaT!#%#tRpZp2O19O)36(!e4f=s@^uYC-@g@Pu0A|)()>9V z)!)Oe6!!tujHh2HR)3!g%sa?6%-hUffrs_(@3P|5)g@;qZho8H{2HbfmcqPMSC{=y z{=2$5_;(2Z7VvLfnXH`v;wOPBDAwTjbsE@1!Rxs)2LnfYLWo5r*>;sOP;i;*T+8ut&nC20Fwd4nh6b>$eoXAfT!u2NmJ~gr$ z4<41*mw%e(*glq799g|_TzT^u*K3>*PP#V*okRIZxKjl{xNYOysWY_mdB~p2> zgDzPDO#388D2vD)PpgF3Q@T<%MM_T-4Sc~RiZP0vz%cED!@!qVp@)Ib9ZE4~e&07*E;dk6C_Fz@C(rH>s(29Y-oHziYo%s1N`X5k~1mGgdj z*Qoqc0V7Hrfh8@kK!%s9d03+l|2F?v-TwdM-+f>G&-wSsm;aCWSHboF8UB6rLbqA} z5&ydX^&0#;=X3wz+|U3QlVg7WZ_EwJNngqE&88PbH=PoG@e-)<&g!NbdHR8rq$>V~ zPDUO@m4{W>FI@?c1#J3g(k{MRj2U4(eiv zHYKM-a%)?KX`)-GGnWwf8yw-@q;<(e4d8t?MO1kdAdjV)qnV%oQWGYfmPxnQvhatR zAN*r}+P$BxFVD;uxBEuEIC&&L$g6%Up4y_oJKU3g{&d}$_2tR)>I*X)CW0G?3*^A6 zrj?f0P@R`-`DVo*g-CV({2!VNAnN1?Y0xO11a$bcE(9sIcZt@m@?(CShKJA-(@I1lLSaZpjiT6poT2L{*syc}G4#bA!$px&| z?@V?UinZ^n7Uxavfq%YbGfe>IuCs#{gG>Epn__t4`{_)N{^ZQ*@P!?8!>$}Ked}{_ zrQZ`RoIa7ntpv2D*OT}ub*E22JU=Y-=Y@NH;O9XEwHQtVL){KvO}i}YNuDQehF{(p zneU>Xd?Da4ca>0EIlX=ynCCj9Bg|fhd6vVpUz>$#mVn#i2&hlr;;dY0e>!rkeWVy> zTpox8K-bz?RYUqGq{|Gc+q*y6ySHDj(Y>Ur*Qi_NWk*WK{)edIcr78NJyqq%kIa?2 zgc}sJ5|dati1YmIU257$aE%UYw-5JXqjAAj!l+%;aM~JD+bXs9WBI|~ugDW-f6xM$u7!fQ`Sq_Sz=o{WFM_YA6{ath#c*D zX?GUw8fdp&22K;dCnt|N|C*_^YYP1PrFx=`rI$J8o&wk`8>df1bZ!EHYSF3wWa%(k`}=4D z#jm1Rr47W#rf-QH{|`E z%@Kc>1GZnA2fX$8fF~xuakCpSZgs%>IAHs=S-_<-6UFpKq(e8~Pv4frt%&;cZN~4f zAvvYGzZUOLH@-@u^lP*IP2YBWz)eYGHQ;6kysHDYUz-Iiqfy$P5bgBs#_ypexi0HA z%(GYCVeVw_q3N|zZ^RDtQmxt!badq(9F+;ms#NkB_DfPhV)2SLoma63srx_w9BA5iA^V?15 z_Z)vWo%8HkbZBKC8_HM?k_{rCmt=r-0BmLo?C@$}bt3h`sT0-Gj~Z=WW=e0Cj7~x{ z^{s>HuY(OEW6iNIvy7lS5-1#(ppO#RP6_I-Sb>Oc1+S3Rrn+le>Lz`27&i#06+=mK z19cg$n#AEI-)BAnYNXYAl`WjA^#cv;*JdSm`lQz!(1EyN;|{2ydO(SHy^hDfJ0LY- zKx&c>==aqF8dcfCsS3z5Ap5o10ilSW)tuAxn&X;HJZju=wXyGzVbog3;Bg-R?zq&1 zaj8i=~L(U8L+-luc?L*!K>ljINVTZlX zRo~B$Ie%VNMbyuC)7CA9JJEVe%4 zIeGb>GQOg>>ewnpoeYIcs}5;d{Dw>l`>jx!wuI%ro{IJ;ZRO%e@?mb%N;%93u}~~{ z9TW8zzrkT?T3UDR3@Tar5X-Vxht8KvE71LfBocgEpkj1<=)W67b#fFCx>-&Y#6~sA zbz69mv(UvRplUJLwEbpTIDJRN<}`-H;NWEspsRVw@=)(n`$q{zG}60h{Ps4`$UC8iYHJ-~HEbPmcc`m6DK8gUCsfyyW|1&TTb{A%`&@07vdZ62 zgqSx5fUylVdLZVU3^A8c1te56CFV}m#O#6ZbAtQ{i2*-gEG!KPb>dvtkV-9ZJ?&_- zRJTu`Bnu{4NMo))KJSk+{qeXxShSyX)|QYQKe(7{{)V3nXh=Th!H}E(!20^i_1Yk+ ztpAHM<9XBjgy*Zgj}OyC0R3qwLpmMA z2z}0G37O1RJ+UJ~_wy#Gw;6a8+p`hWG^^M#;gD%-Cw=W}R5e8_c5&CuF+>9=_7hCH ztFYUB`xBh_?b)4T$1GqCZg&^^d3RCcEWPcLZWZ1<#kUGAw&XK?jZ{>hEQPMayZfCFZc%PGThW(VEk!tN14*+l+p*2FsM^Ap(#GEO!fLlWKX^n_Vag=o z{?OS|za3nwYsJ#oOzPi*&zH%t^yPxv|nOz!dJ}*e+dyOC; z=ar8g8;@=`PQbag7_Qke;q#RhT?x@EYBZaRxGP;Lo~3vkj$91tB!|;$c~NzIRD#fA z9fWfyg^5!|2ePMnzcK8p*qr{V@SXJK`>8b+=MHb1!MQ%!W3xC*G}9QB?+7VM48hv- z)9xZpd;${m4K|Io7@R!;Y0K8`XkoIT1CQ6jTf9cY(Cl($%u3%vxV+D`F*4lWlRjW zzWkst<~VV5QusAbkv-fUDDnp5oxJgXsMLz}Ka zZ7tAK6&a7DTQY@tQ!+QPo}2k0Ay-7Gm6nPY)u5c*w6zJtn|==w?{!6W@voKte?TeZ ze?0mbHhB=xqQ5TLgHsT4) zSyKs1Ql%ndEmb0B_h@89Ot%%p<0ni_effgP$Cw1uf1h~Ay+0c!a7o3E)+$@Qd0_OFSltD<>+xHbTes<*zvQHeBWp z1GfD*z+M84!UX1(T&Wzm*z2Gj>aSGZG4Y^Ho0{qXthaK&(Z;iN>Fvl#rXM7KgF@@^ z^a<#tNQ?f~Pks4(K?r5giFaK-U6?U(V1pu}tS>WV^^_fq$2+h=LB<2C%C?|vYGKB9 z<6*W<=^`|ksKr7arLWR;`ER8GJ^oa_pj;|{q5N$5{L)Ne|G5$Xc$Ck!>!wPpX_4s% zg4dT1C`=gCe%L+#lomE1Kv>I^`UI%z%R3adF~a9cH{g4fR`Or@t>sqRXy=a0hNSK^ zj$xiec5-*UDcYU>SniJ>`{RfH*zvb0;rT>d!bCX!e5hLnSgQ2vflBtt%=J~NWKG0C zJdpZ@`&uVr$Ji1`ejxx1j1{Y$L^eGZd-AOn`kL!H$t#*0r~6iza&xDA+%tXO76IkF;!k{C&?OL9n-JnaSr!{` zjdJd)e$p$G5&^){Gw@6#O8qt^S|~S6n8o6zgYa)znG&_ezJ>X-MZ|0tG3|hNx+Y+^ z85&S3O4*UR?^qA`P+FN4rX0VgUS8vb9<^Ax*a`3%xWf6uc~hI_ZB@ukrveS%kA*sV zI6ts@y?R=&p4KPd;c%`_YetLFq-|UFm=~C*)udkAWv!d>1$EtV?t8q%lt(Q6OQjQd zxvu<+%3|p2pXT?Msn!>&C7V9(%cBMxK>4!dhP9CH)#uMiU;dJYH|CvABLigA=J%;n zHR3Kte27Lold+ofFKKFlB#j?Z1#A@VdshoDvg(r3!A_&e9H=80NGfGH@9f}Hz$Uo%aeO+YiJZWlAfW5_A@q9OSwu;X#k|F+|GyGr3JqYNXT zyK0ER@-lR#^SkS|sQds6omc?jGjpZ60L>Jw?r4)5W^#!5ED`M{OuBjNfv1=s^Ysqd za;d5F7YcZF5n132a`E#M^3xu;;8+hze2Aa~H?Zga>&=pd@RD=!T@RxPx^rl7yN4@i zO4&7-e4%xIw)o=(^Rsd~5`L+gVI|F3jILKg|RfflraGxIEcvm_-c1Awyt@RW?b$gwv zAJSl8FRfLMs70#y1y!8Ufbb{3SdjuI5+8>SVCwV9SyLumw{25!uB2m3S(+oB4%n3U zBvsV*8cU6=){WpLj@3FXJ|f;sCB=4`K;(kw-`t|}{RO>C#o>2}Ix>NyCC3up#yE$OV_W<~Sos#hnD?Kqrr zEMLX3tf&sEx{0c}gefJWk(B>gU;a2f3*_*fDM(gX86j|x^BUqyBivANToVl|OFx z$4<leb&qzpn7dHV-oQ%4 zz9U~e_7zSoQQcOJg_#eoSM_fBVm78 zL{F+>zs&=VHwAN;(>kZ$Sq9*quQvF0bzAJ zWZhb9JoQoOy-UzqlIf@VtOd4sg6>Cwqc^I)Ub12mRJV(t(^jy({*-hZ$JzUfH_5Pm z6EX&e+AJIT9cKwx0FLwC)oT3D%vzyfWF@A_UL)TDul zPk!|b_fb~QXjgV&%2TgbkH^sC*&h{{8FDQG^kDzNR-OAAdIhOLwo$Bqt?#v6E)yH1 z5xK9H#)@nGo)hpuzOSYo`Ax?6yeKjX0K2=XnVzSOoKs&uCX+ol1HEuf$q$OsbS%Ph z|0{P#y_yPCeBl)zWBGWyOwMHfOJ4Y!S(h*P;~9UP=8seS@xc9hY(C*?bksW;~jugM{ittw}dCk)A>XgkXwRL)7V{ zRdS`L8yKN&KCue4$Z_XjzC(ccm1R1@t|eQmvzst;Fux#LXSoV17EbM=B^L^0e1&BCizd=(1^k}K9|G=q@Obx4bVEE31>Pr*qY_ZR8 z`a&h+f=o5YnH-)?_Jj~y-;z#Sl7DI;!A4`m;#7_o;X!5RR{6b zhU84PW0f7{OKRS3%MA%x+CYhb%Jb}Cr!C;vOzrromjPYq{qQ{y<#Z>?xcC+4O*N<9 z?nmCALnKV0d8AKE$PPV=;fd|h@d(44^pZ?^Sth+arqS_E(kYz@6lHU+?U1H?u|ZV8 z(os_uZ;_~CSB{++O8nFXiwxB;2lvaA$k%%xj{Uo`?J+%8+t+ekDw0*YEC1r!{E7{H zxvTb?`Zs<5_niI`(2I+nwP3H^r+ z7X=8|+C{XNCDb%@tIoqQb2S?V3;k<=+>dyMFWI6F939#vkkamw#@pfN6|Vb2t49R&fIyDHDmOcZ11W3V-ss?bQfvZB zH>eDpoAfN^KHD28y|FVxY0dRc>Agr58ZY0WhSCq%1ulWop*Acxps?6G5v4y)OFYCe zly+|-+yuB8O0RWFU-!g+Lh0*|&QN-)p(rM|`IP)VJE@;}x za$%?KYq)U8%^7(QwHcZLg$v$^xbQg9*YUWZHbQ5Oo}1x?{^(;(TJjtAk2Dz@c;D*4`!5KjVtPK_< zu5-c%k1Vcm8+8l0V`;6+CFg{eVY{RyU(6FhVy@SgmdPY&AKPRf^x&gd0-T@rD66H@ zX_zn0x@$vWx7P_4TU(6*)>(ILAaEQgIDLEU#q*%7(Rb^~itdZK(p@Co!Wc|hA+3Cq zEm-m%51<&vc!Py8W|_|ognok*<{KnsNWZmi&=V>yru0-9?^?E&vx#gUtmgpq!o0ZX-B^0{OOeR%m z{C#7M&MfWA=uD^$*9|BgdneMFCA1t*XVgYIGot5abjHeyjnA+BPju$5%y;P=F~Lw3 zlO88K)ftm`F;(%5w<*q0SNez^8}oyTI-W&?>(rnmzs<5(M<$DvW#4`njJM^@SJrfk zh?JT+fL`8MI+u__a(!Zpi1+woUw8!2tm*ijESkB>F?e~zRL$y;KA}voO2E%pw)0Xn-osn@lA;+~_g_wh|*bl2Dv_nS1 z&Q{G)AsemXq!J^OUZD!6TLDehkH|#S>NlBI@9r3BvKr9gOPjUi?d#Yj&+<1be2A17 zOJMtcZ|O#$m)@v#(_fx5Y3aKIu8%oSSDZO@gU6%ZD+9*IE)Bn>Q~UMAnYJftw3y%e z(-=?%fpHBsB_ily3>_5)30cwp1}}eG#*GERm}FFs9d7 zrI~9sgvp&V5j!~yBc(6ifm^=XO=b$LnGg}c6w8_oKzsX67iCgyZ(gtaW&XuS^D8!n zx9+yc?|xstxZN(2yq^5tcog#7(9gcAK>(8=4iL;wdnH2y@MnWWh|x@vXQ#Z5kF7-_ zEyL@RSx=`kriIcfBvj*WHEu{Ac_ve-OF}A|=P}m(dh%&N9${xFazM?&b`}Ug!Je8| zwdlNMhvYL2f+Crvo6an9%0*k%`LWr~k=XG&w}@);j%Q4u_VUNFr|sA4Z$rF(fUS~I zsn`?bD||0&z~#%vG#E~$B40KVa4~{E8 zogw&>k)PP1m}zJEks*_x`|t^G3-a?=e(*`&)!ZUK_(*(tQ*Ujq6#@J5dq1zauOH0w zgSWXc%3#S3d{&4)Zt|TD)PyMRQfWbKnxYrSG*X9YQ*-D5RulSDSXatox6Kr0-i7=! z+wSMsX4+-Na>(#=v7C_nY&0Wr-I1ySBgqJ2+41{KB@;`rN@8iO3*Y^6J&fQ}v>7zw z8H_n^H3*WKY`G#Nm`nC;~+tuyW;>g6-Mvbs}y(eV_TwP}FDdSi3<3sUC%<}ZiZoJD|4>CbGf>sRry&A@2=ZY60@G{c;9z^kgF^-gQ#wD=^;2)55yTc z5HJjj6IOOQ>0_XjL8EF|9YWWKWgi5pU>i3P39}H|-(L0n%u=qjDcF+OU7(ZivyM{8 z%%l@cxzaCRt)_Nde`Gb&^Gus1)eH4v=H^M2+dQd0lOLB!*QX=%kp%}i67W_ zGXB!0U{+Eg?WjcXO|vn^%fu7@Y}LS%0ajDK9XshlWyTL_?pGBo;DS(fxjlWmPZq#H zQ*Sub8?k3t+QO}V{Z_ckq9@^EecO#WLo*_Wr3c6cPB4ss z*HhVzx$C)qn2Qt}RgWP01q*%Zhg?Gf%83NyRxk=jv~&M$o#f~UshowFy2;+OX=@m11IJkHTxb!+J}Jo1BDvuJ_x z;s;rce1(09@}XogVAT8Tvh_wXQ!qtKpw>+AeQ~K~W20R2o zlgMZkL4u_}DT3@ZtwE1T&9*n1yeLK>cG@%ro*ZKli2XoJpkf5V7KNa0<3eI>2=Ld0 z1|c+ci9(50>^9I4!V7GB#Pw3>EumCnlgS4guKCkDf{TKERH@u28_5tqOsQ@f1%4M=PKA#Qv((ac5y=L zf`3UYyAaE>|A+B#7FvUxXVEODXRwqF$&HVo-A04pV%ah@q)pma zZMm+b&jH%zdFf`nuoOXCSL0E4HTfa4FW4co>DE#4&~V7?(U-syStj1_uE*HNu^$cQ5NZ0%;hf$G?cOOyF;NG(yU`-{~ven0v~r(=KrT5 zfdGw-axq|mfB~aij0%{t0jE%OfU4o5M6S`r8kB{qpiwTSO@R(!v{uIAy5_k|Nmu`|~{K%zS4uDPeVg|NrYBvFFV9ob#OLJoj_? zp6|Dgn=Ap))EW?y=7etGlJvoxPxTWtaiSGi1NXh#jE{ zW5DG)?Bc3ubL`Diy9cJEa8Sgw2oxa^iWZYM#@~dK= zfh|`Xkwk>{vo{$H*iZW5r&W%&n(f7g2&Tdy!BacIQaCrDl(Wwyn!?j#24#u8XH)r} zkk@&qV`)UvWA*6OEj(-BfHC!k2Z?8Dm!a zp;xJ-0WDNmN7bb?letRHvl3Gj1$#`V+C*`6CyJ{pxiEF3&C(8SlD}~X&aquBNRkKj z;%1uDM1|9&S)m`673zz2|E={YNu$Ud+<$XZy;=(oAC$3%Cz%M(xmEbSLd0|(3{ww4 zupr?cGH+>a9L3Rq7@(mYhXJu|pb$IKPRJOkMf76}pOn!r35a^IH&>zmuOPbyYd(6i z-0Z1=nA~6`t#3pk;LvO7HU53i{3*DhHJ>`#-O!O1L-vIR)-XT&{^3K8dd!g};=WX!QnrjV zmMzya$emS6N9)x_da2(QgdN#PF5kHLz&HyFg|JkB}UM!757yDUXXl`>$XeQHv+%b(5RGAWyN=@#lpXf!c% zaYe5CJ>M_nRiVcH!M{k1IJy3qUqn0e**L^(@~A zgXDK_MgtxyT+7vRh0pSj&=@faNo_&hMhdw?fAH`(LTAn$sG;f?Q^osZORhzbr|@vPf(Xu23@T>y;>dDMLVBVT5>!yoIvUj@MVG4 zX{CEba@{>Cr5mA2oc3ghokbm@455G)HIeF1BH5y6tRBs}@|(0N*8L~LG)Z<*$+BUr z{)P|VxM`OgJbjz$uwR|g(@M$5?1v@c8U_xRkcLFMffQAY3b|S{$I0C${111J| zH+xqhz*|zXd2Z6em*Dg7F`IXk4I)3cWb@en7O2n#5%}FP0-t?17H@kd{chS&?&Qfs zECSCT@{4@5couQn%8SXHEZ&@qbX_wR%pM9~VeuTD!Y9mjZSnLLXaTFp7z2kotsUlm@VO}ERrU#_s2f66iLZ3i>7zd*&pe)>mO z+ZBfN&sps17S7Z^-_k!T_($V#riC~TOnZYsmkkOuz*JMb4$RLos3oM5S4MdwNS+Hm?Zc%?#Y@4dxSy`JP=mxF% zs0NS)$A-X=4E~(;*s~sPo5N$To@CFG$Abwo->2>bNGP-T!|v`|1892^ti07Sv(&Vy zd}!hrwpabVtr7(4Cy$@#Rhn24%GwSrrY{U%=t8JA^`>abM^JdwCbo`+Z%%3t{0DN5 z0XLZn4wutThl(><+Yz_OacNbpaPPF85}b#;*@_Kly(5K|zqQg>Sb(Ysw-k2exJw2* zl9;h$be%iGT8I>07eWhX!b^yzZqSXjA)1m72(rlzLv$gnv@9W-Dq9vcu!i~BcMl)( zbTJi8VOg*(N0|+X(bUy%2+`Chb6c@3zxk&Zw=FT6a^YZtCq`n0dPI~#xa%}it}NbK zMSIwucpcd;#kPI{-O(CMsex=ga%}Q!0sD2WkTIe&)l&hy3`DMzz<0ajtPdU$-a4bkG_ID-_1cl*t!Lz`DRXVMc>?+%?$+KJYuLb(YKU|zEZemn52C3_5vFg zU;a+t{Nu!Zv$~k%n}29)^qO|a5uSKZ@Xd!^wiW&Pa@ULNPo;1E>wzWTd|SykuNOW< zWh(=Tqi-Iw=km?xgVHEXB?G0WiDhdn}qv>)w|}dJ247DHYW2zCVidE2i-?hN9v?p44`tP2obR@~5sq{RoNT?> zSY+^`4=(k;+T^v=za6g%u3n~IjqK2`PsL~69r`B{914=|1B!}hfOSC|q-nTc4oiFU zOMGvqL>08BtIB3;I$vG4_}DnVuZ&a|5YSOWJsPrT|FwySz=O(hk9ZISKWdHj#!_7tDr~GMf{veDydCUTEKN`IaklWWy{coM<~IGKSWYEeY5*-bGgvPKqG4AKcKtGEnS*A z;D-PH*)xpPUrER4WEH=~Yobpp30wQN(D!vy;7~%{rB!V=gckN(>)qN#_)uu%m1}X^ zZxE2B(3>#2e5y0FsWh+Q7@jSB>)>FM)ta}yDK@mXx=W}_LLJv|U6c=NYCQHdc#=?L zJYW!cQOk$dkh%wd<5FkMtEEogRw*w-^}jku-8(Pbiqw7o!0Aa{@k50@WJ=E}?5bX1 zUro#znM+Y{8Ay{!5zkjh=a8zEmh$}w)4|G}zhr2Y?Pgx&$pxOA>&XW^>GR}0o}A#x zah}Zc0@>zN}Kp9>J zU=8LR>|tL25c75*s?4!C)*Ull%4mZyBZXke%%w^fb;mcxd4%T!5_1DP;u`N8vx4+; z$S|`FZVwzS+DtZkNqwbJDq+{N*k-n7n)optj?3Gc(F$vb(3LHTskF#T6I0aa#B5T* zkCr53@*UP7qB2|G<+ts)l*9em@Gf&7X7Pbnst%W-r7!zbk^_%sqp=VVW!LOJIpYVe zQI!MCiuiW+fH&?hblc)J?$jrfBb7K!+G2EDmuXcx-2B~NDMIMsSi=Q6mA@_nAB3An zd)`ho5yiFjZX8&&R*YF=(@130nk4(~g$WtcwmzGeXOvM;Ynv;Sv4|gu^TV-irrYp= zio#jwrpIoLMf&7@H{-s}l4Y61#&FOah`hVF&dIxlU7ZKx>GGk+nzA$2tB>UjFq@x? z^<#-w`5Ze6O4A4uti*fh=Og@LwuD^giw^jhOr(p2w+s7Ect?Xxy|$nhsC07OK0ar! znw4VKBSNh_F#=>((i&6=9ClvJctHS$j+7Z{JzOx7Z`_|MpvUelrrB6fo z%O55F+sbu`pJTq$LVFwi+^eIAHrH9-Wz-^PE*q*3Za-mw} zd&N%g-&wU%l_`L;DlP3-Ud+1|rB)V=8U@kcW4eH6cUYXNe#7J3T!vR3u%8QFh=D=u z-%u_=@1~DspCF3!Zox2T35#XvEA)cn}r$r_Ml8U&X#!YNqTnP{1`vzBlC zY`954^}XGE&96=ZVwFv5+EX^kwh`y)gq>TkO8etCVwFn5-7O>F6C)2fcT+VJ{_yoJ zuMpf$s6EN;bUj#dI|rd;DYp~HD)V6~i_-PtvH>#!B$KB}34ZJo9aAt!~fo^K=&#KUwHNJteUz8L2Otp^3~-_urI!9}tdH zEZ3@geR9Q3^5N!E z5byM&c-hg@>m@_F>}b}dgVY3vaN$ur2OUo%hYeTgJR*REEd2tN5*PaD_Zi|FOy!L& zL4=HVsxa%8h9(9y@9;qyGnrfm6~)H>u>R0*SJvqBP#Hb8O_vxT<{uE$=`1@y9X4KJiIM>_BXfwHnt61Flq6I54e!jVV5a3AN(x!0o$p=_EW^U(;kK1eV zG?QRushVm$yF7QV!su|mxI-f%(qpE)p>Uz%anQze>f|6~v<`DIS{mHh?H*Rq${lL) z$0fa`h4DMK(5TT+bTv8noqw_G(D^Y>kK6RPzpy7{T1F&QKM+x+we zwSBu&azC1z9J&}Co+}+r>F<*E9-g=gFW;NtF51|sc?l}4Pn_$#t)-|(55M&%Rq0LT z`$Aq9b7#pfz~kY`ey^%XR~L^&mW{d^u zUL~j|HnA!@JO*+}yD*SA8K#TYY5+tQOT0_EHWVU#OK2L2-=L*1!-KAS0}ASMs!>kr zhl`k>_wYQ~c}M3p1`VVDHr%}Wrw9&*L)Av3Y%96Q8B)AS2dxw=18Ndnrn}hi|D$XT+@a|j zj?K@yW$p~SvT85YgAx6>Q~fEwFqQ93<@;hjg{%6o0W&NY8VNx!pzT_ zY~4r{j(|0B(j@tc(?|(OR3P)Ua~Vreq9AO8$)(><30n^>6s5Y-F_r7!RUQ0675RL* zU^l6XV)47nvG|N|TbNNhh*#k&nDoNw3JH5PV?&w{Sy-sOiO5c^XvX|NDnA(W;NWzP zbdJ91p|4@0P!EjqfluIpi=ODf1@eTVszhWHR;l zi<{7@;Dj5S7j))*io4?~q+uD(Dxdwu;N}@v$Pbl_Mx}l(@pJR2V`tiYMEhp%U7kme zZgxM`{W^&87lfA!VR0)jo6;m6ycI0F)DtqBQHpqWz-Ij^-oXwP3QjLZx zE{0mdSv(iMD(P2ApGt(aN`$dMdX3nE@WMtP05^@tbSY-l7mmc9@QxuWZ zh;S+?5D@1N2A!={^WK$-#*# zXWUeW5$0y-vL4A3Z=3X&W}-DD{x5v3Vp5E5%p>6?l$NjZXyduJuB)#sh`Z8#8ituzQywr4H$r? z$07R2g`x_}<7?{^TnskrmW)EW3%ZYjIoB(sn+tPJFH24qb1N~~KAHP1kBzDz)w5*v z4IpKQR{yQSOV-!&k^@|Z)qP~`E@mdb{pOTi96IeTc2O5cK`jMTK9DrZJmGL6NdJb< zs*BrW!4j?~%Fi+JN*}0X*@l+e3)TLB9fGyFVcx%t{&EFdKTh!d# zpvtw(jooXex!boJnV)}MJY-bwJy__;zkZ&_g_Fx+N=lW)>xQK9i>Y|2#m61uB|dNw zuM{+M0lK3?(SzO7!%6Wp#i6$@1UZ}{iCgzVc=G~#cs}L;y<*9yMT27et#SP1+sGSx z$WNef`cs{{RGp?&ez_`#IwPt4(o}v~%%=z-T329S3ZqqGm_Z3)ro%PDN;D;?jxUZU z6Yo-)JR5Ea&!)THp^}i6-4Vj_z(Q8lvca#hN(?%xA#_z@9 z%|fphcSO^Yd|4U8G4xs0Sz*J7SEjf9$h3wvy$g;rt5S zMFm1%t^*G&$6XfmhEhpeK2?vle0yrK92Yu>TtccpHP7RifVLNKG+AHnS6wn%!C>0SSDF`e02dS5tMeA(W2?KH2Zu%5Ft8 zwW`9xY}wR7Z=@!J@|oR5*F*b{{t;fA2biqV*%oC33^$RIhQ!G&`cOp zXj1s|WcTs-kN*SiC@O4NMPvObKN|DZz;kH7#f16BE1uDstJa-ZqiY3BU2^S-e={%N zCTg(SsZ}zT@P8fXQNcKm9lp4uFrFgd5k|H_tyDr2v69e)d|b&8#=a(ZcBs8dC32A*u_>j=-yg1(UG&qfS(!4uGwu zKo~R#bY=BJJDx8W%G4fFN_A@uDrzlKPK5G0YZrdk7A&huQ>#kTX$zKPCm)@(jks7D zTEH^2fVC>1AqpW+mojrIY$~d5m}OyiTm&Z+7hbN>&RMUsGHgT<)20>{V@&HHIfD>K zt~NuXyr78LG-_3W23}*~-Fh=XZ~2rCp6t!*J!5L*I?9~`04zMJnOrB83;Xj=_xoyx z%R46D{c24;(jZ=@uBH-D@5~2X_%H65?*3%$E_O)fPu<0$rs;MuL>GmtpD}G-rerg0 z`0YmeJp)zFK`-~YeGEP>8`qerZlC=4D}o_WGk!(>`P$4W!e=^bGf&&APi0fDkaxS} zeS-b9?hC=_cC4DuvtK@`FT`C&Lp*C!ik3Fv|MaJPOU#3#hLe>>R^wZqo&IJ!s+ev9 zZ$dEm(I()&)0fswbt7$47g~MkV&3)%!M1iZvArpNTT_0I7(B;GvK|3s1O7dv0`v(0 zov+OKcCO(p^#d3KcX+}tg7>#G7N@+88t6%YE+|5H+Z@A>8%)H(-@u%|4Yp$Uu8#SB9HuDmNM?@c^ zFt>&9O;`+5>9KtP=pkVfS;2U$fqe_5v9OTZ5EEPzNT@&MH>L6$Qu*dnR-baKulCk;2vt$#@*wb!pHcecj4&3>c|Qml)MlYCZ~PDWuS(AJ6Res z9s9O3J#=4$9lIHbuC%eAsx{NR>jUfaBP&bv7F=t+Xg^xkS}#%?4X#sZmDRFm`Q{5h@lveT z#eYs&t(O^kvRVsxT(VkD!SZRh`XYxEIN9MwQ)oy&^ryUJ#PU^gQuv%yz^2}uR7)Dv z!y&qTIN#j=Yf&@qd>y-)lFxB}aXA@GqV`=}F?rqn4$&WpGnZlU?F3f&{Dyr`>;dU; z#eM&xkvy%@i2R6Wjdm+idC9N-xP@L)ZFa^4(T>-#EueFg;og5t&{C_ynut<6!`?&J zI^TIAn*jC2`(>xB5P`GG9z?x*D@Mku;j-0?nCWnE#FX>HGQE}o>YyIvJnX6Hp&a)7 zgn8=jOc7Tf4cxe|6E6p|d6eRBpw&-BCQ;zow1)2s#|7qG> z`UnwUgCX9~(tRYobDuqc~U7(p>Ug7kr$S zr4Og6jaV_JG~fLEhu!_QS;HlMhsczp2<3F>^{a?bJ<5{zyt9bgUX&FZ@{N1h5ahPM z%VT@()y~C~or3e&@5KjqTbtOnNq7@p2mB|LR?7`r8C((nTmu2!gsiJwELKo1f8_HO z3ndLlL7WR4T-g-kz2q-vt8)(8fZBR-8ngE#W&jzJJgtx^YxmIKer9J6ZzX4(GX z=J$NfB&Sb@_^zOyNl%}!l5-1hD+_FzP0pkfHEFKBfYfJ*UKbXUTutH;=K3LldB$~V4eM$n}3M^l=#!bi9+)8v{o^lw#~wEX2MO$xOcl*?6ot4Er2 z3@vMElG=#Qqe}D5-#^zisl^7mq}^iQt!R>!)1lX&t|ncSq%`U0EgFI}>HR$R7s!7} zJX?5xf3$*&y_*Miu&&CiVPMgbFH>#GB}C({_F+PM7s&AK(ZejXVx$VRx~#8KAGU*H z=VuvxkLvIz7Wby|nN&U-^VL|EjPJ)T!5AXejFr#F2Y-z1W_C?mF+s3ZQa)Oy9#kUe z6wIeBC!b@@*s{tuQLg%uZf{@BmoS;OdHS@?J>BbIJ#(_dxMKGs*rTBd9URj=2d-Co z$CDNPIv&U%beS>8LpNQ7df2n;^)BjRenKB01Uw(nP{fjKE-L@rD{R3fJlAQ}`R#`- z$Tg{^t7`C?vJKXf1skQ))V|`^glll_;ImLaOgi|{uehh;)0Rt(jzr_6G_;Q@?#uYZ zlg`k6m(qOWwJ&UI<4E@WZAybj7{2?$eaLbC`KwhL{Qfy94Gy(ooB?N1&4AmY+U2wi z(^K<>@i>Fp2%S|*^Ua$+=o(yS*e&rhvRlz$t4D`Tq5g_6s+CG>`a(jGKLu2+bbg1zKV19FG;$Nt>X9`Yc zX#7bNQ-f1j2#P}!AFZl%#L!q%s?u>(Dt^CkgAjdvVLoRP`PRhIB*{acun_lWp4{ol z?VhaiWUeRQJf7HgUsmm_-Y2s8>~3Pk(8fNUjqlaj_+GFZFiR2MdYly=sC;N`pS?zi zWZNPiOM*V*!;WTo%jilk0Eli@y|R>0-@?HMyO`Hfw!xl^26} zYdE^It&B%in@#XnZ91{0zcaNf!DPLFKF6#AC)hjjcbe;_Ab5?h#u{_jQL|a5V=v05 zDl>iPax#Xe=H^bXglNNjn*sD553Nz&7RuG%VW}Q`f#c0;QF9ellS`sgUevNXv8%Bg zkR=-|vjs*6v1Bb(RDqOD5}B6rXFMepm}Xt3Y&MWVX5#By4&UUuBRf2^U2mAx7ta!` zh1tXF9(|^f&ss8V<)_S%s!L)b6QOxbUi zWYO3*4Zn%u>!OMIw4O2RmhA^OZ>x6W=_iePa%cKUgPz<}yk0nhA6=fqQWN^u0e)G- zugmbGo9((AV3x#+H{|P!I-Liu6g#fM!;z)Xbl-~7pZz+Fw!?LxnBg`{4GO4PA>RS= zookAl>=S0I5hP&4-6nF%R(8{>0W?V_8Vi?Ep;R2Yg6Wjr4ZqJGZdm5M;eSpE_4I(( ziV-X*jBIe7$VYh-?@sC;GCc2#4O}l0-+b&6 z*w-QUwTXRgB43xtr%c8&^lKuO3|;9{HUFh+W25cg%cKg|TC2IB4z2Al+iFcgv}sXt z^dKa-FZs%`7<7F>qXvHYCGCBb_|*blXq%l zgv0XLJ>?qlg)hFT5SRFv5Ezhn*(KIND@(G>EiktS0IkWP$EzPR3iEY(#V(i$>l>i9 z%+LuJZg7~)2EdJ>`p%zTdHv-zidRqMmDgF9K2Kc@$ZwCY9BjPACTwamS=(fg<5qo{ zyhfTZ&|O$Uw}CR1iZv<*n%DrtQVW6fgaNG@sOD3x$=iEs3{(yRn&6PGX&*FLlZW{9 z)p3aaeIE_4(1Kad=EC)!$yL81Q0DtS@%JKr7dBI+@SM({oQ4DyPUau8SARe@Tr?E^ z2Ww7H@JH)EMK)YfFgtLpSC*tt$o7|M5dv_N#wN5J6NKva4Zop%p30IQ_3>5r7 z$%xePPA3wUE=WV0NV8t3Aq^WWjRzDeNu{qo-o;h={?$kS_=LXr2(f<8a&9(z~etM zKQJ?%DKk8q^KTHdm|T~v;!TgZtah9k)1AwN;ro-oxIt5m&1USkg!4>?fNdJt2A| zExeWyoyserLu29fULL;lMsM7J0;{-wb25+1qW zBH7jR??_^#4`hrSU07$_S8Q(#fq&KWYsn%+7da&}w!1A`e%tquZmyZM~uwbSi z2fmOy3Z%N{vmkKeL)f)XBJ1|umxxT9^$ZxGnnVm={k_6#tT%%92(cQ>L88Q*lfCZ! zn?$;-n@LI4--3iju`Hw|HeAP6$+~SruP!J*S&9NNU}ptq5`z(_Vg-}tUxCFMpbt0y zDKDKr?T$_Cot)#W*i?pr<_BZxFks~gu=IRlRX%yd*~j7Ll?LFXH4^|}MFVQCnILj= zg{vU7OqED|#Dmz7-}mA zPJLg{2-MV{t>bx?G5GqwBsXbYEO|{mcpH62wN|v*Sa`ye)~l3_R96u2POXP72Xy5f zJHN6`V2tWvJY78LDO|^-LS?70&s_FBZ0ib)dQT-KE7pRGs>)-Ln&mq^ukE zmA}ROqKkaK-0G4IhXQj8gk2u-ea000dWk?j)nu#care9@DVwy6q$}kSktEY>u%~~n$f&S zCgEMSqHWmWps2b-7j<$)&5%>vufx9Pl1nrnE?b;KtwpJXv8q+Zb$k#W2YSCQ3H1Kn zSc=}gX?mZ0MHRjG`gKiuW2`Iby(bN8(c26v{;)a!u9rgZ&)k=y_m>{=bMZ~d0FMK` z%M#0k5-+KlLk?4614j=t%FZct>eggltOAeZQG4)_5fV`m0o;DnW3tch)t> z4u!VGvo#rO12ITyd887&vg_t5;G$@*rdV~uyF9(rD5Xzvo@J70!W_^p8{DiW zPW8oi4>zx&0d~%=z^T$R!^Q{nWiA*j9AI%11GUKT*n1)3dbfER^I`gZP2ohs$K-GS zY)0w>XIZkze-%7A!5<#ijgeYVGE(L9LV0Exir39Vt!`#;i#9H0aGFmJDrG*YbgJD2 zp05%u_!H4bQ~9x&moXtPy&6#(&W@ch*6jTH)GmYUgVk;&L+t~p%?*?-nyG0Sgcj>EEh-}i z_GVAOY86iq|4*Ob;y8OHckzSKwh-c9N9>|XstL6 zi!zaKJnEph=kR)!?5h%xSV&9#DQ|Kd@_ni2{V@+hV=4!sQKc5lNVjKJwk6P!Bete-C%m!caRR1#{}h3-D|TiF z@2;~-b=_~q&@|fWkp!2%^?jFElUbj&v=+D8ftwv>jHN~$hZg&16_OSA%cxmD@Lz4Bb+i=Solv(_umPS!m;}2UVaXZ-ZwO{EsLN}f}(4g5e}L*78ctxe>x)a z0dT1RM)deSXurd$LcIu}r3%WeKI2^OaBWrm_9nrI>nh=NK)&(6#)B#Om(?j#G6G;X zCI0?(%aEIr2YC)k`R2iAQ*JcWhF-R4Q(9-ydD>qrmRZsJ*Rw8N?5#`hV5^;mwNh!m z`Jdk5CdF41d_#6x(mr`p*!5>BlcFGqrH$mdbr_A0md(kx{u2H2xJvd`3Dg`FdQp1J ziE;F?&h~!z-nbk`%}P6|l1t*D;{AwTu6q~fWC}g}BaLx=i~DLHN5$snh#s%*E3crw z#U}mRt8U>b){3l7(9Y^!MM)Esm!@yUuMJJSm&oF94p}&4&?}2s)B>!VLw9FaZK$y< z6)+U;mPB=$FbV}J#l%N2OrN3o(8ReFAhja$Qb7W(0tWupV2oNig`ukQL6H6gL+tzt zP-yZ00G*Fjz~J4+{{f5v%tH~&U1>68^6n$Lk=N@%4)mvdZz?a-9iL}oev%w1-jaUY zeQL=A_Q?UX%Fne)V+CLSPOvLIpn6aZL8nPy^nhNod{$)?G*r(F9vE0VSXjgwnJCx^PWn^6E0u3c43nm&;ES4qt&$GWnR(xm(%D2or{J_mO=|(Qtc9p0?0^udDa>TD)b4+anmVj} zszgu=$AMz+3~!SdKJ;(+fZs~Pvn$fdA}vD1xxASPis3+O9=y86+E8DsRI z{NY=+wA9)AUF*VnSHA|oOvLfy3jOHv&ggQ4Jy3={Puy(*ivE;uP37xS`KFkklGC5< zEpfWHlGB1OJ_&Xur`3Z>1Rd;pBd4teW3?7FIBo4HSG)fmPUmn*JubWAK?d2Jcj;a5 zLCei&urO;(sW1Ln1%{PB!L|4C9*xa{87S zbGD0r83L__Ri!`+K6{kqZ!LZE6CPzL*0m_B=~tyF%d5iZHi09=a)HpP&X3Z}Lae)d z9k|CP)ilsVT1!KZ&GW!&P-B5HOG&3QJcgmFG9-ga5l;&4s87?pLo{t z>r?p+F%Qb75eTh9g^C`aMw1*{OEP1VnSfSTveM=z;~EE$#;J~^pfss9Y#P^M{NewL8p;?K%Vg}5K9(-dp z(V@x+9q3OKTH#sCFH7Z@$NVI!Kq>R~zvc_AAgB56yh^JzLR$@8uq&;WdQgd=)7FlL ziYOyiGqhlAqxwy~F?$|NGNe&EjeTV(UquQWJ#qqtrc|}2lgJdBQm&?Iw>4rV8;&<4 zG52*?hmEC`AYZhuun(hdAHJ$+VbR7>gMCw2`v@t-p5VFuM0kl^%uDQIUcw#oC6@w; zG#*wob#-f|4p$lu2-q+dtsSM5lM&@pslB$;thw*6^teK{Y$p2z{g~>oNKntQBRExg zQko}zR{Az-isin}#|UMfjyT25Q+BxVTe+Pmm$JZ$D4z(1+O#H@p5o@Kjpg1J)=UWs zd#P!(UoKcW32$j+e>h(NI#zC>0xbg>Q)6`&yXKAy1Z+(#jnmes!M?K_AyRE5R9j)` zbwQw{*&xl*j2&Azt-UMRbz8wT-JP$+YkmF=sTou|1azsT{^H#vI_pA``r;?1xa`3c zoI`DDX5c`}z+tRiPvZRnyn=5mxF*;qwT!xMwh%--La3xsl6$B7KTme_5^2v?~VQR6|KS`2U|GqcGQmejGiltoXJe=Z=%PR6%l4*{KE-W|4aJt?%aXSrYqs;Pp4@kg{p#8W+xZ|>SKri7JTH9}N$e=w5*cuGO)?`JWjR0HIpA@z(zFO$O2O}dVwRa@nc!Oix zS;96W`;fxcKj>I^r_B+Jm;@RlHPdIXPgSCaOCH`N@?B+@c#f0}6F z@9*%D*H5#<&t!8twgQWi%U5EG?qdZe`O%)J-cr5D9sbJkis_$S^FOo^a-M@&qkmmm zw(B(}lj*Yz6zS2f6pD6_jDr1!LToncAnXsy&rZ^dEZb985yO{wKI@hvXRID?+J5zd zMVsfI3xGxC$^t;hK+O+YOl%O z#$SG_PQ=Ie8l2b&EB#5@cIbV6+@oBtkehJX$w+d*}J1POCFapftGMEpf z!31HVGw@Mte`6Jxjw*cSlmWeLtAP5d0HyJ%!Nn5wURL-Kvcbv{H|j`8I_8;~zG^nI z^6RP)w=6GtW?wQFwtrvLl?RJ9$~S09$9x4#I?-pW;<<^AjCLwNmddYB9ULCb@rLXF!qfX%^CcZ&D?f z^p?U@cVAh>S$ir5T2)PGvjfFEImKjr6(LlX zq`<2IjqQLO20x9qhuFQUHLVaE`di=Xo_w$H2>DDZpN)A&wqE6+xIt+yn8u|2sM5N{ z-}6Q-$`B$EdJtxEpw=V)(0Zg?*a!n*sB%e!SSo2yd;4uVjI|Cz7bSo}j)S=VG~mRu zmfw`hPlP$PIjQyTXSp&K0Y>*o2%*l{;8@>g+uq*}TE#UjvX1-Zl*Z>$80I(Md zs_SWZrQi9uSXHOuqtI2@RP1Kv>vX&|=An7Q5>8~On=5Uv!fam*c+8>3nNN5Ky_N|k za8@bh_ww-Dp4+JJR7T4DD+nBy5v+><9sD?V%O+!S;yG#sQ=JarGihq&%TwhETD`L&Y$o0Qdfg zFEm@I@#F}#F=mLDeuQw__-W*BIY3Y+k-N{DUKwtF2v?a-;+i36VD8#~`e5{BHNe~V z;zF?b#rKwj%^u3&YX~+=;~fg|=BIY|o|;5NY>&+md<93EuJKD_ZS0IINaLVJKW&!T z=uv3{Muh5wtPDce?dy1S3J;r&WTuwW!n-UEovz4Cr~lVx89WC*mmB zhu`vz_x&iWFueOKsTGD1=#^e!*nDQy3PbU~N*gwe%4g98KlNQu+0%y!6=W!*GKIVof|#SL2rA5tLTz zbZLd*?yps@Fud@1+}2sC60I;Wx%ddv>EdS7QiB%48fhF#(S+8uTnrw`eD2KTWWUPq<{Rs83(U-2mty7$kVrH0fHSI?xu*>; z9L)~3q1kd9mEQ)z_axYWd+PMSOeTeKxyU!+!W13~kI@^bsEGg9kS$9O;eGJ)d#x{YZrVN21PgN}H^s^b3Qc+2%tXEJDU~X_Dg94*Uv_@aj=< zzhZmwwZ+#I);=vIDb6iitjx2;uH@!7+Z^X`Pj2w!tDY?PS&?iiuR9Fm^WK<;BVFW0)J~;L z6F3?9)J|k;zULq08^_~}V)aqYa(>TCL$duLz7E0k)5BR`kX0p}fG>UhMC_ypXSW0= zC^v`+6C{vsB8`Z)kS8861g(vZt9N>7{9NtPr$|}-bF~{@;ZAjK2QY!Pl&VM)?Uy*l z7GkWVR_O^tH+{2N+Mg)VEKMQpkZJ`Onj)!%)ue@u-Xq#uRc(rh)~Z(#E6gh!w3hg) zfJh*Re?%Tn+uISo09&7(bKk7b9LZ?{qf-7@Zb|2z=GBkYXIJU;oSmS{HSA=i;8zXE zU$7ieNCg@zEcH9)c{lsK84#&V81Pxk-I5j0i2uLEvr?@JVqHmzh;<+>FATMe)1^(& z#=;p^hraApp5vLy3srlE{k$?*xW7tVVyZ$&{aQ`ZMNF8a1{b+7Cj5tdGh5$Gf+$$#BM|-9hM7e5l;w9UWBZwmE}b!tA@~32@Z8WLIcHw zv`U1qC~L4l!(c&KgGIfi0m3p%i337?gG_ycOucM?*AwKy;8Sk!Den*E3q!g6esOuR zYJjn3fO#=_F?0>=yEH2MNpr)VQ5p7t8406W5k|E#jLJqqeH#V!S_9Vd0EM5)DI*`N zs2uq{n#zx*@(B%MolPIHax0iLxhv%r1=-oOCfz-)yD22S-2Y!wTRMPY@r@r6p_i`m71 zLnkRSl!YQa>G_cb8+ab`!MfRDMM&zcS_-*Yr&HRQ&&WiT?wY{1+OgoJuSBFGN%#Bq$h& z1hy9NS4fM$)%>@1l&jtUJ^r7M*eZ8{9cIM3Bv zO?9;NH%h}&Z@L5^QNnL4K`j$ zeD*_e8b6!Ib`7J4=&4YfrD-m+5|u~HB$s1Nb7Q%N)TVP#)>hK{kS1FGvJP4>R}uA9mE;JpGQYr7K;pRyc@_h2qnN*C=^{hwr8TLYqI_%^s$O zYrWVtG@&Z7J4#)uHT4JzX@RnW^?rx2@IArR8(t(-hL;=C`~avH_9s zMGsfSFzaSBz*RARmhm&k7*qHl=d4TL3986QE~`}w#3{fS8tusD8rqZd)jgtDwH09S zv5;v6&1%y@LV4*Uyx04bazH4bI7wRfbXcuY_BPEk>7#b^TY(FN-1>NK&&KgwaBg}m zX}_s)*^+T`ReSBIO^a8u`dOvOo@7dY%1f>+Up*--+0DP^k*zBVM{BXB^zgrUShxX^ z(Kt5=79Vj)l;#^xS=1N^q-*}{NREz8WOEm_ww;`MRbD>AyX{5(->k$v26e?QJxv+Ge90PLVxYeT6Yk4Qd z?-pJI5NzH)N;a3TN!Uq4+T#h1QylYZTWUPglYjDL?LPMKN1p8G5BKt9g+KgPPj>K! zSNpH$J$dH2XSNgu`Nm&r{c&FV248&qFUjJfjVo+aH?@x_W%1Ecc(jV&`V+rKE$8{M zQhuJlsHZ`%R7G5nF5hU`Q^qHf<@)Wlli)R^OuB}ohqV-|zEI*kAUir}05t#QAUDU5 zxv@0bWYs{psmpg!tr`)Nr9{X|5uy>Li`Hr^I_AUdppDU4rb8K?p>^~W0`?BSQZn3A zgyQ760TNt#)DzutvP}2?G!_)I49^>Ckb4yflc0dloG~iwpb8C(Dc_mm*`%$=7&n0l zW8hHte6%xv3D+q7j{5IY{gb}`{FXcB+|T8c=Sd=|7<#4RN2&M=D!x$_=YQdO`_9>0 z)i;G%1W}U;K?iuNfDdHn{E7O1Wth3s7C-Onhr$$GN=K4A3V%g!ihmFsx`U>G0L#;W zI!AY8{XorkULN}~YGg`yEu^1Tr^uzMc>Yj>*QAd=)_z&b1i#|tg)1m6s7k4$Hf^pA z@&q1mJ9m9CBVAgmDp&{85*WMOe!JA^`KbNArY3`vJ=;txzOk1jBc6Q0lh1lG?8y>O zo_H2Ln3(!J+Y!*3J2erpb0ot02dNiM`cr2KDpOWLm?)oD`v&LtW$>@L4q zFi2rG7s3uPt_7jih)qgL+1bex*h8l$oI%9w1i?J53fcnTNxrJ%G{SltSiF%^PPc`d zzGCl#_PEv|#VLB{-oRSDcd2)n#pyh8Z0o%zSNsJMYnRqe3|82i^=@xAqlnlWHx)NI z_ShR61r*)@7Wxyl$1UgiB<8_>l)NOZM;flRhoIPq`9uS6rvF%cgbt{&2sdYpDeH>T zv;CzHQTD8sJu%g1(NeGx)lo~sQGBxj?*&4z0d`@?QmYYUloqS>+l+zftQmuOz}IVN z5{LDaZyDvT*~Y>w1Jyo{rw{4r>N#UP)xi@+r+VN$&*olt@WY4VXd_wy)MO;rqrZ6| z=VlIZZNU-)4Ipshh1*Z2pad(20SH**1V`2D&DO@RP3sn<^A|VBW=0EJHCPl@?2@96 zTN=+P1$Hi4D=x1o{L?|BQY-9!*eLKkPhht7a3N zi!^l4!H8gj2BZj54*e-FlIl-+kw$+oXoO^FVlHCzGpq;?zQ%*Yk1EWlL-?1F7fF{{ zTDDBf^*a}Qv_(q+l7<>!ke!{p$=2k;jIvXMG{4g4)WSeuGvh{j)lqdU(*Qnskgo8_ z0VtS;tDIfDqAodt(GR5K+$j+IqHa?_q}l>Ig2}{G*=~xR!H$T<_hh2brw|L!jb8S4 z`Ul`(c<8w5I~pS4OTrZMG&{q4%8`95)x`A@i8Pu97cv8tY~6^RBA@cW=qqf3oT8qJe{5Bi{{fLih9j4aVq|1 zvn~c`0#3K#(v22!wK#tF;^`5F*4+UMrL&XXmxM*Puy}t37KIDUxB*zho3~|@e=~)L zG(VY=F4GW6|1$Sq*^el!L;I4>C$Sv&RK5^fWj~IVcvO6ULPkPLu0Q2REa&;MQ2}2) zPpKk9Fz1=^0QqK0#i`7su*Uq|)f9X1+pQrFTJ30MwC|Zeh3nSu;aaE<4$oUw3Zna^ zvp6Ap!KFgi1CNs1xVm7HglKx<7KetyS$Kgk?*n)MnkgJCj=ZV(29?pld|G%fVPz6q zH6kQ&V4{MeCt?S_$B~?}iy7@TPe5#afjGYT;OYP0>3vQuUHD(6_aApMdY`y)I`nRl z4W1OAm*u#&bHo&O!DQqg8BxaN+;gxAcYpw8h zZy6&uJNZ}6Ce=`l0mVNC4cT4_RJYh>l(?*3E%1%08DX~Yq@u5f3pY`@@D2VEiihi( z7GjCd@mp$pZuL#CfiIKyD6YgZ6L#Cx$BbezT8Bo^^b_ogP2KF zw5*@`CG7(k0iSZ{17*ZjP2z6uCO=upl*3j_F^Zbp>rV!ojnp9nxkNcAVt@Uk#(;&-Cwv>hXLK^(D~!7^FUe=D7-t?KA-QPZqjd-zU4 zreOh{Eau??I+f@w0MKQmvu^e0vu=&g=eJ+9fJpWd)fluIVZ%{hV!8xgoug^1O33%a zKW+Dk7w3@9C+#QgX0eoYcbD!ZVF5fW;v%QE%AC_{WA^$Rhel~9;gXzc)-yZ#t1ZEX z^^!Ij;Z70CTQ2eCV8)`AT_=Wyj2+)Ll1OA2(KBC*SGKSYfek&KWa51inlm4L;+|&J zuUIFZ3QxN%A1F#^Cnp9xJ4<0?o1BB=8Ac2x9na8eKzhu@M!>MUvAAXOLI(?iM!MB>Q_zQGCDPB@H+%(+Nz}4pv zSx%dNRw-H1ej5pKn;t?Ed&okwSCQ&dWu?ko@fg%uWUT-bNmhkCJ&nPiMXHHyA88Ni zX{3DKBrPgNIJ)!bFs!BLs!WCqqC};Kbat}-$r=VNY-KQ-^s2m*Vib%Jm6;-#<-yX( zF9lCVr&iia&6ue4R*Fh(QH|S}4g^$X2JhM4zFZ-sl_A>NwG$)18w4~3knW^t6oB9YNZ9?N{ zfF&cGHm4^let)E}b1j3~%F9DQp5lup{{VyfH`BHMw+(8S8`PA{&8w0*x2@%UX?IqV zxp-7H#iex7*XbW!)UH6 zyab;CHG1P{l!r{R%U!`Pr({laixIFEIyCmE6EBWmDG2^s@)EF{x{rA9CVGQw!kr+M z-k|v7-6oKmd9|WmuHf^XKbwGgr(TsEuX$VU zb>xmwgRtktri>=WVab8F8G%BO%EOEZp}~^xixqkczmsA-T-XU1g_rS2p=L>q;coafy0srTAmUp~wFv+oM2Wp3u;b@LWCsJSyn z-3Wp}mmpw9#c(xTWoZnhZt@s((OQL3d_n$@8Sjhh;pPJf_T>n|didG_t%qw-n1P#V z=@Llmk}ia7;Z%&d-Q=7sXt0UfliOI5c=D(x$Nm}_KH6tSV`S^9nu!@QCkYwz zqp-kj;QixDGeU|jK&py-{T|zsM&HuhZ?O zT;9lM43VaD81WFFF{}ZwzIZ`^)}l`6Q~R`Y9%d2jl;N3I+1C&`;$^SHg9biT)xuKQ z8ftY8&to?u7Endl*mnzmL1_zn!VLiV>L{lPblpB5L*1eHj9sNuU#v?$TQB0WSOS~Q z!D+LT&}94JjKpZzDjM>MB#|YzI=gz}E!ow{Tl8wx{S%^En?~2f=vvm4%!$4i*(Z1? zvi^aL{gYS$?KNCj0fA%(0M->KzfeyG^rSO98Spy(GMb6cKzK6^1XR~c7`{OH4=BaN zL8QqzY3FF?>j~rEB4E$-%9KNO(bN_x@3C_2&^M`^qR<}x%NiJu&7?qe^<35dawD9< z)YnC^3k${IIrnN=GuQC%w4vj$Z%erek9~qP*Kh@e^lIxnLa1DLfEOC0+Z@|+VKas0 zwMku(q)*=Rq2A}YFiBj#sZLxj^QUa@Z9nN>Wo9OQVz-}xnE76)j2o*y-6GOhczdu* zy}}hvOE#F>CueT=H+o$w6 z=k)0iL7zIpD)s+k;P1lt?Xk;gaCCh+-# zHTgX9g!37>!0%3nPzYzA^ELQQd0vrAJnBbC^xd>5Bp?0&((vgZBv)M!h2#_-7v3uS z8-yJ>!E}U^OeQMFPa!JU$kVWq^eG>!J2}m%PszTBQ}Odj`wJ#Hd;A>98H>&mGr%i= zEeb@MhDO&9O>95w^P`9=-*&YFk=zB1*J@bnKdd_Oz44z$fWaWy{S&0vgPd`ed;pS&ZX5FH|z`hN>bHh z@`@(a4pud}tXOR~lb zPr8t|>j8<-&_-OrIXEcz)hWrz^3?oak7e?W3%1?PL@a4OEoHH= zIX~LN9FdM#D>|fAexPaA$)nk!b>o7$Nia7huYBPdqThcBuC&!`1O&=RxSEmm6SO!uLka~ZhfpvgK8);`s)Bg0VnXo@v5*b)&50I8N zFtag$8nU%5|KDzCbfUW+xtVSHv@K>$TA?CF88x|B6wE69{ftk22Q_@yS3X}O1FS#! z&ge(^vg3$9iz0&qUCI+hyqQ*p0}q3XgaFAx#9YW4Q(tO+T=EJB}-$ z>8hP^s_Ucd4B+)sId!#t{ZhwBgDjn>2{43_x}We8Y(_cmzGMcq=+!&0TL=xM+&w+~7(bJE3^uIP7&ID-03zRg}= z+`|=5PGK7(;F1}9gL3;Ze$Oa=!#fvoRG~vc+k#bVU1J|p_HW*IAXlZwGCW-7C>H%B zdGOChoS#|}twWVQe~dVOV~5Dq7JYHXDAg(E!mlo&o5&)HdnO942;`PopOda-)VDj# z*;2f|3jVCi-o;6}n&MwQbmZp&851Q< zy12hG!7AA|zgtD$^?gQ)6h=(wp=15` z|K6#gb&9iw=YNq^BWmw1)Z1jsY|>HfQrf~&3$HI>H{Wdhw)$vQ@rfzrpzs)8A=#Cy zZkX53@}$X=8J;}%q?P^i7*_Ao9BV70C?gqIY*?P#dQ_$_~?#cvDN#rUlppXBGYPxxV#KZwPA+*C>KruIRl z`H;fm5&eem&bDxVt?ap2d*j3~T%wwxjlZ(MD+;R1HM0d%Oexm_jn15Q6V|IqhRZxA zf;V3=srlzPNo}z8pRAhqm^)CVmgMSFUkIKxgR+>Z%?K>tbRJc;u3|1b90tK>L&0rL za^{_o;W-4RECVTeENNdTsk8f$-s^VQH@I#JZ|;V)91JY6;~C~983b7SPQ#+Q!00RdSC#uLW{jX(4;n-*P_W?P0v7nXuA!YWt0XTW z%6PdAQv=R7J}}=GJz6DS+8VA)Zu?Tj3w4mdKo3#|@$=`vr2-HgB^BkAAB*`aM6E7}s;&@Ky=p|)aO%Tp5ifGOP{Phi9l1g zco)vsKjSJy19ftQ)A&-QHOX)OXvTPfC->cfK7O*oCYSY*^~jH%@nUmn_?R&a5RfKa zWR-mBT`7fW)hOCzFgjdY$PppL>2C545GY<*wg%~V49a&hX152QYtbM!_Q*2lZfege z#Y9>PG5h!(1Ku}xH=uZ1wymq{oUCVuHR0@wdGP8rI=cbVb7_&i8ct94YB+pEi?ovlgIkmR*tAqHfg_97iczVh)ctVN zb_}Y#y1J7dbwd1ZMafGThNJ1M49q##WH?Q2lV(QXoAYH}8gul$ol53RXmC`Q3W_<| zz#N$bW6o{oRWRoV|6OK|)v=*_XVS8#%fBz8_XCV8OunaN#&O{lpE7kP%!DBGqHZ-aW>2b~gzB4uirA;9uwQaQZomGeLPb7X zEHlIE*igMQMBSi?86Rnyni=JG)+;1(ETkfbdAms};%%H6O(HBR(h?a!zBT5nm|=Bc zhRVeZwF%C(q#_GAyk0n5a#~W6kG{Q<8UM_0XGR0e2p7uc2}A<cfhd_OTlw!-*fu7~7hN0(@Db>|5tgXwG`7N2@ul|`~d<+g3 z4n?rKx5NE?97D|dOB&-b!^qG27{&|VZy3K<2^g=pa=z`S6f9QR$QH%lD=nzC= zK>dO1ASu->zcl8naJ9PNs=C5e^{R3GB?r#atPRmnUwFl)>~{wYDS#aQhFy^ZUZFL#6 z>T1xcS3T&*xFDtQA9%&GLwxdW(u2aEORo+(k&ma*3y0(-<9DL0%hs8z^fDES{bMHhU$Gv zk(Z?*@LC$><-oHg=!5EymQ&j%j%-toONk+I9zULz0%IHkgtD- zx0~eay^XUeD^kOz9?}?i^~QV^o2)KuQe9!Fdev~1`k>sNG0kclGo0gWO?W9K|Jy=!pX|c5jMQd-wc-7xZ#PB<+ zj2PCyDbcFYK#8_Edh#7HUquP43nf%nlu*5DN*v4i`NH0MTdYKhlaGQDR}^+d*OTGz zv4-+i2JWjE<@FP+Q-5ha^P=qlyl7*qk>e(xy|RAM!f$q+H9GnaYY28OZ$CBQi4nk_ zJkE+ntWzcqH?rTtZus_HdLh2G3@h}pXsx=mJD1zY#5I!ryPJs(_kkJt>eC-(!}{v#t#w%mE6ds>x2D;99O0%c);kjo8!NrZ1ePU1QX8We zu$rdM$MulFOL3^6+IFqBN^F7m%Fx84RNFm1*z16NhRO$%(({%6lAacR`E^W3c35XR z=RC;1(*|PX;hA5sU9%}k=;Ki@EO$3Ve7q-L@m^Tyvl(-VjL1+#8Frhd_*$}M;ie3o}Nqlvo6sy0Z7%|iGwy^sk$?atAOlAu-Ml@_XOAI8v=bLh!TNvjnPnJ%xZ*X);SW2`XWc{!@G?T-a*auHSV)Go7rT}7(vAOb;=>CP(3ubzp*YJa+g&ENy96ONJ; z<`Z7nS^dJlqY#Df=%4jGqv#DJ`Rr4Jo9odKVOyKj;@;4Bn|L?$Xqz)`x&*H=u#xJ4 z5%B4V#3+MjVBFAUUMK7gXkeEyb&Uf%s5G#T5+wP{hY5DA@O%F0emOETb4r=1H4qNn zOiy;AEQ2f-;usFnOYrK8tJ4COs?=L+bR}IC7Y7Wt8L-FOs#B7~RGkW|(YT>7lp|FmBhDQI}mWnT#L>G{t>%l61=&ANS5N#_mnST+( z5sj*y8E~Ehc|wpegwl5@U6WFl())OBhR_Q%dt>Nc+h?N^MC!>BOT&5P=7*ulN>Zr< z0L$AFeZm+U9G+0JG*qvmCp$6hTkCYZ!)v&|ByHA0gl%QM9trz;Bkb!WBZ98Zv5(9> zL*9^d``A}F2C`3Og$h5>y2TY1J`0iv7Oge|)M=>@MpT*A;{D0B_uH<)FodR%uC#^FNz zwQW3HtBnVli`P(xwQW0fqX8ubiwSqW@kj3thl$1O7QP=+m&`lD_wzy@i`J^^HFjzT z;#Rf4_l@cH3W}2kwI3B5A}dNbnle0nL~7~)d%~RY|KaUi;On06|DQ&VhP6wIP`5dV z2|9uzrRJdHl$xNkpvcTDqX=4Jm{d}7oSvz%>BhEfGwL$xH;3tBFDI9ht&jhCwE29$pYP}L{=Dy>yBI-m75or6)1=J76zWJWw^3qwu*slOP%jMo?U`0BjW;AA22r2KV)4hqB92TuA%$Qw_^3O~|_p z_V{;oSzOslExt5PNAS!ZF=Ijk)?I4xnw_VR1Q!|5*$CAv>>5=O+|F$(t|;XRoe6se z04rYd;{BaDDySbqDodYA77qm)_DEubVmW{60AZteJ2s&7Uh&Ux_CyU_zJ+xwN0NNH zP`C77(ZV8>T^3<=(c`S7DdXV{rzNZ0OjUMLWpRQkETfjD22axWbXF@V!sejjt>)E2 zDEG*-K(b#ICm)rpqEP) zIYIuz=}XQMWE~lD3XN^QDQJ`ue6#p zEzgO>wpMB*UzQ^^tlJ3S0I!L0TO9QVvgE7g+J3{fB<#tQ{?w&ZQQWD6mu%PU=`dg$ z3^}rKwYd+;xrH%@!MyUX@OsSt{cKp<2CbjfaR1q9?m?LQ*@N>2X zPiI4@v}uXb?nj3>y(GH{yR8rc{2Hr{;&0_`yTY&}k_S*>T?WI4z0C&ZG_4Kfw#_8#gHpb3M(6endrZ!F`I2RQ%s!X9`%_@Qg z`yo+Zaf9>doB>%5FVi~My^7#6W!aZ3knjTK9En^H%sFyk&O?>+eGD|iW`kvUdiSI< zu*zzc<#DoisBU2{jov8ePfpa;BF;wpJPg7;;2Eh z+%hoB8~c!@mn@}gCyoI>Q?ZxUdz6ooY%e;e&Fu^PJDBO$h-qbwFq8Xr3RbE}YoVDk z=4;|&s9%@hvEU0naVR@dBA*rkst*}pxXJ0dd#PfJje9tEYhopouq%L~8WSmZb}1u= zHLNJuLU;X@HAi*tqPpiC3~FZU`^qG+`re@L)Ajue_$Xa{Z?ck_o$Uh*sHR;)V86>y zf_J?erFIyasqTDlG;4mf6095sgzm(KBzY;hA~;}txlRyND#}_F9HsH`1X3wu+|J1| zNLdlQyLUN4-ByYtCe{G|6(pGWaX9C5<aYlUadlSjSPkM1G-qtJ;dD*dBkZBHkx2dA`Gxl%l zIDt04KWMt#_cA*xIstF9!P~NTe|TFxylnDh#)Icft?JLHx9B{eJ~gLn%?LXXwRwOirQDXZt z1Tk?F=%sVc9lb)bMDvn>8cx}SQ!{?{6*s(>y7f~f3w-<|q#Km@gSb{W# z)DL$|mO;vj;B3kWsUpCz+J*#srlGxp#JT%=EN&0iC;3UwahC4HMidQcsOYpA&F20gkZgG2X1oJMg(W*W~s6B_Z zJA?|5;sGEOl>LZIMfU!z4bFmXS*m`z3r=>y@h&*p1z8u|^KFIQ<^wzK+8l5&A6csJ( zHY(fKo64}O1R0e8pOC~EmfLs3cC3=^_)Sy*u)RmrQVs%Jao7H^VfL&a<%z9g z=~am{qk*DeZxzM|V+ZOx;}c0-fUk<6R*)SFWL<0IJ=-{0oZ;cJ3`X16b|u61mO;LA zzYLcT%y5@7tVV5gtrlN?|+f!85OptVH>%cZrm+?N*8l;wg$a!9WphaS1hY}bA2y<=kwC^UDodaAu(-l9PBj}xQFFAt z=v$@NR5Z#;TpWpTaes;p4!jFb}n&{RndvGCyD; z4wgm=^^@n)t8X@g|IDUwjL9>m@9>GWbjmKF=V~4D8&jc2XW4L@f}cq#Poq&moJk(AyiICBWv z6S1JhQ^2kjer4W-XHa9;SPg#93u9!d;)RMSr2cZ^NLSE#Tgg|tR1)jA6>+z5-YF)yz(lOY*LsX{oHT0j-Rz*Ol zW(&LB3MJ5}V#MMqS}bl=k#3=IPQE@18T#`yu>2#IiLRYiyI-$6VHsl$Za-V9x5Igz zD%a)Xk{ipfD!b(B?SZgONCgmQaB-bu%lY2VcCYO6n8(*{AKbb9z+Df{mI=jmnX=oJ93=Bvi z_4AA378+*3T#I4wCXZp+GY;KpkV0wSZ(;mP=n!o$&TaOR(mAACZ_W29?V0N5Dt)30w3X&W z>|Ps|8wNLi0uR4WeA8kqaIafvR!E(Hp~s~m8l2Hq441n{?}Y}(4KTtKt)>w-KtET+ zaooMyy#i?r@6iJj*&JsFtjOj#Wb2t?gFFUm%vz1Icd%Nsy^M0JLV_y567DPsb&$jr zU%JmaA~c(nut4zgwrK3@P%_0k=ui}I(Vt7@aoxm|CBy7ggM*6TZYAAA%`c>`JKm`k zwFiwdgD%Kw>MUwA3&R(aWIo=Ds0Xm~jrLxr&sri?zgUBSn%ljV(j5UrV-xvW44^Gg zVSR-F$pZ`8@L>kQWxuErwi9J&q|4++aHHG`dZfTtfW z2R=C}JA=urkRZF+=)5P$LL-QiRCz|MN9lTRElun6_Aex_Lq%oj^Mg?9v8wuyE7}S( zO2L4&lw1*f!YcMun!m0lMO*=TwW(MgwjnC38KSa#m}HAsqIX@D6;iX0^E4Z^X@X`Q zo@Ng`?@Vi}*~Ni$+w9&X-7FV$+eC2bMXbJ>=Jz+BVly$jTR5Rw*Q`E7dI+66SULtgHDm_hOXqYnLDIl63 z9^zGOlhx%_Y{p(f75js+PQ_Z1G8M}?PN8&b1(@j|xOyl?%QB%DG1|QT*u|{rn$H$6 zE9`z1?Ed=l6CHMs0J~YRd;GJ)E~B@~Tp0fx*lkdQMlm54lFHC4j$yseT!mf-M_053 z%eMf-%aa&xwDMB7o*QDg+`%ynZ@j~YVEDmj`kS)Em9R}7&kcrJO+M2Mt2P(nc>-Xm z5talzlO!}{uHS+32{t29k&#ZBrZq<=mD!0hS~uG|hJ<25C)jZ^?aVZ)N>fas#*(st ze+JiBQ`!^_G2;ecRFD?U6sLfdBuXH zPOw~|PSA^>6Ab-zLWL*`eAR^d>A99?vRFGU&mcNsGr$RT!mb8VtP@&QkYl7!e^04z zwf5Rti=6}y1oH4iLnh@c>lK1yStU39UKsUUexDnD4KChs3Zcs8a3v0{YGW@|dxg+i z{Hifa$QRq!^;ZaK0RsJ}uY+Ar+U`Txbz=cj=6NO9b)sk2v8oC8$viKsHe%PS&1!eo zTaq%ha9=qNW2TE{z+j&FWtK9jK2QRK8pVz1<3{RZf$&ATkWkXwee&_SydxQ}0W3Kl zM!>zqG=)^(6mP^1AC+L(HkvAiee+k2VN1LZ#;`~KB+0OrD`Z%`h?pw@u0O*D`UaD( zCe%;QYk1ZxAQwjOdX}i^i7pdW>yqIGD2-y$V)kIxwgV~KwTQ8m$nMbJ6@Kyuev-CK zDP*c=udSJVKQW}qA@J>{|KlB-E2u!7%asaIIx9)qO}FJpTzQ=I(XTxvp`qLI_{=Y= z2(up%@(0jP+1-Fx*oxpNbz>v9lkb8SVhLOGl-v`~F8FjlyR_XWH-YuPsYJB~q8;}k z&B!(0EyPUWOSOH$={4*5_86x`qgcRHN`ohO(SNnloQkE$;%W^&6jJk#Nb1v#F?+V0 zNbDq$cY`s@RhW-42YxWSRddaMtc|p?5Gw-XSyKdGe^QE|X7&b%0&X&s{AkDEiG zhaT@%s|eN> z|E*QYKcml3)aGipQe3CjouFN0Kh*vx+$e?M_slG*JnMm31s{Ytu4HzAF*$ zN(?Jt3k2VD@playKqxte>LowRAl2pel>w4PVQWwaWv!9arG9&u7md?4j6~y7&L%}J zYL__;Ka!FL)9`2C8p{USSGWW89$bI-CTyIM;}QkEt8N`hRLG{gIk1x^Na zhb;B*AzydHQn|0w>f5lp?Mm5_cInef-=JiAXtW0kSGh|wQdSDbD$Lg%t3nDb^lE0Z z#X_ea@mGoaVIdx?UWu72y&|~K=Mo2XGoCctN0hCY0b#d)CdtX_-xdD@+ZPw;&mH=s zgUXBB@FzG04rVfZ=~v;%^KnL#{8&JVk;aX8e{p9(=L&B?*Le4Qg^YJAthqn+=Hks* z>dx*I$m>6H5j5YJm`%N4AEEKc;2M*I$5M-k8WC)N=6h>{Dc^g4ZE(X`|5+P6yFY)< zK7zTzLh7(PQq+Sj0E^XlcZSYdLVFmihhT^4t8HW@Eq#$OfKm@tYLd`f3ItOsP_ii@ zZR1%#J+~*GI}*>GiD#wPE1Qb1nr(+mcUVyO6$MyX6`~pSi!(2N?edAwxK4KvI zww;`B&@5gmq`o_1{h|YN0LoJx-G+{@SWtJOf}zoI$!)_!$8R5v&_N%2n7H@=#xj`# z7gyJp;o{bc^@|J0Bi5MXaB-Q##X0N7#kuo`hl^h?O5h?pOkBMAXpD=qb}Yk1Zmm?r z`V$k+7oA=7oXa`3>P#1vwm^m`J!i*;o@Qo>dsU! zG%k+(@$hhQ$IlbEXdEUkp8iFQi;t%hxbV6=Kl)BmXo~Q~?cCSYj?Zr*=YZ9IH+w*3 zqqdPY;Gv(5`r4Ngz%@uCk91lnEA5UUY9?ef&7OP2I{tZX;(1=;xi|5w^m;`L9oA_W z-p_)%1_fYPg~&ju0ExRY14HpgA%?XqL!Pj#lOPcv8D!4Ikae2!NYsLEJDkp8Sar)f zSru3(t3uPWR#n0}P5*g};mbdfz;Ge;e)T|Hu+!nc#)ap${Vz9M>}EmTHVTHu#qWMN z3|wR$PT-=EmJSmat&haGXx+997hg{e#Kn5xi_d<|aB+|Yb&U#!#>F!~7zQrJ|15!v zhT-F4>ccTE4n}(90ei3IZyOH8#d_e2LoPF1>}^3^y@H`}@yp&};G*H71TNCU$3^yM zF)nu4x(pYWZ!i!S>wzzhztnJXxCM1h3WmnTgWn$pF1C3vfs3)j$Hl~lVq9#nRT(Z; zRt?0(dfdfP&u7i;cI;6f&Rn093B12Hac*}M!FU+|uN5*O=1U!2ilxcIyU zby)>N<08i*wvWsgtL{zULPL7P#KoxlV_aNSSB8rvzQ>ou#d_e26E8Ac9BDz_Lz8Dv6EKp47i(|cKpTxy_;EQuEG+dl&L0z+gp>c8Ew}*j? z=l?H(i(vS;c>AX@E+(_?GJ%WxeUC4Ri}k=4$Idid9A`n@R0a6l<{(EtI13;VcYN?K z%^M6C1`$4Zvl8K$Gs2^zVwc^Mz{Sep<0AOK7#F*8+C%~uhyL63_>#C-4}5XP`G$)x zTTs`gU}#*NaKkWg@$iBKE>;X57q8qC?SPy)0PP^gaTnp;j6%37wgTFZpT-@xab=` zE*9Pubto7b7rR_H3|!2)Gl7eR!^g#)KZ$X1 z4XgPQd@*OuKwPW`zBu!2!^K$^)J<0~G%mLN#xQWvc}D^l3xwz!M zKg)1&fdzFl6by}v)ZAgF6Ip%7d^MfxX=M430#bPYalMx17BQurs3i$3+j3l z42_HTzCH|GOq-v;#oXcJ;?mntzc+eypSITE}DKE;ez!V!*sMxx+O-$ zgRC7)AY$CAfrvna{_6<=dQqAj`Suxxi0@cXccX%#5%JX3!$8CyHzyFGMIQ9sdenFO zC^I9+{y0X&cUe}KK*TwJ9f*kkMLPV<$lNa(BCfTd?i&h*M#SRWFc9%c&R5Xdm9%=T zEHoMxA|~G)BVrb-H4=z8=I;X$@xO?M=ZITRH$=?0pzbyWLnGp$o?#$j+aD$n(K<{- zWPTJQ;!A*8voeU>is_xwV3m$;;5pcZjLTSP>nAtYPPO}h%zo#)EQ;R+AmPl z;n5lH%J^MHHE@1RobhT!ZKT8Oqp~hi)L*#HAdWg+QBVFg8Fh@J?qnTgoa)nxDzLOM zj@nI8=WvF495q%^M;DV(DMd8~$*4E~MAVo!l2NZI>dikTqn=XKbAL=mJ*cRA|B#Hj zMN!}UeKP7gMP2whQH9Y*-<#xko+R7kdPDHTjOU}je~x1+5;EML!h;W@yX)>>A!TImmvHHDB-1wa5+qpd** z9)0=m9ujOwqdqjS`6m6hxvH9Xj< zFNwMvl+4fz8X<3RS9?@EnL{52Z> zsK3F%I8LxMNMtLrIqhlY@+(sFjN`Gy|&ChZQXIoL&jkg;}V33q8jMV*C~+)z5dE z2S(A&XY;@c;UIUX+k;i`Ar@{W@hX0fJ2-=l5VCt=Y{rD81!aVtokc$xtY3Ag!@9^` zO>Q$gwUW(X;-B6!>(U^80z5mxB0Mo@PINfoJY{0tqSc}ua&YFMP5IO#-&D`z$Oawk zF@nm3{o@+kmhTuQ16KlTR>8x)c2TzG?nUe$+0O3xUQ|3FTbNYM%bJuDHkLK2Sy2db zq#D*pu@q8;7vXjZEg}v`TAN85Yb(+;?F)Y#v}s5PS^Pmd^xl^BZ(5e7HRn^mzuuab zQPVD>Hfvg@f75g;S?Kb(9r;dmY55ZHo&Bp2KDVFVfe5))8x*pe5B*_KFnc|i^DXrI zw2~BnyAMt0QwKOOYXxQxX$?&7cp?N7ZNxyhm=toC@Wl8E#@d8Xd1V|%c94tUV@9mC zl6=xG$JBDl1Lu`3rMQfZ5;m?A9X2?|Vn&SkU0LI<(Q zXdM|rL$wtNEMPFSwbHO~fQ#TGdLw}aSZ^}^OJ7`CHB04%nVtIYDBWB9qjh|x zOw{btRsinXwl6(Ie?R6~>dsgyK0~5lgL6#%PItjS&$hQy+}r05L-jmMhxw_e%8ftz zrp4MoR|U}pN~8>cYVKa1-M|i20}?gKx-u>Lp2_B3%r5#%Dm&q2Ncuw>!YTPRKUz)8 zYJ73i5v4BrFHy#3kQ`=~>%c}T*j{J5QFL{7QD71ar$~F`^^v2|V5xl76=1T;$K$>J z3>sHF_lJ#EC>7~vDCt`y-6U7_9o24T)78#RI2FNPryCyrY(cp_Dom^bzAKFSMt0Hb8`RuiRc+_J1Dh{k))JL# zH-gRQ!Rb|9zb!UX(b*iw_`BV_G!|_8P3^qY21miJGKF%A54Y}%jy4h>z?RMAHYsfh zA6oSg7Y5qdEJ>8OwIx|{YgoG)rW*~Kp+!p*M@Z1qa0hf8V%%1+13DU^6NODvAv5HN zjhdXz{aP)~Rc#D8|AlUz@vni6rrHjj{nL&rJLEubM8w_ly|8=HF&uw-Euq8!$Id&N zrp(82U-S*vVA{hoIIs@xu%qIs(g{@2rqbX|+u$79;vKz%(584kQdntef2tJk1;4?v zGmT01JQOK;#dhVz_Bml+yX$LJq1{(=D-I_t(=Ix~GHu2KF2v=i8PjcB(G+TJkwPgy ze7pGsM*0pOJXh7+pXq?UpA=18^kbd9B(rp#qzhSuN19u0gtTZ_MEYs05(nD@x|9m$ z#Fy<3nXXn+J9y$h3~CSjE<3KnTZ~wV+{ueBjMML6C>YWoE4t^as!2aFS=xZ~Gs5)w zNy{KM3Ui&wKb=SpgM?Nw(VQmHvV%67!XK&hF}%6(7V)t4pqJ!;r~{hG^9=gxDPf>6 zDwoY~MuWMEQEe~GScdz>W%YWAJ;idZ6y`dw>kx@{=A0 z{~q-s8?g5(#D}UZT@us8=m^#v5rq$)90e(qHn zUu_LMP4Jeii96UxPA!X;JE=oIs!&s{itiRrtyXJj#7aKJRYn>Qm@1n1Cz1T+b1TK|j;#rLc=1HYhb z9B24yJkrd6bMi386&_-HdE{7`aWUU@W9RPyC7B6 zK@ef3!j4=aci;w=Uag$42o9UmFO|-R&D4TF<1UkL;5K@`hxZ0=e%+ z+s36mNogN* zrL8DFKmo-~c;m*X=mvwiVg#DpW8vfm%Wpo5NU`=Aainhi+vVNmJ33A?)=U+@V&EhJ z+=dvtCh1x?50z-C!|noM)5K_k(2&%QnEEiH=KjuJ681RtDka}0*k&z}eqLPOW>>Bm zMTCO`RmRBrCn~ms%s>oC5!To_|4;R&a>rRO*l%%xmupW5a2{s^SC?-P~*$g5Uew~L{Kxx72T^dtf3@hKc6>Pm(6 zcvEEwP!-1R!Hs7#N<|Aoj5t%rt*Q=xm8HXz#IVzx@Ja2^0yr(qwQhd z1O$)SJQGyFTthp4ETUS!b~y^M79~7I++w<94b||h%ggYA!c#fqx)q!Wl7Nw*kp$Jj zG3UhB0`6)eHcp5&E$cgoRNRssVWz!33GB@}YU5@8(C)tqa9y4KV`}%LHMWQ(oCZi3 zoZlu1rw#$0jQ|fE;G!_YsNH^Gfqo(>iST>y!9cT0=2p>E@nxR!8{42-s(7@iIS=_t z3KPm&2ZQ`C91X%%L#g7`5wsr>&9uU!d6|PY1GL;^>3i_Jw2^=l?AJnEOga@s$n5hV zwG9T+=LM2(Y5w+bL7EhSw8DWj2`HKblHP?)U4qr*4!M_U-@e-=aoXFWw5M8HvL6HjIjV_!)CKl-D!bd5ax+^4wQD1=ywOLs6F zWXk_sigGd}buAmqAN>2Nq?kBSMAN;cEBVGJU)8K7s(JDJDki5sZdSmvq|N3GnZCRl zH;yz<<%%MJYaAhxB>AZ}cv7>)d=BC3TxhV&F_xoDbFF`Xl1n7YIpc#@(n{jw7jMF- z#?BAZ9G&SL8w~l3xU*Gkfu?XbIBH1fT2-CR=M3KriKL3Vsk)_Ai_pMk84%G&3~^g~{?D-KB0VY5RtI+S`e zhPdied8DRSqvXw!s)LNpU8~<`B>j8DK-e-Te}A;IdUd8J)tR%l2$=8&8BF(+I55Ga?pNNFDvz zeGKRg$#`*dU6(=>cWTGA!{Ihbq)Bw-4Z!f$#qgtZjs={fkPL(KQ5b~6i^=|od(pK!qzF6guX^*Qnvks_Y{N~nk{&$28h?S=N+ z(8m7C^`D)8^m>oRUPG9BJ4o50P`D-z&z-D<~=HI0KPNCt`pw50SWST*Ia5iUd;=`VbZv{9=$~HKGwO0*9hZF zJ1fu#$(WQ13ft3uf}_FU?ZHhAUgbcX(vN~I)SkVJ1~L8%-St_boC)1HMX|G1S??ov zr|XSiLakrnw@VusoG-TRNC03~veNJ3#~DWFXa;Y=CGPBxA2}mhK8qKR%lz)djZ}-slHyN#JU&^=&l7;LU;xB9Dfw#^{#tJ z`W~O&Y9hVWL|e+bjf|dImk+o>R(|xG7Yp|tcEQ8-SXoe7@JATNw0mw^M7u(&_Gjxr z=O300f&}X!=u}lI?-Y=Q)E&Bo!Lt5V| z1ry4n4zyDboB*nKFwvrvts+^Qh#&Z5t1Z0V9kUoBY*B|HtVPG&OoWCGVXow8y84GF zMF@j1;&Nk5SWA7xt~HfhWA!hU4j<_@1=9scCJD3o(XY;79@@?Zd`4+}2_}9&ea-c6 zjJY!cJBxFcJ9wOO>I;JA4BT@4U33` z>>@S&I`Jcl*GBZa^g`Xjj!lr345}@EMNDDLrR8wm3>!sF3>o zbDk0G!hu3aBb>D0BF-$byLn0Wv;N5>J}R^}XjZb*8Ip2FNDA9c#_E(VXen%Yy#UI@3cvCQ|vibA^?BrwJS| zG>9p|vOfv2ny-ctqEHoNCILRGLleq}n$6QbO5f7r3~P$HakYAtgT>82WSH;-qqD8V zao2^*&$^AiYAa8W67Eu7jxo^HpfDOzr*Oy%!ymgGZ8>=iB zZ2rXT^->|bYZU@K9jO8(?HZUC7W5MnH`@c8+R1~O&}ldVvPS1a-b=icnSEDx!jPBG zSu(pjTtk?jHvyRR=o&S!Sx`6nISveWoH-{tsByYIWgE*Aeay{Lkq%d&BR{%!CR~dW zP=&DVC-@XD6=@dB8U$d3al<7YFe@aJgBZ-i(v@C<_g;I(v1qWNKY75=4|IvvE}(G1 zoGFWy*eF(3=!BnC@$C2^qsXKcx^uCUO$<=H9z%CSIhAK~_S2v)BB@h~b-Buf84|`L ztLbNqR+ElnptCqqLS>w-7QDzQGo?~c(`+=JceDi~8enoAYZ+5Jx!$MHUEdt}2j64J z9sj_DId`Ws9QX$^Ah^CQ1Yov1I`9g@`%d%cqE53<T+qC5f*ztt=g*92QMN$5wM3OoMh?AJs5qsH9&59#1ij;o7~QE+ zKl=a=z;TJ8#~Bigv8r$ld3l}zJK1&hdRKg>i|2Crwe&)l$jt++WDU;L_@TWGLKA6o zyy_THsKyF0p}wZouEcgCv6k^lmJXKIO{zcM$~UNO8fIH+T*{auKMK%Y_f^5NV_g4D z!!CAeykykjObWvdg#=WC!eChL1^hd8_daKX2#@ln)V>PVYG++`5yXjAw|9t;tl)j0 z+>t9DHES^(mosBrj@Y-e7YM9(Sy}qNYIH^Tbp#n>hLsLT#@Tl%tH%-{z%BXAlnIMK ze6|1V5uX-m4e^L*JO=f78-sdb1J}Z^zB!&;ZWO?gipPH_--I#3wz={@8ANE4z)djob9Dw!>|Mlgk~mZ1;pt%h_mq3(2d3l6zQ^sJ`qz?dWw=H znJ-n`&Zga5YeNbyu=LK<`Edz-0v@#%Drm?i6#psp(^wD+7Z!XjN94&y2uB>Q|5B?* ztZ;l~tV9`-{L>>^%qKgMrxR(k(7UIFV0TFDj(Q;ukFhSSHM~0El!ao|Q)y{Ysv&MU z?t(Q9(EC)njXM28PZ4sWsWdl-7V?r!N)!zuKlT*LPh#w;wX7IJe}1mRrJs?5s51IU z_Y^!1U+Dlg0Sm2Qp`1fPCWsHg4*tdo2zF3(@hqB2qqCx=CaJ!Gn^~Ob8N&-5Hh)Nk zufjDcdwlU%xTVE!@F!T#UM04dJnn+M(wOrDnP5no^Thhy!le2>*V+FB{S1t`AvkxZ zzo)~8v{>RRJ)8xe=5#nr+iR%p*AK>OWr;WHgxru3)?8}56|pUe!ynBVgusZ zaLKAEy*la=JLB&460w~s8BXX?Xrrim7z^1bb+-*U3eIw0e4eE)EO3FlP3IK16iPP| z^vtEOd@6O8TtRj9+-*9Vd9&MeoLZ5a)up{O=5GmpH=LaqTp@MIA>O;wY2#ugO3@gz-KF#MhZ5c$?B$n9k@>oLf~)TAGi{}m9dO>ICJ3&? z{UrNY^}ZY3tQK?tx9`8K_UGHQE1r)m_bM&2dpboDN7hhndLl2)q^Sf{c=FF$(#PxK z;7{AaOntCt*?5sInsqF+q1NuqS~cJ3!H}y${6Pz;YXR>fjq?MwIO-UAI4!D696@K( zr*OvJNunk@?Y@#mzs@O4qz`TuJWT?62c1f===G{>LCe>|w!u{!gYrmqpz)Y)!jw;` zKc@R}-k#x2GG^d0Wu5B<9{aL@F9KM1vih~Qrh2Zk9C3sEEWT3~rgF~pW%j8k+)N6w zHM9QI{?FRyjU4OmFEl04^WmI(LO;$`Zq<~v>ogAH)Utv1>cCBYA&g_%mSSFXi`e9G zj=OOeZ8;4c-BZzb&^lOmgN1{z?oHm)^4xp(m)Fg`dmHzL^WwHPp#NN)r)lj=6;5QDhw|)>)boW*BlY`u zs?xH@m=mToVlk;=gPbZpQTC;uHR94Kra0%% zQd>OooOfoz9MYW*iFy*7^(X|;7Av#LCN4Af?42n~5G@`#h0P`0JP~2}O_I6-oyPEs zNnDa+jSyO#qZ%A-^O-7??NmiXjl?zc_hj%XU2eTqY-qjvLbxzKQ%PE@QkMJ3v05dl zd+*UzO=0m;?3rK}Be;x!S1mCgIjdxwBq__a0giB3@q&YaO|n9o=CulEZjPMS)Xo;NR=E6BJS(91u#d z^%TwcL~C>pzW2i=_^)3y3EomwC+*K7E+;J>>BTotgD`4s;_ub=5}Kg1?Pwf7aEkbn z#Eb93qHI_3QR|AxUdG*Q6=SL%^?6K#ZIZM-2P+uUnMP*_V0Phl)EBewzMNh3uY^R$-E7j7!1+#lf7Iv-_EX zd@6IAcxH}sxSb!XHYkP1am9rQ9^ z7W(1G7Ef@6ET>eKUsaa&aqQyt6jKXEVZV0IZt%&GG|wtiHX);BjxBCM39N;xERC|E zlVe8|Q;OMGt4wThnu=iYP|Y`8`ZomS*Grd|E-Su?pHB-)3f?PjNbq4Tx0!K)#Bvpa z#lbfYu-?PJUC`}<%PfG{GkQI-Isg8Va7y~zDVC+hr9H+44{eI8_yWf*Sid9TFHWlO zbK4^7?@EtFdgGBDO(qOq5OsAs_JlAOlUTp@|4p!SyL!BhRvCpz!QDR9c-8gOEHG` zeKK1Q|Co}SBfJ?R$#JOw*j&+`+{^M9|&d46h-4^2S3kx`~=2^+k%$tE$RiOnJ8iYoJwt_r*!Tg7+&8tE{ueOgi zg*(Mfx-`nbOCN^@-ce5mUY&CK4$i<^G$n?BR8z(OFF<}FE1v|!;bdKWX6xV|kI-jk z1(E3#rl5?qVnlwjR^Zb2-b84L8W-6Pk1!*jHu@cC9#0jdlc63my>zdr5as(o{$g&M zN8>F2H6e|Fz~vgGsSr0R!#q$KA?a0SXlq5#h3bs!Rny9fP-ocS)Oxj}9h{5Mpf~xU z(U9D7FNZ;H120k6SRokG1-RjCU>UgJ(os```pdgYeL^nkbeV;2d_l-|CB|yTkvrU@=NE^NZ=olS%WtzM{-gD) zLfS2`;`yv5+Mte&H~B6;-iPX(?-S8LeU183n|wN4h~G;J&2Kig$RG5}I&@Rs<1@{X zw=)DWv}&t<#aksSxp1M@gWtvBd(F<}0NHmHcO_YIC;pV)%nAnc3a=+o@q8~VNu4ag z5wlkZ&**RT~MjwX92UwlmU2R%>r7cT9^w8H-UynVp*es+gwe%2@QnP)9gS>|TBOyT@&qLgUqafYOj z(v}{N5hQV2=#kk6Um*q-zo zp-cIm^mad1+g`dIvW){pnsIGVC^|M97(8S{ctm}aM@AJj+4J?zd0DeVMi<63bI+!TB?gDTE~&DDmZm~Jm2ghOlp=KKcIwGZkA~ehx7F*% z=I400fx*}+QJTq$1J5y@SK=d<31Y`9VfQ4e83OukTv|Mm%_XKa*~{u_+Y3f`)=pC6 zAH5s@h|mt~K?+Q8OrlhVt9+@_#XL7rs&P!Ho3n$IN`e7khS=Fr=|fJDY2lOw@ri74 zXph6sj*)DH9=|E<0K6j)YtidsnvDlxny-y_OhYx#`P)LC2;{ti+MH zomjdFm8Cu5;exluIh)%RpH~MD)LOeWTRA@0=Rqw_MdERfD@&)Bvwk$g*duh&Q5OWb z$CV}9qZl?UIn)oTEENu~QQbP3D{yqMqRYX^b*1-(m*VU4eYDl`P&b5`WPesF7*SmL z@k)fO>4b8%TRcdxYux%FfJ=h!M@W+dirO<*4KWeALQe@ACfnk+Z#4?|r6gNN!jM7S zxb(ZYa~hXULbL8xlwLIBzw1ZOQCujGK|A(N7V))BPp-qB77I2q#8TQ|Jg@=7iy{B+ zWV)e5+Z?x|m!*~}OTz#KIU479tO2&F3N~e%VW@jdK8z7i1D%G#cngK%$*f$6ws{z` z3sbNQOv1AZH_~U|*J-O`(HWkzMywF~qBbxI&yrg_jV?0*$NA-NOn_;=sO&5H<0(Wjg!ksIhpI_;mx%Wka zS*v;#!^uyq|a_gFL4!C1?~WcA;9rm{vUm&HNE#wrRM$U9;P;s230hfqL|r&XHGB z8r2LZ3Vb7HE$JoA;^50`-{zcGh+noIaZ>#N3ut!`q&KH=!A2bQv%h0+k1u?A-qO>mMmPrw;a5T!Zp zeqXn{T$ngtc_TdL;Cd?$t~boVJC&uA1zya8p4jqZ_SjPh85--R%P7-%!{K28p7Uod z5iu8oFqE@vD}G{|D^69f?!6^GYDlxf)E_~oa6m8 zy#E>Oe`RSSbIB^Pbwf0-Z;$`6c?{}XJATr?9UlU$NS-yW7Gz0#Ce zSWRH6kpzsup8H?O{1yGP{fUW1Xcg%i?jR=4HSv^42T@@t^;ijjR948p79z~(5 zlmDz1Fj5(x+kzZ(mF}_ZS@G+)s4H~FKQ(bADEXq(BkW|W zxt|q34lTP6KuhDg(6W1smc|Ic1X?`!rqO6%la806>dMk=DleoC-fcsZ&mibboNd~g zA3g67#ES$|n0ZR)sd%=VpvBr&fHD%rc#hCyG0vKgx)u`3@bu5oN2MUyUQwZBenfSlwP$ z1cJ?fUZq45mGJOBvFv0ocq3djrYC~uE>}~mbzbANd3VgOeDc$jWrBbOd4#V0zlul6 zQrdRe!srur5uL*oFTb6`i15*8K?AThlMM zsy$`r0po~fh&1dpLT$)GD>TGY9h}RkrrLzBBwuiL-({7hou%#UVBljKHL>gttvoVc zHH$PEwJx3Q(hyXDoZSLW$oUE7&&pbKBWbqJ0Q1IQn`GuwYD?Utd>>7f0^<5 z$&DN(e_bCrqLXwT6y@~;d^$v)9m$ImZVH#?X43h|e;Z z1@8DweGO}J+-oV_3I|PRGxAhfI@5#35(kHgZ}bs+tOwtJL{w-H&R6~fBzhyxeI)m* zq-)5Jx<}Fj{_|BmR{b*cB?sKwz(Q30hNUWw9;*nxvSp&d@%#h)dg15Gc~t;3TAM-+ z{SSg6+G^?gcIMHr)};~yDQ>`fMsrXxk)K}M4!co2iGSh5df=n63WX#u4|6x}tIMn}k zUriV?ltq5@uMTjgY%$P+=>Dc`b;6YGwRLF9)E22Os%%!3Em^SKsa z1kYoW*~3Yz)YR%=iQd1-7T|oDHXnTz+I$K+E%?LV&~BfGeapyMK3=oXjYr&)qRv^X zmZ|F8o%MYR3qFLp0q^>W(sEJt)3ba~{q(GUO!%z+K=`cgn?2(}f z1r=)^dc6YPO%?xvuUhlaO84?dULfu7&Ufq;OzKFGwk;xL>ftcKj>!bAae}Qca3yG{ zq}o8^p;iyU>YhXoJuT89x3&Q|@mHz<{op(H zyo^feqSZ z3w~rII@rPz9_bQ}RYLiNG=So0Y$ygO0=z9J5^c60A=-NLH@L}tX!ReO7#X>YgHUOP zKIq73;BGTH@hqp}s(D^X8Xi%mm2StP&NSZ7neP2ewO8RTaWZRa?7L$qYxI^D)NQ2z zq(}_37EB@_wh;T1_{n!H@lzJm{Yn9eUB7;g?;E>iKy!nmw|f(R$4l0%CCezm{Fr1j zae)py4{VB^kdl}o=24|sBg`vM z?3~X>{}n z;WQ2mHc|XjtdN@<96m?|!K1aZ!ARkQGreLdq)uV~j>~=T_GY0+7t!iX3?PJBJ+{vP zH`nR&4UtmxxntBj9pj?Uje()P8jZN;)p>F~ci_%A<7w6yh0+Lu4EY9pgUCP%46PHt zMrmqXbM1$_03p`*CY4z&3F%bcLc5)5?C>%@y#3+}TR5Yt42>!*H)M|OHtMl?)lX`q%t1z{R{PxL5?B>(3sIw;;MCRk0p}-ImRO0d zS|z}S2e_XI@0~J&4SrZMyCI6T*5QGNCK5|i)i&g}?b#c9|J#`yz^Nn+`ogfzrBcB; zx>ccJ3DOs1qu=1u7x-k0vr{&y>$(rA;&`vlVo-oYvS^?@in#6`gEA%rWsC=9(ilMb z&t3whX7;lN167al;Aql%K9M?D2KRHd+|Sj)Nt?vzN6-3ka*{3}Dd$kjtBDfdR~IH8 z8o(>bmrq>;6o#?F#4!w>)q@ylsOl5N9pQ@uAIBi$FnVoxQEzx+ipznH4n8B){U)2k z-HFio%tZ*0w%Zo(P=54ipc-Z^SxvAwxMH+P$R#eA;ey}&33*w8&K)PYCc!1xeIrCHe^@Xx7TR zbXN{_ zWR%;c3_>#iZ?9IJ@MFKsFNU%}l7&=UE-8D~ghhvz-)+p0T$zHPKr1+wm)T)~z#x>l z7I=ZqxaIgAa$}`ikd%Dtpgq8Q-^|0EyaUVf{nlE%$BEP< z;dQp5NV!5KQg6;gr0$hCH3OXCIfT-&GGo(1WU~m8bp$y@mc-(mMs>DUOg07{tR@jk zN|)JcffWO~S{lEft%%>2NR=0(LesIyHTI`kHZ8H4v~iUh)!7d!%is)@jg{>jWngze zy*cko^sL@k_thQ}D3gDHXBL!dgdTt=#DV`L@LCCp?5G5Aown z8Y4Fwg%;BQ(&e>&k&xNCrg8$FkSJcCD890^d1$Db{W8Di;#H7NASjKEWmR&uQvz|} z5OcrU-&bw6M2W#|30TKanVhWJb`fXW9MZudJ`vrJeYJJvQWXc~n{0o`8H#57Q3iKk zbB=9vro(9yQA*fwyL1MqK}Tza>(m;{|=^)_0) zVma$4%`=wpeIaX~#RzUnITc$_dM~7&p)OU_nv1YvaaFGs;kk=<0i^F1KM2Ss!%r?DGB=G-JP9mU)%>=5fjLg~^l|5^Tj8Wng zr)S$Se_z7&3+8QTmhM^?T9I!IuZc>iEH!d-P83IWU6x}be|7m$ z*D>;WlSV#K2b9ybqF#2^l1hb)N;K4n0K&I4h>-|nt&hXI}c zutQ2DTjfm8ovz!5|6o(2_z!6)>d@M4W=Im@lx}Z6Z<7vPyhJ-$PkDsYgsTmOODat(I_)IH3d#z$6X&4a|Wrp1S+fRe<9h z8|#*%TIHp~6Scvk7Y*vzI02ng->XuAN48wLcNt;1iG6ycH?f6ozw9J37KPN*dY4_< zLK)F$#Ha?1Ml{=KMBdq$!W?hfvo`n^6(V(%ulw!JHhf_xZ65A2_yLJ9A^wl0X|^$m z>ZnlRCLERs)5@2!7U4_v8fZ89ZYLKQaRW?#^jWT~w8l4XLxM4axt4UfDRlNEUw4p$ ztw|e3&h%-s*2Qx534aEK^rUKo7QqpL(;5+hHC+l}5=pkuUCRS_pc#s8J2j?gv*>6P zwWr!(^-M=mBqttR4c$PtI2#1+9B0>_2&T=swppe^3!C@uW@zdLxKC+Jj|22KNl*sj zW<>C{8W5PAaD!~LPH7gX9`J1SVcz?!UV%#QwANkP6prDfscWuxJ z90^AbR6Q}KbCf=C=zpsCmP$q4WeJVLB79O0o}`05D^%dS$vgeNB_xNwqeA?uqmUEq zaKe8qSFlk;hrR@DikcEe6+91$S%RbV>96#s;sW+p)Lj-u0i-rmTk7rf=}bNa ze_Hzw9rg3s6_}m}6T=rteLAV$uOBq8bMWt}DsqIMOog2t?`mZ=5QDzZkw9^>o1f5vf7pwSC)Pby|-NlT%{Y6nZTh(Ko1EyQ-uiOU{r{On(Re;z9*czMRoZe+$lg-(>Dg7ktqL(_HY& z=MltC2`vm&YYfH1*pRcB0~WuSk77EPZ|=s|*#EKle!HHhD|tV%B(ziI@GJ8$h@b1C zP470k1Zdju!E0i%ARG+i(NfKIogomP*G&5+6~U#X7ShJ5@wkSfDyhMXjZmuRN}LTX zqM~g?KyiG<$k{FrlN)a=Nzkn9Es>>Vz(G*T8EnNjZCf0C=Q&W7f_UZy#_cb3*LR4d zHhy%S8$WVO;qG+9|M-6u5(gUIK&YRd8xzk>(KCiJOwgwXeoDN|Jpxa+)2mn==VZzR zz&kY$IB)R`UTTA%H-BI(W!ULZ`(b?9a+=krBH<|&sV^YdS|7%QDg5|tf7inn#Z4@0 z3^4UrVPTeVWoNhFTjUWiYl-k;GaV2C9)DwE#Q8=cBM$Lv4|MV9G;tkj1t|!ZeD@nG zqXn+8Be=#w?IEe6V3u}(GVCqT13y76Z$dvMbs5LJ^q)8*JO=_*FSrZEG4w&aR%{U! zRA%Izkg`+npx0r-zYmTqO9}xkDOtq{$|^39{2I3;kOfzQ6s_rx+SjHh7yo}7#6H)4 zxOTr^mZCH=>~fNZ4sj3UBeZsp%%^^{jmDX3W5-v)-MJ)SX4`!2gUfvFC{-Kt-!2vN-!-$nw;fIX zS=~03p9R|yEX##tU|C^dIDFaMhHKrPuUoUVRokipZ^pi&4RhI6XALP(=cn!0ljS50 zD^FX|b>dM^)&!(gY-36z>m7;w=$#u)-?Faj2O3P0;1fY-<7p-+-SMB%~ z()KDXq*YqkKg~7ns|;3&?;X(~eFwR$3fS8o!1Xx+D_9e?OeHH^z0tLRBFxxM4Vj)HN}eZ7v?6At}utiYmdzYRJ>^`@c@18ONBn z9VU50QRQCt^NPCHylih4gGGwEL{Z#-#mUIooW7`AF!D=$*^@89@1DYVWfO~nWBXT5sZMJ;ilz2^xrr_|J{Db`HwOs2dnZ{TBZqqMGtupyfV@8w zy-_8N^=G2Pv_5Cqf#{DK8174MmLo-fpmv+-fNB(*pfje^UF+gN_z=(-{1HB-8f6D1 z8iV@gxShlZu(<~`_PQG#%hame1`R!2y9I>DCN(1ly3sT|dmU*juQ?|=V7r3tPFD9U zXnD&VvDe?U;D{$7$xK+HpFd&ruuD$6%KRxHYA+*0uHCg*vC-k7J%%bfj4e8=?UE7M z3BSJlM017Z_LVw5Ie^B+Z6VdXzeszKB3Voq$E)??5OrvGX zUBfvzR6`3tY}wGWpqXtA`N8j4(@X2q!R#{jz`>#81 z{Iqp?C&`bKZ4j@-pgd&eP9KTqqfQN768!OTu>AcH%kcnSKmI?|@qep~AtPS=f&Dwc zr74n5J@6CC+Kg*VshV1Acbh_N`)~N!dM9ceA9akAykllXw0LmmiJf%%x2?Iq4`#8U zw@yA%JB6$2t|hH*DTu0p4H+GD45xMe4Ufa6rYvrofju@oBaNz~zx`uSEhFlX#hdse2GJ|BKO4tYuOxO|82Uti+ za%#1d>daf;w*e@P2kpWC)>sh)FD(VO8MH)P(2xE$rZYhQwSkKMa6ye$sLJwzFK2go z2CmG$`%-q%dywLZ>U{4z+*dJ%yM9oPnzv+>-1mNkv8;Z9S{F4TU|9Qv1?c(1y z@oyVz$E6E&TK_nakC0W?PM6vAjT?8)$i?dGwy7v!u|%E&{Ysg_iEG{R zp;JhMwcL0u;Ep>`*;#z0^H!paUIbi5Gzu6?6*c^=7Ph!Go<=q4$8+aIysFiy>q{8IZIEMo-S?)G3>~~AoEwF@8hd1*vq~B%)QnB5~A09 zsQx-rm@Qk6i~nQvSEG}DQHZqu|eP@P>BudPTN}DYCQ_nQxx21xP@1*wh%| zbgKLq*iH4FN;Ba(SmH-K!5+J?r1j}Yl3wy#FPpQwyew9MUu;Q=q}+_k4EnfF%rY`) z)Z2UrlO0tj7Gf;fR3cWK2W<{=hS99L_xd6j(Q)p($wwKo!e#_Fm5ew$x!~)Ip~}Tc zs;pDr)m&+syK7ZzY+uOGVeDuIWym#HKyUV4m)bWY1RU?;tf|%piTl*hjI?0Ze3ER= zt3qL_HrVHErw_Fg?;!r8=0htJJpL$+(BTq;=)=cFpfY&HM4iOyr#kzAjk)b`6upWB zLsB&3DT++VTlgPacNMKu85jyr*iM5kYT}=ZMzz-#(bBDaOPvo8>;J-}`ZaFwrcPtB zvsM|W3-NC{v!f5TmZ8d~WTaI=<(#EVPIO3R9GBg93N_1fT}H;h*fb-|r3*vAFm z`vna2IDIq6JOlj)-+xNjU$0WAXfXZDsa3U1SGfx_Km+{L;*!c0QXZOO=FekYi@E&i zO4YQ`9JpG?_M}Wp0pQ_Hk*cHwqU6+>a%fVFX~-6(YSk;^C*PT5S&bbqEAH!iEK@t; zLzQ6!o9irPR4fZVq<o5LF^xF96&?M?V zMf%rvE7^XlvGPC1`gdVCZHU!_MA!MHAwex^B7LkMv_I%#bRn3X4$kncnn~w$H^@ZY zQet&jbZz)BHhf5j4-NJJX4-@>SVd%k4o$%?9(F@`88r0Kp_Xo@FVM0$*zpmX$qnl< z>lw)90MYIG-62w@RBwhp*sQi^YCX%qrqz$sa8*@bvFhij zsEX(Q-1%O5%eC8ou+f{@u7B6k585YN*k>>D^lYX}%&3cj06KfNC_{@#+)HiI7Fb}p zJWjs<2Z?G(It$C_RdeMnYJb-%L}EI{Kr>oG)7ZOblf-`WmfL8hFAW^5>}i-Woa9H} zK9Zj3<1>$xbc%A)R-|O-ZU2;=E~U1Xhbc?F*<6A%f^CnYpZu5dxQ!HdXK={RATR^o z{Am%so19lY8&=xzC!Gih519OC1bsc%O8Sf@K-0~4*>^G_OM~g`ONn) zowm3$Wb-T8JtF(~C`0CkyCu-xVdDff?dSdx>DXx(892;Pua&on-%f3ZCnceVc`;+~5Nj4S1^IVaE?;#m z$udf2mdB1*h80@iiSsJiMp$#rAtW<%SU91QVdQE^JPBte!%Cpsw5wSrQBRusbqHe{PULmYZDG+;OZf_;r;HvPj5t8|Y8sW|p(zL{-$O ziqK9t6&jAz&}+*Pno#hcP+@I4?MVQY9#H}YlTyDtFoY}gJp>^vD7bp24g#0_MgwYp z2b5ORJD@b`Q~VODUWKDB&31*bJT=*^i*9!|P3~vusnW+dEaT&)QN>eNO;zPjsmSEduOO|;x-)~c~7HU7?eJ01rSbI0U35o>_`LJ{kOd3ZJv zYf^mSkhGAe8&HXF((^LXK+z0EhM}>HD+hstUDB%0OPh&W*N#MJnc;|KDr33TgM=!C z><~d&j4G!samGWVOGle_gTXz>oPJ3%FKmNl{wJA5QdJPD_9=F1-SeYag{o8QDmVz! zX6(;m%`(J^Qj5>6(fKjjZ4EQ>smWTx1fYdC)i)?~Ogcp)ff|TPF53C5c|jke=phQO z{x1tYihaNi>*WPIz&NoCzyO=+bach&9n6o_vSk(yhUicO%ai++&cE3{N`8ba++@3Z zM>Ac9|E)rD3tRmuVeK6wO&-S7vZjO_g^;@G=nBnLOa|B^^>Bos z*29rJ9O2d?Otxx%Y-|WSdZJjHuXo&LI&vfpd8}%T@uREYu?n3wfD5(~lIW-BAo099 z@w_bYygc!|B79CZ(XeR%B@X5MKnz`|%J84VHsERxv2U#uIyC5?YjM9^vIsHu96C`> zAsw*`@ZDyLu<|`eSuTlC9+!-;Hh9CNLEZp(PCI{ud1s+Qb3{UefD{U{WNK2fMkUMW zv#_Dh!i1))g$32=z>j)QRtk#KO3kx-fMofHJyCuQGoHR3`3j>h#}8VDQJ=94W3}0` z{61T*-IP)Kn%VycRiq@hS=L_~U5!kXTg^9lh??;-vrYNYFMY5nOi;uf&|F!@pA51MFvoFlLv{sa(np~G61?Tik2y*LJ)D|=R~*2BBmT)2#E z`$_mY--_SI@LoI=GgF*JLB&h;=W6m457nPnP|?Lh_+ux+v$uAA>ztvLg40%!Qh3jV zl;cZHdN_qu8slCg6n)+evJ+l}SidGwPt~57zQ6bj(}H^rNNm~BTJG=+tNAJraausA zpPmIN2RF_jTu<| zFlL9P>#py#kaY+?o#l51r%_x$R{Lb3#BXthC8sG22v zDQq|_StrLQUbGVTO>%$D>st2^H^{Qmpb$X|Bu^l2p@o=XFJDfw_s-@|s*WW1HJIWK z(@)z-f?q{~C%uXUSG}6A`~1I=VCMBZ_)c?jqh9sRH2q~7f?CZPuz92XwieDuY0HH) z0RS2*7unR$qTnET2hXfA-x<|rm8K4z7!$~%q~X-K@TE4WJtE1Orb+C_b z<$T}DD?FghW+e)BcLAxO(zlAU zv|c8siAp#!xalC2&WYyR%4^nKQBF~pY5eEKEm1*pqZj-S@Hs)eGV5!)NM~uEtlXxHrY?fHwpj#+E~0fe)o1kuW@@&u zyS_ys<*95DUG<5kRzK+)Egguo5PaD8ZkONbqH51C_Q`b7OHLQH>>0DV<)?frkMb?C z!#fi0hZMTqMheqK|2}+BUF6{5NWug>j_64+h%sF>YYVj&uQv%b?-d5J!>(Fwr6zQd z!;%+FOC0H<4SwfzkwZk>AO{eGWhR|0l=o6P*Gs9>MHfJgts`CZE~J_-PzvLvi{6qh zdP}JpFQ_?~sM!n^lnebN1bWzXdDkq_fI#qCPa9y-U992j?uwP6diwbp7 z_);5meRzsdV1?%cTSgeM{Y z;?1NJwklo#5XIf;=h~^%FN~y5r&Fm@#a>SFwWHV`BF?jb73v(HhzB&JaxR6@T_}UW zY4;8>gL#eI5l&S}IGsOkHfWjg46AA`yFc0Q#70;by4{t+dOKT>QAmBuU)2_zyjMbx zX+vD-Q;n76p}W$A`sukLe3s;yX?32I!;izucQ++%Vbn2o-4dW`MbzjKtXiN7l!|yrY;6OG7Er7xSgwAXU8Mp?QV{yT@4IHc%g#>0|D5xm z=MN8^Z_j1Tnsu8sYv!Bpc+)u^?gwi z<11jj#q0X8yRnvIj?E^FfPvMzr*FzzF*@GU*Tx#^3RJMJV87XAz6~+D`|Gbh9AGR| zmW9W*Se1cr8=^jKxye`La2YR_V{LHsg4?ef^Y0V2YFmgmmbd9mAHE&)23=i_dtgYj zL^rMIrqy+0AlcFT;~jk+aqRo{Cz%g5e?xvH-3(CbYvfRAzVBS@+a1`GtH+?8^x`1ba3-%sv=A(!9ClXaDt->y3h$? z{-oPqb(+~Mj)rSe>-7ff4Qm{7Bb-IJCOs3X0d>JFvVflGT)!q=wAs|ef9A-qNn`Ls z3&IV<9Slz7(Y8~FCYVLmlVSPP1+i&fS$-DrKN^B#jx9Tjw1^@gq9aH8_0G=wjnW#G{K#1mOINBRDeC1 z+?3uJM4LqjrHK1^ymqavm{hp&Z}BN*_)w^OtELpc=DwL(7czF5KWs+RHU#sfW8P3O z3yZKCH?%}J43$?-w5FlU@T?FXqA)?4H!H>2VW!)V<@K)q2Bio!x%z5vKHo-C5)@UD ze7>D1DEZVm?{vlt@YSA{Q|%F_5j^?Yai34Hz=m`%NrMd)(99jCb%%%HW1ZS~4Kus$ z7diSc&}j&aaSBqr z$7VJPhcQrc2E!d@-zcvm6vvWIA{_(lPKZnvC%^mk{WA3ltzO|l6x zyz}r9Y94+plBfPU{5rhQdnwv7> zgjQ@6{BZ7|_xXK;!?}ZSFyT>DCzv}{QNr@6!w!hdg|htI;eRv)RWpsenk-?{+p9ufg@F|~qbgxLY1dBq~CpK3bEC>nfjpBPU!Qa~^avjDNhB@6uI+D{C?z(J(Q*7H*T95x=mxct@A z#HM6%dE!&F1%7e)2~6l*TzYeH3Vv&GSvUs<0-r^)WuCEVLIqd@l9gA049Djjjt8E6 zV+A<=CMm$h(;cyne@Bd18)7u+bTsKg%0JSl+do5W#>gGyRX~h@Z#-jNJf%6bTShfJ#+!3ZS~70$hpLH>d#RhXaq>DZoaj00C1>iW4coFfl1n zfK#4~6u<``r2y#H;EbR8FA$uXXzFia#spLUGF46;u}{PvWqFhFIdn)+!-z?Ph!`iFpogbJflJJ89d{-r1}ma+~di#cE@HbPou zefSex?MM4a@hMdT#Ep>n)L&KnP`GRqM4R{dh~VSJf1xgW-Tm5r&|M2Y`mA1NDfsv` z#vNB;5fL1Fw@%KqSTe(s>n+*Gl07V0WXW4BnPf?YC0l+jC@)x2wB%_^9<$^TOMYvK z>u2pOE_x?1Am~d!>V7I+VJO{ac1TV_;ycr0GYkG+X}hA zR4$^flY&csLE5ZM-GZ#j;POVEKR)Zfwg$gC^wp_iZ6(e_^0;S%1P~96CW%n_K1ddl!ln1Uo~)l3PyLnM zl)c3F8wfDt;lPK*x&Z4YtVC!?*cq&8MewVx=V3s&@r(QxJ~iX&4UlGBbs`shEm<9H zGJHWH4T?3b4w^{yc{VZ~%_Y3r0Vo9)NW5GQxBY{f$0^&EBV0Mzg@pPNfR5wr<;%6C zVL7he3BMG8i}tq^|B&S8e`EY#c(db&yN>ZEtCx=dnm0B6aD1?vCF93|Adat8Uc>XT zO*|i)=K0w4w)h+DxrYr4%hDKI@oOAgVRb5kdoC(R1<1s>>Y~D6vU&*>-Z2O&99=5k zCGz?!bPIXSay%K1Cj)_Lhom4Zj1>ncBf*EQNr;gS#Jm)ddKs6wF{>wC0;l%25>ykPx9mQud^FkOuAGoxabXGZx%!Pcqfnl zPDMM#Jp*yit}brIYhgDB@4gzt-LrJKN%_3!0*n=7nGftRR&;S@I*Xf#&q*+`1zr`- z(;p+;q4@EOp1}xii*xi1LB$Hp5g3G&R>a5XDUrN(bGy+KESg9`JDdFCyZ?=QWwt!Q4*^+rQ<3ZHL1a2ZE1W*avJ2mxOdp;``b1 z^aNnCU1U5#&mtqF0oXG3$w@SfH=-`a>`;Xy64k?iYK)dE&l7eZB6eSj(-Oy{_9 zTY-w7o?g67-E6Yt86_BJe0(;%Xn@sNWcE;@HQ;EBpK@b_Eb!$3>kXQBl8rGj{3;;w zZVbO_~t-S>EO6Zm@i5Ko3DB0PbY zqtF7Q5KskAm@WE_l`}%Kz5PCyjyOc~!Pm#^YczBYGULcIVahV|2 zO<6A$slsN^Bq12Sf{8||FscfY4wEWhfi{6u9a05|h!-ti0q)co$$D}B$u*I1`BIqq zEu`z|{jI6-ZQ;I+k+3uRPu^~P+ZMDXWg(iABGIf^A>wVhRmlsM6fJq$lE*B0#FF1y zGOEPLOc|wffEBuTWb>)aG<(O%98PRuxR<+VPs-I#&y3f{j(@EFo42oKaSy6rd0gDW zE_w*#h8fv@BK!KvEgJrdO3K;~8p~4qDmyA0d*C=5>nvW4Q{djWS_jiTwSzK%Sn0|ZsY3*zczrjoisygroBBrC)8Bolk!I1`I;j<>Hz8it2ja*!qa zS+bWB6IAza0{>Eim$9#AE%?4YXb#44S3!6gu9ac^|IL^Y>p!_;3 zrx6`zVL8?X;3>`TI15XLpGJnGaGZrDY2QPZqp-xnN*x-Z4k&sP_VuwJ8~-i&t&)l9 z`3ClNFDzHy=OCXPm|66Kpfm4syY3b28YjZ|TcDwMIYG@(?R8&si;jinK$ zjr~Gd8%tH9jXkBTjiqGL#vWA0#+I|MLq8JnzG2C=mJC?ZXUV0OTx7}TEa^~UWG-tj zXS^+LFR|SgvzO)U>r2z)^|_)CU#d;`*Y#JfL>W}1DT_6Mtv3-5`PTg|O0ol8WRMt( zeq>*%Y=ucqU(S)PO?@6&mBG@J5CeJm=$E$!=YQ-KZi4LoMfQ*N0+E}JE`oixw>y#C z44JEY>FJ$tWz*vi;F!w23-O)CY%Wzm7CzXRdOLuE)xKwZL+!UH$>y-`gL6xobjpNZD5 zMy>?Gj(t-Es{=L|3oiqiRzj`g4YNO84r;yG_3OFi>2+F+UU)kOw0i@3k;$Ug+mqC~ z<|J&65Td6D{L=gR=Nh0I(+N?mQt97nJJ9)6ww z27a>)zsD~5xA5crTxI0#|Fu0k7*`xmY|n<;M8lcH@&C-8z54frJ)3Me-FWevlDGeH zd-fQxfdrPbXP-Yq)Y=i4{omQMza^>l`02vw3t##_vu6lUOJ~d5vttauKYS51`#-X0 z_X|PqYy`_s6UE*OjQ-c{*^13?-kwb{yl(FLx9r7#&z@!e4g40&72WFI2tODwSnc@; zaU%e&ctKj`9uq(;^p%6}I8ZnG2e^IuR1q)t&!;-~HMdrKB274^4sVS>de=0pM)e<- zRKI9SygH*2QFXzqcz3)4UgwBa@DoIGzQ=kbf&M`1Kz0grg9{Jj-ik*jsQCf}=$9q_ zRsEIMGYnPgZyz{Z*5970Z28;I4w=7QiLA8@Y&66(nDZb!BV@|}NF+hDG&aA!9L>W*}^ zm;2g>JmP9!;A^)GZZ7;WRHBk5Hh}HmPaW3`P?+HA( z5+_*JrgpxkbRqDcD2^5a?US$&co^%0TNBx{nVmy+eY@mDQiMBsQiX>M_{Z_J>H((<`k8@K1l>&YQ&;D3 zs&nRpIF<7U$iUC=zle_p{kZ;`Y-*Jc!wUnrd4l!4ecCH!mt3PlhF&f9tKjOi5VB%0 z_`WVS6xcq)!wE!%V%Q0-=)wgPpek@t%|*kPr3$SSKpsd!y^03mkWam{s>b-^tD=Y6 zupNFh1PkizNJg5n1c73Z6nUrgnK z6IUUeF-!_>CIvSK=YEHB>aRD?a+KPUn+wP|C)j~|oiXUP^uW|x0L3maU)WB0$>Iwv z9J<;#QsX>^NUyK`Txtzku*lqt4O;c}9yAzFD?3?*6;)81f&k&-L!PvngWqE{_`MY4 z+lnu7OOADm^Km;uY)*ne6@CVZDO`(xW(?1`xA0C%Qq6^sqYTrm6rV=m~I1IPa}kWy2u5X2mCZe53}aF8VqjW zBB>Mfa{_34l@y|v1Be>Po0*ure!T|W@Ed0HEy!` z24RV51AH2H=O}LT#o0~*p1y&stWe*#+e^b>nQ#CFg#(x+98hl~o1kf+bcww^iuwYD z`htV{wSw1YuM466dRKn~Q`EQi+Rt`{Ge<#H?zXYms-xI!Q9B3R#)6H4Qv+AV!Y;X^?yGmnFygao3l9TGd=A2p zK`mz%K@aK}=}}fOW$kGFcED_2TwRy}TLGz>kI(FN;3byR`EyGQg>{)GbT0LIbGn=Q z?t_?g2kO4Z1mo`_D%}8K_lq0_s}}s`tBRnmvt;}HEC$W?ry76+nu0lkAc<{o5z~bIhwPub$-u_IR z?P_`>T)&9lPz5;54lU|24r;GBs8(9rRN++i1GH8dhI$_M&oSuU{z1st0=7@+${yZ6 zty9=8AdXrBrT-9qo#a}#PF8o#2qMZ5JG(BgS0xBAOMKsu{ON6eKcDs6QgR=as8TWnY&%! zpa>^mc8^?x$Nu%a9rBBhgjyVZh=z=%D4v`~c(>6`xotrId^4K;ca3y^3-MNKg9xGUoG;JaoZnedPW0W$3;=W4_ z0(P<-_PI-`=a`=>CZ2~hn`+h(yY3O%(LB^i0&&g-7ciAqNE4jF;rW z61s5vA>vZMM(Ni(b65tIG8-u83g!IcGx?zB5?&PE555-mrQ>}6)tUm-?R(=XI z!37Af#@1u`xIcT)w*6UhLj3}VOzb%uK4bb|1(Pjfp!^@3awUa5E;J9xlIh}5WthJP zO(xaSfEF3%oAJxQ`Fxw*;S_g^=W zQj3J=Vyf1!4k9{mIq5}8D;sZ@=sr`Pn2CPH89yE^LTB;=9BKNnWk0~-y&k*^K~gy` ziJworKwDDSk#=Rz(5`r9IlH1$nwZ=A+*iONE{8@YBOdgbq2Bg-2g88rjD}rmVNM1p zvcIf_*+`lh`vX3L{hO8IB`~EoxJ8azo?xtEJNh$$c54lYfmu4gD01s4Ws3d71c&Cz z0nWIwffl8eY{;^}`ZM+qs&B{sEUPpGk9^hGuNG-f^~k$QtOt0tOoI0^TXUG}8Sg|w z26ZA8E}^`w%=f2B=^BtpxxkW7TQYAROv)`u=MtV_!ryDB|D^TusVPvTXA^~k>*YqK z@b{EXgb?yuQICJ5fTfE2!02BAJ zi1xyQy+;v(MbHT9M&dy`Ah&MS1D+Ec;!4L79J`?$GLN!7q|__`LGY6V$ME48-BY=`r62GM>80kjAUF^Im;|x6laj<6%8O!TfeE`P$m?6{p z@cs>T0K;%ooxJJ&o#_wjE!GB%v|$bd1726$rwSD|Ni#c3`e48mk@ARSfU;%~PDH(9 z=iqy>E8SY1-Fa>DmeP#8Jk1in>jm8@x)lm zz(~YyfdRV(0|Al-!4liGKo}n&fgyB^Zzes4*%9c$j#wfmQpQFl=t?EyC`XH=Fvw@o zqYs0KUI;B6jE}zVuv*K`9hr=4ofLq$rrBiO!7+;3@Zjg7D{rWrgu&XiQ{7MiTNR02 zmctiXzr}cHJ{`vg>OTBSAc9?uRDlg-fhsU3m1Dl zvuG4N7w*!aY8w}MRYfT|(N>KyTo*x-0;ZEmq349pXjVc9aGZ7cNA43V{uO_R{~p4m z`M7&`+>ettR`tNvvYQNX?sPYYXHfYFEbVn+bYWjUeI0Fsrx(d4KlTw=;eI-H?k}>x z`rg{})UVS0lChi0?w35FZ0(n<{4$}hO+A3D%Aj^nyr}i!zBqxDPwk_lr=T@7y*7;@ z1y?<7a~1pxQK#;Q_i&fwgdf^2$*I5q{L7`TM>ZbvsfuwRPAmm+kw8>95dSp&%cVZ$ zL0qxJB(X+Va3d?IDFsn25WiSvSbW2ScbAcf*5(q1_JG$L(`vXAc)kL z2m+D!qa293N{__}ABkb{E`qqM6vW@q-9YMa2jVXf1Ja`IagW7U;vkv{;>c1EcL~Hx zKQJu(g+z5f_8{gQ9K+)61Tpqx$w1B!h@UtR`+6+09>l)$VjvDDh&xI_yz~nWAK`o z`zA`>#gboBP4lS(5+zev@;NK1Oq9G@M9EvNWL={BCs=X^HzV?OA5n?hstDGxq|Hh$ zOqATrl2>Uw@^!NlCD*a!+cXXLo(Y@qlJm?Wdyt>yzX!Ac0sv>MA7rL8*3A^on5C&l zH@QvBk*92r5mPp-w7ro}*AklFi6)xtyYv9#Oh1D&YX5qc3=G;dv{dd!euaMJzle_m z{N-}o(M*Xsvof1oYL(@$o(+>XumICme)4Pt#qL9|3+}_6j=Z$)W$+i@an!y3y08w8 zM>qR%U%at+5)4w1e-13&NQB$Csn7~WU4;vGOcWv~N>}$^GA$iE@X`yixlPphW=>Hp z46LK^bwqt&>Lu*@p@nawxb}Ln$LexJVJ0O69c3wF8McSF?m3tO9<=3I=A)1wZCn?; zs|}p_G-SbB>$txxd%cRID%m54^A5`P4!3X=!H!SAD#*-R*FA*#{9|91v&=GBxWYZI z?Iu`XXKnXz?3bVMtugsAVPOz26fWPPhz^8%_N`}Ncn5$i(ePsH0gdmg6usU}7|MK* zJI{YGJ$A<+a|Xs6iQ|ea4Y4qr+$T5A$UxcqG3(3PTD=)#AJD`s{HNB>~{T?7qtSmHb>) z?^rD^_qiNx`sY?QS>H`=R&Of)jH`oAT(eSDJc+$_5daQbZ+w*xT?tfC#%s#u89)N~ zy(ag|`>v#8@0ym?#d}Q^xa)ewUtth-1UG{0rJT*73dcU_R3V?5R$U94P-Twziad$y zP6P8kn2=4fv7G(*#5U~5HjRUAak?$Rr6emn-XW#8#}_&ic)U=i$m3OjPTM$AK}D39 z2NsByP)2Qn`^6clhcaxLjbP{XeFVj|Bc9V<2lN}?F5z;bn^<}CGLYJL6(){>y8W1d zY6iS`UvVu3qaAf6Asu=UWOM}yqx1p|?(LtjwgycxBf${>%qh*cbE(PEaRj zH+65}twvmFkx0tcYs-u7g%;|peij|JBC_qu@P)=coTTRwifRP1^Cy5TCpF?@0oXM@ zlRbfYtdV;d??G%`Fe&?u?8{qE(mt)P?($F#ehH168hFXk5~V_3MJ z@D6o;R&A`8-;jIbVFRXE0TIKDGf?-)$0?pu*C~1XDkibbbqH6m#*x%U$d7w;;^Q8) zvoDC-m@qZTH2HZRh8a3VlgEdQ9v}wj(c~vXDuIW(>pq%UX~a;igL~j$HSi2(C%O)< z|Dv--KY1*)MmN1a2^do+mgmIlg{l<1-U^oQ8fSSV|9J%FiMrxTPvXuhxHLm#3S63{ zOySZfdW++G3g`r5R=(tb3}EC1BKAh8#{a&cEp%6*LZBH`<@Y zYPv<5-?kXoV-!TdU80C6(~V#lX`@mfP>BF$n(Ob{SW|!PFhWM}WKU`U#SPR$)UaE4 z;&6^qw>Lx9pq@~)0vST+u4-Ax$p)4&hG|rPa$BLC?>Q=<+=`E{@YQb@XaUBpQ{S1t(y3q!040Lzf}ge*|tvHg0k>(f(G15aU!d~dA4q${=G z$7F7IQ8KlbiM^{K69E|u&cS8^$K}ksf=M^4!-%xqA|av*Hr3E_>HJ4;Nxgm}b@xW) zGn6i#cBhDc&3X!EgO>qAFpBK!lQr)I?-~P~D&&s8)Y|O~^bR*NszEZ75*fd!FMI}) zTl^ia4S1)#4d(m-9hz(?AK=^eAN%QaBGTnrk21}>U5jcs z+%6sn-dPp!PE~KP?Q`t~?9LpWCYj79ehWIc$O&KHC#SEWKTjjQXBR zZOZdOI$To8-zBrn_1K)`P=yKL^@~^z>B>=dVMvx?Y`5w<##R+|YvwZaAx+(=LK6Z| z3S8xFi#ISLGEjq2ZHueAmL>R(gbWdw>15Z-g-@Yv;S&Nd4jJuCgd#RSMvQGB!#lIz zEHZBmCEktD3&ob-yA=V20+JzPyd>N`&4}iGZhOTMGcFYJ1s1z<*A9M}h_3TR*OQQT zzKBod&ljcHjh!!QQjfQXJ4VFUON7cGf6dIpF1wnUZp;7RT-C1tzn2J2pX0=#&;gbd zMgXO7H~)E>9I7Z3se?LZ!%j*0ZYdv_-A?i}XSa^P2*3?!5dt9_Ju#R6uB?XDvNj~K zLFp0;dq?_-0gbXGMbnq9mM_y53N?nQ_8@8_Yl)P4b8zM#vHA8R5fx_@9?!n~r|ih9 zIL5F#TZs=uyS)eVw#HZsYF0rAu4hlw%`5{Bs)OEC2SbkgRPTN%u4Z&$(Lh8(WHu+f zBW3d*aWl0f>#SCD;m`PFNO5-Y#AN@erZZ)&rz@GdKa-NqdHYszIsNLTM89Xv5R%ow zUKePxZ?xpQo%(gXCDoR>*nTat5eRO#)o}*?hAJj90M=`r7B^*fwRVm zY4o3DJzYjfuxeYGs~sCQ9RM&K*6+m1vSZyR*1znUO>Ln&hFtNmMJT`Gno#=1sX z?)U|Cx1IJvw9;pstJOyht|^-QOOO+vjT+flja79O#^CniLDLlg0w-pbgXMYTwtTCx z#K&|5U7(n2mGmKIWX-i;V>&NY#dqSxS`bCEyC)2YImimUmkzYn*L&+%T3^~{s4CuH zTwh#iU#>e*JAqG>$eEm=YD`PCWOTH%fap93kE?S}1~;>_fu$Rn}pb|ou)`XaXO0sjOX~bb+ zuE!$>;WPpC#zxZG6_WE>qJb*w2_1%SlxaTo^DvxucHF*YailyQyuPtaIM1KzxQ=KI zO#RWIB6_<5!Cdb~WbuI!JuKr2KgTq}PKS|CLFnMP)N>9CEh<^C|07(r`;&O8Vm%aB zVFKduw&Iq;4xF9#WrWaa*Bep4&kTz6wbAXBrrBXkCjx{C{OYefi_+4wsawG3GaAf)K*N6IsNWS) zzhSPQyr2Jd8Ba(f;h03sIH(~93W$#bHTO3Ls+P@~IWkbjMTgtrNn+l~Ax1X(2A)jnD~yQyFzQjqpvM~6rJrgv zCp)Ow9HOu9_t95kBJ*8&q5IB!5;^eGkn0_OJ)3jb>5@{|2Ob9x(it$L7-L3hymhnr zGk-Is7$mK7%WZ)Ke}=Nc==n0F{G${vMM~nCzue#N=RM1hdBd3U>=+XdJY2J0&2ytn z@@?=n9>$dPId+?`$z=1hMuJd#Jfwbhi;W&q9n4ZkFqjZ=C>+=Z8v<)WBKa%u5Zlt{ zq3f^iMjM;1>=V(f+D3A<*RNcFmiZ~CfYuMg06&ab{mJS~|AL(xqTyj{BOG(tT@H22 z6Re!oVa*LyN3otYBqZEz7vRjNvL8x;ur;vnno{&aiUP6=Fs1zX(XvwthhX1#{_s_r zPqaBz4M~ZAbb5Er0KlS)b4kWx^PEGT{jEiQVcM9Fg#qCeR|nrZS8BT5F_4UZK+?*_ z-@kA2&@U8Rs2cJ>5ZSyx@&i$Azw93}FCg6T-;{G>@Kxal|C=9}@*4D5G|7B0{{TT*vj%`}ZCpZZSa zByfeRA&j=6Q6up&A-AqXX(Mq?2g`R(++U4?b`~&#U+F!MyfVqh-+Zfl1pnCuV&kz# zfsIEb6g*-7E;=2yubH;5iRKqCa)EZj+IxbeYYSyFc(?Gz077O0V>xM(EJ`|Ta}#Vc z?zUWeB;Jf!LW7&=ul~w&C^|`d8+L_WYGn7Z>+Bp=86xs)^WSZSHAm6!< zs2Fab$89bgB3x^x!8@<52>ufuPaNiYHUW09#jYMvfNDJ8&5Dzk?-G80^UHm2cl%e5x z7p9PdhyhpV+`h>TqwBtVVT(?z!IEy)w1bb@4^G(bSOw;@FL!UL#*a!nqJy4EGiPC3 zj0rYYgOS7bFpKpT%Njn7J1&mk3*X3Psdol#FbUVYBF4*FZn)0 zpC|SCs$#p(&E`mw)J`WV3{<6L>Wl9iAGE*q394uG9}#PJ3qC+2|7|hdTKF|4KU93U z_%G&TcYCZ7h@=X8!PXb=iBQAkXHc@@t%cc;ioz`X1J^ZGcr8JR5bX-MH5*Yx%o8GF za*huvk|+|9+gVNVxf}V!6Q1MabE7JPl=uU+(VGLF`Rq#7Aj>jGK8OL{)>6E{W$t;N ziqrIQf(B12LuSh(8!=u4kg&kgGw^vcs8Hbd1Ph1YpW^e#x*l2b(sAJ_AGan%C^39f z_qc{^(D3=5*S#8J=?fJKPi~BcAMg>Y^vz6T63SsH_y`gYGmVjo&#DFzs}6cooe~NAhr3Erak1WP`!VGP%KbKP)HhdP}aeWU(cSEV=9u%;K{V_14^7#-CE`zIRhQeYiII zaBZBWi8lY>6CL<=PR5u6F1*`ZMF~CTIh#c=fhaT)Dg(q$E_5SF(oGl`cA7u>-H#^5 z7zgnK>fg))5ev0if~y}TNt_U7xxyJ@BX}-t@C(~l2e-_?cxHl~<;Qc;8So8(;DP>o z4?A64?t2ffeu=p-$CHBmS)}3G)L)TR8T{oRxLD=BEid8jkw=h$qZ5GCi;qMEhoR%* zb?7zWk6y(48=6SFG-;QP{9g>B+0zLAFHI%9jE0>soM7fIMoIaU`AYQQ47rn3G{FuH!_y;xg4tgOknOt#jpF}F9SBl_f_ z)ihB$->|>Ai0f&Y;3AGP&ASu=H-_K*qd089Gfh)>XT=T`*`r^1y`tjMRN*eTdGXTz zewGe&cOikc_H3!ZoR5uX)$19l=tj?2$-ex@?8ug5vpr8#bfbOcC}nB`J3^-$kt!Sh zpqcon^ZssuA0&A6qRvoFJ_jbtjKZOeba)>2&xGj8hkPE&mxa$h$^q0_f#c|4PilqM>j9JmbU};`Tcg~n zL0KujPga3ea{W8mz6F(eCFdTw5iSBUSWaM{2sdelvVq)|+%OM9WwJf55NY@cd>ta! zcMXT82pEuH=Lo^qaF}`)8s-Rh7Cr@Q9U}^+ixz6DL3=wjS1r6GgxurHOGhtq(Qt|3^zCHnhsAn!uFKYv)~)$+O^RTqX$rH zmYox*l^DsoS)d&Lia+rHHy~HG)2r_wdx&9mO+WQ&;2UPwaT*2vFl_)L%j)|1NTm89B|QHbrrT zIm!-u)~rXey3h&XcJDoffY)`?oT1?I!v0vi7BYzG6h4NTFxcEGhwY1&eBP4JSaOaf z4_LCc34YE`=(k1lsm{xi?eGCQ=ySBw=V+%f^T zK@U_}363l^1V&9~j^f6!sq8XY4pL^QDxC_xn@HtMq;7C6d0&Dq$eH;to*rOl<75kG zm>5st!U11$XOyDN88M>baLDx=N)ADOtIfFGO_)Fe^P!LDgkC6Dq;QVXLOjb_aCdM< z)r0`O0t&2K@a>-1*fP2`xSyQGlut3?x>%+jR$@rqk>I^+I#w5_7vEVpnWk+*^82d6 zmJf>UFYE`N9t1fEeOEq2{LNz~CqVg2U!fZ?!TmB|EKL__1X&oX!WsSsN~Tn^%;gp~ z_v@%QK6l~#3lE`NLhcG*ar0)E#%`9;CUs1zt4j)pNf75hM1F!yH5eigh*@CiX6eIAUD>59WEh3yz*x@7#y(SyNql*rvB`31~su3#jFw^Uuz402}#%#VF@UkajKiiN-v(0& z%8g61!@x*2GsYV@=vP^IimLIIjB2=uJ5=Nv zY!t%TxriQr;Y+?7>V>z^_yJxAXo7LUPt4&Y+718CVr1w?n3RKaXUisk)RHrlAlmWx&Eb*$+tyA34WPZjAJ0_XL-vOK{s1QP ziR|~RX-my`_s~-IY%*n7ZlZ_9?nY7*0zfOmKR(m;@Ncb|4&;GnRg?-)LI&h${=&(* z*PIRVR;Ar2JBG&Oal5A@8L=6enwm|ubDW`3U5*}JTEMs_zPN9Q07H>39#T!KlF73ia_ZO$K{`2Wu@-646SJ}DDLautjUha{7D!?Nxt-v#vX{b)=QB8hfF7Gh~saM3&+et#Yo0uhS_L^^cb(`vfu+_!)oSVl-X4#T?@0DU^P?V~{X z!)|_B!D@D1d=(#I>xP+PEb80MgD|ellKB9(v{_I)UQmEpL|szn+g6zy_sLya~jC9^$Uy zfwaRc1)(%@`cou7I5>wUQ1XUlQ1F_Z0$LT6wy^;J#HY??hdTmzV>KXx-`J2<@&e$9 zcmRh8hEpk=Lf~+RK+=KJO}9Fk<8-NK4OL7Rd5H?+1cDx)q~TYn=cU2cN}?u1m%3lN zs`w+0-HUIeL3|Oi=SkYbfxbamyaOyGK<-ijwA4l<5n<+YXu$OHXI1e9&w13tk-$;O zZsB=nz{W^hjrQn@hKdSIh^ayWo*{tn${C!mISWZ)XZ}-%HibKAxa#mvaMUarqZ=(b z*pjbXlC~sg$rXFRUVQ|{ZUTFy^@K1Pw};;b{LB>T0W5$blKXgSk@7n)ToM5r317RR zB3QqGA`@0&#qRawzuZf0kh<0^N;=wHccY7TMkVbKKnzkgSEIm1h7^YZnakAzx}`KW z*!I(*A05~C8+8!0?+yx;oL`CukYS6PJOO0w8X&~{O4H}cevgYEz?_7`V7yXA1XB|(z>;6mV8Y8z@{56wCVhu<( zR)d9r-U76!u9rZNEF-*ORlp37y2ywEd`c`;n52Rj_F*YM&-7Oi0b|409Nh=STq!;% zW}m-{eN(K4ECLsydf|w$ON)wk07?!a^-!34hvgSGaL%LSM&pIjT0&@mUSc@s;CBsO zThDh$0M9t(FRaea{0;Wc&c>U7J6G##k+GgtDe8Xa{iu0BuI75*0Z82Fc4}*j15qHn zxO;Ke;x5Ih!6O-I*>5cwwPZv|LYu@7$l`o(0sMfgp7ihfF)HFtms>VkTXT|g{FA1s z?6!fc^lz+=f-cgboeg14wLz~HtIRAzbs$(HssgmLypSkuI6!o4j80rd#4oZC??u+H z<`UtVs$HC(C;tqVG7 zMJjV6XYlB)TjeqxKx84iEP*?Yt#*b!q56BX5R52b*qk>d(>&q8seh4 zC)s)LSObD4d!vx#DMihgYcG_Q22Us>TqrN&5*_PU*=A7Ayb1pfjzP@kXc0>nEIu5U zG>zNCXEjEF&6vU6Vj|>;#rOCc@Kqb(C=S$RKf$wX*9Z84^A)p!SMCb_@KHuL;B_LL z$ze3k4D2|z3#ZH>86Af_v2^|o$OSk30O#L+Ist(o^V=p+H=Pa)V9Yjv?LTV_|}z45D_A?o5imUlDOP@Cb@p2SL4S?uceM&T=MW0 z2GUFKRM@e}xfu4XH(}Vtqz}JyP{BQ-YGbfRIjb;g|SUcw{ z3mRO=P{Idt()EFBm5jVn!`DLS>9>lH?vA7}g?5i6E9p zW0Q&(hc6PUI{Je@qqDmpV^H5$YDLD$qXcmvC$Y>8N*<^7e>9TEhZZ)IRCotROTb8g z;@VqIO%Y2Cw*Cj?RWIO(k`z-B4rsQ&5n0ws7<{y?&&AFbhtW01-*7bOdyP07_q-0CuYn9iB|1wp%g#^#|C_l?11{CK44LG3LA5g*X|qj62ggu6<~Z zcELF9CZiIIRXBw{cgsx8RWmHv-;#YS*~5~lJHeIA;7DgQf62f8BN6CL#Ow2^Ro`|| z20A_nSjp9H;6qTi+)it!sV39R;D0)YLkm5o#(Ap(QlcqcIFLV3uNtjUtDC4%M~YL(GT}?@X4j>t3JC z$gaz9?WCCwLmjBQ;w)06m7o6LyHfeO2ltwU@n&_n$p_~p1NqcS6;Tu>e-|SEmq;}J zH3ZR^MYy@ikQQ3;0<(U^4V}H}!F9eW6*+|w|MQrgx!#li^4+Nz3$Co9bCFvfhsA)DuxM!4W@&dCs(;VbnKPd#$*gBvsfWk3B8YwiiE_v=?;9U@2Ca(sjX#Z1dfzyr0JLQzhpVs$mS#@R@fHYh z*OI|Ru|zQWDv;SgD=29eI?w0b026gh@z2C^m9WJ|3)6h+n2$P>Uiu~wUoQRbO=aH% zG7#ozP5r>>dKpO96MFY5{z6c-=1n`ALTU}mV#Bu-9!@QTb>HL(H&+WBuv)mD8ntlL z`6-yiq0Cuf;Zyq!I&zN!NV79)C!V*_<~iUm@V$avae z2ckXeg0Unun``f2DVs+a4d5bQ1O&ET4s(35D_Y9R2<0Ij-GHoQ2hO1Q4Y6<(AwT0i zgD6mNtK;p?dO}Bmj(j$HTBuLtrh|K*F`EN()8|$Ra;^Hb7T{U!76fHZAlMel0%~;= zBz`yRHv&YgbpmP~&xhkRH5@nD>WKBIz1Uji`o+B%K^W`F^^+wf1}ILdzvB{9KQPLS z$pC_k*quqkX-(2BM&l>9E8B4RHH>{$0;1$+>nQSTFp13K)O6WUI5i;(5RpDPH4 zewr#bHML=CN}?Lcj}3{R2+}#1!x>e8*!6?f{EPP=8{czaXuK!}uagQ<-DBEffRcTO zqSYiF51TS(CQq+ibuf}BnOiohh7n;x5Kf)qE}XtK86#rYd%6UO6*$A$m_%)$)P+-H z8P3C4Q!d!$iGPa2aVhcwhF3KD)ZPyxTnG6Ktl=nN zG%Ka*8#-B=In<*oG8GkocSr(Wshb!2S({l6)6bYv9DyL0#!F8bKT9nkrPjhjkbCZf zYr$cEEcLV2s~zxo-d*Z!_eygi0H||wHCGjmb?B}Vdbis*t@5c;Pw`}m;B$3H( zh9+9nF`OOPppR@xz8!&9co9kv=*g>%K>f@GfvlDz&>czR7&C8!nm?&T=1g2%GM~Cx z83(>NEpuo5I=oI=9voaczCW8RG{rFu9TMh|W_Uc%@Uimt&5r*iA@;Ac0Moc1Usl7Pj4i9-f>A2Smw==4=3O_=#H>Qn zRdVJ%VT?U;-e1*lY}+m!EPj~gjQ*%!5D$y%*pv{T!xe)!)VpV6hPr-{dn^8b$yj^T z<&nzW0y#F491uX6S9h0+%3@UUjK@n~+PW|&*(O)q6jt~rlnnRog_A%kj~L&vST+=| zikqlz(jcGu!w0?Ym0Y;NW%dzYe`DQy_I=wnQ7LFBg{;Uo12;Z&va6!u5DTw(vH*1X*|i{}eAS zezDNHi5M@pu&4`{6sFCpU zsPwPj_NA}Q5Zu!Z(ucOZi2E*{n;@P$3*W0&Fn1xj(z9uhItml$voc;J+y8?zt&^5n34Bv6u1xWiaSG zh;0~fkK*mxZ#j;v=}qjn0Jy!{pssWh&%YoY%SVVn-tuEW!G;|x#1Lf<$Gz`>npyy@ zc3g0j1);HgI@pRSowoxKc9o4S-`1Z1iLs zK`V}#w7Fv@u`1{T!h~Z+(xF&j53Ll)8xcFO*++6hRw>>d&BQh=O92SNEzamPnPic> zuh)DsL^*<*vVDTkY_*Io(s{H{;~ zZWIF0J{Z|U%(&|%Fk_*Y`4WC;?KSTGZR!vI;!!j{Qz!XHV&LVvM4b9VVWzP5WgsAg zn!=k1jmUn;l3?B?MEcW$JRhRpi+8mNu8Y}3#<+~1R3xe3Tbw)yjaIRzBb%eP;COwA zN-Nky=UN5SCorqaUpGZ)wZyG~2lE@lmT4A9Kv4f|)^}!7ru9xkXZqS~?&a*uk7q|- z$9=VHvz7lKq?l>Fds;VYhM2@6`Y}pTH9;w|na!QNl~4-OMSTV-j8gvaucs8;kH^8@ ziJ9dq2Dk1eiCFdmB!VtN>3OLx$c{}>w@d==J)5)!%`LYTBBrPcQXS|uBjq2TTl_Po zt449fZPJtI7*uVrbh;4&bfz@Gj8k*_DhHnJ=SFQ2;S^4P{V4X$>a`4CLWo7a>kvA|31IQv^k+=&!KCpHpkoD&fO(I)tH{j!l) zA5C<$=gm#Z0Gs$YlST$ZVGgH+TS+%UZ z^$7{-2;H-W^vBz6IA@Sgo#e0a3YJ{~O~1!w?-OQU!|Wbqi|jr4T{w{}_0;SgdmRBC z9#tVSsm{wLB=Z_>ne5T~yg;P}RV5X)Lpiv0Y9f+&Sd6#oU^~2LEnM9O`axY z^EDaV!dsKgAByeG`SABJ!)*?Z*^|!AXG!wcE}4+zr(9K5f`>?Akb0R?|5bsBB=~_N z5)#a7*fD@|68s;kNs`wuI>1Rp-6OA)M5Sc!vZ^3^{i0`$iTS#3T2+ufXlWo3sO_2$ zBlSL34bN<&dh<Wzg1fYHoYYOU(?H(AjY% zKMYHDVaa{8!BkZ#Uk$SsGs{a)?-(!8DH<7|`m}F|VI>7@-_Oa?BpEYLSlp$f{AtPQu#& zZtzQ#OJ&;avY3wL!|ZBi-xQ4=mw@(;O+tJyRhSGK#?%UIXrUN%ff$-my7_>=Y+fz^ zeT95#b*EpPxkW>5uzn8Luk^PdD41M$x(UGAvk;k9y1qLM)ZKkJNB!Yi%I=MTNfA80 zmc0Y4zaJoAXJE-@q#&Q3$NY0XRXs*RIa$rH9CTJ2Ol54t_%rLXcj3{7neYcS|xKn>qpG`6W;9(I^U}4{5(q@dJePt zL44;s{#WAfEvGmozL!Ko$Tv2}mOtet2~)U7T%FyyFUP2QYcs9>5&kIs7yb>@&3zB) ztYfPr^^*jw+TsI4^ z^x)4ov`|>4xQZZ~J?y56ZeOLDu(@jp*hdhyL?g{ygN>Si{Q{b<>jUgs!f@d60f%8? z(pvo~>#vaN!_8NvT$jkR?&$5^l%_Gn{kr@oPINHTMvT`N z{E9@UYNiu!WtOg1zzZ$t2YTI�gxq66>e|?PqbZw%P4MfDZS+v$<%`=b6!An4 z2z;T$SsCKZm!c|zpC20=fn70B`cjm-E_eGt_}0fneFd+*V;uC-*Pcqz4bFQOELi{! zmf^?SXw{P69|J!+#Rfcd*+bv7Za&}-hW)wA%o7Ms?xZ=tgln=(a6?L}@(=_$;f60m zy<)}BzL%-2m@)if_Q$4YMk{cnoq7Wu*Xdr`U*y4fL0N;nxG{&HvcHg#aD|0Au&TH} zMa57<9WX?zEKND?>;uSVZ>kW8=+MbF<3|xy%%^s9Aqn}o2%(WTabGg{j&TMLy7zXV5z>u0+Hv;vqh<9u19BN_DPm@M?Aw<4segL8o@*nxy1Sz7D*Vrx3uMjU zxDh_^=4Mjd;%E2B?Z=1xbOPy@4yx=KUV5V+*Pi9~O#gWhy^FS5E+ldeqW_+0Qz)lx zHgNWVTQKTQCMM_@Or;a^g8K@LYEhk0jn4!9V>OJz3|6ERjHzW}&7yY&r2e33{w{M} zL&KmQ9|k#gz7UFTYe<6&7O;zUQon;Jm~aK31|G#<%(!>PaN!y7I@s+AaD9>IIv5Nt z&4&;|`5U0u84Qd_2ap=V)R3XowC|u%Iy>)djCkGxl4$ z9SUcna61$>mljS!;ch6Lgu)gUmhfo`zHHG@d`ofX;!ef-Vx9d8f|U66ge50!7iSw7 z)PQl2LACyk+P4C#-S#-n-t0*xB-bZ^&`t<&74G>=EPA3mg17kJ7t2IX!ucKs9WU6X zKK4KjR2ypi?5E?3}=l;q4UcV|9a3MXO%^7%)HVq@$% z@XwedhwzNpoQ93%PDKXWd-UHqf3i%3tP5Xw7*$rE#UFadcH-+M?4bk_ya3rGOup)% zGDVW+dPv-;uB|>i4p?ZCwESZg&MBO{S1851f9lxIteTG#_aZDO4 zRBH-8hI4eZr3#!^784<(S{w#rfD&u2a|moam(%9P*AcBnPi zws&n=5Aq6g)E`6r?7TVC7TBjnJ5XUl>SLBdwfiv{t+7}?t?k;9>8Q^xHR3V)#rC!b zcB$J$pEt|;R@Gi?fIwBX#?TH^6l`zHq=dc0SD^`kuVVS# zY)f>Th4zy0ymv+vup2@N&*aR@S6}jFN({5f)o&3Ta95*q`#9o!-i6!Um;Y(Qvyie-D%>T5sW8n!AuV z;A1CVh2U~|JM`8IR-|$wO^zz3br8^_!~@O7pc9@Neo*B) zkaq4%-~gr70xc&%@-KlyTXjEe8JO}kiqPy5wAiRxp060G%G_OtBTrT5YIe=d-Id4K zJ95zNb%^5OS-PDBj;0*Q0fX#g`hyVabL=uyoTS-FO5Oo%FF~w!2eS{CfV`x@%u%d( ztBQ{s&k{tKHy3IN-Naotk3u(htHFru9Xmep(xOO5*SkC0+DS!Tb>zOB3mxqgVcku& z=+&6(nHslg9Fo;u?A}&c;_d@Yn&;ta($?u{hCXHsr9*(h*cI#$bf(le3)hC??_;#) zD`Vjq>g{5qn|PByj-E7*mqrsAdZC$x%uJhubTZ2%85l^?IBR_f>97bd918Nd32nNz z4(Dp75zqku;*N9v?Q<%x1ztnIi(rLzDSh&7ctP&r`m0Zsfd!ND2sgPgg6C|To6T?U@3ZnwBZNk zzOdDOL7FX->V7LqpW=2`{;+xb(VaZhwx_aa+n_K9BR}b2?fLYcwZ@aWNz=UQnkpC0 zLlCw&wYYQPEs%%coL4quaTa{UlG82u&_i%dKMkHli?+x=)%mKc$;_Tj-N2Nq+%B$i zyW*}2pNCP(KR$DI;U9UjOet8b)L$)zpgD)r!Qm)8*NS4)SJo_sr??0=V)40^1Lbiw zc&MvgO~e80b{qFj6g4^6X+FqlR(KY>mzaRQgRXmW0f!f;xR>Lla4IdoK5Ee<7^_*i zDg9(A*yMutFi7m*BKWO^^SQ5+KkVLVo-^o-OYk^n4*aaGYp`;3t9{tO==MG0RQ&RU z*g;lS5ldLfVWsY4^;mg_pGOS7u^wET>lPFdzw&+4_(Hs`Cpzhv^lVC#eYxf4KjbY1 zlUk9@zwEp|b460PbRQL+E1pp+ue}@}zBCKsr%(rUwPMu8{M9$@P*h$tjJL#YWh-9{ zvbX5>67%Zj-Jps#PyHHzKOcL3FE;wvl~r+I&!AtdAl*M zJoq32znPB!Kc+Mi*NylM^yJ{}%rSdZ;wu4b4C(L^19rFC7Ezap5U2?uh&CM6Gxmt9 zil^YFCA_O?w`(%KyMY+Y+<>A(>Q_#wYI%^CFrioSiGEZg)1EctraK)MN@%gC(1AIv zFpqOTsBd`L>@@*|!h6{u;~F#pC>O_CvT>+X6QE7LYQmzIQ=@C{c8`lr30myiI8J%N z*s{bKY&ZUJ5z#~UKp(MM$ft4qf#c$44_i#s5(4@Ukh1H3-4W z%R1IU>tV}7Z9Y-6AQg)>6kqkLuByO6w6dru_`XHPL<5@Ivt$99trB zF*b2lDe1;D0C5a(#ugl&XM`z<07F_(9%DErT4P9ynRYScV(L09JY6t!qdp=0VvKYh zaXr&@F#-$`6{YJ(hPwWCkgpcXR-S6USDS`f3Ow~!Jf^6_`F@b?+lH`bagW01=nu3M z-%~gdo@Vg$KjaU5-~}b`v*fpy*Ro9PDd=b1tDnwc;rFmD>BxR<|*!C zNI+%~6F3N5U&CM1Q3OD5tH0<8SpG7`=$I1lTFFvA7YfZd>|H(RqU2S;6uosL-5Kc43U!dt!&>$r?EYY z&vXjs=TAV#pf9{II*!Ojc(Wqd5YNu2HnT_K+1PMO4d0dm!5|}FKDji!eAvzwUOpB^ zx>!+v#&EWG-A2lZJ0ds@M{;?B%ebfLvfn24el9)|`}|woHW*IWJc+TPcFsN&3uD4b z*Y8`q4;sKcXu8P_cG2YJmUbfel4I_(g2Zg3FAfUy+G zz|?aLMn8TK#=+J!*UyXu47l5Rn?Y}v3@$@4V5~qgFg0y3hVX+h{s5wKME%T2z`&8q zmv&M(eU+JbF-zw7z?oA#S~f?H2V&|Xe-7~bE+ti9=1hgpAQ zmYp6XAU0gftP2_53Sr;Iteu&aPo41-6Excz*m5>Xe#N6Rzg+`Ev_IB+k%~wDyw+d; z!T`$JOPhm0xh8G6E^2U+2EN?kXze##Wl}R{sGuzNvk{e~J7#b@K*nUwdY3a$H(js? zHy{J-c^{~~uA4vjXQVffX=Y^eT}`Ggn`7#7^z)`Jkr{^Ri!LGyt~?ElxFaI*MfhFF zfa<~W)gaMd-C_r1DxuGR01wcooqe@&aoR?E&>@GGBfzOO_|m)j%yk(zZdUAdZ!K7D zQb6;#4M~}}^BnC{g_}4q4;O02_fWWvJ21NeUrHK7DUN^b1OWYW8j$M{zMcuci?vIGsZ2fVpuMABi$T zeiL% zPBaW;zyVGY1839qTfozsLOnV$GkKc5a?)f~Y z6{O2u#UEtId=RG>cj87e`^!@x!_Nk<4r8QmGv^{9ub8g`o3H2Fe7%%o$9yf5kNH|D zT;w6-mk2PV#+75+3dOoq%GWbF1FtOZhyh?8QDJpLB z?DkO4;{i764#F;RNPt;^&a#yoP#4p2qHgb4Gd{ofDK28-1(JCXHdfcGfdzu33C)n} zGMzVbMik~0{`D08I3$S~kxZj>J3c_$!v^`2(;PbWQuq7c2To;=rc7g1_;dcqUyqaP zTeC0!DS6|6e$K9G3U#|;=kio2H4rPv53>QY35Ebi0KN|}{X3NwjXYNiRp!mvm$Do| zrINNI&%yT`;~4^;KkYvmXfnn{H8i)hKLdLSAaN%Oci1dPUDE6<}tZ_{WjEed<5X@Vy~J3{SB3VZR9;$g*i7lYtC z&&Z}US+ch!yIHccC6g^lS#rK5pZW!K^7EQ!OYF~EDZg(xf5`q!IAMraR9I-x53x;I zff?sapP8>a;`cn(q*Iy$b&u83r1-g%*RJL3&ilk9R){Q%>nVpBGM{?CO5x)MAO9c> z%wI^JXa>>r)QvvF%!#Ha-cbE-PEX(&G%_(4u^TWdITL-x%|vONEpLgTQ(mg{)-ix& z-e~U0P(4~%OD;adh$sD4@#Xz+#PQij%4@=CM8U2LL3EZ%;zEFkCadCY!K|kwS`R#_ zlU_>H*UGA7X82Bm#&FL_CL zF>f340abz1F7C3UZj-CqtkmsOLvg!^0{gN89c7?MfXH0jX*}~RL+r(1sL~kBz{$1Q zf$jMcRuv-`?(1EcsI05C*!!ufzjIb)Rd(hhs4}I$=H15PF1Ir7Dt@i-5Te?J2k;M3 zAl}((1ic-uwM@~W^3g$Bzi+T{&m6%dus2(3oKyM4&pJnUklvTA)HlL~&-77})&_aI z#WgYdj?&S$8;Wk4h(_N*4QU}Voj~HhGkV-J11_U$jD9U*(S;HGGk)}LCZv#%whc`6 zI?@2DudS(qtoKyA+BGv#ScCuSSl{M(COPAoODiFzT<_kzK%naR*!s7Fu|%5Hgq`sZsj@>OfyVL4mSUB8{tG zId@tWn)bfJYOk=o?;7jT;m@hleciempV2Fe!#K>r??tz7$! zCGA@=B<}dO+0fCEH#XRv>|w594l-^K+T3BJE?_uVaqvB`!cq9gSSOAyQy0F9HP?2~ z_XVI&95d=`pwM`e&R+uGA#kF9^3EZ?Ljo3!*YJ&aS5=%7F%B+}$3D)us^UJ5YcVXB z#;`1$!C~x)t_!<5`KpGzMjB8!2Zq0J7%T9?D-Wi3Y)9~!?*qz(xrz_s^U-`P<#gJb zfo)FV5^A{`q=s6)H5~bRAsCIkET`cDuKq9M^u+)W=k#bvd(UYaM{rM}cI8!)(=wUD z9h@F!Q~6&Jr+4t2wh@|$`+0qWF+Bk|7?ZqXY2vB`P87*fT0nZCCX`;jI*FUKFedrN zYQG}U-fQwe_t`ck%qO1z920Y8#Lx;nD}0#Y?k&_dqop@j(zah>ifLS1vlHy%a@)^z zpR6c;rg&a3`ly_M5lil}czX6S*S%#YF|Sw*Exo zK_I&5Khy<3*GsJhCAO5r7kF^B^dsQXEvPy$=NtcW#`IhKX~tA92<}0O3o^v6#a*1o z-w2^!Wjeu5Qe=v~&Ph{=siuvH@u6K09+~b@RLth+)43&6oAU{iON%Lo*a*@zR`OcA zIPYQ+!bKr&g}@d1xEDg0&CAKu&AV1IGw+*Hhy0-zWh)Wgt--kqGhVBJCAwv0TD zu&>@t8Ojr4t^9|)L9XN@EC134Z82(GJ}9gegva?;MTfEjsi*6AvY}tx92+_q10PpF zY|Iv<9_Y5Ai+}!IPv%}To4a9=j_O8jS4!&?JhWHNHFzxTa zn9K)a7)%2Pli^_Su3lCn;=&&5wNr^0d=U=gXr6G!O?3OZJjh<}FwW+0R6iLug=7(0 zFZYuqv~i%mq_i`iFS`4GB7M&P@5YB(%f*N4@BDY;Ll9mcW~#sQhG{I@s$|^pDPtm#f(8-Dqp==J6+*N>c zuqBKSwZb{#S~v~?e&SddA38b33Nn_6HViA6mbR?_!}!o&3je+M(B%)y!qr+*X~`=O zDf2~3Hd*qFB_FgZC;k}rqHKKV&kWV}Zt9{5>7)ti^md&_tTaU335(FR8a8GREK0C) zap5g)A@Jr%7GQxSk20DZz=u6#cTn7bS{1=4$q<`9!bu>t6%q8XEqBt+_>%RFB|E-&*W3a~7k-tpA#R@_a@X~ARw zh*-nA8_JBsao}=L*o(Fw03DYQ+y_4?&ptKE$^Q>^?*boZQT_j?X%@E7G)rwUAm9Q) z15^x9AcX=c6j-2QfCAxa6sQ4PY7{eJ&_wV8S5nK|doIcLtCxjrdsnyOr&S*!(M zV0>1Te)JEUi4rPaHPJ>>U|UdDffcR-t{yT7hGK75ffNN{d=aJz9fnjy*ZoPF?0sXo8IG~pfk^ChNvqwOBIHoxU37L2;!FE04A3x4Nv=R|A!$=qm3VG@|LRc9{n}*g8ogz@&N7K=(Kd2JbpBmb zx7Iu(=Yf>echObYx__^(QZr4_G*Z{fk%LuH=|Z8oj#tr$JEP@5d8&REJ^VG zPp&&Q-+H_zCbu%*isswUR!zJplT;>KIGpL({u_tez1BWqUOx`#d1{P4+4&ArUcGQ;H95+jO~L1EWy zpBpCSPnHRoNO}tLvT6+2bF3PD#^PSbX)PtsdJ4)~vXejO z>hK{~hx07ZEvzR*79SnLExQsrI-o8L73w6venExIWUaQs-F}~9tlbRQ3*QwNQAjrd zNbe%WBu1<9rFp20er?vc04Fx8?{*XW5Yhl>H@2rihq%{kBWloayM|S-I6k`yX{4b7 zjskj5D#z>%CMIoN!J3Ax)Gpp)4MV7%QD3Z`pO1DG4C7~2>$AnHB*HFu-*kiauM}qy zlKDhb#?pE2^c;8T^53n|yi@K8*(@1+t>a2%)E5?oF}mHRZZ`|>8tPNV9UJo&P~6}P zn~8vu{ur>JFP5h2$~A2V2<<-=O)?Lp)X=!r%aX5QVtblGV^l#7(Rb`yTBSzTwN6)& z>ftT&{06yN;<++nV)&EM)qXk8sk|zVzBTh-8yl9o>0)*s)*1=jg>@@6h_cM{_Mn_Sw?1uJn!gw$ZC*+DmI*if;Ud(8O`mZ}R`d_~i%mXS)8pqLuR8As75r+aza(!;aPjDDDmctvOs9CFKobopHF$hxC0M z{8D}M4e&M^{gJsre{sP%U!=3WjT4LJ0L1#+xph5maq~e;5uL3`vG*Q#q#)-*I8*^( zQ_mr>#vCB)Y$Xs*DX7@G@i>`Ob~`xtSk0$XX6{gz9Fr+t$`4oFAlNEvVXw0ZP7+HC zo2yMia;7B=GkCSpbdd}PkWx6v;ahCKr~;yEp)zAUSR#UG3%IO4tA(8Mt9_9|MF;GK zw~j^9yiG(?&9r;#Xr(3OXn+rW#SoNO$Bn{)bsQ!P)-ek4IFknrx8sBr!aAyutfLB) zwaS8Z{L22y6O&e`otduqi%>hWj>Xz}%STPjp{xa0Mf3?9MS4CjGcr7%`|P32#91N` z%)^O;u2-$LZRevo&$~X&WZDDx5=TY}s{443jOM5%lomGuvSxFY=1ILR4u-P97+W;i zaq>Dna5I!?GMb?rw(F@%mGjM1q~}+vh;Kl?fjC21#5tZWc_U)h!V{5>&gJs_F>)=l zgJq}3Q0XC6s9fk}rN&s#B6YscM_|r825T(cD0B#dKVW$L845Ji@FFE-Sg@Yo$ImWj zNB%`Qf4M_0d!fYOsYy}L8@wUB9B=S6h{Eb&?)~x_22b`Se-DN;`WRmz$nQlgzFv~+ z=7=juZ2v}DG%SAJq=$(UcQcqc3u%?jJnN?xDmxnD(r1fPRq2nJjSdxt$I?hAR#SVJ zWjbox0^TF$STf9L4VteNikq!C-{TV$TSWf^p6kO^i-ji!&N;aPF|xeezblZ^XQZGv zu3#s*#U^vzD@Tk7OH;ckA)-eGxxd|r&|=(QFsQP}{9>>i5dtxCr)tz>#g@9mUIll} ze`*|-43bkK8d8X9Y9|Cwc;OB3fD*mk6*4o@n%XqqY41u`WHq^1yw-ANBmZaESq~`v zCh5Hlm``H`h@wf}*_U_%Q+gbO``V4x&Q1khTSCVp)R}}cl=i)1 zS_5e_mG)dQ%}&1;s$`YOmaf2rvwz`gQ+GHDQ1cQKr~$RXC0goEJ0hx0VjDG)upc1q zDm=G53l-L2g$gI~pEge40mueXx41}MlVn<;ZkaJGEbW+T!QhQz5{w_VaH(}(=w=f~ z0%7=p*{U8$WNT2dds7MUHwA_#VYuDVn?DMj$j{QBBlPD`uOfj0zaHn>u@g~v<+Z`B zTET{9(V9Dlfv0Nt98cM~eXrY6=G#>%dk^*fqS}3ANJ-2S+#RoTXP@AZuf<;Km11~D ztgbFnEY2X;+FTiEu$)H2I%t?r?(E!~V>H-%U@t4u;LwbG)>Y1>f8DU&)^3k(=nDqEcLc7q=j&$XozPfWS36dEF5giowiL~q@@6inxUhrgm6 zzT-?#on@A7416mUhkyTGg73}u;`Q|uTj!dcF4~Vqf8hLI7yQ`;zjMJaUGOs({KN$h zyP)ASbR!SoL5IaU!V-UZ)O9Au(yZxB%-Z+fQ`f0V(V18XJNkIGj$%mFDf-Lyp0D2U z+Wck5jPSJpx5}p8k68oT!6{!p`aJBGna)eBUC`mg?B;IH zZdQ&gf`ifS?~<~a(X^(w+F-jQOu;&wFDSM>Z?fj>E6ZlGRlSU09mtHOqoLIqL+j~8 zk+Xy?`Sa+1mGe(C3Rundy;^)`Fyk&jk$)>ia>mOWs>j5^H$lo>HZ)DV@AH~xs%|B4 z)Bc*6m(psEnOT|vIgq;9n1!`QlHtS*@+Ym>^hqkF{Z-8TB=X1T{p8Q>J4lh4((+Jm z3e6v?S9N+mu~^%*YCGh4K1djN{$r)RiHbgCLyW|) z@34wKPC!M|T4YJ&Zvcj^Z}^HfsiKu5&CtRmX7x>0X8JWM!<`bYPdkY@I;$e?RY?^a zLKT}_73&^X74uVQUn86IJIS%40d|UPuhP-t`>ol1+yz&-V4({xcEJTMILieCpQgQi zzBm`JW>;))HXlDM1YOVL_btQ&%;^uO{zx?UBB@C9%mxu-t|Ma;wY(m)&e=}0F1GXW zW->lpfk-LGVL}!AvJL8yQ?~lBXQ%3@6Ss9_dK3G-lrr-eV7&EvbJFAEn^Gp0AtG7C+xc z4RnO0RUszFLIfu>J)X(2_lwu7*t&8jvQVbOfWCPr(h832$*x2oC7x`j7%pqzhF#8y z42XL=g}BVCvDpr(w2dFAnq&Xc!pu~kQR^9LGXhZyXr;adz*Zx_Q-$kWC_#gtEaEyV z@N;=C$zSOHhRa@z>q?H%(cbDnYS5?O`;sh>L-^n5W(2+}42vqT>7S{>mIGFC~I zgkGl!+>)$ky2vmTg`H92moZ!efDdyA2Md}KRJlf_9?aPOKt&F;MUbyB`pRTAmuAkX zpF6-y)#8UtssI>jYT>%eQt~Vf;5K(4&9k|KuiA26Y0gj)r}tr!wZz?t=KWX|@h#i8 zT<5GwySJt;;u<8_%z-B%9qsvCiQ+if$x38WnXF9Q;?2@JPIdiRvuRW>Qgs;uZz42> zWGFZ4Ss?UgV%m(3xf&}4+4!ok`r~BdZvnyiZ?w#Q;D~y+1I;+20_N=pdL(m*s{vI{zlpYgXYl=&LVpQGKj8oi-519DLqeT`GGAm%A7RuT;ms^@DT;Ficm3Nyq@E=Kk}*HDO~oNEge?K|01i z`hJ+NlQ)p6o)od&yHD+Q<#su}el4K@&#KUGMFVb5o;HNTeuaESgVGxP$=Leq zeUc{S2mSckPpg5-(m~OhS@I-yTAvT^F#~C3OERn(NwQmCC-2^-TwKZq568=vvdfMW z`4_<1(}GmT&sIw|?XvoB%SJ`V&&I;_Yuamdvt?ti)%e-iarK&ZTwQ3{5{|E^MvvI; zH(k+c#O)*1#OxcIe`jZ=0D4Jvg=2X-Z{SbvCh|J~QA$>8;nKpqRXxw6CR7I?(@S>( zFw2L@Oe;SeR6ZGqU@|fB(FfL-ARe=p-l{SM-vOe*Q;|Oba`X2n_VpNE83v6)+=)I> zV5S5LR8Q(58R3f_Rdaujdf=M-J1YrFx5$VCsz9{y>9IC2zgf4K?C~vgm_F%(lnW-g zpwb2ZxW}@*;(`}kaHf0roO{Z+rzhOgqb@jj2~OB`T%9H_wD>FA9EUkUv^bgLOUO~D{`DMUyRTa)Z4{WMFRy)9gtzvd?ZeDW&33!dps@&}@^+twv6ltJdxm{u9NX3_j< zj2O6fy84>uL}3_6d|_9TZ;uw;fbu@U*sOf~^bP4{*YjXq2!2G=Bt5jIYy%-)N1xMF zyu>WzX*Fe>yJnP;4^x;IE)Ix6jS}xP3DN>qsP8AT;K)5D(C6+0D81O(1yj|??QNef zOHj|_^LGt2NbWl;^VFnI-FX3GQ-P^;?3K}>xSe{k{d2pL(e1G!WmlEm&2lQXhcq8Y zfK^d-xzp5X@8;(AR!Br^en;OwQ-yY|4D?d0cFTZDPs<;U=6O0RCeWaE_n8uE(8}V- zoaC-w@HuNsa{{86bNhNW+`!Z7 z2uaCM*$xraF1=|RhbQTf&3Ixq6Rtsw<4#(IIm4$B!Y9dUbowbbOtBYlibxde6^3$;rA0|Giyz55un5;d`Xhzwe(OF?&FtFBWVM?Y z8$|(`RVccPNmz9d@VROMiJgMrZauHLKU9!Whd|)48zMfhQ70xQ@_$6k@NpvQdQk7Y zgQ`4r0IS>bh~1Vwg&aoBAizaAROBACJp;1nG_Fl*T$`c`R``o-cpK67O5a}2W>Vb> zg=RJI5-0#|pl$*=Yw$V_;;6mCv|D+rpW?EG`YGOTF(ak{Qk1R0IpA0YyX>lo9Ype+ z$z)RbaWd(;iC=H8Ow-7;+-GtuTIyJ2Q(-UgCfkIb`b6AAhlUS_B=V1{T<)aF6DNo> zdbrT^ZZrjBKLU7_Gct2kotfUX8fLMqR<**)b>FJ6Cgq5%*$Fg-;*}!{$-G@A*Igw} z>QZ|2d2bY)oL-dYRG>A zgD{fMucbi#A^q8)KWkL}LMLb`!4tpfTElrZt5UDtdDv8AwWx480XxGQ9yOTZbI%XC zb4$Ce#wcZ!U|2dKduzAoT1<=Day<((Uk|A(i>a*0c29V?yIV-~gZLRn_-tK*=;#@t zT%adbS7n7D)*>BQ`HR%#g}1v~-Z-hdncFS2CL>Q)Q!;zvWV2N7(=a+#my`5dCJ^e0 zKoa?VdB*~sVM~t-_rzpxMmL3~CC5o$O>hU+-QM$p7J8Z`I9X6qno0 z>1Z^6{j5gqFyAN#&Tl7X=j~M0>#ns5$#i1Wm98@|o^ucG=#VSMd;2EwULvIcEUOz% zU86)c-$DIo@LnT4<3B5%EMbQ$;W=^zui=Q)XVzfNk{4kR+UGRI*fdupb)p}b_O3Mz zGVlW+VaGi;5qw9y)?|vLOT(&=9?|@hggYTV>%_rOPSi)sWklIcz$mIHoBNSMy{$WH zy;gNr4wL}FFe0@Ec7;uqD7n&AqJGOG+Scmc!p-H5G&-VIeJ)q@WhdXn0pVHyqJ8ey zTlGElF0JYWJAAj(>M)biWM@z6^H-pg`PDE!|2_TrwikgaDdt$Eu{Mqgd>2INFhw1T zn4-=kll7g>;`Qo_*5$7gq^mt7FJgDMHghvU2VgZl`EC4=vxg_D z1zR*5PGn>_kxjjo;r0#-yXzV)Uw56#D!;)Zzk_{iUCQ#YN5|(+`~0rFCbuYLFX@LX zM?NmxF0UI{Q@3_0S({!s`IS7EgCuXFS|`r&eOF7J0i`V01Sw>>d9?4RH-vCJiY z#MjV8Kr;Hgn@s3-MLywzMJ{;G1#K>PzYETB!RaoT=Yr#0aFh!Ub3ua(_I1HtE_j;@ zrn#Wn1r8r1{@Hld+s3mMbT9lwrpxX81zLa!7bDy1yzAw@ zQ7xmWcd%*pQUG}0L_{mGGc+u-xrBE-F|5%C3ZvnSZR%j2Rbai>}lU^&`|t(tNn79-|jKi6e%e8U8@VJ?GW+LGq3(4 zv*xv5bMy?hgT$filLgH&hZ2D7}}GI3&3 z!^Z}V@Huk#6C8%yLE?5;4V13cJ&56(z3z ztsri1uOwq2F-&2CKtQA%`LEl=t#2NS*KY#Jy6A;vW-=DJ;5ip;Y^ULUhVF(jSjqUS zQK)VF)g{N^jn6xU3o5^WtK{m|D*c0`m8zp#X?1$C)V4C=hGb7=$a$is80{(~9hOn^ z98>`c4q3>@vlJqZRzlMVgNz7TgaNg4-BQ?}kJ&cNe#1Q7leny(cH>O|RUY5g@u|GT&Q@$LDq4d*8Bm(H zCl(K+Iw6P~`L}r0awt81V>o-@68WnGzK5%lnlw!!RaJoQ6<)}V_g7r%PBc3K+GHh| zIC+=@rXbJ<=afHa!7?jfy2S+Uf@=%eWsR7GCHC-KO}{%_CU}`#X^5`P`mwU2Ax5aN zfV&JC%hq@Sx!QP*fjerW%3q=PbO6>Nph+D8gL`3(DdcubsZs?sIIy=nCHTB2YBgcp zwzMJmg)TF(7B%!XN-dP3(0rC{mkeCPM`*%WXhzot7Jn0AImRBn&JeYzl+9JMt`hCa z7I&wULK^IZ#f>;8_m2Fj#_M}Zu8)byDj|tG48G4pyB!Myt3WDRZ5FOJ`m$u{W&LlI zqeMIPp$6&b-TvGX4cyOyGEEhZ7UCQmMPZH9X;r{9tangod1w`zEN=;gBF@QrY(>(3 zW>}|VzHgtmDPv47@z+F^;|Hpce7i(IB&A5S{q}Au-som}&GviXY$_89)L9rVwY9!ZtGR7_clIF5{nNx$q$!MQ{zPM#%Bzo}{GskCr z#)4t@^o$FhbirdTnCY^->qD687C?epz<0@?#xcxJwCs{|NL&#!6Hv?Fx3735>OPDqvhkLDW@!&oc1YzIi)V*=IlO0-ZOZM@1k- zJ=$?RJ$m2B`BLIBAP?ULUHb5Yz9ncx)hsX5%Y=ba?c?x??lfY;#S1W zKWACan-gc4qUr^FhWzsd?v>-a5`5Udg%}9zW9%*|5VxX2^Z`|M7UmLv+Gjfqpn4qj z3vbm+xSx^wH7mVV7BC$>Fgw;)*lJLVUbL$H`c>Z22Ttkd4#=##dcTyJ-GZ}+sfN%!{br?za_ zkeClDy32)dTlBz!{90{+3_bc+UcqudMe?I1$xD^|#pp*LKxMUxQQBTVLfz5vg_uFw z54P~^bY{u3S6!qg(j-+;6KP~-gS$75vbc>B=&W^q8tn2L!puN4WR97{flSi+(^EKL< zMO$VYwCTNX<-};wa%Y>NH|*Oy3@;lKgy{NxUZE#AgE&1w=%@dD9xl?d(B#Ybsc$HO6Sk=1fS;-8a2Uq1 zow}aH6ad+^N+(BWkeE%}xq`lF;Ho|7eR7GLE|b5Mc=kbcQKZDWp2P+cjkmePg_aF2 zM0>tSSMxLuSGsHU3(>(gLoDu8X9V^UxA81-jf&T4BgpJUqGO_ z#Q8-;l?6nrc{lP{^p|rHlkSWTbyrwcf1RqL{+RxSm{RJmg{@AQqMwAeY-|@ZMq!;AtG><#Y$Ih86szzhuO@AbQ)x#>(cjIveh3c zKyEX}J_Fl5^A24o9*cRmCiDsP>6iT{SR2P+wROfox>b?xnkg(_3Hx-0+Ax(sHJA>G zzDm0wM?J*M90M-8@f=wFCGCEqJtR?|#Qt}C-I>C}-aMGnGd`En$9`q<(7C8meWdtv z=!fYccSR+B9v)5znv{n$QI975>uaV-_Nko2o&uPX0 zO*;LLm4WLkwgj%9;wEFhem2!R%`~YgM=|90mGL=C5_9@tS|I_OvcD;TcWSiacAL3M)zON?0|rVinnoFMGO&Cl=IV zYbJY7U8h2SD7`piXljb1}giNp9w~z&Q-0Tun^FwEzX0`ulfvRl+Ct7e83bcj=no|3-=v;I?E!*Sg@91e8pilbP z#ph~e1)@uTR0`;)TVx}aznPea4(b=lHuHgx8e^eb0Pecc!m=ti`f%pz1!>+*O z$XfD{Q1wKlJhnZsiG>v`I+J7ikeTM?88W`3cXD5#hx}oycq)H3tXKW~fZgTnGx)ig8LDy%JL+@$99qV?b16pt?heXI+tQjfkp|F=`)X=WP~ zll=#-tyx8#7n71%lTRKvDEzKsp-yxT;<}sCPmSDJpp!-zrV~mlShPQO9`y*d=P~=K zTU2Ls=+5iC4!z^Km<~1Kwn0h~WX-)OSY8W?r2W|mrr^HM z8#eC%X_`uFiOrWr|4c&`_=1$1R8DRv^V{SkV@%<#c39r&-d3*pZK~|8 z&JkVf-cDTe+uBJ_m;$2qGyo?|0L>Sg&D)c89$7^aAO5RZb=vmXs=g9Rwj)cOWuf!v zuB=&g?snOwpVQfy0|$LgjAZ)+*x!vg9@e>u?5%fHU_cHWa`>oQN2co^I>0n&8S$BP zsOw4s+RwEF+s_k~bJVg2xIMUv1!o3t!d7|k*C)2|1Yjn*9f zg=Hf$*HcJ)d8M^#2Oeg3^hAfXgmYYQx(gm`ra`>w_6ErEl(dIMAD}Iin%6d$hs&4dLtS3Hvh@gOCic)8}f#IBpfv@4!U^XC^; z3u>MPts~_n5tjJ#W@G9Tg*T}}jB?6z_|Ah95NZ9o68+E3t@GczwvYC0{d?B~NKZcv zC1v3BQ+&upX@vgZcGo~9{lbpe!8vAGeKM$RrJ~gpq;*&X{4^tVHo3$fp9sFD@8Ocs z%inTcyi+q}Y*(W*8=v7DB)yf{#B8v$w1AL2LLMlK8e*v^$8jGH56}Dd@l!C zMtUEi#dC>050P(6W0zOBx84^Fk>5RobFKU$A($hLAiw|8 z`SlYa7!0LivBbRM#*cfP3t#e4Wz9G}`l}bW*tseAa?13C5f>fubj;ytGI}9%rJ?X6 zBXIk%O^^p9)kY_KGAQH^>Tgwyr4&VrPp0MnkDUD2uV}xJ-%7W+>L5vb@$=FL?Ps)V z=6nb(8%b9O-DIwV{{--6%Pbqq-clpc-&0knM)VQpp^;_qzv9eIp}2G-ECge$#5=OJgDm&*))AT(RubGw<#Mk$h9#NMQiB4%<|%BwCQ-tKCL zSh;*<7q1r&v{rH3TO>GdN;9wuD5y{L9)vscc>bLjooLUK;O{*#UrlT-;qQRs@2BOo zEq;DLWWrx_Vd1ZZ2vh9SPl~t6MIk9%5T?QNk@^A)+kxMMN=-SaOy8qNhEx$LH?@T! z>b{Ty&CN5DL9O7bnuc@n`T-uT8}Bx0Bi%$VNosPigL3^miJldNP;c>-ggYo6qpeX7 zdNFnbX89UHqt;4mqx~QJmx)K!LZ9FyNJV4KJG1LYxek9*cn7!^vjo-J4q3 z$(Pn>+Tbwe7aV=(NHF}$&v~)}SBg;_x5a^#mk#610+~8{6{uFXgmkB+_2UAOOq=t52MNWG4?y5ZI;}%j)-|*_7gZNzy#o zGeD3_e0pZA@$5s%Xz7n#eEIxk)?R;;tHVbCxuN50%O zdOeXTs`Ui5B6rO7Rf*k{kBYg92cr_|m5O?%zAWdnR`pRO(^9|=`?8>x`;NDJSoUEq zNWhGnylBaa38y)nwxcAM31C0)R*!Jo- zL<7D};GK|gj(xfb$?jf&YK)EzV-zEUwAu@)IS8qrG*z(8&oD5*%u_Sv<}p`sf~q%c zS<3d^*%t|(y8i8EopO9nnoV#K8MQ~_gq~@541T%hkn^7uM`k(~SWOs_YB*0zN=N;k zCBD7Gl14$=B$NnPs7LxmglI2RvbPFo>YGCyQ_;^;1%a7~FoCt@8#KnJ1q@JJKgHGL z^%K}MDx;3H)Km@ITX#c?OqC<&4Vu4q1rVqZh5S^!gTOAH2@MXu(!X65Mje=euzSqU15y*6+DZ zk}-dvJ9gjhM`0iK)S1M4-02AHsWe2)ZYI=E@s?P;HN>flTB@|EbD1*wRnU0ZSe~AK zV;L+UXpXFF9!IGqH$$CqI5 zZq8&yM?HbN`pqJo4NdLLZw9fl*7w}+=n%8hpH|S@CsP0^wks-@iya@RS0caKmPkYC znpK@k$&cYax+sRO!K$9cN{(v@JU1sQ9FQIhfxSAe<#kW!8cdE0A?aw?Z!0t$8HbQ6 zKnUCELI)Wwt@>NsS*8z2i`^SNTZb+5H_69XkU{Fr4OE04Lq@}t#9VG)7W%C$Y7`j^ z8=K4%bb8)spWnV>TXz~@*KBJ_=Y^AhG#Z+5uE!j3a~(2?oPp@}M+Lgg=crN|I$cWv z%9iN#*2s$bNmRiK>oxc3^rw82ImH|W{F)ssaoIB54SXtQ;(ynTHmCEQjLgpRsVZx zT?#%}nJ+PN3{^6JtBE?p;rIlL>R{E~@nu(Cm|(5d-&BW*T?zftr?TqqcVkI)_XOGh zrRsWN!@9+U zvpeXl?Lf_(4v4Tlg4Wa0mZG0NLQgxADfGPSdCva|Z!mwDMg@iRdzAij#@+b?d09-q zRp~>lLge@3WikC)rLW~Yc3h#&3hNpW#2Do6OmG#1b>Mk&2k~(P`G2s8kiSoVF5^%1 z;luDuFNq&o&Uisv7JT&glwqulF9O891l?dd32;Ce%;y0gDlb4z-suhqN)C zUhaenj$9eRkQ3UkaPfMfWgAj}hnvwuitV?l-#YrO72jZ`&FOLU6@1whuHhCCp*biG z2Jpnw#ck6QYeVy7oz3}kH*jn6`X)1d)qC7fY#oo(EIG#8f*Vv7XPf@dFr|FDP8uq z3S$JY+ANMO0&q<&ImK^pspyNMcbDQT_z1E%8diX)HK}4m+MIJRmm^y~rO6_N+LjJI zwYMUxJ2bVd`-USrXE zBaFyu*Z5^ruID+wO7_6l%J@a)#RTI*Dnx1(i9Th0cW62#ZpMGy6!Xtum7uqT zPsqep6XNsTw*Mnd|G;`^z2@1|nH+yu4?X$X_4bn_2`t9#Ckbx5Y7C@%Uhy5kN(@1=o|0iC|EAB^reJTAF+c=^(vw@-!GlY zt8TrGEs@n9zs^(c(OF0kGrH_p>vFcY1%(Ao>^uRpq= z^{}EVzwb)mJZidyak05U8Nq8-Jz8YG`h|`zTO8HYskqq})n2%X3X1WI*LRY#t}jZI zCq*wGfDDgvN*}WzMR~%PR=G;H-ViZ}K(1y^a6vTY&ESGqh(sHC)=yGwip4Xrcylb? zQi#)ygn}Clgaa}h;_%dl2JqBP&IMKcN?({bfSdFsnx=PpUv_HZFcGs>P&kHm2MT45xMkJe3Oe>d^8qc z7K`_XI8a(K-=8`rb_iLZGns_eC5@|5ySe3sdeLTRY7VI?CxmJwLZ-3}s(zz#2&HoL z+Z$hkN?HkA4l6;v3aX@hHdh0rl%CO0D^GqaPrel%-bxS8%JIH*j>jpP;Hk-oGBp>$ zv-0G(^1xHmQ9h?zv)(tpZnfbtH>pl$@Z5AtQk-GIy5iA0j$lvjWIeLSG=DJ-e`IrC z^uh&WVMQD1s`4*8-=b&_tUtU|lyp50hJ`2v#+^Ubicq*Y9}=u_{B+K4@Hq>WM5|li ziA7p1Vlss0=1gvS-^a8aRUU7_aK3OeCxBRUt9NZ1k*1}JG-x)BF?V;E5Yqa+y+@jO zi7KG;c!w%-sLk$a3RGF~x~d;pN>67eHLh|=y|Ue6li|%KRw@JWR5azG7Yu!^4R_`$ zSBKLYC?P+4!M=Hw{Lhvom7FG*rkT|*sl8a!wZ5G#?V9{$elnW#0G;RW*&ANLE!MBc zasV|Ws2B$*p$5t5Z`cnGJD##HlDIlmd7;30qG$WT4mV@HPWuZOIU z(mBNa%^ckko~i3E(s+RM7sKi{=r1-Zq`$C`wm-_ViJ!O)kR%@B?nW6G*B4kVPcHG+ zRdEl%D^g0WDq6VC_5P+HY2Q!s5jSO`#Y7fjY^;#G&BcI%Y>2cF-x%VwKI`k$`i=M? zk%Mn4^f&%e7{mrbbG5LP9+3d42?vuQi>GIo9`Y^q)4biT2jzWAUE6Gi`R?$HgY#2q|n8VX9hRpnZ8Hooa#EBhj1dLxSm-s zKujcsqb6*7Jprd&932o>pm30|NtFZpkWU++fPVHq!~y8=tCjh@09Sbp=M0|OhZH|0 zl4@lp(t;CxyVEhfXsU%mWDHsu*0`1yOlOnQ-5V}Yj{bY zt2p=Et@ipUK4h||VW96bx?LyXbXC{2u(@H&lQIQp?nS)=dfhJC4SNtB)R>IAUOND4 zo^kBy8hEl~2l)Y+34`KJpD^c6;w6WlJT?8L)HH3A8r_$X*6yy8YVL=i;=F68_}VpE zkD%vmLsk1eX{x$d!5CG2;LP#cMyRjTMQ?$-HaAe;-|~?~aerW_q`nQF`yHxV*BV~p ziu?NZ{73c8Sbfnd*An}wu6{frkbYt^*B$izY*1Rly?*1#snZphwU(R3sv%rd)f!c| z)}<|EZ-PQ}btSr?pW>@STx~>Y>dT2+Ui84qq6ZFEsl6*u=f@&7_pZrs(?`3MDIMK? zjWdGyF19TW9hFWZSK$!E(v$Q5EkRcy=%=f_pkFT$bd?u$ zh1jO6tff@O%H?$_g|MaBNPlz9Oou<_b&YP18t)a8tr#N4Yr~lncfJbONy6!ol=#Wy zv{?i$bt-|@fWbN?DJs}h|(vZ$dVen2?mOTclA)*BV~pIM|4UD~c8V zn{{iI2?_HETP0{31f3fQdcK69X`Y}VM-VR=4|{@!{{w=~b2g2wVe)?4MBJblhf0g9 zX0u3laV3GU_A5Fq%Ry^J)DQ&`*I0O%sIOOKWjYaY}k;L=^UloRUe4zu#owAtDn1FE|WcX+z!cRiRh4?LR9LITAVg5 z6T7yq-fFskndH@*)*0&|L(^>$a^G}YjiBXqnyL7A)qB1pXvMY((lM*E13{xD1i52Y z_`~ffgb33)5-$h%8s=YD+R{v#DQ0q+XB%AHg{|09cg3zm1!#YSX!%8&4sl0_{)c2_>yHpQEa4Q4`I^u~lITW3DN9idd?5HQU!$LQ-7Oyn# zU|0$DQ#{N$^hG~Cc^oMe76upH%|hV5w37TcDV@Jdf4-zY%k}3{yL@M>op&wP?X%=l zPq;QJv2L}#^Iol*b*t@v>ds_20hXCrU(^Aomsu^LALbPbuN|*IE zZjkgkM!;wqE}?$IJ(v zG*&{hD{?jzbAlU zU)hpDVPu3A21$oQ(7lf8u7M3D1Rd@P$~b~}xwNj?6Vy^lP}4RwqA(~te*8gU6Me+C ztojvKn=GzWFve!xl^H7wY1>u=Fq`_Wh6U2Lf%PTzo$c$};Ofgu?4+-6ldo@!aqm7a zh(%4Z0m0j|A^EhrEl(HfJ2wmp^AW4@proCT0!cr`3-gcJ#AiFKjy(#-=-b*8#?}#i zs~p(}n7PDTj;k@on0Dk6&tFiS>c~%h=?xI?;Skr1i}=KG5a+)G^~LX6=D*A%^MB*y zjCMG}rjjSRVCmuZ^fwp0=z>4FVAuuExZp__Jm!M+E_lcVt6Xre3s$(`OD?#>1)p)j zZZ4Saf+;Tem#Vo7{%Bunwe`nk>@HzG+1c=WoK0swxm}uo3|A29r|u$S z5tOgb)P!M*g$xW7B34r$RM_=mx4K>oAe}16Pm1f_*=)a?u9D7I0KgfRPRr)!5-LZo zRS~__b}MlBp*ypdkfTw1hD%|ST=LPFnKY=^8G#%0Kv;sF)|<&q=JRRprNbe3G!GQp z!4?j~>&CZ==G)Ct+ZK`mvT3Z=FKA_W#5vhw{d~RRb>M_%;{0Q^BvWPUBM?nr8$HTR zcd8hpDpUC3LTSa^uJDVkU!b=kMLgj<0Muf&-Uq?(Y_1lxS^BIs7@(uv+DWmXVHox0 z1Wj3Fg(OnBy%#^$!pXdI5k`D)XZM(naNhI<8FHMx(`4^0f9RT*EZ6Z zUxP!Ne^6d6BwKxO8x#5cB_*GtN(9u|>2uG;o@6I2d9r57%hV8v?uKsX!xi*SGP`@u z7@6(N{eMN~WUK#vj-c7dcgJut)Er0pP0_ss@aY_+Xn+((mWi}(K|_+Ail1M zQ_F61K^GRL%9-NhaG@;o=dP&&FFGt=vQw{#q!ft`xO?2yqb5;^rN~(5r>{9BWqg^) z1@2%vmW$o*JzLK1$z1GSv*f;nlgjB_?q148ZS&TLFdku`wU%6>a-+zIaoP?HxP08| zLic!!16M@4(VaZTDP^C-ZPuByYFQKH#(D*_tJHI`6XgcvS&Tw!nAO4u^eiU9&)w zE+g3NjG*0b-Xg7`?!|7@N|>Ev@!fqYg0WxroD_o+>?20eUQW;SPWCs`6uwC2IyzA$LQ>7?~NIt$P`y(iuKv))6bLvs#!9_fh@O`?8i5I z>(sA^uPNoMt^+c3hBSqx{U@*b0CW|;>}ULk&VX!%%a^C4h5sz}js+oEXaB1N`AJ_AMh56M|53}L@_2S{QY9;;)}0=>(GUb1gk=v-pM5Z_rjC*?j9m z9#+z^mNe7jxKByHVoQDz;Fpv%N4xZo;!pH}cbljDmmk2V%y#G^J zg^xaRs%v0rmE-!Cj7&pz`VUTXP3uf=QrPbT%#VCEj+CVdAw406^z=7}^!4T#(xw8^ z<2=%z#M*N%@x{J4Qu+oVUAuj;roW!~rfT}hI8uL;9W@;~)z$R)5~P>j97k$G$tI4B zA-&|yA)OjWYM;F}_MYpJ{*c2vZ+A5i~Nq%mQEc${snkLiw z0(<}1Z0+;NfKZB&tsYY9BUfQN*s1;bOSDrvf4-V!t~$q)YdLDbAG{sg@q5?asCE8N>rb(pW@3xoPN5UxKLStTGL$%6u1z7QSS`fW%0!3 z`p~zj50(F4P$j+Su>`5CZbnvh(qbO2lx_TzVZ-%uj*BBlqX{E*@p{$3_B?sgx(28{ z;_vp~-7HXyL#`3m1v1cCYiY;;xqg#xv8sgl>H0bd@I&7%%g6OR`^6bZT47-r*T%R5 z>1KKPP%Y%?o7`Ow4@*rqNliCJ(G2P4Wm2nq4hZ_A5)?y|{rI1URCHc~re!P^C|3tL zIbxi8T`zcjUO~r7!?g(Pv+~3ZD)cu#aH}FYdhAWOlq>k;!B_Xy!qcM{Lp zNnk5=rfg(9Vrk#=YE)q^aoygU^g~&Yk;{U>qPB}%(?)?!ZFz4tZ{-y2>EAk%A&;g2pX#jowN5CBKIU2CJ&bxLPMxhT_%SgZ5CK)aa@ zWk^R$WFN9N9in4cs3I;6P(&f@agEV0jFmOU0|)Z9FEp1(6_%G0$9*GM&mA#x>~y{8 zUw_?_f1lfPTw>o!4LXgo0h~rl+R;x+(XQ+MVpMI0ZHQG9cDac(S}`I`p*&Vd*4U;& zY{;@-CRf#z$xdTh=e#vAW$qeU5MPYbZ8ex~8wUZoi_eHfbN3P1aeHd}qwS-RrTqt7 zYZfLTOCjx(VpZb4A)B`rM7ym8*;`M`+PvPmkHM3su4s(i3X#`EQ+JUqc5e^zk7CDS|KS?ffk#hv#b7q0Idsjr>hqowg|zu@TfS0v?OdSj^!J0& zO*hmm;e%S{lVs%n`@EuUSe3{nZrs;<3D~owC>!erMthAE#)WQzmU5@OiE@AbbF7?o zYA~&x!Jfkde`4{@5QoMAG2QO`@VmQv!=)awKBz3jwhD+-kyh!1O*JL*p9hSp=|P}4 z)_l0mLolt2>Sa-HND7tK%UWqW29w($EJs)*WMhy~vAk{=L>UVC($<`CcYaX%}@8!l0gm`(Tshal%Y!A7|YL(nvqESj(I-mmgMVPgKYzv zcuW9DIYXbGVDmNl5Ipy5W$?W#_|#RamMW zlG)uykCCFy+(8qAYn(iKt9Ebz68p#K-ef%7Hr@Nz2fASZxQA3Gm-ziViq$Ux<7f)2 zaW)*nfs3l<1Tes8^40eT(6+4ciydaFyWPT>TT5xpf5+yD!nDq>K8f!*Q$AkqkT2a3 ze8tk;ws!Yi-7RwEbwUg#V>ZoDF%c;CqE*uO{I}?i@_7wN`QFU^u0GK}u6Kl*sc0+^ zssie7oSc^XU3)F$YNofmagMrN=6>Ct%`hEVEG`yhr@xPESb$n(&9gm{hSHny)A-6O z{F(!Ic^Jm{o7+EQat#-N!l34}Cc-yK2 zK?WSVm6it7s~Qc_ogdX^DX;bFhpdb@F0_JLxGpz8ZK2=G4uLDdp`XfzcPsp}D??t0 zg^!}d-uQ8(?Y&_KVa2N1*?auAzX|s^vkzAuh26Ef(Ewgnf`mPtr(ep%g;w# z3{JtwT)%fPGFd~j+SBZ^L!o7-PT~XP)GMUEnV@~dn`7~oSiCjFQA6cdHPVjEmPJ8_ z!f+gu8hzk2M@-7~XJj8T^vv}uL}V)Nx78hYq}NaukoJKpX{g=IolE@S6GiBba6#`L z1AV|lA1s4@Oe&lB<7@+O3z^^Jy@B@{YE*a)?ePrhBjlekXIY3NpH{)nRewEMs-fvm z#5EMlWYsfZnl2DfmbC;(K5|+PH5z&)8v4)6orVU%w;1sS(_(tuUbHX%qwcxs7o(Qe z`vc$gzWU}C5B&y!PY5Y=N~fO^Fa{pJv$dI^rs(aiZ~Nt7DEQOBKn)#{Y;U15ni`Vz@$l{}*tM_RW^mp6xN=Q0GNe^jx1%%72bXgx1{dTcx3iMYR4>S7ww4OiH4k(CoGV+HwSu6uhj6PW)Ce zYaxr?h*raeDKy+pGV(TaiQBIpgR@yUY3>de)2RTFIZJHcw;jmCNHV-oqr$flYh_ai z4XJEOEZ#y~KjmqS#oIz0BHM|_oxx5$13R)1$JIj4tt$l1G6&Ks=-%NQ3J0)U8AJ~; zP$+TP8$bRvdtGOOaCu7X^-2l}@oEdhtdgHh$|auLZ7cS)PZ(fn0@233kG zQd%u!8=XQwJ^VH|m~b~ky9{1COc+?Z{V4 zt5&Wt?9ml5CNyU^WL>GtxHOY3?VTdcpkOB&sb@v>r4NP{p|%lhu*Csot;DfK(fnH3 z;26WB8+s{(fQQga{S=oSwK#L6J<`__TPowd+cg+YK0V`Cuaz`ONnDFgQn2TL|2Rp% zXICkm?GJXZqN-seFncj?uHsGf<&;gP?3iczWW$SLVy$d}jLN1RL0DF)kNhyquGeHU`^m9Dc0jGSH&HXp>owGMV)vgz$Z@ zs!Vn=MdzlVq+s&{P>MhyWm+<`)>3A*%7mAQSTC<+R>8o`-ieNFr(|Z<26EnH(EnHk z(1Tf1sX91Yz3E_0@mzHwy5BqdV6_0X2kQ&L05m@l%EZ+s=0In$iId{K!sM1hrao5?fZJL0qIH(buNTH9v$MvNx$q-9c_&fVE-81!OJ;Zn zCHLqDJqJSEH$(Vc4s<)r)`GGz5&C z%d2LI)LHFxOP&kg;&SVXmJD>Asf?;aCg(P|#qu`A@}5cFGgJpR5?JaE0pOyV$mk!e zmDohwW}x9s&z~U6tBzYg#nrP}92P5G73)AvH+`fyk}^^x>*xpmThA$}3heNcu%L_t z4@=SE2WkE9E)LTC?MH5q21h!=!KZp5gop-0(V=)_h*Ph6FPpT&UT@YR?&-@DMyMO* zyD=0aR6(P`3Yr`nL6VB5CCYjYa2lfTe_%69#$xmtcD~Ox86nF2L8zB|G2dQXAif%2 zbi?RCicaBKYP>X#A2d)NIu9cC#!w;+ibThOQw>Q9N<)&~+N%8cwF9kF#V~htt5Z?r z;@Y@slh(*+LiDWlvt^JA9pkUAp!-{@X45q~h2{NA>10*K`E~QVpX3=IkY}eAU^Qh4 z?i3Q;q-r7IQH8uWE!dw4Rb#7q2efp62e$|?6jRdrYOnq%m2ya_v_$*)%g0lyi~Vdb zoy(#1`MIfq%Zi{K<jdz_uY+2FL){8{i#d zM7J8B1p8-WVE232D@urN$W|ZjU^i+uZ9;(EXs}z zX-P@a_m#9uNzz?P`i9M<7cEZpN8AS!OeI{j-S3uMlxd2H4~N zv}(oxIs4k>=&_#9Q%)KtE>s-Fqza$&Lh)CrfN}=ySjE5NsesCa<#hd zc?s*f|La$D-OXI#T=duQhZkLfd)*|X(5POnQ5Ld=YMH5QwFru2o|B z{TL}nxAj<3Q}xPBca8pPiqTac{p4-|GT+bNNL_dKa4}$tBjUa)b$x`91Ch zB$$u_30P!TX@;}CEw$O|2li1Hq5J;05_W&rMd;2y`pgFWYGWVx9Nn_hKRBYa`w0dX zzKa+MG!^|<-pzBH1fanr61>0YtOahO7801St967osBo_OA1{dc0jO-r1WA?1HW&7~ z?}{z#4GJXmSO|)G2YPsuKnG$NT1a*{K^`X^%GF1^KLR!3K&LN z;n0sRV|vx+RXH)FU8+zb2it$swx0;78ekxv@aKd#deW`?g!Bq%Q(>j+$lfG7RN3vj zSE{D>`N_{13S9UgpVIe6UFKkaGMo4fjr zcY5lbyLw&>yc3ha-*sp?Z`wTg_HyuetUV6Ad8~~Ayz^L(Jf}##$A41Q~8h|?^`wLO@%8y<=KfpFg%u|cDu34)YC zP}OwPF~9Zb`B*i~!7|F|7dHoeJgZgs$tLWqQZloCfjM{%@|0KQ1hZ{?b8s4!&6Jvh z;aZiTC3Qa(Ye|D1cj4{v@wWqdi&Rxdae_tOO*dAn~jtm*#3Zwv5ix_@M%+Vvz$>x?{g$Weob zUL43YdbMaOgRV9+)q%G*(^j_YK#X8!%$60=XM}vE#~3|!aJg#Ndn66zNN73V;_gRw zPFTy?WMgYar)oJ!&m)mWgWxRz!KGsm)OrNzas;%Uc@BZKoofREwH*)`FQr6?rA6u| zACi#DTD&d9x1rqUUlUhub`b)3X`M<+H3dzBGJ{?=DEq*vuFEbc)qxKdCryS+>r!5Z zD(>~XcekRRKL|z%%zahdVF~uB$ul5BNF9u_<`Cb82v?jP7oiCshNz@OC} z2ysE9o?GoS$~Sm43dev|Q&kDg>a!3tX;s{s0SBPV;0wSL2O#WWG^?%2wTkFEF5?hG zyiwl5_GlN)pRTq1!mPrgRw{pW$#lepN=lR@H7hAs*cTwK9jT;)9Rx4{8$`dJx{JDQgnW?mchh}-1Pgp#9-A#4zIo&qR7@5 zeD8Z)e^eXv9o zzzOZ%J+ixJcbQr-FL!)Wn=Plm-D&@s8ZRIh;R)JbFCnTe5(e#W4DoHK*oF_qRjgVZ zAh$}&EC`xvV$f~4M*FRo#2cb7&2!vH1`dEd72;R|rOOg*GH&2s8nv#KIGcX7_gVh=6z zI2__|MCszla5+cPfg_X7a$RcFx?j1DtoAxG;5i~7UPq3dUeuArn3=eaST@g*Vb76> zaDwUueVamj8ytCj;dmTTNpVEb#1VsD#*wo#jw6GC3t$`yaX6xMab#mTN6Ze%H+=OB z&yiF7Zu+8!yTa?pO3x7i@j7zgw4#ojM{-<8ESu-ZplBCOfeXYphBzGA+PLTH1#yl9 z%PJ`1h(U!Tf~5H}6E8Jl3rTds363MH0~f$J5aMt|>Eg%`RLfcy>_|hnbIET$W9fGdV>Z> z1Wh_3NU8@MvA#weIplc9krjapU|bpEa75|i$Y41~8Ush3I^A<*zjv0mnjYf_?v3Y& zfcREZJ+;_srt*=kc&o8&o+HadGc@%RPN;D46(PQjR&&iIagGE#V$k4-pot@bRL+sT zk8>PZ7PuhnAr42BE{+V8bEGM7WX)-wBem}+=SYX=NT=tBfOwAlBUR+c3v3pTbHuWF zj&zDb;&4Ri;>gN!jx-03e4*KMOO91#%Dk)KZ~a^x%Svmgb3#IkvgG>c|vY9S09X$|phaO4|{;;qKKc5)juI3j4` zh#-}7-*w^_Z+4p*m{C2N$9m#l(G<%K+i08KIi#i{;sPPGP3z5f)?snvUybE?sEs>yRoKs={DKe@=MIVgLaQ-yx6E#Ua) zdpwT$V{p`a91UeSbY9_5hon~bX+46CF(jG~hQ&sU7e`tQLj?7Nj596X5aQbq$2}!Y zwlIVcG{hlj5{Dp_i(}r=P8^xQYOpuQ;w`awYltHb<(D{?m5ZZ2ulv%%f(Ua zS(Wyz5)dzr$vYOsv6TL4Tyb;+93Kuie)RTo97&HORfa?2`1%fp#KbWzAo1cbTD&-t zVi*ib5e9M8hWIwbv17>?H;BWaAr3*4I0UI&91k7o#8Dqu4fcjuyfGGU3US1t{1QiB zsW=jy6%L2I);Vm)vAO1Ddz3S4)P~LsBs{YO#tY<{NkxJD45xA&fh26^$=j=EPx4p} z8iOVBST-qy0Rf9dGR>hek(?XQc#&8>FOp46Nk}B4gh3<~Fw)}N5Xs3UEhHE$gN8^1 zO%w@Ixk&b#?L^WN%r@9tLmbvCU99gZW4$d8c&2PP(KBUtze&H?t!?y78TL#O7|;5O zWRdkV{YlI)%(iTvCmTIah6yJ~;7}Na_%?X5Q;C`eo)|QEB52}?AeHlE=Oet;2z&rz zbBN12c%F2Y@nl&{9lx9LJejmxxjGJdo(y@O2#n{+^V=19Qq9ajTpcZ&=gEMmhN{89 z2jW8^z73wtDVdxNgD8UrPXtXo5u|dSR37el(ir#v#-R=KgN?Up5S@% zw_VG5vfA@x!1F|4JWn7!YB2r-Cr0p-dqyp)C-gz@&LJkvxXHnj%7KT1-p_f`S$fN)W*cReGTG z6a`Fa4+KyQ54AiE6mSnyBo>gChrQqL@3+>>o=IBN>;Innx%bSc&02dse(Se>uk~B6 zy``9;Nr+g34keZjh=*-_7c}|994}4mxFgU&6G9_R2q~K;-#J!kvdPi`EsoeYXu@>T zB$7pwjUJl388$TeWS?xBR2Z5>4NVBf&?LHJFK(vib5`>)95Ao$NHIf`B4Q1!f|d@5 z7u)zQXmZyAFHNj}BG5n+LL*HGDVru8$0$vPEFI9|u#JNzOeamkSu`2)(B!)~;xF!U z{TP}=3{A=nO$f%&r0nl$n*1Kln3pC}%+MrG|+_5 zNE1TJrpbb%K@&jMNp0cUuBXvi9LhY8XsoluL4450K`5q^P$lf4obJTMmxBK~oTR}D zDs$rn`5)scd!6=)b52LzRkvW(bd6uUiMqlDbUbWLSt76DZ8tS zLfTb5ALyInUem_YgFpp~%)-+z;!E<8J{n0Je8FxQR$!#3aA!=9_24H=^yk@5*1=EN zSmyrlLAbn-2xe@w@6M#{sf}fp`T(~D63=98EWggAyHlIgEcG;#mTtHE)=YYsNf+bT zwr*uJ>24;S!0*tckXXT_LVN-_owSTeu3XEscQ9L+v_9in=A}%!d8@Z#8Iyt;NmH5h z>ZrHWp-igJNZN-F~`qiKUKW zlJnY*9c8^f-O_gtWYWlpx70)?9re67>2IeZ>7h;Dq|Hn^D_|G^Zfq>W6%Fb)YtG$ z(GcCX5ts`c`v3B+_KXL74B7v|vGG#fqmQJol)BS_K=S&`_6o1L9w5*rRyP}PuK;KM z%X$8xQ=5Rt$q0UgSVz^2rjH6EN!FI|RzT-IxFuA2{q(ZDE+Ou``miPzySrh4CWsJ0 z$c{{ydpol3j?}R;WeXdxO)rM6C2Psz>Lx|_8^r%#``r2{FNNI{E_?3 z+~f@Qr<45w5zOgn_a4?ky4`FmLx+G6sEeHo=E1HJ9@!EFZgn`aPAUQl$Uy8N=&6QK zleE1m?4>QHlQ8klHy^UJy&D5Pp^T-i_CpT(WVGp)+zs-+3nQ5!fAP{O!+Kd1lNnyK zSS=W@(o3zlX0ejbpvVwH{um$DC{el>$8n?+U`jqe#Yyf27;$%-;kl9@G$-5a3u7@m zBQTI=K!BD`2_wX?jL`}-S9+O37+(gEm!=iAOU>1X%>$|jK~lVgHSOX?RHaT{koW{^ zgIXw{=f}~ATyr=Rz5#JyC8VKiU5N3=IGM*E!467@!B)bVK@NI~BwmyzX=@CUa@@+k z4}v)Fc$#fPKjm_Rk*Abwh(1vgP{zuHQky&^r8({i7nW>XjYs)BLb{(7k*^`q2jO%Q zC-EMVplhj6E~mVy#&Ku26Ai0?2t;3m&cp)lg{7V=DCnKs12udA9tuzSz!tzRQamE> zal}L7bO@IF`(d$xPpyQc-DKarm}&1IZ$m0?*oUON2|;^TncFfZ1o21FEB?rcZ5rJ< zgHVRd;E#-P8SeD*QpCO>8a4%L%G)r!nKqlfg3^{wDQD7bB+asSdSIajcV`x?g>&`3 z_FlSJMnlIaDH?G1o<6S7cM+o$&#iphw+!uTYycVvMEcV28x#cVEP`hfK`_oBcs3Da z-YmJw^S<;Qd6aPy!^-$(Xhz~$x#3Z7ZI0)fZtiq6s9zsdWRJvee#YCzwkbD#bs>5oA zOEyw=pbm-iDSQ=AiSV6sCxmagSNI@+F!li&d(6i92PP_nssJVD4Tz|iQs#BzJ@47$ zWt?Tl+|jEO5P%i4kxq#KD28Cl2DAvTs(c!6fj9#%Qq(IT@PqffR*e>nK19YCM#03M zd>}req96foihBn1TpVqLn{nA4=;e7bR%Ys#ykFx^nzb?Gdls5;=g~dPTkd~&CT@Ae zowf1|E@Ri1$#?62_YU4yU%2e6fK4%SR_bu{?h&m>}8kQ%e`@q9rluY3%mv?s(|rXLg=1cNQ74DbwAtceJ7wa=ql)nmsdf0 zv-43##K6%~zWTo7?)PihE|}60=HSP;t5J!Mdg4@Z{#a&MqY~d_;_k#IC6pC%+Boxa zatycxONAy#)k3I3kr{UE-3W!uYJ^Ht7lO@$8B`Q$Lj(>izQ6(8)duc53C;WKQJ(0s zJW=HcL4bDPCmsXxtfr3*(YVThP%a`22m%=p1Tr8DN)3oMMHJ+fgT2O3qL=_gv6ZG+ zki{U_Jl6EeRPA)y($%S)%hy~wNCmuL=^5NFzJ&ZCKC?xw6%I{eFMHwHTK@LF?B(U(DS1QBwHvwMU&^#3A@PQFG^2Q|O&<8qlOi zKHAQ4PpWu(N56ajv#R?=7-fR^RL31z&o^c~yVu-`t{qJypV6O=e__7(jkpduU;>RS z{uGnl5J(zX7*%}*k-HC?%$_g)EA2gLhPY2_@Ae;MwHJr3@{I!W{+fx{TBM6ePmwMn zLzp}XVRts+nLn{vp7;ugxJ@7M#8;-`JDpe0U7n&7mfZk^$|vtFph&A#f$3x_FMXeD z9YoCQ^wReV)PZoFbhGslt?vwxr2&$BS`61M@hAdxjs^s#j>wBek`OCm5_&yE_ZNL0 zBx#o{lIIagF;rlyASo}tVfMM=B;JmRB>5gCDuisE#1+hdhLc?CBnlohVA4L$R|ylA z>WkZeXC0rxgnlpKJ@Elge5H+pyDZO^XoqmoDDH%>&;-c<{w9MqluZK#MdcQQioH@@ z=W>l#uT-ytmI3WvbEW#?Tx&&^8oX%;7yeyGBn&fRvCSAsnz2o)Lcm?H$}CzEP2eyn z=-T1bcbMl&^)Oit3JfCTkANf%y_3;6UU0)|y$h{SAld>I#Td#Pm$zdFkQFs2t39!& zKn=~nlc6PHB*+xryz#toIf<7(k+CHt?H~&x%xACS1!vzk776lrXN|_4uTOK79MW#U zwu?{@D7KLhBkpwvY~SI&P($Le>;3cJOt1IfkhOm(#Y8&LB0+#;)|435gc*Vo1Y%gT{`E9#7G-VOnKlgkFIo6kje%cm z;D@r{^UP9I8;~>FCCiWUHgQomYFYlqQ zQc9qqr-a5UW`snxgZHUdXmxzX*b+-hxQXyL3cJ*NV?3Z8Qp1m3Fk!%QeSIkmY`I}b zu}Kd}Xl}a!_bx!?kId3MS(;pG-od3lwu)Dm6ysbvhq`@0)DzdXiWeTyxe0kP93Jv{lG9|w3l>bHA8%ev z1!SchUMWOZVKwUl-a3Q?$@rj+@01+Kkctp>RwOG}NrpdmAGQ`I%-x@c3uT8Xb~04` zgiRnNWf@eQ!`~cNoC8K|i;UO?8SV-xsQ{#;0+5mlkV&*+k>a2?!7aRptDGLgsT`oC zOx%OLJbqKqZnx#(l0#x^#-86OPWdOUViK`opJdu4ud$Oy>gbDDQqmTNS%OKOhh%S7 zRtVXa>-)>eL(}CE>8kNlu}X!<4g5%|MXHGyRAP%Uu_(2v$UUX=nEo|vDq?ze2R;ny zPR8AEEcRTb!J_YBI`9m36TR~rh)`F`Up@_cFkB+YBg&ZZ5f3gAFobLbk+-sAX2O=DlbW50_Ez{{pCHb`&55<-B-r-mqm-A zAVgdgNx}?&`4lgb>pVz`zs!Ubl3D)pOS>bl&-lwE2V_Dv4xVNPSk6`{Cm1%^E)`VT zhbbh{QDUWpP*%eP3JHH?0tLm!T~B<}#=%{dC!7G_ih<~F)&$9b2%8L`AS3_^ii$O8 z)?Y4pIqfh1)tpZ>{_aldd z+<%SL*T7=o4k-i{AIZ*OFvyYiAb@HgcxxzErh>(*M(_+ zc{Nf=n008MKgMa2B@UJ_o%rPoe$I}4?SPw}?B%;NN3#dqI;oZ(I#}HdxJSI09&mq~ zbp}z2nE^LU;R7}igs3g?avP`YjmLEm?iu78{Y+$-Zgu?dga`ntP*IT5}^?xLZWa5ISyjM zhAW5%7LZDrvkK9E^uGtRQE}}jl>mt;yO>oBnVt&(nN@6YP$6ShF>DCF4#@B)BI=0` zdE&!1PSHi2OxeadAO+!M&MJ=HTlwVnyqzt;5n;`^6TZtfr3E;9R$eUE3el#i<*nbTJ*c zcL6GYWLBq?HM5GCsW^&E6|XKSHfC1A0=t-1tN^k3V`Bq04oP7;CB_h? ztEe_#r%TT~i=`U0g&`=%>c+^O@rSgGWX~$3m|@{IRs}ZXAEFY^xA9%Duy!9W3+=2z zpwW(yUSJ_1WwY?&iFQ^&V%b@R#L-?C({?(mIQp}266FmtK)HwbvN+=XHV$Gkox~hL zo;VFpP9`}`M!ev_<8@ZSI;5JEGqZ{jrU9Od5dS1TYU4X42Qs80M4c50l$CT;OgZrG zhDj>CMI1OXW);JVYPb3F@>{WS#koSL371 zm1U(<6#|Qf~*tcRE6(zJ%dQb3~uGjiZJU8WX)h?hV1nm zOrwV^Y7ucED+D)uj02DIp7Io4%3hZCVB0ey)%u4eSRrNNtK}*FjR}#dzbm}%r^u42 zZTu{JlCejMWOrx%W*_Xy0T|mR9ng3Df~T?n{I~W>VAtzAKn-&W4KI0m@BdWtto@yb zJar^+8T*@`$RmqWPW?UmVJG_sq*FA~yJkukyAyZn%{WU31;QZ*pk&^DB^DF51U+-N z5SP5L_c@>Szc+&FeUtxV7~OcLeSdbNn3uTs7g<)}I0Qq29ZIuXm_q1t zK#08QB*MrC;N*HYvJ_JMJv|7LmN(fCe3&SAZvn3x&_V16f=^id5|J8Wo_q=5`;4X1 zttge?yj374=jz;KdpeU8Cqcrgq@LAMyI-pHbq$yTpbXBgu^&Y&8jkeB2K;CmHAoP! z`$@#*u`X8Tk8CB9-5blXb(`Fp{Mh|^H+uI)@I`bqtACSdIx^3z06af(;S2zrH2Qd% z_6``)w`4xk1rO3O%5-FMt7;a{QKJNwhPZo}4U5{Ik0ym$A(jcaznrFzDWF)uHb*%O z&~35=V}KTq4-_UrfEFvz8Vl6h6V?>1&1WpACC`%HrM5Ls{uZe9$Mh+SEPCZBy-Fw# zAA=srFPNSr`BE~~YeE{v@V9Hg&NR<2{^nDj-3 zMJm5vqD4A&aGAwI5c=F5!;}z+lNaL*j0^#fGo4VmdsEoT-ga*+*^qq5oxB8O8UdNI z=ySZ%2en91(5GY!yWGWRdgv3B{7COk|ScB(j)jav{s7$bPk%w)xs;BB}X6#Ye7@XUysMc*}St$PcY)BphneT9A@ zFIMjU0$5a%ghSgI`58J0Mo|YJ#mUg|3tB-1HCeFnl<^9p31|dcw5$ra??$wHL5NK8 z2KV)=(7mIq6-v1andcP>uX*4fke{gn+4N8PKbCz~MJg2SH&0fy#}>5xi)z7#c3RN# zxlRk-u+xI--qTMIid|+4MtW7op@w!?l0MLE?nkG~(rzabiJ7+W2)rjJHfO@s**rn_ zvz#zPEb^~-&%}b>iABafsIp%{_gK(gu_BByGQ8&*teBGF9anS}UwR>RWzgEI5T{N~X~KQ%81MvGDk(A=2| zQ5Ubb)QQR(vof0c@=?oOT89oPzkGB)%gT%kUp~^=P^#<~tfmcZI!k0swL@7!Y zu03rx)GcA%b?J|Y41sh(0b)pII)@(Rqh{W?Sj@zU;twYx`!(*(*c$k5ts;5R#Pyr= zg($nD%!3(aY)3kFU;k!c;$H!050v>n$`r1hyT|(1iY7k2WII1q0=&KHjNEyviH@g&s6`)=4F?eN$9NIq`HWLeX)`d1 z>=m1VZ}2&ZR%v@8+Cu#ymW%Ua_N8>7c4B0LxI3d(8%mKfGGBej8W|XrZ2&~uAh#pL zFc@>?46q5R>vyIRCo^1Ccp6I;N!te$Gvmu~avV2>SY}z^0+41MMMeV$#Yye7_M*#S zkV6wwHkA14;1G9i`>E|-mNcX$9_}xUK@FNYFWpJV&}&$Q^mL@JOTc0o!$}NE7Mlfi z2H6_dr_9RWxM&>k>1dp>J~iD0MF3Pu-ia9}Ils;$1%saWkS9LuiEpxTkQ*?}wuz;k zHFFRX0%JY_vA?oHhx{CfD#eIEnNNVsrwCH~D3;VM5mWhO>4w7VE|JqlAdJYJ%5Eg? z>y5-GJ<@m3#`T!i;uXGo>6s(|VXq>+lOBo0uY3ek_%#NblnLk@A11!FuExj(~(F$V`d=yxr71oaD!QNM?AURFQ2=NWu{6V<_o#raWf89CvM zj?x(&b>BBCYX=|s?4BKbq)xi*y+MLCF5+<9#dDjzkB#pF|(K75$ecq_68{U2EXOkQ7q2B7(DZv(!`xljOM@u;s9i$_z}BWYG9 z1ZRL4_8Qj)q5%BZ8P)ZG+i^7MlflT$Dpo!#L_Xa|#p8s6NypL(BnkzdlrS9%7nbk_ zJ>UoC_Mm0{NFB{Hi{g0JI=Zs0n6NYn)5TEEH$_B>Q>)*7@b}nnwKiuSl`uaHvAoR>6OE z2dtkzCFu6=!AS=X9m2NARIr5T6$yoPv`XMhfIE&JOq{~4fIDTK#JCg?tWg#e?;i*G zgoWFLN!CNQ-oGy+H|0lWdH?(%Bx#lj!{hyLqxZkYl#;g7em%VZ*WmqQCL!Mca)XD$ zvMq+;{g1%=#~k59djHkqw+QclGrWJyH@4CHKRKh6g*6A>|7-C6Id`G=zb{G^uAM%v z_b;FOTPE}FEYGTYJN^GZh}hb!R15I`x6}W>KO;NS|9=5x=>K1rQO1H$|9>mW@C$_v zg=^2+WBsc|6QA&Wr|>Tr{AF-36cf7A{m)H)HJxq&8s8soK45tqf9c`v0F^igf|6X2 zjN$^){N#nnisX68dC57+^5pDfS@O(e4{Y0VPv~sy+O8`j@94@4Q_0}N&{|md)6Q0rBl}F z;=+ye50-2hB8_@iO&Mf}#RUm5XpG>QKbqF4L?DI3On{85KZAiy^ei=BZ~vU?Gc-vy zGqB+0?se3AASH))swDIZx@HcaU=&$RfH-<7ZcE&`;Ub@!{LlVPeOU}OvX0+Z@c4i6 zVqoF2jkE#4iYNi$&it_-fqm=y*5{*fk!=WrG8`1?LT^6}Qs3k@0FA^~&_XVIrf}K0 z3cI(52^2!$Q3B%0d{2& z763JSD+2f%cNTrttgC$PeNX4h>BSd3yPqGy-0vQDjLTxUBU!`U3b%`!}fV$*QH>;yhb>%O<=c&h5CFzg#9CN!iO3?!g(F49{oG6#wNPC#}5GK8f)yZ_JJ(;BU8>#Xf zc|XFHfb~tDtP+M~REtIAke^_|gf5 zYiEX*a?NA2OjAf(U64$vk4&R}NHgil=^?=GZFyJbCS$_qd*s*(2t#dn3Pv=lYi}EAEUyz~`*dJV~*Z%bFR3@-rJL^wa@aCe(k+8m`bVPc{MThQf6F_DsQ7c^-rxUtDdLF#eNZ&MZ z;;@ruxR}w=BczC|WI=@u2|%?HwuRoeI*GerNh4E-JDkLSFxLIZCz0M~BOkmFS^wdw zk#6`=6P{*2sE2TLk*UkukzSlhB9w94y;G#euArscRj!#Y#Y>~@B88E|pslY&K6o** z{-aYPy^p~)%ZnVc$-IY573vISf0BxSofpNzZ86?3A7=}p(fgYa*Ew{|OMJkhF-1Cyvuu}~xISgTp zqU0`DfK9s46|GCYpg7y2NEmS^vY2vd)(heVGdJ;!wKX0uz66_q#zY1xsEQGxMjR1V z8o(1r31dAY?60N)N#slGAR}AHKQS5PD&s15K|}$edoV1@f%+L3gI*#9GH&TO<-Ng< zK1dFKx+Y@)gFei8hD}fJj zX&n+C=A(aY!d<@B9pr==ZTw7qTY0G-_f>P99T<03xz}8%z^6cvKI?JjADoX;S;3wG%;1QIi)Z zFLL+oky*kwHSlZDtiiT#OJ1cuy`@i^HF!yb-)nG+7Wt_LgPQn&2A_{&?4E_`PHOCC zBxC%}Cmm({uFD6ZmTc)H`+HZJwIL1R)feuyR7O9BMJxhA??K2PR;A5K6yXkyY$j3DAgo8l?QEon_Y3stzEXV&a z%ndD&tRlepxErSs6In_y%OB|modM$A>r+Po*DeH`9!X@~5_$Eb#Si;!A-Q7yIr=yT zN~$({4%PkJUwnW_s|SNugn~?LeM=LAOvFVBcpYDPk&>&Rvtc~)XD089GeUSAwq%h05gnY~Tw9rvfyo-0;>MzRa~M=CRjF@gNu=-|t~GH7`~s;xUG}F2 z0GB^6CfW$M~rO<@|G|XjvqHt=!qcIDm#ycK(nHff0>qeiX|>#iMaC!6$3~tKHQp(T`lwK#vW}LzVF~@y5NaCnOP{X@cND+H*JDt%Zxc2q0W`4#g zT_K|Jh$Xid2K@cW8F*W`$oWPPInbUSu!uj#?Rd{wag3~6vau7vhQtG@7Y=i2BAUPo z!`bja+(WMxkLF+vdd`Pu(uyNwnf^%Wlx^ya>?0tz^su$wRa3ecVlhF&lr|y~Lk94{ zcp{OwbN)v@)G+iaM56n(V)lz}0K^d1-^fQDi5(-cJ5>eo2xXiH#Rj;rfI}pra7E}L zLSn-GBPK%nE!4HkfLd8Ao6xvuP zu=Qpwjq8v>e%x`{ywFR`3(EoapoFHL;$@A5`_d75@GnRODo)EUv?CB;w-G4{BjSGd zqW3M?VTO=G9vJfv0uUJ@8y zURjYvyj#Egj}q_P3sc0SValK!F(I-6X-Vvs7?t!GC^?@(wtHn{%8*r`-3k&}HSRwe z3Q2=zz6)zrhY7O}YZR2n%gg{*EXbI$I`!TgE+i&PxhHpG=^!`x+!)=+Zm-95tlzY^ zf*}-bn-E^(IY<+dd*oK?f%H-jF0It_kbXW4>XgI(QPRIq;URrAlk~)dq$d{4iBfG# zD6x_Q93mehPX%yjX>FK5g{5y=5I5y8_qt{#eDxOewH zER!PEoiST~=u=eMTXCidgH)l9tX7d}c3QD3r=z6B7$rc+!U3L(3D*`MI_9YUw?=yq}X4%gs& z8Z6gfnFd$Qf=4q|JwaWj@~lsl+WV8Q6SJM&pM+9^V34lVG|hSyR9DM-=t3PIR-h<- zww{3WzCT}r6*&yzt2MYnZ!A8EqB;RO6T1dIT2f%rBJ$i?uWug+%RU(J(}4Am8=5P( zsVJrkO|qf`Q4skQsT?5UC@T{h(FZ(;RH{1q=n{AK+tZ%T!G59oqNoU^xDt!w`@5XFrN(af%xG&qD}Rqv>zh3E z1G&<8Af&Xnn>1qt8xoJot;Tl~Pta$91a%pFE2zt{NU!mF+{nw^$F)v^_{IRA{FU2$ z7R2F0j4&z-{F{~sx!)*4x@3z&ZU9bk{6X`8*3Z_y#vH8AzQqTV*ge#xcVSig$bO!8 z)qX~Uy8zU@_?l5gB}Tsx%KKLWgAHO z)SKgy6112b=$qX2eW4@Y=+>K;MZ*|p#%Q9B9EHT#ed9?l=^i+wS(XlP2r~JoMU?k? z8Sg>wrJLv?dRh^P#4krTU%C1a?Ix!8y%o~U89lz;BYh;~l8s%c1%=jbt@)$vR(j@* zag_oTbU%1wSKa#Ajnb{cRJVBBHQ7tZQIXGdZ%%npdlO}EB9yXN@^^0COo&0A&T}&O z-+{N)XM8UMQW_NEi@0)!u6qctxqxf!ZV*SslP_9>@7qXv1HAKYeoN!y2yS)Xyc2or zDErj*q^ zXRV_KNtJFuN}89y;)rT)GRlI3NG2X=!6+us5i2L7b*~Q8kS20!f4D~qjn%NP2js2M zGqzlhE)F0Yax|u&A)BP4fL&+lBPUppi%{gt))R1lAq>f;Q?acNl)DFu?DDRRbD#(Z zx&SdloP(ppJxHJxY(KzE0+0FdAEv$lf8b!Qr%v5~Sb(v^hG`znKG7k=W*1q8=)<1n zXg1oIRCcwN?BE^CNl5eO05v;v{k zCTRsdU&%a>cQr!*&X|H>o}MrH5K9T|BoOl{Q+|Yqz>Re!#8F>COgCUikUElAGC|(l z-2>6o&d2xCv3JwM1Sl;7G&ye|OB*s`1>8T%_2&lAuA6to*M-r> zojR_M^;iCH_UA0wB1!e9jBSnUuf+fV>OVZsL)jvngVYKmoDzq`4>0ZDp#%MV@wzlQ~&?G|8Q61|N0NGBROWI{kQrLvvDmXd&vC% zqW^HszwAHEuN42`Tn%PxaK_Ye{D*jIy>Jy-wUhNiaB?+A1Pt=!G}|lWK|MSfDy%zE zuAa}8{Nk)BN5=_nKshFRH2kurC7w9WqzD)}(LvV{ySpMM($s_@f{Jj7qYkbZ4%_Tt z>9|w=s99ryk0G8~l(Wb>mKN{bs_U64^hT(nVj`?M{@j21vlf- z+RlgR*hr(DG8t70h!-!-BR8xRxT{|EpOhj6QhV8$J^)wDC2(z~Z}NTJvg-30wAw2h z-`UHLXaQ*EyJtR*&FqoHJoq*4RhJ5P7o7-x9wQ4r8U9n@HE$62?k%1439;J7KbC25 zm;0Fu(>TBoz(I%<_2DHKBN_RUB#y3-3O=J!shE8Us&kA_Qz6|jSeYv{hZNw-5y66B zc4Div>XAlM&L?0g!C0fnt;R}&HiLIi@y(BPRnbPV@s*3^95Ef$7@Ww?4Q}fRpuyjD z(aW<$l(him?NyNI^3b2)fUaOBO-E-MI)?5_E|^2Qvt2Z$YhE7cUjI9eD=Vq>r@wR2 zV#yYnl=ZIC$raY0WRe9stTVkOhE74Q0|?3i_Yi)Qc}#uC zdkUmyF-9a4Q%1^ffRsm^^ACxqYsktj$ij0Tkk2BW`tL7`F;8M9S|E!tSVu^&D?Du$ zV?>yA>aRw@eD)N;*$}6VY@G6@YGS7Pm}`cmyGzaXoAEhOUf`g-fX3W4DCICoHswPM z0blEjhMLTbl^89KY!#>|`3coss!I)IFyac^kXaNV;J#C%-cu2&9^~qakRF1l^Xze! zUf#eA6wQpc^iqbU30-&TA|0?;B`Scntpw!Tl`zP~e5w{#!mj6>R@Pm*85@7yrHhnM z;`az~)|lO0+E-vJErOD&bW6<%e{5DsVVngqloU89FF;6n$=8iXt_o}u%=KN^q?*>3 zvA|>s<)1U)v^cVr@-ikwSTA4TD& z(WQ=lI zpjD^Tu?KwcsvAQq*OV`3KFSL$lqW2%&jeA}Nf*m$GG)aDFPB_uR+5pY zgbkBwCCu0)m6Wi91^~n=HN8KuDwD8k|LQ!1*fFFg&{(S_8wY^rhUAK5QF6b;39=rO z+&B4gGLX233(tY%p6&+~G7ODskkH_@5DfCm*z(=Ez3k-1zMQu@j4$uUc`KS1*h{`( zC<1#aA;=!aGk;`3#KzIvB9;S5WsSJk?vHKSK*Il-Hyo5N2(1wk#lhGuIN9bL@^EO$a ziQgUDWSOVQR8s~<>Em7)rZ1tfF!FZ+sMHU4(&` zY77h69-LAERxI5OCtrW?vICN(UYYTmiz$%5G9A&9@TAK1F zCFBhwJ~=42M#?Ppv-i65km~G?i%e&cC6*7b5Xma?k|`pajh?>Yq}vSKbuQI&m8$u8 z_3O4=9MJnVq&O0{h8pKi-`&rCe+8aZfFpW7SD=SYzc-nF%NzKRzRsi%n)D%tXsQ!^ zm#%7tSu@wt&_$F|JTS_X!JY~YdTH1|9p*x9`aoc=8{<#3aBUghn#{YZm$DFa$=&@p zJy!$tz%Di`M|Ai#VaY!;l`kDZp(qQ1cXbj%wdof_$5uV;)sK82?!LUohw|m|67@)Im@pz zLfnN*T`ZT~ZA{x?4N_tc{)zseSicm52}xb9g%HD(DzhT&bqQ`iZjBTkK3I7E;|w3)T6oF&t%Z9*|F#we z3f2xeIkkoFtQXLx$dD-ly8Y?3_jaHdbXckcS!Ewo*;+Usr2@`w5;p*$lt9V0x3%yB z_;+aXh`}_LJIVAQ?jCU{Nc+?DGD3PiB@PQldn*3wqf}k^t0GlkAVd1A4Evy|kP9&z zV0tmql>QjrY#h=d`Mv1n^Z%(|zR(1-ND?o&_pAKal<{eygpd5(JGv1NSr=5$@K|jm z#E84^9lS@p)a;HgHxoRZgCK_V15k)#=q3rxWCQSGtj&s=!EqZ8S{efhGC6FB8=%W^ z@I9Ic6Q!7&8ts96U;CyZvY%>_Vv@2{_ppJ=D9R{t zb^BW4KpaQq3J#u{$&#xwSOV>p#$5?J6{Kx}t!l$(n%ZyQX7=3rncF=m zA|r7juG*7W;(D$q_1eR0XWtLAG~Ep9D+Da$XX-EX1%t4|LJm9hVQMQyR0K&TiXWHD zMNDCD@VLRf`SXzY$yjcad0JZD#h$DZ>@w_0oZ=0^gKrc8G}_?42--%RCmp9gf%k7T zN8*#7iL8IsF>9ml7bm4gYYx3xwZdBK#Ozw{?BS^e{l>x|-UU*4>maer#jvkRnt}gz{lG0~-XPmYGE8f3E$l5z{_Aod&20`VSH+ z^U#~qK$a9CU}34a=8$fenlVbOkmL}3%cP|TI{X82Kss!W0WOoqK=ZWx#7n2FP-7_z z9(eh;NaLz0BMf0IB{T>{6d{f&kPSQmn@I7}3B(G1GKV3|m%30BHayb(*obHP_#sZc z>T83Y&$XI26#+H#q_+dm4Yx$FT2ej z6Fz6fbg&xhD5`ZEV1>HZNP7X*%C>C;K?D}-w{M3ml)C1|v z9t}uG(2s@lrJcvZ0fv1AKl?g%LLP5F6^wd}Dc%tWgp}G?p+p7;GO?L7$(xG1!8uip~Te5I%0PeYEhEf0FR5hm*mTu z@9aR|L5X^dIQHVf5Z-9PE7q@QKYIN#`IC;DQ>M6n&RcrFVt+Ip^uiX3OrO>xwQ%i( zlY_XPT$|1|YoWM$jFS5Fde~Hl_Rxm)I=^OhXL~KG54Ov7hJrOx{ZXf(daoS3OTnJ;0=%1%Bk0h0xJy?- z);7VXYL(3iUBdG(glWJfX+pfR?FM z50d4@*0gi}spbT7KvPiS-v1jY2C!FAa69$~K9^GvGUT)HnjeBLnf#~S4*A`oXb+)XFYTiiYP$6Lg%imazff$|xpw%?Xf3IM}t!n+p{ z^%*G{&cgpJmERb3td2TX_ox{Xh*PJG!*=&*B3+#u_&#{!A2FXdL13)VC}>aXZpT(n z4lJwK5^}|Y7%~*9pe#kDN0bY;3N>eOfJDC`Xl`A}R$auS&5~Ei2)7hLzP%+3eva8@ zmiM}7PO)e>!NSvA&pzZPanVC4&$M39)3y$&FgJuu>u+Imoi|#7Y`w>rLWo8k^g6a7 ziJ!dHEm1{-_x5K%?G>rf*y|5belLftgh=aR(i%-&5R5E)vAsG&XgD{AJv&7Z6t@F3 zrp3=uMD5~;8-_%(5Cp=Ey~6lnAQsx-KJxAsej@xLV$=cL@LqXH+SHTUzZ>cOLNaa) zZk9aUPquV#0WTZC0^nF~aMV>C;u%8`jLeV@ji{F*ao`eF)FdZ@ix#cXe1iNXmmIT+2a52@8Wa^B@p-jPbFPBYqd!qJWp9pA{S27q&`2TlYgh zk2L*+oSjs-Y&M^Izu=Mn|FirU_{^^Oag5^m2Mdh$g4N4MEX_r~xB z_q}%nlekzU!+QcBy7DK-;;A6 z+Z(-@BRFT_>r%J7w?v6=1@Wx_X*(YW)MUu6(~npcc!}`{T6AM_5b763a zjfB#jfr@c776$7Mi3|+vRD2Tp^J-os&&*2V`{MaEJlomH#7N)Xc$X9yiLalg8tPj$ zrHc*Pm&ByVqSIfmM`MN@A)%+3EWF8D00%YkUSye+!_(CDXf8K-JxK=9lMxFdgHj?b z(CCbH05^V=aW2HIxrc~lHz!lBzDN*bXc75SPH1qOga$stQ?ttIDFzXxAfs4?N;7t^ zAZkni8wsJ;gIJhJ!ei-Dk^A0}X~c4I-b3&zF&m^M3Es3!tmL2D@y8GsvYkm>_mw>% zB$%e8g(OSgg%ug|rwmspBuD~fC;%68V6p;y-=O>Z_tfeLMIa>VKLdC4DYH0b$-OhP zIAEc}c5dR95KFpmkY6rnNMFG(%#r$X`X;K&nwz|okWF&f*EiEA8RC)VCIJtbczuT! zz$=;aOXw||?1N2RUUcNtORnl^J`8=)hUE6-ACqe{^hf5G+toh@&l|uV*u#jihaRuX zyNJ{0T-1zdmMmgAOljLqVAqo@`*?q7(&i~G(~JG$VaeJ7GaRlSMX2; zr=Eq&z6W4vsn@xsNt#3rQGH0UT?I39G&{eLaaJbSI!B{~I+vifV1fE|Y%!*CgBAns zZL>d78x4vdh5wyg=ITPj{ADbKK{OO7=BIlI$VuoJN4wwt5K9}EKvXcHJ>+t4m+xcF z(@+MWu^V&x3i7=LNCarDF&7{VXExV<*{fxae7!xffNFIS{AhD5Q0)i&SB{ftZ2o#dvN!$1g{q4y7-uD2O zN+NwnnD2eRwmWJLXO{oh@IB(6z_)>|?hN15d>!2+i>XgL7Xop>L_aL$4)$A2M67$& z*klVDIo(NdDRN&i6@p}e5ZFln7^x;E-B@*U@16*rr|0WbKAJGm!ho{W`2l6JuV96U zCT$YsdxJ13liu?oAILpIzQ>LwsF68lWeQ^>61(wTcBDQbsj@J2@v*uvwH8Se+*_Z< zGShe3vCQPW4J+>qAQg)`rly+%RFl`HWrMMd_6x6>sP?Ol^p29=(bRl$8#;r5gQKZv z-vA@{ks&KJicWGERcj_$Fx<={RU#5$0s7g-N`TBD{Up^^rt0Wv*LP@og)ui`pI#>Q zumdvDE+&UU%!H37~wLFTDMAQ`OivzqWd-9|HDs5-Y$aALHcgkzKS`c+LL_dQJUj=vDTb z(CZE7U!hmwHRgNIUi+l{E?jmyMZr7PBTnh&k5sHs&NoS1IWLwen&LcjViaYlh+SMu zX%15Gz7?K=L8-Jhlu#g`5?NaSsS(n>=vC?Pdp>mdC?g>7I3e0+^9e$7hF3^3`&eR#yC&|4!8SkAN7=T@%^1)YwN3eWYeodk zSwvHgaX_druQ;jw1`5@6DWS^1ukf08NZiahzg0VT!ej4(SR4byyT@)A8x68~^ogrj zac9Z?fD)?$!Umt zM#&c@z=*A|EoR79$D%Cx&y@CF^)E!0^WDAUo`n`T$8@Z_c{9peiqs2`eC~aJ&X^&A z%wZBKhye*#?oS6&3BDsK1E0ccKJf<45w0! z=tHtOV=ug6J+=yDThpLeOi2VQ&2%o{?)V;*lB*_WS${bYH$cS;8+Ja+u1?fk>L*{`$jhke2}B9(lQI$6v>l zm-Kqdf9s}x52@8_X54WTVo(@FI)5B2hBPYiVH<~Aw3_+g1{l3wzP+&CJ(Xv5p57LD zdW1XKa+aDcEgY{}$7eas{A}TMo9%=$ehyA*n2&|6f7J(3%+KFVO75HA zchIwEVy1_U@SAmV8J}EqoewDNi@T20bmKaq5juoC!^N?UR-~M=RzYN=EG9SrQx#}B zD{>|D6grx5=acVDKqb`(h^FvZ-WyE8101M}xe^*CgrM7S^SD<+ZKJ4b>=1!5E>}XI z65Py$4(+fBzDSeFa#ibY#88+Qkp5u5ywm$9e0b0oIpkS+c`C<@!?qC#;M4{y9e2Vh zqVIhHOZ!ALjtd`#(0fQnz(aioV)?e z+?OzJ$z&AA(g%7;+~bUMou(#^wFTWT+%yg$ji>+%icsQtOl1=RXp#HhQ>X{-!yo^3 zM`C~P1b5f^l{kGo{d!hXMZbP{sOs0Rku{ulo@9=+~KOb0_w=@S1OtSlwGd zfcfOn_Emxa=l&KfP5$1!^CQruk|S6KJ+L0E^C>X40W1c7F>3h$@xw23 z>ZDU5x*A+OEQh`1WiRj-oCD$%Jm^yo>p|^A-Jo_N!^kXRG0*{ihr7slz#%FD%>F!j zgp__1iLyu?I+ANT;vOc)GYxSfB+egakT`|Q9zt8$1d8CmZJI!`XOhxd9BF|tmjjE6 z;=ak(0}6bkBKSxPK~8+;ghWmEvJ5*e6L2gz9D-*s4Y+1yq5mbg+6Mf^?r|W97c4L0 zkxu>80kuU<9qHPQTg7SL=(#>H=6ZDVvmr0P4*D+CgRX}A?sl+jw(*+mXg_8?JYV?- zJhJ^K7%g|l8a{HFV$%)v0=LSCV(T=|L@oH*HYPTKw1R=eJSY>Z2w@11z%5Xj~DSMV@D zs4q&1`p7#I%tIaqAIT|CF-Q{2B{3{<==pp|A5u_l?&^%Y0uhvet*R|Nay@R)JOX90 zRnS^g;;cv`_K&zsD6y8Z1meJa>xYtb-TPpsR z4kZ}++=g#_C?{|;PqC)YAU0rR)rF?ivBV3Q^jAnla>$Lp2XU?NI1J;->koG!uaod5 zl}Mk;D`ZjS_1k-U<#oGU;}yS*G7Tf#b?=*dx_bxoo}x!T{cr8jydSf#rM!=*@= zkzmA~<7_zyEo6JAV!Zt4|8rs-#%s~3f|0Zs7tH%7#CY_Sor>`ru{3BS#`n(62E8jW zzCmICd&T&|yL{*{bV{bp|BM*l(Yb3ezN34L7=M>ZMvNc*E5vvj#dtjVU9$`MEt5B> zWy$Yjg{uPsqSikcZi1pzf>zw8PcGPD1HwToA=im4wRs5UZ7O8(TdZNtd zAVuz(f5HLi_K)7(;fA-stN9hKK|bmXBj4lI)B=&@QhGFL{o?t{i_v}&eZK(bPI&!; zQ$Dva=OBz*ea2nIS%${1N(3B}=nGh#t@T;7OT4r}Gvxg}YW|;`fl)In#)`wy-M1<>TJJcFn z-L2{QY&c33-H#XZONDlR2050q5l_se)|0T0IKBWZ$r zT^#(r5bqFizqlE!E`JMu`2KPCP?tn z;Qu20?*tCH_057wZZk^c9*O31OPld$Mm7FK>hWhLEJ$t{)6SmDKNu%-%Yj<%Jk-ox zfCh3Gux=IqRP(VGNafa|_1s!{WX8e}|L}1kAM1c)Zrv65Q_sTnEL_iwdLWhCK*$Y1 zJGYTF8i90f6U#NRNb_aoMtjj2e&^6Fg&5D@OIoi?y+jF)7({bO`a5qaj)NdyM=&R{kC* ze~;(iN@Ctp$rf7#w-)MKUdsaF)>0*ZtD#DHE!7ei3bfQqnN~@s4Cl27m0D}q>(-jf zqt!KYl>!F8vtubQK8Y3pHF=En6eadTXk-u$Fy1Z7wzqK98me;zNJ!-3DyseUO z+Jy3L4U$g9&1+lCza5pN;UX$J-jY+>z`{Ac)@EuO!o_4&j<2o05qju5yq?nUgZ@B8 zd{7`rsqeJP)*1%&ZSvIIj2m&j>5xJO&DG4C-rNw<;AjbA&>mlDWm}~NEK=Is#NhOX z8fcC0^v)Ptm{D0zC^PCCm^Y)o3A*H)0UQ~$G_&N4_9iHg?~Ima=$tRo+|GJ4o9c<@ z%%)ZbXKB5%npPrMRxb^eHCGZ?S##B85-hAmFsqT)z&A^=o-G!_H@mWttw%HE5Q^_64Nb+(m-YTrdJp^A^Wg?_A}>x!O$xusy!>>jjq!YAQ*B3qenCtg@;K zjP$`iK)8MA0%X<)s{qzBfHe3PfPW0?X#o%{goq<(V-Wj!h|%)ZKtlKg2|-W`31LvpVaQjjg2F(bBoFMDC)zV3;lA3I8Y$93h4a;l zrub^x1^I=|)CS+e=4K73X}*OJFa&j#tr*08bzm_A$O{9lUSBQE);HC{eERCa90_PN z@w5oK=&Ls+MfZGPZ>I6~!4OKIcs5i@g@(#2NZp2-T2^m>&}slp$CDO;2=fUdtO21k zR!TP;D_fb^SSNgMtZ#x_;cHZM8k)U=R)SBU21gm3d>0Wc?Lb2tKs z;Psrs>mN0tqxrFZt)Fw3;@kCgEkAOl!U;F%^J>4A4~O;^_#=B6e7`eEp8J<;`Oq1B zOGQr3=ram0cA`EHepSQp*E9?rXP!^hFsIefp+m!gWf~6lY1s8$4Z}BSm@{DV?=<;8 zH(`^8t3Osg41S{F>W?%WImx6yZRq=Z4M+Zhcz4>G2yEk_HQ=f z>l&87VV>XAaPZF>cDWj^enrD@Lc>uL=De)WgEma+bM$u_hPImg_e}V{h68`oF!+*& zT_0#T{3i{g+cb>5Xu|C#{7}P@w>0c}%7kso$B|2w@8JbTeyU7ZtzqE1DmQ^4rT2&p z_f$Cdb+{#?A5%I}X=expCpuz$dmGkP97 zRpqGbrN0vh__+2Xwy)|<*y#D--wmEd-vdU^Lq^XB&2x^?^AV%> z(JQncIY!S1j9po6>1OmiX!LyWI%6k(ruYul8-5x+@48H%!$!{sj#53(F?t>_dY)tS zd~k-+v&-mt{|QEqjh?SQS)XIan(!12gDpyj{&o#RM$bb=&quG<^wld2y>2z-jGm9K z(&v#z4Fg8cM@<+odR}hyJjdvHm$82#qvwN0uSb8Q^e^9JLZjy~qvtWB=K-VVA*1J` zCR}awJ!4eC_b#L7Ii{V#R+XQi(evR-<^O7<@BK#KyRKKc8F) z^gL+ve8hwUM&Cn5&j(G|W%N93^nCOgqn}SI{HW3MQ5zb4ADN{37dCo6VDvs}^gL?x zJjdvHj?wd=(erYn=g~gXpZTiiQKRRhx2s;{>uk;j9ZujvCd72o!4yu~ zpHbe`7@gU0qS;TZ%bYP?L$01V<&`bc?{fN$c%B1*EH|gJ zX(8z`r>2#wK+YV{Me;GBWBYUK>T8+KNn9<%2Kc}XV-1{rI+)H09E66jD7Y=}9A zJRgIwz8XDXsPiX;kZ*a0d}}Ctt8aqS&*#?Cx$`7!Z6m$wTie@+Ujydr%x|das39F1 z>Ki#LK!_O`L+XKsm+`rg`XFH^XRuDA&QB3GnP)V}bm|F0PWJfRq?2%mGduFD$@H^n zp{y!7O)B}(CS9Y17>$ZpH>Jm>B$)# z;V>i|tht>ronf6!wh%(E`CPw{tK1BQUI;lYby}(C3}clxf+wqB~`sQ*l- z{%a_D+)DkI=XS18I<1RpI7f8aW>s?j>0nAL`oei3;kFt1=2{{nKegn1xXZijRm4L$JGktQA($F#EY$Sfde)NX(j1 zrDGl=GUzcPqn>|8a|;v%Wg?ZW(@vjjBIi{wf^mQ&DIyIqiC`$g$~#hKwqA(oHX>zM zrQs;zFKceTtUbmE&LDDbc~VqCRt(hQ>3Lj1|uzuh-?!0 z&#tYN@y3rwEJmZ23{ZrF5vrC;eg1Oc5hCZP4+PSGIkxy6bdayH$+-sxJ;yJAtGFK}~j~+S_E^%P+$c z8?COX0$n9S(PE^2p_n2>I%aW?fe{(}{ODB^wcd|F7PQXV`h^VdbFRUfwkcB}EJ5P*2=4sCT^-X26%!r7gPkocF zej){{Q*0d)al&zI9T73|{(1q#tO>&K4t=3F#U{(U66GASG|3@l^bcRqAT^VIUVu;YLwC7Orn?75X%a z>M^Cgwe2(_)?^%NKadfR#@|#^Q!Uk-xX4UYvB)VKB>pBd+WVW#FzRn=p57dzur)Qe zR&gr`k+%9;N#O`7)y7V&AuEI)4q`8Wg-ybt3-G8|y6o+0>PnKglWaTdX`|ENW7Ki;P5}n`QJ5{D{DnW&{JQkXJ@p zxBy7OP|IPWwf<6&N+azivam@+ofb~o!Z_MShsBSLF7XuoSVvV!Xsc6S!rxYJOhH@o zWi=d?{qP;JiOYx?hy86Gm&!`CpYtXeo7$V|l?Cl$$56PPz8LY5L6dN>5{u%9EW!f2 zWXX8RtVQtXxH;e#GKXwrwvE67;I|vBuzIZWn6n#5-%!I{5Bm&vS+?2CGrEZ?FsAl- zG31OJ6#o}z-vM7`b^d=rZEh9>M8SPkR6q=28bu{+P(~m@QABPQNhIT%n?TU2u`XIi zaZ_vcx>{`=asF_pj*4}mR>ghmsI*p#ql)|gea3m;_nsWyYybI(_dMsE@7d>hp7WgX zDoy$Uw}aBCg|MWY5h84n=ZGaGBBS9N?YYKyt_hy2)N>u;xt7XG6Ik*p<@A1;lgwtHk@3hXL7gzqzQCRsX%_M&50&j*TL1Y5^M;rX?4{d^(0Pn5PNcaJ7Gx~m`8hpIWy2b zlW8|HhgYOr0uuU1FNO@ufosa#*;q%aOZ}!VoC}?R{3{^IuGZR0^gBZ5C9#o6M>ulk zSA)Zn7|$uM!bqG)@yb`!%XVWnw87 zDs~a&A$kF&41Iu_UtA>S$%R#|v>&+=q*vvj)-(d)q5^|ok*jU>Lf+^km+WrlP!iIY zN4GXh<4z4Cmxf;vlM&e*O zygp_G4gdKG8ttNDV6wxt9Bhqpt6sfK_JMM!QR><#w1yU|#I|yZS`4moVPiRUEws#_+|WLlXjJpM7Lzhnqme{d4zwCs7v_+h z;qA5@UO6)sOrWHbcxVn>G={{rEJ+GX4z!e2RkTT!vm7cw1?~Hht1~egOfrYq2CHH@ z^)+ZT(yDTBN~EHRcxeu8!b)4w&a1RvJuMixb+N6fZBP1&w0-09W#9)?X2imRg7R%_ zVQUtwQzdI8aJ4UkaHG)Vbg?$%&}OWRlBULL;kP-k=hR8Bl5DH1g_R;lTr|R( zWX8kQ3=Nf~GF*u%yqbm!t6(mR=p8e^@0G8 z1!-vHYHZP7NC?j%zZLaZ(9>v22=^funi0(=E{JKWQKGGJrHoUo>qX1Vq3u~dO$1l_ z4Bp?)p$^Bn03b+oWBjU1dXW62d|2%_RW(vOw?Qf6qY61tHmLc@kJJvb4zNoQ$*N_t z`<(;L1I9q8ljK^)CvU_>>+>Aw9LSjRg{zuXcXFu=#ZdD?>wQ0yGIK{xMYtoS0>;H> znsT7Bw1CZ%A8Y|KnppebalkIJDCCH^q!9tNyn;83$)%&Ny=q0B^fajrG7d;Vm`;m~ z9CEeICtlLtYGx>0qM_$N$C2%JazTJlZnRF(RN&&JQ;w)WR03!ZoxB>$fog~GPI-_) zN7{5%TU7!JZt{Z*(jW&)N1r}tTyw$CRQnM6>L2oadWXRp9u8K9`Vw9N%Mk1WkFcN81!p`N8@?@ipPU~o^YHw_X z^&&c*87XNWQOZ=r9Xm;Sk#B3;3am>hw;5o03Y*zl!D=jgMadWk9mF`t7$<8SQPMbO z*K#dpQ`4|)jn2l9!8~b3+&Ne+X}WVOF!)$KiOvN|Z0XUtbsy z0iqQR9qrJQsm&@Hp~PXWL{2g|NXC_z&8P>ZOGldIz*UsZ;g|>T%7Ag`D6$km*sJ3)F2Pa_Y_toM4i?*%5^S!^}4v@iL8yC4iYju=~ImK&o35$^}g$ zsywgV!Ly8WKG`hb3y}l?Mb7F99*N`>y@GvdIVAHsZUo zv6T!1@C9F=Oot4~iLp+`z$obwV31H3;3U)a!ujlkPQc12!+tm9S<}$*{42RwqLlob6OxDkPjLk)uiFh~(S2 z4AYZz6><{mQl}Z7@FFdwgd?yMw)<$Z33~@JrIU%en#L+Jutj+%g6&P>l+j1NEgCoJ z*Mj(OB^?xw;$R*$2-1z!Q$qIZF zDh(Q%w9+Wn4`wLCcw@#68VQO&sYFp&a#Y)ok}W4G{I|V1F;#XOqr6g(+}Oz{rr|51 zgHmW)?d66Qscg1H5v-=*C{;#hH#ueP$i65ebs_m`<;f}AAndE-VO3SKT&&trHu<19 zQPO`RXZ(12A3Cm+t9BPsQrN9(4BTvmA&rIIzW*3DyFk@}Kig*%%WjQ7#;8MxGxlJ$ z#E{!)Ozig495+twHt=Vsrpazib6g9mnkKs?O~~4o7()6W4xJk)hH?YgDn7dCl}V$cVGt>{&T0&20N=fxx6kX&OrWk&72I?1#Y7r z=FSb2c^+>7Knp+|Xm4hRiQF*XgSWxIysCB?1j4csa%1@fb)FQ}T--icgchVN9OI^4 z9OEXtSguj+s0?f=n#KxSF4VaBx*bJsuWZcUV2Fc;n2V{FsH9a1yGhYtJvFxy;sja_ zogvAk0;v9)y9kSP7@LdG(|PpadNA{*oZ}7O2b_Xxqu*YlU0N?apR^!vpWgBffcA+qa1>pk{b+^ z_a|~$NLH{GmJ90;Y|2;;Q5H;+CWMaCcyX8hjk_F`OG)M4`zgeNZ`J zF7KKN8xpr1e$F-8A@P&i*6E#f*v6tVtExz+rs0NqP5;4-)|d{VMCU@__QZHD)Hn(L;Ma4oI zbBF`oPIv{oS60<@$XtM;2Sx)v!2X@>%-_^atxMy-g%odDy*Oy6x;d<}%m;+{*Woq$17YvncQ&m|Gf=l&?ZShRTVsGH{ww?ZXuP9YA7xC+sgbK6^SdV@U3pUi~B$c;NGyoFZ3 zX3mnrpi8@4)|R#IG~QW$084Hd;mO7fchd?OfVqxz_JvqAwYhBL$+%iYaz}X}yQlJI ze=fVVo!Kp8hHPGWG(bnywAGOEl1B=lG$s?HON<(XkkPEKX|&Ov0!AU8b|nN=4JsiK z2OHgt2-X!%0vY*u>Jvrt^d}Hwf+ZN^X_6EYEWwyyY7$HH5rVWaV8(hXst|rb#|9G^ z8!W-NUS?1$pfre) zl(pJIXtfUsMqA3}ON|D?Z-b>gbxjBpngB<_qMC{W9iSyfTTD#Iwk9cIc_V0rSxhz; zCScdZ)F5>zZ$x8jF{x;zV=-|IjZ;ny3m}>^#n3MDMi>H9%O^0W^Js^*qozG}%Bhq9 zE7J2ZD?Eb4xDxGEoyD{lnKwc=nu~Gk-6!S-38=vcq3kPp-YOx2MG3i}ls7`Rsf(fZ z<*^J?y*rQgcw1Yu%pe}A3T57`s^t8N#TAo}o{o^& zWZ$AaW2mx3z&J0vr+Kqm7A1|cpEo;6yH?uPw2Rx;h@A&4A@bOes=9n0*&<;@XGJ#; zrckK7*m4PNQzx5qZ!!<|2R(OM)OJSqCg1&f@U~3=_QX%tTYuF&Kbk=R!!Q zT4ji6Hhn6@Y^?t3xpD~cl+8TSE$3FXbdb@KiDhak%fsO;2;X|a$N?=;j1fX@E7AxA zskS0!^VmYlV+N_weO0r_VPRyn5)dovU}NOtL3ykyo8}cAS`HrP!6>h@1gXJp-C^v9 zAn3r?6qdsvAY~hCg^M*Nr*{&H2L-fh-8(=6tV)}FFu6=u{pqI38V(#^=4(JQR&aHL{~^Mg+An zhZvSd1UOPVcB<*Hbe>8a9C-l2S}?0_M4)kNuq>rDd>-Ztu}*Z65KwGIo62KL<|4>2 zDnXLipsxRfz&h%0`3?3?ir-IFSIsp<i55H@C9F!wRzg1L_wFIhkzrI^0jNmNFDqB@(}LU*RhYgt4^Hes;X z2Ev3eVdF;&Q1Vk{SZk}4mRibXaHScoTPletuGH6CQEI8H!D*0`lf)?W74$|Q)Rq-g zWj>&wp<g%$NrNzO>$>^XCxRJK z%vo3f`V^mh;R;dM9Bihy%-3`H`E&5h!u&S2njuWAx2mG$L)F1y)}|vX=Fg)rp(?@N zn1bp;>LKZT2m@tw!+c+#r2Jr)l*vt}2=eEv{bV*-yYs>BjZg&zWzj#7KonFuw((FH zF-@GsgT;au;6*^s%FB+h7 zE2WqrQy43R%9Zj(38czn2QD9mt>&tP+BoxB;UOK7m{~rnany-qKgnm+%@2bJ!WNQ< z*?c)4hy2JIkdIN-zS`&t`L(N|8Z_1j_s_@4UmSQ>xtmWm&uQlL9H^FB8ltc)Ar-P? z(h{tW#2Zr>x1zT(<(;X`udm^fHly5#DOwooL7=emH=RZl*(E6+*ALm%byn(WDU1ga6;iOEE^Tu@;AGF}Yj^;lz)wQv!``Pj9lVzwcF#MIMi+Df8a&8=EpO=-f$ zXhsiH@P+*4n-KY8TWl2NFTX{GkJuOUX~P)TowTh%K?l(7U4-G>SyFdx^F^;RW1=Of z3*|$Lf#6D#Bt`Dfrk1k^qtgocCc!Cm`YoT((rpEMiRmFTPoQ?d(B<7E}j#&sm7%L$!Y&56!2rC;yCJbnVc8a-8&_0-j<}P)FhD8PUoMMs>6=hX^iE1&1XTkbzEy}wRclBN6FF8C1|`RgmB=K|5o$CI62$@13l+PVhN^nOQXG-TW+nyF z)4VA3V3GNX9anOQr_&&G+yq})069LOwGlbmx9EXXyPe5bH4;M_MME=M8ZdPNtEz^H zOj?~-skpvNX}T4Q{is09W-?Cupf%XwT3jjn1O=p-wAU3k$Ye4kUk0J1R5u}xPuTjC z8xzIS{~pPb5(2w`Y;8i&3H1VVsE|~d06CXeNgPTW4i$Wev%u4f8))~-C;1_}0#SA3 z{tzVv&4-L_v-!0$k1XdGjyw{(Y%m8BnJiv}p$SzABu{ZqjVYMS_vfHXV4sOX`3xL2 z4OamdD`u0}kUi-FS#!!nL1a~ycvNU4qpEhh=WwlBH^Q9ukE5|r!! zLXz!4_#B0b4OGv&704O}?2fMu6;#((z;ZGbi$q$-70{BMc(p7n3$XJ__r>`#K0_;+P0dE zY&3Ep;R{FtV$#-NDp6Yz>1%TZEX#1%L%NJa7XG5$JJJE9NbDB*EmC@z(nFLkQ97n{ zsnWxgE>pTh=~+sbDqXI0nbM1uo~3kL>2jqTlwPcKLg~2Dok}+--KBIw=`~7sD!o?e zE~VEgy+-Mj(rcBzN$GV;cPpJzdcD#&Dcz%Vx6&JwUa#~=N zU83|XrAw7ASGr8;#Y)doI<9oN(hW*4Ryv_{Ty%!j zbV}*9O5ddPI;FdnPAR=!>6?`9QMy~{4N9+9dZW@kN^eqngVJfGH!8hZ=}k&+Q97;k zR;4#99l1^WU+JjQTa_+SI&!D>ztT~qV@ek(Jxu8#N|z`dQ@T{?VM>=NU83|XrAw7A zSGr8;#Y)doI<9oN(hW*4Ryv_{Ty%!jbV}*9O5ddP zI;FdnPAR=!>6?`9QMy~{4N9+9dZW@kN^eqngVJfGH!8hZ=}k&+Q97;kR;4#99l2fm zU+JjQTa_+SI&zoxztT~qV@ek(Jxu8#N|z`dQ@T{?VM>=NU83|XrAw7ASGr8;#Y)do zI<9oN(hW*4Ryv_{Ty%!jbV}*9O5ddPI;FdnPAR=! z>6?`9QMy~{4N9+9dZW@kN^eqngVJfGH!8hZ=}k&+Q97;kR;4#99Z^2NrDzb#^F&mB zBLn2OOX(t|*D4)TI;C`p(%njzDcz%VxzZbzjw_v3I-&FyrMr}lO6i!= z-Ab1z-J^7w(i@d7S30e9TXH$=`y8zlrC3#qtbDu z(@H0l-lBAu(vdu^ztTlYr<9H<-K}(q(mhI-DZNqYa;4Ks$CciqbVBLKj#_`Ei6FqjrMs0bQMyOzGNm^v zU9NOm>A2Eclujre8Km`Bx=87@O2?E=DP5v;x6)-w_b6Si^hTxQN~e`hD7{7LE~O&{ zT7RXBlujufQ@UH}5~X{TE>n7=(&b90m5wXDMd^gnk)5>uN*5`;R_U11DWyx4?pC@? z=^mxamENdyT6p^p zN|z|zqjZ_l8&|dz3CydZW_iN~e{ME4@YOgwl~AT7RXBlwPZJ zOzD);B}#WIU8Z!8(&b8TR64G7TIqz+Ta@lnI-+uUt?JZ?M8|vgmG$ z9%;c$PDs$-=i=wDd+KV&ZpN;YR;3;ayg^(LYT18Fsib920() z6>jto6K?bmLmU0W&_@3-^ja%DqkouiqkkBBofY5cA0|9yh2LP&AeqCO_%~VMM*lG3 z-B!5KKTP=DR=CkWOn8qKZuAcmKFA6;`iBXB#tJw3hY2_OhoO!BVQ8a&7~1F`h8|+2 zzr~`rTC~wW3|?B(AAd&wFyTi3FtpJ>3~lreL&sG98QSO{hBo?#p>=wDChY2_O zhoO!BVQ8a&7~1F`hBo?#p^g4wXrq4^y38t%(LYT1WGme0A12)BABHyihoO!BVdyDV zdQ&ah=pQEjG%MWbA12)BABHyihoO!BVQ8a&7U8q7i)ILg1aUopKfsRVh#dFa9VLv|K271i+z$rY?6UL1z z_3jxEJ$}4@>jAVmJZJEHTh$zpL-^9*9Sx?n40IbbgQoIRd_HV1cQcp{+|D36cuv1? zgq)))=5x1wfX9(2?`#~?bd#hQ2YGP=z^Cb`7M+eld=97cICP)1&@U{`uPco+dvex} z;>#Jn>eY0fh{O2?EL}#I^yt0;{>_j_$q?VWaX=>`l@`z8M01DHp*OzvT1Y4PaNlJG z9}}bWLDSVxJvLS-4+So-)td>RsUwT=;aQv!rucl6sHVO6D4gaF(sHKN4@W(?{Y`v2 zwMOO9*42}v9?j>!1L1t)jMLYvy)#fx4p$nd@wh)tXE#{1d~6cwYkV(%L*w)-rO$(5 z;W7HX9H!|!qSropK9Sp-;`4D#?>*l_Ic4Y_1}vO{llcu4N8aKo#DQ}h9_LfpbPTbO zF7V>Wo;i3}ICCm4sm{QWCwalJ&^x0@xBL)a@9>rL0dCMZ9!GaBrZl$jn=*ywI2GRo zMtC{hjKi^dI?k5_jZv1waWmZSM9QES;gQt9tqq@+dmDxHg$EkEvy;>3&p>-Gm&sYK3+54BsqV_mi_{h5TI_dLu?o zn-%iwx|OXs>BaZB3YX(ZA1>C+u)YPY#1Ky=r#gGAhF5 z1v@^Pig54Bfn1j@^iJN-2Rh+qRI7;c=L}MbXcb56rhbxnUgr=xqEbTsPtKdSHnC{A+VEg99Eig##Wkhx^fu zxggVq2QJM8&SR6ugy5-ac#Iu$u)dN&r>^0FCl81x@zVnAp=l~7LX4#u$EnGKD`gH; z`yP6vnmm*}(D7wTRHcRaJVHOol8#&x1ECmP2Fy_vDDVJ7mqW{FYmOltT~2v>9{P~N z@IFYxdk8^Z9~BQAA{D7aF`DaexUwe6FA{K~{QfKbZyL^iQVikiIA={Kw<#C#z-<@d zw8n$jKePUR9_#0#6U6X#Tt=eDmV6KXY7gb2+}=zV&qKahz%dMer*C<18tS26_yWXu zc)6$txEzg9KSq5kA6WK18t9pcV2lQNF~X10Xs6Lk93u#62B*S#R3E}uhcZ0m8&ZA@ z{YX;4LykWOJm}fLU>f?JBR>Yo5bilseVTcAfu`RGdTO~C&zB}E@O5nVpeNy2!)T$G zZ4tviQ%_2V=izsQ#=tco+^y9#NbKP)R6O7>5ZoQYo52u-^yzO(Lp)}Kd-4b}YSUC= zrxb%lqq&6WdEk1DKF`|^_n7oi2pVIE!LO{<;UPM{b_NfKE5nR%8%jJ>ei6qf4?MI6 zk*Nb09;`YkNiW{^L#bP9mg6>*^00n#bI)h8{cz?QG8y-!`N9t%bTppWzKB`z;B@6i zA$j297%mOsjsvM;&$LKz&(s^sBF#!mmM?lk)JOgV%U(hmTMr4P2x{ zZSay5ZY$H*==#amW+vlJdisVBJn*V2UQ2*3sL##9qZ4l-K%&s)a~j(40P{h0R3h|~ zPrUdK6ZFHBW)ULX0TAQi)kW@Y^ZR~MIUW~$Tc3`$1HvA-b;@iEauyyq|GiA^I?)3{ z{ct=TSInmJO|Z;ttos%8x;66rs}W`*#v7#sW0!(zqe zTPx&~$(8~>%5?%h$}$2zd`F*iH|gkvM;x7;X14aH8&ac74)$+O!w1p~(Q1lSdclXD zNRsO<(DW(gB};?4yZD%jiMCF0ltX*z@WVWiJ!XZ~-xp!Z_tmGv7h>>%5HpW@6GMTI zNHOnaAkT+zyp~fR&JccBt*8$X`Zkd7GmBb~|)-DES=63l`_ zCL-Vi?nJNb`95faB&{udA9>;;!w2_eGwa1nE~BP+#}-qW+K?sKY%^Rb9UjYc*D)ufyoe6ePsRM+6Wtzh#`Vr&ku^mPiw&V`LK4Qap6QK427leXbI+4U(-t-e4jn zx!8Mms6Pv^y4rHwJE2ckAx_}#yhtke$hytD1;#$YQknBI$~?|weE7E4bgBa1>qH#= zwv8_(``qN!O+%orhe}Aw!e$qy!1&suHB%PkM#6>rJ;RC|2KQ3kAUg$Dh z%j1vQh?VrH4 zC0u0#GsGI5-fZrVJIJfpy-+{@)jtWX>u6fiqo7lG=0fxCOmskT!r*1mUqljw<%RcA z6!Nn8M9@naMG=|H4q56&MO%}X#oFP;FVF?JJ-ql`y-Y8D>NwMjUpCJ4;>Yzez4&e8 zOfSDsvTj3;zLzZ2$je$qkeA`JDn8gN$V9o0SV#rbOY$-cC3@hD*XHa6TUj+eSAc;; z*Z++de-&2V*?<>G9ugKYHa1W!ESN+-uu=zZTf{O$MG-Y`A9%qORw1Qe>kq|J37V`o z4`LK~Vgs5HeV>bBnHqxCh~V(OAeuzh`d(y-LUKVMXWe^B2e0L|K z^zdrrZ!!dc^3*^O80-!$7b$F3dj)&Q#0vC~dO_Q#w}~iuj7qF5Ru+nPq zz7QhsE+Cey=g8KA#X2{knJVBlH=G_sGcDbtFq$a`)OpCGKSqqnauFM0yI$X}HS zUxpVX5YH4}1d*39B$m%*+jPKd4#WcI$S7j@x*$WjsMJ^o&^z37r{H_K_6o)VsVopCyLMv{9dmS z{zxA47!S0tfMGPeu%f}@Ekm5Zi|*!5!N=y*v{1y$oEh|RwOJd97r)d~YuXEo9(~uL zXmb3Fu0H%e|9}xe)-Bu|erC=SXW(HS@WUXJ`4;f==3u~2-{^=$28=lDAXe&Se1 zQJ&(dUv*|ira1g6eLq$J%vw_O zK-I>M@%=Eg18Yapk_UM5oJMdZ3n<@@%IW)we1!t2-&jCA9R>Um171n_ew3aWlO`U0 zWx1-JUYqmd;h843gJk-3vi6?ghq8#)6TrgH&ZFL2bNlfcz@%lJ>HDEAFhts_f_WG= znc?SssV9JS|Vm3YqD*0?QCGF!^PXAuV&kv@;EU zdZZ^9j|L^NtPDTe_~3Qw09mJsQ1tp2X|u$}vt_C!BA)so3*Co_a}A@{4)C-9tXH9@NgJ5iB1^~wrYNW7y`L}3P!^Tb7efXC~i{MBq6Nf{>o&z+SovGgX4?tAiM&lT99 z2zttA>iJ_BeoWRv{WN)W@d*yymPgE>4krA?_eAd4Lo&IWK?8$)6Lt%vNa|T%Q)!-s z_Tlw4Wa@r3TFg9Vsj1^ZuW;5Hm(5S(fILl(Tb^Msr*s6gCJki$5xB{LS*{a?6 zo=I>cWj_H=dizga)%HEkQ#-z!HbLHdgiD88GoZ;|*2iJZp zC(!B-83`xn4hKu6WfMFxcvuuwuEHr2dW@5b#P3>KjC-K59ah0WZ@B)zr1?6?JbDXX z9^oCxtQ*Xj&4_Bv8_0ZG*|uTSJNk?|(8@dVgS#RjeBJe6!6@j zBkt0mRFq{g(#7k1naqs)4Zi-26yZ;CMN}fhTL6)-H_AL!Kj`Z#=RsdzT_s;z!IU!e zRwpU0shY3Yv9G1tQ3`c*7AslIKQib0z!!C>m*a1 zk?|$5I2WI3mSv~$ideQ6S3y|qR1pvc^OE)zOXYJ>Y2XMl2l%e ztFOGt5h2?bg@d$)uZpp%+7mmHuv0C^Ne16n)G@CN8rMH-7mSOInLz89bn9y>NE)#n z)lZk@V}+QD1HQ0hLGG|IA>hj&ArNt9`^uAizHjhN|9~%c?OXg-*IH1|8D8(lZNu1W zZJv&2bAxq*W+*#Okcoa=ERC?)Cr`8bzI=9omoLG%?8|$%y?oIQ^zfXY!YZ-TVtCTn zF^eePEmQ*=d`a5!Oh`g zd25yjyIYXXPdU;)*xe>{>%?OmYG6SD`SJ z2Ue!!Z7Sm}E~!m)4+3_Qc2b6A8)A^YSWWf==z*mw8V8Zm2}_Hy*Qt&GZ_zJVc*hqtIp8XHLrkI7*)HXQigawHD=F3aLoTYX!t1HHkfkf1sHx7Dx*O9Jo zR0cn`>`U=;zg%uj1P7^o6OA9c5idWt;QS19j9_fh)pYmCkB!lSHsRqJjLjMt^w4s$ z-}tdRg1X%xPun7`YpQHrq4LILp{KCaXfen)K1&T}VAvpSjP=@u9W5=Sf6bgK8@upk zlQB#dO>D4{Zvpg;>>w%zF0`>t_RxK>2HD5qjnT7DB(f736-+M&W+41WmpJ4U`&$f% zrak*RxCHw=Yj#?Qy1KOCVya6n~t9ZIS=M+bI9R+lp`1 z%cQ@J_8dbWu5{FQ?09$ieaRAFYAEM;7k`C6-s(4V$KQ*Ce<^>{$l~?n?~6r$iB0}q zGAu5H^}=7bw=*?u^3PPYWqHW{W)cRLY(am~!DY!s{;q||PRdama4!*O$oYUBSytgs zER~Kr(PF_{h#P;?5`2>ai+S}ImRCAFMqE+G6{nNoFa6ltpY~LD^7tya0ysahRnOlr zR$&-?dU+>Z?CYXtN=IW8FGr2PmJ{m}ss^QRCZnWpn5*xPYV(;;kqYqFR_3p=&_R3% zAWp|?eLi_I1J)2MnEd$l;8PHxx>)r66Le^zqfTwezQ2^Gf_Y&u9aA0>)8vnMJl6Ci zPz59;7L7Z3jBvIt;KEGMzQe*vo3ozKxf-XorRd5t^gcva0g5n=LdLKm^}`#GtW>lG?@vBNlHmU z5(aH_GNK&;vY({^CJnJC(lnv~(^5!Tj+e@GM1a?)m9pU@N}V6zA!Ne%0hqZpD{x{8 z1|#BdRsh|~q0dzW16Tv$E@2&HXPlGft+XVj#Z*{O+IZ4?lcT>kIe070pB;VxD|DD1 zgCP!aGm-8lW*jotkkQ`I_2!R+U?FT8ATULc+Sn3*MHEo45dy2dYn*b3bD$!`+g;9_ zCK6)02Hoq;6A9TyK9Hw|2?cFpzl*w2xNC?@rZ7a5f&|1z+5WmzWbv~lSO(&NV2Yb_o+Jf@tgMSdK+X#WR93eWR zU?rAYOPDBhG~N&KHbV6)qJD_c(Tx}#Oh;F0ihCWb=o1-C0!IwtX2Vdmat^7;kV7WK z*Vpy1h(z;d936|KgAs@BgT}#N#LOCknKfZ-={Uz03k4l~2>yKLY>qD=XzVryBZ6p+ z?;61f@}?tm7oUj)gDf^OL{%$U%9=6W+J?cUK_34W2aiY%GF?xdD+dVr0L7Oo8f%Ix z@Nwd%I`41*B}hEE7qcdfN`eAgDkd`uGTCH|Bhu%#5kxB8Hi9Itz#yxngHzSu#r(}; zpmh8N6(iUZI6)I+U$+RLpxI%ONFz%&ko+KScQ)*+72XPB&aRe)A)cPZU&f)sY;uu< zn%DHb;ZoB(`MZ7y!l$I#T08N5r*>>#t%SZh8CP8STiKb{2_w5`8oqsKA8H)71jU5PWQ#%x%k-u701dWXwlPHM%c}^}af7p!s`(p3haU!Z zSFyUex|NTT@KE%_dY?P@!|1%BCaOCBF8&dPMffsvxDd1fn}C)<@6iz$xXNeJ}9 zdX0Vx+{VD8WLesw5!m#zkblg9A`O&oGn=k#*8z*sK^VHYS@}vz1Z0cZv!j$TRK)VUN>4`w+8ir*D zlFc|QC^ntsJo@lC9>r1{4))1Ze4sT%&4dKmjZf@hc49jFmPVQK96GvWn^O{4uSa_i zzTJ$DLi^yVIE<9bN9Y+1RpxK^n}&M&xLPB*TL~NJIO%xEEa_wu8k~T^u461sLGK=y zLZK`5LCU6kn2Bagr(h@vBy3#LeK+(m84)R8gSA*OtJAyr(}qs=WOPv^vOCFfuPuAc z4g{BuKEz)bS~3>Fy(W)0awu`0KEXQ6Vu{p43hv#S0e;58OS~~HAyj{{0ZXuULT_`w z1WVVTp}i*3y#tjSd(=0!H*{3fS^81+tp}}WY#&Ac^!#5WvWIJs25N}#(Iw+b$HTT} z`XFNoiEuBVcgIrt+(N@+UNxan2J9jl?z0hcsojV8b08dT>Nl>rYPW}@iGzbu!bzU+ zROuxf{BXB?;BaRj5x=AIp^GyIy{N8raxi317lYL~hZ0318Ub#9$x*>ds4naGfuVT)T(wKyJ2dtFF%HF}&HJxc4A(uGYYCD-Yew>V2XH1^GLyI$d zf|N(PC3Z@1aGN5__zq8J!Z=E2A02xr&Bz#-8h%N#O1Bxk#zZojFq_N#VMs&6OR2b6 zuK*8^^*U`$kpiM2qXk6VqKizV-a{j!k@j&m5?SlD@KQThE79FoHDYW#Qj&UKI@*d< z&3l*=W1YlFyn$;);&nVfb~iDGm(SeU1tT@bgsMtVO8ZK;NdDlP<}1OOYKs+1VuMG~ zQ1hACzQH!%=B&<$B`G;J+cRQqb8btlAn$gWwm6nIz1uN}aK^NkK;PHd&($$cvz;RC zg(Aa(kvSdkkWh@(a11MoHB?&Fa1^K9fc~Pblp16Z59yQmG{xE0DA`Zhm~9lI6&jasI89bckM*)l*#~x)VMWFe*w5K8%j%a| zEwjJoYsy#OD=j_npb;}O@+G{{Pa={1gQH6O*r_$_?=0d%XbN<&nAX-f@<{FNj<`HD zV$Et?CQwE?F~*NY*41)VD8&PUWi(ZH4%dvBp(8dUX6T@mn8BH{tx<7+vx#c_KI9jq zq(-h0j^S-;$8X?mJ0`B2lQp>!Cm;f?RNK~g$CG9bDcJ0fV%Sv3 zGQ>r8M@DtPF*Dd9)z2NdZIz$2z6(N;5BzBrM1#;$_aKSw&9r2@Tr}PmC)N1Wg|t+& ze`OeqRD}!OSnO;R@JZ3$VSuKi4SMo{ieDlHGQ)^Zm5ucF#VVnv_^PiSIV*AIQJeJD zkBPBlTaDrJl8dXa5&>bE0Olt^0_j543}k8L(uPakF~iQxt?!AkL{)8U2^~d3d$JTC z?W{{OVG2Jn)>{mYftdEH^HVb#<7Z@w#ZSv%jqcvJpbCxkL4iemhQ=~6#?~x)IF}~f zwo$l|jb*mSJ@H(lPi`BPzyvV`v~85zMiH~1sb!eQY+5>igH^)cLN)8Hf3F#ghjtdu zMVY=DCqtEW8X5SqWXr+@$NiK>T$TtZJG?0QNif`~Zy{Tx&+ptYJXk5h3WGKv6XduD zwMfWcRKv{g^)EM6N21XQYhT}ozgSVZ=PvyF_(c*ib@3pkO_By@ez!jGP_qmF30~%= zzxY+*_(?mwROrILf0p25_YMxt|J;)XjdkJoKTq(H-NW(qHy(GP3;*_wf=_pcm%s9> z>94!+UuyYNcZB0#{(S7=E`0Ubl7H7K^JN#IO}m@lQx9mn(S<)m>z}$SJpZd&$4qqL z=O{jQcR2p#-F800g^z0a%R0l$pL73=87}-}{oqpUnVmxW|C3qE`nm9%%=ld&UjBja zy}XMH|DBHCbQb)OBOcz{h2Pcm-|gY$zw`b1PrL97P5mDVZ@;a7x&1#be2wB$4~Eyj z=H@BR_RpKCeDh`3?B~k=i*|KeHjHJ2}6;==z|=Wnbh zJpa2l?9t`IkJSE)j0)!;N51oVlM6q@wBMh@^Z((wUC(miBNuD?KNgPv;?1|-a^VLl zKK7Sze9IRTpK#%i(E7(VgyUcQq@%A3U#|GnQ{njc-=96yh5y~vQvdj;;q&LV!-xOI zg@4iT-|F!B^Y3vdeCNVHspBX8YS87k+=!|25(HKehJCzq;@_n2{a$%Vfz#_&ii9gcta{hBftzTo$Q zkN-U!f9%+h?g)h(vS;rWl8d)C7){C+xqd$Qo? z@BhikF8nw%{)dO>|KrqK_Hf}((DC1s1^=hJKi=MjZ_x2qc3^n^tFM^a;KHxb{L6~N z@ppW4-Tf~7N!6nE^o$C}52-%>8yEg5!#~G_o6Do4Kx0;;E#H?-O0a8O#96b&wuU#4`1)fzvdd{Ukk$V&*#Oz zcj5aUuKm9-9G|}I50hN@hi?*mq#_(Y;ncf!a^Zic<3Cmzj(_rnw~un+Z&7?Y3%+~E z5BIt7>va4?jt$R0@4$Z+xbVAc`}JhOpY+%&r~Pi0@{g`~c>V|MbD=Z;9y5Qc!tsOF z9ORUre=_qY3qC!hafPe?Q%(J=!}Fhc*L&Bx@Xu)ZV>RLUyRLlYV;BA_?f+D5IR1B& z$_BXb4{QD74dM8X!GCqGzsgPhv*3^T=iWK4{A&#VJuy80jfcW4h`e$TCIDWv< z6>Tp3jwzYHT}|QmyLUNqXBU27e0z)jQi*W<9uGfttP6jU;Xlc6{J48|SntBWp#4|2 zG93TeF3&#V!e4Fj&w`K7*x+10-KP9I))}7vadkr%xbolJE$yFL9ggpR*HcdYp-uTm z{N!-_iK|AIyYer;Sn`jZ5{|#@!*>sL;lKZ*;JdQm8{X=<$A$k|+dp<%c>domzJHVp ze}`E=d=PGbIOMVg&iQk`)<2#FzhIvuoch-m#iz31w`_Nm(|-RKEq^)-ey6K$xY$+y zuMGeCM|l0`od5O%F8q_qf8rm8x2bc3f1mw)GJzj4~HQfhxoe;$s1;rg$f#56JoGNLT)+KPvci7W_GX*l?K(zwdg@|A+AWQ`hys#D%ZCMC+dgfAfB8oa?9K zwf)jRhUb6dg&P}P`JbrsFCGb(pQBEi{wEjyQ01SgEcjR2`Z?v-&$a%szTx@5u%)oY zm4DYjX}?%bIKKE--FLh2C9Adnvfy7m@CGOU`$F}%R5U#Q0Vn?1Y5%U&_Dg5M*PplF z7FYQX*YOvLhVTEJx!33YUHD(?{7HQjzW?;@4K-00zRz!^{n7`7<9Drtrsz0-viqfi z?-~}4|J#g-uetC~El~Ww!|{999PQjcTx-T(T{!;D+y3a}{{vP2M&1bT|8GmLPrJ(h zchw)_x#9S+yA)Qr@Kri~VvmKFf5Z=`JNG~P&X)Fzyc?c>+qDCCaOFShbiv2J4973{ z#}9kC@LkG(Qu*Qd9dA9_xqot=;?r61$9*vAcvt=lwESIJ`tORvPk73O-}xMEzc<6n zzgN+}X1ee#+JEsr;r%x?=cy4cd_wtGSC;&*Iiue=7rsmJW%I)M$CNdFX1nmsw@Cd{ zh2ixtJ!+$K{&ng6PZx#b?_Y7qF0TBqR{0(OWjOw-=6+85>2Ds<{<}IHKYYcCD_r?6 zQvTPKW&Zqo@W5kS_zRSO#ny-Cf5d(7JLlgdZU3$;_zyqY$EiPmyS?_`!0`Nc`pfc^ ztNgnu|4V1V?>~64)BZP9@v$Al^Bm;;rzro3ycM2*+u`T`pDX{f4FAi5|MA?y zw_Nzk6d!pzJpWf7JoRTT{2DEPR~G!6`z4pV@E_{@iM$h@{|^7`aE`xwRR8J9g71IN zt0h4aZ%9 z7q$Lb@O@9e(8>Q}j|)C^b9nxvH$3K)zZX5J_5Wiyep=UU&hyvbJgfEpQ#k(JgLi(? zRsRjze(5auqPnv;yYQ`l*81NPp8r!1KXa7}|GL^A;my?%~!{r6X0zs3F&j{o%oKb-H%zu&Doe)kG*znbN5eCNU!ovip} z;rOA8j(3iqB|3jn2Zopbw%4L}xblBV*Dqxw!|}iR#U$tc=b#Iu{Hc;~{K*fLI{R<4 z$$xY>ena2gPj#06I>|q>B^)1bc-OgpeN+2C{g-fj)121hT>0;({hxX=9KWUH^;{SJ zP;I|-mi5O2pHDc+g)i)p`lqwB-)^toGR=iQOv~SOW_bDg{bj~AE<8@P@n6r_aQt~& zU-^d%AJ_WF28HvFZ!S&bxbS;)N&fLH_}};J@Cz3{srkppg_r-OKkfZr7ycZ@r?TY# z-kn!D*AHbn|0CnW^DjH^{(M*d<%;ha8jf$;d%Dy9dZ_ZxvU9`ncir{HGp_t6UyqlU zHlYvJgySo620G7w#I^io6TP9X_?|5I1(z>++=VaK_K)O+_urJ9-JSYp>@vx}EFF&Ty7aLdT=@??7kk$j zzg@9#{BF;!>~P_$wESK3!|~T|{l|GO{7~c{dky)29^U>>ryd*R!XI#z)IV})IR4{% zE1dlM7|dV#OZ_z*|HeC?@9xU~FwH-eCI4sd-MEJfzwTDazieW7{)10^q0NPFHs#MU z{%7xS-;FN(nTqfFbNKvwzG$R#|7+dDQvTH5;r)OA;rBY%Km8sQeEjL~`k$Y7rStsK z&8q)J&I`xiG-+I;tN!D3{`6$Q|904=^)CD@j9>aoXX(Fd&l&iV6R-Klo(V61%a&s2 z`MEQ@IQvM~Vd3}@&3A0)%71~5-}o2d_yI><<>X(-8~*d(aQt_-_I2JL*`WGU*ZJZ2 z|EyT()IT0k`4>Ap9AEOnunDgEzX*I9{3rfx`1oJ-Sk8Mc{AG|ovDd-Bz7HS&iyzz0 zX@5y;{bM_a=ihf(j?;d2x6Z$K7W}_o8|vi$O*(#4S@8X@J=1BwKjvN;f9Wjv{f}Jt zPgnb`HS;G+`@hilxzR5CTgpFsvh@FH&56Ie@R#cR>Dec|{|5Z0pL70i)&5I88$SNt zy!glKT>0;-`a^7Rc>k}vx6FC|;$AI(HH}x3$Oo#iu1pA;rF~y=5M55c>ew8 zp5e3~UPt`z4g4z_A_v(uxv2FUKksGd`gM$s|8$n}pLEURN4v`ZgwcPp%%7_c-ru?Z z_J-mk{ln`YEBVsNzej8P^^6S1@3G=hr~T@0M*dF;@4vlQ?R~ea{?m|u3hiIk9-ja2 zD`!3E!r!msw>(u0Q^%{3HEcIRBdS!SPP}{ioXgu@A$`KeyywoB@`NgjMkJ0gy&N6;qeEuz` z{M=XV@9`(Y^MC5`nDhKYkFLMdS<3(DoR_A%%6~iNfBa31!GDFf->?tHIQ5sImuve? z4e!5WULXF5EB~Uq6#qkb{ZGtkaM~}1KPdRJwc+_6_0Y7XuKcGdJ~AyFKVtG6=lP{l zt$$BPc>B%Vb%xXawM_Gm4+*dT`$LyH<>%K|Y5k{%mp`&oti)CSQ;Gk)2^pFNpMLm& z7hU*&>HLda8D9Sn|CDsL-*<|SeG-m8?ySWNUHNZR{W+DT{RW*j$+`Z&UgvLYW_bHO zKXTHWuKYWcf2B5ts&)j9M{QDXEU6%T4@zZs2IKJ_I_xkT3!+&Rm<2QZ#+F)1xuT%XoGCLe!FlN(zE_}Pr z-^ium_%lyjv6l-U)Ao#35SA^&P*(<+y-XGlQ*D`*4=7i(-dNR*xe;cOwRF?kl89aKV ztNvv=|9iHE=RdUJ(I;H^^4qlhS?Yg(WZ;D^{Ch_J%?r)%OBr9JpbR_dDLAl{60@<{#o!ReEZf*F8udTYW;Tz&%gN(O>evKdvDPE zv*5oz`Rnan`00v||13QJ`kA{P=EApV`O{hO%iE81+J9$i`^9s@^MAJo{K;|ut>#6o ze-`}KJHK?EpWAm>UrwOw?eP59yn9}=EB_`_{%AOUWBIC-3;)UUTK+8fV;k%K=)&K4 zN*_)jbx(NyPaIqCoWBiywv+nz3D@7^zuSGbEB`KhL!1A03CI8WXjnR2{io%RFAp#O z@;?>Vx$w9DT~DqP z__nuZ{nnNL`%|U;%eD(|{|*2Bm(%{zX9w-Scf<4Vx%>g=`LAbQk?v17hvSoNA3Dz; z{JK{9uctK}|83XPPW!{&X8a_=@iX4L%E|wlH){F&hvT1^^vh3N?LX`bDSzaoaQun8 zeYehqzwjB!KVB4$f2Qvroa>h!^Zr~G{O+f<-r~yt?3XqF0pa=o=J^3m`)i)wUrA@d z_xq%Hvn&5KTK@RJ@cbM4U*SCe^?;T?odthopCi6<<-b+)Pi5)9-=4n9B`*9$hX3yv zUjCO)8TpY5f6OwOf3fYu=kKd$yx`QIJBwhB%ipl@Md$gM zlJf0&0Hync@83Oi)kvrQJ)}zWPlo4z(xqR#;%dK7&G_9Z9RG6B+0OH4n@&*vw_AAo zuN{(qxGVozf7AK1b9nxb9Qwv@T=<45QvXRMz=i)>?GNcJ?VmfM5&W{>3Gb98wAtwa9m9RE+N{VKL8 z9KYk=|9-J6|Abk;9uto5p8Skcf4$qZ|Kf1`&l}e{?T6=U|94#-jxTyER^TfCDqa7k ze+;)@y!^A3Pr2~d8vE}~;p3<2*!`XQ-{?uwe`VK%m;a(0);aa>Zmoapjc|PD*Kau2 zziS6d{;4eM_u?-ucIq!f_ZECQ3;v}hToiNY@5R8!-od}!!rOmq`zYu9FV+0xS@1XQ z|Js$V{3q-J+Y$0lWx=2D#Cgv7_vmn~e-?aIeZ%iu`QK~CPb$3sKK;jD>s|O;m4EkS z!S{dW0_XmJkK((o4bT7ZgTFt)mH&P>>iE4b9Dmw@dwlQ0A7RG-qv8Gk(ZN3+=)!MM z{*gX5JpcdJlzr;Lzp41H%jSGG{toK*rEnG$8$^I8O=i=+;tu;yg+TFz14190WP!7;C`y%{{+*`h1vv5jRjye2~k}ucetY^zv(2jtrHGojOE@WhAP-$eOe(0Rz2DtF_{%8t#`}G#s{rw~xfA+J# z{?3Ij9V_|U-#@bPH~#a3xh{O#@K5XeM>c-zT@wpk_$doC{|Vvq_mA&ZUg^Srt@)Q( z@AupJFF7$*=E5KQC+$D${b3uw(=RuF?!x~krRBHYAGY!J_ulK|fAoHD>@&-||9 zf7I*ebhz@*T`&2ktoJ`{{I2`H_OT1U!?oZ)$UkMh-)ZB2xA666UHE^@()P37@9c&D z@2O7yyCdpPfA;&GHvYWIk~~-b3v~S0?|0hxJ3ct$Ll=H?jI)o}?{C`pfyp5!x$v_d z61@F>rH#)$Zs%MV{v)0LWe0@wkK?+&c*KR@qVmsv|I*HXpKGR7x$p@y{-u~6{NM7(ODDVVF&#hl`-^t|C1Vf1%7s5j z@%Hu5|(uJq@uj9bm@7LM+Uw+}rH7-28f1Lu}e!tGfSMTvyi3|T(3}px2e!tGfCocKd zC>NgIzm9!@^M}^^bvFK`aYy%Y;iJ#;@QtJ&2p@m@om>2j3;!VUr@y%M{)wIcgCF1X zjSF9*`eP(N(|&K`Z)v;gY8U=ooxk?`CpP}At!qWvGdnz2isAyBC3;#>yzxMkFcKvUQ<~!FP^nQDa z>i?_o{D#QZsT*m{`+Yz z{5@KJ`~J6$KcVM$H@NV->ioCwU)%U+4(n-j;YXVKTkjXx_}eeNeVPj&*ZC9sGQ9s6 zz4q&iT=^&%VEBm;c&9AB}V6 zzuzOu|JR1+KW@KyPWk_yk$=|xB|HD8PQ7%!EB|B7_@5b`fB(x)ajqXfxL?X|-#@YQ zzi8`={ayJlHRIR1KVakg{7zP*N?X<-abEI=l|QwE62Oae~ro?d;i|X@03$D#)ZGf z=pWYpy^Wu7*oRL06@C9Gh4znm`}fkGX5ZNSe)-@pzC`|G?fv7Ty|w+lp9%hcylbC3 zfo*Qu-5xt;Vr*qqleb|Vi3EVn9kJxXlFeD45BDnV-p~;>ekk#iLu(&mbzF?LsbjY1Uxu+U2{xp+X`ysL!H=!)m9T@)jqhoqh>{2 zy9IWQeLkVFWXy!6rlXrH5>+j88j}p3C^eSJG15;y*;wD$vb?o-cX{1e4<>w=v)m}9 zOc$99byGSTn`-MY;HqkC+f1`j$=z_P$r3dNf&q#qkyhU}+#P>nEF)Qh_x>|{$Navx zpzaLtpD}B#^DDzH7HsS-Isef|lQO?1%`w(u8ReID5ldf`t~{mHC9wuP_w;DqB{__W$@js9)$rX92zk><)>??U^n zEqY@g?wZOyci~_9eq9{xXZ{S%)Zh4@-*>;&Ioogl>xhM?@7JY%0{*zct6y{V-+IWu zviti+N@J4Kw(|e}m|G$){NJxd{@+9*Z^|)#umA1wcU0w0eO=@4GqhjV$$fj_?fPFi z`LOqp|2g*f`wID|r)9_gu<^K4fWL5yHU3|P{t};_9lvh#UEjO%Z>06lPryHP;jhxJ z_A7(^JU*j${&qji+OGX{;D>Zu<$nhKmv-Ro_A8w+V;%74+3lAGK0dQ|{x<&o`xz+oul}R&&!t1~ zCY^%E-}oiwZ!i6AsoFmy5gD=O9G=0M-%UgMUFO2~JZ8!+_?|zB9n0X%@7s;7`?>JL z^!~od-<%^bIP<$><tH8}HI_4A9?y6|hk z|K(5WZ}w3Q&iw9s_wJv%@bvw<`1h28;LSd$!I|G5Z~g20F8sdNY4(aw>v#MN&itM~ z_)I$g(yRYZTAzte={~H%ncuGpR-Nm@pJmoxnt$Y4cmIFe^~fVEkSu)&$%<1Z^c+=Xwl^Vf5X24{Z1Y1^~Mg{SW~rZ9g@{*i~> z?YDPp-A69`rB?pt9G=P7{H}ccuN5x*9PNLTe_FreYjEaw!Q&GuUHGJqUk|U}5j8mT z`}M~^p5wx&l>Zofysvxy&AZL!^_a9?FnpnR6thWlifakhi{&!B_zGo#Y`AOe@j63kQ{OvpW)(0Se z&+fAD^!>+_18Dr#z#lF@~7{Y#QSB>|Hb0jvt0Sp_b=i_eIiAjnf15F&qp`E_AJKFFYWQO~ zfw$|w;nK&FuKely7ikCH9zUfWKi0U$KYc$Sy4$5KfV8*!csI_{x4UiD_!{f3z7fa-tBMq-)>huHN-W3o}m8U zy?6fh{Q3Np=7(MLhu*JE?bRD^_umeY&F{F%Kl=uhe_rqM+xW7=_IF+FPw$_m_s*XG z$#a+Vcj4*%&)B}b@pk>sy7i35QU71r{F~m-j1A3>U$JE6tFHE=_XFbx^v2u$*Zf-F z4X*y9_y5ukyj}k3=@TZn@~8LX(!+b_Z@2%i7fyf3)qnK?oc~ALm%v#yzyF_^ z_M~Q7C`zY2Gkt<0^rjTqosZr4~YNArQ*-Ex4qzFfaEHM;iiEB$)$DaKl#Fq?T zOJ(~%&;2~_yFB-E=HBuD{ywkQ=RRk-=l#6T^V!#9vp=uD^(@aP5e>rG{raA3i$A>n z*0(&b^)Gz?I1c}7bpHddzYVH+9yqVPaOR%$eD93s=h5?#BwK`^HIUxm&Th%%$&)4%tt0F`(%dl~A4MRXp55ae>9#Iv?iRKqj7oNmPZ%|F z)Yua4j2@L(J2{2A)Q=iJa>|r&gmKf{PNcn$JE3Iqn3B;h4Fl0Bk4Q}{nO4T9rV~CK zVM5AS!UWPkIi+WOGoTme_xefyLJYChl8nn z3CPR$5%oGB1rvID+-duB`*%S^*{A+Plz$LD=70M?{X6??==JEaHv8;zn4yGz5&w^W zhyV8{k9D^3_oV+1^G^b`jw#e2>c)8wJ~rNl|76Vk5%W`Awa!Vwgr4qJXB^MJ$q3&D zODO*hlJigWI;v1Wb>oI+q29xjg?U1Ha!f=27%J z>2*|Df#nZ%AB%0y&(F`mUwymz1NK*N^U~)jhT`{VWNwLUaP2mpzc$3LXX4+ym#NW1 zuI*a$H_Sh9rT@aeGFc{>f299L+NPgh7cJrW5ev!%ALC0`Q2xVC+h=Pnb3N>Lp5Q|s zyJG{dUoDIYzSG`}U+sOjLBRT9_Z#zmKV`umtrWjHsby`BKaOLb2mfLTUmbt+^9s({ z*u-3coU{1-Hq5`Yw!wGX8UBZg{W1UC|JB?t(SYh4+dkp)=0Oj>#_=bplg{6z{EeNC zKiTjdU4a|&_IYfd0%f1wiVeQDPsa1+Z;9Xft~rFfV9*=)v3&vw->8J|VGGUw0_m3w zBz*HUzXY;57_BO>T?ci3gYDzgO}9_45c`~~@bu|<3je*I8ehiv1q#171b>VM%sfv^ zfWMq`cmUGLK(dCyP6wlw3ea42^XF>wWeh{Qt$8mPO_s~0u{{lzF z{|{pFe0|d|?fziw)6fo^xT^18cHzC#IR01tW9)b^O=QCxGQZ9!p#vJpK7@ zY@bTSzqjOXI{jwD_m%xueDc9bj9;Pb9}Tg8X@Z&k;Aw^b%(%(dFn*x$7l+_awZkT^ zc1|3bgATv@$8!8HlK2Vxcc=L2Q~bpGRezfa-(A%6`m{nWtQ2{C-vRq`{ErC!*D^n1 z1m*vMCH`l_@23=Q{k3-)+oxRFXGlo+X2X9^+26^(<6*{kB>#kcDnjf(UGdYWI~D$Y z7yWh);}2rne zck0UPH!|>Ni~X_xhPyRKd^GGuPMxwJj}I35`Q~{?%J-9`e8>7CU-IXy{8j!ors|Q7 zar@UY_z2&lDE_kxkUz^l0@3)@@E?7@?z<-(&-q)R%J=ah^&kCwh9=lwZoG8#)_2H0 z8TE%E>G#t0!)*BV1t0R5A7`J=_Ae6tu9RPAUu_6rTs8RG*l$h-;q(joeuG25d^=u0 zRORoC5c}xo)6uCuCKqJ*&&lsLcL4J*mi*^C$$#b%zDMz2m%mcG*RYB6fr%q?u-EQ? zz0L8bO65O`Lh_$%_{kY^2LHXct{EL~zpL`A>Prs!q{SFODzY=XV?ZkQa#F05TbNI$<*!~e^|0ATLq5DsERnP0w z!Ro@2OUrNK_*1O%{})2yPd5Ce3V-0%&!;l~3YES-5`4_>_oV%s4Zpl@x`GW~)w+xE z9m$`Oe+E*1Y5Z%_AI~@&uiBTVUzqn0+ozy@dj7mUqE$dAsfh?ifb z53F5W&~+GaJ6+r01_g&mMmX;}fg?W z?$Q&VPK>|9@^s{-d8)bRAD!7(1ieo@^ga8qf^5YhZsDSrCYRrs@yn|2Q4mn!^@ zA^37x!zRwRZ*LJlhRnbFt{W)-8RAL)wpjYNZ>0Rqr}TyWEq$r~w|yo(e@p<&!DzJa ze=i#U3MhVJ|5^VllRvBMUDJ13$`#=6 zY_OR3Crs4eP``~4e|HP%ka1b>Ke^!p7m8Os`UuaTU7-0t=2H1Z_mk2?pK-P%h~J$T-fP_b?3N@U!lscYq|bF__}`}8-8u!53%dL3x{(2*Ymq> zA$*_kb^OnU58l8p+;+%|w(z}&@B`*A{R6IJ#y7L!>-$}MzFeQncTd@8AjKc|YkCL4 z$M~;)9y}p6|64|0_neLY>y*Ac!Vd%=;VTQoiW;qo3FK(yf`ee09GC@%Cd( z+5g#l%wKf)X2X|ePXhnhp>;QL{Hav3RQ7o`#6J3Y z1?OC@F6@5C)3-2xSB3A7A^fx9*H;m2*Jmf1{z=t-sk_n;(eXbUKKgC(8eh%5Y!k=N zsPxaE{2f_Lc?0JUvaTeM_Vw;~FhtH**LS}1+)lPnMA@f}@YnGt8~%2MU(o%J1suKw z%0Ayo`qJ@VKd<1N9qK~)33DbfzN_%Jhv4hy6*;O?tVjMfb75IN&j%ll2EILt@Y9`kL`WMq4D^m z_(!Ih|LOAOuk^<=&yX?8ouc+5KV*E2Pa%G`TtnQ6e^mDW^M5n-D@UcD3-e7y zzqYbZtGuPP;_VA%pX);Glc)F@7Rld5$;0^3+6!KPmGg(F${)IiAMMMDigCNZcMA}aTnuPDf=HEV*l2OC+!Dq z)a93ocPrxfS+4TWlc|2o&X@L)C+!#gy!lu1w=8)WKU($dQ?ogK`YL|5C;PM0={FmG zfq5*kp03+ve-+2WSGB*+5&Pi#H?EBDSKm96IlF1=UX{GRe@6da%r!)G`!pMVec=!B z#J*qr%J$LiUr+3>`)9J@!#==&;O+CdeV4(1JmCi%|5f`p8@?;RkeyFk!TrO96_UP2 zO8fT;YX7=hGuyw}@Fm-FdWoL%uRL@JdE|yZ1}F=qaIK^{Ht#nzf$-Q7yOT?{@@dTo&RLR*YRi6tir!- z@n@^lPjvdqhOgt#-0eMi{$xh{`Bm_B`Irq~-(NQ8j{%(jl&bdiG~_?3eXXAtb0>u6 zf8#xC-?s5D8c6Y<>>sH1bvAt6{@tU;qN$ue>-O&<5`T35pA8@J1}`-0x3RrAe0BZv zgpl@iHvE{Xz^|RK>7qEk>K~Y}Rv5_sd4cqw6iK-Xepq20rk&v!Po7tZ1{S7)4QQVe0*PzZ{8yfWu3m9sGWD> zD)@_B^U{9&{hvbA54%hKWE6$3`z?7jKg~@5g&ZjSZ9kpB`&(q--y`&y6v~=i+@$yUYpI2f2r^B~I z@k>W@oE7T+2OoBQh51(~{(FS*-&+H!bF}Yp`Q@7$pTqc-3cqUzeg`}lBDdB_zj4su zQ(tEMa@GENS>lh*A7-fcPe*f{j_UqC&-Xoqv5yYlZ1}o<()!0M-L3Y?}}yev`7vi+kEoI2V|c@XNOrI zF+=Lli>ZC#QU0LE*RtVzNmcQqSKA!gfbFm6SJZ#T{1M+@2&Dd>4IjKaik_oBh_6p9 zED-)B!oM};|32~8_5W=60|ghd?s@apuzfJU?m@wSNGf93zuS}bmD%uh_;%c{!w9yI z4&VKy{PI-)ST=lp|GCG9e!}Hrg^K@65&u>BsGk>eB!uRFP^`(9HvWUefI9!rhTk-y z$sD{rbLr`vzFd{Qrc?cmolalb@OA#waoBznIR9}}{&v0K>-;|(exl>V&~uvY>AP(I zsKWn1@;6`EUq3G}34wTz3!m57tCH~}3cqJa{YO6!9LOphh+OggZ-dzWj*35LhvaYB z@B@`U*FWzdKW=~3KDscZe94BNukeEgrC&1th~j^32>%1r`|H!r>caDFZi&xN3zYp= zB7Ld;J^j3bb1Kw@uOGN~7~7{n#sAX>nm_9DF&nZm#PG^ zz2(sO`h{XOziz9<{{a2NQvSZK!cUpQ>8={!fA_vVkL}~D`152){5ePis`H4#-!^gO zCdRK&_-}>a7b!e_>dFPkBa3!&{$E%r@e}=f18Mv{pz=$%Pu1{*hR?`8etv%A#c}(n z{+~4xKXv;t8$NhLaqY)mf0Xlo@JIV1M)>Z3sQgv^pV{yu0t{Jv@Q?ich(cG&_p7D+ zy`SqRgsAYV4ajaQ!;>!H| zT=9F!ikM_O&X|_+X!vCG}Pxt%G_O&EyW#yDpmA~D*f7>TGd|j2lT`2a~;p?d9 zQ;_3_&6}rR*?-i@moR>j!mm5T{7>WS=hM*~XPwgDb5)luZ2w9%|MuIE{JFOVROhH) zKt_L@`~c?|?Nhk|8SE^*)rLP;`iH&G&A7fR>m#z^JNSdh z6F<6QGvimu_+V7l-`y$r_WXB>zOeXOJVliat)) zl@l-H@GVvKpUolV7hXTZ@XGGE-}#c!pAr9z`tugS*X36>d`gya2l?*a-~1f6kL1rA z#Xe7S`9-%pm+BTQdZ-Gj`Rbn5V ze)aQ0Ga>d$9GQdF4^J7%`EyLw&%X)DpR?i1uvtRObB%tP9M2yV|Gz@==WO^56UgS^ z!pj@H%J$LwOE~wL`%(G6P$26cv*E9kKU9eP@z%>%ark-?zP_a2Q8YdqQ265ed7hN- z((F?#lc&JPm6fy4x`yL_soU zzkWU)oz7q%kzaKvdW*vsW&7y*?O75LwSDyS!Zs;jAGz}ByM1_lVn+R>h14Gc=|92z?X38! zeY#`x#E&_Dh^Y8^W=QTd~^yBAcTl)rIrcZ2pz4wzg+g8&d+lCEmG-s zN=W+crvcS@OBKGuUwJpaKGaj;J3l0Rv*9mP_48ADY>3bA^%Va~ssFh0eQQtFcORwr z>eGR0fkEpNjz5y)e^lkqdyk_14LE-&Gx?`4^H;OsU#S$Hd~j`Je>MJcxl}N8|4cUg zmMZ<0&1vu?^Y>KwyHM~w)xVt$U*F&P?TX_#e)=kYUKA2P_4CRcj^>|#Zl@D${5yo? zKiTm6D}~oie{Lr8k176_hw#_WD>$b}UD)@$T5FlVZlAvFnm_9Kbt?KPG$&*J_Lc_u z@%j0>ef?)h{X84KCmM%~oYVX3ONf7Axy1jwrGC4B>=RJ@*Y(?M_}V_-J~v{y%|1Tj zzbap{;df9L`|Hie8*%>TsQh7n-~3V6PqN_)t%R009)B<1{?+@#93l96{308^9$y~x z!NKwI%?ic;&XD|hK!Tb5z^j#hz0b%l@$qX%^$)KL$)EN6r=vNJ?tkv__9J_8`L6q) z-w44!K?ADuQaOj*@R5HQ$4_74=gSg5-=y}PyDhVQr$m!OMb{}-7kZu1 zB0fG_s_@r^3??IOvKbHD^gGBcw654 zr*ZyPsp=0;NkY~2hoS0uecG{p`jw!3OFQNtQ}v&%6_o#z{qg;ISK6nirazu>=B1m* zIj?W40_I<(`X8K!&7=6furKX*luH@Fav`GRVaxXA`cGp1GsYJt)A)}2BY8FdP`!SJ z8dqKEao&?3#rroD|N7m`ANBZ7HvEX#rNs{eEjiJ$s;&A+F*uyOr^%Q<{Y zRro&dn?LIKnGL_C;3J;7k8a;W-^bV;^P|vzSa2-mZ5QV!%EzZ9KPgcB^eJ#5n?|Rc zLH5u1{@$+3@T7@w2xol95_h!(F64+M-|_mU4E&hn|9Orf9^5PYw|`XqKJLJUJiqYJ zqip!sZ8Xe)k8%Ltan!tV4qV7zpWA=64gc(C((#=SWglhv&K~fz1TN&>qt^5KpbY!` z@S=GV$=#Rl9|qE1(zrMWF67)rr}ePmuij{$Ap1o52>Vw@zo?o0cklO^Z^JLxkid^0 z;QJR|TVp44H}e;~AzQX9yugNErQ#3vuRwh$6WLq=E@ZiP`ffJ-`j43ZBmMy2t)czD zdExe>ZTM~ozE?y1JvUAL+lJp$zTb)X1OCZpN%&^bO8`JR}$v117KVPwL1@~WN;NKC)R*bOWKk`62f0Qq< zQ?B?IPxdNo_#>{gQT_R^O?|Cjhz^x8E(K7#lU z{@pNsD)au`?{kZv+CKkz@8*N7{0ACCqFv$rOZbK%{~g!-1@#8Be>J}ZkQ~TkiOcAJ*8Kl< z|8oM_96Y+B`~@5T=F&f==VxZ)9~FGam%5x>l^VX-|9lIL-?2lz1pA9-!vwZ`&9e_=|68S{hw|x$)Eq5Tl|j-F64#9GYV4i!M~;SKRCS&e(+0f_^#kX^uK1r zGx7ORYX1Km-~7XGWy*6m$NvAQ088?5PC4nCzN!50ll<*1$)8d0LH|!y`wKoq-^-@Q z*Wc;*85IIC8UG4o{!BJ}7r-L#n%5;}v(INJU!*>ZevNGS5rzNhne`g8De}xm@w_9{WVTiSK_4`=kD|RO%;*dZB#3GKoLH`r+LY zw^OI&XOB-9S$g!uvdPn{{TlKyR-pJ7kdxo+Egf~?$njH4jxygx9y98q-AS=?8(yp$2wwS-Dd~oVXx8zCYr-f7C_~XurFELM;T2?Zxk4xVb9-X*0CZVBh zX@N1ijDKG1Bwa$HI{XLO5yo4FT%s<~uz;?}4!ljKh$$B!E`aY9L) zZ_ng^j2K6 z$cF!)w+u7z_g*sPOHJ{YFTD9F8-Bk^gP-S^7Njrb7wm$1Q8xQrKDc|a4ZoYjAK+(% zYe+u<>;l=n^~2Wo`+o1G^N-Fq{Cb+4xVMvK#lmW#E4-;hV6(^czA?uJ#|?bjcq!{Pn8* zO5j2d@*(vCsK-ElbE@Bx@S9gk`v~8UsF+Um9F*;ZQSO`kO~GZHB45UhI-9<{n(9}V z>iJ7~*V5dm`uWa4H@$xK;~u7d<)68WQ!$_+U=mW}-?{Lkj|qRS#&>2={BIDBA319m z`gTYrKI{TLOV;ex##TSfAv;uq?;cp-l-}DU2_#40jTXfeufQy z5aZKiv+C><%K`t^_KVxv@asHB@w037_@(dGhM5ymhi}zoJ9gUe4}FmE56*&rZ+83} zzL@%s4gblA&bHR}|M`#JY@ZB#=VFRK)!-K`s^>)Z%fv@M z0zIeR5ILRjGuo$3?ji#=&*YExX(izopUC)wlg(;dEB)NbB_)aG_=J;6M@}3xZb}(- zNKBnFJ@Y!Zt4~S-4oG$nOregA$x|nmjhj%?Wx^DKp}vH1GpM^G(eUSn`;3ywXs}P5 zG-cGtiSgEZN^2eO4SB=PDNFO}*YBzGFK(Z+i`;DDMRo0TZmYuq7xL4`s@mG{>&y7D z_p2Shv^nL^+w+`?#f5PnhCj69#kbk;m&*7-WIxltsrjEHNvC25;gg30Z^-7qRL-^G zzjCK}A`t#nEz{#U;z>oFx(<6d;6kpbci{Ur{7Ys0KDJiUCDnIQ)6wE2B%tFGxRCFh zzw|#g{20|g*!eFQ`;^gfDn9tT@6>bH!vPm^^Lgs7+SAzp?LOy-$_cna4pT*ssCjNxsb3KhcTmn}vTve-ai4A}KGV=$o zld+G+NBpUHtD(alPUCN=wQ7P5|7n@u;2dDbKVwgW=x%E0u!qz5htAk+jh_{dm?wfN zJASWy&HY%jh7Nl;jepZ!%lp~*2V(!|AqHR9V_~1lWsM#7a2o%#O&#ai@Zy+iHzf7dbhqvL8j?BO*2oxdK^#D+g-mEi9*=_`zX(Yg5!dpM0h za{S5TZTK4m-?`4t|BkK((I1lUu!qz5HCd5ZvVsg%8h^7JMFFUC;xhb zA6aC_KcdLoj~!1O$ir#=JKFTKrmxplm?whY?f4z3KE$qo+9>SdG=BYNd-kx|huc5w zu>MfnKiBxP-)nPEwc&p^+u%oc8vd^8XSk@1xnFvIQ-?jA=6~d{KKV9$hx;$s-D2>^ zy7u~2@tpb&dpI0H9y)YQZyWw5X}@_x4gU9JVvg;|i7%mJuQbnzbgUcqVfa72eo#vr z{*gn?6VZ((f7AG{QT`ct+0)l^XEplGhQF8CKM?$2Ksx_i@dr(wa=s0J#~k5*im}f$ zHy!_#Jz$Y^3A;m{)9p5E`kJ@eJQuso;LlU|i%%i@Poh0IZr?TTp#`{*lQw=f#m3)9 z{MpxzpJ*S=Z0uB!hXXF;kiC}{*zmc1&d!x~e|7D2ZmYuq7xIYmh1U4V?Q?d~Eco0` zXAcKl$bL7C+hXG%Z=cgcK?r`Lenr^aR)+&FOwXr8DQPgPt`H{+MV zjWUjjc@=7$6u6L&eD~((HhkyhbbO3|WE&>}E@Z#xA$!~K_Z9qn8lhkZe8@!qxEjX+ zF62IMl<@va8TJ`6+N6Et?5^0udog{S7vsw2ZIk_*z;AQ>^Q~<7!>PT?4)_=^2$SaD z$^A!wzhBqqwo?C2#`;5UUk7#b6LxW`XN_P z|M`*Ue`MIl7yD!WBIZ&1cZ>ad82kdluQWwxoDg_JuKj)|&tJ*FzyDdoANan^KlAPp z`}YKXOQ#r%BA5S#{)Ygc#@4E_&+omyn{UJ4LiwlH zfXZ)~zleGGf#5rb=4St!KYN+ir)Ah@AJlJUy&={q`1gwadxJmQKN*2w7s#8N?8@t( zGw`cq{2uu|=J|W~iT(TJhTpvYkzd>JUy=C}z)$Q$d%xKKu-x!Rym0!xHvEnfzQD&k z^FZ*OzQE`B6K^~s(KO#5$uRhv%oDKg*Dqq+EKau~e68lGh zUw!yK^|)uv-zw36j`)Lo;z6SBpU$^XDo*$fn-yh|dnlIt55&Itx{Mu>dSBk0P z>F1RG`8+=$G9RLzBbOZ)2O`g#@Si(qen7_e2@ak| z^*8!hl#hCCj`)of{>uw4>dN&u{e8;5M-cxA?V&5_Hjw%oM(h_0(Io$2)?vX?8UUO) zW#qXfU5Y1-n^;ydS%w7@qk{2yyD7tn)2EzNHnPkN8=85%A;69k0Fg1haA(# zo$Pix<1CyL@~HENmW-M-c{C3>4!1HscVfy&=DAZRj-rXxecX|g3E1)`ZYO%HZU^^q zOA~y;q06SHkUN{sO2`_M=|N?oN#~xMe4+R#s+fzR&$O~WXX?59ru;veBdv^(`3pA^zPrDfpT#`@cB6WYBl-@o}D3*hg0e?=l*=KL6 zUj}XS9L!INy=1o!_Y1QFZ%FVjyrciGHvZjKQ2u^kIRDs}bsV=ilfN>bbHdVHkFd=z zYkV8wAC!q-uos29jH?vwMfZCf{`~9GxpvDhet)&iKHNX+73MqR?>6&y(2uI0=YCsu zu!}iM{&u=_=wCK`?w^ejzPHujM>g5*&;7RSlK7rAgEJXmYBrvpRjM3y%K76c=Zoia zrK33SHCb_?pvxZC zVs(gDkk@|EuCc9u@^0zhj$9)3HL5SBrjy83CS6p_Xy&k=U)QKBy||gfKFmQc7O0)m4R-${%rX`{9(%v^g^Eb%hskg{U^!zW#n@6{#yT&^uC-9Dr+~4dyIEg z&^h}s2fdKbf4Ai=oBnT}H3-2bqo4DMRQn^Ja!;UiM?PCV1wPOV`CO~lFSqHB&LG== zKw-Soq#Lb&w}XV=dGsIhBLXJ%3K}m&zG$Ab|KhzN+f3W7u1){xbItSEKVR$rO43^q zjh(Zv6h1+5zQaDuK`-Ro*@yPD>F4>g?1Gf>@6`CG$1gD-t%~NnvJZ363mG|ouN^l1 zZK!->7aVBXS^E9=6M$esZ5k)9?KEy+{$EjA+hHH(pck^%w=JKt>F4s59m;L3AMuaN zS@!=n{td0_@vKe%8#4dE?{824D-r*$r%)mPVm-q*xRS!3e3-*~Lq6XAl2>i|d44my z$Z~u7w}rn;E6=O#un%+43pxMwh;{t`PNcu%?D`S^%4rTd`%x7CcpRnZ{n~M#tN!m>e%s&n z{yhJkonM3a$N!HK7xrNe?+sb;{HDEZ`Zr7bcL&+uzlo%`ikB$AA^%%jqp^sN*@rpk zg?#Mu!9#5Nd47J}$@+aA|7_`x{~x6}`|QIU^g{Oeu;ZIH{e5KqjWgK({x=?J!rP%b zHv6KP=G-r!`CR0~9P~nt7(RWuO@CDSSDnvI{=@TI7!~#OhIHan{i~{^S={q{yXclY zr~KSzai6RHXKpC7&ToBelR*e}H}B79srvQ&j%Is`J;D^rb-XuZ|E4Dox4r*IqTg%z zf2)7`y-WVI>7PH+v=n3V{gwZ#_s{?E?6Yk82Oet-78_#TpWA^p`xozB*I}Qq|9(_4 zVjtpQcgUXm?d)UIKWv@=oK(Gjs7dI@g%An7kPmfv=NFs)-yb&sk){8)`Y*YuyEXk+ zNxx0xWTT(k$*K0=Kpji&_+)QFMCv02bcubK!+S$s^wOqUw)Y<`^M~AFM*lQ7UH|W- zKS-J1xgb2q)2Ki%QKZN>M+&>-Xu;tSK6`~*eibMYf;_Xs77v`WB^4YH^ZMNy(?Miz86#d@E z_V?HN2Xvz6Ec24V2YMkVK2|x`roVJL#n%-5L5}*dE&%$pgkH#fI^G-D^k3YU^gDUZ z_jelmd$K<|4xj`|xNK)iS4uK(a0 zT2|Tg-$eSo6#bs;9|~kh{rre<>m zdLiFvclCd4`oE$1Z9$5D?=yS+*YAJa-i{O5nfv?y+<8rJoBl_yAv@-$gny3u*BnRT z_DAme?|FOmbesOA)V}fdO^#1^f&Kl5yT-1F|Jl+X$`#0`-)(U_>CYHnznk-)1E{=E z<6Hhiro4&tH|1Ud)%a=tSsvH_*&$rbS>`WzLVxXN1~nr68S^K(ec^Va@d4@Itgd}g z{(e&@wS5tz^Dw7dUQhh~NK+a=pC480m+zlIK31 zb3Zd&jLx+K4&>Y|SC`qsKcC8X_YWE^mhl%)zB|BWJUhsb<%Qh%RqE%U8{W5hPFOsE zUdXfe@BETY|0&eJ@BK~vYopEhVGyD}^1M+D{iE9xZ(0`+Uq2dTrUPyN*I%6F*z8|S z^~>N`vp++s{jn}DuJ!W9iGCG64=!!&bd-K4KKCxmtY;zK@qKoE2Cmwb-v4U7K6%Sh z!W(SH*HZPrBmF-7Y|)L>x7Cx6jH|k#mUB#3oROsa+QIIS-^IFH^S_IiksT@h`7(a% zZ87N|;SPy(=ZYe>m-UJdn^-qXlo5B;Sp>6|Aeh#|`=H*cRDK-5epDn$$p2I$SK5Oux7xLD-7x%U4UvjPaf9xky zpL3|)nyUYX2IhXWSAoNx$8+3o@|@ys1#v%qu-rd{?vsauUdS(pozTUmzY)f7x0~?S z`caNmY%6fsucQ8?D7CAKeo{xJSma8()QNj@mKp!vTDG@+{}It2O_@KCYXA4dq@^@g%-%Mh z<@3AKJ@#;TZ^%cVIl?-BV3+I66W;D7{pt8OwuO2Bs;!i~$-gQpJUV8N{3-aF;w5>w z`f>nyzG@~k7#Zu6evUKfg`8g4$l8B@f#m<* z3HJAob})#g5lZ9af1&(0)qN=U3n-sv4+p)F7yhumh0Xr6QU5s6=;wAMTM;D*%Ad*` zX`gKJD1S;9(S8NwQT`O%)YM@Q2fdK%y)D-D=iI(z7nOGHG&fy8>Ob*zCbc#HZT;t< zCNrL}z5ic*!aMpT}=f?f)s&Z`k=m>cu_gGgJyy^77G@6T)vVU2seuTf%rl}KYkqm#I&P(YW;a^O9vz70b4F3%M&o(;F zrhn!&^lmxmFW8gxH%scTpz~5XhkmbhQzxKvIK*Gb<}+(wMfzLm^~bzFT#WXIFK=u5 zw_>u-8cK3VZkMy`XoT~nj7MM{yESj|22xY zTrZ(2nYEu0?+qCp{6TNq`iEeKdBeKWlZo{YkXSFKCHBw8|MWh>&(i=h{}tSkZ2xfEFGA-?|J?TT=^PI44f$)2tIs6;hwAVzqxl1| zD{DFB2>%`S@aJ|JJJ|mfNq=rzlW&{5;lFFT)W6QQ{-KoTZ$F)%Sbq|caSnt#B-hK> zLH`@inD~eFtmbaYFCLUj)AM7q=>3-z)iU`U_DA6T#iEUp`eQljKkF%@-#yvbD@Aks z5O&A)7eAeK9KXM|e|-LWr=zoXLsl>aoopY`kXU$C0$uPORt zIqDz1!MuO8r#<|U6GJ}m;$1sPe@6YI|2&HSo%5X0Ql3TrF?gtVKyIOWF}sdNIH;GR zJ(4H~HXW(N~~{-iGG+566@QbKau~p&h7oD4;?&`^k>vR zFXHy+Vbr#i`e(#3P?Hzh))XkF&0Ui?5wd zUl%ui+{E)U7Ehl;UyG7?XH!{2;*8dE6PY4*Y8G0`G&96I$cD2IKGhcgCQ|#)|1&wi zD<$={t5iuV|98{e)ol=7dM z`A!-Ak)HwI(q?p>>emJP(!L9O)_1y-9zKU_M(sjxyg9F+`xu8P-KW0e@6Nk5q`NCS zocKGvf5!N(OZks8%dFo`)jym70>LkMy`l3=n&eJfGl7dkh~^~jy3{|5TB z95(XQLv8wxf1B(``Z2y<@h|neZPN9l{tJ29WnbOE`V0Ox`Q~Zz{+GW=@sIS^f6iPl zs{QZY-;w#B`n_@f*b`qJVtfBVWd9(={uLqmcZAq~br$<0)|_$3QAm>^R6#W%7)PJGW z1AW<71NyZ7lYV*sXq*0a8!7x#^cU5w+51C3_VozUzx~es%We9PCjCK*{)&I8->owB zurU3_hiw^d(?5~y?-r$mf4zVA{+`m0bO%1Kx_?b#{Y4W05dOzd{PR-uSJY7dXsL%| zejN1a@SoDB;l8%_AN3Z6e~SL1`Zat14HEy{d{Ykz)4$c7&ie~x#Q*V}{<RqtOz{ln1@kR|*p zI~{2)e|u8;XO{^7Mm2l?=kflltAGD)+uK{~KacA7uc7|=c>ncw{pRf)=eWntJ(uji zB&y2)TPXb9Zprp<(XKUn|2=+`@?Z85LVSaS{{F9Rsm=P!mHz%OQvQ>ozoLfv-w^ww z{}Ot&Jio(#4z|U=qE`&VMEEzZ+54}%%e=oA*zFGN{!Tl? z8~U`|{r=sGY199L%6}?qsK5WmV*fj<*S~Lv z!!EJupFr;)bWgTFiVAA>{>MrA6PsIo`M2*b<2KmzUq|WR>ygx7QA7Q|Nd4Pioc{i< zBs|1}e&=ueiuGgs1NE=ik)%6Ce^Fu0-XHxifqb_f`n3K*myNO3f3A3!?4P2);$Q0b zjG{uPgz_e47v z`Y)A!Snz`0mC{uNxv;0h-#2X)t8MJ$w`~>wM|0U<9r`Om^cSF=BmLvhf3&3kV4%JJ zhyT5K{qY@0{}S~7p#5Le&k%+Fq89e|57U3S=*Rpu*gqnQi$vaf+uIND`xpIV>^NQe zUw-2F*DGoNiV*!Dy=#Pkm{&^F6cVqp<^8V02ko3EUro4ZM{+{>C`!6v3 z1m3~>$Idk24|^jX;(rIvy|pjLe?9)zveNt`@&2-p1N!|SH+^mN>-axL@*mW{pcn5A zS=RZ&-TD1>`7>msiGPXyzYzV`iyrKAfcHZE+kYxO{_F6M^m_Dl)?cdZ&-+*Sw7%^Z z$;XRi9|^oSWXDI%`$NAZZ>LPkf8GCpaOfyR*Zz6SIjQeIUgAIRU*UGoPxQZ4)KEX( z-+kA_3)mas0C`WvP1gO>ih2GKIe%Yyp2j&+`=K{CHTNrTDRkHuQNMVq!}|8ft%VMI z^uNcJ6gup~9C$(Addk(-{cYm&qX@+NMZ#C{!#EVrk7AGUD4rk19^+CxKZ<=}L&K<| zc~ggdm;*1!fd%E(?-%j>DRw~?emsAQJ^1nbDfZyU^QYJ+_%)^b6g-FGU{XL=n2jKFom^ zWV>1GKeh2IIMyIUW}EcE<7BD)I6bnf_=&y)PTmuHRsFJy!+yM+2fyy(u;+Et?27-p zOWd2Y%wO<=e7>lib$^`kPnu_g=S}zq)ZR(u_w`fee(4poA13*CsYHUqy3A> zV?ArprOh1nVGg_?XPv%nlg)lS{>LuJGyKZvIF(=OI3SM&RyPjFI0#=J2V@`Sa0jx> z5z$sQe(~`^0`c+EN;(;a(`!EMykiV9FInZXmB{aV- z?i!i)8P8)%4PSiUFVdgp;gG+A_HE$&u6zLHIpiO>N}d-{PWRcB9&Nli%lri|$V1*+ zImpKEA>rr#X6&c=#U%ZD4QPE2`Kn%2R?|3igpS!`Jw|zbnnOz->oI(q)5<=~ffwYd zZSLR4#;^Q3gAnX(w_iB{U>utN=}URxZld)9`BMvS3aE2Doc*Kug>6^5khJ1YrM|QDKX#EEHhJ(#{!RNIc_F)cogS_$U zeCzigZ<74Yf7>3u7t}NMh`vty(UGs9b9T{}>74v(DUZuvq5T8Ne=3wb`qm=*Fb7_c zW7}R~{l4iv%M60IkKxDb4^qQ~V*%^dcL`pY=l&zL;cx4UDTIqXrNDWH4o!yI@) z<}H4+jV=Doz1|@B?-_p6+;o0=f4Pt9q-*RW`46uC+x^FG*!=!6w)snU?oV;&hgymD zL$rh8iS_{`mn(eSQHZohyZv5MZsULW-Zc1zN!0Tpe?Il^!M6D|#WcSpXq=ar-|R{_ z!%UEv-%Qy{+`V@xl{u8p4DLYh_chI{IfU}Z&nVy7jqrZUa}K0>v|G*oIxPhU;X7o` zOJ@_mjQPhL|GYVrSK+%G)y2QrDfMTHThTem{YE(MRnYy^_~%A*um9a~%=QOu;mhA= z44URA=7)IFPC|G=&U4elH!&`FsmV9R9EtW(uzgpDeV8k#BMlXiC;oKLOyYMM+RsJZ zOuqxS-@J>G>n9vpM}nLm66+@-qVRrc@5Yv=^LuxtY3JfQXH^ZP08&JC&hya54Mp|x z^Or=``iiAPD4tL`g!LVMj{H^#k3h|De;wn!a$WNPO~gB#zf=Fb7Bv5BiL=wZANs%Y zX#JJ9gUWi$|LbVdFYE@X?Kk-)gQNKkl60;6L%;)4^Skb%vP+qt?w@IWBbBKs{DK_$ z4VL+wy1!<<%v;aK5BUn@JA03~+m^rlM&awz_tVgS65Zd}PnJzNkevUqi^PAa{H3CS z^OxfG^gQj8_621`JfE(LC7t)D2Lrl4ngSrTeI<`Ot{gx%`u%pEU)U-t;d?gvSGavn z^&;?dJK4im^PBO4qyrWIJehBSd7scPbP_`6e+!@Ayny+|RQy}NjLLed$6@|eEQBA| z``Ja}zm9Y7lXiYx?=jb%J59Ob%Kx>%b%gI{W3P+Pk4651{>i5)eFQ1|yaVj^)BIk- zxU9?zgZ`MxU!WiNA#ojY?W40_Wc&G&zYLS`J>zlWM~l*7Kc{nU{01U@$h;Nkt^a_r zpDXi`&G(FM2cEWy<19P+A+pkMJyVU$2<>0XrzL5h={3`_^CD+M01{f3BTVYeAiR|L99cPU+_QT=k%za9}P*w9pr!`FM5{wIe(b<9w_5Cn~7g^za+nC zm;a6Zf+5xO8!q;P9MYldaOPJa{GJf|O{Me^>6GN>9`wKA7xk*=*NgIPc94~S*E*f~ zxxz0d_WLi{&p9y3FZRFUH@8;2X(M8>vUy<;8O6+$%*)MiblAl-fzpUVARgXY&#d6|;GI9+q&hk28Me3wql;2>Z0n;U+b2mXhA5AuY)qr87z zM*h5&@;^U?pPwVY_fdYR{CN)<2h;Nn!3z?+Ao~no!0Vqf`0W~_@}p5Qe~uiSoBf_b z`)#v~|B2#U%a302f5=(Kw!fD7mDe$NQHg&iQ207clkqRek>3Ty1}Acksox`i{zvj> z*v}IlT7VbiYkPdV+Q#oM3g5`?Nq*68x!Lc^;s1a95Uz-ykF9C_NNV_^e!ut;N*}u> z!`JPe8^4XHAE@<3^D*DHsYxH;q3wt3kdt<-e}Vbw`oRLte}~}# z{o7@pLR79pKkh@~I%J>1x0*4(V#)td|BF!nfuGWU;PtTE5B&!bQLq-{!m9pEkf!A94$6yg=5k zM|;`rr}@p4at!+_K>a)kU%j3L_aTw*;rz%hhwf>sA55h2883yOduVR_oaMu7u1aIMsCVimaP%b+W^yA!M z-ZLzHAY37%?=J1n{B-+rzok?^Xqud#zW7nAYXxOalzi_v;7MGG|wY{8A$Pun=-Ip3dDXo{-OURTmJ@lfp(LV{#kDe z-)E@)5|GJYzv$t)*{=%uoXTG|ZZP%>Vj1q|0>n~Ddn91 z?U}S64N%3aa?<_aK~alZ4|-V1H%V;SWyK?*-V zM}F8}#8c_xk&U^f4{g``797{y7QP2l{lIUXv|r@N-0XLq*h!BsjDK75KjE!;z+SK) z#v&YE(j?ZRp*`i9L)XqO9IE_2Pl7^Ap5x~ z`@6VD<;HI<_7{31J$-b2+VJyEGyEco2TrwJUm3QVzwePzKj=X7H+(l~zgUj^Fz*%L zU4`D?gg3s&sd?akxQ_Vw$m%24rN%$lum4k&zqCv8^JJbk@)by(zZ9dNMfD$a#C-KE zKk96ZcUw!)=c7r{)z4vNh%U^adzxGM{ z`8o0nD?bwblUd4-UP27ALxXjr*?zizZ5GXM@>2Lk2IOWx@Q95{&tK5LhI*F=11ags zIl}k3H?H9Q@e=(*2w(obt4rUPNBt_ukss>MI)8pt>i6hZfPO{KLB5CkXB_3n+aK;< zCjEooa<<>z$?%OHlbih_l0Rb{8u}6Ls8>Tj?nB}_WV0S^zDZ3V=-+sZ_(lGreUqP+ ze05-M{Cp`Vycg5!SC6Q44gKH+sjv6@ZTok`FC+gua1PZEIwb8E%aLCc>%LU|;2d>b z^9bYj>%KE5+xRVejN;!uNq*k3x!Es2WPh~Fq~8Pe>TLXw&m4I0o$>K~-M;Kd^TXYg z?=v~a<;D;DH=-Q`yI_6^`em~5!*g>Mwz$-0zZa-{^ExK&=jX^TBJmaNT%5~&_E^a7^>yU>RpU3t4MEt|}2k&nlQ21hfpC7`H=N+?)#D5*< zP4pA|ksiK@dd<_-+fRpk&;4#GjEAq9pI9}W>~}zN{e7g^Za>YhLe@Q_924436!Q~n zSiiqym+=2{d5fGA4vFW9^j`}c0E3>=ikh)LbcB~ z^`$2Yll)>i@rtWiW7JQx#J{LKfN*}G(L(jEw0?TL^oKep=f*E#zbDeuM;94a z!g_x2Q1mkPS6m;vFTTHcxvVcn`mLgT&F@KTcTgUL@Z;}>vx~%k9cQl0(+xJJ^ZQK3 z<*?s@{5?Z}H{?FIA3UG!r_0~xZlUzioA#g(evwn`_S5{({?+wo)UR+I`ZYmZNBFjF z*KJWMKZNfN3SXDz-*1=vB?#d+%{3Y#qNrTr1IDrBvV-{>UY7I$et2$%|H>}JFQfg& z-(PnRN%D&hv)fPedrQUvb^ZPd$)9mu^8g>DTgV~n2l}b$1LIrA#HfDNC%M0gd#at^ zJl7ycjG%ApNjpRGVY%#FE%7fXF!9pG4JE+~vUXmtN*ljYYQF_3{9^wjer{p){9sqe zxp&p(@!yR7k=Jne(*D5MAJmh5J~6KyQrmAef1iQovG=6)v~G)hXWmtmwzuXvb1tR# z_41sy<>q`LoyVHzE9)imfnIXwfFoC(o@&22(*MlgpZ95!Wf}56`Hl$?A^E!|>>}}B z%3lzUb<^_~?5E|lF#TGvk35zTt{fr#o^$6H!&3Pn{qpx!yrD^cevbTJ5q=nFODIOa zk?c2Cl(><8Ag`OaIOd?8U)a{CY^3n@B6&{B=S+N$oNiAai(La15yX0uKJ@yJebN6S z=|=OA#~p+V&Sy8ga(CXJzf{#vKPG-Y@tgLO;TMGP+kT=!iU=V3hkVKBpa=a!xSr&( zAh~h$_(`MAPkd)}!ql>oY4lmx$t5Y@iXAhm-?*|VM@}x8IFdfqS~4x=^RH>QMopbe z{|UQWI=SS+ag(Of_h9kG*_4MQ-`u)s*mYFA_SBm{Y_*Fhr;IIe3f*9#14}JmNV-J2+bj%+7B2Uvj z@^Ihq6yLsvFdu#$)+=pW-4X;mF8D`uL9QN&daP((mI8ydW=p zX-d?_ub9TC*qp`NI!1*JBsecGx$T0;GbD z*~5VsWbt*Qtlu~76f;jmE;r@5=C{1Fx$jQPbJ*89nfQA2EybC}KS1M8>Gwz6o_>!1ffr<-t9m?cA_ zZ<6I!4WqS<z^8R(-pJwB?akhEF-(mQ1KUHe_crFPU z|6@S$(ND1#;-5c*_Ddpv`yOCm{XL4$P+k{G@e>Z~y~~$3a@fOx7v#2mmR@M%_a67ZkPF^5 z{J0+|l^^!^DLtUB!@jpvn2PtW>##p_AIh6(-D>%Pb>n_REraJBRG0R(uj_oVuQ@L& zqHiaXhXXIjyg`3F4#HGw}oVsK7YaR)ZJD5C8W+8uNZCKlDF8^tO2+@T;mJzZqDspyoR_68oWl zKa3yj_r}=kN2KzD{YJc(&aZrI&FmMpzj=L(GdyeTnvGx89t}RR@w;_YdiWNN``_@Z zY54B!Sa3`#KZNg1%6^sqBYro$Dg9eAjvi(|#J?rmk3Y)BuhqNh;ahs%|HgjXWnXKI zk7VQ5vEtnQnO~{OUk*8k>Ln@pOTqay<2P5v0|T|czAOANKBD=-ZpJ!}bM~b@KPP?} z{ii1?`&HDC-v;bwq55;jtLsRo;Dd9>!oxp4C^dYMe&1K=qj-GH?1z3V-5j@c*HG9&4IvKk%z~(^wq& zbNPgt*$@4ZuB@kkz9qsN{p33S!G4gRAAiSa<`KEvdv|sTBHM1YS z597}^>7b_kOzd}@C3iVK@mo?U=@;V*+mEF3t!Fa*R)z3;LHg@m)gS)I^I|_$eym%Q zeqGzIqY#7i|LES4?H7^#-6u-^Qc>G97!WV`*s=3`@j_o%FUfc@r4{KNGk7)m6< z6_=arcl{!^AL1YE*YH@XewYWS_kZ6c^CWQH1(6VbOMjlRgZa5Kehz*uM^gHw zO;}*R${O;+d;^3#?1%laJPG$~{2n^JY;Wf0DSl)75xtI)`tosPIGnGN0_{)BfU#{BNqAU)cWUMIRY{dOif^nfNjem$ct4 z)sG{MDNPye>En)?TteS69qpboY0~&U?v(K*C8gsgj*-*JB~wO?Eg3zPzE6rv@qe5$ zv25IU{y1sR?)(MSab=bdt(LiGoRt_>DjPSUWOCYo68a4w`yKT2`L_O-=F@2B!FXkq$;3a+N{5b|xMKe&jF*^j0B{C=hLY5akF zKE6YG4OxKv1BV#=QaWbexPdwM>A&p59C$;%^2iSB_}!y(3_^6c=^y6)|5W~)W&F|N?d;{MLktxe+oDA~W){hscT$9O=|mL?AS|H}P}?`Z#F@?j3V zA?tJ;dzsDtlcQw652z1H)`@WcaVq~U1i(lvTo{Te{GE(xGFB6nCbJ%0v zjC)}-hy9#OO?(UJm_6pv6kpWLVUPJV1=DE%Ve(-Pydi&B^4XC#{+&r*+%-4$=Xo@# z=@<5^7*Nk)Up&*q@8ZF9Ounad;1~r-(60G?O<7XWTrYHB04MO;1e^&4hWd5$--K2Z)_*?q3 zlJ7+UN^T{=cF@LlDOU3?E z#r~DV->;Xl|7+B4f3DZD1OL|OUsCfQuTk?N-S|_K=B1wn`@%-#dYC}GLHfOT?isf; zf5d;Ze>!u1p0dAgkRyM5moOR64U@@geFy9}N7|FQreC~YFL}YQ8a`6S{9ReUh5hTc z+(`Xv4U_xB`E%^{ALtq&*uVG`lU{P&zYgDF3MBrN3a>B$-Ux>iFKH8>pIRyLXRO4Z z?ZiLQHp$`bGSAgO@$`1|`O_jmR$&&~c= z2Ms%eM`GT+`rh_MUrD?Q=`XdKB)5y%A^+(k^_kdY z6VFk@&iD?U+_**Jzx$PWZ`x9?TIb4L#GkJ(Tz@$8_hf%B#2=pD=suO)-!RCLKgLa* zPt)rUy<|Kd{W;(*`MEnPT@BfHD><)ST z9*aIB{)g)CAG|+@?0;O6e<1vkydarBr)Ag$K@?ix+7zlZS$wg26(l8>SN zh4|m{dlP@WohH4v3nMPqTPpcvy*Vp5{-FHA_|LtMQ~pmTME|>Yb#DCEqW!WgJ^wij z^J+emd{TJym-;rw$z8b~CL(g9m&k7(Zp+_C$*6yJzlri6q5%HxHM#LeIg5Tf@Ce)A zrKa^y*dO87uE)wN{~vYl0zcPq{*Rv|NaSXN5(GyCp~1Sxr5u-%s>`Zd-0CC|f{2v_ zao@Vet=6@Psvd*}!ImHh)-8?u79~~HQ+KNEB8W@%|9*Df@BQqKT|WHiKi~6uy?1t= znKSduGtZfsGxN+G<3Ibkt4FP0&b<}SFIX1;X(#z_x1OYW@$EULa=*3KCqfmtjVrn9 zd7J!$4Ql6OMdV-O=P8hXyi@dw>7z!)AI&2B-X+^rs#FQ9H&-SG_6P4}N@=?H~No{K=Y_zYSOEcz%;&=j8v) zGmal$e{{ZzZ*QXYOwrZ8h(F&|xXQ8LcK83?iQ{I_d=0*%AH z^Esw)y|c6JkNEGwg59*ic2Gp8So3VKMm(Ag%@>>|E$Kz-uZ3q&Ii)D*BZZt zzQ8@dAVfTKQ65s z+PGs#A4Yd{`rr`bU+vF>e16YH`x9n6^e5rD%zE#V>yLk)(fjP$uALDZr|Nu3t~-|) zaE^DLc3C&HaXT!vU4%uq{88=v)5w$mMCgCqc>dKTozowkAFJn4Y#h#ZQgqe7&Xp}} z)!Z-WKHru8tNu1f!$lkQU+<3tv45xBw?qEnrJduyKL5aWUiqtE(D`=C|C`P~h<~L! z@uZ8k2mfEPPboqE$r>H)XWB{r2eX~=+s|k3Yi?J?{}wtIuaom9x=;KcH|#vypZ%rw zzv~6i|0O!)pYXg{>AhTE|Dy-kA9>^dbslqc>5urB^&;t`oc{Ro6`ykb@SA$iKcls4q*HFXRIHE zIR8iXJ82vKbw1H>rZ-mW7vz)VK+m=I!$|%sNd6ozWpzUvSK(^Ewtju(p~k=3fAwFp z&cyuNjos?}CsSL?-{)WFi1_Ol+wlD{*~Hb0_$YYm8o4%ni>&+PK6S$rw;2Bw%3te8 zf$hJ~bgiFn6kpz&|1qIUS@Q4etrIEV>6~Yl{CV3qUO)2n>*jy|XYtze>-Aqtga2@g zZgu{{Uw4lGl_*dD`Ms#k{98tL&|k6#Q^}iMpZ}LXJI&5#{ZjkCGwcWAwL8w2N;}E_ zRGv?rc;o+ZbKLVQdWLN6?X7>QUYfb?@JVk}jzJrroHpve&QJOn^CuzB|IztG$rY{T zuk)v*KUeZS%RlGmE`Ap#sk-(_eERl#_$=pFUT-l}?v*P)`e-BngZX{7o?9W}JNQoa zgHCSoZ(8#|Idln%{~>DUuV|h>znt%7ntz4~P3?N>5!TC}-E&K=TvHe%Qgu0=Pt8mGG)9coM z#pGY{_+JnD6aJ`6{d}6_x2@%`^J&Dt-%p7Ry}yWm@sW1&To|R}zu)Y?&nD;F_#y9| z|9A)5pKz;=^I>9}jKigIo7^d6MEozQ`Ao0>?cvcSzcHNejUIIRuX+)`zH2r}jo0*d z7G2-Yw<+`caq53>!uT_8;6J?ToAIA|?Wgz`T~;y&&vwtR=qgtukB$HR_pjHhe^|EF z`FLgUpEU5Fenb8>pP;FFUSGyMTR}K6pS9ebS zWsVcVF3sc5IT}BZo@M?c|H1Z?-=&L54}$3(_SoBpN5g13KXLr#A*`_18bA7w(UbD) z964@uZp4HMx$#FHvUzySp%V_BxZBaAkG8{pT=-Gu+to#a!SrLgO46JYOtlY z!TLjBX>I1)Ytm|)>HX~Jaib?7Xukt$u{MXj_JprUxyd@aV;xq{)0&Guy|LN1Ykc`I z$H&tihkkd(`XbjGs@FLAN-yPR_}=7?=XK6#a9;CscLd+R3PndRQl9#5Lwb$tf0MeL zoBt@j+@D`{#qy2(e?k6tdJOvAz<+7lcgug;hW~JyDi~p|TxY^CqEB9xs@BCIH|7FU5gE?s5yLISK_PTG! ze{^AM{^Ls>Jx6||KMDD-G_zgzi7xk!-LLK0$o~+^|8dj*2L7wxlK(d*rNjcWdNd`oH)y z(Emjm^#A&A$A2h3nXlT$ho?zxY4$0qB1N|JCo9|F{kR>DTZty_b8ym{CVH@;`v` zfAMzce*^!eo4#B5Yy9KOKm6S{)BpYFE;geT|7YC;{cqqufAe?Cf1+`P_x#3R!+(+S z<(BW;;nha|r%?XmG5!n}Yta8&zFYod^=lsg3Hi_H1={NXR9|vmUUti-@pF#+&%%D9 zxPkxbcg%miUG?}+#ebXUx5)CyT{61otVa2N%JJvD4?_PN_%D^dTluHz*F65i>0dqm z*K;d(?s21UY~)|h?{koU+Q5JQ_uno5$t7*tfATN=_S7e+k|4M6%8x#81F{dph#SKPpV^;_~E z@I58t@gH*hFFwS7`ZfBa_$t@pzrFYk@IO`W@0y?LgZc5Kf&bEN-%kGR_*eTce(L;d z{jQDt^JHA^<3G9dmPYx{q5Sv4`(xU`e}3k-<6rNI8BhLtuk`tkuXoRHMFRF*r6YIH zJAG!@{FK&5Wgl=l?DLWzcC1fFw>$pTtjV?YY5N~BpB}W2NpEv}NQ|>&H&bT&!uXRK zCS2n)ah7R+=q>lH=HU0QkOaBopZ)bzlfS3Jr_Uzc|c#sKdPyAjrw@RamIhl^H*dad<)KrP1f(Q&&c2T&G^5E^LFKeTPKpd zwEtA!X%+u#bDd7>>|e*f?%QyeBhGDyLk~k@)b> zHR>$?M_u>y<&FGH|Hnf9jr>=?A^%sB|9EOM|8uzhn?B&^;@>|vs$&vD*K_gjKQEo-zch8P$BlpWUq2`RJvMbMr1U4x{kLj&+xCj{CV_K@dBJjyE)D~26SF? zy#A6nr*+BT!R;NRwjKSZk^S>S;?+@~4d+3;3xDJJ4<*!dqyLK32e@XJEoukixw2;XE@9+NdnO6K4HgF{l z|K!?Dvm$&sB^1}Ef&;({dsm}mR_uex0Z5#{YD(Og}oOG3}^ln@<)9Y zSH^kQz<$t2^G7S;JZV6eGY?pT+(+I1cT`kGlm`o^KL7*n0esS3kh?&Z8Zh&TAk!@Xt*M86f^; zcakH0Ew0BGxX(5weGFac&t^9~ZuV{U@q^@_0sqk(9p|%@+wiaRS@KNR=ab|>`$NQM zmH{Ja4;RxuFCu+1&yS3baP_5fDSRm7J^jd|n;ZX`Po15?X_Ws6oS&b58U*{(F0=4Z zYx%!~cF8XB-|qWj74DCXX?GIV?!x$-^nmA~M5G`0xZ_9hW6~8K(tpee{hIc-Yy3GD z^S9*_a6bGvH_nY7Zq0xCgiA>LFCu$Kp3Bc{f_JG`?j7eN6y~&+zm4nclKhVtPJJ8c_*cuP z{iPw#cZh3uArGCKL%Pz@ek8r;7Z^W7SI!9sEjqQ8ef&#j2I$v2&ew?k&^i8PpO>u{Ull1>ABj!+0_4#bn&+_+YQmxZ)KU_V7hyb+WZF7pXwq`Zii8SR>S_xxPkwG z=Nz)R3FP|n*M4KkP5e)%oZ}lE|Kf9yXZIQMhUK~MDCpI{R)ykQ?WW>=@aF18<6rNO zvJbQK8KXaSobOO>!@tf)$TQ!6(+)WOuagJK!CcMDkuH8@4;r$aiFw1|7hU@)`WVsa zsy_C8WZSzM`PccPweK_C*Remp@MvrO(fI=6U+qu%Dko=V7tCZkBYvbm!#sM1H{3!y z`}E&V4k76gUDd;-OMkG4@n7Qk6sJ&s-h2T1zgENe=dsrO+xW*W@jv^AE3*PwxdtU?oQH7d+2p;bo|LbU+Hq6Cm zHu&b4(+52lAp`2)@%X~km-Omr>c8S+t6%NXebS%BCJ%qYb6a&^23xReLI@zf2i>}!YF{5eD-{tHiZ zPX4jZr(?b@mmqjt_Wh(&oIy|4m+WiRuC1qiYwWM}yr_IC|AI}Itm(hxulfIz&jSD3 zcdPRsJ=r<_huzI~UvK9<{qIq2)*tb?j7Jxr`*{1bBQmUVi~mh-IOkuj`rr9z|C5IO`Q=XX z{|@^j%^NBo?c)+%`k?)FqKm)0?B>~z>v;{8Al+4#ICu$@zw}4)f9NjAzhQrA;pxuF z{~6hfd-^|y{OGwBpFgMmh%Wvfd$qZ~R4=+u#n}CxA*-~K|AEuM|E>+~f2DK$>m1C` zd)+jG_P4DQdAo{0Z# z`J77s#lOFAR{Sem=??5QxM2F9_x9JF3;Bm@bnstzrgQS2{uj2Np8m`vJ@)2LCb9jI z{)oRbNmu+V8SbwRg8rrV?`PjvpBe|Q|C9Xxisv_M*xwsH+d2L}<9?xFT66n9=FhHN zG0P?SOaC=5A^w-t_B&*Z5!ZAATF;->|>2+=l-#%rMXN>))3N zn&p3q*0Z?}M0{-K(Z#2~Z!^dA{pVoXxi3s<Er4#WJ13C>y-xnr;&fj|19i}3Qp}B zEZ}~X;Dy%wPhx_SzrSBpPurdBmjlXK^50DB!5=mAxiRHXzS7ZEFLI?vf4^<^-i`bp zLHYMQ74wIi;T-h`UAs|k!~bND|B-F>SC8U+VENu=K40XxG$vjA?Xgz#`&R^U+NJQY z<_m%!EO~6x`6dUF|Htk9W%CaH3-emb-{-&G{O7q^_wCxu|64pCQ16@KZ|?K#M>wyW zBfrDx4x>A8?t3>j%6|&^|Bubz?$)tCHu`ht_B*h__Mr8;cj+=U=bcYs=i`_EjQNwFJ3h+fU-!xVs&n(R z6PwS?5A)6E=11e3&&@Bx-*|3*75>I^^YasMcD^#EyFqlvFCqV_>3>~)ssAcXM*G>Y zzqjz0*7Dc>-aOOmGQ*{#af`AmbNrup{qI|PPobW3IVY%kbeWm;V1jZt9lOUPt=8|R zUF;&3|Lgd+@6_5oD*yItp?p|>&IkQ!(06Oo&+&b8K;N&;e1Y$$0Q!z?^xsTi(0W}3 z{|)-CZG?Lb`o3-cKlpwMpzqu!NXyXfQn}=QH2vvcv?|}=87_q+aP!RV$`>u#FEFTl zr7ryfgUXk7?T3AS{p#h*EYdG9sC)_j8&tjw?lq`<5$-jpeEDvWC(!Ovx#a%l&EJ<> zmCw$%u&aEzt3Mkj**%in=GcF0SNYB!HDpe3{@i`|Ru8bq?#>@S(jze3kNU1%_aYVG z#0{OdbT_`=0~~X<^B11(5g5{qoj*UbM_||z_6>F=5B8|R`M&%+m?XJ>+kVo7nthQs zzr8BH9gt=_=I1LfyK-_FKaktbK2Uaa$<3~Pkz6z%tno-lessQ*)*rH@>)aKc&l!>4 z&QZBSMi@Eci}8)+)A;4FRoo1h=Fduh`)1|SJbrvabNRNBogl|y;-mh(#;aU>mCv^$ zi^z97N9B|I{^<3(HkNM``=|b1`HJZ`E1%A>jbCXlU%UDXz4=>}?>W5}^W4>MTE2$nJPxi}d?^Qn8m#E)R`TX|i>&ll2ny;-l|6niF-_*bxU+(iEzQeUi$MaWt zy>ghRyzvM_SQ{M+I-qoz1r8ioauibo=&KdU46P8`E=pi|Lj<@?pp&VILudkyhMwe0IZV?F=O9WlQD4EZmE`~h7mm)ukP?ELRm<+JrOyHc+E z4G){k_r$6Qi?K%nXFwXR9OV3EteF_}eZ@Ef8zjKK7iRXZ71-n%^nJZN4z4%6OoO}> z{|#HLQOiE4;*5F2&9LXS`(vD0Z8&6m=g%Q6gD#az?nwun(5+SZ4*R9MBO2r0AN=yY zc`DL>4c{mHRks>ez7n=7sGoF7w;KBY0O2TqHtANwk~=}(sPFiaZZ(XVLjK{e0#})G z;L2Tv^nf4j<@^PN8BT}2bxoc~F9A|Ekjdrn1G-c$x#Qm7|J+vP+r{S3a7CZH=Wa~c zTz|uss|5%7t1-R@>h_r>qzt^p_k#-l8}1wE;>W+o`vkBHNSi=~eR;ee!U0{=`G?{QUcR=U+4tAymtSQ6H~sgJSHt(y z!hf`BUru%jPG-6Z$C2?r-MB^hmgl+lBPCt!#|~VFjy7}cY|I;8)V%q8N3W9p9O*IX zp(Y?1uJ?F)gF{aJ=Vi8j=bz7Y!FiZ}{v?1cGWmSBbL9&(PwUw)?M*vLtrJP&7km*@A_(l+I@eGhi2{^oN& zRr7@|6yf@=1lJ8h22>tm`S@MA9O?c%Wr6f%wVuHKFdx9C!NTvX5o2#`Thj z30=bTYYXF@-bxy`3dKs{8sd0X(g=KBwH{6@S%=d8;9E+##to~yo#q{|u1 zKXUi_aJPMG?I-774rTeCy&BJ7ua5G?)y|c#{+&kJYbxKN9Diy2oMAwb>%O9gq}T0K zXpfjxe6_=)96u51a+I$8)fkD~WFS3Z3QF7?{aB{{B6 zmv_%i4>Isuu4{smovOhzkvZJ^s{8SNVF+Z>ER5Vdy`a z=~>bb;5uTshtq?IbUAwNLK4m#de~Z4e<}5I1nX~**{3bp@&1=~vV8vhpYqlB!*s5$ z$|rk~=O)xoz5lD+H?enTt2cJqa@i%M5%-F`}LD&HmDw%ObI_mWq>=r*)3 zjo&}`q;uudcb?K^oAvX5)xS$G<<8q|=r*RGvY(nn{hWIW%J%@~R``AteA>Ev`o6$q z3as7u+F$2aJ!wCFcu#YCQMdP`{Z7R6W7?a9SGf2&(&Y@}A3cYA?z;R%jpaL;<$DL^ zi!d*w@}-?DpY$*;H`iatb}xO>wX4#jze#UN56PeA7t>E&eAUNH&bKCfkBk{#j>@I@ zBmc0^q{i}%XZbF~_&RR*zD4=7&eh*f*j}g{%J&Pt?})DQ>3I^rA#cd?JxJ|sj&#+l z#z!&fa)x$HHPuL4TsY0%->0VD^Jnu*@vx5XFC?62(z>l&n|HEH`YHRqkamSGGzfhA zzK9zYeEYr}>ArnmOnMLLC+E3GlCFIE>kr*7Yh3m_YhV2H^((f2{-F;0xdQh?s$6nq zKd17&%J+ftZmzzS-Q>Tzc3thH>TeJA8*Ep_U(D~eh2A{N4sS3WuisZbA^*tjmS4B_ z{dn28>wJ$9sJ~>>E_M6H_>0#1>6h;Vy+4p&mfy-ulWX=>Nh7`?ZL6Fse7XlbNyVFW`P$)swQjjn9+b^Hjbb zUVN4BZZE#-br$0*odL?AjeAukzNeLamD%^in{^AK)m{4)(hkN?rk!1k+5Kcc%hc^+ z%;qQmQM27o@#AK@pX8HfyPp8}%Pz)jegfPtyBM?iN#U1WjM@C;7DzfBT<*5UUxu_Q zpV{|Bn|G8i=;G!_I_`A;+Lh02ekvb!l+SE_GVgVi&uo6O?{}2XY<{Bo9p$Up{osC; z&uo5@YDf9Z=BI%4R6eu$sUp3I49cCg;v=>5fz-dB$^KzX7tHZDobOd(`P5v=ZD;=? z`-$YZ=KikBTdsX5ALE|qko@F1-b{Ym+}}OPdEWRRjxN53(q2&Mhvdh94-}vNdtk)){(E4K^ucuX zyzYP5V|&{AX5!gTyoT~68+5$i7Q213^0l*{xJUg5&kYO7Pl5CLYDZN*|Ggt(`~{x< zpx)!djob{C+$rT%Rz&&sDRp=CKb`Y8dmo5(woN+b2lI=xF5g3H$G!PLt-s6ODnq{X ze&M(KTk5@){hG>m&;!l=-B6};1LG$H-8fL?uD8pKxBj9Ve2nqSm%hJk=M$yNcdO42 z#yqD;%QbRsez!Z)l3onwa};{}b0Uj`tGY6H@yEY=IU3& zKe;x)W=nO$nPIL?`B&pSOyc$PdS92`BDvbNKhN8tH+W!e$cN`Ul?QYQqRqfx>}nx} z|L0hLmA?vqyG!MkJ94SVZGYL9>fg>siU)M;4~=FsS}32s5buE9=7#sQxqfZ&3ZmS=yY$>BeCGDYtZn0Wwa=>mAI*Y17j&#I z#ywg;-x;o-CQ6X)kmiX+9>aD(bUp8Hc=V7rTq=F>_VbKUKjp1kP2|3GrJqyAo+~{a zM*1heNNeA3QvZ83`=>d-K!o?Z1x3DJ$BVZq|0I`C!t^4wt3POd|I~U$@_KWBtoO{q zv93Rkn9fX&m;LfA`JQX8+yqQ*ZpQ^{UV&MRBSA?|HnrJR#G0pW|bdGa`K}u7^o3G3j}( zd#N4ClkPiN5|sbkl|KEIm0$X={oxy9{yqL_L;KgObLFqk)4tnW|I2G$mvrT?elVfF zgyc{27%GqW);g%@5#!(Q&2#5S_nk4Yld-G6bAmM=x%&(&f57%%=MzlD{BG1RzZ>`N zT>14r7kl%&*HACCZlLnN!G1b;yLmj?pU+XSs*|J2e>CSmRR5(dT|uUCJQ`E)%A~WH zbtmLMxu2|X<26=(z5nWbqy<<%OIB#m|2~~7e~EmH4`r-=VTr;JUBi(l-N6}B)>8RCO&F}mL`X8>?Q2r%4 zSN`XyhoRU0r5;`5kNo-yM%q|4ARn0(6(1IOVH; z?1q0eKQCDo*mH-{ukhZNA9tITU;Y2F?Eho*|KZ?<^7rdp`E@>m+9zf2@B32um*u%9 znr{txL;XGW?B@1Q>zrE0jTm41x269v>As_KOKwYE@#ZsD{)F{^2+Kdz>c8Q9h5+23-&y(9|7(BrAvdG`hj#3*jF)O%e$5Xi%&6V>Q~mW7l|M)Oy~NZ1Wmrz>k@!CB zbtf0mBj!7V`Y(FB@(*Wxxl>+)-VW5RUXtuHOZ zeUGWPKXwJ$zlHyG?Vb33_7&<8+p_}GA47XfJugMlXS_hUyzJ6RNcSE8`5!f7=!C}d z>-oRR^nZ(v@3+Q3=v?_1_UB*yj@&(lEpu%v`{3|6C%N*8Zd_*PaP|TzLxI9{s%F1l z+OSVxSOpVyc7AkzqdqlUx_q6O`1;N9cIC+WM74p#hkJ0)rt`O%Q2l;CL z$0$3U-W)EUo`1QQJ-dh7zsUL9li2AIaRzn7us#y^KY zBxC-5z%1$he!z%yt!L|fDo47;+4`%R%l)R8}#1oz3*ziv%IBiKUDrxIA1M#e=;(V<9E@;=U|po^udfj zi{mW42V_Z~r}-z2CsfZ2uI&-G|9bxae$@O+TRs2(I@8^ep5V%DcA~a2pmJQ|)FTKF z%hWKPFRsVOAKS~)X2>6CcS$aCm-zQuSGJPR7}yWn zRXEAX$Lwqx<#R(+3l4&1ma5@S^AEzB2{v{a=2Bke6_*MOb0HsVzlxtMSwpvV-2G{= zRA89L@|8cw_ZNUOR&wFt7fS|){Wo>~;J@goft}GF+Le5^WDO^?f60G}??C|1z;F5G zR$r=ymv(XS!;g_3(C(6+4Q7OYF7x|?ZTyt`)Q!KizxK{GA)ECV2@0G)O?Y0h+D*9u zwfhWi-eU%ByM#P~g)aD4jhX1pTb zxB1-sjPb8yI*Pvs>Ft~`49L;#AMH?EU(x&Jt!!WW-h}?FVgEpR<<{+stuNUn`FvOV z2i{?Oo6K?TQ(Vg>2>y1DlaJcr0_oaUAUp3O>AnBdEYC9O?HtvQ+@B43d0o?=GUuN) z{$BDdj1L>_pTpMjv2lrAl284d1HL!7&>-;V6ZCxh{Z58AwCkrdza{%)mE-2wlmqRk zBc`ME%!Jpw7wXEsn4J`TZAZmz+`#lFw$c zM`OK*WGv!*wbBvaGdMm{IuYa7?cF^6soT4eKAiE}IsLtW(j8|!Z}Y#2H~yQ1^K}xO z&$fX4#H+QI&!o^LIE(4ts`Fa8KBw$tkFR-tTQj$79`~b!K#O-UX)?wAo{4?QS9al9f- z7}>!D5YgM>kSKk|D>MCbEcflRh3h`ATQ8RF`EdWeM)f<7>x3F_gyg3;*LOu9NcxXIZti~vk^VfNJI#}+JR_cE z`@{E@i1D>=FMiAQGda?IN9B^c$G*?q*lK({5%!~Y#h>u~XHpRKfnVjkj_(hJ%lig~ z3jO6NeFMWw^p~dg4Gi0{VC6Fr4%qntb``JeTf_MrP!@2nLFWgAh-+Af42PG&4_wyG z-Jd~R!=ao{sQ#vJU>Lrv3ori~`2mkJJo;_lz_2pkFVZXe1_oU*|H%F0#@jS~|E5I! ziH^gZ&40VqzaLXxv$g){`!N-!TmMc>S0`7Jzx4eN$@z0{eI?5q${epmvzz;&&$#X= zdXDk6PM7f9z*y;U+#E0N(kYTYkNN8RKndw;Cx_9W+`HF0HonpLcqZku*edA1-|E;O zovzhdKC^4q1VK+?QQo`eS8}&G!VnLe;MR zuQfl1BT0Xl>lk`&`PtK8Q;naP&cTd7nE9w(Pai+=_L_XSKX+fsCxLxZ*swkw3~4PN zjgKXtiq@xRyXTzQ1sRUpv>z_Rfcp5A@k7#OpP>Fm@~qqGdGim)dGAp$->O}*-%EFK z^|b}*vfoR$YSvG+JB$`Q^usMbGW%fv`;O~jd=odU--c^go$225_1s00kc zp7Hg5B72|$>Hhit3F$xd&a;?Ky5ueQ(TPVr*sA~fv;g_MgqvP)a?{1{<|92=a< zC*TQacV!tM_xI~f+plr{cp~-d_CL6Y1+M!SvrdleMr&swSq$wr(!36n4`dgk=RtBm zjp>Q5nX2JzXEnZ-9Zga5p?sdzu1=Ia)-}y~c_G(VQ_@w=jM8U15gFBY)%Bj2Qvuqz zN>A?j|2&|j{EnOB5|I2V>n)t}3#YY~pXe&*_a(n~$8I&KmHw@9SF`*w8!Vjii`&Rg z^zU1KZ}sc#&e!Anjh^4=;b!^eHe5L6m$Z?e=-;>eW^VjUv6cS)8SP)#1MRTdzl|17 z`K4{-C;Im-zlVE`_+cygUH=IB#|HUTHeNX87hc<@{UiPRmfwsGs$E*i@BPP{pWn>T zg;RcU8~KU;ear96o5FvzlHY)*o8_0=bm5d=(nfxwf8X*u=cb;Ywvyko_hbCq@cb4x zTR7#HwvnIc-?#j_?7VF6R`TnL_RlW$AC=7)PWgq`wQ2uI|Gwq7@7ovjX(hk=9&46g z=0^*s{Ngt96aD*^-%on&xNa-?E%!vT{Bm0^obpTB$WQd|TYfv-^!A8W^1B+}*G?PT zzpWNd`K4{-C;Im-zm2w^x@0T)?Rs^y{#BxdQ-0y^+O&V9f8X*u?&*L0y_Nii-r6j` z%r*%MXiJpG+st=4~Mo$2&1n(Ef4&AxvLkTQ-Oe6Se*(0K>@%^I({SpT)F zvcpm}4CDTW@)of72kuzgg@->{Dlqio`fd^b4ZFi1zKQ*G8!lBthWi)tNYC&Kp5sv5 z4)KAvWKiLf4R##t{>0m3zX9+lEC2j`U!%N0|>t@zRx$%|r^H@J4& zmrpVK+zRdACBG2`tba7xzwg@m`IUW-<)oCxR^dr(E*-J533aCH6Wce9ZzA8*gE&bQa|Tbhj<@O@)_-#gje$!}4nBX@Eb z1lBf9CjDaBxA2@8l7nB9p5E>HqYMMG`mPP1myq;%+?NwmZ&dCLx&KM@i1Dkicenl3 zc4a5`2?{^y@R!f(6CAW5+9TK#*%e*bC)jsjM|kecKK1W86_4*5B)C7fPAzKfr;2c0 z;=2b4A3b`&xu$)` zaJ4Q$<38pHc3X}6m`j7YH0@)~tpnRD_T!d)iu0Ts_c0fcUgJLI2>!3y$DBj@U$u|9 zg8L;mxlipl`qozCm-#sV)voe2PVelTHY>BrZTr{lN-xFtje%nZ;eQOrq zgM;xUA)o~NHM`0?BOI8$vGW&C$M@!d&pFGX?T>o_vu{g2g>BloI9CXmm80WA85jrB{CwnI10~L&KYWpM4LVmy?j$a%X2t#~3e;_;?-?Ia5 z-`<5}_C$KXuVwEx0^i01+FjEbAoqfk2K>FTe|ew%%e>t%zQOsB`aV@*ZzpGs8|3Qy zQ~}31BkpnboCSW*isV4&Ld#ydBnCOokbPW*^c{H)oW>a`>Fd1e(og%lcA`r9NZNIW z)PM1#{!Vl(S=6po6`$jz4C%73PSAj0$bK0No2ro&syH#3O|F~0%Y59*!2m$01-N!K{>W$lA}-SwjxCimv=oE*a~ zn(dEoAwA_edpX80=-lR?y7&dsuTc7I&x@pA=Ft<Y(*1p(Wzu~|aut2RA^$8{ z|C9@w$LEj!63@)49sA>=eOt>{<4fsFs&jVO-zc9ydGsC(*q`UvXq+ecKIe@W@%YxR zzlu&h4M~53_RdOYFzLgXzWTE)>Hi=<=?TsC_cO&O|2f7FI4%p0b@5}-J$E?$a>pF_ z=u)P?A>V&~N&TIC8RU!hTKf-^{W>RK?Jt#Gw6gc@t3w9dK)dmj@>2Qz{e%(Y`}-SJ z{-3njXZWthnM^;=bo8AeAHSQ}By-4~$Md$w5gmmAL-pHNZcfTWB^>6n5JiD|% z!`>sURnOF@L2%X9uD?iU_X-S8u>VRQf**)se{EO%GX4V<_J^gv_X-S)Y~sR8ufY$z z$oq4T^$HC0)PLgM6gZUW1+QW>0;CKNo`)X@S99qV@!v3>@zcK|F7Ou9&p+HNFvuP} zxEJ>WcXPi|wcIN(4B6DBS9q{jV7O#G=g&UZD=_U3;{W?|B#x z+Et$9^frs}L!*3gghA~}w#K>Vz%?Au7FS3A4CG;eZT)ewEy95@m>;qJJ2MFVF|gkX z?*7bX@B>F-|CWX8nuhU%`I9YhKVau0*p=A^@qyDRzv_kQKfmwCX_r9mFy^a%If21@f^qr{IG`YTt4pvfBqgohZn_qY0bqf0Oz;THb|+#jb%2jl$k^De;~lTp{Guj?!v z>7I}1G2*|-^cKN@+tT?x(o2z#&VO2SdBlGm`w4c({rH}672)=t@Yq@|pSj4_@|%qJ z2Xptb_;5EwdY1mAfi8aSd?(ze@50W2ek6x=32uj8r*L&iZ{-d>Xx!ti^mp%B?vChq zr@uD-h3M+-!zFy)vX4VQfaf?~Ej)>H`vINDk-Zz?K>u@GddY*(M_?U{U+s!t!*~*? zk6-VCegePxF~griIH2$KR_}qn0IzNC!qeFZ1M1_|dAJ{VVu}kd{0;m7SDo(s;lDAy z1suoJpw{x&`0jg? zKhHV%I{6>@E#)6R{te~N?|S7Z*}DA6=hw+U=6#A+IArU+O#TJVU(BNZUkmvM_|CcH zpN#ID{5R+LH}TF7C~JQp>C%6_k7<4@B!3@kT*&y+oBDel^?xYicjbOO?f;BOAI9fM z{77zrM~@kQ0pC~So!$Fqp7co1Bk4ub{r&MJ(%U(6ZL$p4aK6CZd)sp7oBYd^e{6?- z;F@z5`i-4CH_2b;(}do6au2fJL+-;bGMy^*zwoN#zfAfZ z=@rwdkgo4#r8+;ZW2nOz%}z{jME9qgtp7;k`tP}v|9|GX2(ll~9OmTToA=3`OL?SM zxptJn!7l8t!h)k`7@%_^bWTu6`aPPr_SU`Y`z*Q7C}RBMIZvy7Mw0g>TL0nqy<)~s zJbIq=^{dU#S%LJqY;RPbMbi6mUQ6_Z^rv)g3-zKzy6?m!M0A(gf5xO%@_%KHiy-+I z5C3-ZPrdUazfS&X8~KOa=ODf%f6@Q1%Kw39r~Rds{Lg=&S^k+LzFPkA)2;PCo%GH0 zKfJ-k&r(0?`rk(W+Gp~ARsI`4J-ccDkJ_K!_chDEIPTlYKmLaLAGeb~?c9C+m!13n zRr%j_#{NzA^OFD8cQwmDlmC|T=W~&vK7U>NleCjR?QFj!f71W2$Y0}r@%zz%$!r_{ zX#V#;_P=Xj0wrFe;r;ih*76?~I>BnaWZ#@?KO(*_YdD~OTHi~H-EF~twcg3^tK~^o zKd1Nw($D4ltmsA3f6nnw!u~HIefB?H|0?>`q!0LOGkqHAIgU#e|2op|dWHQo-$$mC zzOi?H)eO>8rla+(n@KOw9YZ&K?&;+l$DcDO{~3^fx&-Xc?{@iy6I#pP&b75m@?VVd z(K#b7Gzb>ecyDFegE3$;%}bP;+x?L5aY`p*{EcbH6no>zsjIpBRbJK0Cp?cr>mF0Y zkk&)I`npl$D$XZJ&L?vGq;aXeC!On5CcQ{~5IHl^Z|ECS- z?<5mj%U|;klE1!(R37ExGuuG=ulLiK0n&fb^Q24vMK6#p{TE$w{yP1a96GE2ivL~f zf0^Y_y?*%V6}9tI_5Sq?^?&GPct>2NWBn;SrgQSwc~9X(P9K?F;J>G57_gPMZWNMU z^3Ji#lJ0+}BqIF-FP$9e3rG+6{gs&Xw@Huro?an+HLjm(e4moOF6m0AN_t4T(uvvN zzOLt;&sU!GnD@yYcy_Oh>3{A&uAM1T{#*V6@?X6}{>ibOlmDHv^O@Bw|64c@kkH;M zLq7Dqv2ZTi57NJo-5u#!()GM(z9=Gn8@~TY4mr|KRC`4^$D|K_ z|CHwrie4oBSdX5N{yWN{a0}->NMAtrExP4L20zu<{`X(m&Hvc?Rbh6wptLgOa$IZq z+q#xrYJdE5>s)9MyvOsT)P9Bxn9Xw;MVFknW4|DJ#Q0b7`$bxpmYnP79kG9m8DH~z z@q^9tX+OKx$-kaH_47Au{|i^T_&L&Za~PlXRUkdX`HGa^_brk>nf0slp39`Co_kYt z*awaBFH!!s{u14f?$_~bb2EkaCD<=OT1BS~!#+&EV zcUa5YIsJ(k{~hW1=8m4lI+R_*Xn!er>O9H}=WS%~kuv`2Iwy*DAQ`UD-pzJT{d+|E zQ=FHJS71Goz9;*A(F>&Ky!b`ZeLI_kbXN+T>rXlAIXS%7yG`dSF3tL}^Zg6QcdL(& zq7&Wop?Z<4@saB1UuutEbn%t1zBe6me3W6pbhYaoABDPs<(9nl++4%wK7OaU-X3Q< z(ZuFJBX%VkGT8Gn+_ePjG8>0eL|@u%!x`8=~2!BG97 zJMhehm+Ff1p>@8v?0YAl?jAg?@8nN$^6ty~O;zf@k7$*t=F9IVA5xM{74U;^yreqGwe5%Z^U#8(i`SGjP!jpZX!KL z`jwu2*l^Nka(tomW74nYct`Xxq)Se6`~6{~U$NIf1U`a2j9nGu1&}>Z5+Xfd;!Z9+hcLsj+&`3s zVTIvJh8OVPFlcob-#(*Y7_^S_C#xboVB8wcUtJCI0RFYJ^B3{W62nSVluXn$Fub}a z)5E^>^iDmq2`ltG~%%bN%6yC{5Q{e2>pB(l;<1 zZgwg$%8FAv4cD#W{JLo>;>WNe)iYYc@c&Ok3c9aza|RfHRV*+u)-@Y5j*K+9k46T~MvfA}%d2L{kyEqE8f=n_O#)vk-#PQ+|K95o1rvYiuM&+!?rxb{!}|oQG06G3i}KHm8#(z07>mUamhXkbVyH6}?FM*x02bdP2JPUqwf7d_np( zqnh(of9l7NC{Ny2cVhmF=sx`Gct;z5B&h1dS}-k)o#i?=AKb+wrW2!$GL>{ z-e})%><^OUUV=YF`%>+WZ!ZE*L0=O1bzSPUXR`N87Vi@nzVO0VLHlO*o~2drJx8Dm z`$MJo672sPuigkxan5jcY2*(q3%`92GB*f&hkzBL#@J}`&^}xHRYl$g*$EbV^a%|6 zc=?^?-Cy+lb^Fu|$^*n3x%`SNAw6KM{42u`%*1#ghJ9mY$v!pc`;wIv;0M%SS9^j# zVD6^P{2xvGyDY*C?Jm`;-16BMoYks+?RF2OV2CiWF!?<@~m`Q(rWbeT6Ajd!H;=KdI5nI>T3Cdyb z8fFi2{>;(61H%aRU!_sK1H*Y6yYS%H-hrX_YR+Hi(>pLMLw~h*@4)an?@yOOe!wyu zPsL014h)|$Jn7dvFs#b(Y~S8N4f3xDKd?ag{{Z;|k6^r2)2~lpUkwz|zZS6nI$jm& z17o&jdBA%HxO`pb57&ZxfHSva_!bBUwxm5}(gXYex>T=nFY5B*7p>~IC+u!(*Kb_= zXXBs7`fWG<;a&CdkNoY%KMMce#y`hl`~{>iv}_!I?9|oeoL?N{HQ?KhkHmj{d_;oA zM+&cxk4Vt?Na6nY=)IL3zr_I<9|9ULDSo^0(k~T(?ub>MTg~>zN1wX>L*t{P*F<|8 zbP2}1=ji40UH_`*SMFQXqavPfyZnCMQG;Mt?km%Ke1QSOJ^HDnZ}(7he|9?QyLfa= z6V#q%ZgP=Jd}a{o?t}bjj=VKQ+^fj6c>(U;XYe9$o$Jn~yiAqki{~ z9(@Yaf61d?PP#AWD@fOKD|frwKiHtv^LrKQ*RF7odwwV4{{TSsIt%@8<5l+jb3Ok& z`m@#Ufx%uEQ`pPv()&jGZ1=#R{y2WVdtlJ_n6vY6KQMEk?sV>nyE`|22=M{``^)?A z{iU!(kHB!W_detIzv@p4FX8*hK*at+xz_vBm%9fQ;4JhX@!ROH-t1n(0`yOfm-efQ zHVpec?8?qZd4OB-yf$7}E$+r6(Fe#I$npJFaelX_`xm3(H>8N)c+DTo@K+EHXn$$; zL*xgvyC$(pGIT5V-gRx`{N8ZR?^U-%|1w~a`u_0ph3@%Rwac9xx}3^PZwTjy^j=JI zun*^BwBB4|z*C%$4raP>afNh$pLt4pZ`q@Bzhag2*|Hzy{_}wCcl3gL-qMUqU+={` ziO%>T<7-}C?^Bw8KZy34YQHeWP`eiM#@*YHo*%;Z1&+tJBmH=;yGPt_pCkP_&f{yo zIU#)z*T1!{P$K<5oPQF%O!^{RM;E<9`e3f>h@O(}O40GFc0=yZX1>0lRr@jL7rbY2 z_6w7Oz@~WAew@znSor~bp9**v<5Rnm{g$XcYcm=>LJi z)T8`u=ju_n#jwE;3ww~U2aChjqL+a(MeUNXPqYuta z9FKAxk)L>6>!5>=9y@jz?rk5shkff$LTXCZ@`MBxc8C=g-w}l5?DK?sj2KxDs@;ad z)Tm=eTMT^0@Q?}N5hL>Zx&H^)-Bxbr-F@^?^|IMl5%)fF{Nba=?=)iM=&=*R{Whq_ z9(nY^JGH1^kef4iqG@ef6uOk=@%h~M8jhd5`L~h3V>{1vR<&P4Z*QjSO=l9*QG2L%>m#M_t>cdO=!03n z%b9OTezK&8&y&wluHRvE6ZF?OaxXXTiWtA@(PPrL@aP57lL72sm`+0a!{kT(SDEw| zX=f&Sh4d#LY?fzAdi^{C%Hb{25BB6xCH+?#$5RdqNbfz{r629&&g6nyJ-X_B zhDVQ>!NVRsNBZR+JtqAzkDe#}Z(NrY{{_-t^XNs=5AxDUNI%S@mq^ch^fKwkc=QVC zCwlah^iw^0mGt{Oy7b{Z*&|ZlG(O$PD_2PU*~O!0Nk71&N1ndTBOi0={%roqgBr)b zgE;=Jt?&H3TgUj9>papcxf=gUzb;_@;eXuo&1?eM?a1yT%K(2}IwpNG<)rauf%Mz7 z{>pLXsigms>(Yv^_vM#pmm<2}m;2JrAiCc@mqn(tyqA7L`o2%GonXFKlfI|+lk&OO z^Sczsry9?e82?h$Gu!Dh>9Wfzoa&zAl=MLMGaB!cevs@Zn2z+ww=a;syvy}$olljc zUhMUVD_6pD#iYMMK1I)yzS4D!|F&y?3!Z-UAb)aaa>`@^QDo@D$@`KI#@2{z`w0|AyoDbcE<%-2%gF z-JC!7LASv04*d!K8>;kI?LUAdYF9KL_XD5PU&Mby*F{`-ivNZKDVNgwuyF(QUC{t( z8L;)bc4d)~VR`y9h-(PxFCfgYI{g*=Hw>Xa{~pdb0@kNL#DBvr91mv@*U%g5iFV~7 zOT(6opT&Q}cJ!BVuVF{}WAI{_$@lXr1Yx+3{s^)+Y_p3?zl8sW9Q{T7H@w0472Ip6 z(qF=V!&?}CTm7b}UqhAt82=3m=r7{Gq1`3DlRG5YH*KYV_I+QwVt&`xzT>+p{L;U< zo?b7$Xf1mEXC?a6hcMp_?6ryu%HqFak+qyZd;;^&z!g7n{`}*Zp9k({d?k3E=95X# zc^wM>g8Zb9AU|M?28fJs67y6150-QPvWRQwi*p?sueZT}<9bpF={5Q*OuzE4-htsL z+;8tgfaC->{~DH2K45s)#?*sg{)WwdTMx3U`Y6^5fI%BMe-{4@r*Xb2{R7Ge z^yK@ni-mJa8DIW^R#~{Rh-)~J`RAX6e1X`TpE{E3Pw7mg4?MrS<3IBN)&qb9?TcNx zKlQF*CRMC}xQ0#mew)02xQ71j{s{jKx)vDrAfvec^o$QC$FQ%kl_yEhx{To%%hyS%Xe%QsOGlTL``dQM8{BE|&8G(*1KW64Lv5c9$j6eY?^!>7UPYO4m8Pg4)+Ex&FQb1_x9A?D$G)C$DyO`#I#7 zk^fKw& zar{=eTF;XU*hTj6&${O|W&FBbC&$BK7uVoSRCy&g(huN#b75bXenk4o98bpFFP|q} zcJeA$fplhHchqmo9ar7FZ>#?M`d_GN5yss)%dQc}*4kH|X4^?4bw)bbeEe{|24olpt+`&T~o- zX3)7#DgGODzEk!vqzCAnry}w)oR4zZc}xX_8FcPb2KO3t{!SHnQUEYGiV zt*Qq@7Jx44rQ8j_nEba^`uW-=?vCgeU#*|XSm*;F{jB7nUx4(pfG~sfGcykI0HmLp zqu>XmpH1P>X2I*&TB+3p*KXdqRkbahsmqGfOAj}~B z%pxs=^s|C6gY+{+-UjJsfV2$K&*%u~10em(h6xCZHG3|F8x;u@r%Mf^8NKVzhA zkbYJWW{`enu0#0&>1T}p2I*%Ryc(pRC4?EIpAphBNIz4A8Kj>DAk1&Juvxxr&>1P>f8>F8B{u`v9 zm1`g`K>C>=%<#X`&l2)B=#pN_?RoOsr?=8i+n;Y&#C`eg`u7TS$sqjhCFoX0ndn3{Yq@M-+H%LFz z8PGRC`dLAkLHZdZErawkKwN|LGjl!k5s-dn5oVBn<`HJ7>nHvvfb=tiv<=eF9PTwp zKlAu+kbdTHuR;1*M3_PPS;BvV^fN_VgY>fqSsA3CG5#B*pIO8;{IB#gLf!^l(o4Am zt1oWaNh`k=T{1{N!&{+Wfb_G1FoX0nz6J6Cq@OY38l;~Q{u`v93E~>0 zpB4N!NIx?-qkaMDXQl){ApOkYzd`z$;J-oo86Yo%^s|aEgY>h2ybRLM@b@SmApOiD zZ-ewRhcJWmvxqQ*^s|ir2I*%OX&a=UdE9G|eirfHApOkaUW4?rgfN5jvx5Hy>1Tkn z4bsmN>cSxXEa1OE`k6!8hX0j*#>m^COL{5y`A0W+wUvJMF1R~%PD#7=GrxS#z##pM zk3|0iNI%2ndIkpRXKBNpfkFD2J*sC=1LgzmT-rE~`vK`^x=~N;r|MbP&v+=p0qJKE zc^jmkrA?7OApHzCNB)5HGyDtRq@VHD@B`A%U>nQ>0@BZLRoo9qKZ^)6NI!Gi zqC9}~GhQF*0n*O^bzzWx2L0g&q@Puk#UTC6tN{Lj!}xwwT^iwl-j6DXYtZ{q;ozQu zLGMT9AM^|idOwQs-=O!Sa2b>b&?UW;d&}(yJkd%&|D*T!4Zgbl%-n|d3XpzAccT3R zq@Pu^O$O;_VJ4neK>ArgT!Y%r82=5@&obf~)P7d+-yr?WB5#BAGkZJyfb=tu{|4!2 z8UGE^&k%VT)P82}KzRV^XM(&8($5HC2I*%Gc^jmkd4w6HpCyDDq@OAN8>F8(q-~IX z7ICjZ`dPw%gY>hAdkxah3c?K1&no^Kq@N+uHb_4!s0)MiGr@m@^fQmN4bo5Pjr3D~ z>8JeCPx+;v@=HJEmwpzIw?UWmQto<3M!U4q&$qAU9cO&CewL3yeFM_Z%0!eOkbWiz zGe|$P6QDnU^fPlb^Z}55R&lRE`k6;ugY+}l8P6IZ{Y;Uzp{}1fw8wz-vor$j8zBA6 z?v8Lk`dLC=2I*&lybRLM9R3@mpB4N!NI!$|kS!qn43L&V`WYk4ApI=jzd`yLAT5LR zGsL|H>1Txh2I*&ndkxah7-0tKX952W($5Ow8l;~E$jTu7%;CR5`WYgw;eVx{S>$cd zCB2lp#-m#-+DbpoKH09AcFB{&Ah0H0^Pm4$_Mhai_r!26*W;{Ac5M{7^|i`G?B4>k zAEh({``3VRJJzDre+K@r{xJX{1R0<|)+24dOgI7i zdx1;bba{}y75m2kf4|FgE?neK?GqTjZvV^HFebM2bEjdy9pLYWDWS5{!!e(EOrIM3 z{V_SN-)DXSet~-zck`j;g_AS zDuCM86nPu!?JLp>0JX2tv1ktgwXb>nH>iD0@!wEyUvX~;)Z175j{vo=A>tb9?JL4! zpx(aXe*sYYT0&fd+SeGo8q~gK@!z2KH9%a0-@d*_h01M*u_$nuHD(Q$*5jie_Y4f* z)%YL--VC~=w{nMHwDLu*^f$iG-H{II7$3CK-}ofR1Cag}e}VoFkp4ypGf00cC!_uW z>2C#b4btBd{u`vfnNz?&ApMQ--yr=hAZ>&6w}3E%^tX)v2I+66fb;4&Emg7`kUatLHe8GUW4>E0B;8AZ;HGO z(%%qa2I+5v{|4!A9%&n-zaj25NPnv*f)_ygTSl0no&HLX+Uc*tzbpN%fH#9K>8;$y zMveMwEB(Fq9(PA!?XT9~@N~!nkpAW-qkRLUzX8Gw(%<44sDD8ETSQ!g^f!m?s{VgEOApI>P%pm=(;(raWud?s##7Ns9{Y`MMLHb+9e}nWl!Tkp5Z;CL3^fy3R z4AS2$(l$tc)6)P%pm>Eorn4dq`x`DHAsK6_8*Y`77^DV{Vn6aLHZk2C&c4btBbc^jm^5yA}8-vYu6(%%yP z8`S=WNZTO&jd8C*`dh$%gY-AXy$0!Tf-r;hw~YS=>2KBY0;InQ>cSxX&Evm8`Wqpx zVPVnV9C$P6lHSVg`S_vRw9?t8FoX0rMcxMKZ-BH6(%E!heJGH$+^6 z^fyMBLHb+3e}nY5gt!LjZwy`y(%&rp8>GJh;u;nf{mp-(KVbVC zulv>QZ#)I^0HnXgE6~0H(%%SS2I+5QD(WAQ{#FpzApI@jzd`z&xg7ih(%%UG4btBN z(l$tc3kWkvf6Mr9kp54&Emg7`kUatLHe8GUW4>E0B;8AZ;HGO(%%qa2I+5v{|4!A9%&n-zaj25NPnxp z0xy8{w~R2u!lJ(w@Mh2@y_LJnuF=V@^!Ea`zd`n^^*8)2i zVuJbyq`yVPHAsK+_-~N@RuI=9{SB@{dVusdLfQuDZ-g*|^tXWj2I+4F{|(aLtmO?z zf5WR$9zgnALf!`HZw_Gw>2Hj@4btBN!VJ>iGQtef-zxsspz$x#jsfX!f_n|p-!lFi zq`wL7H%Na|gc+p20m@>K{$`Q3LHe6siTHr@w}k%&>2CpP8x|J*ErK_LF6ph@Kd!sr zwpRLk=bG-0XeDQt9ZU*>wLsGR*;d^Dp>%aVN%fZQf#F6ke5U8W*Yii*4-%DeUI#FY zex;vopnuNQ{+0A5oXr8uWBkJHIBx_v&D)RCC2GDu8QARq$O_kRt%CVnJI^dFA$_24 z|I@W1^*50 zt|<(V`|~kdon-q{u|J|FjOTfN|EC3+-o_ zemaj|bUjC1xz92<&h-;aE*L_)_*8cBOy_EzPbhjs`oDF4FYWPjq)+Gm4aJX1ALXT! zCw({V=kfLvEZ~0o>FKq{{qAm#e~Pz%a)1{<_4xat zcmIc8`4&+F#BB0jc~?Sz(s*9p6!vf8YOvRzY;1mh3X|uxHQN>Mq^; z{qJ|b=l}ivzpoy(Onyzg^UOZw!>v}Oua`_dJOX?OrVb}+wqJe6&eiv3`1KDC>$>^N zR_>qJKF3w#6W*qe`?>VSC!Ed>44(LKqkQ;$oX&@jC8nC_>EnKY7%O=9vBVF=@bBht z98J70Mz0+wAv5Fo@ybFIz5W{N+uMvP{aP&l;*-Y`zYr^L@7IqezScxvpFnx>_uGNr z@el2X_~*}1-fFDAUEu#7{N4Wf*i(L|*PSN%xu*%=zM(1I2mLVKp1mge`UA|bKTke= zEb+Cb=Qo<(cYH5@FV2hmm7|F(t+Dov9=q*)+A^NU`}5t zeSH7kpQ=3b^M``(Mf)F!&X3tUP<<${*Zumk-EAoo<{ye#_3w zak!WJ>7Q>bCu#Nm_f7B#gMY56-bI7&+WA0U{;I)un#w5~{6E@xlAeFZ;GbwJXV>7L zwDT}M|DM6m{a$1HZy5YHo5o?^;9vTs#{4%8o@>f~VDN8j%74q?-_lgC>mU0~?RWj- zzNY+vk?75)@k|>0Qd7MX2LB)Jd?O!+MT7rWP4HEN|6fhxRyO!oeO_i%FWfQsrq}E6 z2eiWzpVe^-4BvL1Q24J}za0LC!Ef5RP<~$fuEGD_FIqXazj)8!4_bR%AN{1k|Gk|T zmDtpFx<2H3nP0m{|L1SIlYU0|!;k;Y3*}57(j5X#BpT!cU~efO@H{RbSVUYtF#TU5 zANYP;J}~{2Ci(FHCwamC{Z-@zWk!R%!29oSvbWz#Ua-EnykPntHtDDPP4e+(Q~Ix4 zzRW((RzQXakcarbmAqlTe+h(ldB^lf8~>2KbXbp6R02G|Fu)!zlC@Cz1!z=E&9Z-kNoWS{Vw%CKVRbwJHP5b{3FQQZ;a&I z&hMyvGxARO)#Y2K$+tKC{7^eT!rQTA=VcuHq3W4QdvM*(GdTDQg|8a?Ir}}J1LIq} z2A^oMANLHNY=Yk~_^*FP`IeWnZ}8)G{)NMD8hp;$@9+bIU;6ir<=is(zMYTd`4cw2 z2X+pD!(E=7F@4wJf#v^NQ#meAUNigM^G{g*WRu^+<%$0emgfhG$YP$Pm$LjxgI~A#_i{!I z{(_wk68x%;>x997{=YSPGJoEV!Q0GlxBB~9@2T7HLPi=KSm=jWCeu2IWYL|+PNfw&DSl1Kk4K7rs9_zx{j9a`ne=eYrRSHC;Yj={oIh`liIIO zc{!%fO&I*g4esN-Xz;(Vb9EfPYVdz&^OZQG^IJCf-}mvf_U{_}Gv>$jao98X7wlZ7 z)wkO`8vKUy%U{y+_YMBj)}FxTMGh}P*T#NW=iPr-==dq^um9~Z{_~~*{`fcE_l_IcV1_mE-d1mzC zboMPa-i{X&mj8cnzGmZn-rx^5>F-!k||{oEe&M<)z#Li)4c9d>;BP2)q}9>B)Kr(+v`=X1|F9b5hzmj6@cXWz5)?Dq|xe3$YQ$E%wL4-D@09vJ*d zmjga-2LBPG%TT*t_2^GGsVO5?40rSN;Vt8_`+PiT6<5hR!ugLiW0zCEnln9vq^r!1tEcs^Qzka;20GQ#JGs zr;pna+r?|CeDr!TQz~Y|oT)-V(tfIU5ht9#C)mgq%Gt`9N-AHRlJnH{i1gyQLcO{% zol0+HFQQddR`8yncqUa##nV$uOYtPT+mPnL;4y&r=M39rXR)*S4JWEI6Eidb*K+d! zU&OiO(dcRi^of+{XR>dVGSS@R((_2ZC#YAmm2;&^Iy?owR;r~6JUZS7FJH{p@+lsg zUY^Te)q&%=<*8~FQ~SPpww`@!oZvz7Ax=bxrq|-0E3L!#kn>{$A83PX5d$@5AQC%;F? zheno@Awo0N+mPyONX?W|1p_o6-VTm8Ve1@8yZ+7JJ@cb+`MQ5n_1iD+An(78)}IgT zcT8Pe`_<*^8zx_y<)w1jMB=QU$M}ru4;}X4CydXo{+Yq;!5e08B`kkn@b57`zB8%% zMi6L0&Fj4r2LHJ6HRt2!4gLep$Bi#98vJozcQw0b)!@6nerxbugZCOAPt0rk_YLm9 z-{bYJK9P{mf8%zN)mt|BXPV&d2kf-p8CkXb?(h4*pEvu(<%*RvGNy3%54vCPAG^I} z`S&gVcYRg$F)#n7!7rQs;qU{44>h&(mcd_j`0F|j2~)t1H`$}fZ_;ttvGWZNtUVJ3 zf8#4=7Z`le;MaW}-r%bS|6o)8vcWqHPrUpcgAaI|g6Y+}25+9Pj~o0GU(ojK+j*XQ z2ES$Ub$?Oy&b_?$>%iLS@Z@U>|7F7yhwmGF=aSBs!xuL-|3fp4@B@Q4ufvxMn&1Dv z><6nF;Ip|;Jp%gv{#$>h{qXgXFGGJ0-WA!e`+uzca5t7;oxVS3^xbKG6UPg$_mj68 z@yO}>Nn4-v{DHmjpxKKKPa6CkP4EeWmrcL*{EG&Ez6q~a4gPSGK3_KY@g}_9G5B0l zIlBf=`tPqA-t8IuOKv|I{D#55^*=R^!@j|9{dOb#roqoQ(cgi=ztYssTLwR8c7%^Z zqD3Eksj2-P2A^qaXJGI#*Uzo}NrS)P{y~FJ82otCyeu00D^2CEdO5CVS~+EdfBvS8 z!;JEY9fRNWdL3@-BfB>5ftBNY@pCqA4)^tuZ-2Ux|2e9z;WXb2R3ejJ$QQ)JZbPB{TVGM_z9iQ34{Nz!S{Y#;fn?j{Z;>5;j0E8 zvG(l0TiahY_|KSL;O#ju_>CsG)7|^szO(ixZ2a~dKi{Ev(qZr}ql>`%Yw)*O`3~+o+k_}?--bhz8a6{8D>f2ZXSj34fqz4=jt|7-UfS$n?A;6Lho)$;Ee zyzPInaj;8}%2LJZ|N%J2Vp6na^%^x;=vvO`4{O@}Cwq9~z@INxYhvSdi z%PmcK5}18mHaztFNrRVs-NoviF!;XtBR&73!JGZ8s|J6~f2Yp;9%X}n%K4bJf5+gT zGyd;9ibga4k%DW|(tgMXi$YwhQ_mkr+fe`tFgzGLvO{YE2v*WmXz<=->-izb)7oErvz z%*V&*df(t9P5khS2553B%hzXyQv9 z25Ywk_P`iZ;#>Cgu#E%<^J0g-^vD`F?-0{xohwbx;<+6;PKpFFg-Rf z_@3p@TKiot+%Wi;jeZ@zZ}2bLI6M5N!GGG;LmYl!@C&Z*S-rOm{so(N&z~^6;Nw4O z`0R9H@VzE@VDL{j!F}DXy-9C(zrB%b;<(-T_2zr8-hZd~lt29&mhpsABJKWj06Cv% zMLb~q!{0kujm7)<@6&spQ%(7AG{ujsKGFF8PhD(G7anU&H~-!}_pij`ZNCNO#Xqj! zI*j|P;-5#G;sd##D*oYqs`!Wdsp6l`ruSEy()@jvczi@B;(G&}C-0xt5BZ&5ujBpr zc)so3jcMP1b#MjyneYwwU#(#O62AY$6-+DkS-c$;Vd{h2kY)XG;Q-2nk%1bouzxmCk_C4AZU;S%M<$L_;Y6|<|@V)P3 zV|yQMN`DyR6U4^Pe;>!+`mfQx`1pRRX?)&(%ya7XWiW(;7(V`NES{7(4t+PCuSVnb z$-mi{PPoIviv4t(-Pq+ulV9blP0t6Cjrs4E^7VV?LqGEk_bk%>^7!r-O+O<4+Rq$L ze9`p;<737?6Mj7(C|~pS!Sm*C3I3VdJKm0$e^~jm>w8}RbFN>ts+@YlUU)11c=O9R za}WF~Fn*c*jrPP}g+F%uZ|#XVe@y`~juf`vDA2|{Jei-NU<~N*3ycK`ked0vo|4sgw{8D@3t@vZ` zui6uD#UF3pdm@gS4fi|7*jx{N^yAn6BJQ8MY5u8C(m(Z%$bQ`EP(5$VO7pAxr*=$V zTCzARk3aCrf64p;?k95oSZmVPckG2O|D8+IcXti`C%>S4*2~{B_y^sdf7JYm27lK0 zb)u&5eS`m*>%pxG4@`9Z)TbNEPa6Dlzpili`%D=87cGv<{UD15-!Oa9;Vv4RSHw~U~zq954HwJ&y+P`P@9vJ*{ zX6JZ0|GU8#+#hZD^QOTcbpLph9lLFItdD=9RS{*+e<#fH`|s5LiP^(@pH)9jhvok@ zE64o>fx$a$9NaIKG`RZ{4=m1U!r;wufQttIu>036j%U^2Uo$&7SXO*48~j~1UlYRy zH$U>*o8Y$$p7imw{+5ldzv}aD@aqO2uyut4gF7F1hvBEs%dX}BirL9~mjCY?{Ey5} z?fTQ6!Cy50pu=w%{7uX691F%?ot&RePp?mxrmJ&>xvja%sm(N~ax_s&KOP5oZ*Dhx+ zuU{@+u3WBOu3fHQzIyrEZlOOK=Nc-nM8}Ks| z1oHt}`&4J}Y!HkG!RC0dHGXO==zM;xho95EeS<@6_UiM`KYw=N+rAqUu?fFXS zLh8bW&C=rZ_~J`vE-g>Ln95(i{-O4^wpYj65l56NX42()wwTGK5e~AB*r2UcxtJ;z z^M%sdYvuHKxmNl7XRBZOnd_3;roH}_OBNYVCj*kcPQ(Zx-76j|%al9P_`Dzdp zDq}%uJqSujaGWP3`J@e(~AP=ksG-=tCEJ@bqkP{b|(tOi&EEao>&mespCl zD34EWl(r^orTp|pYU@m@x^ZrDc5Y^2X8OJL!uEUX#Vlg9>hlP7n$M%7rA+=p_F8Ij za%pMlh1tdBja0t9ZEO71pg6vks%9CVltyRMsdA7`ReSO6!?z#b0elDX9ZGLtC=m6t zju4;qd?CADFQ#*)e1^d<`Ai{;kr~;{7c&^1SBi*fDwVUvavlL!c&EBn*{r6o<`BSD zL!?=j(Mv(leX1H@ZrX$ME6d~flj5Ho2kn_4c!^2W7zF8JZ9Ldua)VDdR*=kRu49H% z_=DjOf@=PQ<3TO8hCd~Ybe);&$b72%scPG)p1$?!scQGB%&F?>Q`Jt)T-P(KxR)p~ zJc99j7O>|gGlkUFWVw8qt7IK)1g-U)qwNOpvvKQ;ce0qr?M$4(qN`5)Dl`p(hK?GE4D>F2Z zs^rS!sY)fay~bEHiIc-HmpS%j4t}{my@BYibfHwurc3o=Z9P?}X4g~oLT$ZJO4T_2 zow;@F#BVX=*ZVP`a*{j6sRB=4GnyQq?Pqu+5+D~PIQ`PoU)l+HA0>;0qz4Q64u_uA` zTVq%7w>s8?i9x7a&_9~Q)I8fwoSUqq*7E7edahorO;u7GTlwi!C7&t+?>Dzn)1|Gg zQgOOeuI1C`D)~%mduHL{!ou=QskV_%gUoaF!ueFKk}96hu2r(v&Tp4Dvc(q=h_;b` zVWafgW_~VPMm2NWX_Ps)ox$JvQW51`%)W-Vm!{93JrgX|30c}kz3Jsteq}DZ%#v%% z*#g=HYDyJTue{1RY$pq7YpZRSvsJeK+3rlLaxGuXu4jwsY<8<$+YYjoO0g7VB@cK= zHeDl)pplrBUf^=Bh?&OB)vE~0#QbV-rbN&Mh^DOdT;(+N4rvS^{|*fVoz-*-3`H(o zAR%ElGI7rZnQfGUi2|NgWu|gTOwTxw9%u>Ek$YO$uXY!TlZID!{ zb|#CU#BA+s0sJOaoLM+?cIwj14CbY_k-{|9i>1=+Lco~L*ng>Tn<sBWc-+o_AGOdf=}w2`XdJzTD0 zW|#7r3}|#ohB#Qt7dKLc)Y7$78Ek4fg|?S+%lWk|3SG`uHtMz1ay?tc%wHlskF~dD zFpZUt#SMgK`<+-=H$8m(+Dht(EnnskB})c>!iLwO&Y}A(g!5tm?C> zrs@!Dz_-*^8IhKlXUYWP7np3lxLGV+lb~B<0WPEpU-}+!W5m?vAjBZpNVvh4uqq%~ zz6h2BAWA6Vc`Y3aJGHSgm!Cr`Qk9iSyH3rgHd0_C`3t41(vF3~%JfEl zGryRsRI{_i+TsQ#V`VY51ZuAU(SU?&DGV~14A=@JM}FnSe73f{QLhjYm-Em-Qn`&w zIq*QRyjRAql`5IBS6@-C5wv&n)85`@YN!x_PKV+l_lZS#;T5V#5bIf>xV8x#tEZ6P%0t#v zd(gca#1ML|@~E~UYKDmZ)0F%H#$^++#^a}+=sf%K^2JGrve~7j*$XpWRH&r$kTr^x z&jh7HhUiKCN*;B4NBaf_dIuZCSQW&X zE|Cje9~wxP%G-j@R62qu#)BkPALvij&RnSkSp@vel`5q=G%{+TI${irmq*Y=yG8B_ zr=@_YK%csb+Jj1Vy#VQpn`_tgf3>HWEo8T<<1+u$Z0e8^MNC|VGL>8pIGRe=>dO9d zWM`tFmLVakqU!@+Unk~{6LVi@C_OQjYIbKA?#g*#vbck;%I4sXk?J`pXW<>S*$VVJ z+6Tbx5;O?lGzp@R9_mf@4~oJISp()n9)2bZMJ)|N%ACo9oq^F+@-qwblP@n`T$o;(ft&z> zfyul88Ct4tfOSIr<}pD)wuM4wWfq$X@@d{JLdn&;<$7fkcQv5&3UGNtQ1Be})y0hx zSU0t-r4+aj%B!S+b0Mzb&XDa&%CYTAh;COxe7h1N+?5dHu7oIeCB(TaA<|t5vF?hY z-790)t(2AdCE&#w=wEtw4)du+iE5NCA7Rc>b)^=(bMkqMQ>1vyd z!}y2F=`qE)+2W;YR>pBf@RXd8rWO=1-frOv*1}s#=1l(T8Z{gka9}B!YxEZZ zn{%o>iPE}U$-|z8oh$tOw3>8alawH(^>yHGj|d3i@6bbxbB8#s`UzNy&=WcTb`=Jy zv_~=grP(vf=fSu8dV1HDbD!$%Cw2%I?;`aW$vgvNyI8Gb(#L{lzyk_d$PnCjvsEy= zQCEBKVBg@#@QB#U!$WxkPRe5NL70a^Z(`Wx zq4coROw>xHpg`S(S~yT3U4R;F=pX7hI<8P1!0gF}0%*OQ*^|K}%|T`OCj$yw=1v)<=my^bKN7J;5@+CO2N%&qyk(f@xjlCM}ogs!EMPp z4S~0^Xcnx8YN?KWqq4QP+7t22al8yYgd_sY1bRZ~08J>viLE^%pizb-pkET}3UFSL zmtLgBIUeKIV{i)6p{UXzxDII-HuQRWBNrw>|IjML4j|GOw}`W9M2^#a{y`Y~=A5jR z$RD7O0v1qFh64^P9+D0v^{Xw&J&S@B;XrN$>lNWEES>GpdmpQ&xkPhpQONkC+^ zs>!owR+c!ri|~zSE5((i?P4u;{e5-p*`=uto?O`k)=f@b1PZ3spbuW|dHSj6JG(yo z%Bvsx$dxChJSu#`z=$`|yfH;870xTnR1Zk~V#6ee07A|0Mj=mKK( z3mdJ%ZY5^eQm0#e>mh_<-GFCxyD$3k+4bp_2#Z(yzb9RM&(4NxLgJyG$JwOp= zeIZrJhIkgCFy~!TAPaaq&=X1(Wrf`CPVPtdA`qsyi9##|wWm^zv1hC>xyr3bUN2Tt z>)D<~Wn7}8$j*IQv+nYc&IhlYgk82)&nbppZ9f^Dhe94>jdP{aX1yG;O*jOAPGJ(d zDt0bg@|mF4Lx$2Lj+AloORf?b$2?8d{&Y24SU-(C)q&xmk^bS{!I3^O7()&EMbheX zlS|XHvn!#`g7^<*J52;l6}l9W=V_O-i1-fC?vVoYSp)fAq zkN~S|>K{>)0?wmUhLjGyLTpu4C7<5{yU&%d@WZylgAMsy{2v-FI>2ZLA5j5>OiSbXvI%mNl5{khA(*_jAmXhVb zjw3a1K?@N6RaVT~D3NkuwndbBWSC8aIe zXED9gS)H&gGCQKnEcm1gS(%I&{s@LZ>2v9-m}dny9P9Cf;9p;@REU- zKsW=7bEN?5c&er{oP^94GBj{D=Ij=d4Tb@_qFx4+m4U!b0ae6YR5cAu*Xc*f2bp6S z=qZCCRSKx*AGU_vounp<71hN;Han!v91F z5&58ekwu78P-JxMBn)b@>Y#JoSSe~UuD1$_(HpEZBr9hbgi3G)4W{NqL==-#(`U|} zdpQCqm0a)b9qmhw_Kl1V4kl#-^_Y`Vm7J)5R09ppd#jq(zLaF4vk|8VB5xiIkZ8y;1ehY^h>}L zbcv7veO9T9JcC0s~Juo7!4Sd$9@W-f`CQd0xrBruASHL>7eewrbw zR;Y|_Tsn!jJPr`woC9R#1wN(?XdaXabZx47YdKsK5>vDSA0(AC&Kyx%<~dk{y-#w= zlxq6_WFU-Q=qor)_aHolWRVS!Wgcr2qs(V)g^A2f$(Q1bK`)eED$x2yN0NR0eUMYb zL%N1NovMRtgML;ffvH?wJbPhbZuY_pLFYxNl$EQ{@L!}=$lk3ifs0eQeWh7)yh5CUxxE)rV0lwx2#`4Xv%z5u8q2)ThKf&xi^m}3kA7Ct~=aAi!PyE!oH zVn#G|GEn8aVC!7OMScieta*^_R56}s;SGafN`Wq}=u~A5?gfZz7-LdHEs;bxQnjfw)YXBN+Cs-mQ3pQAW15J9AT0^Gff@kq%#@edXt+nEF4Rw(=Bbmx zR6V_U9!nZAHH$K0L4rF%-F#lom}~3=a$@2S<{SHlv^b zF>I%?^20UDl}VVESjz)PpFOj*G9`-5%7RQcf^$OJWZ1JiKIf{%tRNZW(d60Mn@iVYQ5v~9%6A&?9jZLCG zLDb7gbznRoht~-L4dmCiNpUj$1Q|R0{7)jj5&AhnI=kdVpnyWgbh)@&)E(^gVu;2j zq{=jQC`F;Pg$A#*Ui6AgzM6(n3I+w%h`=8>3#2oq-W!fJfZR<_leomt3DB{?Ox{B; z#W`%szzM3r?p4)CXch#gE=f?bdT~I5ur3(oC1r^$(o@qQ6GM-A6=7jUm!yOYY2UR? z_K(c~n!|~ZPt!?Ap{GV#14t6>3UXVA1{}Q)`SdlY-lBtda-teRT>?VLSiS_M1AbSG zYvwj7d5$yG$PCVLS+Nl`OYYSKs$R&$rix44B?i4k;xSDR1iKo6Fw$Ut-3o zy#*>d5k5&KQ^j&{_B0tLq9sbF`-l4m`$m(Hs{=#5qaG}Q_)x(jjRJvEJ$`on(%kaw z`Gv)pSUsEDM&KTJ&v{6oQm%mDyegRwR$*vXHFBSr6-dz-T7I#2!E7eyF3!VE1{d{~ zE=ZCAoh1w|2F3D6l|xXO4|qah|o2d ztuUz}AEnK?^olumfl3IYqJs^Vt5rZ>g7Vf}3BF*AD%~X{>JhYbSS4G=Y9}-s2>wWiKRb6WP#&)Q$+?wUieVfG7XU!p1qcT+NLAG% z4rvy#*;>LG$872o&DRuAG%fK~Y)Yw`ovXbg{|w0n!k7f5tTY&@(AGDof~eX##C5 z(heTaQW3Fl3-ij_7NAZPGhW!38t(x@F{$42 zOiX0tQJ&yf+rEw|%f?mGI@nlzE!_bV(a124RQu-||L;Z&DV+}zYkSl1Y#h19VnF<(&)_sb?8bebPj1Uon zm{UPw5HYk5pgA~t%-FS18sYOEzra$(mkr-1QP))tb7zYnfhwr6Xcc%luR|_S#}y^c zRZkJeh=ilDu$Bdrg$Tkem)063i8ike5w9LoM9RRrCAM&xkWh)FBn6qri!QbzxGeO4 zt|)MSkJJ`hMu@FiHZ318e1yAy;%adfAweQSG26O;CH-~-xB*&4D4HJDQ14J%l#!`ViW%j_c5HaZkLo)gF#J7>fAIJP0z()8G+fY$gfL ztYqpJ&?aP&k;}C(L&Q!2K=zctWg~+Cm6Qe(WJn(ox`JgK3)!@VAGHsOFnHLhF1}2c zNio44MM+>Cjxkod1Y-jy1QlNB5#@GlnF7rLO|S|RRo4!8&q#lAXrO;+uzzG|bO>%& z*$O6Jo)jHt9Z9XIM8s^e+YPP9>6fTfk za4C_f=*R_EHhIPF__%Tf8B0DcacB~V8x_>1)~i@0)RovJ9Tl-?xUk`FRl#s_5;g7t zHYJ!G6=TyQauZl52p4E2bhI+=Co*k`gRpZEGKI!AfY)w4j441wBE_JU2GMM6FA)6 z5&0sV6btN7@@?%=tk5czY4QJaOu!B4e#~ZWCtzX=b|4XF;D)@0D4x_h=9`||O?AL1 z)}ZZR;}W|-d8c8DqIYWkQ&$_+(=gB|wqUL*x*82JNgel7sCmm-r%4QQ2v%Wiuf|ML zdcQ)m6ppWf-ogI9-jTkcQG{{y4rpK;*SCj*%C>eE9*qbti%Vj*0YAo7DO6T!{8$$DAp{Z7MwW`90Ux|3F&XJin*f@FKr&1W z1Xeklt(avX{12f~bi6H5LovdIz>;N&kSq8Cu5jCYw2*D2d!dmebka*q+>4TwirQHT^T4Yq{aN&_y#{GenZcJL0i z{WknlN0%X>3Wt~%t{s-5U<5d01Kkoaus?;0B6JE4D?|yqzncZD8urk&+HmlXdQ+> zH~5H=0d}}0wTP%~e1O0{R4)%=Rsw_S3Wc8a%sia1*BP=45ABw&xdQ*;%v59B)+CiJ zpvA6hhwK`nFdN5LG{sgsFbRk(3;n2M*^JH*QvodsJ!f(5d`;+$wgwgzWS-TNNZyHM zOXrKeTBa*?>gLeJ1CPjTnkW>ffo>jWf_7ndBbMgeh`?-#fur8r&^P$`pCl6<6DNfZ ziR_@oFFe2z0`FyPrN9`i2r#nRP|gT0!Nw>{dhdxg~4k$)L$%Vk7-PW_c1A~L`(+&1PDH#Vmr)sXZ!7 zf3{S$h*=kBJ$o9g%jUo(OmmP!C?5T_f4Lx2YWiD{opA27Dq4NszhY8(1sm~K#^v746S54cuJcYy${1CmxDEX$~6 zP712m)guW?TvRdTQeWhK&vdF7sR@o}!T{K1-_#ajps=?!Y!QcVl)K#Vqc3p_RS|{k z4mt(oE~XnkChV0G{~b05V0q+fI~gYdP?%k}%nG_;qY1b!coyuqaPdXGajsp{1%|!I zA{wxu%J7~3q5k2~;gON#Fa+puZ{O%(FJ!4i`pk$Ii*?bn#xg?OXjnXoI!um9MVWE7 z?xVm89vUXAm3Z_rkPe+H*HI=^w`eJajwG%^qE|)Qp%M#&$oNwhs|e~M{m@~?7LnuS z($r#vTIq``H_&RR2Xj;xmX>W%n*k8cIe10_Ha@8nOTvz?`XeJsFgj7KI8qiO&56Yl z1!{{H3nGPAG>16L;G?^=F!l)8-OzYcpIa`O6JV>gw2@MYmG*y@6>}*}% z`utC7OB6M;s1_1J{b3Od`!#RA8Aa;#AzUl))vg zc^qPKD{>McJbWYj5+i1tH1LpGg;mgE5>ZA8(x@q8R&>FfYyUB|_!{i&xN59%&S(s# z6D9#1B=F8dM<&|$j`WUh98dci%i0w^z=AC6n>aap*E&q~y~Yx8V!L_~{)r)D^!L z>9>cIA;W+q@*Z7{@d)SX1qK>n+(ENEZ$hjM%0zI2^OxYmfe9H9W(rb6ol4#$Ub&y)YbUj8(o0jlsn37~*iq z-sriLH7PRY@EMF0e@L2;?4?4nyISU11=W#o5KPTrS}0F3=rfn+fCFxS%c7 z#4P}4S`D@*)yOLL9x)6S6*&SK0bx$_rJg0U6l?eNRB?Zz%rHWg5ZTRjXG}cS)6=?$ z2+eI}W*Vz$xpmlF4dzlOd92KS7xtBJ)Yp2@!_&D^_h!C!nqO!;m3+DykM;|&7ZArF zU~V&A7WpTRTrPg9Yfjf>b(@wqUX?`RfLfQbl)&gL`XEp12%)d$PUChJ3wd|gn}q7j)LVad&e>?~kq z4Wb~#N_Ydz|ENkF<7L8!^u>va1a5A@C6SP?mazd``DLV1c%6dK;qtFybXaV)o+;&Y z?-yGv>(1drUjY%9yLne=KIp~(=hWia)yhFAY$HTNBsD?=Yw$(U!NN04^iE2gGBs1ipzmrb9NUUE)uu>S_{8#Tt)0k+~~UDq1n=lgtx+`W^hTaTvMU5&UldzbAJ8%iK zS67B4+FI$6ZC3p=Tn9qh6y@r54XLY1v(eoQ;ZyA>NI?B- z>Xb9>H)3Jv4arvF=OK}bgdjS10r*3BMI>-JZus_I6ura84On_o^WKdq{zi_8+ zYy{S~Ah(>6aW5Kvpfa{+8Fnl}Fj$#r#W9f}=3r=V>MAIXI|$b`7y}cn!_y!LBsi79 zRt$DW$FO`R$IIb&Lm8Q#$za)o4v*lKS252JQF7Bv5!Ab2#j#}9%RHJ()f~^qG$cJeyS)7?I`i76mG@%cMs+&sL@bR4l z52l%sXXtExt%B&VF!lgrCwtD-cycXKg6YupaJfNv_7vCDR4&PalIV+w8meh*n{e*a z(^;&^RiJd7#$Ft*!PDQ>H!{%I3%ADrT*&yB#AeWek%58HVfaFL!U~Y_991iiq3Raa zA}$MAK*aOq4#M_0X0*hxl{oiE!e$mPje=TOR6Lchq$xKK<@WXz0>K;5Sy* zVWUCMime!gxMd!z8Z4dRP+f^e3UPhF22i1vNI>P$z@EjJvRcby`HFrq*(mF|y7Bn_PGdSTI z=m*WFIZ9>9Hy+5QVtE(RoWZc<_RZS>lwW{{0wMXnQ8tH2MY+glu>NY?gY7Z_o;30$9bCt_BL*A}+L2=gARmx(jCc;TH4*n9-`0RxS8YlfKj)2IK;pKBnAF#tr#8uJg*(7tI=D8VS z7nFlka1jK45d~pGE#z7(YD`MU(L>_*ks*@ZI#8hC{>2F+r%q9iU`u6VD~{B=&7)vj zXd~AZwJwod;{72CfsKO6OOg_W!h%aJ5I@T>sT-Y(v|kZs8`I2GJEr>>eK8?sVYb2< zaD;`Jt`Z&y7cL#waJAxSVUSGq6ff(?2AdnN}Vxk|$dK%6VYI3T6Vr`X+k}3D{ z$TQ8rvl`7j2d5-a(;p^^aD34u?r93ixPNf4Zy1U@*MX9QN$g`C1!$#49XVRVI6==j zC?*SVq=uN_>R2`86?b4qx;`D|nAbhUcVZ`|g_+Cc4mrS2i0E8;!-xR|5r%|_AZ0Ev zSNw>M9*Bo?kOXojiy$e7whTW(5M_s}pD3aqD>(DTwonl(WeK4vI5*~{7TyPbnSrGy+glrz zNpM2lzQL71R}(XE^YB2QNL?h6bAhG?0%}~Bmo^fO!nVly^x|k<6m2bT!+luCm)NJ+RxyYc8rNWKO-CrqFF|{(23Mu_l5KZ-OtoMtQKj(L^_;ifwLy^*e^gq$wxA^ zEm^t@W(EMbf|VYL(kz? zI^eQUjtmzHlqOoz8u$YK0R*e!NUr7+E0_aDp1bd;7c@lK^7I7kTZNCGyowBgHUXTA zdHiSuWSsf0gU&vjz&kL2vpuj)18$;z`Z3AT`}+}pIAW)XfqG^yoI|`gR7zTu=0jJj z5qK{fHzXQS(QCz~W`!(rMON3$>xITd);}aP%>9(^07je>G<&MLPsF)5M@oLnqPv$q zK*rvyrq z{DQ|Orcj8C<{Yf*?htZd_3??Guijp$ZUk-p(%AC_-%B3D1M4-VLgN>KNdMbf0O@fVL3 zL;MvFduOJa+yoF*vXc>}VBA-L10izrV41pJ4Yfg!hv1l#0b8V46tLu6hZZn4eaLZc zRK3ZCVCr00UYWUYX=UotEH~SoQFDT05bez5XaN&#aoL!+s_4|5fMFD^;Y5o(1k(^V z2cA>Q31w!Oi{vl9y7&^0q4QXn>kh0Aho51Un*?Nmin)hhPsoz-O0Y7cW^8@FqRzb8TC)l4S#VGVKU2oIO}H+YxCH<$SoLfk( z#!ezvuOQoPR!bQ71kQJj=Nsb0ImBh_9dvYy2T_lnIqo9b)c~c4;KPtDOtd;8d;u8< z&mTom7gQ+QMQBfLUr?WdF#Wjbc4px?q>B1okqFKWdU980%#lh)Y|=V@j@2CmuC|g7 zY_TUaImF7=rP~I>1MCMLKHF6xstyMInrL6X21=3!E73(>DuY$*D#sQKQl)4rj0M)X zk6xT*1AAf^QJJ#M0q#od$j3QSi1)$*8%_w;kS^?l7#YC{!Hn?2wg;}dAsh_nq(U|! zC>|=JMv1INy2N57YifQJTpQY(V2fqMJz#~XlX2x z;6m`cKw|)}b1tf)4g}O7$nGZXK<^hJ6h&qITc z2oE|&$iYm^DItXxwGk9LzKMSn^cvuUoWGO8K+#21z?PdEG~F>EPZ1`1Kn8uqus-U_Bh+V=T0r$Wkdw| zKnX3t48uTc#)~qbZ<$e*2a(VoY=B`*3A=KDU|udQyL_MlQT~Q8QyMX)UJ>l8hx63t zxe0H~0&?o4a_Si=z_GGJKYio}XIu(xD)OxmbDUSYyuGWwe>XNr6y-Be$F#4n15c=R zghwS7Ni(y*g8Xs19B(Ok_jJKc_szb7`;qHD5C8B5p>us|W zO0v67&t0?uJz@dqjvsd_rcdhuQZzfLI#RobFIa~UQUp z7*3@MnU+`$cNv~o;baLy=b;ONq%M4r_8FIiLBWbk7zhdD`1-nSsO#KGhdBo=Rwe<$ zB(BH!A`>TvXe%yM&<7@H8Oa_Tp{l3W-o^0>m!EKJtRqGSkk1^X-8p~GRmo=AgGxj6 zyOV}QpNB@sHk|fpM>z-?xDuyPfH+x%3r|}fI)l<}`%}1RZMXnG5$rUa!(n@w6fsL{ z_?-yGwfP1o=s|iQ$vS;Fxinos&?qdt$-EyLmXLuL6H$cDm%>S){b0@=Q4%N%^soR^ zH9}0s9)xvK-sFb>Lb(8af-6Wg0}=A8!G)^hS^W|t5JRufQKF=bLxaQK3kzmD&5Gqb ztEZVX7TPIx1MQ3IuZRc49r9NQNWuEEoHV#G!Nd}33lgm$9i+bEvWF-Yj)e4_nzkTx zB=~G$9Ztyb><)DHE(kdp?i*SzVS3fBCmYcvgY0$veK|Pm@PiTT>1wlmf18&~5Bn88 z&d;h8PNcg5V*?9>VTl?6Bhb7&QQeEW@1RQ^?Y4o>4tilq!KTFx# zN%DDemw{mi1T6{D>4X9Qwg~>0UayX7G3<|)>k84 zYF7>ZVvvR(%Mg6iH;KutRv{e8{vc9tDSkpG%wPV22F8VEU7wc2B(Yy48NLAjIMUJf z5y6YhYd8yK4iOvjBZIP?OE5IrQOXm)1=QOx4O@`V+}Dbs=BW-m2N4`ieRR;H^<-6( zZj2(JQHWqyk_qE!={~}qkNCv;wht7FZ673`80kaA>e21;iZ2g@Tur^a-4gx4N;c7C z=W>`PFkrUMw+`H8F2XmAf-s^y*Vl+A40ty*6C%2UvcsctqQi~C6KLo!5*{HxiG8~t zQdp&`C_LN2_LU2Z!fqLBT9Yy7D9(3D%vj!|vGf2PSutIdFh6{=(V;)n|hc zItzmxPLtbCz@*|Y((*4M2ca-TT9L>LF67@)3vG*Z88lQ@_JJZLZ0F!I33)aS&k@T! z7Mtr;ZpUTUDHs(!`g7bvz(S>nCAnlwh4ZqG+F@hv7pAi zfSuuf+Nv4Ha#)Uf(g%~FCq@qQx|0-PFaiTO=?Fh1t~q#zLt!GqA=(?Y#2q!F>8qRo z7Wv-M6n=sf@jPmF+zI_4fWICFHrPNM2r-5X>tO{0Vf2UL#Qh-qPkDAJ^c3~aQ4Hq+s;GD;w- zc()zUjs@1ORCg6e{IOe^V3mr{DyNUjT*9K{q#eAV(GfC=Y{l0_>jrEFOWHFOm@mRR$_SCWX*P^1r@KiaQeyJhkQIgySdbtOd~md##3I73 zZqpBNl+lI{UFa?2blhf`-3b?<#7%Ju;s~K$AX>`K)`7})W*H7Y!xF!orbXi9(8EcG z5Hq@0utxrTr2REh3)X1t4OZxf7M#|dIGz;ER&1|lKsIW4J<|}mg_su}_oB!xr|=<0 zlumq_o8f@3-6b}ZTQ4~{cRXK{(RF&tn3$wMsA#XML;;DDUk)Wz;~wK;zk<}=_e?O# z-7K`M-aCT6&w1cM>C+$bq&1}uw%#>9hID~~gQs|6@K z?saV9RahVvrMO2lEBwxQ9yr;c_2_Rbh=L`dEU?Ki0w@N30_lU{YD6V}t3cIK#EEnF zgc`5mqNvY7JT5ErVZda9m?Ya$rU;^G+Q-Bgt|)HAL;f>SU=S4a6NWw-nm=RllpP>UsRejqrsq?$6f3 z+mi^;!|nlY0vb#XVJ#O6_*j|8K7rnT9GrvmP;f5F2!GzC55K;QKt3F#(}(p99Ir6i z&j=7i_Vo|+V*v!aKqVv)o7wuXmk8&RAuwv1dWn0P*VpBUQzmIvgTxT@FvSM|F4J$C&EdQE>q2Obo7 zFs|2INxde2{FuP^enPJ|KdaaB_q1vg)0QuBT+#=2z0srT#M||{cjbgUzh&3Gi<%A= z^g8jfUiW78dgHzJ{DNLPF6;H+1-(uz>UD2MujNa6y|tv*{TKCmMA z<^@gff1AFydr8x)R_~3sTRE2AeMHkYzFXUS@TOkNtJ>e)*R-7SKWUME?A!Qt3^a5gE#b=wD#Zp6)i7$ua)EDZ}`x$qwung>yBL$Kc?j_{=Qy!{y?w0 zPicS3X{~4RtI8)P{+(X;Zs>L2;K6~WZywcoocKR2-*@OW`TKg^wfBP`)AZ_}7~J0P z_*Uhoi~UCh9}~lRoj9-8gIT>UPV4p7gWArWkJ|H$UX%Y&ud6>`>Gk`hyv2`c`N=g+ z@7ncdPSeQ^z216Fud5%@YsW|QTE1$}AJOZLL6rwL7xa4TY2&X?>NW8(z1}LeN&Wmo zp8h1heox-c`{VfX!+XjH$_(DS4B@@Y1&8w)@A>7&^Z2_g+so&bbu*8{{GRpkp5^&H z>!Lg&+~pPT3Fp_}rR?H8%l3D9^?R1-?QwbLUuCe|?+@V>yRV3Gdndhw$Y+^H6^Co^2q2_tJj+3E_Zw{$rL$ z@&ibCyia_WAHrEzXY8KucsZnI&*S$@^TR94`*xKA46jaXPZy7M{wrzcm1AMzi0l3EswOp?)i?_%kr7_a(KgM9Qy|h z&O8J%56kp-nI_QTUN8G{7=H*S%==Dw0tihwzlZRLWw~BPnADZj=W=iTWxeq-A48h? zS-!VN<{}0^Vr^i(-Uh)9>kG^GIpRIb;g`7VWqO}j7t8nhoG!f$eBk$v&n%N)!r2CX zJr6k->%cS%eiP0w>BZql3XEm&Wx`#TWnRMLcVHsvAk!UoNwMsA1y!2dEDUai;tm!*$%=VTSc|oj zZ6k3I&i1$N$MOT}@3w&H^PY7%jPG)sJuK9UCT>2wJPRkIc#6_?h(0Xz29K%Wd0LC zMCOq)@4rv(WgP5Xfm`31kA-@EFI(U?&eBH+RKi$4KfITI**(idkzrj&498fnmnrxV zOZ#}Te3tC_T8`?NFn^oj3Gd@&B@V^t0@TTOwO=|W(q;f1-hzj`XE`mIjNEgaiNS=& zzbxm_{aPmT-w$TQ=h99a6MZ)}Cf0Z6;TSQ$w8zGcZTEQ>Jb@|Wb$Z`fSLcI;u=Y{sG`c@#d8ChtRVknMYpUcZ*3d3aC#jn5SRu-vmRPHQqg$iO_( zN5gIAcN`%6*ioG$X~Qcz&QfN}1M)84PqdKpSvim-yk{QoyOeKZE9F}s*#{ptnHL*R z=6Td`M&5-9!{Q7;oorfNJD17(9ea*wZAHzS--)gug?QGFDa4rs| zV)^kB^Gll_R)+!g7k&t5TjFi=Hn6T1D1XeuF`=Hrdw%)hRmT6w{cMe9XiC`uH=QXjM9rGVw4h zAEq?#*=E-frTs_|&N2_70^ajW2(K)MUOR_-d)UV#_Ac*fQ!o$j?=^iu%E#b2{E*EZ z;nV{O7hH;!f6REMjCor$=7(bKaXo}>qb1LBWK0atr9LZP@WI+C^`h0@o;IUX$@AEw z0%x9&z(q`)~%VHkF9gFyqEV|4@LPc58Ih&>3}q|b|U5PVnADYFa5Q)$(TRy5Yb*kPiajepcHpnSY8xmO&B$|QYxnLaNvRv1KY z!;vGga@YaX^-i`2ALe0x(wE;OgVZJc0)KP3&z+1Xn(O5s1L5&r@Ta9s?q%Gbd{XXN zA1n1dUXHZ$D76^H&p4bku^$+$6{Xl;@CWxel9yzhOE+kC|5 zOhX=pBLjveIl_VbEI<}pRYs06KKQo!!i^PAACs4L;4VqID)_ZVcxTyl+nC$ z4C8G$0%M7J*x!d9i0V3I_{?XCmWUs6QawM^jeXwR+zFiblr@A4z1uuWo=5dv&XMB= z+rkzxzs%jSqiCtxxDIC@A9+N}WWIPC9!H0npEmkuT7N|N81vkZ4mq4}c=^sN*x&eA zk!LZF_JtCjwaXuo5ga%Apa|D7S6X8oz%juG!pT{fhw%8l)3xSTT(Z7P+xQNqLhgmX zLH8z1#snF?Oe(CB7tb*MaxeLeN3neLD{Rl9wUp#xT|VZLAMY}+$`>t%WAgZ+N5i_P zyD~5P1;PyF4hLMy0GuD*OPh_iX!#H-fYVp;nZ%ETd5#>8%1^XvJ9V73F6r;#IDdFR z(1$@JH0&#iI{Kt$hN&A6( zgtOi_zM*q1%q#Rboap5kOI^77hiNGT$~M~+dyZCXn$L+(xJ1tn9|d+s C%pTlU^ z@e`FN#YtMqGqmP&&Ds&ZFX^|xt*g`Cm-eA`-hMv6KLMlJp0n?Xdr9qDAJc;Cmga-U zAAdY-KkH1iP-4Z}2U7O2mHKVD-upwn!1GIcfVZBOx`>SUFu(8s8sL`J_D8zCJZRB% zLFSk7XopwGEG8~V#w&US=^PNP?y~n6~@t$Ag5Bn?a zi?x^aVfdTd6V@-!NuXAiG!*(KUtrn1#@oaEs4c8dpGRrF4{VbL`TJU0Y`jh!qN$;6 zXL-%}wK?)!#tYNKE6d|RoIDA|#nOT=iNxw^EREX^Z$ICGlZb!A@^p5h`sJZL=lDU^ zgzaa&$E?F%|Dj*}#V>x*@)H&xAF1#7J@4}NvOJV{glkxQ#`aFe=0|R=06yn?ZEd*>VtRzY~CrQfmkF-`o&MapL$(DTu^S(^177V3;WPaGEB#=NZGx+m{TK`nxAlIA!v z13%0!&yTml3XGNaj{EMX{=nywzg1L}`?PdD_3-M3ui|Cmx`Pg@V zt2DshM=L`7)%uhHMD<7Y*>mY9pR?iF7P}_p%>MOaF28^5y+Q$LMmG=Q8q#g8)fMvmA;S=JWO-FSAGa z6Hl;ONi)y=t@M0F`T2|=KI3@%hiQ2c?2A`V$MMQ@r!k{{66ae(^?*G@ZtM}v9UC4Jk9sneote7L;^F-e)xy)DrXd| z3+q4HdiXH&d47_Em&dDr_?+KF$2~3gf&qAY+k{I;X}AvL6)#V@gT5Q$2y*!Q^pEr7 z`K3DmG0ptKzhnIcy-BzHdE(*L<40ldFim_vQpc|~ysqVwEa1j7s_@2&}ydI8MTWq|TANj)hV*ScZW98}V;rrfVmaq7% zf5ZM*hvM}U#Qrc|0-u&Y2Y~sdK28|Y%rA;2GvMp*a}4-pezx}roJ)LrzOAP zyD(%v7kOd&G|S_BP9`SsSKntnQoXfD_+85b5|GLKYQH>jE4Zck74ua?VcqmI`iJ>B z5|rKidV5g=$yd^ZS$D&9VsLmoIT)4y@WWcGm&aaHUh-YSju?T3d9BJn`M%f3arEahnU-Jh%R0>b z9REZjl~~1J=I48S%p0be|30d(_|LS^!|}GGoam^%M`T|4oO1wsfz6ZroIfT!&GHh5 zG5pBP_Z3sMp74E`Q{)j$^P6Zpd58*Bl>Z*B2anVj)becNSRR{N*p!m_0O zM~@tKzr6dB_!^(H4xpzjd@!x;ZEI;o|D*cx03Xi}>^s6|O!J#ib}IKmPoj~=-%m1^ zJeP*@5Be9Y?>Ip$Q`@f`mCuD9j^A@}$?hc|4Hn$+8S9hLM|n)ke4`+L&iwx2bD^JL zzvbtCE|C13Cz*d-{e3pB<=zuf`smU7XaMs$znF}cRd^72&+-L(@P}y`kK@Uf-rnP3 z{uca(ANJl#ntkM&3Y~$>&-N0#*$1ZiJ(T9h?wg*o{o1G2FhBH_6Ze-iKi|JsKVkXs z&q0Ib3ZA~p`6iELTIRd;=zSC@O!IpJ`aE&i^J6dt!I>i2bLow} zFV7FdzxMDukuy?~FFuj8*JdVOe|RKv84XX~M7-*JzQx10i1bl?1Y3BE353sz?@=hdPAUR8Wh!~b% zo;yDyob9vu!=1iQ`9S98&tvt;`zk-Qt=_&#R$%XQ{2#zSf1g((13x}qiR1U&+j9J= z5r3bu_W{fnpKE@OaEqi_KO1?XL+j-D>l|o%dC$*;&w4Q6I)9><3}iH+jH6tV0HBarvEXtw#fg zu}u$QtHVRe<|Uuh3#(E-{||d_0wzaQwtt_VnIw~BLYjoYge{d2VAz}0VbN4VgaJWX zAUcR>gMuRnGy*azIu+JIMVmz&k)=e00k>9B<4PeeCBqEaUe$IVY zcTW=%|L^yG@B3cY-;+Fj&hNRObL!NoQ%iSM_dsvd4PAGC@5tLPl+QY9XD>fc@-;dE zwq$iVrWT1LpT+qRww+NvKXTo(Iy>gtJ7BKcJS+IbmfP3O#=J3pxtVi1aBj6^aT*tt z{E&K|+6&?IDXYuQ@nn~+?+$kDq+vCmwKB&}S9XFyGM}Fi_(Z9DTGvvW6H}KPz{5D} zC)62-|MG{&tVhY_s;%$bMxt-ZSfMdnkS)hH@80T*)%9!H9rP_ZrEBS8?3m`WSZ*}D z0-AMg-{m_!i__S1_yHEjV}X5kZAYtSd;apyI)#+Q*)ce;qk*+&W56wIQH-+(Okj)rSD3W?X-GV7M$Sgw6J{W!hj`ob}JgvuE<2X@xSmeavt?|9qblyR`Qw23Y@Ao)pC1dwW!rK(dS&}S7H4}RKMikP z2JcrOtg#H|Lf>BIvoW0Qk8YgB#=g{b**71%A5R6pw7GqoTcfqTZY0ztrInrJRrRV~8tdw4bvJW{dM<5GC>Gcy}(}ack4(^1WDxj*fX-d!Jw5 ztzUWUijG-ZZ*%bW-skt3Y_QPHtUcQm_$HA3Xr7~%V~O0?TIZUrueHT7*xb(q-+%c0 zg)ef8v1I<{xx$EJV(aF2LA_Xeyq25MZO>2GC}qo7&25*hhY8vGX8VWvY!9$)+vtS%aozkj>Tpq# zTU_Yx>e<%%r*pu}dS`dtmcsoHZ8wu2tLC}K)_%(Nz|>^_tghd_K7ubT;|xdOofgNw zL>F}(zcScmaUY)SV4KzwP9Z*7IbgBz+N?YMw4Dxn`Tdu5&GGl;HCBF%t#OO9`q^rr z;5i#VTMHW_%Wb|nSHgInjDNg#G|lQWv1H@y``x)i{NZ@~);I|ImcnO#KPo{Xzr}+2 zxMT|YZ6D42c;D(1_DH{GnID(0b|}UflqXU1+j1=qNv~|DbzNH9F+X<`TUP**wd1$L za<}~Cm*uAAX3sn#l-~wuL(8@PZ?laWz^-BAWb>Z;gFpE<`eSX|e)kgmI|82?E=SpF znxFe#7wR5{F~Q|31Z&5%M(Zk@&-!Z09(eL-F>*W3Wy@`hTel4#{WkuKkQU}ji%wp+ z5GA&qUB6=)`R+A0qWD^8_TUX5^G}G*@`E{&7_ioI&F>1C< zE3pX_lq^2`JQv?o@E4#z#)fV6_qcnU+t-ff^f#~10^f?gwk#Km;T*Kjzihd-Uu8>2 zC;WV|cwLK!tEMeqHSJLUztIj_ICf`O^#854#b?JSV|PgoPkhm@{rz?Jem)xtTdwAt z9UXlY^R%=x;9Q7qVP&0R-HyTKW$s+d#p`H``Go@Y`Il{hTR5 zjj!P!-Bsx`NNv36|U&d=FW@DX<|pUZ=6F4{Qzk3s!AeUyhwp8p{W<<~DlHvnNNWSrw2`vqW$jy^uq0eeci}+5_jlGG8+fiQ^G3YQ z=NZ@nKA+*=@3S9hVfw|GSy$x7bNT66KW((P#NDq#@BVH-%s6X@TRV$kK}TS> zV%9&Sam5 z!5Lr(;IQUxTc6>EaQ~r%e|?R0x8-HW1=I*#68dGp?aw#OeaJ=urp}q)j|&#y2S%e~ z^|IyRU4`4Z<92L|9F{TDUmuxf`*@aY`4P-k*2-F5(Vpsc$2<3O=Zb^Ute;rSNBw@v zS9F=jQ`@g??5AuE_^i9xJcR7yeJEb6P5`qseI`CrHuKkC94~H`F1Iwdd+vp#@yWxxc`((*4yP>i+3& zaku2G9yMFX*|;yhP43{_`rJrvnb%CWt)IiS7q{0OPucR0>6+1nN3FWBg4is%uDM-@ zcV%tP!I31)9qo?7zbx6hXV)oq%L)I{9+QoiwgXnPjFp|P^^JUh&0TEv)_Is6L>jtn zOE_(6GS26Is`~BGJa=KOa~PTqY!0rZ*EP+2dlt~S+&(kqs9XP3AEhYgO2~R``tVF+ znoY-SCt)w(P_pBO9V0At z4JF*p_WOnniuJ)~w(2b6^Fz)(JI>oUwkOkl`#zxkh5Jc%eeZ{a!-84JeaXhYv29Vd z5{#kpzKM8x=1Li&)xFwjqzjBN7i`_2y z0uHrr!pydPxp^+dbhH`CRffXzDaU^&cYynl8%NKBTwq^;nHfU2sa{@TfBvE{I= zKbh{jaW@;fO?;+j{kdw&HAl9w(T}C*y!B7(kLEC&wi@nu|8U0^!ySu;JGzGb^Fi78 z2G(da;#RL7ak+HFIhge?(@nON$gFH*k40sl4dF{HJc;5JpGes&&+Rtdukrt`!cz`c zVb8XIe!9TR7+$+}%)MytWpf{!`^~xc&%GFrgxWapGj^M&HeVVk^2=WCTE$=QiDnu|5M+1=cAGseocz0SL+ zg>8<(!}w!JF&cS?Z*$sz?limDLX>RG`NSH=GIJug_B0Q?8z0zrY~kPKV*BD2`nLW* z+uOZSueAj_u}Gh+J?$en!sesgwh?Z;>rBz7AY?W!J76-uULm9F^cNeVCNZou(A7pF5{oK|=^BTRw zqVWpeBImZvx&3nPK84%dwOEWluFP%Z7k2)dtQT6Va8Y#WQyb$N%)D?4cU zNr3VSe>CrKM{so-$KZL0up3Y|CN>5U%-XSJIj>`Fh7RBg?M!zn*6zh_74n=r-MzuR zvGa{BaS^_VQtSG&`v+=JA48d;tRwoIKv7dy9Ox0{Bw z=(a=cVqTQ{4u(D)0lx2cF7pYS2MJ!Hzy{6FX{`^iEB9FLG4%ad^zJnGN6=+C{H~H! zMn{(*-u9yn?YJ#IKdN@UvNtSC9KVXtmfTF%<_;NF>;v}5UIKI35ePb7Jo;l}cDyp( zZzF8jtlxyP_SaW->*+Y|9jQ`g&kffsCKIoE8QI^F#uAML0I9=yU|K5x3BkUClIKEj=L#ygvfZYKg+mpD@+B`Z6M+5st z)={`xUg=-0l$rVLA8R(+2P1VQ%dp|`Vsi~IoZwcp#UbmnvL!#6{IYG6xhw4DN_+7> zEBIqWcJ9mJ2(-F`=bq)r7h4&j^D%(4Z4i;{m}AF@3+E5dFV7F#|8<6)OMHJes)xst`80sJ5J6A9CaP3&O>pK=`m za=ao4uV{9f_jLGI$5(%h@WbOSau>TtSO0eP>U0EbC+j%?MveE9L6TaOcW0jDk6BFdFZKzRwwmL0&B z!1l2`v<(A8W6xi3+SxkhgF<1R%>L)5-{ZRO$#vm1${I!h zdR?&h2DWJ151QBR0IW#Jb<*Vnd_9qW|H~@{u%*bxkIy7&&CS~r*ejCllX@>=a}}4r zk-1$Z=W4lpE!SJijf}ZvH@K1Ob7x=gF1Q{Aclh)(;17Lq^GAh#`H z=Zx%g4r{IJUYGki?4cjK+%vE*!@gqq11@(1@@-*XuVW1p*w+vP|3eSE+{3Vktej~z z=twr+EyrwgAq6nV7$wWLbv@H^^|{zW%FKzAzmY|QI7wPFIJ0Ey@#+jVoJSjSqltz; zS8A3!Fq}c7LbGg#!`5SFJ{xuAS!1Jqz|pw!OHj{3Ot&1%jh*wiaeaOfd=?rhw|$GJ zPZTzmHs3_bDAknlVu3nnUG24I4)802QBkfOGe6@F;e522Hp|Riy_&?l22WBG_e$EwQZ*gy~o;# zShCL&c9N6LS8N$~*~{m$mySsW*;lfvlo1wvxDF1^bfXoqmSJK_Hu+?g6<=5 zX2c78_{1HL0Cz<8f)c7D*>!EpwTky;FE}2yB)|SRMqWan&pJIRE(`Fw!3m5!!5`B> zeij@-=K$6NX@JE2|L6>Sp7`qqm-<@fK`F4eMLuDf$FT&TN?4_ujf!1yBr0_`N>IFS zYi!AaN*#?-=<9K5HuqML+g_uL^Q{Hn!#tL*g2n?e_%I47kDuvKp@%VW(!(=~1w|Y_ zj8$UTnyf#|TOFH6zBw!~E3D4s#aTfSHuaP+0CokRnqtG0;^$=W3iF+66iVj7v}TVG z-7K(CJAb{%f|`l5$$vV`r_61tLH2%ZYM-M`pI@q50$@93xx>9b>BM^(=vnUE3tVJ9 z#Aja2XSh<!@`EdWf#!Ah@dsdw~UISms3bwpP zFn>N99{%or7HGL$C+*wfuzE@XZY}uYVteg!mPJ?&oq>%qmkLL~YnT8Y^q)Jpn^i#( zZ~G!Y5Z$B!X5Eo%U4zI+;y#~GkqsU{k37mdnlDkKR#xif3`R(ExJ$h3g0EyBeEW2A zqtv`Ud+n^I$|$@OvK8=+|QsjKiBgtFF;TpQ|Xy| z*UvS7YuTol#cLxcEgfl;(TuNaZCkQ;(0fN7KQcI+GuM7SZIh#0M=1h zBeUa2u|ZY{8&txo+972w54+8hk4Q}Q$sb>h>Y*`9_Ub3oN|gAHB5agapyb85=3{BO z7G1X<;6IvkMW{@*Mv0%x9F_@L?i+C!Z4~?|Z%To^@-aBuaf$d%gCz5?fD>XN^RR$Z zq6PbN;go`%74bbtTl&sf0q0G87LL@?S3^rSkL|Oa)`ZSlD%p$5R&*T&yp*iuwr}xo z@7vZ9mSrDBbRX2(rPi`-8Afd1(rvtLXh}Tdm;-+(qp{#L*MS+K zwEc$GFB2^f>;?U_6xs-N;uUGdbIRUrF^KoCC?i*S<#Wmw=-X_xKVXwq%krYiMO(wH z4*`^xa+k`>V{}MmUso?S2D*}Ix(it#u3xj_tY&fRe8bz_^!9W$yfd3#D{8y6c&}&% zV5$CkA+p1Jk`=$*47j6NY-yo8*H{|rWu0uU0!ulc**dOjmzo^56@7QZl?`urUbA?9 zqgZV5`l4T!P4S||M2qa>9u;#aTC2mbX0f{r%+uX0c3Bboa)iCESx?}_zl z>U)UDuLs=hI6g5%87cCdXP&d%8W7uHcpb+9pW~V^uv*B;+bZv7j(0%bA90K0eD1m| zK5XQ?sw|05R=(1LkdXWMmGhP3y`A|_l^;dV)*utnMH$;Wc%PUDB4u`c{@SUocCw#t zZzQ|Z)<|fv72%JlWsCGgkdkX{Eq6&v_1w}Ha6Plwl7H>ddA`LJ_;PEFtSeM(RIu%p zTKm)VLYxAwD}t+;?6cFCH<6`mqP13S>8pQ($*yeXB2@8RWYIUkt5)xADbBI}@^n7O zK1BA#L;S_Aid`L9U-2DO`xwT~)^qGW42yeYZ}4$_)>`xnZF{j5Q_ot8H`q)LY_hvA z+Y5^~G>Z?l7mZzy9}#Ye$b0O?K4Ut)L0Mr&l9eo`i?^D=dXtuwMgeuNMiWpRG#jhSQ= zHYN3wjtH53y!Qn0-+pcFN6R#iY_e=RJ#SdlIxg+)B<+qV98IC;!p2%w^aeY>LFaRu zZ}C_So1Yi9_@1}e*h)ifA>ycQq@TlW_3YB5Wan2)xIL^C`y8xc$hdv&vipFl<`NWa zqxiUb=52B)SEk!r>*-p$-H>LAl`rGrsznc|w59$I0Czk>f;PYRH8vDQ^R?`mZ8b9VQEgW^@=fUqePLGZ`ErJ75Eazw%LYq6A2DS) z8)z7@S+#~LU)XSNjT4cdjd zQkWH*`377~(MmP~?fsB%%BX0h8kMufw(e`0uMy<%n7ts&feqhEz@9BaOTB-y82+1a z&k1WCR*BYD%i6RQTWkOOQLVM~Mq#SUSzA*RKe3(a3#TH;{}_Cmw>_%9?B8jtzAU?6 z+}d1wTez#dfzfD-!tLFEqb)>zpmmEExZJk3;9U4`Ma^gRO}u9Bi+mU_AU9BBN?Xqx zwQp-pJ1=c8O=)YRQGx0w8*Im%t!-^QD%)W-s2gapwXKauWjo084#bpxZ9FPFzC7+(z*0wet6|k*DO>QV_ z&WTM#v@8*sBC&YPncaUZn`Z+ZQwZ9(yVoB(`{u@ znqC{(*ez{sJStKrHnOo>+S+(j$hHzSxxuV4UYm#tSbJj|yV9UC8r zwl@!4`g33HPist@J_Elf+B0Xfx%qkX7i_sz@4~IO*>=0_7cE)3^DevZe?b3%hb&vZ z;;>^@4W9F+^GDxv)3<&)`Q&;x+}X8g?&7&S=63AbIk!(fTyn&`V(!@7Dtvc%)q+*4 zPRgH|JGbZjj<@74&0RZVY{uBgWM{hU*STk>J-c{)=lW&q*Slvs@klv-r4WB3XJ*vp z@LZEywJHZ&09)lw!sox2exTQltsilB-r3=v&B50Dktsc$4-mct=>(&F1Xc)d<;H(s}8MNyLeXp*dOg; z`Low7wFiXUnGb&M%m+~@cP%MKxZt|;&a1uf?0N>^zU;u&$DU`sL|OoSC6e{d(jw=x z_59miF1*_J!F;w{OSWuFn|Jke=(8w4d9akmf72P=e9h`-o~#{aQJ(+J#a}7 z1S4Tv8i}SRH-ayUPe~)~C*u+ORr1y}(%qIu@@;7Zi=LAHhx&0$vlFY|8`>}NF+FEH zPI27*^!i;#o;-Zz%H!?bn$pOWw;c8N&Kfz;5`WjwzmCjnOCw9$(#Swt8mUZ8`H{tK zX=FuP8o6X@>KbY3!vA0W_|UE+t4_SOxa!5LRvqvE|I2m-y!ZXwnRnQG<2&!HEFGEp zUhar_BhB}yltz{wG4(CoYgw1CxF*{5&3kex;)^F?bY1UDu(cxO-`z{w?Xf3@|8n}n z$GwnPebLr&4*#E4zU#8B-gwWJZ@lN_%lPH2)q2}nS;obFWZCr}uylv~Rr$Xmt|?EK zxx&-WuGsT2@e|8V^XZS``m$#)+U?ZC7d$0?R=Eq=ue|atlrL3&kn$74KOJc8U*D2FkANhVeJ$XjYp~iSFRJn^7|JdEq@7}~&l_O zUcaPWq#w}6r&Or#E&b>H>ls`*Sw~W?Pp)hyl=Oa{*i<07X12~*5}&$7oKnVP43R`*(#lL z9pmw&y-z2eP0rT0^WEg^IMU89yO?^P>Q^K3&KVy<&Ypa`_CRvBJ#K7U-lq7xD_DOw zwg2N+leZQBv5nt#D)sDX`*p+QrHY^1w*4sayCB>YTG`yw=M54YX1P$f4oiK_AP8LTi@5T?Jt)u zq3*wYh&Hyoki4VXJGhM(wr#KW`EXy`__pf@wbj3{joY{Xob%Y9Y<%B(19_GDx4Lb6 z^>O?T3AeTN=Ur|5yFtch{cYz* z52c=+Lw@lJvVA+)(zlK#+cTM#+SiBP=Iipd`t9S}&h-UsKWkz6^m87xQ7n6 zzk|ioMyO}o?^|1uv-$I*TPHKUUvS{YP#25r9Hgy<3pL^^Xzai#c6QCc5E-ZzHSfrYuoy^>&LZ?SG&G! z6YZa{E0@3VJJrord)lsNpafF$%Aa>#rT?$Wu4tQI?Va1y`1WsNeEZstukGz0y@~PP zRQ=g)$K&?)H`V_${$H+t`||$7{~3Y*lM(n$+x1U--7_|Ee7kaM9>22lLwo&AwZC$E z)_=Z()^#tSp1uEQZ-3ih$U89tG)hyn>aqS$Nx`rc70;kA{$DZ(*IA__uM@> zzS;ZZ_GLb$>!s)G&!+S}U&!{e>+|;ZFWkiZXpdjt=D;&eQ_}i22Y5<^ajU~~i-X*B zh#QWKGe?8vXfhow>>aIajwuYsRAw8kE7*9jNr9WSIq*Q)lqT#6vsTCKHpi?s2mZ?S zlnDE?*R2kFYOU4bA7g8A@VU08Ll3$&9NCj^nWOP2oE*((+cqkuS5j=5HJN8#FIBAAV&(HD}I7;Oo54`*T>1ukm{Cv(MTaH+wqIU|c7fZ>00+ z%h^xFcbk9KtXU)U*{kjwb#$y&oOiIvu1giCAX~le_xf6XG-uA7z1e1S=gpsg3w^#{ zSP87)^ci=kE;9V_QLJ%y_pH0j*I@xOFsgX|uy>nnYFQlq&?9>2$MqNH(?XG1Z#o~z z;YuehZ?8mix*6i7{=ls3lQv;~`wE3{XwFJKm{2&FF0p0p+ou2Z`LHMm@q%Qxf zHWtZ#0Gkje%jX%8X6Q=3~=0iui%x81A zr)RUvywA2}_srS&+ohP!^Z0ENTelhA7KGh+?j5Sjk+Ru4d-h$dJ8e2TG6x;OJXr7@ z`Z_zUy`DMPz*{W%rTNeiL|Mp|y$cs^{SWhD;&ZC_U1ZiY`=A1Y;s<0p_Al%o{^#DX zP(Pp1-?_Lcw1bbc5w$U~L&BWR{BOfy4q$uOB*#SP>3NaG*`}~DH8+C&1E1Kg94i~b zo}QOmTqBv-)perkYQFeooX$8MCa}%1pmXKJpw6Jkzl3%Dtk=u5BIB?Mm@s}*&ds0f zeb|=MXY|a&^T}IbAl{O-XYKF)BfYMb**jKjLvJ~zuI;JhC&&UPa^-q;>8=fNy4>k{%-pWpDv#IP zm}b_X|H;gG^KSG$-<|1mHk;qOXvdv*`Ih-G2~gMXsq?q&-TG1UVS>-F=`wG@RtvY; zZc&$g;Ap$W40PEZLEmcO)`9tOlCYytejZLJTWq!PU>}EN&Yib~CF~MgzRY|!T7EA3 z={$W)M`b3$U^6juhv& zoIjS#?s>P5^I@oEhnJqsZlEvgozG*{^*z_iCVhTpc68k0>vEc6Nj`mK1MO|dcf0Cp zU-Q`=^!e%MkBV5g&zeuiL_4csLigOGWnfS^`w;hSALkuBLt&!c&-T!><|;p+x_(u; z9$gQ&`ZNaeX-&CukFY(Ply+8`gE=|>Z{|ZsxWnNTh3PQM-V~}PM+L_`??agFSV*=- z7BbEbO*}?m1(z^RhtgSoefKn>A9LPzH2+wqWgYxQxePv6`73~Y(m$Vdm9k3+|O(f#Ry|?SmZ_>b@Ta2>KpTCfv0?Xe$}z&ZLU6i#Hc8Bc5Puk+mhLd3~}3;FFSPNeTJpod|f{=c#(rX?@OOG zm#uEs3%swfuGartKYd&iZKgxAIOx7rOr0?E`C9Ddp_$L(6nS{&^If-9>FhkpeAbW+ ztHyOz!>5H}BwneyY|dKj=y;Wn%RJUzN5`ub=hwu-(8MY9*~;1}$>vM<>CHIbfb9Wi zH+`s%9$|aD#eDuc+rL5bZ!9iq#@QQfKTofu4{O5BhPgTY8t=pGlgrM_*VE_wpAG+w z=F3(?`AuxkuLfUo9kG1bhO^PR^*M3QJ=d4ZeZ5ts+oZYcxp5tzQ(Q}@oqWD3s@bBZeaYg`l(nNH%(R5zi)2#10UyutZV)n z{r>i4pyi**hhig5W^sP7tj+1uAI^L&9rQlb@++p7bOUj1J{%{e%~)%3R1Leu#>f6szQ#&mHa(lgu{HZJWcJMLVK4Zyes5+z#=ylHH=jO? zv+tc<1JBvPe11mSh%)VxwP!t1YV&p2hco;6_UvqGAN$y+4_j<`lzjHSnQuhr&OOmD z!?qi@w~f!q*)sgTj;(>K!l8!Gcii^Q>1TVN1u=C^pE+|li?c~%3DVoLIIgN~-x(J* z;Q+Vs8tXy&u-`NP8W8J}tOSui3$tM>eRA$!BV5Geel;Q_U8Lx z^ZE7i4_0uk+G~z#XXoS1IO~n?<`YdH>heJLSM%98wWPmiaU4>A_;}iU zQ=&RM|CPnr0+gQD=jW__R^l&0=FFb@K!dGI4u5epOIVWM9y1r1&#TRsEq$DEwwXFR z7dGoQyxXvDw!7fn-^`izcU^r#JKG@H6~G8!W|#;labs#a4y|lkme*SnzX{VKFR)1rLB> zF)W1z4}xJaEQJO5@x&4=hNZ9oZI@uN<+cnnYa4m+OZZ?hEQJLr7#71)SnvoK7Q<3l z@GCGZhNZCJQ7|lqrLf@FU|0-GVZm>}uo#xYg2%wH7?#3<--2N=EQJO5u)hS0VJR&5 z9T*nFQdsbNFf4|pu;6hpEQY19;0Z7+hNZCJ4`5gfOJTtu!LS&X!h%16VKFR)1$8hi zg#~{`85YA*%gy%}_+T+Cg#~{F!(vzp3;qUv5{5j6rLX`T!&1v}<062SV5ya#LKzmD z9nj%|gYXO5nobZN_Lng$2)mVKFR)1#d$vK41<0h4R`?S3(}cQe*Ttfu5p` z0N;HJ)}t;ghNZB;V>A39xZd?ChV2F3v9 z@b_m@^C6G!gYDDhN(1m=J4NSry5OD;7wm@iis(D?*vhZ~H<3d8Iz|b3{5EXok0N$o z@MMEEHC^e#v0`qmcpVdvCKtatV;=bX483#=crV0(qY<=$JlFviK|>zH!hfNz`Ie#{ zEVg*$DJ&?U{*Lg&Vps|bb^^na%@Bt?g#|mq2a91TEa(Hng1Lx69;2PqcyBN)*acpKF++Bou^<~5#f;M2u&%xW`c!fN*xPws-7Q<3AwBde_<0RT~ zkDz_zG1?0HVb;d>&>p}(Fdw`E$13<^luO4VehajTnBawI6Bff#Snwh+EQY19U>O(| z!%|off?+8vw(_ay_uG-f5?JsK%r96xf*9l>a{IyD5-foQtD(bESa=cQVD4h*uml!d z0v(pZ!b_pU+-1;V2`soAIxK~SqtIdQ3h1x|7Q7QWEQN*df(~=E#4ohL-`=P_!7<5(Y4ohIcN1?+~SoksMF!yoj zuml!-0y->(g`b2Db5-cD1QvV>IxK~SpN0-|pMefbV8LC`VJR&9EOeOr9CTO$3qB7W zmcqg{&|&Ti&|wKI_#$*z3Jbpk9p=6a9hSg?uRw>Tu<)zUVeW3|umlz)&|xVoyazhW zeGNJ+fd%(Mho!La>(F8D8_;11EchmLSPBcj1s&!lpu-Ya@NMX@6c&C5I?R0+IxK+& z--8ZIVd3|o!`u&`!xC8VL+G#+7S^D{+>fBc5?JtK=&%$P{scPA-3J|(z=EGbho!La ze&{gwGw84c7ED5i1;2;>ICNNQK5zZRCf)|5fF)W1zhk;=+EVUfpf4p@Y=-`%u;7*O z!D3hn3r+;XVpxj)1lAXngOgydf(DCWsg>c2VX0}a2E$@l3JYEXhQ+WH7L-tim0-bX z$YC)oH8bDCu)o81Iv5t5ff!f}OJTtq!LS&X!h$owuo#wF`7HQg5!xu>92lX!6c+vx zxwVTth8{izwtNSiGhxBm@WWTK9A%i{^kAbfTe-L~F_(t%};27mwP`(xZ4}m{|{5JS*hwl#Xov;b;w~>Dr z`S+0HL8fFYj6pBfAC|(xg;-yh+Zy8lOJKn^&|xVo+!i{_Z3hijf(6?{ho!J^5p-DT zWH79B3i8*({{xiEC?ijiM;Bn-&w_6VZ1#2dzJa#BiTsD~zX84y#>MKt5IH!3R{9or z3#`)wmScv8)Jm^~4_0~|a#-n9w1b$`+CLpWSZPa)$1r@*!f!+03T5Q@P{1WGLK|lz z4i?+n;!ST@S3mEVXQRyq^DlhI~~zMy}l@1d>l!@nGLk%ueLKI)~2 zE1iSo9f}x?Lr_DXe*q1?(wk6cCHy5^gPsB($|-#IH(cXO;XfBKKSCQ_(0j3*AEOLk zdOrGz2jbH6pqqhXXr(tpgM~kVb;5VcVoX}>lFEY*lS@_RvGS7qvGU+f#VL=Kr^?5$PqX|k>cPjDr&+tVs-E&#d8$142=(NP%)>{S$Dd>FKF_?A<%& zTkR+hKBacDTyZ7!H_meDsq$EHsq)}UY$v##xs7#e`X?TKcP`g`YLC47{$Tl=$)RUd4 z+kFK~sd(T4a=wrHq`0yxdHg}@!EWTjL*(M_1rR4Ah;z!7}1Ifi-kqZZr6LBOiJgWGRdIk3?Eag{_?Y@PjSZwz%EENuw zj(ZoDiieRM?p;`_h|A*q(bVg>mtm>?QnKC8u#`VW^>Hu5Qn^T8BTipN9>Tp1OT}Z! zHF0=6c@+0LER|Q0?Y@Vl%FD@X#I-^45bk|g%Ii;;uNB9yRC~A=VktV2oX5QnONlrV z*TieZ!AXoC#{CjY@oUHh+$*sZ*a!MZRdFcp#k~{n7mtbyr>i~ON3j&1t@dy)#iuus zC&ZCB#Jv@t&ZWL4Y;dzxG2u|P%n#z#KGsa{5jOqFOa)8)AGJd zo)j1FCXdh6^1exSo2&irlLzOK>pvzB&6hq&9^Qgnd6+!5fLs&T#W-$xVcnM0^S>wS zYvj&7PPY3HmTFIs3k%7GKai{9MBKME_3)3>$Hj@bZyV`Q~MBq!p+-^pP>9rsjyVM2`iq@D+L`BoR( z{R>O^e^3vXkPG55aZ$W3)Bnl%@f{eC`<=efzf|?bW8$i~cSq{(S;nssM~*w@*iNdS zBlqsC_ztq&>+q>t@qOgVEb`DUbRff3+po8o;+EgUKiWF3rm$niWipx^5{N_7u)?1OL$x0 z3wBS$rzK>&FJdX$ft-kgrQ~pb>h>c8|pp?lt+s-~r@BJSoQgCodFUK;7+39u?=s zcJIYfAnxy1d>`W{#JF$eg@FU9C*qno+?Be&M}qbevE2``RN0MsRb1GeTsVX}?qT`D z8gU}Fdmol?Z_5`(#dUFAjCtX8yDws?B3>)5iHpmq=l5cKOCD zY}Qig9pu4RiATum#I=Y#eiC)Jnw)<%ITcsLxM$~u{A;KeE+&tPQ*pi|{SxZK;_Bt( z(#h0=QSzj?_HOdnDb(}tArHP*Tp?q-`t>VcOYS|DT)mE56PMpl9ym?<^{W4RGVZnc z!dfxze|g4s_U#w%Ag>db#e=6)uYH30;2Gq~C&_hj?bBrYJlay_E^_5eGVXKvLho5* z-1G7U`yAR*`Sav~v&q#pSMQ}BznOaa4RYxM#ZQoXhsnk7k=5cawYHNlwKTab3JtT${=G(RZo+1!Q+6Io^^Siz~h4 zq4!Y7XYszUPFxb(J$XOgTdTbaxhx(Or((NjZ>hcw<43Pj{cXv;SCfm|k?nrIrJA^S z4LRAK`Z_T_=l6oY*N^y8Kn~x>_*fi^-D2u}*HJHt$HmbO)Q8?rJr$?oa4GfT81<^S zCa&*Hz48I+edONjwY*)({@DWbH{6w6_#pM7xFW8I*NJO;Fn;_7#^bpsUkGj_7sR9D zP`p;`_F{bbCdSvq-8Ykq1?u)3gC#txc88EBGkzi2o{O+lTu!dsMlOrjiEHBF+o=~;s{L_tB(93fFQ$(3h;JXy zo%+J0xN;bI=uYbKQRMieiWm2Oj2s+IJrb8+N-lhydcH`W6o0N-HPqef$oVgji{eO}Kb3m#7ZraRxhf9D z!I!A#UoTx;5%+yr`VjSTaV+lpirRl8_54@Kk+>puXG*`DdRbf%7tf*|B-C-w&ljrV z;2d)C9_qM9=Lt0eR>fj1R?= zVmyECg@JEUFAb9?#QC?8$G$~9e<8UrL9V@>oQf+WivKqCLZtZbkSiCH>*C@i$2xg;JISH)|^`5PHO^nl`TQvC2>#xc3@5cR4U z*L{9`k`GZI_yxHpj>Uyrsh1vBeX%`9Vks3De@QNUgz*#NNZg-N4{xJx&yZNk->&69 zLavD?#L>9)Ur|r*AWw=bcajGmRekY#be_1t7`wR)Qk6!>*9)d=x@|(;z@DwUdE3;Nxk$9 za^dgf@;Awe7|+0Xp>LgZaYbAcuM@i;GJfbEjIW68IVVdsaq($#RAYQiT>BAu@SoJ{ zKOy%%LoWY}To>cJ173*!MLiMM#p%zfk3OsV50JaplT-1ixbP75z~MO;q>8vAu8Z*< zLa q2-H%lsw!)y((TOP9C8?if3Ic6@EqT?jnbel4Efs?wv-xF0P1^U#tFf>e=60 z85Kussh4I@uZRLHiKHE~sJ-$Aid7gxpM-&wzJGwKy_EKbF}bE)T_V!VA%!cw%3oX?XBPm>d|dxjit zPQ5C&@38s$&r%}{Y2`##KRfyOuc_c>hUg$--(>xl{_Y{ z?xy&i6~8-qLY(YDF7;6_??ukHqB)PmV zb@vi-DvrcM`%#aMqTao~+J7lI5f_gk7Z0FbIF@YR!?BbcN3Mx$$CHQpsaIB!yAM?R zFDEDB=oRGfAnM^Dd5ySu5_#fa>i!FxSnlW{YX21K11}^OUPoRlPQ*hmqFxtIisMrm zUs^^ze;PRz7sZ1i^{RM{I1%TUt9|jXIC#DKBQA;uS1>*jC*s-}j2}Ccdijmy-j(F= zOmZwPo<$ybG4=S(JWBOP$rIwjHL8C!^;m4*6SS1SmU>NG6AvDv_TNX{zKdrmxQ<*dlJPvW z?@#Z`q>quu#1(P=Sn4%#S&ZkXef|7#)ZGo_332{L^5F5*OE;0-Dspr)ITokl{L9r| zOuZ~Fh*L41+4jpHcm?Cj;zS&Y3xm{y4>7(fE{cN_sK>WR7Y83E_rH>QC>|3>;@%Uf zSHzLHDxMT4;{I1Lz9x>vb+J2%I-W)M>o+9Mizmbdaqw!!m&6ruBwi=3i-%vscs%3o z+pmj@x05R+>ghN+JeeHdNp`1@3srLOYo&|F#KlihFT9R=@&$5qD!C?}6uU1;KaG0u zWwLucIs6KFSR9MjitFORA;y=#%J`bNdN;ZF2I_@-$dlrdxNy4kuTx(uE`OVB&#_yo ze~%o$kzD%$dGJhf@rUFIaU>4TqMnE&aVnk^m+oWz=xoMU#p}fGr_{@3El<2w9R7@Y zYvKuUD(*Xv@pW+|c9ZOnJ$G-ZAjao>o`auL zUn{PN%WtM$et>%Z0&*fA73UwM-aSmcB#y*Yv3m>kdZvp@53#;`EA^_lEDnB2J$xJW zvbZY7cV+$lG<+fTP+Sw2#rKG>ILzHI1=|?M!hB;7Y8}k@4cLQ zSv)FE#OuWQ4lQq#@g?!3xGEmFf;xV~$MC-qo7Ca#OS-$gy_V*O!pMZ8vw z?~(ZS2j9*3!Zh-PxGe6!l6oQ@7w4xlzV|)UOX5*+RlH7I6A!+Z@pbVUaX5qR^;M`> z#AD*B*j+`vCLR)3yIH^cYU;&2xpa-%6HkcU=G4P$sprLG;>tYg{qLh*m`_eJ-hw=M zo%99dy0{`9dO!7KA@%YYxw0*}@BwmNToo6#r(V3CdMF+jr{ds))T2d=9}@=wx%UR? z;)=MugnH>l>Q!+~To;EoQ7`Pk_^P-f?z@?Kc`5ZZ;=+#P{+N0!#^=cX_*mSDdf$i0 z74eujzccmxE!3kvwJ)xT3m>MQ--UWb>~>ZCTdBJ}$?L=w@$g5eSH+X!{N9WoyN!Bf zA98rRcwh3QIN6UpJWjo~KRJJg;twRdJIU2U$ZN%^xcE`(;R~rJ;)=NMW7O-R>Wj-q zsQph!7f0gSkp?GyN#)gH^_tk0y72ikuY56XLqK@6*(auckiw8FERS zic|5>U24C?_`+w&!71caToe~SN4@?!>fN7L`=^qJ#WnF-aq%?jgKHRH6W7FUi2BeM zsF%fS#lah-f026rbn-fJ^$ha(m#D{Ql8av^SH)FvzKf;0crYQC&QpDH<$UtsJ=F7WmM$)e!>>_~#cRZgIDap7cLD2< zii_gzuTzi2L*hg{DXxhN-(Y+yu87?*+g~fri^Fd+J`j(IQ*qz7wEVZQ{I2`S9*M`r)pt=ZeV=;%-Q-jpypLS} zf$ED(KUDm6iWe8f12yU;@wm7w?*0+=V2t(Gi0e0se@wk{6S@BP?sP_Kx`#IbmtIJ}$fxkniveT|%o%ios%8|mL6SH$`6l6xPc9*bjf z@q5$@zonl3kleSH9Q=qpAx_1`-%$^LOnp*Z`w2PvJ@x$kIC_G5 z|2pc?AIKBpR6Otx>fs-yi;I6E4?Io1_-FE3aaBC{PwIugP_K!r;(=$Vm;S2u#nIo$ zga4wQifiK9lhU819{ruXR_vZ4m)29SiBoa)Y3joc-?c{y{zdN3k&9bR^Y5S5c9O$| zfgr!70DlRONj^B*1R9j45BTko)L;RM6rFaMF;>wQX zLHy2yrJ8t+IO?Nb#&1wq%I`)l;I}9&#o{q>usii`{7!|X${yr#ak3YA5WihvsaPPV z8ShPw@cR}%?L+Ry?_5}_iYwxJrsFp-EEV=ueR1&sa){r?uoR2eh=YTukK%VTES1G> zJ~@3M^_sZ+B687wKLROSMxGRx#36oD!ctYdMqCs3;|P>XNIiTdxf{R5XQ?C}5|_mj;z-=L9pj6yVtxCqHcQo$$QAtl znWg-z)&3%KL0lHQ*HB+4E{TT&#>bg1PQ~TLYOkc_iz9Jy3H6$|CJs+#{J;*<#Wit! z3iY9-)XT3WuN7CtLpxGWPotjSi5$J2JSI-W`JJg3hp1P?6>)DL^(529`8P1Wdl%Ig zN8*au?Ml6JI^)O1U~C;*z+uC-s_m zQd})F9`{ZCddjOSlqj};?Jc%Ca#EseW(}Cr#>OBh{JuU*TrkZg*P+4 zupjkEJT9(@gZ;Jq3$%Q3;sN}g zjitKSe&5DY@lwVY@Y^<)g3HJ?aY;N7O21rs#-rroa_Lu)tK!1D$dfCmhhqEf8%vQm z61#UZzAi3{hwwW%K3=>=T)0xpe=+r%I2EVj!eP|w;$d;^y{zATICWPc4~Zi&?z{Wt zyQ`>&1LUf>DlT13Jvf4T{u**coQU0#)XUdWFN?$XkyCO0I`ZI47@vx3;_CaU4;)23 z8Y3s-;s?n6M^g{3Cs)OFao6qm(SaV*ZC#Q2(cNSyzq*8kPi3*xG{{3+@|iFzy^7T3fzadH>q$4_B=Dqbgc zpQS$VTI#{)$o;P)7sVBES)7W~&ojP$D&yDWCHH#P5#1rCr7Jn||!wD{LR9yHrIXsVgNjxU5i0k4+Ts)ug?mMhs z6&J+aZ>C-p4~nBKUYv+~FHn2mRsY1H*bP%Ji_7Awcv75*3vXe3O*|@2#i`hRkINgt z@0450i^s*Gc%3*B55A4@vA8O(iSrjyuZxGoZKnt zJ{A{iOE9;9_#|r_#lR z`^ouBsHftJxHw6@_fqQa=j4hw5qDokJ$!(ABu>QZ#N`L6moI00BCd&php306)FW|K z?0!ML?+PtXJStAa?w!;N4>NvPTotbs7k^2;^e)EN#5Hj_r9SX(>UD7V5B_o_~})F0P1!_fjwXn);ZyBF}-v0xalQ=k#A(8-QUzsjblx6lYYsxxCTT_;xKwU;T zR%^;SXbWZ(R7zWyQuu#$pN~jLOMm?XQkt9K)2ljyZ=C*rvo~3EAuaq_tVBd;mmEwJvv7_Um`btguF-((%F9@ zcl(hCbozGK{|fmaZGH{6{h0mH{j{wlO4k#OJCN%toTIa}ekc2Yy7y`JN4NhHw(8J6pmTKJAabQ1dFEHJN%zwpZ9aqCk8;{*!0r2=MV_T|&%s5y z=Xuy_M0@+!?2jIyl~KrhUqGIxN9ZE$6p#n>0IiS4?e!O#)4g=I1$p~R$c?e^0PRkM zb1x&eC&6v6z&<@d>ywe2uOioHz?t8`)=YSq_GZDozeS#%4Yv)!_8fSSR_4RS*Vtbh zZ~r^C-xfArhu!Vq0`2Vpdv73j7Q$_B!X|$ao=@A0kZ0dQ9_+^UZ?pYkxSw|EWD$9R z?xC%Av>&03-C^$?v@g=>cVT}IJJJ%pZ{32f@id!nyCkc{+ax z-1Z*w!r|};U0ec?@iQ0B7ku9jrp${vmQ_H9Qb`4Qzgd+;W-Ig>`Vp z$H?6c@G$Kk2Rna4o;wj%KH+#L!9BEbG91uFy8Bb!{!HY30h~VzHvSA3&W7`}aV~6s zhFs}|2kC&e{(?OC0drbEpSS-UdG-Q$n6@s2yZ?$jM-S1?MaVn;hFtgH5!$;1_Wq9C zz7)=kz`@-L2e zJ#SCvY55#!>3qY!0eSaVa6lJnFNeJ2Yvk6A@F4Bn1Y3&ytr}Shv`>3O$cM_18*jqB z^83ES#d(LfkHfk5;bemSeE|2-R&6=XCn}KpbRS))LvG670t*+r0Uo0B6JSUF_E)$# z6X7Bq&>hvt-O0#@>45I2L7tz6JR^TUEL?)=aE>--z`Bmym<9W^OQ-9Qd$dajbb)qE z+}@JEOBOE9)^LGVX2Tr~$n`n!5N*$8E`QT3T9q>)>@!rk)s)WXHu4Gw6Bw#Oh>79$^sygTf)AUF4d)8XGv zlBG!Z(gmCC$05(|2N!95e^@@3TDrYU=jnhp!oMvii*q2__tW}8u>A48Ql6)KY2#q# z6OfyS!TLnlJ_0U8UJBcjkeB{IpY%LP=Q@!)@;C0nrEnx1(79!B&lKcF7o42R{!WB_ z`TKa`;++b2XJF?vc!&<@_APn)OOY4CzpW>WaV6Y49rmw=%^CEKaQJul!o|4>?x6#E zIP%TNotbQZ3tXTJv?YJjFI?PPkq^-3ZLnz~FVOvT_D9GwTO&97;Xc~F9oFUV7?zeF z!{OgG3>V`Lc!YLoXAbflJxDuuqP;U0dGRjT*oN)zh6f_&VQ(IC_dd8|K5X6(7wID1 zEq{kFTyhT}4`}@-aL=~L3$(HTwtkA-qq9GQ&Fzo}^Z;!SAh)(hZafGV=p5a#1M{CF zFVgx$u)8C2j}B=4Vde{wn{<(OA3@$@AurOywDlPCosb9g2wmhaUe4}}Jo^;dcQ1mK zK{&k&Y(Ed{yTVoh9;EFTVP`k?_Yxe?0o}bAx$`pep~$cD_U*`vufy%T!`>V409||& zHupg8zXkWx#kb+ip2)2t?9s-%aC$G~0o_Lze~(<>8@cfZxSMv~g9F+ehI{rw`|QWC zxdbkJ0uRwv0C(8P?LWhVwDTF#5|2y*b{gLYnR54RlwXItU^$P?lArO5Ru@DQEb z0`7K@d(+`eC!D9Vbb%hCl^JMn9*Oo2ouj?2*xxetM`!5*Jw)p>(Y|dt`=k5lJT0HY zFC9O9y1ff_=iv6q6|gxM?xEdn;DFZW!QDrpy+;qx?tJ8SH*#eGT%direI@ez_Q(fm zYX{gm8o9e8?9xR=gf&iq{D{D?xaR`o$^hJPA#6Md2ekJHZ+{VT|54bzn78-gqz4!1KH7O4xp4_^{{-yQ z?vw2Ahs=Kow_OV7pMi&H<$1X8GUWEJ;q>Kj?j`yP*m?!_Y3EhA{YvD8H{jkrIQuqi zUj-{4@%C4<{l{?kHL(2&T%@f};f`y0`+vd1*TJS%QF=ZdydEx=!}%N7Uo~9F!G+QE zjj%r!?z;*0!arIrOWV!NX^#%*VcMRE_C2?teQ^?;ycKpP!!B)1frshbR&e@9Xm8Ad zJz6*6WIu9y9$cW!Hn{tCK= zfZSMyJWG3Y5ar8}cmIU*>4JypJl*kAGsJpwDo!^)$~ zd)S^XoCw>GA-7M02k3xq^O1WeGpBQ>!aa|(|MFDn@#j4aJC$(zFX4P6+&c&t=ztFB zj$a|SN1^>7?b4ZNkn5w7=V+q|&OD1ep!2lSjNE#Tc?&#D=O)61=aKu9;ErFzxyf*m z4(N^-kULX&d)lYl3&@SB$bDMLz}}0-wL$( z3LMZLtxrdP0d35IhhIf|eJ-5+4Q%X4{}y(3hC7DnMZ7(o--Yd8LvHN~Cw~VQX^(c= zk=w5$&+iTo(Z-%|_Z!HKz2OmBUjln?BG>tclhSX&1v*DN`=Y(^HgaV@xS#fDvxwZ@ zANfG!17PbNPaE>0PmDiBB{hj^O zeYE~M^AY6wTd@8Q_D^@y%G=0;D1Qg;{{rpv@3Oyt!pCK(ziF^p2m3SN z5jvpldgS^{_D35g>@=|dt>IxhHxC|YL>}x2+oL(21qZabGn{Q=z6egIVP#jikG6MX z-i$oAn0aLW;W~W`^WBm6()m4Lr3HC$PdG~ld%+{Lu@Brc7VV8Ca6nr&+&vDtyDwa% zbNj&^II-dD-AMG5AT;B@0u@3H~ zmG!VP6S;RBoTZK9;SoBZduE}%egg6#+M?S`?McSB+TnD(&l{R zdD^3kbU-U7!)CRmp17F?a=1- zXrHA$I!6bzPun}7eUToZl~XZZdPn32-9uaS5be@!3(-DL=jbA>SjhF$(7*iLZ|U)3 z(mrj|nVpbl>0a8WhiT<>-ak8|y-g3$Ioeo+yg+AZMgE{;IFTZ4(AF+!Z_zp0p_N@Z zKiZ-5v`-i4%x-8O&>pRSALEbEChaUndz&7lvvj5%d5-R-eR`NK((SvWy>bS|%hLv} z?}6N+UD~0CXpe5&6YUFhj#kb@|H@v-P1>Pt+NWJQvp3r3=w7-&57Ww7=)Zj*v^VH} z+M@L($Q|0Hvvh&Z)25B~1-g$8Xk}mI`q>!2n>OhJouk|LWBYT^et0!D^w;zo5dN2C#r%gK9f!wBD zI!hO5pEke8`ThX?_0cx19D+PYchd!WkXFva?K6j>y+QZV7ClTmbo*gwpQZchJe@oo zd4YE6fF7dt^D(}41lpT)Kkd_*rR?tlw9nH4opz8L7b2IR^DiAAEqa)CXuA`6mL8yU zbmmCpKJC#(dW2Rk!g$Uyv^VKN+NIl;BhS$}xldT{B5l#_E6_em=V_ld zjzX?`xV=X^w9<{-qq}LJF3?4~Z6(?(m!Q8KZP3Z1kz2G&yYvw4(e1~eeV!hm3v^}` z@__E6vp>Z6>D9=+OF17pPbb$PFVZfpT!!{Tv_V^I(cYr_X@}Nb=|lhRJ!o&zdD^DaCn9(0UfQEa=sfM5g!a}|oIh<}4R@c+ z{^$aoquWkF?$bHCNGDH4u3UruT-u@3>b z^Z@PB#`lqXbT94G0j*qz{yNS;dy5{VJ-Y2o$>H|>w0Kvt`DkCHbF^|3x7P*84O)J$1fGxRA=;&_3z6sPJYA&I7a`YgM*msbq=#vnwl7Be zEImN`wBaFFZb5$@ZPO!kj_$q$?F;lEt=x*+XMTv>pnGYH4rqt&xRmpw<@Z#Swojfm zF5`G~FCEY$w0;}L@4g)EO}aq)w0#Bp`w`j?(E)8;iQMQ%-cMV!-iO?wd+01(q;qup zRcPv{V-xIJixPTzpsqkCwdF49H1J%{$no#-!58+7_c`QoxBx!k#=e29<(2#4cfX5?Jc^Wc4+xM9N6A; z51pfnv`@G9qkTZ2cPk-?H#(0&eO>O`y%bp`p?mSKwGr^INCdOp3c(x6Ug(lO9ym;HXlO&ZNEVKES;kZbn;2$%EM^y z&?fEEHf=nG_AZ^JJ-SHeY3pgUFVZ<$c?9DrzeH}(-Lyr^?}aHn-W}Q;gtN3q=jnhh z(Dtv;KA`io{wT)RpFwWYE^X5V+NI5B(cYsy+NT3rc?|t`Jjed&0otL{&m+&$J#>y9 zq6>7}uhCxj(SILp)5;6Tb96Ty&;{Cf9JkLD(B7tdX_p?RJ-Yoxw9nK1bb(I3gj{(7 z{ddy_JxE)$`7+u&bRV6iN9Y{g@e0}(=m9#Q)2|}ee}VCPXph23Xh`8_kG?5757F6| zVD~-b#g}3Ieb{{k?xXGB!QL=(^AB+5Ls)qa_Gyo9`-uJj3Az0-?0fHVDE0Jh6u{m*a^gL8B-4re|?u2jH9I-s4uAU7(J57RC! zzxSndfBAHdE>@wv`B&uGYB)z1YGC=jFQwb-I_yQRgOh(pUZi_yy#e_MZ8gF@BWUl8 zf`{qiXt?_y$dxA8r*mnz;|q@0%-hq!Sh)9}$g|^M{Y%&!&z#OpfbD-FcP7E|dtXZH zt4x8tui)ZTxb189w-szE32a{zPOGpp2Ogr01#q$qxxN?N8-tZ&VEH{OrT+4(;Y<=X zT)05H>)@UW_O~7m=sfMFn4gWjy9!p$g-2+o7w)Y_UZ4Y7KM#3N4e~raOy|x=?$jc8 zE`W=4_Cn@5^57zPgmyeQTgUM)f%SS=xf)J3(AU8ObdJt6A~&u_-b>pz!18-gO4~O} zJG7lcK16#r!X2a0UcU(*q&?bfLhjv+e1IO<5 zx4#ee=pvmQi`=^(c`t1~04w8=JG4VvKS5rk^Rzu4?R|QH4(N0%^5CbO5AFVp;~B`^ z0XRzs^ayP{h`eJ0+8aNIhv*#LJ`s8DA>@O!@i1&nVondx<|D}4CL?#~KH7d1d3p-+ zBJI)oW5@$Kpxvox@A}Ax>FkrRw*~v7gUC-I@5vzde+9R12^$4CGYu}#d0KxFxiKBN z`7-R&McSHyJogH7+I*G$Z-u-__tUxGFrUf(e+zqbk=AFi{~_kI`5HVz2Xv2#_Wtjf z)9&kV_twabH{fBqNO#Xh?!Jk9h_?R-=jR}|-iNKZaE|ur!dJ+9=OOo%>eBOZ+kCi4 z_tBn;TyJAe_t3V6e37WUD`$FVi8Xll?&CD(20o_lVV~{6zVovwbIRkn3&d3WB;SoBR z410@s`)RPd3)@eJ1KOJj_wS0_n+3P+2Iseii?lr#_7)>I=fmyou+awlk++50c1Ld0 zeYCd-xw0q6+Xe2W&0XPuc4>PrwqJ~Vn6~$Ty}gkKd%Ia}Kke)Tn@f;eOW-^m z><2qGa{T~!m^KfDd-g@{9R#QMgO!8fUfMZ~-XD4P2-rLTHkQJ9+Fb@`4@7P+hl9wg z;le@4%{8!nFs!eIhv=LOyB)}#W8q;szmEC$kQdj($wOdw1KdOB=pouT4SD-vXm6Yj z7w8<_b~y7a@_xEVXO2Lwe;;`touiGV%+EmX(Z-pu;UF)Z1?Oqy9N6ka?$bW)^&)qU zWKIvz0j)1%{sXk{jeH(#EJve4BJP;#%=Hrox7VphV37QmDRBM1YC^#B;2!x?VpCzYhis5&e7g0 z@PNyF2<|u*HeQ1ZwEh;{w~p=KgPrxT^C4_*fZb2w^l@5FkAjPI zf$lyHdC-JhIURPJ;aucaxF?I;H`xCB^aQr2^Aq8=Gmx8;VW0M9zyoI@*XO`JXTkRN zaL3tj(Sr4JV1IWweJ|BbxpH?n|+pb1#Tn-OMz5?#P2Dwj<(8g`Z3)dmn``P|_I7<)HKHYHx z^8D>+FTb}AuV;S@_vB#z4%oO6F5U_IbZ{3ezsIh0d+%-HpNDgI zAa`DXojYOwMOeR!{k;MgX#X|d{%+)E5$?SQ_WlJI?}c+;!9DlEL0N6-_}p_p?8ji^ z0k~KWD?j1wE8#rtYy}SvAh)-M3lGBP_Hg$@u)71Ce3*2xYkQ+I;<9XP-5e{hoX1MRy$o+oUdI2un z4QC3x{k`xIUAPbKcoDgAKkU=~191CG$g@9%hiQKR&c2LXe-JLxF5UhL^PeLhq@9Q0 zo>!6k^bnnY76`w|^74@&`EmHf(+lx4i=!e}xBWcLdJAi#+!a*#147{{kMOjW6Mz zKOoQQdg<}q{T{40z?t{i-vYRI7`C^AlOMoEI!hZnAXh#_?$cS?*^&82$OAe{y9=3r zjNGtbm$r6-hv|TJ|AhAXBIE&W(;c56&n`xu{*-Qq`|121upKZz2v$C$4~6x=z}8`K zA05!f=g9rTk>}~)NVxm2$b)5YKo`4U?{CQStKt5?v;A7QZ3H$>f}MZB*)!qX7qERH z+kXkW7r_H`a2Y)KFSfr5?*9rluIBB(=I!YmouiXVdFlCAzXt7lX_F3U2HtUfGbRVr3&|YakZqVJdPY=_D7t!8nMEl%J za6l`+fpepfTVJq!8ZOd$G{Gvko!D)N3hOSg?jZfeMVI-omRky|n30iBD(eFpLZtxSNG1ag;l z>3}ZM*@SJ+X1=1H}WD~SORBvM4sChHWtGAesGS??GLwG z$elxZ`<-C(Fj(1{{n0M1AC7#O&eF~zwD)QGJ==Ib?LzzfE^x2{c6NpHt6+OK*f|z% zUkqp0!A06w4|lZl_8Z`UR*r|WyCe5cfqV9#PlGdi!ro=DwKr^D0T0pMmAw5v$c?LD zV+q?|0~cuhX1Hi0FWw3d>7#^XmJD4AU+`kh}9|#xk zg8OLi9@sdD)47H&TrEFTfzKO*ggt&K8G{iaQ+L}SP2_n!OGF}*RV(Dll7(N-@#*e`wG}z z1sCW6+Dsu&uSV`v!u_;a4fm{JUc>fl;cP8DKzq%wek^ij99*RH6XC&i$gN3m$9mYM zeY!}uZ9tx%jP?VxH3hbg8>;XyXLt8RR)SODjFdbF@SI^dMcN zGbf_GvL*WKr7c=H3AsKExfgjlY@CcdPv>Z72J*})?0+k`pU%;lQ<2*!gav^LS4)@W)5wLL)a%CAjNPElS?u&W*E_jG`PiFf|kelbg=}Y0< z4`81z($;0n&tpy(=*;EFvlk;Drt`FY1#-hfK1gRTf$b}idzZo^bm11b{VL@8t?&Tt z-UeG&BX|4ZB5mYh{~F{u+PW4t?qz?Gi?DeEa*xi_);r8|%;|nQ_b&4rk?Vhii?sJX z+ppB83m0ggb{^#AISIK>>nFo)zeH}F!rRkDx@{1-ayoBM=jfha z@%CBd>1SZ;47fo1wDTKYM=QUB?W@?H)~{vz*V+H|aN8T~ z{|4Bn1KNBOc`=7PM=!q-PQHa)(G^@Ddsr}O8s|I-jWiAnv{P^JzVoBkOUv8Y&a;cvz<#Z|0yz){H zmpAUmdK$sVRy$8s8?_1Ql<+^W`1P3oh|I59 z{wv(BErW_OUdjY1;S#PxVRmzAdv3ZN7p-0GcCPE%Y0dKePv~?HT)Ae0yJ4M7JFX<+ z%8~dvfdc#QkiMe+Pm=nnQnH)$@BdHz&zmdVw zkJqIBhLpEA8OQh!0E;E|c%Te%XCJzHd0u?V35WyK{Z_%uVn5(gR3t*R zQ%}EGRXsI!u{<7U5R);HX$~smmsY=C(Yl(24F8ghJc4NPLNPS-^2S|z5YpK-3W%KR1S^sUN zZMfr-q>}ocvSOkZll^WBwOmoQjWw6aH>JSw`lY{UJsy(!6H=a%5{*}odbs=_<83`} z(*alg`+(*sY`64t8^@b2_1RLkkrIt(N&SBquk?s&u(^Wk{(U@;`0)c@P~%f1=E!P4Yw(T!p^V?BN8H(Jk^r5;H6 zTuL-F_o!-KT~hkmQ2KhV{8vgz$=|WRTALax z(<%}%tz4@~G--Bh&xXd-xoVy4083&Ev_REb!=0hDv|xUYj33SKc&T41a{acS`-XNxx&1)EMPG zIa3%V&jakYf0KS6mil8-p7{UhxAX+iqNG}skEP?$O2B@Vmp0C~QR+=n#z={_!~Zqk z(t$p$q|(Y~(r<&JkHhxu*reZ8QeP`&-Tz0wJmZu3j+EwWvfunB{XQl2K`GDvfAot3 z_Y5U9L-|TN-U4eXf0vZ~>o0HI9uuWLMM_4>|Fu2jxLLaYUcXPwViT>bSx(y7W?hlq~G(T zez}xBDbaBuC-rcN&I_aS(df7(&xcX>4bHr!s?)l(TuHggwPh2v#o-Cm;jyalIGyKs z!_r^$c>Gf8<*zDAN=h`|XsQ3V@k$4wZ$`A|$y3spB{JeM%1tt2l^hXg#bvk-jH)O` zE4H5_{YK-SAoVk(oGm39_Y$f9w{fH6-+vtX&VL`;-zEYxb zCrCY9?8oqYpg;cY=Y_5noy)qqj+HxEUW8tRSD&*>FGcH0U(c2Ql4pf4HRY#eQ{_1! zS$am;BQ~e5UJkgGa=_g^HcK0=JtfZx6(W5CwudX@8ZvG;ukTC!dMP(aiRSf?)WhYw z=CyLudHwJ^=anr}3Z;3)v~OnCP%qC_)iRg8zcn+A=S{@?^xwka{3b|!rj*%IqWK-h zJbJwleUJ9b&Q(XPT(fdRxZSMl)P<_`oVrlXnl30)ej1w)+bUJAwQ4n5d0Ba~MXReA zD`yd-%BpHww0izaZ6Oo9P1W8|W%J5nOvb$WWn5hx&g)UBKP6>QN;I!mr5-Nne%z0n zKVER@V|{pG!IjCy%-v_HO4UBf%!blyj(WMPWW32Tx3Q&uT#joD$sFW=!f|IxeH$rl zQlfDeNj+R#US}!rd$c{4b*?XsXRTc*<84qDG$do?@npTW8%9fO(@M7wIG!i{MeF%v zsoyK*0V&aVk4wF@Z1y^J(-)_u*Yoz;(nGeiuDgZnx~Fnjw5| zwY2n`=R7>IZDCQW>s?GMouqc@`}31 zaeAenXq@Y%eutEMq(tMqDD`k@=XJeZ{_}bt*}3ePqr#Q<)emuS*iosuOH&H6&awq+ zwy3JmDr5`jv6`43OUI^YsaYAVu1qeLxUt=|6BIpz^-jOOaXz!8zNeHWQlj}>BK1w@ z^Cj<(Z}xlK52g8REfZ=A)T_!qRnLynISceSJ!sI=*sjWh`dT93R*8mF1JPR=uLRB3?bAd9TWb@#PcbvD*=Q zOj8%jb;@mHi_6M!^pO2z8rEl6<{NF_e@H#{hFD6pK2xP0E}6SaLsh_GBhZlotHv6j7+^8wf zR5WN6$>!wl+EH3rX{Ts&wSB^I>=~Gs@}|sD9Pa0hQg4znMoPGZ=Q*F> zg6*>T@m_ZB-Pi2bx#ptv*ubGSUV$4Z$mr2<9KpH-C^4chobz3k>y zvMW?n$u;7{%%nW4gm=Oi?IKks87}r#T<^E!J{O1U-7NJPQcNk){1!<)TpD@3Iy&xc zKEJ)YR`!YGYeysmjuHrf5ytLe3}Pd^{P? zlJUa%+#&VHr2IlkG@o~*9xek9;{GuCx^eUQ?7wQ|vaUsI-4nwZxxOkF_$xLRMgP63 zTp>r}`b0~jIa#Mo)>_KSV)3$6GF2^e3pdu5a(J|)>{1%9I1}5;d|UZuKiNy_CrLR? zN;JQhq#iEbbC{p^Ykc2)eh0{P)#W>{TD$BRnP7QdySnTiP0h;%`qH<%wbHkXpgAQp zmA;lM`lCs?^wSy}m1sThcGx?I3+(W;F`t-Nt`L#(l) zVY)V64l$#(aq_oTpC|QjY5NJ*d(~#w8|3j)+Mjn`xnX^H*LdnXnmle5{XIezj+z#muAQhI zRVIg7+3s^O&!OVRdHzM}6W>vksZyeOW~Cl3wvTx#o1Ong^E`0<$~8xYca}_6&V)b1 zlgbXIbKpmSLpM1st|--8!gFK&=D6}hIR~vy)yq9qA;0)YkEO;|wX|wgi7~O5oB-&F zGObdcj`Yg%@`-AEm(-MsSY~Wv%M>k{XxS{)wwa(+%RQB%9zpX)E{7oA6ZDD{6x`Ii(`nuW)+?cYUv|Cd<*;Ms5Qr>i@U=~~v^xh7og ztok?gbTzB~RXaVU)L$4^PMfO55_+OOF*{XNHFH#1x*^qARW46nu~cK_nCjN@1#%gC zj2f3Wo~p;Ewe4EtMtaLCZG5~X-WX2x7B$u*duy*+HZie6+aY|lP}mmp_GDhsyl<3x zzmz+qMDxC1>f!QT*SW(vA9>sgnRbJS zgVe`J87CzgZ%e6%OCR5t*!;XY9B;jx@npDGPdoZzP4%>#TKaZfS?Sxk zvC_9AN?&&D8L2mdn1FPS(iR zYB^6!s_~S(zZi>Y73GccKV@2YL}}Ej)LPkVo3yPHqY}-UUL}uDIjmP`=wl%dyX>U))!V%Jw7HjF2I<0*)CT*6sPs5DS+chj5J+Aq{*dsDg zrC{OyEXekYw(na~|4_;&Qljl!^+#-9>q%_a9KT1$=kUG^_j%_uc}~4XT`HUHAx-&P z*@VpKWVO8C+A3=+FO}j=s-|u!uitim3`v$R_Ed$BoMZS+XgcgB1i886zOH%R?t zDW^+`=5vYE!{y^UF`v!P=fnBzvT|M5vhXEkgLCZCN~Qi{Re3Hpu}aQotK&8GnxUn_ zE3o^@$!u--#8p~y9KR_2N8^7k^?yqFT1qs2-Fs;NUE|Bh$Nz`%-;GU_9i^%wo*EO5 zAHJ&o_W0%^uD|pjop-L6`k7MBl@g8ry41tv;UTR5$FFX-zpq-m{+k0)PQ537gR17# z-EWWsY`y%b`R6e?ZCijmMAurGAK%!=*&)w^Hh*WwY0-(f$@bp2KZiI)2!uyiTm&M(Iu9 zbz*IJ{FoY(GgigpczNm15QpbSPe}a>DPKv6#(QMAG@3H}4z^?ZPn&H|ju#$3^4gm? z!MG78AHT=9KK$o`d%_cvGlA(Pti2~ZjAW~o{=|H}u2ySH)Px6+hS8Ji8&A}3Djh(K z%?}{*i32&5#2Ui`iB?r!%LB>ALr8U^N*g6l^>WxLPbA06J=P@mTdSHsi~C`%+VJIFJW zw#5@_<0GmZTbgB?Zip?{=HSq>PTNTiP!qIvIjSrTYfUr8Y}d4K%puy$*2S^%vVJvo zs649ly>Wk=A8b6n>?rj;r7V#WZU1wn9xnb<*zP9J1Ec#pyst~gm)pY^=ND+<0p_=5 z%6-YHT79ynZLAzQL*rl49CZY z573L%SX#WDmM%+cjq%#jgI4C@+L-r<%q!Y1^&crptCUGnqIn-I^>DfNXSg4?-|Th9 zH}hUDS7teH=lkJ(`m7orqd(P@_fiw&X|zm^N3w4x!&xSi6|r=xxjCGv+^6w`tWBjn zIwpjBc6mei-dR4Jcazqx%4tLB;=Y(~j`Im0_j#$`FXgBFzwmyHUYADSqx~(s7&+6F zt=g$Hb}H%0Sfy5#YShY9tvtLUl2pSR%VO_`arBQj9(;JVxvFcw&JCqIG_PKWH|>6pZ-<2MD31P9nX+nXtXy7yg(n1++BEr^ zidV^rVJ{) zcPY`lNBs%&&hYx==C5Nj)0Vl%aoStX>|9O&nif}^lcj4l zvHH~Nx{9=>rJ6>C&w-P)#oFoePC!a=55&A28P|}Z!}~2O_4A}$Bqf?xUh3ge{EqX> zf1B4nYu79eucyVV55mjKQ%Q$))IA9hh&w%qN=f3sV1$l-Hz0^LEXkKCZCIXQ#BL7rJhUtA`y80X23E*DGW93-x4vS+O? zuaI{MX2q*wjo~h~K+vShvyxjn*UKG(`3=hW(edmJslPAfBPr4R5&`D-+~&u7e%@*E zlD&88u=iWCXn&bllXbN0TD!>`7wMN(W%5+5Ie|IJNt9ZZtWQ+R>+!}3GMh!(Ie4QY zdno2%%Q(^fv_k5urMOa}d7L2iaQTk=Y34r1tzNu#-P+?etXvZwI&in7w^!DE>t2!P zSB^Iz{pr$Qc)z?V^&u&*O9_|%`25E8%}fhF=5>7Msx4=(@7l2RI629b8&oS}s^wa2 zg&eEH3CmL8IGH~yiXjfiSs-;=$^lZM^;#+QaB+D5XL-FWIu0MT_NcB6U296u{dtwg z!Ipc%4_izO4=!VWp(*L`8nB)iuXV{IWNf^=yd}JgCulv|Y1+iny)AP%yfmaTAmc^n z^>0f33n^boiRNQ`hWUKV>oC2)`}TQYW?FbrW2g1&yVh-3xpvL2>(;GZx8=;zH`xvo z{n**sV=>i_-LICuol^Q*^H?mUjQ?{?*>Qnf#vhfaPK=FBQq$T#>WpNAI!)VCH7d`M zbGPs`;U8-30aYIFJA{vE`3&Py%-fZD8RBp|o-g%FrCcE;n)j_z50?zDhi?9QyDOaN z{u|cGRhe&Q+mKZcKRv08?@_wPY2)N|cU(#)d<^dsn-snYEQ{e_{9)RgGf^v$rNl<}jK(=b}1)Pa1lI8KN3X^6vdR!M!ml;fpD>zS2$ zY59)FWB9pCd5>FGQ|8qmk40I(PURxGlu@Hi3)g9?HaA?uJjWZ9{-Vdh@1*{bluxBZ z;~n%lhBF?;e&F!BSG0e+GSr67HR0vb)<7FjKh@MgyT0yIIV_FOHYnGs^R-=*d)Z9~ zKcF6vQ}?ggW!$1Vy{Yz6wSDH|x*09gFH|R|C)Ks3=U<}kHFeJhYy84Kb^Dg>bYo0w zR-M~CM^BG!x>~iTEE%0iZ*i;I*wRpEw#=#Dmz}V#(+&6bV);82Z_9o<{=$@e%4=I~dpX;zOH9;`*2X2%rOO*#i3xJfR*~2t zk&an%b>}*@tUO+>9U9-SvRpf;thVfX4UOTBzC_zWUNYXG#^fpN3{5V!v{qbJI#;pQ zV&1OI%ao~w^Ug~B3Mp4hiRS%?)WfBb@29yhe0$!D%*PZnJQ<&3zjAoPZ?xZfQolyZ^-`j7@05DDeE0L#eoK}d5DshaDz6yE%SR)P)8#V>|-vxmr28 zI@}1d80_C1k-9kCe|M7leo_vS5^c9XNj+Q|zvFrqKUW=Ywm^M8`Dyr$=oPU~)kf6B-&4;Xiq`r`0y6##bCXUQ4CqJ)2Zwbfvt4sMNIP z@HVs5@W&!rwfW!rZnTxf>*RS$E>tfGTOl>Z#q}}TY_&|TK^P5jd95~8%akRhRikE9 zR+ldbA0(%SZ)29V$D;C{T6VP-yHG8&V@H%tkF6=28M{8b3Mt3qlW_mq|JZo{c1nG@ zl%u4C%YVCn*R9>KYU!M8@gifK~cTFP80(fw;lJzT!)b6J^bN3QO4 zx11^O1+H7MYV8R!T!UrFvsdO&`H191`7Pmb%?O{k+G1nFr!nhfY_DGFH!b~!`_-*d z&r7*qN;K{-q#iDlAHebO-(SCBTsfKh*3f&&iR`F_F*NT_y-nrb;w9+#L> z)sWDuX6nt2HHmV0fiYSxT7^Gc7E`Ok7r?7};Rm&xRxmQ}`eYBR!mhzU$=DKxqajUe}x0Y!uWX0vZm&A0fP1{jxs@`57 z(ZY8I!bLwD+aZwkjJ8AUD|vMxWr~z&JN!WErG@7m#%BAIY=h2a%evODFFo@W)O*Ta zP}PEZMCt2~)zY_?7sAaVe<&xHnA#Y=N~qVyhVQM*@w`^6ZVayjm#MKtT(0QVCR$5p z>s9hU@x<)fc>T|jV-cv z8)Db0a+z9NqAizGw-xfTDO_c}7wcP;^@-N^bE#K;tthopqV+vo>fus+5%;&k@6mbj zH|x7+c-I%z+vV{h51ai;U;E`TBoF9c#+56|x75ZYs^!P-40+xN*HM0Y?3;C*EO)P* z1t#X#rt0T}^;oN1;jb^P*Sv*eljF3>(OOkc40qzAW0$LP7P_~#vv#DcR7d!z!%{pC z>op+rHsrs;FUHNO+Gym8$ES`tX6$&qFgXcX$QySHDOJDy0Elb`^cqXUCuU> z`&B0rvQL-A(p{6)WOaN@i?-#~Nv(R9h1%54q}Cu8HLK+gkA+V?YGqCJZd;_r)sITm zCAXHxK}{@GEf=k%SGiOa8&^51RF^koV&m$j$%T;m(%4ffQe9iA)fKzRqo(yHwdE&j zOH=7hn^R(as$A|pP+O#(psm#=#dE5>SClvNE`u~uue zL4!-Mp^~cl&GXMVsc$1?TPe}@ykF|!(*6pz<6->1$$laq(2*BW`0S^zK7kJhT&F#z z%Fk~Ompv9fCO#}zE~uO;Ke$pM8zKB8TKGLyU0XT;ga?7rzv}qdYWa*>QcKCTF?l~j zZ{CzdnB=4bKrm7RlMkj7n`bEvJKq{IJjDt&_90=85tgm#L07w#iRo)X4)} zR~yxq=F-);Pu19V+LfyMimK{~w6r^}tTl0B+(>MzKCgxk;`7TiTkWi!C-;77(XYq$ z?UC(g$p3_o-%F%^qm)~vMBDdysfSCJ?@t%`x_#sRc1+jK$1OXiYr{_K)^(m39-KUN z{l($u;Ii_88ris)mnpfL=~`W~Ve|y~2+;WQDOyI`qBd0>Q^(2!S3U!)HOhN)<>C8b zhsk4PwruC!<2xnGOK)N4Z@@f_n0z*e^PDa9MN$?^iRO8!)WgN%=SK?sJV`Xq@MoG9 zuPdDg$`j}F+CAYFugm0{%<#;(@D(l}}Y?G^FKra`IGGHKTDGS&MDtew7#9^|C6>>i)5` zy1l$e=XSSl!ukx$eE%P9ZvtOeRW1IXv+p_Q-h1wtdvE6HCQZ|{P1|%%OQC5SI$(!D ziHgXXz8Tmyr2b;}x}CkfOHjXPLB}6jxlYe8T4oqO!my85 zp;clW4(Rj`q4NazQ@}Gr=oGsLXt`h7^Xp-7DcV1BxIR#~ zXIt-c2oa2LHI2`uo1G{o#!o71FbMKi59 z*0TZoe_iYSwPiJ*XfN&b{`oY5^qTafT?CAY$vDM?k~(a(t?Tc!z_%-=%Zgjtj%O9OodX1|1v>IDY#0=7W zePas>nbFg!@7weJ_xJiQtQTtLbPj^BIf_#>D!T9U@&S&n9-E2wuNb?ACmf}aeW_VMb~?j|j@ z#?P~EGV1xV^ab_aP91r8lX>wN_yF({p!=u6e;&x#|5JaTNFRLfela*NCax0ItrxC} zK=QJ0-#^L|OCIs16RdKsG3FNAsA@(qO+?~2>$=Uz8pz&ACC-s}XvE98+)SUstu}?C zd6dZ7NQz_SURqu2=_;}iH_e8BkJY8$^c-`k)%)CvE)0b2FG0owP7 z-=2z8VSFZocL6H^-Jan2jgLD%x;=j_IzErs#sT%g?fLivv`P&hpsw%x?Rj}fdn{6q z%ku|E1G+syI(DNX@H;kwPc6p}TR)g4<>c*G|L`Lf>OB9ziyZG`nfLX1-*d3Z`{r8z z8~@L$#f@;x9}>n_L(^Gdr3_l!iW8GHik&&`8Z(eKJu z@0+jq-}ry#_v>v*<1MRrzn(xi(Es;-T`}0N6NmKc3H0kIuU}6%WBhyi72V8x`t^wT z@j<_C^!jy+?$^Gb`Tcr5=@|8Xav%6(z)t|(ue1I1U`BhOug$+-ALHw{3fm)|N!MEM zif7Uzj(8@G`I~Dz?X;?Bvea4ZXeC$5D)SUg%TRLFs%gx-i7L_|imlRlsIx|(&YFfg zYxxJLv)V_wl^I`^l_(XJRgG$hx+jb?UDQ>0bzWdrUu9M&JayGl^{7eh^VK%{6OON{ zI!-MM*SR%nR%}wTBQYY~A*aaUpZooBJMGo|@k8)m0KWose=N%hhE3yR^@q0|(I3~n zr$63ujd#Ky)*p2!mjD0mk25~JKl+~Y`{O~{tIyA0fWHL14CwyYSnBtO@k@W*4gBu? z@_?uR^yWvf?Dnf~+MYkwj~(&H8uOL7aZeOIC=;Yw6{g5gJ!mxsf7?0^4Je9TZ<qj4KKg21e&%<$5P zKUdCFQ{FpQvdk4J#LsyRKScYr9Qz{pe*rHCeIoK*vAhkNcCKC%frqon2TJKKiEq>?sZ+m$`&Rqn45^x%z`{6loDgO%eqAwqQ@BG8VRQJO` z=u6Sxgv^1^71nQHr}f_xn0=>vuHMyNxN=3QT~=kenR+&qR`o?3+*P$RI+}2gB=W6e zR4YGhRifRKpW9{mXsel+s=AVKG-#))bxCXuGw6tlWGHa^ZV`4=6j;WS}COd6t6H%y@QGG|WF0?NEiHc?pNV&hD-b4|L zTwGN$Lmef0MD$00^!sO}-&{`~+zh@8I2+LYb4~Djtxu>3;v@7tk9MJUZz@_XB{Co!Qw}Br4 z?y_gDm?S-s?cRo?d+TMUac!tJImSt5?VQVASSb^so#`<`*4BZ5?ndg(Q?JlH7yM%2 zQb5!FGPqZY*wq8NLH;^PzcQZmE3M}n_lFwOsW|Z^(PliIi9ILxmIRRawHY0M^4t9~ z_2>DS(0?1;sWy!$py^kGd*#FFd-uj{*A(ct3jK49=b@hn=#vpm=&w?qdx2Nofq?!- z>d*5Nul?W`1D67t{+GeM^5OKogFEY`p9$K($NKR0|2b$s^=ta?g1a@QkpwjTI&di; zG46vdiRE74`Dv?I2;X5*TFvRS*9l|PlyZjsbX4(i8GqxjPk$rz=lNFJ|7q|`fy)6+ z|3+{rA4Olnx@8%9Ie*p*`R_?ITyro7#$e)u>L!$bKKTOy{g=InGmd+FJm!jka?!kp+OCuvhU$>d#ZZH~!!k z1D^vl{hPqO@}c9uC>a0Q%)ikD$FyE-8vnAfg9XiRkR>2HP7g~!dfylb=)X+;dA=9= z?}EE^j6b01=fS0Xc>5O(8UGG+Yb#^`{tayv?vcr02ISQg*#R~U&H%68{eSWMp$|HF zej-(Bj zZyH&k9MJT~f=k(0B%cYF3OuG4O6M_J=Jl}=I93idGkP<;aVLVx7IM*yP$&BqLIDIeY+ z@ZtBza<4Cf{$OLcBmyTGM(ucAv?1*E#!*%;z0vljN5a@c{dww_`EWJ(&A`_HP5)tV zDSLzXtEYl^EUj<#@<9!D!^zSOlcX2!#gs%$o#ay$jjs#f!eF+@syND8h@!yv6B!8j zh%^-Bxd!lYz(hdvu?Sqsz{9@aGUXBfQ;$c>m@Vsf>?Hfl=<$8KygZ%deLG1w@v_ z_AYvys_TrlI%6@>DMnjR?;+~Y{r3m(KLW1}skfLNHmLXbZMZpk_B*33Ypk#%+HQ$o zr`P!Q5e0qyeDF^KCjokVZUmRo9>jqRkLwOHf0TE>rP#pgfND0eNzaCig$>BJq>Ml> zmT;>hc5?>LA|}lQoNZJBA|8qm?e--@iz}tXsZ^=mizr4?$63kzra~3{-yS%m2 zHVx;^2@}G`q&+4%6dIiv$DN%a6xofZlv`bo)OUi_h^*Zo&|gXYx_z6$&jrp0H2vGa zrCcBECw;^A6QRFjOOKbVt-Sk35?Cs3_0wdM5GvHqZWbj1C#goHW2z*cP|f6xiYYgX zzfdBIJ7l##6XxN+iT$t9+gya;JAVJa1$}+~ls0n)08;?X-$me3Is^U==zVuc|LpV_ zT;=6i+qQZOBVu)Z)8qtrNxpOfk_D(7IM$f-wuJ+3(v3P}n7+btjafxtXR0J&swy%n z@UvQ{G+se$Sx#lk@Y6vhoZ|2ZGyVBH-Xn6OF();f{0qCQ-Rg_XoMD{JPX1@poPpcd zksiCo9>eq)e-8fjzVa&g-+{LQ-M-i;zkS8>h)DnY?W0-c-FT<%~>+(hazqZ2c*G4 zwJ~0Nd14+PGf|8z)RKns`4|Z3$hv<6+-^bc1vDQQf=ki<)Q<%IxcXe%O1w$$+TbEy zKcHT;exu9*^}6#L^fOcbC&vA20zO7zNAa#e6c^ZdB$2iwW1QyB26QJAlO?QuJ6>^K z4aRminJSG{#XKMUm{k?e!aoTRuQIF3nw)vL39|9UtwbV85{F1K(Grf7+oz^}L@bc1 zo}PQ%T+WGkw!-nX($m{?s4rS-q9nn2$P8VFsb3l*j(n8oXqWE)ze<}&n??fA?Op*c zrC9&BjM=)eM;zIAoV{a?bb*Y*K6B-j;$h|cS?v#93CSr}*oeQ)$%Zq_nks6?p(rVd z#GO6wr5Q<~Cot3(fH0+C?KtK8xd zmrBq|k}nh4Ac^Ovg>r{Li&!?3t%tkMn(AaN9vFLKK3^SU3j4?@;9G$+0L|Ae;8Oa7 z{7U&@axDG4cJGGK|P*wcK_$2Zx=d(=F$gSjkM3j;?lG&dm~wl|W9O^eoFt@XvMXuxlk%j9C*Q<3(6(WS>fg zh>R|uWyiA>E_t$&kvL<7kejic2AdG!cx`kP4xp+s%hZZS-S7z0tsY_8GwLv@VamoI z-Hspa`Hdq4IQaiP!OUFcWtopH=E}s^ms9 zxgW73Y&YOoG{UxumI)4^?0C)+|<7tia$MclnJ~v#SwPp484LySkyzg_0ZFU;l?35Rk@m##w3pNsW z^++qBEI9)cNYA@RFGHQx31L+0+9J{vdSiQby z)zTg>Qm1V!&T3QU8#h3(RtPq0f(HV6ZQ~35Jr{fla4ewdoeD0c*uF~pNMh(atahzO zG^j(3G36Vm5E9L5j59UlS;wYxtWEa@8-1x);qBC`$N78UKL!p0n(nW`rD(q#tyk9P zn1uh6k-|I8Si9M_InvToj7JjOgxFT%rtRfqBN9j4b81oDio1+)D4^dmp&-xA0$&I$ z1~mP3;8Kdkwaf0deD&78EuQwO<67B$%eah9`58)sL_<345*d|GK{gthIFda=cHEij zQa@;r`CjGsLqBx#(2@P?3Gkl-zXUWNe*%{h3G~MYwSQ6|xApaG-?3>2k?1>hSD-!k zf_Xlia9w{cDT2j3+?4D9vW|C2z1CzRz>(2i?eo#zR^a0}@b$pyfac>7a4G#k9LeEf zaje7mkbpNBxhNzT_!qrwb7!8<#Mt8)e@ZsTlZZM*(IiVENfhpBcDgZyl1x$2cm#*H zQvQ`h>`2b8A|XuFj+)VInjD9zP_3DZm6>+5wLCtndLmm-*z?-n$n+Ya?l9SYS~2w0 zs@B*@_ew8{sk_c^U&X}2x@rZV4jcjK_8ku{rPw;&uy*U}?VHb9vubNF+sw9c6I^53 zWu|cx1k*Kf5(C;1H(U;*Dh$YgpJGI`#?*ca=A@t;)S>sav9fHi>T>(k&;T7&twGuVHN@Fm=IuR_S457Zjd4w9ZT zl*FGW9m&KiL{pI%Z^rEq`t_`76NaHWl;>05o%i`U2tD0Te+2(K@HU|N$xin9DK=ik z`bijTTgvS(4^$b`t}u-s!C1^of0)Fx6a!=^Wh3nwMyFL}wt1~ae-iN34PCu&oe6$E za3P@ix(-}QF?)~Loz@XFtCOpCFQ$WfjAt`q_@D#BxsSGA^-dGtm;{4uCx~%T_tl zb1?L3<4dDYznl8?J@ZrGmjU|#p(^+M`@p5V6y#4Hj05}t`hBa(RpH$;*(&b!Hi_Fr zFTV&exjbUcbi>9@Ra2Dtt9_jO! zpH^5`Q^Ah{<^Y<%W#C>JK7WGqM$ezMTSQ}HbxfykMjO+5jK{G``>7NWSIIqOwVD!) z+}-Tcy`FmYdj2-}cY#L%P4`J~DaF<^O9qk)SMLZiMN3qG)v;_gd)*3S0NQB|{S+oz zCdN4QvcdLd90=&Arx(^u9e4xK1W1v2TTCyBU4IRKku}=0#zB*8*xvs@ZyeOSaY()A zf`1zL%*UvA$F4QxS6aJsu<`-oWJD=B%I~iO)S>(9Y4Cpso*hzev3nu>%2ALs+LOi` zRH^w*2lZC87wR1gJ|36|NRfUhR%~px z@)J$`qA-v>MZX!<_^m+~R~;nQbB+O%cM9N}V~T&!g>cFbebZa>Yq zBIJi{riid4@VuN&dx{$2*~$+De57X<_-F%P2rLFPA6J7*DYotg`$1plbsv;>?-wQJ z0zgc5NkBB-?QbaKz7U2Q{zaW+gv+lYb4JLrQv9T<)FD_>Vggg*Eq#ekRPoVt=Om-5fk<(jbHz#V--RhoP5;o}4$) zS&TK112jK*a4Gs7#^Lv6k!pk4J!joI+0(OqJ9^>bD$_VXXJip>iA0h7M3S+qHCSav zTdPmMkNUMda1Hnkz>R>We;2rvk6dR%7}5QbWtlN58zeifUS={JQ>@ltRJcb4d>n>O z9y-zwnIlc36sQ2C$i7xA57gjz452@F^$wXBwMKib@k^9EGT!JVyvkNmXP)nc&JOT1 zfwMmb9bNtSO*@v*_E$2Lfx$^EV_S)}DD(m)dDdPpZK{ZB3 z+IL}omUX&74agpmp5XU)x}zYEjs;%^EC)3G`@p4aDdHbCq`k|u9;2$k2H8#C&wY4(CMx%{sKiSwH&d{!U zYouI~8oYY?1G;;tSMP^6fZqb#3TV3bflDd29}d!8-@6^nnxyy1cC3)&zSnp#OgbfA zQm`#AW8B=qAWZ7ZOM(N+Thy=Tb!slzr-4#H%7?AzLAq=FOjN$WOP@o{VfAzb^> zHV4nhbZzhPUX_s!-EY3_ug%@wqKpptdZ+)3FZdtTM*Aza@f`Vq%AFLM@N=p@+06Zk zum=)%`JZk>s->KM3cF?UCJj34v!bSDmDu(o;&cpSu6iV- zmYK8EiJm-~mgF0h{j^7~kB7k@1AYSN_Pz@)rQ_Qb9x|vu2=1Rl+RHY~WkFio_Z8Iq zM*A(wI26rVvOoY>BqI&|O_T78tZ)QM-k0bELIh%`+Dm z9W#AC7am=hZ$02=1D^skpWgzP5_!<)v;P7AQ|l4ro-F6Y+`{{+u(+=*yW2nB@#ZAjH_coe zYIdfXw+TlBvwZ#|^9%EM1o$*yCZPF09bC$uB6^U*y1{2#pFDfa*F7!Gk)qYDMpM)N zs={*EtVWT*L{gZ@*J@RrwX4LK9V7Gx8*vzk-_2QLlv`gd34X??drY)ibLF%WdBbDm zLHN=0;sx+mfY$)cZ^;6m-;dlk#k4)R01J#CFD&<>7H|Ip8b5NjByg$5G|I(}GycskC*5+H+1v!hQpE_pye0IZ!=JO)(%YZ8Z&F9y_rF4MzbBq z%U0iKyb)`BFNdyM$u2zC8Wl*s{Q*CRp{MVeiG`+74b%ggpV{D2KJtFIwwD#=T{D@d z=;N;OMtYG9@;iv0@n%bM?bWcvd6Yepi|3+EtS7}=3n;$Ho3FNe7M}hNzn?CFZXUX_ zU*7`$B=8KN`Fd-S&sRraN7z3sPm`X1%X@aNU@5^9X#w^*URr?bUGHO@_jRWCHRXN1 z&y;)t?eAm=znxx|X{=K5WZCD;veR?!hzdeV7;br*U`8k!3Fk`qo*+YHjc~|G64P4} zo}5`9kH@V@G8!LI7paqXkyFo;Aen?UyiUzdLV5xIQ!r~%H7L|CFl%lz?MnL>)WjlI z(S>nUf2P81pz`bx0UNw(geygz$~j3A6QEI@E2#{d(~0FVRYt1ax)4w3l*xYTU|Wq& zubS!q9N(jC4qh#*G?8(z8%2{52ML}EF$KrnN*oW4wMR}$*wL6eF;qIy9%GrjwxVXQ zYK+<&Ha4d3GNbuYE6slA@a_v1PXw;?s`BrJat*uKM#4vgFO|FX5|UM`=R=CU<=0B> z3t>F6E-}LwneHdUPnqtlXuG#g+l~q5|1oT|!ML6ez7Mz-(Bqo>gg>qWfq%fEVg3Qb z#&y9w(r0gw88=|QZT&`4aUE2W!LI$k!p7dx1}74#b)(6WbQ=$pge}*yJ^ew9Y3PL5 zVQ|{9B0NDMSB=4+$&(b4?ZNea67m0voY&KmSy9*${gOH{981)XQ@N0RI(BSwjCl~{ z>)3c$91lEM`lXPy4!e6^Ewr1RS8#_hjQmo+A2!lXJ-;smzXrGt(EacLxRhdfGqGQ8 zSfQW2TjJ*y!5`&G({o5^6Hk=(8SU~s0!tH4Um5_cqigt(y3|~ zp^jxfU&i9X{*(o8lJ5b{*ONQ|=UFKm;sw@&O%fvHCG8yqwWBrSBqZLlH@ce-5Cg)8{;lV3m$xUG= zOfD!DKi|5*%w>}NFwPHSY!qeu*s?3p{w7x0nFLeN-#Dz06Guf-;?&3T_Si&afe4!- zM9ObxNxB4eO-qZnaHZEG8XLBVe5;9)G9ORjP^j|Tp~(HAa4q|jNq{PUNk+U@{l7}g zRw|<>hW)P$e_ujeng92ZN0oiQ8Gb_a2wyg>b0o&_Aw@#t`%Gth=&tg_zu2cMZ)3&s5jw}E_23P_}5jnJ&f9-~~yyw0dOXPSzkRoQxj2U~; zX9O9vyMy|#r>+R~$a(Nh@CSg006j0C0hjV@5x)*k4ePrW$!^iHSDxXW`3;jy)-8-q z6+p)lw#6(<(Fd*g@Xcq5q)+wRSAoJ-({BZz3=nlRNFVP;kG}RFeId9P>UFUmW#J(C zEM||0G4nX%K9kTa8k?;lC|w>T^Lz}XqP~FcKI+x?r8~j@4frmg+x;@QlzsR6^5bwn zUGyD+Kb5Ztmd1BIC;pf#akQBEbG%w`*^OEmRtT%gEwyU7YT!X6kCpHom`nPsvM3%d zS<;lq21YLH9@XjX=|cC=X@38-cNO~Qli;TTYXHsXIp9)0L@zVQCvF)##0SS4sLQ>9 zx|dS|6Fn})cqL6zb|@SdS<#iynoVk!zP%%luJZXg2t6&=ya@gZ@G7AB`3Ja^50Puu z;uNu69s~%y9kcn_^$}y%Nk%7&4pw-XC(NKt0v#MSV<4cv@Yn+V4dCYidjL(p^f;e> zKaMoQN8hk>PR32s_d2E^ioW7GMf_5UMEX0ich358#5k^**T%|ub2UZWtBtHxpLBT{ zt%iARcV``*cvK^KN4A7LG!{V`L7&1|h)7p?FDk%JZX}XU*hV*Njs_qZ%8UX*GIl z_3(P1{{i^Z{rpeCSD^0)H2+h;rD*?=;rHjE{7bGeS)=>Rhm|LG@Dd%~u%#k=%(^IK z9K?<@g%hgP8jS#)Ri)N+oH4UuPyCQ2J5Jp!NhdEb%~Fv@r0m(~^LYt;=zZ@7@UH`R z0GiM5f=fvUd7p;cC5E`^T79SD*3#CCvHBX*U{Xt_(iZx(7S~ZO!ZXwy0!4z7-{jMe z9AD_CYVby2B%tX}0+&*3|A7AS+jvF9SHMkXyFY5F(c0+wlx2LMvi8Dm&-xGO?xtQn zK9_=D23#4?`ml3U==s!WCL*@a9sL>9`y6%X{(J@eFz{DEw?}=_{~yKf^VA>MyDZU_ z8%HfP=8CROq-2|ZWcV7`5wzLdI26$BqF&veHQ<|oEr6zbHuy*M}T#8;peehHfGKpuRj6%KCg3{5Qbw08Q^La4GAG=xu4|aXp0ec~2K- zyVrZB$(T2DRy2yC#T!AHJy|Oy8^y6!yUg7~0sW2>3iP|cPX<;2n*MHZDGvtkSr7Lg zf&LOtDOKLR6WS8ranw_!jPyg-q^~F9B5X@Q2N6FIo?>kod<=$q_iy(5;UILho?!s| zb>MG+=3~K1pO3!B{PQOtd}?{cd&F%0Cc-#K+9+l{R{8gEaA$qr${m9X!(JQNsX>+I zh<#um8qdL;R0(#|Bx!v|i*Gys!swT5u2GGin2A9WA0^Hw{*wI*MWDRc77uY*ElG~f ziQF|)T^?e~;5Q^r&Dq-h&1l=^w`)IqYdP#b@JE3k0J>fO0WPJO94Ik7G)u0G*|x2y zpqR(L#JQ%}((AS`$|YJ1LiCJH-79<3cMsgz}JGx!g`UQ^QA_ z?J?I{R68k}It>?0<_TFRdYLKp@r~7EbCuz7^zcH9bc9!g5W>qtd54IHaFu(sIyp8Y zIghDubm?fOTldbO{j@L7_)7c#4g9yje*wDvTTk}e-yhsdD}sC*y8Y;b<`0?Gjr*+8 zS6b#i>+{O{NO@mxG`)`>hP;o*BUf^H?f6pKc-5MOTDyXt;F&>O5o_HHVM)~$8Kfnb z$GHFtDN4X0KdV3_U0=~!;!HsH3L%%Z;U}1n)ZueA!73R)4T~RFGo+Ck$F^8i={a$t z=1U_-^SB2cr$P^y_7BbQuG;DZAur)wwwFt8rTT<=T9L(L3*pRj%$rPWw)(os zp|+-EQd+)_EOhXF&H~C%6=yXZXMm-#dSp zJnIUEyuP)Ztmgt>mT;s|K(d#v`bEfi4&xouC?m2<1W5{ki^)~Z-c@EroG~bPqm1`- ztA!lO4He<)@CZ0m8)vhVY1H5`kgj3lw5hX~bUoggYg_5fb0 zu4i*f4TjHkpYQY6ern;ITMoV!*Z^q$z635M62#AK9H#Fd%Adz3E3~|CF+I8(xKW~p z=f0+l3rr+JH;T5IcOso!sLVvN!X6PNBu@V2qGWcBj)Q5ta*S`#-DR!k0h30@k0(B~ zCzuEDqtE4kg8z^3cbd=dVyGtA=>SiMTT(IU)kx)MT*? z>{2WBgdYg#b3YwCFJ1(H9rzod>4#VOZ7$}g&vO&&c&p6|_v+flwYkKDn9+GZXGW-j zOKBy$A<1K-896Pcs$Cun`w?nso`J1hKD_m|27D8+70~oQ75rZN*$$UuH*gDFy~c|Y z$aZZZt3c=HNP-$7)hzag43m@x;N?N1MiM-fLAmWhpYB2G)#LjT_^ZHSK+|=)eZGq5 zWhSiaS+i?{JcWlguV=elMP)*^U1s88)Oinqz9C7w!;wHDv_=kjBK71h-l}%{BQOx~ zu@E}?ygmhd6|g3tE#qIT-+jtto{|~XX>@iP{pjBmYcHWpGipkmQrhFF8tYyrGwexzp@b}7lTFZCx$Oy51JMl1{CvQVaj3O!M}7?&2uNSi^OsSXyKiPkR#urd{>c}82!^2K+~y&JYXvSP{KzS zv*(OLsvO0I{0h^wYh$)Od4}XK+85%rhYLcU?9u;Ozn$094&9%Rf*$}L1EhHCspz`> zfc9EM7TuQO~ z&xWsdbnjqgR8RI06#S5D(dS;jEux)jH(lv{0dXurPOP(V;{QA=l?nQ)BP4&i;W8y0cif0flK*c z&5xdKTZo;Jblbj&-1TQstVM@Gco~!BfHIzqHkXNoHp&&goWqa&zhtE(yP#8BLinHK z*1KW;<-^ly!Y=Cvp7k)zln}nIhd+IPdlLL*;8j5LpI_(mpAX_b-hXfZfbo~Z{J34) zybWf-yh1xVer9qq-Y;MLh*1BtnxnGwt&njmy1^`3i0bARC$>%+5_2j;88f`LX<;eP zdXIKvtKCyjt1Qco&Zeqjo?7A<4)sQLa_C9lCo{dzZ&x3D>v8!!_*a1afNoc+$8T4$ zePY8}vG8r*v|&TfcAgjB)GI5s-~2zsi4rdQJNsT)sn17@!?7_|q9T$^s$)2%s>@KT zxZ!w`YfA}{Eh#tY@*v(UcO3eCt}aPHB42q9nb#qbkx(i+0e{M{YsOOXP@>w7j#pUQ z(SLQYU|rrYiKZfH%s`!wE0sHz@%x&ozA0g+eK;1&_^k}uA?M&a@Lj;!fNtlb!S8o# zxqX;l|AKk`7PQabf-d*&V4dH$jJHw^lXxxzc2h)!ma5jwRK9D%&4PS(Nagj7wpl^5 zU1l4BZSt4liUrBza&|n(n<2m@nNsA0C`w8PZ+ISRV*lhKZ>23KRaxp7eLS8abzd@s z?w7#t1nvQJf3bwJ$$=&Xmwv;bCbSEyp5AMgLgjU7zZ;A>?Ttp1c-56ogGhF zw!Ea|@&<^R}z2H{?UjTGF|1^0s>wGSc(jA$_-HypwBy{iw4vSH|5Vg(f!^p()KJC^}0l zM>Tc1v*peg7Rz8f&3um&v5yA%Yo@)e?jjSm#Wvrn-t^wAlyMpOiqCh;#=^Rt2fhMW z3244&Z1TrvZ;(H)=6CPCNBDfN=-IxN+nBsK%M@wcA3j)mbJ*M;{tD?Eiy4;+mTTSmm4ErA$>l7 zKaN=G5$YB*d6Su#$WtUELNP|a9a~9?{D>*EofePY2Ed7aY$WFJ>g2reF(pnkoo*oZ z`U$f>%%s>_6>Yf0%-zUDFg~H~G}T%vm`p~dKiXQg^Xg zWmh?M=udHuyxkv%{-B>_{yYu-OW=7xkHg{M_gdb0zkE4&gUldrwfHB1gvOM2-!9MA zcmC8g1}eumJYj`zR};3;EU}iZB+@$DS|A%m*Bw3|=-*^|c>Ba6@WsHg;AgT==y|I@ z3-i~fkMkMfTq0+c8l9!a7pn*&Q&ia()PFs7>2snV{0G2~0o~4Nn|=D};C-?^!TWc^ z=?ornq#M0Be6!>kz01oj+WDWZaZ}XKg13l9rTw4oSYI5>XwX-QgSf8`|~ zUdA({BRIGbsqJvajwe|5A#Yo@!=vn4tW~#?fFKu2R#xxw%s$7cgC_gKMJ&9~r_s#Z zrQ;0CZPFEZ}a)p>r#If){Uscy-)z}QY0hAouHnXawigKeG5BaDT>pWon=56 zC>Dk*ckx!WQzm%F13n)sp`+LDIp7xomjIfNYr&-qm%n$My>0FIfSFa>dp1a{`u48g z-YxU65^oE#G2vG2Iq!FN8(+-VqQosRy^Nd3Svco-)f)Q)J_Z6h(jRXKj#-F#H^|2n za4EY3Iqcd%Pp|vKbGz$-uvs|Yw3)|}0PlF|D=B^7@%!tNfDhsG2JqW}y8zu^zYTt` z`CJji%W6J1tlikNg`j#FudcmvExFp1d&q;z_+y@x#UYAB;Kp(>oLfs+VI_pgqxd$% zCE{x0t*?ab@)}DFW<|#^(<1GT==M2&3j07mhF#&iz0dDA;ddGMNx*4<=C?2Sy`EqC zb2z`=l^dqBXnIW2Y{BwpiDzoSfQ@Mz3$3<$oUFV&8yye%^dF@D4)_rIPk{dd_!Xe( z{{vh~O%c1#rk%a3J2#yPWh;HaOqpqpq35|?H5>+{iZM!~;rIe0Iy1JHb21uo@K5kA&$-MMu6oE=M+%fRh3zvKIJ&GhsR zo4v1LPxvZt5 zflmRtKOP5{(xuPsVegA#Z(bpUg{WlOly2E$`pyqOR_D9M{6}r$CA6YZ2MdKW6La-++MOo0%+H&= zgBVvAnyNK)W}t`e|DNA}`5lFO_)*};080Vgp7X$^d?m zg50(zaS+V!#|<6Be-#O>xrLZvC&~MT$+R>ef{cy^t;ce@YvPIHj)9V*-7Rf;IfX$E8&PlI0sTncEuz6I`;;(i|Q;VbZ; z$abv9pKJbJ)A(sfqPMWm$XDz!G9&QuEa2SQy_nz4*p1Pb{=nz!E$HSUEc-`l7k?@_(dQ&HZQXf{*UND?ZgLRr~E z7pQe=qPLmmf9UhE2Rd5Ly9xXb;G2Nv;}76o`RM-X6(#24p7p-wR&1S<*iPsFfPfpT z*%1#!Ofslzcvg%tw7}%6hhwZE20|fVMI%lq7B=b0c(v%I`c2MMJ`V@{ww+nvcNzFe zz-fTy_lw~F8-9=5v|*#q@Fvahqo(mR3`<;3NFfe-ObXi{gWbCWc8&hW{QeyX_>pmb z8$5azdEfxe?=j#~^tt-NFg=VfuO8RiyR&d(VMBT}B;Hud*pC+8V;S2d&WaZbB=3ak zz=kP#ws^EuWAWIum>a_zIf;KA#+n%ua>;ROI#Q~L0c%MBTf;kL_nV=KS}ZUIe(dwV zKj2UJe+c}iz|(-{-`wr{zCiye@eiecYBWxi_3(X#LY$M~FTP}OXd)fgEp z%#7kB73Xl_y}``K|Ip%ei!GT z1>6AEZuZp!7bteOkwD!lM&M;d9C8aghNPdvSCH74q}j$L?|a(kcMtsNd2${2?ZDlD?!RAyOWFUJKR^1u_rdc-&IOOtL*`wf zXXHup`^{%$vV4Zex$TCU6w{?WiP_#sS5?QWuy!PqN4OQvw0fR)JHd{mSGbk2spqKb z5jio%oTB;&Y2%(gS>5mZ@&CKeZ`-*Ad1?XpT3`d9`F#>x%I$%FZu;Ne%kPG@b9i=U zMobC3z1^?!>cQy#Jd^30*i%ZN^7IepXTvO;_8cu8sY{ zFrHS{BD0-+zRsz%M_F@ZQtkhR-`@Orh4E*jol%&}h{DD#*-;hoS{@(gAq^)NsZCFhpm*V_k3^21vXu1x zJO_5vjoqK<(YVzofx0z1O(S)pU_!(QQhk0hnJi%;qP7KW_erAdF6zd0h z{8xVaj8FOe%X+B-Zv>hF-M;qV_xk>#KlOUqu=WHzjBsA|ht->c*ksYHEd07@JQx+L z=}7cwVjFaQN7G)~YwUS0nE%wT%Vjc5fDr(AZ>wIa@?NDLcIwyM;q(RQ3Hr72$#e4LtL@=(=O z)61X)A6?J;e7AqP!1uA>Yk>8D=KCISDLQZP;Xpnv^xOO` z{Vpw_|9)W^_hWe~&D65dl=0FjH;;JCs!ul55_?(~W;LhNC8Y9k(chD9A9D>`Pf3Qn zPcgDIR>YE%>v?h5Q)!=oQL$MqFsG=aL&rEX&G~xc?0>;;Pvrcc};mAbG)xF+BZ8)^w*=t4`VaAa;Keow>lGz zR3Ut2<0-dVwMNz>F`#HH$H{73D2};=ldHU{I$TqZnyMxuUj*}#*qz9$NotvS9J&1$ zn`Dj+zFdZ;3_kmR>$htFzV*G}AK)c>i0=k;yEcGJ>HoREPqht;tCM!E-_B#sXKAY^ zeq^utug)Fx-~M|dB3@++??@Qmh)>5;1@Dxk$lobvqROTt>1cD50d#7{TBX%_RUb*a zb(Q6#z~X7QioI%btv#`{?^2~IV?4T7*&tZz6T4Y|a$`p}uoL2tU3G^UZ!>N93| zw>#OK7{1wbg73!g-L-zZyI=O({T%Jm=gKSK{{-Fvbi1$pjNk4pMdBzntnJ*sdXtww zVV`-6KQH(B^3pFH?!wZ+p%gy+ky7L8P}9Ni7p>0vzed3?UtIx~E(bzaJ1GJh(0 zp6l43F|G6LScB;yX@tJqE@kF1^*iN$Al3c+VgYnR!pu0(9s^ZUSm`~C4U z?bY+(pWxvOOd|&9{`dsAlwxruL4Pcjh1zu?^RDX#(Jw9he#m${MQ5Zlp)iKlDOQ?D zC=6=6V<&-&xIVX3S65(AKzNsyg+lY(&hThhFCqHI*JIvjT2}?>>Ww|G`TSlFKY93( zefci%2Y`nF&F^dAQf3vgN6Nfiqh+eY=6{6#EL+OkIH{)_l5sSxBk@s{w6{^q&T(ff zt>$zk_!5sI+v<=L)8@%#LLl5DnT5O5zXBO|&!2t%+Al23uf^bNfenD>?>pd9u6@W~ zSHsUm;jdRG$f)0^zHVJ9IoqCA-beM7vZ5Xe8(%D$kc+EaasbEDtRa&1z<=~@$v4C#RJa8#mum4n_-`D&3j*Y8*#l~TCIbC$vJYfD= z&h-bB@nUAQYR@#LMyp9C9&0R-s9h>&@N5iVr}7GN6@R$r4WEyF(CL7VjQg$N2Z5&m z%}4n~J|BmF2QpY1^|^E8d; zS#MhAcMuwJ+HO(fLKW6&db=?WyyLfX<;8{l<_z$2f%5^~&g;OX6w71d=T9A)4cY4Y zuBf$}jfMZkcFyY(_0AZ&S`7Cw*Oj!dv7C6u-S1W0&xKLy9|-8keEKK2g?2dtXg*rN zrRe)m|FCmCuv>51b~Z9z?^;j38!)dS=9uk-$$b+KeO6#~CI^W#nPk%HY)u&V(0mdM8o@0_^R%E$e!GXn<2%8B2s{pGz9OIV`6_lV@VE-RL=Kp*Db&OV%qRShpD<5gbbr{mNn$}=EZ!(d zM@HlUppwXQg48-w&DAO%@df z{P#ut@mvXin*S}}JAg9*&Hn}9QZ)a=<7YSY4rxKQ>lhNd9n)i6;i(sz$Vtr*9<6he zOFaVt-GkJt>Hc5v0pNE5EwOhLwbT0a*7;qQHjYUfUsVW@hl6@sK3}MJKKO~iseo?J zr@*BYnzr=UsZb&Sg)NCsM?VQ1tA_JkKRiHDK+{V@?c5 z%3PVgVaG)naib+%`04bW>?l(_J@TQb-`@wJujRV|@YjLA0h+)6bD7Vd^@4wH&iaG@ zsps(^e|kC-DRD!>i-))~D)A7V5_j<6)D^i3wlI9r3&QK_-_}pLS^EUu}eGmED^!2Q+`jgG)IO$WtA|i#} zi(d(U-xt(-J$2}PydV5w;Cp~>_s_wl6t`canL}kUXuQtmkEl2EF<$Cgy4uUbAmMK= za+@oT5dNDFM~YhD;kSL(#L#sT%E_e{ zD&wcz#IRjPyyQZtv#L}qp2F!NYC6^8vWR9&JWmlIcr9oI6A^=TiubNOo1D-+T{DVC-V6q zpLO69fJuPnb3V9~j~-v2&%v&nL${R#K-ZmNyy|zI6OHg1InHUBBz<p-j z!unhez6w|iXg;q2m-5l;bKRyLeZ5{(N_qZflQmk2Sh*A_=;xld0S?$`_QYU^{G@s+ar4*Oj^gLX% zdP|T!w!Cd6OSl>k56Y#F@>T`;mm?0Z0je@L<}F`2`*7Ox(rm!mB9fStn%t*7Vtnb& z`~2;Oz8>$Zz^?_a3wZjdbHrb-`gzSM#?mRq_t-8b2#x(g{R7mc+t1VSMgm9!y8Sia zQi`|#EOyZ~a`@w6ws!M21Z4f5XIq2U4b1KnjKiW%LuF7c4tR?Set7u5djvK@NAvMn z@T-9@0Gf|m!2dUVd>|A5dOs800sWV$U(^35ct@ z@>2T@lHJQATJIy<(d4&tANA>W-U@y%a37%Q{SaJ=zBdl{Z)X=~s5Hrrqd6^-B;#1x zYg~&4Pr_n|(Ib-sv$O@pO^fyy?GNauzf_>#06qfT8+`uH3+!0K{na+E z-nOoH{dze$x;`)ZHi>3idOurSxB*2*DI&6^rgIC-g}n*dz!PXm^i09AYV^1Ge5?%U zh+Mb}d=Ib}(0p7U{9en2`cun?yi+9c0pf-r+Z-E^r(0@U?`=7-^fk`Luvk~);vT_g zNy<~ewyLetAKjyUJ_ewp`{VE6>dU6#0Gf|Ra4E&^XA<+gymxEQ37UiMxi~?bgPYgV z-|)glSezh4k}L~lB4f(L%4>^ZdXzUl#4_;dm5wn!KO3Q^`8gl_0^p*6hY#QH1O34o zKSVZVbft_J*zE%XT|xZ^sVfgf>G$7)zXbeYNd3j~9uMCCx2!(9*OOG+jjnd%B`8Ru zR`DJ#wPA2yK&SmHg?20kKNVOF=zhH#T*{$GD?H>-;J=~AcRTOZY+olT5vCd@#T!HS zDzjhx6_X-K=DzC~Z(0k`tB-OTh{`Czek3}8Qq_*EJeAPrD@?oDtTe~ipFm3=Pv+!K ze$cdDSJ)UPSgS&9j+eX)`s4h5e;IyszrPFa+=wq2p!qEYmr`sVY{kkiJ|^?F@bWq= zXK}8J7+p(@gKVNa-G&D>Tgph)5L_Yhp6(X)anT8Z@H<^j&|@x zz!E_B-&$}f2fyKu_wapr(>BTEN$plgBYW~9pc4oiU61lOx1B|rOPLjsIzDseM2EL2 zC0J%w;X*dS@6Ued=>Gf(_zS=Qp!xV0_=oec5I&Yk#J6XwFR&vQi=@xeGvs075;2se zT5gKuv#?SrkFlkiu|ol03vVv)wGwC0Ww|T;ym%WM?NV&E!Fbj>R zh(?)Z7;~6z`vZDy`wREX1>h$DCj*+^<=|3^-!p@EbpxMrOmqjWE5$75r4j4G=jp+4 zGY(@%s9Ewa6RuW`VRYndu=u^Z=m^sU>(=AM62p7IO_hq5>PhPFq`cl=N8sIp!ux^ms0HA3id^rxa0=t**Rx>&$iV;)~#&YCuNAvFs_I+61HO} zQ;rvPJA(0PQ#1828T$i1HbO^_(}m#I0M`MUk4M3!6u)N%d~99aC;O0h8g|_+C$wme zlbq6Bzeh!a4;7v;L@`E?I7NeCGlt=CC_*NiFpp`QVM*JtSZyNgOgd}d6u+M^02+C| zmvf^Td=}6FX#V=ZrR0mO@4le5WMjCJz zkRvL(EnVjD_%sC9D#@f2LxV=*R|0^^WM1uwMSbdW6?C_;f4cG*+6`ZM_>%s<8vJJ9Yk=mv z{#Kvw{RjO0v}4%$IoRK;#VqNWyvq9?R|uNF7eTY@X-?3nq~xh0ZxJad=+Yeibn-k; z1?lz@;2M=+C3RpZcF4%%|)ui*ZEu4g#KS`MbJV9&EYO@;)-&S57jx ze==fxHQtPukF0|_xjU+CQ^F~C67fW1#A+pVi)BVs19qGea#>c+Xds1ul)sE)1IXhb zA@>LitB+Od#_iJ4{3dO?BPGXZ1FMT<65*=#xm3869V?WqC1`W3ci-4zwW*((s@<%x z2$R0d3|(uw-Q1MB=J@?_koM~R{`cUo0IvppAo5l*e}lpKv}wm;c@kQBLQZ3&E6W?f z+~d7oL_ZzSX}_&N=Xmf_fK`B=ADh9YeB?RktzVC%kn1>-%WBt3<6xrEiZd_jvlc^{(In$fTrJgyH9_AaL>DJm|w$Sdv#LJe)D&v}slExo;)y|7R#J^ONbqj z7na&2+nk6@djh(LsaMlYV)bbNMgp4d9B?V;1^dkh#7X(`fKPYH>a*AQ@m%t-;mfwNh;J});2-qU>pR--mwnLJ{M`k9AMgO6`Fj#v zitd+nK|a*?t!MAz8cgEuMI_SfT4($^>8GD&uSVg((2aM=L1-);l9+TL;G^Qs0v}Vs zj|AobnvWB~rR)y;CwB+&1RuypVf*X4!o=Lx)sLfpO429TRtyieGW2C5m|~uz%2Wa_ z2q_3WiuTR-`{j1%<)J70+!Nr>1HT3|KRfU8`8g1rlZS$H^8@*L?>5(O_B)n|P z=P!*Lj|g*^6-GufSu`_wJW_cgRVIEJifGb-pzDk{c>)dd{3OAq#?v5dX(OE`t14tm zuDb@iwTaas@8DqY`btWe{7`|=twyRoZ-eFqHLi5N)RbkedGt8N0ACCLeBcpI2)W^gA z#eTmH&@XyEy$x>NjqfL*`>h0A%17=~GM@sW&Pq@ASK4gj<#dTR!$-+3CF^V;po?fa zNOv>%HsFkamh8hHDQ~aYwd3r7-VCE_hH*H}>pZH`3O3^W62E;1s54J}GB5rU{LjE& z0o}e4-}Kw3<%r?ynLDo+$L9qZ>flUyuCwbwk*y{AF(tC~6Uumpr2LjOc3N(-JR6XU z%d-)7oYy^S!}++A!&ID|Xt!izWu-(6%k?x^vUQpr~b(*@2bl@J{beGR(#XSW+Cxc54xP^e`^DJ;F`aPrJdc?u~Su-rm z9x~sto)Is_&zR51>2ix>T#;$u% z7lhAd03zaX{yvwtIo}DGj^4b&^aJFv{ro4;KLf8C8UI6n+sQ0BbWMCQuFk+yMY4LZ z17m__(-bCPl{XD&|B{jJGqv-1I`txaXjc@x63v?!l_<% zys;>uIRY_!Ysr1zA6$0nH2bYM=)f>U{>)eRBK@amIqydfE9XnlFN0T%Z2zIYv+`}( zx!B%m$$sx!REgd14H`ZT_hk7jhCT_L0&IQkfR;39?~lyqu=QsczoDn?t*1~QUz6C3 zEjN13gVYCJ>A6Z&Ze=;K^X@YISac+*D1m4d1<5%ioWDL-QW=AHbi0mA{s&8%aF_TK=SY=VSY&9-4;~;az=< zo;<7wuX#>?$%rE0Tfr27s>T)sq042u_A2HM6MYtTbP|~$;Y}})dO!FvE%zSe%J6qt zx37ZU2fhxh+<$_Wl=-wCy$#2$Mc^}r#Y7=*XKE9e3e3A%wT-?h+^8jQc0k^UQX zy9_U4s-=_7NL04Z-1WXwN+2PQ)>=@U!paOW5og5}uJWON(8w_eA3N^ehYo%R{U@+; z)I&=;Xx?*tXn)kPi_lYq6vsa-dI7cPP&TV#tI8h9`AT}Ier2r`KUg^GEexnPYEozQ z-gIQ^Tc_)#3x2l0UIP6&a2>Gn+y^b`wQuNlA9=2jZRoJx+IlW?)2G$kberdVC(RCx zJz10&SgK-TvC27`%8QOt4||UxuHbQaZJQ?bMH+0?az*aT%2f;9044$}*DPpBx%bJN zRMhvz$!+KC>gZx>N;S`rvwVy5M!HT7er0!_F=zSAdd;_+d~3*8#=&0bo50P$^1TaM zlHCt({?IvVi0_tNn(gtzcC+&iY%!Seriw25Fn^N1>Fzar-z8t$4&^lC1TYy`zDGh! z`cLImI`PKIT)V6H5tQ3c&f;`14T$*@_XwABiY+T-yp)J>Au*+~eu^LyPujvxrcKww z`pqyZNJjiu`}uC;jJD=--34faO>4faYiK*X?Jv-uCP=6{nhVaaZSt%~FFk*N81vls$LL zL#UU^8>ol4c+=qkEVjMW5Wk64;^;z#Qj>?{U_O%_x*k@+*X~nyLVpTe2&`Pa(30$X zvXOo_q#oqD1qI6~+wD8P*42#mGi0;$TXql?wSHky9zl@UIz~#dkU$|FO5{Z&+OwNK zoj2_@#J_0lTEmxP;%7w8+6PH*ovz_I$oqsaS z64Z|T(OEgohF>dr+i|uN`h0K^u=Q{Yw4_{mN$TOqp^3NkLYE4dNChl^o~=Ln2;8-J zp>VKh3>p+s#u3Ym9xbYEN`0EQ)fAp~*`y`IPm@yvKj|;w2Z{F#N`RH88d_5B`9`k; z;w)SIRiv6vlsnS}VQ0CRIO3KZ2RC%nDLgh3XKX!&?`HC~_5La7PlGFg<$FD}q}=y3 zmhUz_%PoOzrLg^^^Db<~CvQPeS)VP$RvQU)N^UmoPX3nvKcS;sJLdz-zYQ)YdOsI>FZc?u{Qm|msm07|Bky~t z?d$^F?_L++#ZABaqCC9mcaK#+KOwJrmcJ0fO;fEm7MEoqwq>XyMsYXEU=4GiP5Z^n zTerJj^>puuJl-51qk0XVCGWdzJYTOi& zot|}rM@6z1J6m-<%Vc58xgL54*bQtsFN2n}%IGaeu4f%*?cBO$gQ!&fJ~c$YDt?Kb=eO#V{Ozk@yq{sJt2>P_=E>*&b&a2xSOH?BLO zW6zKu_*BihYT~VZ0*CZt8E^G!MTm(RK!bOz%*Z-zGvzn=3;z!2F0d0={+F5WEnoX- z=VQ%Z`9_e@RWqMS7~PGte3SEn@Hc)SIkRJ0s$`h0Wau*d2TcCL|M$>;0e=IQe__8a z{~lBRk$wb+@y}iab^Wi~nddBj6>}oLmabGtTsRMB*<*Rl+n8Tiq{8ww`$u{!%&v-l zyj|BvtKlc|oCAFUxCB^vZh@Bc(eku(?$mE&sFQTpppxc7&$%?nsuWl9a3v9O$BR7S zGSsii<5v?p*Tvq+fda-wYp0gyApGn+5PHOQNA0NkN zV)->Z-VN6I3Gvuhk{_Aw#pU78G2Q~bRCVw06ob9+vGs5#^nKs~VC8rUT2iiklzQpX zfofMyEUD%>%+}*%wfKbd6>Mq>a0*orsCKD;3E?q6JB*#3p31oFu`K_|(DT4TVEM0r z{*U~3uHV+RRo$hgGGnpoDFc})R00q4?jlAb?jf*t3KI8fqO`$EZ{pB;-DBkFg^%4o z+z-7UJOiv8e}tB_CWl?dPSo3n)J0uy@GIP)AMn!+C6VbzLwp(o@PIut*6tV*MN0ElI*8)wGaK|cubP_ zn0~Tk$NCM%EBIt*`DEuH&R)>>V{uAoCCRJX@ar4K??LD%!PCIj$E(niM)FmDWo>^* zw@lSWwAFWr-!B4v^P^Od4@|5##SnF6@4Zm*kt|4!!-&>&n2i!M|pRHdz@7VdcVZw*` z4OMb4mSs2jZm&P*CaL6iXzR$~_}?B@$*p^I{YIY5>Z3+MH_6|Dlvv99DQHQ3KhWpS z<`MqtvQqHx)BWz>e6=S_sXf`9L8m{${L5>usa`2wQNp+;9ThB2MB*vbPK|-`Dc)>; zhvRBa$*g3f@x^zTS9-K}T#Yx?%L||s$0J{TI#?T=9F{|96LG*UbiMPv9fW%K<_>ii zCwZmZxUFF3+kQ_uQC6VV^5yY5l$&Iudf|paO4>a_HdlSS}6Z z-ZMY3l&vEwGoB2h4(6hUIM(71dV+VVSLYt-n;Y)rC$(H%@NJ+TrJXN@{sOojSh)tE zCB19xX||g9Ubel5FD@copLHW$@;kW#u0A^3J(iJH?vVze{G6K@2S^3ID$C@~X zux;V;yoRV(*NACh0232gfttKNF6+2om=c^%P6Ov@d24=DmW% zzbGDIXEA(|)AIgPD=3SUy!Qs22V+)VjI=mgi^MoCFPcy&=2{q(p`K7O=jV+=W}-mh zh-n$H{{n%hvU1l$OKQ#WZuI2MI5utPNiqw#nWGWk zPhR1&DQ7HQj|ws-ZZ5@dsF>`sF&pqfBy@k#4@*jtsoAZu9%U*^e z@_4iY0X+ECqHiZ`7ruT&M~9AP15^;J_m0YsRr-eo{fV=@33LOoB<=KDdC|a&aIP5- zrwcbLtu^}di?sZir?d0a0_YRL3Si~$gqC!i(d*iMt?j?E9&eJ4(2t)-HARHg6w%Mz z6mOLJRJua^BVqj-;st#S|I^6DQ@p0EwFvv`i?uxc@U!*#JoKyJ*TBjXd&bnKk*D2! zT6yeT$=&SI=jCelpt_n}{<7y>AD^gh=3;r6-G_+r=z5KW-=GpNa#K9J2xHG6Yvekr z82@7p0qhr?zDu-RtKe(*EnA__0~Y`**S*k^YRq}J_lZN>nMm9lI_xeR;a&_V>F(Fk z-4%3x8<$~&7l2?S5)C~p)`#V4jC0eFXkh%a!_DKuq%ashOIwgO;monzJKw#<^@D-= zp;QoutB9{t>*ZSRb; z^NqaTV&aT6Sy7q(m8jZ<{%G$2>NIyggUm=a_-QTI?S`++o8N_g1Uvz(T(6q%?Rk2n z-GGuyhqY_|kvbIo)phP4l1ZMijKQgdl0^r08|{7G9VW*WT8_+f+4@-wy#}-bE63T; zl1A>oY=2|)Zg1b+C65}UhMGIrm>&TuKs`t-h&d-;<2k&c6Qi0%{yd3@;E&5=qLy*+ zEBphfy17!z({K1my$nFV3Vsc&Jby9Y+jF-4wDPET=+h8o_Q2}-&#!g|Rv-8L>X@^V z>ilD983(3hQL=;bS*{S}sXFuHXHEIZ-|{~I{VMns zu>AiFEh(2>fXwpSI=1Z;{@QU43Oyt^!?`_NCF^{A98bNK=bS2UN%ox7XZSY{==`Pp ztDxJ#W?=b0XTG=fZa;1P@9t`6g|QMymuP(=$bKWteq-eygU+>)T84^*q9?*bMD)G# zC!gc~XoAlspC_skQkR=g5f9*as!c2C86yIG|C<&?3D!2l=#s|IsYS_4%U=# z4-wA8)wO)*#b$+1qD}wgdVf*x=z4o}y_WqjTdpSP>0lkF_#7LPyD^GUbj8@YW#5)NQ-$XW!Xr`Uy=S@A3udRoB zp}zwjFuY`6o~vJX?Z${#6~EoK!U5M=3Eq$55}K(+Kx{GtiSvbVav&Pfs=cH*>fA3vpwfSN-AT;wk+B)IyHqw)749WgnkAmXf=@7(29 zqDJ)4lF{Uq_&-;(8s#@~^uWiq``4iF0N*scrQPj0(DJwaY&-YWFqLUtDPEG!s-*LP zD^;mdzsdhy^0NDrvL6%Y4m1E;PO&DDwE14WFY(PfpSzqVc6Erwc)IoHa$b@^?yK+* z_k!EN7{mE;C>1JZq{$Nt9X*4qMIL3;mz%imO?1C5@5F$LasuNo==SJE4qFe8KtBTp zfR*!gXh|dAedm^Q(N^PaAtN65Phu`u^$K@$Tqeaaf+*mrC3Xej%AmwaVggu&B}8j> zpEPLXn*CC?f3ARD4NeDEu1;u`%ssxHCv7`5Ops<;w4Qfojg!rODOIx&P5Y`f&W$K3 z^Eg?^I~2BY;_Rz|>XGN^&0o~@azFXo_InxnHSjvH{QaM3{v+*7bJvTCdn8@7`4q;= z81$yAz9_D7^yNJ-$1x&`L{dS1qBm6b$y2A#oj z)b-jua`X9!CE+;}A{uJHr)V-UDnhhGJ@;+rSxD34jN z0*nS$E}0o6-T7jfBKpl|?)o|<>tD6oy?}jnxBFZ7e0tNTedqJ|!ziaeNpF{{;(GoR zM#?brD?rT_@i9ejoY;@Di})a9-Bs@N>l5G4q3Ld(Kg#^}8}!&y>;ned4fiy;0=)s2wM}K9}5+ zeWGngV!;WSA6)oQ~_*?nbL$`xXMkblJMz*^h4@NHi40DHs zaXP_Sb%OIY@2}$s5_1bfD)Muy;nO#a&oj_J0xu2YbF%S^Yv;)ke3VLfL+7?_s&Dx< zOR5Ryc&u|d4{BU&h$Fq9=c z74>;3g2j>JJni~(hZfZSuj+c~hOcd}FF=0@e8tEj&6?{xZRZWMs7IaEQD;vSdvufU z;IMrE1RePWJ^+C&Zws^}-{^tM-YZkT7*Sq^Ox=P;@X*Z)|~Im zR;OFFfX<@Zs(FXEvECwWJJM(P*Kp}=*UiJA=Ysjb@?Q)sY2^OP*5A&KZR^j*Tv?5Qi%6_ASmR&RGIj_65OgfET32qvAXz2S)&R6iLLY&4d!A|X!>^9CB{JN(YmHj%~ zFD5|G0CRwq=XhvIFPgYcBki}h;lOBUkvfT8`xF+bH8;D?0j}BO?Apsw1jPtjD$egY z-5i4+qL8_-=MK$(ugPE9<7?1&fqQ`E|G(yY+Ya{Awg+Lh&4Igu1NWL4M9iurmM$I& zM3q>{gH$~p2MoW+Yq~tbuN-<5s0Nl_z4_kqv7eUT?(LRi$XOF|y150y*;2?EH2H7l z|J(k3F7!pcSp7_v)bm49XmQzfYZ#)F2~k2kFg8E)NQo6Ga17L|uXmyU4*qF)e$@IZeAjK;xoPvdHf>s5C+B(0x;_r>&#Ob~(2N>ev+%U*z9FsSH>8X=~}& za;Glm0DNpc{|Y+xTl^gYD@QZ5q+8868hKA3a%^C~C&Q@6{iS{iQh2pEXi2J{n$A~r z?bUSNHUH;1`)LLa>X-*NVX%SLwPvap9haymkK?7-FDfW3FRD+?lBXAJTLbEG&M|==;Hgz{>wCXi2%&1yzqMfg|>Trd#(h(STH63(T#yDg4}>g04v_j1;F_n6Hi{08sR@@4)n+mDWdJ{5cn zSouB!Eh(2DBw3$#ZpGWPiiOp69`jT?r~uV6T|LCT8~&aX#leF3s8Y|5$3j&lUPaN= z2)k^b9xkuQiPnqHxS~Lnc3*M4|5?{vt*6wQJ}u_~~!0U&~xogBe zcSufIOIlA_#};Cx^9m=?2%dO?ekz2)$O1p@bQ^xl$j`Rhdg#sIOknw)2QBG8wcCyk z;yf#FpuW7qb=I83J&e5FK^GJXCP$;ir)f&WEs;uthW~z(zl^_^p$EaQf#v^u^Szz7 z?5CZ-I(MG4rDLlYJoq)$)$kq56^z()D{ci&@*dOvzsuHZGxRcW9I$-ap(WY&|8TwT z+PP(uu<5#%Mao(8C2TWbBn~6-g(C`4yp{OzN@3jMAFVRuN1x%}NB*{+pMd@`co|s! ze}k4}?*;xne^lby`&Ey-T8-q(WuQB2sH7|8IW8&?In&90v4&k#wGvK=bhx*{JC^)= z@749u{6@AuTA)t_tAUkgBebMk=NI-Zrat5;q_bwVbLWr%r4r)2M*Vl*zH5HBlb`L^ zk3v5I_8T5DkLR+3!hO?)Hp#|6*C7cI|3m72lq{%<>`)vM|(4#>uko1xH zZ`s6y0J!kaYMeDS&VH`#Dzwbau*x!~q_;Z`payPTZfUja=&+q8givYHZDup7V=Hz3*X> z5OC{5OYtT(!6)Emv`j3I7NR44+T~^vy6;Ja7T9a$E(iQV#tvZ?d;+ zSR@{2hiq-r&2ov+!ai#4Z7A$z#VHGw2Gj%l9sUHpl(c?Z^FLtnm-*mL=)Zt>faU)$ z^Szx1?5CX%6#p&T+dKBqpsCF9Q^L;LP0q|J>U_Mcxrcd8Y6mr7_$~W`E|2hA1HA!k z1eRZ?`QGxepNH_Xrtd@ij`|S4=I`k8-EZ;}e$PU`2z~-Azd`f86a){2Kn4E#Cs@CE#da`7Jl!TR!&l5PrnJ-m!6O=h?%nv~?s$-7RYF)8*_n z`ARvz1^qqn5U_loG~Zi(_VWc zD&DQqOQ&K`r1$yFhTlQ*v*R*wka&Qg1XzBHp(VYU!=AXkV`Ik-bI$U6+(-2W@h*Zu z6Zhs?&Y5+^M6&Zzexa9-gA{p_#Gg^YP{FKd1*aaOO-{@U2de{>mBliO@Mki{twS&V zU0olS!{5sH73iD5%|@n=+NUeI@I0rSbJjU)>zr;jN?1-9P4+>P|Leo@=hoi|fDn-M zQTgv8y7pGZ#F(y(cGiw|dJK=4lYBtS-(vET_S_784mc0k`n}nFZ`;v+4z*{;&Rs)n z)HK{fBwMvc-_Hkg-&FykMAUj!ax;KeA$g&gWXC9XWo(hK6d^=e@ffD!PVc&GVCLTM zY55Mq-_~#7&zucFA+YjQLQBe}PgAlj)GLJFJe~;|s~uj*pw9*81IzDf^SwRqm6`Rx)`xWM$a3!v;aE4Zdwywe} zbnzSJIOpmx`dw_gxIp2VO7yJWQzO(TQLF3=11-t=i*GjmAuK=D20J=-?cO2$m?@vrgZPX3BP!c%nKEDFu2EblR$&W}PasNs z!_#w$`5muRf+cP(&yy>|!FXd{uuuhSZuZ;wstWy4Rd_8&gvWHd>_;BkZw8?cg13Q{ zxAYw?Z`XkCFWt`{+Hb_)_6{z4RkNshXV85q@T%($x&;#JZtdm1^Uol0&3Mq{=SRKe z{u*v=M+FX#tO>^=IJmD&$^rB+`b`a9-;N;G#wnpAn3ZY@_%(WuC$yYh$YJHY1p0H} zI$-6z2U=1tefkI?GuOBnF|6dczV z=}yweWCvfFn$h2~^F$$Z9T*3!Jg-AbYJNr6SNrRS*4w5|+mWmLy+1@A_S}B&zR<&* z-qt=>z{{E`v}AE;o`zwz4waq(VUZvKsI?*HQY51?j1?~wM^ zdyo&i-2A0w{*8`L9F{jLKDXeAA{cVqajsq&*^&J{BE|M&w=g+ z7Xe$(pN5w75$8nCC0#O>coNUp$v96%Qht@=q&-#}r_1o!Pd--v^)u*SfM1%tWqlu; zBVMdrOmC3=DI896)}BP*H`%-7M^YFm5TIFPlQdxX%zjVHEA!ED&?~@7V9T@Cd~fF= z`)TI~j-fmBV3Q)%j6vnFw!yhLT0+}Wb=aqCe$Ml{{%$8fJ8r%U{RnshSbjf-mSoTU zcN+T#%ddT?pZeYIr_P7lMXqyIRNHe$J^ZB$+cduSr1qG14d0sgv+dRdJsr#hmhX|! zl1AYv3Ee@_Q2c-|@5M zv@HG1EzAtg+S^f`M-xLjVr_#RWA7wGgAylD8E+xO?g3rT$-igoxej_Vm z;UoR)F6f8BW5CK0{fCyr?wdyHakKqP`vz`)+GVfyN$_=7PSDp7vm_?><;hSnDiHi` zF%jfR=i@0L+vadQSey(diDAMd5s$=)w1e+$L@xA$6LE$ZXz&sN6?Nx9*SpL0ZZdZ$ z2Y;mHUxj>j9G(gNNze_f{6B`4G-%?QUToq7*mgAiRSQ4he%^at9w$7GE*Ih74LQG! z;X16i6oGL|9Evkoc}GQP*fdD{8;P=?XmAL?-Xwn#c?;eb)l(2Y~5%YmAZbS%a!>c+dq$lJ_VcxY`Jzr zOUk8(!o|K_F#OD1)~?auL@-Kv>oX{`@)8s#8Y{%=J?Ry=6Y!uL!yJlGy^ez`umvi6 zr}==EryqU|{7U-C^UyDWmw}b%b!bT~<~(Qni>+tzRwK)OD)TY!#aln_)Xif@5}{t{ z3KAt{p+8yl9sP!1=AYSil}NKEgH^!tI}ch?u6s)Tu53x?juuhyz&PFdCs8wry?5*N zp3}m8p`S#AQU*&9-@wO^IvB2 z7yhS1Zw6-q%l|y{ywtf4B8?lB$`Z41dB-Ya2JnA^^U&OkgQmtIqRN5m0qCnpLv3GOsbQy2h*Rykp zoxlb(KM>}9KrAm-%&A5mj4btbd#kJyZ6^0ubiK41zEUq|LGJ z*(vLODl=1h=t;!Pt70bNU6j}rOfve79>Z_I_wJ+S=#YQDF8?B^l;w#)U` z5Wg4x9lwKyU$g5Ct;;K**MjxH^4kq9Dc8M+YWKFzPR(%v{Z5WUt>-&GbvfY&u#on~ zM2N)Abt>f@=Pfto?fSVH|KxA?1usJX4*UUF{%3ms1%Im_OSk@0youf+9iRyuwl2?U z{bta4!>tX4+*GKZsPh>3U|WF|n(Mg)Sw#U72?Q`2_QN6Uza;Vix6E#UNwprudcdt? zo5{_=I?vB{eU}3Pzx4x2?AQE286(&gh&w-Zok?p>l0~gGzdsyAB_VC`Dx|%&n>y@5! zVPFa-Gx_Ls>IlR>&Ev61BAlnZMf{Yfc0=Mg{lC=pu^)c6AN&;hH{f+(<#`|aKgy%U z(Gf@{NjKb%FBu|`upq^VwG`l@gigrm&U8XD%=}98U*>1|uZBJYYzLPAwb1{O|7O(| zRL2i>b(E;;z^Lxdz!bkBgnA+tjz&28hHx||PFV8@IGhadG%R0*`+3F1g8>ajYW}sB zYY@J+UfzNJK;$5hk(G;UVD;~F?dMcK>FQKw(9%z8YO!u=J;E8FUZ@qBgvMp9RoNFB zzN^UB_Rnq5yTIAN^1TFF(#U=DA@k7AT^z|b3ES4=F$rkh>>Plt*nBr>))`+pTOyx> zhVKCR+I8SH=r_SZVEKLkEh(2BvMR5=he)^FChodh_q*thYW+)GmO(WlXYlG=S9Jet zru{?N@~(ky2b+QA`w3{3a^3fc@}XlRk3K1GI&-lr!;x#AH;sWu9fihpNrq!B4k{)I zA*t&(rvID#W!`@Y`VZhw!16yStoi3!|F^B*B8nPf9`yM)xx_qZR6j3sZ=#%S7loXc zuw+U^isE_kv>z?Tk#Yn>c1)>i;&EQ)<`K*-Nu-TrsEAm9Np{fq?&ruKC$@Sloae>j zF}9@WXR(f$gL*AJCsmMcs+4CI;mR?^?8xzKJl}oGwyCI8dLyVZ)45(Hh=qR z`>E2;9wuE>d8%t$;`9f^j8ct^4Et9Gh@?TokNEKF@51jg=&Qjs!1BAtd~f;KPs@)Y zZRps9Ezs63byiQe?h|jqZQs{MC^Z#LX|X}Bkl^*~A{*RzVMRp6_Fm}yJ!{V4WZuyA z>qN8i6hfB)BJU2#Gsb*x<*=Vto~1<1+N>-~^&!5k!TEDw*de~v@Yzg08A>kY-UEFx zxE$DW-vuoxW8OjcjW`d9o@s|TTuZmSC639@KoQ>dchBkZRXcgjQ^?(>Ku;JJO?tDe(#W5jvJPZuS)rod~4zZiicXx9TNyvz^< z)K6mSz{6IwX+`wcy1WU|tGr~ftY=ECh0*wLU9X*1P4g`5QkTt9ZFE(9W^`SALZP`g z7&xfwZ$EO{b?z6?Z-RrsmSbsLm!rXy>XU530L^n*&bU;}K^s;Sc2Q z!2ZEI5T~IEZ(?XZ8cHcbFtmhM2@5DK!Ckl=iH-?2EMq7p19xyjz~C@gNFXgKo+M=~EYd{>!#h3^*V?cgk6 z`JQdQxBTqqFuogh?UB=gpQ(4+8lC+Nw@SyU^Qd7`@^89c`^m@lpC3a13j7vWJ|93! z%4MgFsplpPm*9gP{g<`v`dxgmy8IrUC2PtkcK^+ca8{Jy^=??%*G}+0LFCzEeXRP; zMy&f?El*2Q^OJIKfbIl4ftBYT^L?&;m|9JZJ%b5owxAPXz7~)Ow4p>ybhq*+#*$|! zzX(rZnnrhoLU1nLXo@27&=_o#D$ApZ;-lGL&GFZ|m)c{blX+ju>l9||uLQaZ)B-E- zRA@?|R>J^`3dQzeN6eu5s1# z56!>Zd?wq;wm$T&#Monr z39itOp%!?X?CugfEyLd_8diSjIxr4c{;QxRyPZy{~&-(p_dm?f$2(r`wUk z&j0s8KL(xzR?fddOB(xtUY|#{lYMrWZn@NB`*gf)pSXT~1p$lkAH!Ww*k?X0Cq~{3 zubgL0N+04qmP@kh(C9rFR^11%0cDwXL%nutjA1s;+_#RaKIli===N()5%61guB6O0D0 zJu6QJ6_Av-6@FHpF6d8!ZeZoP7h00_13l6osciJM+nTN$J&dFqWit33@9LwqGA9MX zkwj5F5xtAk;nF}!gvP^*8udiKQg@~J016gIm3H88f3la6>-X7+*~`CEj7v0s8GmKa zxCe2@0xMs$`QDB@`)S9Y*fV^hW7lS$pX^ZP!|BYWa&~Rw;_34|d-Ee6e$W#*u0;VB zmx!0#Ow_A>u4=0#pylX>kKO-X2fY`3+3*$#bKNIMzs}A-NvAF844~79iP82q-+3`lLfDRT{Y35P@VG*E+?Z)zvLePNB8fR~ zd0sG(bQ9?sH#iOddVayF(foATo!k&Q&OGmufcI_mFcB^1{m5ba%ahPQ0zUy(&RJzz z&Q-?W(4G--1Ei+pz>;qLVSpL?JejZ$`pz5iadDjEjBWBtE24FYc++T!99qbb;>I*A z;(5e>!E4jY2AI5dwN8CS8LW@3_7QWOPc)PSav?e zdZ$yESA@r`nCnevSr3Hs;^T@Xgy&-aBA1t=6Wn}aRTc-&!q+EJ<4i+%4HLMo@}DoXuMrW@AOL& z#aN7R>WC!$iU=Xfijt9%P>{(_?y3s7=;B5U7a`PO9yeftc$M-PceHsDY%8N*OZ zMWW~_*7EK_9y{M%0sUog6R`4@jn?w^8~fD$XAjjop$A>Oe#7P#J*IvTRIAJ{^_Y4l z?EJKddvwMK0ku&DO1zGW&~$!Nz^Dl(XLBc)@KOPMZ}VL;qDNbU8g1!3Os28z2)o!K zHH9jYYJ`}ZjjnI%ed zpSe~{0V`$i^#Xoni)+2QNF_Z-yq@#QkJq(P%mKNv<|yc~3*?j3T(0GbRA=`exczYI zK_js8d<S<)Ff0(zQjgw2~Q8ym&ZK>39_92JuHxEPq06Ytg|e!P zIg%QjBo)Y9@M0-pSDD7d%P@94c_JhS4mKjR;A}Sh+%aU&9bHvgo&$!T$n!_&_rX7b zm1kM4me;OdM~u+7cW&=Eq2uhuBGU2Fs$KU6sIFa|$h6-l`c`echUytd#fT-B4qYgk z_b@>OwjxK0Px$fJ=v_>_s^u5e3 zM(Q!BNwCi>OGbR^Ef$O6%%-q3flj~+7nS%4rY1s`gz<-3;$fD)*5hW7{a>w?rw@L1 z96SO240ztiAd*W5{7XD{ z-q1*_*Yd40{6)Sqp|^vx%{`{P5@hF)_ISZ2o-GA@k*5#CEDd^ zQ9)?bT+Cevw^T;4i}RZndJRz`qGR(?%N+;XQZJqe#Uh0h)YZnAVws(qIAW}%#;Ux9 z?o+PP7}bo|^|A-~Z2!Fi`WxVGVCDZ8w4_|;oz3FxW8=mynVT|88BRU2`dubJnhe(P zIZKwqKl#qy%5lot6U9w@CcR9oU$e_%I6f{BON@?TEa?^EG&$iFvH@c}6k>sh+86Um z^kDRX0&$@o6TcY~n6yrH5BF{+7!Xfi2o3KxGp*II7vfv)%Nlh#TgT~gNc(p}e*&Bb zY&kz;zPIgfKW#q{-#Jo9aTg{YOu5&_h-6;9to)BfY_25Qe<$DlXQmgTQzsBgFZM~@eJ50cq zYor&?l-|p0-xm-tfdOTHs0y+a#;xtg~9U~pGw@J&xs|m$V>Wf%! zPCaM@R-Tj0_qpn8(}wI!f`zf$yiC;<3$LoHLXjM zpTUWc`?pv}^3x)3Jd#BQi{y|0Z&MM$DhvZe@g5 zp`fSvWYtdOg%f$ig(;0-j>aZG4_}=GvMj>%HV>6Y9*4~^>vdq98x;3FOZ~68ZV{2* ztG)H+C(fnmtcN2P^+K*PqlN4qx zwB4KxmU_pCgGQY1#e)0XF+`ad6CwN|&k74`#B*73Jpb@uanrQ?&jbh`E}I%$dsW0z zu~AGIRTUwsEdNcn7{8&yL?#en5-W=0`b|v7%e=hM1o5b`5ZCrqi7Mi*Dt1LDiv3hm z9$vvJIp%X@u>UePD-|liBz-JC#b&w0Eb|(|v0&O;QW~sEiJMtDIQ8Fno*ju21>Py+*gif6fhj!Skn_Sr|oy>&+x>MU31eY(A>)Gt+1%=D6AQ`h9pEI5%) zJQrbuc*|;Zi@B#J>O!D2iV;m=%o`nupHR6%&6TH05WX_M6r<sKC*RSiToROUmW%NvxgpUVWXs5=gO8XX#()42+R^Lp%Xv zcZsQt%7h=ihVKCR+I}|({U$gFEZ>GHn(u7m*Lmc6A$;|tlh&Q|xcilH*|P!Xl`*oS z7Dupb^V2+JkCjJpixNV?Qo|Dkd~vdcr(U9{+&IveyS0VY`Y^we&3neZNMa_A3QY25 z+x6l|T~FP}W97XL`m10cu<||vEh*PNaFez_I~qe~S>wcT(#{NY)jwbygs&yGq;#fP-}=_wdMX2^c~x`CTCjm9WZc;heCh!@Plh5BG*k5sNBY$u*tD-DK_|7k7C2nHxSYDfECFTzW z7^mNv2IMpCM#nDqil@_|miku(n3OX5--VBirK3yZY4kN4(P<1U)#dD>9CknVDd-Ep z#lV*HE6|d1=@BG;4uxFgv@LR8s89GlQ5KC3hHHG6b&3CfgfWsKpPFTw@9X4i`BM2# z9w-2o?>cBn)(`5yh&UZ|D)DfSdmLl;h(F zY;)?-nAa;^cqKB)8O5V@5&^C~MRi=^t#RwU3Nv$dAE)bS*^F$vY=G_pyMUGNPH0K} z<~)}fF@A^3XPs302i+U}w_HLp)nbF`JO3Du7+mRywoy7$BT6F)$0QoaB=5;v2?Q-2 zuF(xA3PZEx@~6BYMQ1wBztZD?KHpCUE)ao811D&?otfG89RocXOa)f%Mdo|kuJ-fa zwXc$UozYB4D`y&5jHZcs;BM!+298=xCOpf;H-K6JY#WO_EhlPudf;dK_de)vgYN<> zPyQ?|uhnmlv=@=tci13pdBx*c{7pFK_Dmgfm*Nwz#!ntjPo{btLv5fcY$6<-q9Y9|uM zs7>cC^|Ohe%tQg_stFu~Lg_?tqFm`1^O$qu;|h2{HW?4i1=H8d9ssLH{>c9L<6f!#%JnX^B>Vn- z&<&+vpRISnOfO2JwPHLOV3CG<38=@EkF4xO+;8H%cTxjm#!nXK$Gu6M z(+DOmwbjJygeD_I_oyfehxbq%v*r*Wvzyh`(ZmwX$@SNeHuF6Tc`4J_Y%(2}}L9E=BlbZEH^ zUv*(T;Jy=lUY@7F5s>HUZ5PIz*C)wwAu6umy->U)GFqA~Rurk=C4DLxsjFvikYJ|4 zKME*d(jMdM%~=@FPSxBivjxLJNMVFSw_mSs3;i_qh+de3MPt>}F^MS!u_E4961aC_ zv|w(joPdMzV(jZniqkmpki*%a6IbGLB zRYTn;u1oQK4G!~PEl5$xI)JjMNGeWB|EPPPTM7} z(>qm^ccZ!U5|7xtY-y)k=oO&f@W0*UFZ>^Zegr%YEdOWB_jZ3`KkfWFf_t6QR_8oE zbriEFIgG+lwMhpJzp@3{@=k-E2NnX$?-cWW?(%Bw#UUkbr^It*zrByWrYdtHG>US^ z+;X>EX2_4D1IOzrskcMdd#~Xm<-Q;K5%4&$a=c`|&n3r)rN}H|!5ihYwL9-C5k#vO z^h(3{HIVIXwXXQ&M$NybIa?2Np^pTMf#rX^`QFyI{j~MYdl4-{=T2O+V5~~h54}^l za@vO;#+Z0Lof6#;5NfcB+7NZ*!CM;Gl8wIPV>F3C;MsZYu$=- zb`lR!YAIP#fXXZ5?4QPtfQvV!FF0uU+;8#`KF>qH1YQP~&(F>GHh=p$#0S#`6|ikl zr}hA9xji+Uo8#1MGUNY9T{psS5%e+OcwqURWWKk2?B@`_=wi2B%H)64S<9?pE_6Wp<*8JwX6( z3UjTvgQHPQb6P5n*2czmy57VM_qoa2z3^hf zKmSbhyw7^xZ(RJXo#IY*Z}j{UWjQi%rf#nT$Zf~ZLFo6u2f&uA;3!?LT;s@;>x9nj zOFQ+uxvna9csrf8>)2h*;EE?v7_JBqz{IbQlGPkHJLh!(Q`g`=M-txx+DGNDjIWC*Bgp!Jzw=>_{I;IHk;)qRfxOdctc)cN~~_f-aKk{gWp&XjEtTctcZE#{@7?yA{n1hJUTRw zx^D>81S6s8C>Ssf!8{~yQz@s6k|lL%t^j!&k}imaP=n`>B6NMQYN;FK+>a6X8CZ|R zI90RXl|7!k(=NqJNI9y=DF2@)IE(`#Ux(_wQQ>&9lG;o+a`#bC=?0^d{F*?VFwX?& z48HA#zvw3Fiz^dV>ISM6%Xoyo8(*@4$^LZj+di451GQxQ4>z=juL|5*?5~@`pK?UKo+=4h+%J=57cr;aM7sxefM+cNf4 z;=YAYL;B7ldA8=?P5!ojUITqIxD8nTKY*5G?<=}ToPR8Tbr9*sZ-MMxFY{#Y`U7Ii z&yj1WOlWj6#pVhHMo9p}V4O*X?sdJ&0(B2?f$NWQm-_=c^3vcQEmzsHtXvbI=Yj>m z%GC}n>7cPoZGG<0{j_;cEcL>}!k65;UANEe52%NQ_XnNVlwghY!G&D5OOKHLP>|Qa zrS1QD80ed8t~Af3@%u2IyNdC7-9xvYwBNZ}&VJ;u_4gC#UxD8ME9ZOAl5)*+Tefcy zO@Owf7}%wr&d6J9DD*;{x6yD?LA`Oh;x&A zzt^t!MZ|>vUf^NZ?RTRe`uRRz(58P4JGUNQ8yTHU#40dG%4gb{gotT*Ey4?ITvFks zrL^1IXOXML zV&USb^UT~SF`mT-g7Knwu~!!>3`LlvaOVJ`+^@-mAH;!P3KwDGDKj}Yc~sHT=m{yT zTrgrBJ1RauSs$C?j}MfFdHWcQ=+%pCJXi0Dmn}@ZD^(t(7uZ!ByUErO~UO}cmr~gu29_P61_$h|2 z24jFN&m3q;xyFyVZ8H&Ln$PBh6BccHFBir0>#<`@6K*>d$uGoUkOxHY-XP}iPU~fw ze>eHtb?;i}Tfoh4k#CJ@)-8o0B$=XxYQyRa;QRjYGa@&#Pvgn=%c^$qN##d zaWF9+w=vadh{kiFJO&4V-pQd@Va?USYB4P2z7BJ% zkiCXqFZtQ|{VwQlgZqKyw;x(kuKu}At96F>{T6=M6U(;6FA)ER4c_5$uu5L5%a=Sc z%dZ}KDwqK*zvH1LD36F+j~`Dj>uw5{K@VY3>g7fPilN&4|_ zKCDt?mMaXWY^BuDH4f7*25P>b<>`Z;wJUi7`p4j9VC9LPq~+-`diIg_9abKr?Q6YS z?277uIG}9%nddyW5Y265th|fiC99f%8Jb0+$ED+>xB!pG3dcu-7@38X7V=h?XLLKb zHm4ow7hlwJu0jsmerG`M2Il}P=VzeRzt7>9Q{7M4v9gZps+5M?%fpr<#U?CG&G=rS z){&0$CVPjQlTXcF&Hn)TTmElA{|USeEPrg^6#rb~M)9{}=Xe>bo1MNR_1M8&(2kus zN-053J%;Zx^0o8%$Dr4O^@f*l%=wO)F(YOh;y8DP(>BBT{*h=@sdF(JOAWJJz?!eA9K2H1y}?N1=%Hl;^y7 zR4t2uh$8Ewe?&?M%wXby5U=4Oic*SagToUJ!%Ih#+( z%DDo16F3uCIX?$2sqb#x&LihXkrRcV@+y<=`nJfJ07aludgQfC{foyj2I9OLj(~i; zF;Ao_*(_jmR*;WvXi;T3(k=Jz;c`gNLd-)qY54}>Z|8wOLB9+B4y=6Pm0G@>^8k8< z7Udex&m1=e)%8ivT}wn;FG129#Muun*hzzi-!hY*wA;s^*Mjxtcf!f)>Fg)v-?e31 z$7Io8oU$GJQyL8A^eE@iC35l-F?H(I<>@0YTb}PjKMMwcEze8Pl17$C`6D;X)(JCH zDEv86sBzA76pDF8{gD5kG5l&y)%i(zW<$>f^MU1el=8IbEor3v*CF+Z?}8P& ztN58Qtc@K2+iCT*y?bejb)&!?6FMwZ5WvP^gLgRj)qGX=pMxfUY0uzko)ZTJ!17N+ zOS0v(pNH^o@3ibytiZOhsBL6d&nPT0_slJZUn}|9@_q{Xa&RTE{PsahN*X(g565BO zAuoNlow%dDV@Km;Wu`52+JL*yd!D!)ZBMdgSvrAbAfGM4XdE6Uyvx|sM`8s?v)b#x zW6fkHh2EP@`QcXsKPi7=HE-NO1+eloK}%{d@dNDn-Hy|S35Uot^m;paT7jG7q1I04 zS4#_-Q6o&I80?4Ct;Jg3c&nowZqagd!N=CimC#p%&l}z%L9Ts*<-d6Q?rn{e+x5Ax z*l8c9ACFR=3AIfJt4+g1qKRK0BV$L+rd4DNU zba=YS!zjm@>GMOUZo|KY{B8NVpm&0g8=n7t`MLM?xo zAI9ei=>6d7VSGl8BioLfHpop}6;ZmKE0;xNCFIB%WSuhkCf8);Z-SlzrU6MGEkCo* z#)WD^YMe~mHDQx*+7r&3qM>m5P5xcO^8YM!54h(4JAd9B?T`bvV(>OLSs0cn5uE|U z=Ky)u@GI%>e}R4nyf=)`+qdd<*^YBtKMfOxmt(_v@ys;JX&>eMgGasj=sivTvro^~ z(<#uaz{h|j`I)Q!CHJExyx`<^0(LJl{<~sMd(63*oe3>r(ye;D^bX_mAoRoF(f=<# zyVh^AY*ck!37e>sH2FJgv*jp)E&*jg(npm;UAL~--NwHvciPLH8*!Ue$p6Whd{>c2 z4S$#VzYzKoaQU!&5A6H*^`EVu_3iCS?wt#_w=W_%?2aW{*Q)@P8K*tt+`-nof&5zy zzy0KG$KC7DzXyLD#xM80A{>w0y|Hof=Jh*I92Te$S6wcy9h$3(pBfqAV>jU3u-{L&VIaBtf+#aB^_kA9f$IA;<<_8V`K6u%3 zz6AX;cx4#>|Dv3zzISwN!|-&N5R0Am#m<}P5B-Q=9OUtDsEXh>p64|0)BP~hnr+Xc zpic&?fL%X62`%Z$9Py>Gn`+S&O+8_%ewj8^-yoLi?Zhd&Ie@}0ITo|0N}es`c_-l= zr-kLb1YfqLjqxJ&uJ#IXO7bu^qz zVV7~L1Vva*V4xi`jbR(~sCvv@B9|;-?pWF{zaDq}=QAP`|bEo_uzv z7Fl^D>~`N*GFJ}C{BXeeJdaXD<`uDd5kH)d4yZ}IyGBu~b2g*XMT5yu*iTf~@@O;} zu2j-r$km{c9{t=MTK?uX^nXVF)zD{ybAgrr@6eK3f3C;*pt&zPbe>h?!A78{9`L>s zCLGX!w^99k#Z@2cpJ#v7eo3D5D}NRW@{&kt@tmU3UiH|+xN~J`Mv-}#H_MenCd&Ot zhQ&E84oKv1jF}yy$!F@W#BalFZ$gA273MCXHk`^|I-29msH!8ls*OMucqasdCA|I% z2f3?5!Oov3I@LVrla%ME)4X%M4c@;z@3XG=HDZP1A8T&(J~y@=gRV@Uu9sCCvipx6 z(C2|}VC$s^T2k))N48zJcB+8bsZ2)cfx=GvM&~O$4UC7lDd2ip#e$zf1YC9@y@vk* z^0)h+ccBCA+T>@#Q1oCAFy*bl5+%hv>Qy=LFX8hgFN z^cQ1IRMp`=>wchBhr3JpU+)E9UkdsEcXRN&Z}EqS{A$8^B~15;X5l9)nHoj?MbE6F zN960uVTovRNN#wN+mchQLwPMV1v(MS=CV9t`Vi*fddu_`{G0695ELw9qSJZQd=~#d zfv&^5g)E|zCuUS$JTIEekAyJch+R0Bk%h|_p2&}hmE?ztn%`HsV|cfQFXSS(5Nln2 z+}vsOv7oPw;ak-4C!>nZ$Kdf1<^DVrzDMg{smLF7>|08V21y5g7}V!J>dUtCPobX# zPn$ZFnjCyywDs7!b@7^wE81yL;uI52S?XU>kIA=WZ93lu=teLf*mk-QT2iL`+t#l- ze=9E9w=#Kd_9xHg^OmdT+r|D{RIM%F!XJ7K+C6bY7SZ{YT$K+M)5_qvIvQZ?0EW@G zTt;-bG!)4zi-@vlCeEV$S^q~t`41q6o$sH6eigh9tekH`OFCzep2)lr=sPp7*?fUN zT^>;1RsQAcT)A&;xj{P{0dw~jeX6QXuQ%2A2mBk?rTL!*y#lNOmj8O_!}0Iur+3S z2uANN%84vrYUUHeuf8Q+&Y95j!12JA^HgX_nbuVbdBJiUPupvpjTPjEdCnI0IcO{E z9cQFh;s5(y!*37y+5OEO(BB5%2bSNX(2}AV^yj8hlMRi`nG#ZGLx*xM7895uoRst3 zN|`K=^M+V3=f>B-Bt zZC)>9n;pwOfA#l;_%EthRfhuBRgjspBb8z1z> zA3c#c{5X6ka(ga6-_?=#q-`1=4eF!*{B*yV2E7n00#@#yo8Pw^`@q5Pl6*T45%_?5 zKjcp^U-4vy*|0z6+^B1^qga?@t>G249UUv?qB@7&Nct0(Y`6>?p{uz{FXNCq1xFh4 ziHbBF<+Fs(sLtm;AekHD**P(OT?&?8o>!hlK?B6gGFTJCJK+PHXq>)cO&v zp7!hpFZI))+|?V?<(>|`5G(?=+`G*0ZF?OU6pxtq)LRKiymH&R3!ta~>^=5}uhs-R z$`z}R4gUx`kB26BF`OP9gHim5SUtM;@v-A#ll6Lb(VB>@p)72d6h_iT(?i)uk46FR zd)o36GuV_#-#tSw!a(RxN^=*tTSb~FQty+2{D+Xw&Li(bM>nDK16KYMp(SOoFPPwq zK7PrXwxx2nZ>G)S<`Y=PUYEDw8-C?Fd&46<6!O)~pg7UOS6NO@c^xJkSX7tQp;##` zrFa;iuxl--%MXR?qV+kUa6CJbf2>q@xANXqif1SyN6%A%+?~i(&Hu|dxfS~B;7%i} zNc>_3y@e>#SFgW-ioVdNI05e>Hn!O=aGt+uv?9aqt*&pyX^Zp2vN2kN&yR2Wn8=yCVRKI+!pRU34n6V#|e5X1araIr` z31%Lz9C6U%%XGlxzpr2ZPeA`1^z_R=licfC3Ddx!B>ysJLz#0RQs(D-$mCnnnvT~p z2KpE<2iShI99mMxv%$Hh_fYU{f+LJ?yC}70SYyPm{pFO8G6D5-Jmz?SG2yAfRq>OZ(**NRls4y?I1iNtay*jyI?isxcX}$#w+Z?Ta2Bw9*Fqlw-=$R3Aii%Nmap@xpuFAWYs-5O z`f2biuzX*FJ`%ntbO-T$@34HE4Bz@srst74&?kXYf#rJ+FomIjR^>B;o9kE{MlCbj;8r@wZr$C&nT8;PQ%tNcT1RRD3TUt%viF ztFJpajn4=5a}YV~eD`bU7s1O$HjyxsUTDo)rngh21H_$;abMxZ?G$;bFPyZcd525)b$1=cG*jFOXL?^2t2_CNq`^|D~V`l9(P!r_YA+i^ZRvbVp({WYkR+d(+rj2MpdB8x?QqEC-`p?%3!pCom-Nd& zQ~%j?7`YE3cdyBJU%z~xf&L|UzF)qX<+eEwkozesH<9+F37zU~>3W$2Jp;@HwtW{u z`zdq#o;g$*-CWrN7<*{T*;0u>4+xmXt{!$h@{@^XkR^ogpn(oO&QI zDTp~6-%!qNL`{z1s>W5WM*z+cf$8${*dm{%arRM&{hb>TzlABT4S7T?e5!vP)IHWc6=#xPcuyU<{mSpu=FAj=7&VAa2n{dR|&K;&0TO(VtaU9m7HFF})=Jn3}p)qV~ zvg7r!x+**^u+|LqjnVu?hkQGY9NqA-=iVowp9jAMR*v_e`^#~d`^!E#f`@5ROATjn zN?b7^=4}3*a<-4*0FfV!6J0u%FRpuI;Vi6vM6rcWdoGl5EjAkEOnE2b0Gx&@pMEdPt3B@JF5 z2bbII`=s2sM5Elt@rYSAB4Xa`7k+|Y_-4cR0QuVa@FnO!f!BcL`wsMx@HO>)vUE|u z(q$KvI>p&-n9~bn12o;%e7E7>cu~6ES3<7`8-eA20kkALE^L3ySnvHRz>hVWnn?g? zUNHvz`(lmu+VYdXE&ub-uYf-R%l}`{k_Oki)fb2o^&;^rzm$W6U+dEt3dJZ)QtO>A zVH{={go*;6O*8S?n14y)>3zeztV(Fy181I9e zRtj(ekAbGl7z59tDDpQeo zh@)dHKQ^}f7^-YE$D?IzflKh1h7oYuVDa}sy>%m}Eyu&qkAj~V*`)-T_PMnGmey9; zFV1mNbDZ7iI>kK5X*BspFHPrL1zih<14$p1FPCrWuEk#+>7+(F*JH0odC@?HL;h}> zrPc6hC(ml~ly&}#(07A-fo+E~w+B4;nsa5(UkA2B{b*sgn4*jt|H*A@w#nGVDCno3Zua=5LvueN{;9G~!Nysk76|1n*F!`REN}Db zcn4m^-yXtagdxlTJi@^Tg$#q}kXU)(3akL-{0Z)CH6g^0I{};S38B#qLugfuDHVTH z4b=rWIdV&WpP=6X?*Ut%J3k%N=R$L@ zv}cgt)&BLldQD%AcB{9v|8(uv=)G85rM???Uf}LjoOk4MV`{4|zpyYocD(QVl&Zw2 zU*!@=GG7l##5^wYL)k&qQMHwHc=@Rah4Myt$A%Xy5TBZ5{O|_f3qEti4=sP{ac>!A z9;!hDHr6{SYohD_sIl(E2+xHh6=L@JJLNsB{49%gjlR*vBU`PvSK$(JB3SCp69pOP zhc|+H>ZKm+xJh&{_Q7yq>*~EANWtz zQjdq7S3@JhSt^I;Ek#_NiA94Hk_htllb$6Ot+~0eoP?Jj9-cG8tqs+>BVCH<9v6|m zag3Wiwots%Kd!xvJWd(5{V0BreAftIw# z_;vY;DW_eJ`uBsNe2dqwYw-)%t*#IH!lV8(#?<>E=bo?>FnGTcVx1UN$jrs_i#E}X zxeMz3!u=p!I4RgveNs+Pw8Yy%x%MKrT_+xgeil3jY`OjjEord6Yry_$b8FlBwHGZ~ zzqM_igbkEdYp7(oze-|cr3knBy{r*B9F2u8#AOgwK2;pX_}#}jWaMbLEG@?Z=u^OH zz{+tZ^vBDwLL>?H8+McPXcl3kMb#91RsSm}cNh8Da(@SUKX?#Wes4ib%Cx_b_>5cD z`1V4@jbBaR!*t6-38#95UU`H+=jzxPs$jI>fD@2^7E=RHxv%@qB9nex%_hFHS^4`za4+V2^8L4$YtC8 zhtT(fhm5Quai;xFzjiRgV5rkJ)Ts@u_Oa75`A2u8^RI>;2}T23FXNyk9YH&6@y!a7 z4ddC1ww>UNI6-<Hv0xs}1V&UGlU1@~+g* z5Ksy%zY6FhpMO~Bd`FHlq|C`YFg75r)=g+OP?7aQ_&+_x{HTl2WFaN?$ z{GWnKVC$;}TGA2h_qf7bzQynJeU)}zU!^rhg8tA#eztwCfW8Xs2A1D7(EmUD2Ck{i zePg=Q@arKz%dZ#upWq$C<4D_wa;4iS-)YNtR?5>BKXn^E)2~VMSq6PJI1fnr|KroY ztycSOC3*B1K70G|`3dwd!1KV?-`miVj-b8Pu5V8ls~Eq>s^KP40JOcNoR;Ap-el_Y zvP3CY;zlO$4qAc(x_M%hJQsajLN#dLGpo|XOK)n(YiQ{m5tWj@e9s0@e2TFD5D?atjQ6c4ThJgW1GmbmAH^;!;Ozf*d4v<~eP+RsXjIxkTv zp%HTO>QMD(m*!%P+@c%gpB06OiCM?%2M))20^WCslS9?J=$y5YvwbtQPUY>?C^^3Ddgr^}SKhJi#PAeVtQUv=siGIS z!`)3@wN-RCC4zC&W$I1z#NUMeF1QcadVR?J-r7&uZ|sYy($xBtf2mVlNA#5T*-owa zv+}P6>UmQmcdMO-PxQL9`C|eo(%4ldqI-C-hZdxA`;SXv<^2?Kyn?=JjpkWnEWJJ6EW%&a{crGJV9PV%OF?-C>&yD*Pno1V%@2x?5JE#Wk8;}IK|EE2jyDf$H0-6( zZ4Sw<@rH)W!dWgJ8F0uob!2F4Y+_8w-w1J~9x9>e+e8sb>MStjhQFPkz6AYc@Ks>t z`ysTXO!^gMJ7F`gZ#QmS(7Ld1;9Ns(fZr%0-QytjMro&L5q%! zOhYn|!?`|PPgT%kzyx6BI00Hxrg~!X=RMb|HCwmNYdT$Cc8QxrYOT0&3YYsgOR%-} zx0Um#J6sod@v>NPt$6?UV@DDMRdmx!`bD!suEIdBJ@B>dcOUeR!B2pd>(9_1BUj*R zc#v2fYMb0roy9Fx``?xGH@8L)Q^ZctRk-%Y#4w(RFG4PRbyeWAe4P%w&NUPTay8r# z@Rk00Ec7C9DzI{$YkqJ0tNph9s^6gWqazftV{1Rt*-0R}B79BohFsccn1qY=%hzf6 z?j_$6{zUlR5B+QKJ7D=P*%Qds^GqQw5ver~*1 zHvD_Z-_ASH8?o~O)xh#U9$HeScNJS!tlx?m^lJKXAV6``xA7_8R0ECykyEM9ecE}P zXLwoJiHdApP(TQcSTZq2=hY?YR)wQVah?>*^(~E##RvR%#2sowWl%pm4S#9h8=!9l zUp0RwlG*WOziqp&+OlG63-#eI2M+c z<*2R>_%9=W+t1F2ZUYwr%m4Gxk}~zP{$0!?jIC-Yb=psNUSty|VR`cje32L82HJ7t z_O0IOFnoK+x0-yV|GWa7{3<>!faQA{w50kU2J_?6L2VL7Qu8R_-({#f8BL1%MufjGB2+pQIL!c@k(RWY(z)L!qL1?4eojJa*`@p zLTvpi}-Ke|{COeI?mz1gv>ah!XZ99Gk`iJ0tV9WC;w4_Y;Uz;e9 ziJ9d!PUqEC`z&WC&gZISdKe$rmdd~HHvAGdr}+(s9t$P_%WoRAq)g*P_+e9S{4#ir zlZ53o=Vq)xs)Qx`PXFKc8h#xnKWVRPp}!2i0xZ9;o8Q~6EH^*yuW+&&MGNsuO_`Ya1;Ww9get5vY-Q+L) zJE6Y}z5*=&yUg!xeRS>}xS!d!xnGTlg2-zgvs^XLblNvM`v_rO!YwvIXk1FMMn+ec z;rkl-+IdOcs+|zX0+Qr2lfAImY18P;iMIN0qvgSCFvFe!d;J8Dfpgd;x!5`p7@Vbu z)HEU}Z!zq=H=168FR2qnStS_Z#UnNNMvDv?UpUf#YWZ2M&y{t#qu%s?{3Gwh^PERq@i?569eiIT!XCr7g?ugFOQAc!<%XAV%v3L% zRGYT!>~T>Sz1E$~lZ%N725P_DgZ zJlXNpH?Dc?zf~AX3p8CJTf3QT=`MLi(Ur4@5KJ_W0X;fW8NtcB~K zg<`uN!k>AlAQp>-OL&|irfps_I_%ikkVGxNkLZP}Dtkg+t%~H;=-Tk~tXO`IF2Ev7 zjFH9<4Mj&r5=F@n|HY;+DvsoyR4j+mTa|uBF@Ke)-AawrOVw36Jl5CEj1S5={q~?7 zQqLzrF9x3gwwxQx@9n&4zimDHBTMFV>N(l?N$gU#U#*;bbQOm96)KM0qP-%{Ha5rl zWa+s<>NNbj$=~*)A45M5erkA%WSRPr&v#?%x=HXYcea;12eDBg9tCd0c^Jz+z~o_uo=wrcgz?ScFXh}9M*nH#Pa6tKZ^BIl;F#xAT+dFvj z>DHq+t$j4zu6bK^#xh^USR}btG&`l zDO0!vfkF*fL#2(?``MS;?Sa!dIgqPlZ(6R&(DT3oVC6a=`bg!%X_N23gh1I>Xn)Hb zkz@DvZ)r3QBXIm5iq@euz|9bCUEx(AVhK|lA{L9Ow9}%$*C*nEDS>?Z;BVK{XQ5vL zuK+8b_l-b4yS@#c=hF4Ie3dwrk|s|5R`yfkk$w9Wj3}=@nuRJLLX^#7w-!$z`FZ$} z(OD>iV@ZEe8LRi<9^bFKo}&V}n&4~oG^?RM1wIX|Tz`g^)Md^csYeIyYkaxvm_ZNz za-imZ!1I;f7mK!g`~4B;9d8)VzKg^0+}yIfFcrrTjuWA>gpFva&RsTYO{}0Eg+-mN z85$cRaX55gLYLv_XMU9Tzlq%C*-OR8u@}$H$|Le@=xnjK4TZ<9ElftLa*rxc$|$4m zyOi#fchzc$!Dg05xx?fQK)^qt@?VC!=~w4|;K{u$S`u9U~$USf&A8`-|xd6p``$~HVy zxon%*lPr^u##uqRoNuQ4YXZ6yQ~=Ab7FyDW-Va;9t!-OY`iq#Cm>Y0B#W_ULW=T9~ z_;eaRE#y;AKC)hRKwksC1T3GYpd}?tT-?;4cp?Mp(SKBZNZ;+fEI#&k_}=xm|2FLW zEjmpv;1WpOIAM&PU8WZ>HxFZ>Pv{eJORHQa?QzjO?rZXMLSqxdEA(^3y^#2P$9ca| zx>@7;z7(tJ(cT*IVI--yF{r0{CM!FxXF;D0mIEvQPoX8f_F~Y#mzi(7o&@r*MFlIX z2>}9jxW4dvg0Eu#f3A(a%$|DtKNHU5S#!}zXGJ4XtOoJdQ5+tvld)(bYiz#G8&*0z zim^G`eO**L!y8&t&9)&C8&?`TyMhU-iZ>U-bz$`6y3p{F_*7>J_2S>F6l^85L=dO;!^lyHxfpP5edqBez|R4o`Hi zQ-M8s>I5_X?@5n~rO?a4N?_~d0%$*Fcpn+mix|LCEy;#u?Dn%ziEqEuxjtSihLaRB zF@(23MKKA!GF6Y%zJY45;eUYq?fUr~^h@9sVEMlTEvdxpcL)244*0KLvldrHNKoAL z9YvU_?VP9Yi;wUoq2sNPAKoS+foK#?(x=OW-*ciV|GjDcpMX9WGy}_jGqj&RvivDg zNe5;Q6Q%TvoSt}XI35b2e2+=E_^I~YS@lT)-+kn3%l#DeufVT?<@*tqW`EXEgMoGV3kv!XE>1#`U_6u8^)t?$-OHTlXoJ{o!!XathvGt+zOwfO$o zx~@em{aT#uEzW!K5CNI+dBPitV(|jy=ioTii-Pj)>Br|g&<}z~fGyuU(2}k*adcb0 zKWJUSKXK5uePt|8y(H`V$+!UD{uHmQvhg%n$fa0Be3O@QD^`+SQjnMa|LnY>1nTgz zxdb6{$+)C6`%14$o$f8twf3Gib#fr@!f&VNhqIwKf)udw-Ulry(>%JWHAUdRK(}0b zDEz+na#$S--=tn9fbI52!_E~sN3--rP%#vSD+)%U>K{^`$kS8&<9O|eSS5GZ;@K#v za@eUzfUU}K8v$-g=G8|VO0!3nNBm3scKx2K=c!fNcQS!I2bu!;o$sXkQvx~(h5$+O zndv;S1<$3cfr6{KOI!;vb(# zY{W{=4twD&kMrMx$Wm_m!(~M0EzzTL34=v-RkOcAi8moSoh{x;(WMdg8b!I)QGTe_ z#A$Wx_iSlQ(RH3>3>ytMRUVRZb02| zRzWe^{TNR~V>P^7B(z?>_>mG*{?YpPN^kOy27dLVnuB&q89Ak$c0ykZt_QXpPnh3Z ze@cym-ml75d5O#uOIS1f73+Z7;XcIMwC#Ic=Y26v2@~jwMieDvo^Bu{PyvUl#E?W7 zuSsl;iu6&T5O0?1xbTk2Q_HdJjK}LU+zB|CIx~_N?0u_O2J%+l7u2iBI|cd}FdJBT zk2k-!{mOpZ{-T&SR{bO(tSbqP8 zmegbB{hfp2sN-#L)rz*QZE|nrZxg%pQ|>KVb?M{%&yoIT!!7KyI@ApzXY|R@0xyKS ztt>9Lb8}A*H{vyPyxYK-&F3lKxSXSN>PxVjP?6GdQN}!`xW6VS8gDcjWCZuF4(e&) z4|o@YTvAWVq1S>9z{>qeXi1AQ?A!axEz@Z-by{l_5jQ%UYniYa7jwNjhDY<7fZsmy zTWI(_4gDPW4Y2%v4=rhmx#t>u{_W3ivd?d+&#%?FpjICr@EZZY9>cGmJKbf5-yG=U z!HK}~I}KV=!kq6uil1-(n>xeix5e3Bt4|2{je=j(+Ms-U$gjolyBGRCupd}{k3dUm zH+sa6;^&+H_VL@H1~Bw-x%m=U?#A9mqAN<(!`@5>^IfdU9P;SZA}{! zpL9a%wz&EGqL4X_+mR0J0i0{qWR4_RwY9O4Y~pL>dA-Yf(9#MyaIf>u&_h+J9wQI% zNG(Bq?1isAfBYEwDex??a=ipCDU;vnK$!XX8c*LPCmR;B-S&9v-=Wqy&r&b>9F&I2 zK6^wE6^naF!@quix_{4xJ^`EpEdOR`Nj(|*_m&l`-%=lKn^ICGsZ-dBO+wYu!71N) zNsWMWPOQ$YQ?{t`WUQ%I@Fuo=8Xf;ao``p)-`(xZd%+_^a@XFGgsdt3#51NaKCa@+$g zX`z{CdQALjyRP<)Cy}H10hwQlmWvD++r3T@tP$QwRH=Dhj6jf7?;5)GCLuao1OD%l ze>M3_J?B113=mKSEdR;SlG@C8It+iA<@&B_QXO)(n(q(jSCw;_cP!hF5jup)R9Fqwv>5m?yfGm1 zPGYN3;mblm)W~#H$>lPrS9lxnqh>YV-JcBPNj#LEXKSISgIU1Ja~iayy&2|z+3(tE zze{}~xbZ0W2X!PE)XysC30w$BIIN+(Wv`4>gnec5Xly^`pbJMdQsJ-6;(uait140C%Xjl+%kC@o*t0io$R*$3Nd*rt~U* z1K6=O;9q?p&3_W~3@{5={-;4pN@bY$*=Mw^Snuytlg+0rmo3eDXJ@F^zdga2P7LZW zpJK_G?}<;|Uc+|}`Py>d4SgTj4=mqDpg)Q)K^%CWi>W)~BiUTP9OK>Pvd(REIzuD% zY+-n&mkmRcn%jc%MjuZ1$05*VpbAKm&rJFaLNJML<5q5TrPu8Zp;RCqc&Y1gQt+r? ziGiJk9u^DJNM5BE&KIR5XNY)SDNA1IL_AyzkIrp@9DCqt*ZaND-vvJaw){VVmXt}K zAo5K1HO*wBv1at7uSY0k3I3HaQ*Y1m__BMuxJ{D&+l@rYii@W%%}zujTtc;qhbb zctDbTT7HAiGb>ihWq;DSOeLL4TGams^7l=?O(qW+uPxB6U@NfYx!C;P=4-!gdBpAw zMbMf}_Nbcly;omGO|}ok^n&V}h{v41e(PKqwA(@Qwd>}q&~Jdh1IzaVXh|PxH{+jj z)0$1IHf}kkb>W&7sixqzBG5;UnGmJ0$8!-B^qg4mexSi9B%2KX#z)iV^Tp7ogEN67 z`OIWbwRQ#bCHCw5t#R-fhvOx=`6Ip@4p2}cb(sA3l9w&tkDwm`j{{r29%xCne+;fy z%SUt&UiCPRp_i#i&I>9x%w0^Fo{+1D$-h5f_$3}o^Q(m(4n_e<@|kHLvblB5)>SL~ zR~KCU%r<@cYrI7AYWoDiVg)WbqWE3tPk4F4e}f^`5z=N+pnL8 z{tbAkU;dfiZ}@sVa;`+^O6Pu@1~Y6VwFmvH`tfvqOoBcN%m9+)GgG~hv@`&>9WxRY2`bx07U%r|8&DND$&S(F`w(|RB%f-N?+fHnZSs8! z`UBwoB;8*sp(R;Aii7V3<^`2~yj$>jMYc!#X=l1@-)M5x{>G8(3gXqMh1~&VMafv{zPzGJL(=k0-UiKxj`WVAN!fi z^U(H0i1?1jAik3xruRh?vx4$)MfVny+$58FV&9@ zs$$gmQ-WA%RbB37`W9DpxmCAN&>iY$Ji1h9Hc^+~#EUB8^-z2?nA{-eNlgT)=i)$~ zcKCJhN7C*$Kz|qP16H11Xh~f?!MSO$ejmRUq6JIW%jQ6=;zR09_hqFHsdN3$3;oZL zFZ*rwg|O4B<`X?WKU(Qk;+|?UC#qsDl5^GgaMY{wDiT@cITa=Pw5&6VbMU(4=?f#F zO5aZ668&W*9;p7PegAETE)B}j_|x=wI|sTATm)=69)OnAc~4LdZ_qxTI4i5tg)og< z+^yaWTn$|p+=t)nUxe>aKMpzXv6Ge97*qAIAuc*@g7wtl*gm#2%>6y;gqg8eyaeU3Sse)7n-I~RYt4gN67|rlK!oS?%TId@x^nxJA(2go=EGJ#zHrN(}69| zEzpuKc|Iu5fe-nI>R%qyD7Bs5Kh)Kp>h%7i{jZyXuZjNu~Jb9mc+80wEc(WWlw6VRodXq&P1+T$e;z zVhLRo|3o6c5PNoS_NdRQoP2MJ=zlhO!?+=+)nC%?%_`g~eZQxbC35eFei%Fk ztlYmazqk6&!RuHcx5OAEq#e$`q&*srVNbV1eZuLD3}Y%dD$a|Wm zdH%qd=MRkYoNKdc^-;2^AA$9Wzqju&{JO}`j*I)C9|n&D%kNoeNtw=pc07uMe_`3Q znA2c6CJsB)F6Dd$zM=3Ow?Y=^G2R*JbvkiBu#PB{mr+g|pp zGhsQ?c_K>!JQe7$-2RZ744)42wB_6beG|B)AD^We_D6P}8GpfwjqBwUk$_FYc{MA< zCYjW1@;}rs|97GP3qJV&$$z=D9QjMl#ho|F-=8{DCjW)cq~$*gdIM+$ww-Q=mNYmH zm7QOtzN9R0C~m$|9vn{tvr*~oP`A0xJ2>XUuA*h-S&`H2Q=;<#Q6rvPl znCI)d*qFq4hIZ5)LZFgU=@n(O+=aTJ981d?uC5&NDSb(G^mfgf82qK;>@TUvsXAIz zcd4F|9W9?$`xRAK92p*|%8Q?=eOHQv%D7H5pR!My!j7GXm|Tx~H!FRO#7^t|swqF^ zv;8gp3-mmo3fS^bfR?l~lU_?2%e;6`HlDx*@^BEDBgMQ4A-eLhctK- zWud(#;P)E&S$$gQm)a==rNHtV2QBGc6Sp%HKY4sAb4jZoETp(`Bc(3yEBUt-FGNNV z0+S#_*lv#uRd~Lq)+wxT$NQ7Z0V7X4{H#1zLVp?D46Hoe&>ts{yfv5c(s&61RQ3t+ zC}9bW5GCQ0-6|`>EPXc#n0dK@I7Cx9uy%CQ()($|fh_~Gh>I4^5_Z^&Kh z^+4gf+E@6F^*?>J?+$gl>pWtlst6y4rZ?=3bBm*6b#4B*gnxT8MPH`%8Y5!kZGn7U z@aLTC_ml5H?*|V8E8kPllFs>vb`$xir(}ov#HVH9|DadZ%m*IJz)5j zJeO{tanQ5CTwwVwhnDodxz}ni_ptr@=hoEfH5=PjNE7v_RZoj!;z#w<{(kAFuJao9 zS7P5MkIV%)9uAke_h~!^GhWW}*5T&$=gMAWb$&glk8b$d`gjcbS@1lta{U=vQX<2+ zO|A0xLT2vb2Cz=t0bKBDnbz-D&b!&e*>T|FJUmLzl_SG)HUh;6)O35mzv21xxSb2V z7@Pqt|4%|o`lYdV9{Zz#^QKH2B7sy&(=gWJUGl`{#8YM7_$n%a9N}NW1CT1&^@NMP zqauweB&UEC7-`Jm!l2ZzlGGi6JO|*{1V5Qao`QZE{1I4rYF`NCc_G6+IjTlkoQqSh z$@Re9@=?Jh&JOjg>)equB1|Y%>|S`j8Xn0Z#*5{6aqLJ6cYtZ{`h znwRkn!&rJafcdu=w`$zSVn>MVtn+&Vc?o&rR2zA(fc^rw23UD-hn8gZGK0sP_^T(9 zSfEkz5{rGC;~nZe=arla9+HIP5*mzvhOvS?CciVp1ldpBhJP>lSMw)QU*TVCCm##} zmVYg@q)hyMt;41jDbt3@#&i7%P-^UYa&g*S}y|g!^)Pz2r1~!<3)=?Yi?> z=uU7Qu>9|ameieLJomGwk|FIsk1OH^f2X>{sjby+41Iuhc^XYG=EX@-k_y=D5!b`d z6+NVp<6ZdJeZBV^>H!P^R*qw#CH>OOd-hx*ZhOZs*|^5^n%guT=3d2((v|9M*I7LR zo8^SgjUL5OXeg6Dc6M~xSR|oFxMiVSJqiJf;xXwHm$BmVC8!dTGC*9FJC?yX-k^~G}t0_={f$IcI1aiu!WxebkZg}@uTXJQ|P1c@fM58C0baOvp8zF$?-;>}4J28l}&mCrUg_bN^a>Zy;~=@6!EZ z67)Q<5LkJ4Kua3jFKj)@3TW!7xcMx$^uLm;`p<}y;49THa2TNRAnxT7Jy=5D;!q{z z>EY23X8e_?j*7F~Y+@C2ZS70z)`e=LC=ZAO$2=?c=#%vr{Z~f4<9s`ix5vmM^V=Vw z-vIvrR^D@73gm4!{!!i@q>uE4CG@m^5b0Il4vT(+It@FI@KmpEzBtE`0X|CS9#@Ri zG3H#%VL7B%=^7)k4o9j&6~)-k)Q3jKar_esO_zttV|CT6#*8h0(_k!|uBfsrGk3c^Io&&ag??X!(Ja5_dkn(N7 zC%CM64I40j!hK3Z*#w!tE@yXzJD_6f8{Z{58I@27exyk^J4P6UI3bgg{w?`TIbKZh z7q-;*1GyHyoR;fc=uKb?uyS1wEoq_A1Gjx=;J#q%`n7G_`X-U$F10_f1S%4vfh*PD zwePAZsfT-5F6T+4fl97&U44>!Om-}eek0;9HNREfF?yz3)OXAY4ClKw6_gwbP8_g2P_D$<8`T@&w2UxDZ?-E`}DXU1w9rt07>$h zN$=rDS0;(oasGb)k(3C4GzDef})Pk$v{KZ~Hx1uKDVk6%JdO8g?| zM@{BkmmP;o{3Tjqs#2eXaDOK20}0`N8)4ex*xTJ4cV5&}!=<@dUS(N6Rw^ZW5?-OQ zyv58KS-GKD4(~LG8LQ{HIiY;LAe6(#ua<`yZCRlaoGDPRCs>ANGkztqH75)HZb5Vi zr=6kUJTD8)cYRRr2- z%4F!Z;Cx`q_Xf127BipSKgi#fY)@?Yc+UEm`as+|{x$g86MQ}8`hVE1{jbjkU+o_t z%r5mtj&m?H22=G)FA=Sv9Q8N`D`v&W%Pr4NB=Saxvy%i*a;GN?%ldvlC*qw#SrgtI zE%C)0Sz7b;QSJ~Hs>b-y7?~Cq3QjN=+$67u=VpfXh|8@BWZi7B;z%&o=x28 zU@gzFcB#+dv=mdqY)n5Zc?w4S9Ny{{69Ss|uDY-o$yO4Wo=vsW@kAg`5B%&r`Df^V zfPVukPtL1>Jel@&{`eP_u8a0By zgjlGW2M_Qcq0g~BxXZ|K2tHPh_n8)8Y>Ow-zS55Nx`okhB9AV0eutb0#=^rYk@r7=KZTP=pC$I zFUMW5#-mUf4CwN{<_N810Ym5|!I)Xs?WT4aJQFD#7a8o$ckz z^>HjgcdEiNcPJA^Qq|OOOX@{%8kfiGk+93_WL;FWkeJ&ADwb2sC2OK6mXqXASB0HA z4`OujIfbQ>vnk~SF1*gxKTz!MS_sS26uDD{r`cOe&Kpk$iiStvtlq+e#y7<{H*e)$@{g_8dtbg|gP@Hp|2!uZ zDI3qAr%dyE3aZf?vqZu&Jnhm0JZ@Ui{%o6tW1KLS>cpFvCd$Z@lH zjqh@yPmW~uq$*WiP!*wXEO+ifj1ZxT@ro(tqnA&UDldk?gvy&3Mif_|1t z86QcVYF}WLH1BGEx%{ej?uZ@5Ocdr)bP?Xj>eNip7ha(>hUyRv&j)h63!emhWF9K~ z8@|6l4X|>|ftHl%T$|p9j^gUAPan4ueOxYWyv^AcW21&3F-&ZTa6?lk*!=URJ;Y%J zz8;%ZQn!(3C;Y5Dw?W?x?gdt!A3;kx5_!ZhozdqdX878{UFc$ZkfxM%D@&9SvqdZT zf~g1cwS1FrpaTPCK$3iZKTnj%Ntq67P$}Srq+oPp9R2e|{THQ)KFmBYTlDW8zX{rDFY?;;#;YL{u{6AhO)wU7%5jkHGpA!(}uYH9U`$yNMz3 zP(eYCZ>m3wHw9aRq20-*S@_W}`E?yC0+?tG#8GE(~)fAyqnb1*l4lw3OSc$&)`{4luF6R)q1g4ff3}V^ofc~X??7FnUY3Zf(zev zxy?FGk2H2y9WMp-l!Cuq->!ka9oz-1d@h;}Ni%;N$hGLrf$|-u9VNsYbu_)}x#%Bb zw>%eB5D~sb;Cte{^Iyn|sB$+N=4we778K`~= z`j5W_s`Ph2Kcua*Yr-*q&JUp*B4jlaa1|3gmPC zk)8*uq3gg%AW1$yavnTZe00H=ZK zkH>RlMd>trULa4aU;h`h`X@erfvxYc(2_d87xb^e@4QSu^ZAV$&!`AAqD@~AFJLWP z*X>d_xXzO~;=n9h4-Hr17@&&1K-3$Jc^A(-%Ey%C#yMWg>N{C)W59CZF{`iQ8~z;B zdk1pZ@$ePsuYtY5%DEp}()(sVVDDjUzZfXz>MgA@6p~F_u<+T1Z(8SVj z-kD37S&rdTgQo*$>mc-ipI_r^K|Sm=`OEm|g1!^n4J`lfo8Mcze*10f!Jj?l+{%=> zMb@cgYL(A^yVD8#rhs)zAL|2#uk){Txr?Ez!Ej*t&VrUy|E70&g*8}zY~;C_!dD|fNEg*jyAuy{OtE2 zzVllH6NBc)<zYM+#EZ;lL?=3(3J&5lT z;x6}Lbt`1YE7g>Tlsne#v)uzV|_C0Ty<`!IYzROW*pX6sb{HK^wnldtf- z9C|nSBCveFW`1w^+3&%8FXZO6ufPq<(an_mDv>=zeaIau(>|{XW1(_cc8}6$n#N|F z8##L6W9OULyWIJKGGOHx4=w2<^;PsUUk=_RFw%-sD>&TE@XvObP`tw(xU4?;;ao2- zGAVfaIYV#K*`lK9_*+mP?S_xv{?NCAJAjqre)D^)Hyu3h`Qy&WVH$$xxM%vWaX%fL zh2FyqD^Fy}4`-t^%?q8&ja0def*In|u3Cu`$&NPyd7}SG_s4qZ31Bj?^2{>7x9wuT z2er@1E4G|}?AEPB*zIeizFygtcbFk@$nf83@|XI!6Z#(T9boz2Z+>t2+V70~Kh!(- z9*(`!_@*iUd+GJR3c4PQ1D5|RXi1sQUqO4c&ci;#KYTF{{yvxoFX!?;4^to1^K`b!-*o?&2|W)i z09L-!%IIqRV(fXTq}J=Xl*^0VKA_%@+E z-jwp!;Xcm2hvVFB`0ga%1pQ0O`&H<@;9J1*eE?e0NA5!xv^FvRWJ+pY#Bpwlf1JBb zIq%c|yl?~aBGZwy?CH2v;fvJ#Pt*VZm*!suJpoJsmj8*+l0K&YpT3!pz`g{XJpT4) zqm{vIbPebJg!I3B_KWlVzIP^%6p-S2<$cm<&zT?J4&>Qm_(^?qL;nE$2v~U@Grza> zZ@&k%!;*`(%1buc5B2rAuEgQyA;UNEf9dt19(od(1}xtbpe23GJ`ldgwflY{nU$ZU zB4jgygN?n35jt5?NF@|-<%HKH$N3dAfgNq=BmQN|4Ior%*)<025 zd-QFO|44hx`_R_--vQq)ldtgoKJ+8tC&2Q3-u&M3v)=>w%9FhX^5TFxI7{vpkMoa= z4-@~0E}7#U9gVs3BL2u&g|BNF89j!7wd48~A^fL7&jIs+<-f`N-tx8I1Ng5*ZEs)B zH2x@rK76f;u=&{J&JM3JN)T$Y`hS7^?Z~%`|Cf5* z4gD=ZAe=t=uXF?XoBkfif5pFpZ!7;gZh++KP^y-Ot?iB7QubC%^~OGv>wo>&^}oIn zeJdt~xMzy9n+P>!_)9O<7&|nt(zm_GvrHUYDN)QdWar>ew=g;e?_ed~{BY=X z!aY|{bSFilx%X=Ke)Mt@Rxj~@cCUAHy*Qe^va7{Ia2%87Iz6MTTCWbzrhar{BC~xi z7crAD3$07kG1`ZPN9%pctJm&|XiFT2B!rU6&c8*wU3y5YHasR)!rGkeqoQ=`%Wgim z+Q%gF(I76S-lMvdaAA|eLrY6)>vZCjXgE7osq z`j1}jhB00bCSCerr3xZ$;mGWgs)F@JC!ME?a+1k6wk?;^=&<_8+Q*wXStI?S=k|8lMXG>>)g79278!%~CK(x%chS#yxpb3St;^Sy*WhYS z)(zH=>oue3_nOCKOHoXgtK;yi<6auR%hRv9`unbaR%!gazo291bHiP(&LZ+j>0Vv- zKUKQZt@vb4eJ9pc@fB(FxOuj|BqV<>7K8+&JJF<#L*%qW>!oa%9W(+>hQ#9s3H-i z?I%R4ad}jn9hnshjm1Za@3VK4csrUz>rGU%WgYcXV`(7o3&>;jp#Or#R@sRGEANTW zl7<;SF4cqVvHAuVPdw-0!z6fJT-y=b>wS==I%4BLU`+2;mxr8ZvnI)-XK%P3?^S0N z#{qUhD2hI;ExsqAs@5WcJ6#Gz&FV6cwY%ku&+CoJC z0D~=zT2Nl;;&`!|I2)KHuOrc7Fc;NftKWDc+b*T-?B6|FJ!a2Tdi`w7Ym-zSVu89S`>}K z$<`Y#=UT)6Ao*95zwmz<`c?2cu>76K5%Nb6Uxn5u!@-Y~p`pr@pZx0$|8t->fi1xD z|2nj!jtq9)edYHbNFE67*AInwW4ezoX{=j9TwzV}PO7eBqUPCGq$F_$8pm92@e`ps z6?4y5!}DV}`o`K4C3Svrfy@k_QTiuJ7pZ;z((d!`sR`tL7kR9_Sy9(Xf)ZfmoeC}K zfbpB$G|0d1Dt48|W%40jy}Zl@Z@1c|ojqLqh(mU9z`YC)!XblX*pC-7THhZ$2{=?6 z$k72GJ5H~Kz75<7tQ_6Yl9pw7&#|tbAP3Zy>LH~LsK`Tp4<{1QJ@HZWYuP&NQ20-b zIbC(8{N!uPAJ1}~S}+n=zVo3awV3xCgYT2JwzOWj)_C(~Iy=sv&b}G!_S;V)sIQQQ#7*qdusYZsf9Z{}lSy z;3Z(?E{+FsA29bQ)ju0JFZPYI*0vVYe-EhtbNz0!Ip{XKL(UV~Vj@8h%ZS()Rbn~y=Vf^GvB z0oyJ&K}%{j@5K%dnos=oinVrWzfEm%FCk;zl2`Uu^Cc4uhEmURVo4M>5PY|Wh|3|~ z)UzM2D~g`#|DPXeY^S(u9ILm=)l28NK)%=DUk!g*AHq4VQv}L@mG3xcNpG8ZX0X1| zm+#cgYX*zh!Q?8P{wHFGv|HWkIalP5@!S$!l*a`)4yB{>qjZljZ&so6^1gtsDO4Yi zhVUrwIHzHoRia)}d|VM&x*wPj$h!x5Y(M`l^n>8Xz{>j!w4_YuUzrw>b;(7WR<>?j ze{t|oqiGSBSG8PTF;y$)K>kp#Jb{@_eyuDPGue@k@7qT;H3V{0=cemz8uZCvF|cxM zhL+T9><7AxJ%K%^tm@l7HO(`AbZ!Y|Nqi=9LFGq+*{%MIMwILj5iUTRt{&xCrM@3Qcrp>+!KVG^aJ(Bh8F051q*OF|piG9pA%ZlWDzf zBS(+nDgFE}(7oVoVC&=m%yX0&6CJJ0<3YY;b-!0IRI<1|^Ab%*P-j*_UOucnu9(}Jw?aB2&Z*cvu zQvdU1|7ljIdOz%3@A}n;d1gs0RyK)UQ6gH9Q&^gfYkM(RuvJ(T%dZJVhEAsn%aetp zs6?jq^SDD!N;Upaxxd1S)p4qi4(jnB^4jve0{s{82C(J%545C@tw)&+2G`?DAFjug z;oF!@^F0fC3%C$izWbmhW$J%@<6lmgrY5`8H-l&7djmr&c~mZ)@AqNnRd)nNNm6&A z@e(hMr_*RX;swMxstFfHiXvkUSC6q}_fm_;6xLB;#D+I@c$d_n%>0rL%?j!!Bxu>A;rfcxXwP?bYOkb1rbUDIz6~;$qk=?fue7XG6M${{!E&h z9q{iY|7!A=dE^_=-v|4F<^L44q$AGH2`Z43V6pA^Boh_GEWm!C(o;nP8$ zw%>jc`bKawu;slAT2iKdE5m+#-(%#X{DI%(Jjg|`xSyz$f!~m}5@Ve(e0#~)?hmtu zxK1`m07)NJKA&IukilOrpkxJjTw<}}-}adNmq~v7zqI3K=xyL)V9RwGv?P0%}pFeJCySjWjjkwbYhw}*7o1##-QDL$k+1y6Lc^57qEOI#Ye!mZN<8P zZE^FQ<*NBp%Z2stl=B=B5-N2G8zq@l&yc;yWIB!r(RggYzlr>9d#-}s0xkrW{}-So z9W?J`+6UPq_m!KPEpA#$$DIMhVUOISpw^h~A51U+L^qCgZNC4${#dS7=lFZK#N0rR z7vN*%cpds*;5}gF$SpYnIj9F;j8hR|kuSo7%DF5uowW}E@S_)qKsC(tPRE@WM33RW zjQlPC&CuJy<-qd)8nmR3?ANLD*EOwZYY`cmC(sZti=k$8xeVkVVm2MYzci-Tbv(Vu zr9BYJ%VB{SqDRO5-Stv^o5GC@QelrfKd6^p!&mxcq||kWf?8nZ`V_RJlxdf@|1;?P z$nt z70sT@x#cRIUmFTlCPz*V*Nr}guu>5&$dAV7MT3_JFUp_F;c;ee-T!0nP2j7luKw?H z&OJBx5;9x}kT72cF@QjrL9Ik4K@lS$P$v>XAW<@yK~Ss4I^jqhsyGs7Y8_&=mRc*R zRg2bYYHc5Ctw!tAR%^7{+Sc0lyY_I;%}BKUyzl>g-)F<`o|QYS-&$)AXPbROmovbpE|D&Z`LDZ-+grnN&uV)>}TF0s%j8d=9 zcD6}>^?W{%yxKFuc`ACaA7wgg78sjR#FMLiyquJyytq4_nSF!2>;Y*hvV+Qmlq2b; z9PGu-F()NwXwHaO%1ZUkF)33RUZ2Hnj?73}bcA7K`1rJo z-8xPJ85t>sk@CLLbJ9|di5_tYr8nnNH^x1NgS>%c;dO2b|Bp<$(q$z_eyRVB$Qhq= zjhi0M;n}|k8x}3(>T#Nf1(BS7Iju}*i7W-fxm9qhyT}`G1-GwQ9(av+WN2c_G2uDU z^I0Shx09;oV7{_(n8FbB{22YZW z=@}|kk7o~I=@$7box5E_X-CvwhYU_rPi5>5na47mf)jPV#zzEp&p=)ZmIG_|Hsqe{ zF5$8^$!^&rdmfN=TS~w%EdGV(G*k9d>B#CEtLZYN68?lP#(SsYNZ&6Fb?I|B=CX%}L0GpcqJ!^3&b^?u?JfP>tNi z-86Nw^d02}K-|fQJCCr67R&j1V!D%Oc$$n(DMv3OzY1D`_3sbnb9;SlkG34icuZ+Y z@u_RX&-q2w)nz5s3EJ#}J6yWSv8P;T^<-x7tJ{mySzJ-NTPCg3{?3VO-^7mNk&D0v zVC|?dpId%=>}ZEvKyFY|G!j;16&!L*)QPQj8W?rS(RY0E?RZ0>;ooia3;!#~Z-BRe z<$vFNZh7r-Km5}OzFu)XHqW__TVowpTyM1gj|%)>g?s`y8Cd>}=5xzyj~)5vm(|t; zo~yOqVg9%ibF1NPGJ3`Dy~r7Ds*j3o2b8@>jkPyG8X@(;k{!16s~ zKDRvfX!&v{l&jsa$4{2EhvgyWfH^;x%cB_!oL5+am!~773Qw~Bwiy1{n84p$6Ob&u#nM@w%m)%3N8zsW@OQSW0Q0vB9~s?=&u06zk#sFx!6Q7wI@}GkV4Edyu~i z9tD>7N%MJkyj9%HVAd(KLX-gkec=lF%(6Aij0+iKWt&8LCvHqCbiO}BO@UPvyT#ZM z8yomP7kMFA0<0a!o6oHs9oI8Z?dN*ku2j`luVWJq^;XcfWf!i-qNA~B*3&M_Sx@3# zxs0X_?lVC*IP19EJl$H>xL(I+m*JK8{1o{`@JnFr`kndQ+SM^%I@pznPjU}g2BeR`$wM;Nao z4iB)`c6gCDY1|+R>rk#Xk9T9y)G3E}^O+nlj&}}W9fX1D!`(pt84f_O))* zaVju&h@Gb(p9boHweu45xwW%nKFR)ux&{X}=AXrkv4d}Mok!dW6qHzotUNG;Zb7Q- zv^d#c?2b&Fpz1eiJN6kKvEviue}XT7wIh0WO!|%7I!RcP6(37m znLp2YGt9I(U6;q}7Nptm78t$4yBT>4I15pncPv#!PR<3T+V8#Sx8omfZpiUL1W4+sADcU2Q?bl*sjig!`b?v)<(`N< zA-STiqC%ekJYvC`%IZ^-f-&1!INNzHRkk1KFMDY8Q47R07(3P)PKiS$^6B6VVB>JU z`P}+%k2VgQ^n*M>=;`f7orQVMt64+2>Q~S44&}0+He97rJao?rD@HQL0!utmDd*DyN@_uSQw|w^4 zo_AGAbvdQIwyd%uh`74%1O4ZNc*HH%p5AFN{P`1fJcYjqc{8X2mj7n+d3W_)$GaoH z6#8uSbjw*&Qk{jLyUx|wQuQ+iF+b4n8&4hHkC}I29_p5fn6aT=7DHi3Ox}~>o}>Mf z+%et(A~u|&^XEP6u-64C6GKivFc4TfCn8IF)jU7kaleU8#q&2w4t1ym*;PxanUy?i zweYvDvv0__)FFMs!_spG49sC6u}LYJ@=Wt2RstBsY6ru)AzgKe)0tc>qZwno{>)0kF{Ut}+5rZ+8TDw`C@s&b3D+q#ll{lg=ZqceFxg16c>YrAs~3fh;Y z$jiVnK$5gC-ObO}`MjdCvX(~!m?Ix_%LY1220G{1aq(EW=GkF%N_?7-9|z6A#^)XL z`BpPdcWsAt?8?cjYSB> zoR!_e{xDXq!|hT(&mH1lq;54S9}6qAeRC!S<^DM26Tv!Q?JF~%+xljYLA}$D2^}uo z#e|VrdE=)R(Jq7iT4-wK$lY!yR%!Bma^UZLWXm}fqUMUB=k@tWnf#rSPeBLc@36oi>YJ(n+-i2;? z8Qq*oES{*^^2I@ayv6Y5ObPs*iF_EC4=it?`P`Pjj{CZ(eVQxFOV+Hf+ZbHnG5`J{ zc`9o8FS!pDp%1}>^gJNS5?y2a4hVS+U-L*vTB_VKE@X4Q1&QexPE(c6hbF@-@pu9G zS70BocD-pn?=Bu(A2DOA$~@8>6oSHnby26_ROhk2Y%HUrvLuL#j_z<#rK;(Qh0b$fs;TJ@=zd_M;a!Vf+Yj4{d_K4cSl%mJY+uK zYVWt0=d7(A^hAqKO*qfwjQcz_A!CWm$5?S46C;_b*N3$x2d7575;9{V-O&h3RA*AT zGhOypbiMFMY0AIv`a4~hRRI|-Ri`v%XkML;S9E$%u16z}2L}Ob=PdKNjgviEJJr0x z4y8nmW35>2)TgV(c%@-WjAJzz-g=`~;&TIXBe(-t-uunxmd_sB@k(7v#7GaHLA$F9 zTBptMerEIv?|>O0XDAo}EN?EdB+F-ymUji?>PMH9%Y{PFyk*7X^jKFP!mT-(_Nv;} z19ZK}J6*@Q%IFo|OOdYv*8 zrHD4E-tfL>^a`&#lWPRf7g*kb$dY>Et&wG~1KRu65>FU1YGXF-;tDxJP9hw<3t4+`!KSSHM)$ogb4ahfvoxs|6zxlko{Ag#N z>iHIyn}M#A?{uBVLlYRTpGsI_auqPmFEVvL|4hyQnb9x&{bq-pQQ!bz`Bx$*$0y%B zM`rUys$Ba3F_iLcJ?Ck@jHH}=h3|Y3n&Wd8<(6I+ckLI1Ged{>&tPZ3s2kxavdl2k zXj$lt<(&D4m4D*N8*ag^2oI0uL`=jAzM<{iW$Y1qpF#cwco|rGTg~UT{Me(lmvJ~X zg_SdIS#eU0&7U|=Ht>izCl@*O%&f>#0}GU4**%3rv*FL3qvIj`^N<&VrNHv9G@n~u zd$jx;Diw30IA!Heqx_zHv~yjb@wV2^PLyKqtDLRnHQ^X_1q< zx%rcc@A{=qGY=-2R#A4R#8s8r46k!=kgr3KM}u*|@=i6MTRwZVyv0Q|o4B5+tqaOj zcEQ~;q`Lm6ToCj4!#3tXO6i{JU7mCwsrek8zx77H_KM#df*POux)#lBK5|&-~ zTUpwDJtG!xjyu5nf$@Ew_ptT7Uh{7?`i1`n-L|}R6na{VH{^?fpykHl+vc+(a3k4Us%$Qogi*wP0LuqW-wKAIO4vMDx zsj_bGq5ecKHz!Xu zQkN*gwJf>)GrZ2cz|Vom!@x*jdB>a2yYq9?MxJa9SPKplN5Agu%^SyEEam7VA! z+#-oE(WuX$)b##b3}vZH=swwMo#Z^Wrku2G@b{i;e$>2mX&ho&aV6YsVt< zx%Jx~t^bK-4rD*FJuWw{q6Nc7oW3+OcAh)e@e5)jmgjn-uJmIc_;aP-{)9O%#J6ew ztwz7Z;b!DUaF=;c8Vbu(b81;tfm-GFxSEm$+WEx7jrE>$Gf(m?B_A~btp`I|39x&uoyMxr6UCEpZP5qZaco4dpEuJH05ro_lIc_PUyIOdTHr&z%t zHlt@z8AB6x`4+p4u$Z;)GX}tOvuyfe|M4rA?}T}ES@F8Bo@7I;@-EYHaux*Tpda!8 zkYnDHklK7Gs^P|oTIj?jKHR4WNlD>C-{@JwZ|wc3wa6!cbzSITUnh2GCEi~{&DWee zLt?59G$B^TV=h+>zBaYq=--v3|54;0f<0a8SGnouZ9)H8&T}DV%ce+3h$H`GrC#+n z44PH85@*jvmBCVqF4u9%Ss3_pAo64|4cKJk!aZEI?99qopUhM!H?liOnEMdABxMu!#)jJZ&D#P1gIHcU(hx{OTxC>tT01Wu57HD0~ma^JnnLVttMyWz^r>vGL@`Y{n*09WJQUD$uF3AjAUM(^T$XArNy>Urf1lo_3uJgoZpMTyODnk zo(AHi=zkVjQr=Xp-||@hg-=a?&ElbgXh9}~=Qy87&XL9NrnrNgdczZ267a;44+43> z^2|V%)YJoyng*NI;I7*4MjKpB^+iCXe(zkR{i;V_oOi^ptB`L2w*$*}53-~N6SuDX znmTO`K^WTL)ou6sHt;~ot?vCU8%p!y6nKZbYJRBUYeQcgeZuE14LRwcKd^k+$SU>V z-?W*t;2Y84*KPOvHu%EFVxQlP^5U#Ce1%tQ{|eD(`A$PV8+;R3zKfA1)%U8?b=%{88{&p6HjD(n~QBU2dSCs=duk1+NYItMI0^Tvm)4*(Cc@IUFl;4BD)2Gdz zB^e4YRivIeQm-lrybT?Bo37XXZbNSzz2fgp$oGN=f#rP!SyFQkyt8J`oUSvro~lw$ zU8z@<1>UPW^49Oryw1@9?*Qa6AQxEPNyw5Kdy4b)sd=+a4pU|7sWbJe(m;G|2jYSo zH1AgQ#?dSOUXFYdXatt`E@Vlu9{im)YueNqCWEOu_0*kuRe9jOt^;rUM$OxX-Z*-N z*I&-MFCYh4-r>lS8hYTJIc>(YIVOXtLiN<4dRvKhbl`0>yrt-kqgQy(M&1st1(x>) zWJy&$#hG?u=4_M0sxGO@l&DQNCUG~jV4Ub{MQ@y=@P3LMIfiE)f#vOoEUB#r-f4Mr zXHT7JGFVk5RhJT#>E<-G)1QdJLeo-uXqjOlqMgH=^h zbtzGqZcXAXyhZc2pf`?Q;e8wVZ{TxadEElzZx6h4rq7u(E6-%Gs!FOZB`Q;65^vtE zns*6$E$_+5RiF-7-ZPOUwe%3@sk3I!o;_`<&0wiYsxBoe)9p#bN*gabHUD1p$N5wI zehs+|dcVBz{ z*d50Il>vVtaveAmSpIX7CDr#7|Ge4LXU~{ANARCu#J1(ws-4Ty!L^L)(nL=qhcm=o^cCAed<06QAP7 zkA&X3^_$Cz)eKVeR1pOFy8F4P{NPRy~%c-QqJb_dKazXm^qw> zHsr!cUmkJMEZ>zBH+q}2j(V|oH}Vg`o+Q1A@s*iqo5^Nja+$0zfs@8p5|_VDq0t*V zjoymBRd87;fACmy^avhT{!#-R2!YJb{a>=bnUS!BXhNbv~ zox8O?^0yu=(EjpWa)@b&d@kcOdeA_R4v7gW#qTop0NdicBlf<9{66@|*sFqO?Co?N z6+DN=xSu?ShW&ot=k65o;XKcIAvI%IU_avqYKTS+Com-F$IPhFXg#=rtvtS`Z4EID zt@4ez;vwQL_KPn*o9gOVsJ~d}kwH7+p)P#$?$-WnTOEwkT!(xExCPi`%U?}N?ItXi zi_J`DZ(2B~kIu_{qo+mxMwO3Okbei>NYW#}U$?1Pyq4jrROfwii|7`Z-^bQyPE`(& z4+ImsRqLLcn!I%LkAK<*gs%7e* ze2J82^tJNa9R3!4pCJDY{Ih#~tPX|BL8u($yn{+9x2UCj7=3wP56Z_Pl5|tSI5?x(VHycpqL=q*24&n^zNI~*X-G>^ z?=jM*M)_PuwLErklmXoo8S7Kw)!&x)_yv_sxa6ODUujEWxKQ5bA5~Vr-|=WZHyZ3; zT9bV>ztI}tMlb&ux0ip(w#YY9^rwkehVk3|>-cxa-+u{9j0N3VLbJquhj#ynmiETJ zYkf0+V;y%NI{MIFN9Vt6bd7GQV2$_ba=!J1pj=*td?mOV*wmpMsm|(j3ej}uQl5bj zt7PTPJ{+mEq*kN1B}wn^k>3G->|U?#grawbbF0!T&3dxl`2E`6yc2aFN9xghf7ejt};M=tDTZ> z@Hw3Z>B>l#$DvHt9^Onaq=h zC0kdPvU2T8b*ddj&`0q=RajXoJ`f>()M)fJqJ!&H)joU=c{g}GNw4ey+MU+-huD%~ zwQ^l<^nRvw)JyruEMj~NTA$+yW_saPeeKGf7;9Rm>!pq7WzcQ-oX{4IKahWr9}DM_!*m*Ps6$8ML?k1Fjpr>l&qRVPfYX47> zBx~z`pvy^%@k#uA6ZswRr*8a|6*BPiya;~svd`63##BjLHUIZ$8jAn#$Ay9v`;lq? zP7TKEW+5L8<^h{*`@nTr@#gB~m9phmK_z>!=*$ zajuo_0q^m?`CIICl?M5RmPDJ?5WHh;x1ZRfX?~r?JvzQyHwWV%mmpsOt_C(G#kagt zO_=;)x^t(?%R)slsJoEr(3)UM_XS72G>$T5Px_mftu9Q}30I#e!)bB?MBBMT_Wpja61feVWIs* zA3J_7U5Ad}(Zf8!>;691I_Z#0tmx24JX7XKgoHC9(Lz#_BxNX1z9EB>5*>=6woBq_ zC8Dh&r!Q6HUF$CeEKTCo{=KB4tl~{a2CpKC>JoS;mg>7L68rXADAdXt`9w;Jt^~qH zmk6818o3mq1E&0vUo!}6{wdAsJKB#Vi&K;}N#AVu8?=h%PQP-T!e?}S*jA~^zUqJ8 zgnTQwUB9QQ#5$R%T~xkd){J!KdtoYU+C-72FeU;jpx+m*=2gOj_{BR8ed<>ybD$1-g0G|I2s)skySu~j5< zJIHCW{wL{w82M4~SQq-auUA%ER<8Cx8HDaZ&f~Plx)RD2NsH0fmZZb`46T0pFtjCa_0Y6LP6OPFhm0Kjt1x>Ob{!DJa?Q;L* zvdm>hR5&}acFAt|o87JpMbaPgaf@ibQ$$M7YU0SPR ztjfvR$o1d?{hkWFjeAYmCMhN5MK!WB$QUdi<2=tWn9WJuy3lSKz0K&b@%Sb3ufZ!_ z>n$plb+6Dm39XZy)`V7F^0ej#qc^867+=Umo&u%=o09C^xJ7F6fLMB_1bVddSx8qs z@=ird4WvjLA*tEu->P+~cwCCS9bD73ewLgluaf*MJOusooCcogl7Q&5o1Ci>RULxo zbiDT^>3;|L58#6?^p}^bZSW?bd4ltRI_KG7ORgr$U!KvMcY2VI`N#{v5&AvlpN&g- zU4_;>63ru>XUy3YmFo216c~N=N&3EpyaU|ag+9tf(dJt9ya%Dst=vAPR03d21=oSr z|0KQdA%6(|(uLkSwb+A1H}4RpKBgue^)jh}YBoIiTY`8Tk9-m+ z((kp4$NHKLwWZSNuhXkqz&H!GSVFd7v&j3v zt3C1&v+7!LFvfDAu~eS$ax*1<)1BwT(!G@@qi{AM>E}dj=I0yU+^vD13z3fiN9p&v z@w2*QlPpv!_tPgsH`%#Bdf>{t9z3lwd^?i(9z=c=Jk|xDS~sJ-X45)qiBys?JclIb zs;SO>+>&ib&9H?Xj1AEEuQD zZ&eb{cI2zUb^GU``m;zU(a|2<2#NJTndiie{+1;Dt;p|!KXsv>{zC0$nGNF?j8Z4a zan9~YMw;~cRVO6h=!>5f#3c`TI+(5BYZn)JCcRb+oJkaBIxn$jUQqNzXNOu{Z}itE z>2E;323+5T{!>q@E2)#-gYJI*RaYey1fyBUq0#8wm!$VSCfifcIy1X1tDu;NwWH@azIqDk z0B`4%8c+SXxTQq5O#S{G~w)9K1%VT|ZD*YSaq$5tI_ zvNVRI7c_4Jdaa)iA@2r11eW&+WJ$g7lR129M>#QxAa&`kQ*U^ka{}Ix$fLmlK$66_ z^BTj4Ec z+F(J8=3R?k%X>QV*`OX+-t&z38>PZy~=6{%E** zm5<46^66lPr}H{SlD_&eyz? zbRLSHX2ZJ+z1FX0TR_pBL*#22%ojQuNq zcDGqw^-FD66TCJaA0mGYJ~g)Vn9pC)nuDF_!H$2h(`5MPd^6xb8~FloF|cvD6j@To zeTtLX;}d30J?Sf2qaI>)qLq%%4XMMu17+nBo#HR+__V-pg`rS2q;q}sJJSb~CMc<><0M3)_Ebg9R+KqyJIu2{$v3ArTp9#(Z){bu? zOX@`&)~S`#RIZ;Z?c{B^4hX$D*C|E6G36e;miG_HpMcMR<^3F4(tiCmHrnho!qiv!*@$m>8cu)Ld)CH2BzE)m%G zS7za>Jl>{iHrxODfJ{D8mG7$GYJYd3*ZTW3@?P*W!_{NEW?PYVY)hQz631VHoy|sn zY+IoJAmr&_7O;NJMeeO%RVBq`>f$U*EsGTWy5oPH^#;^-l<`-!KlSLd{@jRs8@Ll# zzI%`*?Kl5wlGtRmspwkAUn^`mD)Z_MUmN-?U-~7C>w|1y`Gz1%>P5cE663Oc54qMu zN&TJnvk<+O_blXdzp17Q7XL+-6#Y6G2~ zy>gljZ~mo$UtdSw05$>3dkV6o{pO$E^h2?-9!9}9sehXtpG)Vj`)NV_%X>}7b2oZz zJYPco4R{q;-q(>O^&%fji`f&YJ9nE5U+!fAUq13t;22=}Rw7H*Fa`>(&({O_UP@`txG1^_aF~~+o(na+h3K`sXCYq%E(MnNN@PjMT{s%({{zdLf-I>w z{#I5OmuxELenG7sN0K!T+nvnO(_nZD&}(@skxvI_0L%LgWJ&w?w&{Hu@) z!3JRYOOYk*xBcjv{abQ@8Ix-bRuA?87SziUiG}ZK{wDNW|6fG@HTVs%{I4QQ>XrX1 zWlNIzb#mLLi!Q3t(`Ric1eWi+$dY>Dr|fT%=$Cg_fAjyKexi7aWq^|Lg=wvj3s zl`45TRT9uoU20G7PW>Ns9G6@d@NPsd2UWoG)*wsjg`c(D4zF6yuE9N2OQ+TFHlx@2 z`zrG9!8^e6{sCFie#>cl)=uR#|4-V_yz2wLqmfsEHNf&6k1VMdewG(=hppONAa`*q zO6h4fyt~kA{rm~?3*Z;P^1h5LX}^B9W9_b&N+0Td?QeWXz&js#DOd(9?=i@ddK%}Q zc9QKnb!hxpiLm1!Zj<5NfnMwHZsebUp90JKGh|8Kmg5t;Wj%@VoFM~gmr|aAv&uUt zQJ(WZ(0=FK5b$q8t^lV2%U_EusfT<{jBQ)*ZRq12-#8@kPF2x{_z81PlA8o`%w2%4 z`}EDm&SvbeaZ0}t84Ly1&JoCxx{cF+$IASId2YVXHWFq`K93FK)tFh{pLIM-#Ww7a z{{Q31KLO7GYv;4bl6opfQ>V`eZWwfoVIqV!$~^}4I4OBmj?dJPd~ZCaHX1u)HwAXC zN3H_`_?Ak|7tV#6=I9E?=0l=!NtJF^)h5hJ(N#d(qvU-^k@Ud#It@)y9{8SthcOWObWGGKjME>76ifvymvD87u)e9e2^ z^`^LU66cTRzi9ro=(qfJ$lnAP0qggr$dWqxZJo`XP_>z<_-dTvOAL27`JWj7(Qo-b zLH;NB0$6^xv1|S=#yiZ01FARHT{p#PHoOJswY;Yw*MT#D~Yr2YEa zj*w>xzXZPqmhU&nl6vE3*``%R>sKi^lR6o5*=A8@Lh00Kcyn(L zc;_P@4GMteU5PAd|9%Fnh54M`#;l{$pyyz1vV)}PiT_Re+lXH4?~jn50zU%q zz42F;=F*doyS@B%>J4ws9Rcrjy$x6849(Np-Dj<0iPz&i~2Krj(l-YLkEy6x}S21{-4nqV!o*Nhj@ zaRFR2E>LY`o8jGxUhD7m$hU&qfaSdtSyC_jRa-BvlrZ9k9GNAWQmE{!)E6cR#gH z>8tvO_WM2bTmIC$+4~v{29|#~vZVc%=fH2vo?Wm8=cmbO(ay@a#O1cDx&sjZr{*t3 zzvaIe`ATpVu>98|OX{hAHFZYfLNd7fAj{d?tB$0ZKn;es6}^`CU&wv$VcZ{B-YjHE z-RAcRU9qx{?+xy`ZoQkqX1>wq$a3JEZae4bEBsvhU5I|me;@M0;89@te}F8hhkWnU z^R4FOl(^in=Zy}RJ2UcnaS;h`tFbe>E3k6~@=2fwSUXFQC3Raq{u@>R^6N~x9=j?bO-{GdYThV9Zb2;+$;3i=Cb|OpaAwB_HcGVf|?VeFd zUA&jN2%K8uVyoeM4}F#|`W@N;&>vX7fyk12@^5-Dq{MRviM~^p4N!rTBC4H2^jh9? zkS_&S0?T_fvZU_)?2Jrzw%mTAMa4ty7Rww3a{#Nu`{?CyA4ZQmT{xGtn9{rwv z(#Fk|MYVcgkAecp*;5^#)9u$1Ia_b|mY~n_os3)rHW-ecuScgRv&>|JUdNw_T}JP& zB)v}{KMnQ*8^@m^@7Ir@#AFq8S3W%*x19R}KMq2k4Gsa8ZyvIw9`Y?<>#2MizHR8U zak~}yF0cz&zV9GQ>M5Vp=-7VhUqMLw_Zj*uU)lrAfdWH;%qUmi1sh~P{4O2 z^08nQuzYKfC4HHGTJaghn}Z4ewxh9eb6rho$%gp)%F4}Vz_g2-l+DJj9q`&X>_h%7 zc+J?-V|&`EKh{fYa-C?ds;hZ!4<&z)qpIi+j7<^ z&i{9L^>sSSzFcu`b^NVzy{YcFv>CtlVYe+ec|TySOmHZ$e&r)e`ZD>ov2OF`#C6B! zjSP$ypBjX|q`a#3jP5_?&Q@Ohgjq8>X6%;rbsJYQ!@VZnDU!0kX+oje^fX{ocO7h% zDi;OIc&a$~e0^O_U`*ok_}PcV*Cigou|HR94Ia&GUJ97pd6UO+>}N9VRxS;emu#)= z^h5jMk(KN9qdW3okNstZtXI(KC-SIzb#1%@ONBft+v&R%8+bsn)4SY;QST>sDr-vu z*3y#ARVCF6S)QX}zKWkTGr`9di>38hP{cCKEAXmD3`zQQA)`iJy+42D%C6p)uy^^s zl#DJuu<=?beziADg=HlpubuprAIT58{BZrIqxpCR&(8BR(85=g9433H8m8` zW950>FIU!?VzMEyQ@p6Etq%0o7L^6na+CR3O1kw^4b82ggs}$Me}Oq!wK}PEF8ejL zYBy$8yprogdC^v>6`kI%Rdb?Nl~k8^3~H_9Zb@}cQl|`G)2kI=JUGRmvX~lgAA8_f^?Ae=Ew8IUl`h3(t zyKLL-cb;JW4)`0e?e;&BCG~zB=6_plDop!AsGIcvZMEAs{#1tlZM8eq<^OH9C;$Jt z)&59s`akB$-Ho67jt^+M|0F|gAIiMs)->I2FWD2c+qWZs8{7wMyZs=tq%YIo?y3JP z6U93AXHIW_#_96jUtzkow+(yjd1gs7&ohDLK+>1HuKW+Jv=ea@Gwb^s`*vW9wQuc@ zdA<^?2R5E1$dbNHJf&lp=oGc@CCa*D@e`)1i<9JY#g-ygZe>bd=TErKWC5KnKdLS% zKE11-(8tAqj=5G=LH}ewqX9UYq4TW?zinJ9o@9On*a~c1&O(;d`~JcIOQO>G*17Vt z(8Ogge%rVd{)A@`!70GTr5ssOZ_3MJl}GLR*j%K>C!Emn+I3S^e1h#{ZwmU`Rr<28 zor0RG&PutG>u?oR5ud<0xrb?VPOI^EH~v_Emp{eYg5X48{auGFY5(IE|A%Bt$ zn5oPCF8s0nhMs0!N{|k$zcFM zjs4rO&)WZ6Ke*kR+D^=!x)0)_)?XB=75SBxjyKgf7z8ROUcId%8f zaVvz++H(W)&0wdop?CeQF4}=Et(fRUCp!K_S?39i9xj+=|B`EAelki?&OmM(wq;h&BB<ey{sEdyj!KVEx{VEa@w@13h@I8r2D%Mr-9p zmTaWbvFBG=Q(RQB{|s$4e(lC?>(|T|xVHo50qfU%WJ&++{QOV7>XcE+O6CX+(B-rN zyRBcX$nSzb0_)cY$dbNlewCf6TdJTYZAhxR>(nAZJ@vnvjh%Tf26mo*&}Nczg{ z7{TqOb-`8hKpnTeaL3`6`K2!-zYg94Hg11HmXvGOtNi5N9Qnvmt18q?US1+AgJ&0< z#bAd#etoZdzv~P**ejDsyN7uvdl54augUP`wFLejja&d$0ZHP2$9VvTr<-LQCPFyT z8Q0&FEk9LiH9R|vPVwsjdNC!{ED1ZMx~RBh@*;JI8H-ru+;yFU zS>NC2Z9|7$pFQOlA*T;W2a?48r|#@gudGF(7XCqRma{s`i4D^EP=F3we%B$N3aWt3 zhpotx;ty*5uQusp%^4NNlj;8~;*n6p>JqjNuFCK9J$90}?E4*V^Bh{Jdea&0w z#axpiZH9L*dfD1a<^L(gS9sf9?<{X%ykE)#ZYXb5hL;uPo%39;e@52Oa7KoAsT=Lr zCnFT@(N)FK+C=7Wp=Cx3O9B z;}eq~&)?O~Zh3h%~$_vJ6;v9m8{7r)2~N2g?|)cf6=D!wZ1z1jDtk% zxiqJN1r)yJdV5^5%#UV?%>Q^wH5+yh?dy%r@?yhdVJ~fm>kW0i^zeYJv>V)h;r_93 zKkuAKpMiwY4ZFi-(D7LBW!F32z0LEF_SSpzyn)_`P+`iN(3+Hky_s&7f1)?qn~n?#|dn?SLKn~s^d$Lt+Uxx2Q%?-5ts!0O7Zh$ z*Lles=VcP>Og4O(?q#}Oiu$Xs--oQO^Nv%K|KTYZqwU%%cJQ~v|9a$G!R^4>buY4{ zYdfs3+up7^77(tgtJqYsjHv=8QUtOJk6ahUq!Q;JgyT?|fx4Nvae`wgtNEAWubTVl>JG_j|@?&GN+;EhyQI-3#(0jOlR$8O$Q#_UR(z z2f)L?`u$sEN%@L6!Gr_KUb#*;xG>m-_VwS5>6^$=d$h{|U|)`N*rm3BcN4 zhb-x!`*eQgJ(zHV+qa>tx|aBw znl!q}pYfpYHuM-U(bryIl>^vEsM&lEs@OU*+u!gt;{mtxy5=)8o9pQ$h#+P|N zQYVE~-dJ~;KhujxhUj*wewwy-EB4s>w*&bOunSmwpFoy$vuW?UZI>2xXaKUSDrlEx zFc>?`)x>KGPG*Y-qz6U1*A@^ml-ZZm(hon&cp1gp3e3t zQ=|RZE4x3kH`L1*?2Tkcuy80E@rOkHOs_9Rp`Un=Fl-hW(4#t+u%7% zMoFP}y=csv;KjUI%CK0NcidQCjGE;ScTe%N+*!)9g1OqRLU`@@w;K6;unkzdzK1L+ z@8{aCmgn2m%K~O^jh|dlCl8}$w{pwzb=Pfmui&ZUzRn}=P9M`odHqwoSdOR5&j9a4 zk1gs`DHDC~aYNzAM3(2JYU+N$VSe1Z&LymQ-db;SsGn3-ovIGe_QqZf>>Z6f9n1mN z-dbcyt>4pjE;L8ePHTIQC{gw{xZiiTyKaN~W6mq7*n6Yz{KK72>Cf@9yn`tF8982B zEM-KvzcW=#!lhaU;?&ALcFhioIO-I=&p9fRhksbqoX5RRE_kOVKQEb*;GAhUT8qp&@>E=M5Liv!Ak$$RrL5m@sxptyKtVi zb1Qb(@_H%q4d7N_?QBApWcxoSns%pMoU7DcZP^X(H&mF%ZC9m&R_~7#(Tr4#^!j-R z`3DZfkO^42C{eqeynJnk^IBlXAmkZfF0gi#BCGVYj#K`RyNDNdn0SqB_I~H?@!V$b zN>3gBrvJ*=!`4raxHqRb7ljTG*R}n&zPCM> zWPcU4Yr*D{qKdjI>et9NZ*R(np4;Xf@S(Ey`iS#rXiCNEApKW~6P zweR4x0g>#qVP59I(E|qb%XT9})_d7*EIrakWqXt7|IGDHb_aMH-0|);GE+dOw#6p@ zja_2*g~*qK24L;J(R^;NYwc0xzsxk8oF~2A_?VGV;(D0#=g?THit2IZa*CkGsZ-t& zny(dowqAUM{2BP%aLARByiONb52uh6#4P#BVD-WIDZXglX01fpvvf9(yHSu z{v3yVA}9pbpHt1}){lM3*Kx`p+2t>*a3Q_-N8NQ!>2T^(x|bTplch-xwHUtL=(GKu z7m;59uK~;V5wfIi&eto}m^1bYbIQ)jJ6bLqr$n6H?kUdN;nd_f4=e!Z{AB%hvSPv}!g~+|)4^EBwx4ZM){H%GYn7|ePIh+zx$Ixp}^Vn%Q zHO{ih{4t1z9ed~s$T{a&RzJ^Gl{&su+tmWEjmta8AA`REYggu*y|c^qWb&^Rqf(Sn zkFtFuryDOd=8y9ydIRWgc&VwGDOp%D*(*`A8C#7VYvHkWR3U!@oCmBOw;}f?K0$a2 ze<-J9k99_Oa~5>o5=&zAl}vo-D!79;WZJKf7lGiD!7UMZ*lL{9xZ z&p`ugS1z(7TTVOF2en&Lc7B|gl!0vG5?yz)qmdcevj9u6u>Lps8Q3?f48HYlr(5 z;{qTCtQ~`qCEaJn2`~S4!j1)cd+d=7-eul)PncPR<>l~7Z=Y)B9(Mh$iLg7($7sG% z^cA2_{N93m9k>ZtzITx&6~3Z*J~!7V_$}LUvqU4Klaq&W?vl| z`70GuE=hO(8eW}pGrd_?UjN7S2e6IVJuc_MR(Tmtsm=7_o;NI(-H+=mI(5V33?AqG zaCq*hNHiQui_CY!X_1jc@EX_uw(GUHF0Y@vbin+#Jw~vmh9kP`QLtM3x8!YYzxa17 z@_MiZSpRM}pWAX}kN798pLFjE;&h3deO{hZYs{?suKSCSH|JqD=MgvCz0Z9}m9AL} zQWj(^h%QK7@IuN0Z{8J=Im2^CWM3J{c8B~tWk{bPks;|r!dWv_$>Z5xjw&^NUEA4) z9f^E@hv)vlFktOG2w75#x&99N9o(PTym>Nf^KDqFHiqKT`|IjD`x1T89gz#|C)~?D zXUI(AIzn29lq*~r>U+uc^GuOwI$qnc6`ovpBwm*x-wD1AtQ~(smQ=V)mxthbtDPOo z7D?pt*H9O~4(^f0>RykRQ>mFxxL2h(t0s`csfNgNA`s%uIXmQ^#rh6kgY!*6)dX^odbH_FQnk61%z-Wy#q#!D&oZjk;m?P4_F3%kdr4CPw#0e4C;?498Tw7D0LRSlyGD)Zb}#Rx32f5=e?ccQgbhLy)n{oIISDBpYiv!AL8d!v`5zjYDA%!4ZRcL>u;po=*!Kta z{Q%a^X~>f5&A7Xh7@yJk!6l0^vzY-})pfl$qz=o~>rC}J(7uZOH>S|OuBLPi@MgJv zIQ2~SPa;=liK&TgYs`p|XT+>7*K;D_YQlkSHe*XVPpU0ld>os{Kz zsmIfo%VHFQK$J;KDus;Hw%No1UVA-sE%Huqhp|Qar*_=GqyN=4MTg5Xf5*rozJ7es zNH;!|Zt7F+MrT4cy*Dp~VU^KoUY0*h@fDV9zR%EY`@<=JV%;<_6xcY7LzXo5E?u5G z#-XgXvPhbqW=8PT_2JAtTzoy_e&#x{>D1OU{8>_FkK*L3TrI57yjAG6yyqfs2iF42 z+k~9VYx!;b>kKhx-)lqLJq9KQZs%g<8JDsB5l7Hx?n4ba42%m$QV;OB^58;LEV(e` zEyR-iD&s#q_B=4~{g87Im+kTx`*|OCpU=JdHRIfQmyUV0l%%! z4ixhuWhF4;EA zUm_*+X4n6_9{;VX)%N6m5X9?HILwy2an_zv#Oy{_j0?nE4{ZxzD@5ia3+YXoMf|ysQC>vle?Nq#WUW!}TNKXi6kC zmBuS9z_fF{=TmI0WuEpK+P?fh2l=!T`6RF&So=;vmSpp(<9VDhXHJ1jE7ZtalY1?F ziN2V{rN*u9H1A9yEb@=CXJ7Q3sd;y!*OreLkoSS#0n7U~^8R^Ol<=pLcmtc~`s-bmna}yt~lLAcZOiKSFK;p90HU*QR-Q zyrJ{|=EV5EE`JPZ9bQ{oEf2}!?&$iI4_sD8sZaTfKD^gbP5Q5|{hRE6 z-u+Rg^D14D(H`rubCKnzNpB<5n-PokiARS-VtzCfrm+o2qZF5DpKw~V?*aWYy&bMU zIyH|Dp>(iU`?=m~?#C`e9_{5a;IqsfNk8T}hE@4vAj>#LhIpY9(_$0DaXKl|c!lYY zrPB$J-uNx9zt{DC;(14f{uN5O!{xJz@)PPt2SmA*^USMJh0?_TLSFL0Z)zsCS&%0-;r+`iJrp5=Yh zH8UleF3@%q!eiU}I^;{ic3|`EE@VlzowxPawzDh%Sy7qT?t;@ztvcImQLlYuO!5Wy zde3QLSd|V4`$RMNn|69%Pn&VQ%UwPUqd$M4wxxms2+%-IN5fK6z0sNefcbqmhCxJKl|1fBK~lB} zU;JWiUjzL1ymTw_E^t4v_C1a)$+oi{^G(`WU7w#&P00&xE4=}45m&$r7s%iMl;`+s z6D`U%%^Uqoz?+Rc3XB7mcQ$fQyz1gy6E_=Tb_IP4VlPFgxfV*5Vc2?CbGI4Zdh{}q zr|R`~wF$szKcm~Z1*JUIE&0&qKB2p$ z7wCg0J<}HVUC(I_&!t$NrTV6eIOm(-$c5_Z?8C%z(329S!>PYq+m-uiP;X`<9|4vD zYuCxhk`|hFq~m!`_0z?!Mh0S3i{eRB(n9~)xiMwBHwQzcF(H?Pe2qWeJy3Ef{|e2& z3;j{_OF!UIOl*sS)GDgX@Gw!O^y0W!tUA^01Sx4?FbufG6VvE$-v4vn@K^ThQL$_5OJ8 zKq;PuS89KEpg$k|s^5dW2RsEV|GUVN_C2J_!3@(+wfyvZbl0M~tVAYijcno~_d(BX z@`gW1udhYcj@uVqi51xr_f&2&$VIl41*YRfxId~pq~G-XW4z^JnNG0=ZQq=~1?BVz zz;^wHY4%*1C%z4v4H->zHFO%HYO{;k6FPtSR)@1drgruzlP zw)C(k<@5}HC*{=3lX|36!&Ta@7Ixf_%KNn|%D(ZJ&>A*J`_* zzX$QkKpp|c0BhGGWJ!0Lcy+YPm_>7QD=m!M<_^*A%qyPrUdAEEOm#52u5I>otGu zA3?bufjko&3@raDWJ%qX>y^6N_fV`~?%$hY-Lga5(+Hm}&krK+0Z##I&pXJHy33y} zGH5RCP!}2W@_^oFP~MH&p1gmu?iGAejt@g#4pstdPbspb{2%E0-tjz8t`{K2oPV`D zFWu%jf5jZS3bq+C=j)p&B1z}T!ke@myWxq$BX;aX-UogMtQ{XBOX}`?U0%n6{#;PV z3F*pqC#3JX&gBEAdvn`2&}+>JDSor&pYyraFZ_#ZS@aFw1xUVrEc@bC&B*|A}UGvU@xD?`2XO$(k$DWA`Zq@$og2Vdz zIPxCwlO*1@Y3==8QM4s+c_qv%8GO)`U3qN%HQqW-li|(#BIpM#K|T(A9mp4DobDuK zNp^mI$NqWl1a(D|w4{CEsbqd+U1}ja`0ZpVOTes&86iCtykMvC7ri;?mGbs9^7Eht zSl*YBlX-2uOIqLEW_?j`9V`>xSv2$(Xo0iXo5Ea1bxv(FyzzeryoVq!21f$RyBt}P zea_-#)Bn@FC8tg9f;FqEmJ2113#BM?lzrfw;>R^_L!$bQjzsP`2^cJ>i0CKNE@0Cz^yXLJ&ul4gr_3e#B`p z{Eq7<>QNT*yWo9b`F|SH{PupB^Pz6nWdSJW>u;@HS-W9DXxQ%YpDC<3nsHY68{P~|GWvRUJNB#_elBqOAvdxbJwDTkKad!`iN&Fe zHQ}}1LFr897xfpq;frK4b@(%PRUgK>`l@@6k%*hYJ;-+G<~@ERBee1_BERJ~GG69p zsMkm&!F^`YPwN%f+rimM27n|Nevs4en($ZZXs`Z^>pyBGFxo?^0q-07R^#X?@1+_T8! zuc1s@OJ#!YKpu~nz!MF_y~Qa%3ynYA4Ijh+U?d_VH~0AdH$5IPA!eZkVsrd=+TOj` zWBX;lL2d(|0&8zxSliqDqPDZj+>cfDcw^=N#oC*|S6N(--_Oi_o_lX@wwnZ!5FlK_ z78W6_vI${dM2&)qxFxbHLS#{_TU@HRRAODK)+KdC>XN#&xRR<>S{GugmZDW$YOS?O z)mqx0w*T*$c_#Og21?)0JNcaZoV#SsIkV51bIz9K{bw&%_qdD@k$U_m;9QmVt ztb54t{Y>236cxTZv!*Y^BrFy9IYl~$_KOXhE~SR^b#<0bPS9H-YEo`Md*whmpFcTL z*b&I#DsB5PvuUe+FC72i%jrA54}K@G32=OW1}KOhf8!%u=`X$J?P-r zq^z6>ErvqYJ=K1y%u0jw`?= zjd%J2H&2QPMh=4QQ3(vA929Skn1kXYO z{x-HXSGDB6KY1&A@YmHxv%QaE$M}ybKZ~`p{mY7W(r@DnrQg=H3l8Y7($$yIo_pw1 z*#%bU#VEQ*Y-5mBGMcs1svhG2O*PcOTQcvO+1A{@q zz*z63ekRf<=$jwsyCK1_BonI;Ts9_W6s=`=&+&YINRXGS7w2Pgj8F;8Ds=P;l^tMP zlU2>vlY*&9&cS1*-z+;Kn2kMk`u&Lvj>i_&^1HfV5wD8_2KdFxb5`(rdQdL}nHuyN z!P>xY(E+()iEBSQFKAHi!;4iA%gV~irwc}cuT*RXL!u0iGiWf`z{r@Gbzn+xz1ELw z4oT$#sds#AR`rkaBMbe*B9EvjpB^83T_t$ltzs{#$S+kM_$m3Hs6w9KSNR|1N6s&P zRdqhU^mA2me%Y(4%lX|F>*@WZAy#9xAnma>%lA?|r5&yWKL@w~aP4p-xFqM7x!3w; z`I@QAmm0mDUp1Wd%*b#}v(9@nQABUR3NTu3*EB0x(@1Iw>Fyxk(YzPBe*)(m-irZ_ zZa;8IZe8QfE6sR_N$euxh+8`!zgc~4HF&FxxzCyAbr2okYTw&YIF&J^D`Q7O>(V7f z#r^`nSjYSYCFSL@uCUbL`+0^A&NcF^hpy9aTnc_2a1-G8dI?<8rclr9_79nSO~-X2yzqEI0(J(j?+w735-iP+!I3&9ySsHr=TvqIk?a-gc z)b7~R$~1NBCi#`Qa&_Gwi*t-s$GOQ*;a#{W&^_ zG7?}Nnx!YoZZ0{B#l7aU%~-$roiR!&jaFiyVn!xDtB3|DoF`HajORV*i^-fEW`qIc z5dPN)ti_k`e}{0Hg5MPn16)Qxvvpxg7lM3O#a0Hnzf+y_BK>lce2|~jWgz5K;@oU8 z_lS-TI35hLlM%Y5ImpX5_C{S|-RX&eIk0;n;&YPswo)%@{gzg@YX2D(`663pb@rP* zZ9Ozm&Pm=&JN_~F6Tnu$)x+!HlG@vcnD%nkGJCjNGY+G=Ljein_NL;Nn(+fDweCok zV>%IsW->>Q(x=&3gnnCL>8Enj^hbbC1f~Lxehs)JXQ#hc|E(M#Gu!I^%+aev*HTn{ z=tNarj%nJP>N4fspeiWYVUZFMd5S+)9=k)jH1suIZzNME6{bo-1Lq`7-rR?Lxkp>hkMeJ z+=6Hsz8w527R4DdAKNZj8{v(_K4LgNBK{_`HvNGLZdLI)vF<2#n+MqPTL!;wowo-3 zVqgQ{LL- zy9ZjjyT~_AzS4g_1OFTF55UpYNlUl=xsjo}P>jo#EHW*(=fpS^$9rqLGq{>lBOL28 z{0s(JdNt(d>g`1E3xP`kNAE#!N$&jC+3gs5#IvbeB*S`-U2Nry0ny*=<0$jyBKyV| z741+T1m3wb81f3u9`aN@!0)1Qqt4ek(V>w!@p<{NPL(}^ZpLunZlyoc`qi*-pr0CI z`P~CQuAgNU_+Ac>1SE+*%jrAX^eeJnUB2eGqw~p6ibbF4ey$OrsCqi>W~Zw2 zUew{=c@$%F{r8uAHt1zZ=*LIC?LDOWJRF)h$|N$(7W6U&3{c4~P1l>PzuV z?}?jMF+DkkdM^>rE6`=VaK6_v)HC3XGDCjtP|HuUDBWKw!G{B*0msj5a7mYhc7Yw% zACc^r*B`dZY$uCq*0gbREoYy2hIc~|(St1)KA=K-vYz2)9Wowf`M6Q&@>bfW?OBJUK-S)a#z~n@^anlmLef;yGy}T)Zs($UVjE#AVzQmdoH|wq98)v-Xb}CHwUiN2D z2ebWgdYFC*YbTkAIdZ;BsY5JF)dyRCHbKvgQ%{4x0Q?GY{JaV-slDBf;pbQm1sBzw zo#x0-9+t0?F>2yC@9N+<6z-b2S5i|*ue3N_{sX|r0o8z`w-Q{^%y6CF7(UbO50Brv zQ{?EKv#$5-+2~yyc}ex(%ep^yB-_~TtQ8YP#VE%4uQ&cfI;Si*rx>@d&N{v-mX+*U zfH%36$p!rM60Oqp)H=qN%NF=>Fs^?cTrz4z^_`l2+oSC$C`2XXz!VB`;F4T>xZf(*Hs-h)!x8534EwLZ^ z=J90KR{Hf$bzjoEF)`b(Vm&2FkC@Iy15y~3S-X^-L>>x=POP*_vlG2BRy%&UUXh1_ zjmskwcd4x42)^^nFhwW{N>P`{4|@ayP!RezsOV+*Dxh-Xofb51(fI)@fJ1{5c%2)Z z&sHNBji-QY{6#w|no!ZST8qNpNA$BfG|HAKwjPpQ((S$+d>~K-xN>b@8s_d;ClaWTy864fd@kA0Oc<9*MV zMyp0;{n>3vtEXAMHbK{|A0GqX3Oo-uzCHw()HH(>yn1*(8{OrAxUBV(D zhkn>CqB|93=b^KiAZpDR&QCG8z}v}fjH{L@x{i+*mzxyHkEFuf^WbPj!OwO=!>>*D# zzr?!wUJ1|*aOF7~E76ErJft*L!S5*KIUo8|Usf=T79jWGaVFxHm^6WMeMMT)2rpP2|gU34}t#)&P$0bHF9V zL%%{dj~c$`E+-s=6mAQ)3F23=Q#G@6$~#D(EyZ&X!3%oItU%fo(%VLURlFB^Z-RdT z{2g%gj_q#g-QQ7tGG24@jZo~-s<%Y9Yt^bxG_PIEYuz(RjCd|B({qkrrou+3_ zIl(E)blei13{9Q=QZXk;4WyW|SbmnWZIXxwr8=2a5z}1? zF`>p2J|7)rEIEp9zYdX}_4O@MkgYXg{lm8#r#FK?3A6xCuGhdNxq5fmzJl;oqpg$fDwQs z>F-Tpc{=)ruB`v(u?FQQe)Z+}({0G1f0Vm&` z;F9(|?;Q;>2o+V2F*Dvg@45m?+|GFAZ5!13klt?cOOc<@^LzMSHjocEdL`hJ_D?T7 zDk`d}<1Wmd>Rj(0XwJ4YryH8PLwdF3=f>^Rz|R3107vgOa7i7OV<;N?{$I&);V$Ki zQSDA56nJkJO{2l}5oHZy2pYNwb8F$EEMBFHT&wk5d3v=++j8Co9k)*U3;17wuS44V z9JiORnM15*3imFlL0-P*+(GO!uxmNS=3AXg=X(rz9k2v&@_h$f(mwWYxS1OzY5&1E zC_t#BY9TuAk|Ejn8lcg=L7}HZ>4IZG6dhfpSbBXex)u@5q~?&1ZP0Q3yj?x%18qmsncDCSSz_rTP)+bdXboR(pAAUv12u7wp zOpkcL%J>xcc@moFP;!-A`ufRi|FFa{EC=#Y-OA~)4EGoKS47mSfgTW!!q_98V9TSX zBHbQVgI@>S1i12e4qVbc^atsBu;np*`RX-m7jXNRw2da!MC(&c>H_mxXkL4m*KT4= z{kFP>MvWe*B5?}N2M4KQpGH$S3aj1%KR;2_BR5vm4LQWeSFC7elH_=Z76r|^f=WOd=M}caCGN@OS&=iFDni0b3^$TadBLK;~Xv( zRey^@<-Ap1%F#Q&qi(@aay)vELCD-ELg0wRV2ND8`J|j7dp}nicMzIg+RnPE&hpg+ zT{mt$0=^A+1#o=53ogmEr@ht@l>;narz~H}+E1LkY_PcV%n?@pL$sN9)O{#X2Xn-l z3vVT?!LKy4VYS}jTzO3Xt*2Ois`{k)nF2l^I1zCCtOWn>{NS7@{4}Yxru9~u*O;{7 zchn2YJ9A*jj|3nYEG2Y^UT-~mnig6*f!3U zv?{ER#8m54^P0Eau<>v0U4aX4Z**1X;Qqh?Avfh}d8uJ+X%dGm<<#gq2&^SJr&dj4BV^sRng6OP&|u-;gp#w7;nLwT<6TY&}rK%E`!l~oa4 zkn@0wPK!3nOGSKId>T8`1)b_}-;smtG0}r)9^-JlKaT&@(PvfnvhpOx5eu>wl&60* zNRKsN&t{i*1V8JhXA#x2tURIc=}>q*WiKc%i{6RjYu+DKyjag<9Xp!kU>`k>UoXqn zsw}TJxz0y#JtH5CcYP#s;5%aY^JwH4&DP;VF^4MD^+^3^QP?N_-zscP zQZzj8Esg6fMkeYp)5;ppvwUuXj}&~!xcCTo3-AlT@%d|TNga-htSzMf`>9d5ho1xF z+kW;wfs6{wapmRYLvY2IS9`vtSK2>KuNQa~FcNU|CV}sd-mo@$lb|PK?*`?4(MIo3 z&%02_dAmb;8_3V?^KJ%z5BLah^e!J@>D9bw%m0?II;e*Q%Vn`vu`BNnk$3aduDt8* zg({L2 zy^wwoM**7^9}>&TlkCot>^@apgSdZi5b-AkLy8|2>o%FMQOoZ2hq{Kpel(cNl#dM^ z21+-n$PZQY6s9`8TL(W-(OUJQLN&yZnf^&!J**B9hz0>!N4)?ES9228_d3%7CAXTNEQ&-ktG6tNbyN16G~LM>J~RX+1c{i)MDBK91f`JTvQmP_8L?Y@$2C+aEBZ4uQ0*Ia7^V)w{u~-v_hBb0B*>bbx zvp(cQ%J&@b?*k73j?d4-@16dtG4z{iD_`MnmmXx!13%3+k4HEb#FqNJm(@L4@hNO; z8;GA(zJt|8nJSCby+mpG=j{omH2G708lSRas9u%vw@$CiuY4qb%3t*OxeaPc`P7nm zWuNJ?NAt^0D|;+ncDrBncUhGjr@zwrgQ$8cRM52i$jVcFP7NmH6}MmSF~S)_}V)x-7Vzn_B*eFzXALXaCCnUo=Ml0XNG;aDbnxQ zwRKU=YB7Xw#5f$_GHGWBzdNK?IXF#kJop@-25|J|flG4drETluv+EZR9*iA)CN&m5 zFVjs`lZwikC;k;=0q;uUK!i=`?=2rP$cc3TW z==K5M58Zien={Ck$iW_`d$9`=4XW6SV-Mw~JY3G#^7}E#0c&X}Yt)4+D+_B#EBD=|kN*q3vFZ z`c*{#B8q}Igxjh-!h2sG;f*L{|JlWN7hu$fbZ*R`^E7x1@caSOu?8ip)~z)ffpojA zgk+^x!-AnHq!S;J-q-dA9}OG=xN@8iF3Ih)-8j3qT$KZsED8f_qQYOjSb{Q@)Q-mX zpc?3n{lSOm^Sxz#IRO)eQ$8np*_g0m$Xbw{SCY>}`yk6=mPobt+j4G#uG|0r68v4@ zL%{J>IP(7!Uz1iYYV*i%RHHY_N!=c6NZL=%aXwW4)ZSI9jZflI=f_KQUtEZY_Z9Ku zrD!wcnU6O>9+3p${11v_{xJN9x9b7Re=Ynu{x1Z-3b+Pv{ND%uKb7mE#ck!frmajL zSKhBeX0th4E!QcuOWDy9S>0~31!|~J-w#^8_CVM5n=Yf+_W`2-$5#Wmq{cALg7fd+ zXML|eYeg91y9v#$ncOe7j|X{3i4u9_W0>rU(lHMZ*MnqC7pGf7CjtUvIF5A=?pl6c zO!tZPCDf_TDbSte*ZjU9XHYPR{I#h_i-Adre-TwD||b-z66gPj6DzF)L{sH)E=5R7Xoib@U;g7O>H=L_LXM-ANa+!xd>HGJA^UvM!2o9Z8!k z-AZ~Q$rkNj-KJ5gf7r@#BYZkJ9tGbDJP$ZITER2raO;Bha!jAvp8%7t$<)tBB{vo~ zzz^A8dySFdx@WXoWSpo3Cg^IN5%;3%5z9wvbefOx;4^?Zfa7BU_<{0~Zo2jL@X_7y z!NJ~L@X-T1EHoz4U?*_2*cS0=SIEaE=(zHD0sJ-KO~CQ-KKOz1Ay$TLcf@6{r2fRV z5_v)q?s+(UJS>qZnI+Qns4b7GF=_j-8t~(RlL5!aDsV~d;|_OJFTzJ#eA}X$8OBa5 zM%^s(eubG>Z_{jW1DB(RgD8|D7OF`$f0F+e=(zIuE%^Ju9|6b5m*A3IJKtaXFh24f z7s$?i6-aByNA=irdDMZg0O|q9M+3N|11S%~$36<=vwana$=&m+e`?F66?!Q?ll|px zp*_y`0>JT;0+-Yr#&cL7#;t5$KQc{EUA$(Y^d1|YwMqTij%R~Jm;RA@LVGjEG8>HN z_$7xCEe~DoWNhj4bvFt0Gn?*zI1@rRKsEf#@>dW2c*x&1;I{xxfaC8Wa7mZ6voG8? zf5u3crd*WjjizZpk2t)Y>MiQdu#;dw#aLGiN~W_-=i%)R`Pc&;$48g(zSkS51RNhD z!6p5-dP|qn;xm^olp{RLM>oUA3Er8GkA%d~o^CJ0A>W!UwmceyF7Ktj?gVcJ9s?X7 z&w)#FdhC6*<1`-_5!cr_!^4@fE2+Ie>gy#%q`l#kN;kis9xFPD_5Q3-8R~hd$1Oj} zL(=W%VDO2+6u|LwD7Yl2XFOnjj-s)?|9XFgn@stiVM>41^c6Sh236Vmll4SobL4{&^(0xrqbkF#6f zcY8gn&h@9$%_^bRcBkFU15{6`9_y-Se#W%uC7-nXG(#^1Jt>#h!QTdU0gj)K!6hAd zxd=c1SvilkE0e~Me$~V@{iDH81nK}se>wR7PQQand1`M4l22LrH<7&o1>3f{L z<=*v=Ro0n{SIaI0Y9;lvnR6!q5-;v}4hTO|4{HnzhI1G#M(GJozlamZ-8GYSiG*@r zs~-)`lfC+|JvaZq0sed7eZcYaIk+UZ&+fQhDhCKZ zix#6+SY>Vl+ovsua1`JkkbBkVau3M4=Jf~m%{#t%H`TnxK1bvH ziMmFvM4XH5_GEvE?vyi@COZ#&C>FOm>TAN>a#sTmI!B@+*U2gR5VpHPyi6`fEGaIF z$?E@P|0tHeGxT(>R{XhA+mt^oa-_baZQbyTu-_v`HFAiY&w=j*-UXbT{!}aHQ{jC) zUxo39I+8OZme%#^c8yiVEfMqREFrZ%QGZ1(ujj@G5e?T$a)*%vkqR&-IXDaFS|X$g z?--Wp(`h7&+m2DZZI<8p@Z;)b4ftKaeSqWlOK?eT^%DBycf_w79l7%0US+O4c-}tV zvKJsc#03c4gD}Uu&Ni>Ht#p`A)Xx*%%@J2WQZrd79&#~5;MS&SgQj*$K)UEDymC@; zEQSgBdJ1-VllsTH=}1|2Kp>o~++ynlZ>wq}_vvYc$pV}GX_2LPQp*yr<`pY<&9t=K z_28EQR{>7$$G|h?{y4O&?nrKFkC`!pe`qV~V_R7xC4lfJiu>4pO*n-?dOS_gw?1sr z2+*Q8D|Q~Vn9nlBUmC+ZUIT}{Bl{<@4{uygQ2fQ#||0L*oI>nUzK@726! z`DzO3O1pm){CVIvfaB}^@OwAkx#!+|xi!4GV&Q3V5gL31=MF1(sBXOc`nfr)ecT3YJX$pES;Hd$3wv<0n-6T z?xwge2KxhvhH*nfw4t@ZrxuNZ>8mas)%4T?=&1>zpo=p zWO{o}ZY^>1T3A_b3KB{I}KD@1VTp#_8eP-~ndT&0st@Xj+A-S#f zRP#E}yj~oYD_cKPf6MVsTIu&lbj6TYRwFr)ti%*t6#8-qUdjNCHAt~ug6EX()JqR0 zEKMbs=IL&Q`uYfcFx4kkk?4*=Z+1@ZbiW?E?qsBBd~6cZeWm=*71|^H*GS|tt#+!o z2@A68Ei2~+7jUe0AzRdJZ@0Qrd3P{# z&a~mI=KGUexi-FS>Fpsu*Pilc`(78I9B}k1z$LkMoI$U0Kuz7+W$iS|#AUqIgf#yG z9ho;8@apsfN)HJM@A|!^TTi}@?iJwI0XG4T?ycaNblp12)MpsMtQ~2r#2-bgob7#~ z-c;U9z?)4xd28O*@{XnZG5Nan;y2*&Lwzq7aCEzXOWGBVYo+0O0lM6cok>_$ur-g# z7&49{(=XJu+B<5vE{@)%BF2{RFnzhSl3sQw+x4!czl{8y+-HHG4_pK|`j>-Ca{bqh z8_=JX>1|q6BR8mjq2_yQEA$ZAJ&rU-iq*R;oo(ckA|Gi-Z-ajU{5{ND*2P}9E_U|D z;W8oeb_$BdoSb9A618^$Ky%hM*+tIj*lhalGcX(Xhj&GH$zUh z%x=`1t%38`JhEZor3hC=%q8H=D4#C0QV6e=yNl1(W7^gQRUcbEwm_#EI?~Qx0{;Z~ z9B_PeKEm>m3fKD|hxRV*_?RRbs~$~}W_5c+HAP<4=J9{_@gqKzqIn^X@ylEsdd9F+ z{8HA7Kb8gY0%8Ir38FktchAqsGj8TG!08CUv>1 zb=v1wmapVd>2fFouK@Z2j;{gWl3clG%+D_LdZ=04gNpNO|NOnxo1XW#P=4}pdaMoL z*8w*Hj?NR{lAPWmW4sI_Y96*~kujpKy-i%Zqns`OQ(-$jxj!dzIl2J3GhW5lUZR~! z#gAs^*0!#14f%=BP0L*fUIFw296uw#B{jTg*O$#Nw5>B2x{&j&>SJw8sE?PJm;Y2; zVRp(Gv7cn^S0P0`2V?3=HQXnzND|MTK`2&Q{%*^of&5*2{{i^Tz-=K-nKv5S>9aE0 z!NO&W7oK)Z-HPRlXbQ8TJKOt}bo*!#F;tU#Z2r5*D@8ssUhW3}68L*Y{$I88izELf z%h%6YwQ{K}_Q<%O_l@c&8ZxUQtPb<7o|n#d4)|Q)SiqIr$>5T9g?ce}-b((gt3t!! zqWYsSk@`lRj(uTYW_4CIGp$*c*BsK>L_V&39tD31XayXd{{xql3hSpad_res8y!Z> z$!4Vde#AU(V)#rz_u7E?9aSg>Vt5vp5<&&rlVOwZ)v>s7#Rs&oYp04ZyWi#@#GEgPl3Mzj_%-NEZyWw zw%rbTyRH4oco|j%mX!@rV^jGFHkDlCloZR#Z`9qyKGbt5fPSL&fDP_S5>-lPi5Qfh zHsaY;Z}n;l07$wzhJ^*v0H~-2t3j!4cW2REs)Yb|c@Y-}~Mb zoS)`n|2!DSY8iwdQA8abs>`zuVJHp)!_&#!k3k?hlv4WWuvE~?L~OYB~xHp@xv#2Es4p=YA#8MNn#V#i`c0NU1XFb46ihj> zLPsjIV`FA8fuY~%WuIItF9t^Xd2`P!AzX-7Kbhs+VEu$fdmm>PagpWMzUxFx zm`)xBMEPEQnC}+yNI^%+=@;PJf!6_7PJaWJgxe9Qu00GtdsKF$W0 zKT<}n>N3m6wvdjL$8W&j0p153AD@TcyLxm_*KW-1<0d>`3DM~;)#rJ=>g6p~-k9lRiiPPOfuhl*EV8Xce%Gaqb<}9l?T|k5ON9h^aMUg{9>Sg*=mH>aW%b#)j=&Tub6#~5q%ijj*JN@J};G2L40LS0Y z!6of})$*4N;~v7F|36!R`pGbBopC~qs7 zEIUW&gj%bK*mGg?8_@~-1uK`r>{y)09%@GNN=4{ohQ<1Wdlq4UWf~}k(_*xAfiCcx!+f`7Z-$$7G~2qfGz7p)PYE91rw%sDT_D z+H$BT4_6MCf`1RV25|LwJ-DRycIKuZrt^12QdB*KAPraPlQ17S$@2!b1!$-Z>Fpvv z*YE!VPIPB44mf%#a7iDA`|FHzj=9W{QU`W~dB<8NB#o(ff!K&&rSH(3XZF=IPz@GG zhY(dbUq$&d_Z#k1{sh`q<3VBlL&wRz4tzauZb)0o)5R6Yn3wGSLV7puE_n6BN11mu zFszIXRhaLVjC@}KZv|dI@O+&Tg?vkhYexNt`6d^o=k-ePfxr+zlJMJsz95rd@(l;) z31mIN8#TfFCvigthwXs8Tz|d<{7PVBM*gmSx%snQ{j&gr4`1$kCjZ&q=-FZZwPF6P z8TtPnd>8OxM*bbF>(->}dj^@#@Wuyva+s~x9OhfOIL-HH@NvLIK$4V;o2N4Bap{Ux zrwksvgmApF$jD|*pY09EHvd6C3iI6%<{|5sYrr=FF95EcejR@A)^Rh#eHZ284!0Xs z$~4YjMa|=fgr(w)d;KSByDlHE?^0cUu0B^4yVap(BUD-UbNm~@!Gnd6VW zOPw@@u+S6Fs90@$Cr=zPzib9Rl;*EU*80=*BQX|;SG6h7>WACF50+s=e z{}tep-2UCkk#R1LDAK_xqmr5%mAE5fk?jLSKRDXm%TqPN(%V9QuKoN9d?)Y@;OM;% zF3Ht%TU;dPr%$RYa>iU3p7?UIKZK@w>=~gXG)13i6510=)x+j23 za&rEMoC7_55=s0ClfOvDX;VD_xeBb13*2;1Iykn*=V&$=PvzwjDf4 zrB*+tCQ_-tMM!{3UF|BBeCiLjayF8$tJizMe+E1WIJ#TGCAo9brcf{5b`KHtnn@Ln z*3-UGWpy`B!j}Y|4|qRQ`of5w?3Q7kH`dZmE>F|%4?Ywa2{`&=z$NWp?zRJRBlkul zHy3^S0CLaCkh>+MyMcV2+_!^21Uv#bx<3P#GuX72n+!n{o&w}_Aht4W80$YT7*=A&Fz)H}0r99tQ$4h;x{0%H>F*(bN5B6H*80E* zz|kKKE@?kG&M;o8(WsWoS>TsYXc{f$e}{jm8-SwGd(c@#)H*Ye33jez_cLw+_u z&++p!@E3uX0LRaEa7nH_+&ZnTJPwc>Y-F~n+m&ikS+`5$AV9Pac+V@pkCam5WLrL^ zr(1e5A0Grh8#n@R{Cq$B-p%vw*=A<7uzp=yBgIzeU{gCk=In=wW~<$y6-ZrOr{9cv zy?f&OnXMB9n(56&H+%j0a>+^3Ka`8TN0{Gq;rpTHH#i3oA%fH&*8A%_jVXjFr`^-6 z96R9CmFuVAp95cpymz!-*_;10b4^sXelXe3TN~&KFE!ofJ9=fhd=3Ra1~?9I<#R&# zy(<^@+&h132wjxy&RNHhe7xkBdHyo-05cJ5MUcjj-i_qvfgahS01H?>pQp zf9hcQBAQ@V?*^dM=fpw-_D}wcb#$2j9`cIwUg|q{6>}}n36LbetnVoQ^-CA8J>^UY zy+m3+TCR>Ps;R*WD2ypE zJv=Hi`Bcpa>z#ZZ-7mra349AUx*Q;x-@E?g&gI(rQ%6*BAB5@}&u8&nVS@{FNhUt@Jnu$5&nwG{=g|j}Tpp9l?~^mF98DSdZU%o0 zcmi;8yaFz%!~AEh6bIy@np3dgDZql~W-NES-uRSqI+f2(en13wQ|a|b>tW$auQ{Y! zdPcfERDkyf4gwtADsV||f8yG=k?Zif!-a13B=)8^>l3`OCwSfnqt5e^v#eb8{J$%& zi@?7NTps4R&+?j1z@@drhn=!~t?YhEy<31{sb$X5!hE-7NLN@z()dO07?7jchrb5&#vUz)$85W{7-$D@A`~e0PL-NPqqS{4?P1fUCcMh2Oh+b5B!$;f~6VOXFo+I`Rgcdp%oZ|Hw|c zMQoEN=qi-6q~z>yJX~YSqCx0Q2A>WbYCkhH8^ZC!wnz;ldmMK_R!v94^BRWo{kDl`4D}UpWruAK9U*_ zwQ{A_ru8Rdz)t~|0l`=?q!7cFE|$QwhtwXz@|&Oc+PMb_P41 z3xI{dRA34)DSS={KO5lPq5l$ikD`s{5;5IXE+NuUE*`7)V@!Spd?J_Hbyc~Tc?<+k z@JWsyO|)>qrp1W)EtdvL{BKN)1Al;F(`z`~%C!f+Q+y=#)ny$qo`4yElk0onk}5-e z`hSsY*2*?Rr~gU5>mvU@%U6G-m2U_9JH6N6z)Q~LPz7-Eod_<;)tfsv?x5c0)U8GqXOEcYWl2en~W$W8YWsz6Wvo zID@o*HYS|J^q2PmJ^UHpKVJB2IWBDf@SEbjw3FT7-vavVv^*z(OWJS$mhzmkYTZgP z5+#o7qlEV%5P2_zc$*tWgAxie3&!N`wW!Z|Jnml%QgSknctn5TIaE&3vBE4lIOv;; z_p^=;k@vKJ!3SAf>qMt4#1OGK5A+`Q{a%JU>gNP2&nEbF>$z>*t5e=SWf~duwlalsw37*!@3c&JTAAuk zvhvi!uWRQUz^?>0hB6#bJ4Y|RTI!_)u1ma2Vob`C8pHfsGxGl!{LjGW2b#YzrVEF> z@#H_=yDA=VD_E3DjpE`TMNb~msXiy&Z{~uZ0h|fAdU+aL((}#s+-^}AN0aTUIK>XG zsaw5f@#IyjBxE4xn0MM!h9ivz_d5ILui2u=y-VMk?-h^M!)ZW0Iaf8W{?H&d=jZ?v zEADKl(Ifo9k-;1fWf4NhSM&9~5zesstD5K)jImtFmtb*i0)~F3ePSkFlg)j>i~*AB zmxSZMx#@P+4ZH`?3y>uB(q6yqp7n}cW3G=TfFE=k;4*o-+ z32^2061b%LcJr>IvsiBRnYDB!R|`!Eulue)1QUjzhykql6X$vN=m)jeyNGdwHGZ@= z4LM;vYRkiCQs)_a7`zM>PjN52>K<_u#HIa zr&&3 zwHL|Q)89Uv0cQdEu_9i@XZ`*>|9I(KYiv0$qa0nkKL`8~U<=^N`N{@c&h6({SI%O@ zXSRQIL;PUZ8ZXy3tsCs`tQ+h)^VvoA&3N%p#%(>$%QcJ&eLhZuX7w^8yNbm@VkT4zQq8 zZ3WG>-?VRvJElwiv%s;Cj3mbdohu!w_Px*NxKpKZ%~2j%J7 z_1ECB3%T15aOHg$xTFJU*GpvAJ=yNLxklxp$U|B+>(Am3nPz))j(4d)ManNKk*$g} zCvAf;ttc@ept}b+uymDMA+z)-);Chkq+WnMD)p`#90j_%5_>Zg z>#9rmY$Thtk)?%+6mhf4>D)T!5dN2#Q_=p^M_%?a4ugvr+kr~JmCGsMlAPU*+ZVfbh(+3xQ6mSNXj;6gmN-Vyh8*(Q69xU{z>v*1@AMG4X>S}Z8c&VR=l*VV|2Zcp? zdLKO?F(j_K4yIaV({?-d#a_)tmhVmQm4YuBr=A9X3)lrXzRNDQe7iUl9q~PUSR3C} z6S!vLMBsZWL{8$F4G7=O*qzcx_Tn2eUg7%?!*>aMmxO%Jz@|UJsd?8yA>Tg~z8fyF zeAmL4EAM*nTYw({j_*H%OR5R|eX2u0+RXAEK8&KSXidJNwkK6<@=D)4@TQS>*VzxR zvXA`jN$Kd{;>sF5hG^xJqDg-P7NCAIrwVJjS(ri=>KghS!Fx;S+=E8xiP3SHpJv7M zRjSu9`rrs=p4LZbm49mlU&Bk4f4z$QMERep2o^3hDoIyZIcHvymUBM%CBWr?lk+#= zlJ+O(s1a7q=d3K3S~*|XOV01_CFkD~-cvD=^WeSZoI>4oBxlB_R?ZXlmh)PXlfc}_ z`LL1mQYUA_Mk{C4chh!JQ^Ai0764Ap<=~Rs{nhTg%GIY?@3jr&jrvRL0=LPyz}=%? zhqGqelz3=eqx>JIC+?bSEFW8--2A9+r+N;lh->yF$ zAC&_RUw8U{`UL*e`UH*#q&#|I&2*p9sDj zSP3|O&IFgVBJ>lh3jG2dKb#@0ty}LLP)n+}%6Kw-qHuAY_C^iGa+r0IH&R^hQr2kQ zf`=liIr6!0>*Mk~@0htv5OQ;#@#~9c zq4_G;S$CsJv{xce4c0VSYA#r zqYI(C(Um25%?`Nh*!*h5$P-Z(@Tt}VvV$R=qAMWGf3p_I(OJ2=C@AiiC%#r$a)G1f zk~Lk}O%sM)2NQ!u4B`C%Ihgvpl92x5`SEZ(_5+pZhGBclEwQR{zb#$8PKZV2oE+I*)ihYiT- z+V2hE_W(ZzTsdq7m*nnW*%9_5R}Pcbu39clr%`{PH_CNE6&qQeY|>oybzNkxe?F3M z_fPcTNQuf8yXi*dUrc=oYEtdpmXG8W>2YNs_!M9!;P`kHTvG2aF8ht2wjWp8_5*WW ztm2B+oSk}mj%v;MbJRRu$lack@HXqmOT59eX%=0Lb+No=#iz1+Efb9{ExQo)TA{>D zxHG~c^9QPHzDh&~`*%e6yt8hN^a^?>gZu=yEk^Xy>Y!k-ud)ti(wb_DT~_ASa6JOn z6G@Ty%7|t%+o<%Hk;s+4{%J(vDKSA$cbHwJ=_1jYic9AL?CNVk!E_12R$ ztVDv9b*)r2+M>cj#`clAcZ3@+yWm?fAli=2f)XG z<8#jU_Rr_)^1VU;I%%fgxW;W|z#=Lh3!zOEc(e$Qtj^CM0 zC~gv11f$|h4D&0Z6^t3;UL%{uvg|IM3e3BFdC#V_pdiNB8g5E+iuupv#9q3nYx#86 z=s~O?)(7dHi2C1k3ym#Sz8m4cigK2A@G$uEz%KzO-v{85ZVBySoIcjo1I}0YZ_eTZ zw>4|#Evu7i@N4GL3NMtVco2|>fIraQMZ}1#pf`!GWSpLrRl*rlz9=F+@A3@2Na}IR zSJl<&a-RY|7nlz?zMcb@@ATEakEbyD*MyT`h&Q4i$8>I{V$YU z`NkDF(nR_)4tGWKM$zj54AY6CZh59i<*=RGyxn*G)7~o*#0-B!nd7E3v(}Q1LPir~*o0^J&f|iGxQ} zQ`Idx)$hb=VP=+29+b~ko$y~Yj!oJ(p1>`ZubI$w{qYp=Gk`Mz$Jf>12Uu=~IT-9OvyYYJz0uJdh!mf7?H<O<8KN0|H9wmMJ&b^FI{ZH5;UuE=EUTA=5P*9@*Xmye{;lZ ziVlFeB37VTdNOUiE2Dj}Dvnl}>4{7Ga49lZ^u4Y9*;1Td{qte_ho2PhWnA12{x0w# z;P|b&*7ED(+_cvNR1R3Yey!Pm^&gz6*ukskx50Mt>N#pVT;8u=isBSEl6K#TnD510 z6o&4F3uq7aa~ahKQlK)rk41ti9gpcwgY=0EGOQh=Os=_=elnu7f&|L4>>!`Tp;!!D zEY?{qFIqY3;d6c{$4%gyfCoa}MbEw^)PL`fe>=fWS#^5-y0x4k(4~!0eC;I>4$;3< zyevkL_XF>J3OS#3RzAwV5xkzx8Ad060g+0G5|>D1i9%k5rdIAg=u8O~ z8BOE~9LPz``wr<7R z<@GBhFs8ptJtv33u)IxsJ0f{BjiERw7DWeghF#$I=FC!>saNx=r9c1r^!$Ae_)WlV zfNQ7m8*EuFYZnKgBR*_BV?-f(c9=m4`8#Elkbm>d!(Qh66rV|%ZjXCc`v)^|7Wm?~ z#F9^Uj#e^#ma=*t79H#3pBCuiIWz>(z80ak?3t9Cz`OhXxu7_u2PFz{-ShoY%D6P9 z3vdDLDTkc}EFz0?V?CKhvy9i1Z0??l=)d^x7ESbqzYgU`J~vOT1OF~?1>od=6kO82 z=Bdnfv}E<-_4PxmkenMF|Bx}3+)vas?~Y)2r{S#4#Io;TpP`N|n2%dxVT|)04o0T? zRS{Ih;ySub`%}zl;(67tTRy!Xq}xen@LoVA;P@O1F6paKFSqHoz4tpIZ->>bH1Sg# zh&dy1s`7|ab-%twd+!GWQ2frq|1KdLL7_gJh&P1ewmXj6H!L3;pp$}*wAanx+kw{s z$H&<>T0TAv{oB^J<0G@YrY~Q=cu~5!R5S$_soMk96kHZJkCupej5DuW_)2*FG|&4w z7;8?gld>+AIADOSN8b~7)A6w&GptLekJDxWsH2{G$)HQ`776GB=UOb znF_NOSvAPo9$iCE^6J4MOkcm$uOOF^vM}o$D=Y4!XP>BJ@q<|NaR?JF&F&qP9v1YE z6P~C`R=-TX@0uk2Ec^ z;aw|7BYZkNz+>QV0lNSvNAt~A4(G4-pX<-`{5E&ls?}?W?VHgQcF`2x4b-mS-%<1U zYur3=k&q9Y_)g^dcd@rQp4k?@R*Y~tY=Iam%qttSyiTk#=9r4^YqSe)cS+-sU^_kZ zumZm?cWriK7zv+=(S9G@hjl%TDq7+9pomssi0f1%3${m+Z)Z&at61nS+=HMwWBW;1GJ7iXG3ikZt<@ z&*J*YICF5=|Ghtl{r`t){Zkk4A;1X0mG?>Dl3bk2|I%(`s;D2zG4w}r9^Df-3+P0d z65Q;nL=llB^Zj1XHq@UW!g?IEe}(S1(^UeeJ3`>ZGDI`(M%R z*{U`BBW)h<*mu8B=G_za!yg6a-93Dmpk$ut>a9G6mY1WGPpRC;mBbCEii*b)@ogA} z%0n2;I_a(icD|hW8@j8}ly=PyI_3CXd+0&^iI&WzvdMS_=YEA)UR3Fi@Vw#JdO9Os zDJz}<5r)je3!*Qn$O~!+r=Zz6IvcgZ5OU&pFnB=~7eGgT3YEele-Qt?NDq-PAAN!e zI-3iWOmw$oZV*R*EB`Eq<-=c4CE6d`FX)_LUd$JbZe?Dd5(!wBwmvFvORrbQfX@bw09<`M3@+)b-`aZE)=p2$ z70j+K8VmjuY%EZX1=sl-Ilg^RZ%%Lr&M|1=WSL!|3rFW3EVtQ@)||m~MtIhQF+J)f z)$2cssFQr%Gop(hRzrint~kmI0t(U;hbhZ!j#&}tZsik+tTK$V7=J6Bz zj$=CcaHD;f+>S2#L48NI*TBWNIeri!J~-OpXg1Yuf>d+$5en*P5nBB+IkS(p5H(13 z%dv0%z?-5VJ1gIx@T?k_jdKVBW@j1y93p3|$@dNh z#sf~yr@&2m*4CpJ#*=h%u9j_vn^;89#;#K~c2$jC8lQya zL3o-(lxc$hW^KZgGYIp(Ko9IPILMk98=f0v1=Y!=UE-`+vVwlW3CsnN*m>0YGukH> z!yu0G^+w|Rio7+swtSL5%4i4RLx2&0E1yTeB`tc>mQTwwdyhLyPG38XV!;aL$%L_T zxiK#0Ef4B%3%whIxqg8j!BWdEdI$#)V~~0v9r=3J>dcf~xJk9Up1?IF)w0bI z^8gG=*;BIJJS1MIXEPGa$eqMDx2jl9d;&{cf*j`LOe>faVeSiZB9jV=R8BBSAjrv@ zq=E`mjbbNpX+(c(!j}JB>4ziwxj=2wI?u}AS{%xM2lw|NpXmqSLx2&0lm7y6Nq2?) zydi8Su6-c?bdi6zzB21`O$_~?>d%e*f6n$UjXL=YiLrqDWhg6_SW*lXNI6(nAn%y0 zRANHF32pI=BKR-JPmIjX$(z<0d_b(Lk>yuPzh(Hc{P7X^ z-+^xcCr9r)tsGUqwDos?7%w72j>#fNv)&SzJ=XhXclDrtKIUy}ljCj`9Ye!}d$_(& z`P|yAa$+-cVN`nE#oFJg3HzbWbgK@pF=hFyhrZh%od@0kToUpm`|Ew#*`02p4OP*g zs=TjckH?@dzT_=ozS}bLeFJ<4@b-b^TgT`}o|5lH#P@gk?hf;@PZAf4BqACd|8yqCE_0kJdfmHS2e^S2ly4^h`>#UJr^+v9AKOR5vU6#~tD2z?Htb-{Js@VZvR80B zdD<_0S1-%Y%)8U|c?|f8Kpo)tSq3i2)vNPYa_w!FU8oe*FTlmBS+DaZ4?&y6N^lav zj(F7ewse}w$F-ZS;J*Z31st7s!S_dJ4JriDA^5eMMM0DcEiP(Zo5I8@*Bol%0T9%i&J;B8yC&|7+O(PG({iFx;?6zqE9IE z*cIF!l?L!_(tB2|)TN05oC2Dg+4G9xdXyMC4dxu6SWn~niCBVqNaQksjAexEtVcxj zv7Fyjpg|A&G2A^f2Rtb5##chiSD8}t0BgVsF}p3U{*pu8Z0})l z7wR@c-(gni7b&i>ULTGusUenbEBU(i@kj8#0$&4;?!Uk#xpwHDd(jos=a4oUm*?34 z3+<2aog1$2Gi|?Kudo}1WR;~ma}(#pzeUsMb6S7Jd9bR~hI*RBk zI_D}?66A0YTs&USP&2zv(y>Cb9i;lGBf>M|U~+jxzY?Ku_a}^1!mAl&%%ac5?f{WIUNt(SD8*Y zo<{hvK(T4jKWqD_N6;-8moPcy2T8F|X~DXpThKLT&}^z1B|;0vD4kde7XzUjDB{0 z&bKP-4W-V>`&MP|!6of!7cbP&v-@>Nl~a)|O2V7bUKLk%Ow(7I?tf+5hP}Ba z?Em+tU)cQDYH&{vAxt$mVWgE>G5_h_yXW0z|mgk2jJ-K0+-~*r;hb8nN%6!?+i!yUnq>C zrs*@KZJlXVGWBzCOZ{3OE*UbWaBVALwS3^+D6!^xhj;o`BLd@&9{Uu*@D?u?6&ljza1RK0i+nb-8kGA~Iho83jAAB9~9l-H> z9k?Vn|F`G&lr@X%RxeyORJ{HDng`^lH%8OoqUT-sXNeVWZze&k&^YVBDrxN(V~sN8%n#yS-ZLCwE?)ewv}uO;U7 zb!{H+EAzlFReo@peRq|89Pw|IEf4FrIJ%FGMZZ#j`mV_5L;~CMRz=t=^ww%sbfR2l zmdEyTtofjp)nTb$q9^G^`F;{>Bsuvyh${bW#D5PfGOe%G`m9(t=`xa%Cx-QpJWk#- zz%K)?0-U_JfJ<`YLHl#wl1TfWW8IRLEt3I&&MG>DgUp*qYo4R5^((V2AAaca8FnMF36a zlbiHex9id--A`6%{>g<+FCt3Jij+d+Pg-WTBi0KNeny?=vC za`OI1{0}E@2DJ{Z3-g*odNUtQ(_0L_0$2q&daJ=D9e{l90IOpGO)j37T4?2LAzvrw zTj1{le*hfakHIDVS2;7Ob|7eDNU!R#G`+*Yj|Pqd9K934B^`jAVhT598Fz;mL03z_ zyGEiB0ZjWYQdVk_m2(sMIys*Qe;wEXIJ$3xOLB5{6d%broMuub7!n!}*_Ge{OfaO^ zAP;!=DnI2GmWwU@%Acm`SA)+4<^Ya<4Y(v1x6zFs8U6P7p+iqJCO2j>DXG6oaRGds z%MDP=GhyiwGE_8&^cu;}$$Jm@Pk_fl8loR_asBqDv-pg`dsFeN&%lr1|FQSx@lh0M z{C{=NOcD|T1K|h|!Tfw`=*|2;OoGp!06Y&WiiLm%+odPKXhy=^?K{f*UawA^q)7_-3_o| zr!AA`#1f^y9s5TAKT`KG-UAPeeml4R10p=}yP4(LE8q3Y?;~ zT0g%2YQfm49B3eNzNNi^D%DGsUc#f-0N)Az1x!5~;j*+^&-AM)V#}0n^l`VIhry2q z^MEXSsHdM=s%nbZa;3Ks+a{iR4E_vw0hoIJ4K7P^Jf-(P;3aw{e(dhNdinsyo`-qQ zuUI^g;J!aI_Y6K~TRiT;H>FYQM*i%^&%@y3!DL``XTfDj=yllp>-Ahsx^mSh`Q$yM z(JU_9M<&w`+toI2(i_ZdNJK8dvih*6G_u?VKiUktjVn~WYq4+Y{UAI6o&`pK2V9oa z^`2F=V4;)p@De+#ycaltOU=Xfi-ho&6F4$q)6r^Y$#vh|m^>RHL$}*?QzTX@KT5W^ z?JydC99RI1AGg3|G5L&{$1v@%6`JVdK{>~3YVw3%Xd>LH< zx4C)wGpP=XBs04+fb%J5NSl5o z{U^!#+3Ln*v-F>3cBC7l@SjYh$^Q`~aYOOHLo@$7yZ&G0_#a!X`#=7fapht7U%^|z z`2Rgz787@v`DEk&LGrFN+xI+g{VG>s>KDfqIzM!kYcV(3TLRn|9Y)h0XdldrO$RUs zF@tZO_hvFr&Y#gO5?1hQH8XjN@+-F0_3Ie;so)G?{JI(L^{Ymwh7dI@WF;%C}qyj+^qy z1?lKRcJLhe)MRXpKK}f>D2~Yd=UaHkC)wW*7(Wky%Mwf4=fL>6+If(t+KS56eP1|h z{0bzU=B)O^uXQ}r!gDL!s^G4i?4ko$rqqWyf_B|Xg1m#IpIn-456T|S>l1jpLg%4$ zR3Uyek66^NResjshdItS!fyu~f$_5rE{mB@GVzb`bGG!8$-)I^<>1sA;>*AQp7%xR z81~BItNb*jvl}~RTxpk}EkF-oboPeJl4@L;z4AzA?By!&g7QNdQ-(37Y_d04VmE?$ zEc}ztld!iy?ogSKo`g7Glt!(;2Kz?;BKXzdI$-qggUgay|B#iZ`srWB3bR)9Yfjho z$G*{T{}j);f|0=JFNL?JKWoYIs$~@itX#H8j_ETtU4vPVWQrf_(4zx@oh_y~3=X32R!b`hW-=P}(NuL~Ojc7<*} zQTsdP|7Pu&5BW#J^b?)W_p2=)c5|^+Tl~aVmh*jH z-?~gTE~*l`o7+`k$MjNx%8O^y7ggTSoZ_{$DcRMz5)E zEC2t0>)ZcZ^(*X>uY3PLIzUrP-s+Ni>HLM!d8LR^PXTq z`vQpiujku+3idZYwEes1H@yq4WT%b)|37aF^n7Ae!F2C0{s%6flRl2;sqHO;tQEnh zueAazvhElVT9NZuR`!bAOIT*venMVBhqd_y;q{@81)U%2(y5@!ZLD(?F&1aY@vWY5 zFUGeV7e9yp2z~`-Tr7EBjf)%gdx7uWspgw`Tyj~(!qvl|_}? z^H}-YSv6xjto4BhvaGtS66f0QpCqf(4Dma5%T?>Ny@N$aaD*HkfZ3K?U;)|yX z>{sNr0b$m>^7A3`OIwhngMrRs)IyeN#l7Y^G6)R<8ScFQE z_#}(XSR4z)M_OkCHcfxH2mTP)1WbR}3YW#i`zBv8^^z}m8@_14>IJA2luw-qFb*X@FEZavb0t&M@I(nRq|PbMf~L+DD@DVvss+azpc{t zD?Rqlgr5&C2Btn&!euef4ZpAF;hWV*imClA3*x68pN9|uXM#Fa%J8U+F0-%f6S9Q6 zsd_bF*Br0!;Gvg-A{Q9lo^V-=?rMEsyqWIm1t%(5?!l<7`7Y-kjMV4N(%Z6!kTn$$ z?)J5p%OybL?R8d@Ba!aPk4kjR@jM-VA-EJ6KW>G~a)!=73iW-=W`4-})56`$*UK9) zJqWqC+AmmQd$xSTX)ez`MOasv8wjgcdEIXXJDKJXjoOb!bc`SN%f$Vl2QYq=!e!ZZ zuNq%&)cZ^{^Mm$~Zd6-yWPrO?euRl~xAL+_(TFpJtk*8$E@>`Hs>0GCnFEXuF14Lk z_Br-N57jQ!=ox>mh2IAr0>+;=;j+}|_n`0fX7h2+>3>yAPn7Szz^6X-0d@!qSoMM5 z2c55uuh9fs?TCq3h{BtI)oJxm?FehpclwA+zoHDp~G*uhA< z)xIrX+|NSZ-dPcr@AF)Xv(URI={Jj;S@9cocE#w#V_3uSjZtw0mz|-|Y`a6poT>S8 z_go$_W$kZhbcaxP`KCtaQ8WGBcfG}~W3nT#7L_HyuLf8w^^#@JvBm`Z$n?S~wf$5* z!>_u>V*q>{m;_8cXToJM`KQUxO#e7|$%;kpi`H0M@LOkUsM+!k>Q?(LOH}8Mw`-hRm9u%fq;#luFXcz%HFx|N z51$GS1jdhLU)0J*uLxxztt`m59bcB_mTth@L(@F zA0QgF?gs3d^Wq`+W8ev3bf1OGV#a?n-)3}6hOClP>4S&M6J+LMXCM6dY?ha7wO5J{ zatE?@4!JSGQb(0IWPm>Y^{(y^cq!Ny7~KhQuWs^nr%6|;Yu)n6&gJJg@fo@!ly0%s zO=#V9*fsUN6@C}E4;bA?;OXfyRiCW;WlP=2KviGySNHh#g3kamfziDXE=%h8LASH% zZqE2Tn&EjC=nwknZ^`Ap8}fUI{=mi{59?PIs8`;eBG^27q~2@-piuR$kxT2{a={Mi0sN%;w{aP#$(e@J_`)|Yl0saNd@%t4nOXUMVZUmKs_*nS z-1^4h3&Dv%mbB_Sd70WYrzhGy#ntV3*Pkpk+Wtn5{b%9Zz{{D~cLLq!A{!8?)An=z z=K9|U-VY1}vZUp|ya4c5Rs4Ko``*sKwdoQeIal`I3QSmjJ-J55yU zG*P3rzs+O+L-;3PXD0U5MS~i2!Fm^QdwUiChli@;8-3HgE*$}{0w)90-(G;rQuSBW z-=e#k#{o_Knn&85h*>3@vO4|hvcI$+$hPXT|CQx@JsWbqCOyE3zSUkI7WcNFBj26g zfooM3yBV`xM#z5EVyB^=ff8~E8QFB;#T0hW_bvWP*Q3-Q_Oj#5F^tuud zL)oK76=i4dTO?0fvh4?h_5(IsTYkZw&^FgYf=YXc+;&Nb$VgT1lDFJ`u|NE1FdvwD zuY${Bu7fSF$9kM()sCt%HD+U|`A=GGjXc2lob;palT-cb@;Sx;PrJK}kK@6E?IqR=cCgmAKd}k%#s}70 zS+7bq(O%SPMwh|%`F6*_ou}Eum?nu#)b*!+Rl5E=;P!U*x&@~GW8t!tf2iu6NYx)z z{im!oQEGkmPW!cNt3La@pz}4)`5fzfX20h2$j5R-eg1K>LAr%{$R_!Oqr-O0vSXIm zhtVRuer&B33>9SsbH){n%gL6HpjOHh{vo-G<72$Xo?XdKW5&RCcKO23_!L#I4ft)Y zV-LZf0WSbkulL}xG+oE^eb*M_dU;cBK)y0vrYbAtM=usrZ?(VYentLBE@3iT$<8`F zAh#wIOE^x)$)J=HpQ`*RdB^o<68uPT3^4wzfy=T-e{}oO^`|?XzK(^coB@NMbgnkf z*y7p_%AtPTOX@@`**P-*J5ExxT&&{}g-yj9)*(WijVv z%6M%mn}n&?3>P?|OR*E0TyBYn+2gTa7F*fyfU$Gw8)45h7kMFK)07|6-*x?{fLDQ& zf$`&fcv^lObkdv!tClQSv}7RzL_ztHL`upPUfuLehklMLy^JeEnGjM};0EnSJvye} z`~%+cJ#t)N{D{G2F~_Oq(G=ssv}F}?BfUQLOxnF>TlMzQ&gWw1^LWp1`oG5Qk*)T( ztjX$dAbFX5*~V1$naBIl`RO3%C-phCcl&kxd zBYZP>0vP{ah0F4=&W9K2=k8ndd*?bYE6^DD+1eGb8Uw|#*O2ZBR@@narbmWJn5`?c=Jl(h$~SX4p1%$P3|nSk5%r7$id2=jp!MFo`b&y-UG&;f5E-})V!YJxH|3P z4s(s6y92vIR%57m7Z<~=_ICksQ^!ijox9{C^-hmpE#KDijdSUV9IE^&`+HDSBPfs4 zG4S7jmB9E@4VPtu-q$%De-0prkWJJOVxN4uA4jp=j$^C+X+YeseY(!$)2Vi&oQ6q+g%HzXLx4<5%tn$}f{QcS)M>YKl(|au%*6tjE;&e)Qf-T^9Y@;( z84p&O)|o`7ztngVE?0icMaP_nE8wStYGC}Rfy-jfL-U+Mi++4?h2B`_OgU`Jo2gsn zmX@z}9O(=NV~iK$xlSJ3bUKN8?MDMTW_hEA3958-#gUhnV@lnq^HXj>5=$LA3 zj32JrA&z~ce>(gEa0xK_H^9@ql#G zXfbru=xGZMBGP6$7Jx}C|#nl{_ zvwDW+cvdY(vQ>M0Zi)ND;|WlCArbR!RqBn0JkNYQXS9eNsr<0IvnN zYae7Dn!KLTw8w%)i|7+-wxFIJC1hWdrB2&z^w`b$m}3q~fT?E;E=#KUO&umRo8mmo zsbz`hlj%+wUOvuNap94~!`wFGQN%v-o7ZccB5(fv#j=-k02+@{^<9T<99`KD?t&-4 zv%vWEZ@4U*^}Y*H{d~2lcgYYZEndu8Kh+tU@)@=;IN|~M#)`j_vys78`?H|< zI(#@GX4o3YYiCC>e)el$NfaN>XUkC*)7o+;YaVyO*)J?s;QiKK8aN{>TkW(EKSudo z_KABw9|vCuP6V>FK3|aJuQx9YMxuQz+HYU6q0_#ODN(ES>abnKuVg#D4gUu02Bw{Q zeX6t@_4PkdpBx7y=_chpeX4^EfnNhwb+FX=?C5-E|LTNJ%(L9o>1bYJ5z3dVyvCD| z-r;08fuf+D6YdmNy?H$wQd{y*oVHW`i+QTOs_@UmckAIdf!l!b|4q0oHTpOY)8FoK zR`)B_K{i(ewj0?R++kY{Y#y`22}f_u54!Ql&`%h}I@%q%1l1##vi?&jrbWI<;-i#;Q37=3uh;aTkhq0Zs%bj%gOYuVG= zvQMy2SN$@&Q2DtXKdSLV_LE=X-To02y@2s^GhCM2zf}EWHFt#M&#knx3K~t2)|hvF z-mW~WG4I+=&R6j+XOiIOBJpKGW#>}+%y2=6(qNIC4+z`s+rPt`ne0;Dt}`;cFRAe` z-c-bXYHY99*PbTdSk!q^aNpoTfpE^jENy%wK+npt?b1HOCvt1Y?#G+ttnoZ=HRDqSm=f%ccrAhzq7OH;B%SEsDI0)cS%P|z8zF0g}K z?wE_Aue@h56g!jEj(ei&)w@^q2yoyF!dP$cgh{AKFQZ%c|Oi`?y^){%bdA| zi;2v-j$(#mvXB^wg;WBdqU3F1^iMrUQGvaakq&qK{+sIqh;@x!yXcwm=&8nN3asL+&b+5g*-v0Af*pCD{~i80_!5|Q6#rCO&m^tuZPAVg$@QGeD^@tK zR_-3ZSniH;yc1$y!cFaN1Gxh*G^>JvQt#Y2gW>=5rs|6LS<0Vs^o&0%;irMKfbr*Y zxGeShJ%GpQ`w}huQJcOlIAK|Zb9lSQm*LPN$Dyw+ab9=nP;dK4Ye>LJQRBfe&fWER zwen*-I>wLP@W8*=4-*(a3gNPtc1d~va4K&ptXQ>riR(xuj!bqOdC3x2;|TXfSXH7O znHO9nTP1q7KK|&Kett514LCz#qI072`BKRF`bEu$o}1h63NsR_}K3&j21$FaPNy~&x+kUQ?$yzDGY@Es+*iUD4;%-GJpTm5>L%0K3vVLdv? zNuyH!iTUnfhpefcLY*1PxT~Kxuy9{{yqs2T$6~A!$B>*{y*0Iw!!g#v$e6+otT~?m zN;yCW*k{>KS@v88sG;^EE6T3GQ8|BINmy>rEGX^vfMuVm|8Qwg{}Jo4j<$>T=AXwe zQO7s-rQ7bu!A}Ke0MqU@a9P%+xKF=m$tsrJEnDk$cMda?qr;t9(F*7DWaraXGZ4Jn zv7vAvn*(*sJ&Hxq-$mrzM;5e%^I4^Lyl{LuTE3}t%w&616=Q{j|;D_|{KKKERygwWm zKf8RT{1p0ndfZRVuLsTiJd(+_Rm;}$OojHiUn2K_Cv&Yt?s3lNQ0Mby+xgmUIbSvE zr%LCCSJV%6>Z`l+yI#)cMe1*>AHG+A{)YP98O~q0P5tg;^>v>5qi5AmtDL`4|&g&LG2XilHKlKiB52rA13n{dE zXN|M}Vp+`FyQFXePm&hiXXQ;%e{Y=g4-1JI^X)I}qq2|dM0o7%0~O{(lIQ4n0*F#V zh(c?6);Sjc!)6dm6b1+N?h=XW)6#tR;7^-Q%Z|KzAUiaw@Q+q#6)SD7kXQGU?dxsM zrup`i(CnP~*+d*ebLO+RCmmtF^@bIkA9&Kv8`^n(r~Wpd`G*FEcA4MtRl9T4KHd7< z3Z5Rg$;w)8CkSVIb&zQnC2^DL9~(LTW_)`b{uFo?nEvq!ToyB*mORhzjHYH?gjo)_ zp;z*9KoPlF=@owMUbjcUCxQKe(K{b5OEjVS;WN5ln)7Bgr^-oF);6soU{&f5xy}mI zu5x)P*YiBFvDX~?M~nT_-;fO@x7rxM6S{H({ZMvJJ~xMkvcu3QZh(~xE6bYMu1D_N z5bvZ5$K+eW*@%G#;w?=d1?^uf*5UCe+ez{*k&aiKSGVi)A3vw_J9%C;!i&D)xi4Vq zk;S~dED;@_7G*Wh17x`G#C81|J63nw)zNC~`0t?ewIkqst+$=8p3dhpS-TjEw%R)f zi5H7!aHEfCsac4BcuG{q-PCY}dcjko@ik zbx;Z87AyEB3!LT4Sfld3=Q)bqi;T4adXu^IPB#fk%NkUSq#g$LmJD4*HN^n~#HX7K%>CDBZ6n z@BUtw=UFv*=Y}qKa$=zX_X0pT?KHKEQIC;q60m_pqD`S@GMm0CUqppLwbISzZCsPBcjebK>uEc9Ap4uiHR8Vu{K?AVoB!_#*r(f5<&~Jn zP5v!&Gr7mynf3{ThW9ITS}gj4YOl?-hiR{E@HfEQx{YLfW#-AAxxINitzM}w4Z+C4 zywRkWGvBgIY#G5zjT%%br1MA~mqQk; zRa1lg8auon+SS2o?C^Af^K}(J$@6AMvG{hx3hutdvdZi?*pryIuw`}6>P7(7IcET` z2(h!e@q`^6Z6twEztHepc8ev)?aQapQ!HG~D(0cGt6kZhk?qC;OxpjA6gYUZLx)qSEYnMcJF1?nRwuUuxS|2gsBEX3PC` zf3@VvdWX#$i5Y%aGV!*|r6*di+g3qVAGXBrX5DDDA8U8(F`;O*%sN>lG{6i?LcF7n zTh$M4Tznql}Aj@KZ# zEZg++nC+iv-akr)oUml|973~|s|F93j~1+0gdjVfT*JQMRxQ&qa>JLc_U8eysdNNu zImd8pxUnyH&2U;hRMG@0myllaV!_b?iy_tKbb_+UrxeEXnUPHujyTS%&MyQ@GMSwv>GZ3P6OaB}fItz19%k zE}zefSh}!dwv$yJXfH8$l6I*2MSpbTf~oM?;Amj{xCSmux!xx`p^u;OgNM^y z?_qFR8ufGh%aYdLpS+@(=ZzNEeHr^7vWuDig#9xQ^z*Dtey}5s7cyVjmD6DDVm+ z_EsNHD!MlKiY0sNO;&KCbve6VD~IBrD1UN(cKdA+d>AMN#-GV>Sxo;m_eaceUGA)} zb{Dr?sBRk<%Ozb2dz&R*WXLX(PX=U_2Kq=x_Olr!RHI-w`l<4x1|2hBa0mPm@HjAj zya<;isOL}S)-@j&obzZoukx7U^spMHk1m(1R!c8;I@pCa?;GmN6zl06pWHyHY=j}S z&n$Za*Jyr-eWv^<{IB~S#xd~e;80-vsDR5-rQb^$c_*bG%~D%t>i@zNz16^e-*Tot zLC7RF2SyNDtjy|`#p8>eq8;wBLXTVWzSu<4{7LrWz*SaOpAea3pQiY>ey8#?fgch4 zkp22^@b|zDVEp_X?i4-GmOSpLabe2Jm2y+yg6M=1Ik+^J$Hx1~oJ=m#9%c7t$#(Q} zr5F9h&8Mfq4+nFA(OV3cLh09G-{kYp!v6~10!IHc_@4DwvB9mM{*}R0`r&^n{gPkZ_MQZv z0uBJO$njmY+Rp4kIC;?`dFk#(g}aIS*}AWj{8u8X?bl$-UE9H&%+}s7FH}_+76+9wZZzp%|WX+_;U8mthh{d)wm~Ub$fR%{sxJk##74W8j$3C}JcV(J-^X*7rT5yW&WU|D*R{n*pP}BIc7kmsD4~&0n;Icfd_qlHP zqWO8xEYY&2Tdyp3dMevl?9`vdPBpW;-hwxXzOhj`C-=ntRXG143 z>uM^T1N5T~S_tA$C|n(!`VOr7V}S&#{{rt94$X@txm+&5arQO1 z$vR7Rq`%wZygd2V9=3U)Lb>)p-Ya*bC1>Nt%0-^X%4ZGrb+7&hef-fi=kIy&TfrZJ zY2RINS$037{Azr!dHX8A^x{0)_Y1X{?9zbK%*Q*Q4>`~2ChSc);?}%5bY@~Wyc|I6 zV0V}%pG{-%k8yF%2{5COWwWOzZ?l%$bL4a+{>ftq8p6dXFWxTH*B*b5C1bx6co{km zE-|+=j#MsJgnw4`i3LJU`>`GgUksK4Q=c2*vNS%e>d{5_8`GaveVXp$*0Xhtv$pUK z79Gkq{v{;-l{br6bTvNbvs?6V^0OhqL4_rF*uA%W?$8S56!6^GsP@h&DSP+v{QddN z-p=7|=~h)hUh2cYDt{aCCxSon{0jv`q7d{3#@|tJS@vqRUzqm@(JSW4Ua^<_(7l3J zhn|zqOrFy#cVh zMbj$7y5PTPNvkgSf%-aMeev|OGX$Q`177)a2-D<5VUMglyITha3R*On&)L=kbYPL| zXckC1(}g{_i{72d@q_L1hpfEfuEhho%aQK{xh(Jrn+|rq9eUErk$q!C6foZ__Jqzyj zJH`01U4run!3q1)_48n7}=VL-dFd&QX5UqGRIr z$KX$c=YjF#HMlIhTa7ooP88HwzmX5`CODwt@eZtJmT}+VdMoW(t;^hQ(>N7{9|8^s zM)!2MEaM+k{cv~EeY{iT?g3s|Qs?IbPU?KT^I741&Xrko!oEC9Jk8?aZuSwu!Mxii z&PX&cXS}>8l*<^!yMIpT%Zo$xGwfd8)nY@hgH~@;v%f z`kNCHS-|+c4_uZ#^tY1^TOtEOdR*M;Ui&$pgPqU6(C?(v_XNb9tokeD6zaf<)RAj$ zz8pledW7tp+^pgr!Q!R8I(5!32o;z1rHM!IrU_2}+0GG;=PQ5L;7 zANL$j$;IN!mMp^4t~k_HZ0G%4GJD`YySCrpvHvanC-5sU?UCJ1wMXlDvwor~yWAGh7za{)hOU@A_%;Mr-9RnPe_> zKHpPw8-tx6)aU43&XIVJy?;9H%{auv)*J)*;Po->g2k&l@y%-od6Fg=>7kFpSf&vP z*v9dIn>^=YVRamGazjmVX9PY0OaaF4Rd87v^m?S6q;);&I(F!SDl-K4X$ZU$+7YlC z0vB7(*YVD0*Bz)P>>sj4ZFm-=QGVysnH}fh5xP3J%NTi!xcEl68C1ebwcsUI_jq=g zwJf+=X)j=eW=3y*@HE!FsDU=tMftxC|4dx51HKD<3yl90^OXN<^!0aRQrz6+KkJR1 zhp}pd7q)Z4<{}j}*SBN2+#KmKFD)1p+?Odyw*8>Dk6`Yb7mP9UmD^tVeLpidojdg% z+;e#F9xK0VhvA*_>Vkf6Cgs{*=Ry0>=X5&xvrS=zJ)7{#muRcTqFj zh{6WX9 z2;~S@Z(U-&CLj2m;e5_@KJQk)n);e^dOgXkRKeasb$U&v1B7`WMZe$(c0iHC9jg)g z2KQMpqSKIEyJ#q(`#z=e5Rc`#58hIGnrglJBGqnH_-Fd*I{3BV24MVu5H3rZUYDP| zE?)URt77#OlR{UMXvy$vxD%8A$^$!HU%4H zLK6XIn3g}q%AXqa%=P{*_`~2aVElOjE=yb= z*W~-0P3_Zk=dmERkXgWJlZe5h;PU5F-jOX3i(B1CPogOBW8i;1_A*MaNyHxG|9A-U>T%c{1=IG=CmS;^Z1VrP%>#NX{0=E)t| zO6YY0zURe5T`#GJ zy53b^pR2DkRL-?2OWezQ$nxnYM+9?%Bb*l@=QC9@$d=1@4&^B636gAka5SoBML5f3 zkh7TBY<}Q;i}&Pkx;@lXllmd59#!}mpmFMG<&%uNeqYS1GuSR_*e`FrQ*?x7+lU>hmB%Y5!~c`g8nVX7X{&Tc&> z!}kZ%fh;m^GtVm|&o?euwQ9lI$@004esuqS;$k*LmCy7yYP&VqFvs~8_=8{*FzxdU zTo%*+lAm94`k!;do<&6WsY&Pq)g<)qZLvEt#cm%i3?AQUx*P}>P-h)LhllI_U*PH& z!$*O!z~~R<0CJ%4vh#VWZ2CrgB$u$@4y!ug!60<{ZR@ZEPBVa_0wBQ}#) zcGjZ6kao_^mQ|egN83L$NHbhVqRO9I^h|r)2Y&)Q4U9i;!euf2zA9;dgTpFLmG0DW z3O*p8#hCnnb4mNy7LWIx#H`bDUv65wwr8%E?OZvO-Vi&>dxIoT!dV4ef5`fo_362sQz8T>cK1<>ANG z@kr=>7R-E!+`muHmNZ!R+dC|)!8&b+)8}6dh>!YDBj_%0qWEqByURL@aj$!J`&>5c z@|(MQw8J}Wc|GIb)Ch7L*24-@#SoO& zlQ-d?f-ivahqtde{&dmvseb-=W_c6VCgst-%A@rGaVs9lHj^F=HXij=9?5n(-hSBI zPE(a%bI~<^ErXu|P6x)Xi{P@nug9xx4>do(ur(l>T)13vhxNJwKmDcCD|Gt(#!d|ZG9XU+tZ^nKM0a@=C;eP|~0HgmAd=L5_ z?Z4|vlRe*yYMoZy-|gX%nMya>+tuA4ei)bqjP7ypJ?MId+Xm|wYlm}g)v_lZ%71l~ zD;ZSvxfLr{x*M?@!?3LHR`@pX3NX5F!S|rcarTa=)p|&~)fNeq-*A*G*lX2Mt~y-l zMv7hCG4RRY0AO@y!uOynk8=v)7h4F|9-(wMU^j+gS>HPNC&M_);s ziwN`oe`D#K97lh##Rmgs*|#|QYvr_zdNy6!t2$EGANw(WcIpp*96Sk({x-NQW*qgY zzjOIWQU9H(>YtdS>mPCTqwsNH5-|GH;a>fe^*0x>=Jo$NRsCagb^Wm)LqOL59{8U@ z0vP@G;j%2#@l~1LXT#I}>}JFIMVb91tfy2|!>1fvKDEWqG(awK4bvyA4rPHEYsc*l zEApL9^?nl^!7{RIWmr>pwDPBro7B~ zQ{Zyjs$pBG%blA)>_l+=z**eJ-=7eEB*FU4GQXL|o$3DaX6_1m28+2DvywDWWuCq! zZa7Z)l|VO!u571z_=n&#VEpS2%J9zP=${;XxCH|voX*+7gCF}fzkZ{E{j=r^-0pW z8yv4rP7KZ`BV;Q`5hizmz#7?P+EB)wRuKt1Wqrh>%=*Qu* z82$0B=#P^6HP*%U#bAaFx0#T@74=XAaG z=NUpf7{5Dh_8|HTp~0QPpb>3b(Ay~qGpZw!1gH~<*E8Sr%VoOij#?=pH%TA~t& z%~G#=q0+0to~hp-;SYjM!00^=Pgie@Q@;m{-m{ii0R(HcvPJnKr6&fudfnlD!9Za2 zhQQO+BX6fY?=^Z)TVgd3f0lZY3Z++tJyX96;lBqr0;Bg3To&^l*gCy##*FLU<2P3J zpE~PNHM8Yx|FXsYf#oL_yVkR0qm*%7{?{qrnP0ov;&l?1E{mAm=afZW#6SBwWI=iz-y}I8h|Dq-C@tXlZ92^OZfAiq7 znDftko8#v`2h!wYLHSY6{=lomIi+P>02%Wp+e7qt8(pe&H)^|beBT6r4!jAB?kD=s z&A6VdYu;a56=A*UEppN6I2N7eEZc0)d(#}DYjJSd)%o+T$}hY+f8&i6~X^LW~LF?9F*VOkx_-3#L z7~KTit83zj)tq<3hdb{FHeHP?dD8~qa-=9foelGI{y=>J&p(gwJT5G%SEzdD40ZJf z!H0mofh_X)n)g+jex`JJ?`R6u<3!GJB6yr=(Dtja)inOWuLc`{so#xoSupSuQE8uDAdY3K~q^@*A>u$%c(fvkh>>Uz8V03ff>FS!*nXSl* z_-|Ex%du4M(M)p~`)mAr=vxS2UL?tI|L_}68 z-EG)4x*x;;33dUa`wiTyYx~{igJbJRyPhj8Fdk6e8 z@C7jXU&3WE?cGYforZTFsNqyEC~x*c=CNk9h@7Hy%SO1mN5U(>5@2+f!(}n`HgRZ+ zdN)&LMLQ4H$tCTK$<)1`mIq=Tn=+}YH){Pl?3@1m8vJ$erq-0>RO518C>RN3k@n4VrDhy-$0v{dras(X$Pz2S}T(zm#_U+=O1PxzPMt4!_drwhIItF`@Tsq6nC@R{HUAWPcq z?{34c8lQh#tL@i#>^}&97(AM(eP`hE5kV)Rb#{An3ib(!ZlDK{CGC3XYmv8|8npen z*fPiYWcV6zdZzZ(b==cSac+(3r<*9s^T> zEV7-p>pZvB^Py>si;A462uAsL<=TEVwyOA9#+A3h?*w;w?APl3i_);)w7KoRB4=L_ zR6FI=Xq}zdG~;E~sE}v}+5=hAKCj(9wVO`tgtk8&TgLuE_+qdmQ~UZc!Y1SR)~M}o z#Fpt#&%s{+FMI5#HE!sT*xRAPYgK>B+1Ir{7(NV)0H%G?vfpeEYcAQ{M6jDv zrwW^k{%QiBu_9-z2$F6y zK56^W(Y#Sf+n)uW1C9o=$bJ;o&tGblj3oeWZ@e!}*s@TGd*o5}Oh1Nu9Id z=Yb17I;qx8l??G*SDg)by+@t=T-)D){>{gN{G{Fnlt z2Brg9WILsGeyALx`AB=ZIu7eR_WuaK8{C(veb2IDBNEZ}cY5px$MQ@Z$OReskA3G5 z7~}lon6^J1TV{N!fLDU0ZLqJl6?O&U+WtmtMbMM|=V|z}V4KH&TKz{EZ+3iZwEdiM zuKmIAVPFK1MIPUsdLNNi&x2-r=`|n!>aT$8S4Dl=+Su&{sMS8 zEuDqT1Emc6MO53*8SjoCd%*{RAwU*+{8Nt~u6>`dU&OWjN^F^SItP9}Sm&{yx}7}s zmz-9CH}1)SU)9?FHjn*};Gcq>8QS*=`$es`Uoye3GG-#bhk52BykjMvNkV!p!!hRusr}}BRw1+V{PA!A41gkQ%?-%w* zwEa4d{ny~HgEup@?-%yRwEgfTH{Krx9|86OrhQV!`|fe}3HL>nwqJ#uKgq6M}oP)v{O3veZqYa zK2!Ch4cIdM=n?p4@Mn+xbjFLRO|Q0bhm5GUzuRNKaB@iW0>!}ipN{=j!hQCsRrQEt z(;SD>;J*Xa9-VaB$tTr8&|^P!yzllWpKxC!wEf5wH{PEDp9ZD_ z(@v@5{UrPDZr|Q;Ux>3*JFWBR+y%cEJkT~Bzi?laYn?`HR^z-JpSn)v*nnQZ)F*Yk z-=aQ#;l8NVI&-lZ(K=P|lfWq+oz(G~tK$>yi+XK;Gqy~>`YZfz;BAlnbo!M~xX%Su z9go8O-Se*$J_?Khrk&C`Km5Y|h_=7RWB*$Cb>PMf?fZoLBBt$c_t^gi{yq3l=Ju1r zeG%98%ci;QGaG&sI0j_WKKP#;?u%+|e*?B67?b_A@CHN{somRqq z5k6a;7tsUV<6aJ*1?B+LZt0vCt%UpRpRIH@cyuzB$CkN{p8-D$oa3>dy1km&ZxQ*|YWoR~{rBNJz(*O| zZyEU~wEf6IuKyF@F)$UF_DRqGmXUvhwqNbBe=GbBurXu%twjFksQ$FmqZ6FL{0GPd znbo6ZiEB(NQ? zy!Oce&Q<-X>=4)fZ1_>&7+~5dJ^L*)fT*^=0b8a&JqmvuJmImQ-g!5*MFvo=?eF&3 z?|CSDA%O@m{-i4G$Kee4S>POxPI~RsG6Sg9_7m8O;Ixbr-i7}iGDukA+;bN$~BJ`qd?rk&FB-zU;MPxYf}Y?|YFD4{AL2Q^%Xl`l$Oh3N9SAk z58%g)by7#1jasMdaJRkY!Q)^dFzuCIeNso9;q%q`QHxE}ubzfK3$}T5((AveBhIMS z2_NB}=X=9Pfib|MLUMj{99)((*3-zPo^ryOe^^j{2unP3P87itg_xqZOmghhYTb3% zHRI!L@Vmi%!06V&Wijs&G5dbBSWn|sttwxM>QWJ0%FYt3vt?yz_yX0Qjo35o*}e(LekwLi=3qT#ty6W8|Zux0#z5&jCO z_t;O}A3XM3MAM}G+J1PpYkvrQZx98Uv`@=uT8LV0zsh6(68L4{iVW?yjHbCiq3zdu z>^H){0pDk6zm;fOG-#c&Bi(j70)8Zz3o>b^meDl-`a;!DH+bwn41W|no}vAg(KPq7 zwf)^5``zb+L{HEgWa7VHG#%6S=VB|4F&USvhMx*f^Vm-vN4x#BWfaYGa@zi8Y*lId z@528M8a(z>$I;35{i0~@t81OeQSSLX0UiTWfh?`x7jt!dqG-{e?N@v3Ul0ESsLjxR z%P5-hZk_5!4cIc{#eb#Uxx_%g_@B;r(K3o=J&U#ukiP z8CRc%KMS^bbkZ4DTSn20d)j`^(e6BYfA~N!7?^fSJ&*1lXWw~rZNCy*X5Gxi@b#d^ zV?XsgdXoKA^XM0;<6ZC3`3n9m_@Qk&{`2Tsr|cMa9(^7>4i*B_Ua9BNThzyY9$o9y zVl#qKIgV_G{~2uc=%kKIU7eQM4f~*J`{G!)U-f_&fj+?0Bb|Qblidh$u{s`cY?b0hH+fmPk8Kq0RIqtlA(RS>?Wq|M~-v--w!?!Oa`WX((xbrNm&i+ zb+!F!kNq3rH-lRk z3{3l^&I3ICGi6poKh-)LJvuMKUjg+Q>ZHzUSZAqq!t>qwjD(K{V?ieMNuAYjUAjb_ z7i+L-&WjE38^BE-opkzD>a2$Alh)aZO>^DIKb}}06atf96v1W5Ag?)K$(o8qrTdgQ z`Hlb60>qnc^sY3lPX{O_Q_qqFD!eE`DRIByk*fz)M9QgTQT^sfM@}-2<+2+yt7kn4^ zx{W%1c~gVdi7s^Oa}@j-Fb}k){rvJLahdAh8?YJ2s2n%8z@G$9dvx}kKe_$eFOQ09 z9kIyGqlUou22o(@Q=9Vn19SaK*747$sfvvIx7w)FTD}$L&582Z z7cO>>(>VA95Cf)PWYT_qc~?y9RAX}uMrA+04SpxM%cHaByvyx>e)(6m*4c?olYezS zF(kTzLSX8%=lm;4Cq*8X(0X&RZS>BDp9e1d-}HR*v2cw#UfZx;t=sWC_-^o%M{m#h zSd04k=4ElMS61o9iF4t{g89I-=bqzgSI;j$tI;~O*fitCQ}AcN^B$c{`k`N*me4vm zOWgB#Fnkyo0Ze@|IgkDFwFa$I<o;wyk6->4 z(K<0~n(=QD{6z4Zw(GRW<6>H8BQ_%(3^`7`0Dl?0=F!Qdzxm~JRaz&!)YU12?*}FV z(+~EX&w2WFD|uaw)~ojD-3`AF)U{EswfwG5>ot1xdMzXN1AReT>epJHSFiQr*f#xR z9sCk-nMW^^^QyIcuTkr5$F>+nAbz;~w^<4;G z43>Cw(jA}C@k{qagVx!IO;ev2;4g#MJUZ$2BdOz)?y&)eYPax8SEm#{3XB15Xg9xf zPeioN8jsHP@IQdsw(0n#dm^TF8az7LRjl~}`JfH;@lE&QT4y>o&GA_RUj|mTO~)_I z6V+O$&ZF}N{4MZK+jRWWJW;E43V-X?XCizu*dMf^-F(x$gx0CXW*nnV{0qMm+~v_p zH_xMA`=xoJQS0o)W|h|Iw2HYO&>hGk$Aj85^SmY<|1?iTuhHWmw#~S32K+2=jz=$p zaltRm6LGDR@aTL9{{;M_Z90Bwo~Y3}B`3N4;Sl&ta0D>zm%;esm*$B&tyAOCc@+LQ zc%p4OzG+^)*4d3sb9{QN=Dr8$15AA~I6i*qoe)^zYXvk zz)c?e8T3EDv`$oOod#^0>ykK?7zktmQ;!VJTfekU)M}mS*fcuJ;Z@+Iw(0n$bqTFg z=h1l`{wCPoW}Ozd&mrGIW|pw*22#KXSGeIwRBEYX}yF; z?+f_9L1WwWT1)3djn<2v=Jt!D;KzV@z_eoq=aX+bSEqGqv1!JKXW%b^*MP~R-hj)J zX&yJy*>pF>CSTZ#U8nkGIWM=IjNoz|(tW|h`?2mU_T;n7Jmk8^cWIXI0G|9tbfnAX{dO>;hNgTDk`_2^`9-umWoajg?R-__X{ zUIz99roA%I@y+9^wayxk&h_v=fLhQtotAlAt=4J4rfIjp1?0Y<9cY_Q%RDZjb*5u8 zf>GJ8E8$DQ3Xe_({meIyYt%Y*9-X)0?}ER3bkfY@oc`>W$AxcJ{krf%w?32M`-204 zX}1h?TFv94T5p|4?;-djU~}8_TFv9iwcc)Qn|{$}T}bo;1AwVt2L0SOkE_x;mDn`n z!zJ)5!L`8TQP;y|$uy6X?+|I_cAOBk>NxJizR_=Y5qsQ%-oWVhh0Bsz9;e@6vd7hz ztarUd`B90EY41znmxC*{b_RLes1#|Oh-#gBY?}Ih4gU`8_UNQJ9;4%%#)-JrDZALM z&s_MiU_Ou~v-wH}=W{4e0SHtG1LaiUi1khfULN8{zkW z`#n18A0OW|PE>21Mr^LZdD-te)o>pebO)wBY36aXn|~UY&^mLmY4W&g__^Q$k4~C- zmC;F+#tCt|>JQsIdb{9XgYW(qy`(g*T(y$SCc<~B^QRWu z=KOgM{sMT}qnCca^G(x4RO^JVb;p5G@cqCfVDhA?a9J|V(?;(hQA=q38tj|v-$U@H z!E?aqzX+ElvpmgFPwReL{U23(hkx(3_rCBlupf{mgS=)m9oKK05Yec0)?m}r_XhY) z;1-Wgn&Yn2@lDhs8&!Q8uxa{_wSiYEfo#x*`uHYlF|9Kln?`2|d>L5THXYwYEv|Ly zJUXw#-vry+rsJEaRcoEX>)iTGf=>a{KpWc4H&LtAI@KPXTi~~YKekQBH&IJyot++? zyz7boK_}3L`uHYl4O*uho2DO}0$&TxXq%3IqIQ?+*PF2!$9Z}EdJp~q_|T)1W}YU` zAKyeRs&yhaxOv(^@I$~%VA?IsJk8Zfk*HN^y&7zrap7V3qu_CmUIycWZ=zPKb#{An zdfdqRKhOu5dS#&Fo2b=moj5j4e>e|*A-LG1ljikHwx4gJ)~I#1d31KczXsp6O~*G; z3*W8!UGxv`@i`nm8yp4N&~CnoT1@L~z^2L59)~{x5+0p2^EBCRzKL43))6w3 zFfam``lOksHR+^E)Dl{+%A>adegnAaf6_}z)Ev*5cfChn|FB)n@8meq{$}2N2|5E= z310yo zC2TlNNobwITKBvygYO3>0$DPQgPJF9js@QPs&%S8I(NV~f_vJgVosHNu_1Ol03B2mjNxwe6X`B!bsCEnA z>FPw`Bf)4OO9taU_3=&PL`3VX@#tI!zY*NrCLP~2PQO4BH!`}qk+oa>0#)(?3Q@GKs&jff3Oa+;@n|~UY z&^p!FjAK+@FK>n40XBMc(#+%NZ@y`qXw*78v00^c!gqy40q6!~k^MT&Jg!M6MH(lf zb$T4cwiy>rho1?~_UNTQF8HQ#BCd539-RjG$KbOz>G-B`qDJeK-0k*PJDb#`OZ9G}8_*ary|15=;$kB@H}C&YuQAH=b_ z2BWfnpAA0`T{pkI! z{n_xNz%jtIPx|)#)3t=w+2GN6488?C*;XB&`)v(cM?B!xryqO(C;@G%Ps?;oh(D=* zRf)|AM&&qgA^c*n-lLO#ziOVYMYa8H9{XRyzXIQS?5CNh$$smXripT`6RmUWF&BO; zm=8>QrLWU!nkK5WUad#(1^CP0wKnOsnx=^wtrvdK?GK~jW5IY}>X&~1_P^g&r*+nN zbZ&s(1a3)7XUU4y6{{96SXhzzrLH(zuXP%*X~rAtA@2WxY+&k>db~-}@lQ{Lcv$uC z>DV;m&WZ5ffaM;Y)a{n6)BLHfh_=7cWB+;hi{O>E*iTAJV%mPrpIrY-;6uT1VA?5d z|NYYu5!X6Z9-V988^8^1(eY15M77r0?$P-H{v-HrTXd4rky>rP>|wXPj)orxjt3dH zmwy@}5?ZGgo2LIh4SyDF^XR1AfBnN~(WrHD9&vRB!H0mofvHd0I!R%4S5o*~qwR0N zmWi7;!~YDndhDl;o0G;9|FBuqYaQ{Z8^;cU4*`1vQ;*bfte;NHusOU*AAgU|W$-J& z)&GM|Qn)PQTBjbH)i^KXj343ul^UDf`lODR{p*t=To!d&FNW=i)|&^9gM}Ww)NxIc zUh{BSG-&&^*fQt;R`^rk8IS$6&&%fFvIsw_j*EEAJui#leZgKpme%LHlKgKTE{mwP zANSZl7k&Y_s4e#W!(~yfb+&nQcEbM&zHFn8Pq-|qv`+MKx4jOB&jv?Nqy(xci68qCxA#rEOi0 z3*i@o^=;8f6)ta9{dk*4rxE@Q_`WSVt%u1XqV>wQxcy)rJPsBD(|+k+&;0IY2ocjd zwH}=(;0f@Tv~-p)sA?rbj%)kk33q(y1uq7DfvHF8@ukVWZ)9Af?Z>fYuKR1@XMnRj z_EWc$YrlC!?6@ZCwEcv~{yXsZ!H&%ACq=}{e!aFI+3NZ~4n6_IfN7sJ{P&HB8@2sv zkNunBw}Lw|v+o-ThaXetMT5uwf8alZUo*3x6alODiE8_?C*Afr7Cs*=02#E8Zv<2_<7($ zkNwp1?n(AjOt?2_oo(1Oal$9?e}FGMI%%B8z8OOJan+AXo^tI^hVKs!1g4$Ru%DC} zIR8|{wEcD1GULSU@IQjPJ@(T$&wMk3xVFF3V?X<8_JIWX!1$krecz0rTHBwFEz|xB z;ETYC9{XvuPf{kJ+NVz2--s=f4?GQj7Hsp_Pn{1m^&{U*pi$e;`HPze42BN_BY