Repository: pomerium/pomerium

Issue:
Add PPL criterion for matching IP address
Feature request: add a new `source_ip` criterion for matching on request source IP address.

This criterion would accept either a string or list of strings, containing one or more IP addresses or CIDR ranges. The criterion matches if the request source IP address matches any one of the IP addresses or CIDR ranges.

Example usage:
```
- source_ip: "192.168.1.2"
```

```
- source_ip: "10.1.0.0/16"
```

```
- source_ip:
    - "1.2.3.4"
    - "192.168.2.0/24"
    - "::1"
    - "2001:db8::/32"
```

Hints from issue comments:

Solution patch:
diff --git a/authorize/authorize.go b/authorize/authorize.go
index d52176ea..e24b1ad6 100644
--- a/authorize/authorize.go
+++ b/authorize/authorize.go
@@ -56,15 +56,14 @@ func New(ctx context.Context, cfg *config.Config) (*Authorize, error) {
 		tracerProvider: tracerProvider,
 		tracer:         tracer,
 	}
-	a.accessTracker = NewAccessTracker(a, accessTrackerMaxSize, accessTrackerDebouncePeriod)
-	a.ssh = ssh.NewStreamManager(ctx, ssh.NewAuth(a, a.currentConfig, a.tracerProvider), cfg)
-
 	state, err := newAuthorizeStateFromConfig(ctx, nil, tracerProvider, cfg, a.store, &a.outboundGrpcConn)
 	if err != nil {
 		return nil, err
 	}
 	a.state = atomicutil.NewValue(state)
 
+	a.accessTracker = NewAccessTracker(a, accessTrackerMaxSize, accessTrackerDebouncePeriod)
+	a.ssh = ssh.NewStreamManager(ssh.NewAuth(a, a.currentConfig, a.tracerProvider), cfg)
 	return a, nil
 }
 
@@ -76,6 +75,9 @@ func (a *Authorize) GetDataBrokerServiceClient() databroker.DataBrokerServiceCli
 // Run runs the authorize service.
 func (a *Authorize) Run(ctx context.Context) error {
 	eg, ctx := errgroup.WithContext(ctx)
+	eg.Go(func() error {
+		return a.ssh.Run(ctx)
+	})
 	eg.Go(func() error {
 		a.accessTracker.Run(ctx)
 		return nil
diff --git a/authorize/ssh_grpc.go b/authorize/ssh_grpc.go
index 234c2582..ea2dba15 100644
--- a/authorize/ssh_grpc.go
+++ b/authorize/ssh_grpc.go
@@ -94,7 +94,7 @@ func (a *Authorize) ServeChannel(stream extensions_ssh.StreamManagement_ServeCha
 	return handler.ServeChannel(stream)
 }
 
-func (a *Authorize) EvaluateSSH(ctx context.Context, req *ssh.Request) (*evaluator.Result, error) {
+func (a *Authorize) EvaluateSSH(ctx context.Context, streamID uint64, req *ssh.Request) (*evaluator.Result, error) {
 	ctx = a.withQuerierForCheckRequest(ctx)
 
 	evalreq := evaluator.Request{
@@ -122,7 +122,16 @@ func (a *Authorize) EvaluateSSH(ctx context.Context, req *ssh.Request) (*evaluat
 		return nil, err
 	}
 
-	skipLogging := req.LogOnlyIfDenied && res.Allow.Value && !res.Deny.Value
+	allowed := res.Allow.Value && !res.Deny.Value
+
+	if allowed {
+		if err := a.ssh.SetSessionIDForStream(streamID, req.SessionID); err != nil {
+			log.Ctx(ctx).Error().Err(err).Msg("failed to set session id for stream")
+			return nil, err
+		}
+	}
+
+	skipLogging := req.LogOnlyIfDenied && allowed
 	if !skipLogging {
 		s, _ := a.getDataBrokerSessionOrServiceAccount(ctx, req.SessionID, 0)
 
diff --git a/config/dns.go b/config/dns.go
new file mode 100644
index 00000000..fddc6d4f
--- /dev/null
+++ b/config/dns.go
@@ -0,0 +1,77 @@
+package config
+
+import (
+	"fmt"
+	"strings"
+	"time"
+
+	envoy_extensions_clusters_common_dns_v3 "github.com/envoyproxy/go-control-plane/envoy/extensions/clusters/common/dns/v3"
+	"github.com/volatiletech/null/v9"
+)
+
+// DNSOptions are options related to DNS.
+type DNSOptions struct {
+	// LookupFamily is the DNS IP address resolution policy.
+	// If this setting is not specified, the value defaults to V4_PREFERRED.
+	LookupFamily string `mapstructure:"dns_lookup_family" yaml:"dns_lookup_family,omitempty"`
+	// UDPMaxqueries caps the number of UDP based DNS queries on a single port.
+	UDPMaxQueries null.Uint32 `mapstructure:"dns_udp_max_queries" yaml:"dns_udp_max_queries,omitempty"`
+	// UseTCP uses TCP for all DNS queries instead of the default protocol UDP.
+	UseTCP null.Bool `mapstructure:"dns_use_tcp" yaml:"dns_use_tcp,omitempty"`
+	// QueryTries is the maximum number of query attempts the resolver will make before giving up. Each attempt may use a different name server.
+	QueryTries null.Uint32 `mapstructure:"dns_query_tries" yaml:"dns_query_tries,omitempty"`
+	// QueryTimeout is the amount of time each name server is given to respond to a query on the first try of any given server.
+	QueryTimeout *time.Duration `mapstructure:"dns_query_timeout" yaml:"dns_query_timeout,omitempty"`
+}
+
+// DNSLookupFamily values.
+const (
+	DNSLookupFamilyAuto        = "AUTO"
+	DNSLookupFamilyV4Only      = "V4_ONLY"
+	DNSLookupFamilyV6Only      = "V6_ONLY"
+	DNSLookupFamilyV4Preferred = "V4_PREFERRED"
+	DNSLookupFamilyAll         = "ALL"
+)
+
+// AllDNSLookupFamilies are all the available DNSLookupFamily values.
+var AllDNSLookupFamilies = []string{
+	DNSLookupFamilyAuto,
+	DNSLookupFamilyV4Only,
+	DNSLookupFamilyV6Only,
+	DNSLookupFamilyV4Preferred,
+	DNSLookupFamilyAll,
+}
+
+// GetEnvoyDNSLookupFamily gets the envoy DNS lookup family.
+func GetEnvoyDNSLookupFamily(value string) envoy_extensions_clusters_common_dns_v3.DnsLookupFamily {
+	switch value {
+	case DNSLookupFamilyAuto:
+		return envoy_extensions_clusters_common_dns_v3.DnsLookupFamily_AUTO
+	case DNSLookupFamilyV4Only:
+		return envoy_extensions_clusters_common_dns_v3.DnsLookupFamily_V4_ONLY
+	case DNSLookupFamilyV6Only:
+		return envoy_extensions_clusters_common_dns_v3.DnsLookupFamily_V6_ONLY
+	case DNSLookupFamilyV4Preferred:
+		return envoy_extensions_clusters_common_dns_v3.DnsLookupFamily_V4_PREFERRED
+	case DNSLookupFamilyAll:
+		return envoy_extensions_clusters_common_dns_v3.DnsLookupFamily_ALL
+	}
+
+	// default
+	return envoy_extensions_clusters_common_dns_v3.DnsLookupFamily_V4_PREFERRED
+}
+
+// ValidateDNSLookupFamily validates the value to confirm its one of the available DNS lookup families.
+func ValidateDNSLookupFamily(value string) error {
+	switch value {
+	case "",
+		DNSLookupFamilyAuto,
+		DNSLookupFamilyV4Only,
+		DNSLookupFamilyV6Only,
+		DNSLookupFamilyV4Preferred,
+		DNSLookupFamilyAll:
+		return nil
+	}
+
+	return fmt.Errorf("unknown dns_lookup_family: %s, known families are: %s", value, strings.Join(AllDNSLookupFamilies, ", "))
+}
diff --git a/config/envoyconfig/clusters.go b/config/envoyconfig/clusters.go
index 2e6a5a4a..9b6e9114 100644
--- a/config/envoyconfig/clusters.go
+++ b/config/envoyconfig/clusters.go
@@ -12,8 +12,8 @@ import (
 	envoy_config_cluster_v3 "github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3"
 	envoy_config_core_v3 "github.com/envoyproxy/go-control-plane/envoy/config/core/v3"
 	envoy_config_endpoint_v3 "github.com/envoyproxy/go-control-plane/envoy/config/endpoint/v3"
-	envoy_extensions_clusters_common_dns_v3 "github.com/envoyproxy/go-control-plane/envoy/extensions/clusters/common/dns/v3"
 	envoy_extensions_clusters_dns_v3 "github.com/envoyproxy/go-control-plane/envoy/extensions/clusters/dns/v3"
+	envoy_extensions_network_dns_resolver_cares_v3 "github.com/envoyproxy/go-control-plane/envoy/extensions/network/dns_resolver/cares/v3"
 	envoy_extensions_transport_sockets_tls_v3 "github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3"
 	"google.golang.org/protobuf/proto"
 	"google.golang.org/protobuf/types/known/durationpb"
@@ -156,9 +156,8 @@ func (b *Builder) buildInternalCluster(
 		}
 		endpoints = append(endpoints, NewEndpoint(dst, ts, 1))
 	}
-	dnsLookupFamily := config.GetEnvoyDNSLookupFamily(cfg.Options.DNSLookupFamily)
 	if err := b.buildCluster(
-		cluster, name, endpoints, upstreamProtocol, dnsLookupFamily, keepalive,
+		cluster, name, endpoints, upstreamProtocol, cfg.Options.DNS, keepalive,
 	); err != nil {
 		return nil, err
 	}
@@ -201,13 +200,13 @@ func (b *Builder) buildPolicyCluster(ctx context.Context, cfg *config.Config, po
 		return nil, err
 	}
 
-	dnsLookupFamily := config.GetEnvoyDNSLookupFamily(options.DNSLookupFamily)
+	dnsOptions := cfg.Options.DNS
 	if policy.EnableGoogleCloudServerlessAuthentication {
-		dnsLookupFamily = envoy_extensions_clusters_common_dns_v3.DnsLookupFamily_V4_ONLY
+		dnsOptions.LookupFamily = config.DNSLookupFamilyV4Only
 	}
 
 	if err := b.buildCluster(
-		cluster, name, endpoints, upstreamProtocol, dnsLookupFamily, Keepalive(false),
+		cluster, name, endpoints, upstreamProtocol, dnsOptions, Keepalive(false),
 	); err != nil {
 		return nil, err
 	}
@@ -366,7 +365,7 @@ func (b *Builder) buildCluster(
 	name string,
 	endpoints []Endpoint,
 	upstreamProtocol upstreamProtocolConfig,
-	dnsLookupFamily envoy_extensions_clusters_common_dns_v3.DnsLookupFamily,
+	dnsOptions config.DNSOptions,
 	keepalive Keepalive,
 ) error {
 	if len(endpoints) == 0 {
@@ -399,7 +398,7 @@ func (b *Builder) buildCluster(
 
 	cluster.TypedExtensionProtocolOptions = buildTypedExtensionProtocolOptions(endpoints, upstreamProtocol, keepalive)
 
-	cluster.ClusterDiscoveryType = getClusterDiscoveryType(lbEndpoints, dnsLookupFamily)
+	cluster.ClusterDiscoveryType = getClusterDiscoveryType(lbEndpoints, dnsOptions)
 
 	return cluster.Validate()
 }
@@ -544,7 +543,7 @@ func allIPAddresses(lbEndpoints []*envoy_config_endpoint_v3.LbEndpoint) bool {
 
 func getClusterDiscoveryType(
 	lbEndpoints []*envoy_config_endpoint_v3.LbEndpoint,
-	dnsLookupFamily envoy_extensions_clusters_common_dns_v3.DnsLookupFamily,
+	dnsOptions config.DNSOptions,
 ) *envoy_config_cluster_v3.Cluster_ClusterType {
 	// for IPs we use a static discovery type, otherwise we use DNS
 	if allIPAddresses(lbEndpoints) {
@@ -557,11 +556,42 @@ func getClusterDiscoveryType(
 
 	return &envoy_config_cluster_v3.Cluster_ClusterType{
 		ClusterType: &envoy_config_cluster_v3.Cluster_CustomClusterType{
-			Name: "envoy.clusters.dns",
-			TypedConfig: marshalAny(&envoy_extensions_clusters_dns_v3.DnsCluster{
-				RespectDnsTtl:   true,
-				DnsLookupFamily: dnsLookupFamily,
-			}),
+			Name:        "envoy.clusters.dns",
+			TypedConfig: marshalAny(getDNSCluster(dnsOptions)),
 		},
 	}
 }
+
+func getDNSCluster(dnsOptions config.DNSOptions) *envoy_extensions_clusters_dns_v3.DnsCluster {
+	return &envoy_extensions_clusters_dns_v3.DnsCluster{
+		RespectDnsTtl:   true,
+		DnsLookupFamily: config.GetEnvoyDNSLookupFamily(dnsOptions.LookupFamily),
+		TypedDnsResolverConfig: &envoy_config_core_v3.TypedExtensionConfig{
+			Name:        "envoy.network.dns_resolver.cares",
+			TypedConfig: marshalAny(getCARESDNSResolverConfig(dnsOptions)),
+		},
+	}
+}
+
+const defaultDNSUDPMaxQueries = 100
+
+func getCARESDNSResolverConfig(dnsOptions config.DNSOptions) *envoy_extensions_network_dns_resolver_cares_v3.CaresDnsResolverConfig {
+	cfg := &envoy_extensions_network_dns_resolver_cares_v3.CaresDnsResolverConfig{}
+	if dnsOptions.UDPMaxQueries.IsValid() {
+		cfg.UdpMaxQueries = wrapperspb.UInt32(dnsOptions.UDPMaxQueries.Uint32)
+	} else {
+		cfg.UdpMaxQueries = wrapperspb.UInt32(defaultDNSUDPMaxQueries)
+	}
+	if dnsOptions.UseTCP.IsValid() {
+		cfg.DnsResolverOptions = &envoy_config_core_v3.DnsResolverOptions{
+			UseTcpForDnsLookups: dnsOptions.UseTCP.Bool,
+		}
+	}
+	if dnsOptions.QueryTries.IsValid() {
+		cfg.QueryTries = wrapperspb.UInt32(dnsOptions.QueryTries.Uint32)
+	}
+	if dnsOptions.QueryTimeout != nil {
+		cfg.QueryTimeoutSeconds = wrapperspb.UInt64(uint64(dnsOptions.QueryTimeout.Seconds()))
+	}
+	return cfg
+}
diff --git a/config/options.go b/config/options.go
index 56b65343..facf698d 100644
--- a/config/options.go
+++ b/config/options.go
@@ -96,9 +96,7 @@ type Options struct {
 	// This should be used only for testing.
 	InsecureServer bool `mapstructure:"insecure_server" yaml:"insecure_server,omitempty"`
 
-	// DNSLookupFamily is the DNS IP address resolution policy.
-	// If this setting is not specified, the value defaults to V4_PREFERRED.
-	DNSLookupFamily string `mapstructure:"dns_lookup_family" yaml:"dns_lookup_family,omitempty"`
+	DNS DNSOptions `mapstructure:",squash" yaml:",inline"`
 
 	CertificateData  []*config.Settings_Certificate
 	CertificateFiles []certificateFilePair `mapstructure:"certificates" yaml:"certificates,omitempty"`
@@ -710,7 +708,7 @@ func (o *Options) Validate() error {
 	// strip quotes from redirect address (#811)
 	o.HTTPRedirectAddr = strings.Trim(o.HTTPRedirectAddr, `"'`)
 
-	if err := ValidateDNSLookupFamily(o.DNSLookupFamily); err != nil {
+	if err := ValidateDNSLookupFamily(o.DNS.LookupFamily); err != nil {
 		return fmt.Errorf("config: %w", err)
 	}
 
@@ -1566,7 +1564,11 @@ func (o *Options) ApplySettings(ctx context.Context, certsIndex *cryptutil.Certi
 	set(&o.Services, settings.Services)
 	set(&o.Addr, settings.Address)
 	set(&o.InsecureServer, settings.InsecureServer)
-	set(&o.DNSLookupFamily, settings.DnsLookupFamily)
+	set(&o.DNS.LookupFamily, settings.DnsLookupFamily)
+	setNullableUint32(&o.DNS.UDPMaxQueries, settings.DnsUdpMaxQueries)
+	setNullableBool(&o.DNS.UseTCP, settings.DnsUseTcp)
+	setNullableUint32(&o.DNS.QueryTries, settings.DnsQueryTries)
+	setOptionalDuration(&o.DNS.QueryTimeout, settings.DnsQueryTimeout)
 	o.applyExternalCerts(ctx, certsIndex, settings.GetCertificates())
 	set(&o.HTTPRedirectAddr, settings.HttpRedirectAddr)
 	setDuration(&o.ReadTimeout, settings.TimeoutRead)
@@ -1687,7 +1689,13 @@ func (o *Options) ToProto() *config.Config {
 	copySrcToOptionalDest(&settings.Services, &o.Services)
 	copySrcToOptionalDest(&settings.Address, &o.Addr)
 	copySrcToOptionalDest(&settings.InsecureServer, &o.InsecureServer)
-	copySrcToOptionalDest(&settings.DnsLookupFamily, &o.DNSLookupFamily)
+	copySrcToOptionalDest(&settings.DnsLookupFamily, &o.DNS.LookupFamily)
+	settings.DnsUdpMaxQueries = o.DNS.UDPMaxQueries.Ptr()
+	settings.DnsUseTcp = o.DNS.UseTCP.Ptr()
+	settings.DnsQueryTries = o.DNS.QueryTries.Ptr()
+	if o.DNS.QueryTimeout != nil {
+		copyOptionalDuration(&settings.DnsQueryTimeout, *o.DNS.QueryTimeout)
+	}
 	settings.Certificates = getCertificates(o)
 	copySrcToOptionalDest(&settings.HttpRedirectAddr, &o.HTTPRedirectAddr)
 	copyOptionalDuration(&settings.TimeoutRead, o.ReadTimeout)
@@ -2093,3 +2101,23 @@ func setCertificate(
 		*dstCertificateKey = base64.StdEncoding.EncodeToString(src.GetKeyBytes())
 	}
 }
+
+func setNullableBool(
+	dst *null.Bool,
+	src *bool,
+) {
+	if src == nil {
+		return
+	}
+	*dst = null.BoolFrom(*src)
+}
+
+func setNullableUint32(
+	dst *null.Uint32,
+	src *uint32,
+) {
+	if src == nil {
+		return
+	}
+	*dst = null.Uint32From(*src)
+}
diff --git a/config/validate.go b/config/validate.go
index 8af27df4..100e6f0a 100644
--- a/config/validate.go
+++ b/config/validate.go
@@ -5,43 +5,8 @@ import (
 	"net"
 	"strconv"
 	"strings"
-
-	envoy_extensions_clusters_common_dns_v3 "github.com/envoyproxy/go-control-plane/envoy/extensions/clusters/common/dns/v3"
-)
-
-// DNSLookupFamily values.
-const (
-	DNSLookupFamilyAuto        = "AUTO"
-	DNSLookupFamilyV4Only      = "V4_ONLY"
-	DNSLookupFamilyV6Only      = "V6_ONLY"
-	DNSLookupFamilyV4Preferred = "V4_PREFERRED"
-	DNSLookupFamilyAll         = "ALL"
 )
 
-// AllDNSLookupFamilies are all the available DNSLookupFamily values.
-var AllDNSLookupFamilies = []string{
-	DNSLookupFamilyAuto,
-	DNSLookupFamilyV4Only,
-	DNSLookupFamilyV6Only,
-	DNSLookupFamilyV4Preferred,
-	DNSLookupFamilyAll,
-}
-
-// ValidateDNSLookupFamily validates the value to confirm its one of the available DNS lookup families.
-func ValidateDNSLookupFamily(value string) error {
-	switch value {
-	case "",
-		DNSLookupFamilyAuto,
-		DNSLookupFamilyV4Only,
-		DNSLookupFamilyV6Only,
-		DNSLookupFamilyV4Preferred,
-		DNSLookupFamilyAll:
-		return nil
-	}
-
-	return fmt.Errorf("unknown dns_lookup_family: %s, known families are: %s", value, strings.Join(AllDNSLookupFamilies, ", "))
-}
-
 // ValidateCookieSameSite validates the cookie same site option.
 func ValidateCookieSameSite(value string) error {
 	value = strings.ToLower(value)
@@ -52,25 +17,6 @@ func ValidateCookieSameSite(value string) error {
 	return fmt.Errorf("unknown cookie_same_site: %s", value)
 }
 
-// GetEnvoyDNSLookupFamily gets the envoy DNS lookup family.
-func GetEnvoyDNSLookupFamily(value string) envoy_extensions_clusters_common_dns_v3.DnsLookupFamily {
-	switch value {
-	case DNSLookupFamilyAuto:
-		return envoy_extensions_clusters_common_dns_v3.DnsLookupFamily_AUTO
-	case DNSLookupFamilyV4Only:
-		return envoy_extensions_clusters_common_dns_v3.DnsLookupFamily_V4_ONLY
-	case DNSLookupFamilyV6Only:
-		return envoy_extensions_clusters_common_dns_v3.DnsLookupFamily_V6_ONLY
-	case DNSLookupFamilyV4Preferred:
-		return envoy_extensions_clusters_common_dns_v3.DnsLookupFamily_V4_PREFERRED
-	case DNSLookupFamilyAll:
-		return envoy_extensions_clusters_common_dns_v3.DnsLookupFamily_ALL
-	}
-
-	// default
-	return envoy_extensions_clusters_common_dns_v3.DnsLookupFamily_V4_PREFERRED
-}
-
 // ValidateMetricsAddress validates address for the metrics
 func ValidateMetricsAddress(addr string) error {
 	_, port, err := net.SplitHostPort(addr)
diff --git a/go.mod b/go.mod
index f3622f64..451b5f2c 100644
--- a/go.mod
+++ b/go.mod
@@ -60,7 +60,7 @@ require (
 	github.com/pires/go-proxyproto v0.8.1
 	github.com/pomerium/csrf v1.7.0
 	github.com/pomerium/datasource v0.18.2-0.20221108160055-c6134b5ed524
-	github.com/pomerium/envoy-custom v1.34.1-rc3
+	github.com/pomerium/envoy-custom v1.34.5-p1
 	github.com/pomerium/protoutil v0.0.0-20240813175624-47b7ac43ff46
 	github.com/pomerium/webauthn v0.0.0-20240603205124-0428df511172
 	github.com/prometheus/client_golang v1.23.0
diff --git a/go.sum b/go.sum
index f4c48d85..e8e47dee 100644
--- a/go.sum
+++ b/go.sum
@@ -620,8 +620,8 @@ github.com/pomerium/csrf v1.7.0 h1:Qp4t6oyEod3svQtKfJZs589mdUTWKVf7q0PgCKYCshY=
 github.com/pomerium/csrf v1.7.0/go.mod h1:hAPZV47mEj2T9xFs+ysbum4l7SF1IdrryYaY6PdoIqw=
 github.com/pomerium/datasource v0.18.2-0.20221108160055-c6134b5ed524 h1:3YQY1sb54tEEbr0L73rjHkpLB0IB6qh3zl1+XQbMLis=
 github.com/pomerium/datasource v0.18.2-0.20221108160055-c6134b5ed524/go.mod h1:7fGbUYJnU8RcxZJvUvhukOIBv1G7LWDAHMfDxAf5+Y0=
-github.com/pomerium/envoy-custom v1.34.1-rc3 h1:CeHJDeqMU9Ti2G9HnQRvOq45Q242iIy3/OsXr8j6zns=
-github.com/pomerium/envoy-custom v1.34.1-rc3/go.mod h1:+wpbZvum83bq/OD4cp9/8IZiMV6boBkwDhlFPLOoWoI=
+github.com/pomerium/envoy-custom v1.34.5-p1 h1:6ES5N96BnztDhgeTbsvvCTacHrzZkrrqeR/c2JZMb7E=
+github.com/pomerium/envoy-custom v1.34.5-p1/go.mod h1:+wpbZvum83bq/OD4cp9/8IZiMV6boBkwDhlFPLOoWoI=
 github.com/pomerium/protoutil v0.0.0-20240813175624-47b7ac43ff46 h1:NRTg8JOXCxcIA1lAgD74iYud0rbshbWOB3Ou4+Huil8=
 github.com/pomerium/protoutil v0.0.0-20240813175624-47b7ac43ff46/go.mod h1:QqZmx6ZgPxz18va7kqoT4t/0yJtP7YFIDiT/W2n2fZ4=
 github.com/pomerium/webauthn v0.0.0-20240603205124-0428df511172 h1:TqoPqRgXSHpn+tEJq6H72iCS5pv66j3rPprThUEZg0E=
diff --git a/pkg/envoy/get-envoy/main.go b/pkg/envoy/get-envoy/main.go
index f6ea2747..fefbc266 100644
--- a/pkg/envoy/get-envoy/main.go
+++ b/pkg/envoy/get-envoy/main.go
@@ -16,7 +16,7 @@ import (
 )
 
 var (
-	envoyVersion = "1.34.1-p1"
+	envoyVersion = "1.34.5-p1"
 	targets      = []string{
 		"darwin-amd64",
 		"darwin-arm64",
diff --git a/pkg/grpc/config/config.pb.go b/pkg/grpc/config/config.pb.go
index b9ed7b3a..fe20822a 100644
--- a/pkg/grpc/config/config.pb.go
+++ b/pkg/grpc/config/config.pb.go
@@ -1738,22 +1738,27 @@ func (x *Policy) GetRemediation() string {
 	return ""
 }
 
-// Next ID: 146.
+// Next ID: 150.
 type Settings struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	InstallationId                 *string                 `protobuf:"bytes,71,opt,name=installation_id,json=installationId,proto3,oneof" json:"installation_id,omitempty"`
-	LogLevel                       *string                 `protobuf:"bytes,3,opt,name=log_level,json=logLevel,proto3,oneof" json:"log_level,omitempty"`
-	AccessLogFields                *Settings_StringList    `protobuf:"bytes,114,opt,name=access_log_fields,json=accessLogFields,proto3,oneof" json:"access_log_fields,omitempty"`
-	AuthorizeLogFields             *Settings_StringList    `protobuf:"bytes,115,opt,name=authorize_log_fields,json=authorizeLogFields,proto3,oneof" json:"authorize_log_fields,omitempty"`
-	ProxyLogLevel                  *string                 `protobuf:"bytes,4,opt,name=proxy_log_level,json=proxyLogLevel,proto3,oneof" json:"proxy_log_level,omitempty"`
-	SharedSecret                   *string                 `protobuf:"bytes,5,opt,name=shared_secret,json=sharedSecret,proto3,oneof" json:"shared_secret,omitempty"`
-	Services                       *string                 `protobuf:"bytes,6,opt,name=services,proto3,oneof" json:"services,omitempty"`
-	Address                        *string                 `protobuf:"bytes,7,opt,name=address,proto3,oneof" json:"address,omitempty"`
-	InsecureServer                 *bool                   `protobuf:"varint,8,opt,name=insecure_server,json=insecureServer,proto3,oneof" json:"insecure_server,omitempty"`
+	InstallationId     *string              `protobuf:"bytes,71,opt,name=installation_id,json=installationId,proto3,oneof" json:"installation_id,omitempty"`
+	LogLevel           *string              `protobuf:"bytes,3,opt,name=log_level,json=logLevel,proto3,oneof" json:"log_level,omitempty"`
+	AccessLogFields    *Settings_StringList `protobuf:"bytes,114,opt,name=access_log_fields,json=accessLogFields,proto3,oneof" json:"access_log_fields,omitempty"`
+	AuthorizeLogFields *Settings_StringList `protobuf:"bytes,115,opt,name=authorize_log_fields,json=authorizeLogFields,proto3,oneof" json:"authorize_log_fields,omitempty"`
+	ProxyLogLevel      *string              `protobuf:"bytes,4,opt,name=proxy_log_level,json=proxyLogLevel,proto3,oneof" json:"proxy_log_level,omitempty"`
+	SharedSecret       *string              `protobuf:"bytes,5,opt,name=shared_secret,json=sharedSecret,proto3,oneof" json:"shared_secret,omitempty"`
+	Services           *string              `protobuf:"bytes,6,opt,name=services,proto3,oneof" json:"services,omitempty"`
+	Address            *string              `protobuf:"bytes,7,opt,name=address,proto3,oneof" json:"address,omitempty"`
+	InsecureServer     *bool                `protobuf:"varint,8,opt,name=insecure_server,json=insecureServer,proto3,oneof" json:"insecure_server,omitempty"`
+	// dns options
 	DnsLookupFamily                *string                 `protobuf:"bytes,60,opt,name=dns_lookup_family,json=dnsLookupFamily,proto3,oneof" json:"dns_lookup_family,omitempty"`
+	DnsUdpMaxQueries               *uint32                 `protobuf:"varint,146,opt,name=dns_udp_max_queries,json=dnsUdpMaxQueries,proto3,oneof" json:"dns_udp_max_queries,omitempty"`
+	DnsUseTcp                      *bool                   `protobuf:"varint,147,opt,name=dns_use_tcp,json=dnsUseTcp,proto3,oneof" json:"dns_use_tcp,omitempty"`
+	DnsQueryTries                  *uint32                 `protobuf:"varint,148,opt,name=dns_query_tries,json=dnsQueryTries,proto3,oneof" json:"dns_query_tries,omitempty"`
+	DnsQueryTimeout                *durationpb.Duration    `protobuf:"bytes,149,opt,name=dns_query_timeout,json=dnsQueryTimeout,proto3,oneof" json:"dns_query_timeout,omitempty"`
 	Certificates                   []*Settings_Certificate `protobuf:"bytes,9,rep,name=certificates,proto3" json:"certificates,omitempty"`
 	HttpRedirectAddr               *string                 `protobuf:"bytes,10,opt,name=http_redirect_addr,json=httpRedirectAddr,proto3,oneof" json:"http_redirect_addr,omitempty"`
 	TimeoutRead                    *durationpb.Duration    `protobuf:"bytes,11,opt,name=timeout_read,json=timeoutRead,proto3,oneof" json:"timeout_read,omitempty"`
@@ -1964,6 +1969,34 @@ func (x *Settings) GetDnsLookupFamily() string {
 	return ""
 }
 
+func (x *Settings) GetDnsUdpMaxQueries() uint32 {
+	if x != nil && x.DnsUdpMaxQueries != nil {
+		return *x.DnsUdpMaxQueries
+	}
+	return 0
+}
+
+func (x *Settings) GetDnsUseTcp() bool {
+	if x != nil && x.DnsUseTcp != nil {
+		return *x.DnsUseTcp
+	}
+	return false
+}
+
+func (x *Settings) GetDnsQueryTries() uint32 {
+	if x != nil && x.DnsQueryTries != nil {
+		return *x.DnsQueryTries
+	}
+	return 0
+}
+
+func (x *Settings) GetDnsQueryTimeout() *durationpb.Duration {
+	if x != nil {
+		return x.DnsQueryTimeout
+	}
+	return nil
+}
+
 func (x *Settings) GetCertificates() []*Settings_Certificate {
 	if x != nil {
 		return x.Certificates
@@ -3361,7 +3394,7 @@ var file_config_proto_rawDesc = []byte{
 	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
 	0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
 	0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
-	0x5f, 0x70, 0x70, 0x6c, 0x22, 0xbb, 0x49, 0x0a, 0x08, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67,
+	0x5f, 0x70, 0x70, 0x6c, 0x22, 0xe3, 0x4b, 0x0a, 0x08, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67,
 	0x73, 0x12, 0x2c, 0x0a, 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f,
 	0x6e, 0x5f, 0x69, 0x64, 0x18, 0x47, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0e, 0x69, 0x6e,
 	0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12,
@@ -3393,628 +3426,646 @@ var file_config_proto_rawDesc = []byte{
 	0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x64, 0x6e,
 	0x73, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18,
 	0x3c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x09, 0x52, 0x0f, 0x64, 0x6e, 0x73, 0x4c, 0x6f, 0x6f, 0x6b,
-	0x75, 0x70, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x88, 0x01, 0x01, 0x12, 0x49, 0x0a, 0x0c, 0x63,
-	0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28,
-	0x0b, 0x32, 0x25, 0x2e, 0x70, 0x6f, 0x6d, 0x65, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x63, 0x6f, 0x6e,
-	0x66, 0x69, 0x67, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x43, 0x65, 0x72,
-	0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66,
-	0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x12, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x72,
-	0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x0a, 0x20, 0x01,
-	0x28, 0x09, 0x48, 0x0a, 0x52, 0x10, 0x68, 0x74, 0x74, 0x70, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65,
-	0x63, 0x74, 0x41, 0x64, 0x64, 0x72, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x0c, 0x74, 0x69, 0x6d,
-	0x65, 0x6f, 0x75, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32,
-	0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
-	0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x0b, 0x52, 0x0b, 0x74, 0x69,
-	0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x61, 0x64, 0x88, 0x01, 0x01, 0x12, 0x43, 0x0a, 0x0d,
-	0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x0c, 0x20,
-	0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x0c,
-	0x52, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x88, 0x01,
-	0x01, 0x12, 0x41, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x69, 0x64, 0x6c,
-	0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69,
-	0x6f, 0x6e, 0x48, 0x0d, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x49, 0x64, 0x6c,
-	0x65, 0x88, 0x01, 0x01, 0x12, 0x3d, 0x0a, 0x18, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69,
-	0x63, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c,
-	0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0e, 0x52, 0x16, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e,
-	0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x72, 0x6c,
-	0x88, 0x01, 0x01, 0x12, 0x4e, 0x0a, 0x21, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63,
-	0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72,
-	0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x52, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0f,
-	0x52, 0x1e, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x49, 0x6e,
-	0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x72, 0x6c,
-	0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x14, 0x73, 0x69, 0x67, 0x6e, 0x6f, 0x75, 0x74, 0x5f, 0x72,
-	0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x5d, 0x20, 0x01, 0x28,
-	0x09, 0x48, 0x10, 0x52, 0x12, 0x73, 0x69, 0x67, 0x6e, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x64, 0x69,
-	0x72, 0x65, 0x63, 0x74, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x61, 0x75,
-	0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x62,
-	0x61, 0x63, 0x6b, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x11,
-	0x52, 0x18, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x43, 0x61,
-	0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a,
-	0x0b, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01,
-	0x28, 0x09, 0x48, 0x12, 0x52, 0x0a, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x4e, 0x61, 0x6d, 0x65,
-	0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x5f, 0x73, 0x65,
-	0x63, 0x72, 0x65, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x48, 0x13, 0x52, 0x0c, 0x63, 0x6f,
-	0x6f, 0x6b, 0x69, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a,
-	0x0d, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x12,
-	0x20, 0x01, 0x28, 0x09, 0x48, 0x14, 0x52, 0x0c, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x44, 0x6f,
-	0x6d, 0x61, 0x69, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x10, 0x63, 0x6f, 0x6f, 0x6b, 0x69,
-	0x65, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x14, 0x20, 0x01, 0x28,
-	0x08, 0x48, 0x15, 0x52, 0x0e, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x48, 0x74, 0x74, 0x70, 0x4f,
-	0x6e, 0x6c, 0x79, 0x88, 0x01, 0x01, 0x12, 0x43, 0x0a, 0x0d, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65,
-	0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,
+	0x75, 0x70, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x64,
+	0x6e, 0x73, 0x5f, 0x75, 0x64, 0x70, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x69,
+	0x65, 0x73, 0x18, 0x92, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x0a, 0x52, 0x10, 0x64, 0x6e, 0x73,
+	0x55, 0x64, 0x70, 0x4d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01,
+	0x12, 0x24, 0x0a, 0x0b, 0x64, 0x6e, 0x73, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x74, 0x63, 0x70, 0x18,
+	0x93, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x0b, 0x52, 0x09, 0x64, 0x6e, 0x73, 0x55, 0x73, 0x65,
+	0x54, 0x63, 0x70, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0f, 0x64, 0x6e, 0x73, 0x5f, 0x71, 0x75,
+	0x65, 0x72, 0x79, 0x5f, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x94, 0x01, 0x20, 0x01, 0x28, 0x0d,
+	0x48, 0x0c, 0x52, 0x0d, 0x64, 0x6e, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x69, 0x65,
+	0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x11, 0x64, 0x6e, 0x73, 0x5f, 0x71, 0x75, 0x65, 0x72,
+	0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x95, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+	0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x0d, 0x52, 0x0f, 0x64,
+	0x6e, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x88, 0x01,
+	0x01, 0x12, 0x49, 0x0a, 0x0c, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65,
+	0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x6f, 0x6d, 0x65, 0x72, 0x69,
+	0x75, 0x6d, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e,
+	0x67, 0x73, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x0c,
+	0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x12,
+	0x68, 0x74, 0x74, 0x70, 0x5f, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x5f, 0x61, 0x64,
+	0x64, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0e, 0x52, 0x10, 0x68, 0x74, 0x74, 0x70,
+	0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x41, 0x64, 0x64, 0x72, 0x88, 0x01, 0x01, 0x12,
+	0x41, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x18,
+	0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+	0x48, 0x0f, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x61, 0x64, 0x88,
+	0x01, 0x01, 0x12, 0x43, 0x0a, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x77, 0x72,
+	0x69, 0x74, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x48, 0x10, 0x52, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x57,
+	0x72, 0x69, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x6f,
+	0x75, 0x74, 0x5f, 0x69, 0x64, 0x6c, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,
 	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
-	0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x16, 0x52, 0x0c, 0x63, 0x6f, 0x6f, 0x6b,
-	0x69, 0x65, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x10, 0x63,
-	0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x5f, 0x73, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x69, 0x74, 0x65, 0x18,
-	0x71, 0x20, 0x01, 0x28, 0x09, 0x48, 0x17, 0x52, 0x0e, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x53,
-	0x61, 0x6d, 0x65, 0x53, 0x69, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x69, 0x64,
-	0x70, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28,
-	0x09, 0x48, 0x18, 0x52, 0x0b, 0x69, 0x64, 0x70, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64,
-	0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x69, 0x64, 0x70, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e,
-	0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x48, 0x19,
-	0x52, 0x0f, 0x69, 0x64, 0x70, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65,
-	0x74, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x69, 0x64, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x76,
-	0x69, 0x64, 0x65, 0x72, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x48, 0x1a, 0x52, 0x0b, 0x69, 0x64,
-	0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x10,
-	0x69, 0x64, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x75, 0x72, 0x6c,
-	0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x48, 0x1b, 0x52, 0x0e, 0x69, 0x64, 0x70, 0x50, 0x72, 0x6f,
-	0x76, 0x69, 0x64, 0x65, 0x72, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x76, 0x0a, 0x22, 0x69,
-	0x64, 0x70, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f,
-	0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x61, 0x75, 0x64, 0x69, 0x65, 0x6e, 0x63, 0x65,
-	0x73, 0x18, 0x89, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x6f, 0x6d, 0x65, 0x72,
-	0x69, 0x75, 0x6d, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69,
-	0x6e, 0x67, 0x73, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x1c,
-	0x52, 0x1e, 0x69, 0x64, 0x70, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e,
-	0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x41, 0x75, 0x64, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x73,
-	0x88, 0x01, 0x01, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x1a, 0x20,
-	0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x12, 0x53, 0x0a, 0x0e, 0x72,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x1e, 0x20,
-	0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x6f, 0x6d, 0x65, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x63,
-	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72,
-	0x79, 0x52, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73,
-	0x12, 0x34, 0x0a, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x5f, 0x73, 0x65,
-	0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x73, 0x18, 0x20, 0x20, 0x03, 0x28, 0x09,
-	0x52, 0x14, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69,
-	0x63, 0x65, 0x55, 0x72, 0x6c, 0x73, 0x12, 0x48, 0x0a, 0x1e, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72,
-	0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72,
-	0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x53, 0x20, 0x01, 0x28, 0x09, 0x48, 0x1d,
-	0x52, 0x1b, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72,
-	0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01,
-	0x12, 0x3f, 0x0a, 0x19, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x63, 0x65, 0x72,
-	0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x21, 0x20,
-	0x01, 0x28, 0x09, 0x48, 0x1e, 0x52, 0x17, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x43,
-	0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01,
-	0x01, 0x12, 0x38, 0x0a, 0x15, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65,
-	0x5f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x22, 0x20, 0x01, 0x28, 0x09,
-	0x48, 0x1f, 0x52, 0x14, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x41,
-	0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x64,
-	0x65, 0x72, 0x69, 0x76, 0x65, 0x5f, 0x74, 0x6c, 0x73, 0x18, 0x60, 0x20, 0x01, 0x28, 0x09, 0x48,
-	0x20, 0x52, 0x09, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x54, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12,
-	0x24, 0x0a, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x24,
-	0x20, 0x01, 0x28, 0x09, 0x48, 0x21, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x4b,
-	0x65, 0x79, 0x88, 0x01, 0x01, 0x12, 0x63, 0x0a, 0x14, 0x73, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x73,
-	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x45, 0x20,
-	0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x6f, 0x6d, 0x65, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x63,
-	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x53,
-	0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72,
-	0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x12, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f,
-	0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x5d, 0x0a, 0x12, 0x6a, 0x77,
-	0x74, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73,
-	0x18, 0x3f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x6f, 0x6d, 0x65, 0x72, 0x69, 0x75,
-	0x6d, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67,
-	0x73, 0x2e, 0x4a, 0x77, 0x74, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x48, 0x65, 0x61, 0x64, 0x65,
-	0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x6a, 0x77, 0x74, 0x43, 0x6c, 0x61, 0x69,
-	0x6d, 0x73, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x4f, 0x0a, 0x11, 0x6a, 0x77, 0x74,
-	0x5f, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x8b,
-	0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x70, 0x6f, 0x6d, 0x65, 0x72, 0x69, 0x75, 0x6d,
-	0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x49, 0x73, 0x73, 0x75, 0x65, 0x72, 0x46, 0x6f,
-	0x72, 0x6d, 0x61, 0x74, 0x48, 0x22, 0x52, 0x0f, 0x6a, 0x77, 0x74, 0x49, 0x73, 0x73, 0x75, 0x65,
-	0x72, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x11, 0x6a, 0x77,
-	0x74, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18,
-	0x77, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x6a, 0x77, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73,
-	0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x58, 0x0a, 0x13, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72,
-	0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x8a, 0x01,
-	0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x70, 0x6f, 0x6d, 0x65, 0x72, 0x69, 0x75, 0x6d, 0x2e,
-	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x54, 0x6f, 0x6b,
-	0x65, 0x6e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x48, 0x23, 0x52, 0x11, 0x62, 0x65, 0x61, 0x72,
-	0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x88, 0x01, 0x01,
-	0x12, 0x58, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x75, 0x70, 0x73, 0x74,
-	0x72, 0x65, 0x61, 0x6d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x27, 0x20, 0x01,
-	0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x24, 0x52,
-	0x16, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d,
-	0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0f, 0x6d, 0x65,
-	0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x28, 0x20,
-	0x01, 0x28, 0x09, 0x48, 0x25, 0x52, 0x0e, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, 0x64,
-	0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x65, 0x74, 0x72,
-	0x69, 0x63, 0x73, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x18, 0x40,
-	0x20, 0x01, 0x28, 0x09, 0x48, 0x26, 0x52, 0x10, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x42,
-	0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x88, 0x01, 0x01, 0x12, 0x5b, 0x0a, 0x13, 0x6d,
-	0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61,
-	0x74, 0x65, 0x18, 0x41, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x6f, 0x6d, 0x65, 0x72,
-	0x69, 0x75, 0x6d, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69,
-	0x6e, 0x67, 0x73, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x48,
-	0x27, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66,
-	0x69, 0x63, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x72,
-	0x69, 0x63, 0x73, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x61, 0x18, 0x42, 0x20,
-	0x01, 0x28, 0x09, 0x48, 0x28, 0x52, 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x43, 0x6c,
-	0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x14, 0x6f, 0x74, 0x65,
-	0x6c, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65,
-	0x72, 0x18, 0x79, 0x20, 0x01, 0x28, 0x09, 0x48, 0x29, 0x52, 0x12, 0x6f, 0x74, 0x65, 0x6c, 0x54,
-	0x72, 0x61, 0x63, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01,
-	0x12, 0x3a, 0x0a, 0x17, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x73, 0x5f,
-	0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x72, 0x67, 0x18, 0x7a, 0x20, 0x01, 0x28,
-	0x01, 0x48, 0x2a, 0x52, 0x14, 0x6f, 0x74, 0x65, 0x6c, 0x54, 0x72, 0x61, 0x63, 0x65, 0x73, 0x53,
-	0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x72, 0x67, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x18,
-	0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x74,
-	0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x7b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x16,
-	0x6f, 0x74, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x74, 0x74, 0x72,
-	0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x0e, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x6c,
-	0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x7c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x2b,
-	0x52, 0x0c, 0x6f, 0x74, 0x65, 0x6c, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x88, 0x01,
-	0x01, 0x12, 0x4d, 0x0a, 0x21, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62,
-	0x75, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68,
-	0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x7d, 0x20, 0x01, 0x28, 0x05, 0x48, 0x2c, 0x52, 0x1d,
-	0x6f, 0x74, 0x65, 0x6c, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x56, 0x61, 0x6c,
-	0x75, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01,
-	0x12, 0x42, 0x0a, 0x1b, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65,
-	0x72, 0x5f, 0x6f, 0x74, 0x6c, 0x70, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18,
-	0x7e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x2d, 0x52, 0x18, 0x6f, 0x74, 0x65, 0x6c, 0x45, 0x78, 0x70,
-	0x6f, 0x72, 0x74, 0x65, 0x72, 0x4f, 0x74, 0x6c, 0x70, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e,
-	0x74, 0x88, 0x01, 0x01, 0x12, 0x4f, 0x0a, 0x22, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x65, 0x78, 0x70,
-	0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x6f, 0x74, 0x6c, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65,
-	0x73, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x7f, 0x20, 0x01, 0x28, 0x09,
-	0x48, 0x2e, 0x52, 0x1e, 0x6f, 0x74, 0x65, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72,
-	0x4f, 0x74, 0x6c, 0x70, 0x54, 0x72, 0x61, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69,
-	0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x43, 0x0a, 0x1b, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x65, 0x78,
-	0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x6f, 0x74, 0x6c, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x80, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x2f, 0x52, 0x18, 0x6f,
-	0x74, 0x65, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x4f, 0x74, 0x6c, 0x70, 0x50,
-	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x50, 0x0a, 0x22, 0x6f, 0x74,
-	0x65, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x6f, 0x74, 0x6c, 0x70,
-	0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
-	0x18, 0x81, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x30, 0x52, 0x1e, 0x6f, 0x74, 0x65, 0x6c, 0x45,
-	0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x4f, 0x74, 0x6c, 0x70, 0x54, 0x72, 0x61, 0x63, 0x65,
-	0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x1a,
-	0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x6f, 0x74,
-	0x6c, 0x70, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x82, 0x01, 0x20, 0x03, 0x28,
-	0x09, 0x52, 0x17, 0x6f, 0x74, 0x65, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x4f,
-	0x74, 0x6c, 0x70, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x49, 0x0a, 0x21, 0x6f, 0x74,
+	0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x11, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65,
+	0x6f, 0x75, 0x74, 0x49, 0x64, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3d, 0x0a, 0x18, 0x61, 0x75,
+	0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69,
+	0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x12, 0x52, 0x16,
+	0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x4e, 0x0a, 0x21, 0x61, 0x75, 0x74,
+	0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e,
+	0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x52,
+	0x20, 0x01, 0x28, 0x09, 0x48, 0x13, 0x52, 0x1e, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69,
+	0x63, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x14, 0x73, 0x69, 0x67,
+	0x6e, 0x6f, 0x75, 0x74, 0x5f, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x5f, 0x75, 0x72,
+	0x6c, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x14, 0x52, 0x12, 0x73, 0x69, 0x67, 0x6e, 0x6f,
+	0x75, 0x74, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01,
+	0x12, 0x41, 0x0a, 0x1a, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65,
+	0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0f,
+	0x20, 0x01, 0x28, 0x09, 0x48, 0x15, 0x52, 0x18, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69,
+	0x63, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x61, 0x74, 0x68,
+	0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x5f, 0x6e, 0x61,
+	0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x48, 0x16, 0x52, 0x0a, 0x63, 0x6f, 0x6f, 0x6b,
+	0x69, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x6f, 0x6f,
+	0x6b, 0x69, 0x65, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09,
+	0x48, 0x17, 0x52, 0x0c, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74,
+	0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x5f, 0x64, 0x6f,
+	0x6d, 0x61, 0x69, 0x6e, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x48, 0x18, 0x52, 0x0c, 0x63, 0x6f,
+	0x6f, 0x6b, 0x69, 0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a,
+	0x10, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x6f, 0x6e, 0x6c,
+	0x79, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x48, 0x19, 0x52, 0x0e, 0x63, 0x6f, 0x6f, 0x6b, 0x69,
+	0x65, 0x48, 0x74, 0x74, 0x70, 0x4f, 0x6e, 0x6c, 0x79, 0x88, 0x01, 0x01, 0x12, 0x43, 0x0a, 0x0d,
+	0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x18, 0x15, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x1a,
+	0x52, 0x0c, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x88, 0x01,
+	0x01, 0x12, 0x2d, 0x0a, 0x10, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x5f, 0x73, 0x61, 0x6d, 0x65,
+	0x5f, 0x73, 0x69, 0x74, 0x65, 0x18, 0x71, 0x20, 0x01, 0x28, 0x09, 0x48, 0x1b, 0x52, 0x0e, 0x63,
+	0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x53, 0x61, 0x6d, 0x65, 0x53, 0x69, 0x74, 0x65, 0x88, 0x01, 0x01,
+	0x12, 0x27, 0x0a, 0x0d, 0x69, 0x64, 0x70, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69,
+	0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x48, 0x1c, 0x52, 0x0b, 0x69, 0x64, 0x70, 0x43, 0x6c,
+	0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x69, 0x64, 0x70,
+	0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x17,
+	0x20, 0x01, 0x28, 0x09, 0x48, 0x1d, 0x52, 0x0f, 0x69, 0x64, 0x70, 0x43, 0x6c, 0x69, 0x65, 0x6e,
+	0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x69, 0x64,
+	0x70, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09,
+	0x48, 0x1e, 0x52, 0x0b, 0x69, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x88,
+	0x01, 0x01, 0x12, 0x2d, 0x0a, 0x10, 0x69, 0x64, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64,
+	0x65, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x48, 0x1f, 0x52, 0x0e,
+	0x69, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x55, 0x72, 0x6c, 0x88, 0x01,
+	0x01, 0x12, 0x76, 0x0a, 0x22, 0x69, 0x64, 0x70, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f,
+	0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x61, 0x75,
+	0x64, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x89, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24,
+	0x2e, 0x70, 0x6f, 0x6d, 0x65, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67,
+	0x4c, 0x69, 0x73, 0x74, 0x48, 0x20, 0x52, 0x1e, 0x69, 0x64, 0x70, 0x41, 0x63, 0x63, 0x65, 0x73,
+	0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x41, 0x75, 0x64,
+	0x69, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x6f,
+	0x70, 0x65, 0x73, 0x18, 0x1a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65,
+	0x73, 0x12, 0x53, 0x0a, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72,
+	0x61, 0x6d, 0x73, 0x18, 0x1e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x6f, 0x6d, 0x65,
+	0x72, 0x69, 0x75, 0x6d, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x53, 0x65, 0x74, 0x74,
+	0x69, 0x6e, 0x67, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61,
+	0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72,
+	0x69, 0x7a, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x73,
+	0x18, 0x20, 0x20, 0x03, 0x28, 0x09, 0x52, 0x14, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a,
+	0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x72, 0x6c, 0x73, 0x12, 0x48, 0x0a, 0x1e,
+	0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e,
+	0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x53,
+	0x20, 0x01, 0x28, 0x09, 0x48, 0x21, 0x52, 0x1b, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a,
+	0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
+	0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x19, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69,
+	0x64, 0x65, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6e,
+	0x61, 0x6d, 0x65, 0x18, 0x21, 0x20, 0x01, 0x28, 0x09, 0x48, 0x22, 0x52, 0x17, 0x6f, 0x76, 0x65,
+	0x72, 0x72, 0x69, 0x64, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65,
+	0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x15, 0x63, 0x65, 0x72, 0x74, 0x69,
+	0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79,
+	0x18, 0x22, 0x20, 0x01, 0x28, 0x09, 0x48, 0x23, 0x52, 0x14, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66,
+	0x69, 0x63, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x88, 0x01,
+	0x01, 0x12, 0x22, 0x0a, 0x0a, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x5f, 0x74, 0x6c, 0x73, 0x18,
+	0x60, 0x20, 0x01, 0x28, 0x09, 0x48, 0x24, 0x52, 0x09, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x54,
+	0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67,
+	0x5f, 0x6b, 0x65, 0x79, 0x18, 0x24, 0x20, 0x01, 0x28, 0x09, 0x48, 0x25, 0x52, 0x0a, 0x73, 0x69,
+	0x67, 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x88, 0x01, 0x01, 0x12, 0x63, 0x0a, 0x14, 0x73,
+	0x65, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x64,
+	0x65, 0x72, 0x73, 0x18, 0x45, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x6f, 0x6d, 0x65,
+	0x72, 0x69, 0x75, 0x6d, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x53, 0x65, 0x74, 0x74,
+	0x69, 0x6e, 0x67, 0x73, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x12, 0x73, 0x65,
+	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73,
+	0x12, 0x5d, 0x0a, 0x12, 0x6a, 0x77, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x5f, 0x68,
+	0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x3f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70,
+	0x6f, 0x6d, 0x65, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x53,
+	0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x4a, 0x77, 0x74, 0x43, 0x6c, 0x61, 0x69, 0x6d,
+	0x73, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x6a,
+	0x77, 0x74, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12,
+	0x4f, 0x0a, 0x11, 0x6a, 0x77, 0x74, 0x5f, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x5f, 0x66, 0x6f,
+	0x72, 0x6d, 0x61, 0x74, 0x18, 0x8b, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x70, 0x6f,
+	0x6d, 0x65, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x49, 0x73,
+	0x73, 0x75, 0x65, 0x72, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x48, 0x26, 0x52, 0x0f, 0x6a, 0x77,
+	0x74, 0x49, 0x73, 0x73, 0x75, 0x65, 0x72, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x88, 0x01, 0x01,
+	0x12, 0x2a, 0x0a, 0x11, 0x6a, 0x77, 0x74, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x5f, 0x66,
+	0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x77, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x6a, 0x77, 0x74,
+	0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x58, 0x0a, 0x13,
+	0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x66, 0x6f, 0x72,
+	0x6d, 0x61, 0x74, 0x18, 0x8a, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x70, 0x6f, 0x6d,
+	0x65, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x42, 0x65, 0x61,
+	0x72, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x48, 0x27,
+	0x52, 0x11, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x46, 0x6f, 0x72,
+	0x6d, 0x61, 0x74, 0x88, 0x01, 0x01, 0x12, 0x58, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,
+	0x74, 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f,
+	0x75, 0x74, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x48, 0x28, 0x52, 0x16, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x55, 0x70,
+	0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x88, 0x01, 0x01,
+	0x12, 0x2c, 0x0a, 0x0f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x72,
+	0x65, 0x73, 0x73, 0x18, 0x28, 0x20, 0x01, 0x28, 0x09, 0x48, 0x29, 0x52, 0x0e, 0x6d, 0x65, 0x74,
+	0x72, 0x69, 0x63, 0x73, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x31,
+	0x0a, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f,
+	0x61, 0x75, 0x74, 0x68, 0x18, 0x40, 0x20, 0x01, 0x28, 0x09, 0x48, 0x2a, 0x52, 0x10, 0x6d, 0x65,
+	0x74, 0x72, 0x69, 0x63, 0x73, 0x42, 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x88, 0x01,
+	0x01, 0x12, 0x5b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x63, 0x65, 0x72,
+	0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, 0x41, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25,
+	0x2e, 0x70, 0x6f, 0x6d, 0x65, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66,
+	0x69, 0x63, 0x61, 0x74, 0x65, 0x48, 0x2b, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73,
+	0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2f,
+	0x0a, 0x11, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74,
+	0x5f, 0x63, 0x61, 0x18, 0x42, 0x20, 0x01, 0x28, 0x09, 0x48, 0x2c, 0x52, 0x0f, 0x6d, 0x65, 0x74,
+	0x72, 0x69, 0x63, 0x73, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x88, 0x01, 0x01, 0x12,
+	0x35, 0x0a, 0x14, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x73, 0x5f, 0x65,
+	0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x79, 0x20, 0x01, 0x28, 0x09, 0x48, 0x2d, 0x52,
+	0x12, 0x6f, 0x74, 0x65, 0x6c, 0x54, 0x72, 0x61, 0x63, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72,
+	0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x74,
+	0x72, 0x61, 0x63, 0x65, 0x73, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x72,
+	0x67, 0x18, 0x7a, 0x20, 0x01, 0x28, 0x01, 0x48, 0x2e, 0x52, 0x14, 0x6f, 0x74, 0x65, 0x6c, 0x54,
+	0x72, 0x61, 0x63, 0x65, 0x73, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x41, 0x72, 0x67, 0x88,
+	0x01, 0x01, 0x12, 0x38, 0x0a, 0x18, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75,
+	0x72, 0x63, 0x65, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x7b,
+	0x20, 0x03, 0x28, 0x09, 0x52, 0x16, 0x6f, 0x74, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72,
+	0x63, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x0e,
+	0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x7c,
+	0x20, 0x01, 0x28, 0x09, 0x48, 0x2f, 0x52, 0x0c, 0x6f, 0x74, 0x65, 0x6c, 0x4c, 0x6f, 0x67, 0x4c,
+	0x65, 0x76, 0x65, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x4d, 0x0a, 0x21, 0x6f, 0x74, 0x65, 0x6c, 0x5f,
+	0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f,
+	0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x7d, 0x20, 0x01,
+	0x28, 0x05, 0x48, 0x30, 0x52, 0x1d, 0x6f, 0x74, 0x65, 0x6c, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62,
+	0x75, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x4c, 0x69,
+	0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x1b, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x65,
+	0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x6f, 0x74, 0x6c, 0x70, 0x5f, 0x65, 0x6e, 0x64,
+	0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x7e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x31, 0x52, 0x18, 0x6f,
+	0x74, 0x65, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x4f, 0x74, 0x6c, 0x70, 0x45,
+	0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x4f, 0x0a, 0x22, 0x6f, 0x74,
 	0x65, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x6f, 0x74, 0x6c, 0x70,
-	0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x73, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18,
-	0x83, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1d, 0x6f, 0x74, 0x65, 0x6c, 0x45, 0x78, 0x70, 0x6f,
-	0x72, 0x74, 0x65, 0x72, 0x4f, 0x74, 0x6c, 0x70, 0x54, 0x72, 0x61, 0x63, 0x65, 0x73, 0x48, 0x65,
-	0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x5c, 0x0a, 0x1a, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x65, 0x78,
-	0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x6f, 0x74, 0x6c, 0x70, 0x5f, 0x74, 0x69, 0x6d, 0x65,
-	0x6f, 0x75, 0x74, 0x18, 0x84, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f,
-	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72,
-	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x31, 0x52, 0x17, 0x6f, 0x74, 0x65, 0x6c, 0x45, 0x78, 0x70,
-	0x6f, 0x72, 0x74, 0x65, 0x72, 0x4f, 0x74, 0x6c, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74,
-	0x88, 0x01, 0x01, 0x12, 0x69, 0x0a, 0x21, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f,
-	0x72, 0x74, 0x65, 0x72, 0x5f, 0x6f, 0x74, 0x6c, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x73,
-	0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x85, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
-	0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
-	0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x32, 0x52, 0x1d, 0x6f, 0x74,
+	0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x73, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74,
+	0x18, 0x7f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x32, 0x52, 0x1e, 0x6f, 0x74, 0x65, 0x6c, 0x45, 0x78,
+	0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x4f, 0x74, 0x6c, 0x70, 0x54, 0x72, 0x61, 0x63, 0x65, 0x73,
+	0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x43, 0x0a, 0x1b, 0x6f,
+	0x74, 0x65, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x6f, 0x74, 0x6c,
+	0x70, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x80, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x48, 0x33, 0x52, 0x18, 0x6f, 0x74, 0x65, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65,
+	0x72, 0x4f, 0x74, 0x6c, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x88, 0x01, 0x01,
+	0x12, 0x50, 0x0a, 0x22, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65,
+	0x72, 0x5f, 0x6f, 0x74, 0x6c, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x73, 0x5f, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x81, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x34, 0x52,
+	0x1e, 0x6f, 0x74, 0x65, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x4f, 0x74, 0x6c,
+	0x70, 0x54, 0x72, 0x61, 0x63, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x88,
+	0x01, 0x01, 0x12, 0x3c, 0x0a, 0x1a, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72,
+	0x74, 0x65, 0x72, 0x5f, 0x6f, 0x74, 0x6c, 0x70, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73,
+	0x18, 0x82, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x6f, 0x74, 0x65, 0x6c, 0x45, 0x78, 0x70,
+	0x6f, 0x72, 0x74, 0x65, 0x72, 0x4f, 0x74, 0x6c, 0x70, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73,
+	0x12, 0x49, 0x0a, 0x21, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65,
+	0x72, 0x5f, 0x6f, 0x74, 0x6c, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x73, 0x5f, 0x68, 0x65,
+	0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x83, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1d, 0x6f, 0x74,
 	0x65, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x4f, 0x74, 0x6c, 0x70, 0x54, 0x72,
-	0x61, 0x63, 0x65, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x88, 0x01, 0x01, 0x12, 0x56,
-	0x0a, 0x17, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x62, 0x73, 0x70, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64,
-	0x75, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x86, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x61, 0x63, 0x65, 0x73, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x5c, 0x0a, 0x1a, 0x6f,
+	0x74, 0x65, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x6f, 0x74, 0x6c,
+	0x70, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x84, 0x01, 0x20, 0x01, 0x28, 0x0b,
 	0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
-	0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x33, 0x52, 0x14, 0x6f,
-	0x74, 0x65, 0x6c, 0x42, 0x73, 0x70, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x44, 0x65,
-	0x6c, 0x61, 0x79, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x1e, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x62,
-	0x73, 0x70, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x62, 0x61,
-	0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x87, 0x01, 0x20, 0x01, 0x28, 0x05, 0x48,
-	0x34, 0x52, 0x19, 0x6f, 0x74, 0x65, 0x6c, 0x42, 0x73, 0x70, 0x4d, 0x61, 0x78, 0x45, 0x78, 0x70,
-	0x6f, 0x72, 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12,
-	0x26, 0x0a, 0x0c, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18,
-	0x2e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x35, 0x52, 0x0b, 0x67, 0x72, 0x70, 0x63, 0x41, 0x64, 0x64,
-	0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x67, 0x72, 0x70, 0x63, 0x5f,
-	0x69, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x08, 0x48, 0x36,
-	0x52, 0x0c, 0x67, 0x72, 0x70, 0x63, 0x49, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x88, 0x01,
-	0x01, 0x12, 0x4e, 0x0a, 0x13, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74,
-	0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x63, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19,
-	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
-	0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x37, 0x52, 0x11, 0x67, 0x72, 0x70,
-	0x63, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x88, 0x01,
-	0x01, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x61, 0x74, 0x61, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x5f,
-	0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x73, 0x18, 0x34, 0x20, 0x03,
-	0x28, 0x09, 0x52, 0x15, 0x64, 0x61, 0x74, 0x61, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x53, 0x65,
-	0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x72, 0x6c, 0x73, 0x12, 0x4a, 0x0a, 0x1f, 0x64, 0x61, 0x74,
-	0x61, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c,
-	0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x54, 0x20, 0x01,
-	0x28, 0x09, 0x48, 0x38, 0x52, 0x1c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72,
-	0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55,
-	0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x64, 0x61, 0x74, 0x61, 0x62, 0x72, 0x6f,
-	0x6b, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65,
-	0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x48, 0x39, 0x52, 0x15, 0x64, 0x61, 0x74, 0x61, 0x62, 0x72,
-	0x6f, 0x6b, 0x65, 0x72, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x88,
-	0x01, 0x01, 0x12, 0x54, 0x0a, 0x24, 0x64, 0x61, 0x74, 0x61, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72,
-	0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74,
-	0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x66, 0x20, 0x01, 0x28, 0x09,
-	0x48, 0x3a, 0x52, 0x21, 0x64, 0x61, 0x74, 0x61, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x53, 0x74,
-	0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53,
-	0x74, 0x72, 0x69, 0x6e, 0x67, 0x88, 0x01, 0x01, 0x12, 0x55, 0x0a, 0x0f, 0x64, 0x6f, 0x77, 0x6e,
-	0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x6d, 0x74, 0x6c, 0x73, 0x18, 0x74, 0x20, 0x01, 0x28,
-	0x0b, 0x32, 0x27, 0x2e, 0x70, 0x6f, 0x6d, 0x65, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x63, 0x6f, 0x6e,
-	0x66, 0x69, 0x67, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x74,
-	0x6c, 0x73, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x48, 0x3b, 0x52, 0x0e, 0x64, 0x6f,
-	0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x74, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12,
-	0x76, 0x0a, 0x36, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f,
-	0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x6c, 0x65, 0x73, 0x73, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x65,
-	0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
-	0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x37, 0x20, 0x01, 0x28, 0x09, 0x48,
-	0x3c, 0x52, 0x31, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65,
-	0x72, 0x76, 0x65, 0x72, 0x6c, 0x65, 0x73, 0x73, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69,
-	0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x63,
-	0x6f, 0x75, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x75, 0x73, 0x65, 0x5f, 0x70,
-	0x72, 0x6f, 0x78, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x6b, 0x20,
-	0x01, 0x28, 0x08, 0x48, 0x3d, 0x52, 0x10, 0x75, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x50,
-	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x61, 0x75,
-	0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x38, 0x20, 0x01, 0x28, 0x08, 0x48, 0x3e, 0x52, 0x08,
-	0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x61,
-	0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x61, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x09,
-	0x48, 0x3f, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x43, 0x61, 0x88, 0x01,
-	0x01, 0x12, 0x2a, 0x0a, 0x0e, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x65, 0x6d,
-	0x61, 0x69, 0x6c, 0x18, 0x4d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x40, 0x52, 0x0d, 0x61, 0x75, 0x74,
-	0x6f, 0x63, 0x65, 0x72, 0x74, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a,
-	0x14, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x73, 0x74,
-	0x61, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x39, 0x20, 0x01, 0x28, 0x08, 0x48, 0x41, 0x52, 0x12, 0x61,
-	0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x55, 0x73, 0x65, 0x53, 0x74, 0x61, 0x67, 0x69, 0x6e,
-	0x67, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x13, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74,
-	0x5f, 0x65, 0x61, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x4e, 0x20, 0x01, 0x28,
-	0x09, 0x48, 0x42, 0x52, 0x10, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x45, 0x61, 0x62,
-	0x4b, 0x65, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x14, 0x61, 0x75, 0x74, 0x6f,
-	0x63, 0x65, 0x72, 0x74, 0x5f, 0x65, 0x61, 0x62, 0x5f, 0x6d, 0x61, 0x63, 0x5f, 0x6b, 0x65, 0x79,
-	0x18, 0x4f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x43, 0x52, 0x11, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65,
-	0x72, 0x74, 0x45, 0x61, 0x62, 0x4d, 0x61, 0x63, 0x4b, 0x65, 0x79, 0x88, 0x01, 0x01, 0x12, 0x35,
-	0x0a, 0x14, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x6d, 0x75, 0x73, 0x74, 0x5f,
-	0x73, 0x74, 0x61, 0x70, 0x6c, 0x65, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x08, 0x48, 0x44, 0x52, 0x12,
-	0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x4d, 0x75, 0x73, 0x74, 0x53, 0x74, 0x61, 0x70,
-	0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72,
-	0x74, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x45, 0x52, 0x0b, 0x61,
-	0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x44, 0x69, 0x72, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a,
-	0x13, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65,
-	0x64, 0x5f, 0x63, 0x61, 0x18, 0x50, 0x20, 0x01, 0x28, 0x09, 0x48, 0x46, 0x52, 0x11, 0x61, 0x75,
-	0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, 0x61, 0x88,
-	0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x78, 0x66, 0x66, 0x5f, 0x61,
-	0x70, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x08, 0x48, 0x47, 0x52, 0x0d, 0x73,
-	0x6b, 0x69, 0x70, 0x58, 0x66, 0x66, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12,
-	0x34, 0x0a, 0x14, 0x78, 0x66, 0x66, 0x5f, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x72, 0x75, 0x73, 0x74,
-	0x65, 0x64, 0x5f, 0x68, 0x6f, 0x70, 0x73, 0x18, 0x46, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x48, 0x52,
-	0x11, 0x78, 0x66, 0x66, 0x4e, 0x75, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x48, 0x6f,
-	0x70, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1b, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x5f, 0x61,
-	0x64, 0x6d, 0x69, 0x6e, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x5f,
-	0x70, 0x61, 0x74, 0x68, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x49, 0x52, 0x17, 0x65, 0x6e,
-	0x76, 0x6f, 0x79, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f,
-	0x67, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x18, 0x65, 0x6e, 0x76, 0x6f,
-	0x79, 0x5f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f,
-	0x70, 0x61, 0x74, 0x68, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x4a, 0x52, 0x15, 0x65, 0x6e,
-	0x76, 0x6f, 0x79, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x50,
-	0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x5f,
-	0x61, 0x64, 0x6d, 0x69, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x6e, 0x20,
-	0x01, 0x28, 0x09, 0x48, 0x4b, 0x52, 0x11, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x41, 0x64, 0x6d, 0x69,
-	0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x20, 0x65,
-	0x6e, 0x76, 0x6f, 0x79, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
-	0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18,
-	0x6f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x4c, 0x52, 0x1c, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x42, 0x69,
-	0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x64,
-	0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x1a, 0x65, 0x6e, 0x76, 0x6f,
-	0x79, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x66, 0x72,
-	0x65, 0x65, 0x62, 0x69, 0x6e, 0x64, 0x18, 0x70, 0x20, 0x01, 0x28, 0x08, 0x48, 0x4d, 0x52, 0x17,
-	0x65, 0x6e, 0x76, 0x6f, 0x79, 0x42, 0x69, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46,
-	0x72, 0x65, 0x65, 0x62, 0x69, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x53, 0x0a, 0x26, 0x70, 0x72,
-	0x6f, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x72, 0x65, 0x64, 0x69, 0x72,
-	0x65, 0x63, 0x74, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65,
-	0x6c, 0x69, 0x73, 0x74, 0x18, 0x44, 0x20, 0x03, 0x28, 0x09, 0x52, 0x23, 0x70, 0x72, 0x6f, 0x67,
-	0x72, 0x61, 0x6d, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
-	0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x12,
-	0x80, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x49,
-	0x20, 0x01, 0x28, 0x0e, 0x32, 0x5c, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74,
-	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e,
-	0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e,
-	0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e,
-	0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f,
-	0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x54, 0x79,
-	0x70, 0x65, 0x48, 0x4e, 0x52, 0x09, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x54, 0x79, 0x70, 0x65, 0x88,
-	0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x63, 0x6f,
-	0x6c, 0x6f, 0x72, 0x18, 0x55, 0x20, 0x01, 0x28, 0x09, 0x48, 0x4f, 0x52, 0x0c, 0x70, 0x72, 0x69,
-	0x6d, 0x61, 0x72, 0x79, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0f,
-	0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x18,
-	0x56, 0x20, 0x01, 0x28, 0x09, 0x48, 0x50, 0x52, 0x0e, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61,
-	0x72, 0x79, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x16, 0x64, 0x61,
-	0x72, 0x6b, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x63,
-	0x6f, 0x6c, 0x6f, 0x72, 0x18, 0x57, 0x20, 0x01, 0x28, 0x09, 0x48, 0x51, 0x52, 0x14, 0x64, 0x61,
-	0x72, 0x6b, 0x6d, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x43, 0x6f, 0x6c,
-	0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x3d, 0x0a, 0x18, 0x64, 0x61, 0x72, 0x6b, 0x6d, 0x6f, 0x64,
-	0x65, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x6c, 0x6f,
-	0x72, 0x18, 0x58, 0x20, 0x01, 0x28, 0x09, 0x48, 0x52, 0x52, 0x16, 0x64, 0x61, 0x72, 0x6b, 0x6d,
-	0x6f, 0x64, 0x65, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x43, 0x6f, 0x6c, 0x6f,
-	0x72, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x6f, 0x5f, 0x75, 0x72, 0x6c,
-	0x18, 0x59, 0x20, 0x01, 0x28, 0x09, 0x48, 0x53, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x6f, 0x55, 0x72,
-	0x6c, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x5f,
-	0x75, 0x72, 0x6c, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x54, 0x52, 0x0a, 0x66, 0x61, 0x76,
-	0x69, 0x63, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x1d, 0x65, 0x72,
-	0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x66, 0x69, 0x72, 0x73,
-	0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x18, 0x5b, 0x20, 0x01, 0x28,
-	0x09, 0x48, 0x55, 0x52, 0x1a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
-	0x65, 0x46, 0x69, 0x72, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x88,
-	0x01, 0x01, 0x12, 0x37, 0x0a, 0x15, 0x70, 0x61, 0x73, 0x73, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74,
-	0x69, 0x74, 0x79, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x75, 0x20, 0x01, 0x28,
-	0x08, 0x48, 0x56, 0x52, 0x13, 0x70, 0x61, 0x73, 0x73, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74,
-	0x79, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x88, 0x01, 0x01, 0x12, 0x50, 0x0a, 0x0d, 0x72,
-	0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x76, 0x20, 0x03,
-	0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x6f, 0x6d, 0x65, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x63, 0x6f,
-	0x6e, 0x66, 0x69, 0x67, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x52, 0x75,
-	0x6e, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52,
-	0x0c, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x36, 0x0a,
-	0x14, 0x68, 0x74, 0x74, 0x70, 0x33, 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65,
-	0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x88, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x57, 0x52, 0x12,
-	0x68, 0x74, 0x74, 0x70, 0x33, 0x41, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x50, 0x6f,
-	0x72, 0x74, 0x88, 0x01, 0x01, 0x12, 0x6d, 0x0a, 0x1a, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74,
-	0x5f, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f,
-	0x6c, 0x64, 0x73, 0x18, 0x8c, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x6f, 0x6d,
-	0x65, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x69, 0x72,
-	0x63, 0x75, 0x69, 0x74, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x54, 0x68, 0x72, 0x65, 0x73,
-	0x68, 0x6f, 0x6c, 0x64, 0x73, 0x48, 0x58, 0x52, 0x18, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74,
-	0x42, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64,
-	0x73, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x73, 0x73, 0x68, 0x5f, 0x61, 0x64, 0x64, 0x72,
-	0x65, 0x73, 0x73, 0x18, 0x8d, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x59, 0x52, 0x0a, 0x73, 0x73,
-	0x68, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x57, 0x0a, 0x12, 0x73,
-	0x73, 0x68, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65,
-	0x73, 0x18, 0x8e, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x6f, 0x6d, 0x65, 0x72,
-	0x69, 0x75, 0x6d, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69,
-	0x6e, 0x67, 0x73, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x5a,
-	0x52, 0x0f, 0x73, 0x73, 0x68, 0x48, 0x6f, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6c, 0x65,
-	0x73, 0x88, 0x01, 0x01, 0x12, 0x4e, 0x0a, 0x0d, 0x73, 0x73, 0x68, 0x5f, 0x68, 0x6f, 0x73, 0x74,
-	0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x8f, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70,
-	0x6f, 0x6d, 0x65, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x53,
-	0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69,
-	0x73, 0x74, 0x48, 0x5b, 0x52, 0x0b, 0x73, 0x73, 0x68, 0x48, 0x6f, 0x73, 0x74, 0x4b, 0x65, 0x79,
-	0x73, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x14, 0x73, 0x73, 0x68, 0x5f, 0x75, 0x73, 0x65, 0x72,
-	0x5f, 0x63, 0x61, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x90, 0x01, 0x20,
-	0x01, 0x28, 0x09, 0x48, 0x5c, 0x52, 0x10, 0x73, 0x73, 0x68, 0x55, 0x73, 0x65, 0x72, 0x43, 0x61,
-	0x4b, 0x65, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, 0x73, 0x73,
-	0x68, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x91, 0x01,
-	0x20, 0x01, 0x28, 0x09, 0x48, 0x5d, 0x52, 0x0c, 0x73, 0x73, 0x68, 0x55, 0x73, 0x65, 0x72, 0x43,
-	0x61, 0x4b, 0x65, 0x79, 0x88, 0x01, 0x01, 0x1a, 0x59, 0x0a, 0x0b, 0x43, 0x65, 0x72, 0x74, 0x69,
-	0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x62,
-	0x79, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x63, 0x65, 0x72, 0x74,
-	0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6b, 0x65, 0x79, 0x5f, 0x62, 0x79, 0x74,
-	0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x6b, 0x65, 0x79, 0x42, 0x79, 0x74,
-	0x65, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
-	0x69, 0x64, 0x1a, 0x24, 0x0a, 0x0a, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74,
-	0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09,
-	0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x40, 0x0a, 0x12, 0x52, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10,
-	0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79,
-	0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x45, 0x0a, 0x17, 0x53, 0x65,
-	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73,
-	0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38,
-	0x01, 0x1a, 0x43, 0x0a, 0x15, 0x4a, 0x77, 0x74, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x73, 0x48, 0x65,
-	0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65,
-	0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05,
-	0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c,
-	0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d,
-	0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b,
-	0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a,
-	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61,
-	0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x69, 0x6e, 0x73, 0x74,
-	0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x42, 0x0c, 0x0a, 0x0a, 0x5f,
-	0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x61, 0x63,
-	0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x42,
-	0x17, 0x0a, 0x15, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x5f, 0x6c, 0x6f,
-	0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x70, 0x72, 0x6f,
-	0x78, 0x79, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x42, 0x10, 0x0a, 0x0e,
-	0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x42, 0x0b,
-	0x0a, 0x09, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f,
-	0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x69, 0x6e, 0x73, 0x65,
-	0x63, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f,
-	0x64, 0x6e, 0x73, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c,
-	0x79, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x72, 0x65, 0x64, 0x69, 0x72,
-	0x65, 0x63, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x69, 0x6d,
-	0x65, 0x6f, 0x75, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x74, 0x69,
-	0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x5f,
-	0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x69, 0x64, 0x6c, 0x65, 0x42, 0x1b, 0x0a, 0x19,
-	0x5f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x65,
-	0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x24, 0x0a, 0x22, 0x5f, 0x61, 0x75,
-	0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72,
-	0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x42,
-	0x17, 0x0a, 0x15, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x6f, 0x75, 0x74, 0x5f, 0x72, 0x65, 0x64, 0x69,
-	0x72, 0x65, 0x63, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x61, 0x75, 0x74,
-	0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61,
-	0x63, 0x6b, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x63, 0x6f, 0x6f, 0x6b,
-	0x69, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6f, 0x6f, 0x6b,
-	0x69, 0x65, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6f,
-	0x6f, 0x6b, 0x69, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x42, 0x13, 0x0a, 0x11, 0x5f,
-	0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x6f, 0x6e, 0x6c, 0x79,
-	0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x69,
-	0x72, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x5f, 0x73, 0x61,
-	0x6d, 0x65, 0x5f, 0x73, 0x69, 0x74, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x69, 0x64, 0x70, 0x5f,
-	0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x69, 0x64,
-	0x70, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x42,
-	0x0f, 0x0a, 0x0d, 0x5f, 0x69, 0x64, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72,
-	0x42, 0x13, 0x0a, 0x11, 0x5f, 0x69, 0x64, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65,
-	0x72, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x25, 0x0a, 0x23, 0x5f, 0x69, 0x64, 0x70, 0x5f, 0x61, 0x63,
-	0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77,
-	0x65, 0x64, 0x5f, 0x61, 0x75, 0x64, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x42, 0x21, 0x0a, 0x1f,
-	0x5f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72,
-	0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x42,
-	0x1c, 0x0a, 0x1a, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x63, 0x65, 0x72,
-	0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x18, 0x0a,
-	0x16, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x75,
-	0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x64, 0x65, 0x72, 0x69,
-	0x76, 0x65, 0x5f, 0x74, 0x6c, 0x73, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x69,
-	0x6e, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6a, 0x77, 0x74, 0x5f, 0x69,
-	0x73, 0x73, 0x75, 0x65, 0x72, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x42, 0x16, 0x0a, 0x14,
-	0x5f, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x66, 0x6f,
-	0x72, 0x6d, 0x61, 0x74, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74,
-	0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75,
-	0x74, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x61, 0x64,
-	0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63,
-	0x73, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x42, 0x16, 0x0a, 0x14,
-	0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,
-	0x63, 0x61, 0x74, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73,
-	0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x61, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6f,
-	0x74, 0x65, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72,
-	0x74, 0x65, 0x72, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x74, 0x72, 0x61,
-	0x63, 0x65, 0x73, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x72, 0x67, 0x42,
-	0x11, 0x0a, 0x0f, 0x5f, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76,
-	0x65, 0x6c, 0x42, 0x24, 0x0a, 0x22, 0x5f, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x61, 0x74, 0x74, 0x72,
-	0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x6c, 0x65, 0x6e, 0x67,
-	0x74, 0x68, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x6f, 0x74, 0x65,
+	0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x35, 0x52, 0x17, 0x6f,
+	0x74, 0x65, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x4f, 0x74, 0x6c, 0x70, 0x54,
+	0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x88, 0x01, 0x01, 0x12, 0x69, 0x0a, 0x21, 0x6f, 0x74, 0x65,
 	0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x6f, 0x74, 0x6c, 0x70, 0x5f,
-	0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x42, 0x25, 0x0a, 0x23, 0x5f, 0x6f, 0x74, 0x65,
-	0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x6f, 0x74, 0x6c, 0x70, 0x5f,
-	0x74, 0x72, 0x61, 0x63, 0x65, 0x73, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x42,
-	0x1e, 0x0a, 0x1c, 0x5f, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65,
-	0x72, 0x5f, 0x6f, 0x74, 0x6c, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x42,
-	0x25, 0x0a, 0x23, 0x5f, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65,
-	0x72, 0x5f, 0x6f, 0x74, 0x6c, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x73, 0x5f, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x6f, 0x74, 0x65, 0x6c, 0x5f,
-	0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x6f, 0x74, 0x6c, 0x70, 0x5f, 0x74, 0x69,
-	0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x24, 0x0a, 0x22, 0x5f, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x65,
-	0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x6f, 0x74, 0x6c, 0x70, 0x5f, 0x74, 0x72, 0x61,
-	0x63, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x1a, 0x0a, 0x18, 0x5f,
-	0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x62, 0x73, 0x70, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c,
-	0x65, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x42, 0x21, 0x0a, 0x1f, 0x5f, 0x6f, 0x74, 0x65, 0x6c,
-	0x5f, 0x62, 0x73, 0x70, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x5f,
-	0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x67,
-	0x72, 0x70, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f,
-	0x67, 0x72, 0x70, 0x63, 0x5f, 0x69, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x42, 0x16, 0x0a,
-	0x14, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69,
-	0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x22, 0x0a, 0x20, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x72,
-	0x6f, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x65,
-	0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x64, 0x61,
-	0x74, 0x61, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
-	0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x27, 0x0a, 0x25, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x72,
-	0x6f, 0x6b, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x6e,
-	0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x12,
-	0x0a, 0x10, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x6d, 0x74,
-	0x6c, 0x73, 0x42, 0x39, 0x0a, 0x37, 0x5f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5f, 0x63, 0x6c,
-	0x6f, 0x75, 0x64, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x6c, 0x65, 0x73, 0x73, 0x5f, 0x61,
-	0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65,
-	0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x15, 0x0a,
-	0x13, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x74,
-	0x6f, 0x63, 0x6f, 0x6c, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72,
-	0x74, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x63,
-	0x61, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x65,
-	0x6d, 0x61, 0x69, 0x6c, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72,
-	0x74, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x42, 0x16, 0x0a,
-	0x14, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x65, 0x61, 0x62, 0x5f, 0x6b,
-	0x65, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65,
-	0x72, 0x74, 0x5f, 0x65, 0x61, 0x62, 0x5f, 0x6d, 0x61, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x42, 0x17,
-	0x0a, 0x15, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x6d, 0x75, 0x73, 0x74,
-	0x5f, 0x73, 0x74, 0x61, 0x70, 0x6c, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x61, 0x75, 0x74, 0x6f,
-	0x63, 0x65, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x72, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x61, 0x75, 0x74,
-	0x6f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x61,
-	0x42, 0x12, 0x0a, 0x10, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x78, 0x66, 0x66, 0x5f, 0x61, 0x70,
-	0x70, 0x65, 0x6e, 0x64, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x78, 0x66, 0x66, 0x5f, 0x6e, 0x75, 0x6d,
-	0x5f, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x68, 0x6f, 0x70, 0x73, 0x42, 0x1e, 0x0a,
-	0x1c, 0x5f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x5f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x5f, 0x61, 0x63,
-	0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x42, 0x1b, 0x0a,
-	0x19, 0x5f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x5f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x5f, 0x70, 0x72,
-	0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65,
-	0x6e, 0x76, 0x6f, 0x79, 0x5f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65,
-	0x73, 0x73, 0x42, 0x23, 0x0a, 0x21, 0x5f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x5f, 0x62, 0x69, 0x6e,
-	0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f,
-	0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x65, 0x6e, 0x76, 0x6f,
-	0x79, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x66, 0x72,
-	0x65, 0x65, 0x62, 0x69, 0x6e, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x63,
-	0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72,
-	0x79, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x73, 0x65, 0x63, 0x6f,
-	0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x42, 0x19, 0x0a, 0x17, 0x5f,
-	0x64, 0x61, 0x72, 0x6b, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79,
-	0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x64, 0x61, 0x72, 0x6b, 0x6d,
-	0x6f, 0x64, 0x65, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x63, 0x6f,
-	0x6c, 0x6f, 0x72, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6c, 0x6f, 0x67, 0x6f, 0x5f, 0x75, 0x72, 0x6c,
-	0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c,
-	0x42, 0x20, 0x0a, 0x1e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61,
-	0x67, 0x65, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x67, 0x72, 0x61,
-	0x70, 0x68, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x5f, 0x69, 0x64, 0x65, 0x6e,
-	0x74, 0x69, 0x74, 0x79, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x42, 0x17, 0x0a, 0x15,
-	0x5f, 0x68, 0x74, 0x74, 0x70, 0x33, 0x5f, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65,
-	0x5f, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69,
-	0x74, 0x5f, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68,
-	0x6f, 0x6c, 0x64, 0x73, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x73, 0x73, 0x68, 0x5f, 0x61, 0x64, 0x64,
-	0x72, 0x65, 0x73, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x73, 0x73, 0x68, 0x5f, 0x68, 0x6f, 0x73,
-	0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f,
-	0x73, 0x73, 0x68, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x42, 0x17, 0x0a,
-	0x15, 0x5f, 0x73, 0x73, 0x68, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x5f, 0x6b, 0x65,
-	0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x73, 0x73, 0x68, 0x5f, 0x75,
-	0x73, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x5f, 0x6b, 0x65, 0x79, 0x4a, 0x04, 0x08, 0x29, 0x10, 0x2e,
-	0x4a, 0x04, 0x08, 0x62, 0x10, 0x63, 0x4a, 0x04, 0x08, 0x64, 0x10, 0x65, 0x4a, 0x04, 0x08, 0x6a,
-	0x10, 0x6b, 0x22, 0xc8, 0x02, 0x0a, 0x16, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61,
-	0x6d, 0x4d, 0x74, 0x6c, 0x73, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x13, 0x0a,
-	0x02, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x63, 0x61, 0x88,
-	0x01, 0x01, 0x12, 0x15, 0x0a, 0x03, 0x63, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48,
-	0x01, 0x52, 0x03, 0x63, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x0b, 0x65, 0x6e, 0x66,
-	0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24,
-	0x2e, 0x70, 0x6f, 0x6d, 0x65, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
-	0x2e, 0x4d, 0x74, 0x6c, 0x73, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74,
-	0x4d, 0x6f, 0x64, 0x65, 0x48, 0x02, 0x52, 0x0b, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d,
-	0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x52, 0x0a, 0x17, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f,
-	0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x61, 0x6c, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
-	0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x6f, 0x6d, 0x65, 0x72, 0x69,
-	0x75, 0x6d, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x53, 0x41, 0x4e, 0x4d, 0x61, 0x74,
-	0x63, 0x68, 0x65, 0x72, 0x52, 0x14, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x53, 0x75, 0x62, 0x6a, 0x65,
-	0x63, 0x74, 0x41, 0x6c, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x10, 0x6d, 0x61,
-	0x78, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x64, 0x65, 0x70, 0x74, 0x68, 0x18, 0x05,
-	0x20, 0x01, 0x28, 0x0d, 0x48, 0x03, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x69, 0x66,
-	0x79, 0x44, 0x65, 0x70, 0x74, 0x68, 0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x63, 0x61,
-	0x42, 0x06, 0x0a, 0x04, 0x5f, 0x63, 0x72, 0x6c, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x65, 0x6e, 0x66,
-	0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6d, 0x61, 0x78,
-	0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x64, 0x65, 0x70, 0x74, 0x68, 0x22, 0xd1, 0x01,
-	0x0a, 0x0a, 0x53, 0x41, 0x4e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x08,
-	0x73, 0x61, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23,
+	0x74, 0x72, 0x61, 0x63, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x85,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+	0x48, 0x36, 0x52, 0x1d, 0x6f, 0x74, 0x65, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72,
+	0x4f, 0x74, 0x6c, 0x70, 0x54, 0x72, 0x61, 0x63, 0x65, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75,
+	0x74, 0x88, 0x01, 0x01, 0x12, 0x56, 0x0a, 0x17, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x62, 0x73, 0x70,
+	0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18,
+	0x86, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x48, 0x37, 0x52, 0x14, 0x6f, 0x74, 0x65, 0x6c, 0x42, 0x73, 0x70, 0x53, 0x63, 0x68, 0x65,
+	0x64, 0x75, 0x6c, 0x65, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x1e,
+	0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x62, 0x73, 0x70, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70,
+	0x6f, 0x72, 0x74, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x87,
+	0x01, 0x20, 0x01, 0x28, 0x05, 0x48, 0x38, 0x52, 0x19, 0x6f, 0x74, 0x65, 0x6c, 0x42, 0x73, 0x70,
+	0x4d, 0x61, 0x78, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, 0x69,
+	0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x64,
+	0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x39, 0x52, 0x0b, 0x67,
+	0x72, 0x70, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a,
+	0x0d, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x69, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x18, 0x2f,
+	0x20, 0x01, 0x28, 0x08, 0x48, 0x3a, 0x52, 0x0c, 0x67, 0x72, 0x70, 0x63, 0x49, 0x6e, 0x73, 0x65,
+	0x63, 0x75, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x4e, 0x0a, 0x13, 0x67, 0x72, 0x70, 0x63, 0x5f,
+	0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x63,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48,
+	0x3b, 0x52, 0x11, 0x67, 0x72, 0x70, 0x63, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d,
+	0x65, 0x6f, 0x75, 0x74, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x61, 0x74, 0x61, 0x62,
+	0x72, 0x6f, 0x6b, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x72,
+	0x6c, 0x73, 0x18, 0x34, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x64, 0x61, 0x74, 0x61, 0x62, 0x72,
+	0x6f, 0x6b, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x72, 0x6c, 0x73, 0x12,
+	0x4a, 0x0a, 0x1f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x6e,
+	0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75,
+	0x72, 0x6c, 0x18, 0x54, 0x20, 0x01, 0x28, 0x09, 0x48, 0x3c, 0x52, 0x1c, 0x64, 0x61, 0x74, 0x61,
+	0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65,
+	0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x64,
+	0x61, 0x74, 0x61, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,
+	0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x48, 0x3d, 0x52, 0x15,
+	0x64, 0x61, 0x74, 0x61, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67,
+	0x65, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, 0x54, 0x0a, 0x24, 0x64, 0x61, 0x74, 0x61,
+	0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63,
+	0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
+	0x18, 0x66, 0x20, 0x01, 0x28, 0x09, 0x48, 0x3e, 0x52, 0x21, 0x64, 0x61, 0x74, 0x61, 0x62, 0x72,
+	0x6f, 0x6b, 0x65, 0x72, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65,
+	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x88, 0x01, 0x01, 0x12, 0x55,
+	0x0a, 0x0f, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x6d, 0x74, 0x6c,
+	0x73, 0x18, 0x74, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x6f, 0x6d, 0x65, 0x72, 0x69,
+	0x75, 0x6d, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x74,
+	0x72, 0x65, 0x61, 0x6d, 0x4d, 0x74, 0x6c, 0x73, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73,
+	0x48, 0x3f, 0x52, 0x0e, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x74,
+	0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x76, 0x0a, 0x36, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5f,
+	0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x6c, 0x65, 0x73, 0x73,
+	0x5f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
+	0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18,
+	0x37, 0x20, 0x01, 0x28, 0x09, 0x48, 0x40, 0x52, 0x31, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x43,
+	0x6c, 0x6f, 0x75, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x6c, 0x65, 0x73, 0x73, 0x41, 0x75,
+	0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a,
+	0x12, 0x75, 0x73, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x08, 0x48, 0x41, 0x52, 0x10, 0x75, 0x73, 0x65,
+	0x50, 0x72, 0x6f, 0x78, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x88, 0x01, 0x01,
+	0x12, 0x1f, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x38, 0x20, 0x01,
+	0x28, 0x08, 0x48, 0x42, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x88, 0x01,
+	0x01, 0x12, 0x24, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x61,
+	0x18, 0x4c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x43, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65,
+	0x72, 0x74, 0x43, 0x61, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x0e, 0x61, 0x75, 0x74, 0x6f, 0x63,
+	0x65, 0x72, 0x74, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x4d, 0x20, 0x01, 0x28, 0x09, 0x48,
+	0x44, 0x52, 0x0d, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x45, 0x6d, 0x61, 0x69, 0x6c,
+	0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x14, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x5f,
+	0x75, 0x73, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x39, 0x20, 0x01, 0x28,
+	0x08, 0x48, 0x45, 0x52, 0x12, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x55, 0x73, 0x65,
+	0x53, 0x74, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x13, 0x61, 0x75,
+	0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x65, 0x61, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69,
+	0x64, 0x18, 0x4e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x46, 0x52, 0x10, 0x61, 0x75, 0x74, 0x6f, 0x63,
+	0x65, 0x72, 0x74, 0x45, 0x61, 0x62, 0x4b, 0x65, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x34,
+	0x0a, 0x14, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x65, 0x61, 0x62, 0x5f, 0x6d,
+	0x61, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x4f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x47, 0x52, 0x11,
+	0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x45, 0x61, 0x62, 0x4d, 0x61, 0x63, 0x4b, 0x65,
+	0x79, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x14, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74,
+	0x5f, 0x6d, 0x75, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x70, 0x6c, 0x65, 0x18, 0x3a, 0x20, 0x01,
+	0x28, 0x08, 0x48, 0x48, 0x52, 0x12, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x4d, 0x75,
+	0x73, 0x74, 0x53, 0x74, 0x61, 0x70, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x61,
+	0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x3b, 0x20, 0x01, 0x28,
+	0x09, 0x48, 0x49, 0x52, 0x0b, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x44, 0x69, 0x72,
+	0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x5f,
+	0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x61, 0x18, 0x50, 0x20, 0x01, 0x28, 0x09,
+	0x48, 0x4a, 0x52, 0x11, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x54, 0x72, 0x75, 0x73,
+	0x74, 0x65, 0x64, 0x43, 0x61, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, 0x73, 0x6b, 0x69, 0x70,
+	0x5f, 0x78, 0x66, 0x66, 0x5f, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x3d, 0x20, 0x01, 0x28,
+	0x08, 0x48, 0x4b, 0x52, 0x0d, 0x73, 0x6b, 0x69, 0x70, 0x58, 0x66, 0x66, 0x41, 0x70, 0x70, 0x65,
+	0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x14, 0x78, 0x66, 0x66, 0x5f, 0x6e, 0x75, 0x6d,
+	0x5f, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x68, 0x6f, 0x70, 0x73, 0x18, 0x46, 0x20,
+	0x01, 0x28, 0x0d, 0x48, 0x4c, 0x52, 0x11, 0x78, 0x66, 0x66, 0x4e, 0x75, 0x6d, 0x54, 0x72, 0x75,
+	0x73, 0x74, 0x65, 0x64, 0x48, 0x6f, 0x70, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1b, 0x65,
+	0x6e, 0x76, 0x6f, 0x79, 0x5f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73,
+	0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x09,
+	0x48, 0x4d, 0x52, 0x17, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x41, 0x63,
+	0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x12, 0x3c,
+	0x0a, 0x18, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x5f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x5f, 0x70, 0x72,
+	0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x09,
+	0x48, 0x4e, 0x52, 0x15, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x50, 0x72,
+	0x6f, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13,
+	0x65, 0x6e, 0x76, 0x6f, 0x79, 0x5f, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72,
+	0x65, 0x73, 0x73, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x4f, 0x52, 0x11, 0x65, 0x6e, 0x76,
+	0x6f, 0x79, 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01,
+	0x01, 0x12, 0x4b, 0x0a, 0x20, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x5f,
+	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64,
+	0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x50, 0x52, 0x1c, 0x65,
+	0x6e, 0x76, 0x6f, 0x79, 0x42, 0x69, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x6f,
+	0x75, 0x72, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x40,
+	0x0a, 0x1a, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6e,
+	0x66, 0x69, 0x67, 0x5f, 0x66, 0x72, 0x65, 0x65, 0x62, 0x69, 0x6e, 0x64, 0x18, 0x70, 0x20, 0x01,
+	0x28, 0x08, 0x48, 0x51, 0x52, 0x17, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x42, 0x69, 0x6e, 0x64, 0x43,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46, 0x72, 0x65, 0x65, 0x62, 0x69, 0x6e, 0x64, 0x88, 0x01, 0x01,
+	0x12, 0x53, 0x0a, 0x26, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x61, 0x74, 0x69, 0x63,
+	0x5f, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e,
+	0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x44, 0x20, 0x03, 0x28, 0x09,
+	0x52, 0x23, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x52, 0x65,
+	0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x57, 0x68, 0x69, 0x74,
+	0x65, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x80, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x5f,
+	0x74, 0x79, 0x70, 0x65, 0x18, 0x49, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x5c, 0x2e, 0x65, 0x6e, 0x76,
+	0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69,
+	0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74,
+	0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61,
+	0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e,
+	0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x43,
+	0x6f, 0x64, 0x65, 0x63, 0x54, 0x79, 0x70, 0x65, 0x48, 0x52, 0x52, 0x09, 0x63, 0x6f, 0x64, 0x65,
+	0x63, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x6d,
+	0x61, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x18, 0x55, 0x20, 0x01, 0x28, 0x09, 0x48,
+	0x53, 0x52, 0x0c, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x88,
+	0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f,
+	0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x18, 0x56, 0x20, 0x01, 0x28, 0x09, 0x48, 0x54, 0x52, 0x0e, 0x73,
+	0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x88, 0x01, 0x01,
+	0x12, 0x39, 0x0a, 0x16, 0x64, 0x61, 0x72, 0x6b, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x69,
+	0x6d, 0x61, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x18, 0x57, 0x20, 0x01, 0x28, 0x09,
+	0x48, 0x55, 0x52, 0x14, 0x64, 0x61, 0x72, 0x6b, 0x6d, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x69, 0x6d,
+	0x61, 0x72, 0x79, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x3d, 0x0a, 0x18, 0x64,
+	0x61, 0x72, 0x6b, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72,
+	0x79, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x18, 0x58, 0x20, 0x01, 0x28, 0x09, 0x48, 0x56, 0x52,
+	0x16, 0x64, 0x61, 0x72, 0x6b, 0x6d, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61,
+	0x72, 0x79, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6c, 0x6f,
+	0x67, 0x6f, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x59, 0x20, 0x01, 0x28, 0x09, 0x48, 0x57, 0x52, 0x07,
+	0x6c, 0x6f, 0x67, 0x6f, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x66, 0x61,
+	0x76, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x09, 0x48,
+	0x58, 0x52, 0x0a, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01,
+	0x12, 0x46, 0x0a, 0x1d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
+	0x65, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70,
+	0x68, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x59, 0x52, 0x1a, 0x65, 0x72, 0x72, 0x6f, 0x72,
+	0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x46, 0x69, 0x72, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61,
+	0x67, 0x72, 0x61, 0x70, 0x68, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x15, 0x70, 0x61, 0x73, 0x73,
+	0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72,
+	0x73, 0x18, 0x75, 0x20, 0x01, 0x28, 0x08, 0x48, 0x5a, 0x52, 0x13, 0x70, 0x61, 0x73, 0x73, 0x49,
+	0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x88, 0x01,
+	0x01, 0x12, 0x50, 0x0a, 0x0d, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x6c, 0x61,
+	0x67, 0x73, 0x18, 0x76, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x6f, 0x6d, 0x65, 0x72,
+	0x69, 0x75, 0x6d, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69,
+	0x6e, 0x67, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73,
+	0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x6c,
+	0x61, 0x67, 0x73, 0x12, 0x36, 0x0a, 0x14, 0x68, 0x74, 0x74, 0x70, 0x33, 0x5f, 0x61, 0x64, 0x76,
+	0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x88, 0x01, 0x20, 0x01,
+	0x28, 0x0d, 0x48, 0x5b, 0x52, 0x12, 0x68, 0x74, 0x74, 0x70, 0x33, 0x41, 0x64, 0x76, 0x65, 0x72,
+	0x74, 0x69, 0x73, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, 0x6d, 0x0a, 0x1a, 0x63,
+	0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x5f, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x74,
+	0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x18, 0x8c, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x29, 0x2e, 0x70, 0x6f, 0x6d, 0x65, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x63, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x2e, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x65,
+	0x72, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x48, 0x5c, 0x52, 0x18, 0x63,
+	0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x54, 0x68, 0x72,
+	0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x73, 0x73,
+	0x68, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x8d, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x48, 0x5d, 0x52, 0x0a, 0x73, 0x73, 0x68, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01,
+	0x01, 0x12, 0x57, 0x0a, 0x12, 0x73, 0x73, 0x68, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x6b, 0x65,
+	0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x8e, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24,
 	0x2e, 0x70, 0x6f, 0x6d, 0x65, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
-	0x2e, 0x53, 0x41, 0x4e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x53, 0x41, 0x4e, 0x54,
-	0x79, 0x70, 0x65, 0x52, 0x07, 0x73, 0x61, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07,
-	0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70,
-	0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x22, 0x69, 0x0a, 0x07, 0x53, 0x41, 0x4e, 0x54, 0x79, 0x70,
-	0x65, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x41, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e,
-	0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x45,
-	0x4d, 0x41, 0x49, 0x4c, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x4e, 0x53, 0x10, 0x02, 0x12,
-	0x07, 0x0a, 0x03, 0x55, 0x52, 0x49, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x50, 0x5f, 0x41,
-	0x44, 0x44, 0x52, 0x45, 0x53, 0x53, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x53, 0x45, 0x52,
-	0x5f, 0x50, 0x52, 0x49, 0x4e, 0x43, 0x49, 0x50, 0x41, 0x4c, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10,
-	0x05, 0x2a, 0x31, 0x0a, 0x0c, 0x49, 0x73, 0x73, 0x75, 0x65, 0x72, 0x46, 0x6f, 0x72, 0x6d, 0x61,
-	0x74, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x73, 0x73, 0x75, 0x65, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x4f,
-	0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x49, 0x73, 0x73, 0x75, 0x65, 0x72, 0x55,
-	0x52, 0x49, 0x10, 0x01, 0x2a, 0xab, 0x01, 0x0a, 0x11, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x54,
-	0x6f, 0x6b, 0x65, 0x6e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x1f, 0x0a, 0x1b, 0x42, 0x45,
-	0x41, 0x52, 0x45, 0x52, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41,
-	0x54, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x1f, 0x0a, 0x1b, 0x42,
-	0x45, 0x41, 0x52, 0x45, 0x52, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x46, 0x4f, 0x52, 0x4d,
-	0x41, 0x54, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x28, 0x0a, 0x24,
-	0x42, 0x45, 0x41, 0x52, 0x45, 0x52, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x46, 0x4f, 0x52,
-	0x4d, 0x41, 0x54, 0x5f, 0x49, 0x44, 0x50, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x54,
-	0x4f, 0x4b, 0x45, 0x4e, 0x10, 0x02, 0x12, 0x2a, 0x0a, 0x26, 0x42, 0x45, 0x41, 0x52, 0x45, 0x52,
-	0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x49, 0x44,
-	0x50, 0x5f, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e,
-	0x10, 0x03, 0x2a, 0x76, 0x0a, 0x0f, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x41, 0x75, 0x74, 0x68,
-	0x53, 0x74, 0x79, 0x6c, 0x65, 0x12, 0x21, 0x0a, 0x1d, 0x4f, 0x41, 0x55, 0x54, 0x48, 0x32, 0x5f,
-	0x41, 0x55, 0x54, 0x48, 0x5f, 0x53, 0x54, 0x59, 0x4c, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45,
-	0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1f, 0x0a, 0x1b, 0x4f, 0x41, 0x55, 0x54,
-	0x48, 0x32, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x53, 0x54, 0x59, 0x4c, 0x45, 0x5f, 0x49, 0x4e,
-	0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x53, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x4f, 0x41, 0x55,
-	0x54, 0x48, 0x32, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x53, 0x54, 0x59, 0x4c, 0x45, 0x5f, 0x49,
-	0x4e, 0x5f, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x10, 0x02, 0x2a, 0x63, 0x0a, 0x13, 0x4d, 0x74,
-	0x6c, 0x73, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x64,
-	0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a,
-	0x0a, 0x06, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x4f,
-	0x4c, 0x49, 0x43, 0x59, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c,
-	0x54, 0x5f, 0x44, 0x45, 0x4e, 0x59, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x4a, 0x45,
-	0x43, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x42,
-	0x2e, 0x5a, 0x2c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x6f,
-	0x6d, 0x65, 0x72, 0x69, 0x75, 0x6d, 0x2f, 0x70, 0x6f, 0x6d, 0x65, 0x72, 0x69, 0x75, 0x6d, 0x2f,
-	0x70, 0x6b, 0x67, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x62,
-	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67,
+	0x4c, 0x69, 0x73, 0x74, 0x48, 0x5e, 0x52, 0x0f, 0x73, 0x73, 0x68, 0x48, 0x6f, 0x73, 0x74, 0x4b,
+	0x65, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4e, 0x0a, 0x0d, 0x73, 0x73,
+	0x68, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x8f, 0x01, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x6f, 0x6d, 0x65, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x63, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x53, 0x74,
+	0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x5f, 0x52, 0x0b, 0x73, 0x73, 0x68, 0x48,
+	0x6f, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x14, 0x73, 0x73,
+	0x68, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x69,
+	0x6c, 0x65, 0x18, 0x90, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x60, 0x52, 0x10, 0x73, 0x73, 0x68,
+	0x55, 0x73, 0x65, 0x72, 0x43, 0x61, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01,
+	0x12, 0x2b, 0x0a, 0x0f, 0x73, 0x73, 0x68, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x5f,
+	0x6b, 0x65, 0x79, 0x18, 0x91, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x61, 0x52, 0x0c, 0x73, 0x73,
+	0x68, 0x55, 0x73, 0x65, 0x72, 0x43, 0x61, 0x4b, 0x65, 0x79, 0x88, 0x01, 0x01, 0x1a, 0x59, 0x0a,
+	0x0b, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x0a, 0x0a,
+	0x63, 0x65, 0x72, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c,
+	0x52, 0x09, 0x63, 0x65, 0x72, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6b,
+	0x65, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08,
+	0x6b, 0x65, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x05,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x24, 0x0a, 0x0a, 0x53, 0x74, 0x72, 0x69,
+	0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73,
+	0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x40,
+	0x0a, 0x12, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x45,
+	0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01,
+	0x1a, 0x45, 0x0a, 0x17, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48,
+	0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b,
+	0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a,
+	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61,
+	0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x43, 0x0a, 0x15, 0x4a, 0x77, 0x74, 0x43, 0x6c,
+	0x61, 0x69, 0x6d, 0x73, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79,
+	0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b,
+	0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x11,
+	0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72,
+	0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
+	0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x12, 0x0a,
+	0x10, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69,
+	0x64, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x42,
+	0x14, 0x0a, 0x12, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x66,
+	0x69, 0x65, 0x6c, 0x64, 0x73, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72,
+	0x69, 0x7a, 0x65, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x42, 0x12,
+	0x0a, 0x10, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76,
+	0x65, 0x6c, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5f, 0x73, 0x65,
+	0x63, 0x72, 0x65, 0x74, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
+	0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x12, 0x0a,
+	0x10, 0x5f, 0x69, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65,
+	0x72, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x64, 0x6e, 0x73, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70,
+	0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x64, 0x6e, 0x73, 0x5f,
+	0x75, 0x64, 0x70, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x42,
+	0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x6e, 0x73, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x74, 0x63, 0x70, 0x42,
+	0x12, 0x0a, 0x10, 0x5f, 0x64, 0x6e, 0x73, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x74, 0x72,
+	0x69, 0x65, 0x73, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x64, 0x6e, 0x73, 0x5f, 0x71, 0x75, 0x65, 0x72,
+	0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x68, 0x74,
+	0x74, 0x70, 0x5f, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72,
+	0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x72, 0x65, 0x61,
+	0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x77, 0x72,
+	0x69, 0x74, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f,
+	0x69, 0x64, 0x6c, 0x65, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74,
+	0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x72,
+	0x6c, 0x42, 0x24, 0x0a, 0x22, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61,
+	0x74, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x73, 0x69, 0x67, 0x6e,
+	0x6f, 0x75, 0x74, 0x5f, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x5f, 0x75, 0x72, 0x6c,
+	0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74,
+	0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x42,
+	0x0e, 0x0a, 0x0c, 0x5f, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42,
+	0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65,
+	0x74, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x5f, 0x64, 0x6f, 0x6d,
+	0x61, 0x69, 0x6e, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x5f, 0x68,
+	0x74, 0x74, 0x70, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6f, 0x6f,
+	0x6b, 0x69, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x63,
+	0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x5f, 0x73, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x69, 0x74, 0x65, 0x42,
+	0x10, 0x0a, 0x0e, 0x5f, 0x69, 0x64, 0x70, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69,
+	0x64, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x69, 0x64, 0x70, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74,
+	0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x69, 0x64, 0x70, 0x5f,
+	0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x69, 0x64, 0x70,
+	0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x25, 0x0a,
+	0x23, 0x5f, 0x69, 0x64, 0x70, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b,
+	0x65, 0x6e, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x61, 0x75, 0x64, 0x69, 0x65,
+	0x6e, 0x63, 0x65, 0x73, 0x42, 0x21, 0x0a, 0x1f, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69,
+	0x7a, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x76,
+	0x69, 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x1c, 0x0a, 0x1a, 0x5f, 0x6f, 0x76, 0x65, 0x72,
+	0x72, 0x69, 0x64, 0x65, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65,
+	0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66,
+	0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x42,
+	0x0d, 0x0a, 0x0b, 0x5f, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x5f, 0x74, 0x6c, 0x73, 0x42, 0x0e,
+	0x0a, 0x0c, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x42, 0x14,
+	0x0a, 0x12, 0x5f, 0x6a, 0x77, 0x74, 0x5f, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x5f, 0x66, 0x6f,
+	0x72, 0x6d, 0x61, 0x74, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x5f,
+	0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x42, 0x1b, 0x0a, 0x19,
+	0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61,
+	0x6d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x6d, 0x65,
+	0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x15, 0x0a,
+	0x13, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f,
+	0x61, 0x75, 0x74, 0x68, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73,
+	0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x42, 0x14, 0x0a, 0x12,
+	0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f,
+	0x63, 0x61, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x63,
+	0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x42, 0x1a, 0x0a, 0x18, 0x5f,
+	0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x73, 0x5f, 0x73, 0x61, 0x6d, 0x70,
+	0x6c, 0x65, 0x72, 0x5f, 0x61, 0x72, 0x67, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6f, 0x74, 0x65, 0x6c,
+	0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x42, 0x24, 0x0a, 0x22, 0x5f, 0x6f,
+	0x74, 0x65, 0x6c, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x76, 0x61,
+	0x6c, 0x75, 0x65, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74,
+	0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74,
+	0x65, 0x72, 0x5f, 0x6f, 0x74, 0x6c, 0x70, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74,
+	0x42, 0x25, 0x0a, 0x23, 0x5f, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74,
+	0x65, 0x72, 0x5f, 0x6f, 0x74, 0x6c, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x73, 0x5f, 0x65,
+	0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x6f, 0x74, 0x65, 0x6c,
+	0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x6f, 0x74, 0x6c, 0x70, 0x5f, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x42, 0x25, 0x0a, 0x23, 0x5f, 0x6f, 0x74, 0x65, 0x6c,
+	0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x6f, 0x74, 0x6c, 0x70, 0x5f, 0x74,
+	0x72, 0x61, 0x63, 0x65, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x42, 0x1d,
+	0x0a, 0x1b, 0x5f, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72,
+	0x5f, 0x6f, 0x74, 0x6c, 0x70, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x24, 0x0a,
+	0x22, 0x5f, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f,
+	0x6f, 0x74, 0x6c, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65,
+	0x6f, 0x75, 0x74, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x62, 0x73, 0x70,
+	0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x42,
+	0x21, 0x0a, 0x1f, 0x5f, 0x6f, 0x74, 0x65, 0x6c, 0x5f, 0x62, 0x73, 0x70, 0x5f, 0x6d, 0x61, 0x78,
+	0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69,
+	0x7a, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72,
+	0x65, 0x73, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x69, 0x6e, 0x73,
+	0x65, 0x63, 0x75, 0x72, 0x65, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x63,
+	0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x22, 0x0a,
+	0x20, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x74,
+	0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x72,
+	0x6c, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72,
+	0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x27, 0x0a,
+	0x25, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x6f,
+	0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
+	0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x73,
+	0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x6d, 0x74, 0x6c, 0x73, 0x42, 0x39, 0x0a, 0x37, 0x5f, 0x67,
+	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x73, 0x65, 0x72, 0x76,
+	0x65, 0x72, 0x6c, 0x65, 0x73, 0x73, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63,
+	0x63, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x70, 0x72,
+	0x6f, 0x78, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x42, 0x0b, 0x0a, 0x09,
+	0x5f, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x61, 0x75,
+	0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x61, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x61, 0x75,
+	0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x42, 0x17, 0x0a, 0x15,
+	0x5f, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x73, 0x74,
+	0x61, 0x67, 0x69, 0x6e, 0x67, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65,
+	0x72, 0x74, 0x5f, 0x65, 0x61, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x17, 0x0a,
+	0x15, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x65, 0x61, 0x62, 0x5f, 0x6d,
+	0x61, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x63,
+	0x65, 0x72, 0x74, 0x5f, 0x6d, 0x75, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x70, 0x6c, 0x65, 0x42,
+	0x0f, 0x0a, 0x0d, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x64, 0x69, 0x72,
+	0x42, 0x16, 0x0a, 0x14, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x74, 0x72,
+	0x75, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x61, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x73, 0x6b, 0x69,
+	0x70, 0x5f, 0x78, 0x66, 0x66, 0x5f, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x42, 0x17, 0x0a, 0x15,
+	0x5f, 0x78, 0x66, 0x66, 0x5f, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64,
+	0x5f, 0x68, 0x6f, 0x70, 0x73, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x5f,
+	0x61, 0x64, 0x6d, 0x69, 0x6e, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67,
+	0x5f, 0x70, 0x61, 0x74, 0x68, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x5f,
+	0x61, 0x64, 0x6d, 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61,
+	0x74, 0x68, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x5f, 0x61, 0x64, 0x6d,
+	0x69, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x23, 0x0a, 0x21, 0x5f, 0x65,
+	0x6e, 0x76, 0x6f, 0x79, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42,
+	0x1d, 0x0a, 0x1b, 0x5f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x63,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x66, 0x72, 0x65, 0x65, 0x62, 0x69, 0x6e, 0x64, 0x42, 0x0d,
+	0x0a, 0x0b, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x10, 0x0a,
+	0x0e, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x42,
+	0x12, 0x0a, 0x10, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x63, 0x6f,
+	0x6c, 0x6f, 0x72, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x64, 0x61, 0x72, 0x6b, 0x6d, 0x6f, 0x64, 0x65,
+	0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x42, 0x1b,
+	0x0a, 0x19, 0x5f, 0x64, 0x61, 0x72, 0x6b, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x65, 0x63, 0x6f,
+	0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x42, 0x0b, 0x0a, 0x09, 0x5f,
+	0x6c, 0x6f, 0x67, 0x6f, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x66, 0x61, 0x76,
+	0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x20, 0x0a, 0x1e, 0x5f, 0x65, 0x72, 0x72,
+	0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74,
+	0x5f, 0x70, 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x70,
+	0x61, 0x73, 0x73, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x68, 0x65, 0x61,
+	0x64, 0x65, 0x72, 0x73, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x33, 0x5f, 0x61,
+	0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x65, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x1d, 0x0a,
+	0x1b, 0x5f, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x5f, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x65,
+	0x72, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x42, 0x0e, 0x0a, 0x0c,
+	0x5f, 0x73, 0x73, 0x68, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x15, 0x0a, 0x13,
+	0x5f, 0x73, 0x73, 0x68, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x69,
+	0x6c, 0x65, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x73, 0x68, 0x5f, 0x68, 0x6f, 0x73, 0x74,
+	0x5f, 0x6b, 0x65, 0x79, 0x73, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x73, 0x73, 0x68, 0x5f, 0x75, 0x73,
+	0x65, 0x72, 0x5f, 0x63, 0x61, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x12,
+	0x0a, 0x10, 0x5f, 0x73, 0x73, 0x68, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x5f, 0x6b,
+	0x65, 0x79, 0x4a, 0x04, 0x08, 0x29, 0x10, 0x2e, 0x4a, 0x04, 0x08, 0x62, 0x10, 0x63, 0x4a, 0x04,
+	0x08, 0x64, 0x10, 0x65, 0x4a, 0x04, 0x08, 0x6a, 0x10, 0x6b, 0x22, 0xc8, 0x02, 0x0a, 0x16, 0x44,
+	0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x74, 0x6c, 0x73, 0x53, 0x65, 0x74,
+	0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x13, 0x0a, 0x02, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x48, 0x00, 0x52, 0x02, 0x63, 0x61, 0x88, 0x01, 0x01, 0x12, 0x15, 0x0a, 0x03, 0x63, 0x72,
+	0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x03, 0x63, 0x72, 0x6c, 0x88, 0x01,
+	0x01, 0x12, 0x4b, 0x0a, 0x0b, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x70, 0x6f, 0x6d, 0x65, 0x72, 0x69, 0x75,
+	0x6d, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4d, 0x74, 0x6c, 0x73, 0x45, 0x6e, 0x66,
+	0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x48, 0x02, 0x52, 0x0b,
+	0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x52,
+	0x0a, 0x17, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f,
+	0x61, 0x6c, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x1b, 0x2e, 0x70, 0x6f, 0x6d, 0x65, 0x72, 0x69, 0x75, 0x6d, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x2e, 0x53, 0x41, 0x4e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, 0x14, 0x6d, 0x61,
+	0x74, 0x63, 0x68, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x74, 0x4e, 0x61, 0x6d,
+	0x65, 0x73, 0x12, 0x2d, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79,
+	0x5f, 0x64, 0x65, 0x70, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x03, 0x52, 0x0e,
+	0x6d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x44, 0x65, 0x70, 0x74, 0x68, 0x88, 0x01,
+	0x01, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x63, 0x61, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x63, 0x72, 0x6c,
+	0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74,
+	0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f,
+	0x64, 0x65, 0x70, 0x74, 0x68, 0x22, 0xd1, 0x01, 0x0a, 0x0a, 0x53, 0x41, 0x4e, 0x4d, 0x61, 0x74,
+	0x63, 0x68, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x08, 0x73, 0x61, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x70, 0x6f, 0x6d, 0x65, 0x72, 0x69, 0x75,
+	0x6d, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x53, 0x41, 0x4e, 0x4d, 0x61, 0x74, 0x63,
+	0x68, 0x65, 0x72, 0x2e, 0x53, 0x41, 0x4e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x73, 0x61, 0x6e,
+	0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x22, 0x69,
+	0x0a, 0x07, 0x53, 0x41, 0x4e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x41, 0x4e,
+	0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45,
+	0x44, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x10, 0x01, 0x12, 0x07,
+	0x0a, 0x03, 0x44, 0x4e, 0x53, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x55, 0x52, 0x49, 0x10, 0x03,
+	0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x50, 0x5f, 0x41, 0x44, 0x44, 0x52, 0x45, 0x53, 0x53, 0x10, 0x04,
+	0x12, 0x17, 0x0a, 0x13, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x50, 0x52, 0x49, 0x4e, 0x43, 0x49, 0x50,
+	0x41, 0x4c, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x05, 0x2a, 0x31, 0x0a, 0x0c, 0x49, 0x73, 0x73,
+	0x75, 0x65, 0x72, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x73, 0x73,
+	0x75, 0x65, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x4f, 0x6e, 0x6c, 0x79, 0x10, 0x00, 0x12, 0x0d, 0x0a,
+	0x09, 0x49, 0x73, 0x73, 0x75, 0x65, 0x72, 0x55, 0x52, 0x49, 0x10, 0x01, 0x2a, 0xab, 0x01, 0x0a,
+	0x11, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x46, 0x6f, 0x72, 0x6d,
+	0x61, 0x74, 0x12, 0x1f, 0x0a, 0x1b, 0x42, 0x45, 0x41, 0x52, 0x45, 0x52, 0x5f, 0x54, 0x4f, 0x4b,
+	0x45, 0x4e, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57,
+	0x4e, 0x10, 0x00, 0x12, 0x1f, 0x0a, 0x1b, 0x42, 0x45, 0x41, 0x52, 0x45, 0x52, 0x5f, 0x54, 0x4f,
+	0x4b, 0x45, 0x4e, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55,
+	0x4c, 0x54, 0x10, 0x01, 0x12, 0x28, 0x0a, 0x24, 0x42, 0x45, 0x41, 0x52, 0x45, 0x52, 0x5f, 0x54,
+	0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x49, 0x44, 0x50, 0x5f,
+	0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0x02, 0x12, 0x2a,
+	0x0a, 0x26, 0x42, 0x45, 0x41, 0x52, 0x45, 0x52, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x46,
+	0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x49, 0x44, 0x50, 0x5f, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49,
+	0x54, 0x59, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0x03, 0x2a, 0x76, 0x0a, 0x0f, 0x4f, 0x41,
+	0x75, 0x74, 0x68, 0x32, 0x41, 0x75, 0x74, 0x68, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x12, 0x21, 0x0a,
+	0x1d, 0x4f, 0x41, 0x55, 0x54, 0x48, 0x32, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x53, 0x54, 0x59,
+	0x4c, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00,
+	0x12, 0x1f, 0x0a, 0x1b, 0x4f, 0x41, 0x55, 0x54, 0x48, 0x32, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x5f,
+	0x53, 0x54, 0x59, 0x4c, 0x45, 0x5f, 0x49, 0x4e, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x53, 0x10,
+	0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x4f, 0x41, 0x55, 0x54, 0x48, 0x32, 0x5f, 0x41, 0x55, 0x54, 0x48,
+	0x5f, 0x53, 0x54, 0x59, 0x4c, 0x45, 0x5f, 0x49, 0x4e, 0x5f, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52,
+	0x10, 0x02, 0x2a, 0x63, 0x0a, 0x13, 0x4d, 0x74, 0x6c, 0x73, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63,
+	0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b,
+	0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59,
+	0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x57, 0x49, 0x54,
+	0x48, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x44, 0x45, 0x4e, 0x59, 0x10, 0x02,
+	0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45,
+	0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x42, 0x2e, 0x5a, 0x2c, 0x67, 0x69, 0x74, 0x68, 0x75,
+	0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x6f, 0x6d, 0x65, 0x72, 0x69, 0x75, 0x6d, 0x2f, 0x70,
+	0x6f, 0x6d, 0x65, 0x72, 0x69, 0x75, 0x6d, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x67, 0x72, 0x70, 0x63,
+	0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -4096,39 +4147,40 @@ var file_config_proto_depIdxs = []int32{
 	25, // 23: pomerium.config.Policy.allowed_idp_claims:type_name -> pomerium.config.Policy.AllowedIdpClaimsEntry
 	27, // 24: pomerium.config.Settings.access_log_fields:type_name -> pomerium.config.Settings.StringList
 	27, // 25: pomerium.config.Settings.authorize_log_fields:type_name -> pomerium.config.Settings.StringList
-	26, // 26: pomerium.config.Settings.certificates:type_name -> pomerium.config.Settings.Certificate
-	32, // 27: pomerium.config.Settings.timeout_read:type_name -> google.protobuf.Duration
-	32, // 28: pomerium.config.Settings.timeout_write:type_name -> google.protobuf.Duration
-	32, // 29: pomerium.config.Settings.timeout_idle:type_name -> google.protobuf.Duration
-	32, // 30: pomerium.config.Settings.cookie_expire:type_name -> google.protobuf.Duration
-	27, // 31: pomerium.config.Settings.idp_access_token_allowed_audiences:type_name -> pomerium.config.Settings.StringList
-	28, // 32: pomerium.config.Settings.request_params:type_name -> pomerium.config.Settings.RequestParamsEntry
-	29, // 33: pomerium.config.Settings.set_response_headers:type_name -> pomerium.config.Settings.SetResponseHeadersEntry
-	30, // 34: pomerium.config.Settings.jwt_claims_headers:type_name -> pomerium.config.Settings.JwtClaimsHeadersEntry
-	0,  // 35: pomerium.config.Settings.jwt_issuer_format:type_name -> pomerium.config.IssuerFormat
-	1,  // 36: pomerium.config.Settings.bearer_token_format:type_name -> pomerium.config.BearerTokenFormat
-	32, // 37: pomerium.config.Settings.default_upstream_timeout:type_name -> google.protobuf.Duration
-	26, // 38: pomerium.config.Settings.metrics_certificate:type_name -> pomerium.config.Settings.Certificate
-	32, // 39: pomerium.config.Settings.otel_exporter_otlp_timeout:type_name -> google.protobuf.Duration
-	32, // 40: pomerium.config.Settings.otel_exporter_otlp_traces_timeout:type_name -> google.protobuf.Duration
-	32, // 41: pomerium.config.Settings.otel_bsp_schedule_delay:type_name -> google.protobuf.Duration
-	32, // 42: pomerium.config.Settings.grpc_client_timeout:type_name -> google.protobuf.Duration
-	19, // 43: pomerium.config.Settings.downstream_mtls:type_name -> pomerium.config.DownstreamMtlsSettings
-	34, // 44: pomerium.config.Settings.codec_type:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.CodecType
-	31, // 45: pomerium.config.Settings.runtime_flags:type_name -> pomerium.config.Settings.RuntimeFlagsEntry
-	9,  // 46: pomerium.config.Settings.circuit_breaker_thresholds:type_name -> pomerium.config.CircuitBreakerThresholds
-	27, // 47: pomerium.config.Settings.ssh_host_key_files:type_name -> pomerium.config.Settings.StringList
-	27, // 48: pomerium.config.Settings.ssh_host_keys:type_name -> pomerium.config.Settings.StringList
-	3,  // 49: pomerium.config.DownstreamMtlsSettings.enforcement:type_name -> pomerium.config.MtlsEnforcementMode
-	20, // 50: pomerium.config.DownstreamMtlsSettings.match_subject_alt_names:type_name -> pomerium.config.SANMatcher
-	4,  // 51: pomerium.config.SANMatcher.san_type:type_name -> pomerium.config.SANMatcher.SANType
-	35, // 52: pomerium.config.Route.AllowedIdpClaimsEntry.value:type_name -> google.protobuf.ListValue
-	35, // 53: pomerium.config.Policy.AllowedIdpClaimsEntry.value:type_name -> google.protobuf.ListValue
-	54, // [54:54] is the sub-list for method output_type
-	54, // [54:54] is the sub-list for method input_type
-	54, // [54:54] is the sub-list for extension type_name
-	54, // [54:54] is the sub-list for extension extendee
-	0,  // [0:54] is the sub-list for field type_name
+	32, // 26: pomerium.config.Settings.dns_query_timeout:type_name -> google.protobuf.Duration
+	26, // 27: pomerium.config.Settings.certificates:type_name -> pomerium.config.Settings.Certificate
+	32, // 28: pomerium.config.Settings.timeout_read:type_name -> google.protobuf.Duration
+	32, // 29: pomerium.config.Settings.timeout_write:type_name -> google.protobuf.Duration
+	32, // 30: pomerium.config.Settings.timeout_idle:type_name -> google.protobuf.Duration
+	32, // 31: pomerium.config.Settings.cookie_expire:type_name -> google.protobuf.Duration
+	27, // 32: pomerium.config.Settings.idp_access_token_allowed_audiences:type_name -> pomerium.config.Settings.StringList
+	28, // 33: pomerium.config.Settings.request_params:type_name -> pomerium.config.Settings.RequestParamsEntry
+	29, // 34: pomerium.config.Settings.set_response_headers:type_name -> pomerium.config.Settings.SetResponseHeadersEntry
+	30, // 35: pomerium.config.Settings.jwt_claims_headers:type_name -> pomerium.config.Settings.JwtClaimsHeadersEntry
+	0,  // 36: pomerium.config.Settings.jwt_issuer_format:type_name -> pomerium.config.IssuerFormat
+	1,  // 37: pomerium.config.Settings.bearer_token_format:type_name -> pomerium.config.BearerTokenFormat
+	32, // 38: pomerium.config.Settings.default_upstream_timeout:type_name -> google.protobuf.Duration
+	26, // 39: pomerium.config.Settings.metrics_certificate:type_name -> pomerium.config.Settings.Certificate
+	32, // 40: pomerium.config.Settings.otel_exporter_otlp_timeout:type_name -> google.protobuf.Duration
+	32, // 41: pomerium.config.Settings.otel_exporter_otlp_traces_timeout:type_name -> google.protobuf.Duration
+	32, // 42: pomerium.config.Settings.otel_bsp_schedule_delay:type_name -> google.protobuf.Duration
+	32, // 43: pomerium.config.Settings.grpc_client_timeout:type_name -> google.protobuf.Duration
+	19, // 44: pomerium.config.Settings.downstream_mtls:type_name -> pomerium.config.DownstreamMtlsSettings
+	34, // 45: pomerium.config.Settings.codec_type:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.CodecType
+	31, // 46: pomerium.config.Settings.runtime_flags:type_name -> pomerium.config.Settings.RuntimeFlagsEntry
+	9,  // 47: pomerium.config.Settings.circuit_breaker_thresholds:type_name -> pomerium.config.CircuitBreakerThresholds
+	27, // 48: pomerium.config.Settings.ssh_host_key_files:type_name -> pomerium.config.Settings.StringList
+	27, // 49: pomerium.config.Settings.ssh_host_keys:type_name -> pomerium.config.Settings.StringList
+	3,  // 50: pomerium.config.DownstreamMtlsSettings.enforcement:type_name -> pomerium.config.MtlsEnforcementMode
+	20, // 51: pomerium.config.DownstreamMtlsSettings.match_subject_alt_names:type_name -> pomerium.config.SANMatcher
+	4,  // 52: pomerium.config.SANMatcher.san_type:type_name -> pomerium.config.SANMatcher.SANType
+	35, // 53: pomerium.config.Route.AllowedIdpClaimsEntry.value:type_name -> google.protobuf.ListValue
+	35, // 54: pomerium.config.Policy.AllowedIdpClaimsEntry.value:type_name -> google.protobuf.ListValue
+	55, // [55:55] is the sub-list for method output_type
+	55, // [55:55] is the sub-list for method input_type
+	55, // [55:55] is the sub-list for extension type_name
+	55, // [55:55] is the sub-list for extension extendee
+	0,  // [0:55] is the sub-list for field type_name
 }
 
 func init() { file_config_proto_init() }
diff --git a/pkg/grpc/config/config.proto b/pkg/grpc/config/config.proto
index 59d8b9b7..49b7f718 100644
--- a/pkg/grpc/config/config.proto
+++ b/pkg/grpc/config/config.proto
@@ -17,7 +17,7 @@ message Config {
 
 message RouteRewriteHeader {
   string header = 1;
-  oneof matcher {
+  oneof  matcher {
     string prefix = 3;
   }
   string value = 2;
@@ -101,7 +101,7 @@ message Route {
 
   repeated string allowed_users = 4 [deprecated = true];
   // repeated string allowed_groups = 5 [ deprecated = true ];
-  repeated string                        allowed_domains    = 6  [deprecated = true];
+  repeated string                        allowed_domains    = 6 [deprecated = true];
   map<string, google.protobuf.ListValue> allowed_idp_claims = 32 [deprecated = true];
 
   string prefix = 7;
@@ -170,7 +170,7 @@ message Route {
   optional StringList idp_access_token_allowed_audiences = 69;
   bool                show_error_details                 = 59;
 
-  optional MCP mcp = 72;
+  optional MCP                      mcp                        = 72;
   optional CircuitBreakerThresholds circuit_breaker_thresholds = 73;
 }
 
@@ -235,7 +235,7 @@ message Policy {
   string remediation = 9;
 }
 
-// Next ID: 146.
+// Next ID: 150.
 message Settings {
   message Certificate {
     bytes  cert_bytes = 3;
@@ -246,18 +246,25 @@ message Settings {
     repeated string values = 1;
   }
 
-  optional string                   installation_id                   = 71;
-  optional string                   log_level                         = 3;
-  optional StringList               access_log_fields                 = 114;
-  optional StringList               authorize_log_fields              = 115;
-  optional string                   proxy_log_level                   = 4;
-  optional string                   shared_secret                     = 5;
-  optional string                   services                          = 6;
-  optional string                   address                           = 7;
-  optional bool                     insecure_server                   = 8;
-  optional string                   dns_lookup_family                 = 60;
-  repeated Certificate              certificates                      = 9;
-  optional string                   http_redirect_addr                = 10;
+  optional string     installation_id      = 71;
+  optional string     log_level            = 3;
+  optional StringList access_log_fields    = 114;
+  optional StringList authorize_log_fields = 115;
+  optional string     proxy_log_level      = 4;
+  optional string     shared_secret        = 5;
+  optional string     services             = 6;
+  optional string     address              = 7;
+  optional bool       insecure_server      = 8;
+
+  // dns options
+  optional string dns_lookup_family                   = 60;
+  optional uint32 dns_udp_max_queries                 = 146;
+  optional bool   dns_use_tcp                         = 147;
+  optional uint32 dns_query_tries                     = 148;
+  optional google.protobuf.Duration dns_query_timeout = 149;
+
+  repeated Certificate certificates                                   = 9;
+  optional string      http_redirect_addr                             = 10;
   optional google.protobuf.Duration timeout_read                      = 11;
   optional google.protobuf.Duration timeout_write                     = 12;
   optional google.protobuf.Duration timeout_idle                      = 13;
@@ -269,7 +276,7 @@ message Settings {
   optional string                   cookie_secret                     = 17;
   optional string                   cookie_domain                     = 18;
   // optional bool cookie_secure = 19;
-  optional bool                     cookie_http_only                   = 20;
+  optional bool cookie_http_only                                       = 20;
   optional google.protobuf.Duration cookie_expire                      = 21;
   optional string                   cookie_same_site                   = 113;
   optional string                   idp_client_id                      = 22;
@@ -290,10 +297,10 @@ message Settings {
   optional string     signing_key                    = 36;
   map<string, string> set_response_headers           = 69;
   // repeated string jwt_claims_headers = 37;
-  map<string, string>               jwt_claims_headers                 = 63;
-  optional IssuerFormat             jwt_issuer_format                  = 139;
-  repeated string                   jwt_groups_filter                  = 119;
-  optional BearerTokenFormat        bearer_token_format                = 138;
+  map<string, string>        jwt_claims_headers                        = 63;
+  optional IssuerFormat      jwt_issuer_format                         = 139;
+  repeated string            jwt_groups_filter                         = 119;
+  optional BearerTokenFormat bearer_token_format                       = 138;
   optional google.protobuf.Duration default_upstream_timeout           = 39;
   optional string                   metrics_address                    = 40;
   optional string                   metrics_basic_auth                 = 64;
@@ -314,17 +321,17 @@ message Settings {
   optional google.protobuf.Duration otel_exporter_otlp_traces_timeout  = 133;
   optional google.protobuf.Duration otel_bsp_schedule_delay            = 134;
   optional int32                    otel_bsp_max_export_batch_size     = 135;
-  reserved 41 to 45, 98; // legacy tracing fields
-  optional string                   grpc_address        = 46;
-  optional bool                     grpc_insecure       = 47;
+  reserved 41 to 45, 98;  // legacy tracing fields
+  optional string grpc_address                          = 46;
+  optional bool   grpc_insecure                         = 47;
   optional google.protobuf.Duration grpc_client_timeout = 99;
-  reserved 100; // grpc_client_dns_roundrobin
+  reserved 100;  // grpc_client_dns_roundrobin
   // optional string forward_auth_url = 50;
   repeated string databroker_service_urls              = 52;
   optional string databroker_internal_service_url      = 84;
   optional string databroker_storage_type              = 101;
   optional string databroker_storage_connection_string = 102;
-  reserved 106; // databroker_storage_tls_skip_verify
+  reserved 106;  // databroker_storage_tls_skip_verify
   optional DownstreamMtlsSettings downstream_mtls = 116;
   // optional string client_ca = 53;
   // optional string client_crl = 74;
diff --git a/pkg/grpc/databroker/fast_forward.go b/pkg/grpc/databroker/fast_forward.go
index a8225b44..62f4ddc4 100644
--- a/pkg/grpc/databroker/fast_forward.go
+++ b/pkg/grpc/databroker/fast_forward.go
@@ -99,9 +99,7 @@ func (ff *fastForwardHandler) ClearRecords(ctx context.Context) {
 }
 
 func (ff *fastForwardHandler) UpdateRecords(ctx context.Context, serverVersion uint64, records []*Record) {
-	ctx, op := ff.c.Start(ctx, "Enqueue/UpdateRecords",
-		attribute.Int("records-in", len(records)),
-	)
+	ctx, op := ff.c.Start(ctx, "Enqueue/UpdateRecords")
 	defer op.Complete()
 
 	ff.mu.Lock()
@@ -144,9 +142,6 @@ func (ff *fastForwardHandler) UpdateRecords(ctx context.Context, serverVersion u
 	case <-ctx.Done():
 		_ = op.Failure(errors.New("cancelled"))
 	case ff.pending <- cmd:
-		op.Complete(
-			attribute.Int("records-enqueued", len(records)),
-			attribute.Int("records-dropped", dropped),
-		)
+		op.Complete()
 	}
 }
diff --git a/pkg/policy/criteria/reasons.go b/pkg/policy/criteria/reasons.go
index 52de1d30..3fc5fc46 100644
--- a/pkg/policy/criteria/reasons.go
+++ b/pkg/policy/criteria/reasons.go
@@ -37,6 +37,8 @@ const (
 	ReasonPomeriumRoute                 = "pomerium-route"
 	ReasonReject                        = "reject"
 	ReasonRouteNotFound                 = "route-not-found"
+	ReasonSourceIPOK                    = "source-ip-ok"
+	ReasonSourceIPUnauthorized          = "source-ip-unauthorized"
 	ReasonSSHPublickeyOK                = "ssh-publickey-ok"
 	ReasonSSHPublickeyUnauthorized      = "ssh-publickey-unauthorized"
 	ReasonSSHUsernameOK                 = "ssh-username-ok"
diff --git a/pkg/policy/criteria/source_ip.go b/pkg/policy/criteria/source_ip.go
new file mode 100644
index 00000000..572e516b
--- /dev/null
+++ b/pkg/policy/criteria/source_ip.go
@@ -0,0 +1,102 @@
+package criteria
+
+import (
+	"fmt"
+	"net"
+
+	"github.com/open-policy-agent/opa/ast"
+
+	"github.com/pomerium/pomerium/pkg/policy/generator"
+	"github.com/pomerium/pomerium/pkg/policy/parser"
+)
+
+type sourceIPCriterion struct {
+	g *Generator
+}
+
+func (c sourceIPCriterion) DataType() CriterionDataType { return generator.CriterionDataTypeUnknown }
+
+func (c sourceIPCriterion) Name() string { return "source_ip" }
+
+func parseIP(v parser.Value) (*ast.Term, error) {
+	s, ok := v.(parser.String)
+	if !ok {
+		return nil, fmt.Errorf("expected string value, got: %T", v)
+	}
+	// Accept either a CIDR range or single IP.
+	value := string(s)
+	if _, _, err := net.ParseCIDR(value); err == nil {
+		// Already a CIDR range, return as is.
+		return ast.StringTerm(value), nil
+	}
+	ip := net.ParseIP(value)
+	if ip == nil {
+		// Error: not a CIDR range or IP address.
+		return nil, fmt.Errorf("expected IP or CIDR range, got: %q", value)
+	}
+	if ipv4 := ip.To4(); ipv4 != nil {
+		ipnet := net.IPNet{
+			IP:   ipv4,
+			Mask: net.CIDRMask(32, 32),
+		}
+		return ast.StringTerm(ipnet.String()), nil
+	}
+	ipnet := net.IPNet{
+		IP:   ip,
+		Mask: net.CIDRMask(128, 128),
+	}
+	return ast.StringTerm(ipnet.String()), nil
+}
+
+func parseIPs(data parser.Value) (*ast.Term, error) {
+	var arr parser.Array
+	switch v := data.(type) {
+	case parser.String:
+		arr = parser.Array{v}
+	case parser.Array:
+		arr = v
+	default:
+		return nil, fmt.Errorf("expected string or array of strings, got: %T", data)
+	}
+
+	cidrs := make([]*ast.Term, len(arr))
+	for i, v := range arr {
+		cidr, err := parseIP(v)
+		if err != nil {
+			return nil, err
+		}
+		cidrs[i] = cidr
+	}
+	return ast.NewTerm(ast.NewArray(cidrs...)), nil
+}
+
+func (c sourceIPCriterion) GenerateRule(_ string, data parser.Value) (*ast.Rule, []*ast.Rule, error) {
+	cidrs, err := parseIPs(data)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	body := ast.Body{
+		ast.GreaterThan.Expr(
+			ast.Count.Call(
+				ast.NetCIDRContainsMatches.Call(cidrs, ast.VarTerm("input.http.ip")),
+			),
+			ast.IntNumberTerm(0),
+		),
+	}
+
+	rule := NewCriterionRule(c.g, c.Name(),
+		ReasonSourceIPOK, ReasonSourceIPUnauthorized,
+		body)
+
+	return rule, nil, nil
+}
+
+// SourceIP returns a Criterion which matches source IP address.
+func SourceIP(generator *Generator) Criterion {
+	return sourceIPCriterion{g: generator}
+}
+
+func init() {
+	Register(SourceIP)
+}
diff --git a/pkg/ssh/auth.go b/pkg/ssh/auth.go
index 36c03569..2f0f13b6 100644
--- a/pkg/ssh/auth.go
+++ b/pkg/ssh/auth.go
@@ -32,7 +32,7 @@ import (
 )
 
 type Evaluator interface {
-	EvaluateSSH(context.Context, *Request) (*evaluator.Result, error)
+	EvaluateSSH(ctx context.Context, streamID uint64, req *Request) (*evaluator.Result, error)
 	GetDataBrokerServiceClient() databroker.DataBrokerServiceClient
 	InvalidateCacheForRecords(context.Context, ...*databroker.Record)
 }
@@ -57,7 +57,17 @@ func NewAuth(
 	currentConfig *atomicutil.Value[*config.Config],
 	tracerProvider oteltrace.TracerProvider,
 ) *Auth {
-	return &Auth{evaluator, currentConfig, tracerProvider}
+	auth := &Auth{
+		evaluator:      evaluator,
+		currentConfig:  currentConfig,
+		tracerProvider: tracerProvider,
+	}
+	return auth
+}
+
+// GetDataBrokerServiceClient implements AuthInterface.
+func (a *Auth) GetDataBrokerServiceClient() databroker.DataBrokerServiceClient {
+	return a.evaluator.GetDataBrokerServiceClient()
 }
 
 func (a *Auth) HandlePublicKeyMethodRequest(
@@ -108,7 +118,7 @@ func (a *Auth) handlePublicKeyMethodRequest(
 		}
 	}
 
-	res, err := a.evaluator.EvaluateSSH(ctx, sshreq)
+	res, err := a.evaluator.EvaluateSSH(ctx, info.StreamID, sshreq)
 	if err != nil {
 		return PublicKeyAuthMethodResponse{}, err
 	}
@@ -239,7 +249,7 @@ func (a *Auth) EvaluateDelayed(ctx context.Context, info StreamAuthInfo) error {
 	if err != nil {
 		return err
 	}
-	res, err := a.evaluator.EvaluateSSH(ctx, req)
+	res, err := a.evaluator.EvaluateSSH(ctx, info.StreamID, req)
 	if err != nil {
 		return err
 	}
diff --git a/pkg/ssh/channel.go b/pkg/ssh/channel.go
index 37effe77..56c6c787 100644
--- a/pkg/ssh/channel.go
+++ b/pkg/ssh/channel.go
@@ -39,21 +39,33 @@ type StreamHandlerInterface interface {
 }
 
 type ChannelHandler struct {
-	ctrl             ChannelControlInterface
-	config           *config.Config
-	cli              *CLI
-	ptyInfo          *extensions_ssh.SSHDownstreamPTYInfo
-	stdinR           io.Reader
-	stdinW           io.Writer
-	stdoutR          io.Reader
-	stdoutW          io.WriteCloser
-	cancel           context.CancelCauseFunc
-	stdoutStreamDone chan struct{}
-
+	ctrl                    ChannelControlInterface
+	config                  *config.Config
+	cli                     *CLI
+	ptyInfo                 *extensions_ssh.SSHDownstreamPTYInfo
+	stdinR                  io.Reader
+	stdinW                  io.Writer
+	stdoutR                 io.Reader
+	stdoutW                 io.WriteCloser
+	cancel                  context.CancelCauseFunc
+	stdoutStreamDone        chan struct{}
 	sendChannelCloseMsgOnce sync.Once
+	deleteSessionOnExit     bool
 }
 
-func (ch *ChannelHandler) Run(ctx context.Context) error {
+var ErrChannelClosed = status.Errorf(codes.Canceled, "channel closed")
+
+func (ch *ChannelHandler) Run(ctx context.Context) (retErr error) {
+	defer func() {
+		if ch.deleteSessionOnExit {
+			ctx, ca := context.WithTimeout(context.Background(), 10*time.Second)
+			defer ca()
+			err := ch.ctrl.DeleteSession(ctx)
+			if err != nil && errors.Is(retErr, ErrChannelClosed) {
+				retErr = err
+			}
+		}
+	}()
 	stdinR, stdinW := io.Pipe()
 	stdoutR, stdoutW := io.Pipe()
 	ch.stdinR, ch.stdinW, ch.stdoutR, ch.stdoutW = stdinR, stdinW, stdoutR, stdoutW
@@ -118,7 +130,7 @@ func (ch *ChannelHandler) Run(ctx context.Context) error {
 					ch.flushStdout()
 					ch.sendChannelCloseMsg()
 				})
-				ch.cancel(status.Errorf(codes.Canceled, "channel closed"))
+				ch.cancel(ErrChannelClosed)
 			case ChannelEOFMsg:
 				log.Ctx(ctx).Debug().Msg("ssh: received channel EOF")
 			default:
@@ -196,6 +208,9 @@ func (ch *ChannelHandler) handleChannelRequestMsg(ctx context.Context, msg Chann
 			err := ch.cli.ExecuteContext(ctx)
 			if errors.Is(err, ErrHandoff) {
 				return // don't disconnect
+			} else if errors.Is(err, ErrDeleteSessionOnExit) {
+				ch.deleteSessionOnExit = true
+				err = nil
 			}
 			ch.initiateChannelClose(err)
 		}()
diff --git a/pkg/ssh/cli.go b/pkg/ssh/cli.go
index edd24afd..0fc545c0 100644
--- a/pkg/ssh/cli.go
+++ b/pkg/ssh/cli.go
@@ -67,17 +67,14 @@ func NewCLI(
 	return cli
 }
 
-func (cli *CLI) AddLogoutCommand(ctrl ChannelControlInterface) {
+func (cli *CLI) AddLogoutCommand(_ ChannelControlInterface) {
 	cli.AddCommand(&cobra.Command{
-		Use:   "logout",
-		Short: "Log out",
+		Use:           "logout",
+		Short:         "Log out",
+		SilenceErrors: true,
 		RunE: func(cmd *cobra.Command, _ []string) error {
-			err := ctrl.DeleteSession(cmd.Context())
-			if err != nil {
-				return fmt.Errorf("failed to delete session: %w\r", err)
-			}
 			_, _ = cmd.OutOrStdout().Write([]byte("Logged out successfully\r\n"))
-			return nil
+			return ErrDeleteSessionOnExit
 		},
 	})
 }
@@ -101,6 +98,10 @@ func (cli *CLI) AddWhoamiCommand(ctrl ChannelControlInterface) {
 // and we should not automatically disconnect
 var ErrHandoff = errors.New("handoff")
 
+// ErrDeleteSessionOnExit is a sentinel error to indicate that the authorized
+// session should be deleted once the SSH connection ends.
+var ErrDeleteSessionOnExit = errors.New("delete_session_on_exit")
+
 func (cli *CLI) AddPortalCommand(ctrl ChannelControlInterface) {
 	cli.AddCommand(&cobra.Command{
 		Use:   "portal",
diff --git a/pkg/ssh/manager.go b/pkg/ssh/manager.go
index 72c8767d..912f5e74 100644
--- a/pkg/ssh/manager.go
+++ b/pkg/ssh/manager.go
@@ -2,32 +2,130 @@ package ssh
 
 import (
 	"context"
+	"errors"
 	"sync"
+	"time"
+
+	"google.golang.org/grpc/codes"
+	"google.golang.org/grpc/status"
 
 	extensions_ssh "github.com/pomerium/envoy-custom/api/extensions/filters/network/ssh"
 	"github.com/pomerium/pomerium/config"
+	"github.com/pomerium/pomerium/internal/log"
+	"github.com/pomerium/pomerium/pkg/grpc/databroker"
 )
 
 type StreamManager struct {
-	auth    AuthInterface
-	reauthC chan struct{}
+	auth               AuthInterface
+	reauthC            chan struct{}
+	initialSyncDone    bool
+	waitForInitialSync chan struct{}
 
 	mu            sync.Mutex
 	cfg           *config.Config
 	activeStreams map[uint64]*StreamHandler
+	// Tracks session IDs for active streams
+	activeStreamSessions map[uint64]string
+	// Tracks stream IDs for active sessions
+	sessionStreams map[string]map[uint64]struct{}
+}
+
+// ClearRecords implements databroker.SyncerHandler.
+func (sm *StreamManager) ClearRecords(ctx context.Context) {
+	sm.mu.Lock()
+	defer sm.mu.Unlock()
+	if !sm.initialSyncDone {
+		sm.initialSyncDone = true
+		close(sm.waitForInitialSync)
+		log.Ctx(ctx).Debug().
+			Msg("ssh stream manager: initial sync done")
+		return
+	}
+	for sessionID, streamIDs := range sm.sessionStreams {
+		for streamID := range streamIDs {
+			log.Ctx(ctx).Debug().
+				Str("session-id", sessionID).
+				Uint64("stream-id", streamID).
+				Msg("terminating stream: databroker sync reset")
+			sm.terminateStreamLocked(streamID)
+		}
+	}
+	clear(sm.sessionStreams)
 }
 
-func NewStreamManager(ctx context.Context, auth AuthInterface, cfg *config.Config) *StreamManager {
+// GetDataBrokerServiceClient implements databroker.SyncerHandler.
+func (sm *StreamManager) GetDataBrokerServiceClient() databroker.DataBrokerServiceClient {
+	return sm.auth.GetDataBrokerServiceClient()
+}
+
+// UpdateRecords implements databroker.SyncerHandler.
+func (sm *StreamManager) UpdateRecords(ctx context.Context, _ uint64, records []*databroker.Record) {
+	sm.mu.Lock()
+	defer sm.mu.Unlock()
+	for _, record := range records {
+		if record.DeletedAt == nil {
+			continue
+		}
+		// a session was deleted; terminate all of its associated streams
+		for streamID := range sm.sessionStreams[record.Id] {
+			log.Ctx(ctx).Debug().
+				Str("session-id", record.Id).
+				Uint64("stream-id", streamID).
+				Msg("terminating stream: session revoked")
+			sm.terminateStreamLocked(streamID)
+		}
+		delete(sm.sessionStreams, record.Id)
+	}
+}
+
+func (sm *StreamManager) SetSessionIDForStream(streamID uint64, sessionID string) error {
+	sm.mu.Lock()
+	for !sm.initialSyncDone {
+		sm.mu.Unlock()
+		select {
+		case <-sm.waitForInitialSync:
+		case <-time.After(10 * time.Second):
+			return errors.New("timed out waiting for initial sync")
+		}
+		sm.mu.Lock()
+	}
+	defer sm.mu.Unlock()
+	if sm.sessionStreams[sessionID] == nil {
+		sm.sessionStreams[sessionID] = map[uint64]struct{}{}
+	}
+	sm.sessionStreams[sessionID][streamID] = struct{}{}
+	sm.activeStreamSessions[streamID] = sessionID
+	return nil
+}
+
+func NewStreamManager(auth AuthInterface, cfg *config.Config) *StreamManager {
 	sm := &StreamManager{
-		auth:          auth,
-		reauthC:       make(chan struct{}, 1),
-		cfg:           cfg,
-		activeStreams: map[uint64]*StreamHandler{},
+		auth:                 auth,
+		waitForInitialSync:   make(chan struct{}),
+		reauthC:              make(chan struct{}, 1),
+		cfg:                  cfg,
+		activeStreams:        map[uint64]*StreamHandler{},
+		activeStreamSessions: map[uint64]string{},
+		sessionStreams:       map[string]map[uint64]struct{}{},
 	}
-	go sm.reauthLoop(ctx)
 	return sm
 }
 
+func (sm *StreamManager) Run(ctx context.Context) error {
+	syncer := databroker.NewSyncer(ctx, "ssh-auth-session-sync", sm,
+		databroker.WithTypeURL("type.googleapis.com/session.Session"))
+	reauthDone := make(chan struct{})
+	ctx, ca := context.WithCancel(ctx)
+	go func() {
+		defer close(reauthDone)
+		sm.reauthLoop(ctx)
+	}()
+	err := syncer.Run(ctx)
+	ca()
+	<-reauthDone
+	return err
+}
+
 func (sm *StreamManager) OnConfigChange(cfg *config.Config) {
 	sm.mu.Lock()
 	sm.cfg = cfg
@@ -59,10 +157,18 @@ func (sm *StreamManager) NewStreamHandler(
 		readC:      make(chan *extensions_ssh.ClientMessage, 32),
 		writeC:     writeC,
 		reauthC:    make(chan struct{}),
+		terminateC: make(chan error, 1),
 		close: func() {
 			sm.mu.Lock()
 			defer sm.mu.Unlock()
 			delete(sm.activeStreams, streamID)
+			if sessionID, ok := sm.activeStreamSessions[streamID]; ok {
+				delete(sm.sessionStreams[sessionID], streamID)
+				if len(sm.sessionStreams[sessionID]) == 0 {
+					delete(sm.sessionStreams, sessionID)
+				}
+			}
+			delete(sm.activeStreamSessions, streamID)
 			close(writeC)
 		},
 	}
@@ -89,3 +195,9 @@ func (sm *StreamManager) reauthLoop(ctx context.Context) {
 		}
 	}
 }
+
+func (sm *StreamManager) terminateStreamLocked(streamID uint64) {
+	if sh, ok := sm.activeStreams[streamID]; ok {
+		sh.Terminate(status.Errorf(codes.PermissionDenied, "no longer authorized"))
+	}
+}
diff --git a/pkg/ssh/mock/mock_auth_interface.go b/pkg/ssh/mock/mock_auth_interface.go
index 694a6dcd..b31e7452 100644
--- a/pkg/ssh/mock/mock_auth_interface.go
+++ b/pkg/ssh/mock/mock_auth_interface.go
@@ -14,6 +14,7 @@ import (
 	reflect "reflect"
 
 	ssh "github.com/pomerium/envoy-custom/api/extensions/filters/network/ssh"
+	databroker "github.com/pomerium/pomerium/pkg/grpc/databroker"
 	ssh0 "github.com/pomerium/pomerium/pkg/ssh"
 	gomock "go.uber.org/mock/gomock"
 )
@@ -157,6 +158,44 @@ func (c *MockAuthInterfaceFormatSessionCall) DoAndReturn(f func(context.Context,
 	return c
 }
 
+// GetDataBrokerServiceClient mocks base method.
+func (m *MockAuthInterface) GetDataBrokerServiceClient() databroker.DataBrokerServiceClient {
+	m.ctrl.T.Helper()
+	ret := m.ctrl.Call(m, "GetDataBrokerServiceClient")
+	ret0, _ := ret[0].(databroker.DataBrokerServiceClient)
+	return ret0
+}
+
+// GetDataBrokerServiceClient indicates an expected call of GetDataBrokerServiceClient.
+func (mr *MockAuthInterfaceMockRecorder) GetDataBrokerServiceClient() *MockAuthInterfaceGetDataBrokerServiceClientCall {
+	mr.mock.ctrl.T.Helper()
+	call := mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDataBrokerServiceClient", reflect.TypeOf((*MockAuthInterface)(nil).GetDataBrokerServiceClient))
+	return &MockAuthInterfaceGetDataBrokerServiceClientCall{Call: call}
+}
+
+// MockAuthInterfaceGetDataBrokerServiceClientCall wrap *gomock.Call
+type MockAuthInterfaceGetDataBrokerServiceClientCall struct {
+	*gomock.Call
+}
+
+// Return rewrite *gomock.Call.Return
+func (c *MockAuthInterfaceGetDataBrokerServiceClientCall) Return(arg0 databroker.DataBrokerServiceClient) *MockAuthInterfaceGetDataBrokerServiceClientCall {
+	c.Call = c.Call.Return(arg0)
+	return c
+}
+
+// Do rewrite *gomock.Call.Do
+func (c *MockAuthInterfaceGetDataBrokerServiceClientCall) Do(f func() databroker.DataBrokerServiceClient) *MockAuthInterfaceGetDataBrokerServiceClientCall {
+	c.Call = c.Call.Do(f)
+	return c
+}
+
+// DoAndReturn rewrite *gomock.Call.DoAndReturn
+func (c *MockAuthInterfaceGetDataBrokerServiceClientCall) DoAndReturn(f func() databroker.DataBrokerServiceClient) *MockAuthInterfaceGetDataBrokerServiceClientCall {
+	c.Call = c.Call.DoAndReturn(f)
+	return c
+}
+
 // HandleKeyboardInteractiveMethodRequest mocks base method.
 func (m *MockAuthInterface) HandleKeyboardInteractiveMethodRequest(ctx context.Context, info ssh0.StreamAuthInfo, req *ssh.KeyboardInteractiveMethodRequest, querier ssh0.KeyboardInteractiveQuerier) (ssh0.KeyboardInteractiveAuthMethodResponse, error) {
 	m.ctrl.T.Helper()
diff --git a/pkg/ssh/stream.go b/pkg/ssh/stream.go
index 207b7b89..cca85196 100644
--- a/pkg/ssh/stream.go
+++ b/pkg/ssh/stream.go
@@ -14,6 +14,7 @@ import (
 	extensions_ssh "github.com/pomerium/envoy-custom/api/extensions/filters/network/ssh"
 	"github.com/pomerium/pomerium/config"
 	"github.com/pomerium/pomerium/internal/log"
+	"github.com/pomerium/pomerium/pkg/grpc/databroker"
 	"github.com/pomerium/pomerium/pkg/protoutil"
 	"github.com/pomerium/pomerium/pkg/slices"
 )
@@ -51,6 +52,7 @@ type AuthInterface interface {
 	EvaluateDelayed(ctx context.Context, info StreamAuthInfo) error
 	FormatSession(ctx context.Context, info StreamAuthInfo) ([]byte, error)
 	DeleteSession(ctx context.Context, info StreamAuthInfo) error
+	GetDataBrokerServiceClient() databroker.DataBrokerServiceClient
 }
 
 type AuthMethodValue[T any] struct {
@@ -101,6 +103,7 @@ type StreamHandler struct {
 	writeC     chan *extensions_ssh.ServerMessage
 	readC      chan *extensions_ssh.ClientMessage
 	reauthC    chan struct{}
+	terminateC chan error
 
 	state *StreamState
 	close func()
@@ -111,6 +114,10 @@ type StreamHandler struct {
 
 var _ StreamHandlerInterface = (*StreamHandler)(nil)
 
+func (sh *StreamHandler) Terminate(err error) {
+	sh.terminateC <- err
+}
+
 func (sh *StreamHandler) Close() {
 	sh.close()
 }
@@ -148,6 +155,8 @@ func (sh *StreamHandler) Prompt(ctx context.Context, prompts *extensions_ssh.Key
 	select {
 	case <-ctx.Done():
 		return nil, context.Cause(ctx)
+	case err := <-sh.terminateC:
+		return nil, err
 	case req := <-sh.readC:
 		switch msg := req.Message.(type) {
 		case *extensions_ssh.ClientMessage_InfoResponse:
@@ -187,6 +196,8 @@ func (sh *StreamHandler) Run(ctx context.Context) error {
 			if err := sh.reauth(ctx); err != nil {
 				return err
 			}
+		case err := <-sh.terminateC:
+			return err
 		case req := <-sh.readC:
 			switch req := req.Message.(type) {
 			case *extensions_ssh.ClientMessage_Event:



Test patch:
diff --git a/config/envoyconfig/clusters_test.go b/config/envoyconfig/clusters_test.go
index 5f535ed5..9ebb0071 100644
--- a/config/envoyconfig/clusters_test.go
+++ b/config/envoyconfig/clusters_test.go
@@ -9,7 +9,6 @@ import (
 	"time"
 
 	envoy_config_cluster_v3 "github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3"
-	envoy_extensions_clusters_common_dns_v3 "github.com/envoyproxy/go-control-plane/envoy/extensions/clusters/common/dns/v3"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 	"github.com/volatiletech/null/v9"
@@ -528,8 +527,9 @@ func Test_buildCluster(t *testing.T) {
 		})
 		require.NoError(t, err)
 		cluster := newDefaultEnvoyClusterConfig()
-		dnsLookupFamily := envoy_extensions_clusters_common_dns_v3.DnsLookupFamily_V4_ONLY
-		err = b.buildCluster(cluster, "example", endpoints, upstreamProtocolHTTP2, dnsLookupFamily, Keepalive(false))
+		err = b.buildCluster(cluster, "example", endpoints, upstreamProtocolHTTP2, config.DNSOptions{
+			LookupFamily: config.DNSLookupFamilyV4Only,
+		}, Keepalive(false))
 		require.NoErrorf(t, err, "cluster %+v", cluster)
 		testutil.AssertProtoJSONEqual(t, `
 			{
@@ -539,7 +539,14 @@ func Test_buildCluster(t *testing.T) {
 					"typedConfig": {
 						"@type": "type.googleapis.com/envoy.extensions.clusters.dns.v3.DnsCluster",
 						"dnsLookupFamily": "V4_ONLY",
-						"respectDnsTtl": true
+						"respectDnsTtl": true,
+						"typedDnsResolverConfig": {
+							"name": "envoy.network.dns_resolver.cares",
+							"typedConfig": {
+								"@type": "type.googleapis.com/envoy.extensions.network.dns_resolver.cares.v3.CaresDnsResolverConfig",
+								"udpMaxQueries": 100
+							}
+						}
 					}
 				},
 				"connectTimeout": "10s",
@@ -595,8 +602,9 @@ func Test_buildCluster(t *testing.T) {
 		})
 		require.NoError(t, err)
 		cluster := newDefaultEnvoyClusterConfig()
-		dnsLookupFamily := envoy_extensions_clusters_common_dns_v3.DnsLookupFamily_V4_PREFERRED
-		err = b.buildCluster(cluster, "example", endpoints, upstreamProtocolHTTP2, dnsLookupFamily, Keepalive(true))
+		err = b.buildCluster(cluster, "example", endpoints, upstreamProtocolHTTP2, config.DNSOptions{
+			LookupFamily: config.DNSLookupFamilyV4Preferred,
+		}, Keepalive(true))
 		require.NoErrorf(t, err, "cluster %+v", cluster)
 		testutil.AssertProtoJSONEqual(t, `
 			{
@@ -606,7 +614,14 @@ func Test_buildCluster(t *testing.T) {
 					"typedConfig": {
 						"@type": "type.googleapis.com/envoy.extensions.clusters.dns.v3.DnsCluster",
 						"dnsLookupFamily": "V4_PREFERRED",
-						"respectDnsTtl": true
+						"respectDnsTtl": true,
+						"typedDnsResolverConfig": {
+							"name": "envoy.network.dns_resolver.cares",
+							"typedConfig": {
+								"@type": "type.googleapis.com/envoy.extensions.network.dns_resolver.cares.v3.CaresDnsResolverConfig",
+								"udpMaxQueries": 100
+							}
+						}
 					}
 				},
 				"connectTimeout": "10s",
@@ -781,7 +796,7 @@ func Test_buildCluster(t *testing.T) {
 		})
 		require.NoError(t, err)
 		cluster := newDefaultEnvoyClusterConfig()
-		err = b.buildCluster(cluster, "example", endpoints, upstreamProtocolHTTP2, 0, Keepalive(false))
+		err = b.buildCluster(cluster, "example", endpoints, upstreamProtocolHTTP2, config.DNSOptions{}, Keepalive(false))
 		require.NoErrorf(t, err, "cluster %+v", cluster)
 		testutil.AssertProtoJSONEqual(t, `
 			{
@@ -839,7 +854,7 @@ func Test_buildCluster(t *testing.T) {
 		})
 		require.NoError(t, err)
 		cluster := newDefaultEnvoyClusterConfig()
-		err = b.buildCluster(cluster, "example", endpoints, upstreamProtocolHTTP2, 0, Keepalive(false))
+		err = b.buildCluster(cluster, "example", endpoints, upstreamProtocolHTTP2, config.DNSOptions{}, Keepalive(false))
 		require.NoErrorf(t, err, "cluster %+v", cluster)
 		testutil.AssertProtoJSONEqual(t, `
 			{
@@ -899,7 +914,7 @@ func Test_buildCluster(t *testing.T) {
 		})
 		require.NoError(t, err)
 		cluster := newDefaultEnvoyClusterConfig()
-		err = b.buildCluster(cluster, "example", endpoints, upstreamProtocolHTTP2, 0, Keepalive(false))
+		err = b.buildCluster(cluster, "example", endpoints, upstreamProtocolHTTP2, config.DNSOptions{}, Keepalive(false))
 		require.NoErrorf(t, err, "cluster %+v", cluster)
 		testutil.AssertProtoJSONEqual(t, `
 			{
@@ -951,8 +966,9 @@ func Test_buildCluster(t *testing.T) {
 			EnforcingConsecutive_5Xx:       wrapperspb.UInt32(17),
 			SplitExternalLocalOriginErrors: true,
 		}
-		dnsLookupFamily := envoy_extensions_clusters_common_dns_v3.DnsLookupFamily_V4_ONLY
-		err = b.buildCluster(cluster, "example", endpoints, upstreamProtocolHTTP2, dnsLookupFamily, Keepalive(false))
+		err = b.buildCluster(cluster, "example", endpoints, upstreamProtocolHTTP2, config.DNSOptions{
+			LookupFamily: config.DNSLookupFamilyV4Only,
+		}, Keepalive(false))
 		require.NoErrorf(t, err, "cluster %+v", cluster)
 		testutil.AssertProtoJSONEqual(t, `
 			{
@@ -962,7 +978,14 @@ func Test_buildCluster(t *testing.T) {
 					"typedConfig": {
 						"@type": "type.googleapis.com/envoy.extensions.clusters.dns.v3.DnsCluster",
 						"dnsLookupFamily": "V4_ONLY",
-						"respectDnsTtl": true
+						"respectDnsTtl": true,
+						"typedDnsResolverConfig": {
+							"name": "envoy.network.dns_resolver.cares",
+							"typedConfig": {
+								"@type": "type.googleapis.com/envoy.extensions.network.dns_resolver.cares.v3.CaresDnsResolverConfig",
+								"udpMaxQueries": 100
+							}
+						}
 					}
 				},
 				"connectTimeout": "10s",
diff --git a/config/envoyconfig/testdata/clusters.json b/config/envoyconfig/testdata/clusters.json
index dda50302..a5d38bd7 100644
--- a/config/envoyconfig/testdata/clusters.json
+++ b/config/envoyconfig/testdata/clusters.json
@@ -38,7 +38,14 @@
       "typedConfig": {
         "@type": "type.googleapis.com/envoy.extensions.clusters.dns.v3.DnsCluster",
         "dnsLookupFamily": "V4_PREFERRED",
-        "respectDnsTtl": true
+        "respectDnsTtl": true,
+        "typedDnsResolverConfig": {
+          "name": "envoy.network.dns_resolver.cares",
+          "typedConfig": {
+            "@type": "type.googleapis.com/envoy.extensions.network.dns_resolver.cares.v3.CaresDnsResolverConfig",
+            "udpMaxQueries": 100
+          }
+        }
       }
     },
     "loadAssignment": {
@@ -91,7 +98,14 @@
       "typedConfig": {
         "@type": "type.googleapis.com/envoy.extensions.clusters.dns.v3.DnsCluster",
         "dnsLookupFamily": "V4_PREFERRED",
-        "respectDnsTtl": true
+        "respectDnsTtl": true,
+        "typedDnsResolverConfig": {
+          "name": "envoy.network.dns_resolver.cares",
+          "typedConfig": {
+            "@type": "type.googleapis.com/envoy.extensions.network.dns_resolver.cares.v3.CaresDnsResolverConfig",
+            "udpMaxQueries": 100
+          }
+        }
       }
     },
     "circuitBreakers": {
@@ -158,7 +172,14 @@
       "typedConfig": {
         "@type": "type.googleapis.com/envoy.extensions.clusters.dns.v3.DnsCluster",
         "dnsLookupFamily": "V4_PREFERRED",
-        "respectDnsTtl": true
+        "respectDnsTtl": true,
+        "typedDnsResolverConfig": {
+          "name": "envoy.network.dns_resolver.cares",
+          "typedConfig": {
+            "@type": "type.googleapis.com/envoy.extensions.network.dns_resolver.cares.v3.CaresDnsResolverConfig",
+            "udpMaxQueries": 100
+          }
+        }
       }
     },
     "circuitBreakers": {
@@ -225,7 +246,14 @@
       "typedConfig": {
         "@type": "type.googleapis.com/envoy.extensions.clusters.dns.v3.DnsCluster",
         "dnsLookupFamily": "V4_PREFERRED",
-        "respectDnsTtl": true
+        "respectDnsTtl": true,
+        "typedDnsResolverConfig": {
+          "name": "envoy.network.dns_resolver.cares",
+          "typedConfig": {
+            "@type": "type.googleapis.com/envoy.extensions.network.dns_resolver.cares.v3.CaresDnsResolverConfig",
+            "udpMaxQueries": 100
+          }
+        }
       }
     },
     "circuitBreakers": {
@@ -288,7 +316,14 @@
       "typedConfig": {
         "@type": "type.googleapis.com/envoy.extensions.clusters.dns.v3.DnsCluster",
         "dnsLookupFamily": "V4_PREFERRED",
-        "respectDnsTtl": true
+        "respectDnsTtl": true,
+        "typedDnsResolverConfig": {
+          "name": "envoy.network.dns_resolver.cares",
+          "typedConfig": {
+            "@type": "type.googleapis.com/envoy.extensions.network.dns_resolver.cares.v3.CaresDnsResolverConfig",
+            "udpMaxQueries": 100
+          }
+        }
       }
     },
     "circuitBreakers": {
diff --git a/internal/testenv/environment.go b/internal/testenv/environment.go
index 4e0cbb5e..1a7e450d 100644
--- a/internal/testenv/environment.go
+++ b/internal/testenv/environment.go
@@ -52,6 +52,7 @@ import (
 	"github.com/pomerium/pomerium/internal/version"
 	"github.com/pomerium/pomerium/pkg/cmd/pomerium"
 	"github.com/pomerium/pomerium/pkg/envoy"
+	"github.com/pomerium/pomerium/pkg/grpc"
 	"github.com/pomerium/pomerium/pkg/grpc/databroker"
 	"github.com/pomerium/pomerium/pkg/health"
 	"github.com/pomerium/pomerium/pkg/identity/manager"
@@ -105,6 +106,8 @@ type Environment interface {
 	SharedSecret() []byte
 	CookieSecret() []byte
 
+	NewDataBrokerServiceClient() databroker.DataBrokerServiceClient
+
 	Config() *config.Config
 
 	// Add adds the given [Modifier] to the environment. All modifiers will be
@@ -840,6 +843,15 @@ func (e *environment) CookieSecret() []byte {
 	return bytes.Clone(e.cookieSecret[:])
 }
 
+func (e *environment) NewDataBrokerServiceClient() databroker.DataBrokerServiceClient {
+	cc, err := grpc.NewGRPCClientConn(e.ctx, &grpc.Options{
+		Address:      fmt.Sprintf("%s:%d", e.host, e.ports.Outbound.Value()),
+		SignedJWTKey: e.sharedSecret[:],
+	})
+	e.require.NoError(err)
+	return databroker.NewDataBrokerServiceClient(cc)
+}
+
 func (e *environment) Stop() {
 	if b, ok := e.t.(*testing.B); ok {
 		// when calling Stop() manually, ensure we aren't timing this
diff --git a/internal/testenv/selftests/tracing_test.go b/internal/testenv/selftests/tracing_test.go
index 07cbcba5..84aa81bd 100644
--- a/internal/testenv/selftests/tracing_test.go
+++ b/internal/testenv/selftests/tracing_test.go
@@ -98,7 +98,7 @@ func TestOTLPTracing(t *testing.T) {
 			Exact:              true,
 			CheckDetachedSpans: true,
 		},
-		Match{Name: testEnvironmentLocalTest, TraceCount: 1, Services: []string{"Authenticate", "Test Environment", "Control Plane", "Data Broker", "IDP"}},
+		Match{Name: testEnvironmentLocalTest, TraceCount: 1, Services: []string{"Authenticate", "Authorize", "Test Environment", "Control Plane", "Data Broker", "IDP"}},
 		Match{Name: testEnvironmentAuthenticate, TraceCount: 1, Services: allServices},
 		Match{Name: authenticateOAuth2Client, TraceCount: Greater(0)},
 		Match{Name: idpServerGetUserinfo, TraceCount: EqualToMatch(authenticateOAuth2Client)},
diff --git a/internal/testutil/tracetest/tracing.go b/internal/testutil/tracetest/tracing.go
index 0299c199..20fb4a5e 100644
--- a/internal/testutil/tracetest/tracing.go
+++ b/internal/testutil/tracetest/tracing.go
@@ -438,7 +438,13 @@ func (tr *TraceResults) MatchTraces(t testing.TB, opts MatchOptions, matches ...
 
 				if m.Services != nil {
 					for _, trace := range traceDetails {
-						assert.ElementsMatch(t, m.Services, trace.Services)
+						ok := assert.ElementsMatch(t, m.Services, trace.Services)
+						if !ok {
+							t.Logf("trace details: %s", trace.Name)
+							for i, span := range trace.Spans {
+								t.Logf("  span %d: [%s] %s", i, span.Service, span.Raw.Name)
+							}
+						}
 					}
 				}
 			} else if _, ok := m.TraceCount.(Any); !ok {
diff --git a/pkg/policy/criteria/criteria_test.go b/pkg/policy/criteria/criteria_test.go
index b32fa1cc..1e7b2953 100644
--- a/pkg/policy/criteria/criteria_test.go
+++ b/pkg/policy/criteria/criteria_test.go
@@ -41,6 +41,7 @@ type (
 		Path              string                `json:"path"`
 		Headers           map[string][]string   `json:"headers"`
 		ClientCertificate ClientCertificateInfo `json:"client_certificate"`
+		IP                string                `json:"ip"`
 	}
 	InputSSH struct {
 		Username  string `json:"username"`
diff --git a/pkg/policy/criteria/source_ip_test.go b/pkg/policy/criteria/source_ip_test.go
new file mode 100644
index 00000000..941e4b78
--- /dev/null
+++ b/pkg/policy/criteria/source_ip_test.go
@@ -0,0 +1,169 @@
+package criteria
+
+import (
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
+
+	"github.com/pomerium/pomerium/pkg/grpc/databroker"
+)
+
+func TestSourceIPs(t *testing.T) {
+	t.Run("single IPv4 match", func(t *testing.T) {
+		res, err := evaluate(t, `
+allow:
+  and:
+    - source_ip: "1.2.3.4"
+`, []*databroker.Record{}, Input{HTTP: InputHTTP{IP: "1.2.3.4"}})
+		require.NoError(t, err)
+		require.Equal(t, A{true, A{ReasonSourceIPOK}, M{}}, res["allow"])
+		require.Equal(t, A{false, A{}}, res["deny"])
+	})
+	t.Run("single IPv4 no match", func(t *testing.T) {
+		res, err := evaluate(t, `
+allow:
+  and:
+    - source_ip: "1.2.3.4"
+`, []*databroker.Record{}, Input{HTTP: InputHTTP{IP: "1.2.3.5"}})
+		require.NoError(t, err)
+		require.Equal(t, A{false, A{ReasonSourceIPUnauthorized}, M{}}, res["allow"])
+		require.Equal(t, A{false, A{}}, res["deny"])
+	})
+	t.Run("IPv4 range match", func(t *testing.T) {
+		res, err := evaluate(t, `
+allow:
+  and:
+    - source_ip: "192.168.1.1/24"
+`, []*databroker.Record{}, Input{HTTP: InputHTTP{IP: "192.168.1.200"}})
+		require.NoError(t, err)
+		require.Equal(t, A{true, A{ReasonSourceIPOK}, M{}}, res["allow"])
+		require.Equal(t, A{false, A{}}, res["deny"])
+	})
+	t.Run("IPv4 range no match", func(t *testing.T) {
+		res, err := evaluate(t, `
+allow:
+  and:
+    - source_ip: "192.168.1.1/24"
+`, []*databroker.Record{}, Input{HTTP: InputHTTP{IP: "192.168.2.1"}})
+		require.NoError(t, err)
+		require.Equal(t, A{false, A{ReasonSourceIPUnauthorized}, M{}}, res["allow"])
+		require.Equal(t, A{false, A{}}, res["deny"])
+	})
+
+	t.Run("single IPv6 match", func(t *testing.T) {
+		res, err := evaluate(t, `
+allow:
+  and:
+    - source_ip: "2001:db8::1"
+`, []*databroker.Record{}, Input{HTTP: InputHTTP{IP: "2001:db8::1"}})
+		require.NoError(t, err)
+		require.Equal(t, A{true, A{ReasonSourceIPOK}, M{}}, res["allow"])
+		require.Equal(t, A{false, A{}}, res["deny"])
+	})
+	t.Run("single IPv6 no match", func(t *testing.T) {
+		res, err := evaluate(t, `
+allow:
+  and:
+    - source_ip: "2001:db8::1"
+`, []*databroker.Record{}, Input{HTTP: InputHTTP{IP: "2001:db8::2"}})
+		require.NoError(t, err)
+		require.Equal(t, A{false, A{ReasonSourceIPUnauthorized}, M{}}, res["allow"])
+		require.Equal(t, A{false, A{}}, res["deny"])
+	})
+	t.Run("IPv6 range match", func(t *testing.T) {
+		res, err := evaluate(t, `
+allow:
+  and:
+    - source_ip: "2001:db8::/32"
+`, []*databroker.Record{}, Input{HTTP: InputHTTP{IP: "2001:db8:1:2:3:4:5:6"}})
+		require.NoError(t, err)
+		require.Equal(t, A{true, A{ReasonSourceIPOK}, M{}}, res["allow"])
+		require.Equal(t, A{false, A{}}, res["deny"])
+	})
+	t.Run("IPv6 range no match", func(t *testing.T) {
+		res, err := evaluate(t, `
+allow:
+  and:
+    - source_ip: "2001:db8::/32"
+`, []*databroker.Record{}, Input{HTTP: InputHTTP{IP: "2001:ffff:1:2:3:4:5:6"}})
+		require.NoError(t, err)
+		require.Equal(t, A{false, A{ReasonSourceIPUnauthorized}, M{}}, res["allow"])
+		require.Equal(t, A{false, A{}}, res["deny"])
+	})
+
+	t.Run("list of IPs match", func(t *testing.T) {
+		res, err := evaluate(t, `
+allow:
+  and:
+    - source_ip:
+        - "10.0.0.1"
+        - "10.0.0.2"
+        - "10.0.0.3"
+`, []*databroker.Record{}, Input{HTTP: InputHTTP{IP: "10.0.0.2"}})
+		require.NoError(t, err)
+		require.Equal(t, A{true, A{ReasonSourceIPOK}, M{}}, res["allow"])
+		require.Equal(t, A{false, A{}}, res["deny"])
+	})
+	t.Run("list of IPs no match", func(t *testing.T) {
+		res, err := evaluate(t, `
+allow:
+  and:
+    - source_ip:
+        - "10.0.0.1"
+        - "10.0.0.2"
+        - "10.0.0.3"
+`, []*databroker.Record{}, Input{HTTP: InputHTTP{IP: "10.0.0.4"}})
+		require.NoError(t, err)
+		require.Equal(t, A{false, A{ReasonSourceIPUnauthorized}, M{}}, res["allow"])
+		require.Equal(t, A{false, A{}}, res["deny"])
+	})
+
+	t.Run("IPv4-mapped IPv6 range", func(t *testing.T) {
+		res, err := evaluate(t, `
+allow:
+  and:
+    - source_ip: "::ffff:10.0.0.0/104"
+`, []*databroker.Record{}, Input{HTTP: InputHTTP{IP: "10.1.2.3"}})
+		require.NoError(t, err)
+		require.Equal(t, A{true, A{ReasonSourceIPOK}, M{}}, res["allow"])
+		require.Equal(t, A{false, A{}}, res["deny"])
+	})
+	t.Run("IPv4-mapped IPv6", func(t *testing.T) {
+		res, err := evaluate(t, `
+allow:
+  and:
+    - source_ip: "::ffff:1.2.3.4"
+`, []*databroker.Record{}, Input{HTTP: InputHTTP{IP: "1.2.3.4"}})
+		require.NoError(t, err)
+		require.Equal(t, A{true, A{ReasonSourceIPOK}, M{}}, res["allow"])
+		require.Equal(t, A{false, A{}}, res["deny"])
+	})
+
+	t.Run("invalid IP address", func(t *testing.T) {
+		_, err := generateRegoFromYAML(`
+allow:
+  and:
+    - source_ip: not-an-ip-address
+`)
+		assert.ErrorContains(t, err, `expected IP or CIDR range, got: "not-an-ip-address"`)
+	})
+	t.Run("invalid input type", func(t *testing.T) {
+		_, err := generateRegoFromYAML(`
+allow:
+  and:
+    - source_ip:
+        key: value
+`)
+		assert.ErrorContains(t, err, "expected string or array of strings, got: parser.Object")
+	})
+	t.Run("invalid list element type", func(t *testing.T) {
+		_, err := generateRegoFromYAML(`
+allow:
+  and:
+    - source_ip:
+        - key: value
+`)
+		assert.ErrorContains(t, err, "xpected string value, got: parser.Object")
+	})
+}
diff --git a/pkg/ssh/auth_test.go b/pkg/ssh/auth_test.go
index 315c0076..dcba9dd5 100644
--- a/pkg/ssh/auth_test.go
+++ b/pkg/ssh/auth_test.go
@@ -1,4 +1,4 @@
-package ssh
+package ssh_test
 
 import (
 	"context"
@@ -23,31 +23,32 @@ import (
 	"github.com/pomerium/pomerium/pkg/identity"
 	"github.com/pomerium/pomerium/pkg/policy/criteria"
 	"github.com/pomerium/pomerium/pkg/protoutil"
+	"github.com/pomerium/pomerium/pkg/ssh"
 )
 
 func TestHandlePublicKeyMethodRequest(t *testing.T) {
 	t.Run("no public key fingerprint", func(t *testing.T) {
-		var a Auth
+		var a ssh.Auth
 		var req extensions_ssh.PublicKeyMethodRequest
-		_, err := a.handlePublicKeyMethodRequest(t.Context(), StreamAuthInfo{}, &req)
+		_, err := a.UnexportedHandlePublicKeyMethodRequest(t.Context(), ssh.StreamAuthInfo{}, &req)
 		assert.ErrorContains(t, err, "invalid public key fingerprint")
 	})
 	t.Run("evaluate error", func(t *testing.T) {
-		info := StreamAuthInfo{
+		info := ssh.StreamAuthInfo{
 			Username: ptr("username"),
 			Hostname: ptr("hostname"),
 		}
 		var req extensions_ssh.PublicKeyMethodRequest
 		req.PublicKeyFingerprintSha256 = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZ123456")
-		pe := func(context.Context, *Request) (*evaluator.Result, error) {
+		pe := func(context.Context, uint64, *ssh.Request) (*evaluator.Result, error) {
 			return nil, errors.New("error evaluating policy")
 		}
-		a := NewAuth(fakePolicyEvaluator{evaluateSSH: pe}, nil, nil)
-		_, err := a.handlePublicKeyMethodRequest(t.Context(), info, &req)
+		a := ssh.NewAuth(fakePolicyEvaluator{evaluateSSH: pe}, nil, nil)
+		_, err := a.UnexportedHandlePublicKeyMethodRequest(t.Context(), info, &req)
 		assert.ErrorContains(t, err, "error evaluating policy")
 	})
 	t.Run("allow", func(t *testing.T) {
-		info := StreamAuthInfo{
+		info := ssh.StreamAuthInfo{
 			Username: ptr("username"),
 			Hostname: ptr("hostname"),
 		}
@@ -55,8 +56,8 @@ func TestHandlePublicKeyMethodRequest(t *testing.T) {
 		req.PublicKeyFingerprintSha256 = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZ123456")
 		fakePublicKey := []byte("fake-public-key")
 		req.PublicKey = fakePublicKey
-		pe := func(_ context.Context, r *Request) (*evaluator.Result, error) {
-			assert.Equal(t, r, &Request{
+		pe := func(_ context.Context, _ uint64, r *ssh.Request) (*evaluator.Result, error) {
+			assert.Equal(t, r, &ssh.Request{
 				Username:  "username",
 				Hostname:  "hostname",
 				PublicKey: fakePublicKey,
@@ -67,7 +68,7 @@ func TestHandlePublicKeyMethodRequest(t *testing.T) {
 				Deny:  evaluator.NewRuleResult(false),
 			}, nil
 		}
-		a := NewAuth(fakePolicyEvaluator{evaluateSSH: pe}, nil, nil)
+		a := ssh.NewAuth(fakePolicyEvaluator{evaluateSSH: pe}, nil, nil)
 		res, err := a.HandlePublicKeyMethodRequest(t.Context(), info, &req)
 		assert.NoError(t, err)
 		assert.Empty(t, res.RequireAdditionalMethods)
@@ -75,61 +76,61 @@ func TestHandlePublicKeyMethodRequest(t *testing.T) {
 		assert.Equal(t, res.Allow.PublicKey, fakePublicKey)
 	})
 	t.Run("deny", func(t *testing.T) {
-		info := StreamAuthInfo{
+		info := ssh.StreamAuthInfo{
 			Username: ptr("username"),
 			Hostname: ptr("hostname"),
 		}
 		var req extensions_ssh.PublicKeyMethodRequest
 		req.PublicKeyFingerprintSha256 = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZ123456")
-		pe := func(_ context.Context, _ *Request) (*evaluator.Result, error) {
+		pe := func(_ context.Context, _ uint64, _ *ssh.Request) (*evaluator.Result, error) {
 			return &evaluator.Result{
 				Allow: evaluator.NewRuleResult(true),
 				Deny:  evaluator.NewRuleResult(true),
 			}, nil
 		}
-		a := NewAuth(fakePolicyEvaluator{evaluateSSH: pe}, nil, nil)
+		a := ssh.NewAuth(fakePolicyEvaluator{evaluateSSH: pe}, nil, nil)
 		res, err := a.HandlePublicKeyMethodRequest(t.Context(), info, &req)
 		assert.NoError(t, err)
 		assert.Nil(t, res.Allow)
 		assert.Empty(t, res.RequireAdditionalMethods)
 	})
 	t.Run("public key unauthorized", func(t *testing.T) {
-		info := StreamAuthInfo{
+		info := ssh.StreamAuthInfo{
 			Username: ptr("username"),
 			Hostname: ptr("hostname"),
 		}
 		var req extensions_ssh.PublicKeyMethodRequest
 		req.PublicKeyFingerprintSha256 = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZ123456")
-		pe := func(_ context.Context, _ *Request) (*evaluator.Result, error) {
+		pe := func(_ context.Context, _ uint64, _ *ssh.Request) (*evaluator.Result, error) {
 			return &evaluator.Result{
 				Allow: evaluator.NewRuleResult(false, criteria.ReasonSSHPublickeyUnauthorized),
 				Deny:  evaluator.NewRuleResult(false),
 			}, nil
 		}
-		a := NewAuth(fakePolicyEvaluator{evaluateSSH: pe}, nil, nil)
+		a := ssh.NewAuth(fakePolicyEvaluator{evaluateSSH: pe}, nil, nil)
 		res, err := a.HandlePublicKeyMethodRequest(t.Context(), info, &req)
 		assert.NoError(t, err)
 		assert.Nil(t, res.Allow)
-		assert.Equal(t, res.RequireAdditionalMethods, []string{MethodPublicKey})
+		assert.Equal(t, res.RequireAdditionalMethods, []string{ssh.MethodPublicKey})
 	})
 	t.Run("needs login", func(t *testing.T) {
-		info := StreamAuthInfo{
+		info := ssh.StreamAuthInfo{
 			Username: ptr("username"),
 			Hostname: ptr("hostname"),
 		}
 		var req extensions_ssh.PublicKeyMethodRequest
 		req.PublicKeyFingerprintSha256 = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZ123456")
-		pe := func(_ context.Context, _ *Request) (*evaluator.Result, error) {
+		pe := func(_ context.Context, _ uint64, _ *ssh.Request) (*evaluator.Result, error) {
 			return &evaluator.Result{
 				Allow: evaluator.NewRuleResult(false),
 				Deny:  evaluator.NewRuleResult(false, criteria.ReasonUserUnauthenticated),
 			}, nil
 		}
-		a := NewAuth(fakePolicyEvaluator{evaluateSSH: pe}, nil, nil)
+		a := ssh.NewAuth(fakePolicyEvaluator{evaluateSSH: pe}, nil, nil)
 		res, err := a.HandlePublicKeyMethodRequest(t.Context(), info, &req)
 		assert.NoError(t, err)
 		assert.NotNil(t, res.Allow)
-		assert.Equal(t, res.RequireAdditionalMethods, []string{MethodKeyboardInteractive})
+		assert.Equal(t, res.RequireAdditionalMethods, []string{ssh.MethodKeyboardInteractive})
 	})
 	t.Run("internal command no session", func(t *testing.T) {
 		client := fakeDataBrokerServiceClient{
@@ -139,23 +140,23 @@ func TestHandlePublicKeyMethodRequest(t *testing.T) {
 				return nil, status.Error(codes.NotFound, "not found")
 			},
 		}
-		info := StreamAuthInfo{
+		info := ssh.StreamAuthInfo{
 			Username: ptr("username"),
 			Hostname: ptr(""),
 		}
 		var req extensions_ssh.PublicKeyMethodRequest
 		req.PublicKeyFingerprintSha256 = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZ123456")
-		pe := func(_ context.Context, _ *Request) (*evaluator.Result, error) {
+		pe := func(_ context.Context, _ uint64, _ *ssh.Request) (*evaluator.Result, error) {
 			return &evaluator.Result{
 				Allow: evaluator.NewRuleResult(false),
 				Deny:  evaluator.NewRuleResult(false, criteria.ReasonUserUnauthenticated),
 			}, nil
 		}
-		a := NewAuth(fakePolicyEvaluator{pe, client}, nil, nil)
+		a := ssh.NewAuth(fakePolicyEvaluator{pe, client}, nil, nil)
 		res, err := a.HandlePublicKeyMethodRequest(t.Context(), info, &req)
 		assert.NoError(t, err)
 		assert.NotNil(t, res.Allow)
-		assert.Equal(t, res.RequireAdditionalMethods, []string{MethodKeyboardInteractive})
+		assert.Equal(t, res.RequireAdditionalMethods, []string{ssh.MethodKeyboardInteractive})
 	})
 	t.Run("internal command with session", func(t *testing.T) {
 		client := fakeDataBrokerServiceClient{
@@ -174,19 +175,19 @@ func TestHandlePublicKeyMethodRequest(t *testing.T) {
 				}, nil
 			},
 		}
-		info := StreamAuthInfo{
+		info := ssh.StreamAuthInfo{
 			Username: ptr("username"),
 			Hostname: ptr(""),
 		}
 		var req extensions_ssh.PublicKeyMethodRequest
 		req.PublicKeyFingerprintSha256 = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZ123456")
-		pe := func(_ context.Context, _ *Request) (*evaluator.Result, error) {
+		pe := func(_ context.Context, _ uint64, _ *ssh.Request) (*evaluator.Result, error) {
 			return &evaluator.Result{
 				Allow: evaluator.NewRuleResult(true),
 				Deny:  evaluator.NewRuleResult(false),
 			}, nil
 		}
-		a := NewAuth(fakePolicyEvaluator{pe, client}, nil, nil)
+		a := ssh.NewAuth(fakePolicyEvaluator{pe, client}, nil, nil)
 		res, err := a.HandlePublicKeyMethodRequest(t.Context(), info, &req)
 		assert.NoError(t, err)
 		assert.NotNil(t, res.Allow)
@@ -200,19 +201,19 @@ func TestHandlePublicKeyMethodRequest(t *testing.T) {
 				return nil, status.Error(codes.Unknown, "unknown")
 			},
 		}
-		info := StreamAuthInfo{
+		info := ssh.StreamAuthInfo{
 			Username: ptr("username"),
 			Hostname: ptr(""),
 		}
 		var req extensions_ssh.PublicKeyMethodRequest
 		req.PublicKeyFingerprintSha256 = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZ123456")
-		pe := func(_ context.Context, _ *Request) (*evaluator.Result, error) {
+		pe := func(_ context.Context, _ uint64, _ *ssh.Request) (*evaluator.Result, error) {
 			return &evaluator.Result{
 				Allow: evaluator.NewRuleResult(true),
 				Deny:  evaluator.NewRuleResult(false),
 			}, nil
 		}
-		a := NewAuth(fakePolicyEvaluator{pe, client}, nil, nil)
+		a := ssh.NewAuth(fakePolicyEvaluator{pe, client}, nil, nil)
 		_, err := a.HandlePublicKeyMethodRequest(t.Context(), info, &req)
 		assert.ErrorContains(t, err, "internal error")
 	})
@@ -220,12 +221,12 @@ func TestHandlePublicKeyMethodRequest(t *testing.T) {
 
 func TestHandleKeyboardInteractiveMethodRequest(t *testing.T) {
 	t.Run("no public key", func(t *testing.T) {
-		var a Auth
-		_, err := a.handleKeyboardInteractiveMethodRequest(t.Context(), StreamAuthInfo{}, nil)
+		var a ssh.Auth
+		_, err := a.UnexportedHandleKeyboardInteractiveMethodRequest(t.Context(), ssh.StreamAuthInfo{}, nil)
 		assert.ErrorContains(t, err, "expected PublicKeyAllow message not to be nil")
 	})
 	t.Run("ok", func(t *testing.T) {
-		pe := func(_ context.Context, _ *Request) (*evaluator.Result, error) {
+		pe := func(_ context.Context, _ uint64, _ *ssh.Request) (*evaluator.Result, error) {
 			return &evaluator.Result{
 				Allow: evaluator.NewRuleResult(true),
 				Deny:  evaluator.NewRuleResult(false),
@@ -256,11 +257,11 @@ func TestHandleKeyboardInteractiveMethodRequest(t *testing.T) {
 		cfg.Options.ProviderURL = idpURL
 		cfg.Options.ClientID = "client-id"
 		cfg.Options.ClientSecret = "client-secret"
-		a := NewAuth(fakePolicyEvaluator{pe, client}, atomicutil.NewValue(&cfg), nil)
-		info := StreamAuthInfo{
+		a := ssh.NewAuth(fakePolicyEvaluator{pe, client}, atomicutil.NewValue(&cfg), nil)
+		info := ssh.StreamAuthInfo{
 			Username: ptr("username"),
 			Hostname: ptr("hostname"),
-			PublicKeyAllow: AuthMethodValue[extensions_ssh.PublicKeyAllowResponse]{
+			PublicKeyAllow: ssh.AuthMethodValue[extensions_ssh.PublicKeyAllowResponse]{
 				Value: &extensions_ssh.PublicKeyAllowResponse{
 					PublicKey: []byte("fake-public-key"),
 				},
@@ -282,7 +283,7 @@ func TestHandleKeyboardInteractiveMethodRequest(t *testing.T) {
 		assert.Equal(t, "sshkey-SHA256:QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoxMjM0NTY", putRecords[1].Id)
 	})
 	t.Run("denied", func(t *testing.T) {
-		pe := func(_ context.Context, _ *Request) (*evaluator.Result, error) {
+		pe := func(_ context.Context, _ uint64, _ *ssh.Request) (*evaluator.Result, error) {
 			return &evaluator.Result{
 				Allow: evaluator.NewRuleResult(false),
 				Deny:  evaluator.NewRuleResult(false),
@@ -311,11 +312,11 @@ func TestHandleKeyboardInteractiveMethodRequest(t *testing.T) {
 		cfg.Options.ProviderURL = idpURL
 		cfg.Options.ClientID = "client-id"
 		cfg.Options.ClientSecret = "client-secret"
-		a := NewAuth(fakePolicyEvaluator{pe, client}, atomicutil.NewValue(&cfg), nil)
-		info := StreamAuthInfo{
+		a := ssh.NewAuth(fakePolicyEvaluator{pe, client}, atomicutil.NewValue(&cfg), nil)
+		info := ssh.StreamAuthInfo{
 			Username: ptr("username"),
 			Hostname: ptr("hostname"),
-			PublicKeyAllow: AuthMethodValue[extensions_ssh.PublicKeyAllowResponse]{
+			PublicKeyAllow: ssh.AuthMethodValue[extensions_ssh.PublicKeyAllowResponse]{
 				Value: &extensions_ssh.PublicKeyAllowResponse{
 					PublicKey: []byte("fake-public-key"),
 				},
@@ -337,25 +338,25 @@ func TestHandleKeyboardInteractiveMethodRequest(t *testing.T) {
 		cfg.Options.ProviderURL = idpURL
 		cfg.Options.ClientID = "client-id"
 		cfg.Options.ClientSecret = "client-secret"
-		a := NewAuth(nil, atomicutil.NewValue(&cfg), nil)
-		info := StreamAuthInfo{
+		a := ssh.NewAuth(nil, atomicutil.NewValue(&cfg), nil)
+		info := ssh.StreamAuthInfo{
 			Username: ptr("username"),
 			Hostname: ptr("hostname"),
-			PublicKeyAllow: AuthMethodValue[extensions_ssh.PublicKeyAllowResponse]{
+			PublicKeyAllow: ssh.AuthMethodValue[extensions_ssh.PublicKeyAllowResponse]{
 				Value: &extensions_ssh.PublicKeyAllowResponse{
 					PublicKey: []byte("fake-public-key"),
 				},
 			},
 		}
-		_, err := a.handleKeyboardInteractiveMethodRequest(t.Context(), info, noopQuerier{})
+		_, err := a.UnexportedHandleKeyboardInteractiveMethodRequest(t.Context(), info, noopQuerier{})
 		assert.ErrorContains(t, err, "invalid public key fingerprint")
 	})
 }
 
 func TestFormatSession(t *testing.T) {
 	t.Run("invalid fingerprint", func(t *testing.T) {
-		var a Auth
-		info := StreamAuthInfo{
+		var a ssh.Auth
+		info := ssh.StreamAuthInfo{
 			PublicKeyFingerprintSha256: []byte("wrong-length"),
 		}
 		_, err := a.FormatSession(t.Context(), info)
@@ -388,8 +389,8 @@ func TestFormatSession(t *testing.T) {
 				}, nil
 			},
 		}
-		a := NewAuth(fakePolicyEvaluator{client: client}, nil, nil)
-		info := StreamAuthInfo{
+		a := ssh.NewAuth(fakePolicyEvaluator{client: client}, nil, nil)
+		info := ssh.StreamAuthInfo{
 			PublicKeyFingerprintSha256: []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZ123456"),
 		}
 		b, err := a.FormatSession(t.Context(), info)
@@ -407,8 +408,8 @@ Claims:
 
 func TestDeleteSession(t *testing.T) {
 	t.Run("invalid fingerprint", func(t *testing.T) {
-		var a Auth
-		info := StreamAuthInfo{
+		var a ssh.Auth
+		info := ssh.StreamAuthInfo{
 			PublicKeyFingerprintSha256: []byte("wrong-length"),
 		}
 		err := a.DeleteSession(t.Context(), info)
@@ -426,8 +427,8 @@ func TestDeleteSession(t *testing.T) {
 				return nil, putError
 			},
 		}
-		a := NewAuth(fakePolicyEvaluator{client: client}, nil, nil)
-		info := StreamAuthInfo{
+		a := ssh.NewAuth(fakePolicyEvaluator{client: client}, nil, nil)
+		info := ssh.StreamAuthInfo{
 			PublicKeyFingerprintSha256: []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZ123456"),
 		}
 		err := a.DeleteSession(t.Context(), info)
@@ -436,12 +437,12 @@ func TestDeleteSession(t *testing.T) {
 }
 
 type fakePolicyEvaluator struct {
-	evaluateSSH func(context.Context, *Request) (*evaluator.Result, error)
+	evaluateSSH func(context.Context, uint64, *ssh.Request) (*evaluator.Result, error)
 	client      databroker.DataBrokerServiceClient
 }
 
-func (f fakePolicyEvaluator) EvaluateSSH(ctx context.Context, req *Request) (*evaluator.Result, error) {
-	return f.evaluateSSH(ctx, req)
+func (f fakePolicyEvaluator) EvaluateSSH(ctx context.Context, streamID uint64, req *ssh.Request) (*evaluator.Result, error) {
+	return f.evaluateSSH(ctx, streamID, req)
 }
 
 func (f fakePolicyEvaluator) GetDataBrokerServiceClient() databroker.DataBrokerServiceClient {
@@ -472,7 +473,3 @@ func (noopQuerier) Prompt(
 ) (*extensions_ssh.KeyboardInteractiveInfoPromptResponses, error) {
 	return nil, nil
 }
-
-func ptr[T any](t T) *T {
-	return &t
-}
diff --git a/pkg/ssh/manager_test.go b/pkg/ssh/manager_test.go
index 11b1ba59..c46139c8 100644
--- a/pkg/ssh/manager_test.go
+++ b/pkg/ssh/manager_test.go
@@ -1,14 +1,21 @@
 package ssh_test
 
 import (
+	"context"
 	"testing"
+	"time"
 
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 	"go.uber.org/mock/gomock"
+	"google.golang.org/grpc/codes"
+	"google.golang.org/grpc/status"
+	"google.golang.org/protobuf/types/known/timestamppb"
 
 	extensions_ssh "github.com/pomerium/envoy-custom/api/extensions/filters/network/ssh"
 	"github.com/pomerium/pomerium/config"
+	"github.com/pomerium/pomerium/pkg/grpc/databroker"
+	"github.com/pomerium/pomerium/pkg/grpc/session"
 	"github.com/pomerium/pomerium/pkg/ssh"
 	mock_ssh "github.com/pomerium/pomerium/pkg/ssh/mock"
 )
@@ -28,13 +35,119 @@ func TestStreamManager(t *testing.T) {
 		{From: "ssh://host1", To: mustParseWeightedURLs(t, "ssh://dest1:22")},
 		{From: "ssh://host2", To: mustParseWeightedURLs(t, "ssh://dest2:22")},
 	}
-	m := ssh.NewStreamManager(t.Context(), auth, cfg)
-
+	m := ssh.NewStreamManager(auth, cfg)
+	// intentionally don't call m.Run() - simulate initial sync completing
+	m.ClearRecords(t.Context())
 	t.Run("LookupStream", func(t *testing.T) {
 		assert.Nil(t, m.LookupStream(1234))
 		sh := m.NewStreamHandler(&extensions_ssh.DownstreamConnectEvent{StreamId: 1234})
+		done := make(chan error)
+		ctx, ca := context.WithCancel(t.Context())
+		go func() {
+			done <- sh.Run(ctx)
+		}()
 		assert.Equal(t, sh, m.LookupStream(1234))
 		sh.Close()
 		assert.Nil(t, m.LookupStream(1234))
+		ca()
+		err := <-done
+		assert.ErrorIs(t, err, context.Canceled)
+	})
+
+	t.Run("TerminateStreamOnSessionDelete", func(t *testing.T) {
+		sh := m.NewStreamHandler(&extensions_ssh.DownstreamConnectEvent{StreamId: 1234})
+		done := make(chan error)
+		go func() {
+			done <- sh.Run(t.Context())
+		}()
+
+		m.SetSessionIDForStream(1234, "test-id-1")
+		m.UpdateRecords(t.Context(), 0, []*databroker.Record{
+			{
+				Type: "type.googleapis.com/session.Session",
+				Id:   "test-id-1",
+				Data: marshalAny(&session.Session{}),
+			},
+			{
+				Type:      "type.googleapis.com/session.Session",
+				Id:        "test-id-1",
+				Data:      marshalAny(&session.Session{}),
+				DeletedAt: timestamppb.Now(),
+			},
+		})
+		select {
+		case err := <-done:
+			assert.ErrorIs(t, err, status.Errorf(codes.PermissionDenied, "no longer authorized"))
+		case <-time.After(1 * time.Second):
+			t.Fail()
+		}
+	})
+
+	t.Run("TerminateMultipleStreamsForSession", func(t *testing.T) {
+		sh1 := m.NewStreamHandler(&extensions_ssh.DownstreamConnectEvent{StreamId: 1})
+		done1 := make(chan error)
+		go func() {
+			done1 <- sh1.Run(t.Context())
+		}()
+		sh2 := m.NewStreamHandler(&extensions_ssh.DownstreamConnectEvent{StreamId: 2})
+		done2 := make(chan error)
+		go func() {
+			done2 <- sh2.Run(t.Context())
+		}()
+		m.SetSessionIDForStream(1, "test-id-1")
+		m.SetSessionIDForStream(2, "test-id-1")
+		m.UpdateRecords(t.Context(), 0, []*databroker.Record{
+			{
+				Type: "type.googleapis.com/session.Session",
+				Id:   "test-id-1",
+				Data: marshalAny(&session.Session{}),
+			},
+			{
+				Type:      "type.googleapis.com/session.Session",
+				Id:        "test-id-1",
+				Data:      marshalAny(&session.Session{}),
+				DeletedAt: timestamppb.Now(),
+			},
+		})
+		select {
+		case err := <-done1:
+			assert.ErrorIs(t, err, status.Errorf(codes.PermissionDenied, "no longer authorized"))
+		case <-time.After(1 * time.Second):
+			t.Fail()
+		}
+		select {
+		case err := <-done2:
+			assert.ErrorIs(t, err, status.Errorf(codes.PermissionDenied, "no longer authorized"))
+		case <-time.After(1 * time.Second):
+			t.Fail()
+		}
+	})
+
+	t.Run("ClearRecords", func(t *testing.T) {
+		sh1 := m.NewStreamHandler(&extensions_ssh.DownstreamConnectEvent{StreamId: 1})
+		done1 := make(chan error)
+		go func() {
+			done1 <- sh1.Run(t.Context())
+		}()
+		sh2 := m.NewStreamHandler(&extensions_ssh.DownstreamConnectEvent{StreamId: 2})
+		done2 := make(chan error)
+		go func() {
+			done2 <- sh2.Run(t.Context())
+		}()
+		m.SetSessionIDForStream(1, "test-id-1")
+		m.SetSessionIDForStream(2, "test-id-2")
+		m.ClearRecords(t.Context())
+		select {
+		case err := <-done1:
+			assert.ErrorIs(t, err, status.Errorf(codes.PermissionDenied, "no longer authorized"))
+		case <-time.After(1 * time.Second):
+			t.Fail()
+		}
+		select {
+		case err := <-done2:
+			assert.ErrorIs(t, err, status.Errorf(codes.PermissionDenied, "no longer authorized"))
+		case <-time.After(1 * time.Second):
+			t.Fail()
+		}
 	})
 }
diff --git a/pkg/ssh/ssh_export_test.go b/pkg/ssh/ssh_export_test.go
new file mode 100644
index 00000000..88e79280
--- /dev/null
+++ b/pkg/ssh/ssh_export_test.go
@@ -0,0 +1,23 @@
+package ssh
+
+import (
+	"context"
+
+	extensions_ssh "github.com/pomerium/envoy-custom/api/extensions/filters/network/ssh"
+)
+
+func (a *Auth) UnexportedHandlePublicKeyMethodRequest(
+	ctx context.Context,
+	info StreamAuthInfo,
+	req *extensions_ssh.PublicKeyMethodRequest,
+) (PublicKeyAuthMethodResponse, error) {
+	return a.handlePublicKeyMethodRequest(ctx, info, req)
+}
+
+func (a *Auth) UnexportedHandleKeyboardInteractiveMethodRequest(
+	ctx context.Context,
+	info StreamAuthInfo,
+	querier KeyboardInteractiveQuerier,
+) (KeyboardInteractiveAuthMethodResponse, error) {
+	return a.handleKeyboardInteractiveMethodRequest(ctx, info, querier)
+}
diff --git a/pkg/ssh/ssh_int_test.go b/pkg/ssh/ssh_int_test.go
index a1e2df65..60d4b898 100644
--- a/pkg/ssh/ssh_int_test.go
+++ b/pkg/ssh/ssh_int_test.go
@@ -18,6 +18,7 @@ import (
 	"github.com/stretchr/testify/suite"
 	gossh "golang.org/x/crypto/ssh"
 	"golang.org/x/term"
+	"google.golang.org/protobuf/types/known/timestamppb"
 
 	"github.com/pomerium/pomerium/config"
 	"github.com/pomerium/pomerium/internal/testenv"
@@ -25,6 +26,7 @@ import (
 	"github.com/pomerium/pomerium/internal/testenv/snippets"
 	"github.com/pomerium/pomerium/internal/testenv/upstreams"
 	"github.com/pomerium/pomerium/internal/testenv/values"
+	"github.com/pomerium/pomerium/pkg/grpc/databroker"
 	"github.com/pomerium/pomerium/pkg/ssh"
 )
 
@@ -245,6 +247,48 @@ func (s *SSHTestSuite) TestReevaluatePolicyOnConfigChange() {
 	s.ErrorContains(client.Wait(), "ssh: disconnect, reason 11: Cancelled: access denied")
 }
 
+func (s *SSHTestSuite) TestRevokeSession() {
+	userCAPublicKey := newPublicKey(s.T(), s.userCAKey.Public())
+	certChecker := gossh.CertChecker{
+		IsUserAuthority: func(auth gossh.PublicKey) bool {
+			return bytes.Equal(userCAPublicKey.Marshal(), auth.Marshal())
+		},
+	}
+	upstream := upstreams.SSH(
+		upstreams.WithHostKeys(newSignerFromKey(s.T(), s.upstreamHostKey)),
+		upstreams.WithPublicKeyCallback(certChecker.Authenticate),
+	)
+	upstream.SetServerConnCallback(echoShell{s.T()}.handleConnection)
+	upstream.Route().
+		From(values.Const("ssh://example")).
+		PPL(s.PPL)
+	s.env.AddUpstream(upstream)
+
+	s.start()
+	dbClient := s.env.NewDataBrokerServiceClient()
+
+	client, err := upstream.Dial(s.clientConfig)
+	s.Require().NoError(err)
+	defer client.Close()
+
+	sess, err := client.NewSession()
+	s.Require().NoError(err)
+
+	_, err = dbClient.Put(s.env.Context(), &databroker.PutRequest{
+		Records: []*databroker.Record{
+			{
+				Type:       "type.googleapis.com/session.Session",
+				Id:         "sshkey-" + gossh.FingerprintSHA256(s.clientSSHPubKey),
+				ModifiedAt: timestamppb.Now(),
+				DeletedAt:  timestamppb.Now(),
+			},
+		},
+	})
+	s.Require().NoError(err)
+	sess.Wait()
+	s.ErrorContains(client.Wait(), "ssh: disconnect, reason 11: Cancelled: no longer authorized")
+}
+
 func (s *SSHTestSuite) TestDirectTcpipSession() {
 	upstream := upstreams.SSH(
 		upstreams.WithHostKeys(newSignerFromKey(s.T(), s.upstreamHostKey)),
diff --git a/pkg/ssh/stream_test.go b/pkg/ssh/stream_test.go
index cff2839f..45fe4f0d 100644
--- a/pkg/ssh/stream_test.go
+++ b/pkg/ssh/stream_test.go
@@ -134,7 +134,9 @@ func (s *StreamHandlerSuite) SetupTest() {
 		f(s.cfg)
 	}
 
-	s.mgr = ssh.NewStreamManager(context.Background(), s.mockAuth, s.cfg)
+	s.mgr = ssh.NewStreamManager(s.mockAuth, s.cfg)
+	// intentionally don't call m.Run() - simulate initial sync completing
+	s.mgr.ClearRecords(context.Background())
 }
 
 func (s *StreamHandlerSuite) TearDownTest() {
@@ -1210,7 +1212,7 @@ func init() {
 	StreamHandlerSuiteBeforeTestHooks["TestServeChannel_Session_Exec_Whoami"] = HookWithArgs(hook, Eq(status.Errorf(codes.Canceled, "channel closed")))
 	StreamHandlerSuiteBeforeTestHooks["TestServeChannel_Session_Exec_WhoamiError"] = HookWithArgs(hook, Eq(status.Errorf(codes.Canceled, "channel closed")))
 	StreamHandlerSuiteBeforeTestHooks["TestServeChannel_Session_Exec_Logout"] = HookWithArgs(hook, Eq(status.Errorf(codes.Canceled, "channel closed")))
-	StreamHandlerSuiteBeforeTestHooks["TestServeChannel_Session_Exec_LogoutError"] = HookWithArgs(hook, Eq(status.Errorf(codes.Canceled, "channel closed")))
+	StreamHandlerSuiteBeforeTestHooks["TestServeChannel_Session_Exec_LogoutError"] = HookWithArgs(hook, Eq(status.Errorf(codes.Aborted, "failed to delete session")))
 	StreamHandlerSuiteBeforeTestHooks["TestServeChannel_Session_RoutesPortal_NonInteractiveError"] = HookWithArgs(hook, Eq(status.Errorf(codes.Canceled, "channel closed")))
 	StreamHandlerSuiteBeforeTestHooks["TestServeChannel_Session_RoutesPortalDisabled_NoArgs"] = RuntimeFlagDependentHookWithArgs(hook,
 		config.RuntimeFlagSSHRoutesPortal, []any{Not(Nil())}, []any{Eq(status.Errorf(codes.Canceled, "channel closed"))})
@@ -1925,7 +1927,7 @@ func (s *StreamHandlerSuite) TestServeChannel_Session_Exec_LogoutError() {
 
 	s.mockAuth.EXPECT().
 		DeleteSession(Any(), Any()).
-		Return(errors.New("test error"))
+		Return(status.Errorf(codes.Aborted, "failed to delete session"))
 
 	stream.SendClientToServer(channelMsg(ssh.ChannelRequestMsg{
 		PeersID:   peerID,
@@ -1937,8 +1939,10 @@ func (s *StreamHandlerSuite) TestServeChannel_Session_Exec_LogoutError() {
 	}))
 	recvChannelMsg[ssh.ChannelRequestSuccessMsg](s, stream)
 
-	channelData := s.channelDataLoop(peerID, stream, 1)
-	s.Equal("Error: failed to delete session: test error\r\n", channelData.String())
+	channelData := s.channelDataLoop(peerID, stream, 0)
+	// The user will see this, but the error is propagated internally
+	s.Equal("Logged out successfully\r\n", channelData.String())
+	// error checked in cleanup
 }
 
 func (s *StreamHandlerSuite) TestServeChannel_DirectTcpip_NoSubMsg() {