From 89149a1627058dce90fa7bc6f4588a652b747cbc Mon Sep 17 00:00:00 2001 From: Cassandra Coyle Date: Mon, 24 Mar 2025 18:50:29 -0500 Subject: [PATCH 1/3] add event streaming proposal Signed-off-by: Cassandra Coyle --- 20250314-RS-event-streaming.md | 695 ++++++++++++++++++ .../20250314-RS-event-streaming/events.png | Bin 0 -> 108445 bytes 2 files changed, 695 insertions(+) create mode 100644 20250314-RS-event-streaming.md create mode 100644 resources/20250314-RS-event-streaming/events.png diff --git a/20250314-RS-event-streaming.md b/20250314-RS-event-streaming.md new file mode 100644 index 0000000..6264363 --- /dev/null +++ b/20250314-RS-event-streaming.md @@ -0,0 +1,695 @@ +# Event Streaming + +* Author(s): Cassie Coyle (@cicoyle) +* State: Ready for review +* Updated: 03-14-2025 + +## Overview + +This proposal introduces event push-based capabilities into Dapr enabling system-wide event collection and monitoring. +The primary goal is to provide workflow and actor visualizations by sending events directly from Dapr sidecar instances to configured endpoints. +Unlike traditional Dapr patterns, we simply need a URL and can send events to that address with SPIFFE identity verification. +Similar to how OpenTelemetry tracing sends data directly to the collector, this design sends events directly to the configured sink address. + +There is no component required for this feature, and no preview feature flag - it's simply a matter of whether the config is present or not. +If configuration is provided, Dapr will send events to the configured sinks. +Applications and collectors can receive events by implementing the `OnEventAlpha1` endpoint, which can be configured +for both local development and system-wide event collection. + +This design proposes: +- Enables streaming of system-events to configured endpoints (sinks) +- Configurable event filtering capabilities +- Integration with Dapr's existing security model (mTLS) + +What this means at a high level: +- Add Events to Application Configuration (supported for both kubernetes via crds & standalone mode via config files) +- Sinks implement the `OnEventAlpha1` endpoint to receive events +- Events can be sent locally or to remote collectors (with mTLS) + +This feature enables: +- System-wide collection of events where collectors will capture events from configured Dapr instances used for: + - Monitoring + - Audit logs + - Analytics + - Workflow and actor visualizations + +Whereby this use case is for overall system-wide monitoring, performance validation, scale testing of say 10,000 workflows. + +Local event collection where applications may use the event information for: +- Re-running failed workflows +- Tracking workflow completions +- Custom business logic + +Whereby this use case is for local development reacting to failures, purging completed instances, building indexes of instance IDs, and detecting deprecated workflows. + +While Dapr has strong integration with OpenTelemetry and other telemetry solutions, they don't fully address our needs: +- OpenTelemetry focuses on metrics, traces, and logs, but doesn't have a standardized way to handle Dapr-specific events like workflow state changes or actor lifecycle events +- Existing PubSub solutions require additional components and don't provide the direct, secure event streaming we need +- We need a solution that's specifically designed for Dapr's event model and can handle both local development and system-wide monitoring without additional infrastructure + +## Background + +Currently, Dapr lacks a unified way to collect and monitor system events across all APIs (workflows, actors, jobs, etc.). There's no standardized way to: + +* Collect events across multiple Dapr instances +* Filter specific event types +* Monitor system behavior at scale +* Visualize workflow and actor states + +This proposal solves these problems by introducing a simple, scalable event streaming system that allows Dapr users to collect and process Dapr events through +configurable endpoints. This design enables both event handling locally for development and testing while also enabling production monitoring by sending events to +a centralized event collection instance. Events can be sent to local applications or remote collectors via the `OnEventAlpha1` endpoint, with configuration determining +the destination and security requirements. + +## Related Items + +### Related issues + +This [dapr/issue is related ([workflow] introduce workflow lifecycle events firehose)](https://github.com/dapr/dapr/issues/6072), but is captured as a subset of what this general proposal will solve. + +## Expectations and alternatives + +* What is in scope for this proposal? + * Configurable event endpoints with filtering via Configuration + * mTLS support for secure communication with remote collectors + * Event type filtering per API + * Sending events to the `OnEventAlpha1` endpoint for both: + * Local application event handling + * Remote system-wide event collection + * Initial implementation in Dapr v1.16 will focus on: + * Workflow API events + * Actor API events (if time permits) + +* What alternatives have been considered, and why do they not solve the problem? + * We considered two main approaches for event delivery: + + 1. Direct gRPC (Chosen) + - Simpler implementation: Direct point-to-point communication without additional infrastructure + - Lower latency: No intermediate message broker + - No additional dependencies: Uses existing gRPC infrastructure + - Cost-effective: No additional infrastructure costs (message broker, storage, etc.) + - Drawbacks: No built-in guaranteed delivery or dead letter queue + + 2. PubSub Component + - Benefits: Built-in guaranteed delivery, sequencing, and dead letter queue + - Drawbacks: + - Additional infrastructure dependency + - Higher latency due to additional message broker hop + - More configuration and setup + - Potential performance overhead + - Additional costs: Message broker, storage, and operational costs + + While PubSub would provide additional features, the direct gRPC approach was chosen for simplicity, performance, and cost-effectiveness. A future enhancement could add PubSub as an optional component, allowing users to configure a Dapr PubSub component to receive events for guaranteed delivery when needed. + +### Considerations + +#### Delivery Model +Transactional delivery was considered, but given the additional complexity and blocking nature of implementing acknowledgements and retries, best-effort delivery was chosen. If there is a strong need for guaranteed delivery, this can be added later with retry logic and acknowledgements, but would introduce latency and potential blocking in the event processing pipeline. + +#### Event Structure +The event was initially considered as a `google.protobuf.Any` type to provide maximum flexibility for future event types. However, using a `oneof` structure was chosen instead because it: +- Provides better type safety and compile-time validation +- Eliminates the need for consumers to deserialize the `Any` field +- Makes the API contract explicit about available event types + +The `oneof` structure contains event types specific to each API, for example: +```protobuf +message Event { + oneof type { + WorkflowsEvent workflow = 1; // From workflows.dapr.io/v1 + ActorsEvent actor = 2; // From actors.dapr.io/v1 + JobsEvent job = 3; // From jobs.dapr.io/v1 + // add more below + } +} +``` + +Each category (WorkflowsEvent, ActorsEvent, etc.) contains its own `oneof` with specific event types. For example: +```protobuf +message WorkflowsEvent { + oneof event_type { + // different workflow event types (see below) + } +} +``` + +This nested `oneof` structure allows us to: +- Group related events together (e.g., all workflow events) +- Add new event types within each category +- Maintain backward compatibility +- Provide clear documentation of available events + +Please note that the event types within each category will grow as we add more events in Dapr. + +#### Future Considerations +- For the scope of this proposal, events are currently organized by API domain: + - `workflows.dapr.io/v1` (e.g., WorkflowsEvent) + - `actors.dapr.io/v1` (e.g., ActorsEvent) + - `jobs.dapr.io/v1` (e.g., JobsEvent) + - etc +- Future expansion to: + - Filter by specific event types within an API domain, example of how this could be done: + - `workflows.failed.dapr.io/v1` // Only workflow failure events + - `workflows.completed.dapr.io/v1` // Only workflow completion events + - `actors.activated.dapr.io/v1` // Only actor activation events + - `components.initialized` // Only component initialization events + - Component-related events (`components`) for monitoring component health and state + - Can start with (`components`) then further specify by component type (`components.`) + - Control plane service events (would require control plane services to stream events to sidecars) + - Can add something like: `service.scheduler`, `service.placement` + - Health related events (`health`) for: dapr sidecar, control plane service, and component health related events + - Dapr related events (`dapr`) for: runtime config changes or application discovered events, etc +- A PubSub implementation could be added later if there's a strong need for guaranteed delivery, where users can configure a PubSub to be the event sink + - Where a new optional `type` field could be added where a user could put something like the following: + ```yaml + # PubSub sink type + - type: pubsub + component: "cassie's-pubsub" # Reference to PubSub component + topic: "dapr-events" + metadata: # Optional PubSub-specific configuration + partitionKey: "workflows.dapr.io/v1" # Example: partition by event type + filters: + include: ["workflows.dapr.io/v1"] + ``` +- The current design allows for easy addition of new event types while maintaining type safety +- Delivery options could be added to support both `best-effort` and `transactional` delivery by adding a `delivery` field, configurable per sink: + ```yaml + spec: + events: + sinks: + - address: "audit-collector:8080" + delivery: "transactional" # or "best-effort" (default) + security: + mtls: true + identity: "spiffe://cluster.local/ns/cassie-app/sa/collector" + ``` +- A `GetEventsAlpha1` endpoint could be added to `dapr.proto` (user facing) for development and testing purposes: + - The following is an **example** of how it _could_ look, keeping in mind pagination: + ```protobuf + ... + // Dapr service provides APIs to user application to access Dapr building blocks. + service Dapr { + // GetEventsAlpha1 returns collected events from the in-memory collector. + // This endpoint is intended for development and testing purposes only. + rpc GetEventsAlpha1(GetEventsRequest) returns (GetEventsResponse) {} + } + + // EventFilters defines filtering options for event retrieval + message EventFilters { + // Filter by event type + // (e.g., "workflows.dapr.io/v1", "actors.dapr.io/v1") + optional string event_type = 1; + // Filter by time range + optional google.protobuf.Timestamp start_time = 2; + optional google.protobuf.Timestamp end_time = 3; + // Maximum number of events to return + optional int64 limit = 4; + } + + message GetEventsRequest { + // Optional filters to narrow down the events returned + optional EventFilters filters = 1; + } + + message GetEventsResponse { + // List of collected events + repeated EventRequest events = 1; + // Token for pagination if there are more events + optional string next_page_token = 2; + } + ``` + +## Implementation Details + +### Design + +The proposed event streaming architecture introduces the `OnEventAlpha1` endpoint which can be used for both: +- Local application event handling (within the same pod) +- Remote system-wide event collection (across pods) + +Here's a high-level overview of the architecture: + +![events.png](./resources/20250314-RS-event-streaming/events.png) + +The diagram shows: +1. Pod A/C contain Dapr sidecars that: +- Send events to their local apps through `OnEventAlpha1` (configured with localhost) +- Send events directly to the collector-app through `OnEventAlpha1` +2. Pod B contains: +- Only a collector-app (no Dapr sidecar needed) +- Serves `OnEventAlpha1` endpoint with mTLS using Sentry certificate +3. Events flow: +- From Dapr sidecars to their local apps via `OnEventAlpha1` +- From Dapr sidecars to the collector-app via `OnEventAlpha1` +- Secured via mTLS using Sentry certificates +- No service invocation needed since collector-app is not Dapr-enabled + +#### Sidecar Event Capability +When configuration is provided: +- Events are sent to configured sinks (requires explicit configuration) + +#### Event Handling Behavior +###### Sink Processing & Delivery +- Must be explicitly configured with at least one sink (local or remote) +- Configuration requires: + - `events.enabled: true` to enable the feature + - `events.sinks` array with at least one endpoint +- Each endpoint requires: + - `address`: Endpoint address + - For local app: Use localhost with port (e.g., `localhost:9090`) + - For remote collector: Use the collector's address (e.g., `audit-collector:8080`) + - `security`: Security configuration + - For remote collectors: `mtls: true` and `identity` with SPIFFE ID + - For local apps: `mtls: false` + - `filters`: Optional event filtering configuration +- When configured, events are sent to: + - `OnEventAlpha1` endpoint for gRPC + - HTTP is not supported + +###### Collector Configuration +- Collectors can be Dapr-enabled applications, but they don't have to be +- To prevent recursive event collection: + - Runtime validation prevents a Dapr sidecar from being configured to send events to its own address + +#### Event Filtering +- Can be configured per API using fully qualified API names: + - `invoke.dapr.io/v1` + - `state.dapr.io/v1` + - `publish.dapr.io/v1` + - `bindings.dapr.io/v1` + - `actors.dapr.io/v1` + - `secrets.dapr.io/v1` + - `configuration.dapr.io/v1` + - `metadata.dapr.io/v1` + - `workflows.dapr.io/v1` + - `lock.dapr.io/v1alpha1` + - `unlock.dapr.io/v1alpha1` + - `crypto.dapr.io/v1alpha1` + - `subtlecrypto.dapr.io/v1alpha1` + - `jobs.dapr.io/v1alpha1` + - `conversation.dapr.io/v1alpha1` + - `shutdown.dapr.io/v1` +- Can use `exclude` to exclude specific APIs when `*` is used for the `include` +- When no filtering is specified, defaults to include `*` (all APIs) +- Filtering can be applied to all sinks +- Filtering can be configured either: + - Globally at the spec level (applies to all sinks) + - Per-sink (overrides global filters if present) + +#### Delivery Characteristics +- Best-effort delivery (fire and forget) +- Designed for high-volume event scenarios +- No guaranteed delivery or acknowledgment +- Ordering is not guaranteed, but timestamps can be used to infer timelines +- After initial MVP, we can implement goroutines per filtered API type to send events to better guarantee ordering within filters for scale + +#### Code Changes + +##### Configuration: +```yaml +apiVersion: dapr.io/v1alpha1 +kind: Configuration +spec: + events: + enabled: true # Enable/disable all sinks + # Global filters (optional) + filters: + include: ["jobs.dapr.io/v1"] + sinks: + - address: "audit-collector:8080" # Actual network address + delivery: "transactional" # or "best-effort" (default) + security: # required + mtls: true # default + identity: "spiffe://cluster.local/ns/cassie-app/sa/collector" # required if `mtls = true` + filters: # Overrides global filters + include: ["workflow.dapr.io/v1", "actors.dapr.io/v1"] + - address: "localhost:9090" + security: + mtls: false # optionally disable mtls + # identity can be nil if `mtls = false` + filters: # Overrides global filters + include: ["*"] +``` + +##### Configuration Validation: +```go +// Prevent self-referential event configurations +if sinkAddress == ownAddress { + return fmt.Errorf("sink address cannot be the same as the Dapr sidecar's own address") +} +``` + +##### Protos +`OnEventAlpha1` is added to `SinkEventsAlpha` service inside a new `dapr/proto/events/v1alpha1/events.proto` with the following events: + +```protobuf +syntax = "proto3"; + +package dapr.proto.events.v1alpha1; + +import "google/protobuf/any.proto"; +import "google/protobuf/timestamp.proto"; +import "dapr/proto/events/v1alpha1/workflows.proto"; +import "dapr/proto/events/v1alpha1/actors.proto"; +import "dapr/proto/events/v1alpha1/jobs.proto"; + +// SinkEventsAlpha is the service non-Dapr applications implement to receive events from Dapr instances +service SinkEventsAlpha { + // OnEventAlpha1 receives events from Dapr instances. The application must serve this endpoint with mTLS using a Sentry-issued certificate. + rpc OnEventAlpha1(stream EventRequest) returns (EventResponse); +} + +message EventRequest { + google.protobuf.Timestamp time = 1; + Event event = 2; +} + +message Event { + oneof type { + WorkflowsEvent workflow = 1; // From workflows.dapr.io/v1 + ActorsEvent actor = 2; // From actors.dapr.io/v1 + // JobsEvent job = 3; // From jobs.dapr.io/v1 + // add more below + } +} + +message EventResponse {} +``` + +Inside `dapr/dapr/proto/events/v1alpha1` the following files and contents will be added. For workflows, we'll leverage the existing event definitions from `dapr/durabletask-protobuf` as they are well-defined, and already in use within our workflow implementation. We'll supplement these with additional Dapr-specific events as needed (like `ExecutionFailedEvent` and `ExecutionCanceledEvent`). + +`Workflows` and `Actors` events will be implemented first, with other APIs to follow. While additional proto definitions for other APIs (jobs, components, health, dapr, etc.) have been drafted, they are **not** part of this initial implementation. You can find these draft definitions in [my cicoyle/preview-event-streaming-protos branch](https://github.com/dapr/dapr/compare/master...cicoyle:dapr:preview-event-streaming-protos) for reference and future discussion. Please note that the additional protos are not a final state and were just an initial draft for future reference and discussion. + +Inside `workflows.proto`: +```protobuf +syntax = "proto3"; + +package dapr.proto.events.v1alpha1; + +import "google/protobuf/any.proto"; +import "google/protobuf/timestamp.proto"; +import "google/protobuf/wrappers.proto"; +import "google/protobuf/duration.proto"; + +import "github.com/dapr/durabletask-go/api/protos/orchestrator_service.proto"; +import "github.com/dapr/durabletask-go/api/protos/backend_service.proto"; + +// Main message containing all possible workflow events +message WorkflowsEvent { + // Metadata about the workflow instance + durabletask.protos.backend.v1.OrchestrationMetadata metadata = 1; + + oneof event_type { + // Workflow Execution events from durabletask-protobuf + durabletask.protos.orchestrator.v1.ExecutionStartedEvent execution_started = 2; + durabletask.protos.orchestrator.v1.ExecutionCompletedEvent execution_completed = 3; + durabletask.protos.orchestrator.v1.ExecutionTerminatedEvent execution_terminated = 4; + durabletask.protos.orchestrator.v1.ExecutionSuspendedEvent execution_suspended = 5; + durabletask.protos.orchestrator.v1.ExecutionResumedEvent execution_resumed = 6; + ExecutionFailedEvent execution_failed = 7; // Dapr-specific event not in durabletask-protobuf + ExecutionCanceledEvent execution_canceled = 8; // Dapr-specific event not in durabletask-protobuf + + // Task events (AKA Workflow Activities) from durabletask-protobuf + durabletask.protos.orchestrator.v1.TaskScheduledEvent task_scheduled = 9; + durabletask.protos.orchestrator.v1.TaskCompletedEvent task_completed = 10; + durabletask.protos.orchestrator.v1.TaskFailedEvent task_failed = 11; + + // Timer events from durabletask-protobuf + durabletask.protos.orchestrator.v1.TimerCreatedEvent timer_created = 12; + durabletask.protos.orchestrator.v1.TimerFiredEvent timer_fired = 13; + + // Sub-orchestration events (AKA Child Workflows) from durabletask-protobuf + durabletask.protos.orchestrator.v1.SubOrchestrationInstanceCreatedEvent sub_orchestration_created = 14; + durabletask.protos.orchestrator.v1.SubOrchestrationInstanceCompletedEvent sub_orchestration_completed = 15; + durabletask.protos.orchestrator.v1.SubOrchestrationInstanceFailedEvent sub_orchestration_failed = 16; + + // Event handling events from durabletask-protobuf + durabletask.protos.orchestrator.v1.EventRaisedEvent event_raised = 17; + } +} + +// Dapr-specific event not in durabletask-protobuf +message ExecutionFailedEvent { + durabletask.protos.orchestrator.v1.OrchestrationInstance orchestration_instance = 1; + FailureDetails failure_details = 2; + string reason = 3; +} + +// Dapr-specific event not in durabletask-protobuf +message ExecutionCanceledEvent { + durabletask.protos.orchestrator.v1.OrchestrationInstance orchestration_instance = 1; + string reason = 2; +} + +message FailureDetails { + string error_type = 1; + string error_message = 2; + bool is_transient = 3; + map details = 4; +} +``` + +Making consumer code look like: +```go +func handleEvent(request *pb.EventRequest) error { + switch event := request.Event.Type.(type) { + case *pb.WorkflowsEvent: + switch eventType := event.EventType.(type) { + case *pb.WorkflowsEvent_ExecutionStarted: + // Handle workflow started + metadata := event.Metadata + log.Printf("Workflow started: %s (instance: %s/%s)", + metadata.Name, + metadata.InstanceId, + metadata.ExecutionId) + + case *pb.WorkflowsEvent_ExecutionFailed: + // Handle workflow failed + metadata := event.Metadata + details := eventType.ExecutionFailed.FailureDetails + log.Printf("Workflow failed: %s (instance: %s/%s) - %s (%s)", + metadata.Name, + metadata.InstanceId, + metadata.ExecutionId, + details.ErrorMessage, + details.ErrorType) + + case *pb.WorkflowsEvent_TaskScheduled: + // Handle task scheduled + metadata := event.Metadata + task := eventType.TaskScheduled + log.Printf("Task %s scheduled in workflow: %s (instance: %s/%s)", + task.Name, + metadata.Name, + metadata.InstanceId, + metadata.ExecutionId) + + case *pb.WorkflowsEvent_TaskCompleted: + // Handle task completed + metadata := event.Metadata + task := eventType.TaskCompleted + log.Printf("Task %s completed in workflow: %s (instance: %s/%s)", + task.TaskScheduledId, + metadata.Name, + metadata.InstanceId, + metadata.ExecutionId) + + case *pb.WorkflowsEvent_TaskFailed: + // Handle task failed + metadata := event.Metadata + task := eventType.TaskFailed + log.Printf("Task %s failed in workflow: %s (instance: %s/%s) - error: %s", + task.TaskScheduledId, + metadata.Name, + metadata.InstanceId, + metadata.ExecutionId, + task.FailureDetails.ErrorMessage) + + case *pb.WorkflowsEvent_SubOrchestrationCreated: + // Handle child workflow created + metadata := event.Metadata + sub := eventType.SubOrchestrationCreated + log.Printf("Child workflow %s created in workflow: %s (instance: %s/%s)", + sub.Name, + metadata.Name, + metadata.InstanceId, + metadata.ExecutionId) + } + + // Handle other event types (Actors, Jobs, etc.) + } + return nil +} + +// Helper function to handle workflow failures +func handleWorkflowFailure(event *pb.WorkflowsEvent, failed *pb.ExecutionFailedEvent) error { + metadata := event.Metadata + details := failed.FailureDetails + + log.Printf("Workflow failure details:") + log.Printf("Name: %s", metadata.Name) + log.Printf("Instance: %s/%s", metadata.InstanceId, metadata.ExecutionId) + log.Printf("Error type: %s", details.ErrorType) + log.Printf("Error message: %s", details.ErrorMessage) + log.Printf("Is transient: %v", details.IsTransient) + + // Log additional details if present + for k, v := range details.Details { + log.Printf(" Detail %s: %s", k, v) + } + + return nil +} +``` + +Inside `actors.proto`: +```protobuf +syntax = "proto3"; + +package dapr.proto.events.v1alpha1; + +import "google/protobuf/any.proto"; +import "google/protobuf/timestamp.proto"; + +// Actor is the base message containing common fields for all actor events +message Actor { + string type = 1; + string id = 2; +} + +// Main message containing all possible actors events +message ActorsEvent { + oneof event_type { + Activated activated = 1; + Deactivated deactivated = 2; + ReminderTriggered reminder_triggered = 3; + TimerTriggered timer_triggered = 4; + Invoked invoked = 5; + } +} + +message Activated { + Actor actor = 1; +} + +message Deactivated { + Actor actor = 1; +} + +message ReminderTriggered { + Actor actor = 1; + string name = 2; +} + +message TimerTriggered { + Actor actor = 1; + string name = 2; +} + +message Invoked { + Actor actor = 1; + string method_name = 2; + string caller_type = 3; + string caller_id = 4; +} +``` + +Making consumer code look like: +```go +func handleEvent(request *pb.EventRequest) error { + switch event := request.Event.Type.(type) { + case *pb.ActorsEvent: + switch eventType := event.EventType.(type) { + case *pb.ActorsEvent_Activated: + // Handle actor activation + log.Printf("Actor activated - type: %s, id: %s", + eventType.Activated.Actor.Type, + eventType.Activated.Actor.Id) + + case *pb.ActorsEvent_Deactivated: + // Handle actor deactivation + log.Printf("Actor deactivated - type: %s, id: %s", + eventType.Deactivated.Actor.Type, + eventType.Deactivated.Actor.Id) + + case *pb.ActorsEvent_ReminderTriggered: + // Handle reminder trigger + log.Printf("Actor reminder '%s' triggered - type: %s, id: %s", + eventType.ReminderTriggered.Name, + eventType.ReminderTriggered.Actor.Type, + eventType.ReminderTriggered.Actor.Id) + + case *pb.ActorsEvent_TimerTriggered: + // Handle timer trigger + log.Printf("Actor timer '%s' triggered - type: %s, id: %s", + eventType.TimerTriggered.Name, + eventType.TimerTriggered.Actor.Type, + eventType.TimerTriggered.Actor.Id) + + case *pb.ActorsEvent_Invoked: + // Handle actor invocation + log.Printf("Actor method '%s' invoked - type: %s, id: %s, caller: %s/%s", + eventType.Invoked.MethodName, + eventType.Invoked.Actor.Type, + eventType.Invoked.Actor.Id, + eventType.Invoked.CallerType, + eventType.Invoked.CallerId) + } + } + return nil +} +``` + +The `oneof` typed events enables consumer code (sinks) to do direct switching of events and drop events it does not understand: +```go +func handleEvent(request *pb.EventRequest) error { + switch event := request.Event.Type.(type) { + case *pb.WorkflowsEvent: + // Handle workflow event + handleWorkflowEvent(event) + case *pb.ActorsEvent: + // Handle actor event + handleActorEvent(event) + case *pb.JobsEvent: + // Handle job event + handleJobEvent(event) + } + return nil +} +``` + +### Feature lifecycle outline + +### Feature lifecycle outline + +* Expectations + * Initial release will **only** include: + * Workflow API events (primary focus) + * Actor API events (if time permits) + * Future releases will: + * Add support for remaining APIs + * PubSub support if requested & valuable + * Each API that is not _already_ stable, before proceeding to stable _should_ add events in order to become stable + +## Completion Checklist + +* Code changes + * Support configuration CRD for both kubernetes & standalone mode + * Support sending events to the `OnEventAlpha1` endpoint + * Protos for events + * Workflow events will be done first, then Actors, then the rest of the APIs +* Tests added (e2e, unit) +* SDK changes to support `OnEventAlpha1` endpoint +* Documentation +* Metrics should be added after dapr v1.16: + - Track event counts by API type and scope (local/remote) + - Monitor event processing latency + - Track failed event deliveries + +## References + +1. [OpenTelemetry Events Specification Discussion](https://github.com/open-telemetry/opentelemetry-specification/issues/4045) - Shows OpenTelemetry's approach to events as "semantically rigorous logs" and their ongoing work to define event standards. + +2. [OpenTelemetry Events vs Logs](https://signoz.io/comparisons/opentelemetry-events-vs-logs/) - Explains the distinction between events and logs in OpenTelemetry's context. + +3. [Dapr Configuration Reference](https://docs.dapr.io/reference/resource-specs/configuration-schema/) - Shows existing configuration to showcase where we will support event sinks. \ No newline at end of file diff --git a/resources/20250314-RS-event-streaming/events.png b/resources/20250314-RS-event-streaming/events.png new file mode 100644 index 0000000000000000000000000000000000000000..410ce85aef2f72527373bfdca84350e6a6a78b42 GIT binary patch literal 108445 zcmeFZby$?`w?8@z0}NdXhyp{0q=bURAl*2CbVzr1&WK2dq%3>0 zO93lq%d=OP9?Q8N{n>`NAo*}O+ZVYyPA>PL131v?%r^YE-4Ruz&GP)g zCTW$6$*eYc$3A0yn53)vGv(Z*%UJd0IiaC&A)F_@jOG2W=eki8Vcfd>`&ZmuSM@DM zOY^rxD!)}PzN{+EdOSnFq)M#&n6_i5VD0%svJDXO2gSp-HiDY!?*ws16^4JH9wMIg%57&!IWa2>QVkslv6kQ zh19TrOvUFupn#6iSu)43GU6u2*W9qMy0JGuj&(KT7xjL+ic+5Df;@6 zBFAbx!}62Eh}Y9krRl27A9R@UGP#*0i1}o3r?PdF_!*g|GLV(gM^Alme}#9x3vzRg zh`Jko&*UN5-Fx*g243|#NfYib@o~Cck-Ca1n+anB2nhHM(~gdnrraOef~$El%Cx?{6=m` zbWo!0-fj`G55LzPHugD~bxjizIZtlMauuNn$|PG(Aj~Yin%fWE)O|*n9)Tq3K+{w-3m zyx^bkpux5`q|U^`Ge1Goc%?E{Sz$N93e(s7KYqHH?{!XCBJOxoN)YhkXztFhWfJ0F z53@KqtRSCq&F=>m6t)&lB}A2u&W$S2Ih<;?`pHOqTv-Xy3L+N|Cq3>+H4Cq-8CTjA zAB_$l}2ZHV^{c^N}r1rY;sW@`APB#lw~i!fl7>fec^76T0HfwlhFb z{A4&kr0={SdiC|mh7n0&=!6*-2kvV#Ry{nfcB)D`?ay?5zWGEr^v=6m)z}W$%u$5m*+}w zQY3ZrHrX6g2Xw2OMniPKmZYfeKMo{DQsY3ufZn1S;?E@QaF2-+uqOlB=A=;mPp{!6?eh zV#kfCzhk12+35XCUodY+(RYtsD_3!P*z z_4#F_WE^Is3FiuO5Z%U26G(s9&0%rN+{n_?;bCogov#7-&0B*M1BF^=+e3T7x-MG< zyA?aWq1iV3F?R141;Tp6dg*!vd)1Be(XqUycMTh~ zeJY$Yo#S)ja>`8dXNg*sTVMIpamQHo{it!*zpaO-Kc>$hPZK{MM;5OqmharLMDB8^ zuzt1?eW-G9ykk_DS_p{katR^*z&&_ZEI z<>9!IH*a%RP{xdfwI!8(q0p4|sP)me=}z(YE!}~+C&q-OI9*I1&ELpH%f-JgS@Qid zky@A9rvI?~-Xr}-8*lmzTI=eo)T>P#XUr~!<>#KcXxVBxcyy&YZ`j=LtN(mdO7|_! zBF&NDF_hkkKU{fAf~Hx{%F{l`Qu6g6$qT zHZ>~&d_EO{6`>{}e)s)Xe0Pq5#rmzYe5d2wNP~KVAd*voVu2Iy?A{p$-9PU=hXm^c zlb-XO%U#~T$aURnoS2rFUcu_e+CzTCa`7{15pAJF>6s~-DVZ52sB1pZlpAO@+n?{9 zpPbJjYe>*%WPgDF^83rO2QEKjPaXslx3Tv!JF1Vbxf=Ky`O5tYg`PqEWQTk`1IK>} zFYL$~$SE`5%!gl-vR50PvCUky`zG~?%p%`{%YwcuE;5@gKqT(QT~=qG>C9iqU)OgV zC><%2@p&R+I)*zkIvSKvN@Yo6Y%w|fHXp()KUyleTM%%v3Ru}F?{wrvZm@Y5Hoc}Q zGRd_RwCgO`PaWr6Rw^O}T_cQ994dTU(-f5vY*f?qTy}ri>mkmBT$=(Y_xky{R zZ(fTWBJCT?=jTeY%rK!28WJk4BIBKDp(>uTJSU0xsWL z`cD}5%cwP}7rB4cb-%Us`nD0KM3_l+gD<0P^}7$_+z6Ee)t6`&?jw^HEBtq|)dfy# z&BdR*J3o83bmPm^qsEHymc&Lx)7~jpo6bmCoh~&x zxY7DNFy`^C8_5`BLmn?z`pFKTDX(ei&H6m)^z7-%N83 zY*wmW+q1sv^D>NSNOnG{)TusPu1|0})EU*Wnu?qvte2X7-ng(yn#Ex6O}ouKbK;lg zsjJ}Sc(_IzpOG;m->f^FU-x+uEm0D{yG1-brMIHj;Kblyx)xk%`t~Xw+YS%SKqNKp z9^p~Etx(2rm)@G5w?tvxX7pIdQrJ_7?QT5-{{6wh#Tn0E>_xfW!kNOl^dtA1e$X6_ z=UW7I5yl_qBxJ8jru*$Z{*s(JRm7InMV6lGVn-ocU5a8zw4mON<%ewSlr8Ra{BtT*IImJh^J(d#M!v1)xUWT3o=veHwsR#O9U0iU5D2o@~}2l#{qyd<%1 z{_|NLivxuH`+G156mAEC{C$r)@Q(RO0A849{(8qwd*VO{A?7Q=^!pAm;4|iHJ|@`jTRa^k znDo>%VKOf6RxlA>eqMeiNdg!QChl%&EryVl|NC*^UlL5Vo}R8^e0)AWKD<7Hye{rG zd;+4PqI~>!`0m`{0q)@O@N@Qj?91cq!Ti@Ef7X$;^008XbM>@yafV^meQfUHb-2Fjx2lc=`GMSsQp%9P_Q1rk$^qqrR-26QDDIhNQ?{ zA@Se${~uTWrTAZ-)cf~IfqVb&NB_&E|Nf|shn2gGixWW8Q}W;a`kU^5z4-To;(Qp< z|BEXA((~_c0Yys^i1YokX_5phGq-JleY|BStDz0N16GFl!FmY%0;*rkJLWYO%(8t4 z3If4FO0v@0zF31uogd{+}5Gt|BR5 z38nB~5&uaBD4C)a!+#_RNd^>*^FiT1Y8VOUI{S|#VR?XpxyU4${-cH=hzY#^xcgYF zaF`D2C;9(uO~6%H!e`0(+I_gC||!$IKZ z_~orflh0rK`t}(6%y@-22*ev2*kpT&J7=pgYi5H`!|UAol>cWEmJov^W?K&R{Ydb1 zsUe++kbj)X@Ec++pGil<(zvb0J?pPm^@5M3JS5+|g6Oeh$irj6^+8N4 z-_HFey-Z>SLJDsDNe^tBkTGG4U2-&(Ya#Kl1Tk~#`y`a?>W=t>k5@w!%<&^jnc*j@~<3RG^Ld)x~jz_3Lt+ z-vm%doV^8x+UHe9CgR~h;X4qwW zpRZ@AaeD1V0?!rjz~_aw_E>%X_!;~<7@~9kwg^{(eQ1%9*Mwiue8rz@AaLivb2Gl* zt3~LTjV~~qun&zF9WJ&}c2!#lgi7ufYroyp*L zJj`1!&uyBGQYvD?Vn$UZ6AW}$7~5og#P03w>t6XBgdVnze@iVabm-15`!-#Tgy z%-y5B)!~s);@I3#?{YfhJ+XDvEU~PBF$zUpSO}VdCCw`a=O804d5Vn}d&;D03t5W& z2BLHID#sC47e(^)4gV&}MXJc1e=@Y!3q%!UL)x9+=5rQ2Kq4L7YBiK#O1%Rl@2FD9 zrf7cYVO7p0Wb9gH7E z)7^WO{d`Pmztu_VFta%@plr^n>_uCYK;fOWpV?P;>}>QQ4=5{Favr~S7`K3a>}Ocn ze!Qjh-B|&UPuwcxN42VbrX*FO5v)!X@53Y8YAwx)WYO{;Cf)-ivUG3jQ;g|0th09s z$Hi`6W?frBHZ_hvYXi*o3asPJvN?apr{u_#g!?b1V%v}39ZP6^`t)G1qH;xea&9D< z*g@J%56l?*nE3WrN1J=#EYfESy^qLf3X!#RR$N2Dj`ncj5_st*^g@1Yjh|>=)5`FV zvB34fR-t9y^XW)?y(MLPAfrbm<19|IS}=r~_&V@)CwtIfFLCa0E)xIo7!E2LmK^J` z(ORTE1!_2$a2i)*jemS5=O0r5VUbtr+8zbCnGA`MZ}R-66bw0~yQ(ayU4ZSSSCN%{ zxc#^3!I15F3oxd!X?2-$UFwQW*9mI&WN&YYh0?$Bj*Hq8<(%K5%Oc1BGF=K%B zfM;OmSNIH)IPVULxty=uKQ$Z&MS@#GFvG>|t-hWlcIr2GB6nU97bvrvPdPPg89+U0 zniMg@yes=Z~ZA-oYHk6ENx5#BF-A<2oVN{ITYPyFZ30Zml!R32x1nCuP3 zt=FJ6A)$j+wy8fn!u!CjwQ^e9@ZsJs>%XhSS+dn*UhPilaj$=Cq|$2%N2|%4TK?~f z`9`V|R>36zPsU~QVp~KdRF8_p_wW93CJ^d7z9PR)p|cP48!w$ndL=7x1;&ap$^Brp z-+R)j{4?qgn7}ma;C$4{Q%;5Bys=yflROchN7B4?m#+WWE{wCada@xlWr;qfI$^R~ zwdqCt@#z8g`b}#w~tuzd(`nA0^yEIcMWf zmiA3hcXI+?YRczLov^fRn_ljvS!a8V_Jn*2_(udRh&}acU0;TBfN&JtzUaYs-r>o3 ze35^n;=n6-k@xNQ!}R3o7~8Tfh8KA#=CIV=KHv9SkoZFr3BLtytvA+!7UD7}ZfVmH z$$xT#KUe-kCQk`mYnrJ&xrmXsSUzv8>!gsMOedDc;qQXqKs?)f$i}z<85P;NT#1S3>X6-l%gP1+j0PpyZH8(k@!|ZjLtp9;#vY)U4 z&Q$iENQoD;0QL;cQ)c6lDu6TpZCtDxnl*3Ldzhpv@z=R1Q(>M=ysj8D&pGjg+2W7I zfWYbS1`(&;1=xFBL^QgSB_d-ht>s^yBj9<(g5)0TOknRsOrt=SQPVT7GBW;RJt&jZ zVrJ|a#oG| zuh`!SuEmCoYj@DB5b`D%JiWz?o)P#j?gVci>94FI8+qXg+uZK>7rNleV7buMDo-W^ z7vbI$V3&xr@`^9hg!pmq^d_491F<0RM+y#t!p^;jIT*ME9S5O{c)az&5$_+#+ryD% z%;YNUAHu1pFm{9>a|QM!a95W1_IrR@0XIy;ro;o2SgjjLZ2X2P8hGAnk5P3g4KD{N zQ$p#EycNg}De+wHU*_{EIMx+A1|lN}GJdNO3x9Q&G*gI|t%0J22?>7=ZvZU<+Ki$S z9y1AW`aUOi@p4G)K2O)&I(dS?ep4Zk_Ey>0b-n zq(X8T^lOcdbA#*f8{=^3y6g7IUc7ljqbC41ff#8lCq8`|EdBNvUiywUiR5Y8MOy5? zJL^l~>c#S4N7gsryar>{!(jjOkJitkd)`1QpilW=s3E}7X`keLPrJ^kssVpeCNj^p zgI`^!+quXQgwoqlKBUF4uY|{R5gK+2v#uAx`0XcKA_bui6_&|6r%tvThdp9ZVtq#h zmgz;dTn6>Fmjmy<8j@s)OzqzAJUMsQDd<91%msbq9V^fc5;uFKw$?00QSG9UBmOpn zxRUC(neBklyQE6jsFMQtXep3zT`apYrJve`<7Xbmf?tTBvTU#mw)>s1owZl;kB}@4 z&%pxq(XF_MLyU>h`c21tuB9*N`#PWzT9<~D51z4_J5H*XZqSiyZx`XkRg(#RYceQ< z&BoVxRtj;HcznO6dR97Kx|M;nDW`O=(?5eT@3>jhW9I9w*?zLr*Uh%8%a_(Xjh=40 z_O5ado?uK~8Ry_vxUnd8k|DkcIaH$^SM$t{GCVE%Qpuz*TjztvCqdhc;ql zBbzyL>^s$1Z}Jb7OQY4%+3MqRU$kGf8<>-?j{e*l?cS~roVbvr>S8Mx@-}C!7-mr8 zaNBzkg&ZEL=PhD3G%7`OIRP;0Bp5;G^Sb`|Pb|P&A`tDumy9>Qo9}T%C&}K0w;xHA zZTn2_658FII<~rZV~68aSG5AGDSKiF$vXdy8AkLH;LkD3M0H zFfNlJ>7h+r3l74oBb`Kc=YEL z;POj3nxyp2*baU14UHe3hMQP{z53gY&7IvGim?f>pKcyj=rUf?d^_nc;qd0r!L z)pv_s&O3{dfuA*EC?2-Y#BTua4Bu?5iwU1Pezn4V`RtcW6>*3(fB+jkM(!lUyHDKt zP};h$o<^1LqwPcS?~K9Nqxv0IfaHE48cBEFuulQ0q!?*a&Mw;NEe*b14zyMS2?s76 z_^@5qen>rdC>&G7z#YMI*s{Z0RVgfMYWnS73aSm~%4g~Ac6V7XMsS+=EQg~YDF`Tyo&<|;LBUD z1;*_1#H17_?WT@gE^wPS-Dgb7p!}2V$_-9yZO7)tY2Q7>!L8d@twyb*D(Kh2Ns)Q> zRgc=da*Zjo^)RvE60-O!rDUwV^j1S_t#HP)NX%=>?=BS&|?e(s$c;kqECxT2IR%c?IW|FD>C2Nm;jdw80VWBIdf~+j-~fWS`^I2!Dx@_ ztZ$wOFMn z(JT`g5V+Ls`SkJMe4kdyD0|U05((Y1@8#O-5yRlxFizBDi_xtl|DL3_1RVbx(GGih zR^3(#lVrupd0M6^3vFChqoHsBpG7=u7o=r~3!2~=2BKc2m0P@2ll|sHpMZcHLzQ4* zP#C=3k$9>Rx6fw6@{+Ig2G41(ONM_O$KHGZ#Qa+2p+!;G)#oZ+t#9ILgiKA7y|siE z(`QP8V5pFB`^ZjF(9}Welk+pG)nV$Cqtsik)HYw8@lw~vBT2EwaLN-&`bQ*{L!Cs7 z+r7k}2~i0R!%NF3zjfReFeW*{4tr*ZQCkQ5fXV7tg@=1R0_o;5;TJE*7|92+wENoMLKIKWr)&SaEJ~@w7cRM1!=8EeNV+Qbf`y` zUEKOi^L7kw&+%=s$wxz%)v=)m`66ZhI?5W~vy{4AmV=!jGv`hPI?N`)+o2v4js9v4QsphwN{hrd7*IpF{Dn zAnVsxwS5*FvixmQ;r8!p{Vtn5I!w0Tt>!j?q@n@Kju=Llp}cYKs*_pVlTA z_c{getwS(+-v>%9P0X4wIV=quOL3`o_~u%639^WV7Qp69Z||Q(y?MVZwmWgINooM( zPVhX%JT1CJQ?~jhf!rgL*^MKXLmNK(-cW$#FY3I@BU9XhytiPqH;Ys8@;2$>EtE9G z$inmG^o_fU!FsqTJ%~}433NeH2EU+*mY-4f`Np)Lkzf6kio}jcE+$dG0;7|{j8z}D>BpiZvFO4t*yuCnA7W$MoZ|XxWN`_BhFf9=& zdCB5(E0i;Z-%r}?9=M5*&5)QePcUn`<~rmY+Su7Cb8ou^g2?0tE!x-ipcOv$eZ}g2 zL>>WT4<9PmNWXVH9vWP$)A|`2tt8g73p6MO0B51R@51f%O3g*8qG^Bjskf(;WG~p_Fszv(F9dQidr5xMotQyKQfx75?{$KEvj)Ie8MI z!;TQF7Xr}6xYpq=m<0#*UdTD>IbLS zEjFOq%=7C~g7mtvJPy)%J>Vwi?=7>7t*91KnRa24#6Z|c%9=J_lO_A$^|G0&KT&Eiv=KFDR^9*P7KRwxjZSoEvFgh!-#bziA@!)Tp# z805=IQOo$N(w^i{H~2IEO20EUQF%=Ia5_-<-sj_F;j4AsY@5kc9l{z(pzg{uz?xwr zshTlyiqpRdzQj2|mKAV}>?&MM7JxA8NZwdETHeB5^lb#6wrmHqgv0H_mMRFx&>7D% ze@hS8={n6EJ9##PgstV3x`Zt&&oh@$lwSu1Y20rli9j&z5gmrli6ti2%lB1UC#Qlx7y(-bs7r$6 zLF-l-%eb=^^#RmsG3bYQAj5|Z#%I&0DA zrJfL@i-BuXPuG%ZM5STsSjJ<&NH#l46idlh)!^}=za(d&1xJsZjaLS7ZW9jZuYc|& z0-UP|S%%&XVye>TAaEQ&)jhyKSPHm_(qW8FIoozf>(g!QJspl}5`dVQFSx0%f4u$Y z<^*CNAf_4jc6keLkp}e`y1E}=d-pEUN2C*spBpQvGSoH5foPQf z{V)V8=}UrD@5F*63*O;DCSzy^Pu|AO&Xym%8VH7Zq~vU1?i7B(qsq2M@XhMUYdaCe z$Y>qFXOytU!frB7AC_piCaTS`zfBzGjstcDezZ7Gkrx&omG z?0Hj))t*rcaTg{0!1>WIXI|I4VvqG<>lrnwffe7m1(*zJLE$)RAe&|4eTi&l;EN<5 z$T~H&>U-f33xN^7(bc`!5B|u0~2_S^Hg{M@~(yh`0 zM&G1D(?Lqy_6Rizqs1w!(y=T_dYUZz4J5$+dw{!FM;En;1E5 zjqq;0n^VB1;yJV13g&_(N1@cpz# z7?Qz}ca}GNUu~MOd!HZj;3ghpfV+%BD%Gjlxc~C+mD%B z0v+38c)ORhp*{9!Q{3w}`tRdDa$yP{S{zST_PTvUtYK){uN}i#XPtsZ*gu()r zj=u>b{fa4X@C0sDy!v@a5@tj!@ zY+Oix(#NcsiKNGSPJALh3N1+Gw%0`sy59avq9mkqmbY#9fHO&94kOFp zf=Bt=QF!S_T*>g07(g7SpZ&+uACJi4?L2v*c#<2sy2h*fi_26ChJaZ;gpY+Kb`7sH z7616KuiIk@!4y$&_rUAtpG0Z;;2!_L?SUPI>o~Y^$K3y za(q-J#PduMkp|G97<$z0Lv6+4hpV3N)Uq%DXA0D?gp5G)r1v0*Ed!1wlm!d* zjNqvd{n!8#Y>Jp{V8ySe`fD_mJy7A^+3?6~i@W%e(lv~`v+in<4d9Fkd`t>ZQ#KXu z$(J-f2f&hMA)Xh^Dz8VWhWrZRww&h7cmYA$(|}nz(>=!qC2&*FVvW=^i_abq*E?5F z!!K_H;DAR6R~J<4;jlXYm6vb6>Ex9V&k_?S5d)BA3U0dGop4*UZ+RCLmkwa{11w|e z&!t)p(QD#^4=Y^p%ylrS2r+<_4sfd!V7Bix@AqsUzYx~N&Ax-L&*Z;8qh-nKl4jX} zAed*dJW&WYd7~FBbf|8~gVK=I4*B~11S1Fq1+;{>Jh~3wul!5gA*Q1%35+nFYT9I~ zQ4R!Y=7yH3)v&h#RXN~DL&u;!DWFCrVVXMdL$7>$$Esp{cRFyE{L!7;7&L#5ze*YP zl~A;pka@~akr#}QFZ7bKY(p>iFz7)ui9RM-v!{e57~JH!Ef1p{=t}?keuVoWaBPE; zhptK%TLL*blW;z)$8rGdKW#{{v2SGR0Mj8oRkYS36j~QAOqJpk1g2}DTJT)WK$7x} zrh%16p58$wKogp2$nB2Pa>9+zuh14+y%xsa<4HKORp^V$oC14r;1A2|sTiD(S9tW!rV07KqZtbq^pU$EAE z03e<$9l0%jdP{GNy8oA|isdIocVN2;kY$tsz`0n8k%M0J#u1yBqu!E?JqG4mfTOpL zd(tKm$IxWzfuP6w%&6f#bUDx!_otjUn#-j0VAPZcva;@`!1@yWf>h4F=T=^*Q|{hG z{l{)V=Uf%;Lmxy^PN^8{xWf1r%EB_g-T`1?F|vmMlgp<6wY+7RqI)Q2c_rZBY(6>` z!jupLS~<0hN{oSU=PfuVYUf(aK@ck2++x0Pyb>0UXl5k*E4XQYb>A`{(3suYjf5NI za2P(8F1tt_oXg9RqM0ilVE-9V0II}L3Kjh9Sq4hB&@u=jyz}cbGTRnl`OY0Mh)BBK z3w~`+pJITRPzmTCC_%o1*&Q(0G!HZbC>9_nYTBM?b$I+IC0uBMylxB& z4ayeBXvIGlE60{m=^mI4z#DWkI$hk)9WTG}vf!qRc7|IDLx~*B8kkoWNTas{EVvY6 zl&uG}FV?E*0ayj0f`JuS!6g@5ccj4CK<6W?7qI!78zDfwu?}>*{msE6C)I2aSzu}# zr5%TvpUqWb0RZZC{MBeWt2zkc_6I9rXbU6!D#;kIyg-7+(>%$p#Xy5fC&)U* zz`|@bU2d1YQyb7@(+sq!k9#l@dp9>sU*Qrng!S}xo(9Le_1yf^9Jqbs840Hhj1^0l zP8KHont~0eA2I!F2x5VY4{v;8WSt_WK$%Yh!lB#x1nraiXZ%i-g#y}$>6`;xf=fBoTA@{g_+JxJ-u0?L*-SSwAOK=%N(lXw<}uAFHgtXGESB=zn0eyDqE-OTXSZmNx|l2 z+I2|D6%QX$I0{;!Iw1(-Y&^qCKm(Y<3fVr7;iH*0A@Mf2Bs7gj1t?5`V*oLZl=?y) z=<9b4Yu_<5B=9`Fc44Xy^Y&HLA<}uKSh`ahqtdWC)1L4BAzyeJUZ~xjsjYj6Uy$Q9 zs&Cydy5h<9BSx^FKm3-v;)YAW_S+)S)x6NG{ase@JIKAUvqYO_HQ>)Z#1NAuM9$ZR zXAwQ7NhGR!QNTdrUs{16ET+p81;M-c7*m=w2b8kAMOQ!rutM_=6k7K2u1$0wFhFqu zAc6h(+54q5Q)h1=L~uV}$qjjTLn=7%Nc3vCn>k*HJvY$(NXOpkjN76m@)6P_s8&wl z12g74@>FbY?8w$sH_ZGCX9}g+!v&s{^NBr7d+ozDsFhi3@w=7JXZ*)E5n*t9F#1T( z-lkhH>hjxW{gm^Bc@n#Z z2;y#2;j4Jb$t>R=krTPwjSF#c@!)>zMPjfF#k`Rei>=6zEdXK6pK?FXKl;st@Tnr} zK2#P)_PMTdq(;H0u7uW33)jdpw2{X_zod6L%EwjjBTO^htV!U?5v- zAE8%y!$YMU#IQ^cFU6oYP{})4On!QtLS7PS*zOgh6bCJMW{eIw9m?(HZQe{|b^p;3 zX${y*ujIU~7T+hy9CUq7N(Y`#l?O>m43$yWR;nBCRZrQK)2XG$oH?^^#m(@zq+H)Fuw&hgcKu2`lS(iKA{r@bE*0bUL4D zfwQa-j}CGLnzt4s>TOpSJAKt(cpaqnqL4m+X(^y80oefvYTuJzu`ki~+`t^qgLt}U z9dWbewsc26fFw!CvddjBCO2Ui>y!|a16Lqv*-XGrYhM_($@t{nSlgx7{+dR}qzu1mXWI!qaFe}4xV=y5K{_tu@H{{;+v8H{-3#B#P$+gV6 z^TG+cqU_DC`Y{<&iQ%l^)3phoG!y?4{os?Ony)R=?G4B>`uzCiX6^A{z;s3G7Qc<1 z0P!VKqF1<*wM@nCCmKQ;4S0Gi(Cz9Pi|iOdCYKAEX)loQcj!o+uD-JF6CQJ%`f;!} z)CVTy9yp?7Ap6NWUrMTFAN_VufqiCdw$mHK={6WG%`o|CX66Mp$^<9sH22-<$JWB; zwf$_s=jA6Wy%Xo8XRI@wFsx#eidPD2I=3Zvf%)DpCLS?YKz*r!7T*>%1QjQu!BY^^10sSE5~E+%P+xCBg1 znfD`@hqg<@S6>Oc>%xYFf!H}*Eo!7=g`^=oO_)Ym_t!2Mo zkdjTc8#5)?0>ItJS|Ku)5nf1z`g;uNvtS^6cNm-lD1n&1)Z;n?@th|^L z-|e8Zt{Zvur5bjUcrNe>Fg`%dpLCuThy-HkW*Q*2HuRVi49s)gh#h;@p|_IZR)C$X zDq-xTG$2adF_GNVZXN%5xaBBonXp;AeI2b0s=rYNICud*ELrheik613QAQzb_%&Vo4eaZAK)mmFkzGHG^%G2 zi{TzXd4~dG$0ESoyJBt#b_U0s9)43`5OzSnwKk-8ZasV?cs%XV5Y!b8G$Juduly1- z{D~c-blyNZ2O#O*ltH6-^yyHc6vf<8a5z}7$i&4u%RlPI{op71fyWYH<#anQt^$we zxxh}yv5P2WRtPN_`t6AMd$+~cGWFCnaT9V)2UTYrGR|x)E1xmp8h^?Fr}sP;BP^2F@hK?v;U$H z2PCNliy%*@)rM-sd-rp8t=}q1^-7)vFZ?zrKn#Js6t=mgq|ZkT{;Q1pv&Zjzw7p40 z7s+b6=pP#!@pC;7{6>RHSpO(CV0>bcS4m>`R}Ty@S3rpHWR@KV=uxd%5Q-!b9lS|)G zRuU*EOy6hABa?dM2^!-BQ9r%P$pQ4a*@QtK2#IoDH3yg;hhBWia)0x{j*S7{$8Ph1 z0o@aFa60?P(7=ng)l3N4U&aDH5h8LQi0{R>=-fKUm$h)&=J{Fj~CJL(gHF}ZjD1w5ERCzyRi-Mwq=10kQIRDG*+(^}zjs-d%8P{S}n zCH*$KF@I}EAf)l?@~jW{rsF_rn3~8$hw2Od_tQbgGs|)JxA`09f&(^6H22O*Jo<#w z(nBs!4CAFG&wqaOgScj9wUMGdB!YxOmfoihU2~dxoZszPoUY0zm4+$nPa z3jceQ*8ujnX~hzh@i+&cuuQ~Kt_mZ$;tz~1$7cG@%iho@KL>gVvlDFdNZ%@DaN{w~5~glm&%<;sFfEOH zNo|yheYfQffRHU4CWpAm2YWwcQ>eD}>z7INHG9xVp$5>lz$L-J+#}o=$H-47Ty0_g zoi}V^l+XWo^251(oPTB%A3|p zm$P>QizZw@5*zM(K_@Mhkpta?lF-sBD;}sG(92>AVNS3QV+sJOa(&eEX?cPJ|KpPR zr}XeT92&%Y-f9P%omG2xs$N#bo}Q^+OGQqhdbT~4fi2^Oa4z{zCNe~j9v;%6GU30( z7I-}Qc-$(nKV=(=E={l2zS zzXkv-Ul8&(=GE;sv|Vh;f3C7MaQk%Ku#KE6WbSb|U2ns?!#DZ*_k*uK->!H8V0~}* zMt(G}J!XbKZr|r@0mw95wwpH4qyCmbdsDCdPxo`L9KEOA6fV5RzET*O1Z>sy892Nd zIc*(Id1TPj3nbviX*WBG5RX=}JmQ|aA;TGh8+AnP(8I81k6TtGmMs|0Ug!g!s&Yoc z%%|h@QJ6%YPCJEnLwa5cnA%ajd;k+3l#umF44l1A#mU$spGSptQ#>U_%4g^RJr%)< zv=^j6%)`e*MPm0pBOjVDzdJtLYREm=atXQ5^?lDaU%;X><}`;7XqRFXsc>l=8s<6p zF9iKIhml{^R2aW}Xy<>X_#|+U_Z^Us_gx&%&DFmOoX2M1$Ar$a;L?QixV5>~)E?+`$w_ufgc(3{jq4N|2>2rVIHulT(0+28Cld(O=H$8mIqwOIFB zcfGFbcOT?L=Y7sy9?_}*1tO*WK2CS3?xPc{$zq>5DC0gp$m`kSq4(czJDjuP6bRhy z5lCkW{(avH%H345E04wv7OLc0KbqL@(GRJv8_Yq=*YyPv7CB``^L1T<6EqIBVNLw> zbmBZnb9qamyOj{^h!GIx0SWB4}jnDAeA7{eI0{c*S$Y9{rSouFDC4C z^j$#dY5iP)3niI>W}5#6_s%GWpmFjw8z@qCQ}C;EMxtYNZQ_bieW7mbz?w|lHEK1>!C|_fX8W^ zQqLI~JBX#BVN%@tkqP~PCalPmbyYTB_W%9qO}`8hH&FgXwyjhl>VVQ30EK7<$?yOM z-1Z=K8*^AV7dGe?0QwH1$FMO{x)6RsD{#RY<-Ib zC1K+UpHSt;=}uhKR~QZgc_qf>1+29?VgDFS4q5e*ne~as{duFjNw8=T=R+zJelZDB(@Xa(C;_Ng8ZfX88+E#*le06ppjnBCz zXe95*Fkk=cB4CDWaj=h`bA5~NID-CsF<#XTS$yy^YL_n4KG~{%tM@T|3TeM0)J?~~ z0vRoYyw4MH-OGLx)ND^OL2f(2g50$bVi0ewjMX5E)QuUqZEUZ810{!p-TC>-Z;X8* z$^yvNT&s|D_439o=@)r!GM_5R9Kh+kNpPvGEIRqx_o({s1kgD=r~dZVLUEp%jUm87 z@l-v3cC5M0ruggCMf?SQP+~RmWRYdQ0L<4!5}Btb;Jly! zymhVhIRt8C_O%%0h}t-=L(doG%DisTx7xlz%jlz+qAz}~r&aw5X1RAnJm?n#C4IY+ z$c6iu444`YRD%OD=+>}2{x$;j7PseM-P_E4w6O5*5w)OOF|}1Urjhz?KsaR z+7yI{!#yXXd|a(AnoKntE#UP~ZxC$bzC}%^7}8}QnI?<>9Rd|!zWKLdWuCS#1sYb; z%#rzZ(Yet)!D1+0*2HoU%gY!XmwV*BP|rd}_J@DH;hfuFweSOEya^uY^2-@eZ>MaO zw}>HoH``{G8%Ooz?X$MhgJy5)E5*4r^TQtQfWBlJQES^ZL0&eJe=V?Af8_TXNOKxu zyQuqQx4`i`ES2lu?$gi0^*gH14hSRZg`-NGoT#T4XBN zM-<)3zj+*;IVg`&Sbg2gOh^iTOg)8LdoNtx-FbNzUGQg)Wq!B|at6oCL@=9EZ)?Na7|$yfCZg4~S#%IL=4-gHh}H@{u6+4oUKC{R69m36@3MX5U!fr%|?0uf#`A2S9m1Bnoeh0U8d97VrV?qx!Lf^)g zI7a3J=TcWk%IT6^TV4_x*NW%AD{mWMeT>UXwsy9PozXczF2+Ok47M~5`Yun9z1B@5 z(x2ZRd@N@IKGh}!?Rd|{FnJp;(am_&>EKwvj<|NFY zuEFGGrG&D@D!eq|c)gLvtI{%VY+)ZNw^cjZuYS!f0hCm++1mjdWy$2?eQSK_X%7D< z8wEDIp#;!KaUKL&|c-K{3s!CnOZ&K#B)f zJ*s+|eXRM>&yelqx@jIbC6Hci3Y1jVI$?@PenF-9E_LtFUT*P&MD?K`LOc}L=Ky-U zb)4`D@K+o2FGlq0k&!gk%kPW?^~z5$t>P}}q$%M3V@=z6$|&nxb9}jFA#3zn zlu&s2E~97`t-#+rT53oy%OQX`V5sGB@nr$dYgpi-jlc!1`0~@(wcH!2s6WTna<{z% zoW00i5g#7~zFvAgXP({f z=clcEwkWGi<_C!yGtD97{b@AGPq^K=!FMIqF>N1ZgANf18V?_<2wE0a-yIp^MPh`A z&lR;oEe=lNCNp!^dIYju&3?DM2TghASC^skJ#rNY{CfR-3(>;RWE#Pquy1y*oIC+NSk3=RTmV#6#z=NUGA_kNXzz7D8(q>0rI{n#ase>=$O5q>_9lrK9Oq$}XgKM&x7WM=S3M-QOs1;cgdsl{6V zd>!PzAklP<(kql?Rv?TOD2+>JG1B#ND(`(_stXDArQ|T_sQq7{nZo9KxabjjJiWP7 z>Gh(Vpk54@Q(V(LErH#r>g#hE4&e%oZ?Tb?cC9haGR7D0Ua>}9{J8h}YkB+TQct`^ z#6h*SVvki(3kJ~w0|x4+Bpgu+yWN{RjRA86$EItCtjHs^1Bf^@&_M#ZqkcML*=6l? zAEr#Kx|=)T;Bi(~;Pzdf=rF`i=d~K-q*p9jm&HcDr!njURH97~3`D&%Ln#a-qZR9-Oqr%_xkVB@Brpj&fqr(zrt; z*)7TR*}DnMkKghdc@paZXMfNOWIRD&;h1jcYAuce;pn5_>FK$oU`KQ#2RmrO2G+?P z`f;F2W?Cc;KX<=xAHrf4$7T#;5pijTe`nPj(?2~MoolUz4uU#{I z;_ekIdEWr;SVF!F=|VNDl}{{eC~(e}b-b7-=I1a*FAS55h4*&>{pFD-5ly9jJ%MNQWMlE1WUqAeM+* zCoz;!I;&6%tIwqE;t1Ix8E00mn)~N}*rNU75uNQW47q;IcW&mrS2M|=G1wAgN4u0l zjo#I|FFhxQZ2uVPGv2{{G1QZehWk3RloSWC?`qDwkN(`b*gOzNY%}yk4H~J%m}ET+ z0%1!Zm7YT5SsvS7eZ>iq2ZA1*4d<84&*+%9~btFQ+O6 zH&22NZOzcG`b+o-RXTJIHjPMTg1`I}O5Cu4hnuu8n>Y@Wwk~EJJ=kc7*m8s=x@rB9 zA^ShWv0v-SdI)^sv$rHL<``zZarH0#oB3}-qF0>K^T841vl9t`?W6DW?VL;sEvu#H zyuom|QPWLh>NMg*=I*w|DEVqNe%&-XP_{%)tR7>KXxGXwrzX*Iv*Ci!=#{JwyfTd4 zvzfTHgJ}zcAw=ty#4VA(rP9(pOZLif|P-RSYnvuH!F>iv!nr~byJRS84bLkr7;)e zJFc3sir)LhP7R^^UFFfD_t(c!rtihVdelWH@13eN1?KTRqfO_6kQnY`H;1sQb*qjQ zW6k&Rams z#hI}0^^$d!17yfDF!CZN`R8@tvB&t03CAWjv+dmRcto!;NentS2y%wcV)s5p6z(q^ zl^zy>d24xqbf|mu=LAhYO3=DarKtYITd(COg%0Gm*g- z3r+U3s0z7W(VvBkH(EyqaaJ47KRQI~$*u9$^zf(G@~OV8r6hJWm?aqnGHCg;nHl3x z;TW81Qs?}6SSNaUg7@R&mtuP;{n_cwUAnoU;B9X=G-T)3Y2_nT;d6dgz(MLxJ024w zn3SGRSa>KNS8X-eTZJ3Z+a2!SbTIq0_ilM`C8&LDPOvn(qWOCD2el*hYq&F;4>UF6 zF8nqF{3<$#Handa1(3Jj>ZqY)+YdErV$-jeJ=Ju-Pt2l2SanS3(l-kYrS@acze~69 zXsNpu>r!S$xMJM)NEu36w+|%FxTrLt_Lo;TWa!{F^@E4IEdpKz1#nCD$Hy{j3fgTq ze4h;`F!}Yu2|8j;cG4x5lY#3+1(%gVOypcfUTjHfod-k5WZ%J@P@T>}-Y*ugy#$vy zjrwT~+!S(J*tcn9;{A7GT7X5rl<7o5_}9k6hX#PDqs#ImqGaMm-i!0;0@fG6G)`_X zZA8gSamoaLAJnxT=E!q$nyJ@A2|Fub#Oz{GJ3ac+&S8zIck#u(t&NH4Q(7LRn-H=` zD4sF57hcSK)>l_9MhJ-(+9DEokvajmjp3x+~DW`&o)nuEHNlQ?9JM<<9u7Hzv zvkDW7-m!u$Ck~{!luxdgL|v8Ow~!`x0ti4y>#pHlh#tOtnqU~eI~|*q7u&@!ElBp3 zEmwMp_&q6BV6(jH!JASR+N;sYy1ZbAOU`Om43Jg!Fr3>62E%nj?aUxX04~}8>2@qP z*T^%T)E-vRtdc(Bc`ZixXU8+d=i+tw+G3I1>4WL%v%A*{A^G9HH_pe05lEPY7UbmP zV(u+`gDr4Vf2YaO=5;iW^CEcRgWwml=YdPgYY7lR@U_^eY6pFR7#JoH?Lr<~Pq=K= zBw|9VW4`B+69C;v-3$zNTz*A= zu^;5{$wWo+%8d7r)JSGSJi)qH;f$>ET2@0`R$?srP((g>%f&{b0PZ(cINptUt3Cht zLrDs#=Y(pogYu3g0ju(8r*e>-ZPo zZ8eG}lb}4R*r4-MgN~@JW{C#F`Drn9t%=oX@P;G@-~?$Mij`)7mFRM(n6LbSus%0r zb3f@t+hn>4HG%}cF;09f>Ak+cvVHQP#4E9sA$*B8NzTCl9c{Y(irZvmMc#g7819$} zo4OpUm*S(hT>Oi`t2#hwrj(sn@kLoB6Sd@$uesGe-Z*1JOyNUeuruIa9Z*(KsoiN= zoYu?g@-8uU|M_r-tl)#5p{alh`F`A0UQ?m9UUEnYfw0{~?OY_;suCT^Mk(_WGs1rZ-%k74~~3e^yfJYl5o)P_fa_6cL{M_xd;vw5F#yKBHVqBo`wbn%s3$90aiP$pHKyOJfr00L*$aM8%Qkgq0QJ zv-YgMdNpi=ro=abNZBDLm|uO^i(btPbe8~)+zIwCyDintL0d0z@_IHwI~|Yp-xCXY`4kXvORbE>d-@P<*zl1_gKg~lWU_w*0wwAjU^2~`8$wC!6wCwx!WMo zcEGe94u;69$-S__k0h&GX^F6Vu6-A)Y^N?mnXnvWz)E2S^_$nz_}DXM~%`N6>^U zA3Ah?yoSPSb0~_!or4o=mvlHVxuGZD2)mWpSymJ^bTslvl@nvfC|%V6&++%?HR~v| z0Be;7vfW4BYtiz=z0rYBZ#bq{4Dr6qNAcO~LM5dmXWkFWpo2aq#TOg|?Z#(a-w&>^ z=~k=ux==pDS5yGH2yJz<1k4NVY)=sWCu-{PF+Z@zCc{C;?3?o8w0esx&I;zt$du7!1yhSdw{vR@NcHwkx_WG+5y`>b7lrUcZsW;Src3Mz=! z{qZlka@b|t+2-w{bzW}hg+qxR4_yu==FRHSUTnWTI*MlGvWHb$TJWd2J?0PY=I71C z_)XnMehX`}SlMtgDHHw}|Byh&_~3c3$a$|kp4xBNK()&?i1@s>zfC%zG1c(b-Oo`uI3YprezZ@;LBybIaovs?;(wiZQ*5>Zk&5 zwEoVC>|a$nY_fK6OVf+mE zQ6cpe%sz=bAA>v}aWn}dBb^1B?n4lL`pn%K0FOEW?I)L^54{faH*L!c1boetY2r~9 z9&Ho0|1`{a^?fyqlg%~o%;&}0zJ2CCGG*Xh0 zVz`$VDD~8y{2546DvhCiz-FnTMa3*BKCJj5gzRqTl6Qezu)zU36Q~nNdv=GkfO97f zy=A<`!>xNo5zb1iUI9roEgrle=!e(~j2Jv%|VL?4np*LP%X)>TVW{(G}jLAXm4@Za8 z?#pL+nG`7;G)(&dC&LDN83VVQ_Ig_HG7>G8IV{zxu|rtl1nuz{O_~zF!A} z{K+g!=r@N@*WcHI%Q;t$Oz!ve_?@H-Y@hz|Z3W$ori<(EYl_Y_#C@1!joyzc21B=6 z+RJjP2VQTIN;j;Xv`a}TF8ZY zCB6`cJ2$;Ik(=%!CJQ#V+Ucy9%Pp-)4|HHh)o#QLlDdmjJ8c=*|*vjFSz zmAV=3UZXwh2I!pGtzquu9yUW45V!aGC5CFLLqQ7I)P!Fz3ADDv8;vx00djG?%I8*) zNR+5|e&GGl*v%a&d+by0yM&BCQ8be%1eNaPaRScrn2=R-I3l9}pb+M&s#?>OA6QvRWuxVHiF2{LdXln0=SPRJFx;HYuSrmPID@(-?Lhi(GJ_C;2#tRiY$<$ z?)uwlv(J|fts?Vto_L0Y;8NL|3QfiQwtbo9aYS>if`rtEAjzpP13;~5>J|8e0F<^* zt*?tSv^AC?Jr6BzKe(44ri79p?dPAv0I>@Ir%(3%o4zE8m;qPX_RBbKbb6r*bT^*h zf*-Mcu;2c%`}jn}DI>lzU4)L5&Gxfj8@vl_^T~VN0O&!Ulq0XwE zSe_F$No$r%_p{oamb7rIgOnKZvt|eFm)O*W-l2eoEZ_>kkjj28lk=e@Y?cR6%(*^n z@uLquO7Y-leaT1rdP=8%{GEkY4_{4Qu7u!m*26ouaG-4t9m6bjqnBhXmSZ8i#|7T~ zx8DRM>RLLbKYl<||JQr2o1I$xJZG<^09a#y-o7T?GB#`c(uAg$;rBsS>Fqk{Cs+CC zN3@U+LwdFGFDWILIoap@qwV?xjonVU9!%g0#%LTD6X~=}@53Nc8AbsqlngnGpPj(= zuKu^}>Pr+n)_a*SBA(RZl*c5ZEb#ew@?cGO@*b@Rucj!`*(?jb#7{T*cTm+Z;)Xoj z!2<)RVdCpOC##`9cVcQCvAtSE+ z-lTl3!fv`Mb#a_^la4QfzGQq?(ksWi3GSUf2 zD#t7znk)@J@LH}>`1+fIlHFKeC4`8Zbgm1R*@uAO6*WhR`Nkx57cfj<8ICVPcu~f+ZmmIj>|&MdZs4y&Q|Xh zE`$_NZi%P~tiO8CFxkp)GSlQnumSy`5>y$QRf21(uoRyyrMpRQsq>wrYqEFO~si7`Wz<~6%u-XJRh2Q_(8_DOaFPl zRq-duDa-wA(TnT%g}=B!sBuK=a~m(4q19yzAa_QwKD&K3Ah~!+ zjf0r}Oa-`yIDHVHO%!jg#lFM;QD!9Az*Rz!6*;6*G5gY<0`T`3pIq6u`B+V^@l}ql zddkFlkh*!W-n+m*q#Cx!68@B-@s!Ek&VQ`V{BqY1;W+?vH+Mxb6OIP?K9QQ*kR)zGvDK@Z_?~FW$skmeE;!*IzQ;!>Rb+@^lC+`PBxv1e_uoM{Ql*EEZ34o zP%-bnwm!>j6zqqW!~z)Jv9_~wG-)8YMFm8l^O{>OGIlF*)Ra0Y79Ei21YnnC=s?jX z?aTTq0LUfCn6st;h)_?u_!s~Is5Gp+#!cN&L3y%u=Y2asG6LNk+izmD^>08105;^W z;(bW#WewyOEX6IbQm6E|>K>T2{J%ETVRTlPv3RA=s<$7d^-9J0p~gdk(<~*f18^!x zHnv+Z(lvu}E(fVH1DAg6KYdSOb^;ZSriyqM!0rJEvq|Z3!OSezIe#^Z+`*1)RMpdD z>goGHNd#}HuaMnzOntXPpWh%^q?fQ)ZM)?MjUBAM*6 zkMe~1ejfO{jZ%$=8EbQ3G}2G0Lq&FEW;`RzK<@(}sh#q}%9#wWKNyAa#!U4G!z}@^ z>pI1JMc}&GVLOGXzg_nH*!AMWxt2>mIRL@$$7;X=)xa!kH!PTPm0SlKw6yW3E(IocX4QzZLRFlH3n6b+!Sk3_@k)I31M#zpqp0qAcY)xdM?0 zAfchS6SlI=u+*vqC|}m~D;xd*HcL4cunir%2(>pNkM`LikP46P>vbOPD`Oi25~KO` z_1K?g1qXF)uc1Hdq(a|9i`UiDdB?ii0}A8~*1GHcI7uasR9+S`Kdc*7I^MKpRQRKE z9EiS45s0WStJOPG11x&hbSj_&cvK^>(8tn%u zU}|tzI?%lM-}`J;jJ!_SX9PWEpM3w{`vm-mpZRx=03sW4l5bhcHZ zN&^beQ6J)J{m^bVdYPYCxh0>)>GN54WZ|>BukVvG26nT*z863rKbV1*?v%02f3WAZ z03_`2KX+Ez_I`#^<3{{FLBap)&cF-#_XPhhJ40B^Ej2(QUl#ACpkp|8O0K!Z$#D9X zl$>;d2j_OVr=xsm0m4Gqd)60af7R0Vqf|dYIKzWibg?u(!6^$|X@flbF4zNauMa1v zcj&+=o3a#%a3o;M@qD$s9XOO4G zWsjCEX$dgs2Y~H2Ah77U{&fjs6$6vV9w4>*T_AhIH9g|e5WwTNa^C`)Ps$0lu0QkI z4=AdvN)(#kHbP}^1CW#Do~8HBN0&?5H+)(s#ms9t4M5Of0*N=M){_#aF)$Q0+a1@P z2fsK4x}6_ulDY&n@Ic^J+#`1mU(xymigc(-!n=&7M(8m~c7W2xCIXh$iCw_;tb8<~ z`A1ZR%lGGkD-#vX?q65LRq-v5rkEl;wUF}fx~yQ`6&0;u(f_P_sDC3Atb0>!_f}yT zC?&qMIRh6sgB6d|*}i`|no;(q*hKT&V}jZcig? z6lugiRX2D6`xRQn{ee$Zi5{IM&N5EbSgohSRK44a~DAqQ`Z$)KP|J3F1EE3&wLDOv|M5TO#g>tUxU+1GYZgW>} zoYyQnJfZEj^`C>q>Io_XcL2jaZZKfYuQiEfrCGT2{42P|pQG_ggKZH;l;{49^@nf0 zE|n?=c#YZ=(7jCx96)SE3DZFrjfDx*06%Pf)Ii|etLnU+gaY)WznUIP;5RB7XigXU zQK(W}Zshu@;MURoKkZ5UfJ#T<*&*?T77-N;Ho@cltxwZZeK%Vj=9ZHrc!pl?KeluQ zVjj-_&rT4X+;-y>%7FnTo}}`0+w%FJGvngCQWyTiu|U5sjz9s=AASpv7z*rcke2cz zyqefpXu%8zjDwT^S*iVM3+Uf)#Pfhp1cd{EE*b-khlW=O^h*AZh=@Km5E!_qW}nCB z;tDP9S1>qcc-O;#ikLZH!w=)>ROoh_hf1EN0U(f_3Fkixf<3+vQ*u*yf}*7^sY(g7 zLo_g;3x%NZi5Y{2`8;})7nN$aR1OI)1;I|J*9&yMEB>xNRl$Yj`2l1E*55up6QTU+ zG*dI?eLwg)w;3As_?6_MKA~P8lIQ)g-h=z$WGwcT+m&G{pdU zj7mbN(N;I8c6_TI=9V8uqvr@n5IZkeo!|>#%v=)NV&KF%UewK?A`_i^aaN$mGY zWOq!LP0;JB5?$9P9p``z2-MAtyAak1!O2$&6Kh>ykrUxhDHq;d{@=U!^vuIRa==sm zQoG_to;qGG3d7rpiXHoh<)-Et1b>YBQZL3gj^s~JL~uai0!B?iRF`w#1{Mpb=yDFaw= zHNZ+~;bw|J_eX6<<}WMi#rFz z_^(X@+NVrDH|zEAFIDL&Pf+yO&jMF7={Nmv4tUN&g*y3;?-_SSp3@N8M{efye}^zC zAT6g4`4*oy;P z`B+m|F^K7Y8LvF7#RR&&|IW0l9x@Oa_yM+_gRMr2LPypdGV_uLl_>Xjf%S*U$>U;% zjfAm%*Y~i}(P-bleg$;m>u05X8xrU1w5TDc^*i*olM>}^QSyXtY3-;gX+|Y*-#$|0 zJ-*wI1J*c@sY+7*kHt{HVsa6uPx2>HET#%L&Py8)aw4vLwX(1}nsQk=IEl2&gddu)s4R%cbf4AuS$ZbDbLrC!^rUY@Q*`80i z*w1Nv;BFW7D19Hdmnv3NV`_f0iY+z9oG#aGb$`}$^H2k&DV22qba&y`&%Ca_ph-*p z4v69*_*@W!hcpJKXR6+xxzq8bh3cK@S&B>Z99Q*)Yg+p+J(XBYM&25-^iG6rBu%F@ zU@C1b27S)oCz+a99es^pO0n>pEO$G$6)3e&QalKBLr*e6*MSCpUeJh?*#fs4J#ySKBSI|)b4~{lW=&rN_!+s%|YYCZUpj%8!nUlS8w*;^rx_K zX~Zd+!2I!c%MfCjC7hRboi6jt*jM>Y=Ow7={^xhT*DA|No^h|$@`1|(pN1PV2om|A zqEB639vj67GR|o=-ImgsUk25b&0k8R5*ekXvhv6&K;)ON68B5=#vKEr^ywt z6>|9?!hB7JHD!|3@)qFjJqs@=$JI0)y4dtMm>zT$q*ei}U+~H~>Q5jmD+EkV#}MCO zOv&Q>XqX%2E>`_b*3wmq6X&I*!sVz7caP=>vjt)jv!`-{mkbu<0kiVHN|%DcJLuTc z4!H|gjQ;myi33;h(rL^o-e*;BX)@cedf53xq@#5p35M-8)K4+V3~IGqUo~@rU~Q&d zJuX{%5Tmd-{GyJ&f_rAuuT$85w8yQX*&`jhXT~llB<}4qtJLALgYEu`+5z>F7q_U3zKK!QqiDi& zj?ycnrNYOU1K}kR2@CU9^xT&}s>}~#ha{NTL;F<(*&9fmD^@mgTyN!#Y+!gN?3fM7 zHM4os0Pw{&0tSZ+(04_$`ckf~H|9lGT7j5?OdsB&0o~EMD3LXwv~enz z@F}XcmDDS|g0XOQunzpyEVxIQ~f0+`7YpmSrooYrfiTW+z8G073e^n2!BQ? z7w-n2!~fjEz6amS@uhvl=eA3S?tr2{uiCBKemrn!9h0$N3R8#brix@EL;?80PRL%{rC#v2YXjD`0`9N zt{%1?hn0wHaNW_umJ<(#lv?y$eRG$0&^8VnviNJ0ep~4cn0?xs?uqH2(QXwD+e9-g z!A-^b{zVzd#AB-HhL@_8ep#a%4A!q7CcFU7xb4Xgd80xLIrEitX5;otIA=A4bi?N z(LHhBuB!6+FN$bV5)Nh0YIl86ItXco-+1GgWhGGGJGzVCSXmj`lv}?&5cjr&N#VOl zYmb9jz^;e;TyV1MReF3y(DrMbvI%MKl!1MR4kz^GRhf|S-iF7kXE2Hf@+(D=p&K(a z;YI=sHmAT>Kc&L%anb)Ji=~FSf1Xx8V%w{lUS$EYEPzR!C@JdO&nrQ8E;&qBpe_oI ztOCbm#P|0UjQRQk&ifmxa5^4{Bc{gws*wCyU+02wC|u#P0$OV_;g0UD!!x+oiVTkN z=<~tH)>$&-{n+R_#Z&urvGS^9*j&@f@TmTaQ$}c5_XP*Qr)=?TvnSp1o-*=2Og`Ll zVu>SFl{~ycPhH`Si-3VOJX*sgY^;I1-<{{8~<(9mDLwxs=C;gvFsf3n#M1KDsA-m7o9 zqv1`CedFNNjWk=R^hl+Z`FV>BIUudf`rQ$q3)SDiUiYvGS`r(!aR@D0)CJ#wI_#i@ z6p#TPT=Fn@G5hN{v!-b7FTjiT;gagmD|Pqw>UzBjj~bwOWOhpEb=?1t18Sqw{Ii!D zi#V(qEdWXu+TwkTcZRZ6jV6$_X+*?!9P?jfh?{N?cNIq)D|V5 z`P=sebxsMWg--BBo;7*0^rBG)Q)S_ooawTt!%kF`Ag8%B0WQ||>#NZzfe61!*stde-R;n&hkkw+d%V$g^ub? z*K(w8q```8ksd2qm1!IL{G6I)LW+au+IH-fVw&5JWu$aCmKaHX=5L~rZF}DrSCaJI zFs&+I^H<4}@)!Nti^yitc7kScHhFQE^K!Dv9=*FKq*iZat{MAE`|+g< zY7C-N4d@DjQ1fhKIUM;`#H>7U3qJ&vUF?TBWF9LVrmm)@uHyPPd@&i`E2WrJ$CV81 zU4~ais??4Z7s6uJ>*QY&!cNeIsXV**XyfDTtLvMUrBVhke*M*NxNk( zfQQQoVO(UA6*TaGCAJ7Dr7``D`$C552^y95mnz(~s-o}D37mf`NJUrlqE@4LeBe7> zV+tuV##D)J({fMAE&W+rf?JW!)T314ihB60fI!!?rGGRyaw7W30`eD!@FmJ_{Cs=@ z=`%ca*Sn8CN}ojtaIs~woBf)YGa@x_+$=J3Zr=}*f3DM09n&3Xd0Egx3_binB0HX? zK@lCSbGnx37>$|M&>+ufYczO#l-EJ^z45&I>;(9xg=zyEsNXK-_J;HHjO z{AHhm?>+e&dKOE2?vD{LQNpc%uPDny+!mOt|tz4tZ# zjRNJE!lbD7;i5sRnk>AY2h8Em=?g{TcB@|eZVy|ierq1uJ9gsGlYI=$_G-+N{;M)L z))0ExNzP=n0@roA@A6c26>s`B976St9CHK8D)p2tjhF9tC5O z;+y0(Y;UwkQZ>r8#8t-0!;Ws1u`9$dmi0)!7M@pMeU!fGw%+42h8Ht)P#-B%6*gZ7dbG2 z7dLJZj_yxM?_528b+7enAHKZ*?n8^{>v=97$Ov=BMh(`S`)A$PM4^l7=H95XB-AV0 z2s3PvY2Er)XSqI!2e`Wx@&To5&7(=~Gg$p~N#DAc4fdrUdrvnn*F&!3<=|K}{_bnl$H z0f}j!bfX@=q~Bp(kfAQAX5>&vnwZ(N^gYhx4n7a`T$wdrNk4ae$1Qc9j`vAkTNAGA zO$?iV^jEJUvzq)KWx4u?vQKudgb!To9G&BfeAuMz0_7PG@O+Nw;K-~?9j}QL)XU_X zvfC+8O-4!4(hXPJuQTw!D0qfxDbkM4yzvj??DUG((C{1+T7udWHfYtDa^|wQd*ibG zlMB9X$mw$)kkgEx&ak`R+5B?0H9=Io&b(4HHk-Q&uiAs@vfB?sP(AanB)oGGX$0>_ zz31b#(a)ncpY@YPd31HgnKb5JPwjp+gQD%}rmo*EfLYpl?|N<*y{aXjn@iE?C`R4d ztiJJ?2>Ay+Vq&B3crH{EvDpZltvsz;Q+utgrn^QW4J#BBFdeCD&6S(x*}iat+L=e1 z!x7NDU+WS^}z!bqS(7`uG}-svMp*{m#Kx42i(N#ND-hpO(jg-bWQq4 z8loXpZ0CcXwLyW3L0pfbWgq9Lb^a_SCHag_gzi$b>;Gc4iZD6h?ZJ!0-w;M zb~=P#H&?F~d9t$R#!QX%XN$I%+kF?NTQsuO zRQaKMN2A(2*9^e);&7nygl{NhGG9bt-I57RYwjuZBq_4}u!*?qX zPn-4ETYkLLBW+>la@Z@{?0QwFR@YzsU* zE7~ec^wSKaq;_@bCQFe)VsCBJ%lD{Kd)Dus=v(*~a(}j1{~>0idfz|eNb~1yxMR9w zt%pnRxmQLP8BG-)sBBgGEf5z!Ev%Wn>y)2xv40Sv0z4^~HC-W^@39zN(My`aD&F(L zJ4OjTdJja=ZLE+D@8mx#-DYK+FLICIcVAwP1?F8+Re_s!% zlw#!je}6k*ydmXkw{pU{W0efd2-k&n*`gmJ)NgwzTW>-ETEwsB_KHQSQ^v8nK8tNBxi@4PTm zMzLW<@`xMU@#*jm?OHJ?*3F1m9ulr9S>y>KG?^toXZ zpOH$MAivnJW7y7Xg&Xsyr6$I6A3c~94k`G^!y)P5u-h?WVtL>3K~qXZS{@JzC4Y_i;q3_nuj$u*bF?GrS{M!d|oH z`fSacJ1uk1WlgpNIU(zQHBV)(O8yESJ#u`=UAWe4_p5aberwVze=Yxo{wQKd`A!fD zeg|&ACUs}?YkQxJV}+%vMs4`1*OEIDbufm}vo^nm)-!6{+1=8mrJhXGuFGr%T%LPV zICx`{iQM$D+I`D;*G0fIUEvEgwb=PbXyqMKR>O_-9pfy&UsbAcf4!{~bxu?{e;A{2 zBHgCmMbG;REcS2f-uA8)@ALRYb_H-HGn@vgMgv`;+oM5t1a_`jqx&P7UIlzHkcv(6 zc?=n|w8mU0u4gp0urkpJQT3nv`N1zay_ffaX1uME=msad)}(TX<10P)k(Yy+vZ)8; zB)w~#ttd~_p)GrWc1#WPwR6#FpAKpaZ`PT4Pre(oH`HZiuN-4LzMg0G^SwX)e1AE+ z?mgF3MtIRmdn?*X!;hp^;*M(&lyO4&D%3HRZKg3@fY5lf{^1eINOF+8E?_AR3fa@MaxJ>+LrYiVufq0a&gEO*8 zmlEMzZ@GoOSIqys9D&&mQ?zhVKIG2JL>uYfsd1DsOl51UF`a%>TbjW>+h6mk#$A~w z!A=sViV}y+Dhud{k#@PskdIR&{|5~2N%$}0z^@DmQ?;p29q(_i zfFbDE{d`p#k->>{1*xH{3xTzheHNWc4)4WN@}?>^3JDO@l|I?iSYex*G|1K}(R#W1 z%k@y2u|s`@iH@{wuioL^6-n3&X(C%`eq(_u+$_)?}j_C3caakK0~ce7>4<=ro-` zpHC=Es&$cnRCeRr!@<;s*=NjI4_WV5UMhnmzc(t>)LQN}4F9U-b4Na%kyLMq_K1I7 zrS5^$*P6;K3flCC-f+vpw_b3mlG`u(vX}bL>|mwS=5sgc^@2`&#W@(mfDVfb_j*!t z{*TN<^lbwDeeJ%;qM+6CgptY%_7!HjEpw?FlgdOcv5i%>&zU*Z$yV> z>YAlKs5YY}7n!MBEA(=IW|Q+Pi}UdJqYaycE5IG_^Y!D73|SR3wcGuSV89CJnr}6f zh((s3De`-EYiP!D8kroc-}2?;8vX-A)qy*k zb(v`@PGuzfpNFJ9M%DSV zR3&nC>1Y^Tk>j>5;$gA>{K`PT3Dx(G z;|tVop%dyxg%9X;LPaj|=Ox?`E$gkhYvR-VMN+t~C(fhrNi28Li^@fkO~}Lnx73h% z*}wVMKUBvx>5#%9j@A|P1FscXSe&sR<{5M6_g%ySakSe1Hk(;p#)W*#WDcKu7Tf+9 z=9-^Q{xN6s#N2dzIRXv5=p{L3+am9@q$W$bHvVEXO@eiQX>>dx1K zCP#z6618IGz0<=up%Rw)=E3E%A%q=B!dE$Cm$oM;KR+ zuEqM-z#a3tTC=9*!Y9AJCJiN9O`had*s2W0-IjU{&kFTO81jVEbg#o8@Tma=kktM(Q^ytZD&|IOBTPb# z!}AnKpNr|tHhNwp`0el+Ti=I{COsW!{aoObR45X*%bf3mUs4>cnELT%?dSF^Kh=AQ z#~$ksh0KtMOwN+!cV%~a7o4V~P>t^PB$j{ifU>qRBs@Ekv=&lj5f{ z#!Fh1S|Btxt&tbt*acz!+bOhD{T6bm4u7gcbw24V9(VPlo*xn>xwVOw!QXG1XT@pH zHv5ilnIwwn9U93=@Qg3vYF|6*PjDP65T&5f_T(USn&m!Sw6nj?jr~3{Gt15F zz&d>8&TCJh*j908;|dP`Uuju+_=*8W(|Q?DxA2GRD&f-3Tox^MNIxKX2)czF^>chO z?%VX@f}|w!6#uA^fwX-d5)^RbuR=r@*Pa%#i8&-e9PdQhCqYATw8Wjg#exO;-K@Tu zCxi0&sadD*gpAVs3Vir!?-I}rsBD`V9?ASxTCF1(AK%d%v3RR)3M+e zlaV5s7Bt}(=^F2;xP9+*SxudK{1%@t9DR+MmI_plF?6Qm9~bwJFEO9@f1jdqYxoW_ zHu?G3tFQ22p^*iG>vg$Drn;-9;AIz@D>GlEFJKq?I)9cLJnm1-kEXM^ug@uh1fAiU>4Dqy9fIn#7&fn&#Y$n5fo?9iwS~s~j80;g6=K@2{PCK+}%cBFnU8?m$9~T-l z7#7uG{|ARyf+5`r|+DN1(@anJDm?p=2+{!tgs z`_9?%>}T(@pE38HPUI`ULq7%!-2%{?X-cRGcu!N{$(|`GGFTWnh-^)=u%#MkFfv%v z=4bnQb6X{FIN<=s!^WG%?S5R}nGyCJZNUekmE- zsn`G8mtR6+hRSnU)YispWc}|xDUBtK#yocH?yNP4c{AvkEu6uUapLw-PFCwTuijs) zES2^$InwxpVaqp}n`U{0v#i?XJ*tmCpI(e7OkHV~Ly;Y~Ds0(b#>aGE9$;WVoB<>b zCaI#Fv=dmc7j6s~i4#S*w09B^%a77Y1n`RR^kN-<{VtK`}e9d>PJb@m+jdWfmSYK^an5n&i zFE~nf*(P>0VNl*|b0|7^5EQhBo3DtDo%U&_=>m0@_tGHV=-c8A zASH}c91$R$IMWFSGOV0+R9#Tt5@&}?sp^_v9wMxT!uIm}H3G4Wq!>qcEmidYrLFvA; z-TaqAp6bJqOUkv`m84puR;MFS7oan$51wdA0CLYE zH6$7WCgn@yEmHEYAM%6K&65##2yqoWoW=V{BGrqHk_)N68g9A#2uP#>6YN#F0H4)w zWN0MpO^V{giTvEJ9e1R8_NkxfwyRQ!C>j;36pB!@Vq)s~UB6OvSnPJb+YUMZJ3^Yp zz4ImaWO91kpojWXCX?T{{kq%W7Tku1B6~SyZTl0ues{+r4uRJn?f|OGB}d)kxt1NQ zE*sf(e|79j=j(yBxHF_|C{|tNl8JlOo;A_|VQOUe&Hk#AYJN1xeKSE8!GQm%(B@<9 z-;C0#EqL%i=9Uz5!6<#E6;`NxrWXXns!H6g zkzN+BRiuN8e9;xzv}14eo~G`Z9yP7>4Va%A8(w06`}l3Tc`b|ksD67~&1Sn+jZETy zFnprARwC1b)y)1m+<{rQK5ge!iVkP<)XXN+Zntj1usjcn`~x0p3Ry8#jCK+3x%hoI zsYNdxp($KyNsMGR9!b5uATgb-vB~Pe2d1}zQOUE5?K+;ksT*BbMc9!t#LlM@XxJpr z+Rf3Cy#N3!TdSvH=r~UGZA}_qV0>5#QY;L{jaJdF2GPv4pctv~b~!5@np2hbkjzOO z$Lg~`HCj8kXnQ9`5D3s(H;wuEq6D1vN#p@IRD$ZOHVJv$kC}`CScl@T@Q8WuS#SQ< z8?}M0-}F!;;^uQfdflwWeXh=sb?4_SQC~j<4b)wKZZy8!!zj_TcDtUdyAkmk4lwcN z92VyO+;uXo!cBfjJ2ErWc&pfBhQP#o<7*!9X!QMGXL<}2(-l_!=AN(4q9ta_$LO)@S2qIE;V5A(XJ| z&aKl@n_V+h(K@uIrBg?5qm+>f@{d8pq`$)*huHXcf{;+YhYZ92fYaKKSMhRS%`N}* zD$!3YlYK%fcAlV=U#^%<;4zt6E{pWDb7Z{PPYrA1i(jKvJ7XdoFXu~g182l^OOn5` z5#tA*ymHR1XUu-TH^MS;w^(g1Eh`zba_f`~2UWuiOa_|1_o!+9W|lMUr6I(#y_jlx`u&yY8j?OOB`vJHO)4qSNooMc-l_(UA)f?2Z5rQupPf`*kL z(J6qUyX3C>EtKD06YDu(JGyQE4G6n4M+@IqspXL}3m zEUSl#B!0_ABTp=gAH47uE2{__UN0#Bc(dO6{9dS z64>BE4qJSAL=~fJeTP(&`_T^q!P4Dl{ew4D3#X)%(@CKsH9;MJlB5{%tlmuHYXwUx zBxo10(kHUXy&JR*@@F^88mMm@(El_eFU_sLi$9R3`8zuE-@Y0Ng%7cX{dumi&!@2} zt|-^j;*lakkFCEFK2w{Y)kJgWE0hIWZ9|eqB(+Z}1QX_~ITP(>hYlFW;xJrVb!)j2 zS&Ze4$3|LDTtcR;(8DMFH5M3oHu45b_Wp9e&3~3RoYeT~%TN*s+Lgu-oL!-*`^V>v;Sn z6MU2UmG#2VYyLp4 zZD5#Rt5;8sH{P=}!qCp2h*=m8Qgxw{oZ!jh9St;Z_3K0la+AQfQg(imnZ3Y$h&l|0t1zRZu-I>I|U__aoO=-ZAH9N+&Ud)4^Il&TRv@l5UeFF3s*Av+F;yZRO-8QyZR+iH+hoBWP-J|z+nL^ zegyL_4f=URR_6hxHr4ZRW{)jp&yk1wiN3?w97MJ#O_MdZxfTpG+B@;h|3k(Eq3=f1 zVqywE;ZlGL@j;_Y;EwUG)(asR{nEG~QIQQQ`hble_BkFzOF+z{FS@v3tng#w>kwwl z!9m=?Tk{9Vd{`xv)`!9=DuMglZtg!?F4t)s5bdKM>9DJh-F`w&RuRiRYADQ0_~mE9 zEt``?)?zh+6<6#04&mfA&8YGiXoOKnivkfI9U6vSfL8m+O{23rv)YGE%z>O=O6 zGd{fTPG8$x-F#8xW}0S2#=)_Y?lJch*)nk_^?bA9Zk6TxSj!O)@A2XnvS~Y|5kmeise(<=cU$fWxw985G34m+&vCl|6LQ7|4RK` zdmY8CNI1srEqjHQ8=-R>+BE>V!_Cv4&wU!sI%u`94r#_H{g?M@g{)mTUVx8V%2nj$ zqqlbh=|ZD5CPKr;zm%_yNqHE5=<%&lvc*IB+eLg;s+tG^W5h=wQm-KzvD;bi*Fn);_^5OvqE59jkt}nPpA!j(MP;${<$I z$Oz@D{O>Pc++YSKMfKio4*+YKZV-t~kl`82;`r_b&FQ->;u6KU?l3QpJI%GXuVzH| z*=7%CmBRin(~a9=r*0j5bc*Ou^l$PN8t-Q9-du6#<;y8|?aiJrPCEF|{LB_J^IAGy zXsFxhf3FfalefPi=-y}>G>)Y9sVAwF18wKooBB{^1cOjt(pgM-_-Z;ct>Zd*N%%Ne>!psUj_5 z8Pp_+Z(=fYK$4>!!|@Bc;BcTS48c?t|6El&;(aTN&KTFI7ZMS7S=jBcrr36+Zdd!~@+0kt zbH@HhDGbA_@|&H6k|Kvx8>(pC%nI7@^vp_Hd<1vWi;rBd!jO!!Pm%gy=)RnGYEAFp z!7L?M)GMcml+_GXClF>p^UfZs95>4i$PRks>O1dT{%eg_v87r^-ol%sA2(lC^Gr=F zmc7@8o43@wOSs3;`-l@kIW~*c@VzuusxFKBqHfq4D8=kKWiWdiJz45(NKQOu^@!w| zS#+e$=G$+Pr4mPV<*RfU%c;H|SyWXKB^yUL9f1X3{mZ{ginoPOp6C&1yZJ&Wd3{wg+X5)@SAc7_8p2T-yLvhuTKOlChBqaKe*N|Ap* zl2pP(0Lghu?~eN(8s@-lmY?Zn#^;}LGeFS{^@Y-bUCB=@2@P=7KIQiM{49TLpKM0KJ=(7E&1qq==jmIIh-2d zxZ+U2jPF0X!aV95b;`YF&Kk(5OgjGf4#u)cV_bXXN3_D(FA>`boV*hY#V%dBH^S*Z z|5fT#^m40R!jQBJJ)hnR%X4Evc&`>pAN~%2p1#hPT!PInTNng)bK?atN@ICzE9Kus zCTO>#6uuD1*5t4${VC2y?78S&I+ZbL0LbXL-P>5Zf+Njl9gLWqhqIrm5FP68@86Sk zXOo8|OR6-L@DyfDhkl}XG34f1LN2NeAC}o4U#x1+S%aV1Dg8B7p4{7clh#kln$;8J zm|tPk^1$1Ip!PcqULvlk*~v2*%;LzQnkLOtPgX)4|4>81L3Rt>kZNzYa@XQ&+AP>I zk39I*QpXOdL)92Y9o#T&*w@PPpqf$j*8r7?!==*bm^B=4>|_D{x7SwAv2$v^G1zk` zh1oCvVcV7Fq>&R}(>qH8p;wTNf;;;o!DqR+5s;Bzbtod1MthDFw zufvQd16z{|kia)@;Dbl|(fA~J4a$$5X61A`a&BI7c7Trgv)#O?<45ZTkR?Hv426UZ zvPn?4ILuc4M=51+D_w@sVMh6{;Gm4snoq+#Y9%QvzeIXZa^-)1_TxWVY!Lu#p}((A z{{*-)>m5RK9+LcXsONp>9!{M1lyQWtrnPF*5sM2A#YI8<=4+JXDg}o;_{Cwu>am6S zo%4w1*fL$4RTt@$D_WV&q*^iZ-lP;XeQjp_#%hIvb+XR_+tXSRv-SU+98zc2F!0om zep_oD&Uz@*#wJIU!u=v!zd(#Pvf$5Dj24n zC{l?LvmE+dDH7=V>n2u;iM$mCdx@s45l0t&{=MALYJ!K-F9SkwKL_#-Hj7WVzf@Wx ze&Stl_%v&vq+!@Q(X;I|Y;V2(Mt#G7z^Xp$shL}CkIpd05Fk2l8DQrhI`*ku_tj7! zn)Rs)fG#@PT&V4@pOv?CI%Il0_vn6d!~(+abHY?fafGyCWi=DF+NKpXRic0%NnD(7 zbeALbMmN<8QikjxBR%=Dz*9y0`nXcyWO_*NLyGs*YrFLF68n~ICT^kh<^_MN-^MEu zLf2*iCmOSya1UnV8bY0IFE5xg<8_$t;?1|slRj>>zl&Oi^`bn3FFtGp%Ls1mOvz%4 zPM{5Nt-5w+`!Lvl`WoYGy6Vy$f&xn+RL7`xSv_2osN|ieDfoU8CuIrV3ku;yu8)B( zc4%3k9=X80iPZ!Am41}v>m*Y#;E{u@gDAd7$E4fRoir)lF&X9CV9-lQg_)r8E?QHR zc&Ic`Ks4HahEpMet-qRhC6Qb{`;MQyC^J&8*8URfDIcTj2f=s*B!Y=QMXPvl?CK8~ z=-kL^C?o?meI)@cc+g=+W2R$PQd05m10IzG)B@|EVqkaNjO(ly2cvf-C|vXgj+EHa zgt5S9Da|hdbklEsMD(`K`qVjIKm;4@OMfu%{Es}^d5+*vqhN+htMl}dYdQf9d0GD| zHwl}N5nNm%jCsqup1tA^g(o*MW{DM*>DN*ZdV#8ooBkI7twS)A#jDSiTJitlCKF$W zz~a#+ma^tH!VUwVw@zWI#=GfSUt%BsTcZ+UauI%^HzRE9(q!Sy!%o4>K<|=MhetEZ}#g zv3*$ltn#$5I}%YA%VCxf+r+U|wPVQKW(byVs3o`xeZxNlwgD5bK-5t@hu6iMbuebD z?4lPAvZX)MHpO0IrgEU@?phJVkz$-hwt_4IT~ND>Eu2vdFgJ^+cFj#fm5B6VTPpNfuIyTw`i}~669bU}5 z^LTDjFg~Mojgq} z*N?2-e_#_LfG-RthFP-jP&FBRBQbhuEGs3BnDMeWD?L7E{`7cvcI1gQ?Ibmw1rRSq zLXoz4zxoUbkfS9X5)Iqqz-z0@@d;{{Z&cf?}8bW$x4#vs9z;ST}!ZzI{}Ki6IXS84}KgT#qXI zbh9`zeG(o!xKhYvpMJ=^>%WZ~tS6QY?D!wrL5ChJ@U0}Fy=_A!Dx`XL{B?CD(W^K^ zEd}wFAfXLI)P({s9xg6eU+`PJ_1;4Jb`jH4Mpc+JTjgM1|D+l`khE&&7W`+;stAFA zQ7;n83ZZ&XjN>`RH-Fi(Idr`9FqzdQJ6;*uL@`27Ol*`0W$_#JAFS82$S`8^il5b!DA17h9(FlwFE7949R zh2pu78HZlg$|47h$;;>bs3spD9Hif9!FGMMWW_ibrkcI2~WSry+Y3XuIvNKcKs z3onSJC+EriU!nYo<-?&Ow92=L$t!P)Pv+9)L9jG^&etY1jJh_2u|v<$v}q=Ho!lqh zX_pTu=6&p~vy(o|e;=m369khdKx+=$!p#IRAo6_ zL%;)#gBBTiiE!Dgr$8az=HFQ1*Vo}2Lce&4*p1aGPQA^Vorz+fB1|k)p|i|%-*Zzf zMdl#XYe@98*CD)IS^tK&@?rQ=IWch~hybAdZRGlls2-P@8>E?esQF~j&RN56Vj7-N zH0g2*4ysP+mox((5y>JISUd&%!$#jKSn^Z=wC|)xmcgD8*{ZfPa^h#2y%{T*_Fan+ zHLTWXGUDnW8em|ppWdz&5H__JcwVfC{9EpMUji&m9IA*m;l;-o68t>3>-*05Fa9pQ zTdYvc^G7xLi}Z+Gd?*KwJDl4M>Y_aJwq^$e5X zKj@2j)P#o2hp8X%WZl2_N@}!7g<`hRB|i?_hPL_zbaZTIGM_JJ{za4NMMk-0G@l%; zNMa_~{>X(|Per-y^frU^f7UNaXRgx$dW9L3R@o0WL&`xVbM^6oQt-B!KMwf|rW8J7 zRFF-ug3b4l>KgoAiQ;}XGMJxIc(gb%F-VrpD*W-xUGN=vi-nQF*jlpC%q>rfHctbw zKS}?gQL%*m9-q4C>U2A5{git|wGGHlC_Ad^zilIG%15Z9NlQ&){R&4#6PAb0?3)cc z=1q~keoz+skb#Tx{^>f?(RSM1^l6_T1PZX_SniLDe|N3{@1pT$A3i}GUgks4?EyJp z2v)yZ{xx;c8&M3P3PI$pibI%-Aql%xfpiOAmABy>-81vnLT~!FPw7?)ig$Y2@YjA94FbP15 zRux*+?mdij7ua-%)v;2tg!dE)g@!;KBf$;Y0GG6+EhwY3x^_(y3ksC~wK^F;Ak9`x zffAX9F#{r01|vifJzC3STcpYR(6V{I9j=TX1Y~eZg6?h^_!!x8pRah)k{79J${9l; zMku-0!y8X>soW#ObOJ_qzlZo|Bj5l457i8vOKpw|&FIF;?lhCO$i%C*opcZ0V}b#a zmLnp{1|uI2`Z}{?DSQiYs4L1f?w^-q1qw8{vEp;wu7ARj(J~lftHFVXJ1aq*ufk-> z&6pBjv<}e~emH-8HAYTc3c42RlV8?4mki)&z6@}_{U`nbkuo7mXcdAm!b1@R!coITo4B~$ zZ8Q=59CX-4`#}ri?##fL7-Oz-t3?ut@U~(&cQ|9i;A^1RE31{HcVzF~o(Q-~cWl1L zqa54+siS8i^X?(>L&k?j9l49#bC|;3G{)_Dn7SivjY-+H*XaZuztw%*$bOv-;d_K4 z2md8hua{Q+7*yq`HuRzYgLZlM%NIAL7^=I_T0a~bs+qW8Ax!Udq>j5rLPlnHpN*+q z{GQHWRNK)!nIe17z4=t2u_F*~RL7dzP9zY}N}BIM3gN(%mKA?tB}IwMs=2oG;(-Dt zdGYX8JJkHuA5;oNtnyA3&%-WN#V%pZVgUD(o~fj30MgO4{q%>?6N2!t5^_0j^+%9! z@?djGhZ4zBlRwa$+4~0xf$1z&&)sY&GcZUpGZygD5(X$xSkY4J;)na2@VYUQiwUd7 ztj7HZqPb95pN7)WdKc36?I-TeHKacb0=kpGwyQcEU8BCzXL!+W%7mAB^U1=8p+FS) zDfGby=`Rflb9C6KN*lPO^|v@QlN9IZO~8&9M7?yK$k_4 zJ4U((e*P?cfJ=@BvtMc#QOOkK=@cQs)1@9!A1B_II~%bQeU2p42Mgk4fG*;yGNw<< z8z0VZCVpPnm;Bj~k)_Y9>^aCnc`CRW!_wpVul$y1^z*~g$KfgAYRCf!jIIYjoSks{ zU?zz=Cw!txEns!s2FdN~GhLzq94Gx{ZybiO{V9BBnQVH;`(Tl@1 z)cKbiQ2zJaKYAlt4{vG&dxfU9$XkBDi@#Z0U>$e!AmSzH80T?>!GB+fcSO0_6A)qceu4?+WQ?ClnuWiSEYm~kJ)*(nV=Kq2 zb6$hoUcRLDx{Zp7BBD-o7Oav9boLB`5uJ~uX7uW@ZgI2mxl7Z@dtx`7T*Hq)!I+Pn zrhjvrcOsFC`Zpf@*%J5^%<$Pt_-*euxZqo+lbjTEcVB*7a^gj z$RA;|?^k#qbxfY~+0Tf#7RLG4IWDCA8A>H0oO7Q23?yiFW;hMO$Xwj38q04bw&O)% zCXc%#j6x$Oe}As(F5B-K=GfE;G@Y>iU3P6}?0TV}Ncj&qn)G|%FfYz?@j+S>#0n#L zGZd=Lf*I&29NNWiSv3?b_M|53BeBbO0*P*jIt!;MYopEvOVZ_|53Ni&5Amo2FK7_z z&)s$zaxqjY4GW&>7Uz*P1Ts2R)pDZZ&_^hN-uv$~@fxm6GWShwg&V)2{`gdxypmRqSdDG%ZC22}H+>)r!G3B-yhqg<5a1$e}}dwFY$eI8uPfvam3_66C0` zxnrf4E)hJb5evbJJ72KL&aZ5-w5p}5fz@t?O^%R~rBp=Cn2Hdrp4rAlu zB;H|@@;3DlQXvQO%~9sIW^bG~nFxRJV{#d|CHifD4#!JWc)p_9OQ1@Ac)(7u@m=5! zfreR>ey?{(V`3p-c7&2Rr8>L3cj?RU<8=^NT_nZ-8}VvY%`s{5Oh`<8Jz%vlkSH}v zJ^6?U2b*I}=+zGhU8r7zHWwErD#EbTc!+>DN^Us5PsHQgUV;ec8n1m*-_1-fo88%Z?E-lMyI(oT3qT4qAt{N( zj#K4UHG@AFKTIFoj@q563BjWhmM3P`hJNmyF3|{KZ(K$Zq11xDX9bFe`86;5(k!>f z3b9pyn(g`nB})R#(-w#WbKJFRekNZpK8h;1nLB7|C(Li6+lzsCXHe#BOO}nJF!zpo z2jyvqLc+yRa4C2TGBTcMb$RQsn`W{YVmRfVOlYZ*jk*QlU^gQeF>$B{mi}aF+XN}0 z8;uV7YQ08E#8u9Bt)|SK6MVhr(Tve~thtzR-Bk+$ROqo_ZPr-#JM4d8sXTs(GdBha z)bHf4gi1PZeUGK9Sm1SIyV_V3N4xx7gA<=gJe#mo!ujyu+4?v7gS&gb!G#-cZd)M0 zs9mAYS*BHt$KyDk5=qM8C@to5^eTGqBEp z5TU_z9QP%Afgum=FM)&-G5iDyv}=WBpx>Dncyp!U>+73^-njE+@b5;l83T#YOg;dkZH(UGdi^dL`-SYeR3JVizM;3GeX+UVHog zD@^{dZNI$XpqRj90RY4XSj~3=^nJ%cVa6(B7bnWS;aW;<=t7Agjvxng$Q}X|RXkMJ zKOXtqqtON|wDPL&U&MM5IJ9(5jbsc1_+J826_@AjcDbG`|OEU=S34%8Qb{+BO0c>uSUH&_o ze`WtmU0OTN%aqXSZ0EOjv%Bp|LH7CX99Z1mt%SOHZqDg)3l?H8`fQ?09|Eydt-ITs zkjS_vHUQH3_E-$1a9-hP6O0n;8RufBbyGzh-`>DWotD~Z_GP+h560ERRCLO;BV^8E zAKZIiCd^Rn%y5ln3n>;bW1uTcgIqpLqcLRDv6)GtCa?ri|F+PBXe92VdFS{83qg(K zbX}JZKnmzYfB(eyY)1j1KK%h9b>86bMDSV~<=(3=5@5}dY@~EaA-Gaqe?aWWcIq&GbllxIt*U10Q?~kZ@G*E_u9#!QjA`E- z$PfSdnT~-S_6A{P%V301@>?Ox zm7#_Wj+E*dHm%7U(i68iz~?kTE_=;^V0pmiYQQM=k5bvBP*;O;O?MD33r9_)=EuAz z9hidwutE#>{z7dU{Z;lOd6LrUBKTfT*5lQ-7Jcs27V{_emK9GEo@ps7p&V1?ngw3c zABvWdk&z)w_^6p>rTQE!OEj;9QLrBOuWkjSV%Yrt@>I!Yr8Vu*`TpKajntB3xV49Fg}#O{ z9^C)>!X*GnU<9&IYaO#l+8u!O#Jb*YvOAh%0%?1?s`#tJTw1G}SnqzvovMO@0)rPL z8wiLmbn(|5k^^r}^%(O(p@%pJ3NXt3iUW_yOGbX9CETF2-6ttd1EBM9w4Ee>0@yk- z4Xf3W@<<|!UgY4_B@jI>29@|YkfpRg?`Q;SauMf)n7Xz>cQ@y!^{X2{zTu34@I40h zYpyH#8WJ%mKeuvly#hKk7&Wl|L{Ab2QdWKQheT1|Q5k>u{99<@3jju1bdtIRdg6cE zse?T{eDP@O02L)d0fyn-0W1+ADNH7r19iDMo!%~2J~ZD|#}GJ%9;b3!k5w4dx+ClK z(r5cr`)&?ro+7WU?9utI{~!pUe-3&VUs6+3-NB~B{{DXf0b$G*rU>Br=^vLT~ z5lzGh4op0c;6O_ZfryC<fe@BaMu_v?bHbqmxR?c5v zgQPAtby~e;p7T@*$6kY!H4T3`=)C(%Z=VzrOGpm%gyYdlYo~^%DR0MrCOx{@H5@yngF=PzTV2+oF%Z0j4wwC#m?FZPe!L(K(=B)Jb4C z5lCB8$1yVedic8U4?r!<249{6ms8yze`eC`9{P-qACU;W-@_8a$rVjzDhV5z3k&UkO)fk(ZYKt$^Ie#*R zyvD!|Z1W>GAfq!1ActM!;n1)gb-+Y*c^FVDNVzVb&Ts1-iX>)nr_n1Iq~jF3SVj$K zvRGlrzMKWgjYBAP2t3+UGA6rjMM^*AJ?K5)0yq0=k|`jjRuQeBaSMY@W0lN3DZQ-U zCJKg?eR@lI&z(~RURb1YTdU3}lo=hcnlx)K?Xl@g3(ursd^~10+c7hBQNrW%+B0rm z|D^Pa(L_4)h3%*Qp99^NtQ^~LfHeru)5GcX@1hTg{-w&8QlW8BXM8phcqjI!`$oQ% zmRwp#0v!PrIzX$N)HmQ$VL4zsUv(fKZ-+$q1Dlgpg`MxLk4EbD0VHF`a(l?s4@eA( zE?^C$W$L+-on!67ZagXSHqy?sor4nxUmA}%{V$x!`5ZG=dU3{B2gCRly``3> zr9IbP!zKevnk+P`OhtaDzqHbMjQf50d?{#}!dRG@dxl{6=ttLT7tei7Kn&WGL;rj| z1k&|6|A*VE&?>CN`d=ps#pTib|D28Mm;1B^V?!pn(4VOj(nnjLY`M7k-d*ZnZQegP z^@Up0dw&!NjVqj4a;c?qy%Ti*YuGY%v-BTa!45Uet8W*msi%L6c;wU>Q!y0w60=r9N(MjNgEkj+F3ttx_`kQx1(m zC3xV;s9Zuq!mGs470kmh3t<}m5>&q161CD?4{X+ugCD+mT~Ju~Z`#`^-(l`6!T#ug(w`${~z`iha;^SxE$|$Y8{(CY;{fRSA0iC1V&SO^GVopt0ixl z-u~kwbi`i`gGMMaZq%cqy$waJH9{Fmg#zh(hS1-|(K*sjp|J;OjSdbCn@laouC+&9 z@R%bU%}dA)R5zr+;DbrEIkHZbsR^E?t*V+@aWth++UJ^_A9D|IpYZ=$7xg`{Y2N)h zr|j6>Ey;XN%4!7m*pO{9W_iE$J>7aelgW!lq-mhOx7a3>8F2PnFeYCvW^DCa6kD=R zI}nKe3)H4u1pUJC5lBBzw$t%>F7;R5qtMtgUTAOT+mw5j9x*1b8zNe9G+CfPv>-r7 zN4Lyn_Ok1XdDq($;Lb+u-@0pAn=Cr5vjPUV+4&r13-)orwt{uE#!=3oTYr$9NWe#1 zPc%3!!Q87FS06HKg z#`%g+Z4z~#$!gGdiH>~qj4&1ldlWP~u$?!9;q%iWsEF_OS{%0B-g;i|e^H3vOC-r0 zQu~%^AD6c0-96TwheEx)k6Bfy&@AZ1{8T4XRzQbEW%yY^FbF_HP3Ts+^d&kD`S`l34ae`SsEMw3$eWG)lYx1&`Lt-Gh~$ z-a+(!CHkm~MuHdiGtZSq4KKRxKh#pC(-BHzmH+)p6)JKc8$^(c&qX%~6ZRLe{j$H` z>e9+U@+96j5eLme1EO?!_+Mz}nThhVyjvwQ~{Jwd@ph@GP=xfO;>aWudBBV3;Q z0P5t!@DE@G+fEqr7t#P7HWJ3lXdbY`0jOU(c=S8NK?L}i*oGtb9!FQwj%kkQP|>(m zGSxpkwfzePqE`!DmO;_IqTU?m2!Li0Xx<1{PDkN09HD`KU`5V4^`0`YCW~`@myz7E z@%pv5tzo%AR+#nAPC6d5fKwf1Q&qndI`yh*{6>WGRk>y>yi{tMv zh3(q0D@gZMVxxSgs`TlgyfW!1jViG9j{dw-C^a)>9=q7JtX z)oyS3t9>-j9gPDpMg~L9!_w9ac6_9j5SANZW@k`s7YAeu9R5)GyzT|kP6=jH;Eiv< z2)1c-7`jq<$TuU?qvYg;jj-T_uD7&&n)>VYLf+XBDgwhAOBo@Kgv`v!Dw59bSAeEb z$t!cn!DK)9)F(VXp_uSTL<@fMPYSRc_-QD~nPS~#u|t+TQ5FAXOKh}tV!ZY1(D8_; z??dh%S-i6a4Up_j1rYT%zm7O=NH`x#(9J37Vdtxs9#!Y{uGM)wQjDnN`F(`7Y?muw zd5H!A%0jy%FyMFp*igXpHotS;Q!?iz%&3UX47X^4FulFi0GY`UnF-Jy00LoWJ@BR@ zX0!QGj_9dMBcnYfW)RH(RHl17xB4F-d6|BmaXh#J|MCwAvn7T6wc4u!RUnr0`};HY zekU#*UNSVMCCO~fWZLO!fY_bWON!jImM+IK;1}+y;8XAiB&`#A+eX4+%W^@Z7msLJ z&0XnJt?iDe_fZE>EI~s|66-U3#aXx~KDl`#`Z7-@N;8pJr^Ifu?24 zy8IX!=ZQNGJuM1?M^+s*AH)pJ`?tyB{)?I1&rb>+ ziF+-4zB6&0r>CbYwR*(*S3eeXS`=>E~++!suiD(Lq;;NDa` zPKy~Iuewl|sD1y^#A6PUUY+k(wYV)|V1M^J+YulZhmWAvZBLZGoXLD)3=~h1L;m_S zSy&kW9*^!B73;9iCh_n(S?vx@n$dGIGT1$*L<@ze8D?*WYPZk_UIt#;mN}t~kiG>K zn0EqGyomU0jMEx1b-j|;bM?(bNBU%Jw4B+TX)5UPTUv{H;=s+``QyjY9dBm&{BXaim zkgI;Hi^Up5C*|zKCcq;G#PZp!OCw)*foL6|8UBk{P?zlJa^QI15P z(`G&rXC6G&JOe~|?f8w!lp6wkx2Q6-Kj2J!whUg?IRw1D<$5-S7n1FLIT{4`yCq8n zv%5vT^(TloN&!92?19x%;til2mhMeKaGwStDky`=9Mk8Ih;7|>XLb0FxaxALgvVWH z>ukR(YPE_z+pl6Cxy9jOKTFQYsKBl{`qaZZ@uix4t4j$thJtUnE@7`d03M!+gEvC7DriAIw*k@%*=Z zCK{LSyxjusT_Soa0w_k-ty_P0v}(?6I}S(2#tM~= zhnU)Fd}!YSs2Yrkbq!R6pZ01+m#Jlop8U;^*@8!^raY$^nb~jNW+&&hPf@5|7YF3S zm1*fpcxmf5!oEIQoBmJqDz@cstN!I#lJPr3ajAq;9zJ5qF{Uw@SwD(c1LDVEc=rW4 zMpS8x*e(ChG#-}qzdmHINX&hB+3t<(fE>A{&|gOM#@Oq$B6h%ejjYw%8!X>|9N-6o zyhaYUJ;3|{O6*I<;~&ouRtST!ph5GR-%>^(PDy+MlV1c5njfV&qdG^#?vz25%E>iZWhO>0;9B5#2Xetlq08iJHy_(s5QVh%7u!(Jq!8C@ z09}@cj!p7+jsZX(uOs^S)N{RE0N+di8~nXOH~#%N$)dGKZ#aQ&vO8avgCMBCnlDzP z9B!@w_tZ?Cbvn|A;Iv9hOTXS`HXf|Sh;7x{hHx(Hi~?cOz}4SvATqhq8i08fa7fVv z%Z2_v9NXro$Ty~Dr*(j6AhaxdIl_$yE8(%?fL>u@VHpg6cYZ65KGlhQA01&}?X5mz z;}QjdqK3siW^ZJKupsL^Alnh5g}>x(XJIC|AE|(L(%KfQW_~EyYucm=2rFI5A@kgw zm7(CZ |>fe3Hyp?zz8G2=;WM(!@BK!5SdUW4R$xpt}Ljsy}}qxupD z4-D%bE^z2~mss(&?%to-HnRArsjPjZp{3^kGh9}@OE8Ka?( zI%IKp;DD|PFbmts@r^XSP31S_ur2MbZ#va!0bd?G=hTteesg9-x7~4bmcFR|{E7L0 zQ3nb6qc~GO=S?#QrsH$OnLi~&=Ihl;bYjZXa(#?h#)XR*ouQ@AVNZ?nQZA4txF5S- z4M95hbKjm~v$61wQoVJo0|Y~fn3(a&JFq1{#bV|n1-=p|MJ3VM0j?;0_+4vFfqnr@ z{-vPcsQhEZd?WZ7A;c`~5u%cP>3jA7`tm;1BO!BOmbh|CUVi;?`}@N!0oVZs{{E6C zHY-b&QpoegThWWHzrKJ4p+1y3wS=0kmtxj<6 z%P){gGz^r9-%ozxT_wL?=Lp(jGSG=;X6cDuUv_mv@EmuLgEVhD8FpidM4@W-)&ohz z9x)wv=X8~?Q?p;pBEXIF_3kN z9&ho<;q_SU{j#*+p-R%#8hileC&f=NE6h5wX1_YTdFnjp&@c*G5V+tv@BM#tr~-Y0 zoT$+IrsMrSz(Zs!yiZm&kgf3$P{dLRDkPK+=n8v9cOcbWG@4ozRgG|HkllHL)hQkw z)^W%iFR4EQB{9?j^Fl?qzL|67EGnG;xe{0~3ZM&UK>MBV6#`dVI+$$_@Jkc)DEnWd zL>zjH89F;nlPtUl7x8~qaD+RcmLH6+BU)YYF&g;}eEg9_j#ja1o&9evx>ta&{JY?_ z#B)E1jQD)9U}tjT`IPYD0EyMRy}VHHHiybkDm3lO+x22IX}lPN{~28cCJ<%)G%UEy zx~BQRuJwPzu^@zA&_Gnp-ZOc$VwdD)v=eK}ARo;+!%CPj5z~$kykG&hKfgd5%KqUO z;491sdJ6ZRo&vu~+ld=lsFVz*k>VxUAM46skr503FT7QIr)A!hHpYjHSz;^H2n6C$u3IR6M3PwREqrYYKjW9u)l1TT^>PX@?G_Y(K>VkE$ zzmyHsD=q&ITTcNMW!JQ@0}IQGhZ3mitOg$dmP)H-&R;RR-1PA+unYkH#q?osN);tCI*#baUCCuyV)b-B z6+U_@mHZa`A;w%eYfEl9Z8P4kX7$tD*s@D=ur1)T!@B$OR2@9Mg7E}m%GASEt6YqdeH`gpqkQ~)T`uKFnb>r&l`op4?0NC?yaj9N%9Ft) z9w3ExSqZx2N_SBR2_T)(7|IrgL~hPS1fpG`s4bO1uBC9dBLymnEN02vm?FAt53}6JqgPe+Kw(fPZ|y=IxDOQ{>^@iOzmx2pk6K zMyDcUm_D>Z0 zFIDE0`H_+Y6ZAAf=0M#zzgS_?g)e=>5297CmumP^UCQ{KfpCKV1|4!DH*19tRuJeQ zE&iJ1eKu{+eR*md|A!&-VfCDlZ<;%NwidzFN7P*q53eE0u*Cu9!D=lfAprnKNP)i;ljy@OXjH5@9Md$6SxWe zCdVzCv_;?|wjypZk}!Qe3bqtyw7wEC&ULZ~(#TRExcd%o#HW-`;7_+xlA1=oZ)tX` z{!krMkGc(pOMfU?1rg4Qb{mR^w{ znB}Td-rN7i{4*M&gO|NgR%KXVl^`$@IhVSdbN4;>>$4BZkOTYL!Z+MLJKgDE208D^ zthR9T+Ot1|5rD9Ba_pjprOvGT*AAXu`{9-xb)8(=LfL3MzZb)8BTo4T8o;+?0+RHD zoi9bYXXiV8Q5DOy8B(>}06W_ziF))Ld__;kY~~dy{?8bOX)|wG7eud2>dmt&k;Vt0 z9`R6qmEkw+enasCVb#qfSpKyXNgGA^b3Av^rhxA4yofdl{}Qm!SL?S1_+bJ|(s z_ZqxO((SLF!OpLr!kR!f0a@>SF7WtsUUH&7i`J)PU}?w5kKg_v`k!yo@4e%(SZ6Gr zeZQ$I_8;8<{d4-S0Vv7e{yKU4%v*u?n-qD+&*VH~fOJgp%S|OyCrc4h6%iXF&nH`|>rV8H<;npN>3qEV(Ns?~Nd! z4?eqB$R&J|bh96A3rc5b{S?oKoDihyNisc}OL&8M9(;cw^%r4I8)LzDEo6** zBFM?U!LxQmg5$$3od*z|^!)8}1O%)UECbpRk-sJs|M<-2v9NEGfTe>kyk$MR!&A^z zu|T{LnM~H_&(kCxNjh{+HuvwRwXpFN*>828-7S!}NdcBd9kD#a{cF1_+TIscBWO3TJ^9-oKzBuDo6qh~XK2wkeo?Bl% zKv}4PWkd6`j{~4odEB^mA#yS+$9`c%@$6i!*MT=Y;qSY}e4er(;~-Wcc8-|4R9Olk zwd@0sBRS0Wx~e9F#rX}`8F+&SJXCcaox>N2^aCtta^?vByxqBl_~2pVsnA0{5&ZQs zpqnmSQI3Exy)2u{#v4Js?Kk5#XO{lgu8jba#!oYo_zSN&UO!UTwvo9skq`4=!7z}q*twYRJ&&b?6j|L25Zn;`7$n_l=A&TSE|>U3&KMxyhF z3y(np;-B>u#~~xV2qGIqFgNNC;49te1WP4XZm4S1$n-3EoiaP%fXN>@wEo3WZ?XVb zdoQ$hi~Ahb!ngo>^iwXSJ3k8+AGU^~yU%2n4W#$dxdGk~Enq~E5ZhlAxZ!&Nu6Sfe zK8$;ACU7YL+y^V}4rS-jFN5(1&HyDOx= zb~Ob7bN>takM2UkDD!Wi{$eRYSMBaX)MqT5^y`2Abp8OSA<&XS?sw;rA9f5-`Lb6C zzc@As7s`vEw3`iFZSqDyouZC>Ve!T#9r}$T7>CHf)NY3)LWFa& zVuI zyBXdDia~@6vj0k>@=!n;1%*cbe%-$-e|8-#UH*9)u7Iy-&DHszWWLFi5}3R5w5y1; zd*&NEK(kf&7UwoW0%>FhU_AQPu68H~I&5~bBz&uLUIEqFLCVt==JYmvvVmGSPjOY_ zsFnxnh7{$~Z_piS(7fOl02DdLdw3*#wd){9i7%-kbmt^Q3NaR)*^CS~FM|H-I2 ziXUEIOs;4c?^FG#%kqPn5oJEmZp`0MyLm0eY%B6h@p<|^zTR2|=82ljV!bm!8+A46 zU|Za*@Had1(ZU7-V#&1RQO|gA^LxrNP7(lKA?;D?TRn9o>|cjO>WN>oF^%iLA)z_>W%pqA~*UA&0~(v>6+Lic#L6#Vle0i zS(^kWS&BkDFMGt*`7=v>b1-&)Gzo?cd-^bkby~v(7Lt5{N4*e)raHF}2$Uytj8-ODT=#~dZPfET1Jo4+?2fTE>Fv>Owc2K`G2NB|r zV2NM`ieacFOG}9<`&d@mOtimKB_+p&89vMJFj6#m6vL848d*B!6@ealAy)CUSv5#J# z5M;YcoY%Bf^hd>O#PN}qlv0jY7TpkBh%q+VnEuRR70E>M=IJ>pKyT2K%7g{GNbvZt z%~~*qZHZYj&>?n~`)-P}=X2;@`OPXwHYy?MKCGhX?OoR=S@5)73xP!WziEd;k${DQv4Yiq)7Edi+mT3*fO*E7?})1fK9Ilq zdksM6ZJhR%MA?|Q{=SdoRLl_hpuSeIKN$V>ZBH7^=&L5KMyn^b`bY7Bd;!h-=fF~z z`?BN!T;I0&_%4=x+6*u%M|1M;>!oW%7sLj)_nbeOc;JmJNIOo>42?(+Y2*s!@8tnO z{h*oSq=DT;F7@bX!3f~qVcC3q5l>M2Fh~i;c)+bVwQ8ByV+ zb?-?`*>AOn9IiMwYy6kCgN4loswY;F5LUYVs60W+><=CFLQ(+#?R_9RAO$E$G6fDV zyORQN^aRN(e=P?bjN?xGi(ua*lkmLp1O1k17ks#{+8tmtsVTiKX0_oDUh%!ab$NA4x0qkUr|{Oj+>;QmHMMBlCW`^f4>F9&O2{_^8M&MskK!;g>7&%Dv%2Pb#?Rh ze%v@D2J0)_+-IzxKfHGa908zIPo-9ph8*V-d?i(6LUGGqw1Kw-swV=rF9Za~_}3%P zDn?-ypw!7|*+R9GWc#N7y+{I(@{z_?VU^C{vt-DM5cp?eKMJMhfCE%tzAj(GIwi&* z(u5;Uv?*8E@0a}U4WG0(92bTAiCV|PIrI@mVK_ml|9^uaGW}6B>l#8`I`N;USHX6p0dL%&)?scFz2gmzG%hA zV{vx^yWc~0!fOW;5WoBBRq3n?$s0|`k+Z@HGCyviL2>h~0N{JAJ{3sy0osBbSfKu@ zJ*}Jno$h~xrB4LOhG`gLr|8XOcCmpXv{hT*TS>o4YKa8HFTKdqQESt?Jd9F;P?LW4 zZs=x9&1vW+c8iV$A?kCcq<|>+gjl?LH03o}KxD7rb8BeEr4KIpDNTK|ud7v5w7?mU z{qNZpLR*9^hP}M|5xqPMyjoZPS^*Yz9mR%Tn5=F8o?;Djm>0UU1d;Gd-gN5)f#&gJ znz7WQ!^(y3*+#91QY!C?u6s=0=wk)h5M=jA_6I8Q+#dkAE%wA%znAS&BxS5YUHOs+ zWg&RQysi=1&{084kgnoHl+#lIlqw{+sR;VbnEv5T0T5a2oE=H_lV`ons!hII`Pn{@ zPuO_)*XY;29x3{hBGRDU%YEpy%~{V}VnM4Zjk<09)faV`F9(x&el_}u6`8wN9Cge% z9#mS?NA;sDllTfr*SHJq?if6oSXqkHssA{}GmfVOuspPODqQWl)=77z$wXBas8+wy zoYq2MDL_r=GWr}&?khDqi@`j!3~2KF8(86ZBu%y-GVs78xfecL=GlKoGJXjo&z1_@g@AIl^y`O(bLj4FA>%jfzwcF#&%`bZH^3;Xu%1z)Y4%CyR)Hq5$ zXQsy15P2ZU+aTQhFyc_L;eKZ9U-weB>0Ge7uwUs(ZxVQ5f9oYQY~ksHS2@*zZ(*kE zvCj<1YsjLOK*d5_gG2Lz)u0bgkq7&Zxwug@)A!O%cNQlt@b;v2db&$#`qL#`$l6}2 z;`*2nWP24N(i-f+y&f}2QFE58hDddJN!yp`cNP7?fKJ7&D!(DERyw`5a~HS;BA28PL?hpd~5M@7^)W^b)ieALm(><7g~6?>0&Oi1Kt-_L!?he zV17@9lp#rM%vK2cC<}3%p?@;Y;lOrxd*;nTN>JjIr$LG3;QfWap~O190*(wcAME(H{5iJ#+cCfJ zLnQ}4Tm|t6y6Hp+o0v~M-}v?`{1xXiESM+p&tr2(lPg#a_>V?)Bi+(ao%~0_+3RjV zc4?`G2}hnc6&8#@v2=Tjk+~u0^oXpYwcbE735VU%E4)xdIipKqPt0fb&hjHL4mJRZ z(W%h(!j)YEG1f;##I9Bi6+6?ANK%?%#~3NFE9k=|oCRUERG$N`)xtM@(l};!x4Dgi zw0$kGRiwbZ7>1K?yUD6q4TShA^tF?xG!g|In^?Yb5-!5L8-lW)@%x#|{b+y9bZ8Ly z|Az@u026H8J4PNIEB+ZYaXF#TB54=Ikk_+S3J@-K!ny-))Fnkz=yQ@B%}hZY1O5nb zSPf|YsCID*bL_Cve>ajA98kYLae6i=N23{I?-tn(ag6NEU`n>54H%?WBJ~zIy&?&; zwL`!i$?oD6btfUkd24_VUWsobZgX*28uH=*R<%y(huO86)X5wt?O1tR_~b@Y zue&K%Fyw&1ua?#X5&C4ObnSY&z3q76oFr0pK;<7J+0pB{F+Nc3V16X3&melX@R%OO zvC0_Cu@+zEF;)(ZWLp|)DLGm_Ov~tMJrcc9#`eQ3>Pmw_h1YSh^0*N~*Z#+6B4B+$ z(>3c!wy{M|W-?Zd@EYbsHkIOMdt_SY3p*JFOnhydH{*lYXm-T9AE${$q z{G)5xnQk$NohcAzS=RX?X7fIv>&;9>CbYr15|7O~`x}x`lUa=ZIDmiT#7)Kf%dR-8?Y9ZTdq`pv)Eu!kZ>+;Aey`;oo?NU* z>Cb|(443cG2YIic+j=<(@h>_bT-7n`&^(Ep-<>p5d%k_x5k3Knyw{EWpDG8)1DCtg zLEr%vNb46|F$Ll;{maY`H_)_L`SjBiK6dcJPE1U}XR&Oz6agpCC(r6ZF_PeI?1W>D zezIOvQZ}tYwrv(|vPqo3E?^nDo&v-_+|Es=VZ=DCN5FM?J0_=i{cEs6^8cj8+cQz7o!G!} z+>SWpU12vCt4e(pEK4Il>=py-`k6E$5l1XYvKPw-*P^=Q(z5ID{!{Y_>Yi9l>Q(5o zj@3fb{fTBavQZ&EZNRQm5phQ20`4l4__u7(7L zE}NSRK{PP8O5135gA>gP_Z?dnmP3x&x#ydEH}a#`K3pB@{_?IPnUY0!(rxVF4m5h_ zqr{2Gj~K=NFSKsE?V*dw0L&tFcyHQxkxx8q?KKuUG0t~}1vd8;xSPFSeOjXyHz~wm z0e515c&~HyY4KBXeKH~U2V$0&WAe@@tHAZN9uMFJUwhfXcaVp}p$3J?7FP~lZUGjsH&WQKF;{O)L`~e4$ujSr-Q}VF~zCl0=pY~zze$p}^6^agT zq`;1JFr#<3R?-*yO*)hF;>t7H)^?@W?@c_jq3|H#r&yDuU;3c*=PK&$oplP02g`I}M^*s@B)$7$F%#adfX#xP z1VNKp_~8n?X!V5XM`$o6h2t}T>lmB_=rh=S?2XJ(iTPLDcJvU`3m2Hd(8|evR36oC zgviQXep3n}aSIU8z9zdcvQdmmG!E)gzvg8Mvt^+3f<`m(iMxD*OPt-)%5NVgGEm0! z)X~aS28JWXp{;|VlROVCX}sQ*)gi@2Hb2*+Mva*kBoeJX-w3j2) z=7qae^$RbXwD8Wck85ygdftReJnG6m>J||)AoLNGD_;nd$)M!SDNX zbM#ND8rP0a)XhJ>W9el-uM3$6kC; zMD+X1?4d0ySh)@7T9R9Fo#i}-CYEQ9DI6rRAfRq@Z_6Sla_XzahZtYAN_5Lh2`}v1>=U%bG_nTu^u=Hy zku}f&Y@`70<%Ar}SE+C+kI2`h-Yuv>9ghr<8iWO_G6#+)56&^m1Xoy7M^oqxjy;T8 zt)tKAQZ>G{Qmy`ca#Bp5_~R8$I6|W@slwQcxS;PFo=T$HoiirEMnRu++#K{IcI*#Q z7PU8VGQ`Jqwdoc&eRjz0pwA0vU$Wwaor2;U0E#d4B#5LK*r)nlS29=A9y{~?tqDoxM z(NPhtioyz&+^YH3QWl%j&C1BijH`h+$(T6m9pCiKRV*hGOHZgOIA-6hmxd3OoAiMA zvp;_}a@z~A{ffz;n#4rsxgvV1_|nDK5Y)uczE_0RFb1kQUW5ETV1c9nIj{Z4i z!%U+MLh>+P{{G^S>cH%p@47^^GXU3V@*g^$xWTJa9(%GG9W_%tF&Z+qW`#+G3^we1 ziujHZgK^ui@=t_BcG=38S_Oaynm(U3q9+kD2uqjmGPL?}^>}t7*v!SfSN8`xFOjs8 z_$YlAW1WynSocNjWaucuE?572_ypUX-S9*?X%wjFLHjM}MMLrdzck>~DMovCg*Sm% z*jeB2|4`+J3=l*2TU$&!a37#X8lBf;h12)ho1a~AQ!DJkiPp2SP{pxyEfu*eSXW@` zk7uqC;x&40{g(THqrLQ0$L*(rTb3PCqAa?{C`Dr&N1?>21V*x4^#|?k@k(@v?xCFr zFrNCC+1w9L#EnJ9{V3Zth{|<}Wyyvlo@K3Z+~VfCbJ-bY&Z+97>!eT7w%#veFYs!d z)=VSYu#g;6$6L4YdZmCDWIYfzx}e`>HdUaKHi7YIBI%0CkoM!e90l3-h)kMcI!BEv_(t3^2*Jcneu3MBuJgk20gRiTQsGvlBOrP z&8jS)+gQ8TBEB!N^7v^n)G;TEU+(KWA71jyb?w(QqK53|4~Q}*2tP_BWo-?HzS^%D z%4$ELXwimMx?9%exh&}iDYt^vsgkOv`x|bo46Thwt+06b-lMe?*Q2F6Ir544o?NKM zY^pLJ_Dy9m{bPns=|ZZ;z4qvT?+5p$Y2dI!N-Jkr)gFsCT7Jq9~>qFLUSoo zyRnWFPdt=D8}If_MPg@vHy@siR~@iCX}_EU^MADI$?JvoD%nbPW9xe5i8*Q%lylD4 zXA~swjD`ghM^aJ?Xd$xoql0j#z@{%WDCZIIaO-dH9o(mKgr%*Wrtoqc4)MR$MB(T2 z8E-cEmmJmFnzoE1)2-(1M`}HCGv0}OR4=XIrag}N`CRz!z~UkupM`KtLmvfheZ1(7 z-%lseK^1b#Z!Bd6LyH9bJBSyrHG7)s<&!->;RJNIB?YheM#szAcULRL5!Zjcc5sRO zh4uArj7&SPRhSjKRsLwzTMPCNv&o(j1~v^}mtu3s2SxTT^RFtbC0Jl>9q^g8)-2{B zuc%|$1lzR83}kkt?~U=7ILrv8$&)o!Qh9-Y@RCU3-AgtIJJt@3fakIKpTr)e(9dd^rx|2I9wih9mUE9fOLK zLz-7Pn_H+yQ9$-f@v45Mg6CApV^%ZG=scbB4Esa@pUKbsiNt(p`q8(-I&Rw>0z)M_ zWui<)d7Wq37TzOvzU+#?O2r9H1$b7<~g)%VJQp} zet(bHw$^r0LEElNJ;X;n+gW?mSM6vb!_E0Q{7E@YBBtF57piB2Ik-Erxn?D2_k8tf z%-bufQ{lc>Z0_VT*Mot$k&1pR_dYI*A9El%?d;g!DwOuPXZucyw`$piS6}O(N(B3BET)nAf+uUH*Ucq@nuRc~b zFu4eQ->;TxpCRjGibkua3_JB}8N1miMp%!hppxo)ueqP9-)qcp$|W4ZLPbTnrMzT5 zjOXc%`Y{}O<7@DxNidPy?!5(eQk{+Z)lDgOx@^;G3&}OP+z-aL+~PRgRRF>gldjXaTndxk3_Z2G_S( z#@%t2uLfR5d5J&)%raNY_ow2|vw9wyCbS_kXoR^anpM=3oh@JH@+=Q9Tn#*BKpUyD z6Y9lSh|J2g31`M<(|HF$^$hW!tt5DT;I4gXSFJk&pV5r=R9Yo$XD~8)NhDZzvtI#PlQWViison@!c|AEYI@@NRK6rKCN1hzedhDN2n|Jn3 zO6c%CcUH4q!a2HvofV8b#YFU7m?SSw(+*K=t#6a8A?&0ZOv5<>B(aj`_rKokLe?2Y zl;7Ad>u*Os>&$)IJKteC0(aK(e3a5OGHCoQdQ8H-bkNOp{tbq0%|G74eq}=Cr0l_a zqlD%G9!>{@dSW}$4d}kvcLq=C?*Qcz)E&`h7v)JLc&)W56Npb!z`{tp8b~m3a}k)p z{fPP@s^Fvn_}P>3(?^Nr#%D`U_`n}#?#)>2m@5;d>h`a=cf7M9TFIq6T5fV+gX6BC z>mIpL%%h$Wmss8!(bEy-RpI@mbW&T4&|;pfYcI-er&j8`3o5Aka!o{=T$0N{X3!>;y*4yCBmR;wjw8%AD85A$?O(Y-@=*h|=SHKGTUkWyxH1-HJ#wDbvmE zRHmq4puw-?(GRU#&v#LL`4VI==n(BMjZL@59=wMhJo?_#B6Ac3l~D)`QK@^LYL&2A zbKPq@vi{-5#Li@3#yUPTr72aJb8dkvLfN=}W?)DTDD!2yEJ56g<`lWtp2&0sKIfU^ z3`5uVbJ4mXACVn6dK#O>@H{j4xl^x)DQZQ7dDL#?L2ZuRt-XxR#gAMJ7vIg7Y{2Rz z;nK|g)zdHv6)Cbdilf=EsJRye7)yJ%@xs)1q>+q(6!^c~2$uQ7azOQI02=-8~G zdNk}%U|HKi`9~RLW=)frI=irwLkPcuPOytmwoTRR*-y8%?dKqJk>5*2!t++G9QB<<|q>3Nnq-ZkW$>nKk zF#U<*Bm#m`drO@F4Rtub7s53uL(_5+H(BN@tNN`mCI7MG-F!5M3Xp>PO~NMn(&8;H zC6qXd_3{pl&>Wlke53i4NUZbn*C@kIkvil8r$}@p@uX>t=S{{{(I!uLfw}|rY>!6HDSBln}X#I$_lcUa(hg|Pba)p$bO7sBB z){0y=m1AdW<&n_M$S0(!O_Pp&`q3y(A!Asz*L}g0CCG+;zN7jP0C`gDrG*Lp?0+4X$X?9myZrs+@VRyoxBW2m#N1 zBO_K;l9ngookY+TPo>#j90))NBqVk<-Rav?(TEgMvhs}jaL@+xlHgo@tN{H@t56cp&0n+5BR8EzL)3i<(XWlVug!U#Nol{ zb(Z5n%GV2ChZ&}{C?}L{3mEnBvQ_H74PpSRk zgOdIHA@+F~pHm0VY4 zo*!w^iD9!XU53X=fAO9*ZS#H!5IKLyIlYs1t$b+taE=Ev6>D=6ysY6pT6E%_vTJp4 z@@~tFm_i@pJW}oA)8hi4jP6LiSje+r9IN$U6K90WvBY#h@}g~60DQM0x|iibiQ1r9 zC!A~XMe6E$WXF5fu5~Ip#}H9Et_EieuQlFGX|O5!?Wyen#aY*SzY_*mDBC{O$TN2H z;LO?8aMMuX+q%|Ry77w!R|p)2>bRA8>kvYZiVz;!X&oO_s-3JyNzuh08uLgXp+Wdz$X-|@s z;M%*E%{Is}br=Osef*^GQ$*4$dqW)*Q}WdAGr5g|ropJRZ!(Vg6tF&KHLmf)V=0E+ z!WO~&Yiedlp8Sw|NO-6(LivpG^3+NV#9W)dD6{fv%pfPBxgqof?CmXg%35tipM*N| zCB9Z`K*a^`-q5DS!Vc#&Y@mP%-yyqid0<@8>arYFp+OO0jbokSe^HC)p zg3j%V6ev7`?`)Cnv2DVof!wrC@fm~f?kQTNuINVH-+nLrLp{~hLOE4AV=bsq7S(*^ z!NM9T+Ia#t?~3$*;k;2_Q{U}=(R?-9dV&?WXTH?8xm#`!Z&?gwwmu5NJl7C34ILaz zLak){%%Ww3CtG)6n{~ls_&g3j^5oUV|Fq@|;9@0}A=qF4K9Rxl;VIwDzrmWJl!3 zZw(pdYS=4sxk%@kS7_Ez9krI*NrbBHw1RE@-AD(AHFeV=SY*lGw-u1^ofZ9Ixj21W zkM2wloUD~zedbs*G_1ujgKUp69HQF^XJKguXnam2Y9d4?a}vYJ_3w%dnhd zTDWaIN+ZcfyP5uzrcZuVSS6V32`TzWOW@FR?!r*RJ&8eK zzHeF!{d0Xq1m}zDk4G5B=fh%D9%~ z+g$;dKb99h8Jx7>XV0#$PO<40>HUcu(h7_{Ds5`=dP*-y@%@1&@e@J+0n5)7Cmwej z#zls+X*m)I)p`R;*&j{_Fj!$U&7=n;D5P4t37GX6>Or-l)Q*5GeN3Y;x|Mk>Y}I-ddsM6__zAIZP_$QI9gY1W#fLohSjIc+-{kIj}bUA9opku2xP`h2A;mF5iAdf{<&%NH%Wl;&~OSX0k zXL8E2q>_7Y@rmJ$S&I|4O6G%_oWiz)w{yWv5iheWQr(29$j-+w3}FMtoKf1ntT_os zOf$RVLht57z1rJ=hZlSHnqAG}p3&aZEbss)+;k3P4n(7EWOyIhJ}Lj`Sw#W$F>OFf zQKt7|`h!ZZy2hiyiUtn^kgS&8N>UPf@yX&NUoUYu6X1l(UXQ(PoS6zK>QnVE*ZLr+mhSP@y!y-kSNz2L!wBB|s$>;j2HX zkKniyuGbM|iP4t1B9ND1;=IJbQ=SS#K@Xfdr_e?6?5Yy9m0p|kDMdQ$r47tHi^HVp z0~;58(qP6Xhp%S%qZ+FQVip;*RGHm)I`&lwQIH?{#jloCv;}q~<>Ju-Xjh&(tH{i* zj8~JyQIByAT!U}fkB~*(=P@Q$p_<};Lb+4bsA9XH{h?%D&$`MiFmzOZO|vF|5;437 zxJT@95?-r`juXO_il=rv2vvaCj+GamZz4s4kycS0x|yhyIyMvfaz$ZX%NOti)}il_ z!ts1pIfJKlGD1P++Ip46{1gx#*#>^TToE&5X`|pk(zJ zY4zgMJ6+{mBg>_LD^)z8b>UzpK$c^yO!*yDSE3HMr4j5{@l;-2E2I2gzR^kQtMOuU z_<4@wPi3)rs1N@QBJ4q=C&RT&&8^oyn%b|MC2SiM5s6MUlTW90{nLUj(cp1Qz%^Cj z(L2#&mvlkmauTEO335xfLnAEn$E2NB237L4ALIv`2-Zx;0?=DO=;4YLF)UauKdlrVKbjQP^AQ$+qi@_u zT)5h5hvoKsIZ%HC?ZJu^^9o27zXB*xv)79PgJ9K9t^nv$9N2*Wo7wu!)k#Z_Vt8k> z!E_*v7*Tr9D>o%`-#1ii@~x$9Ckr;>A*w6I**$Kkv?0E@2PKg{<1ajaYHyVg^D-|$ zAYPR_C8keQEmDuEN$hb{eNt4?GA+oP>>feKF5U{9R7dsKni6*R1|;!##9gkHLnOOa zWoC{+al0Kcd|xr_%SkDsS+p6}CPe zGB93FeNmXkYP)Y1!q%|e2!&p>jG2QjCNQ(!&`8bcEBXx8bF*zzLL$e3zMFRgr}7Ik zaZ07+;yyN3GA{be+t2A@xfC^7bvw6o^fj$;#yJ4+!X5c6VttTTM-<{zQ;I`dp$> zBS&}W=`C(++RSpD6*Q)Kj0Aq&m(q^)$7HZ}KT<`ma7GEq$x~Rrj>;)H{`yi<*|!5% zdhS^B<~ADNjZ>+-4&7!hjlR0C0!u8lPWHO?O1K<|V3TvH+7IeBo%eMfiH~ZmeHu7n z=GtJP#HjkYeNzz^fRY8?%&BFq$Gbk0=keC$(U)sK$1Xxq1%2h+A?0<^{k`7JopgNT zw{ZctZhLS`5uHl)!6l7$tbnWq7jhts}<+z zez*IYiY^Kjo;x;Qf?*E*DM+$#wcoOiVB8{VfL&D9G+)Xn@&J|o4y{*gsg7Zt|320% zRsI^0Gqm-grJST(zj}qUT9v9^y_CxfL^qpX8Az=$^mNKXhluKM8#QzZDlR}|uu>L6 zu)eU1e6f?%9~kZk%WdcNI(VCR>!m^VSFw5Y?n0D>#A6DSfM~XU$`B&hm%fH$Cz4_c z8nn9S86rZpXCv$x-v4}TP=yHy+z>_8G+q!po^IuKNKu>*dEI8>4cP z!Mxq_SFk^wT7*UtCD`e5mD{+Lk2VT=Ror$hvS*-tb-SF}+dn3T9{;Wd5aFOWPpMRi7vu@)M&pkJy7Vq34j-KsuMOpA&*e%w?MHp*+1e1k!k{q({c&AT5`5Wc0>? zLjzE6bQ&iG4Xin-k-`VU6%vu{_7?Eb-kbxmdwthZzCBrNe+R@hkq$^Ww(L&Hj2t-X zER|`aBUi&@b-F89iLOND9S|`vBk^(^`+IbV`{R^tRfz_4O6+`ozFNAmbrgn{?2=gK zrLnK&{t@7=j+{E2FVGF1?ye7^Bmne?2HEd3uHh5)64h{twG}CW2BU?slKH++Q{*7~ zC`nC=%*O`evYnrVL*EO^UzmKJhrfnplawx}P^F7&X#BXJ1>$*9v^AVxz8i@C{vDc? z0E1t2s9ilk4NY_P`$qw~DhW>kqssX* zESn`i1w7Fge)-x8vy+yx8${Dz7ukQ%v1wn#`?E~AY`pmS2ew)dX+vtVvWny_=p(w? z(Ns7iV@b+MhUCWBY>%>!m$PLo!6(fS_wg+nb@c)f)=t}DBx{>6y2}2dE7_YuPsBaB zJGoG`%J_$0x9TT(IOQXV3TbY%^Tk12PV_fV&T>|g!c)Vno1%}2$WkapuZ73a=O|Zg z0g=WBw6uLdzKT0m7VS%h?c;Vh*ZvT;n>U1s;NgT@xGU$*?5*rnw+0|GuWh1+Wnlqd z(KxdshD<#>{q@6byEItf3!n&|3j8tQzC0C^hJWCQ^{8|?IXgRDSn`Ke{JB=So_ajw&sZ`IxySe3vyB^-ySKs3IiLLV z7QFW$UoWaQL`Stdtp(zbj0(!KTT^FWv$s4AJVCp%+YO>?zeqhuq;b%a+Fi6}EM#7ohc&)==U2$@WstSab#-|qe)#KXW$#QlYT2iz}D;@D0Ag1n* z8c9+Lcs)8_%@;21TnGh1pZF{Rh4B!CriC$-@(JxW?R7J=1OM3pd191hcBDw4M3X>R zZ~!CTBi0n?M-CdO!?01&K&>jV<>(VuwR|SiTuqD5%kFZ-;+P8YfH&xOo8Mog&W`33 zwikXZql-H^1l-2u3Ig(oBvF*wbZZ*`l5_LXPS~9K;}0C zq)`z_p)jbTV44OQlAhY>rOPpjbu&2vOYG$zu)=Vm0e=ziDpCA-mjsAOh9O(=9+bV_?br)I9xnL_DPARLn#$1GEsG z30So9yoH6N7k<>EJ?Nx~+z?uCE`T@)(%X-iCoeeaFWbb{Smbtcj?s@B>(zNbC&0qK z##DqZ*PI`c>82ce;dw$Ijv1Q!JDA+Zh+ELBuY6*g^;Br5~i%#Nm;WGLbi~MEjwcip~b#t zSJs)auh~TrvK#xFeb6WjW-RYBo#l7Vsq1>*_mAV!RcGe=eeV0Y_xtl{10$VJG@Bqh z%^oe%E{|a%lCp+|C-2fT3J`yDgFaumU z=$|{@;z|fCa1n2~W0G%64M0EWi>J+FMk!GGWsl;Smy93(m~xRgU%b<;mrUF*3o$Gg zW_EbW$Son{@bPfxsw`4J1l(%yPGrZ6qK#DO!8;MQoEM76zux%oW=QlUu*CkR=HNZu ztbfReAjrVzz*|zB6aaeqhD1#kIqVmK_{$U!A#d(|k0Q;3x8NE@PHDL^fFVRSH0jVi zZ&~4cskWo*-B@ofeNoYP{(lZd0b$+&Hw>O<=U2S29Vkvs9YoZ)kECm}$0W71*GNkN z^v=x7rw7J)jN2G&$(=1J*W0sLRZiLt&}pV6Q%>NEyL-H-cn$ultxd6@P{E)B;A{TV zhMc`de2Yr(7LueAA9BFU7n6^)1X_SPUs?%_v;Oo=p5K1pog@*zL}TL6i$@V%cj?^?GBA>|2?%2iueDt8!za9=>-3`u}l@~gy*|e;&EN$Go_~9 zKc98=`@yqozKo+jz?^C~`9h#w)sE8l+&o~9E-4Dx+yMU)!KYE_S;o^~9SKGrd8@5b zAzdNA(<1KQL{q;y_CfAZP z)eQZOq>$p)WZ;)-R{S*?bjhDHp=?H^hauq2~ipj!6AM*fsf?==`BilDc4U+2rZTg@q%mc&~c zkHm3=Ff#D8m?v_RArs{4^=m#D7vx&oEg!rKk=spM2k6ny&-)fQ!mzVENf=T@-(yXH z5HfMTSo%JvqN{d7CHP1k(ltPf+qiC)2_}Xw!_zSYhr>$N%!857u8F^R&@<1~00NL$ zQ66kOaL|H`L33RYASnwaBp89d&y|`T#DLmZgr>A`ZcXfeFh_o<;~juI!I-M|q2kYF-^xLC-AJ?1Q{c+6 zu@k=zEz8N?RE|Bl^FH+5{w+mPZ+6qhlL+QjjqFkhj|U>{1{FLx2hd}%Qh2)9dhtPs z7b!wb`Bz_6a_S1NVnt)4`noR|qr0RSwjN-?3k;n?(=`c2d7=z}Y46_426_MUdrjUD z=rK(8HcTZKbMkIwX+iun3Djq2ZD-U4?`0q@|Ic~lKc(@9f4BlZgodZ<@>7{RB#Rp| zCjP)|&H%H?f7f)GY)NIR$flo9LMUB209tke+=hSMNbtv}wV?F>70y^dlf`%*Tv(a2 zz_GNOi$DTx1{cjAwyX<`O9!~J5Q0q}p9 z-vD(v%Vp|UTqvv>F-V&Bn=oh`D4n|xnvt(b2BD|byWZgll5&J3*Iy~^mvca~dLZ*- zq=-NE>`$Emnx&U~&n2?M=f*M4BvtU(cTKlH&|Az6w#S!#f21WOgO2F*ZRAw^VU2#e zTVKH43Y+dN3DV4zZwG+3yqy3lmyfuR_s5ou$0g#kR?0?Vf&}d@KYf}`dYMv74~o3Z zDJiA}b6vsYPDWUR$tkaZ!Pgh`PyO`yXP$t|;A-)rF_KNlSIz*~pb;{lNjfS3G{vj* zDhYX3xXim7e+2@A7`VmQ{<|*X^QxxW#7X`K;t3q+5d|>#F5xM`<)W~0*=m$h zGL1c@W%MEY+D{VuH`cwYk(?%QF7FV?#7TZ4(v zhjdSB=rLg&__RES;dKYX&9hlGy!X6*(xu3Dph_&MKHy_bt?7X0JxdhZbq+B>aQe$o zO>k}!=ZPPctgH_mh2Liy_u!#0cQ?-uHtyzjK8sAYEmb$Kdkz zA>N(^OI%ztE|5Wygk`U{4MtUs>urjWn93XLKV5m5t3S>XcS=h#AX^_8P(2W5um%h| zsp}X(M*xA{=TvdMu_^}$5vcx^`4_f+g(epMq=-;9bpHE)qYC|Tcb>+8s43_8p|(S~Grbz)YCp>NuSogF<3^Gb#T=W;VvA4(9+6b7jQol$5z_FuVF5bZ z=4>SkJO+Hr3*UEY5re%;Tt@Mq(lMqAMwXZRFVwz4nc>hhPH|8N<|=am8J>Mh9;Efh_b{8I&5Qg6Ntl0l%J%D_sSs-xUL$5fiP z5grxEP5PZZc#_J77D;$!CC+czalRUGh4HL6Zgz`Dr>8qyGe7ae#9dWMTmKtK=YLwa zLX5roJb$OP0C$D>ULL?>s;?*8eEV?!n@Z2129Pq8pl>c^>|gt}M#UHqn5YQ+m^hCn z!mrJrYXarI|N1rm^T1SWFOvqJ<_Gd1$<-&7ILif*L5n0Gt?1z``WuN4&76h2WPUjCE=O^pywsKOsS4GMws~kEVr5DsXSQvzSGeqMI9^ldT9U(9vK~dwo^9zqNo;M z!|p@ka2hcg6Z#3G>&J^JQWIt0ooN#AdjwU)BO1l)$7oZK5qtHy3(Og;$Duyy2gJ`t z_b9@Bi}cIn!zFPe8G*Hcz;FSBDx%`f{mtJ34BA|kO9e*pFA@LkK~~s_=U)w;{SWhW z4U(}VrgM_G2Kw#WU}JfsAj1qc52}ZYYDu&&8A@=QbD1(4}8XSYjcm&A%EJeS4I2YJ)O@@sD*t>QOtK|Rb>;s@p z;{vQU)PJ1&tpna1tb*9S>f%;Qy~{1WgNxrl!1>n~{Po)vLy(HM2+VA4gohZi1Pr*y zpI)A|7Q~8H$YslUz@&0CWHDVL(>#GEsfG2nU26US53%hO{+|PkNg{#WHxa5UIuHQt zcL>9(!ur>qq|ujWwyIt?u&->0Fvuc(h4+3DwAB&i(kj%89B8R^@p!y+i9wb9Ow?1R zS;Uw|4OyNT2$T8VS0#{$OnGDiZYP1q=K!X93_xo+@rS@u4(SGV*qINnvI8Bw`mZ+R zpQcs>obc4U69%quj|3{}b%`sP)}*&jpGgbOI%NPX&7Ir+CrOTA-BB234}t4nS} z69JuZHjmLGsOff(-=Q`%V!Xm;SQ+roWGvYMho5cU7VZSNa@#c(m^lDtjB(R$^V2K`AhBp0E1+Fj9!^F5|b$3j10}8DgF~P6$GH75-ySl<)RbT;? zLuBHKT=l98W>6{i81^}D0=F40@pweisQhARvM^RLAkF@-wQ6Dl_uJvY@d7c)I+c(R zH`@B?Z36T$U)>=Xpb9Hyl_ z0hivwApuLhb+Mudg{udw!bH1ma$c~g`5`T%!e%vKPn%D&DJ=20TPEc?d5(C_4wC;b z0$(4mBMJH^D22F&O#7c1w29t+cF+cL5*z{kbLUAij;oD?gM~ zS_(5&gs~=!%olvd3KXN6{cd9I z&4Ta|<^|+~gg0c?dSmnls%MtBKk$HRES~dG#k5R9u=5@eSb;&s{AYolSioCyVH?{( zu&>5rP+^_~BD*fj=jSm^kE=030wib^=ul(@6u)Qs%k!`PWxLWWymB z{CgB&_w9i)N+1HpTvvzm=_EFqj`uhE`4Lw@7z7@DDmH7m%}b>}RpYwaq|vl^LuY$R z`pa|nfFVs?H8~PMGAYqJfCKb2#rd0n@|2<8gO}p9(sQu!{SY5KP@#atA8VR$!Cp>Uc(hxw3)WJ=bfp(rR2PEfwF|W#3OC9H0{dY2T zkx(VT_L3$;t?9g=I9(6#SK=FHGsU| zSUlizhkGbQVn}SGlN3L)=)COc0teC$sd0>qrDOJJe4A`Hp!)?3g?u5SpjUKsEU^Sb zrMc_l71XgG&z?omX0Ge3J-THp`dTotgt`w!wK}M+9yi+(a*{+_sL^Z3UQ?3KeQo4Y zSF#8_ZSj~_c$({w{@dV_m42;ZOq_sU=w0@G%3M_Nt|VY&;az~qS4aYaEtS2BVdLxW z6OJL-pQSS4Qz+xoH&Tm7hse2Q08-WK1|1m(bks8Es;1zmh14Qs)f%9HXSmQUGAPWo zlm0^?jC157F~D$2YHbS;@elrvaQ^)5Oe44n`@xqCpTIq=d?T5h?$Yh5vFUh0uPKUn zJ+AhASlM-8?91SmnXKARM^bp|7Fo+IV}$Ve@T=g4_nJ50rq3esg*yqIjw3YsqBceL){caHW}qBP8qdtZoJ-Mje|=Y@JRonDwP7Qx7^Lk9KMQfXRoxOqVS z-(Bawjni#VTn>(Qd@})bToy@Dtn~OYc%>i;j`Nv&@X)M~c>1lad)v3;gaq$w`OTTe3b+?7{Zg+8pe zvHD$f$}`NJa>du+-nef&9S{KJaRLpy{Bl`57SgbLxi@A=E3d0=d&tn=y(+0wr)T^$ zEjQ@_`CUqDZ@`_MjN(rvAyM;twNk4ZiB#G6MF7NhMj6Dvv7r0C$^QZK{jEFu zAc4Znj$Q)Y4-r|_T=<`dtrh`=K&=G;OqsYLNMG3O8zI|769&?u{uzT}Q-5fY@g&f2 zOG`_Bmt~DaQRkfO2SG_OS5?o_n)(7puGUg;IYl?7(0~~C#J2sxYzXTW5s~3M)YW)C zBklvjP68l*Ht5jVu=e#sG;9F6@;JZ!IaYlBH|DQCz1%!H1WR8(lz}4%^!h7o^fD=h zz5(k`2JaVkn3~Wk44A(p7kt0t^|wZuJhlqJHN+1nK#y2uM7@@`s&e27Metk*>rZk5 z`TZ`)+vh}n9}O62;SI)7wl8#&A*O!#1LM>yXaV$!_Jd--Tisy$UYs`^d9U7tpCLWE zIpCRtu2GfEP~oXDdr;IPi_@HOI9BDAF%~hz0vd#ty&19~4vdpQzkPeT8W6_bA z&y)|F2P{IdV-+?hrz-NB0p>9Vk=p_IyNv`mCHd;k?>C!lZT{r^${rwAk+ufg+V$#SSyJ3cQ%CkXlN z1d{un9sdl*f?2+~a@7T^$)pZSB)PxIVae#YCDboOTg$;s9k`Y87HYl;O;YbBkE4A} zsik&J*|r1|P+*qxh6}LWZ>P#^kMb5A>bG^-)}Wor%F6S3nc<~%>QG90u;y*-wO;Z4 z{Ylo5WODJMkUUq+;Hg0`;QHnP%{`UD65xWPB25NFM_|A6jYpvFZW$W{0=coURj607 zmg+tgCFzADt$(F6d0fXqM+(6KfE~0HGNxZ?tv(Le8Cvm8U-t6ZFxLDB-ppT_*N+4; zWXY*JMb!TibysqR0#d)_Xn>nd5zV5*9r~m!Bp%j7oeoeL*fe;T?%a~RuZOyVpRLh; z8pStzS2UN+k`9$oZqn#WgDt|mKnAFy%?I{NOq}&hd|cV~ACy0iO7X?7EF#Tv(c(I7 z5v;6&``F9~DefLAf^Bb&YO*lp?^Ry2LG%Vw*2re#3Uv(gaFp+$7^blgu&l>}|C9m2 zT!8KYh|jZ)>*2Bs=Xdp*R;03U!bV^3;{3cYBWHbz^v37^hs*d^u0x)M`eB*k|Fld< zNhF}NdVGqmIqGh|oJz$~Zp3LQnlsH9xiTh)UU^?rs=U?Wn)@5OQ8UFtA{8s`1*H2k zBx_jg4xp-ysoUyT>Ccc2%s|2pwADoK0^%zA`)QpsAQ zYMZlJ@hY)rX|*a8;+lo1T^Ssxd8O0yJ-iSYth#D~nO`bPK58>zIb>Dsn0(DMdf&sH zGwThAoebnor2SOgsH2W6Rs*Z1gXJjDEl4tF*2$a794oWxk=f1jed^T4?0&%&$v zJ$)Zv(KA`%KY&>7`ml*#{Y_}GvHg**83tsFmJ{zB^s@eHO=hXAuUwmpEts) zLgM=(BRIdTXD9LbBL@OqUB^JpZt_}_V!}pq+tKe2$Ar+CAZtbN12$@6hG_cOh*loC zlY)#a0ckBwMJ=#0npg!%P&2vf=Z^5ai^hRgan|ji)BeSqy>irXfCo4k6)Ro<4?^y| zj*p8|^7U;+uM*o4pQ68%x7SqvkCTj~$7pOA%R>9K9UrM>%)?2AANgy@ zJ?%|CbM1ECBMi=A4DnU8eYze5I3}N0JQeZ>Z41}^kv#cyB-<6pUIVko~T_Fc?E4om~L ze5O9*G|8J&E?+0~`T6-nQ-Q_f1b&`>NMG?DNGw0peck#WAuJT;Td1@HR2=R*$^_imIUOWE6)2h$rr|?FRNZmnhVhw&A zZ`0p2j>!97Q-5oY3Mp=QwQd1Lzg&&P>>>IDxzQ`HT+uJy9y(2~OI(Oz94t`CK0^i) z_fv@yo~0$jDWcAIRHM4Dmw;I5905Pz_0u=WWE6uuGKiMP)GuI=G`!gFI!anImHKRh2Kt-rJ^{F4o5 zJM$K(-E-47x}1uXIy@z-UXnyrJ4?Xq?iiDy`UJC!e1q-Z%W6g_9<1c1XIb^6;jJ04 zp;r^b}r0XyP?^RCDPQWIeWjk6b&p`2la|Y+B7@6d;Ln8T$`e!rE^CY(I zP=W49>w%o0fsni@FrI^is1K&546`Ha>>-$@TbC4$Rm}j&M!jmjMf0hA0ds zz~IO`-xSMT5~EtTI1n^5Qo1bn%0Bx1+AO~;(u2fa7FHJ;>W(p~JG^!C+gD>an0ok+ z_v>Q=&Tke4ewfYNvYGm!aP(Faj^oS$gYW9gUGjhP2L+^0pjg6Npyk8Nz-r!{5TQbvRKcex!~&MsL0}O^b$-Wy&sc4uA^Uf4}ripUl${Da(2$X^Wv;l zgZJLDglsqR6YwanLX(dF)O`e8oM51mdULS(l!D4W%FbPSu%TomUHP;-L|4Iu?vs?qOpxAym37pq6|G9Ube;n$?fi~~q ziGaZ`yO%-^1T<#(FAFU?+!T8%^O^jESMLSv!K*~3uya2(n*HB_gACiqt_UIjNMmv5 z-77%=?x_hFTMS6)=ReVm)_O$6Di?CmCJUXjV;Q}Ciz@_VLmFgXBp-+F90tMb5r5;p z|F3A`0T5*{6?p}c0Z=A#z@Bu*5j^qpbDcQ9uE@{B3V14LfepmEcW3GoYb-k$IQT^J zjYY84>*#jF%-Y`}=s!M=m}}n5s}}{vog9!;X`Cm)^{}{p{&In48l?x(2We$?=eHXb z*qmW`m7&knVZIdvw}z6>faB^;#8d6wU1AOd_%$<^u248$Rg+G6k!#gN7Z7apv#md- zPAt@#xj1}ad30VOa@N<)7EDii&=&jQ@_gyqmeeOsAk0l-@)=k!RH=_c8e^g@J1(s9 zfOl{K?H>6y*BPGwCi&pF?h}uACeE3WL*t^XJZY^WaV9C71h|XVmZh0RM~6>^)VUY* z8n-_~t{}85%~Q$1JP5G@x%`eQh3pp^fFdetofG)+AsftUkpnt7#>m`WCXrG3tQ_?{ z#SS#WaM_JWFH#4-dV45l=oe3Qhd5+0Lkl`wY(ItzW&9tX(n`G@>Tw~e#_{v@?@Rd+ zVK%*M1v^={Gv!;wD8Mr_lc=T3O0Wxw6;fLLdm!|Ov_1rY`$}3AtsPkd>XqayQN&8P zzd5mVIDJZC^Si}T3S_>i#x>eW*$V+58r8adt-a(8C8Y66ZR75Tks;fC3q0}NFZQ~o9u7&&g$h`JHY=QV>K8&IJ$>nnkSr1-R~HnjW@7)*kd?v_TXG$I zh(-n|gO{4VC+VblIk(CA=yqtPf+afRB!^WWBv>DiQ)jyk+qc$unjKK|bf#6CT)4Y} z^<`U7du*Ct1~jqn(iwqtSu-cmg94>U#;aFre{s91!0Si&V}{<%=7y zO2|@<%WR;IKPTaIhiYjpp{2T7%Rqcbi|OsP)f}zKQ4evFw^rxI)Nf-PW<*{$`~mCWO9k_1?&IXaDF^ z@Fi*{S~W%yrRZeAn?w3CO)AH78$WKbI(vAge1UbYv~hcq{_sS|mccU*Cu$xB6fRXE=6Zv9ybSxjpm`$EsC!0$;i z+AEB4m&;9A&5%?vV|(06UdtXcR#ICqJI0xV#zTwq6?iw_R+4_0ID{`?dLmqj0VJ9Q)EBxF_6*7O~ScR zF?@D$cUiywl2Xe_)|W47kRdzkF_T9J5o?F|>+SlbH(xN@aY% zVl7fHY(SN7be)prf`)CTTUd8+^%K*%6Z(#*qb<;?G7Bg*)BxUyT^6R{0{ssI&X3T$ z7Z^)+4<=yvzzB4vf$8|*&V0lR2Rh8f7;c>?e1ya$M6NpzRQ&x~O094GTH;aWzUxLt zEW%LlPz(;GvYX~3_^_+fpB#8*k{UbE9eWk>`_6R;G62{i9Y4Th|9GWRs$elVA-Mgk zXjzz@POVE!FaRJLdId8Z7BT5uq)*3*KS-_pnlLu$wHt>Dp!Feq@&}7XcIyqP4m=7E zXLr6Dd9&BVAaxVswWVUCEj#7E+@P`9d~BR%u~mKddzJln@e{I0)>C9G#PQnaO4|Pk zjldseNWfpoZ@dLVi6>b+Wbiu>d?Z_d5t#blC#^iP3ASjE>MxpjkkOoRx?oJXo!@d{ zW-)ARQ)`$Ic4Bb#;q0qUZfGIz72ClgfoRz#YpNwmuLlb_vtJQf{&xfi}>4SCq%AJCF3KdZqe%}1rZuin= z01mFlzCOZjYOipe?orFs-J=-S<5)`MDc8exyD{raPi(HGyScz#2lda~p(}U1~~r z&r&S13H3|!ZQ%Eh_Gi6Dcel(7yTH6!fARa{pjl4+3)&Vi6>AE-ExEBb`0=IRW$V=A zfmy!BIXd&$w1HE?@NcvTZ;Z8CvbUw@xPawBK?H)RgJbzUZIcEJ`ZhoUmve ztP;m{3EPNE5>zR;JlwjQ2(AE%!H~iUm%xR-)f-E^UZtFnuiHm9|N+m~bhWqrS4W3Fdn^JR+Wf zeF@&~p60j9>0DKhOG)rP3hG*h*DCldruN(yk15OzWs5 z+9fmv#Ep5<>TA|%_F<{RytSikPUn(5O~0;I)!3|g3l&c@Jsht-kIl)6x#3X8WBQw| zhS{x_2};qzr~AtigyU?D7lo$<_&TAeuli-UV6ec~h4)SK#x-w7HxkqlhB>jg#(tbO zrROASsmDHXBYw^M$Y^*@gjrmZTi9mtozEzxB!{%~D+fcTaVn?&PkrIrb=-oiMYe(G zvOkJz*TKZzu8*V#uDaX^fPxYDI->e3NB_e7`hOr!FweOD5dta1HO=~XS&mjr?#riU z?`OsczH4lZMHsVZZAvC3aH393aGuoVD_hemSgq*KZ~&WfW_nah^PjMK0EIQjyDYwc zIdMr&%0Y#l>Uzk|S`<3)#07SHCJ9_Qw07opNRt1nL1!ap-A9U}Nfi$icID+fisv@f zEmuF$A9ug{ynuVKu(vcUR&thf-H$S>H9LV2u*~M>S`b}ppPFAcCqKLnlf!3OYZV@z z3U~d?eh2L{1^g}X)gL$xueX->A-mkB_a7&+jHBi}CcCFTzOo>QJE(l^|EQH?d|YW| zm%2U4jF~|dMCM}aiDYjV6gU>0zr#nRe8kwb>gjSMf6CSsEq+`IAFoI;;vhKa2#`jA z(Di&oQ!q`7%(uWNr-`aWA!|6<1zy(&|#{HB|hQ z+@S(@mC02HawqHz%I?B8SRC6jX{AC+7f7e^a&#t$beuK-aI{EqFD5i*QbYshR^57k zm_DUBaEDX%tPmOo%&G+Si|x6jX}zuWIr`w_s#;!D6L0nUwde_CTvqvGPf*3mA;qn^ z&Of)9@Cl)LjB-QYq_z=O*mMeO$!a9{#|{J-<_<@9LijPd)w`!fzs)M7B0Y60;k|+J znq$1uDI8H3`_@KZhzpi42MF+H6Q=}qCFq{ud3Xw~yCuIS^<9)j%D(@JHW$pxR)bRc zQdS#N`ANjRb+3uw>|L5qMzy-Sxa#))OG0nUMqif@16?f^OvfLgeu4JuG(r35DPPf>NpzYo8W8~fDr>dG~akB*H6Sk-7|Y`91znrY)X(FU8>XOOw(vx^cI zidsT^+O)P+bn>|@k-Fyq3N7jcE+OS^fG;IH-Ne-YMBlt9GYAtHjeeQ(};e*2C(k^3GwuJWWErhAh&iTdOpyC^1y3 z%AmO;V2sZwvr^D+)o6GX+I#rkzGr{NXY>%a8jlH62#*Wvp)8SrpoJ9CIabClv-+)v z=o(zVyz;b7el2ev!5jpL%3r@PjQK=EEHOhdND#j+Fy&OQKa4H%!Ce~_!7`cG?|neX zu3N30;h=z(?*S1Nr%)1?6=);Kwt8;Yk9zDIf}yO&n!5i|n1KL&ia6Qp04rCFglQC? zX(Pe)r65r&SRby1^2og6qI~QjZ*rPfbN{{7M3db#{iG_(vbCQ3d<&RVHd@2-;z7+! zKE0hrJrD`-cc7g))EN(I<~G&VWnnFxA z1c%bEQ76Nq5@F_Xn~LT1b?Euv5b&P&p zvI)zhYR+vj+OhHkjNXwpGR-r7HG+D`rYCVyV28qo{)NTvJCoW*=i$Qmz{Er+iyixG zi4SC>x%Hy@bx?Tuley*g<|zt!6d~ofc(>Z-Qo}reG`sfsG@!%1(mef;6hSsYYWs@{ z+UZLgwz5buD+0YVlZZXf9lf^>dIT==G<{m1;pYO}bx$R|`{fYLRXn9Wc)|9IN65a| zB;SgKdFl@=t*>*dB;hkpEhaos=B5ic9u==hq;&1phOb>LLO5yr@uBQ=UT6JLDum#t zZ+eOUHR6(GnRF#=rS^MyBUN!GOcl!G;`^LnCu~ zcQnV?^XcmAdhOB2Pg?36UJ_MJ{_;Szz}mrt>}8iRgZagt)u8=U@$$Zbs`~-hEF_x4 z=gawNu958envOTA<6$kB;V!OSuS?R`RpPhbb#N69EEyvv%MwcL^?L($wp&cfpJl|a z=g_+Hsmh1CU9_(89ib>)TI~rPQ*8}Rh>hnBbM={BmR&bSH)8|Gs411LXRQ`+%mFO3 z$z|{gTV|0Vhr#lx%EL5x(CMj@7}TZuCA)EM1`%BG+8o_|L++A*|A)+y1myXSAO|B2 zhh3VB?p`wJzDs?HH^{6o-}B4O_CxGW>r}g)_$MWHg-)U)nhZP$b(-G1&niZ@D;g9g zf7k9!pNe_b_iO82cORw;qf7e&pKFn;HLBw;{ZTB#>ZGK?D^p^Phfa1BLZ zp?0`lE~cMkof*vjy`Q9uc4umR=kt&}r15H;y8V*)JP5`N@Ppr5M#r2LQG2Q3jFhQ; z1dk^MMMo`Kn=j|yBRx;%(u^;z<1B?1oMJT1IjXI-J9AXWgu3wa?3ww0hH#;-6_K@O zf%&Z8^A;3Hxl`=K;I{tkAIch1uO|mfSzAMTl@DYiRKi~I-OO>Mf)3YpSwmfUq_OA; zk@!sQro&9h99&rU>IeN_lqLGO&*;b!$uhGug|)638{^n?wy#ggPqubeyk(s|m3Pf0 zVSD-E=qSqCM<=t<#JSpX%e10!7}oQ4jT6U)`ZG%@H6OY+D)#8vg7?~WM1osXxql$f z$4>j2A%H0>e4<24xZp)BLSH2sIUIQwg!zx%D%VW*QCQDp?h7`eJ~>ycd+zBJtqVxS ze=aGyP!Ml3aj(BkU2tfUZiw1PmnlrFZDh@6CorNwn+PeJGu);~EZ@QL&E1%ag)P|# zW#w1#(e+M2Yx^6=+Ydb(8b)`fOh0XE6%16%kB0Y1#}%-f2oBjy_o-vHmao~Qdl}$- zq=&iO4Q|c$FHwP0hRAIKd%irIagPrd5U| zQ$|QW&QGS_Vr6^X`MGmEM=eVFYJ(ZycSGF)XabjEH~&MCg)M>X_TE`v*WuIA6**lzwPcTBF&`iq?hckR7(%_p+(`Na+g zJr;`2tw1j!)updwM{$%9(pe&_UJepY`B2!n?)Rg8?ReM5{t?{<>l)}lPV^-IzG&uW zJ6W>Z1yz*>gBGEu6Y;nJS zH7;HgVb{2?rW}85ZX}p{g5cNqxaV?3xIux)3=P6_&+)iUj~#TjbKFgdAmy%fbeJO? z&JveB>{>-?j$835Ye?rzPGiVV!qp?)8;!#s4=`g7OJ|D9`bFs#=Qz{9ty>-O3@T(T zV#ls^!VPkT>~{);CJqR_L2&2O3_h7A3a|n41a8Z6J8G?QUtvAvc!-1TFg?gDF58^k zLhF587p-D4X1G)_&Ieu{_B>1NR#RKHh4y)4tltiVYRO zyq0qyxbkx+(oHl^eYR%(gsUJpsHpy-zx(Y@Myos#TUmaI?u`=&e@2$y@lEieRdC58#pJPT6bDq z8&Z7_nKDT%nmHoRx{QwHhJ0#ZZ4koLN@BHiGzN}YO?am|xS$&3_8#$O@7XvQG@H`) z^3_(NEJ=%yM_cjCrCbmbo&kMWLo#OrZ*7k1Q1VuN`o^a-b{J#3nxRIM_n{j)nVd|N zUUv^)i|Lp8l>}$3H|+I+M@SFCC~$Qk6wncq9LgJ&+3GqBbB(q*TUVDX0uOL6l zbWRl@p|FV-nmevi%@{WMW!*in;Sp}>3$pbxK!{a~j(bM?1i$v8t+8dztmM!w!?#BRlZTje7^Os^$h3j>DqoLjW4qI{pag{r z;-+_rXB>7ZyH^G)I)}k`7d4cJrd33c3RP7RU3ME?aVp3HOkUS+r=BV`f4O=7edEHs zlGC{Md(?OFABDPOXX2 z{e|_8jd?K@5x=>@)X8QVOeRsxkh4v@6H$z8{iRZfkA3344EN zt3O>PTd|a<+#Ve-xAywrg)Q?zbap;SVU<7%TOP|S`9#JS>lSD7Yu-48|f zd|^vxwN{wf@i0wND+i`yQ{9<#Fa<>q3Rv5?V6*j^BjpSXLn<8-Ql{w*<)y`itXMwQ zttJ;)ZoX1yLVq6LYF^7$vFti<$Drcfg|uqqt&TRPRuYk_^7XS!%rHOW0>(IR(*=H& zTG&T-2b0me-z!YL^dnF_<0!Y4tCU!A;rcS4XDDQzdaB*%3O25u;z)f+a{uYT)e?2N zwfigB+g{RxOLtcj(@%~C*^xg3$Id9sEdGlgHTgdA@7^1}zouvzD?@Zw_es~@M2o#Z z>bb@R?@*Jkc!w`8b;diIbF9Wh?Bi?%z00BY)9<;C=3@NXEA>o-hq@?q_!@4jdGBgE zM_C*lCg*$3*k|T1ZdWPR8#?S1U=P2Y9NifFhDX;JU#G<51TgY2vpu`|g_&R>0OV?= z`shy&YpX}mumo@Tj`W)mv&pe#7HHNI!9sWie|HL=D5X@3T{NHm?!~g4#K{t~cI4|| zt!GlAemuWpz2}>tiAXMuwsvd8CKKgfVWjVcIZ21jtNK3ElMOVn=)#ptlz9F0GHd9* z*ZY-*^5Ii%MnOfY!S%K&!`-4LpW+kJMBE&LB=6B+lSqLuRybW0$;A%zYA4 zQM+@a!p&P#)i3o;&RF+^Q(bSR#i3(>U5q7~Wd`qiXQPitg<1E^hH}&4@oZOt8QY3|k1 z>~g}CepCDhg;S=fwXBh2llkio=rnA#IYt~#J7*LYs=|5{KK)!?=%I5vEj{D5mYTSB zQr(S-s)mD1YL3mWzEauV71G-T3^vgR7n8DA?&i7dxnZ zBBRhjcQZ@FK`}&cYNFb(Mpr4S5Y4@Z7NLi(j;Ua#eRExtMjNl^zgtohEq;iou5lQ> zmaof%JDi4qhDayyvIjHr3SanM2VHe3EGeX0%gpFv8c6fi z)anr%e_+8gp6g_PW0wKpc1ZR|CR!A<%vU52X}BDxF4z>7LRYljld{OOF{WH_o8?2w_9-x|{mJ_k+aqH(=8CALFbO$CB0A8!U z4BPKSthsoryCHqX-L#)>u-{brw>Eb>mSrZ zYF7-*@w(H_4AKW3^x<~CbFQP?-w5(Lw7=;!Y9(LQqcDk>haHJWURR)IiOn1n;6S@H z?uj2owv5FVE8xDOJDlb}9opJ?rNwf^T~X3ODQQ(;v}$T_(%Z(F!O+H;%jU`t=h((> zPvP!0E)nrr$Iz4WJ&;FCOGxY-{-Uy7&G=nd90W2u*E8AXPu0e=ehIFw9i+Yvt=v)>G>=sHXpjP-MgzS_e= zaWPeX8O0j6@7uKiKw8_E9i#h^aj@?1{3g;Bvecx!apiFn6*iXZO#~jhvDJ}b^j4`Q zW0n%AmBy=9*jH;~rk=!P-zyji9E9&kUlA&*8PjrTxz28}V>RZ|MFnxK%PET3p$J6_ z7=d~uyQhsFqZfMhsCcmM3-{=3{tb!lq!Q67p#_Wq&&yAd%~^TS_iauXyQUa64EcWfp3607YmPEL~VIhGZH0hGkisl@8dnsI)wgvv59;(dJnCBZ8N!Gq$NzOhfoT zk#Zh%DO3?lw}CB;Jj^u9%yJ6RKIqscalV0}$d@J<++m7aJD-JQjf1A$nmT(iZR1mn z*1_9X+l$^uUz9G1ODoMg{@NaAih7n`-r(p`sBS8BXo&8DNNF#ZL1k6P1R(d* z0M_c@HB#8#VViHyt{~RRPuM)w_jndg$jB1?l)z!te%o0`J)u*?fuqZWb!j9gsaa$$ z$Jo~_uDTR1WmPsj<&px|Lu>cM8#y6_xARxFl^?}>r#m-sow}}Ap&F9UsIuZwDd>54 zH`6FLNGOmsYAxMYP*{jbdi26JMzCu!PMn`t)&vuG6kC3hMG&W#d07uvJHUT?*jPbl z>R?m7bhc!UutG^}S|WV+;@$?B(I$zhGUX3fM8vyz`C7%(@!P|3jy@v1uO(I07{9$F zn${k+3R}T~JemgB73Z&|969}Sui!I{<$8Le<<5j}lw;BOs{VUS%nu6Hj8v*UKOW}m zy4J;O=e#Wgqt>1h;`O;4=Q?T6ZdU_Qapld80)aR5{p(55uU z97t1qKhYIM=oW{x?x(JFN#42sb9?tGXby#K_{;!xlxtm0@T6JH+T)_v=&_jCnus|T z_+G{+kJwmyGwst#E?WiI7(LZ8FRT;3nlwDno%Zs^4}d8G<+7XRA6Yuab|_qpf>f0d zI@z(p9VJj@4n%<}WpaN_n2i8Vqx*p-nHHzDc2hh;x9h=Lm2G;CE85@N(`8&u^!u<$ zL(MEH0yFx$6K-O~0QkW7wKh*#`ffDX`Vm|+^A^LZlY-esUzeNH`=H~`a+Kxi2-Y2MF~ zcfFQbpTMKn-Js&Xirdg!&ydFm`I^0>d#ek1awHUCJx~RsTO8J_EnDcyuYdb?@QL5M zH#wBXXe{5fqGIlfO;_7Mg3gnw{l(R=z8E~T6jpm6U=pY5w?=b~Fnhk@!eHm&#DupU za@kU{W_Nv+sRC|tl<}3qX9*q15(}nEvWoCi$>FKQS-Y~>7jzm&Q*$sCa{bz#daYb5 zNaj?>;f~T*hepQLm6#j=w@Ri@SeA=Ngod5YA#;sD`)$w=gA@6c?}qk~#H@7nT5kGE z^6gkaFY*yn)29vT)EIi1Z7QF0>kfrnOIco=DOTD+E!^?lM zn0E`zO^YEs9xR?`+2BZM`y@#3N&<#iXoYUO9u-k=_<7~fiCMPyr5tD}GmYxzJmOVC zYHDkZrSX7>N|njq;M)AAo_57z{wJ_p%4?KPZS6295oce2EJ9J$u0wBozsoi7B*Xi3 zA66k+Sci0Xe5|k?hiLs>e-PaePS!RMOP2@hB2FGX_I9Ty1+ov`)dH zBP~T8`8;+84|ul@WW4CCZ$N}pi@)E>tJq1veeTB4Kgg3j?wme<@GZpe^@WW0#MH=3 zcjfq)Yr$pChFkq3!`9CZ6UXuf+vX!tje9p>&#dMCPkZMb)#SD`e2Jh4h!H7@lqeQJ ziiM6q=uME4NG~FY1O-GnbTB9iB1mtdAT^0dk)|M_2uhJA2_2#c(g`gfHQx^B-gECc zu)g>E`&;inE^viBd+%rV?3vj!znSqaI<1=^_4E=cRk;7`Gs!NZO3RCNt;*xR7EM8B zW|9R}BO+_{MkO_oV_D`o_e32~^@o-g!0=$?2w7Ab%OhPjA# zW8-Ii3sMqHKAR`CNjetZbL$ZUJrlHGe;AEuMt5tstDAo@kLF9;g|v{Gwg_BVYw=_F zd5AE=NIAv3+)%Ps(y@gb+m4Ca!0H`&Q~PNoMn8HXoZCVr&9+ZGPcGlG%dAx)amMra zz(V6UyE)@%pT3DLbdi+5>+(~McjPgK=*l@R*#h?@2kMy{pLKO~MKP>Dvx1f~p9%#C zsPJlzbDbAP2KP$3el(+H#*mV3bFU{$@sjuB-8lv%c{c2;v9X(fB2*nxUjT$^xF%jK zuDF^+&SGeJLE;ma4Wo`RD*#{nbX@;SJ4DgdnSS@RvqsrI2X9nx6LGU2GQ9U^-j5SD z(qJ}gp_`w7`XzxDgjECx)yBR{G=ysYaCxz7qg}6*K66URqRY|%bHMr=Uq#PNAKCPm z&$-R4N?isc$^ITKo&j4QK!{JZN%Bezj>~eS`!hQHxc#Q_^Wz!L#}D%J&UrWF@!IW$ zh(Yv~dJK@Cc$3KPi5TJ1{a-dr#c^VX&hD(zx&W${K$dR%jIIKHTo~fViiQUT;pgeUw-e`d0(hM?RBi6iSC(EvN9349#cHV$i>cgRs_m>$fBB0825O1 zlPv0+`m?g?I*Dg`mtw3(0NKL5&s?TLCcM^Yrf!ij)GeiFKOMaaS9_J3$<@%Am*(2# z2xfnr{kkD>yfwy}AJi!qE^iKY4F;H|D>4&9nt^d&Y?zznClC~N&fZuc_W3R2xieX} z1W=#+dQ;2#e137^zn}m5s|RpYgV^2He9yhgp&&(;+mJy7m@6l4m+KT|klwowJ)+K$ zV`z%A%3h(UBuGKEZqxa?xm|Pj{_w$v0}B$T8qT9m-9n8uXSt9qPI7Mawwb)N|LD(| z7vPmPZS%f*&h@W^NIH<3%heu;uyd6i3M{@!mIlmmR$Ja37Cn^F28IhFc=27Z+9qx4PVBerT7TS>(r9stzq_r+W9#Xayr9kzWBoWC-nK}czDtVD zPHmI1=d<5YoMqtX{zJOMLer+}OVHkxPi2o)7DJ7*J}wU!ScBYNS%61&s#_$*muGHP z?cKP8ZJvwRQ7gd6Zk=Wdy5Dgr&2Kp*baMGkvVHE?%B>~E7lYgQ8m9ODd6-R#?E=WK z8*#YVRCC8-bPivMPm{p9a|qewzlwchqBLBCtrQQP`xLF0A0D5Z#LsQzdU5igw$tEe zQ%Bmea1>DWuw{JYKnq+z-#VzFw(;L3=@(tgtcC1Vpp%LL|VpJmzYROat*AM`)hS>liN@+}@mwQPAe zk>WZ${AG^sxQhw71F~RFehhHQC?E)_`HmYty21nStw3&=SqZZpTS;u=i|6@j3AwIg zP1&!na+|!j&uE_R*peNOd$3srGCi#ucMHqFjBGRo-S3k!pQqm1&Q%^_ z?4ia>lyNhsKK!+K&@%}pX(_w>Up>A5?JY6^Hl}D#Lnk*HKNt37uG(0H8+=L=9i&1q zJr>LXCUb4=yBE4xg<{!vI>E-aci{fC8n!1lDeD=)6bhz1=s$GPZu8P9Q;wWA!>v~= z*Pi?AG~nPh5JOO2-l_MfW3P+N8g}b!6IUQE|05tQ-lxkEZ<%>p_igM}nt@E0(xFRh z1Hv>HIw7a2-lQS)kP>QpKEX#AmsSt!ralZdbX#);7tYt!dUq-RDgf!3<_b^kTPAeH z7tu+>-MKXvA&iL(kWHv6F|2;BLs2yALsel9|K>)SzL)MFAE|lxNnh8^MjmY)?ZVhX zP}lpKnSRYeI9^FwCC-g0=75nZGE;G9#&04aRJ{8B0U(yuBGB=B zs`*@D83hoAlQ^3~?x!PpR_D&G4`kYKlYBFNWMsLov&LV%wmtJQ{>36PNb!^9Gsr+V{## z0rnM25AoNp8+KGjptp6~B5>(gfYX$_HT*%+6~j81ONV4#Cr$D_2KH!@D$v^%>)H^5=^ zXuCs3FY)wG6QYnOET24R(?!lexgVu#ThZIuR8JIjU`^CFd*_CH$&CPxF)JUZ|5C28 z-?d8Ap(*yRTuDK5&_QD&-P3aFb}cSh_-` z{!e%Q}TKRzzD#sGfKL=No8 znJbY1i`H(sf;z#zAC%7&%;EBjfmzWCs>EJ@_~RtC-}89Zix4F(3DOafT_P6Nv?OV) zSwm^i0b}9`wpHCvDr`ma5JOSuwBv(GwYygwk`fZmwj@gy9mREE{{*r$$Jqw4FV6q= zlW;D02EWZjzpnaJjk+?srDgX<~ZvH7%TkRJS zx;6T`H^_nB&I;DkUOmt@{5$=!fPku;=j?68gWl7HUq)Kx$;GkWm29X)TtvR20P#&A zbqnvg1sKqFs<56wa;S`N=qgkB=G>VM>SL+ng*%Jkz!emfLm8(aGolMSjMrKkUd}#9 zpKbw5*@L8D-a{Vs7CAOot_(RV`-A%R(Y%V;cd_cI(>-nKi}S?5tNKct_eqRH5xnxr z(zGu(JO!N|d%Y(8Hb5|Hocd}|@zCmPEA~M`3eyh#QWp$I?8EAm%4k@q_j7oxM}Gw= zu}(L+uJfYDIT@wS7p$be-}?xl0g#}Y?Yit+-`NkE`wnv33x$p76r_f^j8$tPrIWrl z5i5_kI@bg-{Fvr6UdIHcGE}lDY!t0y*0l$ZD^WL!$bm`Sqj$d=NxVvyy4nl{HVR8VKIdBXby_uWwqj?^H0k0VI^Mg!8o?U-O1;s@ev@lh)u*fM3=^xD|W{lAQFE&V;H;*950SG{E```XU> zfYcS@)gww)L7wzaufqLHgV{LWzjP|z@V$0IQ$9_#uh*PR$X1C6FoK+ zJNNDt&kLV?z9wyn@Mk2n4GdUnU%k5W#vM@1XvB`qrm%AOs;`p`VXSQ)8iJ(DX|p0G z)CTNhODiWGMh92|cGK)<&YeSr@t`q`M#NBgJ;TpS_Ol5R1UPXhdTqFq=SpuCqX)Cg zQbEJeD}RL^aRb$Z91rhw2PozW*m4$-$iD)aaj*OG?#rI&3h7x8X*C&^xi%^f| zWbJkS*yUJcVh5GBC7_xsAcKp*g?grQ(C;8HS9+ejWvq*aOYFmxr>^A|UaiS1rOfo3 z@BzwFr8xpWl^QcSLU=Cykrf~IrgJjjz^DVY1}?Zh>7lBSjZf_+TU&lI2x$0OKmSoG zBw=}}O@YY2sd{Mv}}`ayVok zoq|@#FX#`DQWh7mxwd*&0Z`@KJN2Yj=p9VXqJbIE`K5JiOsUO;>#6xamhf#N$ckF(}ea5 zDL3Y_-V!gr>YBD0lBb9!uA5V(p|e~1>#}hZEBWPQ%Bbl_C8ETXzVYu?fTHayy)#Ad z_!B{XnVnIBI}T)T+)Cc%{^QEF)%l=q;+Wqv9Z9PToQL6QrVIl?mK;Nq%2>G?Qx@I5 zHTuaC+K*X|*)L1&GF{3v)coz$X*D zh=wZ*Kd%*h*IbR>vCm;OpbqNDbWo=i_@o>fR2nzaK%Q@|y^RJ)TP=W4u=E~{!?%m4 z6v?=cgkY-ws0ZNl3?`3hE~t+h41S5^0o9 z0gYz`u^jbH0D>|?!)E~opgutKJyXTmuB1{oa#)U@hvTljMa9x;78&av?&)0n{0W(P zXop<{b*3$l@a624@DhuVMNkY}QQeWDISNdZ_?%ZhO>9dO6vQ5Hz}?aX=$NJS2jnM* z_&Fs@W}WjZ&m<)!<#`|@y;>x@wVv}Ss3f~cp949nq84YSy57dPk2Y!l{2ZQzd~*%d zM0@`<&Cq-vA0?p4J%#%5wrnUG&`ElXI49x&^GjtPE6?~ij=ut!Ul(tDW}(qkDJN+@ z9y*be_IjQCZ>)WDU)VYPQOJeEnZl}I_zUu(oxp8Lt>y=PsXT|gb41LGG4Lpwbp@a@ zCxrKS_-+E$-9@iC+s1|lw>QJ40ie3SQT31lyPJJ>GTX}h7ybkql`8)rfR%h-0stDy zo#Tpr?`c@Cc%R7>VFbojD2$*3=*O<8>l9Lut@Y$a6(F${Xj1pxW0|DcVCtv8OK~H4 zQ=R<7CWYO2cBoY?H8ch^MSK;5d!>NUu%D+%Y&sIAq(lP!I1-^qvMS)(I4q1b0uz^` zvS9`9*v3a%DnX&XyV(e*AyZ%6=_{Uh9tOe`3HZh5zBlNXbmp2BjR2%kJisEfN<)yY z;~R@@319&pkeebo`+%vlDQo zb&57n4t(bl9+!e`j)jPW64q;U96mV1wAc7#sXLP|n0k1!t-XE(zw@D>y0Z!Q42kUc zNh^g*6cTl->~>#qV?LhAI7j~_DoMi&uqM-k+HI`?S&3ben*xmAIAAv&ufRA);lx)2 zHjUbXk=HSkshv}=d}pHo=W1Q0i-t`$Qa`4jc)rHyGtE2#vieLTyyV>H)g9gh{PF=c zhsa4OVPwrEf3wSj0ZR<%-)u7EkBfe7$2_Kp7{iQAz~7EArYz46TDU$_wrj)~ww4GO#f`PW%;B5z ze@qJk{Pq#agN3WaEL|>=Y-01t!plzIPLX2q%cT__Q@>us%ScKRd+Y-vrkrwKp5gaj ziYlZPa>HR=^hd+FolTz6_S@fO1nqSsqzQ&RaY5A{yh1&A#?%52Wzyc|c|~q)YA8J#?X^A2H_xfQCANLuQz(;g1{3!gV7}tWGaSWj(*V z5HjGuGN`c$XGU>bOY-KgmY|5jhHWpT_=|upSpe`VT|k^@L57b$d&WZJl@_{KCtkSm z7+@}HEJr5ZCBOR(u-k>j-pjp?Vcc2fIE0Yy2mAsc!>zIqwTLwj_csIFN1p32Ew~mU zM5mGQnJ_wRztic^XGoXQLJqlP7$KqO!OoMZJar!^e>+2X_yQtB;iWYxkXo6Um9=`u zNO|M|-CmJVP@)>ic3S5*=$1M$anZ4rM|Uvjn!fBPyY4NV#!FTnnf7;p5wLL*%;+5` z@Amfgrm?QyE51R7M;shWD)3onsH_4k*Ywuj4WmxhZj9k4%Q_IffI&SWXcYv}jL+k+ zXF>|=4zC>^%cSNJ*@PhoRyxaoh7xl}3^LS}et+Lv15~OI?m}#pOV#Ed-ov41mylH}H05GM zvR2kp+8FdC^@b@}mP;r zY1p}^KXnSYgO*Nx#n`M@Cg+x6CJG72VS~?We1A^AbSXgl-Sc&NaPyZi> z`LHEya$A&F)dNyUFYg~hAKlg~_8>|S;h0-%M6qlGC!JX-xvxYQvn%2$uX&A=3iwyL|n9+5x99(en!IZL_QPJnLcu=WJfuSHaU>04J1(4X&@9qCB!lhT2z=_({%cF~^0UCU66X*`%qfrw ze6_eHpg-rrBZ;1f3=0}<40zrVJVIbvl3kUSM*-y24}<_B^l)$r4f|izrf88Y?J73f zoZy+O2|A&{pv(~TR@Z5@@ZfU|vb&sNOm$Zxn-GrkUh5ra>4!C|0X)hu8Fi}C_|`<% zjgseUhFZX`3Ks@ORm^MEC)`u7#W1$l!d2c{SC+e)NHTQ|1e~A2-WvxRF>7*Tb#b(O zD(_MgfzeztT8b@S^$9D@*g18{u~nqNo05A?@}eoF0x$!=0q`Th`CLJ-8-idvRL}(t zFUp^@Bn;!_ctA7Yf5;P?8SG{d!XxT;v`~~QaxDVB#KfcEgV4V`ulAFkxTr?FUq*|g z0SOl^{%AsiNKy zbGN)!GYe>yyqfhm-nHeKbH9Wh0RN7+u-#}C|9dzrU1iX~1~fdFQ+TpW!&U>(^W$=P z3e8Lm0TJ8vYrH8*CMN?9$n129VBdwI#sCPSp61l{yBS(Dpa2pb8PDJfh>GSCiHq0hegR{A1P}!ARO~W}fH?vB znXugSwBaowJEr=dsoGcw6CW3~D9v>(z6msuU*~V!7ypCQCRC`|fi- zzwTw|xcI9DKZX~+k>l7R$D4tvwa&R=OmjVD4zMrvFl}Xf7-g{R5EiJQIXaQWXmuES z%attxe4K$f@gYJINgnuck9jDRJD9Vfr6mrW;v^~|ga}~sdLYiZs2kh`@UIIBmxz|F zw6o8^67ozO$}k^Vq&^hwdL*Q!oYobsrYj&)|Q!{*p1X z=e+^|fuh$#r^TPBu(bjKup++X|(!2KJ>nHyU9Oy3N(ZPoycm$;ifELjC=|7 z^SZ_=k%WO@aX9by*?Dc)wYh%gb2M#=vHD`}Po~%)pea ztX>FBKQrE#PkxrgTHuco(AOkBCyte7KCw$#}f#M?Tafg<2p9R zUrz#b9wiyGP2tnZc8m&Y0l5pjNuK};zlAi+F%15Z@iK7bE_yH6XV9R8QAU)+OGw90Ory`vl<6)>dL6Wgk4JMNOBmCmwv=+h10!5HByM4Od?d(T<8CA9uM zO>hIZs+?+P%Z`E!u-reqLl}ouU}6sun@#kK4xHCa-W+L6OP@r z<+9^N*Bvo1UdIUq5S{Bn4u1pW*E-d-FW>=imIH}7Q^*|N>DbC&Vi(s4+joKg+)Pj< zkOH6We5_Rv**W_;9R%fqQC5|V=Kd@j{1A1qv_NfZ#QxUi<``hwYxTZ!2%C(2#d|ho zPfgLoFWRao`s4Y(*$p~3ztrkdD+G+jxSa#r5~;`20zXes^(hp$w~Pj#;%+GI@=ByY zn8+$Gh6(v8skJ3bw#sfXA*ExfK6k4=opiw1AQuw6nO+=sn8#{0(QrM9H(HxiA+BH*f9eJpv?*z~)XBQfu9Rd_o zJ!H;NvWRmd?!5vUV*P7Bo&*hIpp4U)-TUzzd_nb;i@N9dBI3{Sj~am(zu% zl{9lPfQs`alyh--Qt8W|PBYAuPQjj~6yHrrdF9XDbRnfRHBy3Id2)wc1vcq8Scr0Z zGUKTS@U#a?bme3xt^;EVqnQ`zS?F@0Uwe*fGSmCsy?GtCswe&c literal 0 HcmV?d00001 From a346b4788dc0ecb25d8beed775ba49e57e05fbcc Mon Sep 17 00:00:00 2001 From: Cassandra Coyle Date: Mon, 31 Mar 2025 10:09:23 -0500 Subject: [PATCH 2/3] OnEventAlpha1 -> SendEventsAlpha1 && update comment for same addr Signed-off-by: Cassandra Coyle --- 20250314-RS-event-streaming.md | 36 +++++++++++++++++----------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/20250314-RS-event-streaming.md b/20250314-RS-event-streaming.md index 6264363..2e8c6d3 100644 --- a/20250314-RS-event-streaming.md +++ b/20250314-RS-event-streaming.md @@ -13,7 +13,7 @@ Similar to how OpenTelemetry tracing sends data directly to the collector, this There is no component required for this feature, and no preview feature flag - it's simply a matter of whether the config is present or not. If configuration is provided, Dapr will send events to the configured sinks. -Applications and collectors can receive events by implementing the `OnEventAlpha1` endpoint, which can be configured +Applications and collectors can receive events by implementing the `SendEventsAlpha1` endpoint, which can be configured for both local development and system-wide event collection. This design proposes: @@ -23,7 +23,7 @@ This design proposes: What this means at a high level: - Add Events to Application Configuration (supported for both kubernetes via crds & standalone mode via config files) -- Sinks implement the `OnEventAlpha1` endpoint to receive events +- Sinks implement the `SendEventsAlpha1` endpoint to receive events - Events can be sent locally or to remote collectors (with mTLS) This feature enables: @@ -58,7 +58,7 @@ Currently, Dapr lacks a unified way to collect and monitor system events across This proposal solves these problems by introducing a simple, scalable event streaming system that allows Dapr users to collect and process Dapr events through configurable endpoints. This design enables both event handling locally for development and testing while also enabling production monitoring by sending events to -a centralized event collection instance. Events can be sent to local applications or remote collectors via the `OnEventAlpha1` endpoint, with configuration determining +a centralized event collection instance. Events can be sent to local applications or remote collectors via the `SendEventsAlpha1` endpoint, with configuration determining the destination and security requirements. ## Related Items @@ -73,7 +73,7 @@ This [dapr/issue is related ([workflow] introduce workflow lifecycle events fire * Configurable event endpoints with filtering via Configuration * mTLS support for secure communication with remote collectors * Event type filtering per API - * Sending events to the `OnEventAlpha1` endpoint for both: + * Sending events to the `SendEventsAlpha1` endpoint for both: * Local application event handling * Remote system-wide event collection * Initial implementation in Dapr v1.16 will focus on: @@ -223,7 +223,7 @@ Please note that the event types within each category will grow as we add more e ### Design -The proposed event streaming architecture introduces the `OnEventAlpha1` endpoint which can be used for both: +The proposed event streaming architecture introduces the `SendEventsAlpha1` endpoint which can be used for both: - Local application event handling (within the same pod) - Remote system-wide event collection (across pods) @@ -233,14 +233,14 @@ Here's a high-level overview of the architecture: The diagram shows: 1. Pod A/C contain Dapr sidecars that: -- Send events to their local apps through `OnEventAlpha1` (configured with localhost) -- Send events directly to the collector-app through `OnEventAlpha1` +- Send events to their local apps through `SendEventsAlpha1` (configured with localhost) +- Send events directly to the collector-app through `SendEventsAlpha1` 2. Pod B contains: - Only a collector-app (no Dapr sidecar needed) -- Serves `OnEventAlpha1` endpoint with mTLS using Sentry certificate +- Serves `SendEventsAlpha1` endpoint with mTLS using Sentry certificate 3. Events flow: -- From Dapr sidecars to their local apps via `OnEventAlpha1` -- From Dapr sidecars to the collector-app via `OnEventAlpha1` +- From Dapr sidecars to their local apps via `SendEventsAlpha1` +- From Dapr sidecars to the collector-app via `SendEventsAlpha1` - Secured via mTLS using Sentry certificates - No service invocation needed since collector-app is not Dapr-enabled @@ -263,7 +263,7 @@ When configuration is provided: - For local apps: `mtls: false` - `filters`: Optional event filtering configuration - When configured, events are sent to: - - `OnEventAlpha1` endpoint for gRPC + - `SendEventsAlpha1` endpoint for gRPC - HTTP is not supported ###### Collector Configuration @@ -333,14 +333,14 @@ spec: ##### Configuration Validation: ```go -// Prevent self-referential event configurations +// Prevent self-referential event configurations by comparing both host and port if sinkAddress == ownAddress { - return fmt.Errorf("sink address cannot be the same as the Dapr sidecar's own address") + return fmt.Errorf("sink address (host:port) cannot be the same as the Dapr sidecar's own address") } ``` ##### Protos -`OnEventAlpha1` is added to `SinkEventsAlpha` service inside a new `dapr/proto/events/v1alpha1/events.proto` with the following events: +`SendEventsAlpha1` is added to `SinkEventsAlpha` service inside a new `dapr/proto/events/v1alpha1/events.proto` with the following events: ```protobuf syntax = "proto3"; @@ -355,8 +355,8 @@ import "dapr/proto/events/v1alpha1/jobs.proto"; // SinkEventsAlpha is the service non-Dapr applications implement to receive events from Dapr instances service SinkEventsAlpha { - // OnEventAlpha1 receives events from Dapr instances. The application must serve this endpoint with mTLS using a Sentry-issued certificate. - rpc OnEventAlpha1(stream EventRequest) returns (EventResponse); + // SendEventsAlpha1 receives events from Dapr instances. The application must serve this endpoint with mTLS using a Sentry-issued certificate. + rpc SendEventsAlpha1(stream EventRequest) returns (EventResponse); } message EventRequest { @@ -675,11 +675,11 @@ func handleEvent(request *pb.EventRequest) error { * Code changes * Support configuration CRD for both kubernetes & standalone mode - * Support sending events to the `OnEventAlpha1` endpoint + * Support sending events to the `SendEventsAlpha1` endpoint * Protos for events * Workflow events will be done first, then Actors, then the rest of the APIs * Tests added (e2e, unit) -* SDK changes to support `OnEventAlpha1` endpoint +* SDK changes to support `SendEventsAlpha1` endpoint * Documentation * Metrics should be added after dapr v1.16: - Track event counts by API type and scope (local/remote) From 87670655690536a1ed97a67c31398bfa0420f780 Mon Sep 17 00:00:00 2001 From: Cassandra Coyle Date: Tue, 29 Apr 2025 17:13:34 -0500 Subject: [PATCH 3/3] rm sdk from completion checklist since no sdk changes are needed Signed-off-by: Cassandra Coyle --- 20250314-RS-event-streaming.md | 1 - 1 file changed, 1 deletion(-) diff --git a/20250314-RS-event-streaming.md b/20250314-RS-event-streaming.md index 2e8c6d3..7c80806 100644 --- a/20250314-RS-event-streaming.md +++ b/20250314-RS-event-streaming.md @@ -679,7 +679,6 @@ func handleEvent(request *pb.EventRequest) error { * Protos for events * Workflow events will be done first, then Actors, then the rest of the APIs * Tests added (e2e, unit) -* SDK changes to support `SendEventsAlpha1` endpoint * Documentation * Metrics should be added after dapr v1.16: - Track event counts by API type and scope (local/remote)