From c24ba688ba512d1d8a5cfc17d9121178dce5efb2 Mon Sep 17 00:00:00 2001 From: Joe Kralicky Date: Mon, 13 Nov 2023 18:48:25 -0500 Subject: [PATCH] Initial gateway config manager implementation and tests --- pkg/config/adapt/conversion.go | 152 + pkg/config/reactive/bind.go | 82 + pkg/config/reactive/bind_test.go | 141 + pkg/config/reactive/controller.go | 249 ++ pkg/config/reactive/controller_test.go | 228 ++ pkg/config/reactive/export_test.go | 36 + pkg/config/reactive/reactive.go | 29 + pkg/config/reactive/reactive_suite_test.go | 14 + .../reactive/reactivetest/controller.go | 96 + pkg/config/reactive/subtle/wait.go | 39 + pkg/config/reactive/typed.go | 87 + pkg/config/reactive/typed_test.go | 114 + pkg/config/reactive/value.go | 108 + pkg/config/v1/configv1_suite_test.go | 2 +- pkg/config/v1/deepcopy.go | 2 +- pkg/config/v1/extensions.go | 9 +- pkg/config/v1/gateway_config.pb.go | 2517 ++++++++++------- pkg/config/v1/gateway_config.proto | 138 +- pkg/config/v1/gateway_config_cli.pb.go | 46 +- pkg/config/v1/gateway_config_grpc.pb.go | 69 +- pkg/config/v1/gateway_config_paths.pb.go | 41 +- pkg/config/v1/manager.go | 108 +- pkg/config/v1/manager_test.go | 169 ++ pkg/config/v1/validation_test.go | 171 +- pkg/plugins/driverutil/config.go | 4 + 25 files changed, 3568 insertions(+), 1083 deletions(-) create mode 100644 pkg/config/adapt/conversion.go create mode 100644 pkg/config/reactive/bind.go create mode 100644 pkg/config/reactive/bind_test.go create mode 100644 pkg/config/reactive/controller.go create mode 100644 pkg/config/reactive/controller_test.go create mode 100644 pkg/config/reactive/export_test.go create mode 100644 pkg/config/reactive/reactive.go create mode 100644 pkg/config/reactive/reactive_suite_test.go create mode 100644 pkg/config/reactive/reactivetest/controller.go create mode 100644 pkg/config/reactive/subtle/wait.go create mode 100644 pkg/config/reactive/typed.go create mode 100644 pkg/config/reactive/typed_test.go create mode 100644 pkg/config/reactive/value.go create mode 100644 pkg/config/v1/manager_test.go diff --git a/pkg/config/adapt/conversion.go b/pkg/config/adapt/conversion.go new file mode 100644 index 0000000000..6fc833f802 --- /dev/null +++ b/pkg/config/adapt/conversion.go @@ -0,0 +1,152 @@ +package adapt + +import ( + configv1 "github.com/rancher/opni/pkg/config/v1" + "github.com/rancher/opni/pkg/config/v1beta1" + "github.com/samber/lo" +) + +func V1GatewayConfigOf[T *v1beta1.GatewayConfig | *configv1.GatewayConfigSpec](in T) *configv1.GatewayConfigSpec { + switch in := any(in).(type) { + case *configv1.GatewayConfigSpec: + return in + case *v1beta1.GatewayConfig: + return &configv1.GatewayConfigSpec{ + Server: &configv1.ServerSpec{ + HttpListenAddress: &in.Spec.HTTPListenAddress, + GrpcListenAddress: &in.Spec.GRPCListenAddress, + }, + Management: &configv1.ManagementServerSpec{ + HttpListenAddress: lo.ToPtr(in.Spec.Management.GetHTTPListenAddress()), + GrpcListenAddress: lo.ToPtr(in.Spec.Management.GetGRPCListenAddress()), + }, + Relay: &configv1.RelayServerSpec{ + GrpcListenAddress: &in.Spec.Management.RelayListenAddress, + AdvertiseAddress: &in.Spec.Management.RelayAdvertiseAddress, + }, + Health: &configv1.HealthServerSpec{ + HttpListenAddress: &in.Spec.HTTPListenAddress, + }, + Dashboard: &configv1.DashboardServerSpec{ + HttpListenAddress: &in.Spec.Management.WebListenAddress, + Hostname: &in.Spec.Hostname, + AdvertiseAddress: &in.Spec.Management.WebAdvertiseAddress, + TrustedProxies: in.Spec.TrustedProxies, + }, + Storage: &configv1.StorageSpec{ + Backend: func() *configv1.StorageBackend { + switch in.Spec.Storage.Type { + case v1beta1.StorageTypeEtcd: + fallthrough + default: + return configv1.StorageBackend_Etcd.Enum() + case v1beta1.StorageTypeJetStream: + return configv1.StorageBackend_JetStream.Enum() + } + }(), + Etcd: func() *configv1.EtcdSpec { + if in.Spec.Storage.Etcd == nil { + return nil + } + return &configv1.EtcdSpec{ + Endpoints: in.Spec.Storage.Etcd.Endpoints, + Certs: func() *configv1.MTLSSpec { + if in.Spec.Storage.Etcd.Certs == nil { + return nil + } + return &configv1.MTLSSpec{ + ServerCA: &in.Spec.Storage.Etcd.Certs.ServerCA, + ClientCA: &in.Spec.Storage.Etcd.Certs.ClientCA, + ClientCert: &in.Spec.Storage.Etcd.Certs.ClientCert, + ClientKey: &in.Spec.Storage.Etcd.Certs.ClientKey, + } + }(), + } + }(), + JetStream: func() *configv1.JetStreamSpec { + if in.Spec.Storage.JetStream == nil { + return nil + } + return &configv1.JetStreamSpec{ + Endpoint: &in.Spec.Storage.JetStream.Endpoint, + NkeySeedPath: &in.Spec.Storage.JetStream.NkeySeedPath, + } + }(), + }, + Certs: &configv1.CertsSpec{ + CaCert: in.Spec.Certs.CACert, + CaCertData: lo.Ternary(len(in.Spec.Certs.CACertData) > 0, lo.ToPtr(string(in.Spec.Certs.CACertData)), nil), + ServingCert: in.Spec.Certs.ServingCert, + ServingCertData: lo.Ternary(len(in.Spec.Certs.ServingCertData) > 0, lo.ToPtr(string(in.Spec.Certs.ServingCertData)), nil), + ServingKey: in.Spec.Certs.ServingKey, + ServingKeyData: lo.Ternary(len(in.Spec.Certs.ServingKeyData) > 0, lo.ToPtr(string(in.Spec.Certs.ServingKeyData)), nil), + }, + Plugins: &configv1.PluginsSpec{ + Dir: &in.Spec.Plugins.Dir, + Cache: &configv1.CacheSpec{ + Backend: configv1.CacheBackend_Filesystem.Enum(), + Filesystem: &configv1.FilesystemCacheSpec{ + Dir: &in.Spec.Plugins.Binary.Cache.Filesystem.Dir, + }, + }, + }, + Keyring: &configv1.KeyringSpec{ + RuntimeKeyDirs: in.Spec.Keyring.EphemeralKeyDirs, + }, + Upgrades: &configv1.UpgradesSpec{ + Agents: &configv1.AgentUpgradesSpec{ + Driver: func() *configv1.AgentUpgradesSpec_Driver { + switch in.Spec.AgentUpgrades.Kubernetes.ImageResolver { + case v1beta1.ImageResolverNoop: + fallthrough + default: + return configv1.AgentUpgradesSpec_Noop.Enum() + case v1beta1.ImageResolverKubernetes: + return configv1.AgentUpgradesSpec_Kubernetes.Enum() + } + }(), + Kubernetes: &configv1.KubernetesAgentUpgradeSpec{ + ImageResolver: func() *configv1.KubernetesAgentUpgradeSpec_ImageResolver { + switch in.Spec.AgentUpgrades.Kubernetes.ImageResolver { + case v1beta1.ImageResolverNoop: + fallthrough + default: + return configv1.KubernetesAgentUpgradeSpec_Noop.Enum() + case v1beta1.ImageResolverKubernetes: + return configv1.KubernetesAgentUpgradeSpec_Kubernetes.Enum() + } + }(), + }, + }, + Plugins: &configv1.PluginUpgradesSpec{ + Driver: configv1.PluginUpgradesSpec_Binary.Enum(), + Binary: &configv1.BinaryPluginUpgradeSpec{ + PatchEngine: func() *configv1.PatchEngine { + switch in.Spec.Plugins.Binary.Cache.PatchEngine { + case v1beta1.PatchEngineBsdiff: + return configv1.PatchEngine_Bsdiff.Enum() + case v1beta1.PatchEngineZstd: + fallthrough + default: + return configv1.PatchEngine_Zstd.Enum() + } + }(), + }, + }, + }, + RateLimiting: func() *configv1.RateLimitingSpec { + if in.Spec.RateLimit == nil { + return nil + } + return &configv1.RateLimitingSpec{ + Rate: &in.Spec.RateLimit.Rate, + Burst: func() *int32 { + burst := int32(in.Spec.RateLimit.Burst) + return &burst + }(), + } + }(), + } + } + panic("unreachable") +} diff --git a/pkg/config/reactive/bind.go b/pkg/config/reactive/bind.go new file mode 100644 index 0000000000..54b2f578f6 --- /dev/null +++ b/pkg/config/reactive/bind.go @@ -0,0 +1,82 @@ +package reactive + +import ( + "context" + "sync" + + gsync "github.com/kralicky/gpkg/sync" + + "google.golang.org/protobuf/reflect/protoreflect" +) + +// Bind groups multiple reactive.Value instances together, de-duplicating +// updates using the revision of the underlying config. +// +// The callback is invoked when one or more reactive.Values change, +// and is passed the current or updated value of each reactive value, in the +// order they were passed to Bind. Values that have never been set will be +// invalid (protoreflect.Value.IsValid() returns false). +// +// For partial updates, the values passed to the callback will be either the +// updated value or the current value, depending on whether the value was +// updated in the current revision. +// +// The callback is guaranteed to be invoked exactly once for a single change +// to the active config, even if multiple values in the group change at the +// same time. The values must all be created from the same controller, +// otherwise the behavior is undefined. +func Bind(ctx context.Context, callback func([]protoreflect.Value), reactiveValues ...Value) { + b := &binder{ + reactiveValues: reactiveValues, + callback: callback, + } + for i, rv := range reactiveValues { + i := i + rv.watchFuncWithRev(ctx, func(rev int64, v protoreflect.Value) { + b.onUpdate(i, rev, v) + }) + } +} + +type binder struct { + callback func([]protoreflect.Value) + reactiveValues []Value + queues gsync.Map[int64, *queuedUpdate] +} + +type queuedUpdate struct { + lazyInit sync.Once + values []protoreflect.Value + resolve sync.Once +} + +func (q *queuedUpdate) doLazyInit(size int) { + q.lazyInit.Do(func() { + q.values = make([]protoreflect.Value, size) + }) +} + +func (b *binder) onUpdate(i int, rev int64, v protoreflect.Value) { + q, _ := b.queues.LoadOrStore(rev, &queuedUpdate{}) + q.doLazyInit(len(b.reactiveValues)) + // this *must* happen synchronously, since the group channel is closed + // once all callbacks have returned. + q.values[i] = v + + go func() { + b.reactiveValues[i].wait() + q.resolve.Do(func() { + b.queues.Delete(rev) + b.doResolve(q) + }) + }() +} + +func (b *binder) doResolve(q *queuedUpdate) { + for i, v := range q.values { + if !v.IsValid() { + q.values[i] = b.reactiveValues[i].Value() + } + } + b.callback(q.values) +} diff --git a/pkg/config/reactive/bind_test.go b/pkg/config/reactive/bind_test.go new file mode 100644 index 0000000000..4948aeffac --- /dev/null +++ b/pkg/config/reactive/bind_test.go @@ -0,0 +1,141 @@ +package reactive_test + +import ( + "context" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "google.golang.org/protobuf/reflect/protoreflect" + + "github.com/rancher/opni/pkg/config/reactive" + "github.com/rancher/opni/pkg/plugins/driverutil" + "github.com/rancher/opni/pkg/storage" + "github.com/rancher/opni/pkg/storage/inmemory" + "github.com/rancher/opni/pkg/test/testdata/plugins/ext" + "github.com/rancher/opni/pkg/util" + "github.com/rancher/opni/pkg/util/flagutil" +) + +var _ = Describe("Bind", Label("unit"), func() { + var ctrl *reactive.Controller[*ext.SampleConfiguration] + var defaultStore, activeStore storage.ValueStoreT[*ext.SampleConfiguration] + + BeforeEach(func() { + defaultStore = inmemory.NewValueStore[*ext.SampleConfiguration](util.ProtoClone) + activeStore = inmemory.NewValueStore[*ext.SampleConfiguration](util.ProtoClone) + ctrl = reactive.NewController(driverutil.NewDefaultingConfigTracker(defaultStore, activeStore, flagutil.LoadDefaults)) + ctx, ca := context.WithCancel(context.Background()) + Expect(ctrl.Start(ctx)).To(Succeed()) + DeferCleanup(ca) + }) + + It("should bind reactive values", func(ctx SpecContext) { + called := make(chan struct{}) + reactive.Bind(ctx, + func(v []protoreflect.Value) { + defer close(called) + Expect(v).To(HaveLen(6)) + Expect(v[0].Int()).To(Equal(int64(100))) + Expect(v[1].Int()).To(Equal(int64(200))) + Expect(v[2].Int()).To(Equal(int64(300))) + Expect(v[3].Int()).To(Equal(int64(400))) + Expect(v[4].Int()).To(Equal(int64(500))) + Expect(v[5].Int()).To(Equal(int64(600))) + }, + ctrl.Reactive((&ext.SampleConfiguration{}).ProtoPath().MessageField().Field6().Field1()), + ctrl.Reactive((&ext.SampleConfiguration{}).ProtoPath().MessageField().Field6().Field2()), + ctrl.Reactive((&ext.SampleConfiguration{}).ProtoPath().MessageField().Field6().Field3()), + ctrl.Reactive((&ext.SampleConfiguration{}).ProtoPath().MessageField().Field6().Field4()), + ctrl.Reactive((&ext.SampleConfiguration{}).ProtoPath().MessageField().Field6().Field5()), + ctrl.Reactive((&ext.SampleConfiguration{}).ProtoPath().MessageField().Field6().Field6()), + ) + + Expect(activeStore.Put(ctx, &ext.SampleConfiguration{ + MessageField: &ext.SampleMessage{ + Field6: &ext.Sample6FieldMsg{ + Field1: 100, + Field2: 200, + Field3: 300, + Field4: 400, + Field5: 500, + Field6: 600, + }, + }, + })).To(Succeed()) + + Eventually(called).Should(BeClosed()) + // ensure no more updates are received + Consistently(called).Should(BeClosed()) + }) + + It("should handle partial updates", func(ctx SpecContext) { + callback := new(func(v []protoreflect.Value)) + reactive.Bind(ctx, + func(v []protoreflect.Value) { + (*callback)(v) + }, + ctrl.Reactive((&ext.SampleConfiguration{}).ProtoPath().MessageField().Field6().Field1()), + ctrl.Reactive((&ext.SampleConfiguration{}).ProtoPath().MessageField().Field6().Field2()), + ctrl.Reactive((&ext.SampleConfiguration{}).ProtoPath().MessageField().Field6().Field3()), + ctrl.Reactive((&ext.SampleConfiguration{}).ProtoPath().MessageField().Field6().Field4()), + ctrl.Reactive((&ext.SampleConfiguration{}).ProtoPath().MessageField().Field6().Field5()), + ctrl.Reactive((&ext.SampleConfiguration{}).ProtoPath().MessageField().Field6().Field6()), + ) + + called := make(chan struct{}) + *callback = func(v []protoreflect.Value) { + defer close(called) + Expect(v).To(HaveLen(6)) + Expect(v[0].Int()).To(Equal(int64(100))) + Expect(v[1].Int()).To(Equal(int64(200))) + Expect(v[2].Int()).To(Equal(int64(300))) + Expect(v[3].Int()).To(Equal(int64(400))) + Expect(v[4].Int()).To(Equal(int64(500))) + Expect(v[5].Int()).To(Equal(int64(600))) + } + + Expect(activeStore.Put(ctx, &ext.SampleConfiguration{ + MessageField: &ext.SampleMessage{ + Field6: &ext.Sample6FieldMsg{ + Field1: 100, + Field2: 200, + Field3: 300, + Field4: 400, + Field5: 500, + Field6: 600, + }, + }, + })).To(Succeed()) + + Eventually(called).Should(BeClosed()) + Consistently(called).Should(BeClosed()) + + called = make(chan struct{}) + *callback = func(v []protoreflect.Value) { + defer close(called) + Expect(v).To(HaveLen(6)) + Expect(v[0].Int()).To(Equal(int64(1000))) + Expect(v[1].Int()).To(Equal(int64(2000))) + Expect(v[2].Int()).To(Equal(int64(3000))) + Expect(v[3].Int()).To(Equal(int64(400))) + Expect(v[4].Int()).To(Equal(int64(500))) + Expect(v[5].Int()).To(Equal(int64(600))) + } + + Expect(activeStore.Put(ctx, &ext.SampleConfiguration{ + MessageField: &ext.SampleMessage{ + Field6: &ext.Sample6FieldMsg{ + Field1: 1000, + Field2: 2000, + Field3: 3000, + Field4: 400, + Field5: 500, + Field6: 600, + }, + }, + })).To(Succeed()) + + Eventually(called).Should(BeClosed()) + Consistently(called).Should(BeClosed()) + }) +}) diff --git a/pkg/config/reactive/controller.go b/pkg/config/reactive/controller.go new file mode 100644 index 0000000000..0cd73372c8 --- /dev/null +++ b/pkg/config/reactive/controller.go @@ -0,0 +1,249 @@ +package reactive + +import ( + "context" + "fmt" + "log/slog" + "strings" + "sync" + "sync/atomic" + + "github.com/nsf/jsondiff" + art "github.com/plar/go-adaptive-radix-tree" + + "github.com/rancher/opni/pkg/plugins/driverutil" + "github.com/rancher/opni/pkg/storage" + "github.com/rancher/opni/pkg/util/fieldmask" + "google.golang.org/protobuf/reflect/protopath" + "google.golang.org/protobuf/reflect/protoreflect" +) + +type DiffMode int + +const ( + DiffStat DiffMode = iota + DiffFull +) + +type ControllerOptions struct { + logger *slog.Logger + diffMode DiffMode +} + +type ControllerOption func(*ControllerOptions) + +func (o *ControllerOptions) apply(opts ...ControllerOption) { + for _, op := range opts { + op(o) + } +} + +func WithLogger(eventLogger *slog.Logger) ControllerOption { + return func(o *ControllerOptions) { + o.logger = eventLogger + } +} + +func WithDiffMode(mode DiffMode) ControllerOption { + return func(o *ControllerOptions) { + o.diffMode = mode + } +} + +type Controller[T driverutil.ConfigType[T]] struct { + ControllerOptions + tracker *driverutil.DefaultingConfigTracker[T] + + runOnce atomic.Bool + runContext context.Context + + reactiveMessagesMu sync.Mutex + reactiveMessages art.Tree + + currentRevMu sync.Mutex + currentRev int64 +} + +func NewController[T driverutil.ConfigType[T]](tracker *driverutil.DefaultingConfigTracker[T], opts ...ControllerOption) *Controller[T] { + options := ControllerOptions{} + options.apply(opts...) + + return &Controller[T]{ + ControllerOptions: options, + tracker: tracker, + reactiveMessages: art.New(), + } +} + +func (s *Controller[T]) Start(ctx context.Context) error { + if !s.runOnce.CompareAndSwap(false, true) { + panic("bug: Run called twice") + } + s.runContext = ctx + + var rev int64 + _, err := s.tracker.ActiveStore().Get(ctx, storage.WithRevisionOut(&rev)) + if err != nil { + if !storage.IsNotFound(err) { + return err + } + } + w, err := s.tracker.ActiveStore().Watch(ctx, storage.WithRevision(rev)) + if err != nil { + return err + } + if rev != 0 { + // The first event must be handled before this function returns, if + // there is an existing configuration. Otherwise, a logic race will occur + // between the goroutine below and calls to Reactive() after this + // function returns. New reactive values have late-join initialization + // logic; if the first event is not consumed, the late-join logic and + // the goroutine below (when it is scheduled) would cause duplicate + // updates to be sent to newly created reactive values. + firstEvent, ok := <-w + if !ok { + return fmt.Errorf("watch channel closed unexpectedly") + } + + // At this point there will most likely not be any reactive values, but + // this function sets s.currentRev and also logs the first event. + s.handleWatchEvent(firstEvent) + } + go func() { + for { + cfg, ok := <-w + if !ok { + return + } + s.handleWatchEvent(cfg) + } + }() + return nil +} + +func (s *Controller[T]) handleWatchEvent(cfg storage.WatchEvent[storage.KeyRevision[T]]) { + s.reactiveMessagesMu.Lock() + defer s.reactiveMessagesMu.Unlock() + + group := make(chan struct{}) + defer func() { + close(group) + }() + + switch cfg.EventType { + case storage.WatchEventDelete: + if s.logger != nil { + s.logger.With( + "key", cfg.Previous.Key(), + "prevRevision", cfg.Previous.Revision(), + ).Info("configuration deleted") + } + s.reactiveMessages.ForEach(func(node art.Node) (cont bool) { + rm := node.Value().(*reactiveValue) + rm.Update(cfg.Previous.Revision(), protoreflect.Value{}, group) + return true + }) + case storage.WatchEventPut: + s.currentRevMu.Lock() + s.currentRev = cfg.Current.Revision() + s.currentRevMu.Unlock() + + // efficiently compute a list of paths (or prefixes) that have changed + var prevValue T + if cfg.Previous != nil { + prevValue = cfg.Previous.Value() + } + diffMask := fieldmask.Diff(prevValue, cfg.Current.Value()) + + if s.logger != nil { + opts := jsondiff.DefaultConsoleOptions() + opts.SkipMatches = true + diff, _ := driverutil.RenderJsonDiff(prevValue, cfg.Current.Value(), opts) + stat := driverutil.DiffStat(diff, opts) + switch s.diffMode { + case DiffStat: + s.logger.Info("configuration updated", "revision", cfg.Current.Revision(), "diff", stat) + case DiffFull: + s.logger.Info("configuration updated", "revision", cfg.Current.Revision(), "diff", stat) + s.logger.Info("⤷ diff:\n" + diff) + } + } + + // parent message watchers are updated when any of their fields change, + // but only once + implicitParentUpdates := make(map[string]protoreflect.Value) + for _, path := range diffMask.Paths { + // search reactive messages by prefix path + s.reactiveMessages.ForEachPrefix(art.Key(path), func(node art.Node) bool { + if node.Kind() != art.Leaf { + return true + } + key := string(node.Key()) + parts := strings.Split(key, ".") + + // get the new value of the current message + value := protoreflect.ValueOf(cfg.Current.Value().ProtoReflect()) + for i, part := range parts { + value = value.Message().Get(value.Message().Descriptor().Fields().ByName(protoreflect.Name(part))) + if i < len(parts)-1 { + key := strings.Join(parts[:i+1], ".") + if _, exists := implicitParentUpdates[key]; !exists { + implicitParentUpdates[key] = value + } + } + } + // update the reactive messages + rm := node.Value().(*reactiveValue) + rm.Update(cfg.Current.Revision(), value, group) + return true + }) + } + for key, value := range implicitParentUpdates { + v, exists := s.reactiveMessages.Search(art.Key(key)) + if exists { + // update the parent reactive message + rm := v.(*reactiveValue) + rm.Update(cfg.Current.Revision(), value, group) + } + } + } +} + +func (s *Controller[T]) Reactive(path protopath.Path) Value { + if len(path) < 2 || path[0].Kind() != protopath.RootStep { + panic(fmt.Sprintf("invalid reactive message path: %s", path)) + } + s.currentRevMu.Lock() + currentConfig, _ := s.tracker.ActiveStore().Get(s.runContext, storage.WithRevision(s.currentRev)) + s.currentRevMu.Unlock() + + s.reactiveMessagesMu.Lock() + defer s.reactiveMessagesMu.Unlock() + + var currentValue protoreflect.Value + if currentConfig.ProtoReflect().IsValid() { + currentValue = protoreflect.ValueOfMessage(currentConfig.ProtoReflect()) + } + for _, step := range path { + switch step.Kind() { + case protopath.RootStep: + continue + case protopath.FieldAccessStep: + if currentConfig.ProtoReflect().IsValid() { + currentValue = currentValue.Message().Get(step.FieldDescriptor()) + } + default: + panic("bug: invalid reactive message path: " + path.String()) + } + } + + key := path[1:].String()[1:] + v, exists := s.reactiveMessages.Search(art.Key(key)) + if exists { + return v.(*reactiveValue) + } + rm := &reactiveValue{} + rm.Update(s.currentRev, currentValue, nil) + s.reactiveMessages.Insert(art.Key(key), rm) + return rm +} diff --git a/pkg/config/reactive/controller_test.go b/pkg/config/reactive/controller_test.go new file mode 100644 index 0000000000..bae74df608 --- /dev/null +++ b/pkg/config/reactive/controller_test.go @@ -0,0 +1,228 @@ +package reactive_test + +import ( + "context" + "errors" + "strings" + "time" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "github.com/samber/lo" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/types/known/fieldmaskpb" + + "github.com/rancher/opni/pkg/config/reactive" + "github.com/rancher/opni/pkg/plugins/driverutil" + "github.com/rancher/opni/pkg/storage/inmemory" + "github.com/rancher/opni/pkg/test/testdata/plugins/ext" + "github.com/rancher/opni/pkg/test/testutil" + "github.com/rancher/opni/pkg/util" + "github.com/rancher/opni/pkg/util/fieldmask" + "github.com/rancher/opni/pkg/util/flagutil" + "github.com/rancher/opni/pkg/util/pathreflect" + "github.com/rancher/opni/pkg/util/protorand" +) + +var _ = Describe("Reactive Controller", Label("unit"), func() { + var ctrl *reactive.Controller[*ext.SampleConfiguration] + defaultStore := inmemory.NewValueStore[*ext.SampleConfiguration](util.ProtoClone) + activeStore := inmemory.NewValueStore[*ext.SampleConfiguration](util.ProtoClone) + + BeforeEach(func() { + ctrl = reactive.NewController(driverutil.NewDefaultingConfigTracker(defaultStore, activeStore, flagutil.LoadDefaults)) + ctx, ca := context.WithCancel(context.Background()) + Expect(ctrl.Start(ctx)).To(Succeed()) + DeferCleanup(ca) + }) + + It("should create reactive messages", func(ctx SpecContext) { + msg := &ext.SampleConfiguration{} + rand := protorand.New[*ext.SampleConfiguration]() + rand.ExcludeMask(&fieldmaskpb.FieldMask{ + Paths: []string{ + "revision", + }, + }) + rand.Seed(GinkgoRandomSeed()) + + By("creating reactive messages for every possible path") + allPaths := pathreflect.AllPaths(msg) + reactiveMsgs := make([]reactive.Value, len(allPaths)) + + verifyWatches := func(spec *ext.SampleConfiguration, ws []<-chan protoreflect.Value, pathsToCheck ...map[string]struct{}) { + recvFailures := []error{} + ALL_PATHS: + for i := 0; i < len(allPaths); i++ { + path := allPaths[i] + rm := reactiveMsgs[i] + w := ws[i] + + if strings.HasPrefix(path.String(), "(ext.SampleConfiguration).revision") { + // ignore the revision field; a reactive message for it has undefined behavior + select { + case <-w: + default: + } + continue + } + + if len(pathsToCheck) > 0 { + if _, ok := pathsToCheck[0][path[1:].String()[1:]]; !ok { + Expect(w).NotTo(Receive(), "expected not to receive an update for path %s", path) + continue + } + } + + var v protoreflect.Value + RECV: + for i := 0; i < 10; i++ { + select { + case v = <-w: + break RECV + default: + time.Sleep(10 * time.Millisecond) + } + if i == 9 { + recvFailures = append(recvFailures, errors.New("did not receive an update for path "+path.String())) + continue ALL_PATHS + } + } + var actual protoreflect.Value + if spec == nil { + actual = protoreflect.ValueOf(nil) + } else { + actual = pathreflect.Value(spec, path) + } + Expect(v).To(testutil.ProtoValueEqual(rm.Value())) + Expect(v).To(testutil.ProtoValueEqual(actual)) + } + + Expect(errors.Join(recvFailures...)).To(BeNil()) + + for _, c := range ws { + Expect(c).To(HaveLen(0), "expected all watchers to be read") + } + } + + watches := make([]<-chan protoreflect.Value, len(allPaths)) + for i, path := range allPaths { + rm := ctrl.Reactive(path) + reactiveMsgs[i] = rm + + c := rm.Watch(ctx) + watches[i] = c + + Expect(len(c)).To(BeZero()) + } + + By("setting all fields in the spec to random values") + spec := rand.MustGen() + err := activeStore.Put(ctx, spec) + Expect(err).NotTo(HaveOccurred()) + + By("verifying that all reactive messages received an update") + verifyWatches(spec, watches) + + By("adding a second watch to each reactive message") + watches2 := make([]<-chan protoreflect.Value, len(watches)) + + for i, rm := range reactiveMsgs { + watches2[i] = rm.Watch(ctx) + } + ctrl.DebugDumpReactiveMessagesInfo(GinkgoWriter) + + By("verifying that new watches receive the current value") + verifyWatches(spec, watches2) + + By("modifying all fields in the spec") + spec2 := rand.MustGen() + err = activeStore.Put(ctx, spec2) + Expect(err).NotTo(HaveOccurred()) + + By("verifying that both watches received an update") + // some fields have a limited set of possible values + updatedFields := fieldmask.Diff(spec, spec2).Paths + pathsToCheck := map[string]struct{}{} + for _, path := range updatedFields { + parts := strings.Split(path, ".") + for i := range parts { + pathsToCheck[strings.Join(parts[:i+1], ".")] = struct{}{} + } + } + verifyWatches(spec2, watches2, pathsToCheck) + verifyWatches(spec2, watches, pathsToCheck) + + By("deleting the configuration") + err = activeStore.Delete(ctx) + Expect(err).NotTo(HaveOccurred()) + + By("verifying that all reactive messages received an update") + verifyWatches(nil, watches2) + verifyWatches(nil, watches) + }) + + When("a reactive message is watched before a value is set", func() { + It("should receive the value when it is set", func(ctx SpecContext) { + msg := &ext.SampleConfiguration{} + rm := ctrl.Reactive(msg.ProtoPath().StringField()) + w := rm.Watch(ctx) + Expect(len(w)).To(BeZero()) + + spec := &ext.SampleConfiguration{ + StringField: lo.ToPtr("foo"), + } + err := activeStore.Put(ctx, spec) + Expect(err).NotTo(HaveOccurred()) + + var v protoreflect.Value + Eventually(w).Should(Receive(&v)) + Expect(v).To(testutil.ProtoValueEqual(protoreflect.ValueOfString("foo"))) + }) + }) + + When("the active store has an existing value on creation", func() { + It("should start with the existing revision and value", func() { + spec := &ext.SampleConfiguration{ + StringField: lo.ToPtr("foo"), + } + err := activeStore.Put(context.Background(), spec) + Expect(err).NotTo(HaveOccurred()) + + ctrl = reactive.NewController(driverutil.NewDefaultingConfigTracker(defaultStore, activeStore, flagutil.LoadDefaults)) + ctx, ca := context.WithCancel(context.Background()) + Expect(ctrl.Start(ctx)).To(Succeed()) + DeferCleanup(ca) + + rm := ctrl.Reactive(spec.ProtoPath().StringField()) + w := rm.Watch(ctx) + + var v protoreflect.Value + Eventually(w).Should(Receive(&v)) + Expect(v).To(testutil.ProtoValueEqual(protoreflect.ValueOfString("foo"))) + }) + }) + + When("creating multiple reactive messages for the same path", func() { + It("should duplicate all updates", func(ctx SpecContext) { + msg := &ext.SampleConfiguration{} + rm1 := ctrl.Reactive(msg.ProtoPath().StringField()) + rm2 := ctrl.Reactive(msg.ProtoPath().StringField()) + w1 := rm1.Watch(ctx) + w2 := rm2.Watch(ctx) + + spec := &ext.SampleConfiguration{ + StringField: lo.ToPtr("foo"), + } + err := activeStore.Put(ctx, spec) + Expect(err).NotTo(HaveOccurred()) + + var v1, v2 protoreflect.Value + Eventually(w1).Should(Receive(&v1)) + Eventually(w2).Should(Receive(&v2)) + Expect(v1).To(testutil.ProtoValueEqual(protoreflect.ValueOfString("foo"))) + Expect(v2).To(testutil.ProtoValueEqual(protoreflect.ValueOfString("foo"))) + }) + }) + +}) diff --git a/pkg/config/reactive/export_test.go b/pkg/config/reactive/export_test.go new file mode 100644 index 0000000000..3adf32e46c --- /dev/null +++ b/pkg/config/reactive/export_test.go @@ -0,0 +1,36 @@ +package reactive + +import ( + "fmt" + "io" + + art "github.com/plar/go-adaptive-radix-tree" + "google.golang.org/protobuf/reflect/protoreflect" +) + +func (s *Controller[T]) DebugDumpReactiveMessagesInfo(out io.Writer) { + s.reactiveMessagesMu.Lock() + defer s.reactiveMessagesMu.Unlock() + + s.reactiveMessages.ForEach(func(node art.Node) (cont bool) { + switch node.Kind() { + case art.Leaf: + rm := node.Value().(*reactiveValue) + numWatchers := 0 + rm.watchChannels.Range(func(_ string, _ chan protoreflect.Value) bool { + numWatchers++ + return true + }) + rm.watchFuncs.Range(func(_ string, _ *func(int64, protoreflect.Value)) bool { + numWatchers++ + return true + }) + fmt.Fprintf(out, "message %s: {watchers: %d; rev: %d}\n", node.Key(), numWatchers, rm.rev) + default: + fmt.Fprintf(out, "node: key: %s; value: %v\n", node.Key(), node.Value()) + } + return true + }) +} + +type ReactiveValue = reactiveValue diff --git a/pkg/config/reactive/reactive.go b/pkg/config/reactive/reactive.go new file mode 100644 index 0000000000..ef09ee63e8 --- /dev/null +++ b/pkg/config/reactive/reactive.go @@ -0,0 +1,29 @@ +package reactive + +import ( + "context" + + "google.golang.org/protobuf/reflect/protoreflect" +) + +type Value Reactive[protoreflect.Value] + +type Reactive[T any] interface { + reactiveInternal[T] + Value() T + Watch(ctx context.Context) <-chan T + WatchFunc(ctx context.Context, onChanged func(value T)) +} + +type scalar interface { + bool | int32 | int64 | uint32 | uint64 | float32 | float64 | string | []byte +} + +type Encoder[T any] interface { + FromValue(protoreflect.Value) T +} + +type reactiveInternal[V any] interface { + watchFuncWithRev(ctx context.Context, onChanged func(rev int64, value V)) + wait() +} diff --git a/pkg/config/reactive/reactive_suite_test.go b/pkg/config/reactive/reactive_suite_test.go new file mode 100644 index 0000000000..316ce21dfa --- /dev/null +++ b/pkg/config/reactive/reactive_suite_test.go @@ -0,0 +1,14 @@ +package reactive_test + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + _ "github.com/rancher/opni/pkg/test/setup" +) + +func TestReactive(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Reactive Suite") +} diff --git a/pkg/config/reactive/reactivetest/controller.go b/pkg/config/reactive/reactivetest/controller.go new file mode 100644 index 0000000000..0fe0c19278 --- /dev/null +++ b/pkg/config/reactive/reactivetest/controller.go @@ -0,0 +1,96 @@ +package reactivetest + +import ( + "context" + + "github.com/rancher/opni/pkg/config/reactive" + "github.com/rancher/opni/pkg/plugins/driverutil" + "github.com/rancher/opni/pkg/storage/inmemory" + "github.com/rancher/opni/pkg/util" + "github.com/rancher/opni/pkg/util/flagutil" +) + +type config[T any] interface { + driverutil.ConfigType[T] + flagutil.FlagSetter +} + +type InMemoryControllerOptions[T config[T]] struct { + existingActive T + existingDefault T + setActive T + setDefault T +} + +type InMemoryControllerOption[T config[T]] func(*InMemoryControllerOptions[T]) + +func (o *InMemoryControllerOptions[T]) apply(opts ...InMemoryControllerOption[T]) { + for _, op := range opts { + op(o) + } +} + +func WithExistingActiveConfig[T config[T]](activeConfig T) InMemoryControllerOption[T] { + return func(o *InMemoryControllerOptions[T]) { + o.existingActive = activeConfig + } +} + +func WithExistingDefaultConfig[T config[T]](defaultConfig T) InMemoryControllerOption[T] { + return func(o *InMemoryControllerOptions[T]) { + o.existingDefault = defaultConfig + } +} + +func WithInitialActiveConfig[T config[T]](activeConfig T) InMemoryControllerOption[T] { + return func(o *InMemoryControllerOptions[T]) { + o.setActive = activeConfig + } +} + +func WithInitialDefaultConfig[T config[T]](defaultConfig T) InMemoryControllerOption[T] { + return func(o *InMemoryControllerOptions[T]) { + o.setDefault = defaultConfig + } +} + +func InMemoryController[T config[T]](opts ...InMemoryControllerOption[T]) (*reactive.Controller[T], context.Context, context.CancelFunc) { + options := InMemoryControllerOptions[T]{} + options.apply(opts...) + + ctx, ca := context.WithCancel(context.Background()) + defaultStore := inmemory.NewValueStore[T](util.ProtoClone) + activeStore := inmemory.NewValueStore[T](util.ProtoClone) + + if options.existingDefault.ProtoReflect().IsValid() { + if err := defaultStore.Put(ctx, options.existingDefault); err != nil { + panic(err) + } + } + + if options.existingActive.ProtoReflect().IsValid() { + if err := activeStore.Put(ctx, options.existingActive); err != nil { + panic(err) + } + } + + tracker := driverutil.NewDefaultingConfigTracker(defaultStore, activeStore, flagutil.LoadDefaults) + ctrl := reactive.NewController[T](tracker) + if err := ctrl.Start(ctx); err != nil { + panic(err) + } + + if options.setDefault.ProtoReflect().IsValid() { + if err := tracker.SetDefaultConfig(ctx, options.setDefault); err != nil { + panic(err) + } + } + + if options.setActive.ProtoReflect().IsValid() { + if err := tracker.ApplyConfig(ctx, options.setActive); err != nil { + panic(err) + } + } + + return ctrl, ctx, ca +} diff --git a/pkg/config/reactive/subtle/wait.go b/pkg/config/reactive/subtle/wait.go new file mode 100644 index 0000000000..83be52ae3c --- /dev/null +++ b/pkg/config/reactive/subtle/wait.go @@ -0,0 +1,39 @@ +// Functions in this package are useful in a few specific cases, but require +// careful consideration to ensure they are used correctly. +package subtle + +import ( + "context" + + "github.com/rancher/opni/pkg/config/reactive" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/reflect/protoreflect" +) + +// WaitOne returns the current value of the reactive.Value, or blocks until +// one becomes available, then returns it. +// +// WARNING: This function is intended for use in very few places, such as +// during startup when "bootstrapping" configuration that is needed to +// initialize the reactive controller itself. It should not be used in +// general purpose code, as it could introduce bugs that would be difficult +// to track down. +func WaitOne(ctx context.Context, val reactive.Value) protoreflect.Value { + ctx, ca := context.WithCancel(ctx) + defer ca() + return <-val.Watch(ctx) +} + +// WaitOneMessage is like WaitOne, but first wraps the given value in a +// reactive.Message. +// +// WARNING: This function is intended for use in very few places, such as +// during startup when "bootstrapping" configuration that is needed to +// initialize the reactive controller itself. It should not be used in +// general purpose code, as it could introduce bugs that would be difficult +// to track down. +func WaitOneMessage[T proto.Message](ctx context.Context, val reactive.Value) T { + ctx, ca := context.WithCancel(ctx) + defer ca() + return <-reactive.Message[T](val).Watch(ctx) +} diff --git a/pkg/config/reactive/typed.go b/pkg/config/reactive/typed.go new file mode 100644 index 0000000000..036882c749 --- /dev/null +++ b/pkg/config/reactive/typed.go @@ -0,0 +1,87 @@ +package reactive + +import ( + "context" + + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/reflect/protoreflect" +) + +func Message[T proto.Message](rv Value) Reactive[T] { + return &typedReactive[messageEncoder[T], T]{ + base: rv, + } +} + +func Scalar[T scalar](rv Value) Reactive[T] { + return &typedReactive[scalarEncoder[T], T]{ + base: rv, + } +} + +type messageEncoder[T proto.Message] struct{} + +func (messageEncoder[T]) FromValue(v protoreflect.Value) T { + return v.Message().Interface().(T) +} + +type scalarEncoder[T scalar] struct{} + +func (scalarEncoder[T]) FromValue(v protoreflect.Value) T { + return v.Interface().(T) +} + +type typedReactive[E Encoder[T], T any] struct { + base Value + encoder E +} + +func (m *typedReactive[E, T]) Value() T { + return m.encoder.FromValue(m.base.Value()) +} + +func (m *typedReactive[E, T]) Watch(ctx context.Context) <-chan T { + wc := m.base.Watch(ctx) + ch := make(chan T, 1) + + select { + case v := <-wc: + ch <- m.encoder.FromValue(v) + default: + } + + go func() { + defer close(ch) + for v := range wc { + vt := m.encoder.FromValue(v) + select { + case ch <- vt: + default: + // replicate the behavior of reactiveMessage.update since we are + // wrapping the original channel + select { + case <-ch: + default: + } + ch <- vt + } + } + }() + return ch +} + +func (m *typedReactive[E, T]) WatchFunc(ctx context.Context, onChanged func(T)) { + m.base.WatchFunc(ctx, func(v protoreflect.Value) { + onChanged(m.encoder.FromValue(v)) + }) +} + +func (m *typedReactive[E, T]) watchFuncWithRev(ctx context.Context, onChanged func(int64, T)) { + m.base.watchFuncWithRev(ctx, func(rev int64, v protoreflect.Value) { + onChanged(rev, m.encoder.FromValue(v)) + }) +} + +func (m *typedReactive[E, T]) wait() { + m.base.wait() +} diff --git a/pkg/config/reactive/typed_test.go b/pkg/config/reactive/typed_test.go new file mode 100644 index 0000000000..80e631e39e --- /dev/null +++ b/pkg/config/reactive/typed_test.go @@ -0,0 +1,114 @@ +package reactive_test + +import ( + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "google.golang.org/protobuf/reflect/protoreflect" + + "github.com/rancher/opni/pkg/config/reactive" + "github.com/rancher/opni/pkg/test/testdata/plugins/ext" + "github.com/rancher/opni/pkg/test/testutil" +) + +var _ = Describe("Typed Reactive Messages", Label("unit"), func() { + It("should create typed messages", func(ctx SpecContext) { + rv := &reactive.ReactiveValue{} + + actual := &ext.Sample2FieldMsg{ + Field1: 100, + Field2: 200, + } + + val := protoreflect.ValueOf(actual.ProtoReflect()) + rv.Update(1, val, make(chan struct{})) + Expect(rv.Value()).To(testutil.ProtoValueEqual(val)) + + typedRv := reactive.Message[*ext.Sample2FieldMsg](rv) + Expect(typedRv.Value()).To(testutil.ProtoEqual(actual)) + + typedW := typedRv.Watch(ctx) + Eventually(typedW).Should(Receive(testutil.ProtoEqual(actual))) + + called := false + check := func(m *ext.Sample2FieldMsg) { + Expect(m).To(testutil.ProtoEqual(actual)) + } + typedRv.WatchFunc(ctx, func(v *ext.Sample2FieldMsg) { + check(v) + called = true + }) + Expect(called).To(BeTrue(), "watch func was not called") + + actual2 := &ext.Sample2FieldMsg{ + Field1: 300, + Field2: 400, + } + + called = false + check = func(m *ext.Sample2FieldMsg) { + Expect(m).To(testutil.ProtoEqual(actual2)) + } + rv.Update(2, protoreflect.ValueOf(actual2.ProtoReflect()), make(chan struct{})) + + Eventually(typedW).Should(Receive(testutil.ProtoEqual(actual2))) + Expect(called).To(BeTrue(), "watch func was not called") + }) + + It("should create typed scalars", func(ctx SpecContext) { + rv := &reactive.ReactiveValue{} + + actual := int32(100) + + rv.Update(1, protoreflect.ValueOf(actual), make(chan struct{})) + Expect(rv.Value().Int()).To(Equal(int64(100))) // note the type conversion by Int() + + typedRv := reactive.Scalar[int32](rv) + Expect(typedRv.Value()).To(Equal(actual)) // note the lack of type conversion + + called := false + check := func(m int32) { + Expect(m).To(Equal(actual)) + } + typedRv.WatchFunc(ctx, func(v int32) { + check(v) + called = true + }) + Expect(called).To(BeTrue(), "watch func was not called") + + typedW := typedRv.Watch(ctx) + Eventually(typedW).Should(Receive(Equal(actual))) + + actual2 := int32(200) + called = false + check = func(m int32) { + Expect(m).To(Equal(actual2)) + } + rv.Update(2, protoreflect.ValueOf(actual2), make(chan struct{})) + + Eventually(typedW).Should(Receive(Equal(actual2))) + Expect(called).To(BeTrue(), "watch func was not called") + }) + + It("should handle slow watch receivers the same way untyped values do", func(ctx SpecContext) { + rv := &reactive.ReactiveValue{} + typedRv := reactive.Scalar[int32](rv) + + w := rv.Watch(ctx) + typedW := typedRv.Watch(ctx) + + Expect(w).To(HaveLen(0)) + Expect(typedW).To(HaveLen(0)) + rv.Update(1, protoreflect.ValueOf(int32(100)), make(chan struct{})) + Eventually(w).Should(HaveLen(1)) + Eventually(typedW).Should(HaveLen(1)) + rv.Update(2, protoreflect.ValueOf(int32(200)), make(chan struct{})) + Consistently(w).Should(HaveLen(1)) + Consistently(typedW).Should(HaveLen(1)) + rv.Update(3, protoreflect.ValueOf(int32(300)), make(chan struct{})) + Consistently(w).Should(HaveLen(1)) + Consistently(typedW).Should(HaveLen(1)) + + Expect(<-w).To(testutil.ProtoValueEqual(protoreflect.ValueOf(int32(300)))) + Expect(<-typedW).To(Equal(int32(300))) + }) +}) diff --git a/pkg/config/reactive/value.go b/pkg/config/reactive/value.go new file mode 100644 index 0000000000..86a2d96c8a --- /dev/null +++ b/pkg/config/reactive/value.go @@ -0,0 +1,108 @@ +package reactive + +import ( + "context" + "sync" + + "github.com/google/uuid" + gsync "github.com/kralicky/gpkg/sync" + "google.golang.org/protobuf/reflect/protoreflect" +) + +type reactiveValue struct { + valueMu sync.Mutex + rev int64 + value protoreflect.Value + watchChannels gsync.Map[string, chan protoreflect.Value] + watchFuncs gsync.Map[string, *func(int64, protoreflect.Value)] + + groupMu sync.Mutex + group <-chan struct{} +} + +func (r *reactiveValue) Update(rev int64, v protoreflect.Value, group <-chan struct{}) { + r.valueMu.Lock() + r.rev = rev + r.value = v + r.valueMu.Unlock() + + r.groupMu.Lock() + r.group = group + r.groupMu.Unlock() + + r.watchChannels.Range(func(_ string, w chan protoreflect.Value) bool { + select { + case w <- v: + default: + // if the watch is not ready to receive, drop the previous value and + // replace it with the current value + select { + case <-w: + // current value discarded + default: + // the channel was read from just now + } + w <- v + } + return true + }) + r.watchFuncs.Range(func(key string, value *func(int64, protoreflect.Value)) bool { + (*value)(rev, v) + return true + }) +} + +func (r *reactiveValue) Value() protoreflect.Value { + r.valueMu.Lock() + defer r.valueMu.Unlock() + return r.value +} + +func (r *reactiveValue) Watch(ctx context.Context) <-chan protoreflect.Value { + ch := make(chan protoreflect.Value, 1) + + r.valueMu.Lock() + if r.rev != 0 { + ch <- r.value + } + r.valueMu.Unlock() + + key := uuid.NewString() + r.watchChannels.Store(key, ch) + context.AfterFunc(ctx, func() { + defer close(ch) + r.watchChannels.Delete(key) + }) + return ch +} + +func (r *reactiveValue) WatchFunc(ctx context.Context, onChanged func(protoreflect.Value)) { + r.watchFuncWithRev(ctx, func(_ int64, value protoreflect.Value) { + onChanged(value) + }) +} + +func (r *reactiveValue) watchFuncWithRev(ctx context.Context, onChanged func(int64, protoreflect.Value)) { + r.valueMu.Lock() + if r.rev != 0 { + onChanged(r.rev, r.value) + } + r.valueMu.Unlock() + + key := uuid.NewString() + r.watchFuncs.Store(key, &onChanged) + context.AfterFunc(ctx, func() { + r.watchFuncs.Delete(key) + }) +} + +func (r *reactiveValue) wait() { + r.groupMu.Lock() + group := r.group + r.groupMu.Unlock() + + if group == nil { + return + } + <-group +} diff --git a/pkg/config/v1/configv1_suite_test.go b/pkg/config/v1/configv1_suite_test.go index 840b2f494f..78c5a97700 100644 --- a/pkg/config/v1/configv1_suite_test.go +++ b/pkg/config/v1/configv1_suite_test.go @@ -1,4 +1,4 @@ -package v1_test +package configv1_test import ( "testing" diff --git a/pkg/config/v1/deepcopy.go b/pkg/config/v1/deepcopy.go index fc091df929..9535000b99 100644 --- a/pkg/config/v1/deepcopy.go +++ b/pkg/config/v1/deepcopy.go @@ -1,4 +1,4 @@ -package v1 +package configv1 import "google.golang.org/protobuf/proto" diff --git a/pkg/config/v1/extensions.go b/pkg/config/v1/extensions.go index 15da4c80a8..c3a61f45b2 100644 --- a/pkg/config/v1/extensions.go +++ b/pkg/config/v1/extensions.go @@ -1,4 +1,4 @@ -package v1 +package configv1 import ( "os" @@ -23,5 +23,10 @@ func (h *HistoryResponse) RenderText(out cli.Writer) { func init() { addExtraGatewayConfigCmd(rollback.BuildCmd("rollback", GatewayConfigContextInjector)) - addExtraGatewayConfigCmd(dryrun.BuildCmd("dry-run", GatewayConfigContextInjector)) + addExtraGatewayConfigCmd(dryrun.BuildCmd("dry-run", GatewayConfigContextInjector, + BuildGatewayConfigSetConfigurationCmd(), + BuildGatewayConfigSetDefaultConfigurationCmd(), + BuildGatewayConfigResetConfigurationCmd(), + BuildGatewayConfigResetDefaultConfigurationCmd(), + )) } diff --git a/pkg/config/v1/gateway_config.pb.go b/pkg/config/v1/gateway_config.pb.go index 6a5afe6759..4c19b88375 100644 --- a/pkg/config/v1/gateway_config.pb.go +++ b/pkg/config/v1/gateway_config.pb.go @@ -4,7 +4,7 @@ // protoc v1.0.0 // source: github.com/rancher/opni/pkg/config/v1/gateway_config.proto -package v1 +package configv1 import ( validate "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" @@ -14,8 +14,10 @@ import ( _ "github.com/rancher/opni/pkg/validation" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + _ "google.golang.org/protobuf/types/known/anypb" emptypb "google.golang.org/protobuf/types/known/emptypb" fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + _ "google.golang.org/protobuf/types/known/structpb" reflect "reflect" sync "sync" ) @@ -164,50 +166,142 @@ func (CacheBackend) EnumDescriptor() ([]byte, []int) { return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{2} } -type ImageResolverType int32 +type AgentUpgradesSpec_Driver int32 const ( - ImageResolverType_Noop ImageResolverType = 0 - ImageResolverType_Kubernetes ImageResolverType = 1 + AgentUpgradesSpec_Noop AgentUpgradesSpec_Driver = 0 + AgentUpgradesSpec_Kubernetes AgentUpgradesSpec_Driver = 1 ) -// Enum value maps for ImageResolverType. +// Enum value maps for AgentUpgradesSpec_Driver. var ( - ImageResolverType_name = map[int32]string{ + AgentUpgradesSpec_Driver_name = map[int32]string{ 0: "Noop", 1: "Kubernetes", } - ImageResolverType_value = map[string]int32{ + AgentUpgradesSpec_Driver_value = map[string]int32{ "Noop": 0, "Kubernetes": 1, } ) -func (x ImageResolverType) Enum() *ImageResolverType { - p := new(ImageResolverType) +func (x AgentUpgradesSpec_Driver) Enum() *AgentUpgradesSpec_Driver { + p := new(AgentUpgradesSpec_Driver) *p = x return p } -func (x ImageResolverType) String() string { +func (x AgentUpgradesSpec_Driver) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } -func (ImageResolverType) Descriptor() protoreflect.EnumDescriptor { +func (AgentUpgradesSpec_Driver) Descriptor() protoreflect.EnumDescriptor { return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_enumTypes[3].Descriptor() } -func (ImageResolverType) Type() protoreflect.EnumType { +func (AgentUpgradesSpec_Driver) Type() protoreflect.EnumType { return &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_enumTypes[3] } -func (x ImageResolverType) Number() protoreflect.EnumNumber { +func (x AgentUpgradesSpec_Driver) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } -// Deprecated: Use ImageResolverType.Descriptor instead. -func (ImageResolverType) EnumDescriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{3} +// Deprecated: Use AgentUpgradesSpec_Driver.Descriptor instead. +func (AgentUpgradesSpec_Driver) EnumDescriptor() ([]byte, []int) { + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{20, 0} +} + +type PluginUpgradesSpec_Driver int32 + +const ( + PluginUpgradesSpec_Noop PluginUpgradesSpec_Driver = 0 + PluginUpgradesSpec_Binary PluginUpgradesSpec_Driver = 1 +) + +// Enum value maps for PluginUpgradesSpec_Driver. +var ( + PluginUpgradesSpec_Driver_name = map[int32]string{ + 0: "Noop", + 1: "Binary", + } + PluginUpgradesSpec_Driver_value = map[string]int32{ + "Noop": 0, + "Binary": 1, + } +) + +func (x PluginUpgradesSpec_Driver) Enum() *PluginUpgradesSpec_Driver { + p := new(PluginUpgradesSpec_Driver) + *p = x + return p +} + +func (x PluginUpgradesSpec_Driver) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (PluginUpgradesSpec_Driver) Descriptor() protoreflect.EnumDescriptor { + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_enumTypes[4].Descriptor() +} + +func (PluginUpgradesSpec_Driver) Type() protoreflect.EnumType { + return &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_enumTypes[4] +} + +func (x PluginUpgradesSpec_Driver) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use PluginUpgradesSpec_Driver.Descriptor instead. +func (PluginUpgradesSpec_Driver) EnumDescriptor() ([]byte, []int) { + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{21, 0} +} + +type KubernetesAgentUpgradeSpec_ImageResolver int32 + +const ( + KubernetesAgentUpgradeSpec_Noop KubernetesAgentUpgradeSpec_ImageResolver = 0 + KubernetesAgentUpgradeSpec_Kubernetes KubernetesAgentUpgradeSpec_ImageResolver = 1 +) + +// Enum value maps for KubernetesAgentUpgradeSpec_ImageResolver. +var ( + KubernetesAgentUpgradeSpec_ImageResolver_name = map[int32]string{ + 0: "Noop", + 1: "Kubernetes", + } + KubernetesAgentUpgradeSpec_ImageResolver_value = map[string]int32{ + "Noop": 0, + "Kubernetes": 1, + } +) + +func (x KubernetesAgentUpgradeSpec_ImageResolver) Enum() *KubernetesAgentUpgradeSpec_ImageResolver { + p := new(KubernetesAgentUpgradeSpec_ImageResolver) + *p = x + return p +} + +func (x KubernetesAgentUpgradeSpec_ImageResolver) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (KubernetesAgentUpgradeSpec_ImageResolver) Descriptor() protoreflect.EnumDescriptor { + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_enumTypes[5].Descriptor() +} + +func (KubernetesAgentUpgradeSpec_ImageResolver) Type() protoreflect.EnumType { + return &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_enumTypes[5] +} + +func (x KubernetesAgentUpgradeSpec_ImageResolver) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use KubernetesAgentUpgradeSpec_ImageResolver.Descriptor instead. +func (KubernetesAgentUpgradeSpec_ImageResolver) EnumDescriptor() ([]byte, []int) { + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{23, 0} } type AuthSpec_Backend int32 @@ -240,11 +334,11 @@ func (x AuthSpec_Backend) String() string { } func (AuthSpec_Backend) Descriptor() protoreflect.EnumDescriptor { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_enumTypes[4].Descriptor() + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_enumTypes[6].Descriptor() } func (AuthSpec_Backend) Type() protoreflect.EnumType { - return &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_enumTypes[4] + return &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_enumTypes[6] } func (x AuthSpec_Backend) Number() protoreflect.EnumNumber { @@ -253,7 +347,170 @@ func (x AuthSpec_Backend) Number() protoreflect.EnumNumber { // Deprecated: Use AuthSpec_Backend.Descriptor instead. func (AuthSpec_Backend) EnumDescriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{19, 0} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{25, 0} +} + +type ReactiveWatchRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // If true, uses [reactive.Bind] to watch all paths at once. If false, + // each path recieves updates separately. + Bind bool `protobuf:"varint,1,opt,name=bind,proto3" json:"bind,omitempty"` + // List of paths to watch. + Paths []string `protobuf:"bytes,2,rep,name=paths,proto3" json:"paths,omitempty"` +} + +func (x *ReactiveWatchRequest) Reset() { + *x = ReactiveWatchRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReactiveWatchRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReactiveWatchRequest) ProtoMessage() {} + +func (x *ReactiveWatchRequest) ProtoReflect() protoreflect.Message { + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ReactiveWatchRequest.ProtoReflect.Descriptor instead. +func (*ReactiveWatchRequest) Descriptor() ([]byte, []int) { + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{0} +} + +func (x *ReactiveWatchRequest) GetBind() bool { + if x != nil { + return x.Bind + } + return false +} + +func (x *ReactiveWatchRequest) GetPaths() []string { + if x != nil { + return x.Paths + } + return nil +} + +type ReactiveEvents struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // In bind mode, this will contain one item for each path in the request, + // in order. Otherwise, this will only contain a single item. + Items []*ReactiveEvent `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` +} + +func (x *ReactiveEvents) Reset() { + *x = ReactiveEvents{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReactiveEvents) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReactiveEvents) ProtoMessage() {} + +func (x *ReactiveEvents) ProtoReflect() protoreflect.Message { + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ReactiveEvents.ProtoReflect.Descriptor instead. +func (*ReactiveEvents) Descriptor() ([]byte, []int) { + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{1} +} + +func (x *ReactiveEvents) GetItems() []*ReactiveEvent { + if x != nil { + return x.Items + } + return nil +} + +type ReactiveEvent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The path that triggered this event, as an index into the request path list. + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` + Value *v1.Value `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *ReactiveEvent) Reset() { + *x = ReactiveEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReactiveEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReactiveEvent) ProtoMessage() {} + +func (x *ReactiveEvent) ProtoReflect() protoreflect.Message { + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ReactiveEvent.ProtoReflect.Descriptor instead. +func (*ReactiveEvent) Descriptor() ([]byte, []int) { + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{2} +} + +func (x *ReactiveEvent) GetIndex() int32 { + if x != nil { + return x.Index + } + return 0 +} + +func (x *ReactiveEvent) GetValue() *v1.Value { + if x != nil { + return x.Value + } + return nil } type GatewayConfigSpec struct { @@ -261,25 +518,25 @@ type GatewayConfigSpec struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Revision *v1.Revision `protobuf:"bytes,1,opt,name=revision,proto3" json:"revision,omitempty"` - Server *ServerSpec `protobuf:"bytes,2,opt,name=server,proto3" json:"server,omitempty"` - Management *ManagementServerSpec `protobuf:"bytes,3,opt,name=management,proto3" json:"management,omitempty"` - Relay *RelayServerSpec `protobuf:"bytes,4,opt,name=relay,proto3" json:"relay,omitempty"` - Health *HealthServerSpec `protobuf:"bytes,5,opt,name=health,proto3" json:"health,omitempty"` - Dashboard *DashboardServerSpec `protobuf:"bytes,6,opt,name=dashboard,proto3" json:"dashboard,omitempty"` - Storage *StorageSpec `protobuf:"bytes,7,opt,name=storage,proto3" json:"storage,omitempty"` - Certs *CertsSpec `protobuf:"bytes,8,opt,name=certs,proto3" json:"certs,omitempty"` - Plugins *PluginsSpec `protobuf:"bytes,9,opt,name=plugins,proto3" json:"plugins,omitempty"` - Keyring *KeyringSpec `protobuf:"bytes,10,opt,name=keyring,proto3" json:"keyring,omitempty"` - AgentUpgrades *AgentUpgradesSpec `protobuf:"bytes,11,opt,name=agentUpgrades,proto3" json:"agentUpgrades,omitempty"` - RateLimiting *RateLimitingSpec `protobuf:"bytes,12,opt,name=rateLimiting,proto3" json:"rateLimiting,omitempty"` - Auth *AuthSpec `protobuf:"bytes,13,opt,name=auth,proto3" json:"auth,omitempty"` + Revision *v1.Revision `protobuf:"bytes,1,opt,name=revision,proto3" json:"revision,omitempty"` + Server *ServerSpec `protobuf:"bytes,2,opt,name=server,proto3" json:"server,omitempty"` + Management *ManagementServerSpec `protobuf:"bytes,3,opt,name=management,proto3" json:"management,omitempty"` + Relay *RelayServerSpec `protobuf:"bytes,4,opt,name=relay,proto3" json:"relay,omitempty"` + Health *HealthServerSpec `protobuf:"bytes,5,opt,name=health,proto3" json:"health,omitempty"` + Dashboard *DashboardServerSpec `protobuf:"bytes,6,opt,name=dashboard,proto3" json:"dashboard,omitempty"` + Storage *StorageSpec `protobuf:"bytes,7,opt,name=storage,proto3" json:"storage,omitempty"` + Certs *CertsSpec `protobuf:"bytes,8,opt,name=certs,proto3" json:"certs,omitempty"` + Plugins *PluginsSpec `protobuf:"bytes,9,opt,name=plugins,proto3" json:"plugins,omitempty"` + Keyring *KeyringSpec `protobuf:"bytes,10,opt,name=keyring,proto3" json:"keyring,omitempty"` + Upgrades *UpgradesSpec `protobuf:"bytes,11,opt,name=upgrades,proto3" json:"upgrades,omitempty"` + RateLimiting *RateLimitingSpec `protobuf:"bytes,12,opt,name=rateLimiting,proto3" json:"rateLimiting,omitempty"` + Auth *AuthSpec `protobuf:"bytes,13,opt,name=auth,proto3" json:"auth,omitempty"` } func (x *GatewayConfigSpec) Reset() { *x = GatewayConfigSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[0] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -292,7 +549,7 @@ func (x *GatewayConfigSpec) String() string { func (*GatewayConfigSpec) ProtoMessage() {} func (x *GatewayConfigSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[0] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -305,7 +562,7 @@ func (x *GatewayConfigSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use GatewayConfigSpec.ProtoReflect.Descriptor instead. func (*GatewayConfigSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{0} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{3} } func (x *GatewayConfigSpec) GetRevision() *v1.Revision { @@ -378,9 +635,9 @@ func (x *GatewayConfigSpec) GetKeyring() *KeyringSpec { return nil } -func (x *GatewayConfigSpec) GetAgentUpgrades() *AgentUpgradesSpec { +func (x *GatewayConfigSpec) GetUpgrades() *UpgradesSpec { if x != nil { - return x.AgentUpgrades + return x.Upgrades } return nil } @@ -408,12 +665,14 @@ type ServerSpec struct { HttpListenAddress *string `protobuf:"bytes,1,opt,name=httpListenAddress,proto3,oneof" json:"httpListenAddress,omitempty"` // Address and port to serve the gateway's external grpc server on. GrpcListenAddress *string `protobuf:"bytes,2,opt,name=grpcListenAddress,proto3,oneof" json:"grpcListenAddress,omitempty"` + // The advertise address for the server. + AdvertiseAddress *string `protobuf:"bytes,3,opt,name=advertiseAddress,proto3,oneof" json:"advertiseAddress,omitempty"` } func (x *ServerSpec) Reset() { *x = ServerSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[1] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -426,7 +685,7 @@ func (x *ServerSpec) String() string { func (*ServerSpec) ProtoMessage() {} func (x *ServerSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[1] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -439,7 +698,7 @@ func (x *ServerSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use ServerSpec.ProtoReflect.Descriptor instead. func (*ServerSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{1} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{4} } func (x *ServerSpec) GetHttpListenAddress() string { @@ -456,6 +715,13 @@ func (x *ServerSpec) GetGrpcListenAddress() string { return "" } +func (x *ServerSpec) GetAdvertiseAddress() string { + if x != nil && x.AdvertiseAddress != nil { + return *x.AdvertiseAddress + } + return "" +} + type ManagementServerSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -474,7 +740,7 @@ type ManagementServerSpec struct { func (x *ManagementServerSpec) Reset() { *x = ManagementServerSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[2] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -487,7 +753,7 @@ func (x *ManagementServerSpec) String() string { func (*ManagementServerSpec) ProtoMessage() {} func (x *ManagementServerSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[2] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -500,7 +766,7 @@ func (x *ManagementServerSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use ManagementServerSpec.ProtoReflect.Descriptor instead. func (*ManagementServerSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{2} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{5} } func (x *ManagementServerSpec) GetHttpListenAddress() string { @@ -540,7 +806,7 @@ type RelayServerSpec struct { func (x *RelayServerSpec) Reset() { *x = RelayServerSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[3] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -553,7 +819,7 @@ func (x *RelayServerSpec) String() string { func (*RelayServerSpec) ProtoMessage() {} func (x *RelayServerSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[3] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -566,7 +832,7 @@ func (x *RelayServerSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use RelayServerSpec.ProtoReflect.Descriptor instead. func (*RelayServerSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{3} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{6} } func (x *RelayServerSpec) GetGrpcListenAddress() string { @@ -595,7 +861,7 @@ type HealthServerSpec struct { func (x *HealthServerSpec) Reset() { *x = HealthServerSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[4] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -608,7 +874,7 @@ func (x *HealthServerSpec) String() string { func (*HealthServerSpec) ProtoMessage() {} func (x *HealthServerSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[4] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -621,7 +887,7 @@ func (x *HealthServerSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use HealthServerSpec.ProtoReflect.Descriptor instead. func (*HealthServerSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{4} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{7} } func (x *HealthServerSpec) GetHttpListenAddress() string { @@ -650,7 +916,7 @@ type DashboardServerSpec struct { func (x *DashboardServerSpec) Reset() { *x = DashboardServerSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[5] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -663,7 +929,7 @@ func (x *DashboardServerSpec) String() string { func (*DashboardServerSpec) ProtoMessage() {} func (x *DashboardServerSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[5] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -676,7 +942,7 @@ func (x *DashboardServerSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use DashboardServerSpec.ProtoReflect.Descriptor instead. func (*DashboardServerSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{5} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{8} } func (x *DashboardServerSpec) GetHttpListenAddress() string { @@ -721,7 +987,7 @@ type StorageSpec struct { func (x *StorageSpec) Reset() { *x = StorageSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[6] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -734,7 +1000,7 @@ func (x *StorageSpec) String() string { func (*StorageSpec) ProtoMessage() {} func (x *StorageSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[6] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -747,7 +1013,7 @@ func (x *StorageSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use StorageSpec.ProtoReflect.Descriptor instead. func (*StorageSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{6} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{9} } func (x *StorageSpec) GetBackend() StorageBackend { @@ -785,7 +1051,7 @@ type EtcdSpec struct { func (x *EtcdSpec) Reset() { *x = EtcdSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[7] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -798,7 +1064,7 @@ func (x *EtcdSpec) String() string { func (*EtcdSpec) ProtoMessage() {} func (x *EtcdSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[7] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -811,7 +1077,7 @@ func (x *EtcdSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use EtcdSpec.ProtoReflect.Descriptor instead. func (*EtcdSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{7} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{10} } func (x *EtcdSpec) GetEndpoints() []string { @@ -854,7 +1120,7 @@ type MTLSSpec struct { func (x *MTLSSpec) Reset() { *x = MTLSSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[8] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -867,7 +1133,7 @@ func (x *MTLSSpec) String() string { func (*MTLSSpec) ProtoMessage() {} func (x *MTLSSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[8] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -880,7 +1146,7 @@ func (x *MTLSSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use MTLSSpec.ProtoReflect.Descriptor instead. func (*MTLSSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{8} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{11} } func (x *MTLSSpec) GetServerCA() string { @@ -953,7 +1219,7 @@ type JetStreamSpec struct { func (x *JetStreamSpec) Reset() { *x = JetStreamSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[9] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -966,7 +1232,7 @@ func (x *JetStreamSpec) String() string { func (*JetStreamSpec) ProtoMessage() {} func (x *JetStreamSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[9] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -979,7 +1245,7 @@ func (x *JetStreamSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use JetStreamSpec.ProtoReflect.Descriptor instead. func (*JetStreamSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{9} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{12} } func (x *JetStreamSpec) GetEndpoint() string { @@ -1018,7 +1284,7 @@ type CertsSpec struct { func (x *CertsSpec) Reset() { *x = CertsSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[10] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1031,7 +1297,7 @@ func (x *CertsSpec) String() string { func (*CertsSpec) ProtoMessage() {} func (x *CertsSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[10] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1044,7 +1310,7 @@ func (x *CertsSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use CertsSpec.ProtoReflect.Descriptor instead. func (*CertsSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{10} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{13} } func (x *CertsSpec) GetCaCert() string { @@ -1106,7 +1372,7 @@ type PluginsSpec struct { func (x *PluginsSpec) Reset() { *x = PluginsSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[11] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1119,7 +1385,7 @@ func (x *PluginsSpec) String() string { func (*PluginsSpec) ProtoMessage() {} func (x *PluginsSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[11] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1132,7 +1398,7 @@ func (x *PluginsSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use PluginsSpec.ProtoReflect.Descriptor instead. func (*PluginsSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{11} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{14} } func (x *PluginsSpec) GetDir() string { @@ -1168,7 +1434,7 @@ type PluginFilters struct { func (x *PluginFilters) Reset() { *x = PluginFilters{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[12] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1181,7 +1447,7 @@ func (x *PluginFilters) String() string { func (*PluginFilters) ProtoMessage() {} func (x *PluginFilters) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[12] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1194,7 +1460,7 @@ func (x *PluginFilters) ProtoReflect() protoreflect.Message { // Deprecated: Use PluginFilters.ProtoReflect.Descriptor instead. func (*PluginFilters) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{12} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{15} } func (x *PluginFilters) GetExclude() []string { @@ -1209,8 +1475,6 @@ type CacheSpec struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Patch engine to use for calculating plugin patches. - PatchEngine *PatchEngine `protobuf:"varint,1,opt,name=patchEngine,proto3,enum=config.v1.PatchEngine,oneof" json:"patchEngine,omitempty"` // Cache backend to use for storing plugin binaries and patches. Backend *CacheBackend `protobuf:"varint,2,opt,name=backend,proto3,enum=config.v1.CacheBackend,oneof" json:"backend,omitempty"` // Filesystem cache configuration. Required if backend is Filesystem. @@ -1220,7 +1484,7 @@ type CacheSpec struct { func (x *CacheSpec) Reset() { *x = CacheSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[13] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1233,7 +1497,7 @@ func (x *CacheSpec) String() string { func (*CacheSpec) ProtoMessage() {} func (x *CacheSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[13] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1246,14 +1510,7 @@ func (x *CacheSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use CacheSpec.ProtoReflect.Descriptor instead. func (*CacheSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{13} -} - -func (x *CacheSpec) GetPatchEngine() PatchEngine { - if x != nil && x.PatchEngine != nil { - return *x.PatchEngine - } - return PatchEngine_Bsdiff + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{16} } func (x *CacheSpec) GetBackend() CacheBackend { @@ -1282,7 +1539,7 @@ type FilesystemCacheSpec struct { func (x *FilesystemCacheSpec) Reset() { *x = FilesystemCacheSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[14] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1294,8 +1551,163 @@ func (x *FilesystemCacheSpec) String() string { func (*FilesystemCacheSpec) ProtoMessage() {} -func (x *FilesystemCacheSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[14] +func (x *FilesystemCacheSpec) ProtoReflect() protoreflect.Message { + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FilesystemCacheSpec.ProtoReflect.Descriptor instead. +func (*FilesystemCacheSpec) Descriptor() ([]byte, []int) { + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{17} +} + +func (x *FilesystemCacheSpec) GetDir() string { + if x != nil && x.Dir != nil { + return *x.Dir + } + return "" +} + +type KeyringSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Directories to search for files containing runtime keys. + // All files in these directories will be loaded into the keyring on + // startup. Keys loaded in this way will not be persisted. + RuntimeKeyDirs []string `protobuf:"bytes,1,rep,name=runtimeKeyDirs,proto3" json:"runtimeKeyDirs,omitempty"` +} + +func (x *KeyringSpec) Reset() { + *x = KeyringSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KeyringSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KeyringSpec) ProtoMessage() {} + +func (x *KeyringSpec) ProtoReflect() protoreflect.Message { + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KeyringSpec.ProtoReflect.Descriptor instead. +func (*KeyringSpec) Descriptor() ([]byte, []int) { + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{18} +} + +func (x *KeyringSpec) GetRuntimeKeyDirs() []string { + if x != nil { + return x.RuntimeKeyDirs + } + return nil +} + +type UpgradesSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Agents *AgentUpgradesSpec `protobuf:"bytes,1,opt,name=agents,proto3,oneof" json:"agents,omitempty"` + Plugins *PluginUpgradesSpec `protobuf:"bytes,2,opt,name=plugins,proto3,oneof" json:"plugins,omitempty"` +} + +func (x *UpgradesSpec) Reset() { + *x = UpgradesSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpgradesSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpgradesSpec) ProtoMessage() {} + +func (x *UpgradesSpec) ProtoReflect() protoreflect.Message { + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpgradesSpec.ProtoReflect.Descriptor instead. +func (*UpgradesSpec) Descriptor() ([]byte, []int) { + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{19} +} + +func (x *UpgradesSpec) GetAgents() *AgentUpgradesSpec { + if x != nil { + return x.Agents + } + return nil +} + +func (x *UpgradesSpec) GetPlugins() *PluginUpgradesSpec { + if x != nil { + return x.Plugins + } + return nil +} + +type AgentUpgradesSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Agent upgrade driver to use. + Driver *AgentUpgradesSpec_Driver `protobuf:"varint,1,opt,name=driver,proto3,enum=config.v1.AgentUpgradesSpec_Driver,oneof" json:"driver,omitempty"` + // Kubernetes agent upgrade configuration. + Kubernetes *KubernetesAgentUpgradeSpec `protobuf:"bytes,2,opt,name=kubernetes,proto3" json:"kubernetes,omitempty"` +} + +func (x *AgentUpgradesSpec) Reset() { + *x = AgentUpgradesSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AgentUpgradesSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AgentUpgradesSpec) ProtoMessage() {} + +func (x *AgentUpgradesSpec) ProtoReflect() protoreflect.Message { + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1306,46 +1718,53 @@ func (x *FilesystemCacheSpec) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use FilesystemCacheSpec.ProtoReflect.Descriptor instead. -func (*FilesystemCacheSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{14} +// Deprecated: Use AgentUpgradesSpec.ProtoReflect.Descriptor instead. +func (*AgentUpgradesSpec) Descriptor() ([]byte, []int) { + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{20} } -func (x *FilesystemCacheSpec) GetDir() string { - if x != nil && x.Dir != nil { - return *x.Dir +func (x *AgentUpgradesSpec) GetDriver() AgentUpgradesSpec_Driver { + if x != nil && x.Driver != nil { + return *x.Driver } - return "" + return AgentUpgradesSpec_Noop } -type KeyringSpec struct { +func (x *AgentUpgradesSpec) GetKubernetes() *KubernetesAgentUpgradeSpec { + if x != nil { + return x.Kubernetes + } + return nil +} + +type PluginUpgradesSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Directories to search for files containing runtime keys. - // All files in these directories will be loaded into the keyring on - // startup. Keys loaded in this way will not be persisted. - RuntimeKeyDirs []string `protobuf:"bytes,1,rep,name=runtimeKeyDirs,proto3" json:"runtimeKeyDirs,omitempty"` + // Plugin upgrade driver to use. + Driver *PluginUpgradesSpec_Driver `protobuf:"varint,1,opt,name=driver,proto3,enum=config.v1.PluginUpgradesSpec_Driver,oneof" json:"driver,omitempty"` + // Binary plugin upgrade configuration. + Binary *BinaryPluginUpgradeSpec `protobuf:"bytes,2,opt,name=binary,proto3" json:"binary,omitempty"` } -func (x *KeyringSpec) Reset() { - *x = KeyringSpec{} +func (x *PluginUpgradesSpec) Reset() { + *x = PluginUpgradesSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[15] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *KeyringSpec) String() string { +func (x *PluginUpgradesSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*KeyringSpec) ProtoMessage() {} +func (*PluginUpgradesSpec) ProtoMessage() {} -func (x *KeyringSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[15] +func (x *PluginUpgradesSpec) ProtoReflect() protoreflect.Message { + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1356,44 +1775,51 @@ func (x *KeyringSpec) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use KeyringSpec.ProtoReflect.Descriptor instead. -func (*KeyringSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{15} +// Deprecated: Use PluginUpgradesSpec.ProtoReflect.Descriptor instead. +func (*PluginUpgradesSpec) Descriptor() ([]byte, []int) { + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{21} } -func (x *KeyringSpec) GetRuntimeKeyDirs() []string { +func (x *PluginUpgradesSpec) GetDriver() PluginUpgradesSpec_Driver { + if x != nil && x.Driver != nil { + return *x.Driver + } + return PluginUpgradesSpec_Noop +} + +func (x *PluginUpgradesSpec) GetBinary() *BinaryPluginUpgradeSpec { if x != nil { - return x.RuntimeKeyDirs + return x.Binary } return nil } -type AgentUpgradesSpec struct { +type BinaryPluginUpgradeSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Kubernetes agent upgrade configuration. - Kubernetes *KubernetesAgentUpgradeSpec `protobuf:"bytes,1,opt,name=kubernetes,proto3" json:"kubernetes,omitempty"` + // Patch engine to use for calculating plugin patches. + PatchEngine *PatchEngine `protobuf:"varint,1,opt,name=patchEngine,proto3,enum=config.v1.PatchEngine,oneof" json:"patchEngine,omitempty"` } -func (x *AgentUpgradesSpec) Reset() { - *x = AgentUpgradesSpec{} +func (x *BinaryPluginUpgradeSpec) Reset() { + *x = BinaryPluginUpgradeSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[16] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *AgentUpgradesSpec) String() string { +func (x *BinaryPluginUpgradeSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AgentUpgradesSpec) ProtoMessage() {} +func (*BinaryPluginUpgradeSpec) ProtoMessage() {} -func (x *AgentUpgradesSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[16] +func (x *BinaryPluginUpgradeSpec) ProtoReflect() protoreflect.Message { + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1404,16 +1830,16 @@ func (x *AgentUpgradesSpec) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AgentUpgradesSpec.ProtoReflect.Descriptor instead. -func (*AgentUpgradesSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{16} +// Deprecated: Use BinaryPluginUpgradeSpec.ProtoReflect.Descriptor instead. +func (*BinaryPluginUpgradeSpec) Descriptor() ([]byte, []int) { + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{22} } -func (x *AgentUpgradesSpec) GetKubernetes() *KubernetesAgentUpgradeSpec { - if x != nil { - return x.Kubernetes +func (x *BinaryPluginUpgradeSpec) GetPatchEngine() PatchEngine { + if x != nil && x.PatchEngine != nil { + return *x.PatchEngine } - return nil + return PatchEngine_Bsdiff } type KubernetesAgentUpgradeSpec struct { @@ -1421,14 +1847,16 @@ type KubernetesAgentUpgradeSpec struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Agent image resolver backend to use. - ImageResolver *ImageResolverType `protobuf:"varint,1,opt,name=imageResolver,proto3,enum=config.v1.ImageResolverType,oneof" json:"imageResolver,omitempty"` + // Agent image resolver to use. + ImageResolver *KubernetesAgentUpgradeSpec_ImageResolver `protobuf:"varint,1,opt,name=imageResolver,proto3,enum=config.v1.KubernetesAgentUpgradeSpec_ImageResolver,oneof" json:"imageResolver,omitempty"` + Namespace *string `protobuf:"bytes,2,opt,name=namespace,proto3,oneof" json:"namespace,omitempty"` + RepoOverride *string `protobuf:"bytes,3,opt,name=repoOverride,proto3,oneof" json:"repoOverride,omitempty"` } func (x *KubernetesAgentUpgradeSpec) Reset() { *x = KubernetesAgentUpgradeSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[17] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1441,7 +1869,7 @@ func (x *KubernetesAgentUpgradeSpec) String() string { func (*KubernetesAgentUpgradeSpec) ProtoMessage() {} func (x *KubernetesAgentUpgradeSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[17] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1454,14 +1882,28 @@ func (x *KubernetesAgentUpgradeSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use KubernetesAgentUpgradeSpec.ProtoReflect.Descriptor instead. func (*KubernetesAgentUpgradeSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{17} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{23} } -func (x *KubernetesAgentUpgradeSpec) GetImageResolver() ImageResolverType { +func (x *KubernetesAgentUpgradeSpec) GetImageResolver() KubernetesAgentUpgradeSpec_ImageResolver { if x != nil && x.ImageResolver != nil { return *x.ImageResolver } - return ImageResolverType_Noop + return KubernetesAgentUpgradeSpec_Noop +} + +func (x *KubernetesAgentUpgradeSpec) GetNamespace() string { + if x != nil && x.Namespace != nil { + return *x.Namespace + } + return "" +} + +func (x *KubernetesAgentUpgradeSpec) GetRepoOverride() string { + if x != nil && x.RepoOverride != nil { + return *x.RepoOverride + } + return "" } type RateLimitingSpec struct { @@ -1478,7 +1920,7 @@ type RateLimitingSpec struct { func (x *RateLimitingSpec) Reset() { *x = RateLimitingSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[18] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1491,7 +1933,7 @@ func (x *RateLimitingSpec) String() string { func (*RateLimitingSpec) ProtoMessage() {} func (x *RateLimitingSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[18] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1504,7 +1946,7 @@ func (x *RateLimitingSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use RateLimitingSpec.ProtoReflect.Descriptor instead. func (*RateLimitingSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{18} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{24} } func (x *RateLimitingSpec) GetRate() float64 { @@ -1537,7 +1979,7 @@ type AuthSpec struct { func (x *AuthSpec) Reset() { *x = AuthSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[19] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1550,7 +1992,7 @@ func (x *AuthSpec) String() string { func (*AuthSpec) ProtoMessage() {} func (x *AuthSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[19] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1563,7 +2005,7 @@ func (x *AuthSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use AuthSpec.ProtoReflect.Descriptor instead. func (*AuthSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{19} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{25} } func (x *AuthSpec) GetBackend() AuthSpec_Backend { @@ -1614,7 +2056,7 @@ type OpenIDAuthSpec struct { func (x *OpenIDAuthSpec) Reset() { *x = OpenIDAuthSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[20] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1627,7 +2069,7 @@ func (x *OpenIDAuthSpec) String() string { func (*OpenIDAuthSpec) ProtoMessage() {} func (x *OpenIDAuthSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[20] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1640,7 +2082,7 @@ func (x *OpenIDAuthSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenIDAuthSpec.ProtoReflect.Descriptor instead. func (*OpenIDAuthSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{20} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{26} } func (x *OpenIDAuthSpec) GetIssuer() string { @@ -1694,7 +2136,7 @@ type BasicAuthSpec struct { func (x *BasicAuthSpec) Reset() { *x = BasicAuthSpec{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[21] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1707,7 +2149,7 @@ func (x *BasicAuthSpec) String() string { func (*BasicAuthSpec) ProtoMessage() {} func (x *BasicAuthSpec) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[21] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1720,7 +2162,7 @@ func (x *BasicAuthSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use BasicAuthSpec.ProtoReflect.Descriptor instead. func (*BasicAuthSpec) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{21} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{27} } type SetRequest struct { @@ -1734,7 +2176,7 @@ type SetRequest struct { func (x *SetRequest) Reset() { *x = SetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[22] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1747,7 +2189,7 @@ func (x *SetRequest) String() string { func (*SetRequest) ProtoMessage() {} func (x *SetRequest) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[22] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1760,7 +2202,7 @@ func (x *SetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRequest.ProtoReflect.Descriptor instead. func (*SetRequest) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{22} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{28} } func (x *SetRequest) GetSpec() *GatewayConfigSpec { @@ -1783,7 +2225,7 @@ type ResetRequest struct { func (x *ResetRequest) Reset() { *x = ResetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[23] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1796,7 +2238,7 @@ func (x *ResetRequest) String() string { func (*ResetRequest) ProtoMessage() {} func (x *ResetRequest) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[23] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1809,7 +2251,7 @@ func (x *ResetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ResetRequest.ProtoReflect.Descriptor instead. func (*ResetRequest) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{23} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{29} } func (x *ResetRequest) GetRevision() *v1.Revision { @@ -1849,7 +2291,7 @@ type DryRunRequest struct { func (x *DryRunRequest) Reset() { *x = DryRunRequest{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[24] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1862,7 +2304,7 @@ func (x *DryRunRequest) String() string { func (*DryRunRequest) ProtoMessage() {} func (x *DryRunRequest) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[24] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1875,7 +2317,7 @@ func (x *DryRunRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DryRunRequest.ProtoReflect.Descriptor instead. func (*DryRunRequest) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{24} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{30} } func (x *DryRunRequest) GetTarget() driverutil.Target { @@ -1933,7 +2375,7 @@ type DryRunResponse struct { func (x *DryRunResponse) Reset() { *x = DryRunResponse{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[25] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1946,7 +2388,7 @@ func (x *DryRunResponse) String() string { func (*DryRunResponse) ProtoMessage() {} func (x *DryRunResponse) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[25] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1959,7 +2401,7 @@ func (x *DryRunResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DryRunResponse.ProtoReflect.Descriptor instead. func (*DryRunResponse) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{25} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{31} } func (x *DryRunResponse) GetCurrent() *GatewayConfigSpec { @@ -1994,7 +2436,7 @@ type HistoryResponse struct { func (x *HistoryResponse) Reset() { *x = HistoryResponse{} if protoimpl.UnsafeEnabled { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[26] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2007,7 +2449,7 @@ func (x *HistoryResponse) String() string { func (*HistoryResponse) ProtoMessage() {} func (x *HistoryResponse) ProtoReflect() protoreflect.Message { - mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[26] + mi := &file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2020,7 +2462,7 @@ func (x *HistoryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use HistoryResponse.ProtoReflect.Descriptor instead. func (*HistoryResponse) Descriptor() ([]byte, []int) { - return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{26} + return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP(), []int{32} } func (x *HistoryResponse) GetEntries() []*GatewayConfigSpec { @@ -2051,669 +2493,750 @@ var file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDesc = [] 0x1a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x6e, 0x69, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbb, 0x08, 0x0a, 0x11, 0x47, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x32, 0x0a, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x06, - 0x8a, 0xc0, 0x0c, 0x02, 0x28, 0x01, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x2d, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, - 0x3f, 0x0a, 0x0a, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x53, 0x70, 0x65, 0x63, 0x52, 0x0a, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x30, 0x0a, 0x05, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6c, 0x61, - 0x79, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x05, 0x72, 0x65, 0x6c, - 0x61, 0x79, 0x12, 0x33, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x48, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, - 0x06, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x3c, 0x0a, 0x09, 0x64, 0x61, 0x73, 0x68, 0x62, - 0x6f, 0x61, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x09, 0x64, 0x61, 0x73, 0x68, - 0x62, 0x6f, 0x61, 0x72, 0x64, 0x12, 0x30, 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x07, - 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x63, 0x65, 0x72, 0x74, 0x73, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x05, 0x63, 0x65, - 0x72, 0x74, 0x73, 0x12, 0x30, 0x0a, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x07, 0x70, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x07, 0x6b, 0x65, 0x79, 0x72, 0x69, 0x6e, 0x67, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x07, - 0x6b, 0x65, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x42, 0x0a, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0d, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x0c, 0x72, - 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x61, - 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0c, - 0x72, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x0a, 0x04, - 0x61, 0x75, 0x74, 0x68, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x42, - 0x06, 0x8a, 0xc0, 0x0c, 0x02, 0x28, 0x01, 0x52, 0x04, 0x61, 0x75, 0x74, 0x68, 0x3a, 0xe4, 0x02, - 0xba, 0x48, 0xe0, 0x02, 0x1a, 0xdd, 0x02, 0x0a, 0x1b, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, - 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x65, 0x73, 0x12, 0x2a, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x20, 0x6c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x20, 0x6d, - 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, - 0x1a, 0x91, 0x02, 0x5b, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x2c, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x2c, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, + 0x40, 0x0a, 0x14, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x57, 0x61, 0x74, 0x63, 0x68, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x69, 0x6e, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x62, 0x69, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, + 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x74, 0x68, + 0x73, 0x22, 0x40, 0x0a, 0x0e, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x22, 0x48, 0x0a, 0x0d, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x21, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xac, 0x08, + 0x0a, 0x11, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, + 0x70, 0x65, 0x63, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x06, 0x8a, 0xc0, 0x0c, 0x02, 0x28, 0x01, 0x52, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x06, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x0a, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0a, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x05, 0x72, 0x65, 0x6c, 0x61, 0x79, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x52, 0x05, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x33, 0x0a, 0x06, 0x68, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x06, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x3c, + 0x0a, 0x09, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, + 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, + 0x63, 0x52, 0x09, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x12, 0x30, 0x0a, 0x07, + 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x2a, + 0x0a, 0x05, 0x63, 0x65, 0x72, 0x74, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x73, 0x53, + 0x70, 0x65, 0x63, 0x52, 0x05, 0x63, 0x65, 0x72, 0x74, 0x73, 0x12, 0x30, 0x0a, 0x07, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x53, + 0x70, 0x65, 0x63, 0x52, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x07, + 0x6b, 0x65, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x79, 0x72, 0x69, 0x6e, + 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x33, + 0x0a, 0x08, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x52, 0x08, 0x75, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x0c, 0x72, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x69, 0x6e, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x69, + 0x6e, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0c, 0x72, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x0a, 0x04, 0x61, 0x75, 0x74, 0x68, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x75, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x42, 0x06, 0x8a, 0xc0, 0x0c, 0x02, 0x28, 0x01, 0x52, + 0x04, 0x61, 0x75, 0x74, 0x68, 0x3a, 0xe4, 0x02, 0xba, 0x48, 0xe0, 0x02, 0x1a, 0xdd, 0x02, 0x0a, + 0x1b, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x69, + 0x6e, 0x67, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x2a, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x20, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x1a, 0x91, 0x02, 0x5b, 0x20, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x20, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x20, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x20, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2e, 0x68, 0x74, 0x74, 0x70, - 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5d, 0x2e, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x61, 0x2c, 0x20, 0x21, 0x61, 0x2e, 0x65, 0x6e, 0x64, 0x73, - 0x57, 0x69, 0x74, 0x68, 0x28, 0x27, 0x3a, 0x30, 0x27, 0x29, 0x29, 0x2e, 0x75, 0x6e, 0x69, 0x71, - 0x75, 0x65, 0x28, 0x29, 0x22, 0xc6, 0x02, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x12, 0x84, 0x01, 0x0a, 0x11, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x51, 0xba, 0x48, 0x3c, 0xba, 0x01, 0x39, 0x0a, 0x1a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, - 0x68, 0x74, 0x74, 0x70, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, - 0x8a, 0xc0, 0x0c, 0x0e, 0x0a, 0x0c, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x3a, 0x38, 0x30, - 0x38, 0x30, 0x48, 0x00, 0x52, 0x11, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x84, 0x01, 0x0a, 0x11, 0x67, - 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x51, 0xba, 0x48, 0x3c, 0xba, 0x01, 0x39, 0x0a, 0x1a, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x6c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, - 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x0e, 0x0a, 0x0c, 0x30, 0x2e, 0x30, - 0x2e, 0x30, 0x2e, 0x30, 0x3a, 0x39, 0x30, 0x39, 0x30, 0x48, 0x01, 0x52, 0x11, 0x67, 0x72, 0x70, - 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, - 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x67, 0x72, 0x70, 0x63, - 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0xde, 0x04, - 0x0a, 0x14, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x83, 0x01, 0x0a, 0x11, 0x68, 0x74, 0x74, 0x70, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x50, 0xba, 0x48, 0x3a, 0xba, 0x01, 0x37, 0x0a, 0x18, 0x6d, 0x67, 0x6d, 0x74, - 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, - 0x29, 0x8a, 0xc0, 0x0c, 0x0f, 0x0a, 0x0d, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x3a, 0x31, - 0x31, 0x30, 0x38, 0x30, 0x48, 0x00, 0x52, 0x11, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x83, 0x01, 0x0a, - 0x11, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x50, 0xba, 0x48, 0x3a, 0xba, 0x01, 0x37, - 0x0a, 0x18, 0x6d, 0x67, 0x6d, 0x74, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x6c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, - 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x0f, 0x0a, 0x0d, 0x30, 0x2e, 0x30, - 0x2e, 0x30, 0x2e, 0x30, 0x3a, 0x31, 0x31, 0x30, 0x39, 0x30, 0x48, 0x01, 0x52, 0x11, 0x67, 0x72, - 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, - 0x01, 0x01, 0x12, 0xf8, 0x01, 0x0a, 0x10, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0xc6, 0x01, - 0xba, 0x48, 0xbc, 0x01, 0xba, 0x01, 0x3a, 0x0a, 0x1b, 0x6d, 0x67, 0x6d, 0x74, 0x5f, 0x67, 0x72, - 0x70, 0x63, 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, - 0x29, 0xba, 0x01, 0x7c, 0x0a, 0x20, 0x6d, 0x67, 0x6d, 0x74, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, - 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x2b, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, - 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x68, - 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x7a, 0x65, 0x72, 0x6f, 0x20, 0x70, - 0x6f, 0x72, 0x74, 0x1a, 0x2b, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6e, 0x64, 0x73, 0x57, - 0x69, 0x74, 0x68, 0x28, 0x27, 0x3a, 0x30, 0x27, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x65, 0x6e, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x28, 0x27, 0x3a, 0x27, 0x29, - 0x8a, 0xc0, 0x0c, 0x02, 0x28, 0x01, 0x48, 0x02, 0x52, 0x10, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, - 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, - 0x12, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x61, 0x64, - 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0xc0, - 0x03, 0x0a, 0x0f, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x12, 0x84, 0x01, 0x0a, 0x11, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x51, - 0xba, 0x48, 0x3b, 0xba, 0x01, 0x38, 0x0a, 0x19, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x67, 0x72, - 0x70, 0x63, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0x8a, 0xc0, - 0x0c, 0x0f, 0x0a, 0x0d, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x3a, 0x31, 0x31, 0x31, 0x39, - 0x30, 0x48, 0x00, 0x52, 0x11, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0xfa, 0x01, 0x0a, 0x10, 0x61, 0x64, - 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x42, 0xc8, 0x01, 0xba, 0x48, 0xbe, 0x01, 0xba, 0x01, 0x3b, 0x0a, 0x1c, - 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, - 0x74, 0x69, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1b, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0xba, 0x01, 0x7d, 0x0a, 0x21, 0x72, 0x65, - 0x6c, 0x61, 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, - 0x73, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x12, - 0x2b, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, - 0x6f, 0x6e, 0x2d, 0x7a, 0x65, 0x72, 0x6f, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x1a, 0x2b, 0x21, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6e, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x28, 0x27, 0x3a, 0x30, - 0x27, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6e, 0x64, 0x73, - 0x57, 0x69, 0x74, 0x68, 0x28, 0x27, 0x3a, 0x27, 0x29, 0x8a, 0xc0, 0x0c, 0x02, 0x28, 0x01, 0x48, - 0x01, 0x52, 0x10, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x13, 0x0a, 0x11, - 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x22, 0xaf, 0x01, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x84, 0x01, 0x0a, 0x11, 0x68, 0x74, 0x74, 0x70, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x51, 0xba, 0x48, 0x3c, 0xba, 0x01, 0x39, 0x0a, 0x1a, 0x68, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x0e, 0x0a, 0x0c, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x30, - 0x3a, 0x38, 0x30, 0x38, 0x36, 0x48, 0x00, 0x52, 0x11, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, - 0x12, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x22, 0x90, 0x05, 0x0a, 0x13, 0x44, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x88, 0x01, 0x0a, 0x11, + 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x68, 0x74, + 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, + 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x2c, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x6c, 0x61, 0x79, + 0x2e, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x2c, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x2e, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x2c, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, + 0x61, 0x72, 0x64, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x5d, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x61, 0x2c, + 0x20, 0x21, 0x61, 0x2e, 0x65, 0x6e, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x28, 0x27, 0x3a, 0x30, + 0x27, 0x29, 0x29, 0x2e, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x28, 0x29, 0x22, 0xda, 0x04, 0x0a, + 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x84, 0x01, 0x0a, 0x11, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x55, 0xba, 0x48, 0x3f, 0xba, 0x01, 0x3c, 0x0a, - 0x1d, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, - 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1b, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x0f, 0x0a, - 0x0d, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x3a, 0x31, 0x32, 0x30, 0x38, 0x30, 0x48, 0x00, - 0x52, 0x11, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x83, 0x02, 0x0a, 0x10, 0x61, 0x64, 0x76, 0x65, 0x72, - 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x42, 0xd1, 0x01, 0xba, 0x48, 0xc7, 0x01, 0xba, 0x01, 0x3f, 0x0a, 0x20, 0x64, 0x61, 0x73, - 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x61, 0x64, 0x76, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x51, 0xba, 0x48, 0x3c, 0xba, 0x01, 0x39, 0x0a, + 0x1a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x6c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1b, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x0e, 0x0a, 0x0c, 0x30, 0x2e, + 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x3a, 0x38, 0x30, 0x38, 0x30, 0x48, 0x00, 0x52, 0x11, 0x68, 0x74, + 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, + 0x01, 0x01, 0x12, 0x84, 0x01, 0x0a, 0x11, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x51, + 0xba, 0x48, 0x3c, 0xba, 0x01, 0x39, 0x0a, 0x1a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x67, + 0x72, 0x70, 0x63, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0x8a, + 0xc0, 0x0c, 0x0e, 0x0a, 0x0c, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x3a, 0x39, 0x30, 0x39, + 0x30, 0x48, 0x01, 0x52, 0x11, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0xfc, 0x01, 0x0a, 0x10, 0x61, 0x64, + 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x42, 0xca, 0x01, 0xba, 0x48, 0xc0, 0x01, 0xba, 0x01, 0x3c, 0x0a, 0x1d, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0xba, 0x01, 0x81, 0x01, 0x0a, 0x25, - 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x61, - 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x2b, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, - 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x68, 0x61, - 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x7a, 0x65, 0x72, 0x6f, 0x20, 0x70, 0x6f, - 0x72, 0x74, 0x1a, 0x2b, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6e, 0x64, 0x73, 0x57, 0x69, - 0x74, 0x68, 0x28, 0x27, 0x3a, 0x30, 0x27, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x65, 0x6e, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x28, 0x27, 0x3a, 0x27, 0x29, 0x8a, - 0xc0, 0x0c, 0x02, 0x28, 0x01, 0x48, 0x01, 0x52, 0x10, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, - 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x08, - 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, - 0xba, 0x48, 0x04, 0x72, 0x02, 0x68, 0x01, 0x48, 0x02, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, - 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x85, 0x01, 0x0a, 0x0e, 0x74, 0x72, 0x75, 0x73, 0x74, - 0x65, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x42, - 0x5d, 0xba, 0x48, 0x5a, 0x92, 0x01, 0x57, 0x22, 0x55, 0xba, 0x01, 0x52, 0x0a, 0x0a, 0x69, 0x70, - 0x5f, 0x6f, 0x72, 0x5f, 0x63, 0x69, 0x64, 0x72, 0x12, 0x22, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, - 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x49, 0x50, 0x20, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x43, 0x49, 0x44, 0x52, 0x1a, 0x20, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x69, 0x73, 0x49, 0x70, 0x28, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x69, 0x73, 0x49, 0x70, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x28, 0x29, 0x52, 0x0e, - 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x69, 0x65, 0x73, 0x42, 0x14, - 0x0a, 0x12, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, + 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0xba, 0x01, 0x7e, 0x0a, 0x22, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, + 0x74, 0x69, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x6f, 0x72, + 0x74, 0x12, 0x2b, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x20, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, + 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x7a, 0x65, 0x72, 0x6f, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x1a, 0x2b, + 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6e, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x28, 0x27, + 0x3a, 0x30, 0x27, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6e, + 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x28, 0x27, 0x3a, 0x27, 0x29, 0x8a, 0xc0, 0x0c, 0x02, 0x28, + 0x01, 0x48, 0x02, 0x52, 0x10, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x68, 0x74, 0x74, + 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x14, + 0x0a, 0x12, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, - 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x68, 0x6f, - 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xc9, 0x03, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x4c, 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, - 0x6e, 0x64, 0x42, 0x12, 0xba, 0x48, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x8a, 0xc0, 0x0c, 0x06, - 0x0a, 0x04, 0x45, 0x74, 0x63, 0x64, 0x48, 0x00, 0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, - 0x64, 0x88, 0x01, 0x01, 0x12, 0x48, 0x0a, 0x04, 0x65, 0x74, 0x63, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x45, - 0x74, 0x63, 0x64, 0x53, 0x70, 0x65, 0x63, 0x42, 0x1f, 0xba, 0x48, 0x1c, 0xda, 0x01, 0x19, 0x0a, - 0x04, 0x65, 0x74, 0x63, 0x64, 0x1a, 0x11, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x52, 0x04, 0x65, 0x74, 0x63, 0x64, 0x12, 0x5c, - 0x0a, 0x09, 0x6a, 0x65, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x65, - 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x42, 0x24, 0xba, 0x48, 0x21, - 0xda, 0x01, 0x1e, 0x0a, 0x09, 0x6a, 0x65, 0x74, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x1a, 0x11, - 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x21, 0x3d, 0x20, - 0x31, 0x52, 0x09, 0x6a, 0x65, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x3a, 0xb7, 0x01, 0xba, - 0x48, 0xb3, 0x01, 0x1a, 0xb0, 0x01, 0x0a, 0x1a, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, - 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x65, 0x64, 0x12, 0x3d, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x73, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x6d, 0x75, 0x73, - 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, - 0x74, 0x1a, 0x53, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, - 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x65, 0x74, 0x63, 0x64, 0x29, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x20, 0x26, - 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6a, 0x65, 0x74, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x29, 0x29, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, - 0x6e, 0x64, 0x22, 0x66, 0x0a, 0x08, 0x45, 0x74, 0x63, 0x64, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2f, - 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x42, 0x11, 0xba, 0x48, 0x0e, 0x92, 0x01, 0x0b, 0x08, 0x01, 0x18, 0x01, 0x22, 0x05, 0x72, - 0x03, 0x90, 0x01, 0x01, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, - 0x29, 0x0a, 0x05, 0x63, 0x65, 0x72, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x53, - 0x70, 0x65, 0x63, 0x52, 0x05, 0x63, 0x65, 0x72, 0x74, 0x73, 0x22, 0x9f, 0x0b, 0x0a, 0x08, 0x4d, - 0x54, 0x4c, 0x53, 0x53, 0x70, 0x65, 0x63, 0x12, 0x1f, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x43, 0x41, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x43, 0x41, 0x88, 0x01, 0x01, 0x12, 0x5e, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, - 0xba, 0x48, 0x2c, 0xba, 0x01, 0x29, 0x0a, 0x13, 0x78, 0x35, 0x30, 0x39, 0x5f, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x12, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x78, 0x35, 0x30, 0x39, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x29, 0x8a, - 0xc0, 0x0c, 0x02, 0x18, 0x01, 0x48, 0x01, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, - 0x41, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x43, 0x41, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x08, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x43, 0x41, 0x88, 0x01, 0x01, 0x12, 0x5e, 0x0a, 0x0c, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x35, 0xba, 0x48, 0x2c, 0xba, 0x01, 0x29, 0x0a, 0x13, 0x78, 0x35, 0x30, 0x39, 0x5f, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x12, 0x74, 0x68, + 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0xde, 0x04, 0x0a, 0x14, 0x4d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x12, 0x83, 0x01, 0x0a, 0x11, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x50, + 0xba, 0x48, 0x3a, 0xba, 0x01, 0x37, 0x0a, 0x18, 0x6d, 0x67, 0x6d, 0x74, 0x5f, 0x68, 0x74, 0x74, + 0x70, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0x8a, 0xc0, 0x0c, + 0x0f, 0x0a, 0x0d, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x3a, 0x31, 0x31, 0x30, 0x38, 0x30, + 0x48, 0x00, 0x52, 0x11, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x83, 0x01, 0x0a, 0x11, 0x67, 0x72, 0x70, + 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x50, 0xba, 0x48, 0x3a, 0xba, 0x01, 0x37, 0x0a, 0x18, 0x6d, 0x67, + 0x6d, 0x74, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x0f, 0x0a, 0x0d, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x30, + 0x3a, 0x31, 0x31, 0x30, 0x39, 0x30, 0x48, 0x01, 0x52, 0x11, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0xf8, + 0x01, 0x0a, 0x10, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0xc6, 0x01, 0xba, 0x48, 0xbc, 0x01, + 0xba, 0x01, 0x3a, 0x0a, 0x1b, 0x6d, 0x67, 0x6d, 0x74, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, + 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0xba, 0x01, 0x7c, + 0x0a, 0x20, 0x6d, 0x67, 0x6d, 0x74, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x64, 0x76, 0x65, + 0x72, 0x74, 0x69, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x6f, + 0x72, 0x74, 0x12, 0x2b, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x20, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, + 0x61, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x7a, 0x65, 0x72, 0x6f, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x1a, + 0x2b, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6e, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x28, + 0x27, 0x3a, 0x30, 0x27, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, + 0x6e, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x28, 0x27, 0x3a, 0x27, 0x29, 0x8a, 0xc0, 0x0c, 0x02, + 0x28, 0x01, 0x48, 0x02, 0x52, 0x10, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x68, 0x74, + 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, + 0x14, 0x0a, 0x12, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, + 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0xc0, 0x03, 0x0a, 0x0f, 0x52, + 0x65, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x84, + 0x01, 0x0a, 0x11, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x51, 0xba, 0x48, 0x3b, 0xba, + 0x01, 0x38, 0x0a, 0x19, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x6c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1b, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x0f, 0x0a, 0x0d, + 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x3a, 0x31, 0x31, 0x31, 0x39, 0x30, 0x48, 0x00, 0x52, + 0x11, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0xfa, 0x01, 0x0a, 0x10, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, + 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x42, 0xc8, 0x01, 0xba, 0x48, 0xbe, 0x01, 0xba, 0x01, 0x3b, 0x0a, 0x1c, 0x72, 0x65, 0x6c, 0x61, + 0x79, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, + 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x28, 0x29, 0xba, 0x01, 0x7d, 0x0a, 0x21, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x5f, + 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x2b, 0x61, 0x64, 0x76, + 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6d, + 0x75, 0x73, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x7a, + 0x65, 0x72, 0x6f, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x1a, 0x2b, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x65, 0x6e, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x28, 0x27, 0x3a, 0x30, 0x27, 0x29, 0x20, 0x26, + 0x26, 0x20, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6e, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, + 0x28, 0x27, 0x3a, 0x27, 0x29, 0x8a, 0xc0, 0x0c, 0x02, 0x28, 0x01, 0x48, 0x01, 0x52, 0x10, 0x61, + 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, + 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x61, 0x64, 0x76, + 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0xaf, 0x01, + 0x0a, 0x10, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x12, 0x84, 0x01, 0x0a, 0x11, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x51, + 0xba, 0x48, 0x3c, 0xba, 0x01, 0x39, 0x0a, 0x1a, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x68, + 0x74, 0x74, 0x70, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0x8a, + 0xc0, 0x0c, 0x0e, 0x0a, 0x0c, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x30, 0x3a, 0x38, 0x30, 0x38, + 0x36, 0x48, 0x00, 0x52, 0x11, 0x68, 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x68, 0x74, + 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, + 0x90, 0x05, 0x0a, 0x13, 0x44, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x88, 0x01, 0x0a, 0x11, 0x68, 0x74, 0x74, 0x70, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x55, 0xba, 0x48, 0x3f, 0xba, 0x01, 0x3c, 0x0a, 0x1d, 0x64, 0x61, 0x73, + 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x6c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x0f, 0x0a, 0x0d, 0x30, 0x2e, 0x30, + 0x2e, 0x30, 0x2e, 0x30, 0x3a, 0x31, 0x32, 0x30, 0x38, 0x30, 0x48, 0x00, 0x52, 0x11, 0x68, 0x74, + 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, + 0x01, 0x01, 0x12, 0x83, 0x02, 0x0a, 0x10, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xd1, 0x01, + 0xba, 0x48, 0xc7, 0x01, 0xba, 0x01, 0x3f, 0x0a, 0x20, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, + 0x72, 0x64, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, + 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x1b, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x28, 0x29, 0xba, 0x01, 0x81, 0x01, 0x0a, 0x25, 0x64, 0x61, 0x73, 0x68, + 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, + 0x74, 0x69, 0x73, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x6f, 0x72, + 0x74, 0x12, 0x2b, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x20, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, + 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x7a, 0x65, 0x72, 0x6f, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x1a, 0x2b, + 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6e, 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x28, 0x27, + 0x3a, 0x30, 0x27, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x6e, + 0x64, 0x73, 0x57, 0x69, 0x74, 0x68, 0x28, 0x27, 0x3a, 0x27, 0x29, 0x8a, 0xc0, 0x0c, 0x02, 0x28, + 0x01, 0x48, 0x01, 0x52, 0x10, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xba, 0x48, 0x04, 0x72, + 0x02, 0x68, 0x01, 0x48, 0x02, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x88, + 0x01, 0x01, 0x12, 0x85, 0x01, 0x0a, 0x0e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x50, 0x72, + 0x6f, 0x78, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x42, 0x5d, 0xba, 0x48, 0x5a, + 0x92, 0x01, 0x57, 0x22, 0x55, 0xba, 0x01, 0x52, 0x0a, 0x0a, 0x69, 0x70, 0x5f, 0x6f, 0x72, 0x5f, + 0x63, 0x69, 0x64, 0x72, 0x12, 0x22, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x49, 0x50, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x20, 0x6f, 0x72, 0x20, 0x43, 0x49, 0x44, 0x52, 0x1a, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, + 0x73, 0x49, 0x70, 0x28, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, + 0x49, 0x70, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x28, 0x29, 0x52, 0x0e, 0x74, 0x72, 0x75, 0x73, + 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x69, 0x65, 0x73, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x68, + 0x74, 0x74, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0xc9, 0x03, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x70, + 0x65, 0x63, 0x12, 0x4c, 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x42, 0x12, + 0xba, 0x48, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x8a, 0xc0, 0x0c, 0x06, 0x0a, 0x04, 0x45, 0x74, + 0x63, 0x64, 0x48, 0x00, 0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x88, 0x01, 0x01, + 0x12, 0x48, 0x0a, 0x04, 0x65, 0x74, 0x63, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x63, 0x64, 0x53, + 0x70, 0x65, 0x63, 0x42, 0x1f, 0xba, 0x48, 0x1c, 0xda, 0x01, 0x19, 0x0a, 0x04, 0x65, 0x74, 0x63, + 0x64, 0x1a, 0x11, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, + 0x21, 0x3d, 0x20, 0x30, 0x52, 0x04, 0x65, 0x74, 0x63, 0x64, 0x12, 0x5c, 0x0a, 0x09, 0x6a, 0x65, + 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x65, 0x74, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x42, 0x24, 0xba, 0x48, 0x21, 0xda, 0x01, 0x1e, 0x0a, + 0x09, 0x6a, 0x65, 0x74, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x1a, 0x11, 0x74, 0x68, 0x69, 0x73, + 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x21, 0x3d, 0x20, 0x31, 0x52, 0x09, 0x6a, + 0x65, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x3a, 0xb7, 0x01, 0xba, 0x48, 0xb3, 0x01, 0x1a, + 0xb0, 0x01, 0x0a, 0x1a, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x12, 0x3d, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x20, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x68, 0x61, + 0x76, 0x65, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x1a, 0x53, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x20, + 0x30, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x65, 0x74, + 0x63, 0x64, 0x29, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, + 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x6a, 0x65, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x29, 0x29, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x22, 0x66, + 0x0a, 0x08, 0x45, 0x74, 0x63, 0x64, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2f, 0x0a, 0x09, 0x65, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x11, 0xba, + 0x48, 0x0e, 0x92, 0x01, 0x0b, 0x08, 0x01, 0x18, 0x01, 0x22, 0x05, 0x72, 0x03, 0x90, 0x01, 0x01, + 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x63, + 0x65, 0x72, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x53, 0x70, 0x65, 0x63, 0x52, + 0x05, 0x63, 0x65, 0x72, 0x74, 0x73, 0x22, 0x9f, 0x0b, 0x0a, 0x08, 0x4d, 0x54, 0x4c, 0x53, 0x53, + 0x70, 0x65, 0x63, 0x12, 0x1f, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, + 0x41, 0x88, 0x01, 0x01, 0x12, 0x5e, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, + 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, 0xba, 0x48, 0x2c, 0xba, + 0x01, 0x29, 0x0a, 0x13, 0x78, 0x35, 0x30, 0x39, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, + 0x63, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x12, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x78, 0x35, + 0x30, 0x39, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x02, 0x18, + 0x01, 0x48, 0x01, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, 0x44, 0x61, 0x74, + 0x61, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x41, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x43, 0x41, 0x88, 0x01, 0x01, 0x12, 0x5e, 0x0a, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, + 0x41, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, 0xba, 0x48, 0x2c, + 0xba, 0x01, 0x29, 0x0a, 0x13, 0x78, 0x35, 0x30, 0x39, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x5f, 0x63, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x12, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x78, + 0x35, 0x30, 0x39, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x02, + 0x18, 0x01, 0x48, 0x03, 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x41, 0x44, 0x61, + 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, + 0x65, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x0a, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, 0x64, 0x0a, 0x0e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x37, 0xba, 0x48, 0x2e, 0xba, 0x01, 0x2b, 0x0a, 0x15, 0x78, 0x35, 0x30, 0x39, + 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, + 0x61, 0x1a, 0x12, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x78, 0x35, 0x30, 0x39, 0x49, 0x73, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x02, 0x18, 0x01, 0x48, 0x05, 0x52, 0x0e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, + 0x12, 0x21, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, + 0x88, 0x01, 0x01, 0x12, 0x5f, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, + 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x34, 0xba, 0x48, 0x2b, 0xba, + 0x01, 0x28, 0x0a, 0x13, 0x70, 0x65, 0x6d, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6b, + 0x65, 0x79, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x11, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x70, 0x65, + 0x6d, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x02, 0x18, 0x01, + 0x48, 0x07, 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x44, 0x61, 0x74, + 0x61, 0x88, 0x01, 0x01, 0x3a, 0x83, 0x06, 0xba, 0x48, 0xff, 0x05, 0x1a, 0x8e, 0x01, 0x0a, 0x22, + 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x5f, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x63, 0x61, 0x12, 0x37, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x43, 0x41, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, + 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, + 0x79, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0x2f, 0x21, 0x28, 0x68, + 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, + 0x29, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x1a, 0x8e, 0x01, 0x0a, + 0x22, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, + 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x63, 0x61, 0x12, 0x37, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x20, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x43, 0x41, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, + 0x41, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, + 0x6c, 0x79, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0x2f, 0x21, 0x28, + 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, + 0x41, 0x29, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x1a, 0x98, 0x01, + 0x0a, 0x24, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, + 0x79, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x63, 0x65, 0x72, 0x74, 0x12, 0x3b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x20, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x72, 0x65, + 0x20, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, + 0x69, 0x76, 0x65, 0x1a, 0x33, 0x21, 0x28, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x68, + 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, + 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x1a, 0x93, 0x01, 0x0a, 0x23, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x73, 0x5f, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x5f, 0x65, 0x78, 0x63, + 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x6b, 0x65, 0x79, + 0x12, 0x39, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, + 0x65, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, + 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, + 0x79, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0x31, 0x21, 0x28, 0x68, + 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, + 0x79, 0x29, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x1a, 0xa9, + 0x01, 0x0a, 0x19, 0x78, 0x35, 0x30, 0x39, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x1a, 0x8b, 0x01, 0x28, + 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, + 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x29, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, 0x44, 0x61, 0x74, + 0x61, 0x29, 0x29, 0x3f, 0x20, 0x78, 0x35, 0x30, 0x39, 0x50, 0x61, 0x72, 0x73, 0x65, 0x28, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, + 0x74, 0x61, 0x29, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x28, 0x78, 0x35, 0x30, 0x39, 0x50, 0x61, 0x72, 0x73, 0x65, + 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, 0x44, 0x61, + 0x74, 0x61, 0x29, 0x29, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x43, 0x41, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x43, 0x65, 0x72, 0x74, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x4b, 0x65, 0x79, 0x44, 0x61, 0x74, 0x61, 0x22, 0x8c, 0x01, 0x0a, 0x0d, 0x4a, 0x65, 0x74, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2c, 0x0a, 0x08, 0x65, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xba, 0x48, + 0x08, 0xc8, 0x01, 0x01, 0x72, 0x03, 0x90, 0x01, 0x01, 0x48, 0x00, 0x52, 0x08, 0x65, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x0c, 0x6e, 0x6b, 0x65, 0x79, + 0x53, 0x65, 0x65, 0x64, 0x50, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, + 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x48, 0x01, 0x52, 0x0c, 0x6e, 0x6b, 0x65, 0x79, 0x53, 0x65, + 0x65, 0x64, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x6b, 0x65, 0x79, 0x53, + 0x65, 0x65, 0x64, 0x50, 0x61, 0x74, 0x68, 0x22, 0xe4, 0x08, 0x0a, 0x09, 0x43, 0x65, 0x72, 0x74, + 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x1b, 0x0a, 0x06, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x88, + 0x01, 0x01, 0x12, 0x58, 0x0a, 0x0a, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x33, 0xba, 0x48, 0x2a, 0xba, 0x01, 0x27, 0x0a, 0x11, + 0x78, 0x35, 0x30, 0x39, 0x5f, 0x63, 0x61, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, + 0x61, 0x1a, 0x12, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x78, 0x35, 0x30, 0x39, 0x49, 0x73, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x02, 0x18, 0x01, 0x48, 0x01, 0x52, 0x0a, 0x63, + 0x61, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x02, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, + 0x88, 0x01, 0x01, 0x12, 0x67, 0x0a, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, + 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x38, 0xba, 0x48, + 0x2f, 0xba, 0x01, 0x2c, 0x0a, 0x16, 0x78, 0x35, 0x30, 0x39, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x6e, 0x67, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x12, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x78, 0x35, 0x30, 0x39, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x29, - 0x8a, 0xc0, 0x0c, 0x02, 0x18, 0x01, 0x48, 0x03, 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, - 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, 0x64, - 0x0a, 0x0e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x37, 0xba, 0x48, 0x2e, 0xba, 0x01, 0x2b, 0x0a, 0x15, - 0x78, 0x35, 0x30, 0x39, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x65, 0x72, 0x74, - 0x5f, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x12, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x78, 0x35, 0x30, 0x39, - 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x02, 0x18, 0x01, 0x48, - 0x05, 0x52, 0x0e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, - 0x61, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, - 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x4b, 0x65, 0x79, 0x88, 0x01, 0x01, 0x12, 0x5f, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x4b, 0x65, 0x79, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x34, - 0xba, 0x48, 0x2b, 0xba, 0x01, 0x28, 0x0a, 0x13, 0x70, 0x65, 0x6d, 0x5f, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x11, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x70, 0x65, 0x6d, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x29, 0x8a, 0xc0, - 0x0c, 0x02, 0x18, 0x01, 0x48, 0x07, 0x52, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, - 0x79, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x3a, 0x83, 0x06, 0xba, 0x48, 0xff, 0x05, 0x1a, - 0x8e, 0x01, 0x0a, 0x22, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x6d, 0x75, 0x74, 0x75, 0x61, + 0x8a, 0xc0, 0x0c, 0x02, 0x18, 0x01, 0x48, 0x03, 0x52, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, + 0x67, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x04, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x88, 0x01, + 0x01, 0x12, 0x62, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x44, + 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, 0xba, 0x48, 0x2c, 0xba, 0x01, + 0x29, 0x0a, 0x14, 0x70, 0x65, 0x6d, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x5f, 0x6b, + 0x65, 0x79, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x11, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x70, 0x65, + 0x6d, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x02, 0x18, 0x01, + 0x48, 0x05, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x44, 0x61, + 0x74, 0x61, 0x88, 0x01, 0x01, 0x3a, 0xe6, 0x04, 0xba, 0x48, 0xe2, 0x04, 0x1a, 0x80, 0x01, 0x0a, + 0x1c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, + 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x61, 0x12, 0x33, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x73, 0x20, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x72, 0x65, 0x20, + 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, + 0x76, 0x65, 0x1a, 0x2b, 0x21, 0x28, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, + 0x61, 0x43, 0x65, 0x72, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x1a, + 0x9d, 0x01, 0x0a, 0x25, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x63, 0x61, 0x12, 0x37, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x20, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x74, - 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, - 0x2f, 0x21, 0x28, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x43, 0x41, 0x29, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, - 0x1a, 0x8e, 0x01, 0x0a, 0x22, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x6d, 0x75, 0x74, 0x75, - 0x61, 0x6c, 0x6c, 0x79, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x63, 0x61, 0x12, 0x37, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x20, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x41, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x75, - 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, - 0x1a, 0x2f, 0x21, 0x28, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x43, 0x41, 0x29, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, 0x29, - 0x29, 0x1a, 0x98, 0x01, 0x0a, 0x24, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x6d, 0x75, 0x74, - 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x63, 0x65, 0x72, 0x74, 0x12, 0x3b, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x73, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, - 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, - 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0x33, 0x21, 0x28, 0x68, 0x61, 0x73, 0x28, 0x74, - 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x29, 0x20, - 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x1a, 0x93, 0x01, 0x0a, - 0x23, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, - 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x6b, 0x65, 0x79, 0x12, 0x39, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x20, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x4b, 0x65, 0x79, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x74, - 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, - 0x31, 0x21, 0x28, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x29, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x44, 0x61, 0x74, 0x61, - 0x29, 0x29, 0x1a, 0xa9, 0x01, 0x0a, 0x19, 0x78, 0x35, 0x30, 0x39, 0x5f, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x65, 0x72, 0x74, - 0x1a, 0x8b, 0x01, 0x28, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x29, 0x20, 0x26, 0x26, 0x20, - 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, - 0x41, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x3f, 0x20, 0x78, 0x35, 0x30, 0x39, 0x50, 0x61, 0x72, - 0x73, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, - 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x29, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x28, 0x78, 0x35, 0x30, 0x39, 0x50, - 0x61, 0x72, 0x73, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0x42, 0x0b, - 0x0a, 0x09, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, 0x42, 0x0b, 0x0a, 0x09, - 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x41, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x43, 0x41, 0x44, 0x61, 0x74, 0x61, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x42, 0x0c, 0x0a, 0x0a, - 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x44, 0x61, 0x74, 0x61, 0x22, 0x8c, 0x01, 0x0a, - 0x0d, 0x4a, 0x65, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2c, - 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x0b, 0xba, 0x48, 0x08, 0xc8, 0x01, 0x01, 0x72, 0x03, 0x90, 0x01, 0x01, 0x48, 0x00, 0x52, - 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x0c, - 0x6e, 0x6b, 0x65, 0x79, 0x53, 0x65, 0x65, 0x64, 0x50, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x48, 0x01, 0x52, 0x0c, 0x6e, 0x6b, - 0x65, 0x79, 0x53, 0x65, 0x65, 0x64, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, - 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, - 0x6b, 0x65, 0x79, 0x53, 0x65, 0x65, 0x64, 0x50, 0x61, 0x74, 0x68, 0x22, 0xe4, 0x08, 0x0a, 0x09, - 0x43, 0x65, 0x72, 0x74, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x1b, 0x0a, 0x06, 0x63, 0x61, 0x43, - 0x65, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x63, 0x61, 0x43, - 0x65, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, 0x58, 0x0a, 0x0a, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, - 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x33, 0xba, 0x48, 0x2a, 0xba, - 0x01, 0x27, 0x0a, 0x11, 0x78, 0x35, 0x30, 0x39, 0x5f, 0x63, 0x61, 0x5f, 0x63, 0x65, 0x72, 0x74, - 0x5f, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x12, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x78, 0x35, 0x30, 0x39, - 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x02, 0x18, 0x01, 0x48, - 0x01, 0x52, 0x0a, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, - 0x12, 0x25, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, - 0x43, 0x65, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, 0x67, 0x0a, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x38, 0xba, 0x48, 0x2f, 0xba, 0x01, 0x2c, 0x0a, 0x16, 0x78, 0x35, 0x30, 0x39, 0x5f, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, - 0x1a, 0x12, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x78, 0x35, 0x30, 0x39, 0x49, 0x73, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x28, 0x29, 0x8a, 0xc0, 0x0c, 0x02, 0x18, 0x01, 0x48, 0x03, 0x52, 0x0f, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, - 0x12, 0x23, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, - 0x65, 0x79, 0x88, 0x01, 0x01, 0x12, 0x62, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, - 0x4b, 0x65, 0x79, 0x44, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x35, 0xba, - 0x48, 0x2c, 0xba, 0x01, 0x29, 0x0a, 0x14, 0x70, 0x65, 0x6d, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x6e, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x11, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x70, 0x65, 0x6d, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x29, 0x8a, 0xc0, - 0x0c, 0x02, 0x18, 0x01, 0x48, 0x05, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, - 0x65, 0x79, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x3a, 0xe6, 0x04, 0xba, 0x48, 0xe2, 0x04, - 0x1a, 0x80, 0x01, 0x0a, 0x1c, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x6d, 0x75, 0x74, 0x75, - 0x61, 0x6c, 0x6c, 0x79, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x63, - 0x61, 0x12, 0x33, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x20, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x20, - 0x61, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x63, - 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0x2b, 0x21, 0x28, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, - 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, - 0x61, 0x29, 0x29, 0x1a, 0x9d, 0x01, 0x0a, 0x25, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x6d, - 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, - 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x63, 0x65, 0x72, 0x74, 0x12, 0x3d, 0x66, - 0x69, 0x65, 0x6c, 0x64, 0x73, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, - 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, - 0x74, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, - 0x6c, 0x79, 0x20, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0x35, 0x21, 0x28, - 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, - 0x43, 0x65, 0x72, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, - 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, - 0x61, 0x29, 0x29, 0x1a, 0x98, 0x01, 0x0a, 0x24, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x6d, - 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, - 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x6b, 0x65, 0x79, 0x12, 0x3b, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x73, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x44, 0x61, - 0x74, 0x61, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, - 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0x33, 0x21, 0x28, 0x68, 0x61, 0x73, - 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, + 0x72, 0x76, 0x69, 0x6e, 0x67, 0x63, 0x65, 0x72, 0x74, 0x12, 0x3d, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x73, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, + 0x61, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0x35, 0x21, 0x28, 0x68, 0x61, 0x73, 0x28, + 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x29, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x1a, 0xa1, - 0x01, 0x0a, 0x13, 0x78, 0x35, 0x30, 0x39, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x1a, 0x89, 0x01, 0x28, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, - 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, - 0x74, 0x61, 0x29, 0x20, 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x3f, 0x20, 0x78, 0x35, - 0x30, 0x39, 0x50, 0x61, 0x72, 0x73, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x29, 0x2e, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, - 0x28, 0x78, 0x35, 0x30, 0x39, 0x50, 0x61, 0x72, 0x73, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x3a, 0x20, 0x74, 0x72, - 0x75, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x42, 0x0e, 0x0a, 0x0c, - 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x42, 0x12, 0x0a, 0x10, - 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, - 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x42, - 0x11, 0x0a, 0x0f, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x44, 0x61, - 0x74, 0x61, 0x22, 0xd4, 0x02, 0x0a, 0x0b, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x53, 0x70, - 0x65, 0x63, 0x12, 0x38, 0x0a, 0x03, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x21, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x8a, 0xc0, 0x0c, 0x17, 0x0a, 0x15, 0x2f, 0x76, 0x61, + 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x1a, + 0x98, 0x01, 0x0a, 0x24, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x5f, 0x6d, 0x75, 0x74, 0x75, 0x61, + 0x6c, 0x6c, 0x79, 0x5f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x6e, 0x67, 0x6b, 0x65, 0x79, 0x12, 0x3b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, + 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x44, 0x61, 0x74, 0x61, 0x20, 0x61, + 0x72, 0x65, 0x20, 0x6d, 0x75, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x63, 0x6c, + 0x75, 0x73, 0x69, 0x76, 0x65, 0x1a, 0x33, 0x21, 0x28, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x29, 0x20, 0x26, 0x26, + 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, + 0x67, 0x4b, 0x65, 0x79, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x1a, 0xa1, 0x01, 0x0a, 0x13, 0x78, + 0x35, 0x30, 0x39, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x1a, 0x89, 0x01, 0x28, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x29, 0x20, + 0x26, 0x26, 0x20, 0x68, 0x61, 0x73, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x43, 0x65, + 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x3f, 0x20, 0x78, 0x35, 0x30, 0x39, 0x50, 0x61, + 0x72, 0x73, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, + 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x29, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x53, + 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x28, 0x78, 0x35, 0x30, + 0x39, 0x50, 0x61, 0x72, 0x73, 0x65, 0x28, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x43, 0x65, + 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x29, 0x29, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0x42, 0x09, + 0x0a, 0x07, 0x5f, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x61, + 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x6e, 0x67, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x42, 0x0d, 0x0a, 0x0b, + 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x42, 0x11, 0x0a, 0x0f, 0x5f, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x44, 0x61, 0x74, 0x61, 0x22, 0xd4, + 0x02, 0x0a, 0x0b, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x38, + 0x0a, 0x03, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x21, 0xba, 0x48, 0x03, + 0xc8, 0x01, 0x01, 0x8a, 0xc0, 0x0c, 0x17, 0x0a, 0x15, 0x2f, 0x76, 0x61, 0x72, 0x2f, 0x6c, 0x69, + 0x62, 0x2f, 0x6f, 0x70, 0x6e, 0x69, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x48, 0x00, + 0x52, 0x03, 0x64, 0x69, 0x72, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x73, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x2a, 0x0a, 0x05, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x70, 0x65, + 0x63, 0x52, 0x05, 0x63, 0x61, 0x63, 0x68, 0x65, 0x3a, 0xa2, 0x01, 0xba, 0x48, 0x9e, 0x01, 0x1a, + 0x9b, 0x01, 0x0a, 0x12, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x64, 0x69, 0x72, 0x73, 0x5f, + 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x12, 0x3d, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x20, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x64, 0x69, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x69, + 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x64, + 0x69, 0x72, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x73, 0x61, 0x6d, 0x65, 0x1a, 0x46, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x3f, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x64, 0x69, 0x72, 0x20, 0x21, 0x3d, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x64, 0x69, 0x72, 0x20, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0x42, 0x06, 0x0a, + 0x04, 0x5f, 0x64, 0x69, 0x72, 0x22, 0x80, 0x01, 0x0a, 0x0d, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x6f, 0x0a, 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x55, 0xba, 0x48, 0x52, 0x92, 0x01, 0x4f, + 0x22, 0x4d, 0xba, 0x01, 0x4a, 0x0a, 0x0e, 0x67, 0x6f, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x5f, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, + 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x67, 0x6f, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x20, 0x70, 0x61, 0x74, 0x68, 0x1a, 0x18, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x69, 0x73, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x28, 0x29, 0x52, + 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x22, 0xd0, 0x01, 0x0a, 0x09, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x50, 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, + 0x42, 0x18, 0xba, 0x48, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x8a, 0xc0, 0x0c, 0x0c, 0x0a, 0x0a, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x48, 0x00, 0x52, 0x07, 0x62, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x65, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x70, 0x65, 0x63, 0x42, 0x25, 0xba, 0x48, + 0x22, 0xda, 0x01, 0x1f, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x1a, 0x11, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x21, + 0x3d, 0x20, 0x30, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x42, + 0x0a, 0x0a, 0x08, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x22, 0x5c, 0x0a, 0x13, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x70, + 0x65, 0x63, 0x12, 0x3d, 0x0a, 0x03, 0x64, 0x69, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x26, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x8a, 0xc0, 0x0c, 0x1c, 0x0a, 0x1a, 0x2f, 0x76, 0x61, 0x72, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x6f, 0x70, 0x6e, 0x69, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x73, 0x48, 0x00, 0x52, 0x03, 0x64, 0x69, 0x72, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x07, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, - 0x12, 0x2a, 0x0a, 0x05, 0x63, 0x61, 0x63, 0x68, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x63, 0x68, - 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x05, 0x63, 0x61, 0x63, 0x68, 0x65, 0x3a, 0xa2, 0x01, 0xba, - 0x48, 0x9e, 0x01, 0x1a, 0x9b, 0x01, 0x0a, 0x12, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x64, - 0x69, 0x72, 0x73, 0x5f, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x12, 0x3d, 0x70, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x64, 0x69, 0x72, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x63, 0x61, 0x63, - 0x68, 0x65, 0x20, 0x64, 0x69, 0x72, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x1a, 0x46, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x3d, 0x3d, - 0x20, 0x30, 0x20, 0x3f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, - 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x64, 0x69, 0x72, 0x20, 0x21, - 0x3d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x64, 0x69, 0x72, 0x20, 0x3a, 0x20, 0x74, 0x72, 0x75, - 0x65, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x64, 0x69, 0x72, 0x22, 0x80, 0x01, 0x0a, 0x0d, 0x50, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x6f, 0x0a, 0x07, 0x65, - 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x55, 0xba, 0x48, - 0x52, 0x92, 0x01, 0x4f, 0x22, 0x4d, 0xba, 0x01, 0x4a, 0x0a, 0x0e, 0x67, 0x6f, 0x5f, 0x6d, 0x6f, - 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1e, 0x6d, 0x75, 0x73, 0x74, 0x20, - 0x62, 0x65, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x67, 0x6f, 0x20, 0x6d, 0x6f, - 0x64, 0x75, 0x6c, 0x65, 0x20, 0x70, 0x61, 0x74, 0x68, 0x1a, 0x18, 0x74, 0x68, 0x69, 0x73, 0x2e, - 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x74, - 0x68, 0x28, 0x29, 0x52, 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x22, 0xb3, 0x02, 0x0a, - 0x09, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x51, 0x0a, 0x0b, 0x70, 0x61, - 0x74, 0x63, 0x68, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x16, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x74, 0x63, - 0x68, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x42, 0x12, 0xba, 0x48, 0x05, 0x82, 0x01, 0x02, 0x10, - 0x01, 0x8a, 0xc0, 0x0c, 0x06, 0x0a, 0x04, 0x5a, 0x73, 0x74, 0x64, 0x48, 0x00, 0x52, 0x0b, 0x70, - 0x61, 0x74, 0x63, 0x68, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x88, 0x01, 0x01, 0x12, 0x50, 0x0a, - 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, - 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x42, 0x18, 0xba, 0x48, 0x05, 0x82, 0x01, 0x02, 0x10, - 0x01, 0x8a, 0xc0, 0x0c, 0x0c, 0x0a, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, - 0x6d, 0x48, 0x01, 0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, - 0x65, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, - 0x70, 0x65, 0x63, 0x42, 0x25, 0xba, 0x48, 0x22, 0xda, 0x01, 0x1f, 0x0a, 0x0a, 0x66, 0x69, 0x6c, - 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x1a, 0x11, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, 0x61, - 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x61, 0x74, 0x63, 0x68, - 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, - 0x6e, 0x64, 0x22, 0x5c, 0x0a, 0x13, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, - 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x3d, 0x0a, 0x03, 0x64, 0x69, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x26, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x8a, 0xc0, - 0x0c, 0x1c, 0x0a, 0x1a, 0x2f, 0x76, 0x61, 0x72, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x6f, 0x70, 0x6e, - 0x69, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x48, 0x00, - 0x52, 0x03, 0x64, 0x69, 0x72, 0x88, 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x64, 0x69, 0x72, - 0x22, 0x3f, 0x0a, 0x0b, 0x4b, 0x65, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, - 0x30, 0x0a, 0x0e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x4b, 0x65, 0x79, 0x44, 0x69, 0x72, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x92, 0x01, 0x02, 0x18, - 0x01, 0x52, 0x0e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x4b, 0x65, 0x79, 0x44, 0x69, 0x72, - 0x73, 0x22, 0x5a, 0x0a, 0x11, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, - 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x45, 0x0a, 0x0a, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, - 0x65, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, - 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x70, 0x65, - 0x63, 0x52, 0x0a, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x22, 0x91, 0x01, - 0x0a, 0x1a, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x61, 0x0a, 0x0d, - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x54, 0x79, 0x70, - 0x65, 0x42, 0x18, 0xba, 0x48, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x8a, 0xc0, 0x0c, 0x0c, 0x0a, - 0x0a, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x69, - 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x88, 0x01, 0x01, 0x42, - 0x10, 0x0a, 0x0e, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, - 0x72, 0x22, 0x6f, 0x0a, 0x10, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x6e, - 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x23, 0x0a, 0x04, 0x72, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x01, 0x42, 0x0a, 0x8a, 0xc0, 0x0c, 0x06, 0x0a, 0x04, 0x31, 0x30, 0x2e, 0x30, 0x48, - 0x00, 0x52, 0x04, 0x72, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x05, 0x62, 0x75, - 0x72, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x08, 0x8a, 0xc0, 0x0c, 0x04, 0x0a, - 0x02, 0x35, 0x30, 0x48, 0x01, 0x52, 0x05, 0x62, 0x75, 0x72, 0x73, 0x74, 0x88, 0x01, 0x01, 0x42, - 0x07, 0x0a, 0x05, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x62, 0x75, 0x72, - 0x73, 0x74, 0x22, 0xa0, 0x02, 0x0a, 0x08, 0x41, 0x75, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x12, - 0x4a, 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, - 0x68, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x42, 0x13, 0xba, - 0x48, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x8a, 0xc0, 0x0c, 0x07, 0x0a, 0x05, 0x42, 0x61, 0x73, - 0x69, 0x63, 0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x50, 0x0a, 0x05, 0x62, - 0x61, 0x73, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, - 0x53, 0x70, 0x65, 0x63, 0x42, 0x20, 0xba, 0x48, 0x1d, 0xda, 0x01, 0x1a, 0x0a, 0x05, 0x62, 0x61, - 0x73, 0x69, 0x63, 0x1a, 0x11, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, - 0x64, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x52, 0x05, 0x62, 0x61, 0x73, 0x69, 0x63, 0x12, 0x54, 0x0a, - 0x06, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x44, - 0x41, 0x75, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x42, 0x21, 0xba, 0x48, 0x1e, 0xda, 0x01, 0x1b, - 0x0a, 0x06, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x64, 0x1a, 0x11, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, - 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x21, 0x3d, 0x20, 0x31, 0x52, 0x06, 0x6f, 0x70, 0x65, - 0x6e, 0x69, 0x64, 0x22, 0x20, 0x0a, 0x07, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x09, - 0x0a, 0x05, 0x42, 0x61, 0x73, 0x69, 0x63, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x4f, 0x70, 0x65, - 0x6e, 0x49, 0x44, 0x10, 0x01, 0x22, 0x83, 0x04, 0x0a, 0x0e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x44, - 0x41, 0x75, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x12, 0x32, 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, - 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x15, 0xba, 0x48, 0x12, 0xc8, 0x01, 0x01, - 0x72, 0x0d, 0x3a, 0x08, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x90, 0x01, 0x01, 0x48, - 0x00, 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x5b, 0x0a, 0x0a, - 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x36, 0xba, 0x48, 0x33, 0xba, 0x01, 0x30, 0x0a, 0x1a, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x64, - 0x5f, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x5f, - 0x64, 0x61, 0x74, 0x61, 0x1a, 0x12, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x78, 0x35, 0x30, 0x39, 0x49, - 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x29, 0x48, 0x01, 0x52, 0x0a, 0x63, 0x61, 0x43, 0x65, - 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x08, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, - 0xc8, 0x01, 0x01, 0x48, 0x02, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x88, - 0x01, 0x01, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0c, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, - 0x8a, 0xc0, 0x0c, 0x02, 0x18, 0x01, 0x48, 0x03, 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x10, 0x69, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x0f, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x8a, 0xc0, 0x0c, 0x05, 0x0a, - 0x03, 0x73, 0x75, 0x62, 0x48, 0x04, 0x52, 0x10, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, - 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x71, 0x0a, 0x06, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x42, 0x59, 0xba, 0x48, 0x56, - 0xba, 0x01, 0x4b, 0x0a, 0x14, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x5f, 0x6f, 0x70, 0x65, - 0x6e, 0x69, 0x64, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x1a, 0x27, 0x6f, 0x70, 0x65, 0x6e, - 0x69, 0x64, 0x27, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, - 0x75, 0x69, 0x72, 0x65, 0x64, 0x1a, 0x17, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x73, 0x28, 0x27, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x64, 0x27, 0x29, 0xc8, 0x01, - 0x01, 0x92, 0x01, 0x02, 0x18, 0x01, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x42, 0x09, - 0x0a, 0x07, 0x5f, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x61, - 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x22, 0x0f, 0x0a, 0x0d, 0x42, - 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0x3e, 0x0a, 0x0a, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x04, 0x73, 0x70, - 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0xb6, 0x01, 0x0a, - 0x0c, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, - 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x42, - 0x06, 0x92, 0xc0, 0x0c, 0x02, 0x10, 0x01, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x36, 0x0a, 0x04, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x06, 0x8a, 0xc0, 0x0c, - 0x02, 0x28, 0x01, 0x52, 0x04, 0x6d, 0x61, 0x73, 0x6b, 0x12, 0x3a, 0x0a, 0x05, 0x70, 0x61, 0x74, - 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x42, 0x06, 0x8a, 0xc0, 0x0c, 0x02, 0x28, 0x01, 0x52, 0x05, - 0x70, 0x61, 0x74, 0x63, 0x68, 0x22, 0xb1, 0x02, 0x0a, 0x0d, 0x44, 0x72, 0x79, 0x52, 0x75, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, - 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x12, 0x2a, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x75, 0x74, 0x69, 0x6c, - 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x30, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, - 0x63, 0x12, 0x2a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, - 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, - 0x68, 0x12, 0x36, 0x0a, 0x04, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x42, 0x06, 0x8a, 0xc0, 0x0c, - 0x02, 0x28, 0x01, 0x52, 0x04, 0x6d, 0x61, 0x73, 0x6b, 0x22, 0xc8, 0x01, 0x0a, 0x0e, 0x44, 0x72, - 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x07, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x07, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x53, 0x70, 0x65, 0x63, 0x52, 0x08, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x44, - 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x56, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x73, 0x22, 0x49, 0x0a, 0x0f, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x2a, - 0x29, 0x0a, 0x0e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, - 0x64, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x74, 0x63, 0x64, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x4a, - 0x65, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x10, 0x01, 0x2a, 0x23, 0x0a, 0x0b, 0x50, 0x61, - 0x74, 0x63, 0x68, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x73, 0x64, - 0x69, 0x66, 0x66, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x5a, 0x73, 0x74, 0x64, 0x10, 0x01, 0x2a, - 0x1e, 0x0a, 0x0c, 0x43, 0x61, 0x63, 0x68, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, - 0x0e, 0x0a, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x10, 0x00, 0x2a, - 0x2d, 0x0a, 0x11, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x6f, 0x6f, 0x70, 0x10, 0x00, 0x12, 0x0e, - 0x0a, 0x0a, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x10, 0x01, 0x32, 0x88, - 0x06, 0x0a, 0x0d, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x64, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x64, 0x72, - 0x69, 0x76, 0x65, 0x72, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, - 0x63, 0x22, 0x13, 0x82, 0xc0, 0x0c, 0x0f, 0x8a, 0xc0, 0x0c, 0x0b, 0x67, 0x65, 0x74, 0x2d, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x61, 0x0a, 0x17, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x15, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x17, 0x82, 0xc0, 0x0c, 0x13, 0x8a, 0xc0, 0x0c, 0x0b, 0x73, 0x65, 0x74, 0x2d, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0xb0, 0xc0, 0x0c, 0x01, 0x12, 0x55, 0x0a, 0x10, 0x47, 0x65, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, - 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, + 0x6e, 0x2d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x48, 0x00, 0x52, 0x03, 0x64, 0x69, 0x72, 0x88, 0x01, + 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x64, 0x69, 0x72, 0x22, 0x3f, 0x0a, 0x0b, 0x4b, 0x65, 0x79, + 0x72, 0x69, 0x6e, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x30, 0x0a, 0x0e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x4b, 0x65, 0x79, 0x44, 0x69, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x42, 0x08, 0xba, 0x48, 0x05, 0x92, 0x01, 0x02, 0x18, 0x01, 0x52, 0x0e, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x4b, 0x65, 0x79, 0x44, 0x69, 0x72, 0x73, 0x22, 0x9e, 0x01, 0x0a, 0x0c, 0x55, + 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x39, 0x0a, 0x06, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, 0x06, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, + 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x48, 0x01, 0x52, 0x07, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x73, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x42, + 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x22, 0xe5, 0x01, 0x0a, 0x11, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x53, 0x70, 0x65, + 0x63, 0x12, 0x5a, 0x0a, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, + 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x42, 0x18, 0xba, 0x48, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, + 0x8a, 0xc0, 0x0c, 0x0c, 0x0a, 0x0a, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, + 0x48, 0x00, 0x52, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x45, 0x0a, + 0x0a, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, + 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0a, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, + 0x65, 0x74, 0x65, 0x73, 0x22, 0x22, 0x0a, 0x06, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x08, + 0x0a, 0x04, 0x4e, 0x6f, 0x6f, 0x70, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4b, 0x75, 0x62, 0x65, + 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x10, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x64, 0x72, 0x69, + 0x76, 0x65, 0x72, 0x22, 0xd4, 0x01, 0x0a, 0x12, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x55, 0x70, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x57, 0x0a, 0x06, 0x64, 0x72, + 0x69, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x55, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, + 0x42, 0x14, 0xba, 0x48, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x8a, 0xc0, 0x0c, 0x08, 0x0a, 0x06, + 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x48, 0x00, 0x52, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, + 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x06, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, + 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x55, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x06, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x22, + 0x1e, 0x0a, 0x06, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x6f, 0x6f, + 0x70, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x10, 0x01, 0x42, + 0x09, 0x0a, 0x07, 0x5f, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x22, 0x7c, 0x0a, 0x17, 0x42, 0x69, + 0x6e, 0x61, 0x72, 0x79, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, + 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x51, 0x0a, 0x0b, 0x70, 0x61, 0x74, 0x63, 0x68, 0x45, 0x6e, + 0x67, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x74, 0x63, 0x68, 0x45, 0x6e, 0x67, 0x69, + 0x6e, 0x65, 0x42, 0x12, 0xba, 0x48, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x8a, 0xc0, 0x0c, 0x06, + 0x0a, 0x04, 0x5a, 0x73, 0x74, 0x64, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x61, 0x74, 0x63, 0x68, 0x45, + 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x61, 0x74, + 0x63, 0x68, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x22, 0xbe, 0x02, 0x0a, 0x1a, 0x4b, 0x75, 0x62, + 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x78, 0x0a, 0x0d, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x33, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, + 0x6e, 0x65, 0x74, 0x65, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, + 0x65, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, + 0x76, 0x65, 0x72, 0x42, 0x18, 0xba, 0x48, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x8a, 0xc0, 0x0c, + 0x0c, 0x0a, 0x0a, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x48, 0x00, 0x52, + 0x0d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x88, 0x01, + 0x01, 0x12, 0x21, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x4f, 0x76, 0x65, 0x72, + 0x72, 0x69, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0c, 0x72, 0x65, + 0x70, 0x6f, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x88, 0x01, 0x01, 0x22, 0x29, 0x0a, + 0x0d, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x12, 0x08, + 0x0a, 0x04, 0x4e, 0x6f, 0x6f, 0x70, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4b, 0x75, 0x62, 0x65, + 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x10, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x72, 0x65, 0x70, + 0x6f, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x22, 0x6f, 0x0a, 0x10, 0x52, 0x61, 0x74, + 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x23, 0x0a, + 0x04, 0x72, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x42, 0x0a, 0x8a, 0xc0, 0x0c, + 0x06, 0x0a, 0x04, 0x31, 0x30, 0x2e, 0x30, 0x48, 0x00, 0x52, 0x04, 0x72, 0x61, 0x74, 0x65, 0x88, + 0x01, 0x01, 0x12, 0x23, 0x0a, 0x05, 0x62, 0x75, 0x72, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x42, 0x08, 0x8a, 0xc0, 0x0c, 0x04, 0x0a, 0x02, 0x35, 0x30, 0x48, 0x01, 0x52, 0x05, 0x62, + 0x75, 0x72, 0x73, 0x74, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x72, 0x61, 0x74, 0x65, + 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x62, 0x75, 0x72, 0x73, 0x74, 0x22, 0xa0, 0x02, 0x0a, 0x08, 0x41, + 0x75, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x12, 0x4a, 0x0a, 0x07, 0x62, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x2e, 0x42, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x42, 0x13, 0xba, 0x48, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x8a, + 0xc0, 0x0c, 0x07, 0x0a, 0x05, 0x42, 0x61, 0x73, 0x69, 0x63, 0x52, 0x07, 0x62, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x12, 0x50, 0x0a, 0x05, 0x62, 0x61, 0x73, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x42, + 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x42, 0x20, 0xba, 0x48, + 0x1d, 0xda, 0x01, 0x1a, 0x0a, 0x05, 0x62, 0x61, 0x73, 0x69, 0x63, 0x1a, 0x11, 0x74, 0x68, 0x69, + 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x52, 0x05, + 0x62, 0x61, 0x73, 0x69, 0x63, 0x12, 0x54, 0x0a, 0x06, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, + 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x44, 0x41, 0x75, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, + 0x42, 0x21, 0xba, 0x48, 0x1e, 0xda, 0x01, 0x1b, 0x0a, 0x06, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x64, + 0x1a, 0x11, 0x74, 0x68, 0x69, 0x73, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x20, 0x21, + 0x3d, 0x20, 0x31, 0x52, 0x06, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x64, 0x22, 0x20, 0x0a, 0x07, 0x42, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x09, 0x0a, 0x05, 0x42, 0x61, 0x73, 0x69, 0x63, 0x10, + 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x44, 0x10, 0x01, 0x22, 0x83, 0x04, + 0x0a, 0x0e, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x44, 0x41, 0x75, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, + 0x12, 0x32, 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x15, 0xba, 0x48, 0x12, 0xc8, 0x01, 0x01, 0x72, 0x0d, 0x3a, 0x08, 0x68, 0x74, 0x74, 0x70, + 0x73, 0x3a, 0x2f, 0x2f, 0x90, 0x01, 0x01, 0x48, 0x00, 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, + 0x72, 0x88, 0x01, 0x01, 0x12, 0x5b, 0x0a, 0x0a, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, + 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x36, 0xba, 0x48, 0x33, 0xba, 0x01, 0x30, + 0x0a, 0x1a, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x64, 0x5f, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x5f, + 0x63, 0x61, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x12, 0x74, 0x68, + 0x69, 0x73, 0x2e, 0x78, 0x35, 0x30, 0x39, 0x49, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x28, 0x29, + 0x48, 0x01, 0x52, 0x0a, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, + 0x01, 0x12, 0x27, 0x0a, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x48, 0x02, 0x52, 0x08, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x0c, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x0c, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x8a, 0xc0, 0x0c, 0x02, 0x18, 0x01, 0x48, 0x03, + 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x88, 0x01, + 0x01, 0x12, 0x40, 0x0a, 0x10, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, + 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0f, 0xba, 0x48, 0x03, + 0xc8, 0x01, 0x01, 0x8a, 0xc0, 0x0c, 0x05, 0x0a, 0x03, 0x73, 0x75, 0x62, 0x48, 0x04, 0x52, 0x10, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x61, 0x69, 0x6d, + 0x88, 0x01, 0x01, 0x12, 0x71, 0x0a, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x09, 0x42, 0x59, 0xba, 0x48, 0x56, 0xba, 0x01, 0x4b, 0x0a, 0x14, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x64, 0x5f, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x12, 0x1a, 0x27, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x64, 0x27, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x1a, 0x17, 0x74, + 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x28, 0x27, 0x6f, 0x70, + 0x65, 0x6e, 0x69, 0x64, 0x27, 0x29, 0xc8, 0x01, 0x01, 0x92, 0x01, 0x02, 0x18, 0x01, 0x52, 0x06, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x69, 0x73, 0x73, 0x75, 0x65, + 0x72, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, + 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x42, 0x0f, 0x0a, + 0x0d, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x42, 0x13, + 0x0a, 0x11, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x69, 0x6e, 0x67, 0x43, 0x6c, + 0x61, 0x69, 0x6d, 0x22, 0x0f, 0x0a, 0x0d, 0x42, 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, + 0x53, 0x70, 0x65, 0x63, 0x22, 0x3e, 0x0a, 0x0a, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x30, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, + 0x73, 0x70, 0x65, 0x63, 0x22, 0xb6, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x06, 0x92, 0xc0, 0x0c, 0x02, 0x10, 0x01, 0x52, + 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x04, 0x6d, 0x61, 0x73, + 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, + 0x61, 0x73, 0x6b, 0x42, 0x06, 0x8a, 0xc0, 0x0c, 0x02, 0x28, 0x01, 0x52, 0x04, 0x6d, 0x61, 0x73, + 0x6b, 0x12, 0x3a, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x42, 0x06, + 0x8a, 0xc0, 0x0c, 0x02, 0x28, 0x01, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x22, 0xb1, 0x02, + 0x0a, 0x0d, 0x44, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2a, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x12, 0x2e, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x2a, 0x0a, 0x06, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x64, 0x72, + 0x69, 0x76, 0x65, 0x72, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, - 0x70, 0x65, 0x63, 0x22, 0x0b, 0x82, 0xc0, 0x0c, 0x07, 0x8a, 0xc0, 0x0c, 0x03, 0x67, 0x65, 0x74, - 0x12, 0x52, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, - 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x0f, 0x82, 0xc0, 0x0c, 0x0b, 0x8a, 0xc0, 0x0c, 0x03, 0x73, 0x65, 0x74, - 0xb0, 0xc0, 0x0c, 0x01, 0x12, 0x62, 0x0a, 0x19, 0x52, 0x65, 0x73, 0x65, 0x74, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x15, 0x82, 0xc0, 0x0c, 0x11, 0x8a, 0xc0, 0x0c, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x74, - 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x58, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x65, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x11, 0x82, 0xc0, 0x0c, 0x0d, 0x8a, 0xc0, 0x0c, 0x05, 0x72, 0x65, 0x73, 0x65, 0x74, 0xb0, 0xc0, - 0x0c, 0x01, 0x12, 0x47, 0x0a, 0x06, 0x44, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x18, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x44, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x08, 0x82, 0xc0, 0x0c, 0x04, 0xa0, 0xc0, 0x0c, 0x01, 0x12, 0x6c, 0x0a, 0x14, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, - 0x6f, 0x72, 0x79, 0x12, 0x27, 0x2e, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x75, 0x74, 0x69, 0x6c, - 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x82, 0xc0, 0x0c, 0x0b, 0x8a, 0xc0, - 0x0c, 0x07, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x1a, 0x0e, 0x82, 0xc0, 0x0c, 0x0a, 0x8a, - 0xc0, 0x0c, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x2d, 0x82, 0xc0, 0x0c, 0x02, 0x08, - 0x01, 0x5a, 0x25, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x61, - 0x6e, 0x63, 0x68, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x6e, 0x69, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x2a, 0x0a, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, + 0x65, 0x63, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x12, 0x36, 0x0a, 0x04, 0x6d, 0x61, 0x73, + 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, + 0x61, 0x73, 0x6b, 0x42, 0x06, 0x8a, 0xc0, 0x0c, 0x02, 0x28, 0x01, 0x52, 0x04, 0x6d, 0x61, 0x73, + 0x6b, 0x22, 0xc8, 0x01, 0x0a, 0x0e, 0x44, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, + 0x70, 0x65, 0x63, 0x52, 0x07, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x08, + 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x08, 0x6d, 0x6f, + 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x44, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x62, 0x75, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, + 0x56, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x10, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x49, 0x0a, 0x0f, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x36, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x07, + 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x2a, 0x29, 0x0a, 0x0e, 0x53, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x74, 0x63, + 0x64, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x4a, 0x65, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x10, 0x01, 0x2a, 0x23, 0x0a, 0x0b, 0x50, 0x61, 0x74, 0x63, 0x68, 0x45, 0x6e, 0x67, 0x69, 0x6e, + 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x73, 0x64, 0x69, 0x66, 0x66, 0x10, 0x00, 0x12, 0x08, 0x0a, + 0x04, 0x5a, 0x73, 0x74, 0x64, 0x10, 0x01, 0x2a, 0x1e, 0x0a, 0x0c, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x0e, 0x0a, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x10, 0x00, 0x32, 0xe6, 0x06, 0x0a, 0x0d, 0x47, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x64, 0x0a, 0x17, 0x47, 0x65, 0x74, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x75, 0x74, 0x69, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x22, 0x13, 0x82, 0xc0, 0x0c, 0x0f, + 0x8a, 0xc0, 0x0c, 0x0b, 0x67, 0x65, 0x74, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, + 0x61, 0x0a, 0x17, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x17, 0x82, 0xc0, 0x0c, 0x13, 0x8a, + 0xc0, 0x0c, 0x0b, 0x73, 0x65, 0x74, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0xb0, 0xc0, + 0x0c, 0x01, 0x12, 0x55, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x75, + 0x74, 0x69, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x22, 0x0b, 0x82, 0xc0, + 0x0c, 0x07, 0x8a, 0xc0, 0x0c, 0x03, 0x67, 0x65, 0x74, 0x12, 0x52, 0x0a, 0x10, 0x53, 0x65, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x2e, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x0f, 0x82, 0xc0, + 0x0c, 0x0b, 0x8a, 0xc0, 0x0c, 0x03, 0x73, 0x65, 0x74, 0xb0, 0xc0, 0x0c, 0x01, 0x12, 0x62, 0x0a, + 0x19, 0x52, 0x65, 0x73, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x15, 0x82, 0xc0, 0x0c, 0x11, + 0x8a, 0xc0, 0x0c, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x74, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x12, 0x58, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x11, 0x82, 0xc0, 0x0c, 0x0d, 0x8a, 0xc0, + 0x0c, 0x05, 0x72, 0x65, 0x73, 0x65, 0x74, 0xb0, 0xc0, 0x0c, 0x01, 0x12, 0x47, 0x0a, 0x06, 0x44, + 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x18, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x19, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x72, 0x79, 0x52, + 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0x82, 0xc0, 0x0c, 0x04, + 0xa0, 0xc0, 0x0c, 0x01, 0x12, 0x6c, 0x0a, 0x14, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x27, 0x2e, 0x64, + 0x72, 0x69, 0x76, 0x65, 0x72, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, + 0x31, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x0f, 0x82, 0xc0, 0x0c, 0x0b, 0x8a, 0xc0, 0x0c, 0x07, 0x68, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x12, 0x5c, 0x0a, 0x0d, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, + 0x0d, 0x82, 0xc0, 0x0c, 0x09, 0x8a, 0xc0, 0x0c, 0x05, 0x77, 0x61, 0x74, 0x63, 0x68, 0x30, 0x01, + 0x1a, 0x0e, 0x82, 0xc0, 0x0c, 0x0a, 0x8a, 0xc0, 0x0c, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x42, 0x36, 0x82, 0xc0, 0x0c, 0x02, 0x08, 0x01, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x2f, 0x6f, 0x70, 0x6e, + 0x69, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x76, 0x31, 0x3b, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2728,113 +3251,131 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescGZIP return file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDescData } -var file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes = make([]protoimpl.MessageInfo, 27) +var file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_enumTypes = make([]protoimpl.EnumInfo, 7) +var file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes = make([]protoimpl.MessageInfo, 33) var file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_goTypes = []interface{}{ (StorageBackend)(0), // 0: config.v1.StorageBackend (PatchEngine)(0), // 1: config.v1.PatchEngine (CacheBackend)(0), // 2: config.v1.CacheBackend - (ImageResolverType)(0), // 3: config.v1.ImageResolverType - (AuthSpec_Backend)(0), // 4: config.v1.AuthSpec.Backend - (*GatewayConfigSpec)(nil), // 5: config.v1.GatewayConfigSpec - (*ServerSpec)(nil), // 6: config.v1.ServerSpec - (*ManagementServerSpec)(nil), // 7: config.v1.ManagementServerSpec - (*RelayServerSpec)(nil), // 8: config.v1.RelayServerSpec - (*HealthServerSpec)(nil), // 9: config.v1.HealthServerSpec - (*DashboardServerSpec)(nil), // 10: config.v1.DashboardServerSpec - (*StorageSpec)(nil), // 11: config.v1.StorageSpec - (*EtcdSpec)(nil), // 12: config.v1.EtcdSpec - (*MTLSSpec)(nil), // 13: config.v1.MTLSSpec - (*JetStreamSpec)(nil), // 14: config.v1.JetStreamSpec - (*CertsSpec)(nil), // 15: config.v1.CertsSpec - (*PluginsSpec)(nil), // 16: config.v1.PluginsSpec - (*PluginFilters)(nil), // 17: config.v1.PluginFilters - (*CacheSpec)(nil), // 18: config.v1.CacheSpec - (*FilesystemCacheSpec)(nil), // 19: config.v1.FilesystemCacheSpec - (*KeyringSpec)(nil), // 20: config.v1.KeyringSpec - (*AgentUpgradesSpec)(nil), // 21: config.v1.AgentUpgradesSpec - (*KubernetesAgentUpgradeSpec)(nil), // 22: config.v1.KubernetesAgentUpgradeSpec - (*RateLimitingSpec)(nil), // 23: config.v1.RateLimitingSpec - (*AuthSpec)(nil), // 24: config.v1.AuthSpec - (*OpenIDAuthSpec)(nil), // 25: config.v1.OpenIDAuthSpec - (*BasicAuthSpec)(nil), // 26: config.v1.BasicAuthSpec - (*SetRequest)(nil), // 27: config.v1.SetRequest - (*ResetRequest)(nil), // 28: config.v1.ResetRequest - (*DryRunRequest)(nil), // 29: config.v1.DryRunRequest - (*DryRunResponse)(nil), // 30: config.v1.DryRunResponse - (*HistoryResponse)(nil), // 31: config.v1.HistoryResponse - (*v1.Revision)(nil), // 32: core.Revision - (*fieldmaskpb.FieldMask)(nil), // 33: google.protobuf.FieldMask - (driverutil.Target)(0), // 34: driverutil.Target - (driverutil.Action)(0), // 35: driverutil.Action - (*validate.Violations)(nil), // 36: buf.validate.Violations - (*driverutil.GetRequest)(nil), // 37: driverutil.GetRequest - (*emptypb.Empty)(nil), // 38: google.protobuf.Empty - (*driverutil.ConfigurationHistoryRequest)(nil), // 39: driverutil.ConfigurationHistoryRequest + (AgentUpgradesSpec_Driver)(0), // 3: config.v1.AgentUpgradesSpec.Driver + (PluginUpgradesSpec_Driver)(0), // 4: config.v1.PluginUpgradesSpec.Driver + (KubernetesAgentUpgradeSpec_ImageResolver)(0), // 5: config.v1.KubernetesAgentUpgradeSpec.ImageResolver + (AuthSpec_Backend)(0), // 6: config.v1.AuthSpec.Backend + (*ReactiveWatchRequest)(nil), // 7: config.v1.ReactiveWatchRequest + (*ReactiveEvents)(nil), // 8: config.v1.ReactiveEvents + (*ReactiveEvent)(nil), // 9: config.v1.ReactiveEvent + (*GatewayConfigSpec)(nil), // 10: config.v1.GatewayConfigSpec + (*ServerSpec)(nil), // 11: config.v1.ServerSpec + (*ManagementServerSpec)(nil), // 12: config.v1.ManagementServerSpec + (*RelayServerSpec)(nil), // 13: config.v1.RelayServerSpec + (*HealthServerSpec)(nil), // 14: config.v1.HealthServerSpec + (*DashboardServerSpec)(nil), // 15: config.v1.DashboardServerSpec + (*StorageSpec)(nil), // 16: config.v1.StorageSpec + (*EtcdSpec)(nil), // 17: config.v1.EtcdSpec + (*MTLSSpec)(nil), // 18: config.v1.MTLSSpec + (*JetStreamSpec)(nil), // 19: config.v1.JetStreamSpec + (*CertsSpec)(nil), // 20: config.v1.CertsSpec + (*PluginsSpec)(nil), // 21: config.v1.PluginsSpec + (*PluginFilters)(nil), // 22: config.v1.PluginFilters + (*CacheSpec)(nil), // 23: config.v1.CacheSpec + (*FilesystemCacheSpec)(nil), // 24: config.v1.FilesystemCacheSpec + (*KeyringSpec)(nil), // 25: config.v1.KeyringSpec + (*UpgradesSpec)(nil), // 26: config.v1.UpgradesSpec + (*AgentUpgradesSpec)(nil), // 27: config.v1.AgentUpgradesSpec + (*PluginUpgradesSpec)(nil), // 28: config.v1.PluginUpgradesSpec + (*BinaryPluginUpgradeSpec)(nil), // 29: config.v1.BinaryPluginUpgradeSpec + (*KubernetesAgentUpgradeSpec)(nil), // 30: config.v1.KubernetesAgentUpgradeSpec + (*RateLimitingSpec)(nil), // 31: config.v1.RateLimitingSpec + (*AuthSpec)(nil), // 32: config.v1.AuthSpec + (*OpenIDAuthSpec)(nil), // 33: config.v1.OpenIDAuthSpec + (*BasicAuthSpec)(nil), // 34: config.v1.BasicAuthSpec + (*SetRequest)(nil), // 35: config.v1.SetRequest + (*ResetRequest)(nil), // 36: config.v1.ResetRequest + (*DryRunRequest)(nil), // 37: config.v1.DryRunRequest + (*DryRunResponse)(nil), // 38: config.v1.DryRunResponse + (*HistoryResponse)(nil), // 39: config.v1.HistoryResponse + (*v1.Value)(nil), // 40: core.Value + (*v1.Revision)(nil), // 41: core.Revision + (*fieldmaskpb.FieldMask)(nil), // 42: google.protobuf.FieldMask + (driverutil.Target)(0), // 43: driverutil.Target + (driverutil.Action)(0), // 44: driverutil.Action + (*validate.Violations)(nil), // 45: buf.validate.Violations + (*driverutil.GetRequest)(nil), // 46: driverutil.GetRequest + (*emptypb.Empty)(nil), // 47: google.protobuf.Empty + (*driverutil.ConfigurationHistoryRequest)(nil), // 48: driverutil.ConfigurationHistoryRequest } var file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_depIdxs = []int32{ - 32, // 0: config.v1.GatewayConfigSpec.revision:type_name -> core.Revision - 6, // 1: config.v1.GatewayConfigSpec.server:type_name -> config.v1.ServerSpec - 7, // 2: config.v1.GatewayConfigSpec.management:type_name -> config.v1.ManagementServerSpec - 8, // 3: config.v1.GatewayConfigSpec.relay:type_name -> config.v1.RelayServerSpec - 9, // 4: config.v1.GatewayConfigSpec.health:type_name -> config.v1.HealthServerSpec - 10, // 5: config.v1.GatewayConfigSpec.dashboard:type_name -> config.v1.DashboardServerSpec - 11, // 6: config.v1.GatewayConfigSpec.storage:type_name -> config.v1.StorageSpec - 15, // 7: config.v1.GatewayConfigSpec.certs:type_name -> config.v1.CertsSpec - 16, // 8: config.v1.GatewayConfigSpec.plugins:type_name -> config.v1.PluginsSpec - 20, // 9: config.v1.GatewayConfigSpec.keyring:type_name -> config.v1.KeyringSpec - 21, // 10: config.v1.GatewayConfigSpec.agentUpgrades:type_name -> config.v1.AgentUpgradesSpec - 23, // 11: config.v1.GatewayConfigSpec.rateLimiting:type_name -> config.v1.RateLimitingSpec - 24, // 12: config.v1.GatewayConfigSpec.auth:type_name -> config.v1.AuthSpec - 0, // 13: config.v1.StorageSpec.backend:type_name -> config.v1.StorageBackend - 12, // 14: config.v1.StorageSpec.etcd:type_name -> config.v1.EtcdSpec - 14, // 15: config.v1.StorageSpec.jetStream:type_name -> config.v1.JetStreamSpec - 13, // 16: config.v1.EtcdSpec.certs:type_name -> config.v1.MTLSSpec - 17, // 17: config.v1.PluginsSpec.filters:type_name -> config.v1.PluginFilters - 18, // 18: config.v1.PluginsSpec.cache:type_name -> config.v1.CacheSpec - 1, // 19: config.v1.CacheSpec.patchEngine:type_name -> config.v1.PatchEngine - 2, // 20: config.v1.CacheSpec.backend:type_name -> config.v1.CacheBackend - 19, // 21: config.v1.CacheSpec.filesystem:type_name -> config.v1.FilesystemCacheSpec - 22, // 22: config.v1.AgentUpgradesSpec.kubernetes:type_name -> config.v1.KubernetesAgentUpgradeSpec - 3, // 23: config.v1.KubernetesAgentUpgradeSpec.imageResolver:type_name -> config.v1.ImageResolverType - 4, // 24: config.v1.AuthSpec.backend:type_name -> config.v1.AuthSpec.Backend - 26, // 25: config.v1.AuthSpec.basic:type_name -> config.v1.BasicAuthSpec - 25, // 26: config.v1.AuthSpec.openid:type_name -> config.v1.OpenIDAuthSpec - 5, // 27: config.v1.SetRequest.spec:type_name -> config.v1.GatewayConfigSpec - 32, // 28: config.v1.ResetRequest.revision:type_name -> core.Revision - 33, // 29: config.v1.ResetRequest.mask:type_name -> google.protobuf.FieldMask - 5, // 30: config.v1.ResetRequest.patch:type_name -> config.v1.GatewayConfigSpec - 34, // 31: config.v1.DryRunRequest.target:type_name -> driverutil.Target - 35, // 32: config.v1.DryRunRequest.action:type_name -> driverutil.Action - 5, // 33: config.v1.DryRunRequest.spec:type_name -> config.v1.GatewayConfigSpec - 32, // 34: config.v1.DryRunRequest.revision:type_name -> core.Revision - 5, // 35: config.v1.DryRunRequest.patch:type_name -> config.v1.GatewayConfigSpec - 33, // 36: config.v1.DryRunRequest.mask:type_name -> google.protobuf.FieldMask - 5, // 37: config.v1.DryRunResponse.current:type_name -> config.v1.GatewayConfigSpec - 5, // 38: config.v1.DryRunResponse.modified:type_name -> config.v1.GatewayConfigSpec - 36, // 39: config.v1.DryRunResponse.validationErrors:type_name -> buf.validate.Violations - 5, // 40: config.v1.HistoryResponse.entries:type_name -> config.v1.GatewayConfigSpec - 37, // 41: config.v1.GatewayConfig.GetDefaultConfiguration:input_type -> driverutil.GetRequest - 27, // 42: config.v1.GatewayConfig.SetDefaultConfiguration:input_type -> config.v1.SetRequest - 37, // 43: config.v1.GatewayConfig.GetConfiguration:input_type -> driverutil.GetRequest - 27, // 44: config.v1.GatewayConfig.SetConfiguration:input_type -> config.v1.SetRequest - 38, // 45: config.v1.GatewayConfig.ResetDefaultConfiguration:input_type -> google.protobuf.Empty - 28, // 46: config.v1.GatewayConfig.ResetConfiguration:input_type -> config.v1.ResetRequest - 29, // 47: config.v1.GatewayConfig.DryRun:input_type -> config.v1.DryRunRequest - 39, // 48: config.v1.GatewayConfig.ConfigurationHistory:input_type -> driverutil.ConfigurationHistoryRequest - 5, // 49: config.v1.GatewayConfig.GetDefaultConfiguration:output_type -> config.v1.GatewayConfigSpec - 38, // 50: config.v1.GatewayConfig.SetDefaultConfiguration:output_type -> google.protobuf.Empty - 5, // 51: config.v1.GatewayConfig.GetConfiguration:output_type -> config.v1.GatewayConfigSpec - 38, // 52: config.v1.GatewayConfig.SetConfiguration:output_type -> google.protobuf.Empty - 38, // 53: config.v1.GatewayConfig.ResetDefaultConfiguration:output_type -> google.protobuf.Empty - 38, // 54: config.v1.GatewayConfig.ResetConfiguration:output_type -> google.protobuf.Empty - 30, // 55: config.v1.GatewayConfig.DryRun:output_type -> config.v1.DryRunResponse - 31, // 56: config.v1.GatewayConfig.ConfigurationHistory:output_type -> config.v1.HistoryResponse - 49, // [49:57] is the sub-list for method output_type - 41, // [41:49] is the sub-list for method input_type - 41, // [41:41] is the sub-list for extension type_name - 41, // [41:41] is the sub-list for extension extendee - 0, // [0:41] is the sub-list for field type_name + 9, // 0: config.v1.ReactiveEvents.items:type_name -> config.v1.ReactiveEvent + 40, // 1: config.v1.ReactiveEvent.value:type_name -> core.Value + 41, // 2: config.v1.GatewayConfigSpec.revision:type_name -> core.Revision + 11, // 3: config.v1.GatewayConfigSpec.server:type_name -> config.v1.ServerSpec + 12, // 4: config.v1.GatewayConfigSpec.management:type_name -> config.v1.ManagementServerSpec + 13, // 5: config.v1.GatewayConfigSpec.relay:type_name -> config.v1.RelayServerSpec + 14, // 6: config.v1.GatewayConfigSpec.health:type_name -> config.v1.HealthServerSpec + 15, // 7: config.v1.GatewayConfigSpec.dashboard:type_name -> config.v1.DashboardServerSpec + 16, // 8: config.v1.GatewayConfigSpec.storage:type_name -> config.v1.StorageSpec + 20, // 9: config.v1.GatewayConfigSpec.certs:type_name -> config.v1.CertsSpec + 21, // 10: config.v1.GatewayConfigSpec.plugins:type_name -> config.v1.PluginsSpec + 25, // 11: config.v1.GatewayConfigSpec.keyring:type_name -> config.v1.KeyringSpec + 26, // 12: config.v1.GatewayConfigSpec.upgrades:type_name -> config.v1.UpgradesSpec + 31, // 13: config.v1.GatewayConfigSpec.rateLimiting:type_name -> config.v1.RateLimitingSpec + 32, // 14: config.v1.GatewayConfigSpec.auth:type_name -> config.v1.AuthSpec + 0, // 15: config.v1.StorageSpec.backend:type_name -> config.v1.StorageBackend + 17, // 16: config.v1.StorageSpec.etcd:type_name -> config.v1.EtcdSpec + 19, // 17: config.v1.StorageSpec.jetStream:type_name -> config.v1.JetStreamSpec + 18, // 18: config.v1.EtcdSpec.certs:type_name -> config.v1.MTLSSpec + 22, // 19: config.v1.PluginsSpec.filters:type_name -> config.v1.PluginFilters + 23, // 20: config.v1.PluginsSpec.cache:type_name -> config.v1.CacheSpec + 2, // 21: config.v1.CacheSpec.backend:type_name -> config.v1.CacheBackend + 24, // 22: config.v1.CacheSpec.filesystem:type_name -> config.v1.FilesystemCacheSpec + 27, // 23: config.v1.UpgradesSpec.agents:type_name -> config.v1.AgentUpgradesSpec + 28, // 24: config.v1.UpgradesSpec.plugins:type_name -> config.v1.PluginUpgradesSpec + 3, // 25: config.v1.AgentUpgradesSpec.driver:type_name -> config.v1.AgentUpgradesSpec.Driver + 30, // 26: config.v1.AgentUpgradesSpec.kubernetes:type_name -> config.v1.KubernetesAgentUpgradeSpec + 4, // 27: config.v1.PluginUpgradesSpec.driver:type_name -> config.v1.PluginUpgradesSpec.Driver + 29, // 28: config.v1.PluginUpgradesSpec.binary:type_name -> config.v1.BinaryPluginUpgradeSpec + 1, // 29: config.v1.BinaryPluginUpgradeSpec.patchEngine:type_name -> config.v1.PatchEngine + 5, // 30: config.v1.KubernetesAgentUpgradeSpec.imageResolver:type_name -> config.v1.KubernetesAgentUpgradeSpec.ImageResolver + 6, // 31: config.v1.AuthSpec.backend:type_name -> config.v1.AuthSpec.Backend + 34, // 32: config.v1.AuthSpec.basic:type_name -> config.v1.BasicAuthSpec + 33, // 33: config.v1.AuthSpec.openid:type_name -> config.v1.OpenIDAuthSpec + 10, // 34: config.v1.SetRequest.spec:type_name -> config.v1.GatewayConfigSpec + 41, // 35: config.v1.ResetRequest.revision:type_name -> core.Revision + 42, // 36: config.v1.ResetRequest.mask:type_name -> google.protobuf.FieldMask + 10, // 37: config.v1.ResetRequest.patch:type_name -> config.v1.GatewayConfigSpec + 43, // 38: config.v1.DryRunRequest.target:type_name -> driverutil.Target + 44, // 39: config.v1.DryRunRequest.action:type_name -> driverutil.Action + 10, // 40: config.v1.DryRunRequest.spec:type_name -> config.v1.GatewayConfigSpec + 41, // 41: config.v1.DryRunRequest.revision:type_name -> core.Revision + 10, // 42: config.v1.DryRunRequest.patch:type_name -> config.v1.GatewayConfigSpec + 42, // 43: config.v1.DryRunRequest.mask:type_name -> google.protobuf.FieldMask + 10, // 44: config.v1.DryRunResponse.current:type_name -> config.v1.GatewayConfigSpec + 10, // 45: config.v1.DryRunResponse.modified:type_name -> config.v1.GatewayConfigSpec + 45, // 46: config.v1.DryRunResponse.validationErrors:type_name -> buf.validate.Violations + 10, // 47: config.v1.HistoryResponse.entries:type_name -> config.v1.GatewayConfigSpec + 46, // 48: config.v1.GatewayConfig.GetDefaultConfiguration:input_type -> driverutil.GetRequest + 35, // 49: config.v1.GatewayConfig.SetDefaultConfiguration:input_type -> config.v1.SetRequest + 46, // 50: config.v1.GatewayConfig.GetConfiguration:input_type -> driverutil.GetRequest + 35, // 51: config.v1.GatewayConfig.SetConfiguration:input_type -> config.v1.SetRequest + 47, // 52: config.v1.GatewayConfig.ResetDefaultConfiguration:input_type -> google.protobuf.Empty + 36, // 53: config.v1.GatewayConfig.ResetConfiguration:input_type -> config.v1.ResetRequest + 37, // 54: config.v1.GatewayConfig.DryRun:input_type -> config.v1.DryRunRequest + 48, // 55: config.v1.GatewayConfig.ConfigurationHistory:input_type -> driverutil.ConfigurationHistoryRequest + 7, // 56: config.v1.GatewayConfig.WatchReactive:input_type -> config.v1.ReactiveWatchRequest + 10, // 57: config.v1.GatewayConfig.GetDefaultConfiguration:output_type -> config.v1.GatewayConfigSpec + 47, // 58: config.v1.GatewayConfig.SetDefaultConfiguration:output_type -> google.protobuf.Empty + 10, // 59: config.v1.GatewayConfig.GetConfiguration:output_type -> config.v1.GatewayConfigSpec + 47, // 60: config.v1.GatewayConfig.SetConfiguration:output_type -> google.protobuf.Empty + 47, // 61: config.v1.GatewayConfig.ResetDefaultConfiguration:output_type -> google.protobuf.Empty + 47, // 62: config.v1.GatewayConfig.ResetConfiguration:output_type -> google.protobuf.Empty + 38, // 63: config.v1.GatewayConfig.DryRun:output_type -> config.v1.DryRunResponse + 39, // 64: config.v1.GatewayConfig.ConfigurationHistory:output_type -> config.v1.HistoryResponse + 8, // 65: config.v1.GatewayConfig.WatchReactive:output_type -> config.v1.ReactiveEvents + 57, // [57:66] is the sub-list for method output_type + 48, // [48:57] is the sub-list for method input_type + 48, // [48:48] is the sub-list for extension type_name + 48, // [48:48] is the sub-list for extension extendee + 0, // [0:48] is the sub-list for field type_name } func init() { file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() } @@ -2844,7 +3385,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } if !protoimpl.UnsafeEnabled { file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GatewayConfigSpec); i { + switch v := v.(*ReactiveWatchRequest); i { case 0: return &v.state case 1: @@ -2856,7 +3397,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } } file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerSpec); i { + switch v := v.(*ReactiveEvents); i { case 0: return &v.state case 1: @@ -2868,7 +3409,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } } file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ManagementServerSpec); i { + switch v := v.(*ReactiveEvent); i { case 0: return &v.state case 1: @@ -2880,7 +3421,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } } file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RelayServerSpec); i { + switch v := v.(*GatewayConfigSpec); i { case 0: return &v.state case 1: @@ -2892,7 +3433,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } } file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HealthServerSpec); i { + switch v := v.(*ServerSpec); i { case 0: return &v.state case 1: @@ -2904,7 +3445,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } } file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DashboardServerSpec); i { + switch v := v.(*ManagementServerSpec); i { case 0: return &v.state case 1: @@ -2916,7 +3457,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } } file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StorageSpec); i { + switch v := v.(*RelayServerSpec); i { case 0: return &v.state case 1: @@ -2928,7 +3469,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } } file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EtcdSpec); i { + switch v := v.(*HealthServerSpec); i { case 0: return &v.state case 1: @@ -2940,7 +3481,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } } file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MTLSSpec); i { + switch v := v.(*DashboardServerSpec); i { case 0: return &v.state case 1: @@ -2952,7 +3493,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } } file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JetStreamSpec); i { + switch v := v.(*StorageSpec); i { case 0: return &v.state case 1: @@ -2964,7 +3505,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } } file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CertsSpec); i { + switch v := v.(*EtcdSpec); i { case 0: return &v.state case 1: @@ -2976,7 +3517,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } } file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PluginsSpec); i { + switch v := v.(*MTLSSpec); i { case 0: return &v.state case 1: @@ -2988,7 +3529,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } } file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PluginFilters); i { + switch v := v.(*JetStreamSpec); i { case 0: return &v.state case 1: @@ -3000,7 +3541,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } } file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CacheSpec); i { + switch v := v.(*CertsSpec); i { case 0: return &v.state case 1: @@ -3012,7 +3553,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } } file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FilesystemCacheSpec); i { + switch v := v.(*PluginsSpec); i { case 0: return &v.state case 1: @@ -3024,7 +3565,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } } file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KeyringSpec); i { + switch v := v.(*PluginFilters); i { case 0: return &v.state case 1: @@ -3036,7 +3577,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } } file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentUpgradesSpec); i { + switch v := v.(*CacheSpec); i { case 0: return &v.state case 1: @@ -3048,7 +3589,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } } file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KubernetesAgentUpgradeSpec); i { + switch v := v.(*FilesystemCacheSpec); i { case 0: return &v.state case 1: @@ -3060,7 +3601,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } } file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RateLimitingSpec); i { + switch v := v.(*KeyringSpec); i { case 0: return &v.state case 1: @@ -3072,7 +3613,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } } file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AuthSpec); i { + switch v := v.(*UpgradesSpec); i { case 0: return &v.state case 1: @@ -3084,7 +3625,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } } file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenIDAuthSpec); i { + switch v := v.(*AgentUpgradesSpec); i { case 0: return &v.state case 1: @@ -3096,7 +3637,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } } file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BasicAuthSpec); i { + switch v := v.(*PluginUpgradesSpec); i { case 0: return &v.state case 1: @@ -3108,7 +3649,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } } file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetRequest); i { + switch v := v.(*BinaryPluginUpgradeSpec); i { case 0: return &v.state case 1: @@ -3120,7 +3661,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } } file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResetRequest); i { + switch v := v.(*KubernetesAgentUpgradeSpec); i { case 0: return &v.state case 1: @@ -3132,7 +3673,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } } file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DryRunRequest); i { + switch v := v.(*RateLimitingSpec); i { case 0: return &v.state case 1: @@ -3144,7 +3685,7 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } } file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DryRunResponse); i { + switch v := v.(*AuthSpec); i { case 0: return &v.state case 1: @@ -3156,6 +3697,78 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } } file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OpenIDAuthSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BasicAuthSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DryRunRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DryRunResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HistoryResponse); i { case 0: return &v.state @@ -3168,28 +3781,32 @@ func file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_init() { } } } - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[1].OneofWrappers = []interface{}{} - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[2].OneofWrappers = []interface{}{} - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[3].OneofWrappers = []interface{}{} file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[4].OneofWrappers = []interface{}{} file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[5].OneofWrappers = []interface{}{} file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[6].OneofWrappers = []interface{}{} + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[7].OneofWrappers = []interface{}{} file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[8].OneofWrappers = []interface{}{} file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[9].OneofWrappers = []interface{}{} - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[10].OneofWrappers = []interface{}{} file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[11].OneofWrappers = []interface{}{} + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[12].OneofWrappers = []interface{}{} file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[13].OneofWrappers = []interface{}{} file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[14].OneofWrappers = []interface{}{} + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[16].OneofWrappers = []interface{}{} file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[17].OneofWrappers = []interface{}{} - file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[18].OneofWrappers = []interface{}{} + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[19].OneofWrappers = []interface{}{} file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[20].OneofWrappers = []interface{}{} + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[21].OneofWrappers = []interface{}{} + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[22].OneofWrappers = []interface{}{} + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[23].OneofWrappers = []interface{}{} + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[24].OneofWrappers = []interface{}{} + file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_msgTypes[26].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_github_com_rancher_opni_pkg_config_v1_gateway_config_proto_rawDesc, - NumEnums: 5, - NumMessages: 27, + NumEnums: 7, + NumMessages: 33, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/config/v1/gateway_config.proto b/pkg/config/v1/gateway_config.proto index aab481d0fe..5e8b854086 100644 --- a/pkg/config/v1/gateway_config.proto +++ b/pkg/config/v1/gateway_config.proto @@ -6,10 +6,12 @@ import "github.com/rancher/opni/internal/codegen/cli/cli.proto"; import "github.com/rancher/opni/pkg/apis/core/v1/core.proto"; import "github.com/rancher/opni/pkg/plugins/driverutil/types.proto"; import "github.com/rancher/opni/pkg/validation/validate.proto"; +import "google/protobuf/any.proto"; import "google/protobuf/empty.proto"; import "google/protobuf/field_mask.proto"; +import "google/protobuf/struct.proto"; -option go_package = "github.com/rancher/opni/pkg/config/v1"; +option go_package = "github.com/rancher/opni/pkg/config/v1;configv1"; option (cli.generator) = { generate: true }; @@ -61,6 +63,33 @@ service GatewayConfig { use: "history" }; } + rpc WatchReactive(ReactiveWatchRequest) returns (stream ReactiveEvents) { + option (cli.command) = { + use: "watch" + }; + } +} + +message ReactiveWatchRequest { + // If true, uses [reactive.Bind] to watch all paths at once. If false, + // each path recieves updates separately. + bool bind = 1; + + // List of paths to watch. + repeated string paths = 2; +} + +message ReactiveEvents { + // In bind mode, this will contain one item for each path in the request, + // in order. Otherwise, this will only contain a single item. + repeated ReactiveEvent items = 1; +} + +message ReactiveEvent { + // The path that triggered this event, as an index into the request path list. + int32 index = 1; + + core.Value value = 2; } message GatewayConfigSpec { @@ -80,20 +109,19 @@ message GatewayConfigSpec { "].filter(a, !a.endsWith(':0')).unique()" } }; - - core.Revision revision = 1 [(cli.flag).skip = true]; - ServerSpec server = 2; - ManagementServerSpec management = 3; - RelayServerSpec relay = 4; - HealthServerSpec health = 5; - DashboardServerSpec dashboard = 6; - StorageSpec storage = 7; - CertsSpec certs = 8; - PluginsSpec plugins = 9; - KeyringSpec keyring = 10; - AgentUpgradesSpec agentUpgrades = 11; - RateLimitingSpec rateLimiting = 12; - AuthSpec auth = 13 [(cli.flag).skip = true]; + core.Revision revision = 1 [(cli.flag).skip = true]; + ServerSpec server = 2; + ManagementServerSpec management = 3; + RelayServerSpec relay = 4; + HealthServerSpec health = 5; + DashboardServerSpec dashboard = 6; + StorageSpec storage = 7; + CertsSpec certs = 8; + PluginsSpec plugins = 9; + KeyringSpec keyring = 10; + UpgradesSpec upgrades = 11; + RateLimitingSpec rateLimiting = 12; + AuthSpec auth = 13 [(cli.flag).skip = true]; } message ServerSpec { @@ -113,6 +141,24 @@ message ServerSpec { expression: "this.isValidListenAddress()" } ]; + + // The advertise address for the server. + optional string advertiseAddress = 3 [ + (cli.flag).skip = true, + (buf.validate.field) = { + cel: [ + { + id: "server_grpc_advertise_address" + expression: "this.isValidListenAddress()" + }, + { + id: "server_grpc_advertise_address_port" + message: "advertise address must have a non-zero port" + expression: "!this.endsWith(':0') && !this.endsWith(':')" + } + ] + } + ]; } message ManagementServerSpec { @@ -488,12 +534,6 @@ message PluginFilters { } message CacheSpec { - // Patch engine to use for calculating plugin patches. - optional PatchEngine patchEngine = 1 [ - (cli.flag).default = "Zstd", - (buf.validate.field).enum.defined_only = true - ]; - // Cache backend to use for storing plugin binaries and patches. optional CacheBackend backend = 2 [ (cli.flag).default = "Filesystem", @@ -526,22 +566,66 @@ message KeyringSpec { ]; } +message UpgradesSpec { + optional AgentUpgradesSpec agents = 1; + optional PluginUpgradesSpec plugins = 2; +} + message AgentUpgradesSpec { + enum Driver { + Noop = 0; + Kubernetes = 1; + } + + // Agent upgrade driver to use. + optional Driver driver = 1 [ + (cli.flag).default = "Kubernetes", + (buf.validate.field).enum.defined_only = true + ]; + // Kubernetes agent upgrade configuration. - KubernetesAgentUpgradeSpec kubernetes = 1; + KubernetesAgentUpgradeSpec kubernetes = 2; +} + +message PluginUpgradesSpec { + enum Driver { + Noop = 0; + Binary = 1; + } + + // Plugin upgrade driver to use. + optional Driver driver = 1 [ + (cli.flag).default = "Binary", + (buf.validate.field).enum.defined_only = true + ]; + + // Binary plugin upgrade configuration. + BinaryPluginUpgradeSpec binary = 2; } -enum ImageResolverType { - Noop = 0; - Kubernetes = 1; +message BinaryPluginUpgradeSpec { + // Patch engine to use for calculating plugin patches. + optional PatchEngine patchEngine = 1 [ + (cli.flag).default = "Zstd", + (buf.validate.field).enum.defined_only = true + ]; } message KubernetesAgentUpgradeSpec { - // Agent image resolver backend to use. - optional ImageResolverType imageResolver = 1 [ + enum ImageResolver { + Noop = 0; + Kubernetes = 1; + } + + // Agent image resolver to use. + optional ImageResolver imageResolver = 1 [ (cli.flag).default = "Kubernetes", (buf.validate.field).enum.defined_only = true ]; + + optional string namespace = 2; + + optional string repoOverride = 3; } message RateLimitingSpec { diff --git a/pkg/config/v1/gateway_config_cli.pb.go b/pkg/config/v1/gateway_config_cli.pb.go index 93b9d76bb8..49194ff2c2 100644 --- a/pkg/config/v1/gateway_config_cli.pb.go +++ b/pkg/config/v1/gateway_config_cli.pb.go @@ -1,7 +1,7 @@ // Code generated by internal/codegen/cli/generator.go. DO NOT EDIT. // source: github.com/rancher/opni/pkg/config/v1/gateway_config.proto -package v1 +package configv1 import ( context "context" @@ -397,10 +397,10 @@ func (in *GatewayConfigSpec) FlagSet(prefix ...string) *pflag.FlagSet { in.Keyring = &KeyringSpec{} } fs.AddFlagSet(in.Keyring.FlagSet(append(prefix, "keyring")...)) - if in.AgentUpgrades == nil { - in.AgentUpgrades = &AgentUpgradesSpec{} + if in.Upgrades == nil { + in.Upgrades = &UpgradesSpec{} } - fs.AddFlagSet(in.AgentUpgrades.FlagSet(append(prefix, "agent-upgrades")...)) + fs.AddFlagSet(in.Upgrades.FlagSet(append(prefix, "upgrades")...)) if in.RateLimiting == nil { in.RateLimiting = &RateLimitingSpec{} } @@ -744,7 +744,6 @@ func (in *PluginFilters) FlagSet(prefix ...string) *pflag.FlagSet { func (in *CacheSpec) FlagSet(prefix ...string) *pflag.FlagSet { fs := pflag.NewFlagSet("CacheSpec", pflag.ExitOnError) fs.SortFlags = true - fs.Var(flagutil.EnumPtrValue(flagutil.Ptr(PatchEngine_Zstd), &in.PatchEngine), strings.Join(append(prefix, "patch-engine"), "."), "Patch engine to use for calculating plugin patches.") fs.Var(flagutil.EnumPtrValue(flagutil.Ptr(CacheBackend_Filesystem), &in.Backend), strings.Join(append(prefix, "backend"), "."), "Cache backend to use for storing plugin binaries and patches.") if in.Filesystem == nil { in.Filesystem = &FilesystemCacheSpec{} @@ -767,9 +766,24 @@ func (in *KeyringSpec) FlagSet(prefix ...string) *pflag.FlagSet { return fs } +func (in *UpgradesSpec) FlagSet(prefix ...string) *pflag.FlagSet { + fs := pflag.NewFlagSet("UpgradesSpec", pflag.ExitOnError) + fs.SortFlags = true + if in.Agents == nil { + in.Agents = &AgentUpgradesSpec{} + } + fs.AddFlagSet(in.Agents.FlagSet(append(prefix, "agents")...)) + if in.Plugins == nil { + in.Plugins = &PluginUpgradesSpec{} + } + fs.AddFlagSet(in.Plugins.FlagSet(append(prefix, "plugins")...)) + return fs +} + func (in *AgentUpgradesSpec) FlagSet(prefix ...string) *pflag.FlagSet { fs := pflag.NewFlagSet("AgentUpgradesSpec", pflag.ExitOnError) fs.SortFlags = true + fs.Var(flagutil.EnumPtrValue(flagutil.Ptr(AgentUpgradesSpec_Kubernetes), &in.Driver), strings.Join(append(prefix, "driver"), "."), "Agent upgrade driver to use.") if in.Kubernetes == nil { in.Kubernetes = &KubernetesAgentUpgradeSpec{} } @@ -780,7 +794,27 @@ func (in *AgentUpgradesSpec) FlagSet(prefix ...string) *pflag.FlagSet { func (in *KubernetesAgentUpgradeSpec) FlagSet(prefix ...string) *pflag.FlagSet { fs := pflag.NewFlagSet("KubernetesAgentUpgradeSpec", pflag.ExitOnError) fs.SortFlags = true - fs.Var(flagutil.EnumPtrValue(flagutil.Ptr(ImageResolverType_Kubernetes), &in.ImageResolver), strings.Join(append(prefix, "image-resolver"), "."), "Agent image resolver backend to use.") + fs.Var(flagutil.EnumPtrValue(flagutil.Ptr(KubernetesAgentUpgradeSpec_Kubernetes), &in.ImageResolver), strings.Join(append(prefix, "image-resolver"), "."), "Agent image resolver to use.") + fs.Var(flagutil.StringPtrValue(nil, &in.Namespace), strings.Join(append(prefix, "namespace"), "."), "") + fs.Var(flagutil.StringPtrValue(nil, &in.RepoOverride), strings.Join(append(prefix, "repo-override"), "."), "") + return fs +} + +func (in *PluginUpgradesSpec) FlagSet(prefix ...string) *pflag.FlagSet { + fs := pflag.NewFlagSet("PluginUpgradesSpec", pflag.ExitOnError) + fs.SortFlags = true + fs.Var(flagutil.EnumPtrValue(flagutil.Ptr(PluginUpgradesSpec_Binary), &in.Driver), strings.Join(append(prefix, "driver"), "."), "Plugin upgrade driver to use.") + if in.Binary == nil { + in.Binary = &BinaryPluginUpgradeSpec{} + } + fs.AddFlagSet(in.Binary.FlagSet(append(prefix, "binary")...)) + return fs +} + +func (in *BinaryPluginUpgradeSpec) FlagSet(prefix ...string) *pflag.FlagSet { + fs := pflag.NewFlagSet("BinaryPluginUpgradeSpec", pflag.ExitOnError) + fs.SortFlags = true + fs.Var(flagutil.EnumPtrValue(flagutil.Ptr(PatchEngine_Zstd), &in.PatchEngine), strings.Join(append(prefix, "patch-engine"), "."), "Patch engine to use for calculating plugin patches.") return fs } diff --git a/pkg/config/v1/gateway_config_grpc.pb.go b/pkg/config/v1/gateway_config_grpc.pb.go index e4e614c8e2..b4fae303f6 100644 --- a/pkg/config/v1/gateway_config_grpc.pb.go +++ b/pkg/config/v1/gateway_config_grpc.pb.go @@ -4,7 +4,7 @@ // - ragu v1.0.0 // source: github.com/rancher/opni/pkg/config/v1/gateway_config.proto -package v1 +package configv1 import ( context "context" @@ -29,6 +29,7 @@ const ( GatewayConfig_ResetConfiguration_FullMethodName = "/config.v1.GatewayConfig/ResetConfiguration" GatewayConfig_DryRun_FullMethodName = "/config.v1.GatewayConfig/DryRun" GatewayConfig_ConfigurationHistory_FullMethodName = "/config.v1.GatewayConfig/ConfigurationHistory" + GatewayConfig_WatchReactive_FullMethodName = "/config.v1.GatewayConfig/WatchReactive" ) // GatewayConfigClient is the client API for GatewayConfig service. @@ -43,6 +44,7 @@ type GatewayConfigClient interface { ResetConfiguration(ctx context.Context, in *ResetRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) DryRun(ctx context.Context, in *DryRunRequest, opts ...grpc.CallOption) (*DryRunResponse, error) ConfigurationHistory(ctx context.Context, in *driverutil.ConfigurationHistoryRequest, opts ...grpc.CallOption) (*HistoryResponse, error) + WatchReactive(ctx context.Context, in *ReactiveWatchRequest, opts ...grpc.CallOption) (GatewayConfig_WatchReactiveClient, error) } type gatewayConfigClient struct { @@ -125,6 +127,38 @@ func (c *gatewayConfigClient) ConfigurationHistory(ctx context.Context, in *driv return out, nil } +func (c *gatewayConfigClient) WatchReactive(ctx context.Context, in *ReactiveWatchRequest, opts ...grpc.CallOption) (GatewayConfig_WatchReactiveClient, error) { + stream, err := c.cc.NewStream(ctx, &GatewayConfig_ServiceDesc.Streams[0], GatewayConfig_WatchReactive_FullMethodName, opts...) + if err != nil { + return nil, err + } + x := &gatewayConfigWatchReactiveClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type GatewayConfig_WatchReactiveClient interface { + Recv() (*ReactiveEvents, error) + grpc.ClientStream +} + +type gatewayConfigWatchReactiveClient struct { + grpc.ClientStream +} + +func (x *gatewayConfigWatchReactiveClient) Recv() (*ReactiveEvents, error) { + m := new(ReactiveEvents) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + // GatewayConfigServer is the server API for GatewayConfig service. // All implementations should embed UnimplementedGatewayConfigServer // for forward compatibility @@ -137,6 +171,7 @@ type GatewayConfigServer interface { ResetConfiguration(context.Context, *ResetRequest) (*emptypb.Empty, error) DryRun(context.Context, *DryRunRequest) (*DryRunResponse, error) ConfigurationHistory(context.Context, *driverutil.ConfigurationHistoryRequest) (*HistoryResponse, error) + WatchReactive(*ReactiveWatchRequest, GatewayConfig_WatchReactiveServer) error } // UnimplementedGatewayConfigServer should be embedded to have forward compatible implementations. @@ -167,6 +202,9 @@ func (UnimplementedGatewayConfigServer) DryRun(context.Context, *DryRunRequest) func (UnimplementedGatewayConfigServer) ConfigurationHistory(context.Context, *driverutil.ConfigurationHistoryRequest) (*HistoryResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ConfigurationHistory not implemented") } +func (UnimplementedGatewayConfigServer) WatchReactive(*ReactiveWatchRequest, GatewayConfig_WatchReactiveServer) error { + return status.Errorf(codes.Unimplemented, "method WatchReactive not implemented") +} // UnsafeGatewayConfigServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to GatewayConfigServer will @@ -323,6 +361,27 @@ func _GatewayConfig_ConfigurationHistory_Handler(srv interface{}, ctx context.Co return interceptor(ctx, in, info, handler) } +func _GatewayConfig_WatchReactive_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(ReactiveWatchRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(GatewayConfigServer).WatchReactive(m, &gatewayConfigWatchReactiveServer{stream}) +} + +type GatewayConfig_WatchReactiveServer interface { + Send(*ReactiveEvents) error + grpc.ServerStream +} + +type gatewayConfigWatchReactiveServer struct { + grpc.ServerStream +} + +func (x *gatewayConfigWatchReactiveServer) Send(m *ReactiveEvents) error { + return x.ServerStream.SendMsg(m) +} + // GatewayConfig_ServiceDesc is the grpc.ServiceDesc for GatewayConfig service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -363,6 +422,12 @@ var GatewayConfig_ServiceDesc = grpc.ServiceDesc{ Handler: _GatewayConfig_ConfigurationHistory_Handler, }, }, - Streams: []grpc.StreamDesc{}, + Streams: []grpc.StreamDesc{ + { + StreamName: "WatchReactive", + Handler: _GatewayConfig_WatchReactive_Handler, + ServerStreams: true, + }, + }, Metadata: "github.com/rancher/opni/pkg/config/v1/gateway_config.proto", } diff --git a/pkg/config/v1/gateway_config_paths.pb.go b/pkg/config/v1/gateway_config_paths.pb.go index 4fcb6d725b..5566bdbfaf 100644 --- a/pkg/config/v1/gateway_config_paths.pb.go +++ b/pkg/config/v1/gateway_config_paths.pb.go @@ -1,7 +1,7 @@ // Code generated by internal/codegen/pathbuilder/generator.go. DO NOT EDIT. // source: github.com/rancher/opni/pkg/config/v1/gateway_config.proto -package v1 +package configv1 import ( v1 "github.com/rancher/opni/pkg/apis/core/v1" @@ -28,8 +28,11 @@ type ( cacheSpecPathBuilder protopath.Path filesystemCacheSpecPathBuilder protopath.Path keyringSpecPathBuilder protopath.Path + upgradesSpecPathBuilder protopath.Path agentUpgradesSpecPathBuilder protopath.Path kubernetesAgentUpgradeSpecPathBuilder protopath.Path + pluginUpgradesSpecPathBuilder protopath.Path + binaryPluginUpgradeSpecPathBuilder protopath.Path rateLimitingSpecPathBuilder protopath.Path authSpecPathBuilder protopath.Path basicAuthSpecPathBuilder protopath.Path @@ -70,8 +73,8 @@ func (p gatewayConfigSpecPathBuilder) Plugins() pluginsSpecPathBuilder { func (p gatewayConfigSpecPathBuilder) Keyring() keyringSpecPathBuilder { return keyringSpecPathBuilder(append(p, protopath.FieldAccess(((*GatewayConfigSpec)(nil)).ProtoReflect().Descriptor().Fields().ByNumber(10)))) } -func (p gatewayConfigSpecPathBuilder) AgentUpgrades() agentUpgradesSpecPathBuilder { - return agentUpgradesSpecPathBuilder(append(p, protopath.FieldAccess(((*GatewayConfigSpec)(nil)).ProtoReflect().Descriptor().Fields().ByNumber(11)))) +func (p gatewayConfigSpecPathBuilder) Upgrades() upgradesSpecPathBuilder { + return upgradesSpecPathBuilder(append(p, protopath.FieldAccess(((*GatewayConfigSpec)(nil)).ProtoReflect().Descriptor().Fields().ByNumber(11)))) } func (p gatewayConfigSpecPathBuilder) RateLimiting() rateLimitingSpecPathBuilder { return rateLimitingSpecPathBuilder(append(p, protopath.FieldAccess(((*GatewayConfigSpec)(nil)).ProtoReflect().Descriptor().Fields().ByNumber(12)))) @@ -100,8 +103,17 @@ func (p pluginsSpecPathBuilder) Cache() cacheSpecPathBuilder { func (p cacheSpecPathBuilder) Filesystem() filesystemCacheSpecPathBuilder { return filesystemCacheSpecPathBuilder(append(p, protopath.FieldAccess(((*CacheSpec)(nil)).ProtoReflect().Descriptor().Fields().ByNumber(3)))) } +func (p upgradesSpecPathBuilder) Agents() agentUpgradesSpecPathBuilder { + return agentUpgradesSpecPathBuilder(append(p, protopath.FieldAccess(((*UpgradesSpec)(nil)).ProtoReflect().Descriptor().Fields().ByNumber(1)))) +} +func (p upgradesSpecPathBuilder) Plugins() pluginUpgradesSpecPathBuilder { + return pluginUpgradesSpecPathBuilder(append(p, protopath.FieldAccess(((*UpgradesSpec)(nil)).ProtoReflect().Descriptor().Fields().ByNumber(2)))) +} func (p agentUpgradesSpecPathBuilder) Kubernetes() kubernetesAgentUpgradeSpecPathBuilder { - return kubernetesAgentUpgradeSpecPathBuilder(append(p, protopath.FieldAccess(((*AgentUpgradesSpec)(nil)).ProtoReflect().Descriptor().Fields().ByNumber(1)))) + return kubernetesAgentUpgradeSpecPathBuilder(append(p, protopath.FieldAccess(((*AgentUpgradesSpec)(nil)).ProtoReflect().Descriptor().Fields().ByNumber(2)))) +} +func (p pluginUpgradesSpecPathBuilder) Binary() binaryPluginUpgradeSpecPathBuilder { + return binaryPluginUpgradeSpecPathBuilder(append(p, protopath.FieldAccess(((*PluginUpgradesSpec)(nil)).ProtoReflect().Descriptor().Fields().ByNumber(2)))) } func (p authSpecPathBuilder) Basic() basicAuthSpecPathBuilder { return basicAuthSpecPathBuilder(append(p, protopath.FieldAccess(((*AuthSpec)(nil)).ProtoReflect().Descriptor().Fields().ByNumber(3)))) @@ -125,6 +137,9 @@ func (p serverSpecPathBuilder) HttpListenAddress() protopath.Path { func (p serverSpecPathBuilder) GrpcListenAddress() protopath.Path { return protopath.Path(append(p, protopath.FieldAccess(((*ServerSpec)(nil)).ProtoReflect().Descriptor().Fields().ByNumber(2)))) } +func (p serverSpecPathBuilder) AdvertiseAddress() protopath.Path { + return protopath.Path(append(p, protopath.FieldAccess(((*ServerSpec)(nil)).ProtoReflect().Descriptor().Fields().ByNumber(3)))) +} func (p managementServerSpecPathBuilder) HttpListenAddress() protopath.Path { return protopath.Path(append(p, protopath.FieldAccess(((*ManagementServerSpec)(nil)).ProtoReflect().Descriptor().Fields().ByNumber(1)))) } @@ -215,9 +230,6 @@ func (p pluginsSpecPathBuilder) Dir() protopath.Path { func (p pluginFiltersPathBuilder) Exclude() protopath.Path { return protopath.Path(append(p, protopath.FieldAccess(((*PluginFilters)(nil)).ProtoReflect().Descriptor().Fields().ByNumber(1)))) } -func (p cacheSpecPathBuilder) PatchEngine() protopath.Path { - return protopath.Path(append(p, protopath.FieldAccess(((*CacheSpec)(nil)).ProtoReflect().Descriptor().Fields().ByNumber(1)))) -} func (p cacheSpecPathBuilder) Backend() protopath.Path { return protopath.Path(append(p, protopath.FieldAccess(((*CacheSpec)(nil)).ProtoReflect().Descriptor().Fields().ByNumber(2)))) } @@ -227,9 +239,24 @@ func (p filesystemCacheSpecPathBuilder) Dir() protopath.Path { func (p keyringSpecPathBuilder) RuntimeKeyDirs() protopath.Path { return protopath.Path(append(p, protopath.FieldAccess(((*KeyringSpec)(nil)).ProtoReflect().Descriptor().Fields().ByNumber(1)))) } +func (p agentUpgradesSpecPathBuilder) Driver() protopath.Path { + return protopath.Path(append(p, protopath.FieldAccess(((*AgentUpgradesSpec)(nil)).ProtoReflect().Descriptor().Fields().ByNumber(1)))) +} func (p kubernetesAgentUpgradeSpecPathBuilder) ImageResolver() protopath.Path { return protopath.Path(append(p, protopath.FieldAccess(((*KubernetesAgentUpgradeSpec)(nil)).ProtoReflect().Descriptor().Fields().ByNumber(1)))) } +func (p kubernetesAgentUpgradeSpecPathBuilder) Namespace() protopath.Path { + return protopath.Path(append(p, protopath.FieldAccess(((*KubernetesAgentUpgradeSpec)(nil)).ProtoReflect().Descriptor().Fields().ByNumber(2)))) +} +func (p kubernetesAgentUpgradeSpecPathBuilder) RepoOverride() protopath.Path { + return protopath.Path(append(p, protopath.FieldAccess(((*KubernetesAgentUpgradeSpec)(nil)).ProtoReflect().Descriptor().Fields().ByNumber(3)))) +} +func (p pluginUpgradesSpecPathBuilder) Driver() protopath.Path { + return protopath.Path(append(p, protopath.FieldAccess(((*PluginUpgradesSpec)(nil)).ProtoReflect().Descriptor().Fields().ByNumber(1)))) +} +func (p binaryPluginUpgradeSpecPathBuilder) PatchEngine() protopath.Path { + return protopath.Path(append(p, protopath.FieldAccess(((*BinaryPluginUpgradeSpec)(nil)).ProtoReflect().Descriptor().Fields().ByNumber(1)))) +} func (p rateLimitingSpecPathBuilder) Rate() protopath.Path { return protopath.Path(append(p, protopath.FieldAccess(((*RateLimitingSpec)(nil)).ProtoReflect().Descriptor().Fields().ByNumber(1)))) } diff --git a/pkg/config/v1/manager.go b/pkg/config/v1/manager.go index af5c2616ef..107e3b55ff 100644 --- a/pkg/config/v1/manager.go +++ b/pkg/config/v1/manager.go @@ -1,11 +1,37 @@ -package v1 +package configv1 import ( context "context" + "strings" + corev1 "github.com/rancher/opni/pkg/apis/core/v1" + "github.com/rancher/opni/pkg/config/reactive" driverutil "github.com/rancher/opni/pkg/plugins/driverutil" + storage "github.com/rancher/opni/pkg/storage" + "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + protopath "google.golang.org/protobuf/reflect/protopath" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" ) +type GatewayConfigManagerOptions struct { + controllerOptions []reactive.ControllerOption +} + +type GatewayConfigManagerOption func(*GatewayConfigManagerOptions) + +func (o *GatewayConfigManagerOptions) apply(opts ...GatewayConfigManagerOption) { + for _, op := range opts { + op(o) + } +} + +func WithControllerOptions(controllerOptions ...reactive.ControllerOption) GatewayConfigManagerOption { + return func(o *GatewayConfigManagerOptions) { + o.controllerOptions = append(o.controllerOptions, controllerOptions...) + } +} + type GatewayConfigManager struct { *driverutil.BaseConfigServer[ *driverutil.GetRequest, @@ -15,6 +41,22 @@ type GatewayConfigManager struct { *HistoryResponse, *GatewayConfigSpec, ] + + *reactive.Controller[*GatewayConfigSpec] +} + +func NewGatewayConfigManager( + defaultStore, activeStore storage.ValueStoreT[*GatewayConfigSpec], + loadDefaultsFunc driverutil.DefaultLoaderFunc[*GatewayConfigSpec], + opts ...GatewayConfigManagerOption, +) *GatewayConfigManager { + options := GatewayConfigManagerOptions{} + options.apply(opts...) + + g := &GatewayConfigManager{} + g.BaseConfigServer = g.Build(defaultStore, activeStore, loadDefaultsFunc) + g.Controller = reactive.NewController(g.Tracker(), options.controllerOptions...) + return g } func (s *GatewayConfigManager) DryRun(ctx context.Context, req *DryRunRequest) (*DryRunResponse, error) { @@ -28,3 +70,67 @@ func (s *GatewayConfigManager) DryRun(ctx context.Context, req *DryRunRequest) ( ValidationErrors: res.ValidationErrors.ToProto(), }, nil } + +func (s *GatewayConfigManager) WatchReactive(in *ReactiveWatchRequest, stream GatewayConfig_WatchReactiveServer) error { + rvs := make([]reactive.Value, 0, len(in.Paths)) + for _, pathstr := range in.Paths { + path := protopath.Path(ProtoPath()) + for _, p := range strings.Split(pathstr, ".") { + prev := path.Index(-1) + switch prev.Kind() { + case protopath.RootStep: + field := prev.MessageDescriptor().Fields().ByName(protoreflect.Name(p)) + if field == nil { + return status.Errorf(codes.InvalidArgument, "invalid path %q in field mask: no such field %q in message %s", + pathstr, p, prev.MessageDescriptor().FullName()) + } + path = append(path, protopath.FieldAccess(field)) + case protopath.FieldAccessStep: + msg := prev.FieldDescriptor().Message() + if msg == nil { + return status.Errorf(codes.InvalidArgument, "invalid path %q in field mask: field %q in message %s is not a message", + pathstr, prev.FieldDescriptor().Name(), prev.MessageDescriptor().FullName()) + } + field := msg.Fields().ByName(protoreflect.Name(p)) + if field == nil { + return status.Errorf(codes.InvalidArgument, "invalid path %q in field mask: no such field %q in message %s", + pathstr, p, msg.FullName()) + } + path = append(path, protopath.FieldAccess(field)) + } + } + + rvs = append(rvs, s.Reactive(path)) + } + + if in.Bind { + reactive.Bind(stream.Context(), func(v []protoreflect.Value) { + items := make([]*ReactiveEvent, 0, len(v)) + for i, value := range v { + items = append(items, &ReactiveEvent{ + Index: int32(i), + Value: corev1.NewValue(value), + }) + } + stream.Send(&ReactiveEvents{Items: items}) + }, rvs...) + } else { + for i, rv := range rvs { + i := i + rv.WatchFunc(stream.Context(), func(value protoreflect.Value) { + stream.Send(&ReactiveEvents{ + Items: []*ReactiveEvent{ + { + Index: int32(i), + Value: corev1.NewValue(value), + }, + }, + }) + }) + } + } + + return nil +} + +var ProtoPath = (&GatewayConfigSpec{}).ProtoPath diff --git a/pkg/config/v1/manager_test.go b/pkg/config/v1/manager_test.go new file mode 100644 index 0000000000..32e960d72e --- /dev/null +++ b/pkg/config/v1/manager_test.go @@ -0,0 +1,169 @@ +package configv1_test + +import ( + context "context" + errors "errors" + "strings" + "time" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + + "github.com/rancher/opni/pkg/config/reactive" + configv1 "github.com/rancher/opni/pkg/config/v1" + "github.com/rancher/opni/pkg/storage/inmemory" + "github.com/rancher/opni/pkg/test/testutil" + "github.com/rancher/opni/pkg/util" + "github.com/rancher/opni/pkg/util/fieldmask" + "github.com/rancher/opni/pkg/util/flagutil" + "github.com/rancher/opni/pkg/util/pathreflect" + "github.com/rancher/opni/pkg/util/protorand" +) + +// Note that this test is run in the v1 package, not v1_test, since we need +// reflect access to unexported types. + +var _ = Describe("Gateway Config Manager", Label("unit"), func() { + var mgr *configv1.GatewayConfigManager + defaultStore := inmemory.NewValueStore[*configv1.GatewayConfigSpec](util.ProtoClone) + activeStore := inmemory.NewValueStore[*configv1.GatewayConfigSpec](util.ProtoClone) + + BeforeEach(func() { + mgr = configv1.NewGatewayConfigManager(defaultStore, activeStore, flagutil.LoadDefaults) + ctx, ca := context.WithCancel(context.Background()) + Expect(mgr.Start(ctx)).To(Succeed()) + DeferCleanup(ca) + }) + + It("should create reactive messages", func(ctx SpecContext) { + msg := &configv1.GatewayConfigSpec{} + rand := protorand.New[*configv1.GatewayConfigSpec]() + rand.ExcludeMask(&fieldmaskpb.FieldMask{ + Paths: []string{ + "revision", + }, + }) + rand.Seed(GinkgoRandomSeed()) + + By("creating reactive messages for every possible path") + allPaths := pathreflect.AllPaths(msg) + reactiveMsgs := make([]reactive.Value, len(allPaths)) + + verifyWatches := func(spec *configv1.GatewayConfigSpec, ws []<-chan protoreflect.Value, pathsToCheck ...map[string]struct{}) { + recvFailures := []error{} + ALL_PATHS: + for i := 0; i < len(allPaths); i++ { + path := allPaths[i] + rm := reactiveMsgs[i] + w := ws[i] + + if strings.HasPrefix(path.String(), "(config.v1.GatewayConfigSpec).revision") { + // ignore the revision field; a reactive message for it has undefined behavior + select { + case <-w: + default: + } + continue + } + + if len(pathsToCheck) > 0 { + if _, ok := pathsToCheck[0][path[1:].String()[1:]]; !ok { + Expect(w).NotTo(Receive(), "expected not to receive an update for path %s", path) + continue + } + } + + var v protoreflect.Value + RECV: + for i := 0; i < 10; i++ { + select { + case v = <-w: + break RECV + default: + time.Sleep(10 * time.Millisecond) + } + if i == 9 { + recvFailures = append(recvFailures, errors.New("did not receive an update for path "+path.String())) + continue ALL_PATHS + } + } + var actual protoreflect.Value + if spec == nil { + actual = protoreflect.ValueOf(nil) + } else { + actual = pathreflect.Value(spec, path) + } + Expect(v).To(testutil.ProtoValueEqual(rm.Value())) + Expect(v).To(testutil.ProtoValueEqual(actual)) + } + + Expect(errors.Join(recvFailures...)).To(BeNil()) + + for _, c := range ws { + Expect(c).To(HaveLen(0), "expected all watchers to be read") + } + } + + watches := make([]<-chan protoreflect.Value, len(allPaths)) + for i, path := range allPaths { + rm := mgr.Reactive(path) + reactiveMsgs[i] = rm + + c := rm.Watch(ctx) + watches[i] = c + + Expect(len(c)).To(BeZero()) + } + + By("setting all fields in the spec to random values") + spec := rand.MustGen() + _, err := mgr.SetConfiguration(ctx, &configv1.SetRequest{ + Spec: spec, + }) + Expect(err).NotTo(HaveOccurred()) + + By("verifying that all reactive messages received an update") + verifyWatches(spec, watches) + + By("adding a second watch to each reactive message") + watches2 := make([]<-chan protoreflect.Value, len(watches)) + + for i, rm := range reactiveMsgs { + watches2[i] = rm.Watch(ctx) + } + + By("verifying that new watches receive the current value") + verifyWatches(spec, watches2) + + By("modifying all fields in the spec") + spec2 := rand.MustGen() + _, err = mgr.SetConfiguration(ctx, &configv1.SetRequest{ + Spec: spec2, + }) + Expect(err).NotTo(HaveOccurred()) + + By("verifying that both watches received an update") + // some fields have a limited set of possible values + updatedFields := fieldmask.Diff(spec, spec2).Paths + pathsToCheck := map[string]struct{}{} + for _, path := range updatedFields { + parts := strings.Split(path, ".") + for i := range parts { + pathsToCheck[strings.Join(parts[:i+1], ".")] = struct{}{} + } + } + verifyWatches(spec2, watches2, pathsToCheck) + verifyWatches(spec2, watches, pathsToCheck) + + By("deleting the configuration") + err = mgr.Tracker().ResetConfig(ctx, nil, nil) + Expect(err).NotTo(HaveOccurred()) + + By("verifying that all reactive messages received an update") + verifyWatches(nil, watches2) + verifyWatches(nil, watches) + }) + +}) diff --git a/pkg/config/v1/validation_test.go b/pkg/config/v1/validation_test.go index 83f7da6c54..43e30291f6 100644 --- a/pkg/config/v1/validation_test.go +++ b/pkg/config/v1/validation_test.go @@ -1,4 +1,4 @@ -package v1_test +package configv1_test import ( "fmt" @@ -9,7 +9,7 @@ import ( lo "github.com/samber/lo" "github.com/ttacon/chalk" - v1 "github.com/rancher/opni/pkg/config/v1" + configv1 "github.com/rancher/opni/pkg/config/v1" "github.com/rancher/opni/pkg/test/testdata" "github.com/rancher/opni/pkg/util/flagutil" "github.com/rancher/opni/pkg/validation" @@ -64,47 +64,47 @@ var _ = Describe("Gateway Config", Label("unit"), Ordered, func() { }, // Listen Addresses - Entry("Listen Addresses (Server/Server)", withDefaults(func(cfg *v1.GatewayConfigSpec) { - cfg.Storage.Etcd = &v1.EtcdSpec{Endpoints: []string{"localhost:2379"}} + Entry("Listen Addresses (Server/Server)", withDefaults(func(cfg *configv1.GatewayConfigSpec) { + cfg.Storage.Etcd = &configv1.EtcdSpec{Endpoints: []string{"localhost:2379"}} *cfg.Server.HttpListenAddress = *cfg.Server.GrpcListenAddress }), "[check_conflicting_addresses]"), - Entry("Listen Addresses (Management/Management)", withDefaults(func(cfg *v1.GatewayConfigSpec) { - cfg.Storage.Etcd = &v1.EtcdSpec{Endpoints: []string{"localhost:2379"}} + Entry("Listen Addresses (Management/Management)", withDefaults(func(cfg *configv1.GatewayConfigSpec) { + cfg.Storage.Etcd = &configv1.EtcdSpec{Endpoints: []string{"localhost:2379"}} *cfg.Management.HttpListenAddress = *cfg.Management.GrpcListenAddress }), "[check_conflicting_addresses]"), - Entry("Listen Addresses (Relay/Server)", withDefaults(func(cfg *v1.GatewayConfigSpec) { - cfg.Storage.Etcd = &v1.EtcdSpec{Endpoints: []string{"localhost:2379"}} + Entry("Listen Addresses (Relay/Server)", withDefaults(func(cfg *configv1.GatewayConfigSpec) { + cfg.Storage.Etcd = &configv1.EtcdSpec{Endpoints: []string{"localhost:2379"}} *cfg.Relay.GrpcListenAddress = *cfg.Server.GrpcListenAddress }), "[check_conflicting_addresses]"), - Entry("Listen Addresses (Relay/Management)", withDefaults(func(cfg *v1.GatewayConfigSpec) { - cfg.Storage.Etcd = &v1.EtcdSpec{Endpoints: []string{"localhost:2379"}} + Entry("Listen Addresses (Relay/Management)", withDefaults(func(cfg *configv1.GatewayConfigSpec) { + cfg.Storage.Etcd = &configv1.EtcdSpec{Endpoints: []string{"localhost:2379"}} *cfg.Relay.GrpcListenAddress = *cfg.Management.GrpcListenAddress }), "[check_conflicting_addresses]"), - Entry("Listen Addresses (Server/Management)", withDefaults(func(cfg *v1.GatewayConfigSpec) { - cfg.Storage.Etcd = &v1.EtcdSpec{Endpoints: []string{"localhost:2379"}} + Entry("Listen Addresses (Server/Management)", withDefaults(func(cfg *configv1.GatewayConfigSpec) { + cfg.Storage.Etcd = &configv1.EtcdSpec{Endpoints: []string{"localhost:2379"}} *cfg.Server.GrpcListenAddress = *cfg.Management.GrpcListenAddress }), "[check_conflicting_addresses]"), - Entry("Listen Addresses (Server/Relay)", withDefaults(func(cfg *v1.GatewayConfigSpec) { - cfg.Storage.Etcd = &v1.EtcdSpec{Endpoints: []string{"localhost:2379"}} + Entry("Listen Addresses (Server/Relay)", withDefaults(func(cfg *configv1.GatewayConfigSpec) { + cfg.Storage.Etcd = &configv1.EtcdSpec{Endpoints: []string{"localhost:2379"}} *cfg.Server.GrpcListenAddress = *cfg.Relay.GrpcListenAddress }), "[check_conflicting_addresses]"), - Entry("Listen Addresses (Management/Relay)", withDefaults(func(cfg *v1.GatewayConfigSpec) { - cfg.Storage.Etcd = &v1.EtcdSpec{Endpoints: []string{"localhost:2379"}} + Entry("Listen Addresses (Management/Relay)", withDefaults(func(cfg *configv1.GatewayConfigSpec) { + cfg.Storage.Etcd = &configv1.EtcdSpec{Endpoints: []string{"localhost:2379"}} *cfg.Management.GrpcListenAddress = *cfg.Relay.GrpcListenAddress }), "[check_conflicting_addresses]"), - Entry("Server Addresses", &v1.ServerSpec{ + Entry("Server Addresses", &configv1.ServerSpec{ HttpListenAddress: lo.ToPtr("0.0.0.0.0:65537"), GrpcListenAddress: lo.ToPtr("unix://127.0.0.1:9090"), }, "httpListenAddress: invalid IP address", "grpcListenAddress: address unix://127.0.0.1:9090: too many colons in address"), - Entry("Server Addresses", &v1.ServerSpec{ + Entry("Server Addresses", &configv1.ServerSpec{ HttpListenAddress: lo.ToPtr("http://localhost:8080"), GrpcListenAddress: lo.ToPtr("0.0.0.0:65537"), }, "httpListenAddress: address http://localhost:8080: too many colons in address", "grpcListenAddress: port number out of range"), - Entry("Server Addresses", &v1.ServerSpec{ + Entry("Server Addresses", &configv1.ServerSpec{ HttpListenAddress: lo.ToPtr("localhost:8080"), GrpcListenAddress: lo.ToPtr("unix:///tmp/sock"), }), - Entry("Management Addresses", &v1.ManagementServerSpec{ + Entry("Management Addresses", &configv1.ManagementServerSpec{ HttpListenAddress: lo.ToPtr("0.0.0.0.0:65537"), GrpcListenAddress: lo.ToPtr("unix://127.0.0.1:9090"), AdvertiseAddress: lo.ToPtr("0.0.0.0:0"), @@ -113,210 +113,210 @@ var _ = Describe("Gateway Config", Label("unit"), Ordered, func() { "grpcListenAddress: address unix://127.0.0.1:9090: too many colons in address", "[mgmt_grpc_advertise_address_port]", ), - Entry("Management Addresses", &v1.ManagementServerSpec{ + Entry("Management Addresses", &configv1.ManagementServerSpec{ HttpListenAddress: lo.ToPtr("127.0.0.1:12345"), GrpcListenAddress: lo.ToPtr("127.0.0.1:12346"), AdvertiseAddress: lo.ToPtr("127.0.0.1:12347"), }), - Entry("Relay Addresses", &v1.RelayServerSpec{ + Entry("Relay Addresses", &configv1.RelayServerSpec{ GrpcListenAddress: lo.ToPtr("unix://127.0.0.1:9090"), AdvertiseAddress: lo.ToPtr("0.0.0.0:0"), }, "grpcListenAddress: address unix://127.0.0.1:9090: too many colons in address", "[relay_grpc_advertise_address_port]", ), - Entry("Relay Addresses", &v1.RelayServerSpec{ + Entry("Relay Addresses", &configv1.RelayServerSpec{ GrpcListenAddress: lo.ToPtr("127.0.0.1:12345"), AdvertiseAddress: lo.ToPtr("127.0.0.1:12346"), }), - Entry("Health Server Addresses", &v1.HealthServerSpec{ + Entry("Health Server Addresses", &configv1.HealthServerSpec{ HttpListenAddress: lo.ToPtr("z"), }, "httpListenAddress: address z: missing port in address"), - Entry("Health Server Addresses", &v1.HealthServerSpec{ + Entry("Health Server Addresses", &configv1.HealthServerSpec{ HttpListenAddress: lo.ToPtr("z:"), }, "httpListenAddress: invalid IP address"), - Entry("Health Server Addresses", &v1.HealthServerSpec{ + Entry("Health Server Addresses", &configv1.HealthServerSpec{ HttpListenAddress: lo.ToPtr("localhost:"), }), - Entry("Health Server Addresses", &v1.HealthServerSpec{ + Entry("Health Server Addresses", &configv1.HealthServerSpec{ HttpListenAddress: lo.ToPtr("localhost:0"), }), - Entry("Dashboard Server Addresses", &v1.DashboardServerSpec{ + Entry("Dashboard Server Addresses", &configv1.DashboardServerSpec{ HttpListenAddress: lo.ToPtr("0.0.0.0.0:65537"), AdvertiseAddress: lo.ToPtr(":0"), }, "httpListenAddress: invalid IP address", "[dashboard_http_advertise_address_port]"), - Entry("Dashboard Server Hostname", &v1.DashboardServerSpec{ + Entry("Dashboard Server Hostname", &configv1.DashboardServerSpec{ Hostname: lo.ToPtr("localhost"), }), - Entry("Dashboard Server Hostname", &v1.DashboardServerSpec{ + Entry("Dashboard Server Hostname", &configv1.DashboardServerSpec{ Hostname: lo.ToPtr("localhost:8080"), }, "hostname: value must be a valid hostname"), - Entry("Dashboard Server Hostname", &v1.DashboardServerSpec{ + Entry("Dashboard Server Hostname", &configv1.DashboardServerSpec{ Hostname: lo.ToPtr("localhost:"), }, "hostname: value must be a valid hostname"), - Entry("Dashboard Server Hostname", &v1.DashboardServerSpec{ + Entry("Dashboard Server Hostname", &configv1.DashboardServerSpec{ Hostname: lo.ToPtr(""), }, "hostname: value must be a valid hostname"), - Entry("Dashboard Server Trusted Proxies", &v1.DashboardServerSpec{ + Entry("Dashboard Server Trusted Proxies", &configv1.DashboardServerSpec{ TrustedProxies: []string{"localhost"}, }, "must be a valid IP address or CIDR"), - Entry("Dashboard Server Trusted Proxies", &v1.DashboardServerSpec{ + Entry("Dashboard Server Trusted Proxies", &configv1.DashboardServerSpec{ TrustedProxies: []string{"192.168.1.1/33"}, }, "must be a valid IP address or CIDR"), - Entry("Dashboard Server Trusted Proxies", &v1.DashboardServerSpec{ + Entry("Dashboard Server Trusted Proxies", &configv1.DashboardServerSpec{ TrustedProxies: []string{"10.0.0.0/8", "192.168.1.0/24"}, }), // Storage - Entry("Storage: Etcd", &v1.StorageSpec{ - Backend: lo.ToPtr(v1.StorageBackend_Etcd), - Etcd: &v1.EtcdSpec{}, + Entry("Storage: Etcd", &configv1.StorageSpec{ + Backend: lo.ToPtr(configv1.StorageBackend_Etcd), + Etcd: &configv1.EtcdSpec{}, }, "etcd.endpoints: value must contain at least 1 item(s)"), - Entry("Storage: Etcd", &v1.StorageSpec{ - Backend: lo.ToPtr(v1.StorageBackend_JetStream), - Etcd: &v1.EtcdSpec{}, + Entry("Storage: Etcd", &configv1.StorageSpec{ + Backend: lo.ToPtr(configv1.StorageBackend_JetStream), + Etcd: &configv1.EtcdSpec{}, }, "selected storage backend must have matching configuration set"), - Entry("Storage: Etcd", &v1.EtcdSpec{ + Entry("Storage: Etcd", &configv1.EtcdSpec{ Endpoints: []string{"localhost:2379"}, - Certs: &v1.MTLSSpec{ + Certs: &configv1.MTLSSpec{ ServerCAData: &caCertData, ClientCertData: &leafCertData, ClientKeyData: &leafKeyData, }, }), - Entry("Storage: Etcd", &v1.EtcdSpec{ + Entry("Storage: Etcd", &configv1.EtcdSpec{ Endpoints: []string{"localhost:2379", "http://localhost:2380", "aaaa", "aaaa"}, }, "endpoints: repeated value must contain unique items"), - Entry("Storage: Etcd", &v1.EtcdSpec{ + Entry("Storage: Etcd", &configv1.EtcdSpec{ Endpoints: []string{"localhost:2379", "http://localhost:2380", "aaaa", "http://\x7f"}, }, "endpoints[3]: value must be a valid URI"), - Entry("Storage: Jetstream", &v1.StorageSpec{ - Backend: lo.ToPtr(v1.StorageBackend_JetStream), - JetStream: &v1.JetStreamSpec{}, + Entry("Storage: Jetstream", &configv1.StorageSpec{ + Backend: lo.ToPtr(configv1.StorageBackend_JetStream), + JetStream: &configv1.JetStreamSpec{}, }, "jetStream.endpoint: value is required", "jetStream.nkeySeedPath: value is required"), - Entry("Storage: Jetstream", &v1.StorageSpec{ - Backend: lo.ToPtr(v1.StorageBackend_Etcd), - JetStream: &v1.JetStreamSpec{}, + Entry("Storage: Jetstream", &configv1.StorageSpec{ + Backend: lo.ToPtr(configv1.StorageBackend_Etcd), + JetStream: &configv1.JetStreamSpec{}, }, "selected storage backend must have matching configuration set"), // MTLS - Entry("MTLS", &v1.MTLSSpec{ + Entry("MTLS", &configv1.MTLSSpec{ ServerCA: lo.ToPtr("/path/to/crt"), ServerCAData: &caCertData, }, "[fields_mutually_exclusive_serverca]"), - Entry("MTLS", &v1.MTLSSpec{ + Entry("MTLS", &configv1.MTLSSpec{ ClientCA: lo.ToPtr("/path/to/crt"), ClientCAData: &caCertData, }, "[fields_mutually_exclusive_clientca]"), - Entry("MTLS", &v1.MTLSSpec{ + Entry("MTLS", &configv1.MTLSSpec{ ClientCert: lo.ToPtr("/path/to/crt"), ClientCertData: &leafCertData, }, "[fields_mutually_exclusive_clientcert]"), - Entry("MTLS", &v1.MTLSSpec{ + Entry("MTLS", &configv1.MTLSSpec{ ClientKey: lo.ToPtr("/path/to/key"), ClientKeyData: &leafKeyData, }, "[fields_mutually_exclusive_clientkey]"), - Entry("MTLS", &v1.MTLSSpec{ + Entry("MTLS", &configv1.MTLSSpec{ ServerCAData: lo.ToPtr("invalid x509 data"), }, "[x509_server_ca_data]"), - Entry("MTLS", &v1.MTLSSpec{ + Entry("MTLS", &configv1.MTLSSpec{ ClientCAData: lo.ToPtr("invalid x509 data"), }, "[x509_client_ca_data]"), - Entry("MTLS", &v1.MTLSSpec{ + Entry("MTLS", &configv1.MTLSSpec{ ClientCertData: lo.ToPtr("invalid x509 data"), }, "[x509_client_cert_data]"), - Entry("MTLS", &v1.MTLSSpec{ + Entry("MTLS", &configv1.MTLSSpec{ ClientKeyData: lo.ToPtr("invalid pem data"), }, "[pem_client_key_data]"), - Entry("MTLS", &v1.MTLSSpec{ + Entry("MTLS", &configv1.MTLSSpec{ ServerCAData: &caCertData, ClientCertData: &leafCertData, ClientKeyData: &leafKeyData, }), - Entry("MTLS", &v1.MTLSSpec{ + Entry("MTLS", &configv1.MTLSSpec{ ServerCAData: &leafCertData, ClientCertData: &caCertData, ClientKeyData: &leafKeyData, }, "x509: invalid signature: parent certificate cannot sign this kind of certificate"), - Entry("MTLS", &v1.MTLSSpec{ + Entry("MTLS", &configv1.MTLSSpec{ ServerCAData: &leafKeyData, ClientCertData: &caCertData, ClientKeyData: &leafCertData, }, "x509: malformed tbs certificate", "serverCAData: x509: malformed tbs certificate"), // Jetstream - Entry("Jetstream", &v1.JetStreamSpec{ + Entry("Jetstream", &configv1.JetStreamSpec{ Endpoint: lo.ToPtr("localhost:4222"), }, "nkeySeedPath: value is required"), - Entry("Jetstream", &v1.JetStreamSpec{ + Entry("Jetstream", &configv1.JetStreamSpec{ Endpoint: lo.ToPtr("localhost:4222"), NkeySeedPath: lo.ToPtr("/path/to/nkey/seed"), }), - Entry("Jetstream", &v1.JetStreamSpec{ + Entry("Jetstream", &configv1.JetStreamSpec{ Endpoint: lo.ToPtr("localhost:\x7f"), NkeySeedPath: lo.ToPtr("/path/to/nkey/seed"), }, "endpoint: value must be a valid URI"), // Certs - Entry("Certs", &v1.CertsSpec{ + Entry("Certs", &configv1.CertsSpec{ CaCert: lo.ToPtr("/path/to/crt"), CaCertData: &caCertData, }, "[fields_mutually_exclusive_ca]"), - Entry("Certs", &v1.CertsSpec{ + Entry("Certs", &configv1.CertsSpec{ ServingCert: lo.ToPtr("/path/to/crt"), ServingCertData: &leafCertData, }, "[fields_mutually_exclusive_servingcert]"), - Entry("Certs", &v1.CertsSpec{ + Entry("Certs", &configv1.CertsSpec{ ServingKey: lo.ToPtr("/path/to/key"), ServingKeyData: &leafKeyData, }, "[fields_mutually_exclusive_servingkey]"), - Entry("Certs", &v1.CertsSpec{ + Entry("Certs", &configv1.CertsSpec{ CaCertData: lo.ToPtr("invalid x509 data"), }, "[x509_ca_cert_data]"), - Entry("Certs", &v1.CertsSpec{ + Entry("Certs", &configv1.CertsSpec{ ServingCertData: lo.ToPtr("invalid x509 data"), }, "[x509_serving_cert_data]"), - Entry("Certs", &v1.CertsSpec{ + Entry("Certs", &configv1.CertsSpec{ ServingKeyData: lo.ToPtr("invalid pem data"), }, "[pem_serving_key_data]"), - Entry("Certs", &v1.CertsSpec{ + Entry("Certs", &configv1.CertsSpec{ CaCertData: &caCertData, ServingCertData: &leafCertData, ServingKeyData: &leafKeyData, }), - Entry("Certs", &v1.CertsSpec{ + Entry("Certs", &configv1.CertsSpec{ CaCertData: &leafCertData, ServingCertData: &caCertData, ServingKeyData: &leafKeyData, }, "x509: invalid signature: parent certificate cannot sign this kind of certificate"), - Entry("Certs", &v1.CertsSpec{ + Entry("Certs", &configv1.CertsSpec{ CaCertData: &leafKeyData, ServingCertData: &caCertData, ServingKeyData: &leafCertData, }, "x509: malformed tbs certificate", "caCertData: x509: malformed tbs certificate"), // Plugins - Entry("Plugins", &v1.PluginsSpec{ + Entry("Plugins", &configv1.PluginsSpec{ Dir: lo.ToPtr("/foo/bar/baz"), - Cache: &v1.CacheSpec{ - Filesystem: &v1.FilesystemCacheSpec{ + Cache: &configv1.CacheSpec{ + Filesystem: &configv1.FilesystemCacheSpec{ Dir: lo.ToPtr("/foo/bar/baz"), }, }, }, "[plugin_dirs_unique]"), - Entry("Plugins", &v1.PluginsSpec{ + Entry("Plugins", &configv1.PluginsSpec{ Dir: lo.ToPtr("/foo/bar/baz"), - Cache: &v1.CacheSpec{ - Filesystem: &v1.FilesystemCacheSpec{ + Cache: &configv1.CacheSpec{ + Filesystem: &configv1.FilesystemCacheSpec{ Dir: lo.ToPtr("/foo/bar/cache"), }, }, }), - Entry("Plugins", &v1.PluginFilters{ + Entry("Plugins", &configv1.PluginFilters{ Exclude: []string{ "github.com/foo/bar", "foo/bar", @@ -328,14 +328,13 @@ var _ = Describe("Gateway Config", Label("unit"), Ordered, func() { ), // Plugin Cache - Entry("Plugin Cache", &v1.CacheSpec{ - PatchEngine: lo.ToPtr(v1.PatchEngine_Bsdiff), - Backend: lo.ToPtr(v1.CacheBackend_Filesystem), - Filesystem: &v1.FilesystemCacheSpec{}, + Entry("Plugin Cache", &configv1.CacheSpec{ + Backend: lo.ToPtr(configv1.CacheBackend_Filesystem), + Filesystem: &configv1.FilesystemCacheSpec{}, }, "dir: value is required"), // Keyring - Entry("Keyring", &v1.KeyringSpec{ + Entry("Keyring", &configv1.KeyringSpec{ RuntimeKeyDirs: []string{"/foo/bar/baz", "/foo/bar/baz"}, }, "runtimeKeyDirs: repeated value must contain unique items"), ) diff --git a/pkg/plugins/driverutil/config.go b/pkg/plugins/driverutil/config.go index 656679e6b1..05ab4edfbe 100644 --- a/pkg/plugins/driverutil/config.go +++ b/pkg/plugins/driverutil/config.go @@ -130,6 +130,10 @@ func (ct *DefaultingConfigTracker[T]) getDefaultConfigLocked(ctx context.Context return def, revision, nil } +func (ct *DefaultingConfigTracker[T]) ActiveStore() storage.ValueStoreT[T] { + return ct.activeStore +} + // Returns the active config if it has been set, otherwise returns a "not found" error. // An optional revision can be provided to get the config at a specific revision. func (ct *DefaultingConfigTracker[T]) GetConfig(ctx context.Context, atRevision ...*corev1.Revision) (T, error) {