From 49eccb2d319a84660442460fa0d0b69038fb1976 Mon Sep 17 00:00:00 2001 From: Sreekanth Date: Thu, 17 Mar 2022 12:23:19 +0530 Subject: [PATCH 1/6] Support for Redis streams as event source Signed-off-by: Sreekanth --- docs/eventsources/setup/redis-streams.md | 80 +++++++ eventsources/eventing.go | 11 + eventsources/sources/redis/start.go | 2 +- eventsources/sources/redisStream/start.go | 204 ++++++++++++++++++ eventsources/sources/redisStream/validate.go | 47 ++++ .../sources/redisStream/validate_test.go | 54 +++++ examples/event-sources/redis-streams.yaml | 50 +++++ examples/sensors/redis-streams.yaml | 37 ++++ go.mod | 2 + go.sum | 5 + pkg/apis/common/common.go | 2 + pkg/apis/events/event-data.go | 12 ++ pkg/apis/eventsource/v1alpha1/types.go | 35 +++ 13 files changed, 540 insertions(+), 1 deletion(-) create mode 100644 docs/eventsources/setup/redis-streams.md create mode 100644 eventsources/sources/redisStream/start.go create mode 100644 eventsources/sources/redisStream/validate.go create mode 100644 eventsources/sources/redisStream/validate_test.go create mode 100644 examples/event-sources/redis-streams.yaml create mode 100644 examples/sensors/redis-streams.yaml diff --git a/docs/eventsources/setup/redis-streams.md b/docs/eventsources/setup/redis-streams.md new file mode 100644 index 0000000000..3f18779638 --- /dev/null +++ b/docs/eventsources/setup/redis-streams.md @@ -0,0 +1,80 @@ +# Redis Streams + +Redis stream event-source listens to messages on Redis streams and helps sensor trigger workloads. + +Messages from the stream are read using the Redis consumer group. The main reason for using consumer group is to resume from the last read upon pod restarts. A common consumer group (defaults to "argo-events-cg") is created (if not already exists) on all specified streams. When using consumer group, each read through a consumer group is a write operation, because Redis needs to update the last retrieved message id and the pending entries list(PEL) of that specific user in the consumer group. So it can only work with the master Redis instance and not replicas (https://redis.io/topics/streams-intro). + +Redis stream event source expects all the streams to be present on the Redis server. This event source only starts pulling messages from the streams when all of the specified streams exist on the Redis server. On the initial setup, the consumer group is created on all the specified streams to start reading from the latest message (not necessarily the beginning of the stream). On subsequent setups (the consumer group already exists on the streams) or during pod restarts, messages are pulled from the last unacknowledged message in the stream. + +The consumer group is never deleted automatically. If you want a completely fresh setup again, you must delete the consumer group from the streams. + +## Event Structure + +The structure of an event dispatched by the event-source over the eventbus looks like following, + + { + "context": { + "id": "unique_event_id", + "source": "name_of_the_event_source", + "specversion": "cloud_events_version", + "type": "type_of_event_source", + "datacontenttype": "type_of_data", + "subject": "name_of_the_configuration_within_event_source", + "time": "event_time" + }, + "data": { + "stream": "Name of the Redis stream", + "message_id": "Message Id", + "values": "message body" + } + } + +Example: + { + "context": { + "id": "64313638396337352d623565612d343639302d383262362d306630333562333437363637", + "source": "redis-stream", + "specversion": "1.0", + "type": "redisStream", + "datacontenttype": "application/json", + "subject": "example", + "time": "2022-03-17T04:47:42Z" + }, + "data": { + "stream":"FOO", + "message_id":"1647495121754-0", + "values": {"key-1":"val-1", "key-2":"val-2"} + } + } + +## Specification + +Redis stream event-source specification is available [here](https://github.com/argoproj/argo-events/blob/master/api/event-source.md#argoproj.io/v1alpha1.RedisStreamEventSource). + +## Setup + +1. Follow the [documentation](https://kubernetes.io/docs/tutorials/configuration/configure-redis-using-configmap/#real-world-example-configuring-redis-using-a-configmap) to set up Redis database. + +1. Create the event source by running the following command. + + kubectl apply -n argo-events -f https://raw.githubusercontent.com/argoproj/argo-events/stable/examples/event-sources/redis-streams.yaml + +1. Create the sensor by running the following command. + + kubectl apply -n argo-events -f https://raw.githubusercontent.com/argoproj/argo-events/stable/examples/sensors/redis-streams.yaml + +1. Log into redis pod using `kubectl`. + + kubectl -n argo-events exec -it -c -- /bin/bash + +1. Run `redis-cli` and publish a message on the stream `FOO`. + + XADD FOO * message hello + +1. Once a message is published, an argo workflow will be triggered. Run `argo list` to find the workflow. + +## Troubleshoot + +Redis stream event source expects all the streams to be present on redis server. It only starts pulling messages from the streams when all of the specified streams exist on the redis server. + +Please read the [FAQ](https://argoproj.github.io/argo-events/FAQ/). \ No newline at end of file diff --git a/eventsources/eventing.go b/eventsources/eventing.go index 630ce54df2..73a0974c29 100644 --- a/eventsources/eventing.go +++ b/eventsources/eventing.go @@ -42,6 +42,7 @@ import ( "github.com/argoproj/argo-events/eventsources/sources/nsq" "github.com/argoproj/argo-events/eventsources/sources/pulsar" "github.com/argoproj/argo-events/eventsources/sources/redis" + redisstream "github.com/argoproj/argo-events/eventsources/sources/redisStream" "github.com/argoproj/argo-events/eventsources/sources/resource" "github.com/argoproj/argo-events/eventsources/sources/slack" "github.com/argoproj/argo-events/eventsources/sources/storagegrid" @@ -240,6 +241,16 @@ func GetEventingServers(eventSource *v1alpha1.EventSource, metrics *eventsourcem } result[apicommon.RedisEvent] = servers } + if len(eventSource.Spec.RedisStream) != 0 { + servers := []EventingServer{} + for k, v := range eventSource.Spec.RedisStream { + if v.Filter != nil { + filters[k] = v.Filter + } + servers = append(servers, &redisstream.EventListener{EventSourceName: eventSource.Name, EventName: k, EventSource: v, Metrics: metrics}) + } + result[apicommon.RedisStreamEvent] = servers + } if len(eventSource.Spec.SNS) != 0 { servers := []EventingServer{} for k, v := range eventSource.Spec.SNS { diff --git a/eventsources/sources/redis/start.go b/eventsources/sources/redis/start.go index 51b3529dc5..fab15d91d9 100644 --- a/eventsources/sources/redis/start.go +++ b/eventsources/sources/redis/start.go @@ -142,7 +142,7 @@ func (el *EventListener) handleOne(message *redis.Message, dispatch func([]byte, if err != nil { return errors.Wrap(err, "failed to marshal the event data, rejecting the event...") } - log.With("channel", message.Channel).Info("dispatching th event on the data channel...") + log.With("channel", message.Channel).Info("dispatching the event on the data channel...") if err = dispatch(eventBody); err != nil { return errors.Wrap(err, "failed dispatch a Redis event") } diff --git a/eventsources/sources/redisStream/start.go b/eventsources/sources/redisStream/start.go new file mode 100644 index 0000000000..ddc809bf15 --- /dev/null +++ b/eventsources/sources/redisStream/start.go @@ -0,0 +1,204 @@ +/* +Copyright 2020 BlackRock, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package redisstream + +import ( + "context" + "encoding/json" + "strings" + "time" + + "github.com/go-redis/redis/v8" + "github.com/pkg/errors" + "go.uber.org/zap" + + "github.com/argoproj/argo-events/common" + "github.com/argoproj/argo-events/common/logging" + eventsourcecommon "github.com/argoproj/argo-events/eventsources/common" + "github.com/argoproj/argo-events/eventsources/sources" + metrics "github.com/argoproj/argo-events/metrics" + apicommon "github.com/argoproj/argo-events/pkg/apis/common" + "github.com/argoproj/argo-events/pkg/apis/events" + "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1" +) + +// EventListener implements Eventing for the Redis event source +type EventListener struct { + EventSourceName string + EventName string + EventSource v1alpha1.RedisStreamEventSource + Metrics *metrics.Metrics +} + +// GetEventSourceName returns name of event source +func (el *EventListener) GetEventSourceName() string { + return el.EventSourceName +} + +// GetEventName returns name of event +func (el *EventListener) GetEventName() string { + return el.EventName +} + +// GetEventSourceType return type of event server +func (el *EventListener) GetEventSourceType() apicommon.EventSourceType { + return apicommon.RedisStreamEvent +} + +// StartListening listens for new data on specified redis streams +func (el *EventListener) StartListening(ctx context.Context, dispatch func([]byte, ...eventsourcecommon.Options) error) error { + log := logging.FromContext(ctx). + With(logging.LabelEventSourceType, el.GetEventSourceType(), logging.LabelEventName, el.GetEventName()) + log.Info("started processing the Redis stream event source...") + defer sources.Recover(el.GetEventName()) + + redisEventSource := &el.EventSource + + opt := &redis.Options{ + Addr: redisEventSource.HostAddress, + DB: int(redisEventSource.DB), + } + + log.Info("retrieving password if it has been configured...") + if redisEventSource.Password != nil { + password, err := common.GetSecretFromVolume(redisEventSource.Password) + if err != nil { + return errors.Wrapf(err, "failed to find the secret password %s", redisEventSource.Password.Name) + } + opt.Password = password + } + + if redisEventSource.TLS != nil { + tlsConfig, err := common.GetTLSConfig(redisEventSource.TLS) + if err != nil { + return errors.Wrap(err, "failed to get the tls configuration") + } + opt.TLSConfig = tlsConfig + } + + log.Infof("setting up a redis client for %s...", redisEventSource.HostAddress) + client := redis.NewClient(opt) + + if status := client.Ping(ctx); status.Err() != nil { + return errors.Wrapf(status.Err(), "failed to connect to host %s and db %d for event source %s", redisEventSource.HostAddress, redisEventSource.DB, el.GetEventName()) + } + log.Infof("connected to redis server %s", redisEventSource.HostAddress) + + // Create a common consumer group on all streams to start reading from beginning of the streams. + // Only proceeds if all the streams are already present + consumersGroup := "argo-events-cg" + if len(redisEventSource.ConsumerGroup) != 0 { + consumersGroup = redisEventSource.ConsumerGroup + } + for _, stream := range redisEventSource.Streams { + // create a consumer group to start reading from the current last entry in the stream (https://redis.io/commands/xgroup-create) + if err := client.XGroupCreate(ctx, stream, consumersGroup, "$").Err(); err != nil { + // redis package doesn't seem to expose concrete error types + if err.Error() != "BUSYGROUP Consumer Group name already exists" { + return errors.Wrapf(err, "creating consumer group %s for stream %s on host %s for event source %s", consumersGroup, stream, redisEventSource.HostAddress, el.GetEventName()) + } + log.Infof("Consumer group %s already exists", stream) + } + } + + readGroupArgs := make([]string, 2*len(redisEventSource.Streams)) + copy(readGroupArgs, redisEventSource.Streams) + // Start by reading our pending messages(previously read but not acknowledged). + streamToLastEntryMapping := make(map[string]string, len(redisEventSource.Streams)) + for _, s := range redisEventSource.Streams { + streamToLastEntryMapping[s] = "0-0" + } + + updateReadGroupArgs := func() { + for i, s := range redisEventSource.Streams { + readGroupArgs[i+len(redisEventSource.Streams)] = streamToLastEntryMapping[s] + } + } + updateReadGroupArgs() + + msgCount := redisEventSource.MaxMsgCountPerRead + if msgCount == 0 { + msgCount = 10 + } + + for { + select { + case <-ctx.Done(): + log.Infof("Redis stream event source for host %s is stopped", redisEventSource.HostAddress) + return nil + default: + } + entries, err := client.XReadGroup(ctx, &redis.XReadGroupArgs{ + Group: consumersGroup, + Consumer: "argo-events-worker", + Streams: readGroupArgs, + Count: int64(msgCount), + Block: 2 * time.Second, + NoAck: false, + }).Result() + if err != nil { + if err == redis.Nil { + continue + } + return errors.Wrapf(err, "reading streams %s using XREADGROUP", strings.Join(redisEventSource.Streams, ", ")) + } + + for _, entry := range entries { + if len(entry.Messages) == 0 { + // Completed consuming pending messages. Now start consuming new messages + streamToLastEntryMapping[entry.Stream] = ">" + } + for _, message := range entry.Messages { + if err := el.handleOne(entry.Stream, message, dispatch, log); err != nil { + log.With("stream", entry.Stream, "message_id", message.ID).Errorw("failed to process Redis stream message", zap.Error(err)) + el.Metrics.EventProcessingFailed(el.GetEventSourceName(), el.GetEventName()) + continue + } + if err := client.XAck(ctx, entry.Stream, consumersGroup, message.ID).Err(); err != nil { + log.With("stream", entry.Stream, "message_id", message.ID).Errorw("failed to acknowledge Redis stream message", zap.Error(err)) + } + if streamToLastEntryMapping[entry.Stream] != ">" { + streamToLastEntryMapping[entry.Stream] = message.ID + } + } + } + updateReadGroupArgs() + } +} + +func (el *EventListener) handleOne(stream string, message redis.XMessage, dispatch func([]byte, ...eventsourcecommon.Options) error, log *zap.SugaredLogger) error { + defer func(start time.Time) { + el.Metrics.EventProcessingDuration(el.GetEventSourceName(), el.GetEventName(), float64(time.Since(start)/time.Millisecond)) + }(time.Now()) + + log.With("stream", stream, "message_id", message.ID).Info("received a message") + eventData := &events.RedisStreamEventData{ + Stream: stream, + Id: message.ID, + Values: message.Values, + Metadata: el.EventSource.Metadata, + } + eventBody, err := json.Marshal(&eventData) + if err != nil { + return errors.Wrap(err, "failed to marshal the event data, rejecting the event...") + } + log.With("stream", stream).Info("dispatching the event on the data channel...") + if err = dispatch(eventBody); err != nil { + return errors.Wrap(err, "failed dispatch a Redis stream event") + } + return nil +} diff --git a/eventsources/sources/redisStream/validate.go b/eventsources/sources/redisStream/validate.go new file mode 100644 index 0000000000..3d6806443d --- /dev/null +++ b/eventsources/sources/redisStream/validate.go @@ -0,0 +1,47 @@ +/* +Copyright 2020 BlackRock, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package redisstream + +import ( + "context" + + "github.com/pkg/errors" + + "github.com/argoproj/argo-events/common" + apicommon "github.com/argoproj/argo-events/pkg/apis/common" + "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1" +) + +// ValidateEventSource validates nats event source +func (el *EventListener) ValidateEventSource(ctx context.Context) error { + return validate(&el.EventSource) +} + +func validate(eventSource *v1alpha1.RedisStreamEventSource) error { + if eventSource == nil { + return common.ErrNilEventSource + } + if eventSource.HostAddress == "" { + return errors.New("host address must be specified") + } + if eventSource.Streams == nil { + return errors.New("stream/streams must be specified") + } + if eventSource.TLS != nil { + return apicommon.ValidateTLSConfig(eventSource.TLS) + } + return nil +} diff --git a/eventsources/sources/redisStream/validate_test.go b/eventsources/sources/redisStream/validate_test.go new file mode 100644 index 0000000000..23a469eb00 --- /dev/null +++ b/eventsources/sources/redisStream/validate_test.go @@ -0,0 +1,54 @@ +/* +Copyright 2018 BlackRock, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package redisstream + +import ( + "context" + "fmt" + "io/ioutil" + "testing" + + "github.com/argoproj/argo-events/eventsources/sources" + "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1" + "github.com/ghodss/yaml" + "github.com/stretchr/testify/assert" +) + +func TestValidateRedisEventSource(t *testing.T) { + listener := &EventListener{} + + err := listener.ValidateEventSource(context.Background()) + assert.Error(t, err) + assert.Equal(t, "host address must be specified", err.Error()) + + content, err := ioutil.ReadFile(fmt.Sprintf("%s/%s", sources.EventSourceDir, "redis-streams.yaml")) + assert.Nil(t, err) + + var eventSource *v1alpha1.EventSource + err = yaml.Unmarshal(content, &eventSource) + assert.Nil(t, err) + assert.NotNil(t, eventSource.Spec.RedisStream) + + for name, value := range eventSource.Spec.RedisStream { + fmt.Println(name) + l := &EventListener{ + EventSource: value, + } + err := l.ValidateEventSource(context.Background()) + assert.NoError(t, err) + } +} diff --git a/examples/event-sources/redis-streams.yaml b/examples/event-sources/redis-streams.yaml new file mode 100644 index 0000000000..59cc06f55f --- /dev/null +++ b/examples/event-sources/redis-streams.yaml @@ -0,0 +1,50 @@ +apiVersion: argoproj.io/v1alpha1 +kind: EventSource +metadata: + name: redis-stream +spec: + redisStream: + example: + # HostAddress refers to the address of the Redis host/server + hostAddress: redis.argo-events.svc:6379 + + # Password required for authentication. + # +optional + # password: + # name: name_of_secret_that_holds_password + # key: key_within_secret_which_holds_password_value + + # DB to use. If not specified, default DB 0 will be used. + # +optional + db: 0 + + # MaxMsgCountPerRead holds the maximum number of messages per stream that will be read in each XREADGROUP of all streams + # Example: if there are 2 streams and MaxMsgCountPerRead=10, then each XREADGROUP may read upto a total of 20 messages. + # Same as COUNT option in XREADGROUP(https://redis.io/topics/streams-intro). Defaults to 10 + # +optional + # maxMsgCountPerRead: 50 + + # ConsumerGroup refers to the Redis stream consumer group that will be created on all redis streams. + # Messages are read through this group. Defaults to 'argo-events-cg' + # +optional + # consumerGroup: argo-events-cg + + # Streams to listen for events. XREADGROUP is used on all streams using a single consumer group. + streams: + - FOO + +# example-tls: +# hostAddress: redis.argo-events.svc:6379 +# db: 0 +# streams: +# - FOO +# tls: +# caCertSecret: +# name: my-secret +# key: ca-cert-key +# clientCertSecret: +# name: my-secret +# key: client-cert-key +# clientKeySecret: +# name: my-secret +# key: client-key-key \ No newline at end of file diff --git a/examples/sensors/redis-streams.yaml b/examples/sensors/redis-streams.yaml new file mode 100644 index 0000000000..d19e07cd6f --- /dev/null +++ b/examples/sensors/redis-streams.yaml @@ -0,0 +1,37 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Sensor +metadata: + name: redis-stream +spec: + template: + serviceAccountName: operate-workflow-sa + dependencies: + - name: test-dep + eventSourceName: redis-stream + eventName: example + triggers: + - template: + name: workflow-trigger + k8s: + operation: create + source: + resource: + apiVersion: argoproj.io/v1alpha1 + kind: Workflow + metadata: + generateName: redis-stream- + spec: + entrypoint: whalesay + templates: + - container: + args: + - "hello" # it will get replaced by the event payload + command: + - cowsay + image: "docker/whalesay:latest" + name: whalesay + parameters: + - src: + dependencyName: test-dep + dataKey: values + dest: spec.templates.0.container.args.0 \ No newline at end of file diff --git a/go.mod b/go.mod index 5b6845b3b0..3793f8ed81 100644 --- a/go.mod +++ b/go.mod @@ -32,6 +32,7 @@ require ( github.com/go-git/go-git/v5 v5.4.2 github.com/go-openapi/inflect v0.19.0 github.com/go-redis/redis v6.15.9+incompatible + github.com/go-redis/redis/v8 v8.11.4 github.com/go-resty/resty/v2 v2.7.0 github.com/go-swagger/go-swagger v0.29.0 github.com/gobwas/glob v0.2.4-0.20181002190808-e7a84e9525fe @@ -90,6 +91,7 @@ require ( github.com/DataDog/zstd v1.5.0 // indirect github.com/apache/pulsar-client-go/oauth2 v0.0.0-20220120090717-25e59572242e // indirect github.com/danieljoos/wincred v1.0.2 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b // indirect github.com/felixge/httpsnoop v1.0.2 // indirect github.com/go-openapi/spec v0.20.4 // indirect diff --git a/go.sum b/go.sum index a6f9998978..3c2796344d 100644 --- a/go.sum +++ b/go.sum @@ -284,6 +284,8 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/devigned/tab v0.1.1 h1:3mD6Kb1mUOYeLpJvTVSDwSg5ZsfSxfvxGRTxRsJsITA= github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dimchansky/utfbom v1.1.0 h1:FcM3g+nofKgUteL8dm/UpdRXNC9KmADgTpLKsu0TRo4= github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= @@ -511,6 +513,8 @@ github.com/go-openapi/validate v0.20.3 h1:GZPPhhKSZrE8HjB4eEkoYAZmoWA4+tCemSgINH github.com/go-openapi/validate v0.20.3/go.mod h1:goDdqVGiigM3jChcrYJxD2joalke3ZXeftD16byIjA4= github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg= github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-redis/redis/v8 v8.11.4 h1:kHoYkfZP6+pe04aFTnhDH6GDROa5yJdHJVNxV3F46Tg= +github.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Pxt6RJr792+w= github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY= github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= @@ -1014,6 +1018,7 @@ github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGV github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.17.0 h1:9Luw4uT5HTjHTN8+aNcSThgH1vdXnmdJ8xIfZ4wyTRE= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= diff --git a/pkg/apis/common/common.go b/pkg/apis/common/common.go index 32f521b773..6324af4a88 100644 --- a/pkg/apis/common/common.go +++ b/pkg/apis/common/common.go @@ -46,6 +46,7 @@ var ( StripeEvent EventSourceType = "stripe" EmitterEvent EventSourceType = "emitter" RedisEvent EventSourceType = "redis" + RedisStreamEvent EventSourceType = "redisStream" NSQEvent EventSourceType = "nsq" PulsarEvent EventSourceType = "pulsar" GenericEvent EventSourceType = "generic" @@ -69,6 +70,7 @@ var ( NSQEvent, PulsarEvent, RedisEvent, + RedisStreamEvent, ResourceEvent, HDFSEvent, FileEvent, diff --git a/pkg/apis/events/event-data.go b/pkg/apis/events/event-data.go index a43ca3855c..2d1abf9f52 100644 --- a/pkg/apis/events/event-data.go +++ b/pkg/apis/events/event-data.go @@ -242,6 +242,18 @@ type RedisEventData struct { Metadata map[string]string `json:"metadata,omitempty"` } +// RedisStreamEventData represents the event data generated by the Redis eventsource. +type RedisStreamEventData struct { + // Source redis stream name. + Stream string `json:"stream"` + // Message Id + Id string `json:"message_id"` + // Message body + Values map[string]interface{} `json:"values"` + // Metadata holds the user defined metadata which will passed along the event payload. + Metadata map[string]string `json:"metadata,omitempty"` +} + // ResourceEventData represents the event data generated by the Resource eventsource. type ResourceEventData struct { // EventType of the type of the event. diff --git a/pkg/apis/eventsource/v1alpha1/types.go b/pkg/apis/eventsource/v1alpha1/types.go index f12c4f8acd..a47277a394 100644 --- a/pkg/apis/eventsource/v1alpha1/types.go +++ b/pkg/apis/eventsource/v1alpha1/types.go @@ -114,6 +114,8 @@ type EventSourceSpec struct { BitbucketServer map[string]BitbucketServerEventSource `json:"bitbucketserver,omitempty" protobuf:"bytes,29,rep,name=bitbucketserver"` // Bitbucket event sources Bitbucket map[string]BitbucketEventSource `json:"bitbucket,omitempty" protobuf:"bytes,30,rep,name=bitbucket"` + // Redis stream source + RedisStream map[string]RedisStreamEventSource `json:"redisStream,omitempty" protobuf:"bytes,31,rep,name=redisStream"` } func (e EventSourceSpec) GetReplicas() int32 { @@ -1154,6 +1156,39 @@ type RedisEventSource struct { Filter *EventSourceFilter `json:"filter,omitempty" protobuf:"bytes,8,opt,name=filter"` } +// RedisStreamEventSource describes an event source for +// Redis streams (https://redis.io/topics/streams-intro) +type RedisStreamEventSource struct { + // HostAddress refers to the address of the Redis host/server (master instance) + HostAddress string `json:"hostAddress" protobuf:"bytes,1,opt,name=hostAddress"` + // Password required for authentication if any. + // +optional + Password *corev1.SecretKeySelector `json:"password,omitempty" protobuf:"bytes,2,opt,name=password"` + // DB to use. If not specified, default DB 0 will be used. + // +optional + DB int32 `json:"db,omitempty" protobuf:"varint,3,opt,name=db"` + // Streams to look for entries. XREADGROUP is used on all streams using a single consumer group. + Streams []string `json:"streams" protobuf:"bytes,4,rep,name=streams"` + // MaxMsgCountPerRead holds the maximum number of messages per stream that will be read in each XREADGROUP of all streams + // Example: if there are 2 streams and MaxMsgCountPerRead=10, then each XREADGROUP may read upto a total of 20 messages. + // Same as COUNT option in XREADGROUP(https://redis.io/topics/streams-intro). Defaults to 10 + // +optional + MaxMsgCountPerRead int32 `json:"maxMsgCountPerRead,omitempty" protobuf:"varint,5,opt,name=maxMsgCountPerRead"` + // ConsumerGroup refers to the Redis stream consumer group that will be + // created on all redis streams. Messages are read through this group. Defaults to 'argo-events-cg' + // +optional + ConsumerGroup string `json:"consumerGroup,omitempty" protobuf:"bytes,6,opt,name=consumerGroup"` + // TLS configuration for the redis client. + // +optional + TLS *apicommon.TLSConfig `json:"tls,omitempty" protobuf:"bytes,7,opt,name=tls"` + // Metadata holds the user defined metadata which will passed along the event payload. + // +optional + Metadata map[string]string `json:"metadata,omitempty" protobuf:"bytes,8,rep,name=metadata"` + // Filter + // +optional + Filter *EventSourceFilter `json:"filter,omitempty" protobuf:"bytes,9,opt,name=filter"` +} + // NSQEventSource describes the event source for NSQ PubSub // More info at https://godoc.org/github.com/nsqio/go-nsq type NSQEventSource struct { From be07d861bd98f6bb0b449675d8013d0f6639b542 Mon Sep 17 00:00:00 2001 From: Sreekanth Date: Thu, 17 Mar 2022 12:53:25 +0530 Subject: [PATCH 2/6] generated code Signed-off-by: Sreekanth --- api/event-source.html | 160 ++ api/event-source.md | 166 ++ api/jsonschema/schema.json | 61 + api/openapi-spec/swagger.json | 61 + api/sensor.md | 6 +- pkg/apis/eventsource/v1alpha1/generated.pb.go | 1645 ++++++++++++----- pkg/apis/eventsource/v1alpha1/generated.proto | 44 + .../eventsource/v1alpha1/openapi_generated.go | 112 +- .../v1alpha1/zz_generated.deepcopy.go | 50 + 9 files changed, 1886 insertions(+), 419 deletions(-) diff --git a/api/event-source.html b/api/event-source.html index ad623206d6..fb12dc33fd 100644 --- a/api/event-source.html +++ b/api/event-source.html @@ -1811,6 +1811,19 @@

EventSource

Bitbucket event sources

+ + +redisStream
+ + +map[string]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.RedisStreamEventSource + + + + +

Redis stream source

+ + @@ -1851,6 +1864,7 @@

EventSourceFilter PubSubEventSource, PulsarEventSource, RedisEventSource, +RedisStreamEventSource, SNSEventSource, SQSEventSource, SlackEventSource) @@ -2280,6 +2294,19 @@

EventSourceSpec

Bitbucket event sources

+ + +redisStream
+ + +map[string]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.RedisStreamEventSource + + + + +

Redis stream source

+ +

EventSourceStatus @@ -4244,6 +4271,139 @@

RedisEventSource +

RedisStreamEventSource +

+

+(Appears on: +EventSourceSpec) +

+

+

RedisStreamEventSource describes an event source for +Redis streams (https://redis.io/topics/streams-intro)

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
+hostAddress
+ +string + +
+

HostAddress refers to the address of the Redis host/server (master instance)

+
+password
+ + +Kubernetes core/v1.SecretKeySelector + + +
+(Optional) +

Password required for authentication if any.

+
+db
+ +int32 + +
+(Optional) +

DB to use. If not specified, default DB 0 will be used.

+
+streams
+ +[]string + +
+

Streams to look for entries. XREADGROUP is used on all streams using a single consumer group.

+
+maxMsgCountPerRead
+ +int32 + +
+(Optional) +

MaxMsgCountPerRead holds the maximum number of messages per stream that will be read in each XREADGROUP of all streams +Example: if there are 2 streams and MaxMsgCountPerRead=10, then each XREADGROUP may read upto a total of 20 messages. +Same as COUNT option in XREADGROUP(https://redis.io/topics/streams-intro). Defaults to 10

+
+consumerGroup
+ +string + +
+(Optional) +

ConsumerGroup refers to the Redis stream consumer group that will be +created on all redis streams. Messages are read through this group. Defaults to ‘argo-events-cg’

+
+tls
+ +github.com/argoproj/argo-events/pkg/apis/common.TLSConfig + +
+(Optional) +

TLS configuration for the redis client.

+
+metadata
+ +map[string]string + +
+(Optional) +

Metadata holds the user defined metadata which will passed along the event payload.

+
+filter
+ + +EventSourceFilter + + +
+(Optional) +

Filter

+

ResourceEventSource

diff --git a/api/event-source.md b/api/event-source.md index b2bcba6c07..2cea64f37e 100644 --- a/api/event-source.md +++ b/api/event-source.md @@ -1878,6 +1878,19 @@ Bitbucket event sources

+ + +redisStream
+ +map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.RedisStreamEventSource + + + +

+Redis stream source +

+ + @@ -1916,6 +1929,7 @@ EventSourceFilter PubSubEventSource, PulsarEventSource, RedisEventSource, +RedisStreamEventSource, SNSEventSource, SQSEventSource, SlackEventSource) @@ -2349,6 +2363,19 @@ Bitbucket event sources

+ + +redisStream
+ +map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.RedisStreamEventSource + + + +

+Redis stream source +

+ +

@@ -4329,6 +4356,145 @@ Filter +

+RedisStreamEventSource +

+

+(Appears on: +EventSourceSpec) +

+

+

+RedisStreamEventSource describes an event source for Redis streams +(https://redis.io/topics/streams-intro) +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Field + +Description +
+hostAddress
string +
+

+HostAddress refers to the address of the Redis host/server (master +instance) +

+
+password
+ +Kubernetes core/v1.SecretKeySelector +
+(Optional) +

+Password required for authentication if any. +

+
+db
int32 +
+(Optional) +

+DB to use. If not specified, default DB 0 will be used. +

+
+streams
\[\]string +
+

+Streams to look for entries. XREADGROUP is used on all streams using a +single consumer group. +

+
+maxMsgCountPerRead
int32 +
+(Optional) +

+MaxMsgCountPerRead holds the maximum number of messages per stream that +will be read in each XREADGROUP of all streams Example: if there are 2 +streams and MaxMsgCountPerRead=10, then each XREADGROUP may read upto a +total of 20 messages. Same as COUNT option in +XREADGROUP(https://redis.io/topics/streams-intro). +Defaults to 10 +

+
+consumerGroup
string +
+(Optional) +

+ConsumerGroup refers to the Redis stream consumer group that will be +created on all redis streams. Messages are read through this group. +Defaults to ‘argo-events-cg’ +

+
+tls
+github.com/argoproj/argo-events/pkg/apis/common.TLSConfig +
+(Optional) +

+TLS configuration for the redis client. +

+
+metadata
map\[string\]string +
+(Optional) +

+Metadata holds the user defined metadata which will passed along the +event payload. +

+
+filter
+ EventSourceFilter + +
+(Optional) +

+Filter +

+

ResourceEventSource

diff --git a/api/jsonschema/schema.json b/api/jsonschema/schema.json index 9759284973..f5542373ab 100644 --- a/api/jsonschema/schema.json +++ b/api/jsonschema/schema.json @@ -1366,6 +1366,13 @@ "description": "Redis event source", "type": "object" }, + "redisStream": { + "additionalProperties": { + "$ref": "#/definitions/io.argoproj.eventsource.v1alpha1.RedisStreamEventSource" + }, + "description": "Redis stream source", + "type": "object" + }, "replicas": { "description": "Replicas is the event source deployment replicas", "format": "int32", @@ -2192,6 +2199,60 @@ ], "type": "object" }, + "io.argoproj.eventsource.v1alpha1.RedisStreamEventSource": { + "description": "RedisStreamEventSource describes an event source for Redis streams (https://redis.io/topics/streams-intro)", + "properties": { + "consumerGroup": { + "description": "ConsumerGroup refers to the Redis stream consumer group that will be created on all redis streams. Messages are read through this group. Defaults to 'argo-events-cg'", + "type": "string" + }, + "db": { + "description": "DB to use. If not specified, default DB 0 will be used.", + "format": "int32", + "type": "integer" + }, + "filter": { + "$ref": "#/definitions/io.argoproj.eventsource.v1alpha1.EventSourceFilter", + "description": "Filter" + }, + "hostAddress": { + "description": "HostAddress refers to the address of the Redis host/server (master instance)", + "type": "string" + }, + "maxMsgCountPerRead": { + "description": "MaxMsgCountPerRead holds the maximum number of messages per stream that will be read in each XREADGROUP of all streams Example: if there are 2 streams and MaxMsgCountPerRead=10, then each XREADGROUP may read upto a total of 20 messages. Same as COUNT option in XREADGROUP(https://redis.io/topics/streams-intro). Defaults to 10", + "format": "int32", + "type": "integer" + }, + "metadata": { + "additionalProperties": { + "type": "string" + }, + "description": "Metadata holds the user defined metadata which will passed along the event payload.", + "type": "object" + }, + "password": { + "$ref": "#/definitions/io.k8s.api.core.v1.SecretKeySelector", + "description": "Password required for authentication if any." + }, + "streams": { + "description": "Streams to look for entries. XREADGROUP is used on all streams using a single consumer group.", + "items": { + "type": "string" + }, + "type": "array" + }, + "tls": { + "$ref": "#/definitions/io.argoproj.common.TLSConfig", + "description": "TLS configuration for the redis client." + } + }, + "required": [ + "hostAddress", + "streams" + ], + "type": "object" + }, "io.argoproj.eventsource.v1alpha1.ResourceEventSource": { "description": "ResourceEventSource refers to a event-source for K8s resource related events.", "properties": { diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 6bd46e6764..f0928180f3 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -1350,6 +1350,13 @@ "$ref": "#/definitions/io.argoproj.eventsource.v1alpha1.RedisEventSource" } }, + "redisStream": { + "description": "Redis stream source", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/io.argoproj.eventsource.v1alpha1.RedisStreamEventSource" + } + }, "replicas": { "description": "Replicas is the event source deployment replicas", "type": "integer", @@ -2175,6 +2182,60 @@ } } }, + "io.argoproj.eventsource.v1alpha1.RedisStreamEventSource": { + "description": "RedisStreamEventSource describes an event source for Redis streams (https://redis.io/topics/streams-intro)", + "type": "object", + "required": [ + "hostAddress", + "streams" + ], + "properties": { + "consumerGroup": { + "description": "ConsumerGroup refers to the Redis stream consumer group that will be created on all redis streams. Messages are read through this group. Defaults to 'argo-events-cg'", + "type": "string" + }, + "db": { + "description": "DB to use. If not specified, default DB 0 will be used.", + "type": "integer", + "format": "int32" + }, + "filter": { + "description": "Filter", + "$ref": "#/definitions/io.argoproj.eventsource.v1alpha1.EventSourceFilter" + }, + "hostAddress": { + "description": "HostAddress refers to the address of the Redis host/server (master instance)", + "type": "string" + }, + "maxMsgCountPerRead": { + "description": "MaxMsgCountPerRead holds the maximum number of messages per stream that will be read in each XREADGROUP of all streams Example: if there are 2 streams and MaxMsgCountPerRead=10, then each XREADGROUP may read upto a total of 20 messages. Same as COUNT option in XREADGROUP(https://redis.io/topics/streams-intro). Defaults to 10", + "type": "integer", + "format": "int32" + }, + "metadata": { + "description": "Metadata holds the user defined metadata which will passed along the event payload.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "password": { + "description": "Password required for authentication if any.", + "$ref": "#/definitions/io.k8s.api.core.v1.SecretKeySelector" + }, + "streams": { + "description": "Streams to look for entries. XREADGROUP is used on all streams using a single consumer group.", + "type": "array", + "items": { + "type": "string" + } + }, + "tls": { + "description": "TLS configuration for the redis client.", + "$ref": "#/definitions/io.argoproj.common.TLSConfig" + } + } + }, "io.argoproj.eventsource.v1alpha1.ResourceEventSource": { "description": "ResourceEventSource refers to a event-source for K8s resource related events.", "type": "object", diff --git a/api/sensor.md b/api/sensor.md index ed3eb10124..7ead623f0e 100644 --- a/api/sensor.md +++ b/api/sensor.md @@ -728,9 +728,9 @@ strconv.ParseFloat() Strings are taken as is Nils this value is ignored

-Comparator compares the event data with a user given value. Can be -“\>=”, “\>”, “=”, “!=”, “\<”, or “\<=”. Is optional, and if left blank -treated as equality “=”. +Comparator compares the event data with a user given value. Can be “>=”, +“>”, “=”, “!=”, “\<”, or “\<=”. Is optional, and if left blank treated +as equality “=”.

diff --git a/pkg/apis/eventsource/v1alpha1/generated.pb.go b/pkg/apis/eventsource/v1alpha1/generated.pb.go index 58a538866c..de5a86e0c7 100644 --- a/pkg/apis/eventsource/v1alpha1/generated.pb.go +++ b/pkg/apis/eventsource/v1alpha1/generated.pb.go @@ -1082,10 +1082,38 @@ func (m *RedisEventSource) XXX_DiscardUnknown() { var xxx_messageInfo_RedisEventSource proto.InternalMessageInfo +func (m *RedisStreamEventSource) Reset() { *m = RedisStreamEventSource{} } +func (*RedisStreamEventSource) ProtoMessage() {} +func (*RedisStreamEventSource) Descriptor() ([]byte, []int) { + return fileDescriptor_c9ac5d6cd016403b, []int{37} +} +func (m *RedisStreamEventSource) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RedisStreamEventSource) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *RedisStreamEventSource) XXX_Merge(src proto.Message) { + xxx_messageInfo_RedisStreamEventSource.Merge(m, src) +} +func (m *RedisStreamEventSource) XXX_Size() int { + return m.Size() +} +func (m *RedisStreamEventSource) XXX_DiscardUnknown() { + xxx_messageInfo_RedisStreamEventSource.DiscardUnknown(m) +} + +var xxx_messageInfo_RedisStreamEventSource proto.InternalMessageInfo + func (m *ResourceEventSource) Reset() { *m = ResourceEventSource{} } func (*ResourceEventSource) ProtoMessage() {} func (*ResourceEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{37} + return fileDescriptor_c9ac5d6cd016403b, []int{38} } func (m *ResourceEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1113,7 +1141,7 @@ var xxx_messageInfo_ResourceEventSource proto.InternalMessageInfo func (m *ResourceFilter) Reset() { *m = ResourceFilter{} } func (*ResourceFilter) ProtoMessage() {} func (*ResourceFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{38} + return fileDescriptor_c9ac5d6cd016403b, []int{39} } func (m *ResourceFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1141,7 +1169,7 @@ var xxx_messageInfo_ResourceFilter proto.InternalMessageInfo func (m *SNSEventSource) Reset() { *m = SNSEventSource{} } func (*SNSEventSource) ProtoMessage() {} func (*SNSEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{39} + return fileDescriptor_c9ac5d6cd016403b, []int{40} } func (m *SNSEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1169,7 +1197,7 @@ var xxx_messageInfo_SNSEventSource proto.InternalMessageInfo func (m *SQSEventSource) Reset() { *m = SQSEventSource{} } func (*SQSEventSource) ProtoMessage() {} func (*SQSEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{40} + return fileDescriptor_c9ac5d6cd016403b, []int{41} } func (m *SQSEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1197,7 +1225,7 @@ var xxx_messageInfo_SQSEventSource proto.InternalMessageInfo func (m *Selector) Reset() { *m = Selector{} } func (*Selector) ProtoMessage() {} func (*Selector) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{41} + return fileDescriptor_c9ac5d6cd016403b, []int{42} } func (m *Selector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1225,7 +1253,7 @@ var xxx_messageInfo_Selector proto.InternalMessageInfo func (m *Service) Reset() { *m = Service{} } func (*Service) ProtoMessage() {} func (*Service) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{42} + return fileDescriptor_c9ac5d6cd016403b, []int{43} } func (m *Service) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1253,7 +1281,7 @@ var xxx_messageInfo_Service proto.InternalMessageInfo func (m *SlackEventSource) Reset() { *m = SlackEventSource{} } func (*SlackEventSource) ProtoMessage() {} func (*SlackEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{43} + return fileDescriptor_c9ac5d6cd016403b, []int{44} } func (m *SlackEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1281,7 +1309,7 @@ var xxx_messageInfo_SlackEventSource proto.InternalMessageInfo func (m *StorageGridEventSource) Reset() { *m = StorageGridEventSource{} } func (*StorageGridEventSource) ProtoMessage() {} func (*StorageGridEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{44} + return fileDescriptor_c9ac5d6cd016403b, []int{45} } func (m *StorageGridEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1309,7 +1337,7 @@ var xxx_messageInfo_StorageGridEventSource proto.InternalMessageInfo func (m *StorageGridFilter) Reset() { *m = StorageGridFilter{} } func (*StorageGridFilter) ProtoMessage() {} func (*StorageGridFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{45} + return fileDescriptor_c9ac5d6cd016403b, []int{46} } func (m *StorageGridFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1337,7 +1365,7 @@ var xxx_messageInfo_StorageGridFilter proto.InternalMessageInfo func (m *StripeEventSource) Reset() { *m = StripeEventSource{} } func (*StripeEventSource) ProtoMessage() {} func (*StripeEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{46} + return fileDescriptor_c9ac5d6cd016403b, []int{47} } func (m *StripeEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1365,7 +1393,7 @@ var xxx_messageInfo_StripeEventSource proto.InternalMessageInfo func (m *Template) Reset() { *m = Template{} } func (*Template) ProtoMessage() {} func (*Template) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{47} + return fileDescriptor_c9ac5d6cd016403b, []int{48} } func (m *Template) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1393,7 +1421,7 @@ var xxx_messageInfo_Template proto.InternalMessageInfo func (m *WatchPathConfig) Reset() { *m = WatchPathConfig{} } func (*WatchPathConfig) ProtoMessage() {} func (*WatchPathConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{48} + return fileDescriptor_c9ac5d6cd016403b, []int{49} } func (m *WatchPathConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1421,7 +1449,7 @@ var xxx_messageInfo_WatchPathConfig proto.InternalMessageInfo func (m *WebhookContext) Reset() { *m = WebhookContext{} } func (*WebhookContext) ProtoMessage() {} func (*WebhookContext) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{49} + return fileDescriptor_c9ac5d6cd016403b, []int{50} } func (m *WebhookContext) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1492,6 +1520,7 @@ func init() { proto.RegisterMapType((map[string]PubSubEventSource)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.EventSourceSpec.PubSubEntry") proto.RegisterMapType((map[string]PulsarEventSource)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.EventSourceSpec.PulsarEntry") proto.RegisterMapType((map[string]RedisEventSource)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.EventSourceSpec.RedisEntry") + proto.RegisterMapType((map[string]RedisStreamEventSource)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.EventSourceSpec.RedisStreamEntry") proto.RegisterMapType((map[string]ResourceEventSource)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.EventSourceSpec.ResourceEntry") proto.RegisterMapType((map[string]SlackEventSource)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.EventSourceSpec.SlackEntry") proto.RegisterMapType((map[string]SNSEventSource)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.EventSourceSpec.SnsEntry") @@ -1528,6 +1557,8 @@ func init() { proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.PulsarEventSource.MetadataEntry") proto.RegisterType((*RedisEventSource)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.RedisEventSource") proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.RedisEventSource.MetadataEntry") + proto.RegisterType((*RedisStreamEventSource)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.RedisStreamEventSource") + proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.RedisStreamEventSource.MetadataEntry") proto.RegisterType((*ResourceEventSource)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.ResourceEventSource") proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.ResourceEventSource.MetadataEntry") proto.RegisterType((*ResourceFilter)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.ResourceFilter") @@ -1556,399 +1587,407 @@ func init() { } var fileDescriptor_c9ac5d6cd016403b = []byte{ - // 6268 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3d, 0x5b, 0x6c, 0x1c, 0xc9, - 0x71, 0x37, 0xe4, 0xee, 0x72, 0xb7, 0xf8, 0x6e, 0xe9, 0x74, 0x7b, 0xb4, 0x4f, 0x12, 0xf6, 0x10, - 0x41, 0x97, 0x9c, 0xa9, 0xdc, 0x25, 0x8e, 0xcf, 0x77, 0xf6, 0x19, 0xcb, 0x87, 0x28, 0x9e, 0x28, - 0x8a, 0xac, 0xa5, 0x74, 0x77, 0x3e, 0xfb, 0xce, 0xb3, 0xb3, 0xcd, 0xe5, 0x98, 0xb3, 0x33, 0xcb, - 0x99, 0x59, 0x4a, 0x14, 0x10, 0xdb, 0x30, 0x90, 0xc4, 0xf6, 0xf9, 0x75, 0x49, 0xec, 0x04, 0x08, - 0xfc, 0x93, 0x04, 0x06, 0x82, 0x7c, 0xe5, 0xc7, 0xf9, 0x0e, 0x10, 0x24, 0x0e, 0x92, 0x0f, 0xe7, - 0x2b, 0x86, 0x0d, 0x08, 0xb6, 0x02, 0xe4, 0x2b, 0xf9, 0x08, 0xf2, 0x95, 0x20, 0x1f, 0x41, 0x3f, - 0xa6, 0xa7, 0x67, 0x76, 0x28, 0x71, 0xc9, 0x59, 0x09, 0x3c, 0xe4, 0x6f, 0xb7, 0xaa, 0xba, 0xaa, - 0x66, 0xba, 0xba, 0xaa, 0xab, 0xbb, 0xab, 0x07, 0x6e, 0xb4, 0xed, 0x70, 0xa7, 0xd7, 0x9c, 0xb7, - 0xbc, 0xce, 0x15, 0xd3, 0x6f, 0x7b, 0x5d, 0xdf, 0xfb, 0x22, 0xff, 0xf1, 0x31, 0xba, 0x4f, 0xdd, - 0x30, 0xb8, 0xd2, 0xdd, 0x6d, 0x5f, 0x31, 0xbb, 0x76, 0x70, 0x45, 0xfc, 0xf7, 0x7a, 0xbe, 0x45, - 0xaf, 0xec, 0xbf, 0x64, 0x3a, 0xdd, 0x1d, 0xf3, 0xa5, 0x2b, 0x6d, 0xea, 0x52, 0xdf, 0x0c, 0x69, - 0x6b, 0xbe, 0xeb, 0x7b, 0xa1, 0x47, 0x3e, 0x1d, 0xb3, 0x9b, 0x8f, 0xd8, 0xf1, 0x1f, 0xef, 0x89, - 0xe6, 0xf3, 0xdd, 0xdd, 0xf6, 0x3c, 0x63, 0x37, 0xaf, 0xb1, 0x9b, 0x8f, 0xd8, 0xcd, 0x7d, 0xe6, - 0xc8, 0xda, 0x58, 0x5e, 0xa7, 0xe3, 0xb9, 0x69, 0xf9, 0x73, 0x1f, 0xd3, 0x18, 0xb4, 0xbd, 0xb6, - 0x77, 0x85, 0x83, 0x9b, 0xbd, 0x6d, 0xfe, 0x8f, 0xff, 0xe1, 0xbf, 0x24, 0x79, 0x6d, 0xf7, 0x95, - 0x60, 0xde, 0xf6, 0x18, 0xcb, 0x2b, 0x96, 0xe7, 0xb3, 0x07, 0xeb, 0x63, 0xf9, 0x9b, 0x31, 0x4d, - 0xc7, 0xb4, 0x76, 0x6c, 0x97, 0xfa, 0x07, 0xb1, 0x1e, 0x1d, 0x1a, 0x9a, 0x59, 0xad, 0xae, 0x1c, - 0xd6, 0xca, 0xef, 0xb9, 0xa1, 0xdd, 0xa1, 0x7d, 0x0d, 0x7e, 0xeb, 0x51, 0x0d, 0x02, 0x6b, 0x87, - 0x76, 0xcc, 0x74, 0xbb, 0xda, 0x7f, 0x1b, 0x30, 0x5b, 0xbf, 0xb1, 0xb9, 0xb1, 0xe8, 0xb9, 0x41, - 0xaf, 0x43, 0x17, 0x3d, 0x77, 0xdb, 0x6e, 0x93, 0x8f, 0xc3, 0xb8, 0x25, 0x00, 0xfe, 0x96, 0xd9, - 0xae, 0x1a, 0x17, 0x8d, 0xcb, 0x95, 0x85, 0x33, 0x3f, 0xbe, 0x7f, 0xe1, 0xa9, 0x07, 0xf7, 0x2f, - 0x8c, 0x2f, 0xc6, 0x28, 0xd4, 0xe9, 0xc8, 0x0b, 0x30, 0x66, 0xf6, 0x42, 0xaf, 0x6e, 0xed, 0x56, - 0x47, 0x2e, 0x1a, 0x97, 0xcb, 0x0b, 0xd3, 0xb2, 0xc9, 0x58, 0x5d, 0x80, 0x31, 0xc2, 0x93, 0x2b, - 0x50, 0xa1, 0x77, 0x2d, 0xa7, 0x17, 0xd8, 0xfb, 0xb4, 0x3a, 0xca, 0x89, 0x67, 0x25, 0x71, 0x65, - 0x39, 0x42, 0x60, 0x4c, 0xc3, 0x78, 0xbb, 0xde, 0x9a, 0x67, 0x99, 0x4e, 0xb5, 0x90, 0xe4, 0xbd, - 0x2e, 0xc0, 0x18, 0xe1, 0xc9, 0x25, 0x28, 0xb9, 0xde, 0x9b, 0xa6, 0x1d, 0x56, 0x8b, 0x9c, 0x72, - 0x4a, 0x52, 0x96, 0xd6, 0x39, 0x14, 0x25, 0xb6, 0xf6, 0xef, 0xe3, 0x30, 0xcd, 0x9e, 0x7d, 0x99, - 0x19, 0x47, 0x83, 0xdb, 0x12, 0x79, 0x0e, 0x46, 0x7b, 0xbe, 0x23, 0x9f, 0x78, 0x5c, 0x36, 0x1c, - 0xbd, 0x85, 0x6b, 0xc8, 0xe0, 0xe4, 0x15, 0x98, 0xa0, 0x77, 0xad, 0x1d, 0xd3, 0x6d, 0xd3, 0x75, - 0xb3, 0x43, 0xf9, 0x63, 0x56, 0x16, 0xce, 0x4a, 0xba, 0x89, 0x65, 0x0d, 0x87, 0x09, 0x4a, 0xbd, - 0xe5, 0xd6, 0x41, 0x57, 0x3c, 0x73, 0x46, 0x4b, 0x86, 0xc3, 0x04, 0x25, 0x79, 0x19, 0xc0, 0xf7, - 0x7a, 0xa1, 0xed, 0xb6, 0xaf, 0xd3, 0x03, 0xfe, 0xf0, 0x95, 0x05, 0x22, 0xdb, 0x01, 0x2a, 0x0c, - 0x6a, 0x54, 0xe4, 0xb7, 0x61, 0xd6, 0xf2, 0x5c, 0x97, 0x5a, 0xa1, 0xed, 0xb9, 0x0b, 0xa6, 0xb5, - 0xeb, 0x6d, 0x6f, 0xf3, 0xb7, 0x31, 0xfe, 0xf2, 0x2b, 0xf3, 0x47, 0x1e, 0x64, 0x62, 0x94, 0xcc, - 0xcb, 0xf6, 0x0b, 0x4f, 0x3f, 0xb8, 0x7f, 0x61, 0x76, 0x31, 0xcd, 0x16, 0xfb, 0x25, 0x91, 0x17, - 0xa1, 0xfc, 0xc5, 0xc0, 0x73, 0x17, 0xbc, 0xd6, 0x41, 0xb5, 0xc4, 0xfb, 0x60, 0x46, 0x2a, 0x5c, - 0x7e, 0xa3, 0x71, 0x73, 0x9d, 0xc1, 0x51, 0x51, 0x90, 0x5b, 0x30, 0x1a, 0x3a, 0x41, 0x75, 0x8c, - 0xab, 0xf7, 0xea, 0xc0, 0xea, 0x6d, 0xad, 0x35, 0x84, 0xd9, 0x2e, 0x8c, 0xb1, 0xbe, 0xda, 0x5a, - 0x6b, 0x20, 0xe3, 0x47, 0xbe, 0x61, 0x40, 0x99, 0x8d, 0xaf, 0x96, 0x19, 0x9a, 0xd5, 0xf2, 0xc5, - 0xd1, 0xcb, 0xe3, 0x2f, 0x7f, 0x6e, 0xfe, 0x44, 0x0e, 0x66, 0x3e, 0x65, 0x2d, 0xf3, 0x37, 0x24, - 0xfb, 0x65, 0x37, 0xf4, 0x0f, 0xe2, 0x67, 0x8c, 0xc0, 0xa8, 0xe4, 0x93, 0x3f, 0x32, 0x60, 0x3a, - 0xea, 0xd5, 0x25, 0x6a, 0x39, 0xa6, 0x4f, 0xab, 0x15, 0xfe, 0xc0, 0x6f, 0xe5, 0xa1, 0x53, 0x92, - 0xb3, 0x7c, 0x1d, 0x67, 0x1e, 0xdc, 0xbf, 0x30, 0x9d, 0x42, 0x61, 0x5a, 0x0b, 0xf2, 0xbe, 0x01, - 0x13, 0x7b, 0x3d, 0xda, 0x53, 0x6a, 0x01, 0x57, 0xeb, 0x56, 0x0e, 0x6a, 0x6d, 0x6a, 0x6c, 0xa5, - 0x4e, 0x33, 0xcc, 0xd8, 0x75, 0x38, 0x26, 0x84, 0x93, 0x2f, 0x43, 0x85, 0xff, 0x5f, 0xb0, 0xdd, - 0x56, 0x75, 0x9c, 0x6b, 0x82, 0x79, 0x69, 0xc2, 0x78, 0x4a, 0x35, 0x26, 0x99, 0x9f, 0x51, 0x40, - 0x8c, 0x65, 0x92, 0x3b, 0x30, 0x26, 0x5d, 0x5a, 0x75, 0x82, 0x8b, 0xdf, 0xc8, 0x41, 0x7c, 0xc2, - 0xbb, 0x2e, 0x8c, 0x33, 0xaf, 0x25, 0x41, 0x18, 0x49, 0x23, 0x6f, 0x41, 0xc1, 0xec, 0x85, 0x3b, - 0xd5, 0xc9, 0x63, 0x0e, 0x83, 0x05, 0x33, 0xb0, 0xad, 0x7a, 0x2f, 0xdc, 0x59, 0x28, 0x3f, 0xb8, - 0x7f, 0xa1, 0xc0, 0x7e, 0x21, 0xe7, 0x48, 0x10, 0x2a, 0x3d, 0xdf, 0x69, 0x50, 0xcb, 0xa7, 0x61, - 0x75, 0x8a, 0xb3, 0xff, 0x95, 0x79, 0x11, 0x2f, 0x18, 0x87, 0x79, 0x16, 0xba, 0xe6, 0xf7, 0x5f, - 0x9a, 0x17, 0x14, 0xd7, 0xe9, 0x41, 0x83, 0x3a, 0xd4, 0x0a, 0x3d, 0x5f, 0xbc, 0xa6, 0x5b, 0xb8, - 0x26, 0x30, 0x18, 0xb3, 0x21, 0x21, 0x94, 0xb6, 0x6d, 0x27, 0xa4, 0x7e, 0x75, 0x3a, 0x97, 0xb7, - 0xa4, 0x8d, 0xaa, 0xab, 0x9c, 0xef, 0x02, 0x30, 0x8f, 0x2d, 0x7e, 0xa3, 0x94, 0x35, 0xf7, 0x1a, - 0x4c, 0x26, 0x86, 0x1c, 0x99, 0x81, 0xd1, 0x5d, 0x7a, 0x20, 0xdc, 0x35, 0xb2, 0x9f, 0xe4, 0x2c, - 0x14, 0xf7, 0x4d, 0xa7, 0x27, 0x5d, 0x33, 0x8a, 0x3f, 0xaf, 0x8e, 0xbc, 0x62, 0xd4, 0x7e, 0x62, - 0xc0, 0xb3, 0x87, 0x0e, 0x16, 0x16, 0x5f, 0x5a, 0x3d, 0xdf, 0x6c, 0x3a, 0x94, 0x73, 0xd3, 0xe2, - 0xcb, 0x92, 0x00, 0x63, 0x84, 0x67, 0x0e, 0x99, 0x85, 0xb1, 0x25, 0xea, 0xd0, 0x90, 0xca, 0x48, - 0xa7, 0x1c, 0x72, 0x5d, 0x61, 0x50, 0xa3, 0x62, 0x1e, 0xd1, 0x76, 0x43, 0xea, 0xbb, 0xa6, 0x23, - 0xc3, 0x9d, 0xf2, 0x16, 0xab, 0x12, 0x8e, 0x8a, 0x42, 0x8b, 0x60, 0x85, 0x87, 0x46, 0xb0, 0x4f, - 0xc3, 0x99, 0x0c, 0xeb, 0xd6, 0x9a, 0x1b, 0x0f, 0x6d, 0xfe, 0x67, 0x23, 0x70, 0x2e, 0x7b, 0x9c, - 0x92, 0x8b, 0x50, 0x70, 0x59, 0x80, 0x13, 0x81, 0x70, 0x42, 0x32, 0x28, 0xf0, 0xc0, 0xc6, 0x31, - 0xfa, 0x0b, 0x1b, 0x19, 0xe8, 0x85, 0x8d, 0x1e, 0xe9, 0x85, 0x25, 0x26, 0x08, 0x85, 0x23, 0x4c, - 0x10, 0x8e, 0x18, 0xf5, 0x19, 0x63, 0xd3, 0x6f, 0xf7, 0x3a, 0xcc, 0x08, 0x79, 0x70, 0xaa, 0xc4, - 0x8c, 0xeb, 0x11, 0x02, 0x63, 0x9a, 0xda, 0x37, 0x8a, 0xf0, 0x6c, 0xfd, 0x5e, 0xcf, 0xa7, 0xdc, - 0x46, 0x83, 0x6b, 0xbd, 0xa6, 0x3e, 0x61, 0xb8, 0x08, 0x85, 0xed, 0xbd, 0x96, 0x9b, 0x7e, 0x51, - 0x57, 0x37, 0x97, 0xd6, 0x91, 0x63, 0x48, 0x17, 0xce, 0x04, 0x3b, 0xa6, 0x4f, 0x5b, 0x75, 0xcb, - 0xa2, 0x41, 0x70, 0x9d, 0x1e, 0xa8, 0xa9, 0xc3, 0x91, 0x07, 0xe2, 0x33, 0x0f, 0xee, 0x5f, 0x38, - 0xd3, 0xe8, 0xe7, 0x82, 0x59, 0xac, 0x49, 0x0b, 0xa6, 0x53, 0x60, 0xfe, 0xd2, 0x8f, 0x2c, 0x8d, - 0x07, 0x8e, 0x94, 0x34, 0x4c, 0xb3, 0x64, 0x06, 0xb0, 0xd3, 0x6b, 0xf2, 0x67, 0x11, 0x93, 0x12, - 0x65, 0x00, 0xd7, 0x04, 0x18, 0x23, 0x3c, 0xf9, 0x43, 0x3d, 0x14, 0x17, 0x79, 0x28, 0xde, 0x3e, - 0xa9, 0x5b, 0x3d, 0xac, 0x47, 0x06, 0x08, 0xca, 0xb1, 0x13, 0x2b, 0x9d, 0x16, 0x27, 0xf6, 0x33, - 0x03, 0x26, 0x17, 0xec, 0xb0, 0xd9, 0xb3, 0x76, 0x69, 0xc8, 0x7c, 0x3c, 0xf1, 0xa1, 0xd8, 0x64, - 0xae, 0x9f, 0xb7, 0x1f, 0x7f, 0x79, 0xf3, 0x84, 0xcf, 0xa0, 0x98, 0xc7, 0xf1, 0xa4, 0xf2, 0xe0, - 0xfe, 0x85, 0x22, 0xff, 0x8b, 0x42, 0x14, 0xb9, 0x05, 0xe0, 0xb1, 0xd0, 0xb2, 0xe5, 0xed, 0x52, - 0x77, 0x30, 0x4b, 0x9e, 0x62, 0x63, 0xfe, 0x66, 0x3d, 0x6a, 0x8c, 0x1a, 0xa3, 0xda, 0x8f, 0x0c, - 0x20, 0xfd, 0xf2, 0xc9, 0x4d, 0x28, 0xf7, 0x02, 0xe6, 0x18, 0xa5, 0x3f, 0x3a, 0xb2, 0xac, 0x09, - 0xd6, 0xef, 0xb7, 0x64, 0x53, 0x54, 0x4c, 0x18, 0xc3, 0xae, 0x19, 0x04, 0x77, 0x3c, 0xbf, 0x35, - 0x98, 0xf2, 0x9c, 0xe1, 0x86, 0x6c, 0x8a, 0x8a, 0x49, 0xed, 0xef, 0x4a, 0x70, 0x56, 0x29, 0xae, - 0x7b, 0x87, 0x37, 0x80, 0xb4, 0xb8, 0x3f, 0xbb, 0xe6, 0x79, 0xbb, 0x37, 0xdd, 0xab, 0xb6, 0x6b, - 0x07, 0x3b, 0xd2, 0x2b, 0xcf, 0x49, 0xcb, 0x24, 0x4b, 0x7d, 0x14, 0x98, 0xd1, 0x8a, 0x7c, 0x47, - 0x1f, 0x44, 0x23, 0x7c, 0x10, 0x99, 0x79, 0x75, 0xf6, 0x71, 0xc7, 0xcf, 0xd8, 0x1d, 0xda, 0xdc, - 0xf1, 0xbc, 0x5d, 0xe9, 0x5f, 0x6e, 0x9c, 0x50, 0x9f, 0x37, 0x05, 0xb7, 0x45, 0xcf, 0x0d, 0xe9, - 0xdd, 0x50, 0x4c, 0x94, 0x24, 0x0c, 0x23, 0x51, 0xe4, 0x8b, 0x72, 0xa2, 0x54, 0xe0, 0x22, 0xd7, - 0xf2, 0x7a, 0x05, 0x99, 0x53, 0xa7, 0x1a, 0x94, 0x44, 0x2b, 0xee, 0xb5, 0x2a, 0x62, 0x3c, 0x0b, - 0xaf, 0x83, 0x12, 0x43, 0x9e, 0x87, 0xa2, 0x77, 0xc7, 0x95, 0x4e, 0xa4, 0xb2, 0x30, 0x29, 0x5f, - 0x58, 0xf1, 0x26, 0x03, 0xa2, 0xc0, 0xb1, 0x10, 0xc8, 0x14, 0xa3, 0x16, 0xb3, 0x27, 0x9e, 0xea, - 0x68, 0x49, 0xdc, 0x86, 0xc2, 0xa0, 0x46, 0x45, 0x5e, 0x87, 0x29, 0x9f, 0x76, 0xbd, 0xc0, 0x0e, - 0x3d, 0xff, 0xa0, 0xe1, 0xf4, 0xda, 0xd5, 0x32, 0x6f, 0x77, 0x4e, 0xb6, 0x9b, 0xc2, 0x04, 0x16, - 0x53, 0xd4, 0x9a, 0x7b, 0xab, 0x9c, 0x16, 0xf7, 0xf6, 0xbf, 0x65, 0x98, 0x53, 0x3d, 0xd2, 0xa0, - 0xfe, 0x3e, 0xf5, 0xf5, 0xe1, 0xa4, 0x19, 0x9c, 0xf1, 0xf8, 0x0c, 0xee, 0x53, 0x89, 0xbe, 0x13, - 0x29, 0xff, 0x47, 0x65, 0x1f, 0x9c, 0x5d, 0xa2, 0x5d, 0x9f, 0x5a, 0x66, 0x48, 0x5b, 0x87, 0xf4, - 0xe2, 0xb5, 0xbe, 0x5e, 0x14, 0xa9, 0xff, 0x45, 0xc9, 0xa1, 0x1a, 0x73, 0x78, 0x44, 0x7f, 0xfe, - 0xbe, 0x01, 0x13, 0x0a, 0x64, 0xd3, 0xa0, 0x5a, 0xe0, 0x4e, 0xe0, 0xad, 0xbc, 0x46, 0x80, 0x78, - 0xdf, 0xb1, 0x12, 0xf1, 0xea, 0x04, 0x6a, 0x52, 0x31, 0xa1, 0xc3, 0x91, 0x46, 0xc8, 0x5b, 0x30, - 0x6e, 0xf2, 0x69, 0x83, 0x88, 0x17, 0xa5, 0x41, 0x5c, 0xee, 0xf4, 0x83, 0xfb, 0x17, 0xc6, 0xeb, - 0x71, 0x6b, 0xd4, 0x59, 0x91, 0x77, 0x61, 0x52, 0xf6, 0x92, 0x4c, 0x6f, 0xc6, 0x06, 0xe1, 0x3d, - 0xfb, 0xe0, 0xfe, 0x85, 0xc9, 0x37, 0xf5, 0xf6, 0x98, 0x64, 0x47, 0x6e, 0xc3, 0xb9, 0x66, 0xf4, - 0x7a, 0x02, 0xfe, 0x7a, 0x16, 0xcc, 0x80, 0xde, 0xc2, 0x35, 0x39, 0x14, 0xcf, 0xcb, 0x37, 0x74, - 0x2e, 0xf5, 0x12, 0x25, 0x15, 0x1e, 0xd2, 0xfa, 0x90, 0xb8, 0x50, 0x39, 0x56, 0x5c, 0xf8, 0x9e, - 0x1e, 0x17, 0x80, 0x9b, 0x44, 0x3b, 0x5f, 0x93, 0x38, 0xe9, 0xec, 0x6a, 0xfc, 0xb4, 0xb8, 0x9f, - 0xef, 0x18, 0xf0, 0xec, 0xa1, 0xc3, 0x21, 0xe5, 0xc3, 0x8d, 0x63, 0xfa, 0xf0, 0x91, 0x41, 0x7c, - 0x78, 0xed, 0xcf, 0x8b, 0x70, 0x66, 0xd1, 0x74, 0xa8, 0xdb, 0x32, 0x13, 0x9e, 0xf0, 0x45, 0x28, - 0x07, 0xd6, 0x0e, 0x6d, 0xf5, 0x9c, 0x28, 0x47, 0x53, 0x5d, 0xd1, 0x90, 0x70, 0x54, 0x14, 0x2a, - 0xfb, 0xdc, 0x37, 0x1d, 0x29, 0x3f, 0x99, 0x7d, 0xee, 0xab, 0xec, 0x73, 0xdf, 0x74, 0xc8, 0xab, - 0x30, 0x25, 0xd3, 0x2a, 0xcf, 0x5d, 0x32, 0x43, 0x1a, 0x54, 0x47, 0xf9, 0xd0, 0x26, 0x4c, 0xdf, - 0xe5, 0x04, 0x06, 0x53, 0x94, 0x4c, 0x52, 0x68, 0x77, 0xe8, 0x3d, 0xcf, 0x8d, 0xb2, 0x02, 0x25, - 0x69, 0x4b, 0xc2, 0x51, 0x51, 0x90, 0x6f, 0xf7, 0xe7, 0x05, 0x5f, 0x38, 0xa1, 0x95, 0x64, 0xbc, - 0xac, 0x01, 0x6c, 0xf6, 0xab, 0x06, 0x8c, 0x77, 0xa9, 0x1f, 0xd8, 0x41, 0x48, 0x5d, 0x8b, 0x4a, - 0x57, 0x75, 0x33, 0x0f, 0xcb, 0xdd, 0x88, 0xd9, 0x0a, 0xa7, 0xa6, 0x01, 0x50, 0x17, 0xaa, 0x0d, - 0x9c, 0xf2, 0x69, 0x19, 0x38, 0x77, 0xe1, 0xec, 0xa2, 0x19, 0x5a, 0x3b, 0xbd, 0xae, 0x58, 0x3f, - 0xe8, 0xf9, 0x66, 0x68, 0x7b, 0x2e, 0xcb, 0x11, 0xa9, 0x6b, 0x36, 0x1d, 0xda, 0x4a, 0xaf, 0xaa, - 0x2c, 0x0b, 0x30, 0x46, 0x78, 0xf2, 0x71, 0x18, 0xef, 0x98, 0x77, 0x97, 0x64, 0x4b, 0x69, 0xa6, - 0x6a, 0xcf, 0xe1, 0x46, 0x8c, 0x42, 0x9d, 0xae, 0xf6, 0x25, 0x38, 0x2b, 0x44, 0xde, 0x30, 0xbb, - 0xda, 0x1b, 0x3d, 0xc2, 0x02, 0xc6, 0x12, 0xcc, 0x58, 0x3e, 0x35, 0x43, 0xba, 0xba, 0xbd, 0xee, - 0x85, 0xcb, 0x77, 0xed, 0x20, 0x94, 0x2b, 0x19, 0x55, 0x49, 0x3d, 0xb3, 0x98, 0xc2, 0x63, 0x5f, - 0x8b, 0xda, 0x77, 0xc7, 0x80, 0x2c, 0x77, 0xec, 0x30, 0x4c, 0xce, 0x54, 0x2e, 0x41, 0xa9, 0xe9, - 0x7b, 0xbb, 0xd4, 0x97, 0x0a, 0xa8, 0xd5, 0x88, 0x05, 0x0e, 0x45, 0x89, 0x65, 0x3e, 0xc5, 0xda, - 0x31, 0x5d, 0x97, 0x3a, 0xf1, 0xdc, 0x42, 0xf9, 0x94, 0x45, 0x85, 0x41, 0x8d, 0x8a, 0xef, 0xce, - 0x88, 0x7f, 0x3c, 0xf9, 0x1e, 0x4d, 0xed, 0xce, 0xc4, 0x28, 0xd4, 0xe9, 0x12, 0x69, 0x54, 0x21, - 0xef, 0x34, 0xaa, 0x98, 0x43, 0x1a, 0x95, 0xbd, 0x6b, 0x51, 0x7a, 0x22, 0xbb, 0x16, 0x63, 0x47, - 0xdd, 0xb5, 0x28, 0xe7, 0xbc, 0x6b, 0xf1, 0x2d, 0xdd, 0x25, 0x56, 0xb8, 0x4b, 0x7c, 0xef, 0xa4, - 0xe3, 0xbf, 0xcf, 0x3c, 0x8f, 0x15, 0xc5, 0xe1, 0xb4, 0x38, 0xa3, 0x0f, 0x46, 0x60, 0x26, 0xed, - 0x72, 0xc9, 0x3d, 0x18, 0xb3, 0x84, 0x87, 0x92, 0xa9, 0x43, 0xe3, 0xc4, 0x81, 0xa6, 0xdf, 0xdf, - 0xc9, 0xa5, 0x7d, 0x81, 0xc1, 0x48, 0x20, 0xf9, 0x8a, 0x01, 0x15, 0x2b, 0x72, 0x52, 0x72, 0xc5, - 0xe1, 0xc4, 0xe2, 0x33, 0x9c, 0x9e, 0x58, 0xaf, 0x57, 0x18, 0x8c, 0x85, 0xd6, 0x7e, 0x3e, 0x02, - 0xe3, 0xba, 0x7f, 0xfa, 0x82, 0x66, 0x65, 0xe2, 0x7d, 0xfc, 0xba, 0x36, 0x76, 0xd5, 0x16, 0x72, - 0xac, 0x04, 0xa3, 0x66, 0xa3, 0xf9, 0x66, 0x93, 0x4d, 0x6d, 0x58, 0xe7, 0xc4, 0x7e, 0x2a, 0x86, - 0x69, 0x86, 0xd3, 0x85, 0x42, 0xd0, 0xa5, 0x96, 0x7c, 0xdc, 0xf5, 0xfc, 0xcc, 0xa6, 0xd1, 0xa5, - 0x56, 0xec, 0xd0, 0xd9, 0x3f, 0xe4, 0x92, 0xc8, 0x5d, 0x28, 0x05, 0xa1, 0x19, 0xf6, 0x02, 0xb9, - 0x1a, 0x91, 0xa3, 0xa9, 0x36, 0x38, 0xdf, 0xd8, 0x8b, 0x8b, 0xff, 0x28, 0xe5, 0xd5, 0x56, 0x60, - 0xb6, 0xcf, 0xae, 0x99, 0x6b, 0xa7, 0x77, 0xbb, 0x3e, 0x0d, 0xd8, 0xec, 0x28, 0x3d, 0x5d, 0x5c, - 0x56, 0x18, 0xd4, 0xa8, 0x6a, 0xbf, 0x30, 0x60, 0x5a, 0xe3, 0xb4, 0x66, 0x07, 0x21, 0xf9, 0x5c, - 0x5f, 0x57, 0xcd, 0x1f, 0xad, 0xab, 0x58, 0x6b, 0xde, 0x51, 0x6a, 0x7c, 0x47, 0x10, 0xad, 0x9b, - 0x3c, 0x28, 0xda, 0x21, 0xed, 0x04, 0x72, 0x45, 0xe9, 0x8d, 0xfc, 0xde, 0x59, 0xbc, 0x12, 0xb2, - 0xca, 0x04, 0xa0, 0x90, 0x53, 0xfb, 0x97, 0x57, 0x13, 0x8f, 0xc8, 0xfa, 0x8f, 0x6f, 0x8e, 0x33, - 0xd0, 0x42, 0x2f, 0x58, 0x8f, 0x83, 0x76, 0xbc, 0x39, 0xae, 0xe1, 0x30, 0x41, 0x49, 0xf6, 0xa0, - 0x1c, 0xd2, 0x4e, 0xd7, 0x31, 0xc3, 0x68, 0x45, 0x7d, 0xe5, 0x84, 0x4f, 0xb0, 0x25, 0xd9, 0x89, - 0x28, 0x15, 0xfd, 0x43, 0x25, 0x86, 0x74, 0x60, 0x8c, 0x25, 0x73, 0xb6, 0x45, 0xa5, 0x9d, 0x5d, - 0x3d, 0xa1, 0xc4, 0x86, 0xe0, 0x26, 0x9c, 0x87, 0xfc, 0x83, 0x91, 0x0c, 0xf2, 0x25, 0x28, 0x76, - 0x6c, 0xd7, 0xf6, 0x64, 0xb6, 0xff, 0x76, 0xbe, 0x03, 0x69, 0xfe, 0x06, 0xe3, 0x2d, 0xc2, 0x80, - 0xea, 0x2f, 0x0e, 0x43, 0x21, 0x96, 0x6f, 0xa3, 0x5b, 0x72, 0x52, 0x2d, 0xe7, 0xe8, 0x9f, 0xcb, - 0x59, 0x07, 0x35, 0x67, 0x4f, 0x46, 0xa3, 0x08, 0x8c, 0x4a, 0x3e, 0xb9, 0x07, 0x85, 0x6d, 0xdb, - 0x61, 0xf3, 0xf2, 0x3c, 0x56, 0x3e, 0xd2, 0x7a, 0x5c, 0xb5, 0x1d, 0x2a, 0x74, 0x88, 0xf7, 0x71, - 0x6c, 0x87, 0x22, 0x97, 0xc9, 0x5f, 0x84, 0x4f, 0x05, 0x8f, 0xea, 0xd8, 0x50, 0x5e, 0x04, 0x4a, - 0xf6, 0xa9, 0x17, 0x11, 0x81, 0x51, 0xc9, 0x27, 0xbf, 0x6b, 0xc4, 0x4b, 0x61, 0xe2, 0x6c, 0xc3, - 0x3b, 0x39, 0xeb, 0x22, 0xd7, 0x45, 0x84, 0x2a, 0x6a, 0xda, 0xde, 0xb7, 0x38, 0x76, 0x0f, 0x0a, - 0x66, 0x67, 0xaf, 0x2b, 0xa7, 0x2a, 0x79, 0xf7, 0x48, 0xbd, 0xb3, 0xd7, 0x4d, 0xf5, 0x48, 0xfd, - 0xc6, 0xe6, 0x06, 0x72, 0x99, 0x6c, 0x68, 0xec, 0x9a, 0xdb, 0xbb, 0xd1, 0xaa, 0x47, 0xde, 0x43, - 0xe3, 0x3a, 0xe3, 0x9d, 0x1a, 0x1a, 0x1c, 0x86, 0x42, 0x2c, 0x7b, 0xf6, 0xce, 0x5e, 0x18, 0x56, - 0xc7, 0x87, 0xf2, 0xec, 0x37, 0xf6, 0xc2, 0x30, 0xf5, 0xec, 0x37, 0x36, 0xb7, 0xb6, 0x90, 0xcb, - 0x64, 0xb2, 0x5d, 0x33, 0x0c, 0xaa, 0x13, 0x43, 0x91, 0xbd, 0x6e, 0x86, 0x41, 0x4a, 0xf6, 0x7a, - 0x7d, 0xab, 0x81, 0x5c, 0x26, 0xd9, 0x87, 0xd1, 0xc0, 0x0d, 0xaa, 0x93, 0x5c, 0xf4, 0x9b, 0x39, - 0x8b, 0x6e, 0xb8, 0x52, 0xb2, 0x3a, 0x7d, 0xd5, 0x58, 0x6f, 0x20, 0x13, 0xc8, 0xe5, 0xee, 0x05, - 0xd5, 0xa9, 0xe1, 0xc8, 0xdd, 0xeb, 0x93, 0xbb, 0xc9, 0xe4, 0xee, 0x05, 0xe4, 0xab, 0x06, 0x94, - 0xba, 0xbd, 0x66, 0xa3, 0xd7, 0xac, 0x4e, 0x73, 0xd9, 0x9f, 0xcd, 0x59, 0xf6, 0x06, 0x67, 0x2e, - 0xc4, 0xab, 0x39, 0x86, 0x00, 0xa2, 0x94, 0xcc, 0x95, 0x10, 0x52, 0xab, 0x33, 0x43, 0x51, 0x62, - 0x85, 0x73, 0x4b, 0x29, 0x21, 0x80, 0x28, 0x25, 0x47, 0x4a, 0x38, 0x66, 0xb3, 0x3a, 0x3b, 0x2c, - 0x25, 0x1c, 0x33, 0x43, 0x09, 0xc7, 0x14, 0x4a, 0x38, 0x66, 0x93, 0x99, 0xfe, 0x4e, 0x6b, 0x3b, - 0xa8, 0x92, 0xa1, 0x98, 0xfe, 0xb5, 0xd6, 0x76, 0xda, 0xf4, 0xaf, 0x2d, 0x5d, 0x6d, 0x20, 0x97, - 0xc9, 0x5c, 0x4e, 0xe0, 0x98, 0xd6, 0x6e, 0xf5, 0xcc, 0x50, 0x5c, 0x4e, 0x83, 0xf1, 0x4e, 0xb9, - 0x1c, 0x0e, 0x43, 0x21, 0x96, 0x7c, 0xdf, 0x80, 0xf1, 0x20, 0xf4, 0x7c, 0xb3, 0x4d, 0x57, 0x7c, - 0xbb, 0x55, 0x3d, 0x9b, 0x4f, 0x86, 0x98, 0x56, 0x23, 0x96, 0x20, 0x94, 0x51, 0xab, 0x0b, 0x1a, - 0x06, 0x75, 0x45, 0xc8, 0x9f, 0x1a, 0x30, 0x65, 0x26, 0xf6, 0xe4, 0xab, 0x4f, 0x73, 0xdd, 0x9a, - 0x79, 0x87, 0x84, 0xe4, 0xc6, 0x3f, 0x57, 0x4f, 0xad, 0xa6, 0x26, 0x91, 0x98, 0xd2, 0x88, 0x9b, - 0x6f, 0x10, 0xfa, 0x76, 0x97, 0x56, 0xcf, 0x0d, 0xc5, 0x7c, 0x1b, 0x9c, 0x79, 0xca, 0x7c, 0x05, - 0x10, 0xa5, 0x64, 0x1e, 0xba, 0xa9, 0x48, 0xc9, 0xab, 0xcf, 0x0c, 0x25, 0x74, 0x47, 0x09, 0x7f, - 0x32, 0x74, 0x4b, 0x28, 0x46, 0xc2, 0x99, 0x2d, 0xfb, 0xb4, 0x65, 0x07, 0xd5, 0xea, 0x50, 0x6c, - 0x19, 0x19, 0xef, 0x94, 0x2d, 0x73, 0x18, 0x0a, 0xb1, 0xcc, 0x9d, 0xbb, 0xc1, 0x5e, 0xf5, 0xd9, - 0xa1, 0xb8, 0xf3, 0xf5, 0x60, 0x2f, 0xe5, 0xce, 0xd7, 0x1b, 0x9b, 0xc8, 0x04, 0x4a, 0x77, 0xee, - 0x04, 0xa6, 0x5f, 0x9d, 0x1b, 0x92, 0x3b, 0x67, 0xcc, 0xfb, 0xdc, 0x39, 0x03, 0xa2, 0x94, 0xcc, - 0xad, 0x80, 0x1f, 0xc6, 0xb6, 0xad, 0xea, 0x47, 0x86, 0x62, 0x05, 0x2b, 0x82, 0x7b, 0xca, 0x0a, - 0x24, 0x14, 0x23, 0xe1, 0xe4, 0x32, 0x9b, 0xd5, 0x76, 0x1d, 0xdb, 0x32, 0x83, 0xea, 0x47, 0x2f, - 0x1a, 0x97, 0x8b, 0x22, 0xf1, 0x41, 0x09, 0x43, 0x85, 0x25, 0x3f, 0x34, 0x60, 0x3a, 0xb5, 0x9f, - 0x55, 0x7d, 0x8e, 0xab, 0x6e, 0xe5, 0xac, 0xfa, 0x42, 0x52, 0x8a, 0x78, 0x84, 0x67, 0xe4, 0x23, - 0x4c, 0xa7, 0x77, 0x68, 0xd2, 0x4a, 0x91, 0x6f, 0x1b, 0x50, 0x51, 0xb0, 0xea, 0x79, 0xae, 0xe2, - 0xe7, 0x87, 0xa5, 0xa2, 0x50, 0x4e, 0x1d, 0x21, 0x53, 0x70, 0x8c, 0x55, 0x98, 0xeb, 0x01, 0xc4, - 0x79, 0x56, 0xc6, 0x5a, 0xd6, 0xa6, 0xbe, 0x96, 0x35, 0xfe, 0xf2, 0x6b, 0x03, 0xaf, 0x26, 0x36, - 0x7e, 0xa3, 0xee, 0x87, 0xf6, 0xb6, 0x69, 0x85, 0xda, 0x42, 0xd8, 0xdc, 0x77, 0x0c, 0x98, 0x4c, - 0xe4, 0x56, 0x19, 0xa2, 0x77, 0x92, 0xa2, 0x31, 0xff, 0xed, 0x17, 0x5d, 0xa3, 0xdf, 0x33, 0xa0, - 0xa2, 0xb2, 0xac, 0x0c, 0x6d, 0x5a, 0x49, 0x6d, 0x4e, 0xba, 0x6a, 0xc4, 0x45, 0x65, 0x6b, 0xc2, - 0xde, 0x4d, 0x22, 0xdd, 0x1a, 0xfe, 0xbb, 0x51, 0xe2, 0xb2, 0x35, 0xfa, 0xba, 0x01, 0x13, 0x7a, - 0xd2, 0x95, 0xa1, 0x90, 0x95, 0x54, 0x28, 0xdf, 0xd3, 0x0f, 0xe9, 0x7e, 0x52, 0xb9, 0xd7, 0xf0, - 0xfb, 0x29, 0x75, 0xae, 0x3e, 0xf5, 0x56, 0x20, 0x4e, 0xc4, 0x32, 0x54, 0xa1, 0x49, 0x55, 0x4e, - 0xba, 0x57, 0x27, 0x64, 0x1d, 0x6e, 0xbd, 0x2a, 0x2b, 0x1b, 0xfe, 0x5b, 0x61, 0xd9, 0xde, 0x21, - 0x9a, 0x7c, 0xcd, 0x80, 0x8a, 0xca, 0xd1, 0x86, 0xff, 0x52, 0x58, 0xee, 0x27, 0x66, 0x51, 0xfd, - 0xaa, 0xfc, 0x8e, 0x01, 0xe5, 0x28, 0x67, 0x1b, 0xbe, 0xc9, 0x36, 0xd6, 0x1b, 0x87, 0xbc, 0x12, - 0xae, 0xc7, 0xde, 0x63, 0xd3, 0x63, 0xf3, 0x30, 0x3d, 0xde, 0x37, 0x60, 0x5c, 0xcb, 0xe7, 0x32, - 0x54, 0xd9, 0x4e, 0xaa, 0x72, 0xd2, 0x65, 0x6a, 0x29, 0xec, 0x70, 0x6d, 0xb4, 0xc4, 0x6e, 0xf8, - 0xda, 0x48, 0x61, 0x0f, 0xd5, 0x26, 0xca, 0xf0, 0x1e, 0x8b, 0x36, 0x4c, 0xd8, 0xe1, 0xc3, 0x59, - 0x65, 0x7b, 0xc3, 0x1f, 0xce, 0x2c, 0x8b, 0x7c, 0x88, 0x93, 0x8b, 0x53, 0xbf, 0xe1, 0x8f, 0x67, - 0x21, 0x2b, 0x5b, 0x97, 0xef, 0x19, 0x30, 0x93, 0xce, 0xff, 0x32, 0x34, 0xda, 0x4d, 0x6a, 0x74, - 0xd2, 0x72, 0x21, 0x5d, 0x62, 0xb6, 0x5e, 0x7f, 0x62, 0xc0, 0x99, 0x8c, 0xdc, 0x2f, 0x43, 0x35, - 0x37, 0xa9, 0xda, 0x5b, 0xc3, 0x3a, 0x69, 0x9e, 0xb6, 0x6c, 0x2d, 0xf9, 0x1b, 0xbe, 0x65, 0x4b, - 0x61, 0xd9, 0xda, 0x7c, 0xcb, 0x80, 0x09, 0x3d, 0x09, 0xcc, 0x50, 0xa7, 0x9d, 0x54, 0x67, 0x33, - 0xf7, 0x3d, 0xe6, 0xb4, 0x7d, 0xc7, 0xe9, 0xe0, 0xf0, 0xed, 0x5b, 0xc8, 0x3a, 0x3c, 0x4e, 0x44, - 0xc9, 0xe1, 0xf0, 0xe3, 0xc4, 0x7a, 0x63, 0xf3, 0xa1, 0x71, 0x42, 0x25, 0x8a, 0x8f, 0x23, 0x4e, - 0x70, 0x61, 0x87, 0x5b, 0x8c, 0x9e, 0x30, 0x0e, 0xdf, 0x62, 0x22, 0x69, 0xd9, 0xfa, 0xfc, 0xc0, - 0xd0, 0x4e, 0xd4, 0x6b, 0x59, 0x60, 0x86, 0x5e, 0x5e, 0x52, 0xaf, 0xb7, 0x87, 0x76, 0xf6, 0x51, - 0xd7, 0xef, 0x03, 0x03, 0xa6, 0x92, 0x29, 0x60, 0x86, 0x66, 0x76, 0x52, 0xb3, 0xc6, 0x10, 0x4e, - 0xeb, 0xeb, 0xe7, 0x1e, 0xc2, 0xc4, 0x2e, 0xb4, 0xd8, 0xa2, 0x26, 0xef, 0xa9, 0x4d, 0x71, 0xb1, - 0x77, 0xfc, 0x89, 0xc1, 0x73, 0xcb, 0x87, 0xef, 0x7d, 0xff, 0x4d, 0x01, 0xa6, 0x53, 0x79, 0x16, - 0x2f, 0xde, 0x62, 0x7f, 0x79, 0xa5, 0xb3, 0x91, 0xac, 0xb1, 0x5a, 0x8e, 0x10, 0x18, 0xd3, 0x90, - 0x0f, 0x0c, 0x98, 0xbe, 0x63, 0x86, 0xd6, 0xce, 0x86, 0x19, 0xee, 0x88, 0x03, 0x0c, 0x39, 0x45, - 0xdd, 0x37, 0x93, 0x5c, 0xe3, 0x55, 0x84, 0x14, 0x02, 0xd3, 0xf2, 0xc9, 0x0b, 0x30, 0xd6, 0xf5, - 0x1c, 0xc7, 0x76, 0xdb, 0xb2, 0x64, 0x4d, 0xad, 0xa1, 0x6c, 0x08, 0x30, 0x46, 0xf8, 0x64, 0xa9, - 0x71, 0x21, 0x97, 0xad, 0xc1, 0xd4, 0x2b, 0x3d, 0xd6, 0x89, 0x9d, 0xe2, 0x69, 0x39, 0xb1, 0xf3, - 0xcf, 0x05, 0x20, 0xfd, 0xfe, 0xe0, 0x51, 0xc5, 0xf8, 0x97, 0xa0, 0x64, 0xc5, 0xa6, 0xa2, 0x9d, - 0xb1, 0x93, 0x3d, 0x2a, 0xb1, 0xe2, 0xf4, 0x6b, 0x40, 0xad, 0x9e, 0x4f, 0xfb, 0x6b, 0x2f, 0x05, - 0x1c, 0x15, 0x45, 0xe2, 0x14, 0x58, 0xe1, 0x91, 0xa7, 0xc0, 0xbe, 0xd5, 0x7f, 0x82, 0xf5, 0xbd, - 0xdc, 0x1d, 0xe3, 0x00, 0x9d, 0x7f, 0x8b, 0x97, 0x5a, 0xee, 0xc8, 0xd3, 0xf0, 0xa5, 0x81, 0x2b, - 0xb3, 0xea, 0xaa, 0x31, 0x6a, 0x8c, 0x34, 0x9b, 0x1a, 0x3b, 0x2d, 0x36, 0xf5, 0x4f, 0x06, 0x4c, - 0x89, 0x64, 0xa4, 0xde, 0xed, 0x2e, 0xfa, 0xb4, 0x15, 0xb0, 0x97, 0xd3, 0xf5, 0xed, 0x7d, 0x33, - 0xa4, 0xd1, 0x01, 0xee, 0xc1, 0x5e, 0xce, 0x86, 0x6a, 0x8c, 0x1a, 0x23, 0xf2, 0x3c, 0x14, 0xcd, - 0x6e, 0x77, 0x75, 0x89, 0xeb, 0x30, 0x1a, 0x2f, 0x76, 0xd7, 0x19, 0x10, 0x05, 0x8e, 0xbc, 0x0e, - 0x53, 0xb6, 0x1b, 0x84, 0xa6, 0xe3, 0xf0, 0x93, 0x62, 0xab, 0x4b, 0xdc, 0x14, 0x47, 0xe3, 0xad, - 0x8b, 0xd5, 0x04, 0x16, 0x53, 0xd4, 0xb5, 0xbf, 0x1d, 0x87, 0xd9, 0xbe, 0xdc, 0x8a, 0xcc, 0xc1, - 0x88, 0x2d, 0x8e, 0xd6, 0x8e, 0x2e, 0x80, 0xe4, 0x34, 0xb2, 0xba, 0x84, 0x23, 0x76, 0x4b, 0x2f, - 0x96, 0x19, 0x79, 0x7c, 0xc5, 0x32, 0x1f, 0x8b, 0xaa, 0xa1, 0xc4, 0xb1, 0x54, 0xe5, 0x6e, 0xe3, - 0x2a, 0x97, 0x44, 0x5d, 0xd4, 0xa7, 0x00, 0xe2, 0x13, 0xef, 0xf2, 0xc4, 0x78, 0x46, 0x6d, 0x4d, - 0x7c, 0x4a, 0x1e, 0x35, 0xfa, 0x23, 0x15, 0x9f, 0xdc, 0x84, 0xb2, 0xd9, 0xb5, 0x8f, 0x51, 0x79, - 0xc2, 0x97, 0xc1, 0xeb, 0x1b, 0xab, 0xa2, 0xec, 0x44, 0x31, 0x19, 0x7a, 0xcd, 0x89, 0xee, 0xae, - 0xca, 0x8f, 0x74, 0x57, 0x97, 0xa0, 0x64, 0x5a, 0xa1, 0xbd, 0x4f, 0x65, 0xf5, 0x88, 0x72, 0x82, - 0x75, 0x0e, 0x45, 0x89, 0x95, 0x57, 0xba, 0x84, 0x51, 0x50, 0x86, 0xbe, 0x2b, 0x5d, 0x22, 0x14, - 0xea, 0x74, 0xe4, 0x35, 0x98, 0x14, 0x46, 0x13, 0xd5, 0xbd, 0x8c, 0xf3, 0x86, 0x4f, 0xcb, 0x86, - 0x93, 0x2b, 0x3a, 0x12, 0x93, 0xb4, 0xa4, 0x0e, 0xd3, 0x02, 0x70, 0xab, 0xeb, 0x78, 0x66, 0x8b, - 0x35, 0x9f, 0x48, 0x5a, 0xc5, 0x4a, 0x12, 0x8d, 0x69, 0xfa, 0x43, 0x0a, 0x65, 0x26, 0x8f, 0x55, - 0x28, 0xf3, 0x4d, 0xdd, 0x57, 0x8b, 0x43, 0x04, 0xef, 0xe6, 0xbd, 0xda, 0x31, 0x80, 0xab, 0xfe, - 0x46, 0xba, 0x9c, 0x4b, 0x9c, 0x2d, 0x38, 0xa9, 0x6b, 0x65, 0xc3, 0xab, 0xa5, 0x17, 0x6c, 0x1d, - 0xa9, 0x8c, 0xeb, 0x13, 0x30, 0xe9, 0xf9, 0x6d, 0xd3, 0xb5, 0xef, 0x71, 0x87, 0x13, 0xf0, 0x33, - 0x06, 0x15, 0x61, 0xad, 0x37, 0x75, 0x04, 0x26, 0xe9, 0xc8, 0x3d, 0xa8, 0xb4, 0x23, 0x2f, 0x5b, - 0x9d, 0xcd, 0xc5, 0xcf, 0x24, 0xbd, 0xb6, 0x38, 0xd4, 0xaa, 0x60, 0x18, 0x8b, 0xd3, 0xa2, 0x12, - 0x39, 0x2d, 0x51, 0xe9, 0xdf, 0xc6, 0xb8, 0x1b, 0x4f, 0x2e, 0x4a, 0x3d, 0xa1, 0xba, 0xc6, 0x4f, - 0x42, 0x45, 0x56, 0x2a, 0xc9, 0xd8, 0x55, 0x59, 0xf8, 0x88, 0x34, 0x95, 0x33, 0x7d, 0x65, 0x8d, - 0xab, 0x4b, 0x18, 0x53, 0x6b, 0x8e, 0x77, 0xf4, 0xa8, 0x55, 0x7f, 0x85, 0xfc, 0xaa, 0xfe, 0x1a, - 0xf0, 0xb4, 0xa8, 0x1a, 0x69, 0x34, 0xd6, 0x6e, 0x53, 0xdf, 0xde, 0xb6, 0x2d, 0x51, 0x34, 0x22, - 0x6e, 0x7e, 0x78, 0x4e, 0x3e, 0xc4, 0xd3, 0xcb, 0x59, 0x44, 0x98, 0xdd, 0x56, 0x7a, 0x3a, 0xc7, - 0x54, 0x9e, 0xae, 0xd4, 0xe7, 0xe9, 0x62, 0x24, 0x26, 0x69, 0x0f, 0x71, 0x53, 0xe5, 0x93, 0xbb, - 0xa9, 0x4a, 0x5e, 0x6e, 0x2a, 0x69, 0x71, 0x03, 0xb8, 0xa9, 0xcb, 0x50, 0x96, 0xfd, 0x1e, 0xf0, - 0x73, 0x76, 0x15, 0x59, 0xbe, 0x21, 0x61, 0xa8, 0xb0, 0xac, 0xc3, 0x03, 0xde, 0x93, 0xa2, 0xc3, - 0xc7, 0x07, 0xee, 0xf0, 0x46, 0xdc, 0x1a, 0x75, 0x56, 0xda, 0x40, 0x9f, 0x38, 0x2d, 0x03, 0xfd, - 0x07, 0x15, 0x98, 0x4e, 0xad, 0xf8, 0x66, 0x66, 0xb9, 0xc6, 0x13, 0xce, 0x72, 0x2f, 0x42, 0x21, - 0x64, 0x13, 0x82, 0x91, 0x64, 0x9d, 0x14, 0x9f, 0x09, 0x70, 0x0c, 0x1b, 0x18, 0xd6, 0x0e, 0xb5, - 0x76, 0xa3, 0x4a, 0x41, 0x39, 0xb3, 0x53, 0x03, 0x63, 0x51, 0x47, 0x62, 0x92, 0x96, 0xfc, 0x1a, - 0x54, 0xcc, 0x56, 0xcb, 0xa7, 0x41, 0x20, 0xeb, 0x95, 0x2b, 0xc2, 0x9f, 0xd7, 0x23, 0x20, 0xc6, - 0x78, 0x36, 0xf3, 0xd9, 0x69, 0x6d, 0x07, 0xb7, 0x02, 0x99, 0xbb, 0x6a, 0xc5, 0x83, 0xec, 0x55, - 0x32, 0x38, 0x2a, 0x0a, 0xd2, 0x82, 0xe9, 0x5d, 0xbf, 0xb9, 0xb8, 0x68, 0x5a, 0x3b, 0xf4, 0x38, - 0xf9, 0x0e, 0xbf, 0xe5, 0xe4, 0x7a, 0x92, 0x03, 0xa6, 0x59, 0x4a, 0x29, 0xd7, 0xe9, 0x41, 0x68, - 0x36, 0x8f, 0x33, 0xdf, 0x8b, 0xa4, 0xe8, 0x1c, 0x30, 0xcd, 0x92, 0xcd, 0xce, 0x76, 0xfd, 0x66, - 0x54, 0x63, 0x25, 0x8b, 0x8b, 0xd5, 0xec, 0xec, 0x7a, 0x8c, 0x42, 0x9d, 0x8e, 0xbd, 0xb0, 0x5d, - 0xbf, 0x89, 0xd4, 0x74, 0x3a, 0x7c, 0xfa, 0xa7, 0xbd, 0xb0, 0xeb, 0x12, 0x8e, 0x8a, 0x82, 0x74, - 0x81, 0xb0, 0xa7, 0xe3, 0xfd, 0xae, 0x8a, 0x44, 0x64, 0x59, 0xcf, 0xe5, 0xac, 0xa7, 0x51, 0x44, - 0xfa, 0x03, 0x9d, 0x63, 0xae, 0xec, 0x7a, 0x1f, 0x1f, 0xcc, 0xe0, 0x4d, 0xde, 0x86, 0x67, 0x76, - 0xfd, 0xa6, 0x3c, 0xd2, 0xbe, 0xe1, 0xdb, 0xae, 0x65, 0x77, 0x4d, 0x51, 0xb5, 0x26, 0xe6, 0x91, - 0x17, 0xa4, 0xba, 0xcf, 0x5c, 0xcf, 0x26, 0xc3, 0xc3, 0xda, 0x27, 0x97, 0x5c, 0x26, 0x72, 0x59, - 0x72, 0x49, 0x0d, 0xd7, 0x63, 0x2d, 0xb9, 0x4c, 0x9e, 0x16, 0xff, 0xf4, 0x23, 0x03, 0x08, 0xdf, - 0xeb, 0x8e, 0x6e, 0x73, 0x5c, 0xf1, 0xbd, 0x5e, 0x97, 0x5c, 0x81, 0x4a, 0x9b, 0xfd, 0xd0, 0xca, - 0x30, 0xd4, 0xca, 0xdd, 0x4a, 0x84, 0xc0, 0x98, 0x86, 0xe5, 0x1f, 0x9e, 0xd3, 0xa2, 0xaa, 0x76, - 0x52, 0xe5, 0x1f, 0x37, 0x39, 0x14, 0x25, 0x96, 0xac, 0xc0, 0xac, 0x4f, 0x9b, 0xa6, 0x63, 0xba, - 0x16, 0x6d, 0x84, 0xbe, 0x19, 0xd2, 0xf6, 0x81, 0xf4, 0x24, 0xcf, 0xca, 0x26, 0xb3, 0x98, 0x26, - 0xc0, 0xfe, 0x36, 0xb5, 0xbf, 0x2a, 0xc3, 0x4c, 0x7a, 0x93, 0xfe, 0x51, 0x2b, 0x45, 0x57, 0xa0, - 0xd2, 0x35, 0xfd, 0xd0, 0xd6, 0x2a, 0x4b, 0xd5, 0x53, 0x6d, 0x44, 0x08, 0x8c, 0x69, 0x58, 0x4a, - 0x1f, 0x7a, 0x5d, 0xdb, 0x92, 0x1a, 0xaa, 0x94, 0x7e, 0x8b, 0x01, 0x51, 0xe0, 0xb2, 0xcb, 0x15, - 0x0b, 0x8f, 0xad, 0x5c, 0x51, 0x16, 0x20, 0x16, 0x73, 0x2e, 0x40, 0x1c, 0xec, 0xee, 0xc6, 0xf7, - 0xf5, 0x61, 0x38, 0x96, 0xcb, 0x49, 0xab, 0x74, 0xe7, 0x0e, 0x96, 0x52, 0x4d, 0x5a, 0xba, 0x3d, - 0xcb, 0xf2, 0xcc, 0xcd, 0x3c, 0x54, 0x4a, 0x0c, 0x14, 0x91, 0x19, 0x25, 0x40, 0x98, 0x14, 0x4d, - 0x36, 0xe0, 0xac, 0x63, 0x77, 0x6c, 0xb1, 0x5a, 0x1f, 0x6c, 0x50, 0xbf, 0x41, 0x2d, 0xcf, 0x6d, - 0x71, 0x47, 0x3d, 0x1a, 0x2f, 0x72, 0xac, 0x65, 0xd0, 0x60, 0x66, 0x4b, 0xf2, 0x02, 0x8c, 0xed, - 0x53, 0x9f, 0x97, 0x93, 0x41, 0xf2, 0xc6, 0xad, 0xdb, 0x02, 0x8c, 0x11, 0x9e, 0xbc, 0x0d, 0x85, - 0xc0, 0x0c, 0x1c, 0x39, 0x09, 0x3b, 0xc6, 0x81, 0xb2, 0x7a, 0x63, 0x4d, 0x9a, 0x07, 0xbf, 0x13, - 0x87, 0xfd, 0x47, 0xce, 0xf2, 0x34, 0x4e, 0xc6, 0xfe, 0xbe, 0x08, 0xd3, 0xa9, 0xd3, 0x34, 0x8f, - 0x72, 0x19, 0xca, 0x03, 0x8c, 0x3c, 0xc4, 0x03, 0xbc, 0x08, 0x65, 0xcb, 0xb1, 0xa9, 0x1b, 0xae, - 0xb6, 0xa4, 0xa7, 0x88, 0x8b, 0x97, 0x04, 0x7c, 0x09, 0x15, 0xc5, 0x93, 0xf6, 0x17, 0xfa, 0xc0, - 0x2e, 0x1e, 0xb5, 0xbc, 0xb9, 0x34, 0xcc, 0x4b, 0x59, 0xf3, 0x29, 0xa2, 0x4a, 0x75, 0xec, 0xb1, - 0xc2, 0xf6, 0xa9, 0xb9, 0x68, 0xe1, 0x1f, 0x47, 0xa0, 0xbc, 0x5e, 0xdf, 0x6a, 0xf0, 0x8b, 0xd1, - 0xde, 0x49, 0x5e, 0xfd, 0x76, 0x92, 0x3b, 0x43, 0xfb, 0xef, 0x78, 0xbb, 0xca, 0x06, 0xc0, 0xc0, - 0xd7, 0xbb, 0x55, 0xc4, 0x18, 0x61, 0x19, 0x9c, 0x68, 0x4e, 0x16, 0xa1, 0xe0, 0xee, 0x0e, 0x7a, - 0x03, 0x21, 0xf7, 0x39, 0xeb, 0xd7, 0xe9, 0x01, 0xf2, 0xc6, 0xe4, 0x16, 0x80, 0xe5, 0xd3, 0x16, - 0x75, 0x43, 0x5b, 0x5e, 0x00, 0x3d, 0xd8, 0xca, 0xfd, 0xa2, 0x6a, 0x8c, 0x1a, 0xa3, 0xda, 0xd7, - 0x4a, 0x30, 0x93, 0x3e, 0xdb, 0xf6, 0x28, 0xc7, 0xf0, 0x02, 0x8c, 0x05, 0x3d, 0x5e, 0xf0, 0x2c, - 0x5d, 0x83, 0x72, 0xc2, 0x0d, 0x01, 0xc6, 0x08, 0x9f, 0x3d, 0xe0, 0x47, 0x9f, 0xc8, 0x80, 0x2f, - 0x1c, 0x75, 0xc0, 0xe7, 0x3d, 0x9d, 0x48, 0x4c, 0x10, 0x4a, 0xb9, 0x4c, 0x10, 0xd2, 0x3d, 0x36, - 0xc0, 0x88, 0xa7, 0xf2, 0xee, 0xb8, 0xb1, 0x5c, 0x4a, 0x85, 0xa3, 0x81, 0xd8, 0x77, 0x6d, 0xdc, - 0x29, 0x74, 0x2c, 0x3f, 0x2b, 0xc2, 0x54, 0xf2, 0xb0, 0x0a, 0x4b, 0x4a, 0x77, 0xbc, 0x20, 0x94, - 0xa9, 0x7a, 0xfa, 0x16, 0xf8, 0x6b, 0x31, 0x0a, 0x75, 0xba, 0xa3, 0x45, 0xce, 0x17, 0x60, 0x4c, - 0xde, 0x4d, 0x22, 0x03, 0xa7, 0x1a, 0x45, 0xf2, 0xfe, 0x12, 0x8c, 0xf0, 0xff, 0x1f, 0x36, 0x9d, - 0x80, 0x7c, 0xbd, 0x3f, 0x6c, 0xbe, 0x93, 0xeb, 0xc9, 0xa4, 0x0f, 0x77, 0xd4, 0x7c, 0x1b, 0x66, - 0xfb, 0xb6, 0x45, 0xe2, 0x7b, 0x1b, 0x8d, 0x87, 0xdc, 0xdb, 0x78, 0x01, 0x8a, 0xae, 0xd9, 0xa1, - 0xe2, 0x7a, 0x84, 0x8a, 0x08, 0x6f, 0x2c, 0xef, 0x0d, 0x50, 0xc0, 0x6b, 0x3f, 0x2c, 0xc1, 0x6c, - 0xdf, 0x09, 0x5c, 0x9e, 0x70, 0xaa, 0xa5, 0xf5, 0x54, 0x1a, 0x9d, 0xb9, 0xa0, 0xfe, 0x3a, 0x4c, - 0xf1, 0x81, 0xb1, 0x91, 0x5a, 0x90, 0x57, 0xdb, 0xc3, 0x5b, 0x09, 0x2c, 0xa6, 0xa8, 0x8f, 0x96, - 0xb0, 0xbe, 0x0e, 0x53, 0x41, 0xaf, 0x19, 0x58, 0xbe, 0xdd, 0x95, 0x7b, 0xd0, 0x85, 0xa4, 0x90, - 0x46, 0x02, 0x8b, 0x29, 0x6a, 0xd2, 0xe6, 0x37, 0x26, 0xc9, 0xe0, 0x29, 0x17, 0xc3, 0x06, 0xba, - 0xf8, 0xe7, 0xac, 0xbc, 0x54, 0x29, 0xc1, 0x02, 0xfb, 0x98, 0x92, 0x26, 0xcc, 0x89, 0x85, 0x71, - 0x5d, 0x21, 0xb5, 0xac, 0x2e, 0xb2, 0xd2, 0x9a, 0x54, 0x7a, 0x6e, 0xe9, 0x50, 0x4a, 0x7c, 0x08, - 0x97, 0x01, 0x6f, 0xfb, 0xf9, 0x66, 0xff, 0xc7, 0x04, 0xde, 0xcd, 0xfb, 0xdc, 0xf6, 0xb1, 0xc6, - 0xe0, 0xa9, 0xb9, 0xda, 0xf3, 0x1f, 0xca, 0x6c, 0xa0, 0xa4, 0x8e, 0x20, 0x92, 0x1a, 0x94, 0xb8, - 0x6d, 0xb2, 0xf0, 0xa2, 0x36, 0x92, 0xb8, 0xd1, 0x06, 0x28, 0x31, 0x47, 0x58, 0xa2, 0x96, 0x53, - 0xb6, 0xd1, 0x43, 0xa6, 0x6c, 0x5d, 0x38, 0x13, 0x3a, 0xc1, 0x96, 0xdf, 0x0b, 0xc2, 0x45, 0xea, - 0x87, 0x81, 0x34, 0xdd, 0xc2, 0xc0, 0x37, 0x70, 0x6f, 0xad, 0x35, 0xd2, 0x5c, 0x30, 0x8b, 0x35, - 0x33, 0xe0, 0xd0, 0x09, 0xea, 0x8e, 0xe3, 0xdd, 0x89, 0xf6, 0xec, 0xe3, 0x60, 0x23, 0xc3, 0x88, - 0x32, 0xe0, 0xad, 0xb5, 0xc6, 0x21, 0x94, 0xf8, 0x10, 0x2e, 0xe4, 0x06, 0x7f, 0xaa, 0xdb, 0xa6, - 0x63, 0xb7, 0xcc, 0x90, 0xb2, 0x70, 0xcc, 0xd7, 0x8e, 0xc5, 0xe8, 0x50, 0x1b, 0x79, 0x5b, 0x6b, - 0x8d, 0x34, 0x09, 0x66, 0xb5, 0x1b, 0xd6, 0x57, 0x38, 0x32, 0xa3, 0x77, 0xf9, 0x89, 0x44, 0xef, - 0xca, 0x60, 0xa3, 0x1c, 0x72, 0x1a, 0xe5, 0x29, 0x93, 0x1f, 0x60, 0x94, 0xb7, 0x60, 0x5a, 0x5d, - 0x8e, 0x2d, 0x6d, 0x76, 0x7c, 0xe0, 0xbd, 0x87, 0x7a, 0x92, 0x03, 0xa6, 0x59, 0x9e, 0xc6, 0xf5, - 0x9c, 0xbf, 0x28, 0xc2, 0x4c, 0xfa, 0x8c, 0xf7, 0x71, 0xa7, 0xab, 0x79, 0x5f, 0x06, 0xce, 0x62, - 0x3f, 0x9f, 0x1a, 0x74, 0x4d, 0x2b, 0xba, 0x9c, 0x4f, 0xc5, 0xfe, 0xf5, 0x08, 0x81, 0x31, 0x0d, - 0x99, 0x83, 0x91, 0x56, 0x93, 0x7b, 0xa3, 0x62, 0x7c, 0x88, 0x6b, 0x69, 0x01, 0x47, 0x5a, 0x4d, - 0x72, 0x19, 0xca, 0x72, 0x1e, 0x1c, 0x9d, 0x71, 0xe2, 0x62, 0xe5, 0x24, 0x39, 0x40, 0x85, 0x1d, - 0xd6, 0xcc, 0x73, 0x08, 0x0b, 0xbc, 0xe9, 0x9e, 0xfb, 0x70, 0xcf, 0x3d, 0x7f, 0x5e, 0x80, 0x33, - 0x19, 0x95, 0x9f, 0x49, 0x33, 0x31, 0x8e, 0x60, 0x26, 0x7b, 0xea, 0xd9, 0xf3, 0x39, 0xce, 0x17, - 0x29, 0x75, 0xf8, 0x83, 0x33, 0x7f, 0x78, 0x96, 0x6f, 0xf5, 0x44, 0xeb, 0xcb, 0xd1, 0xf5, 0x47, - 0xa3, 0xd2, 0xca, 0x8e, 0x74, 0x0f, 0xd9, 0x4a, 0x06, 0x87, 0x78, 0xfd, 0x3b, 0x0b, 0x8b, 0x99, - 0x52, 0xc9, 0x22, 0x80, 0x3a, 0x32, 0x1e, 0xed, 0x26, 0x3f, 0xcf, 0x6f, 0x53, 0x53, 0xd0, 0xff, - 0xe1, 0xdb, 0x48, 0xda, 0xdb, 0xe6, 0xb3, 0x04, 0xad, 0xd9, 0x30, 0xee, 0x9c, 0xcd, 0xe8, 0xde, - 0xa3, 0xdb, 0xf4, 0xc9, 0xac, 0xeb, 0x2f, 0x47, 0x61, 0x2a, 0xd9, 0x91, 0xe4, 0x12, 0x94, 0xba, - 0x3e, 0xdd, 0xb6, 0xef, 0xa6, 0xaf, 0x1e, 0xdd, 0xe0, 0x50, 0x94, 0x58, 0xe2, 0x41, 0xc9, 0x31, - 0x9b, 0xcc, 0xb1, 0x88, 0xab, 0xdf, 0x56, 0x4e, 0x7c, 0x8d, 0x59, 0xb4, 0xe2, 0x16, 0x09, 0x5c, - 0xe3, 0xec, 0x51, 0x8a, 0x61, 0x02, 0xb7, 0x6d, 0xea, 0xb4, 0xc4, 0xa1, 0xa1, 0x61, 0x08, 0xbc, - 0xca, 0xd9, 0xa3, 0x14, 0x43, 0xde, 0x81, 0x8a, 0xb8, 0xaf, 0xb5, 0xb5, 0x70, 0x20, 0x67, 0x7b, - 0xbf, 0x7a, 0x34, 0x93, 0xdd, 0xb2, 0x3b, 0x34, 0x1e, 0x8e, 0x8b, 0x11, 0x13, 0x8c, 0xf9, 0xf1, - 0x8f, 0xda, 0x6c, 0x87, 0xd4, 0x6f, 0x84, 0xa6, 0x1f, 0x7d, 0x73, 0x26, 0xfe, 0xa8, 0x8d, 0xc2, - 0xa0, 0x46, 0x55, 0xfb, 0xeb, 0x12, 0x4c, 0x25, 0x2b, 0x58, 0x9f, 0xd0, 0xd1, 0xaf, 0x17, 0xa1, - 0xcc, 0x27, 0xd7, 0x75, 0xdf, 0x4d, 0x5f, 0x08, 0xbd, 0x25, 0xe1, 0xa8, 0x28, 0x08, 0x42, 0xc5, - 0x3c, 0xde, 0x97, 0x64, 0xc4, 0x59, 0x0f, 0xf5, 0x0d, 0x99, 0x98, 0x0d, 0xe3, 0x19, 0x44, 0xe4, - 0x83, 0xcd, 0xc4, 0x39, 0x4f, 0x05, 0xc6, 0x98, 0x0d, 0xb3, 0x7c, 0x9f, 0xb6, 0xa3, 0x19, 0xb6, - 0x66, 0xf9, 0xc8, 0xa1, 0x28, 0xb1, 0xe4, 0x05, 0x18, 0xf3, 0x3d, 0x87, 0xd6, 0x71, 0x5d, 0x1e, - 0xf2, 0x52, 0x8b, 0x4f, 0x28, 0xc0, 0x18, 0xe1, 0x87, 0xb1, 0xf0, 0x92, 0x34, 0x80, 0x01, 0x82, - 0xdf, 0x0a, 0xcc, 0xee, 0xcb, 0x59, 0x7b, 0xc3, 0x6e, 0xbb, 0x66, 0x18, 0x9f, 0x10, 0x56, 0x5b, - 0xe8, 0xb7, 0xd3, 0x04, 0xd8, 0xdf, 0xe6, 0x34, 0x66, 0x8f, 0xff, 0xc1, 0x46, 0x4e, 0xa2, 0xe6, - 0x3a, 0x69, 0x95, 0xc6, 0x10, 0xac, 0x72, 0x24, 0x6f, 0xab, 0x1c, 0x7d, 0xa8, 0x55, 0x3e, 0x0f, - 0x45, 0xfe, 0x19, 0x3a, 0xb9, 0x28, 0xa3, 0x96, 0x70, 0xf8, 0xd7, 0xb9, 0x50, 0xe0, 0x48, 0x1d, - 0xa6, 0xef, 0x98, 0x76, 0xc8, 0xfc, 0x93, 0xd8, 0x14, 0x16, 0x2b, 0xf6, 0xa3, 0xfa, 0x89, 0xaf, - 0x04, 0x1a, 0xd3, 0xf4, 0x83, 0x58, 0xff, 0x60, 0x6b, 0x24, 0xaf, 0xc3, 0x14, 0x57, 0xb2, 0x6e, - 0x59, 0x5e, 0x8f, 0xef, 0x89, 0xa6, 0xbe, 0x57, 0xb2, 0xa9, 0x63, 0x97, 0x30, 0x45, 0x9d, 0x1c, - 0x6b, 0x95, 0x7c, 0xc6, 0xda, 0xe6, 0x31, 0xc7, 0xda, 0x73, 0x30, 0xda, 0x72, 0xf6, 0xf8, 0x36, - 0x7b, 0x39, 0x5e, 0x51, 0x58, 0x5a, 0xdb, 0x44, 0x06, 0x7f, 0x32, 0xdf, 0x36, 0x60, 0xdd, 0x41, - 0xdd, 0x56, 0xd7, 0xb3, 0xdd, 0x50, 0x1e, 0xa4, 0x57, 0x8f, 0xb0, 0x2c, 0xe1, 0xa8, 0x28, 0x4e, - 0x36, 0xde, 0xbe, 0x0c, 0xe5, 0xc8, 0xb4, 0xd9, 0xbb, 0x50, 0xed, 0xe2, 0x77, 0xc1, 0xac, 0x9c, - 0x33, 0xb9, 0x02, 0x15, 0xaf, 0x4b, 0x13, 0xd7, 0xb6, 0xab, 0xc8, 0x79, 0x33, 0x42, 0x60, 0x4c, - 0xc3, 0x0c, 0x5d, 0x48, 0x4d, 0xad, 0x55, 0xde, 0x66, 0x40, 0xa9, 0x44, 0xed, 0x2b, 0x06, 0x44, - 0x77, 0xa1, 0x92, 0x25, 0x28, 0x76, 0x3d, 0x3f, 0x14, 0x6b, 0x44, 0xe3, 0x2f, 0x5f, 0xc8, 0x1e, - 0x91, 0xe2, 0x90, 0x98, 0xe7, 0x87, 0x31, 0x47, 0xf6, 0x2f, 0x40, 0xd1, 0x98, 0xe9, 0x69, 0x39, - 0xbd, 0x20, 0xa4, 0xfe, 0xea, 0x46, 0x5a, 0xcf, 0xc5, 0x08, 0x81, 0x31, 0x4d, 0xed, 0x3f, 0x0b, - 0x30, 0x93, 0xae, 0x94, 0x27, 0xef, 0xc2, 0x64, 0x60, 0xb7, 0x5d, 0xdb, 0x6d, 0xcb, 0x8c, 0xdc, - 0x18, 0xb8, 0xfa, 0xa3, 0xa1, 0xb7, 0xc7, 0x24, 0xbb, 0xdc, 0xb6, 0x5d, 0x9f, 0xcc, 0xb7, 0x99, - 0xde, 0xef, 0x2f, 0x84, 0xfc, 0x7c, 0xce, 0x77, 0x15, 0x7c, 0xb8, 0x2b, 0x21, 0xff, 0xab, 0x08, - 0xe7, 0xb2, 0xef, 0x42, 0x78, 0x42, 0x33, 0xc5, 0xf8, 0xa4, 0xff, 0xc8, 0xa1, 0x27, 0xfd, 0xe3, - 0xf7, 0x3c, 0x9a, 0xd3, 0xdd, 0x06, 0xea, 0x05, 0x3c, 0xdc, 0x1b, 0xaa, 0x39, 0x6c, 0xe1, 0x91, - 0x73, 0xd8, 0x4b, 0x50, 0x92, 0xf7, 0x81, 0xa5, 0xe6, 0x86, 0x0b, 0xe2, 0xb6, 0x2e, 0x89, 0xd5, - 0xa2, 0x75, 0xe9, 0xa1, 0xd1, 0x9a, 0xcd, 0x3e, 0xd4, 0x17, 0xf0, 0xc6, 0x06, 0x9f, 0x7d, 0xa8, - 0x0f, 0xe0, 0xc5, 0x6c, 0x78, 0x2d, 0x57, 0xd7, 0x8e, 0xbf, 0x2e, 0x14, 0xd7, 0x72, 0x6d, 0xac, - 0xde, 0xc2, 0x35, 0x94, 0x58, 0xf2, 0x41, 0x7f, 0xa0, 0xb4, 0x86, 0x72, 0xff, 0xc6, 0xe3, 0xca, - 0x62, 0x2d, 0x98, 0xed, 0xeb, 0xf3, 0x23, 0xe7, 0xb1, 0x97, 0xa0, 0x14, 0xf4, 0xb6, 0x19, 0x5d, - 0xaa, 0x0c, 0xb8, 0xc1, 0xa1, 0x28, 0xb1, 0xb5, 0xef, 0x16, 0x98, 0x94, 0xd4, 0xad, 0x19, 0x4f, - 0x68, 0x54, 0xbd, 0x06, 0x93, 0x22, 0x93, 0x7c, 0x53, 0xab, 0xd0, 0x2c, 0x6b, 0x67, 0xea, 0x75, - 0x24, 0x26, 0x69, 0xc9, 0x2a, 0x37, 0x93, 0x81, 0x73, 0x31, 0x90, 0x96, 0xc4, 0x02, 0xb7, 0x64, - 0x40, 0x5e, 0x82, 0x71, 0xfe, 0x10, 0xe2, 0x95, 0xcb, 0x25, 0x15, 0x5e, 0x8b, 0xb1, 0x1c, 0x83, - 0x51, 0xa7, 0x49, 0xae, 0x91, 0x17, 0x73, 0x59, 0x23, 0xef, 0xeb, 0x95, 0xc7, 0x65, 0x77, 0xdf, - 0x2e, 0x83, 0xba, 0xe1, 0x9d, 0x58, 0x7d, 0xf7, 0xec, 0x7f, 0x72, 0xe0, 0x55, 0xd4, 0x48, 0x15, - 0xb1, 0x4a, 0x9b, 0x11, 0x92, 0xde, 0x00, 0x22, 0x2f, 0x76, 0x97, 0xf3, 0x5e, 0xed, 0x33, 0xf2, - 0xaa, 0x50, 0xa8, 0xd1, 0x47, 0x81, 0x19, 0xad, 0xc8, 0x1b, 0xfc, 0xab, 0x12, 0xa1, 0x69, 0xbb, - 0xca, 0xf3, 0x3e, 0x77, 0xc8, 0x31, 0x7e, 0x41, 0xa4, 0xbe, 0x0f, 0x21, 0xfe, 0x62, 0xdc, 0x9c, - 0x2c, 0xc3, 0xd8, 0xbe, 0xe7, 0xf4, 0x3a, 0xea, 0xab, 0x72, 0x73, 0x59, 0x9c, 0x6e, 0x73, 0x12, - 0xed, 0xd8, 0xa9, 0x68, 0x82, 0x51, 0x5b, 0x42, 0x61, 0x9a, 0xef, 0x53, 0xd9, 0xe1, 0x81, 0x1c, - 0x00, 0x32, 0xf4, 0x5e, 0xca, 0x62, 0xb7, 0xe1, 0xb5, 0x1a, 0x49, 0x6a, 0xf9, 0xe9, 0xd9, 0x24, - 0x10, 0xd3, 0x3c, 0xc9, 0x55, 0x28, 0x9b, 0xdb, 0xdb, 0xb6, 0x6b, 0x87, 0x07, 0x72, 0xc1, 0xfb, - 0xa3, 0x59, 0xfc, 0xeb, 0x92, 0x46, 0x96, 0xf2, 0xca, 0x7f, 0xa8, 0xda, 0x92, 0x5b, 0x30, 0x1e, - 0x7a, 0x8e, 0x9c, 0x97, 0x06, 0x32, 0xbf, 0x3f, 0x9f, 0xc5, 0x6a, 0x4b, 0x91, 0xc5, 0x5b, 0x0a, - 0x31, 0x2c, 0x40, 0x9d, 0x0f, 0xf9, 0x03, 0x03, 0x26, 0x5c, 0xaf, 0x45, 0xa3, 0xa1, 0x27, 0x37, - 0x8c, 0xdf, 0xce, 0xe9, 0xcb, 0x04, 0xf3, 0xeb, 0x1a, 0x6f, 0x31, 0x42, 0x54, 0x89, 0xa7, 0x8e, - 0xc2, 0x84, 0x12, 0xc4, 0x85, 0x19, 0xbb, 0x63, 0xb6, 0xe9, 0x46, 0xcf, 0x91, 0xfb, 0xec, 0x81, - 0x0c, 0x1e, 0x99, 0xc5, 0x1f, 0x6b, 0x9e, 0x65, 0x3a, 0xe2, 0xcb, 0x1e, 0x48, 0xb7, 0xa9, 0xcf, - 0x3f, 0x30, 0xa2, 0xbe, 0x8c, 0xb4, 0x9a, 0xe2, 0x84, 0x7d, 0xbc, 0xc9, 0x0a, 0xcc, 0x76, 0x7d, - 0xdb, 0xe3, 0xfd, 0xe6, 0x98, 0x81, 0xf8, 0xb2, 0x03, 0x24, 0x4f, 0xfc, 0x6f, 0xa4, 0x09, 0xb0, - 0xbf, 0x8d, 0xa8, 0x40, 0x13, 0x40, 0x9e, 0x6e, 0x15, 0xa3, 0x0a, 0x34, 0x01, 0x43, 0x85, 0x9d, - 0xfb, 0x0c, 0xcc, 0xf6, 0xbd, 0x9b, 0x81, 0x1c, 0xc2, 0x1f, 0x1b, 0x90, 0x2e, 0x99, 0x62, 0x79, - 0x43, 0xcb, 0xf6, 0x39, 0xc3, 0x83, 0xf4, 0x42, 0xfd, 0x52, 0x84, 0xc0, 0x98, 0x86, 0x5c, 0x84, - 0x42, 0xd7, 0x0c, 0x77, 0xd2, 0xfb, 0xd5, 0x8c, 0x25, 0x72, 0x0c, 0xff, 0x92, 0x1c, 0xfb, 0x47, - 0xdb, 0xf4, 0x6e, 0x57, 0xa6, 0x41, 0xf1, 0x97, 0xe4, 0x14, 0x06, 0x35, 0xaa, 0xda, 0xf7, 0x8b, - 0x30, 0x95, 0x8c, 0x2d, 0x89, 0x7c, 0xd0, 0x78, 0x54, 0x3e, 0xc8, 0xe2, 0x64, 0x87, 0x86, 0x3b, - 0x5e, 0x2b, 0x1d, 0x27, 0x6f, 0x70, 0x28, 0x4a, 0x2c, 0x57, 0xdf, 0xf3, 0x43, 0xa9, 0x56, 0xac, - 0xbe, 0xe7, 0x87, 0xc8, 0x31, 0xd1, 0x76, 0x7b, 0xe1, 0x90, 0xed, 0xf6, 0x36, 0xcc, 0x88, 0x1b, - 0x7b, 0x16, 0xa9, 0x1f, 0x1e, 0xfb, 0x98, 0x48, 0x23, 0xc5, 0x02, 0xfb, 0x98, 0xf2, 0xef, 0x5c, - 0x73, 0x18, 0x6f, 0x7c, 0xcc, 0x0a, 0xb0, 0x46, 0x92, 0x03, 0xa6, 0x59, 0x0e, 0x63, 0x09, 0x30, - 0xd9, 0x8f, 0xc7, 0xbe, 0xde, 0xa3, 0x9c, 0xd3, 0xf5, 0x1e, 0x27, 0x0a, 0xa2, 0x0b, 0xf3, 0x3f, - 0xfe, 0xe5, 0xf9, 0xa7, 0x7e, 0xf2, 0xcb, 0xf3, 0x4f, 0xfd, 0xf4, 0x97, 0xe7, 0x9f, 0xfa, 0xca, - 0x83, 0xf3, 0xc6, 0x8f, 0x1f, 0x9c, 0x37, 0x7e, 0xf2, 0xe0, 0xbc, 0xf1, 0xd3, 0x07, 0xe7, 0x8d, - 0x5f, 0x3c, 0x38, 0x6f, 0x7c, 0xf7, 0x5f, 0xcf, 0x3f, 0xf5, 0xd9, 0x72, 0xf4, 0xf0, 0xff, 0x17, - 0x00, 0x00, 0xff, 0xff, 0xe0, 0xdb, 0x17, 0xb6, 0x34, 0x88, 0x00, 0x00, + // 6390 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x5d, 0x6c, 0x24, 0xc7, + 0x71, 0xb0, 0x86, 0xdc, 0x5d, 0xee, 0x16, 0xff, 0x8e, 0x7d, 0xa7, 0xd3, 0x8a, 0xb6, 0xee, 0x0e, + 0x2b, 0xf8, 0x70, 0xfa, 0x3e, 0x99, 0x17, 0x29, 0x71, 0x2c, 0x5b, 0xb6, 0x8c, 0xe5, 0xcf, 0x51, + 0xd4, 0x91, 0x3c, 0xb2, 0x96, 0xa7, 0x1f, 0xcb, 0x96, 0x3c, 0x3b, 0xdb, 0x5c, 0x8e, 0x39, 0x3b, + 0xb3, 0x9c, 0x99, 0xe5, 0x1d, 0x0f, 0x88, 0x6d, 0x18, 0x48, 0x62, 0x4b, 0xfe, 0x53, 0x12, 0x3b, + 0x01, 0x02, 0xbf, 0x24, 0x81, 0x81, 0x20, 0x4f, 0x79, 0x71, 0x9e, 0x03, 0x04, 0x89, 0x83, 0xe4, + 0xc1, 0x79, 0x33, 0x6c, 0xe0, 0x60, 0x5f, 0x80, 0x3c, 0x25, 0x0f, 0x41, 0x9e, 0x12, 0xe4, 0x21, + 0xe8, 0x9f, 0xe9, 0xe9, 0x99, 0x1d, 0xf2, 0xb8, 0xe4, 0xec, 0x5d, 0x28, 0xe4, 0x6d, 0xb7, 0xaa, + 0xba, 0xaa, 0x66, 0xba, 0xba, 0xaa, 0xab, 0xbb, 0xab, 0x07, 0xd6, 0xda, 0x76, 0xb8, 0xd3, 0x6b, + 0xce, 0x59, 0x5e, 0xe7, 0xba, 0xe9, 0xb7, 0xbd, 0xae, 0xef, 0x7d, 0x99, 0xff, 0xf8, 0x38, 0xdd, + 0xa7, 0x6e, 0x18, 0x5c, 0xef, 0xee, 0xb6, 0xaf, 0x9b, 0x5d, 0x3b, 0xb8, 0x2e, 0xfe, 0x7b, 0x3d, + 0xdf, 0xa2, 0xd7, 0xf7, 0x5f, 0x30, 0x9d, 0xee, 0x8e, 0xf9, 0xc2, 0xf5, 0x36, 0x75, 0xa9, 0x6f, + 0x86, 0xb4, 0x35, 0xd7, 0xf5, 0xbd, 0xd0, 0x23, 0x9f, 0x8d, 0xd9, 0xcd, 0x45, 0xec, 0xf8, 0x8f, + 0x77, 0x45, 0xf3, 0xb9, 0xee, 0x6e, 0x7b, 0x8e, 0xb1, 0x9b, 0xd3, 0xd8, 0xcd, 0x45, 0xec, 0x66, + 0x3f, 0x77, 0x6c, 0x6d, 0x2c, 0xaf, 0xd3, 0xf1, 0xdc, 0xb4, 0xfc, 0xd9, 0x8f, 0x6b, 0x0c, 0xda, + 0x5e, 0xdb, 0xbb, 0xce, 0xc1, 0xcd, 0xde, 0x36, 0xff, 0xc7, 0xff, 0xf0, 0x5f, 0x92, 0xbc, 0xb6, + 0xfb, 0x52, 0x30, 0x67, 0x7b, 0x8c, 0xe5, 0x75, 0xcb, 0xf3, 0xd9, 0x83, 0xf5, 0xb1, 0xfc, 0x8d, + 0x98, 0xa6, 0x63, 0x5a, 0x3b, 0xb6, 0x4b, 0xfd, 0x83, 0x58, 0x8f, 0x0e, 0x0d, 0xcd, 0xac, 0x56, + 0xd7, 0x0f, 0x6b, 0xe5, 0xf7, 0xdc, 0xd0, 0xee, 0xd0, 0xbe, 0x06, 0xbf, 0xf9, 0xb0, 0x06, 0x81, + 0xb5, 0x43, 0x3b, 0x66, 0xba, 0x5d, 0xed, 0x3f, 0x0d, 0x98, 0xa9, 0xaf, 0x6d, 0x6e, 0x2c, 0x78, + 0x6e, 0xd0, 0xeb, 0xd0, 0x05, 0xcf, 0xdd, 0xb6, 0xdb, 0xe4, 0x13, 0x30, 0x6e, 0x09, 0x80, 0xbf, + 0x65, 0xb6, 0xab, 0xc6, 0x15, 0xe3, 0x5a, 0x65, 0xfe, 0xfc, 0x4f, 0xee, 0x5f, 0x7e, 0xe2, 0xc1, + 0xfd, 0xcb, 0xe3, 0x0b, 0x31, 0x0a, 0x75, 0x3a, 0xf2, 0x1c, 0x8c, 0x99, 0xbd, 0xd0, 0xab, 0x5b, + 0xbb, 0xd5, 0x91, 0x2b, 0xc6, 0xb5, 0xf2, 0xfc, 0xb4, 0x6c, 0x32, 0x56, 0x17, 0x60, 0x8c, 0xf0, + 0xe4, 0x3a, 0x54, 0xe8, 0x5d, 0xcb, 0xe9, 0x05, 0xf6, 0x3e, 0xad, 0x8e, 0x72, 0xe2, 0x19, 0x49, + 0x5c, 0x59, 0x8a, 0x10, 0x18, 0xd3, 0x30, 0xde, 0xae, 0xb7, 0xea, 0x59, 0xa6, 0x53, 0x2d, 0x24, + 0x79, 0xaf, 0x0b, 0x30, 0x46, 0x78, 0x72, 0x15, 0x4a, 0xae, 0xf7, 0x86, 0x69, 0x87, 0xd5, 0x22, + 0xa7, 0x9c, 0x92, 0x94, 0xa5, 0x75, 0x0e, 0x45, 0x89, 0xad, 0xfd, 0xeb, 0x38, 0x4c, 0xb3, 0x67, + 0x5f, 0x62, 0xc6, 0xd1, 0xe0, 0xb6, 0x44, 0x9e, 0x81, 0xd1, 0x9e, 0xef, 0xc8, 0x27, 0x1e, 0x97, + 0x0d, 0x47, 0x6f, 0xe3, 0x2a, 0x32, 0x38, 0x79, 0x09, 0x26, 0xe8, 0x5d, 0x6b, 0xc7, 0x74, 0xdb, + 0x74, 0xdd, 0xec, 0x50, 0xfe, 0x98, 0x95, 0xf9, 0x0b, 0x92, 0x6e, 0x62, 0x49, 0xc3, 0x61, 0x82, + 0x52, 0x6f, 0xb9, 0x75, 0xd0, 0x15, 0xcf, 0x9c, 0xd1, 0x92, 0xe1, 0x30, 0x41, 0x49, 0x5e, 0x04, + 0xf0, 0xbd, 0x5e, 0x68, 0xbb, 0xed, 0x9b, 0xf4, 0x80, 0x3f, 0x7c, 0x65, 0x9e, 0xc8, 0x76, 0x80, + 0x0a, 0x83, 0x1a, 0x15, 0xf9, 0x2d, 0x98, 0xb1, 0x3c, 0xd7, 0xa5, 0x56, 0x68, 0x7b, 0xee, 0xbc, + 0x69, 0xed, 0x7a, 0xdb, 0xdb, 0xfc, 0x6d, 0x8c, 0xbf, 0xf8, 0xd2, 0xdc, 0xb1, 0x07, 0x99, 0x18, + 0x25, 0x73, 0xb2, 0xfd, 0xfc, 0x93, 0x0f, 0xee, 0x5f, 0x9e, 0x59, 0x48, 0xb3, 0xc5, 0x7e, 0x49, + 0xe4, 0x79, 0x28, 0x7f, 0x39, 0xf0, 0xdc, 0x79, 0xaf, 0x75, 0x50, 0x2d, 0xf1, 0x3e, 0x38, 0x27, + 0x15, 0x2e, 0xbf, 0xd6, 0xb8, 0xb5, 0xce, 0xe0, 0xa8, 0x28, 0xc8, 0x6d, 0x18, 0x0d, 0x9d, 0xa0, + 0x3a, 0xc6, 0xd5, 0xfb, 0xf4, 0xc0, 0xea, 0x6d, 0xad, 0x36, 0x84, 0xd9, 0xce, 0x8f, 0xb1, 0xbe, + 0xda, 0x5a, 0x6d, 0x20, 0xe3, 0x47, 0xde, 0x33, 0xa0, 0xcc, 0xc6, 0x57, 0xcb, 0x0c, 0xcd, 0x6a, + 0xf9, 0xca, 0xe8, 0xb5, 0xf1, 0x17, 0xbf, 0x30, 0x77, 0x2a, 0x07, 0x33, 0x97, 0xb2, 0x96, 0xb9, + 0x35, 0xc9, 0x7e, 0xc9, 0x0d, 0xfd, 0x83, 0xf8, 0x19, 0x23, 0x30, 0x2a, 0xf9, 0xe4, 0x0f, 0x0d, + 0x98, 0x8e, 0x7a, 0x75, 0x91, 0x5a, 0x8e, 0xe9, 0xd3, 0x6a, 0x85, 0x3f, 0xf0, 0x9b, 0x79, 0xe8, + 0x94, 0xe4, 0x2c, 0x5f, 0xc7, 0xf9, 0x07, 0xf7, 0x2f, 0x4f, 0xa7, 0x50, 0x98, 0xd6, 0x82, 0xbc, + 0x6f, 0xc0, 0xc4, 0x5e, 0x8f, 0xf6, 0x94, 0x5a, 0xc0, 0xd5, 0xba, 0x9d, 0x83, 0x5a, 0x9b, 0x1a, + 0x5b, 0xa9, 0xd3, 0x39, 0x66, 0xec, 0x3a, 0x1c, 0x13, 0xc2, 0xc9, 0x57, 0xa1, 0xc2, 0xff, 0xcf, + 0xdb, 0x6e, 0xab, 0x3a, 0xce, 0x35, 0xc1, 0xbc, 0x34, 0x61, 0x3c, 0xa5, 0x1a, 0x93, 0xcc, 0xcf, + 0x28, 0x20, 0xc6, 0x32, 0xc9, 0x1d, 0x18, 0x93, 0x2e, 0xad, 0x3a, 0xc1, 0xc5, 0x6f, 0xe4, 0x20, + 0x3e, 0xe1, 0x5d, 0xe7, 0xc7, 0x99, 0xd7, 0x92, 0x20, 0x8c, 0xa4, 0x91, 0x37, 0xa1, 0x60, 0xf6, + 0xc2, 0x9d, 0xea, 0xe4, 0x09, 0x87, 0xc1, 0xbc, 0x19, 0xd8, 0x56, 0xbd, 0x17, 0xee, 0xcc, 0x97, + 0x1f, 0xdc, 0xbf, 0x5c, 0x60, 0xbf, 0x90, 0x73, 0x24, 0x08, 0x95, 0x9e, 0xef, 0x34, 0xa8, 0xe5, + 0xd3, 0xb0, 0x3a, 0xc5, 0xd9, 0x7f, 0x6c, 0x4e, 0xc4, 0x0b, 0xc6, 0x61, 0x8e, 0x85, 0xae, 0xb9, + 0xfd, 0x17, 0xe6, 0x04, 0xc5, 0x4d, 0x7a, 0xd0, 0xa0, 0x0e, 0xb5, 0x42, 0xcf, 0x17, 0xaf, 0xe9, + 0x36, 0xae, 0x0a, 0x0c, 0xc6, 0x6c, 0x48, 0x08, 0xa5, 0x6d, 0xdb, 0x09, 0xa9, 0x5f, 0x9d, 0xce, + 0xe5, 0x2d, 0x69, 0xa3, 0xea, 0x06, 0xe7, 0x3b, 0x0f, 0xcc, 0x63, 0x8b, 0xdf, 0x28, 0x65, 0xcd, + 0xbe, 0x0c, 0x93, 0x89, 0x21, 0x47, 0xce, 0xc1, 0xe8, 0x2e, 0x3d, 0x10, 0xee, 0x1a, 0xd9, 0x4f, + 0x72, 0x01, 0x8a, 0xfb, 0xa6, 0xd3, 0x93, 0xae, 0x19, 0xc5, 0x9f, 0x4f, 0x8f, 0xbc, 0x64, 0xd4, + 0x7e, 0x6a, 0xc0, 0xd3, 0x87, 0x0e, 0x16, 0x16, 0x5f, 0x5a, 0x3d, 0xdf, 0x6c, 0x3a, 0x94, 0x73, + 0xd3, 0xe2, 0xcb, 0xa2, 0x00, 0x63, 0x84, 0x67, 0x0e, 0x99, 0x85, 0xb1, 0x45, 0xea, 0xd0, 0x90, + 0xca, 0x48, 0xa7, 0x1c, 0x72, 0x5d, 0x61, 0x50, 0xa3, 0x62, 0x1e, 0xd1, 0x76, 0x43, 0xea, 0xbb, + 0xa6, 0x23, 0xc3, 0x9d, 0xf2, 0x16, 0x2b, 0x12, 0x8e, 0x8a, 0x42, 0x8b, 0x60, 0x85, 0x23, 0x23, + 0xd8, 0x67, 0xe1, 0x7c, 0x86, 0x75, 0x6b, 0xcd, 0x8d, 0x23, 0x9b, 0xff, 0xe9, 0x08, 0x5c, 0xcc, + 0x1e, 0xa7, 0xe4, 0x0a, 0x14, 0x5c, 0x16, 0xe0, 0x44, 0x20, 0x9c, 0x90, 0x0c, 0x0a, 0x3c, 0xb0, + 0x71, 0x8c, 0xfe, 0xc2, 0x46, 0x06, 0x7a, 0x61, 0xa3, 0xc7, 0x7a, 0x61, 0x89, 0x09, 0x42, 0xe1, + 0x18, 0x13, 0x84, 0x63, 0x46, 0x7d, 0xc6, 0xd8, 0xf4, 0xdb, 0xbd, 0x0e, 0x33, 0x42, 0x1e, 0x9c, + 0x2a, 0x31, 0xe3, 0x7a, 0x84, 0xc0, 0x98, 0xa6, 0xf6, 0x5e, 0x11, 0x9e, 0xae, 0xdf, 0xeb, 0xf9, + 0x94, 0xdb, 0x68, 0xf0, 0x6a, 0xaf, 0xa9, 0x4f, 0x18, 0xae, 0x40, 0x61, 0x7b, 0xaf, 0xe5, 0xa6, + 0x5f, 0xd4, 0x8d, 0xcd, 0xc5, 0x75, 0xe4, 0x18, 0xd2, 0x85, 0xf3, 0xc1, 0x8e, 0xe9, 0xd3, 0x56, + 0xdd, 0xb2, 0x68, 0x10, 0xdc, 0xa4, 0x07, 0x6a, 0xea, 0x70, 0xec, 0x81, 0xf8, 0xd4, 0x83, 0xfb, + 0x97, 0xcf, 0x37, 0xfa, 0xb9, 0x60, 0x16, 0x6b, 0xd2, 0x82, 0xe9, 0x14, 0x98, 0xbf, 0xf4, 0x63, + 0x4b, 0xe3, 0x81, 0x23, 0x25, 0x0d, 0xd3, 0x2c, 0x99, 0x01, 0xec, 0xf4, 0x9a, 0xfc, 0x59, 0xc4, + 0xa4, 0x44, 0x19, 0xc0, 0xab, 0x02, 0x8c, 0x11, 0x9e, 0xfc, 0x81, 0x1e, 0x8a, 0x8b, 0x3c, 0x14, + 0x6f, 0x9f, 0xd6, 0xad, 0x1e, 0xd6, 0x23, 0x03, 0x04, 0xe5, 0xd8, 0x89, 0x95, 0xce, 0x8a, 0x13, + 0xfb, 0xb9, 0x01, 0x93, 0xf3, 0x76, 0xd8, 0xec, 0x59, 0xbb, 0x34, 0x64, 0x3e, 0x9e, 0xf8, 0x50, + 0x6c, 0x32, 0xd7, 0xcf, 0xdb, 0x8f, 0xbf, 0xb8, 0x79, 0xca, 0x67, 0x50, 0xcc, 0xe3, 0x78, 0x52, + 0x79, 0x70, 0xff, 0x72, 0x91, 0xff, 0x45, 0x21, 0x8a, 0xdc, 0x06, 0xf0, 0x58, 0x68, 0xd9, 0xf2, + 0x76, 0xa9, 0x3b, 0x98, 0x25, 0x4f, 0xb1, 0x31, 0x7f, 0xab, 0x1e, 0x35, 0x46, 0x8d, 0x51, 0xed, + 0xc7, 0x06, 0x90, 0x7e, 0xf9, 0xe4, 0x16, 0x94, 0x7b, 0x01, 0x73, 0x8c, 0xd2, 0x1f, 0x1d, 0x5b, + 0xd6, 0x04, 0xeb, 0xf7, 0xdb, 0xb2, 0x29, 0x2a, 0x26, 0x8c, 0x61, 0xd7, 0x0c, 0x82, 0x3b, 0x9e, + 0xdf, 0x1a, 0x4c, 0x79, 0xce, 0x70, 0x43, 0x36, 0x45, 0xc5, 0xa4, 0xf6, 0xb7, 0x25, 0xb8, 0xa0, + 0x14, 0xd7, 0xbd, 0xc3, 0x6b, 0x40, 0x5a, 0xdc, 0x9f, 0xbd, 0xea, 0x79, 0xbb, 0xb7, 0xdc, 0x1b, + 0xb6, 0x6b, 0x07, 0x3b, 0xd2, 0x2b, 0xcf, 0x4a, 0xcb, 0x24, 0x8b, 0x7d, 0x14, 0x98, 0xd1, 0x8a, + 0x7c, 0x57, 0x1f, 0x44, 0x23, 0x7c, 0x10, 0x99, 0x79, 0x75, 0xf6, 0x49, 0xc7, 0xcf, 0xd8, 0x1d, + 0xda, 0xdc, 0xf1, 0xbc, 0x5d, 0xe9, 0x5f, 0xd6, 0x4e, 0xa9, 0xcf, 0x1b, 0x82, 0xdb, 0x82, 0xe7, + 0x86, 0xf4, 0x6e, 0x28, 0x26, 0x4a, 0x12, 0x86, 0x91, 0x28, 0xf2, 0x65, 0x39, 0x51, 0x2a, 0x70, + 0x91, 0xab, 0x79, 0xbd, 0x82, 0xcc, 0xa9, 0x53, 0x0d, 0x4a, 0xa2, 0x15, 0xf7, 0x5a, 0x15, 0x31, + 0x9e, 0x85, 0xd7, 0x41, 0x89, 0x21, 0xcf, 0x42, 0xd1, 0xbb, 0xe3, 0x4a, 0x27, 0x52, 0x99, 0x9f, + 0x94, 0x2f, 0xac, 0x78, 0x8b, 0x01, 0x51, 0xe0, 0x58, 0x08, 0x64, 0x8a, 0x51, 0x8b, 0xd9, 0x13, + 0x4f, 0x75, 0xb4, 0x24, 0x6e, 0x43, 0x61, 0x50, 0xa3, 0x22, 0xaf, 0xc0, 0x94, 0x4f, 0xbb, 0x5e, + 0x60, 0x87, 0x9e, 0x7f, 0xd0, 0x70, 0x7a, 0xed, 0x6a, 0x99, 0xb7, 0xbb, 0x28, 0xdb, 0x4d, 0x61, + 0x02, 0x8b, 0x29, 0x6a, 0xcd, 0xbd, 0x55, 0xce, 0x8a, 0x7b, 0xfb, 0xef, 0x32, 0xcc, 0xaa, 0x1e, + 0x69, 0x50, 0x7f, 0x9f, 0xfa, 0xfa, 0x70, 0xd2, 0x0c, 0xce, 0x78, 0x74, 0x06, 0xf7, 0x99, 0x44, + 0xdf, 0x89, 0x94, 0xff, 0xa3, 0xb2, 0x0f, 0x2e, 0x2c, 0xd2, 0xae, 0x4f, 0x2d, 0x33, 0xa4, 0xad, + 0x43, 0x7a, 0xf1, 0xd5, 0xbe, 0x5e, 0x14, 0xa9, 0xff, 0x15, 0xc9, 0xa1, 0x1a, 0x73, 0x78, 0x48, + 0x7f, 0xfe, 0x9e, 0x01, 0x13, 0x0a, 0x64, 0xd3, 0xa0, 0x5a, 0xe0, 0x4e, 0xe0, 0xcd, 0xbc, 0x46, + 0x80, 0x78, 0xdf, 0xb1, 0x12, 0xf1, 0xea, 0x04, 0x6a, 0x52, 0x31, 0xa1, 0xc3, 0xb1, 0x46, 0xc8, + 0x9b, 0x30, 0x6e, 0xf2, 0x69, 0x83, 0x88, 0x17, 0xa5, 0x41, 0x5c, 0xee, 0xf4, 0x83, 0xfb, 0x97, + 0xc7, 0xeb, 0x71, 0x6b, 0xd4, 0x59, 0x91, 0x77, 0x60, 0x52, 0xf6, 0x92, 0x4c, 0x6f, 0xc6, 0x06, + 0xe1, 0x3d, 0xf3, 0xe0, 0xfe, 0xe5, 0xc9, 0x37, 0xf4, 0xf6, 0x98, 0x64, 0x47, 0x5e, 0x87, 0x8b, + 0xcd, 0xe8, 0xf5, 0x04, 0xfc, 0xf5, 0xcc, 0x9b, 0x01, 0xbd, 0x8d, 0xab, 0x72, 0x28, 0x5e, 0x92, + 0x6f, 0xe8, 0x62, 0xea, 0x25, 0x4a, 0x2a, 0x3c, 0xa4, 0xf5, 0x21, 0x71, 0xa1, 0x72, 0xa2, 0xb8, + 0xf0, 0x7d, 0x3d, 0x2e, 0x00, 0x37, 0x89, 0x76, 0xbe, 0x26, 0x71, 0xda, 0xd9, 0xd5, 0xf8, 0x59, + 0x71, 0x3f, 0xdf, 0x35, 0xe0, 0xe9, 0x43, 0x87, 0x43, 0xca, 0x87, 0x1b, 0x27, 0xf4, 0xe1, 0x23, + 0x83, 0xf8, 0xf0, 0xda, 0x9f, 0x15, 0xe1, 0xfc, 0x82, 0xe9, 0x50, 0xb7, 0x65, 0x26, 0x3c, 0xe1, + 0xf3, 0x50, 0x0e, 0xac, 0x1d, 0xda, 0xea, 0x39, 0x51, 0x8e, 0xa6, 0xba, 0xa2, 0x21, 0xe1, 0xa8, + 0x28, 0x54, 0xf6, 0xb9, 0x6f, 0x3a, 0x52, 0x7e, 0x32, 0xfb, 0xdc, 0x57, 0xd9, 0xe7, 0xbe, 0xe9, + 0x90, 0x4f, 0xc3, 0x94, 0x4c, 0xab, 0x3c, 0x77, 0xd1, 0x0c, 0x69, 0x50, 0x1d, 0xe5, 0x43, 0x9b, + 0x30, 0x7d, 0x97, 0x12, 0x18, 0x4c, 0x51, 0x32, 0x49, 0xa1, 0xdd, 0xa1, 0xf7, 0x3c, 0x37, 0xca, + 0x0a, 0x94, 0xa4, 0x2d, 0x09, 0x47, 0x45, 0x41, 0xbe, 0xd3, 0x9f, 0x17, 0x7c, 0xe9, 0x94, 0x56, + 0x92, 0xf1, 0xb2, 0x06, 0xb0, 0xd9, 0xaf, 0x1b, 0x30, 0xde, 0xa5, 0x7e, 0x60, 0x07, 0x21, 0x75, + 0x2d, 0x2a, 0x5d, 0xd5, 0xad, 0x3c, 0x2c, 0x77, 0x23, 0x66, 0x2b, 0x9c, 0x9a, 0x06, 0x40, 0x5d, + 0xa8, 0x36, 0x70, 0xca, 0x67, 0x65, 0xe0, 0xdc, 0x85, 0x0b, 0x0b, 0x66, 0x68, 0xed, 0xf4, 0xba, + 0x62, 0xfd, 0xa0, 0xe7, 0x9b, 0xa1, 0xed, 0xb9, 0x2c, 0x47, 0xa4, 0xae, 0xd9, 0x74, 0x68, 0x2b, + 0xbd, 0xaa, 0xb2, 0x24, 0xc0, 0x18, 0xe1, 0xc9, 0x27, 0x60, 0xbc, 0x63, 0xde, 0x5d, 0x94, 0x2d, + 0xa5, 0x99, 0xaa, 0x3d, 0x87, 0xb5, 0x18, 0x85, 0x3a, 0x5d, 0xed, 0x2b, 0x70, 0x41, 0x88, 0x5c, + 0x33, 0xbb, 0xda, 0x1b, 0x3d, 0xc6, 0x02, 0xc6, 0x22, 0x9c, 0xb3, 0x7c, 0x6a, 0x86, 0x74, 0x65, + 0x7b, 0xdd, 0x0b, 0x97, 0xee, 0xda, 0x41, 0x28, 0x57, 0x32, 0xaa, 0x92, 0xfa, 0xdc, 0x42, 0x0a, + 0x8f, 0x7d, 0x2d, 0x6a, 0xdf, 0x1b, 0x03, 0xb2, 0xd4, 0xb1, 0xc3, 0x30, 0x39, 0x53, 0xb9, 0x0a, + 0xa5, 0xa6, 0xef, 0xed, 0x52, 0x5f, 0x2a, 0xa0, 0x56, 0x23, 0xe6, 0x39, 0x14, 0x25, 0x96, 0xf9, + 0x14, 0x6b, 0xc7, 0x74, 0x5d, 0xea, 0xc4, 0x73, 0x0b, 0xe5, 0x53, 0x16, 0x14, 0x06, 0x35, 0x2a, + 0xbe, 0x3b, 0x23, 0xfe, 0xf1, 0xe4, 0x7b, 0x34, 0xb5, 0x3b, 0x13, 0xa3, 0x50, 0xa7, 0x4b, 0xa4, + 0x51, 0x85, 0xbc, 0xd3, 0xa8, 0x62, 0x0e, 0x69, 0x54, 0xf6, 0xae, 0x45, 0xe9, 0xb1, 0xec, 0x5a, + 0x8c, 0x1d, 0x77, 0xd7, 0xa2, 0x9c, 0xf3, 0xae, 0xc5, 0xb7, 0x75, 0x97, 0x58, 0xe1, 0x2e, 0xf1, + 0xdd, 0xd3, 0x8e, 0xff, 0x3e, 0xf3, 0x3c, 0x51, 0x14, 0x87, 0xb3, 0xe2, 0x8c, 0x3e, 0x18, 0x81, + 0x73, 0x69, 0x97, 0x4b, 0xee, 0xc1, 0x98, 0x25, 0x3c, 0x94, 0x4c, 0x1d, 0x1a, 0xa7, 0x0e, 0x34, + 0xfd, 0xfe, 0x4e, 0x2e, 0xed, 0x0b, 0x0c, 0x46, 0x02, 0xc9, 0xd7, 0x0c, 0xa8, 0x58, 0x91, 0x93, + 0x92, 0x2b, 0x0e, 0xa7, 0x16, 0x9f, 0xe1, 0xf4, 0xc4, 0x7a, 0xbd, 0xc2, 0x60, 0x2c, 0xb4, 0xf6, + 0x8b, 0x11, 0x18, 0xd7, 0xfd, 0xd3, 0x97, 0x34, 0x2b, 0x13, 0xef, 0xe3, 0xd7, 0xb4, 0xb1, 0xab, + 0xb6, 0x90, 0x63, 0x25, 0x18, 0x35, 0x1b, 0xcd, 0xb7, 0x9a, 0x6c, 0x6a, 0xc3, 0x3a, 0x27, 0xf6, + 0x53, 0x31, 0x4c, 0x33, 0x9c, 0x2e, 0x14, 0x82, 0x2e, 0xb5, 0xe4, 0xe3, 0xae, 0xe7, 0x67, 0x36, + 0x8d, 0x2e, 0xb5, 0x62, 0x87, 0xce, 0xfe, 0x21, 0x97, 0x44, 0xee, 0x42, 0x29, 0x08, 0xcd, 0xb0, + 0x17, 0xc8, 0xd5, 0x88, 0x1c, 0x4d, 0xb5, 0xc1, 0xf9, 0xc6, 0x5e, 0x5c, 0xfc, 0x47, 0x29, 0xaf, + 0xb6, 0x0c, 0x33, 0x7d, 0x76, 0xcd, 0x5c, 0x3b, 0xbd, 0xdb, 0xf5, 0x69, 0xc0, 0x66, 0x47, 0xe9, + 0xe9, 0xe2, 0x92, 0xc2, 0xa0, 0x46, 0x55, 0xfb, 0xa5, 0x01, 0xd3, 0x1a, 0xa7, 0x55, 0x3b, 0x08, + 0xc9, 0x17, 0xfa, 0xba, 0x6a, 0xee, 0x78, 0x5d, 0xc5, 0x5a, 0xf3, 0x8e, 0x52, 0xe3, 0x3b, 0x82, + 0x68, 0xdd, 0xe4, 0x41, 0xd1, 0x0e, 0x69, 0x27, 0x90, 0x2b, 0x4a, 0xaf, 0xe5, 0xf7, 0xce, 0xe2, + 0x95, 0x90, 0x15, 0x26, 0x00, 0x85, 0x9c, 0xda, 0x37, 0x3e, 0x9b, 0x78, 0x44, 0xd6, 0x7f, 0x7c, + 0x73, 0x9c, 0x81, 0xe6, 0x7b, 0xc1, 0x7a, 0x1c, 0xb4, 0xe3, 0xcd, 0x71, 0x0d, 0x87, 0x09, 0x4a, + 0xb2, 0x07, 0xe5, 0x90, 0x76, 0xba, 0x8e, 0x19, 0x46, 0x2b, 0xea, 0xcb, 0xa7, 0x7c, 0x82, 0x2d, + 0xc9, 0x4e, 0x44, 0xa9, 0xe8, 0x1f, 0x2a, 0x31, 0xa4, 0x03, 0x63, 0x2c, 0x99, 0xb3, 0x2d, 0x2a, + 0xed, 0xec, 0xc6, 0x29, 0x25, 0x36, 0x04, 0x37, 0xe1, 0x3c, 0xe4, 0x1f, 0x8c, 0x64, 0x90, 0xaf, + 0x40, 0xb1, 0x63, 0xbb, 0xb6, 0x27, 0xb3, 0xfd, 0xb7, 0xf2, 0x1d, 0x48, 0x73, 0x6b, 0x8c, 0xb7, + 0x08, 0x03, 0xaa, 0xbf, 0x38, 0x0c, 0x85, 0x58, 0xbe, 0x8d, 0x6e, 0xc9, 0x49, 0xb5, 0x9c, 0xa3, + 0x7f, 0x21, 0x67, 0x1d, 0xd4, 0x9c, 0x3d, 0x19, 0x8d, 0x22, 0x30, 0x2a, 0xf9, 0xe4, 0x1e, 0x14, + 0xb6, 0x6d, 0x87, 0xcd, 0xcb, 0xf3, 0x58, 0xf9, 0x48, 0xeb, 0x71, 0xc3, 0x76, 0xa8, 0xd0, 0x21, + 0xde, 0xc7, 0xb1, 0x1d, 0x8a, 0x5c, 0x26, 0x7f, 0x11, 0x3e, 0x15, 0x3c, 0xaa, 0x63, 0x43, 0x79, + 0x11, 0x28, 0xd9, 0xa7, 0x5e, 0x44, 0x04, 0x46, 0x25, 0x9f, 0xfc, 0x8e, 0x11, 0x2f, 0x85, 0x89, + 0xb3, 0x0d, 0x6f, 0xe7, 0xac, 0x8b, 0x5c, 0x17, 0x11, 0xaa, 0xa8, 0x69, 0x7b, 0xdf, 0xe2, 0xd8, + 0x3d, 0x28, 0x98, 0x9d, 0xbd, 0xae, 0x9c, 0xaa, 0xe4, 0xdd, 0x23, 0xf5, 0xce, 0x5e, 0x37, 0xd5, + 0x23, 0xf5, 0xb5, 0xcd, 0x0d, 0xe4, 0x32, 0xd9, 0xd0, 0xd8, 0x35, 0xb7, 0x77, 0xa3, 0x55, 0x8f, + 0xbc, 0x87, 0xc6, 0x4d, 0xc6, 0x3b, 0x35, 0x34, 0x38, 0x0c, 0x85, 0x58, 0xf6, 0xec, 0x9d, 0xbd, + 0x30, 0xac, 0x8e, 0x0f, 0xe5, 0xd9, 0xd7, 0xf6, 0xc2, 0x30, 0xf5, 0xec, 0x6b, 0x9b, 0x5b, 0x5b, + 0xc8, 0x65, 0x32, 0xd9, 0xae, 0x19, 0x06, 0xd5, 0x89, 0xa1, 0xc8, 0x5e, 0x37, 0xc3, 0x20, 0x25, + 0x7b, 0xbd, 0xbe, 0xd5, 0x40, 0x2e, 0x93, 0xec, 0xc3, 0x68, 0xe0, 0x06, 0xd5, 0x49, 0x2e, 0xfa, + 0x8d, 0x9c, 0x45, 0x37, 0x5c, 0x29, 0x59, 0x9d, 0xbe, 0x6a, 0xac, 0x37, 0x90, 0x09, 0xe4, 0x72, + 0xf7, 0x82, 0xea, 0xd4, 0x70, 0xe4, 0xee, 0xf5, 0xc9, 0xdd, 0x64, 0x72, 0xf7, 0x02, 0xf2, 0x75, + 0x03, 0x4a, 0xdd, 0x5e, 0xb3, 0xd1, 0x6b, 0x56, 0xa7, 0xb9, 0xec, 0xcf, 0xe7, 0x2c, 0x7b, 0x83, + 0x33, 0x17, 0xe2, 0xd5, 0x1c, 0x43, 0x00, 0x51, 0x4a, 0xe6, 0x4a, 0x08, 0xa9, 0xd5, 0x73, 0x43, + 0x51, 0x62, 0x99, 0x73, 0x4b, 0x29, 0x21, 0x80, 0x28, 0x25, 0x47, 0x4a, 0x38, 0x66, 0xb3, 0x3a, + 0x33, 0x2c, 0x25, 0x1c, 0x33, 0x43, 0x09, 0xc7, 0x14, 0x4a, 0x38, 0x66, 0x93, 0x99, 0xfe, 0x4e, + 0x6b, 0x3b, 0xa8, 0x92, 0xa1, 0x98, 0xfe, 0xab, 0xad, 0xed, 0xb4, 0xe9, 0xbf, 0xba, 0x78, 0xa3, + 0x81, 0x5c, 0x26, 0x73, 0x39, 0x81, 0x63, 0x5a, 0xbb, 0xd5, 0xf3, 0x43, 0x71, 0x39, 0x0d, 0xc6, + 0x3b, 0xe5, 0x72, 0x38, 0x0c, 0x85, 0x58, 0xf2, 0x03, 0x03, 0xc6, 0x83, 0xd0, 0xf3, 0xcd, 0x36, + 0x5d, 0xf6, 0xed, 0x56, 0xf5, 0x42, 0x3e, 0x19, 0x62, 0x5a, 0x8d, 0x58, 0x82, 0x50, 0x46, 0xad, + 0x2e, 0x68, 0x18, 0xd4, 0x15, 0x21, 0x7f, 0x62, 0xc0, 0x94, 0x99, 0xd8, 0x93, 0xaf, 0x3e, 0xc9, + 0x75, 0x6b, 0xe6, 0x1d, 0x12, 0x92, 0x1b, 0xff, 0x5c, 0x3d, 0xb5, 0x9a, 0x9a, 0x44, 0x62, 0x4a, + 0x23, 0x6e, 0xbe, 0x41, 0xe8, 0xdb, 0x5d, 0x5a, 0xbd, 0x38, 0x14, 0xf3, 0x6d, 0x70, 0xe6, 0x29, + 0xf3, 0x15, 0x40, 0x94, 0x92, 0x79, 0xe8, 0xa6, 0x22, 0x25, 0xaf, 0x3e, 0x35, 0x94, 0xd0, 0x1d, + 0x25, 0xfc, 0xc9, 0xd0, 0x2d, 0xa1, 0x18, 0x09, 0x67, 0xb6, 0xec, 0xd3, 0x96, 0x1d, 0x54, 0xab, + 0x43, 0xb1, 0x65, 0x64, 0xbc, 0x53, 0xb6, 0xcc, 0x61, 0x28, 0xc4, 0x32, 0x77, 0xee, 0x06, 0x7b, + 0xd5, 0xa7, 0x87, 0xe2, 0xce, 0xd7, 0x83, 0xbd, 0x94, 0x3b, 0x5f, 0x6f, 0x6c, 0x22, 0x13, 0x28, + 0xdd, 0xb9, 0x13, 0x98, 0x7e, 0x75, 0x76, 0x48, 0xee, 0x9c, 0x31, 0xef, 0x73, 0xe7, 0x0c, 0x88, + 0x52, 0x32, 0xb7, 0x02, 0x7e, 0x18, 0xdb, 0xb6, 0xaa, 0x1f, 0x19, 0x8a, 0x15, 0x2c, 0x0b, 0xee, + 0x29, 0x2b, 0x90, 0x50, 0x8c, 0x84, 0x93, 0x6b, 0x6c, 0x56, 0xdb, 0x75, 0x6c, 0xcb, 0x0c, 0xaa, + 0x1f, 0xbd, 0x62, 0x5c, 0x2b, 0x8a, 0xc4, 0x07, 0x25, 0x0c, 0x15, 0x96, 0xfc, 0xc8, 0x80, 0xe9, + 0xd4, 0x7e, 0x56, 0xf5, 0x19, 0xae, 0xba, 0x95, 0xb3, 0xea, 0xf3, 0x49, 0x29, 0xe2, 0x11, 0x9e, + 0x92, 0x8f, 0x30, 0x9d, 0xde, 0xa1, 0x49, 0x2b, 0x45, 0xbe, 0x63, 0x40, 0x45, 0xc1, 0xaa, 0x97, + 0xb8, 0x8a, 0x5f, 0x1c, 0x96, 0x8a, 0x42, 0x39, 0x75, 0x84, 0x4c, 0xc1, 0x31, 0x56, 0x81, 0x7b, + 0x6d, 0x6e, 0xf3, 0x8d, 0xd0, 0xa7, 0x66, 0xa7, 0x7a, 0x79, 0x28, 0x5e, 0x1b, 0x63, 0x09, 0x29, + 0xaf, 0xad, 0x61, 0x50, 0x57, 0x64, 0xb6, 0x07, 0x10, 0x27, 0x80, 0x19, 0x8b, 0x6c, 0x9b, 0xfa, + 0x22, 0xdb, 0xf8, 0x8b, 0x2f, 0x0f, 0xbc, 0xcc, 0xd9, 0xf8, 0xf5, 0xba, 0x1f, 0xda, 0xdb, 0xa6, + 0x15, 0x6a, 0x2b, 0x74, 0xb3, 0xdf, 0x35, 0x60, 0x32, 0x91, 0xf4, 0x65, 0x88, 0xde, 0x49, 0x8a, + 0xc6, 0xfc, 0xf7, 0x85, 0x74, 0x8d, 0x7e, 0xd7, 0x80, 0x8a, 0x4a, 0xff, 0x32, 0xb4, 0x69, 0x25, + 0xb5, 0x39, 0xed, 0x72, 0x16, 0x17, 0x95, 0xad, 0x09, 0x7b, 0x37, 0x89, 0x3c, 0x70, 0xf8, 0xef, + 0x46, 0x89, 0xcb, 0xd6, 0xe8, 0x9b, 0x06, 0x4c, 0xe8, 0xd9, 0x60, 0x86, 0x42, 0x56, 0x52, 0xa1, + 0x7c, 0x8f, 0x65, 0xa4, 0xfb, 0x49, 0x25, 0x85, 0xc3, 0xef, 0xa7, 0xd4, 0x81, 0xff, 0xd4, 0x5b, + 0x81, 0x38, 0x43, 0xcc, 0x50, 0x85, 0x26, 0x55, 0x39, 0xed, 0x26, 0xa2, 0x90, 0x75, 0xb8, 0xf5, + 0xaa, 0x74, 0x71, 0xf8, 0x6f, 0x85, 0xa5, 0xa1, 0x87, 0x68, 0xf2, 0x0d, 0x03, 0x2a, 0x2a, 0x79, + 0x1c, 0xfe, 0x4b, 0x61, 0x49, 0xa9, 0x98, 0xde, 0xf5, 0xab, 0xf2, 0xdb, 0x06, 0x94, 0xa3, 0x64, + 0x72, 0xf8, 0x26, 0xdb, 0x58, 0x6f, 0x1c, 0xf2, 0x4a, 0xb8, 0x1e, 0x7b, 0x8f, 0x4c, 0x8f, 0xcd, + 0xc3, 0xf4, 0x78, 0xdf, 0x80, 0x71, 0x2d, 0xd1, 0xcc, 0x50, 0x65, 0x3b, 0xa9, 0xca, 0x69, 0xd7, + 0xcf, 0xa5, 0xb0, 0xc3, 0xb5, 0xd1, 0x32, 0xce, 0xe1, 0x6b, 0x23, 0x85, 0x1d, 0xa9, 0x4d, 0x94, + 0x7a, 0x3e, 0x12, 0x6d, 0x98, 0xb0, 0xc3, 0x87, 0xb3, 0x4a, 0x43, 0x87, 0x3f, 0x9c, 0x59, 0x7a, + 0x7b, 0x84, 0x93, 0x8b, 0x73, 0xd2, 0xe1, 0x8f, 0x67, 0x21, 0x2b, 0x5b, 0x97, 0xef, 0x1b, 0x70, + 0x2e, 0x9d, 0x98, 0x66, 0x68, 0xb4, 0x9b, 0xd4, 0xe8, 0xb4, 0x75, 0x4c, 0xba, 0xc4, 0x6c, 0xbd, + 0xfe, 0xd8, 0x80, 0xf3, 0x19, 0x49, 0x69, 0x86, 0x6a, 0x6e, 0x52, 0xb5, 0x37, 0x87, 0x75, 0x04, + 0x3e, 0x6d, 0xd9, 0x5a, 0x56, 0x3a, 0x7c, 0xcb, 0x96, 0xc2, 0xb2, 0xb5, 0xf9, 0xb6, 0x01, 0x13, + 0x7a, 0x76, 0x9a, 0xa1, 0x4e, 0x3b, 0xa9, 0xce, 0x66, 0xee, 0x9b, 0xdf, 0x69, 0xfb, 0x8e, 0xf3, + 0xd4, 0xe1, 0xdb, 0xb7, 0x90, 0x75, 0x78, 0x9c, 0x88, 0xb2, 0xd6, 0xe1, 0xc7, 0x89, 0xf5, 0xc6, + 0xe6, 0x91, 0x71, 0x42, 0x65, 0xb0, 0x8f, 0x22, 0x4e, 0x70, 0x61, 0x87, 0x5b, 0x8c, 0x9e, 0xc9, + 0x0e, 0xdf, 0x62, 0x22, 0x69, 0xd9, 0xfa, 0xfc, 0xd0, 0xd0, 0x8e, 0xfa, 0x6b, 0xe9, 0x69, 0x86, + 0x5e, 0x5e, 0x52, 0xaf, 0xb7, 0x86, 0x76, 0x28, 0x53, 0xd7, 0xef, 0x03, 0x03, 0xa6, 0x92, 0xb9, + 0x69, 0x86, 0x66, 0x76, 0x52, 0xb3, 0xc6, 0x10, 0xca, 0x08, 0xd2, 0x9e, 0x3b, 0x9d, 0x9c, 0x0e, + 0xdf, 0x73, 0xeb, 0x12, 0x33, 0xf5, 0xaa, 0x85, 0x89, 0x6d, 0x7b, 0xb1, 0xa7, 0x4f, 0xde, 0x55, + 0xa7, 0x08, 0xc4, 0x66, 0xfb, 0x27, 0x07, 0xcf, 0x79, 0x8f, 0x3e, 0x2c, 0xf0, 0xd7, 0x05, 0x98, + 0x4e, 0xe5, 0x7f, 0xbc, 0xda, 0x8d, 0xfd, 0xe5, 0xa5, 0xe1, 0x46, 0xb2, 0x28, 0x6d, 0x29, 0x42, + 0x60, 0x4c, 0x43, 0x3e, 0x30, 0x60, 0xfa, 0x8e, 0x19, 0x5a, 0x3b, 0x1b, 0x66, 0xb8, 0x23, 0x4e, + 0x7c, 0xe4, 0x34, 0x1b, 0x78, 0x23, 0xc9, 0x35, 0x5e, 0x76, 0x49, 0x21, 0x30, 0x2d, 0x9f, 0x3c, + 0x07, 0x63, 0x5d, 0xcf, 0x71, 0x6c, 0xb7, 0x2d, 0x6b, 0xfc, 0xd4, 0xa2, 0xd3, 0x86, 0x00, 0x63, + 0x84, 0x4f, 0xd6, 0x66, 0x17, 0x72, 0xd9, 0x4b, 0x4d, 0xbd, 0xd2, 0x13, 0x1d, 0x71, 0x2a, 0x9e, + 0x95, 0x23, 0x4e, 0xff, 0x54, 0x00, 0xd2, 0xef, 0xa7, 0x1e, 0x76, 0x7b, 0xc1, 0x55, 0x28, 0x59, + 0xb1, 0xa9, 0x68, 0x87, 0x12, 0x65, 0x8f, 0x4a, 0xac, 0x38, 0x2e, 0x1c, 0x50, 0xab, 0xe7, 0xd3, + 0xfe, 0x62, 0x55, 0x01, 0x47, 0x45, 0x91, 0x38, 0x36, 0x57, 0x78, 0xe8, 0xb1, 0xb9, 0x6f, 0xf7, + 0x1f, 0xf9, 0x7d, 0x37, 0x77, 0x87, 0x3d, 0x40, 0xe7, 0xdf, 0xe6, 0xb5, 0xa9, 0x3b, 0xb2, 0x7c, + 0xa0, 0x34, 0x70, 0x29, 0x5b, 0x5d, 0x35, 0x46, 0x8d, 0x91, 0x66, 0x53, 0x63, 0x67, 0xc5, 0xa6, + 0xfe, 0xd1, 0x80, 0x29, 0x91, 0x24, 0xd5, 0xbb, 0xdd, 0x05, 0x9f, 0xb6, 0x02, 0xf6, 0x72, 0xba, + 0xbe, 0xbd, 0x6f, 0x86, 0x34, 0x3a, 0xf1, 0x3e, 0xd8, 0xcb, 0xd9, 0x50, 0x8d, 0x51, 0x63, 0x44, + 0x9e, 0x85, 0xa2, 0xd9, 0xed, 0xae, 0x2c, 0x72, 0x1d, 0x46, 0xe3, 0xdd, 0x81, 0x3a, 0x03, 0xa2, + 0xc0, 0x91, 0x57, 0x60, 0xca, 0x76, 0x83, 0xd0, 0x74, 0x1c, 0x7e, 0xb4, 0x6e, 0x65, 0x91, 0x9b, + 0xe2, 0x68, 0xbc, 0xd7, 0xb3, 0x92, 0xc0, 0x62, 0x8a, 0xba, 0xf6, 0x37, 0xe3, 0x30, 0xd3, 0x97, + 0xf3, 0x91, 0x59, 0x18, 0xb1, 0xc5, 0x59, 0xe4, 0xd1, 0x79, 0x90, 0x9c, 0x46, 0x56, 0x16, 0x71, + 0xc4, 0x6e, 0xe9, 0xd5, 0x45, 0x23, 0x8f, 0xae, 0xba, 0xe8, 0xe3, 0x51, 0xf9, 0x98, 0x38, 0xc7, + 0xab, 0xdc, 0x6d, 0x5c, 0x16, 0x94, 0x28, 0x24, 0xfb, 0x0c, 0x40, 0x5c, 0x22, 0x20, 0x8f, 0xd8, + 0x67, 0x14, 0x23, 0xc5, 0x65, 0x05, 0xa8, 0xd1, 0x1f, 0xab, 0x5a, 0xe7, 0x16, 0x94, 0xcd, 0xae, + 0x7d, 0x82, 0x52, 0x1d, 0xbe, 0x6f, 0x50, 0xdf, 0x58, 0x11, 0x75, 0x3a, 0x8a, 0xc9, 0xd0, 0x8b, + 0x74, 0x74, 0x77, 0x55, 0x7e, 0xa8, 0xbb, 0xba, 0x0a, 0x25, 0xd3, 0x0a, 0xed, 0x7d, 0x2a, 0xcb, + 0x6d, 0x94, 0x13, 0xac, 0x73, 0x28, 0x4a, 0xac, 0xbc, 0x03, 0x27, 0x8c, 0x82, 0x32, 0xf4, 0xdd, + 0x81, 0x13, 0xa1, 0x50, 0xa7, 0x23, 0x2f, 0xc3, 0xa4, 0x30, 0x9a, 0xa8, 0x50, 0x68, 0x9c, 0x37, + 0x7c, 0x52, 0x36, 0x9c, 0x5c, 0xd6, 0x91, 0x98, 0xa4, 0x25, 0x75, 0x98, 0x16, 0x80, 0xdb, 0x5d, + 0xc7, 0x33, 0x5b, 0xac, 0xf9, 0x44, 0xd2, 0x2a, 0x96, 0x93, 0x68, 0x4c, 0xd3, 0x1f, 0x52, 0x59, + 0x34, 0x79, 0xa2, 0xca, 0xa2, 0x6f, 0xe9, 0xbe, 0x5a, 0x9c, 0xba, 0x78, 0x27, 0xef, 0x55, 0x98, + 0x01, 0x5c, 0xf5, 0x7b, 0xe9, 0xfa, 0x37, 0x71, 0x18, 0xe3, 0xb4, 0xae, 0x95, 0x0d, 0xaf, 0x96, + 0x5e, 0xe1, 0x76, 0xac, 0xba, 0xb7, 0x4f, 0xc2, 0xa4, 0xe7, 0xb7, 0x4d, 0xd7, 0xbe, 0xc7, 0x1d, + 0x4e, 0xc0, 0x0f, 0x65, 0x54, 0x84, 0xb5, 0xde, 0xd2, 0x11, 0x98, 0xa4, 0x23, 0xf7, 0xa0, 0xd2, + 0x8e, 0xbc, 0x6c, 0x75, 0x26, 0x17, 0x3f, 0x93, 0xf4, 0xda, 0xe2, 0x14, 0xb0, 0x82, 0x61, 0x2c, + 0x4e, 0x8b, 0x4a, 0xe4, 0xac, 0x44, 0xa5, 0x7f, 0x19, 0xe3, 0x6e, 0x3c, 0xb9, 0x58, 0xf6, 0x98, + 0x0a, 0x41, 0x3f, 0x05, 0x15, 0x59, 0xda, 0x25, 0x63, 0x57, 0x65, 0xfe, 0x23, 0xd2, 0x54, 0xce, + 0xf7, 0xd5, 0x81, 0xae, 0x2c, 0x62, 0x4c, 0xad, 0x39, 0xde, 0xd1, 0xe3, 0x96, 0x49, 0x16, 0xf2, + 0x2b, 0x93, 0x6c, 0xc0, 0x93, 0xa2, 0xcc, 0xa6, 0xd1, 0x58, 0x7d, 0x9d, 0xfa, 0xf6, 0xb6, 0x6d, + 0x89, 0x2a, 0x1b, 0x71, 0x55, 0xc6, 0x33, 0xf2, 0x21, 0x9e, 0x5c, 0xca, 0x22, 0xc2, 0xec, 0xb6, + 0xd2, 0xd3, 0x39, 0xa6, 0xf2, 0x74, 0xa5, 0x3e, 0x4f, 0x17, 0x23, 0x31, 0x49, 0x7b, 0x88, 0x9b, + 0x2a, 0x9f, 0xde, 0x4d, 0x55, 0xf2, 0x72, 0x53, 0x49, 0x8b, 0x1b, 0xc0, 0x4d, 0x5d, 0x83, 0xb2, + 0xec, 0xf7, 0x80, 0x1f, 0x4c, 0xac, 0xc8, 0x7a, 0x17, 0x09, 0x43, 0x85, 0x65, 0x1d, 0x1e, 0xf0, + 0x9e, 0x14, 0x1d, 0x3e, 0x3e, 0x70, 0x87, 0x37, 0xe2, 0xd6, 0xa8, 0xb3, 0xd2, 0x06, 0xfa, 0xc4, + 0x59, 0x19, 0xe8, 0x3f, 0xac, 0xc0, 0x74, 0x6a, 0x25, 0x3a, 0x33, 0xcb, 0x35, 0x1e, 0x73, 0x96, + 0x7b, 0x05, 0x0a, 0x21, 0x9b, 0x10, 0x8c, 0x24, 0x0b, 0xcb, 0xf8, 0x4c, 0x80, 0x63, 0xd8, 0xc0, + 0xb0, 0x76, 0xa8, 0xb5, 0x1b, 0x95, 0x56, 0xca, 0x99, 0x9d, 0x1a, 0x18, 0x0b, 0x3a, 0x12, 0x93, + 0xb4, 0xe4, 0xff, 0x43, 0xc5, 0x6c, 0xb5, 0x7c, 0x1a, 0x04, 0xb2, 0xc0, 0xbb, 0x22, 0xfc, 0x79, + 0x3d, 0x02, 0x62, 0x8c, 0x67, 0x33, 0x9f, 0x9d, 0xd6, 0x76, 0x70, 0x3b, 0x90, 0xb9, 0xab, 0x56, + 0x6d, 0xc9, 0x5e, 0x25, 0x83, 0xa3, 0xa2, 0x20, 0x2d, 0x98, 0xde, 0xf5, 0x9b, 0x0b, 0x0b, 0xa6, + 0xb5, 0x43, 0x4f, 0x92, 0xef, 0xf0, 0x6b, 0x61, 0x6e, 0x26, 0x39, 0x60, 0x9a, 0xa5, 0x94, 0x72, + 0x93, 0x1e, 0x84, 0x66, 0xf3, 0x24, 0xf3, 0xbd, 0x48, 0x8a, 0xce, 0x01, 0xd3, 0x2c, 0xd9, 0xec, + 0x6c, 0xd7, 0x6f, 0x46, 0x45, 0x69, 0xb2, 0x1a, 0x5b, 0xcd, 0xce, 0x6e, 0xc6, 0x28, 0xd4, 0xe9, + 0xd8, 0x0b, 0xdb, 0xf5, 0x9b, 0x48, 0x4d, 0xa7, 0xc3, 0xa7, 0x7f, 0xda, 0x0b, 0xbb, 0x29, 0xe1, + 0xa8, 0x28, 0x48, 0x17, 0x08, 0x7b, 0x3a, 0xde, 0xef, 0xaa, 0xaa, 0x46, 0xd6, 0x41, 0x5d, 0xcb, + 0x7a, 0x1a, 0x45, 0xa4, 0x3f, 0xd0, 0x45, 0xe6, 0xca, 0x6e, 0xf6, 0xf1, 0xc1, 0x0c, 0xde, 0xe4, + 0x2d, 0x78, 0x6a, 0xd7, 0x6f, 0xca, 0x1a, 0x80, 0x0d, 0xdf, 0x76, 0x2d, 0xbb, 0x6b, 0x8a, 0x32, + 0x3f, 0x31, 0x8f, 0xbc, 0x2c, 0xd5, 0x7d, 0xea, 0x66, 0x36, 0x19, 0x1e, 0xd6, 0x3e, 0xb9, 0xe4, + 0x32, 0x91, 0xcb, 0x92, 0x4b, 0x6a, 0xb8, 0x9e, 0x68, 0xc9, 0x65, 0xf2, 0xac, 0xf8, 0xa7, 0x1f, + 0x1b, 0x40, 0xf8, 0x1e, 0x7c, 0x74, 0xfd, 0xe5, 0xb2, 0xef, 0xf5, 0xba, 0xe4, 0x3a, 0x54, 0xda, + 0xec, 0x87, 0x56, 0xb7, 0xa2, 0x56, 0xee, 0x96, 0x23, 0x04, 0xc6, 0x34, 0x2c, 0xff, 0xf0, 0x9c, + 0x16, 0x55, 0xc5, 0xa6, 0x2a, 0xff, 0xb8, 0xc5, 0xa1, 0x28, 0xb1, 0x64, 0x19, 0x66, 0x7c, 0xda, + 0x34, 0x1d, 0xd3, 0xb5, 0x68, 0x23, 0xf4, 0xcd, 0x90, 0xb6, 0x0f, 0xa4, 0x27, 0x79, 0x5a, 0x36, + 0x99, 0xc1, 0x34, 0x01, 0xf6, 0xb7, 0xa9, 0xfd, 0x65, 0x19, 0xce, 0xa5, 0x0f, 0x0f, 0x3c, 0x6c, + 0xa5, 0xe8, 0x3a, 0x54, 0xba, 0xa6, 0x1f, 0xda, 0x5a, 0x29, 0xae, 0x7a, 0xaa, 0x8d, 0x08, 0x81, + 0x31, 0x0d, 0x4b, 0xe9, 0x43, 0xaf, 0x6b, 0x5b, 0x52, 0x43, 0x95, 0xd2, 0x6f, 0x31, 0x20, 0x0a, + 0x5c, 0x76, 0x7d, 0x67, 0xe1, 0x91, 0xd5, 0x77, 0xca, 0x8a, 0xcd, 0x62, 0xce, 0x15, 0x9b, 0x83, + 0x5d, 0x76, 0xf9, 0xbe, 0x3e, 0x0c, 0xc7, 0x72, 0x39, 0x9a, 0x96, 0xee, 0xdc, 0xc1, 0x52, 0xaa, + 0x49, 0x4b, 0xb7, 0x67, 0x59, 0xcf, 0xba, 0x99, 0x87, 0x4a, 0x89, 0x81, 0x22, 0x32, 0xa3, 0x04, + 0x08, 0x93, 0xa2, 0xc9, 0x06, 0x5c, 0x70, 0xec, 0x8e, 0x2d, 0x76, 0x11, 0x82, 0x0d, 0xea, 0x37, + 0xa8, 0xe5, 0xb9, 0x2d, 0xee, 0xa8, 0x47, 0xe3, 0x45, 0x8e, 0xd5, 0x0c, 0x1a, 0xcc, 0x6c, 0x49, + 0x9e, 0x83, 0xb1, 0x7d, 0xea, 0xf3, 0xfa, 0x3b, 0x48, 0x5e, 0x51, 0xf6, 0xba, 0x00, 0x63, 0x84, + 0x27, 0x6f, 0x41, 0x21, 0x30, 0x03, 0x47, 0x4e, 0xc2, 0x4e, 0x70, 0xd0, 0xad, 0xde, 0x58, 0x95, + 0xe6, 0xc1, 0x2f, 0x11, 0x62, 0xff, 0x91, 0xb3, 0x3c, 0x8b, 0x93, 0xb1, 0xbf, 0x2b, 0xc2, 0x74, + 0xea, 0x94, 0xcf, 0xc3, 0x5c, 0x86, 0xf2, 0x00, 0x23, 0x47, 0x78, 0x80, 0xe7, 0xa1, 0x6c, 0x39, + 0x36, 0x75, 0xc3, 0x95, 0x96, 0xf4, 0x14, 0x71, 0xb5, 0x97, 0x80, 0x2f, 0xa2, 0xa2, 0x78, 0xdc, + 0xfe, 0x42, 0x1f, 0xd8, 0xc5, 0xe3, 0xd6, 0x83, 0x97, 0x86, 0x79, 0x8b, 0x6d, 0x3e, 0x55, 0x67, + 0xa9, 0x8e, 0x3d, 0x51, 0xd8, 0x3e, 0x33, 0x37, 0x53, 0xfc, 0xc3, 0x08, 0x94, 0xd7, 0xeb, 0x5b, + 0x0d, 0x7e, 0x93, 0xdc, 0xdb, 0xc9, 0xbb, 0xf2, 0x4e, 0x73, 0xc9, 0x6a, 0xff, 0xa5, 0x78, 0x37, + 0xd8, 0x00, 0x18, 0xf8, 0x3e, 0xbc, 0x8a, 0x18, 0x23, 0x2c, 0x83, 0x13, 0xcd, 0xc9, 0x02, 0x14, + 0xdc, 0xdd, 0x41, 0xaf, 0x6c, 0xe4, 0x3e, 0x67, 0xfd, 0x26, 0x3d, 0x40, 0xde, 0x98, 0xdc, 0x06, + 0xb0, 0x7c, 0xda, 0xa2, 0x6e, 0x68, 0xcb, 0x1b, 0xb3, 0x07, 0x5b, 0xb9, 0x5f, 0x50, 0x8d, 0x51, + 0x63, 0x54, 0xfb, 0x46, 0x09, 0xce, 0xa5, 0xcf, 0xdc, 0x3d, 0xcc, 0x31, 0x3c, 0x07, 0x63, 0x41, + 0x8f, 0x57, 0x88, 0x4b, 0xd7, 0xa0, 0x9c, 0x70, 0x43, 0x80, 0x31, 0xc2, 0x67, 0x0f, 0xf8, 0xd1, + 0xc7, 0x32, 0xe0, 0x0b, 0xc7, 0x1d, 0xf0, 0x79, 0x4f, 0x27, 0x12, 0x13, 0x84, 0x52, 0x2e, 0x13, + 0x84, 0x74, 0x8f, 0x0d, 0x30, 0xe2, 0xa9, 0xbc, 0x6c, 0x6f, 0x2c, 0x97, 0xda, 0xea, 0x68, 0x20, + 0xf6, 0xdd, 0xb3, 0x77, 0x06, 0x1d, 0xcb, 0xcf, 0x8b, 0x30, 0x95, 0x3c, 0x44, 0xc3, 0x92, 0xd2, + 0x1d, 0x2f, 0x08, 0x65, 0xaa, 0x9e, 0xbe, 0x36, 0xff, 0xd5, 0x18, 0x85, 0x3a, 0xdd, 0xf1, 0x22, + 0xe7, 0x73, 0x30, 0x26, 0x2f, 0x73, 0x91, 0x81, 0x53, 0x8d, 0x22, 0x79, 0xe1, 0x0b, 0x46, 0xf8, + 0xff, 0x0b, 0x9b, 0x4e, 0x40, 0xbe, 0xd9, 0x1f, 0x36, 0xdf, 0xce, 0xf5, 0xc4, 0xd4, 0x87, 0x3b, + 0x6a, 0xbe, 0x05, 0x33, 0x7d, 0xdb, 0x22, 0xf1, 0x45, 0x97, 0xc6, 0x11, 0x17, 0x5d, 0x5e, 0x86, + 0xa2, 0x6b, 0x76, 0xa8, 0xb8, 0x4f, 0xa2, 0x22, 0xc2, 0x1b, 0xcb, 0x7b, 0x03, 0x14, 0xf0, 0xda, + 0x8f, 0x4a, 0x30, 0xd3, 0x77, 0x32, 0x98, 0x27, 0x9c, 0x6a, 0x69, 0x3d, 0x95, 0x46, 0x67, 0x2e, + 0xa8, 0xbf, 0x02, 0x53, 0x7c, 0x60, 0x6c, 0xa4, 0x16, 0xe4, 0xd5, 0xf6, 0xf0, 0x56, 0x02, 0x8b, + 0x29, 0xea, 0xe3, 0x25, 0xac, 0xaf, 0xc0, 0x54, 0xd0, 0x6b, 0x06, 0x96, 0x6f, 0x77, 0xe5, 0x1e, + 0x74, 0x21, 0x29, 0xa4, 0x91, 0xc0, 0x62, 0x8a, 0x9a, 0xb4, 0xf9, 0x15, 0x53, 0x32, 0x78, 0xca, + 0xc5, 0xb0, 0x81, 0x6e, 0x4a, 0xba, 0x20, 0x6f, 0xa1, 0x4a, 0xb0, 0xc0, 0x3e, 0xa6, 0xa4, 0x09, + 0xb3, 0x62, 0x61, 0x5c, 0x57, 0x48, 0x2d, 0xab, 0x8b, 0xac, 0xb4, 0x26, 0x95, 0x9e, 0x5d, 0x3c, + 0x94, 0x12, 0x8f, 0xe0, 0x32, 0xe0, 0xf5, 0x48, 0xdf, 0xea, 0xff, 0xfa, 0xc2, 0x3b, 0x79, 0x9f, + 0x27, 0x3f, 0xd1, 0x18, 0x3c, 0x33, 0x77, 0xa1, 0xfe, 0x7d, 0x99, 0x0d, 0x94, 0xd4, 0xd1, 0x48, + 0x52, 0x83, 0x12, 0xb7, 0x4d, 0x16, 0x5e, 0xd4, 0x46, 0x12, 0x37, 0xda, 0x00, 0x25, 0xe6, 0x18, + 0x4b, 0xd4, 0x72, 0xca, 0x36, 0x7a, 0xc8, 0x94, 0xad, 0x0b, 0xe7, 0x43, 0x27, 0xd8, 0xf2, 0x7b, + 0x41, 0xb8, 0x40, 0xfd, 0x30, 0x90, 0xa6, 0x5b, 0x18, 0xf8, 0xca, 0xf2, 0xad, 0xd5, 0x46, 0x9a, + 0x0b, 0x66, 0xb1, 0x66, 0x06, 0x1c, 0x3a, 0x41, 0xdd, 0x71, 0xbc, 0x3b, 0xd1, 0x9e, 0x7d, 0x1c, + 0x6c, 0x64, 0x18, 0x51, 0x06, 0xbc, 0xb5, 0xda, 0x38, 0x84, 0x12, 0x8f, 0xe0, 0x42, 0xd6, 0xf8, + 0x53, 0xbd, 0x6e, 0x3a, 0x76, 0xcb, 0x0c, 0x29, 0x0b, 0xc7, 0x7c, 0xed, 0x58, 0x8c, 0x0e, 0xb5, + 0x91, 0xb7, 0xb5, 0xda, 0x48, 0x93, 0x60, 0x56, 0xbb, 0x61, 0x7d, 0xb6, 0x24, 0x33, 0x7a, 0x97, + 0x1f, 0x4b, 0xf4, 0xae, 0x0c, 0x36, 0xca, 0x21, 0xa7, 0x51, 0x9e, 0x32, 0xf9, 0x01, 0x46, 0x79, + 0x0b, 0xa6, 0xd5, 0x6d, 0xe2, 0xd2, 0x66, 0xc7, 0x07, 0xde, 0x7b, 0xa8, 0x27, 0x39, 0x60, 0x9a, + 0xe5, 0x59, 0x5c, 0xcf, 0xf9, 0xf3, 0xa2, 0x3c, 0x81, 0x9b, 0xc3, 0x74, 0x35, 0xef, 0xdb, 0xd3, + 0x59, 0xec, 0xe7, 0x53, 0x83, 0xae, 0x69, 0x45, 0xb7, 0x19, 0xaa, 0xd8, 0xbf, 0x1e, 0x21, 0x30, + 0xa6, 0x21, 0xb3, 0x30, 0xd2, 0x6a, 0x72, 0x6f, 0x54, 0x8c, 0x0f, 0x71, 0x2d, 0xce, 0xe3, 0x48, + 0xab, 0x49, 0xae, 0x41, 0x59, 0xce, 0x83, 0xa3, 0x33, 0x4e, 0x5c, 0xac, 0x9c, 0x24, 0x07, 0xa8, + 0xb0, 0xc3, 0x9a, 0x79, 0x0e, 0x61, 0x81, 0x37, 0xdd, 0x73, 0x1f, 0xee, 0xb9, 0xe7, 0x7b, 0x25, + 0xb8, 0x98, 0x7d, 0x76, 0xfb, 0x7f, 0x8d, 0xc5, 0x0a, 0x03, 0x1c, 0xcd, 0x34, 0xc0, 0x8f, 0xc1, + 0x58, 0xc0, 0x15, 0x8f, 0xb6, 0x6f, 0xc5, 0xb5, 0x5e, 0x02, 0x84, 0x11, 0x8e, 0xbc, 0x06, 0xa4, + 0x63, 0xde, 0x5d, 0x0b, 0xda, 0x0b, 0x5e, 0x8f, 0xdf, 0x54, 0x88, 0xd4, 0x14, 0xd7, 0x68, 0x16, + 0xe3, 0x03, 0x10, 0x6b, 0x7d, 0x14, 0x98, 0xd1, 0x8a, 0x6f, 0x38, 0x27, 0x16, 0xf1, 0x53, 0x27, + 0x31, 0x8e, 0x5c, 0x75, 0x1f, 0x52, 0x18, 0xfb, 0xa0, 0x7f, 0xfe, 0x67, 0x0d, 0xe5, 0x40, 0xff, + 0x87, 0x7b, 0x12, 0xf8, 0x8b, 0x02, 0x9c, 0xcf, 0x28, 0xcf, 0x4e, 0xfa, 0x4c, 0xe3, 0x18, 0x3e, + 0x73, 0x4f, 0x3d, 0x7b, 0x3e, 0x67, 0x5b, 0x23, 0xa5, 0x0e, 0x7f, 0x70, 0x36, 0x39, 0xb8, 0xc0, + 0xf7, 0x3d, 0xa3, 0xcd, 0x96, 0xe8, 0xf2, 0xb4, 0x51, 0x69, 0x6b, 0xc7, 0xba, 0xc5, 0x70, 0x39, + 0x83, 0x43, 0xbc, 0x19, 0x94, 0x85, 0xc5, 0x4c, 0xa9, 0x64, 0x01, 0x40, 0xd5, 0x4f, 0x44, 0x63, + 0xf3, 0x59, 0x7e, 0x17, 0xa3, 0x82, 0xfe, 0x17, 0xdf, 0x53, 0xd5, 0xde, 0x36, 0x9f, 0x32, 0x6b, + 0xcd, 0x86, 0x71, 0x63, 0x75, 0x46, 0xf7, 0x1e, 0xdf, 0xa6, 0x4f, 0x67, 0x5d, 0x7f, 0x31, 0x0a, + 0x53, 0xc9, 0x8e, 0x24, 0x57, 0xa1, 0xd4, 0xf5, 0xe9, 0xb6, 0x7d, 0x37, 0x7d, 0x71, 0xf1, 0x06, + 0x87, 0xa2, 0xc4, 0x12, 0x0f, 0x4a, 0x8e, 0xd9, 0x64, 0x51, 0x56, 0x5c, 0x1c, 0xb9, 0x7c, 0xea, + 0x4b, 0x10, 0xa3, 0xe5, 0xe7, 0x48, 0xe0, 0x2a, 0x67, 0x8f, 0x52, 0x0c, 0x13, 0xb8, 0x6d, 0x53, + 0xa7, 0x25, 0x4e, 0xd0, 0x0d, 0x43, 0xe0, 0x0d, 0xce, 0x1e, 0xa5, 0x18, 0xf2, 0x36, 0x54, 0xc4, + 0x6d, 0xcf, 0xad, 0xf9, 0x03, 0x99, 0xfa, 0xfc, 0xbf, 0xe3, 0x99, 0xec, 0x96, 0xdd, 0xa1, 0xf1, + 0x70, 0x5c, 0x88, 0x98, 0x60, 0xcc, 0x8f, 0x7f, 0x12, 0x6b, 0x3b, 0xa4, 0x7e, 0x23, 0x34, 0xfd, + 0xe8, 0x8b, 0x55, 0xf1, 0x27, 0xb1, 0x14, 0x06, 0x35, 0xaa, 0xda, 0x5f, 0x95, 0x60, 0x2a, 0x59, + 0x66, 0xfe, 0x98, 0xce, 0x41, 0x3e, 0x0f, 0x65, 0x9e, 0x69, 0xd6, 0x7d, 0x37, 0x7d, 0x9d, 0xfc, + 0x96, 0x84, 0xa3, 0xa2, 0x20, 0x08, 0x15, 0xf3, 0x64, 0xdf, 0xa1, 0x12, 0x07, 0x9f, 0xd4, 0x17, + 0xa8, 0x62, 0x36, 0x8c, 0x67, 0x10, 0x91, 0x0f, 0x96, 0x96, 0x72, 0x9e, 0x0a, 0x8c, 0x31, 0x1b, + 0x66, 0xf9, 0x3e, 0x6d, 0x47, 0xe9, 0xa6, 0x66, 0xf9, 0xc8, 0xa1, 0x28, 0xb1, 0xe4, 0x39, 0x18, + 0xf3, 0x3d, 0x87, 0xd6, 0x71, 0x5d, 0xc6, 0x59, 0xb5, 0x12, 0x8b, 0x02, 0x8c, 0x11, 0x7e, 0x18, + 0xab, 0x90, 0x49, 0x03, 0x18, 0x20, 0xf8, 0x2d, 0xc3, 0xcc, 0xbe, 0x4c, 0x61, 0x1b, 0x76, 0xdb, + 0x35, 0xc3, 0xf8, 0xb8, 0xbc, 0x3a, 0x4f, 0xf2, 0x7a, 0x9a, 0x00, 0xfb, 0xdb, 0x9c, 0xc5, 0x28, + 0xfa, 0x6f, 0x6c, 0xe4, 0x24, 0x2e, 0x46, 0x48, 0x5a, 0xa5, 0x31, 0x04, 0xab, 0x1c, 0xc9, 0xdb, + 0x2a, 0x47, 0x8f, 0xb4, 0xca, 0x67, 0xa1, 0xc8, 0x3f, 0x62, 0x29, 0x57, 0x28, 0xd5, 0x7a, 0x26, + 0xff, 0xb6, 0x1f, 0x0a, 0x1c, 0xa9, 0xc3, 0xf4, 0x1d, 0xd3, 0x0e, 0x99, 0x7f, 0x12, 0x27, 0x24, + 0xc4, 0xf6, 0xd5, 0xa8, 0x7e, 0xfc, 0x31, 0x81, 0xc6, 0x34, 0xfd, 0x20, 0xd6, 0x3f, 0xd8, 0x82, + 0xe1, 0x2b, 0x30, 0xc5, 0x95, 0xac, 0x5b, 0x16, 0x9b, 0xdb, 0xae, 0xb4, 0xd2, 0x5f, 0x3b, 0xda, + 0xd4, 0xb1, 0x8b, 0x98, 0xa2, 0x4e, 0x8e, 0xb5, 0x4a, 0x3e, 0x63, 0x6d, 0xf3, 0x84, 0x63, 0xed, + 0x19, 0x18, 0x6d, 0x39, 0x7b, 0xfc, 0xcc, 0x49, 0x39, 0x5e, 0x5e, 0x5b, 0x5c, 0xdd, 0x44, 0x06, + 0x7f, 0x3c, 0x5f, 0x46, 0x61, 0xdd, 0x41, 0xdd, 0x56, 0xd7, 0xb3, 0xdd, 0x50, 0x56, 0x95, 0xa8, + 0x47, 0x58, 0x92, 0x70, 0x54, 0x14, 0xa7, 0x1b, 0x6f, 0x5f, 0x85, 0x72, 0x64, 0xda, 0xec, 0x5d, + 0xa8, 0x76, 0xf1, 0xbb, 0x60, 0x56, 0xce, 0x99, 0x5c, 0x87, 0x8a, 0xd7, 0xa5, 0x89, 0x8f, 0x3e, + 0xa8, 0xc8, 0x79, 0x2b, 0x42, 0x60, 0x4c, 0xc3, 0x0c, 0x5d, 0x48, 0x4d, 0x2d, 0xdc, 0xbf, 0xce, + 0x80, 0x52, 0x89, 0xda, 0xd7, 0x0c, 0x88, 0x6e, 0x52, 0x26, 0x8b, 0x50, 0xec, 0x7a, 0x7e, 0x28, + 0x16, 0x4c, 0xc7, 0x5f, 0xbc, 0x9c, 0x3d, 0x22, 0xc5, 0x89, 0x49, 0xcf, 0x0f, 0x63, 0x8e, 0xec, + 0x5f, 0x80, 0xa2, 0x31, 0xd3, 0xd3, 0x72, 0x7a, 0x41, 0x48, 0xfd, 0x95, 0x8d, 0xb4, 0x9e, 0x0b, + 0x11, 0x02, 0x63, 0x9a, 0xda, 0xbf, 0x17, 0xe0, 0x5c, 0xfa, 0x3a, 0x0b, 0xf2, 0x0e, 0x4c, 0x06, + 0x76, 0xdb, 0xb5, 0xdd, 0xb6, 0x5c, 0x9e, 0x32, 0x06, 0x2e, 0x85, 0x6a, 0xe8, 0xed, 0x31, 0xc9, + 0x2e, 0xb7, 0x33, 0x08, 0x8f, 0xe7, 0xcb, 0x6e, 0xef, 0xf7, 0x57, 0x05, 0x7f, 0x31, 0xe7, 0x0b, + 0x45, 0x3e, 0xdc, 0x65, 0xc1, 0xff, 0x51, 0x84, 0x8b, 0xd9, 0x17, 0x96, 0x3c, 0xa6, 0x99, 0x62, + 0x5c, 0xf6, 0x32, 0x72, 0x68, 0xd9, 0x4b, 0xfc, 0x9e, 0x47, 0x73, 0xba, 0x80, 0x44, 0xbd, 0x80, + 0xa3, 0xbd, 0xa1, 0x9a, 0xc3, 0x16, 0x1e, 0x3a, 0x87, 0xbd, 0x0a, 0x25, 0x79, 0x9b, 0x60, 0x6a, + 0x6e, 0x38, 0x2f, 0xee, 0xfa, 0x93, 0x58, 0x2d, 0x5a, 0x97, 0x8e, 0x8c, 0xd6, 0x6c, 0xf6, 0xa1, + 0xbe, 0x9f, 0x39, 0x36, 0xf8, 0xec, 0x43, 0x7d, 0x3e, 0x33, 0x66, 0xc3, 0x0b, 0x1b, 0xbb, 0x76, + 0xfc, 0x6d, 0xb2, 0xb8, 0xb0, 0x71, 0x63, 0xe5, 0x36, 0xae, 0xa2, 0xc4, 0x26, 0x57, 0x66, 0x2a, + 0xb9, 0xac, 0xcc, 0x64, 0xdb, 0xdc, 0xa3, 0xca, 0x62, 0x2d, 0x98, 0xe9, 0xeb, 0xf3, 0x63, 0xe7, + 0xb1, 0x57, 0xa1, 0x14, 0xf4, 0xb6, 0x19, 0x5d, 0xaa, 0x26, 0xbe, 0xc1, 0xa1, 0x28, 0xb1, 0xb5, + 0xef, 0x15, 0x98, 0x94, 0xd4, 0xd5, 0x36, 0x8f, 0x69, 0x54, 0xbd, 0x0c, 0x93, 0x22, 0x93, 0x7c, + 0x43, 0x2b, 0x57, 0x2e, 0x6b, 0xeb, 0x7d, 0x3a, 0x12, 0x93, 0xb4, 0x64, 0x85, 0x9b, 0xc9, 0xc0, + 0xb9, 0x18, 0x48, 0x4b, 0x62, 0x81, 0x5b, 0x32, 0x20, 0x2f, 0xc0, 0x38, 0x7f, 0x08, 0xf1, 0xca, + 0xe5, 0x92, 0x0a, 0x2f, 0x4c, 0x5a, 0x8a, 0xc1, 0xa8, 0xd3, 0x24, 0x37, 0x8c, 0x8a, 0xb9, 0x6c, + 0x18, 0xf5, 0xf5, 0xca, 0xa3, 0xb2, 0xbb, 0xef, 0x94, 0x41, 0x7d, 0x1f, 0x82, 0x58, 0x7d, 0x5f, + 0xe9, 0xf8, 0xd4, 0xc0, 0x6b, 0xa9, 0x91, 0x2a, 0x62, 0xdd, 0x39, 0x23, 0x24, 0xbd, 0x06, 0x44, + 0x7e, 0x16, 0x42, 0xce, 0x7b, 0xd5, 0x97, 0xa4, 0x2b, 0xf1, 0xa2, 0x71, 0xa3, 0x8f, 0x02, 0x33, + 0x5a, 0x91, 0xd7, 0xf8, 0x37, 0x69, 0x42, 0xd3, 0x76, 0x95, 0xe7, 0x7d, 0xe6, 0x90, 0x9a, 0x16, + 0x41, 0xa4, 0xbe, 0x2e, 0x23, 0xfe, 0x62, 0xdc, 0x9c, 0x2c, 0xc1, 0xd8, 0xbe, 0xe7, 0xf4, 0x3a, + 0xea, 0x9b, 0x94, 0xb3, 0x59, 0x9c, 0x5e, 0xe7, 0x24, 0xda, 0x19, 0x6c, 0xd1, 0x04, 0xa3, 0xb6, + 0x84, 0xc2, 0x34, 0xdf, 0xb4, 0xb5, 0xc3, 0x03, 0x39, 0x00, 0x64, 0xe8, 0xbd, 0x9a, 0xc5, 0x6e, + 0xc3, 0x6b, 0x35, 0x92, 0xd4, 0xf2, 0xc3, 0xd5, 0x49, 0x20, 0xa6, 0x79, 0x92, 0x1b, 0x50, 0x36, + 0xb7, 0xb7, 0x6d, 0xd7, 0x0e, 0x0f, 0xe4, 0xee, 0xcf, 0x47, 0xb3, 0xf8, 0xd7, 0x25, 0x8d, 0xac, + 0x6b, 0x97, 0xff, 0x50, 0xb5, 0x25, 0xb7, 0x61, 0x3c, 0xf4, 0x1c, 0x39, 0x2f, 0x0d, 0x64, 0x7e, + 0x7f, 0x29, 0x8b, 0xd5, 0x96, 0x22, 0x8b, 0x77, 0x2b, 0x62, 0x58, 0x80, 0x3a, 0x1f, 0xf2, 0xfb, + 0x06, 0x4c, 0xb8, 0x5e, 0x8b, 0x46, 0x43, 0x4f, 0xae, 0x9e, 0xbf, 0x95, 0xd3, 0x77, 0x4d, 0xe6, + 0xd6, 0x35, 0xde, 0x62, 0x84, 0xa8, 0x7a, 0x67, 0x1d, 0x85, 0x09, 0x25, 0x88, 0x0b, 0xe7, 0xec, + 0x8e, 0xd9, 0xa6, 0x1b, 0x3d, 0x47, 0x1e, 0x3a, 0x09, 0x64, 0xf0, 0xc8, 0xac, 0x84, 0x5a, 0xf5, + 0x2c, 0xd3, 0x11, 0xdf, 0x05, 0x42, 0xba, 0x4d, 0x7d, 0xfe, 0x79, 0x22, 0xf5, 0x5d, 0xb5, 0x95, + 0x14, 0x27, 0xec, 0xe3, 0x4d, 0x96, 0x61, 0xa6, 0xeb, 0xdb, 0x1e, 0xef, 0x37, 0xc7, 0x0c, 0xc4, + 0x77, 0x61, 0x20, 0x59, 0xfe, 0xb2, 0x91, 0x26, 0xc0, 0xfe, 0x36, 0xa2, 0x1c, 0x53, 0x00, 0x79, + 0xba, 0x55, 0x8c, 0xca, 0x31, 0x05, 0x0c, 0x15, 0x76, 0xf6, 0x73, 0x30, 0xd3, 0xf7, 0x6e, 0x06, + 0x72, 0x08, 0x7f, 0x64, 0x40, 0xba, 0x7e, 0x90, 0xe5, 0x0d, 0x2d, 0xdb, 0xe7, 0x0c, 0x0f, 0xd2, + 0x0b, 0xf5, 0x8b, 0x11, 0x02, 0x63, 0x1a, 0x72, 0x05, 0x0a, 0x5d, 0x33, 0xdc, 0x49, 0x1f, 0xde, + 0x60, 0x2c, 0x91, 0x63, 0xf8, 0x77, 0x28, 0xd9, 0x3f, 0xda, 0xa6, 0x77, 0xbb, 0x32, 0x0d, 0x8a, + 0xbf, 0x43, 0xa9, 0x30, 0xa8, 0x51, 0xd5, 0x7e, 0x50, 0x84, 0xa9, 0x64, 0x6c, 0x49, 0xe4, 0x83, + 0xc6, 0xc3, 0xf2, 0x41, 0x16, 0x27, 0x3b, 0x34, 0xdc, 0xf1, 0x5a, 0xe9, 0x38, 0xb9, 0xc6, 0xa1, + 0x28, 0xb1, 0x5c, 0x7d, 0xcf, 0x0f, 0xa5, 0x5a, 0xb1, 0xfa, 0x9e, 0x1f, 0x22, 0xc7, 0x44, 0x67, + 0x4f, 0x0a, 0x87, 0x9c, 0x3d, 0x69, 0xc3, 0x39, 0x71, 0xad, 0xd6, 0x02, 0xf5, 0xc3, 0x13, 0x9f, + 0x99, 0x6a, 0xa4, 0x58, 0x60, 0x1f, 0x53, 0xfe, 0x95, 0x7c, 0x0e, 0xe3, 0x8d, 0x4f, 0x58, 0x0e, + 0xd9, 0x48, 0x72, 0xc0, 0x34, 0xcb, 0x61, 0x2c, 0x01, 0x26, 0xfb, 0xf1, 0xc4, 0x77, 0xdd, 0x94, + 0x73, 0xba, 0xeb, 0xe6, 0x54, 0x41, 0x74, 0x7e, 0xee, 0x27, 0xbf, 0xba, 0xf4, 0xc4, 0x4f, 0x7f, + 0x75, 0xe9, 0x89, 0x9f, 0xfd, 0xea, 0xd2, 0x13, 0x5f, 0x7b, 0x70, 0xc9, 0xf8, 0xc9, 0x83, 0x4b, + 0xc6, 0x4f, 0x1f, 0x5c, 0x32, 0x7e, 0xf6, 0xe0, 0x92, 0xf1, 0xcb, 0x07, 0x97, 0x8c, 0xef, 0xfd, + 0xf3, 0xa5, 0x27, 0x3e, 0x5f, 0x8e, 0x1e, 0xfe, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x33, 0x83, + 0x01, 0xe7, 0x72, 0x8c, 0x00, 0x00, } func (m *AMQPConsumeConfig) Marshal() (dAtA []byte, err error) { @@ -3313,6 +3352,37 @@ func (m *EventSourceSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.RedisStream) > 0 { + keysForRedisStream := make([]string, 0, len(m.RedisStream)) + for k := range m.RedisStream { + keysForRedisStream = append(keysForRedisStream, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForRedisStream) + for iNdEx := len(keysForRedisStream) - 1; iNdEx >= 0; iNdEx-- { + v := m.RedisStream[string(keysForRedisStream[iNdEx])] + baseI := i + { + size, err := (&v).MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + i -= len(keysForRedisStream[iNdEx]) + copy(dAtA[i:], keysForRedisStream[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForRedisStream[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xfa + } + } if len(m.Bitbucket) > 0 { keysForBitbucket := make([]string, 0, len(m.Bitbucket)) for k := range m.Bitbucket { @@ -5841,6 +5911,114 @@ func (m *RedisEventSource) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *RedisStreamEventSource) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RedisStreamEventSource) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RedisStreamEventSource) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Filter != nil { + { + size, err := m.Filter.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x4a + } + if len(m.Metadata) > 0 { + keysForMetadata := make([]string, 0, len(m.Metadata)) + for k := range m.Metadata { + keysForMetadata = append(keysForMetadata, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForMetadata) + for iNdEx := len(keysForMetadata) - 1; iNdEx >= 0; iNdEx-- { + v := m.Metadata[string(keysForMetadata[iNdEx])] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintGenerated(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(keysForMetadata[iNdEx]) + copy(dAtA[i:], keysForMetadata[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForMetadata[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x42 + } + } + if m.TLS != nil { + { + size, err := m.TLS.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } + i -= len(m.ConsumerGroup) + copy(dAtA[i:], m.ConsumerGroup) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ConsumerGroup))) + i-- + dAtA[i] = 0x32 + i = encodeVarintGenerated(dAtA, i, uint64(m.MaxMsgCountPerRead)) + i-- + dAtA[i] = 0x28 + if len(m.Streams) > 0 { + for iNdEx := len(m.Streams) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Streams[iNdEx]) + copy(dAtA[i:], m.Streams[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Streams[iNdEx]))) + i-- + dAtA[i] = 0x22 + } + } + i = encodeVarintGenerated(dAtA, i, uint64(m.DB)) + i-- + dAtA[i] = 0x18 + if m.Password != nil { + { + size, err := m.Password.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + i -= len(m.HostAddress) + copy(dAtA[i:], m.HostAddress) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.HostAddress))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *ResourceEventSource) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -7664,6 +7842,15 @@ func (m *EventSourceSpec) Size() (n int) { n += mapEntrySize + 2 + sovGenerated(uint64(mapEntrySize)) } } + if len(m.RedisStream) > 0 { + for k, v := range m.RedisStream { + _ = k + _ = v + l = v.Size() + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + l + sovGenerated(uint64(l)) + n += mapEntrySize + 2 + sovGenerated(uint64(mapEntrySize)) + } + } return n } @@ -8261,6 +8448,47 @@ func (m *RedisEventSource) Size() (n int) { return n } +func (m *RedisStreamEventSource) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.HostAddress) + n += 1 + l + sovGenerated(uint64(l)) + if m.Password != nil { + l = m.Password.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + n += 1 + sovGenerated(uint64(m.DB)) + if len(m.Streams) > 0 { + for _, s := range m.Streams { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } + n += 1 + sovGenerated(uint64(m.MaxMsgCountPerRead)) + l = len(m.ConsumerGroup) + n += 1 + l + sovGenerated(uint64(l)) + if m.TLS != nil { + l = m.TLS.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if len(m.Metadata) > 0 { + for k, v := range m.Metadata { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } + if m.Filter != nil { + l = m.Filter.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + func (m *ResourceEventSource) Size() (n int) { if m == nil { return 0 @@ -9266,6 +9494,16 @@ func (this *EventSourceSpec) String() string { mapStringForBitbucket += fmt.Sprintf("%v: %v,", k, this.Bitbucket[k]) } mapStringForBitbucket += "}" + keysForRedisStream := make([]string, 0, len(this.RedisStream)) + for k := range this.RedisStream { + keysForRedisStream = append(keysForRedisStream, k) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForRedisStream) + mapStringForRedisStream := "map[string]RedisStreamEventSource{" + for _, k := range keysForRedisStream { + mapStringForRedisStream += fmt.Sprintf("%v: %v,", k, this.RedisStream[k]) + } + mapStringForRedisStream += "}" s := strings.Join([]string{`&EventSourceSpec{`, `EventBusName:` + fmt.Sprintf("%v", this.EventBusName) + `,`, `Template:` + strings.Replace(this.Template.String(), "Template", "Template", 1) + `,`, @@ -9297,6 +9535,7 @@ func (this *EventSourceSpec) String() string { `Replicas:` + valueToStringGenerated(this.Replicas) + `,`, `BitbucketServer:` + mapStringForBitbucketServer + `,`, `Bitbucket:` + mapStringForBitbucket + `,`, + `RedisStream:` + mapStringForRedisStream + `,`, `}`, }, "") return s @@ -9711,6 +9950,34 @@ func (this *RedisEventSource) String() string { }, "") return s } +func (this *RedisStreamEventSource) String() string { + if this == nil { + return "nil" + } + keysForMetadata := make([]string, 0, len(this.Metadata)) + for k := range this.Metadata { + keysForMetadata = append(keysForMetadata, k) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForMetadata) + mapStringForMetadata := "map[string]string{" + for _, k := range keysForMetadata { + mapStringForMetadata += fmt.Sprintf("%v: %v,", k, this.Metadata[k]) + } + mapStringForMetadata += "}" + s := strings.Join([]string{`&RedisStreamEventSource{`, + `HostAddress:` + fmt.Sprintf("%v", this.HostAddress) + `,`, + `Password:` + strings.Replace(fmt.Sprintf("%v", this.Password), "SecretKeySelector", "v1.SecretKeySelector", 1) + `,`, + `DB:` + fmt.Sprintf("%v", this.DB) + `,`, + `Streams:` + fmt.Sprintf("%v", this.Streams) + `,`, + `MaxMsgCountPerRead:` + fmt.Sprintf("%v", this.MaxMsgCountPerRead) + `,`, + `ConsumerGroup:` + fmt.Sprintf("%v", this.ConsumerGroup) + `,`, + `TLS:` + strings.Replace(fmt.Sprintf("%v", this.TLS), "TLSConfig", "common.TLSConfig", 1) + `,`, + `Metadata:` + mapStringForMetadata + `,`, + `Filter:` + strings.Replace(this.Filter.String(), "EventSourceFilter", "EventSourceFilter", 1) + `,`, + `}`, + }, "") + return s +} func (this *ResourceEventSource) String() string { if this == nil { return "nil" @@ -17904,20 +18171,149 @@ func (m *EventSourceSpec) Unmarshal(dAtA []byte) error { } m.Bitbucket[mapkey] = *mapvalue iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err + case 31: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RedisStream", wireType) } - if (skippy < 0) || (iNdEx+skippy) < 0 { + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { return ErrInvalidLengthGenerated } - if (iNdEx + skippy) > l { + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { return io.ErrUnexpectedEOF } - iNdEx += skippy - } + if m.RedisStream == nil { + m.RedisStream = make(map[string]RedisStreamEventSource) + } + var mapkey string + mapvalue := &RedisStreamEventSource{} + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLengthGenerated + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &RedisStreamEventSource{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.RedisStream[mapkey] = *mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } } if iNdEx > l { @@ -24047,6 +24443,425 @@ func (m *RedisEventSource) Unmarshal(dAtA []byte) error { } return nil } +func (m *RedisStreamEventSource) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RedisStreamEventSource: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RedisStreamEventSource: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field HostAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.HostAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Password", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Password == nil { + m.Password = &v1.SecretKeySelector{} + } + if err := m.Password.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DB", wireType) + } + m.DB = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.DB |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Streams", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Streams = append(m.Streams, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxMsgCountPerRead", wireType) + } + m.MaxMsgCountPerRead = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MaxMsgCountPerRead |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConsumerGroup", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ConsumerGroup = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TLS", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TLS == nil { + m.TLS = &common.TLSConfig{} + } + if err := m.TLS.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Metadata == nil { + m.Metadata = make(map[string]string) + } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Metadata[mapkey] = mapvalue + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Filter", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Filter == nil { + m.Filter = &EventSourceFilter{} + } + if err := m.Filter.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *ResourceEventSource) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/pkg/apis/eventsource/v1alpha1/generated.proto b/pkg/apis/eventsource/v1alpha1/generated.proto index 24e56f0aeb..2d89632f7f 100644 --- a/pkg/apis/eventsource/v1alpha1/generated.proto +++ b/pkg/apis/eventsource/v1alpha1/generated.proto @@ -528,6 +528,9 @@ message EventSourceSpec { // Bitbucket event sources map bitbucket = 30; + + // Redis stream source + map redisStream = 31; } // EventSourceStatus holds the status of the event-source resource @@ -1088,6 +1091,47 @@ message RedisEventSource { optional EventSourceFilter filter = 8; } +// RedisStreamEventSource describes an event source for +// Redis streams (https://redis.io/topics/streams-intro) +message RedisStreamEventSource { + // HostAddress refers to the address of the Redis host/server (master instance) + optional string hostAddress = 1; + + // Password required for authentication if any. + // +optional + optional k8s.io.api.core.v1.SecretKeySelector password = 2; + + // DB to use. If not specified, default DB 0 will be used. + // +optional + optional int32 db = 3; + + // Streams to look for entries. XREADGROUP is used on all streams using a single consumer group. + repeated string streams = 4; + + // MaxMsgCountPerRead holds the maximum number of messages per stream that will be read in each XREADGROUP of all streams + // Example: if there are 2 streams and MaxMsgCountPerRead=10, then each XREADGROUP may read upto a total of 20 messages. + // Same as COUNT option in XREADGROUP(https://redis.io/topics/streams-intro). Defaults to 10 + // +optional + optional int32 maxMsgCountPerRead = 5; + + // ConsumerGroup refers to the Redis stream consumer group that will be + // created on all redis streams. Messages are read through this group. Defaults to 'argo-events-cg' + // +optional + optional string consumerGroup = 6; + + // TLS configuration for the redis client. + // +optional + optional github.com.argoproj.argo_events.pkg.apis.common.TLSConfig tls = 7; + + // Metadata holds the user defined metadata which will passed along the event payload. + // +optional + map metadata = 8; + + // Filter + // +optional + optional EventSourceFilter filter = 9; +} + // ResourceEventSource refers to a event-source for K8s resource related events. message ResourceEventSource { // Namespace where resource is deployed diff --git a/pkg/apis/eventsource/v1alpha1/openapi_generated.go b/pkg/apis/eventsource/v1alpha1/openapi_generated.go index 4c699c11db..7789e85acf 100644 --- a/pkg/apis/eventsource/v1alpha1/openapi_generated.go +++ b/pkg/apis/eventsource/v1alpha1/openapi_generated.go @@ -67,6 +67,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.PubSubEventSource": schema_pkg_apis_eventsource_v1alpha1_PubSubEventSource(ref), "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.PulsarEventSource": schema_pkg_apis_eventsource_v1alpha1_PulsarEventSource(ref), "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.RedisEventSource": schema_pkg_apis_eventsource_v1alpha1_RedisEventSource(ref), + "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.RedisStreamEventSource": schema_pkg_apis_eventsource_v1alpha1_RedisStreamEventSource(ref), "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.ResourceEventSource": schema_pkg_apis_eventsource_v1alpha1_ResourceEventSource(ref), "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.ResourceFilter": schema_pkg_apis_eventsource_v1alpha1_ResourceFilter(ref), "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.SNSEventSource": schema_pkg_apis_eventsource_v1alpha1_SNSEventSource(ref), @@ -1521,11 +1522,26 @@ func schema_pkg_apis_eventsource_v1alpha1_EventSourceSpec(ref common.ReferenceCa }, }, }, + "redisStream": { + SchemaProps: spec.SchemaProps{ + Description: "Redis stream source", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.RedisStreamEventSource"), + }, + }, + }, + }, + }, }, }, }, Dependencies: []string{ - "github.com/argoproj/argo-events/pkg/apis/common.S3Artifact", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.AMQPEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.AzureEventsHubEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.BitbucketEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.BitbucketServerEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.CalendarEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.EmitterEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.FileEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.GenericEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.GithubEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.GitlabEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.HDFSEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.KafkaEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.MQTTEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.NATSEventsSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.NSQEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.PubSubEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.PulsarEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.RedisEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.ResourceEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.SNSEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.SQSEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.Service", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.SlackEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.StorageGridEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.StripeEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.Template", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.WebhookContext"}, + "github.com/argoproj/argo-events/pkg/apis/common.S3Artifact", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.AMQPEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.AzureEventsHubEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.BitbucketEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.BitbucketServerEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.CalendarEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.EmitterEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.FileEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.GenericEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.GithubEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.GitlabEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.HDFSEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.KafkaEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.MQTTEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.NATSEventsSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.NSQEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.PubSubEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.PulsarEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.RedisEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.RedisStreamEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.ResourceEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.SNSEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.SQSEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.Service", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.SlackEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.StorageGridEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.StripeEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.Template", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.WebhookContext"}, } } @@ -2903,6 +2919,100 @@ func schema_pkg_apis_eventsource_v1alpha1_RedisEventSource(ref common.ReferenceC } } +func schema_pkg_apis_eventsource_v1alpha1_RedisStreamEventSource(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "RedisStreamEventSource describes an event source for Redis streams (https://redis.io/topics/streams-intro)", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "hostAddress": { + SchemaProps: spec.SchemaProps{ + Description: "HostAddress refers to the address of the Redis host/server (master instance)", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "password": { + SchemaProps: spec.SchemaProps{ + Description: "Password required for authentication if any.", + Ref: ref("k8s.io/api/core/v1.SecretKeySelector"), + }, + }, + "db": { + SchemaProps: spec.SchemaProps{ + Description: "DB to use. If not specified, default DB 0 will be used.", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "streams": { + SchemaProps: spec.SchemaProps{ + Description: "Streams to look for entries. XREADGROUP is used on all streams using a single consumer group.", + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + "maxMsgCountPerRead": { + SchemaProps: spec.SchemaProps{ + Description: "MaxMsgCountPerRead holds the maximum number of messages per stream that will be read in each XREADGROUP of all streams Example: if there are 2 streams and MaxMsgCountPerRead=10, then each XREADGROUP may read upto a total of 20 messages. Same as COUNT option in XREADGROUP(https://redis.io/topics/streams-intro). Defaults to 10", + Type: []string{"integer"}, + Format: "int32", + }, + }, + "consumerGroup": { + SchemaProps: spec.SchemaProps{ + Description: "ConsumerGroup refers to the Redis stream consumer group that will be created on all redis streams. Messages are read through this group. Defaults to 'argo-events-cg'", + Type: []string{"string"}, + Format: "", + }, + }, + "tls": { + SchemaProps: spec.SchemaProps{ + Description: "TLS configuration for the redis client.", + Ref: ref("github.com/argoproj/argo-events/pkg/apis/common.TLSConfig"), + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Description: "Metadata holds the user defined metadata which will passed along the event payload.", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + "filter": { + SchemaProps: spec.SchemaProps{ + Description: "Filter", + Ref: ref("github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.EventSourceFilter"), + }, + }, + }, + Required: []string{"hostAddress", "streams"}, + }, + }, + Dependencies: []string{ + "github.com/argoproj/argo-events/pkg/apis/common.TLSConfig", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.EventSourceFilter", "k8s.io/api/core/v1.SecretKeySelector"}, + } +} + func schema_pkg_apis_eventsource_v1alpha1_ResourceEventSource(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ diff --git a/pkg/apis/eventsource/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/eventsource/v1alpha1/zz_generated.deepcopy.go index 941a6609d0..183f204321 100644 --- a/pkg/apis/eventsource/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/eventsource/v1alpha1/zz_generated.deepcopy.go @@ -782,6 +782,13 @@ func (in *EventSourceSpec) DeepCopyInto(out *EventSourceSpec) { (*out)[key] = *val.DeepCopy() } } + if in.RedisStream != nil { + in, out := &in.RedisStream, &out.RedisStream + *out = make(map[string]RedisStreamEventSource, len(*in)) + for key, val := range *in { + (*out)[key] = *val.DeepCopy() + } + } return } @@ -1431,6 +1438,49 @@ func (in *RedisEventSource) DeepCopy() *RedisEventSource { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RedisStreamEventSource) DeepCopyInto(out *RedisStreamEventSource) { + *out = *in + if in.Password != nil { + in, out := &in.Password, &out.Password + *out = new(v1.SecretKeySelector) + (*in).DeepCopyInto(*out) + } + if in.Streams != nil { + in, out := &in.Streams, &out.Streams + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.TLS != nil { + in, out := &in.TLS, &out.TLS + *out = new(common.TLSConfig) + (*in).DeepCopyInto(*out) + } + if in.Metadata != nil { + in, out := &in.Metadata, &out.Metadata + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + if in.Filter != nil { + in, out := &in.Filter, &out.Filter + *out = new(EventSourceFilter) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RedisStreamEventSource. +func (in *RedisStreamEventSource) DeepCopy() *RedisStreamEventSource { + if in == nil { + return nil + } + out := new(RedisStreamEventSource) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ResourceEventSource) DeepCopyInto(out *ResourceEventSource) { *out = *in From aefa5ed69ea3aa4f35e513b86f6a85f3d073808d Mon Sep 17 00:00:00 2001 From: Sreekanth Date: Thu, 17 Mar 2022 13:23:59 +0530 Subject: [PATCH 3/6] code generation with pandoc 2.17.1 Signed-off-by: Sreekanth --- api/sensor.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/api/sensor.md b/api/sensor.md index 7ead623f0e..ed3eb10124 100644 --- a/api/sensor.md +++ b/api/sensor.md @@ -728,9 +728,9 @@ strconv.ParseFloat() Strings are taken as is Nils this value is ignored

-Comparator compares the event data with a user given value. Can be “>=”, -“>”, “=”, “!=”, “\<”, or “\<=”. Is optional, and if left blank treated -as equality “=”. +Comparator compares the event data with a user given value. Can be +“\>=”, “\>”, “=”, “!=”, “\<”, or “\<=”. Is optional, and if left blank +treated as equality “=”.

From 56deca83c8935336d997db71f84bfd001832ed29 Mon Sep 17 00:00:00 2001 From: Sreekanth Date: Tue, 22 Mar 2022 08:53:30 +0530 Subject: [PATCH 4/6] Batch acknowledge consumed stream messages Signed-off-by: Sreekanth --- eventsources/sources/redisStream/start.go | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/eventsources/sources/redisStream/start.go b/eventsources/sources/redisStream/start.go index ddc809bf15..7886d92405 100644 --- a/eventsources/sources/redisStream/start.go +++ b/eventsources/sources/redisStream/start.go @@ -111,7 +111,7 @@ func (el *EventListener) StartListening(ctx context.Context, dispatch func([]byt if err.Error() != "BUSYGROUP Consumer Group name already exists" { return errors.Wrapf(err, "creating consumer group %s for stream %s on host %s for event source %s", consumersGroup, stream, redisEventSource.HostAddress, el.GetEventName()) } - log.Infof("Consumer group %s already exists", stream) + log.Infof("Consumer group %q already exists in stream %q", consumersGroup, stream) } } @@ -135,6 +135,7 @@ func (el *EventListener) StartListening(ctx context.Context, dispatch func([]byt msgCount = 10 } + var msgsToAcknowledge []string for { select { case <-ctx.Done(): @@ -162,18 +163,23 @@ func (el *EventListener) StartListening(ctx context.Context, dispatch func([]byt // Completed consuming pending messages. Now start consuming new messages streamToLastEntryMapping[entry.Stream] = ">" } + + msgsToAcknowledge = msgsToAcknowledge[:0] + for _, message := range entry.Messages { if err := el.handleOne(entry.Stream, message, dispatch, log); err != nil { log.With("stream", entry.Stream, "message_id", message.ID).Errorw("failed to process Redis stream message", zap.Error(err)) el.Metrics.EventProcessingFailed(el.GetEventSourceName(), el.GetEventName()) continue } - if err := client.XAck(ctx, entry.Stream, consumersGroup, message.ID).Err(); err != nil { - log.With("stream", entry.Stream, "message_id", message.ID).Errorw("failed to acknowledge Redis stream message", zap.Error(err)) - } - if streamToLastEntryMapping[entry.Stream] != ">" { - streamToLastEntryMapping[entry.Stream] = message.ID - } + msgsToAcknowledge = append(msgsToAcknowledge, message.ID) + } + // Even if acknowledging fails, since we handled the message, we are good to proceed. + if err := client.XAck(ctx, entry.Stream, consumersGroup, msgsToAcknowledge...).Err(); err != nil { + log.With("stream", entry.Stream, "message_ids", msgsToAcknowledge).Errorw("failed to acknowledge messages from the Redis stream", zap.Error(err)) + } + if streamToLastEntryMapping[entry.Stream] != ">" { + streamToLastEntryMapping[entry.Stream] = msgsToAcknowledge[len(msgsToAcknowledge)-1] } } updateReadGroupArgs() From 3fa39ecbffcb891e1859969693112f27487ce31a Mon Sep 17 00:00:00 2001 From: Sreekanth Date: Tue, 22 Mar 2022 09:15:53 +0530 Subject: [PATCH 5/6] Bug fix Signed-off-by: Sreekanth --- eventsources/sources/redisStream/start.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/eventsources/sources/redisStream/start.go b/eventsources/sources/redisStream/start.go index 7886d92405..10344f80fd 100644 --- a/eventsources/sources/redisStream/start.go +++ b/eventsources/sources/redisStream/start.go @@ -174,6 +174,11 @@ func (el *EventListener) StartListening(ctx context.Context, dispatch func([]byt } msgsToAcknowledge = append(msgsToAcknowledge, message.ID) } + + if len(msgsToAcknowledge) == 0 { + continue + } + // Even if acknowledging fails, since we handled the message, we are good to proceed. if err := client.XAck(ctx, entry.Stream, consumersGroup, msgsToAcknowledge...).Err(); err != nil { log.With("stream", entry.Stream, "message_ids", msgsToAcknowledge).Errorw("failed to acknowledge messages from the Redis stream", zap.Error(err)) From 1e1363c7d28f422ba4e5b7dbdc63ceac32befaea Mon Sep 17 00:00:00 2001 From: Sreekanth Date: Wed, 23 Mar 2022 08:53:14 +0530 Subject: [PATCH 6/6] retry on XREADGROUP failure Signed-off-by: Sreekanth --- eventsources/sources/redisStream/start.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/eventsources/sources/redisStream/start.go b/eventsources/sources/redisStream/start.go index 10344f80fd..1f47608359 100644 --- a/eventsources/sources/redisStream/start.go +++ b/eventsources/sources/redisStream/start.go @@ -19,7 +19,6 @@ package redisstream import ( "context" "encoding/json" - "strings" "time" "github.com/go-redis/redis/v8" @@ -155,7 +154,7 @@ func (el *EventListener) StartListening(ctx context.Context, dispatch func([]byt if err == redis.Nil { continue } - return errors.Wrapf(err, "reading streams %s using XREADGROUP", strings.Join(redisEventSource.Streams, ", ")) + log.With("streams", redisEventSource.Streams).Errorw("reading streams using XREADGROUP", zap.Error(err)) } for _, entry := range entries {